index.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <script lang="ts" setup>
  2. import type { LoginAndRegisterParams } from '@vben/universal-ui';
  3. import { useRouter } from 'vue-router';
  4. import { useAccess } from '@vben/access';
  5. import { Button } from 'ant-design-vue';
  6. import { useAccessStore, useAppStore } from '#/store';
  7. defineOptions({ name: 'AccessBackend' });
  8. const accounts: Record<string, LoginAndRegisterParams> = {
  9. admin: {
  10. password: '123456',
  11. username: 'admin',
  12. },
  13. super: {
  14. password: '123456',
  15. username: 'vben',
  16. },
  17. user: {
  18. password: '123456',
  19. username: 'jack',
  20. },
  21. };
  22. const { accessMode, toggleAccessMode } = useAccess();
  23. const accessStore = useAccessStore();
  24. const appStore = useAppStore();
  25. const router = useRouter();
  26. function roleButtonType(role: string) {
  27. return accessStore.userRoles.includes(role) ? 'primary' : 'default';
  28. }
  29. async function changeAccount(role: string) {
  30. if (accessStore.userRoles.includes(role)) {
  31. return;
  32. }
  33. const account = accounts[role];
  34. await appStore.resetAppState();
  35. await accessStore.authLogin(account, async () => {
  36. router.go(0);
  37. });
  38. }
  39. async function handleToggleAccessMode() {
  40. await toggleAccessMode();
  41. await appStore.resetAppState();
  42. await accessStore.authLogin(accounts.super, async () => {
  43. router.go(0);
  44. });
  45. }
  46. </script>
  47. <template>
  48. <div class="p-5">
  49. <div class="card-box p-5">
  50. <h1 class="text-xl font-semibold">后端页面访问权限演示</h1>
  51. <div class="text-foreground/80 mt-2">
  52. 切换不同的账号,观察左侧菜单变化。
  53. </div>
  54. </div>
  55. <div class="card-box mt-5 p-5 font-semibold">
  56. <span class="text-lg">当前权限模式:</span>
  57. <span class="text-primary mx-4">{{ accessMode }}</span>
  58. <Button type="primary" @click="handleToggleAccessMode">
  59. 切换为{{ accessMode === 'frontend' ? '后端' : '前端' }}权限模式
  60. </Button>
  61. </div>
  62. <template v-if="accessMode === 'backend'">
  63. <div class="card-box mt-5 p-5 font-semibold">
  64. <div class="mb-3">
  65. <span class="text-lg">当前账号:</span>
  66. <span class="text-primary mx-4">
  67. {{ accessStore.userRoles }}
  68. </span>
  69. </div>
  70. <Button :type="roleButtonType('super')" @click="changeAccount('super')">
  71. 切换为 Super 账号
  72. </Button>
  73. <Button
  74. :type="roleButtonType('admin')"
  75. class="mx-4"
  76. @click="changeAccount('admin')"
  77. >
  78. 切换为 Admin 账号
  79. </Button>
  80. <Button :type="roleButtonType('user')" @click="changeAccount('user')">
  81. 切换为 User 账号
  82. </Button>
  83. </div>
  84. </template>
  85. </div>
  86. </template>