diff --git a/src/store/modules/permission/role/role.js b/src/store/modules/permission/role/role.js index 69816a6..ea43e75 100644 --- a/src/store/modules/permission/role/role.js +++ b/src/store/modules/permission/role/role.js @@ -1,3 +1,4 @@ +import * as deptAPI from '@/api/permission/dept.js'; import * as featureAPI from '@/api/permission/feature.js'; import * as menuAPI from '@/api/permission/menu.js'; import * as api from '@/api/permission/role.js'; @@ -11,6 +12,7 @@ const state = () => ({ opts: { init: false, system: [], + dept: [], status: [ { label: '启用', @@ -46,6 +48,7 @@ const actions = { ...state.opts, init: true, system: await systemAPI.search(), + dept: await deptAPI.search({ hiddenDisable: true }), }); }, loadMenu: async (context, systemId) => { @@ -61,6 +64,14 @@ const actions = { } return res; }, + updateDept: async (context, data) => { + let update = data.roleIds instanceof Array ? deptAPI.addRole : deptAPI.delRole; + let res = await update(data); + if (!res) { + ElMessage.error('保存组织机构失败'); + } + return res; + }, detail: async (context, id) => { let res = await api.detail(id); if (!res) { diff --git a/src/views/permission/role/index.vue b/src/views/permission/role/index.vue index a083f53..28fd981 100644 --- a/src/views/permission/role/index.vue +++ b/src/views/permission/role/index.vue @@ -59,7 +59,7 @@ - + - + - + + + @@ -135,7 +151,7 @@ const store = useStore(); const loading = ref(false); const code = computed(() => store.state.role.code); - const list = computed(() => store.state.role.list); + const list = computed(() => _.cloneDeep(store.state.role.list)); const total = computed(() => store.state.role.total); const opts = computed(() => store.state.role.opts); if (!unref(opts).init) { @@ -198,6 +214,7 @@ isEnable: true, menuIds: [], permissionIds: [], + departmentList: [], }, rules1: { systemId: [{ required: true, message: '所属系统不能为空' }], @@ -208,6 +225,9 @@ rules2: { menuIds: [{ required: true, message: '功能权限不能为空' }], }, + rules3: { + departmentList: [{ required: true, trigger: 'change', message: '绑定组织不能为空' }], + }, }); watch( () => formState.currentTab, @@ -217,7 +237,9 @@ res.permissionIds = []; const deep = (arr) => { (arr || []).forEach((item) => { - res.menuIds.push(item.id); + if (item.isHave) { + res.menuIds.push(item.id); + } res.permissionIds.push( ...(item.permissionChild || []).filter((item) => item.isHave).map((item) => item.id) ); @@ -254,16 +276,61 @@ formState.form.permissionIds.splice(formState.form.permissionIds.indexOf(data.id), 1); } }; + const refsTree2 = ref(null); + const updateChecked = ref(false); + const handleCheckDept = async (data, checked, childChecked) => { + if (!unref(updateChecked)) { + let params = + checked || childChecked + ? { + departmentId: data.id, + isDistributionCurrentDepartmentEmployee: true, + roleIds: [formState.form.id], + } + : { departmentId: data.id, isDeleteDepartmentOfEmployeeRole: true, roleIds: formState.form.id }; + let res = await store.dispatch('role/updateDept', params); + if (checked || childChecked) { + if (res) { + formState.form.departmentList.push({ ...data }); + } + } else { + if (res) { + formState.form.departmentList.splice( + formState.form.departmentList.findIndex((item) => item.id === data.id), + 1 + ); + } + } + nextTick(() => { + try { + unref(refsForm3).validate(); + } catch (e) { + console.info(e); + } + updateChecked.value = true; + unref(refsTree2).setCheckedKeys(formState.form.departmentList.map((item) => item.id)); + nextTick(() => { + updateChecked.value = false; + }); + }); + } + }; const handleCreate = (row) => { formState.formVisible = true; Object.assign( formState.form, - row || { - id: null, - systemId: null, - roleName: null, - roleDesc: null, - } + _.cloneDeep( + row || { + id: null, + systemId: null, + roleName: null, + roleDesc: null, + isEnable: true, + menuIds: [], + permissionIds: [], + departmentList: [], + } + ) ); }; const handleCancel = () => { @@ -275,21 +342,23 @@ await proxy.$validate( formState.currentTab === '1' ? refsForm : formState.currentTab === '2' ? refsForm2 : refsForm3 ); - let data = _.cloneDeep(formState.form); - let res = await store.dispatch( - formState.currentTab === '1' - ? 'role/save' - : formState.currentTab === '2' - ? 'role/updateMenu' - : 'role/updateDept', - data - ); - if (res && formState.currentTab === '1') { - formState.form.id = res.id; - } - if (res && formState.currentTab === '3') { + if (formState.currentTab === '3') { formState.formVisible = false; + formState.currentTab = '1'; + handleSearch(); } else { + let data = _.cloneDeep(formState.form); + let res = await store.dispatch( + formState.currentTab === '1' + ? 'role/save' + : formState.currentTab === '2' + ? 'role/updateMenu' + : 'role/updateDept', + data + ); + if (res && formState.currentTab === '1') { + formState.form.id = res.id; + } formState.currentTab = +formState.currentTab + 1 + ''; } } catch (e) { @@ -368,16 +437,24 @@ diff --git a/vite.config.js b/vite.config.js index ff1c0d0..6516d2f 100644 --- a/vite.config.js +++ b/vite.config.js @@ -21,10 +21,10 @@ export default (configEnv) => { proxy: { '/api': { // target: 'http://192.168.10.109:8090/', // 显雨 - target: 'http://192.168.10.5:4500', // 高玉 + // target: 'http://192.168.10.5:4500', // 高玉 // target: 'http://192.168.10.67:8090', // 罗战 // target: 'http://192.168.10.93:8090', // 周渺 - // target: 'https://k8s-horse-gateway.mashibing.cn/', // 测试地址 + target: 'https://k8s-horse-gateway.mashibing.cn/', // 测试地址 // target: 'https://you-gateway.mashibing.com', // 生产环境 changeOrigin: true, rewrite: (path) => path.replace(/^\/api/, ''),