소스 검색

feat:工具

pudongliang 4 달 전
부모
커밋
7d9a7b06dd
35개의 변경된 파일203개의 추가작업 그리고 21개의 파일을 삭제
  1. 1 1
      portal/dist/assets/accountGroup-JFZ42HYU.js
  2. 1 1
      portal/dist/assets/adAutoConf-D_ylIUAH.js
  3. 1 1
      portal/dist/assets/adPlanConf-BdqIvqWC.js
  4. 1 1
      portal/dist/assets/auth-R_tNEqX0.js
  5. 1 1
      portal/dist/assets/conversion-0rLECrbJ.js
  6. 0 0
      portal/dist/assets/detail-BNnk4bIA.js
  7. 1 1
      portal/dist/assets/drama-B7d7Gjhk.js
  8. 0 0
      portal/dist/assets/edit-DED6SZts.js
  9. 0 0
      portal/dist/assets/index-1ePv3sWU.js
  10. 0 0
      portal/dist/assets/index-5iqyiYFJ.css
  11. 0 0
      portal/dist/assets/index-AN5SfUqI.js
  12. 0 0
      portal/dist/assets/index-B1dQpxmP.js
  13. 0 0
      portal/dist/assets/index-B6n_7THI.js
  14. 0 1
      portal/dist/assets/index-BNB8Cido.js
  15. 0 0
      portal/dist/assets/index-Ba10IY1q.js
  16. 0 0
      portal/dist/assets/index-C4DzemwV.js
  17. 0 0
      portal/dist/assets/index-CAzQs8Kw.js
  18. 0 0
      portal/dist/assets/index-DDrpVZHf.js
  19. 0 0
      portal/dist/assets/index-DNyg9kgj.js
  20. 0 0
      portal/dist/assets/index-DPd1H-bF.js
  21. 0 0
      portal/dist/assets/index-D_vsBv-o.js
  22. 0 0
      portal/dist/assets/index-Da8TWetk.css
  23. 0 0
      portal/dist/assets/index-DjxdAxQG.js
  24. 0 0
      portal/dist/assets/index-LDueu17P.js
  25. 0 0
      portal/dist/assets/index-NdoyvNZr.js
  26. 0 0
      portal/dist/assets/index-OF-1UrNZ.js
  27. 1 1
      portal/dist/assets/loadPageConf-pJvEF9c7.js
  28. 1 1
      portal/dist/assets/ossFile-B4ymCTR2.js
  29. 0 0
      portal/dist/assets/request-BKkuewe8.js
  30. 1 1
      portal/dist/assets/user-CUoJe7SL.js
  31. 2 2
      portal/dist/index.html
  32. 9 0
      portal/src/api/user.js
  33. 7 1
      portal/src/router/index.js
  34. 136 0
      portal/src/views/tools/index.vue
  35. 40 8
      src/main/java/com/moka/gdtauto/controller/SysUserController.java

+ 1 - 1
portal/dist/assets/accountGroup-BLipnR02.js → portal/dist/assets/accountGroup-JFZ42HYU.js

@@ -1 +1 @@
-import{r as u}from"./request-5NUJpU2H.js";function c(t){return u({url:"/api/account-group/create",method:"post",data:t})}function e(t){return u({url:"/api/account-group/update",method:"post",data:t})}function n(t){return u({url:`/api/account-group/${t}`,method:"delete"})}function a(t=1,o=10){return u({url:"/api/account-group/list",method:"get",params:{pageNum:t,pageSize:o}})}function p(){return u({url:"/api/account-group/all",method:"get"})}function i(t){return u({url:`/api/account-group/${t}/accounts`,method:"get"})}export{i as a,p as b,c,n as d,a as g,e as u};
+import{r as u}from"./request-BKkuewe8.js";function c(t){return u({url:"/api/account-group/create",method:"post",data:t})}function e(t){return u({url:"/api/account-group/update",method:"post",data:t})}function n(t){return u({url:`/api/account-group/${t}`,method:"delete"})}function a(t=1,o=10){return u({url:"/api/account-group/list",method:"get",params:{pageNum:t,pageSize:o}})}function p(){return u({url:"/api/account-group/all",method:"get"})}function i(t){return u({url:`/api/account-group/${t}/accounts`,method:"get"})}export{i as a,p as b,c,n as d,a as g,e as u};

+ 1 - 1
portal/dist/assets/adAutoConf-GS3SuqL-.js → portal/dist/assets/adAutoConf-D_ylIUAH.js

