当前位置:   article > 正文

vue admin pro 角色不同显示不同页面

vue admin pro 角色不同显示不同页面

从后端获取动态路由,并根据不同角色侧边栏有不同页面,此框架有写好我们只需做部分修改,文章最后贴出渲染页面代码

1,src/config/net.config.js中按照官方注释改后端接口

// 默认的接口地址,开发环境和生产环境都会走/vab-mock-server
  // 正式项目可以选择自己配置成需要的接口地址,如"https://api.xxx.com"

2,src/config/setting.config.js中改导出路由模式!!!不改的话是不行的!!!

  1. // intelligence(前端导出路由)和all(后端导出路由)两种方式
  2.   // authentication: 'intelligence',
  3.   //改动
  4.   authentication: 'all',

3,src/store/modules/routes.js中设置后端导出路由(到这一步就完成啦,没想到这么简单我搞了一天,还加班,,,,)

  1.  if (authentication === 'all') {
  2.       // const {
  3.       //   data: { list },
  4.       // } = await getList()
  5.             //改动
  6.       let list = await getList()
  7.       list = translateDataToTree(list)

我这里 getList()就是获取后端菜单接口方法在页面开头引入;translateDataToTree(list)也是官方写好的数组转树形结构,在src/utils/index.js中,里面的内容例如字段名需要根据自己项目修改,因为我的后端返回数据是同一级的所以需要转结构这个方法,看你项目需要

  1. import { getList } from '@/api/router'
  2. //下面是/api/router的getList 方法,这里获取方式按照自己项目来
  3. import request from '@/utils/request'
  4. export function getList(params) {
  5. return request({
  6. url: '/menus',
  7. method: 'get',
  8. params,
  9. })
  10. }
  11. //下面是translateDataToTree方法
  12. const parent = data.filter(
  13. // (value) => value.parentId === 'undefined' || value.parentId === null
  14. // )
  15. // const children = data.filter(
  16. // (value) => value.parentId !== 'undefined' && value.parentId !== null
  17. // )
  18. // const translator = (parent, children) => {
  19. // parent.forEach((parent) => {
  20. // children.forEach((current, index) => {
  21. // if (current.parentId === parent.id) {
  22. //改动
  23. (value) => value.parent_id === 'undefined' || value.parent_id === null||value.parent_id ===0
  24. )
  25. const children = data.filter(
  26. (value) => value.parent_id !== 'undefined' && value.parent_id !== null||value.parent_id !==0
  27. )
  28. const translator = (parent, children) => {
  29. parent.forEach((parent) => {
  30. children.forEach((current, index) => {
  31. if (current.parent_id === parent.id) {

4,由于后端返回数据和框架不一样,所以执行到上一步后需要该侧边栏字段回显部分,这里只贴出部分作为示例,可根据控制台报错知道哪里需要改动或者全局搜一下,也可以直接让后端改返回格式,这样最方便,一步到位!推荐!!。

        /src/vab/components/VabMenu/components/VabSubmenu.vue

        /src/vab/components/VabMenu/components/VabMenuItem.vue

        src/vab/components/VabBreadcrumb/index.vue 

        src/vab/components/VabColumnBar/index.vue

  1. <span>
  2. <!-- {{ translateTitle(route.meta.title) }} -->
  3. {{ translateTitle(route.meta_title) }}
  4. </span>

5,/src/router/index.js中对于不需要任何角色权限就可以看到页面的在constantRoutes里添加如个人中心,登录等自行添加

6,页面渲染,这里我用的是element ui的table多选没有弄树形结构,可能后期会弄吧~

  1. <template>
  2. <el-dialog :title="title" :visible.sync="dialogFormVisible" width="800px" @close="close">
  3. <el-form ref="form" label-width="80px" :model="form" :rules="rules">
  4. <el-form-item label="角色码" prop="name">
  5. <el-input v-model="form.name" />
  6. </el-form-item>
  7. <el-form-item label="菜单">
  8. <div class="vab-tree-border">
  9. <el-table border :data="list" ref="table" row-key="id" width="50%" height="400px" @selection-change="setTabelSelected">
  10. <el-table-column align="center" show-overflow-tooltip type="selection"
  11. :reserve-selection="true" />
  12. <el-table-column align="center" label="角色菜单" prop="name" show-overflow-tooltip />
  13. </el-table>
  14. </div>
  15. </el-form-item>
  16. </el-form>
  17. <template #footer>
  18. <el-button @click="close">取 消</el-button>
  19. <el-button type="primary" @click="save">确 定</el-button>
  20. </template>
  21. </el-dialog>
  22. </template>
  23. <script>
  24. import {
  25. doEdit,
  26. getListMenus,
  27. getAllList,
  28. doAdd
  29. } from '@/api/roleManagement'
  30. import {
  31. getList
  32. } from '@/api/router'
  33. import {
  34. translateDataToTree
  35. } from '@/utils/index'
  36. export default {
  37. name: 'RoleManagementEdit',
  38. data() {
  39. return {
  40. form: {
  41. btnRolesCheckedList: [],
  42. },
  43. rules: {
  44. name: [{
  45. required: true,
  46. trigger: 'blur',
  47. message: '请输入角色码'
  48. }],
  49. },
  50. title: '',
  51. dialogFormVisible: false,
  52. list: [],
  53. ListMenus: [],
  54. // 存放选中的数据
  55. selectedList: [],
  56. /* btnRoles demo */
  57. btnRoles: [{
  58. lable: '读',
  59. value: 'read:system',
  60. },
  61. {
  62. lable: '写',
  63. value: 'write:system',
  64. },
  65. {
  66. lable: '删',
  67. value: 'delete:system',
  68. },
  69. ],
  70. }
  71. },
  72. created() {
  73. },
  74. methods: {
  75. //父组件调用获取数据
  76. showEdit(row) {
  77. if (!row) {
  78. this.title = '添加'
  79. this.form = Object.assign({}, row)
  80. this.fetchData()
  81. } else {
  82. this.title = '编辑'
  83. this.form = Object.assign({}, row)
  84. this.fetchData()
  85. }
  86. this.dialogFormVisible = true
  87. },
  88. close() {
  89. this.selectedList = []
  90. this.$refs['form'].resetFields() //重置表单
  91. this.form = this.$options.data().form
  92. this.dialogFormVisible = false
  93. },
  94. //获取数据
  95. fetchData() {
  96. const params = "id=" + this.form.id
  97. getListMenus(params).then((res) => {
  98. this.list = res
  99. //选中初始回显
  100. const loop= this.list.forEach(item => {
  101. this.$refs.table.clearSelection(); // 清除之前的选中状态
  102. if (item.checked == true) {
  103. // this.selectedList.push(item)
  104. // this.$refs.table.toggleRowSelection(item);
  105. this.selectedList = this.list.reduce((accumulator, item) => {
  106. if (item.checked == true && !accumulator.find(selectedItem =>
  107. selectedItem.id === item.id)) {
  108. accumulator.push(item);
  109. }
  110. return accumulator;
  111. }, []);
  112. }
  113. })
  114. this.selectedList.forEach(item => {
  115. this.$refs.table.toggleRowSelection(item);
  116. });
  117. if (this.selectedList !== 0) {
  118. this.test()
  119. }
  120. });
  121. },
  122. test() {
  123. //这里是另一个全菜单后端接口,不包含checked属性,
  124. getAllList().then((res) => {
  125. // 使用filter方法筛选出包含指定id的对象
  126. const filteredObjects = res.filter(obj1 => {
  127. return this.selectedList.some(obj2 => obj2.id === obj1.id);
  128. });
  129. // 输出筛选后的对象数组
  130. })
  131. },
  132. // rows 将存放选中的数据( selectedList )传给setTabelSelected方法
  133. setTabelSelected(row) {
  134. // 检查当前行是否已经在selectedList中
  135. const index = this.selectedList.findIndex(item => item.id === row.id);
  136. const obj = this.selectedList.find(item => item.id === row.id);
  137. if (index === -1) {
  138. // 如果不存在,添加到selectedList中
  139. this.selectedList = row;
  140. } else {
  141. // 如果存在,从selectedList中移除
  142. this.selectedList.splice(index, 1);
  143. }
  144. },
  145. save() {
  146. this.$refs['form'].validate(async (valid) => {
  147. if (valid && this.selectedList.length !== 0) {
  148. const params = this.form.id
  149. // 使用map方法从每个对象中提取id,并创建一个新数组
  150. const idsExtracted = this.selectedList.map(item => item.id);
  151. this.form.menu_ids = idsExtracted
  152. console.log('this.form提交')
  153. console.log(this.form)
  154. if (this.title == '编辑') {
  155. doEdit(params, this.form).then((res) => {
  156. console.log('编辑')
  157. this.$emit('fetch-data')
  158. })
  159. }
  160. if (this.title == '添加') {
  161. doAdd(this.form).then((res) => {
  162. console.log('添加')
  163. this.$emit('fetch-data')
  164. })
  165. }
  166. this.close()
  167. }
  168. })
  169. },
  170. },
  171. }
  172. </script>
  173. <style lang="scss" scoped>
  174. .vab-tree-border {
  175. height: 200px;
  176. padding: $base-padding;
  177. overflow-y: auto;
  178. border: 1px solid #dcdfe6;
  179. border-radius: $base-border-radius;
  180. }
  181. </style>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/439635
推荐阅读
相关标签
  

闽ICP备14008679号