From c77f109ade55f12043acc3a94d77fd5f85144ae8 Mon Sep 17 00:00:00 2001 From: yinbangzhong <zhongbangyin@126.com> Date: 星期四, 15 八月 2024 17:37:13 +0800 Subject: [PATCH] 角色 --- /dev/null | 118 ---------- src/views/authority/role/index.vue | 72 ++++-- src/views/authority/users/index.vue | 456 +++++++++++++--------------------------- src/api/authority.ts | 5 4 files changed, 203 insertions(+), 448 deletions(-) diff --git a/src/api/authority.ts b/src/api/authority.ts index b8522ba..6e7240a 100644 --- a/src/api/authority.ts +++ b/src/api/authority.ts @@ -3,6 +3,7 @@ export interface User { userId: string; + loginName:string; userName: string; nickName: string; email: string; @@ -14,6 +15,9 @@ dialogs: any; createTime: string; status: string; + psw:string; + role:string; + roleName:string; } export interface Organization { @@ -78,6 +82,7 @@ resources: any; knowledges: any; dialogs: any; + agents: any; } export function RoleList(params: Pagination) { diff --git a/src/store/modules/user/index.ts b/src/store/modules/user/index.ts deleted file mode 100644 index faa226d..0000000 --- a/src/store/modules/user/index.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { defineStore } from 'pinia'; -import { - login as userLogin, - logout as userLogout, - getUserInfo, - LoginData, -} from '@/api/user'; -import { setToken, clearToken, setUserInfo, setUserResources, clearUserResources } from "@/utils/auth"; -import { removeRouteListener } from '@/utils/route-listener'; -import { UserState } from './types'; -import useAppStore from '../app'; -import router from "@/router"; - - -const useUserStore = defineStore('user', { - state: (): UserState => ({ - name: undefined, - avatar: undefined, - job: undefined, - organization: undefined, - location: undefined, - email: undefined, - introduction: undefined, - personalWebsite: undefined, - jobName: undefined, - organizationName: undefined, - locationName: undefined, - phone: undefined, - registrationDate: undefined, - accountId: undefined, - certification: undefined, - role: '', - resources:undefined, - hrefUrl:undefined - }), - - getters: { - userInfo(state: UserState): UserState { - return { ...state }; - }, - }, - - actions: { - switchRoles() { - return new Promise((resolve) => { - this.role = this.role === 'user' ? 'admin' : 'user'; - resolve(this.role); - }); - }, - // Set user's information - setInfo(partial: Partial<UserState>) { - this.$patch(partial); - }, - - // Reset user's information - resetInfo() { - clearUserResources() - this.$reset(); - }, - - // Get user's information - async info() { - const res = await getUserInfo(); - - this.setInfo(res.data); - }, - - // Login - async login(loginForm: LoginData):string { - try { - const res = await userLogin(loginForm); - - setToken(res.data.access_token); - const userInfo = { - avatar: res.data.avatar, - name: res.data.nickname, - email: res.data.email, - }; - this.resources=res.data.resources; - setUserInfo(JSON.stringify(userInfo)); - setUserResources(JSON.stringify(this.resources)) - for (const r of this.resources) { - if (r.menuType == 0) { - return r.component - } - } - } catch (err) { - clearToken(); - throw err; - } - }, - logoutCallBack() { - const appStore = useAppStore(); - this.resetInfo(); - clearToken(); - removeRouteListener(); - appStore.clearServerMenu(); - }, - // Logout - async logout() { - try { - await userLogout(); - } finally { - router.push({ - name: "login", - }); - this.logoutCallBack(); - } - }, - - - getHreFurl(url: string) { - this.hrefUrl=url - }, - }, -}); - -export default useUserStore; diff --git a/src/views/authority/role/index.vue b/src/views/authority/role/index.vue index baa7842..7d1305d 100644 --- a/src/views/authority/role/index.vue +++ b/src/views/authority/role/index.vue @@ -111,8 +111,8 @@ @cancel="handleCancel(1)" @ok="editHandleOk" > - <a-form :model="editform"> - <a-form-item required field="roleName" label="瑙掕壊鍚�"> + <a-form ref="formRef" :model="editform"> + <a-form-item required field="roleName" label="瑙掕壊鍚�" :rules="[{required:true,message:'瑙掕壊鍚嶅繀濉�'},{maxLength:50,message:'闀垮害涓嶈秴杩�50'}]"> <a-input v-model="editform.roleName" /> </a-form-item> <a-form-item field="remark" label="澶囨敞"> @@ -193,8 +193,8 @@ </a-checkbox> </a-checkbox-group> <a-checkbox-group - v-model="checkedKeysDialog" - @change="onCheckDialog" + v-model="checkedKeysAgent" + @change="onCheckAgent" > <a-checkbox v-for="(agent, index) of AgentList" @@ -248,6 +248,13 @@ @close="handleDialogRemove(tag)" > {{ tag.dialogName }} + </a-tag> + <a-tag + v-for="(tag, index) of checkStrictlyAgent" + :key="tag.agentId" + @close="handleDialogRemove(tag)" + > + {{ tag.agentTitle }} </a-tag> </a-space> </a-card> @@ -414,7 +421,7 @@ (tag) => tag !== key ); }; - + let formRef = ref(); const basePagination: Pagination = { current: 1, pageSize: 15, @@ -480,6 +487,7 @@ const editResourceHandleOk = async () => { let resources: Array = [], dialogs: Array = [], + agents: Array = [], Knowledges: Array = [], role: Role = { roleId: selectRole.value.roleId }; checkStrictlyMenu.value.forEach((val) => { @@ -497,32 +505,39 @@ }); role.dialogs = dialogs; + checkStrictlyAgent.value.forEach((val) => { + agents.push(val.agentId); + }); + role.agents = agents; + await RoleEdit(role).then((res) => { fetchData(); }); }; - const editHandleOk = async () => { - if(editform.value.roleName==""){ - Modal.warning({ - title: '璀﹀憡', - content: '鍚嶇О涓嶈兘涓虹┖' - }); - return; - } - if (editform.value.roleId.length > 0) { - await RoleEdit({ - ...editform.value, - } as unknown as Role).then((res) => { - fetchData(); - }); + const cb = async (err) => { + if (err) { + visible.value = true; } else { - await RoleAdd({ - ...editform.value, - } as unknown as Role).then((res) => { - fetchData(); - }); + if (editform.value.roleId.length > 0) { + await RoleEdit({ + ...editform.value, + } as unknown as Role).then((res) => { + fetchData(); + }); + } else { + await RoleAdd({ + ...editform.value, + } as unknown as Role).then((res) => { + fetchData(); + }); + } } + + }; + + const editHandleOk = () => { + formRef.value.validate(cb); }; const operation = async (t, record) => { if (t == 0) { @@ -580,6 +595,15 @@ checkedKeysDialog.value.push(val.id); }); } + if (record.agents) { + record.agents.forEach((val) => { + checkStrictlyAgent.value.push({ + agentId: val.id, + agentTitle: val.title, + }); + checkedKeysAgent.value.push(val.id); + }); + } } }; diff --git a/src/views/authority/users/index.vue b/src/views/authority/users/index.vue index 9208782..13f4565 100644 --- a/src/views/authority/users/index.vue +++ b/src/views/authority/users/index.vue @@ -77,9 +77,6 @@ <template #index="{ rowIndex }"> {{ rowIndex + 1 + (pagination.current - 1) * pagination.pageSize }} </template> - <template #dept="{ record }">{{ - record.dept ? record.dept.deptName : '' - }}</template> <template #status="{ record }"> <a-switch checked-value="1" @@ -110,7 +107,7 @@ type="dashed" status="warning" @click="operation(4, record)" - >鏉冮檺閰嶇疆</a-button + >鏌ョ湅鏉冮檺</a-button > <a-button status="success" @click="operation(5, record)" >閮ㄩ棬閰嶇疆</a-button @@ -124,17 +121,52 @@ :title="save" @cancel="handleCancel(1)" @ok="editHandleOk" + width="48%" > - <a-form :model="editform"> - <a-form-item field="email" label="鐢ㄦ埛鍚�"> - <a-input v-model="editform.email" /> - </a-form-item> - <a-form-item field="name" label="鏄电О"> - <a-input v-model="editform.nickName" /> - </a-form-item> - <a-form-item field="phoneNumber" label="鎵嬫満鍙�"> - <a-input v-model="editform.phoneNumber" /> - </a-form-item> + <a-form ref="formRef" :model="editform"> + <a-row :gutter="20"> + <a-col :span="10"> + <a-form-item field="loginName" label="鐢ㄦ埛鍚�" :rules="[{required:true,message:'鐢ㄦ埛鍚嶅繀濉�'},{maxLength:50,message:'闀垮害涓嶈秴杩�50'}]" + > + <a-input v-model="editform.loginName" /> + </a-form-item> + </a-col> + <a-col :span="10"> + <a-form-item field="userName" label="濮撳悕"> + <a-input v-model="editform.userName" /> + </a-form-item> + </a-col> + </a-row> + <a-row :gutter="20"> + <a-col :span="10"> + <a-form-item field="phoneNumber" label="鎵嬫満鍙�"> + <a-input v-model="editform.phoneNumber" /> + </a-form-item> + </a-col> + <a-col :span="10"> + <a-form-item required field="email" label="閭" :rules="[{required:true,message:'閭蹇呭~'},{maxLength:50,message:'闀垮害涓嶈秴杩�50'}]" > + <a-input v-model="editform.email" /> + </a-form-item> + </a-col> + </a-row> + <a-row :gutter="20"> + <a-col :span="10"> + <a-form-item field="psw" label="瀵嗙爜"> + <a-input v-model="editform.psw" /> + </a-form-item> + </a-col> + <a-col :span="10"> + <a-form-item required field="role" label="瑙掕壊" :rules="[{required:true,message:'瑙掕壊蹇呴��'}]" > + <a-select + v-model="editform.role" + :options="roles" + :field-names="fieldNames" + @change="roleChange" + > + </a-select> + </a-form-item> + </a-col> + </a-row> </a-form> </a-modal> <a-modal @@ -184,142 +216,14 @@ width="50%" v-model:visible="resourcevisible" v-if="resourcevisible" - title="鏉冮檺閰嶇疆" + title="鐢ㄦ埛鎵�鏈夋潈闄�" @cancel="handleCancel(3)" - @ok="editResourceHandleOk" > <div :style="{ 'display': 'flex', 'flex-direction': 'column' }"> - <a-tabs - :style="{ 'width': '100%', 'height': '500px', 'overflow-y': 'auto' }" - > - <a-tab-pane key="1"> - <template #title> - <icon-calendar /> - 鑿滃崟 - </template> - <a-tree - class="tree-demo-box" - v-model:checked-keys="checkedKeysMenu" - v-model:expanded-keys="expandKdysMenu" - :checkable="true" - :data="treeDataMenu" - :show-line="showLineMenu" - @check="onCheckMenu" - :fieldNames="{ - key: 'menuId', - title: 'menuName', - children: 'children', - }" - :check-strictly="checkStrictlyMenu" - > - <!-- <template #extra="nodeData"> - <div :class="{ 'custom-class': nodeData.menuType == 1 }"> - <span> - {{ nodeData.menuName }} - </span> - </div> - </template> --> - </a-tree> - <!-- <a-space class="space_select_all"> - <a-button type="primary">鍏ㄩ��</a-button> - <a-button>鍙栨秷鍏ㄩ��</a-button> - </a-space> - - <div class="table_box" v-if="treeDataMenu[0].children"> - <div class="table_row1"> - <div - class="row1_list" - v-for="(item, index) in treeDataMenu[0].children" - :key="item.menuId" - > - <div class="row1_clo"> - <a-checkbox - :checked="item.menuId" - @change="onCheckChange(item, $event)" - > - {{ item.menuName }} - </a-checkbox> - </div> - <div v-if="item.children" class="row1_clo2"> - <div - class="row2_clo2_1" - v-for="(item2, index2) in item.children" - :key="item2.menuId" - > - <div class="row1_clo2_1"> - <a-checkbox - :checked="item2.menuId" - @change="onCheckChange(item2, $event)" - > - {{ item2.menuName }} - </a-checkbox> - </div> - <div v-if="item2.children" class="row1_clo2_2"> - <div - v-for="(item3, index3) in item2.children" - :key="item3.menuId" - > - <a-checkbox - :checked="item3.menuId" - @change="onCheckChange(item3, $event)" - > - {{ item3.menuName }}</a-checkbox - > - </div> - </div> - </div> - </div> - </div> - </div> - </div> --> - </a-tab-pane> - <a-tab-pane key="2"> - <template #title> - <icon-clock-circle /> - 鐭ヨ瘑搴� - </template> - <a-space direction="vertical" size="large"> - <a-checkbox-group - v-model="checkedKeysKnowledge" - direction="vertical" - @change="onCheckKnowledge" - > - <a-checkbox - v-for="(knowledg, index) of knowledgeList" - :value="knowledg.id" - :lable="knowledg.name" - @change="onCheckKnowledge" - > - {{ knowledg.name }} - </a-checkbox> - </a-checkbox-group> - </a-space> - </a-tab-pane> - <a-tab-pane key="3"> - <template #title> - <icon-user /> - 鏅鸿兘浣� - </template> - <a-checkbox-group - v-model="checkedKeysDialog" - direction="vertical" - @change="onCheckDialog" - > - <a-checkbox - v-for="(dialog, index) of DialogsList" - :value="dialog.id" - :lable="dialog.name" - @change="onCheckDialog" - > - {{ dialog.name }} - </a-checkbox> - </a-checkbox-group> - </a-tab-pane> - </a-tabs> <a-card :style="{ 'width': '100%', - 'height': '200px', + 'height': '40%', 'overflow-y': 'auto', 'margin': '1px', }" @@ -358,6 +262,13 @@ > {{ tag.dialogName }} </a-tag> + <a-tag + v-for="(tag, index) of checkStrictlyAgent" + :key="tag.agentId" + @close="handleDialogRemove(tag)" + > + {{ tag.agentName }} + </a-tag> </a-space> </a-card> </div> @@ -375,38 +286,32 @@ DialogList, KnowledgeList, OrganizationList, - ResourceList, + ResourceList, Role, RoleList, User, UserAdd, UserChangePwd, UserDelete, UserEdit, UserList, - Userstatus, - } from '@/api/authority'; + Userstatus + } from "@/api/authority"; import { Modal } from '@arco-design/web-vue'; import Authheader from '@/views/authority/components/authheader.vue'; import { create } from 'lodash'; import { queryCanvasList } from "@/api/Agent"; + const fieldNames = { value: 'roleId', label: 'roleName' }; + const roles = ref([]); + let treeData = ref([]); let checkedKeys = ref([]); let expandKdys = ref([]); let checkStrictly = ref([]); - - let treeDataMenu = ref<any>([]); - let checkedKeysMenu = ref([]); - let expandKdysMenu = ref([]); let checkStrictlyMenu = ref([]); - - let checkedKeysKnowledge = ref([]); let checkStrictlyKnowledge = ref([]); - - let checkedKeysDialog = ref([]); let checkStrictlyDialog = ref([]); - - let knowledgeList = ref([]); - let DialogsList = ref([]); + let checkStrictlyAgent = ref([]); + let formRef = ref(); let menuTips = ref(['鏉冮檺绠$悊', '璐﹀彿']); type SizeProps = 'mini' | 'small' | 'medium' | 'large'; @@ -431,7 +336,10 @@ phoneNumber: '', status: '', userId: '', + loginName:'', userName: '', + psw:'', + role:'', }); let size = ref<SizeProps>('medium'); @@ -439,12 +347,15 @@ let deptvisible = ref(false); let resourcevisible = ref(false); let selectUser = ref({}); - const treeDataList = ref([]); - const checked1 = ref(false); - //琛ㄦ牸澶嶉�夋閫夋嫨 - const onCheckChange = (checkedKeysValue: (string | number)[], e: any) => { - console.log('onCheckChange', checkedKeysValue, e); + const loadRole=async () => { + await RoleList(null).then((res) => { + roles.value = res.rows; + }); + } + + const roleChange = (val) => { + editform.value.role = val; }; const onCheck = (newCheckedKeys, event) => { @@ -460,74 +371,6 @@ } }); } - }; - const onCheckMenu = (newCheckedKeys, event) => { - let o = { menuId: event.node.menuId, menuName: event.node.menuName }; - if (event.checked) { - checkStrictlyMenu.value.push(o); - } else { - checkStrictlyMenu.value.forEach((val, idx, array) => { - // val: 褰撳墠鍊� - if (val.menuId == event.node.menuId) { - checkStrictlyMenu.value.splice(idx, 1); - return true; - } - }); - } - }; - const onCheckKnowledge = (newCheckedKeys, event) => { - let o = { - knowledgeId: event.target.value, - knowledgeName: event.target.labels[0].innerText, - }; - if (event.target.checked) { - checkStrictlyKnowledge.value.push(o); - } else { - checkStrictlyKnowledge.value.forEach((val, idx, array) => { - // val: 褰撳墠鍊� - if (val.knowledgeId == event.target.value) { - checkStrictlyKnowledge.value.splice(idx, 1); - return true; - } - }); - } - }; - - const onCheckDialog = (newCheckedKeys, event) => { - let o = { - dialogId: event.target.value, - dialogName: event.target.labels[0].innerText, - }; - if (event.target.checked) { - checkStrictlyDialog.value.push(o); - } else { - checkStrictlyDialog.value.forEach((val, idx, array) => { - // val: 褰撳墠鍊� - if (val.dialogId == event.target.value) { - checkStrictlyDialog.value.splice(idx, 1); - return true; - } - }); - } - }; - - const handleRemove = (key) => { - checkStrictly.value = checkStrictly.value.filter((tag) => tag !== key); - }; - const handleMenuRemove = (key) => { - checkStrictlyMenu.value = checkStrictlyMenu.value.filter( - (tag) => tag !== key - ); - }; - const handleKnowledgeRemove = (key) => { - checkStrictlyKnowledge.value = checkStrictlyKnowledge.value.filter( - (tag) => tag !== key - ); - }; - const handleDialogRemove = (key) => { - checkStrictlyDialog.value = checkStrictlyDialog.value.filter( - (tag) => tag !== key - ); }; const basePagination: Pagination = { @@ -564,11 +407,11 @@ }, { title: t('鐢ㄦ埛鍚�'), - dataIndex: 'email', + dataIndex: 'loginName', }, { - title: t('鍒涘缓鏃堕棿'), - dataIndex: 'createTime', + title: t('瑙掕壊'), + dataIndex: 'roleName', }, { title: t('鎵�灞為儴闂�'), @@ -598,9 +441,6 @@ if (type == 2) { deptvisible.value = false; } - if (type == 2) { - resourcevisible.value = false; - } }; const editDeptHandleOk = async () => { @@ -615,45 +455,29 @@ }); }; - const editResourceHandleOk = async () => { - let resources: Array = [], - dialogs: Array = [], - Knowledges: Array = [], - user: User = { userId: selectUser.value.userId }; - checkStrictlyMenu.value.forEach((val) => { - resources.push(val.menuId); - }); - user.resources = resources; - checkStrictlyKnowledge.value.forEach((val) => { - Knowledges.push(val.knowledgeId); - }); - user.knowledges = Knowledges; - - checkStrictlyDialog.value.forEach((val) => { - dialogs.push(val.dialogId); - }); - user.dialogs = dialogs; - - await UserEdit(user).then((res) => { - fetchData(); - }); - }; - - const editHandleOk = async () => { - if (editform.value.userId.length > 0) { - await UserEdit({ - ...editform.value, - } as unknown as User).then((res) => { - fetchData(); - }); + const cb = async (err) => { + if (err) { + visible.value = true; } else { - await UserAdd({ - ...editform.value, - } as unknown as User).then((res) => { - fetchData(); - }); + if (editform.value.userId.length > 0) { + await UserEdit({ + ...editform.value + } as unknown as User).then((res) => { + fetchData(); + }); + } else { + await UserAdd({ + ...editform.value + } as unknown as User).then((res) => { + fetchData(); + }); + } } + + }; + const editHandleOk = () => { + formRef.value.validate(cb); }; const operation = async (t, record) => { if (t == 0) { @@ -661,9 +485,11 @@ visible.value = true; editform.value.userId = ''; editform.value.userName = ''; + editform.value.loginName = ''; editform.value.nickName = ''; editform.value.email = ''; editform.value.phoneNumber = ''; + editform.value.role = ''; } //閲嶇疆瀵嗙爜 if (t == 1) { @@ -687,9 +513,10 @@ save.value = '缂栬緫'; editform.value.userId = record.userId; editform.value.userName = record.userName; - editform.value.nickName = record.nickName; + editform.value.loginName = record.loginName; editform.value.email = record.email; editform.value.phoneNumber = record.phoneNumber; + editform.value.role = record.role; } //鍒犻櫎 if (t == 3) { @@ -702,40 +529,67 @@ //鏉冮檺 if (t == 4) { resourcevisible.value = true; - checkedKeysMenu.value = []; - expandKdysMenu.value = []; checkStrictlyMenu.value = []; checkStrictlyKnowledge.value = []; - checkedKeysKnowledge.value = []; checkStrictlyDialog.value = []; - checkedKeysDialog.value = []; selectUser.value = record; - if (record.resources) { - record.resources.forEach((val) => { + + let agents; + if (record.agents){ + agents=record.agents + }else{ + agents = record.roles ? record.roles[0].agents : null; + } + if (agents) { + agents.forEach((val) => { + checkStrictlyAgent.value.push({ + agentId: val.id, + agentName: val.title, + }); + + }); + } + let resources; + if (record.resources){ + resources=record.resources + }else{ + resources = record.roles ? record.roles[0].resources : null; + } + if (resources) { + resources.forEach((val) => { checkStrictlyMenu.value.push({ menuId: val.menuId, menuName: val.menuName, }); - checkedKeysMenu.value.push(val.menuId); - expandKdysMenu.value.push(val.menuId); + }); } + let knowledges; if (record.knowledges) { - record.knowledges.forEach((val) => { + knowledges = record.knowledges; + } else { + knowledges = record.roles ? record.roles[0].knowledges : null; + } + if (knowledges) { + knowledges.forEach((val) => { checkStrictlyKnowledge.value.push({ knowledgeId: val.id, knowledgeName: val.name, }); - checkedKeysKnowledge.value.push(val.id); }); } + let dialogs; if (record.dialogs) { - record.dialogs.forEach((val) => { + dialogs = record.dialogs; + } else { + dialogs = record.roles ? record.roles[0].dialogs : null; + } + if (dialogs) { + dialogs.forEach((val) => { checkStrictlyDialog.value.push({ dialogId: val.id, dialogName: val.name, }); - checkedKeysDialog.value.push(val.id); }); } } @@ -776,6 +630,15 @@ } } } + if (user.roles) { + for (const r of user.roles) { + if (user.roleName) { + user.roleName += r.roleName + ","; + } else { + user.roleName = r.roleName + ","; + } + } + } } renderData.value = res.rows; console.log(renderData); @@ -805,30 +668,11 @@ treeData.value = [...res.rows]; }); }; - const objArr = ref<any>([]); - const MenuData = async (key) => { - await ResourceList(key).then((res) => { - treeDataMenu.value = [...res.rows]; - // addClassToLeafNodes(treeDataMenu.value); - treeDataList.value = res.rows; - }); - }; - KnowledgeList().then((res) => { - knowledgeList.value = res.rows; - }); - - DialogList().then((res) => { - DialogsList.value = res.rows; - //鍔犺浇agent - queryCanvasList(null).then((r) => { - - }); - }); fetchData(); OrganizationData(''); - MenuData(); + loadRole() const reset = () => { formModel.value = generateFormModel(); -- Gitblit v1.8.0