From 115769e9ad3ddc64e21ad7285450c4c563c745ed Mon Sep 17 00:00:00 2001 From: zhangwei <1504152376@qq.com> Date: 星期三, 20 八月 2025 17:20:29 +0800 Subject: [PATCH] 用户管理页面 --- src/views/system/role/index.vue | 2 src/views/system/user/utils/rule.ts | 7 src/views/login/index.vue | 6 src/views/system/user/form/index.vue | 129 ++------- src/store/modules/user.ts | 15 src/store/types.ts | 1 src/api/types.ts | 1 /dev/null | 78 ------ src/views/system/user/index.vue | 49 +-- src/views/system/user/utils/types.ts | 24 - src/api/system.ts | 101 ++------ src/utils/auth.ts | 20 + src/views/system/user/utils/hook.tsx | 247 +++++++++++++------- src/router/utils.ts | 6 14 files changed, 287 insertions(+), 399 deletions(-) diff --git a/src/api/system.ts b/src/api/system.ts index e29adeb..c5408dd 100644 --- a/src/api/system.ts +++ b/src/api/system.ts @@ -1,92 +1,41 @@ import { http } from "@/utils/http"; import { baseUrlApi } from "./util"; - -type Result = { - success: boolean; - data?: Array<any>; -}; - -type ResultTable = { - success: boolean; - data?: { - /** 鍒楄〃鏁版嵁 */ - list: Array<any>; - /** 鎬绘潯鐩暟 */ - total?: number; - /** 姣忛〉鏄剧ず鏉$洰涓暟 */ - pageSize?: number; - /** 褰撳墠椤垫暟 */ - currentPage?: number; - }; -}; +import type { Result } from "@/api/types"; /** 鑾峰彇璐︽埛鍒楄〃 */ export const getUserList = () => { - return http.request<ResultTable>( - "get", - baseUrlApi("/api/customer/custormerUsersList") - ); -}; - -/** 绯荤粺绠$悊-鐢ㄦ埛绠$悊-鑾峰彇鎵�鏈夎鑹插垪琛� */ -export const getAllRoleList = () => { return http.request<Result>( "get", baseUrlApi("/api/customer/custormerUsersList") ); }; -/** 绯荤粺绠$悊-鐢ㄦ埛绠$悊-鏍规嵁userId锛岃幏鍙栧搴旇鑹瞚d鍒楄〃锛坲serId锛氱敤鎴穒d锛� */ -export const getRoleIds = (data?: object) => { - return http.request<Result>("post", "/list-role-ids", { data }); +/**鏂板缓鍛樺伐鏁版嵁 */ +export const creatCustormerUsers = (data?: object) => { + return http.request<Result>( + "post", + baseUrlApi("/api/customer/creatCustormerUsers"), + { + data + } + ); }; -/** 鑾峰彇绯荤粺绠$悊-瑙掕壊绠$悊鍒楄〃 */ -export const getRoleList = (data?: object) => { - return http.request<ResultTable>("post", "/role", { data }); +/** 淇敼绠$悊鍛�*/ +export const changeManager = data => { + return http.request<Result>( + "get", + baseUrlApi(`/api/customer/changeManager/${data.custormerUserId}`) + ); }; -/** 鑾峰彇绯荤粺绠$悊-鑿滃崟绠$悊鍒楄〃 */ -export const getMenuList = (data?: object) => { - return http.request<Result>("post", "/menu", { data }); -}; - -/** 鑾峰彇绯荤粺绠$悊-閮ㄩ棬绠$悊鍒楄〃 */ -export const getDeptList = (data?: object) => { - return http.request<Result>("post", "/dept", { data }); -}; - -/** 鑾峰彇绯荤粺鐩戞帶-鍦ㄧ嚎鐢ㄦ埛鍒楄〃 */ -export const getOnlineLogsList = (data?: object) => { - return http.request<ResultTable>("post", "/online-logs", { data }); -}; - -/** 鑾峰彇绯荤粺鐩戞帶-鐧诲綍鏃ュ織鍒楄〃 */ -export const getLoginLogsList = (data?: object) => { - return http.request<ResultTable>("post", "/login-logs", { data }); -}; - -/** 鑾峰彇绯荤粺鐩戞帶-鎿嶄綔鏃ュ織鍒楄〃 */ -export const getOperationLogsList = (data?: object) => { - return http.request<ResultTable>("post", "/operation-logs", { data }); -}; - -/** 鑾峰彇绯荤粺鐩戞帶-绯荤粺鏃ュ織鍒楄〃 */ -export const getSystemLogsList = (data?: object) => { - return http.request<ResultTable>("post", "/system-logs", { data }); -}; - -/** 鑾峰彇绯荤粺鐩戞帶-绯荤粺鏃ュ織-鏍规嵁 id 鏌ユ棩蹇楄鎯� */ -export const getSystemLogsDetail = (data?: object) => { - return http.request<Result>("post", "/system-logs-detail", { data }); -}; - -/** 鑾峰彇瑙掕壊绠$悊-鏉冮檺-鑿滃崟鏉冮檺 */ -export const getRoleMenu = (data?: object) => { - return http.request<Result>("post", "/role-menu", { data }); -}; - -/** 鑾峰彇瑙掕壊绠$悊-鏉冮檺-鑿滃崟鏉冮檺-鏍规嵁瑙掕壊 id 鏌ュ搴旇彍鍗� */ -export const getRoleMenuIds = (data?: object) => { - return http.request<Result>("post", "/role-menu-ids", { data }); +/**鏇存敼鍛樺伐淇℃伅 */ +export const updataCustormerUsers = (data?: object) => { + return http.request<Result>( + "post", + baseUrlApi("/api/customer/updataCustormerUsers"), + { + data + } + ); }; diff --git a/src/api/types.ts b/src/api/types.ts index 7939579..ceb666f 100644 --- a/src/api/types.ts +++ b/src/api/types.ts @@ -85,6 +85,7 @@ refreshToken: string | null; exRoles: any | null; // exRoles涓簄ull锛屽叿浣撶被鍨嬪彲鏍规嵁瀹為檯涓氬姟鍦烘櫙缁嗗寲 code: string; + isManager: boolean; customerExs: CustomerEx[]; expires: string; roles: []; diff --git a/src/router/index.html b/src/router/index.html deleted file mode 100644 index c9843f1..0000000 --- a/src/router/index.html +++ /dev/null @@ -1,78 +0,0 @@ -<!DOCTYPE html> -<html lang="zh-CN"> -<head> - <meta charset="UTF-8" /> - <meta name="viewport" content="width=device-width, initial-scale=1.0" /> - <title>鏈嶅姟绔敓鎴愮鍚嶄笂浼犳枃浠跺埌OSS</title> -</head> -<body> -<div class="container"> - <form> - <div class="mb-3"> - <label for="file" class="form-label">閫夋嫨鏂囦欢:</label> - <input type="file" class="form-control" id="file" name="file" required /> - </div> - <button type="submit" class="btn btn-primary">涓婁紶</button> - </form> -</div> - -<script type="text/javascript"> -document.addEventListener('DOMContentLoaded', function () { - const form = document.querySelector("form"); - const fileInput = document.querySelector("#file"); - - form.addEventListener("submit", (event) => { - event.preventDefault(); - - const file = fileInput.files[0]; - - if (!file) { - alert('璇烽�夋嫨涓�涓枃浠跺啀涓婁紶銆�'); - return; - } - - const filename = file.name; - - fetch("http://192.168.18.52:5005/api/upFile/token", { method: "GET",headers: { - "Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjY5MDg3Njg4MTk3MzMxNywiVGVuYW50SWQiOjEzMDAwMDAwMDAwMDEsIkFjY291bnQiOiIxMzIxOTEyMjMyMCIsIlJlYWxOYW1lIjoi5byg5LiJIiwiVXNlclR5cGUiOiJDdXN0b21lciIsIkN1c3RvbWVyTG9nb2luVHlwZSI6IkRMSkciLCJpYXQiOjE3NTUxMzYwODcsIm5iZiI6MTc1NTEzNjA4NywiZXhwIjoxNzU1NzQwODg3LCJpc3MiOiJBZG1pbi5ORVQiLCJhdWQiOiJBZG1pbi5ORVQifQ.bnB_Tlq856XfOMhtVMI8QP1TTG7JqgnEFeXTdha3Sso" - } }) - .then((response) => { - if (!response.ok) { - throw new Error("鑾峰彇绛惧悕澶辫触"); - } - return response.json(); - }) - .then((data) => { - let formData = new FormData(); - formData.append("success_action_status", "200"); - formData.append("policy", data.policy); - formData.append("x-oss-signature", data.signature); - formData.append("x-oss-signature-version", "OSS4-HMAC-SHA256"); - formData.append("x-oss-credential", data.x_oss_credential); - formData.append("x-oss-date", data.x_oss_date); - formData.append("key", data.dir + file.name); // 鏂囦欢鍚� - formData.append("x-oss-security-token", data.security_token); - formData.append("file", file); // file 蹇呴』涓烘渶鍚庝竴涓〃鍗曞煙 - - return fetch(`https://feizhengcai.oss-cn-chengdu.aliyuncs.com/cylsg/20250814094826_8462.pdf`, { - method: "POST", - body: formData - }); - }) - .then((response) => { - if (response.ok) { - console.log("涓婁紶鎴愬姛"); - alert("鏂囦欢宸蹭笂浼�"); - } else { - console.log("涓婁紶澶辫触", response); - alert("涓婁紶澶辫触锛岃绋嶅悗鍐嶈瘯"); - } - }) - .catch((error) => { - console.error("鍙戠敓閿欒:", error); - }); - }); -}); -</script> -</body> -</html> \ No newline at end of file diff --git a/src/router/utils.ts b/src/router/utils.ts index b5e524f..8052c47 100644 --- a/src/router/utils.ts +++ b/src/router/utils.ts @@ -27,7 +27,9 @@ // https://cn.vitejs.dev/guide/features.html#glob-import const modulesRoutes = import.meta.glob("/src/views/**/*.{vue,tsx}"); const quanxianList = ["/item"]; +const managerList = ["/user"]; +const userInfo = storageLocal().getItem<DataInfo<number>>(userKey); // 鍔ㄦ�佽矾鐢� import { getAsyncRoutes } from "@/api/routes"; @@ -57,9 +59,11 @@ /** 杩囨护meta涓璼howLink涓篺alse鐨勮彍鍗� */ function filterTree(data: RouteComponent[]) { const hasFlsh = useUserStoreHook().nowRole.hasFlsh; + const isManager = useUserStoreHook().isManager; const newTree = cloneDeep(data).filter( - (v: { meta: { showLink: boolean } }) => { + (v: { path: string; meta: { showLink: boolean } }) => { quanxianList.includes(v.path) ? (v.meta.showLink = hasFlsh) : null; + managerList.includes(v.path) ? (v.meta.showLink = isManager) : null; return v.meta?.showLink !== false; } ); diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts index 8dc7ec3..0f59a5f 100644 --- a/src/store/modules/user.ts +++ b/src/store/modules/user.ts @@ -54,7 +54,9 @@ nowRole: storageLocal().getItem<nowRoleType>("nowRole") ?? {}, rolesList: storageLocal().getItem<RoleItem[]>("rolesList") ?? [], // 椤甸潰绾у埆鏉冮檺 - roles: storageLocal().getItem<DataInfo<number>>(userKey)?.roles ?? [] + roles: storageLocal().getItem<DataInfo<number>>(userKey)?.roles ?? [], + isManager: + storageLocal().getItem<DataInfo<number>>(userKey)?.isManager ?? false }), actions: { /** 瀛樺偍澶村儚 */ @@ -70,7 +72,7 @@ this.nickname = nickname; }, /** 瀛樺偍鐢ㄦ埛瑙掕壊 */ - SET_EXROLES(exRoles: Array<string>) { + SET_EXROLES(exRoles: RoleItem[]) { this.exRoles = exRoles; }, /** 瀛樺偍瑙掕壊 */ @@ -100,6 +102,9 @@ // 璁剧疆浼佷笟璧勬枡 SET_ENTERPRISEINFO(enterpriseInfo: CusExtendDto) { this.enterpriseInfo = enterpriseInfo; + }, + SET_ISMANAGER(isManager: boolean) { + this.isManager = isManager; }, /** 鐧诲叆 */ async loginByUsername(obj) { @@ -145,8 +150,10 @@ const data = this.rolesList.find(item => { return item.code == code; }); - setNowRole(data); - resolve(data); + if (data?.code) { + setNowRole(data); + resolve(data); + } }); }, /** 鍒囨崲瑙掕壊 */ diff --git a/src/store/types.ts b/src/store/types.ts index 8e89122..93124e4 100644 --- a/src/store/types.ts +++ b/src/store/types.ts @@ -54,4 +54,5 @@ enterpriseInfo: object; nowRole: nowRoleType; rolesList: RoleItem[]; + isManager: boolean; }; diff --git a/src/utils/auth.ts b/src/utils/auth.ts index 69ae036..b52149c 100644 --- a/src/utils/auth.ts +++ b/src/utils/auth.ts @@ -18,11 +18,12 @@ /** 鏄电О */ nickname?: string; /** 褰撳墠鐧诲綍鐢ㄦ埛鐨勮鑹插垪琛� */ - exRoles?: Array<string>; + exRoles?: RoleItem[]; /** 褰撳墠鐧诲綍鐢ㄦ埛鐨勮鑹� */ roles?: Array<string>; /** 褰撳墠鐧诲綍鐢ㄦ埛鐨勬寜閽骇鍒潈闄� */ permissions?: Array<string>; + isManager: boolean; } /** * AdminResult_CusExtendDto锛屽叏灞�杩斿洖缁撴灉 @@ -202,7 +203,8 @@ nickname, exRoles, permissions, - roles + roles, + isManager }) { useUserStoreHook().SET_AVATAR(avatar); useUserStoreHook().SET_USERNAME(username); @@ -210,6 +212,7 @@ useUserStoreHook().SET_EXROLES(exRoles); useUserStoreHook().SET_ROLES(roles); useUserStoreHook().SET_PERMS(permissions); + useUserStoreHook().SET_ISMANAGER(isManager); storageLocal().setItem(userKey, { refreshToken, expires, @@ -218,19 +221,21 @@ nickname, exRoles, roles, - permissions + permissions, + isManager }); } if (data.exRoles && data.roles) { - const { username, exRoles, roles } = data; + const { username, exRoles, roles, isManager } = data; setUserKey({ avatar: data?.avatar ?? "", username, nickname: data?.nickname ?? "", exRoles, roles, - permissions: data?.permissions ?? [] + permissions: data?.permissions ?? [], + isManager }); } else { const avatar = @@ -245,13 +250,16 @@ storageLocal().getItem<DataInfo<number>>(userKey)?.roles ?? []; const permissions = storageLocal().getItem<DataInfo<number>>(userKey)?.permissions ?? []; + const isManager = + storageLocal().getItem<DataInfo<number>>(userKey)?.isManager ?? false; setUserKey({ avatar, username, nickname, exRoles, roles, - permissions + permissions, + isManager }); } } diff --git a/src/views/login/index.vue b/src/views/login/index.vue index 6f87bd5..71214fe 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -195,11 +195,11 @@ ElRadio, { key: item.customerUserID, - value: item.customerUserID, - label: item.enterpriseName + value: item.customerUserID }, [ // 鍗曢�夋鏂囨湰 + item.enterpriseName, // 鏍规嵁褰撳墠椤圭殑isManager鏄剧ず鏍囩锛堟斁鍦ㄦ枃鏈悗闈級 item.isManger ? h( @@ -278,7 +278,7 @@ if (obj.theLastLogo) { router .replace({ - name: "Index" + path: "/Index" }) .then(() => { message("鐧诲綍鎴愬姛", { type: "success" }); diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue index ed7c3dd..40a7a61 100644 --- a/src/views/system/role/index.vue +++ b/src/views/system/role/index.vue @@ -114,7 +114,7 @@ class="w-[180px]!" /> </el-form-item> - <el-form-item label="鐘舵�侊細" prop="status"> + <el-form-item label="鏄惁鍚敤锛�" prop="status"> <el-select v-model="form.status" placeholder="璇烽�夋嫨鐘舵��" diff --git a/src/views/system/user/form/index.vue b/src/views/system/user/form/index.vue index f6834da..7742047 100644 --- a/src/views/system/user/form/index.vue +++ b/src/views/system/user/form/index.vue @@ -9,15 +9,18 @@ formInline: () => ({ title: "鏂板", higherDeptOptions: [], - parentId: 0, - nickname: "", - username: "", - password: "", - phone: "", - email: "", - sex: "", - status: 1, - remark: "" + id: null, // ID (integer($int64), 鍙┖) + cusExtendId: null, // 缁勭粐鏈烘瀯ID (integer($int64), 鍙┖) + name: null, // 濮撳悕 (string, 鍙┖) + nickname: null, // 鏄电О (string, 鍙┖) + phoneNumber: null, // 鐢佃瘽鍙风爜 (string, 鍙┖) + remarks: null, // 澶囨敞 (string, 鍙┖) + jobTitle: null, // 鑱屽姟 (string, 鍙┖) + avatar: null, // 澶村儚 (string, 鍙┖) + isEn: true, // 鏄惁鍚敤 (boolean, 涓嶅彲绌�) + passWord: null, // 瀵嗙爜 (string, 鍙┖) + isManager: false, // 鏄惁鏄鐞嗗憳 鍏ㄦ潈闄� (boolean, 涓嶅彲绌�) + signature: null // isEn:false,//鏄惁鍚敤 (string, 鍙┖) }) }); @@ -51,110 +54,48 @@ > <el-row :gutter="30"> <re-col :value="12" :xs="24" :sm="24"> - <el-form-item label="鐢ㄦ埛鏄电О" prop="nickname"> + <el-form-item label="濮撳悕" prop="name"> <el-input - v-model="newFormInline.nickname" + v-model="newFormInline.name" clearable - placeholder="璇疯緭鍏ョ敤鎴锋樀绉�" + placeholder="璇疯緭鍏ュ鍚�" /> </el-form-item> </re-col> <re-col :value="12" :xs="24" :sm="24"> - <el-form-item label="鐢ㄦ埛鍚嶇О" prop="username"> + <el-form-item label="鎵嬫満鍙�" prop="phoneNumber"> <el-input - v-model="newFormInline.username" - clearable - placeholder="璇疯緭鍏ョ敤鎴峰悕绉�" - /> - </el-form-item> - </re-col> - - <re-col - v-if="newFormInline.title === '鏂板'" - :value="12" - :xs="24" - :sm="24" - > - <el-form-item label="鐢ㄦ埛瀵嗙爜" prop="password"> - <el-input - v-model="newFormInline.password" - clearable - placeholder="璇疯緭鍏ョ敤鎴峰瘑鐮�" - /> - </el-form-item> - </re-col> - <re-col :value="12" :xs="24" :sm="24"> - <el-form-item label="鎵嬫満鍙�" prop="phone"> - <el-input - v-model="newFormInline.phone" + v-model="newFormInline.phoneNumber" clearable placeholder="璇疯緭鍏ユ墜鏈哄彿" /> </el-form-item> </re-col> - - <re-col :value="12" :xs="24" :sm="24"> - <el-form-item label="閭" prop="email"> - <el-input - v-model="newFormInline.email" - clearable - placeholder="璇疯緭鍏ラ偖绠�" - /> - </el-form-item> - </re-col> - <re-col :value="12" :xs="24" :sm="24"> - <el-form-item label="鐢ㄦ埛鎬у埆"> - <el-select - v-model="newFormInline.sex" - placeholder="璇烽�夋嫨鐢ㄦ埛鎬у埆" - class="w-full" - clearable - > - <el-option - v-for="(item, index) in sexOptions" - :key="index" - :label="item.label" - :value="item.value" - /> - </el-select> - </el-form-item> - </re-col> - - <re-col :value="12" :xs="24" :sm="24"> - <el-form-item label="褰掑睘閮ㄩ棬"> - <el-cascader - v-model="newFormInline.parentId" - class="w-full" - :options="newFormInline.higherDeptOptions" - :props="{ - value: 'id', - label: 'name', - emitPath: false, - checkStrictly: true - }" - clearable - filterable - placeholder="璇烽�夋嫨褰掑睘閮ㄩ棬" - > - <template #default="{ node, data }"> - <span>{{ data.name }}</span> - <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span> - </template> - </el-cascader> - </el-form-item> - </re-col> <re-col v-if="newFormInline.title === '鏂板'" :value="12" :xs="24" :sm="24" > - <el-form-item label="鐢ㄦ埛鐘舵��"> + <el-form-item label="鏄惁绠$悊鍛�"> <el-switch - v-model="newFormInline.status" + v-model="newFormInline.isManager" inline-prompt - :active-value="1" - :inactive-value="0" + :active-value="true" + :inactive-value="false" + active-text="鏄�" + inactive-text="鍚�" + :style="switchStyle" + /> + </el-form-item> + </re-col> + <re-col :value="12" :xs="24" :sm="24"> + <el-form-item label="鏄惁鍚敤"> + <el-switch + v-model="newFormInline.isEn" + inline-prompt + :active-value="true" + :inactive-value="false" active-text="鍚敤" inactive-text="鍋滅敤" :style="switchStyle" @@ -165,7 +106,7 @@ <re-col> <el-form-item label="澶囨敞"> <el-input - v-model="newFormInline.remark" + v-model="newFormInline.remarks" placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�" type="textarea" /> diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue index 29d5e4c..f10c08a 100644 --- a/src/views/system/user/index.vue +++ b/src/views/system/user/index.vue @@ -59,37 +59,37 @@ @tree-select="onTreeSelect" /> --> <div class="w-full mt-2"> - <el-form + <!-- <el-form ref="formRef" :inline="true" :model="form" class="search-form bg-bg_color w-full pl-8 pt-[12px] overflow-auto" > - <el-form-item label="鐢ㄦ埛鍚嶇О锛�" prop="username"> + <el-form-item label="濮撳悕锛�" prop="name"> <el-input - v-model="form.username" - placeholder="璇疯緭鍏ョ敤鎴峰悕绉�" + v-model="form.name" + placeholder="璇疯緭鍏ュ鍚�" clearable class="w-[180px]!" /> </el-form-item> - <el-form-item label="鎵嬫満鍙风爜锛�" prop="phone"> + <el-form-item label="鎵嬫満鍙风爜锛�" prop="phoneNumber"> <el-input - v-model="form.phone" + v-model="form.phoneNumber" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" clearable class="w-[180px]!" /> </el-form-item> - <el-form-item label="鐘舵�侊細" prop="status"> + <el-form-item label="鏄惁鍚敤" prop="isEN"> <el-select - v-model="form.status" - placeholder="璇烽�夋嫨" + v-model="form.isEN" + placeholder="璇烽�夋嫨鐘舵��" clearable class="w-[180px]!" > - <el-option label="宸插紑鍚�" value="1" /> - <el-option label="宸插叧闂�" value="0" /> + <el-option label="宸插紑鍚�" :value="true" /> + <el-option label="宸插叧闂�" :value="false" /> </el-select> </el-form-item> <el-form-item> @@ -105,17 +105,11 @@ 閲嶇疆 </el-button> </el-form-item> - </el-form> + </el-form> --> <PureTableBar title="" :columns="columns" @refresh="onSearch"> <template #buttons> - <el-button - type="primary" - :icon="useRenderIcon(AddFill)" - @click="openDialog()" - > - 鏂板鐢ㄦ埛 - </el-button> + <el-button type="primary" @click="openDialog()"> 鏂板鐢ㄦ埛 </el-button> </template> <template v-slot="{ size, dynamicColumns }"> <div @@ -148,7 +142,6 @@ adaptive :adaptiveConfig="{ offsetBottom: 108 }" align-whole="center" - table-layout="auto" :loading="loading" :size="size" :data="dataList" @@ -169,10 +162,8 @@ :size="size" :icon="useRenderIcon(EditPen)" @click="openDialog('淇敼', row)" - > - 淇敼 - </el-button> - <el-popconfirm + /> + <!-- <el-popconfirm :title="`鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�${row.id}鐨勮繖鏉℃暟鎹甡" @confirm="handleDelete(row)" > @@ -183,12 +174,10 @@ type="primary" :size="size" :icon="useRenderIcon(Delete)" - > - 鍒犻櫎 - </el-button> + /> </template> - </el-popconfirm> - <el-dropdown> + </el-popconfirm> --> + <!-- <el-dropdown> <el-button class="ml-3! mt-[2px]!" link @@ -237,7 +226,7 @@ </el-dropdown-item> </el-dropdown-menu> </template> - </el-dropdown> + </el-dropdown> --> </template> </pure-table> </template> diff --git a/src/views/system/user/utils/hook.tsx b/src/views/system/user/utils/hook.tsx index 1a1a03c..30ab3dd 100644 --- a/src/views/system/user/utils/hook.tsx +++ b/src/views/system/user/utils/hook.tsx @@ -21,6 +21,9 @@ getRoleIds, getDeptList, getUserList, + creatCustormerUsers, + changeManager, + updataCustormerUsers, getAllRoleList } from "@/api/system"; import { @@ -28,7 +31,9 @@ ElInput, ElFormItem, ElProgress, - ElMessageBox + ElMessageBox, + Elpopover, + ElText } from "element-plus"; import { type Ref, @@ -44,10 +49,9 @@ export function useUser(tableRef: Ref, treeRef: Ref) { const form = reactive({ // 宸︿晶閮ㄩ棬鏍戠殑id - deptId: "", - username: "", - phone: "", - status: "" + name: "", + phoneNumber: "", + isEn: true }); const formRef = ref(); const ruleFormRef = ref(); @@ -68,59 +72,64 @@ background: true }); const columns: TableColumnList = [ + // { + // label: "鍕鹃�夊垪", // 濡傛灉闇�瑕佽〃鏍煎閫夛紝姝ゅlabel蹇呴』璁剧疆 + // type: "selection", + // fixed: "left", + // reserveSelection: true // 鏁版嵁鍒锋柊鍚庝繚鐣欓�夐」 + // }, { - label: "鍕鹃�夊垪", // 濡傛灉闇�瑕佽〃鏍煎閫夛紝姝ゅlabel蹇呴』璁剧疆 - type: "selection", - fixed: "left", - reserveSelection: true // 鏁版嵁鍒锋柊鍚庝繚鐣欓�夐」 - }, - { - label: "鐢ㄦ埛缂栧彿", - prop: "id", - width: 90 - }, - { - label: "鐢ㄦ埛澶村儚", - prop: "avatar", - cellRenderer: ({ row }) => ( - <el-image - fit="cover" - preview-teleported={true} - src={row.avatar || userAvatar} - preview-src-list={Array.of(row.avatar || userAvatar)} - class="w-[24px] h-[24px] rounded-full align-middle" - /> - ), - width: 90 - }, - { - label: "鐢ㄦ埛鍚嶇О", + label: "濮撳悕", prop: "name", minWidth: 130 }, - { - label: "鐢ㄦ埛鏄电О", - prop: "nickname", - minWidth: 130 - }, + // { + // label: "鐢ㄦ埛澶村儚", + // prop: "avatar", + // cellRenderer: ({ row }) => ( + // <el-image + // fit="cover" + // preview-teleported={true} + // src={row.avatar || userAvatar} + // preview-src-list={Array.of(row.avatar || userAvatar)} + // class="w-[24px] h-[24px] rounded-full align-middle" + // /> + // ), + // width: 90 + // }, + + // { + // label: "鐢ㄦ埛鏄电О", + // prop: "nickname", + // minWidth: 130 + // }, { label: "瑙掕壊", prop: "isManager", minWidth: 90, - cellRenderer: ({ row, props }) => ( - <el-tag - size={props.size} - type={row.isManager ? "danger" : null} - effect="plain" - > - {row.isManager ? "绠$悊鍛�" : "鍛樺伐"} - </el-tag> + cellRenderer: scope => ( + <div> + {/* <el-tag + size={scope.props.size} + type={scope.row.isManager ? "danger" : null} + effect="plain" + > + {scope.row.isManager ? "绠$悊鍛�" : "鍛樺伐"} + </el-tag> */} + <el-switch + size={scope.props.size === "small" ? "small" : "default"} + loading={switchLoadMap.value[scope.index]?.loading} + v-model={scope.row.isManager} + active-value={true} + inactive-value={false} + active-text="绠$悊鍛�" + inactive-text="鍛樺伐" + inline-prompt + style={switchStyle.value} + onChange={() => onManagerChange(scope as any)} + /> + </div> ) - }, - { - label: "閮ㄩ棬", - prop: "dept.name", - minWidth: 90 }, { label: "鎵嬫満鍙风爜", @@ -130,35 +139,47 @@ hideTextAtIndex(phoneNumber, { start: 3, end: 6 }) }, { - label: "鐘舵��", - prop: "status", + label: "鏄惁鍚敤", + prop: "isEn", minWidth: 90, cellRenderer: scope => ( - <el-switch - size={scope.props.size === "small" ? "small" : "default"} - loading={switchLoadMap.value[scope.index]?.loading} - v-model={scope.row.status} - active-value={1} - inactive-value={0} - active-text="宸插惎鐢�" - inactive-text="宸插仠鐢�" - inline-prompt - style={switchStyle.value} - onChange={() => onChange(scope as any)} - /> + <el-tag + size={scope.props.size} + type={scope.row.isEn ? null : "danger"} + effect="plain" + > + {scope.row.isEn ? "鏄�" : "鍚�"} + </el-tag> + // <el-switch + // size={scope.props.size === "small" ? "small" : "default"} + // loading={switchLoadMap.value[scope.index]?.loading} + // v-model={scope.row.isEn} + // active-value={true} + // inactive-value={false} + // active-text="宸插惎鐢�" + // inactive-text="宸插仠鐢�" + // inline-prompt + // style={switchStyle.value} + // onChange={() => onChange(scope as any)} + // /> ) }, { label: "鍒涘缓鏃堕棿", - minWidth: 90, + width: 160, prop: "createTime", - formatter: ({ createTime }) => - dayjs(createTime).format("YYYY-MM-DD HH:mm:ss") + formatter: ({ createTime }) => dayjs(createTime).format("YYYY-MM-DD") + }, + { + label: "澶囨敞", + prop: "remarks", + width: 180, + cellRenderer: scope => <el-text truncated>{scope.row.remarks}</el-text> }, { label: "鎿嶄綔", fixed: "right", - width: 180, + width: 80, slot: "operation" } ]; @@ -227,6 +248,42 @@ row.status === 0 ? (row.status = 1) : (row.status = 0); }); } + function onManagerChange({ row, index }) { + ElMessageBox.confirm( + `纭瑕佽缃�<strong style='color:var(--el-color-primary)'>${ + row.name + }</strong>鐢ㄦ埛涓�<strong>${ + row.isManager === true ? "绠$悊鍛�" : "鍛樺伐" + }</strong>鍚�?`, + "鏇存敼鏉冮檺", + { + confirmButtonText: "纭畾", + cancelButtonText: "鍙栨秷", + type: "warning", + dangerouslyUseHTMLString: true, + draggable: true + } + ) + .then(() => { + changeManager({ custormerUserId: row.id }).then(res => { + if (res.code == 200) { + message("璁剧疆鎴愬姛锛�", { + type: "success" + }); + } else { + message(res.message || "璁剧疆澶辫触锛�", { + type: "error" + }); + } + onSearch(); + }); + }) + .catch(() => { + row.isManager === true + ? (row.isManager = false) + : (row.isManager = true); + }); + } function handleUpdate(row) { console.log(row); @@ -273,7 +330,7 @@ async function onSearch() { loading.value = true; - const { result } = await getUserList(toRaw(form)); + const { result } = await getUserList(); dataList.value = result; // pagination.total = data.total; // pagination.pageSize = data.pageSize; @@ -287,13 +344,11 @@ const resetForm = formEl => { if (!formEl) return; formEl.resetFields(); - form.deptId = ""; treeRef.value.onTreeReset(); onSearch(); }; function onTreeSelect({ id, selected }) { - form.deptId = selected ? id : ""; onSearch(); } @@ -316,15 +371,18 @@ formInline: { title, higherDeptOptions: formatHigherDeptOptions(higherDeptOptions.value), - parentId: row?.dept.id ?? 0, + id: row?.id ?? null, + cusExtendId: row?.cusExtendId ?? dataList.value[0].cusExtendId, + name: row?.name ?? "", nickname: row?.nickname ?? "", - username: row?.username ?? "", - password: row?.password ?? "", - phone: row?.phone ?? "", - email: row?.email ?? "", - sex: row?.sex ?? "", - status: row?.status ?? 1, - remark: row?.remark ?? "" + phoneNumber: row?.phoneNumber ?? "", + remarks: row?.remarks ?? "", + jobTitle: row?.jobTitle ?? "", + avatar: row?.avatar ?? "", + isEn: row?.isEn ?? true, + passWord: row?.passWord ?? "", + isManager: row?.isManager ?? false, + signature: row?.signature ?? "" } }, width: "46%", @@ -336,10 +394,22 @@ beforeSure: (done, { options }) => { const FormRef = formRef.value.getRef(); const curData = options.props.formInline as FormItemProps; - function chores() { - message(`鎮�${title}浜嗙敤鎴峰悕绉颁负${curData.username}鐨勮繖鏉℃暟鎹甡, { - type: "success" - }); + async function chores() { + let res; + if (title == "鏂板") { + res = await creatCustormerUsers(curData); + } else { + res = await updataCustormerUsers(curData); + } + if (res.code != "200") { + message(res.message, { + type: "error" + }); + } else { + message(`${title}鎴愬姛锛乣, { + type: "success" + }); + } done(); // 鍏抽棴寮规 onSearch(); // 鍒锋柊琛ㄦ牸鏁版嵁 } @@ -384,7 +454,7 @@ // }); // } - watch(); + // watch(); // pwdForm // ({ newPwd }) => // (curScore.value = isAllEmpty(newPwd) ? -1 : zxcvbn(newPwd).score) @@ -466,7 +536,6 @@ /** 鍒嗛厤瑙掕壊 */ async function handleRole(row) { // 閫変腑鐨勮鑹插垪琛� - const ids = (await getRoleIds({ userId: row.id })).data ?? []; addDialog({ title: `鍒嗛厤 ${row.username} 鐢ㄦ埛鐨勮鑹瞏, props: { @@ -497,13 +566,13 @@ onSearch(); // 褰掑睘閮ㄩ棬 - const { data } = await getDeptList(); - higherDeptOptions.value = handleTree(data); - treeData.value = handleTree(data); - treeLoading.value = false; + // const { data } = await getDeptList(); + // higherDeptOptions.value = handleTree(data); + // treeData.value = handleTree(data); + // treeLoading.value = false; // 瑙掕壊鍒楄〃 - roleOptions.value = (await getAllRoleList()).data; + // roleOptions.value = (await getAllRoleList()).data; }); return { diff --git a/src/views/system/user/utils/rule.ts b/src/views/system/user/utils/rule.ts index f946ee2..c14892b 100644 --- a/src/views/system/user/utils/rule.ts +++ b/src/views/system/user/utils/rule.ts @@ -4,10 +4,9 @@ /** 鑷畾涔夎〃鍗曡鍒欐牎楠� */ export const formRules = reactive(<FormRules>{ - nickname: [{ required: true, message: "鐢ㄦ埛鏄电О涓哄繀濉」", trigger: "blur" }], - username: [{ required: true, message: "鐢ㄦ埛鍚嶇О涓哄繀濉」", trigger: "blur" }], - password: [{ required: true, message: "鐢ㄦ埛瀵嗙爜涓哄繀濉」", trigger: "blur" }], - phone: [ + name: [{ required: true, message: "璇疯緭鍏ュ鍚�", trigger: "blur" }], + phoneNumber: [ + { required: true, message: "璇疯緭鍏ユ墜鏈哄彿", trigger: "blur" }, { validator: (rule, value, callback) => { if (value === "") { diff --git a/src/views/system/user/utils/types.ts b/src/views/system/user/utils/types.ts index c5ab88c..07322fd 100644 --- a/src/views/system/user/utils/types.ts +++ b/src/views/system/user/utils/types.ts @@ -3,19 +3,17 @@ /** 鐢ㄤ簬鍒ゆ柇鏄痐鏂板`杩樻槸`淇敼` */ title: string; higherDeptOptions: Record<string, unknown>[]; - parentId: number; - nickname: string; - username: string; - password: string; - phone: string | number; - email: string; - sex: string | number; - status: number; - dept?: { - id?: number; - name?: string; - }; - remark: string; + cusExtendId?: number; // 缁勭粐鏈烘瀯ID + name?: string; // 濮撳悕 + nickname?: string; // 鏄电О + phoneNumber?: string; // 鐢佃瘽鍙风爜 + remarks?: string; // 澶囨敞 + jobTitle?: string; // 鑱屽姟 + avatar?: string; // 澶村儚 + isEn: boolean; // 鏄惁鍚敤 + passWord?: string; // 瀵嗙爜 + isManager: boolean; // 鏄惁鏄鐞嗗憳 鍏ㄦ潈闄� + signature?: string; // 鍙┖ } interface FormProps { formInline: FormItemProps; -- Gitblit v1.9.1