index.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <template>
  2. <div>
  3. <el-alert
  4. title="温馨提示:此权限页面代码及效果只作为演示使用,若出现不可逆转的bug,请尝试 `F5` 刷新页面。若实际项目中非要实现此用户权限切换功能,
  5. 请在切换方法 `onRadioChange` 最后面添加刷新代码 `window.location.reload()`。 请注意:按钮权限页面中的演示2(指令模式)、演示3(函数模式)
  6. 切换用户时无法动态演示,想要动态演示,请按 `F5` 或者添加 `window.location.reload()`。"
  7. type="warning"
  8. :closable="false"
  9. ></el-alert>
  10. <el-alert
  11. :title="`当前用户页面权限:[${getRoles}],当前用户按钮权限:[${getAuthBtnList}]`"
  12. type="success"
  13. :closable="false"
  14. class="mt15"
  15. ></el-alert>
  16. <el-card shadow="never" header="切换用户演示,前端控制不同用户显示不同页面、按钮权限" class="mt15">
  17. <el-radio-group v-model="userAuth" @change="onRadioChange">
  18. <el-radio-button label="admin"></el-radio-button>
  19. <el-radio-button label="common"></el-radio-button>
  20. </el-radio-group>
  21. </el-card>
  22. </div>
  23. </template>
  24. <script lang="ts">
  25. import { toRefs, reactive, computed, onMounted, defineComponent } from 'vue';
  26. import { useStore } from '/@/store/index';
  27. import { resetRoute, setAddRoute, setFilterMenuAndCacheTagsViewRoutes } from '/@/router/index';
  28. import { Session } from '/@/utils/storage';
  29. export default defineComponent({
  30. name: 'limitsFrontEndPage',
  31. setup() {
  32. const store = useStore();
  33. const state = reactive({
  34. val: '',
  35. userAuth: '',
  36. });
  37. // 获取用户页面权限信息
  38. const getRoles = computed(() => {
  39. return store.state.userInfos.userInfos.roles;
  40. });
  41. // 获取用户按钮权限信息
  42. const getAuthBtnList = computed(() => {
  43. return store.state.userInfos.userInfos.authBtnList;
  44. });
  45. // 初始化用户权限
  46. const initUserAuth = () => {
  47. state.userAuth = store.state.userInfos.userInfos.roles[0];
  48. };
  49. // 用户权限改变时
  50. const onRadioChange = async () => {
  51. // 模拟数据
  52. resetRoute();
  53. let defaultRoles: string[] = [];
  54. let defaultAuthBtnList: string[] = [];
  55. // admin 页面权限标识,对应路由 meta.roles,用于控制路由的显示/隐藏
  56. let adminRoles: string[] = ['admin'];
  57. // admin 按钮权限标识
  58. let adminAuthBtnList: string[] = ['btn.add', 'btn.del', 'btn.edit', 'btn.link'];
  59. // test 页面权限标识,对应路由 meta.roles,用于控制路由的显示/隐藏
  60. let testRoles: string[] = ['common'];
  61. // test 按钮权限标识
  62. let testAuthBtnList: string[] = ['btn.add', 'btn.link'];
  63. // 不同用户模拟不同的用户权限
  64. if (state.userAuth === 'admin') {
  65. defaultRoles = adminRoles;
  66. defaultAuthBtnList = adminAuthBtnList;
  67. } else {
  68. defaultRoles = testRoles;
  69. defaultAuthBtnList = testAuthBtnList;
  70. }
  71. const userInfos = {
  72. userName: state.userAuth,
  73. photo:
  74. state.userAuth === 'admin'
  75. ? 'https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1813762643,1914315241&fm=26&gp=0.jpg'
  76. : 'https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=317673774,2961727727&fm=26&gp=0.jpg',
  77. time: new Date().getTime(),
  78. roles: defaultRoles,
  79. authBtnList: defaultAuthBtnList,
  80. };
  81. Session.set('userInfo', userInfos);
  82. store.dispatch('userInfos/setUserInfos', userInfos); // 请注意执行顺序(存储用户信息vuex)
  83. await setAddRoute();
  84. setFilterMenuAndCacheTagsViewRoutes();
  85. };
  86. // 页面加载时
  87. onMounted(() => {
  88. initUserAuth();
  89. });
  90. return {
  91. getRoles,
  92. getAuthBtnList,
  93. onRadioChange,
  94. ...toRefs(state),
  95. };
  96. },
  97. });
  98. </script>