@@ -1 +1 @@
-import{r as e}from"./request-5NUJpU2H.js";function u(t){return e({url:"/api/ad-auto-conf/list",method:"get",params:t})}function n(t){return e({url:`/api/ad-auto-conf/${t}`,method:"get"})}function a(t){return e({url:"/api/ad-auto-conf",method:"post",data:t})}function r(t){return e({url:"/api/ad-auto-conf/update",method:"post",data:t})}function i(t){return e({url:`/api/ad-auto-conf/execute?id=${t}`,method:"post"})}function d(t){return e({url:"/api/execute-log/list",method:"get",params:t})}function c(t){return e({url:"/api/execute-log/getChildLog",method:"get",params:t})}export{c as a,d as b,n as c,i as e,u as g,a as s,r as u};
+import{r as e}from"./request-BKkuewe8.js";function u(t){return e({url:"/api/ad-auto-conf/list",method:"get",params:t})}function n(t){return e({url:`/api/ad-auto-conf/${t}`,method:"get"})}function a(t){return e({url:"/api/ad-auto-conf",method:"post",data:t})}function r(t){return e({url:"/api/ad-auto-conf/update",method:"post",data:t})}function i(t){return e({url:`/api/ad-auto-conf/execute?id=${t}`,method:"post"})}function d(t){return e({url:"/api/execute-log/list",method:"get",params:t})}function c(t){return e({url:"/api/execute-log/getChildLog",method:"get",params:t})}export{c as a,d as b,n as c,i as e,u as g,a as s,r as u};

+ 1 - 1
portal/dist/assets/adPlanConf-A0oYrC-2.js → portal/dist/assets/adPlanConf-BdqIvqWC.js

@@ -1 +1 @@
-import{r as a}from"./request-5NUJpU2H.js";function d(n){return a({url:"/api/ad-plan-conf/reCreate",method:"post",data:n})}function o(n){return a({url:"/api/ad-plan-conf/generate-plan",method:"post",data:n})}function u(n){return a({url:`/api/ad-plan-conf/reGeneratePlan/${n}`,method:"get"})}function l(n){return a({url:`/api/ad-plan-conf/syncSystemStatus/${n}`,method:"get"})}function p(n){return a({url:"/api/ad-plan-conf/create",method:"post",data:n})}function s(n){return a({url:"/api/ad-plan-conf/update",method:"post",data:n})}function i(n=1,e=10,t={}){return a({url:"/api/ad-plan-conf/list",method:"get",params:{pageNum:n,pageSize:e,...t}})}function f(n){return a({url:`/api/ad-plan-conf/${n}`,method:"get"})}function c(n){return a({url:"/api/ad-plan/list",method:"get",params:n})}function g(n){return a({url:`/api/ad-plan-creative/plan/${n}`,method:"get"})}function m(n){return a({url:"/api/ad-plan-conf/gdtSuspendByConfId",params:{confId:n},method:"get"})}function h(n){return a({url:"/api/ad-plan-conf/gdtDeleteByConfId",params:{confId:n},method:"get"})}function C(n,e){return a({url:`/api/ad-plan-conf/gdtSuspendByPlanIds/${n}`,method:"post",data:e})}function P(n,e){return a({url:`/api/ad-plan-conf/gdtDeleteByPlanIds/${n}`,method:"post",data:e})}function y(n=[]){return a({url:"/api/ad-plan-conf/getOneCreativeImage",method:"post",data:n})}function I(){return a({url:"/api/ad-plan-conf/getOneBrandImage",method:"get"})}function B(n=[]){return a({url:"/api/ad-plan-conf/getOneCreativeVideo",method:"post",data:n})}export{y as a,I as b,B as c,o as d,p as e,f,i as g,c as h,h as i,C as j,P as k,l,u as m,g as n,d as r,m as s,s as u};
+import{r as a}from"./request-BKkuewe8.js";function d(n){return a({url:"/api/ad-plan-conf/reCreate",method:"post",data:n})}function o(n){return a({url:"/api/ad-plan-conf/generate-plan",method:"post",data:n})}function u(n){return a({url:`/api/ad-plan-conf/reGeneratePlan/${n}`,method:"get"})}function l(n){return a({url:`/api/ad-plan-conf/syncSystemStatus/${n}`,method:"get"})}function p(n){return a({url:"/api/ad-plan-conf/create",method:"post",data:n})}function s(n){return a({url:"/api/ad-plan-conf/update",method:"post",data:n})}function i(n=1,e=10,t={}){return a({url:"/api/ad-plan-conf/list",method:"get",params:{pageNum:n,pageSize:e,...t}})}function f(n){return a({url:`/api/ad-plan-conf/${n}`,method:"get"})}function c(n){return a({url:"/api/ad-plan/list",method:"get",params:n})}function g(n){return a({url:`/api/ad-plan-creative/plan/${n}`,method:"get"})}function m(n){return a({url:"/api/ad-plan-conf/gdtSuspendByConfId",params:{confId:n},method:"get"})}function h(n){return a({url:"/api/ad-plan-conf/gdtDeleteByConfId",params:{confId:n},method:"get"})}function C(n,e){return a({url:`/api/ad-plan-conf/gdtSuspendByPlanIds/${n}`,method:"post",data:e})}function P(n,e){return a({url:`/api/ad-plan-conf/gdtDeleteByPlanIds/${n}`,method:"post",data:e})}function y(n=[]){return a({url:"/api/ad-plan-conf/getOneCreativeImage",method:"post",data:n})}function I(){return a({url:"/api/ad-plan-conf/getOneBrandImage",method:"get"})}function B(n=[]){return a({url:"/api/ad-plan-conf/getOneCreativeVideo",method:"post",data:n})}export{y as a,I as b,B as c,o as d,p as e,f,i as g,c as h,h as i,C as j,P as k,l,u as m,g as n,d as r,m as s,s as u};

