diff --git a/auto-imports.d.ts b/auto-imports.d.ts index 08908ed..8139ac9 100644 --- a/auto-imports.d.ts +++ b/auto-imports.d.ts @@ -1,5 +1,5 @@ // Generated by 'unplugin-auto-import' export {} declare global { - + const ElMessage: typeof import('element-plus/es')['ElMessage'] } diff --git a/components.d.ts b/components.d.ts index 428136e..32b63f0 100644 --- a/components.d.ts +++ b/components.d.ts @@ -50,6 +50,7 @@ declare module '@vue/runtime-core' { ElRow: typeof import('element-plus/es')['ElRow'] ElScrollbar: typeof import('element-plus/es')['ElScrollbar'] ElSelect: typeof import('element-plus/es')['ElSelect'] + ElSelector: typeof import('element-plus/es')['ElSelector'] ElSlider: typeof import('element-plus/es')['ElSlider'] ElSpace: typeof import('element-plus/es')['ElSpace'] ElStatistic: typeof import('element-plus/es')['ElStatistic'] @@ -69,6 +70,7 @@ declare module '@vue/runtime-core' { ElTour: typeof import('element-plus/es')['ElTour'] ElTourStep: typeof import('element-plus/es')['ElTourStep'] ElTransfer: typeof import('element-plus/es')['ElTransfer'] + ElTree: typeof import('element-plus/es')['ElTree'] ElTreeV2: typeof import('element-plus/es')['ElTreeV2'] ElUpload: typeof import('element-plus/es')['ElUpload'] ElWatermark: typeof import('element-plus/es')['ElWatermark'] diff --git a/src/api/user.ts b/src/api/user.ts index 1a355e7..85e55e9 100644 --- a/src/api/user.ts +++ b/src/api/user.ts @@ -87,6 +87,34 @@ export const AdminAddUserRequestService = (Data) => { } }) } + +export const AdminDeleteUserRequestService = (Data) => { + const params = new URLSearchParams(); + for (let key in Data) { + params.append(key, Data[key]) + } + let token = localStorage.getItem("token") || ""; + return request.post('/user/delete', params,{ + headers: { + 'token': token, + } + }) +} + + +export const UpdateUserCatalogueService = (Data) => { + const params = new URLSearchParams(); + for (let key in Data) { + params.append(key, Data[key]) + } + let token = localStorage.getItem("token") || ""; + return request.post('/user/catalogue', params,{ + headers: { + 'token': token, + } + }) +} + export const getFriendReqService = (Data) => { const params = new URLSearchParams(); for (let key in Data) { @@ -94,7 +122,7 @@ export const getFriendReqService = (Data) => { } return request.post('/im/get_friend_request', params, { headers: { - 'token': Data.token, // 闂佽绻愭蹇涘箯閿燂拷 token 闂備礁鎼ú锔锯偓绗涘啰鏆﹂柛娆忣槺閳绘棃鏌i幋鐏活亝绂嶉崼鏇熺厽闁靛ǹ鍎遍褔鏌熼煬鎻掆偓婵嬪箖瑜忔禒锔炬喆閿濆懍澹曢梺璺ㄥ櫐閹凤拷 + 'token': Data.token, } }) } @@ -106,12 +134,12 @@ export const GetUserInfoService = (Data) => { } return request.post('/user/info', params, { headers: { - 'token': Data.token, // 闂佽绻愭蹇涘箯閿燂拷 token 闂備礁鎼ú锔锯偓绗涘啰鏆﹂柛娆忣槺閳绘棃鏌i幋鐏活亝绂嶉崼鏇熺厽闁靛ǹ鍎遍褔鏌熼煬鎻掆偓婵嬪箖瑜忔禒锔炬喆閿濆懍澹曢梺璺ㄥ櫐閹凤拷 + 'token': Data.token, } }) } -//闂備礁鎲$敮鐐寸箾閳ь剚绻涢崨顓烆劉缂佽桨绮欓幐濠冨緞婵犲倸娈ら梻浣烘嚀閻°劑鎮ч悙鍝勭劦妞ゆ巻鍋撻柟铏姍瀹曟濮€閵忋垻锛滈梺璺ㄥ櫐閹凤拷 + export const DelFGService =(Data) =>{ const params = new URLSearchParams(); for (let key in Data) { @@ -119,7 +147,7 @@ export const DelFGService =(Data) =>{ } return request.post('/im/del_friend_or_group', params, { headers: { - 'token': Data.token, // 闂佽绻愭蹇涘箯閿燂拷 token 闂備礁鎼ú锔锯偓绗涘啰鏆﹂柛娆忣槺閳绘棃鏌i幋鐏活亝绂嶉崼鏇熺厽闁靛ǹ鍎遍褔鏌熼煬鎻掆偓婵嬪箖瑜忔禒锔炬喆閿濆懍澹曢梺璺ㄥ櫐閹凤拷 + 'token': Data.token, } }) } @@ -131,7 +159,7 @@ export const updateUserInfoService = (Data) => { } return request.post('/user/update', params, { headers: { - 'token': Data.token, // 闂佽绻愭蹇涘箯閿燂拷 token 闂備浇娉曢崰鎰板几婵犳艾绠柣鎴f缁犲弶銇勯顐㈠绩缂佲偓鐎n喗鐓欐い鏂挎惈婵℃寧绻涢崼鐔风仸缂佸倹甯℃俊鍫曞炊瑜滈弶娲⒑缁嬪簱搴烽柟鍑ゆ嫹 + 'token': Data.token, } }) } @@ -143,7 +171,7 @@ export const acceptInviteService =(Data)=> { } return request.post('/im/accept_invite', params, { headers: { - 'token': Data.token, // 闂佽绻愭蹇涘箯閿燂拷 token 闂備礁鎼ú锔锯偓绗涘啰鏆﹂柛娆忣槺閳绘棃鏌i幋鐏活亝绂嶉崼鏇熺厽闁靛ǹ鍎遍褔鏌熼煬鎻掆偓婵嬪箖瑜忔禒锔炬喆閿濆懍澹曢梺璺ㄥ櫐閹凤拷 + 'token': Data.token, } }) } @@ -154,7 +182,7 @@ export const rejectInviteService =(Data)=> { } return request.post('/im/reject_invite', params, { headers: { - 'token': Data.token, // 闂佽绻愭蹇涘箯閿燂拷 token 闂備礁鎼ú锔锯偓绗涘啰鏆﹂柛娆忣槺閳绘棃鏌i幋鐏活亝绂嶉崼鏇熺厽闁靛ǹ鍎遍褔鏌熼煬鎻掆偓婵嬪箖瑜忔禒锔炬喆閿濆懍澹曢梺璺ㄥ櫐閹凤拷 + 'token': Data.token, } }) } @@ -166,7 +194,7 @@ export const SearchUserService = (Data) => { } return request.post('/user/search', params,{ headers: { - 'token': Data.token, // 闂佽绻愭蹇涘箯閿燂拷 token 闂備礁鎼ú锔锯偓绗涘啰鏆﹂柛娆忣槺閳绘棃鏌i幋鐏活亝绂嶉崼鏇熺厽闁靛ǹ鍎遍褔鏌熼煬鎻掆偓婵嬪箖瑜忔禒锔炬喆閿濆懍澹曢梺璺ㄥ櫐閹凤拷 + 'token': Data.token, } }) } diff --git a/src/views/system/user.vue b/src/views/system/user.vue index 03974a4..865ff66 100644 --- a/src/views/system/user.vue +++ b/src/views/system/user.vue @@ -6,7 +6,7 @@ :delFunc="handleDelete" :changePage="changePage" :currentPage="page.index" :editFunc="handleEdit"> @@ -23,17 +23,65 @@ - +
- +

