办学质量监测教学评价系统
shenrongliang
2025-06-13 11d86cc6c26bb4f709e407acadf4805c2024e79f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
<script lang="ts" setup>
import type { Recordable } from '@vben/types';
 
import { useRouter } from 'vue-router';
 
import { AccessControl, useAccess } from '@vben/access';
import { Page } from '@vben/common-ui';
import { resetAllStores, useUserStore } from '@vben/stores';
 
import { Button, Card } from 'ant-design-vue';
 
import { useAuthStore } from '#/store';
 
const accounts: Record<string, Recordable<any>> = {
  admin: {
    password: '123456',
    username: 'admin',
  },
  super: {
    password: '123456',
    username: 'vben',
  },
  user: {
    password: '123456',
    username: 'jack',
  },
};
 
const { accessMode, hasAccessByCodes } = useAccess();
const authStore = useAuthStore();
const userStore = useUserStore();
const router = useRouter();
 
function roleButtonType(role: string) {
  return userStore.userRoles.includes(role) ? 'primary' : 'default';
}
 
async function changeAccount(role: string) {
  if (userStore.userRoles.includes(role)) {
    return;
  }
 
  const account = accounts[role];
  resetAllStores();
  await authStore.authLogin(account, async () => {
    router.go(0);
  });
}
</script>
 
<template>
  <Page
    :title="`${accessMode === 'frontend' ? '前端' : '后端'}按钮访问权限演示`"
    description="切换不同的账号,观察按钮变化。"
  >
    <Card class="mb-5">
      <template #title>
        <span class="font-semibold">当前角色:</span>
        <span class="text-primary mx-4 text-lg">
          {{ userStore.userRoles?.[0] }}
        </span>
      </template>
 
      <Button :type="roleButtonType('super')" @click="changeAccount('super')">
        切换为 Super 账号
      </Button>
 
      <Button
        :type="roleButtonType('admin')"
        class="mx-4"
        @click="changeAccount('admin')"
      >
        切换为 Admin 账号
      </Button>
      <Button :type="roleButtonType('user')" @click="changeAccount('user')">
        切换为 User 账号
      </Button>
    </Card>
 
    <Card class="mb-5" title="组件形式控制 - 权限码">
      <AccessControl :codes="['AC_100100']" type="code">
        <Button class="mr-4"> Super 账号可见 ["AC_100100"] </Button>
      </AccessControl>
      <AccessControl :codes="['AC_100030']" type="code">
        <Button class="mr-4"> Admin 账号可见 ["AC_100030"] </Button>
      </AccessControl>
      <AccessControl :codes="['AC_1000001']" type="code">
        <Button class="mr-4"> User 账号可见 ["AC_1000001"] </Button>
      </AccessControl>
      <AccessControl :codes="['AC_100100', 'AC_100030']" type="code">
        <Button class="mr-4">
          Super & Admin 账号可见 ["AC_100100","AC_100030"]
        </Button>
      </AccessControl>
    </Card>
 
    <Card
      v-if="accessMode === 'frontend'"
      class="mb-5"
      title="组件形式控制 - 角色"
    >
      <AccessControl :codes="['super']" type="role">
        <Button class="mr-4"> Super 角色可见 </Button>
      </AccessControl>
      <AccessControl :codes="['admin']" type="role">
        <Button class="mr-4"> Admin 角色可见 </Button>
      </AccessControl>
      <AccessControl :codes="['user']" type="role">
        <Button class="mr-4"> User 角色可见 </Button>
      </AccessControl>
      <AccessControl :codes="['super', 'admin']" type="role">
        <Button class="mr-4"> Super & Admin 角色可见 </Button>
      </AccessControl>
    </Card>
 
    <Card class="mb-5" title="函数形式控制">
      <Button v-if="hasAccessByCodes(['AC_100100'])" class="mr-4">
        Super 账号可见 ["AC_100100"]
      </Button>
      <Button v-if="hasAccessByCodes(['AC_100030'])" class="mr-4">
        Admin 账号可见 ["AC_100030"]
      </Button>
      <Button v-if="hasAccessByCodes(['AC_1000001'])" class="mr-4">
        User 账号可见 ["AC_1000001"]
      </Button>
      <Button v-if="hasAccessByCodes(['AC_100100', 'AC_100030'])" class="mr-4">
        Super & Admin 账号可见 ["AC_100100","AC_100030"]
      </Button>
    </Card>
 
    <Card class="mb-5" title="指令方式 - 权限码">
      <Button class="mr-4" v-access:code="['AC_100100']">
        Super 账号可见 ["AC_100100"]
      </Button>
      <Button class="mr-4" v-access:code="['AC_100030']">
        Admin 账号可见 ["AC_100030"]
      </Button>
      <Button class="mr-4" v-access:code="['AC_1000001']">
        User 账号可见 ["AC_1000001"]
      </Button>
      <Button class="mr-4" v-access:code="['AC_100100', 'AC_100030']">
        Super & Admin 账号可见 ["AC_100100","AC_100030"]
      </Button>
    </Card>
 
    <Card v-if="accessMode === 'frontend'" class="mb-5" title="指令方式 - 角色">
      <Button class="mr-4" v-access:role="['super']"> Super 角色可见 </Button>
      <Button class="mr-4" v-access:role="['admin']"> Admin 角色可见 </Button>
      <Button class="mr-4" v-access:role="['user']"> User 角色可见 </Button>
      <Button class="mr-4" v-access:role="['super', 'admin']">
        Super & Admin 角色可见
      </Button>
    </Card>
  </Page>
</template>