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