+ 1 - 1
portal/dist/assets/auth-Bptu5k7x.js → portal/dist/assets/auth-R_tNEqX0.js

@@ -1 +1 @@
-import{r as t}from"./request-5NUJpU2H.js";function i(){return t({url:"/api/gdt/auth/authorize-url",method:"get"})}function n(r){return t({url:"/api/gdt/auth/refresh",method:"post",params:r})}function u(){return t({url:"/api/gdt/auth/list",method:"get"})}function a(){return u()}function o(){return t({url:"/api/gdt/auth/expiring",method:"get"})}export{o as a,a as b,i as g,u as l,n as r};
+import{r as t}from"./request-BKkuewe8.js";function i(){return t({url:"/api/gdt/auth/authorize-url",method:"get"})}function n(r){return t({url:"/api/gdt/auth/refresh",method:"post",params:r})}function u(){return t({url:"/api/gdt/auth/list",method:"get"})}function a(){return u()}function o(){return t({url:"/api/gdt/auth/expiring",method:"get"})}export{o as a,a as b,i as g,u as l,n as r};

+ 1 - 1
portal/dist/assets/conversion-Na3oz1QG.js → portal/dist/assets/conversion-0rLECrbJ.js

@@ -1 +1 @@
-import{r as t}from"./request-5NUJpU2H.js";function e(n,o){return t({url:"/api/gdt/conversion/sync",method:"post",params:{orgAccountId:n,accountId:o}})}function s(n=1,o=20){return t({url:"/api/gdt/conversion/list",method:"get",params:{page:n,pageSize:o}})}function i(n){return t({url:"/api/gdt/conversion/detail",method:"get",params:{conversionId:n}})}function a(){return t({url:"/api/gdt/conversion/all",method:"get"})}export{s as a,i as b,a as g,e as s};
+import{r as t}from"./request-BKkuewe8.js";function e(n,o){return t({url:"/api/gdt/conversion/sync",method:"post",params:{orgAccountId:n,accountId:o}})}function s(n=1,o=20){return t({url:"/api/gdt/conversion/list",method:"get",params:{page:n,pageSize:o}})}function i(n){return t({url:"/api/gdt/conversion/detail",method:"get",params:{conversionId:n}})}function a(){return t({url:"/api/gdt/conversion/all",method:"get"})}export{s as a,i as b,a as g,e as s};

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
portal/dist/assets/detail-BNnk4bIA.js


+ 1 - 1
portal/dist/assets/drama-ZyAZKfsd.js → portal/dist/assets/drama-B7d7Gjhk.js

