Quellcode durchsuchen

@zengqiao@菜单分配完成

HexOr vor 3 Jahren
Ursprung
Commit
00b1002d88

+ 2 - 0
dmp-edge-ai/src/plugins/element.js

@ -25,6 +25,7 @@ import {
25 25
  DropdownItem,
26 26
  Tree,
27 27
  Dialog,
28
  Drawer,
28 29
  Loading,
29 30
  MessageBox,
30 31
  Message,
@ -56,6 +57,7 @@ Vue.use(DropdownMenu)
56 57
Vue.use(DropdownItem)
57 58
Vue.use(Tree)
58 59
Vue.use(Dialog)
60
Vue.use(Drawer)
59 61
60 62
Vue.use(Loading.directive)
61 63

+ 12 - 0
dmp-edge-ai/src/service/RoleService.js

@ -69,3 +69,15 @@ export function deleteRole(roleId) {
69 69
    method: 'get'
70 70
  })
71 71
}
72
73
/**
74
 * 新增角色权限
75
 * @param data
76
 */
77
export function addRolePrivEntity(data) {
78
  return request({
79
    url: `/role/addPrivEntity`,
80
    method: 'post',
81
    data
82
  })
83
}

+ 11 - 1
dmp-edge-ai/src/utils/constant.js

@ -43,7 +43,8 @@ export const IframeFlag = createEnum({
43 43
 */
44 44
export const OrganizeType = createEnum({
45 45
  COMPANY: ['0', '公司'],
46
  DEPARTMENT: ['1', '部门']
46
  DEPARTMENT: ['1', '部门'],
47
  VIRTUAL: ['2', '虚拟组织']
47 48
})
48 49
49 50
/**
@ -55,3 +56,12 @@ export const ModalType = {
55 56
  EDIT: 1,
56 57
  DETAIL: 2
57 58
}
59
60
/**
61
 * 角色分配类型
62
 * @type {{MENU: string, ORGANIZE: string}}
63
 */
64
export const RoleAssignType = {
65
  ORGANIZE: 'ORGANIZE',
66
  MENU: 'MENU'
67
}

+ 116 - 0
dmp-edge-ai/src/views/system/role/components/MenuDrawer.vue

@ -0,0 +1,116 @@
1
<template>
2
  <el-drawer :title="title" :visible.sync="drawerVisible" direction="rtl" @open="initData">
3
    <div class="flex flex-col h-full">
4
      <el-tree
5
        default-expand-all
6
        show-checkbox
7
        class="flex-auto overflow-auto"
8
        node-key="menuId"
9
        ref="tree"
10
        :data="treeData"
11
        :props="config"
12
      >
13
      </el-tree>
14
      <div class="dialog-footer flex-none p-4">
15
        <el-button v-if="!submitLoading" type="primary" @click="submit()">确认</el-button>
16
        <el-button v-else type="primary" :loading="submitLoading">提交中</el-button>
17
        <el-button @click="drawerVisible = false">关闭并返回</el-button>
18
      </div>
19
    </div>
20
  </el-drawer>
21
</template>
22
23
<script>
24
import { default as service } from '@/service'
25
import { RoleAssignType } from '@/utils/constant'
26
export default {
27
  name: 'MenuDrawer',
28
  props: {
29
    assignData: {
30
      type: Object,
31
      required: true
32
    },
33
    show: {
34
      type: Boolean,
35
      required: true,
36
      default: false
37
    }
38
  },
39
  data() {
40
    this.config = {
41
      label: 'menuName',
42
      children: 'children'
43
    }
44
    return {
45
      submitLoading: false,
46
      treeData: []
47
    }
48
  },
49
  computed: {
50
    drawerVisible: {
51
      set(val) {
52
        this.$emit('update:show', val)
53
      },
54
      get() {
55
        return this.show
56
      }
57
    },
58
    title() {
59
      return `菜单分配/${this.assignData.roleName}`
60
    }
61
  },
62
  methods: {
63
    /**
64
     * 初始化模态框
65
     */
66
    initData() {
67
      this.$refs.tree?.setCheckedKeys([])
68
      if (this.assignData.roleId) {
69
        service.role.getRoleInfo(this.assignData.roleId).then((res) => {
70
          const { privEntList } = res
71
          const checkedKeys = privEntList.reduce(
72
            (pre, cur) => (cur.busiObjType === RoleAssignType.MENU ? pre.concat(cur.busiObjId) : pre),
73
            []
74
          )
75
          this.$refs.tree.setCheckedKeys(checkedKeys)
76
        })
77
      }
78
    },
79
    async submit() {
80
      this.submitLoading = true
81
      const checkedNodes = this.$refs.tree.getCheckedNodes().map((item) => {
82
        return {
83
          privEntName: item.menuName,
84
          busiObjId: item.menuId,
85
          busiObjType: RoleAssignType.MENU
86
        }
87
      })
88
      const params = {
89
        roleId: this.assignData.roleId,
90
        busiObjType: RoleAssignType.MENU,
91
        privEntList: checkedNodes
92
      }
93
      console.log(params)
94
      try {
95
        await service.role.addRolePrivEntity(params)
96
        this.drawerVisible = false
97
      } finally {
98
        this.submitLoading = false
99
      }
100
    },
101
    /**
102
     * 获取组织树
103
     */
104
    getMenuList() {
105
      service.menu.listTree().then((res) => {
106
        this.treeData = res
107
      })
108
    }
109
  },
110
  created() {
111
    this.getMenuList()
112
  }
113
}
114
</script>
115
116
<style scoped lang="scss"></style>

+ 116 - 0
dmp-edge-ai/src/views/system/role/components/OrganizeDrawer.vue

@ -0,0 +1,116 @@
1
<template>
2
  <el-drawer :title="title" :visible.sync="drawerVisible" direction="rtl" @open="initData">
3
    <div class="flex flex-col h-full">
4
      <el-tree
5
        default-expand-all
6
        show-checkbox
7
        class="flex-auto overflow-auto"
8
        node-key="organizeId"
9
        ref="tree"
10
        :data="treeData"
11
        :props="config"
12
      >
13
      </el-tree>
14
      <div class="dialog-footer flex-none p-4">
15
        <el-button v-if="!submitLoading" type="primary" @click="submit()">确认</el-button>
16
        <el-button v-else type="primary" :loading="submitLoading">提交中</el-button>
17
        <el-button @click="drawerVisible = false">关闭并返回</el-button>
18
      </div>
19
    </div>
20
  </el-drawer>
21
</template>
22
23
<script>
24
import { default as service } from '@/service'
25
import { RoleAssignType } from '@/utils/constant'
26
export default {
27
  name: 'OrganizeDrawer',
28
  props: {
29
    assignData: {
30
      type: Object,
31
      required: true
32
    },
33
    show: {
34
      type: Boolean,
35
      required: true,
36
      default: false
37
    }
38
  },
39
  data() {
40
    this.config = {
41
      label: 'organizeName',
42
      children: 'children'
43
    }
44
    return {
45
      submitLoading: false,
46
      treeData: []
47
    }
48
  },
49
  computed: {
50
    drawerVisible: {
51
      set(val) {
52
        this.$emit('update:show', val)
53
      },
54
      get() {
55
        return this.show
56
      }
57
    },
58
    title() {
59
      return `组织权限分配/${this.assignData.roleName}`
60
    }
61
  },
62
  methods: {
63
    /**
64
     * 初始化模态框
65
     */
66
    initData() {
67
      this.$refs.tree?.setCheckedKeys([])
68
      if (this.assignData.roleId) {
69
        service.role.getRoleInfo(this.assignData.roleId).then((res) => {
70
          const { privEntList } = res
71
          const checkedKeys = privEntList.reduce(
72
            (pre, cur) => (cur.busiObjType === RoleAssignType.ORGANIZE ? pre.concat(cur.busiObjId) : pre),
73
            []
74
          )
75
          this.$refs.tree.setCheckedKeys(checkedKeys)
76
        })
77
      }
78
    },
79
    async submit() {
80
      this.submitLoading = true
81
      const checkedNodes = this.$refs.tree.getCheckedNodes().map((item) => {
82
        return {
83
          privEntName: item.organizeName,
84
          busiObjId: item.organizeId,
85
          busiObjType: RoleAssignType.ORGANIZE
86
        }
87
      })
88
      const params = {
89
        roleId: this.assignData.roleId,
90
        busiObjType: RoleAssignType.ORGANIZE,
91
        privEntList: checkedNodes
92
      }
93
      console.log(params)
94
      try {
95
        await service.role.addRolePrivEntity(params)
96
        this.drawerVisible = false
97
      } finally {
98
        this.submitLoading = false
99
      }
100
    },
101
    /**
102
     * 获取组织树
103
     */
104
    getOrganizeList() {
105
      service.organize.listTree().then((res) => {
106
        this.treeData = res
107
      })
108
    }
109
  },
110
  created() {
111
    this.getOrganizeList()
112
  }
113
}
114
</script>
115
116
<style scoped lang="scss"></style>

+ 29 - 4
dmp-edge-ai/src/views/system/role/index.vue

@ -51,7 +51,12 @@
51 51
      >
52 52
      </el-pagination>
53 53
    </div>
54
    <!--新增/修改弹窗-->
54 55
    <base-dialog :show.sync="baseVisible" :roleId="roleId" @refresh="search"> </base-dialog>
56
    <!--组织权限分配-->
57
    <organize-drawer :show.sync="organizeVisible" :assignData="assignData"> </organize-drawer>
58
    <!--菜单分配-->
59
    <menu-drawer :show.sync="menuVisible" :assignData="assignData"> </menu-drawer>
55 60
  </div>
56 61
</template>
57 62
@ -62,7 +67,9 @@ export default {
62 67
  name: 'Role',
63 68
  components: {
64 69
    PageHeader,
65
    BaseDialog: () => import('./components/BaseDialog')
70
    BaseDialog: () => import('./components/BaseDialog'),
71
    OrganizeDrawer: () => import('./components/OrganizeDrawer'),
72
    MenuDrawer: () => import('./components/MenuDrawer')
66 73
  },
67 74
  data() {
68 75
    return {
@ -83,7 +90,17 @@ export default {
83 90
      },
84 91
      tableData: [],
85 92
      roleId: '',
86
      baseVisible: false
93
      // 新增/修改模态窗
94
      baseVisible: false,
95
      // 组织权限分配抽屉显示控制
96
      organizeVisible: false,
97
      // 菜单分配抽屉显示控制
98
      menuVisible: false,
99
      // 分配数据
100
      assignData: {
101
        roleId: '',
102
        roleName: ''
103
      }
87 104
    }
88 105
  },
89 106
  methods: {
@ -96,10 +113,18 @@ export default {
96 113
      this.baseVisible = true
97 114
    },
98 115
    assignMenu(row) {
99
      console.log(row)
116
      this.assignData = {
117
        roleId: row.roleId,
118
        roleName: row.roleName
119
      }
120
      this.menuVisible = true
100 121
    },
101 122
    assignOrganize(row) {
102
      console.log(row)
123
      this.assignData = {
124
        roleId: row.roleId,
125
        roleName: row.roleName
126
      }
127
      this.organizeVisible = true
103 128
    },
104 129
    deleteItem(row) {
105 130
      this.$confirm(`您确定删除该角色吗?`, '提示', {