Просмотр исходного кода

feat:实名认证提示优化,计划创建时间优化

pudongliang 4 месяцев назад
Родитель
Сommit
3369e2d98d
41 измененных файлов с 90 добавлено и 24 удалено
  1. 20 1
      .vscode/settings.json
  2. 1 1
      portal/dist/assets/accountGroup-Dg4y5ttA.js
  3. 1 1
      portal/dist/assets/adAutoConf-DhpT2CCS.js
  4. 1 1
      portal/dist/assets/adPlanConf-CCCj9SxD.js
  5. 1 1
      portal/dist/assets/auth-DJCII9MD.js
  6. 1 1
      portal/dist/assets/conversion-9ASQSamE.js
  7. 0 0
      portal/dist/assets/detail-BkheAc2F.js
  8. 1 1
      portal/dist/assets/drama-CKQmagZT.js
  9. 0 0
      portal/dist/assets/edit-rpXZNB2K.js
  10. 1 1
      portal/dist/assets/index--RH4QWqz.js
  11. 0 0
      portal/dist/assets/index-4EN3Hg4h.js
  12. 0 0
      portal/dist/assets/index-6ckXHVSo.js
  13. 0 0
      portal/dist/assets/index-CSHKNhmy.js
  14. 0 0
      portal/dist/assets/index-C_MMZpyd.js
  15. 0 0
      portal/dist/assets/index-Cdsgubcg.js
  16. 0 0
      portal/dist/assets/index-Cf8QgW4o.js
  17. 0 0
      portal/dist/assets/index-CsiPxvig.js
  18. 0 0
      portal/dist/assets/index-CuelbChd.js
  19. 0 0
      portal/dist/assets/index-DSC2XZN5.js
  20. 0 0
      portal/dist/assets/index-DvIDowQM.js
  21. 0 0
      portal/dist/assets/index-IKjf_osf.js
  22. 0 0
      portal/dist/assets/index-KJ94LpDh.js
  23. 0 0
      portal/dist/assets/index-Z0kWTO2f.js
  24. 0 0
      portal/dist/assets/index-mcUYb6GK.js
  25. 0 0
      portal/dist/assets/index-n9VD4VNc.js
  26. 0 0
      portal/dist/assets/index-vp43tsCR.js
  27. 1 1
      portal/dist/assets/loadPageConf-qVZhGbGI.js
  28. 1 1
      portal/dist/assets/ossFile-CVlgTKj2.js
  29. 0 0
      portal/dist/assets/request-BUHrxqkC.js
  30. 1 1
      portal/dist/assets/user-Bybf7LnX.js
  31. 1 1
      portal/dist/index.html
  32. 4 3
      portal/package-lock.json
  33. 2 1
      portal/package.json
  34. 18 4
      portal/src/router/index.js
  35. 5 1
      portal/src/views/login/index.vue
  36. 12 0
      portal/src/views/profile/index.vue
  37. 2 1
      src/main/java/com/moka/gdtauto/config/WebMvcConfig.java
  38. 2 0
      src/main/java/com/moka/gdtauto/service/impl/AdPlanConfServiceImpl.java
  39. 3 1
      src/main/java/com/moka/gdtauto/service/impl/AdPlanServiceImpl.java
  40. 4 1
      src/main/resources/application-pro.yml
  41. 7 0
      src/test/java/com/moka/gdtauto/util/SampleTest.java

+ 20 - 1
.vscode/settings.json

@@ -1,5 +1,24 @@
 {
     "java.configuration.updateBuildConfiguration": "automatic",
     "java.compile.nullAnalysis.mode": "automatic",
-    "cSpell.enabled": false
+    "cSpell.enabled": false,
+    // 搜索时排除的文件夹
+    "search.exclude": {
+        "**/target": true,
+        "**/node_modules": true,
+        "**/dist": true,
+        "**/.git": true,
+        "**/.idea": true,
+        "**/.vscode": true,
+        "**/.qoder": true,
+        "**/.cursor": true,
+        "**/.codex": true,
+        "**/logs": true
+    },
+    // 文件浏览时排除的文件夹
+    "files.exclude": {
+        "**/target": true,
+        "**/node_modules": true,
+        "**/dist": true
+    }
 }

+ 1 - 1
portal/dist/assets/accountGroup-CIc_28_6.js → portal/dist/assets/accountGroup-Dg4y5ttA.js

@@ -1 +1 @@
-import{r as u}from"./request-Bzgc6No_.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-BUHrxqkC.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-i84Oyuvo.js → portal/dist/assets/adAutoConf-DhpT2CCS.js