@@ -1 +1 @@
-import{r as t}from"./request-5NUJpU2H.js";function n(a){return t({url:"/api/gdt/asset/drama/sync",method:"post",params:{accountId:a}})}function m(a=1,s=20,r=""){return t({url:"/api/gdt/asset/drama/list",method:"get",params:{dramaName:r,page:a,pageSize:s}})}function d(a){return t({url:"/api/gdt/asset/drama/myDramaAssets",method:"get",params:{dramaName:a}})}function o(){return t({url:"/api/gdt/asset/drama/sync/conf/myConf",method:"get"})}function u(a){return t({url:"/api/gdt/asset/drama/sync/conf/add",method:"post",data:a})}function i(a){return t({url:"/api/gdt/asset/drama/sync/conf/delete",method:"post",params:{id:a}})}export{o as a,u as b,i as d,m as g,d as m,n as s};
+import{r as t}from"./request-BKkuewe8.js";function n(a){return t({url:"/api/gdt/asset/drama/sync",method:"post",params:{accountId:a}})}function m(a=1,s=20,r=""){return t({url:"/api/gdt/asset/drama/list",method:"get",params:{dramaName:r,page:a,pageSize:s}})}function d(a){return t({url:"/api/gdt/asset/drama/myDramaAssets",method:"get",params:{dramaName:a}})}function o(){return t({url:"/api/gdt/asset/drama/sync/conf/myConf",method:"get"})}function u(a){return t({url:"/api/gdt/asset/drama/sync/conf/add",method:"post",data:a})}function i(a){return t({url:"/api/gdt/asset/drama/sync/conf/delete",method:"post",params:{id:a}})}export{o as a,u as b,i as d,m as g,d as m,n as s};

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
portal/dist/assets/edit-DED6SZts.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
portal/dist/assets/index-1ePv3sWU.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
portal/dist/assets/index-5iqyiYFJ.css


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
portal/dist/assets/index-AN5SfUqI.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
portal/dist/assets/index-B1dQpxmP.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
portal/dist/assets/index-B6n_7THI.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 1
portal/dist/assets/index-BNB8Cido.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
portal/dist/assets/index-Ba10IY1q.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
portal/dist/assets/index-C4DzemwV.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
portal/dist/assets/index-CAzQs8Kw.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
portal/dist/assets/index-DDrpVZHf.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
portal/dist/assets/index-DNyg9kgj.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
portal/dist/assets/index-DPd1H-bF.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
portal/dist/assets/index-D_vsBv-o.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
portal/dist/assets/index-Da8TWetk.css


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
portal/dist/assets/index-DjxdAxQG.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
portal/dist/assets/index-LDueu17P.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
portal/dist/assets/index-NdoyvNZr.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
portal/dist/assets/index-OF-1UrNZ.js


+ 1 - 1
portal/dist/assets/loadPageConf-C--S4MdQ.js → portal/dist/assets/loadPageConf-pJvEF9c7.js

@@ -1 +1 @@
-import{r as o}from"./request-5NUJpU2H.js";function t(a){return o({url:"/api/load-page-conf/list",method:"get",params:a})}function n(a){return o({url:`/api/load-page-conf/${a}`,method:"get"})}function r(a){return o({url:"/api/load-page-conf",method:"post",data:a})}function u(a){return o({url:"/api/load-page-conf",method:"put",data:a})}function d(){return o({url:"/api/load-page-conf/all",method:"get"})}export{t as a,n as b,r as c,d as g,u};
+import{r as o}from"./request-BKkuewe8.js";function t(a){return o({url:"/api/load-page-conf/list",method:"get",params:a})}function n(a){return o({url:`/api/load-page-conf/${a}`,method:"get"})}function r(a){return o({url:"/api/load-page-conf",method:"post",data:a})}function u(a){return o({url:"/api/load-page-conf",method:"put",data:a})}function d(){return o({url:"/api/load-page-conf/all",method:"get"})}export{t as a,n as b,r as c,d as g,u};

+ 1 - 1
portal/dist/assets/ossFile-DgFqNsKA.js → portal/dist/assets/ossFile-B4ymCTR2.js

@@ -1 +1 @@
-import{r as t}from"./request-5NUJpU2H.js";function i(e){return t({timeout:12e5,url:"/api/oss-file/upload",method:"post",data:e,headers:{"Content-Type":"multipart/form-data"}})}function o(e){return t({url:"/api/oss-file/list",method:"get",params:e})}function r(e){return t({url:`/api/oss-file/${e}`,method:"delete"})}function l(e){return t({url:"/api/oss-file/batch",method:"delete",params:{fileIds:e}})}export{l as b,r as d,o as g,i as u};
+import{r as t}from"./request-BKkuewe8.js";function i(e){return t({timeout:12e5,url:"/api/oss-file/upload",method:"post",data:e,headers:{"Content-Type":"multipart/form-data"}})}function o(e){return t({url:"/api/oss-file/list",method:"get",params:e})}function r(e){return t({url:`/api/oss-file/${e}`,method:"delete"})}function l(e){return t({url:"/api/oss-file/batch",method:"delete",params:{fileIds:e}})}export{l as b,r as d,o as g,i as u};

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
portal/dist/assets/request-BKkuewe8.js