当前用户/用户组:{{ currentNode.name }}

+ + + +

用户组:

+ + + +
+ + 确 定 + +
+
+ + +
+ -
+ :height="400" + show-checkbox + default-expand-all + :expand-on-click-node="false" + > + + + + +
@@ -44,7 +92,7 @@ import { ElMessage } from 'element-plus'; import { CirclePlusFilled } from '@element-plus/icons-vue'; import { UserInfo } from '@/types/user'; import { fetchUserData } from '@/api'; -import { SearchUserService,AdminAddUserRequestService } from "@/api/user"; +import { SearchUserService,AdminAddUserRequestService,UpdateUserCatalogueService,AdminDeleteUserRequestService } from "@/api/user"; import {GetUserInfoService} from "@/api/user"; import {updateUserInfoService} from "@/api/user"; import TableCustom from '@/components/table-custom.vue'; @@ -52,7 +100,17 @@ import TableDetail from '@/components/table-detail.vue'; import TableSearch from '@/components/table-search.vue'; import { FormOption, FormOptionList } from '@/types/form-option'; import {getAllDefaultUsers} from '@/api/user'; +import { tr, vi } from 'element-plus/es/locale'; +import { group } from 'console'; +interface Tree { + id: number + label: string + children?: Tree[] +} +const opts_group = ref([]); +const currentNode = ref(null); +const currentPrev = ref(0); // 当前选中的父节点ID const treeData = ref([]); const treeProps = ref({ id: 'id', // 节点唯一标识字段(对应数据中的 id) @@ -64,6 +122,31 @@ const query = reactive({ name: '', }); +const showUserTreeVisibale = async () => { + await GetAllDefaultUsers(); + visible_system.value = true; +}; + + +const updateUserCatalogue = async (data) => { + try { + let req={ + user_id: data.id, + group_id: data.prev, + } + let result = await UpdateUserCatalogueService(req); + if (result["code"] === 0) { + ElMessage.success("调整成功"); + closeDialog(); + } else { + ElMessage.error("调整失败:"+result["message"]); + } + } catch (error) { + console.error('调整组织架构失败:', error); + } + GetAllDefaultUsers(); +}; + const GetAllDefaultUsers = async () => { try { const response = await getAllDefaultUsers(); @@ -72,12 +155,60 @@ const GetAllDefaultUsers = async () => { return; } buildTree(response['data']); + + opts_group.value = []; + + for (const item of response['data']) { + if (item.type === 1) { // 1为用户组 + opts_group.value.push({ label: item.name, value: item.id }); + } + } + opts_group.value.unshift({ label: '根目录', value: 0 }); } catch (error) { console.error('获取默认用户失败:', error); } }; -GetAllDefaultUsers(); +const visible_change_group = ref(false); +const handleNodeClick = (data) => { + currentPrev.value = data.id; + currentNode.value = data; + visible_change_group.value = true; +}; + +// GetAllDefaultUsers(); + +const append_user = (data) => { + currentPrev.value = data.id; + visible_add.value = true; +}; + +const append_group = (data) => { + currentPrev.value = data.id; + visible_add.value = true; +}; + +const remove = async (node, data) => { + await AdminDelUser(data); + await GetAllDefaultUsers(); + // if(data.prev === 0){ + // node.remove(); + // return; + // } + // const parent = node.parent; + // if (parent) { + // const index = parent.data.children.findIndex(item => item.id === data.id); + // if (index !== -1) { + // parent.data.children.splice(index, 1); + // } + // } else { + // // 如果没有父节点,说明是根节点,直接从 treeData 中删除 + // const index = treeData.value.findIndex(item => item.id === data.id); + // if (index !== -1) { + // treeData.value.splice(index, 1); + // } + // } +}; const buildTree = (data) => { // 1. 用 map 存储所有节点(key 为 id,value 为节点对象),方便快速查找父节点 @@ -193,7 +324,7 @@ const addData = async (data) => { let result ={} try{ let req={ - + prev: currentPrev.value, name: data.Name, email: data.Email, password: data.Password, @@ -209,7 +340,8 @@ const addData = async (data) => { }catch(e){ console.log(e); } - getData(); + getData(); + GetAllDefaultUsers(); }; const changePage = (val: number) => { @@ -364,10 +496,37 @@ const handleView =async (row: UserInfo) => { visible1.value = true; }; +const AdminDelUser =async (data) => { + console.log("删除用户:",data); + try{ + let req={ + id: data.id, + } + + let result = await AdminDeleteUserRequestService(req); + if (result["code"] === 0) { + ElMessage.success("删除成功"); + }else{ + ElMessage.error("删除失败:"+result["message"]); + } + }catch(e){ + console.log(e); + } +}; + // 删除相关 const handleDelete = (row: UserInfo) => { ElMessage.success('删除成功'); } - \ No newline at end of file + \ No newline at end of file