@@ -1 +1 @@
-import{r as e}from"./request-Bzgc6No_.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/execute?id=${t}`,method:"post"})}function i(t){return e({url:"/api/execute-log/list",method:"get",params:t})}function d(t){return e({url:"/api/execute-log/getChildLog",method:"get",params:t})}export{d as a,i as b,n as c,r as e,u as g,a as s};
+import{r as e}from"./request-BUHrxqkC.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/execute?id=${t}`,method:"post"})}function i(t){return e({url:"/api/execute-log/list",method:"get",params:t})}function d(t){return e({url:"/api/execute-log/getChildLog",method:"get",params:t})}export{d as a,i as b,n as c,r as e,u as g,a as s};

+ 1 - 1
portal/dist/assets/adPlanConf-B6YC8P7P.js → portal/dist/assets/adPlanConf-CCCj9SxD.js

@@ -1 +1 @@
-import{r as a}from"./request-Bzgc6No_.js";function r(n){return a({url:"/api/ad-plan-conf/reCreate",method:"post",data:n})}function d(n){return a({url:"/api/ad-plan-conf/generate-plan",method:"post",data:n})}function o(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 u(n){return a({url:"/api/ad-plan-conf/create",method:"post",data:n})}function p(n){return a({url:"/api/ad-plan-conf/update",method:"post",data:n})}function s(n=1,t=10){return a({url:"/api/ad-plan-conf/list",method:"get",params:{pageNum:n,pageSize:t}})}function f(n){return a({url:`/api/ad-plan-conf/${n}`,method:"get"})}function i(n){return a({url:"/api/ad-plan/list",method:"get",params:n})}function c(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 g(n){return a({url:"/api/ad-plan-conf/gdtDeleteByConfId",params:{confId:n},method:"get"})}function h(n,t){return a({url:`/api/ad-plan-conf/gdtSuspendByPlanIds/${n}`,method:"post",data:t})}function P(n,t){return a({url:`/api/ad-plan-conf/gdtDeleteByPlanIds/${n}`,method:"post",data:t})}export{d as a,f as b,u as c,i as d,g as e,h as f,s as g,P as h,l as i,o as j,c as k,r,m as s,p as u};
+import{r as a}from"./request-BUHrxqkC.js";function r(n){return a({url:"/api/ad-plan-conf/reCreate",method:"post",data:n})}function d(n){return a({url:"/api/ad-plan-conf/generate-plan",method:"post",data:n})}function o(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 u(n){return a({url:"/api/ad-plan-conf/create",method:"post",data:n})}function p(n){return a({url:"/api/ad-plan-conf/update",method:"post",data:n})}function s(n=1,t=10){return a({url:"/api/ad-plan-conf/list",method:"get",params:{pageNum:n,pageSize:t}})}function f(n){return a({url:`/api/ad-plan-conf/${n}`,method:"get"})}function i(n){return a({url:"/api/ad-plan/list",method:"get",params:n})}function c(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 g(n){return a({url:"/api/ad-plan-conf/gdtDeleteByConfId",params:{confId:n},method:"get"})}function h(n,t){return a({url:`/api/ad-plan-conf/gdtSuspendByPlanIds/${n}`,method:"post",data:t})}function P(n,t){return a({url:`/api/ad-plan-conf/gdtDeleteByPlanIds/${n}`,method:"post",data:t})}export{d as a,f as b,u as c,i as d,g as e,h as f,s as g,P as h,l as i,o as j,c as k,r,m as s,p as u};

+ 1 - 1
portal/dist/assets/auth-Ca4P_5tW.js → portal/dist/assets/auth-DJCII9MD.js

@@ -1 +1 @@
-import{r as t}from"./request-Bzgc6No_.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-BUHrxqkC.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-iMsROi_Y.js → portal/dist/assets/conversion-9ASQSamE.js

@@ -1 +1 @@
-import{r as t}from"./request-Bzgc6No_.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-BUHrxqkC.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-BkheAc2F.js


+ 1 - 1
portal/dist/assets/drama-B3_hnp6Z.js → portal/dist/assets/drama-CKQmagZT.js

@@ -1 +1 @@
-import{r as t}from"./request-Bzgc6No_.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-BUHrxqkC.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-rpXZNB2K.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
portal/dist/assets/index--RH4QWqz.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-4EN3Hg4h.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-6ckXHVSo.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-CSHKNhmy.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-C_MMZpyd.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-Cdsgubcg.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-Cf8QgW4o.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-CsiPxvig.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-CuelbChd.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-DSC2XZN5.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-DvIDowQM.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-IKjf_osf.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-KJ94LpDh.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-Z0kWTO2f.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-mcUYb6GK.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-n9VD4VNc.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
portal/dist/assets/index-vp43tsCR.js


+ 1 - 1
portal/dist/assets/loadPageConf-DfC1RoK1.js → portal/dist/assets/loadPageConf-qVZhGbGI.js

@@ -1 +1 @@
-import{r as o}from"./request-Bzgc6No_.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-BUHrxqkC.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-Bmoq_1dU.js → portal/dist/assets/ossFile-CVlgTKj2.js

@@ -1 +1 @@
-import{r as t}from"./request-Bzgc6No_.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-BUHrxqkC.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-BUHrxqkC.js


+ 1 - 1
portal/dist/assets/user-Cp3LOilH.js → portal/dist/assets/user-Bybf7LnX.js

@@ -1 +1 @@
-import{r as e}from"./request-Bzgc6No_.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-BUHrxqkC.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};

+ 1 - 1
portal/dist/index.html

@@ -5,7 +5,7 @@
     <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-lknx8aJB.js"></script>
+    <script type="module" crossorigin src="/assets/index--RH4QWqz.js"></script>
     <link rel="stylesheet" crossorigin href="/assets/index-Cb0Z9rAk.css">
   </head>
   <body>

+ 4 - 3
portal/package-lock.json

@@ -10,6 +10,7 @@
       "dependencies": {
         "@element-plus/icons-vue": "^2.3.1",
         "axios": "^1.7.0",
+        "dayjs": "^1.11.20",
         "element-plus": "^2.8.0",
         "vue": "^3.5.0",
         "vue-router": "^4.3.0"
@@ -2038,9 +2039,9 @@
       "license": "MIT"
     },
     "node_modules/dayjs": {
-      "version": "1.11.19",
-      "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.19.tgz",
-      "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==",
+      "version": "1.11.20",
+      "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.20.tgz",
+      "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==",
       "license": "MIT"
     },
     "node_modules/delayed-stream": {

+ 2 - 1
portal/package.json

@@ -5,12 +5,13 @@
   "type": "module",
   "scripts": {
     "dev": "vite",
-    "build": "vite build --mode production", 
+    "build": "vite build --mode production",
     "preview": "vite preview"
   },
   "dependencies": {
     "@element-plus/icons-vue": "^2.3.1",
     "axios": "^1.7.0",
+    "dayjs": "^1.11.20",
     "element-plus": "^2.8.0",
     "vue": "^3.5.0",
     "vue-router": "^4.3.0"

+ 18 - 4
portal/src/router/index.js

@@ -1,5 +1,7 @@
 import { createRouter, createWebHistory } from 'vue-router'
 import Layout from '@/layout/index.vue'
+import dayjs from 'dayjs'
+
 
 const routes = [
   {
@@ -139,12 +141,12 @@ const router = createRouter({
 
 // 路由守卫:检查登录状态
 router.beforeEach((to, from, next) => {
-  const userInfo = localStorage.getItem('userInfo')
+  const storeUserInfo = localStorage.getItem('userInfo')
   
   // 如果是登录页面,直接放行
   if (to.path === '/login') {
     // 如果已登录,重定向到首页
-    if (userInfo) {
+    if (storeUserInfo) {
       next('/')
     } else {
       next()
@@ -153,10 +155,22 @@ router.beforeEach((to, from, next) => {
   }
   
   // 其他页面需要检查登录状态
-  if (!userInfo) {
+  if (!storeUserInfo) {
     next('/login')
   } else {
-    next()
+    const userInfo = JSON.parse(storeUserInfo)
+    console.log('userInfo:', userInfo)
+    if (userInfo.userTokenExpiresAt && dayjs(userInfo.userTokenExpiresAt).isBefore(dayjs())) {
+      // 第三方平台实名认证已过期,强制跳转个人中心重新认证
+      // 若目标已是 /profile,直接放行,避免无限重定向
+      if (to.path === '/profile') {
+        next()
+      } else {
+        next('/profile')
+      }
+    } else {
+      next()
+    }
   }
 })
 

+ 5 - 1
portal/src/views/login/index.vue

@@ -116,7 +116,11 @@ const handleLogin = async () => {
         ElMessage.success(res.message || '登录成功')
 
         // 登录成功后直接跳转到个人中心
-        router.push('/dashboard')
+        if (isAuthenticated) {
+          router.push('/dashboard')
+        } else {
+          router.push('/profile')
+        }
       } else {
         ElMessage.error(res.message || '登录失败')
       }

+ 12 - 0
portal/src/views/profile/index.vue

@@ -24,6 +24,14 @@
           >
             立即认证
           </el-button>
+          <el-button
+            type="primary"
+            size="small"
+            :loading="authLoading"
+            @click="handleHadAuth"
+          >
+            已实名认证
+          </el-button>
         </div>
       </el-alert>
 
@@ -330,6 +338,10 @@ const handleAuth = async () => {
   }
 }
 
+const handleHadAuth = () => {
+  refreshUserInfo()
+}
+
 // 修改密码相关
 const passwordForm = reactive({
   oldPassword: '',

+ 2 - 1
src/main/java/com/moka/gdtauto/config/WebMvcConfig.java

@@ -34,7 +34,8 @@ public class WebMvcConfig implements WebMvcConfigurer {
         "/health",
         "/doc.html",
         "/swagger-ui/**",
-        "/v3/api-docs/**"
+        "/v3/api-docs/**",
+        "/mcp/**"
     };
     /**
      * 添加拦截器

+ 2 - 0
src/main/java/com/moka/gdtauto/service/impl/AdPlanConfServiceImpl.java

@@ -582,6 +582,7 @@ public class AdPlanConfServiceImpl extends ServiceImpl<AdPlanConfMapper, AdPlanC
                 // 更新状态为成功
                 plan.setStatus(AdPlanStatus.SUCCESS);
                 plan.setFailReason("");
+                plan.setCreateTime(LocalDateTime.now());
                 plan.setSuccessTime(LocalDateTime.now());
                 adPlanService.updateById(plan);
 
@@ -843,6 +844,7 @@ public class AdPlanConfServiceImpl extends ServiceImpl<AdPlanConfMapper, AdPlanC
                 creative.setCreativeId(response.getDynamicCreativeId());
                 creative.setStatus(AdPlanStatus.SUCCESS);
                 creative.setFailReason("");
+                creative.setCreateTime(LocalDateTime.now());
                 creative.setSuccessTime(LocalDateTime.now());
                 adPlanCreativeService.updateById(creative);
 

+ 3 - 1
src/main/java/com/moka/gdtauto/service/impl/AdPlanServiceImpl.java

@@ -199,7 +199,7 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
      */
     private int syncBatch(Long accountId, List<AdPlan> batch) throws Exception {
         final int BATCH_LIMIT = 100; // 腾讯广告 adgroup_id IN 最大 100
-        final List<String> FIELDS = List.of("adgroup_id", "configured_status", "system_status", "is_deleted");
+        final List<String> FIELDS = List.of("adgroup_id", "created_time", "configured_status", "system_status", "is_deleted");
 
         // 构建 adgroup_id IN [...] 过滤条件
         List<String> adgroupIdValues = batch.stream()
@@ -237,6 +237,8 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
         List<AdPlan> toUpdate = new ArrayList<>();
         response.getList().stream().forEach(item -> {
             AdPlan update = new AdPlan();
+            // item.getCreatedTime() 秒
+            update.setCreateTime(LocalDateTime.ofEpochSecond(item.getCreatedTime(), 0, java.time.ZoneOffset.UTC));
             update.setAdgroupId(item.getAdgroupId());
             update.setConfiguredStatus(item.getConfiguredStatus().getValue());
             update.setSystemStatus(item.getSystemStatus().getValue());

+ 4 - 1
src/main/resources/application-pro.yml

@@ -19,7 +19,10 @@ spring:
           username: gdt_auto
           password: QA_GDT_AUTO%$PDL
   
-
+  ai:
+    mcp:
+      server:
+        enabled: false
   # Redis配置
   data:
     redis:

+ 7 - 0
src/test/java/com/moka/gdtauto/util/SampleTest.java

@@ -2,6 +2,7 @@ package com.moka.gdtauto.util;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -65,5 +66,11 @@ public class SampleTest {
 
         System.out.println(JSON.toJSONString(allRules, true));
     }
+
+    @Test
+    public void testRuleSort2() {
+        LocalDateTime dateTime = LocalDateTime.ofEpochSecond(1702382479, 0, java.time.ZoneOffset.UTC);
+        System.out.println(dateTime);
+    }
     
 }

Некоторые файлы не были показаны из-за большого количества измененных файлов