+ 1 - 1
portal/dist/assets/user-CqT7Wv7I.js → portal/dist/assets/user-CUoJe7SL.js

@@ -1 +1 @@
-import{r as e}from"./request-5NUJpU2H.js";function s(){return e({url:"/api/user/list",method:"get"})}function u(r){return e({url:"/api/user/info",method:"get",params:r})}function n(r){return e({url:"/api/user/user-token-url",method:"get",params:r})}function o(r){return e({url:"/api/user/login",method:"post",params:r})}function a(r){return e({url:"/api/user/change-password",method:"post",params:r})}export{u as a,s as b,a as c,n as g,o as l};
+import{r as e}from"./request-BKkuewe8.js";function t(){return e({url:"/api/user/list",method:"get"})}function u(r){return e({url:"/api/user/info",method:"get",params:r})}function n(r){return e({url:"/api/user/user-token-url",method:"get",params:r})}function o(r){return e({url:"/api/user/login",method:"post",params:r})}function a(r){return e({url:"/api/user/change-password",method:"post",params:r})}function i(r){return e({url:"/api/user/save",method:"post",params:r})}export{u as a,t as b,a as c,n as g,o as l,i as s};

+ 2 - 2
portal/dist/index.html

@@ -5,8 +5,8 @@
     <link rel="icon" type="image/svg+xml" href="/vite.svg" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <title>腾讯广告自动化管理后台</title>
-    <script type="module" crossorigin src="/assets/index-UHWlNWtX.js"></script>
-    <link rel="stylesheet" crossorigin href="/assets/index-Da8TWetk.css">
+    <script type="module" crossorigin src="/assets/index-BNB8Cido.js"></script>
+    <link rel="stylesheet" crossorigin href="/assets/index-5iqyiYFJ.css">
   </head>
   <body>
     <div id="app"></div>

+ 9 - 0
portal/src/api/user.js

@@ -74,3 +74,12 @@ export function changePassword(data) {
     params: data
   })
 }
+
+// 新增用户
+export function saveUser(params) {
+  return request({
+    url: '/api/user/save',
+    method: 'post',
+    params
+  })
+}

+ 7 - 1
portal/src/router/index.js

@@ -132,7 +132,13 @@ const routes = [
         name: 'LoadPageConf',
         component: () => import('@/views/load-page-conf/index.vue'),
         meta: { title: '落地页配置', icon: 'Document' }
-      }
+      },
+      {
+        path: 'mokamvpuseradd',
+        name: 'Tool',
+        component: () => import('@/views/tools/index.vue'),
+        meta: { title: '工具', icon: 'Document', hideInMenu: true }
+      },
     ]
   }
 ]

+ 136 - 0
portal/src/views/tools/index.vue

@@ -0,0 +1,136 @@
+<template>
+  <div class="space-y-6">
+    <div class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
+      <div class="border-b border-gray-200 pb-4 mb-6">
+        <div class="flex items-center justify-between">
+          <h2 class="text-xl font-semibold text-gray-800 flex items-center gap-2">
+            <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 text-blue-500" fill="none" viewBox="0 0 24 24" stroke="currentColor">
+              <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M18 9v3m0 0v3m0-3h3m-3 0h-3m-2-5a4 4 0 11-8 0 4 4 0 018 0zM3 20a6 6 0 0112 0v1H3v-1z" />
+            </svg>
+            新增用户
+          </h2>
+        </div>
+      </div>
+
+      <!-- 新增用户表单 -->
+      <div class="max-w-lg">
+        <el-form
+          ref="formRef"
+          :model="formData"
+          :rules="rules"
+          label-width="80px"
+          label-position="left"
+        >
+          <el-form-item label="用户名" prop="name">
+            <el-input
+              v-model="formData.name"
+              placeholder="请输入用户名"
+              clearable
+            />
+          </el-form-item>
+          <el-form-item label="工号" prop="jobNumber">
+            <el-input
+              v-model="formData.jobNumber"
+              placeholder="请输入工号"
+              clearable
+            />
+          </el-form-item>
+          <el-form-item label="手机号" prop="phone">
+            <el-input
+              v-model="formData.phone"
+              placeholder="请输入手机号"
+              clearable
+            />
+          </el-form-item>
+          <el-form-item>
+            <el-button
+              type="primary"
+              @click="handleSubmit"
+              :loading="submitting"
+            >
+              <el-icon><Check /></el-icon>
+              提交
+            </el-button>
+            <el-button @click="handleReset">
+              <el-icon><RefreshLeft /></el-icon>
+              重置
+            </el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+    </div>
+
+    </div>
+</template>
+
+<script setup>
+defineOptions({
+  name: 'Tools'
+})
+
+import { ref, reactive, computed, onMounted } from 'vue'
+import { ElMessage } from 'element-plus'
+import { Check, RefreshLeft, Refresh } from '@element-plus/icons-vue'
+import { saveUser } from '@/api/user'
+
+// 表单相关
+const formRef = ref(null)
+const submitting = ref(false)
+const formData = reactive({
+  name: '',
+  jobNumber: '',
+  phone: ''
+})
+
+// 表单校验规则
+const rules = {
+  name: [
+    { required: true, message: '请输入用户名', trigger: 'blur' }
+  ],
+  jobNumber: [
+    { required: true, message: '请输入工号', trigger: 'blur' }
+  ],
+  phone: [
+    { required: true, message: '请输入手机号', trigger: 'blur' },
+    { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' }
+  ]
+}
+
+
+// 提交表单
+const handleSubmit = async () => {
+  if (!formRef.value) return
+  
+  await formRef.value.validate(async (valid) => {
+    if (valid) {
+      submitting.value = true
+      try {
+        const response = await saveUser(formData)
+        if (response.success) {
+          ElMessage.success(response.message || '新增用户成功')
+          handleReset()
+          await loadUserList()
+        } else {
+          ElMessage.error(response.message || '新增用户失败')
+        }
+      } catch (error) {
+        console.error('新增用户失败:', error)
+        ElMessage.error('新增用户失败')
+      } finally {
+        submitting.value = false
+      }
+    }
+  })
+}
+
+// 重置表单
+const handleReset = () => {
+  if (formRef.value) {
+    formRef.value.resetFields()
+  }
+}
+
+</script>
+
+<style scoped>
+</style>

+ 40 - 8
src/main/java/com/moka/gdtauto/controller/SysUserController.java

@@ -1,25 +1,31 @@
 package com.moka.gdtauto.controller;
 
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.springaicommunity.mcp.annotation.McpTool;
+import org.springaicommunity.mcp.annotation.McpToolParam;
+import org.springframework.util.DigestUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.moka.gdtauto.annotation.AuthUser;
 import com.moka.gdtauto.common.Result;
 import com.moka.gdtauto.controller.vo.UserVo;
 import com.moka.gdtauto.entity.SysUser;
 import com.moka.gdtauto.service.SysUserService;
+
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 
-import org.springaicommunity.mcp.annotation.McpTool;
-import org.springaicommunity.mcp.annotation.McpToolParam;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 /**
  * 系统用户管理控制器
  * 
@@ -35,6 +41,32 @@ public class SysUserController {
 
     private final SysUserService sysUserService;
 
+    private static final String DEFAULT_PASSWORD = "123456";
+
+
+    @PostMapping("/save")
+    public Result<SysUser> saveUser(
+            @Parameter(description = "用户名", required = true, example = "张三")
+            @RequestParam String name,
+            @Parameter(description = "工号", required = true, example = "123456")
+            @RequestParam String jobNumber,
+            @Parameter(description = "手机号", required = true, example = "12345678901")
+            @RequestParam String phone
+        ) {
+            String pwd = DEFAULT_PASSWORD + "#" + jobNumber;
+            System.out.println(pwd);
+            String password = DigestUtils.md5DigestAsHex(pwd.getBytes());
+            SysUser sysUser = new SysUser();
+            sysUser.setPhone(phone);
+            sysUser.setJobNumber(jobNumber);
+            sysUser.setPassword(password);
+            sysUser.setStatus(1);
+            sysUser.setDefaultPwd(1);
+            sysUser.setName(name);
+            sysUserService.save(sysUser);
+            return Result.success(sysUser, "保存成功");
+    }
+
     /**
      * 用户登录
      * 

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.