Sfoglia il codice sorgente

删除多余内容

yanghao 3 settimane fa
parent
commit
bf830e0dfa
78 ha cambiato i file con 365 aggiunte e 362 eliminazioni
  1. 1 1
      .env
  2. 4 1
      .env.dev
  3. 4 1
      .env.prod
  4. 5 9
      index.html
  5. 1 0
      package.json
  6. 15 19
      pnpm-lock.yaml
  7. BIN
      public/favicon.ico
  8. BIN
      public/logo.gif
  9. 4 0
      src/api/login/index.ts
  10. BIN
      src/assets/imgs/logo.png
  11. BIN
      src/assets/imgs/yf.png
  12. 105 11
      src/views/Login/Login.vue
  13. 4 4
      src/views/Login/SocialLogin.vue
  14. 19 20
      src/views/Login/components/ForgetPasswordForm.vue
  15. 58 85
      src/views/Login/components/LoginForm.vue
  16. 10 10
      src/views/Login/components/MobileForm.vue
  17. 88 11
      src/views/Login/components/QrCodeForm.vue
  18. 21 29
      src/views/Login/components/RegisterForm.vue
  19. 4 4
      src/views/Login/components/SSOLogin.vue
  20. 0 2
      src/views/bpm/category/index.vue
  21. 0 2
      src/views/bpm/form/index.vue
  22. 0 2
      src/views/bpm/group/index.vue
  23. 0 2
      src/views/bpm/model/definition/index.vue
  24. 0 2
      src/views/bpm/oa/leave/index.vue
  25. 0 2
      src/views/bpm/processExpression/index.vue
  26. 0 2
      src/views/bpm/processInstance/index.vue
  27. 0 2
      src/views/bpm/processInstance/manager/index.vue
  28. 0 2
      src/views/bpm/processInstance/report/index.vue
  29. 0 2
      src/views/bpm/processListener/index.vue
  30. 0 5
      src/views/bpm/task/copy/index.vue
  31. 0 8
      src/views/bpm/task/done/index.vue
  32. 6 3
      src/views/bpm/task/manager/index.vue
  33. 0 8
      src/views/bpm/task/todo/index.vue
  34. 0 2
      src/views/infra/apiAccessLog/index.vue
  35. 0 2
      src/views/infra/apiErrorLog/index.vue
  36. 0 5
      src/views/infra/codegen/index.vue
  37. 0 2
      src/views/infra/config/index.vue
  38. 0 2
      src/views/infra/demo/demo02/index.vue
  39. 0 3
      src/views/infra/druid/index.vue
  40. 0 1
      src/views/infra/file/index.vue
  41. 0 2
      src/views/infra/fileConfig/index.vue
  42. 0 4
      src/views/infra/job/index.vue
  43. 0 4
      src/views/infra/job/logger/index.vue
  44. 0 3
      src/views/infra/redis/index.vue
  45. 0 2
      src/views/infra/server/index.vue
  46. 0 2
      src/views/infra/skywalking/index.vue
  47. 0 2
      src/views/infra/swagger/index.vue
  48. 0 2
      src/views/infra/webSocket/index.vue
  49. 0 2
      src/views/mp/account/index.vue
  50. 0 2
      src/views/mp/autoReply/index.vue
  51. 0 2
      src/views/mp/draft/index.vue
  52. 0 2
      src/views/mp/freePublish/index.vue
  53. 0 1
      src/views/mp/material/index.vue
  54. 0 1
      src/views/mp/menu/index.vue
  55. 0 2
      src/views/mp/messageTemplate/index.vue
  56. 0 2
      src/views/mp/tag/index.vue
  57. 16 15
      src/views/mp/user/index.vue
  58. 0 2
      src/views/system/area/index.vue
  59. 0 2
      src/views/system/loginlog/index.vue
  60. 0 2
      src/views/system/mail/account/index.vue
  61. 0 2
      src/views/system/mail/log/index.vue
  62. 0 2
      src/views/system/mail/template/index.vue
  63. 0 3
      src/views/system/menu/index.vue
  64. 0 2
      src/views/system/notify/message/index.vue
  65. 0 2
      src/views/system/notify/my/index.vue
  66. 0 2
      src/views/system/notify/template/index.vue
  67. 0 2
      src/views/system/oauth2/client/index.vue
  68. 0 2
      src/views/system/oauth2/token/index.vue
  69. 0 2
      src/views/system/operatelog/index.vue
  70. 0 3
      src/views/system/role/index.vue
  71. 0 2
      src/views/system/sms/channel/index.vue
  72. 0 2
      src/views/system/sms/log/index.vue
  73. 0 2
      src/views/system/sms/template/index.vue
  74. 0 2
      src/views/system/social/client/index.vue
  75. 0 2
      src/views/system/social/user/index.vue
  76. 0 2
      src/views/system/tenant/index.vue
  77. 0 2
      src/views/system/tenantPackage/index.vue
  78. 0 4
      src/views/system/user/index.vue

+ 1 - 1
.env

@@ -1,5 +1,5 @@
 # 标题
-VITE_APP_TITLE=芋道管理系统
+VITE_APP_TITLE=DeepOil管理系统
 
 # 项目本地运行端口号
 VITE_PORT=80

+ 4 - 1
.env.dev

@@ -34,4 +34,7 @@ VITE_MALL_H5_DOMAIN='http://mall.yudao.iocoder.cn'
 VITE_APP_CAPTCHA_ENABLE=true
 
 # GoView域名
-VITE_GOVIEW_URL='http://127.0.0.1:3000'
+VITE_GOVIEW_URL='http://127.0.0.1:3000'
+
+VITE_DD_CORPID='dingc0dfd4cc2e69187d35c2f4657eb6378f'
+VITE_DD_CLIENTID='dingh3nuuagvbkahgvjh'

+ 4 - 1
.env.prod

@@ -31,4 +31,7 @@ VITE_OUT_DIR=dist-prod
 VITE_MALL_H5_DOMAIN='http://mall.yudao.iocoder.cn'
 
 # GoView域名
-VITE_GOVIEW_URL='http://127.0.0.1:3000'
+VITE_GOVIEW_URL='http://127.0.0.1:3000'
+
+VITE_DD_CORPID='dingbe7f9a7e8cffa2bd35c2f4657eb6378f'
+VITE_DD_CLIENTID='dingmr9ez0ecgbmscfeb'

+ 5 - 9
index.html

@@ -1,18 +1,14 @@
-<!DOCTYPE html>
+<!doctype html>
 <html lang="en">
   <head>
+    <script src="https://g.alicdn.com/code/npm/@ali/dingtalk-h5-remote-debug/0.1.3/index.js"></script>
+    <script src="https://g.alicdn.com/dingding/dinglogin/0.0.5/ddLogin.js"></script>
     <meta charset="UTF-8" />
     <link rel="icon" href="/favicon.ico" />
     <meta http-equiv="X-UA-Compatible" content="IE=edge" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta
-      name="keywords"
-      content="芋道管理系统 基于 vue3 + CompositionAPI + typescript + vite3 + element plus 的后台开源免费管理系统!"
-    />
-    <meta
-      name="description"
-      content="芋道管理系统 基于 vue3 + CompositionAPI + typescript + vite3 + element plus 的后台开源免费管理系统!"
-    />
+    <meta name="keywords" content="DeepOil管理系统" />
+    <meta name="description" content="DeepOil管理系统" />
     <title>%VITE_APP_TITLE%</title>
   </head>
   <body>

+ 1 - 0
package.json

@@ -45,6 +45,7 @@
     "crypto-js": "^4.2.0",
     "dayjs": "^1.11.10",
     "diagram-js": "^12.8.0",
+    "dingtalk-jsapi": "^3.2.8",
     "driver.js": "^1.3.1",
     "echarts": "^5.5.0",
     "echarts-wordcloud": "^2.1.0",

+ 15 - 19
pnpm-lock.yaml

@@ -68,6 +68,9 @@ importers:
       diagram-js:
         specifier: ^12.8.0
         version: 12.8.1
+      dingtalk-jsapi:
+        specifier: ^3.2.8
+        version: 3.2.8
       driver.js:
         specifier: ^1.3.1
         version: 1.3.1
@@ -1406,42 +1409,36 @@ packages:
     engines: {node: '>= 10.0.0'}
     cpu: [arm]
     os: [linux]
-    libc: [glibc]
 
   '@parcel/watcher-linux-arm-musl@2.5.0':
     resolution: {integrity: sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==}
     engines: {node: '>= 10.0.0'}
     cpu: [arm]
     os: [linux]
-    libc: [musl]
 
   '@parcel/watcher-linux-arm64-glibc@2.5.0':
     resolution: {integrity: sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==}
     engines: {node: '>= 10.0.0'}
     cpu: [arm64]
     os: [linux]
-    libc: [glibc]
 
   '@parcel/watcher-linux-arm64-musl@2.5.0':
     resolution: {integrity: sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==}
     engines: {node: '>= 10.0.0'}
     cpu: [arm64]
     os: [linux]
-    libc: [musl]
 
   '@parcel/watcher-linux-x64-glibc@2.5.0':
     resolution: {integrity: sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==}
     engines: {node: '>= 10.0.0'}
     cpu: [x64]
     os: [linux]
-    libc: [glibc]
 
   '@parcel/watcher-linux-x64-musl@2.5.0':
     resolution: {integrity: sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==}
     engines: {node: '>= 10.0.0'}
     cpu: [x64]
     os: [linux]
-    libc: [musl]
 
   '@parcel/watcher-win32-arm64@2.5.0':
     resolution: {integrity: sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==}
@@ -1545,55 +1542,46 @@ packages:
     resolution: {integrity: sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==}
     cpu: [arm]
     os: [linux]
-    libc: [glibc]
 
   '@rollup/rollup-linux-arm-musleabihf@4.27.4':
     resolution: {integrity: sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==}
     cpu: [arm]
     os: [linux]
-    libc: [musl]
 
   '@rollup/rollup-linux-arm64-gnu@4.27.4':
     resolution: {integrity: sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==}
     cpu: [arm64]
     os: [linux]
-    libc: [glibc]
 
   '@rollup/rollup-linux-arm64-musl@4.27.4':
     resolution: {integrity: sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==}
     cpu: [arm64]
     os: [linux]
-    libc: [musl]
 
   '@rollup/rollup-linux-powerpc64le-gnu@4.27.4':
     resolution: {integrity: sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==}
     cpu: [ppc64]
     os: [linux]
-    libc: [glibc]
 
   '@rollup/rollup-linux-riscv64-gnu@4.27.4':
     resolution: {integrity: sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==}
     cpu: [riscv64]
     os: [linux]
-    libc: [glibc]
 
   '@rollup/rollup-linux-s390x-gnu@4.27.4':
     resolution: {integrity: sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==}
     cpu: [s390x]
     os: [linux]
-    libc: [glibc]
 
   '@rollup/rollup-linux-x64-gnu@4.27.4':
     resolution: {integrity: sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==}
     cpu: [x64]
     os: [linux]
-    libc: [glibc]
 
   '@rollup/rollup-linux-x64-musl@4.27.4':
     resolution: {integrity: sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==}
     cpu: [x64]
     os: [linux]
-    libc: [musl]
 
   '@rollup/rollup-win32-arm64-msvc@4.27.4':
     resolution: {integrity: sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==}
@@ -1639,28 +1627,24 @@ packages:
     engines: {node: '>=10'}
     cpu: [arm64]
     os: [linux]
-    libc: [glibc]
 
   '@swc/core-linux-arm64-musl@1.9.3':
     resolution: {integrity: sha512-tzVH480RY6RbMl/QRgh5HK3zn1ZTFsThuxDGo6Iuk1MdwIbdFYUY034heWUTI4u3Db97ArKh0hNL0xhO3+PZdg==}
     engines: {node: '>=10'}
     cpu: [arm64]
     os: [linux]
-    libc: [musl]
 
   '@swc/core-linux-x64-gnu@1.9.3':
     resolution: {integrity: sha512-ivXXBRDXDc9k4cdv10R21ccBmGebVOwKXT/UdH1PhxUn9m/h8erAWjz5pcELwjiMf27WokqPgaWVfaclDbgE+w==}
     engines: {node: '>=10'}
     cpu: [x64]
     os: [linux]
-    libc: [glibc]
 
   '@swc/core-linux-x64-musl@1.9.3':
     resolution: {integrity: sha512-ILsGMgfnOz1HwdDz+ZgEuomIwkP1PHT6maigZxaCIuC6OPEhKE8uYna22uU63XvYcLQvZYDzpR3ms47WQPuNEg==}
     engines: {node: '>=10'}
     cpu: [x64]
     os: [linux]
-    libc: [musl]
 
   '@swc/core-win32-arm64-msvc@1.9.3':
     resolution: {integrity: sha512-e+XmltDVIHieUnNJHtspn6B+PCcFOMYXNJB1GqoCcyinkEIQNwC8KtWgMqUucUbEWJkPc35NHy9k8aCXRmw9Kg==}
@@ -2982,6 +2966,9 @@ packages:
   dijkstrajs@1.0.3:
     resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==}
 
+  dingtalk-jsapi@3.2.8:
+    resolution: {integrity: sha512-FAoTXIEwtlz0U3wpo+Y0VouBoRHPhS3SlRvKrsCL5NZgIihj6PL1xPzqLQEhzyVz7SoIA9rqAMo5UsRsj3uL8g==}
+
   dir-glob@3.0.1:
     resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
     engines: {node: '>=8'}
@@ -4334,6 +4321,9 @@ packages:
     resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==}
     engines: {node: '>=0.4.0'}
 
+  promise-polyfill@7.1.2:
+    resolution: {integrity: sha512-FuEc12/eKqqoRYIGBrUptCBRhobL19PS2U31vMNTfyck1FxPyMfgsXyW4Mav85y/ZN1hop3hOwRlUDok23oYfQ==}
+
   proxy-from-env@1.1.0:
     resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
 
@@ -8281,6 +8271,10 @@ snapshots:
 
   dijkstrajs@1.0.3: {}
 
+  dingtalk-jsapi@3.2.8:
+    dependencies:
+      promise-polyfill: 7.1.2
+
   dir-glob@3.0.1:
     dependencies:
       path-type: 4.0.0
@@ -9644,6 +9638,8 @@ snapshots:
 
   progress@2.0.3: {}
 
+  promise-polyfill@7.1.2: {}
+
   proxy-from-env@1.1.0: {}
 
   punycode.js@2.3.1: {}

BIN
public/favicon.ico


BIN
public/logo.gif


+ 4 - 0
src/api/login/index.ts

@@ -22,6 +22,10 @@ export const login = (data: UserLoginVO) => {
   })
 }
 
+export const dingTalkLogin = (data: { code: string; type: number; state: number }) => {
+  return request.post({ url: '/system/auth/h5SocialLogin', data, headers: { 'tenant-id': 1 } })
+}
+
 // 注册
 export const register = (data: RegisterVO) => {
   return request.post({ url: '/system/auth/register', data })

BIN
src/assets/imgs/logo.png


BIN
src/assets/imgs/yf.png


+ 105 - 11
src/views/Login/Login.vue

@@ -19,11 +19,9 @@
             enter-active-class="animate__animated animate__bounceInLeft"
             tag="div"
           >
-            <img key="1" alt="" class="w-350px" src="@/assets/svgs/login-box-bg.svg" />
-            <div key="2" class="text-3xl text-white">{{ t('login.welcome') }}</div>
-            <div key="3" class="mt-5 text-14px font-normal text-white">
+            <!-- <div key="3" class="mt-5 text-14px font-normal text-white">
               {{ t('login.message') }}
-            </div>
+            </div> -->
           </TransitionGroup>
         </div>
       </div>
@@ -33,11 +31,11 @@
         <!-- 右上角的主题、语言选择 -->
         <div
           class="flex items-center justify-between at-2xl:justify-end at-xl:justify-end"
-          style="color: var(--el-text-color-primary);"
+          style="color: var(--el-text-color-primary)"
         >
           <div class="flex items-center at-2xl:hidden at-xl:hidden">
             <img alt="" class="mr-10px h-48px w-48px" src="@/assets/imgs/logo.png" />
-            <span class="text-20px font-bold" >{{ underlineToHump(appStore.getTitle) }}</span>
+            <span class="text-20px font-bold">{{ underlineToHump(appStore.getTitle) }}</span>
           </div>
           <div class="flex items-center justify-end space-x-10px h-48px">
             <ThemeSwitch />
@@ -47,18 +45,18 @@
         <!-- 右边的登录界面 -->
         <Transition appear enter-active-class="animate__animated animate__bounceInRight">
           <div
-            class="m-auto h-[calc(100%-60px)] w-[100%] flex items-center at-2xl:max-w-500px at-lg:max-w-500px at-md:max-w-500px at-xl:max-w-500px"
+            class="m-auto h-[calc(100%-60px)] w-[100%] flex items-center 2xl:max-w-500px lg:max-w-500px md:max-w-500px xl:max-w-500px"
           >
             <!-- 账号登录 -->
             <LoginForm class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />
             <!-- 手机登录 -->
-            <MobileForm class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />
+            <!--            <MobileForm class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />-->
             <!-- 二维码登录 -->
             <QrCodeForm class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />
             <!-- 注册 -->
             <RegisterForm class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />
             <!-- 三方登录 -->
-            <SSOLoginVue class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />
+            <!--            <SSOLoginVue class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />-->
             <!-- 忘记密码 -->
             <ForgetPasswordForm class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />
           </div>
@@ -74,8 +72,17 @@ import { useDesign } from '@/hooks/web/useDesign'
 import { useAppStore } from '@/store/modules/app'
 import { ThemeSwitch } from '@/layout/components/ThemeSwitch'
 import { LocaleDropdown } from '@/layout/components/LocaleDropdown'
+import * as dd from 'dingtalk-jsapi'
 
-import { LoginForm, MobileForm, QrCodeForm, RegisterForm, SSOLoginVue, ForgetPasswordForm } from './components'
+import { LoginForm, QrCodeForm, RegisterForm, ForgetPasswordForm } from './components'
+import { dingTalkLogin } from '../../api/login'
+
+import * as authUtil from '@/utils/auth'
+import { RouteLocationNormalizedLoaded } from 'vue-router'
+import { usePermissionStore } from '../../store/modules/permission'
+
+import * as LoginApi from '@/api/login'
+import { ElLoading } from 'element-plus'
 
 defineOptions({ name: 'Login' })
 
@@ -83,6 +90,92 @@ const { t } = useI18n()
 const appStore = useAppStore()
 const { getPrefixCls } = useDesign()
 const prefixCls = getPrefixCls('login')
+
+const loading = ref<any>(null)
+
+const redirect = ref<string>('')
+
+const router = useRouter()
+
+watch(
+  () => router.currentRoute.value,
+  (route: RouteLocationNormalizedLoaded) => {
+    redirect.value = route?.query?.redirect as string
+  },
+  {
+    immediate: true
+  }
+)
+
+const getTenantId = async () => {
+  if (import.meta.env.VITE_APP_TENANT_ENABLE === 'true') {
+    const res = await LoginApi.getTenantIdByName('芋道源码')
+    debugger
+    authUtil.setTenantId(res)
+  }
+}
+
+const permissionStore = usePermissionStore()
+
+async function loginWithDingTalk() {
+  const ddCorpId = import.meta.env.VITE_DD_CORPID
+  const ddClientId = import.meta.env.VITE_DD_CLIENTID
+
+  if (!ddCorpId || !ddClientId) return
+
+  await getTenantId()
+
+  dd.requestAuthCode({
+    corpId: ddCorpId,
+    clientId: ddClientId,
+    success: (res: any) => {
+      const { code } = res
+      dingTalkLogin({ code, type: 10, state: new Date().getTime() }).then(async (res) => {
+        console.log('res :>> ', res)
+        loading.value = ElLoading.service({
+          lock: true,
+          text: '正在加载系统中...',
+          background: 'rgba(0, 0, 0, 0.7)'
+        })
+
+        // authUtil.removeLoginForm()
+
+        authUtil.setToken(res)
+
+        if (!redirect.value) {
+          redirect.value = '/'
+        }
+        if (redirect.value.indexOf('sso') !== -1) {
+          window.location.href = window.location.href.replace('/login?redirect=', '')
+        } else {
+          router.push({ path: redirect.value || permissionStore.addRouters[0].path }).then(() => {
+            loading.value.close()
+          })
+        }
+      })
+    },
+    fail: (err: any) => {
+      console.log('err :>> ', err)
+    },
+    complete: () => {
+      console.log('11 :>> ', 11)
+    }
+  })
+}
+
+function dingTalkAutoLogin() {
+  const ua = window.navigator.userAgent.toLowerCase()
+
+  console.log('ua :>> ', ua)
+
+  if (!ua.includes('dingtalk') && !ua.includes('dingtalkwork')) return
+
+  loginWithDingTalk()
+}
+
+onMounted(() => {
+  dingTalkAutoLogin()
+})
 </script>
 
 <style lang="scss" scoped>
@@ -99,9 +192,10 @@ $prefix-cls: #{$namespace}-login;
       z-index: -1;
       width: 100%;
       height: 100%;
-      background-image: url('@/assets/svgs/login-bg.svg');
+      background-image: url('@/assets/imgs/yf.png');
       background-position: center;
       background-repeat: no-repeat;
+      background-size: cover; /* 关键:图片覆盖整个容器 */
       content: '';
     }
   }

+ 4 - 4
src/views/Login/SocialLogin.vue

@@ -185,7 +185,7 @@ const { push } = useRouter()
 const permissionStore = usePermissionStore()
 const loginLoading = ref(false)
 const verify = ref()
-const captchaType = ref('blockPuzzle') // blockPuzzle 滑块 clickWord 点击文字 pictureWord 文字验证码
+const captchaType = ref('blockPuzzle') // blockPuzzle 滑块 clickWord 点击文字
 
 const getShow = computed(() => unref(getLoginState) === LoginStateEnum.LOGIN)
 
@@ -200,8 +200,8 @@ const loginData = reactive({
   tenantEnable: import.meta.env.VITE_APP_TENANT_ENABLE !== 'false',
   loginForm: {
     tenantName: '芋道源码',
-    username: 'admin',
-    password: 'admin123',
+    username: '',
+    password: '',
     captchaVerification: '',
     rememberMe: false
   }
@@ -253,7 +253,7 @@ const tryLogin = async () => {
     const redirect = getUrlValue('redirect')
     const code = route?.query?.code as string
     const state = route?.query?.state as string
-
+    await getTenantId()
     const res = await LoginApi.socialLogin(type, code, state)
     authUtil.setToken(res)
 

+ 19 - 20
src/views/Login/components/ForgetPasswordForm.vue

@@ -9,14 +9,14 @@
     label-width="120px"
     size="large"
   >
-    <el-row class="mx-[-10px]">
+    <el-row style="margin-right: -10px; margin-left: -10px">
       <!-- 租户名 -->
-      <el-col :span="24" class="px-10px">
+      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
         <el-form-item>
-          <LoginFormTitle class="w-full" />
+          <LoginFormTitle style="width: 100%" />
         </el-form-item>
       </el-col>
-      <el-col :span="24" class="px-10px">
+      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
         <el-form-item v-if="resetPasswordData.tenantEnable === 'true'" prop="tenantName">
           <el-input
             v-model="resetPasswordData.tenantName"
@@ -28,7 +28,7 @@
         </el-form-item>
       </el-col>
       <!-- 手机号 -->
-      <el-col :span="24" class="px-10px">
+      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
         <el-form-item prop="mobile">
           <el-input
             v-model="resetPasswordData.mobile"
@@ -39,14 +39,13 @@
       </el-col>
       <Verify
         ref="verify"
-        v-if="resetPasswordData.captchaEnable === 'true'"
         :captchaType="captchaType"
         :imgSize="{ width: '400px', height: '200px' }"
         mode="pop"
         @success="getSmsCode"
       />
       <!-- 验证码 -->
-      <el-col :span="24" class="px-10px">
+      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
         <el-form-item prop="code">
           <el-row :gutter="5" justify="space-between" style="width: 100%">
             <el-col :span="24">
@@ -74,44 +73,44 @@
           </el-row>
         </el-form-item>
       </el-col>
-      <el-col :span="24" class="px-10px">
+      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
         <el-form-item prop="password">
           <InputPassword
             v-model="resetPasswordData.password"
             :placeholder="t('login.passwordPlaceholder')"
-            class="w-full"
-            :strength="true"
+            style="width: 100%"
+            strength="true"
           />
         </el-form-item>
       </el-col>
-      <el-col :span="24" class="px-10px">
+      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
         <el-form-item prop="check_password">
           <InputPassword
             v-model="resetPasswordData.check_password"
             :placeholder="t('login.checkPassword')"
-            class="w-full"
-            :strength="true"
+            style="width: 100%"
+            strength="true"
           />
         </el-form-item>
       </el-col>
       <!-- 登录按钮 / 返回按钮 -->
-      <el-col :span="24" class="px-10px">
+      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
         <el-form-item>
           <XButton
             :loading="loginLoading"
             :title="t('login.resetPassword')"
-            class="w-full"
+            class="w-[100%]"
             type="primary"
             @click="resetPassword()"
           />
         </el-form-item>
       </el-col>
-      <el-col :span="24" class="px-10px">
+      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
         <el-form-item>
           <XButton
             :loading="loginLoading"
             :title="t('login.backLogin')"
-            class="w-full"
+            class="w-[100%]"
             @click="handleBackLogin()"
           />
         </el-form-item>
@@ -135,7 +134,7 @@ const verify = ref()
 
 const { t } = useI18n()
 const message = useMessage()
-const { currentRoute } = useRouter()
+const { currentRoute, push } = useRouter()
 const formSmsResetPassword = ref()
 const loginLoading = ref(false)
 const iconHouse = useIcon({ icon: 'ep:house' })
@@ -144,9 +143,9 @@ const iconCircleCheck = useIcon({ icon: 'ep:circle-check' })
 const { validForm } = useFormValid(formSmsResetPassword)
 const { handleBackLogin, getLoginState, setLoginState } = useLoginState()
 const getShow = computed(() => unref(getLoginState) === LoginStateEnum.RESET_PASSWORD)
-const captchaType = ref('blockPuzzle') // blockPuzzle 滑块 clickWord 点击文字 pictureWord 文字验证码
+const captchaType = ref('blockPuzzle') // blockPuzzle 滑块 clickWord 点击文字
 
-const validatePass2 = (_rule, value, callback) => {
+const validatePass2 = (rule, value, callback) => {
   if (value === '') {
     callback(new Error('请再次输入密码'))
   } else if (value !== resetPasswordData.password) {

+ 58 - 85
src/views/Login/components/LoginForm.vue

@@ -9,24 +9,24 @@
     label-width="120px"
     size="large"
   >
-    <el-row class="mx-[-10px]">
-      <el-col :span="24" class="px-10px">
+    <el-row style="margin-right: -10px; margin-left: -10px">
+      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
         <el-form-item>
-          <LoginFormTitle class="w-full" />
+          <LoginFormTitle style="width: 100%" />
         </el-form-item>
       </el-col>
-      <el-col :span="24" class="px-10px">
-        <el-form-item v-if="loginData.tenantEnable === 'true'" prop="tenantName">
-          <el-input
-            v-model="loginData.loginForm.tenantName"
-            :placeholder="t('login.tenantNamePlaceholder')"
-            :prefix-icon="iconHouse"
-            link
-            type="primary"
-          />
-        </el-form-item>
-      </el-col>
-      <el-col :span="24" class="px-10px">
+      <!--      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">-->
+      <!--        <el-form-item v-if="loginData.tenantEnable === 'true'" prop="tenantName">-->
+      <!--          <el-input-->
+      <!--            v-model="loginData.loginForm.tenantName"-->
+      <!--            :placeholder="t('login.tenantNamePlaceholder')"-->
+      <!--            :prefix-icon="iconHouse"-->
+      <!--            link-->
+      <!--            type="primary"-->
+      <!--          />-->
+      <!--        </el-form-item>-->
+      <!--      </el-col>-->
+      <el-col :span="24" style="padding-right: 10px; padding-left: 10px; margin-top: 30px">
         <el-form-item prop="username">
           <el-input
             v-model="loginData.loginForm.username"
@@ -35,7 +35,7 @@
           />
         </el-form-item>
       </el-col>
-      <el-col :span="24" class="px-10px">
+      <el-col :span="24" style="padding-right: 10px; padding-left: 10px; margin-top: 15px">
         <el-form-item prop="password">
           <el-input
             v-model="loginData.loginForm.password"
@@ -47,7 +47,10 @@
           />
         </el-form-item>
       </el-col>
-      <el-col :span="24" class="px-10px mt-[-20px] mb-[-20px]">
+      <el-col
+        :span="24"
+        style="padding-right: 10px; padding-left: 10px; margin-top: -10px; margin-bottom: -20px"
+      >
         <el-form-item>
           <el-row justify="space-between" style="width: 100%">
             <el-col :span="6">
@@ -57,7 +60,7 @@
             </el-col>
             <el-col :offset="6" :span="12">
               <el-link
-                class="float-right"
+                style="float: right"
                 type="primary"
                 @click="setLoginState(LoginStateEnum.RESET_PASSWORD)"
               >
@@ -67,12 +70,12 @@
           </el-row>
         </el-form-item>
       </el-col>
-      <el-col :span="24" class="px-10px">
+      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
         <el-form-item>
           <XButton
             :loading="loginLoading"
             :title="t('login.login')"
-            class="w-full"
+            class="w-[100%]"
             type="primary"
             @click="getCode()"
           />
@@ -86,64 +89,33 @@
         mode="pop"
         @success="handleLogin"
       />
-      <el-col :span="24" class="px-10px">
+      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
         <el-form-item>
           <el-row :gutter="5" justify="space-between" style="width: 100%">
-            <el-col :span="8">
-              <XButton
-                :title="t('login.btnMobile')"
-                class="w-full"
-                @click="setLoginState(LoginStateEnum.MOBILE)"
-              />
-            </el-col>
-            <el-col :span="8">
+            <!--            <el-col :span="8">-->
+            <!--              <XButton-->
+            <!--                :title="t('login.btnMobile')"-->
+            <!--                class="w-[100%]"-->
+            <!--                @click="setLoginState(LoginStateEnum.MOBILE)"-->
+            <!--              />-->
+            <!--            </el-col>-->
+            <el-col :span="24">
               <XButton
                 :title="t('login.btnQRCode')"
-                class="w-full"
+                class="w-[100%]"
                 @click="setLoginState(LoginStateEnum.QR_CODE)"
               />
             </el-col>
-            <el-col :span="8">
-              <XButton
-                :title="t('login.btnRegister')"
-                class="w-full"
-                @click="setLoginState(LoginStateEnum.REGISTER)"
-              />
-            </el-col>
+            <!--            <el-col :span="12">-->
+            <!--              <XButton-->
+            <!--                :title="t('login.btnRegister')"-->
+            <!--                class="w-[100%]"-->
+            <!--                @click="setLoginState(LoginStateEnum.REGISTER)"-->
+            <!--              />-->
+            <!--            </el-col>-->
           </el-row>
         </el-form-item>
       </el-col>
-      <el-divider content-position="center">{{ t('login.otherLogin') }}</el-divider>
-      <el-col :span="24" class="px-10px">
-        <el-form-item>
-          <div class="w-full flex justify-between">
-            <Icon
-              v-for="(item, key) in socialList"
-              :key="key"
-              :icon="item.icon"
-              :size="30"
-              class="anticon cursor-pointer"
-              color="#999"
-              @click="doSocialLogin(item.type)"
-            />
-          </div>
-        </el-form-item>
-      </el-col>
-      <el-divider content-position="center">萌新必读</el-divider>
-      <el-col :span="24" class="px-10px">
-        <el-form-item>
-          <div class="w-full flex justify-between">
-            <el-link href="https://doc.iocoder.cn/" target="_blank">📚开发指南</el-link>
-            <el-link href="https://doc.iocoder.cn/video/" target="_blank">🔥视频教程</el-link>
-            <el-link href="https://www.iocoder.cn/Interview/good-collection/" target="_blank">
-              ⚡面试手册
-            </el-link>
-            <el-link href="http://static.yudao.iocoder.cn/mp/Aix9975.jpeg" target="_blank">
-              🤝外包咨询
-            </el-link>
-          </div>
-        </el-form-item>
-      </el-col>
     </el-row>
   </el-form>
 </template>
@@ -174,7 +146,7 @@ const permissionStore = usePermissionStore()
 const redirect = ref<string>('')
 const loginLoading = ref(false)
 const verify = ref()
-const captchaType = ref('blockPuzzle') // blockPuzzle 滑块 clickWord 点击文字 pictureWord 文字验证码
+const captchaType = ref('blockPuzzle') // blockPuzzle 滑块 clickWord 点击文字
 
 const getShow = computed(() => unref(getLoginState) === LoginStateEnum.LOGIN)
 
@@ -189,10 +161,10 @@ const loginData = reactive({
   tenantEnable: import.meta.env.VITE_APP_TENANT_ENABLE,
   loginForm: {
     tenantName: import.meta.env.VITE_APP_DEFAULT_LOGIN_TENANT || '',
-    username: import.meta.env.VITE_APP_DEFAULT_LOGIN_USERNAME || '',
-    password: import.meta.env.VITE_APP_DEFAULT_LOGIN_PASSWORD || '',
+    // username: import.meta.env.VITE_APP_DEFAULT_LOGIN_USERNAME || '',
+    // password: import.meta.env.VITE_APP_DEFAULT_LOGIN_PASSWORD || '',
     captchaVerification: '',
-    rememberMe: true // 默认记录我。如果不需要,可手动修改
+    rememberMe: false // 默认记录我。如果不需要,可手动修改
   }
 })
 
@@ -218,6 +190,7 @@ const getCode = async () => {
 const getTenantId = async () => {
   if (loginData.tenantEnable === 'true') {
     const res = await LoginApi.getTenantIdByName(loginData.loginForm.tenantName)
+    debugger
     authUtil.setTenantId(res)
   }
 }
@@ -227,22 +200,20 @@ const getLoginFormCache = () => {
   if (loginForm) {
     loginData.loginForm = {
       ...loginData.loginForm,
-      username: loginForm.username ? loginForm.username : loginData.loginForm.username,
-      password: loginForm.password ? loginForm.password : loginData.loginForm.password,
-      rememberMe: loginForm.rememberMe,
+      // username: loginForm.username ? loginForm.username : loginData.loginForm.username,
+      // password: loginForm.password ? loginForm.password : loginData.loginForm.password,
+      // rememberMe: loginForm.rememberMe,
       tenantName: loginForm.tenantName ? loginForm.tenantName : loginData.loginForm.tenantName
     }
   }
 }
 // 根据域名,获得租户信息
 const getTenantByWebsite = async () => {
-  if (loginData.tenantEnable === 'true') {
-    const website = location.host
-    const res = await LoginApi.getTenantByWebsite(website)
-    if (res) {
-      loginData.loginForm.tenantName = res.name
-      authUtil.setTenantId(res.id)
-    }
+  const website = location.host
+  const res = await LoginApi.getTenantByWebsite(website)
+  if (res) {
+    loginData.loginForm.tenantName = res.name
+    authUtil.setTenantId(res.id)
   }
 }
 const loading = ref() // ElLoading.service 返回的实例
@@ -258,14 +229,16 @@ const handleLogin = async (params: any) => {
     const loginDataLoginForm = { ...loginData.loginForm }
     loginDataLoginForm.captchaVerification = params.captchaVerification
     const res = await LoginApi.login(loginDataLoginForm)
-    if (!res) {
-      return
-    }
+    // if (!res) {
+    //   return
+    // }
+    console.log('res :>> ', res)
     loading.value = ElLoading.service({
       lock: true,
       text: '正在加载系统中...',
       background: 'rgba(0, 0, 0, 0.7)'
     })
+    console.log('loginDataLoginForm.rememberMe :>> ', loginDataLoginForm.rememberMe)
     if (loginDataLoginForm.rememberMe) {
       authUtil.setLoginForm(loginDataLoginForm)
     } else {

+ 10 - 10
src/views/Login/components/MobileForm.vue

@@ -9,14 +9,14 @@
     label-width="120px"
     size="large"
   >
-    <el-row class="mx-[-10px]">
+    <el-row style="margin-right: -10px; margin-left: -10px">
       <!-- 租户名 -->
-      <el-col :span="24" class="px-10px">
+      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
         <el-form-item>
-          <LoginFormTitle class="w-full" />
+          <LoginFormTitle style="width: 100%" />
         </el-form-item>
       </el-col>
-      <el-col :span="24" class="px-10px">
+      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
         <el-form-item v-if="loginData.tenantEnable === 'true'" prop="tenantName">
           <el-input
             v-model="loginData.loginForm.tenantName"
@@ -28,7 +28,7 @@
         </el-form-item>
       </el-col>
       <!-- 手机号 -->
-      <el-col :span="24" class="px-10px">
+      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
         <el-form-item prop="mobileNumber">
           <el-input
             v-model="loginData.loginForm.mobileNumber"
@@ -38,7 +38,7 @@
         </el-form-item>
       </el-col>
       <!-- 验证码 -->
-      <el-col :span="24" class="px-10px">
+      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
         <el-form-item prop="code">
           <el-row :gutter="5" justify="space-between" style="width: 100%">
             <el-col :span="24">
@@ -68,23 +68,23 @@
         </el-form-item>
       </el-col>
       <!-- 登录按钮 / 返回按钮 -->
-      <el-col :span="24" class="px-10px">
+      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
         <el-form-item>
           <XButton
             :loading="loginLoading"
             :title="t('login.login')"
-            class="w-full"
+            class="w-[100%]"
             type="primary"
             @click="signIn()"
           />
         </el-form-item>
       </el-col>
-      <el-col :span="24" class="px-10px">
+      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
         <el-form-item>
           <XButton
             :loading="loginLoading"
             :title="t('login.backLogin')"
-            class="w-full"
+            class="w-[100%]"
             @click="handleBackLogin()"
           />
         </el-form-item>

+ 88 - 11
src/views/Login/components/QrCodeForm.vue

@@ -1,24 +1,23 @@
 <template>
-  <el-row v-show="getShow" class="login-form mx-[-10px]">
-    <el-col :span="24" class="px-10px">
-      <LoginFormTitle class="w-full" />
+  <el-row v-show="getShow" class="login-form" style="margin-right: -10px; margin-left: -10px">
+    <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
+      <LoginFormTitle style="width: 100%" />
     </el-col>
-    <el-col :span="24" class="px-10px">
+    <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
       <el-card class="mb-10px text-center" shadow="hover">
-        <Qrcode :logo="logoImg" />
+        <!--        <Qrcode :logo="logoImg" />-->
+        <div id="login_container"></div>
       </el-card>
     </el-col>
-    <el-divider class="enter-x">{{ t('login.qrcode') }}</el-divider>
-    <el-col :span="24" class="px-10px">
-      <div class="mt-4 w-full">
-        <XButton :title="t('login.backLogin')" class="w-full" @click="handleBackLogin()" />
+    <!--    <el-divider class="enter-x">{{ t('login.qrcode') }}</el-divider>-->
+    <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
+      <div class="mt-15px w-[100%]">
+        <XButton :title="t('login.backLogin')" class="w-[100%]" @click="handleBackLogin()" />
       </div>
     </el-col>
   </el-row>
 </template>
 <script lang="ts" setup>
-import logoImg from '@/assets/imgs/logo.png'
-
 import LoginFormTitle from './LoginFormTitle.vue'
 import { LoginStateEnum, useLoginState } from './useLogin'
 
@@ -27,4 +26,82 @@ defineOptions({ name: 'QrCodeForm' })
 const { t } = useI18n()
 const { handleBackLogin, getLoginState } = useLoginState()
 const getShow = computed(() => unref(getLoginState) === LoginStateEnum.QR_CODE)
+
+const appId = 'dingmr9ez0ecgbmscfeb'
+const dingRedirectUrl = import.meta.env.VITE_BASE_URL + '/login?loginType=dingding&type=20'
+
+onMounted(() => {
+  initDingLogin()
+})
+const _getRandomString = (len) => {
+  len = len || 10
+  let $chars = 'ABCDEFGHIJKMNOPQRSTUVWXYZ' // 默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1
+  let maxPos = $chars.length
+  let pwd = ''
+  for (var i = 0; i < len; i++) {
+    pwd += $chars.charAt(Math.floor(Math.random() * maxPos))
+  }
+  return pwd
+}
+const initDingLogin = () => {
+  // if (window.DDLogin) {
+  var url = dingRedirectUrl
+  var state = _getRandomString(10)
+  var gotoUrl = encodeURIComponent(
+    'https://oapi.dingtalk.com/connect/oauth2/sns_authorize?' +
+      'appid=' +
+      appId +
+      '&response_type=code' +
+      '&scope=snsapi_login' +
+      '&state=' +
+      state +
+      '&redirect_uri=' +
+      url
+  )
+
+  nextTick(() => {
+    var obj = window.DDLogin({
+      id: 'login_container',
+      goto: gotoUrl,
+      style: 'border:none;background-color:#FFFFFF;',
+      width: '100%', // 二维码的宽度
+      height: '290' // 二维码的高度
+    })
+    // 重置扫码登录框的样式,让登录框居中
+    let box = document.getElementById('login_container')
+    box.querySelector('iframe').style.top = '0'
+    box.querySelector('iframe').style.bottom = '0'
+    box.querySelector('iframe').style.left = '0'
+    box.querySelector('iframe').style.right = '0'
+    box.querySelector('iframe').style.margin = 'auto'
+  })
+
+  /* new window.DDLogin({
+    id: "login_container",
+    goto: gotoUrl,
+    style: "border:none;background-color:#FFFFFF;",
+    width: "350",
+    height: "350",
+  }); */
+  var handleMessage = function (event) {
+    var origin = event.origin
+    if (origin === 'https://login.dingtalk.com') {
+      var loginTmpCode = event.data
+      console.log(loginTmpCode)
+      window.location.href =
+        'https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=dingmr9ez0ecgbmscfeb&response_type=code&scope=snsapi_login&state=' +
+        state +
+        '&redirect_uri=' +
+        url +
+        '&loginTmpCode=' +
+        loginTmpCode
+    }
+  }
+  if (typeof window.addEventListener != 'undefined') {
+    window.addEventListener('message', handleMessage, false)
+  } else if (typeof window.attachEvent != 'undefined') {
+    window.attachEvent('onmessage', handleMessage)
+  }
+  // }
+}
 </script>

+ 21 - 29
src/views/Login/components/RegisterForm.vue

@@ -9,13 +9,13 @@
     label-width="120px"
     size="large"
   >
-    <el-row class="mx-[-10px]">
-      <el-col :span="24" class="px-10px">
+    <el-row style="margin-right: -10px; margin-left: -10px">
+      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
         <el-form-item>
-          <LoginFormTitle class="w-full" />
+          <LoginFormTitle style="width: 100%" />
         </el-form-item>
       </el-col>
-      <el-col :span="24" class="px-10px">
+      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
         <el-form-item v-if="registerData.tenantEnable === 'true'" prop="tenantName">
           <el-input
             v-model="registerData.registerForm.tenantName"
@@ -27,7 +27,7 @@
           />
         </el-form-item>
       </el-col>
-      <el-col :span="24" class="px-10px">
+      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
         <el-form-item prop="username">
           <el-input
             v-model="registerData.registerForm.username"
@@ -37,8 +37,8 @@
           />
         </el-form-item>
       </el-col>
-      <el-col :span="24" class="px-10px">
-        <el-form-item prop="nickname">
+      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
+        <el-form-item prop="username">
           <el-input
             v-model="registerData.registerForm.nickname"
             placeholder="昵称"
@@ -47,7 +47,7 @@
           />
         </el-form-item>
       </el-col>
-      <el-col :span="24" class="px-10px">
+      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
         <el-form-item prop="password">
           <el-input
             v-model="registerData.registerForm.password"
@@ -60,7 +60,7 @@
           />
         </el-form-item>
       </el-col>
-      <el-col :span="24" class="px-10px">
+      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
         <el-form-item prop="confirmPassword">
           <el-input
             v-model="registerData.registerForm.confirmPassword"
@@ -73,12 +73,12 @@
           />
         </el-form-item>
       </el-col>
-      <el-col :span="24" class="px-10px">
+      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
         <el-form-item>
           <XButton
             :loading="loginLoading"
             :title="t('login.register')"
-            class="w-full"
+            class="w-[100%]"
             type="primary"
             @click="getCode()"
           />
@@ -93,7 +93,7 @@
         @success="handleRegister"
       />
     </el-row>
-    <XButton :title="t('login.hasUser')" class="w-full" @click="handleBackLogin()" />
+    <XButton :title="t('login.hasUser')" class="w-[100%]" @click="handleBackLogin()" />
   </el-form>
 </template>
 <script lang="ts" setup>
@@ -104,7 +104,7 @@ import { useIcon } from '@/hooks/web/useIcon'
 import * as authUtil from '@/utils/auth'
 import { usePermissionStore } from '@/store/modules/permission'
 import * as LoginApi from '@/api/login'
-import { LoginStateEnum, useLoginState, useFormValid } from './useLogin'
+import { LoginStateEnum, useLoginState } from './useLogin'
 
 defineOptions({ name: 'RegisterForm' })
 
@@ -113,18 +113,17 @@ const iconHouse = useIcon({ icon: 'ep:house' })
 const iconAvatar = useIcon({ icon: 'ep:avatar' })
 const iconLock = useIcon({ icon: 'ep:lock' })
 const formLogin = ref()
-const {validForm} = useFormValid(formLogin)
 const { handleBackLogin, getLoginState } = useLoginState()
 const { currentRoute, push } = useRouter()
 const permissionStore = usePermissionStore()
 const redirect = ref<string>('')
 const loginLoading = ref(false)
 const verify = ref()
-const captchaType = ref('blockPuzzle') // blockPuzzle 滑块 clickWord 点击文字 pictureWord 文字验证码
+const captchaType = ref('blockPuzzle') // blockPuzzle 滑块 clickWord 点击文字
 
 const getShow = computed(() => unref(getLoginState) === LoginStateEnum.REGISTER)
 
-const equalToPassword = (_rule, value, callback) => {
+const equalToPassword = (rule, value, callback) => {
   if (registerData.registerForm.password !== value) {
     callback(new Error('两次输入的密码不一致'))
   } else {
@@ -171,7 +170,6 @@ const registerData = reactive({
   }
 })
 
-const loading = ref() // ElLoading.service 返回的实例
 // 提交注册
 const handleRegister = async (params: any) => {
   loading.value = true
@@ -185,11 +183,6 @@ const handleRegister = async (params: any) => {
       registerData.registerForm.captchaVerification = params.captchaVerification
     }
 
-    const data = await validForm()
-    if (!data) {
-      return
-    }
-
     const res = await LoginApi.register(registerData.registerForm)
     if (!res) {
       return
@@ -240,15 +233,14 @@ const getTenantId = async () => {
 
 // 根据域名,获得租户信息
 const getTenantByWebsite = async () => {
-  if (registerData.tenantEnable === 'true') {
-    const website = location.host
-    const res = await LoginApi.getTenantByWebsite(website)
-    if (res) {
-      registerData.registerForm.tenantName = res.name
-      authUtil.setTenantId(res.id)
-    }
+  const website = location.host
+  const res = await LoginApi.getTenantByWebsite(website)
+  if (res) {
+    registerData.registerForm.tenantName = res.name
+    authUtil.setTenantId(res.id)
   }
 }
+const loading = ref() // ElLoading.service 返回的实例
 
 watch(
   () => currentRoute.value,

+ 4 - 4
src/views/Login/components/SSOLogin.vue

@@ -1,7 +1,7 @@
 <template>
   <div v-show="ssoVisible" class="form-cont">
     <!-- 应用名 -->
-    <LoginFormTitle class="w-full" />
+    <LoginFormTitle style="width: 100%" />
     <el-tabs class="form" style="float: none" value="uname">
       <el-tab-pane :label="client.name" name="uname" />
     </el-tabs>
@@ -15,17 +15,17 @@
               v-for="scope in queryParams.scopes"
               :key="scope"
               :value="scope"
-              class="block mb-[-10px]"
+              style="display: block; margin-bottom: -10px"
             >
               {{ formatScope(scope) }}
             </el-checkbox>
           </el-checkbox-group>
         </el-form-item>
         <!-- 下方的登录按钮 -->
-        <el-form-item class="w-full">
+        <el-form-item class="w-1/1">
           <el-button
             :loading="formLoading"
-            class="w-3/5"
+            class="w-6/10"
             type="primary"
             @click.prevent="handleAuthorize(true)"
           >

+ 0 - 2
src/views/bpm/category/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="工作流手册" url="https://doc.iocoder.cn/bpm/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 2
src/views/bpm/form/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="审批接入(流程表单)" url="https://doc.iocoder.cn/bpm/use-bpm-form/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 2
src/views/bpm/group/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="工作流手册" url="https://doc.iocoder.cn/bpm/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 2
src/views/bpm/model/definition/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="工作流手册" url="https://doc.iocoder.cn/bpm/" />
-
   <ContentWrap>
     <el-table v-loading="loading" :data="list">
       <el-table-column label="定义编号" align="center" prop="id" min-width="250" />

+ 0 - 2
src/views/bpm/oa/leave/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="审批接入(业务表单)" url="https://doc.iocoder.cn/bpm/use-business-form/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 2
src/views/bpm/processExpression/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="流程表达式" url="https://doc.iocoder.cn/bpm/expression/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 2
src/views/bpm/processInstance/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="流程发起、取消、重新发起" url="https://doc.iocoder.cn/bpm/process-instance/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 2
src/views/bpm/processInstance/manager/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="工作流手册" url="https://doc.iocoder.cn/bpm/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 2
src/views/bpm/processInstance/report/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="工作流手册" url="https://doc.iocoder.cn/bpm/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 2
src/views/bpm/processListener/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="执行监听器、任务监听器" url="https://doc.iocoder.cn/bpm/listener/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 5
src/views/bpm/task/copy/index.vue

@@ -1,10 +1,5 @@
 <!-- 工作流 - 抄送我的流程 -->
 <template>
-  <doc-alert
-    title="审批转办、委派、抄送"
-    url="https://doc.iocoder.cn/bpm/task-delegation-and-cc/"
-  />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form ref="queryFormRef" :inline="true" class="-mb-15px" label-width="68px">

+ 0 - 8
src/views/bpm/task/done/index.vue

@@ -1,12 +1,4 @@
 <template>
-  <doc-alert title="审批通过、不通过、驳回" url="https://doc.iocoder.cn/bpm/task-todo-done/" />
-  <doc-alert title="审批加签、减签" url="https://doc.iocoder.cn/bpm/sign/" />
-  <doc-alert
-    title="审批转办、委派、抄送"
-    url="https://doc.iocoder.cn/bpm/task-delegation-and-cc/"
-  />
-  <doc-alert title="审批加签、减签" url="https://doc.iocoder.cn/bpm/sign/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 6 - 3
src/views/bpm/task/manager/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="工作流手册" url="https://doc.iocoder.cn/bpm/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form
@@ -87,7 +85,12 @@
           {{ formatPast2(scope.row.durationInMillis) }}
         </template>
       </el-table-column>
-      <el-table-column align="center" label="流程编号" prop="processInstanceId" :show-overflow-tooltip="true" />
+      <el-table-column
+        align="center"
+        label="流程编号"
+        prop="processInstanceId"
+        :show-overflow-tooltip="true"
+      />
       <el-table-column align="center" label="任务编号" prop="id" :show-overflow-tooltip="true" />
       <el-table-column align="center" label="操作" fixed="right" width="80">
         <template #default="scope">

+ 0 - 8
src/views/bpm/task/todo/index.vue

@@ -1,12 +1,4 @@
 <template>
-  <doc-alert title="审批通过、不通过、驳回" url="https://doc.iocoder.cn/bpm/task-todo-done/" />
-  <doc-alert title="审批加签、减签" url="https://doc.iocoder.cn/bpm/sign/" />
-  <doc-alert
-    title="审批转办、委派、抄送"
-    url="https://doc.iocoder.cn/bpm/task-delegation-and-cc/"
-  />
-  <doc-alert title="审批加签、减签" url="https://doc.iocoder.cn/bpm/sign/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 2
src/views/infra/apiAccessLog/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="系统日志" url="https://doc.iocoder.cn/system-log/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 2
src/views/infra/apiErrorLog/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="系统日志" url="https://doc.iocoder.cn/system-log/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 5
src/views/infra/codegen/index.vue

@@ -1,9 +1,4 @@
 <template>
-  <doc-alert title="代码生成(单表)" url="https://doc.iocoder.cn/new-feature/" />
-  <doc-alert title="代码生成(树表)" url="https://doc.iocoder.cn/new-feature/tree/" />
-  <doc-alert title="代码生成(主子表)" url="https://doc.iocoder.cn/new-feature/master-sub/" />
-  <doc-alert title="单元测试" url="https://doc.iocoder.cn/unit-test/" />
-
   <!-- 搜索 -->
   <ContentWrap>
     <el-form

+ 0 - 2
src/views/infra/config/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="配置中心" url="https://doc.iocoder.cn/config-center/" />
-
   <!-- 搜索 -->
   <ContentWrap>
     <el-form

+ 0 - 2
src/views/infra/demo/demo02/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="代码生成(树表)" url="https://doc.iocoder.cn/new-feature/tree/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 3
src/views/infra/druid/index.vue

@@ -1,7 +1,4 @@
 <template>
-  <doc-alert title="数据库 MyBatis" url="https://doc.iocoder.cn/mybatis/" />
-  <doc-alert title="多数据源(读写分离)" url="https://doc.iocoder.cn/dynamic-datasource/" />
-
   <ContentWrap :bodyStyle="{ padding: '0px' }" class="!mb-0">
     <IFrame v-if="!loading" v-loading="loading" :src="url" />
   </ContentWrap>

+ 0 - 1
src/views/infra/file/index.vue

@@ -1,5 +1,4 @@
 <template>
-  <doc-alert title="上传下载" url="https://doc.iocoder.cn/file/" />
   <!-- 搜索 -->
   <ContentWrap>
     <el-form

+ 0 - 2
src/views/infra/fileConfig/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="上传下载" url="https://doc.iocoder.cn/file/" />
-
   <!-- 搜索 -->
   <ContentWrap>
     <el-form

+ 0 - 4
src/views/infra/job/index.vue

@@ -1,8 +1,4 @@
 <template>
-  <doc-alert title="定时任务" url="https://doc.iocoder.cn/job/" />
-  <doc-alert title="异步任务" url="https://doc.iocoder.cn/async-task/" />
-  <doc-alert title="消息队列" url="https://doc.iocoder.cn/message-queue/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 4
src/views/infra/job/logger/index.vue

@@ -1,8 +1,4 @@
 <template>
-  <doc-alert title="定时任务" url="https://doc.iocoder.cn/job/" />
-  <doc-alert title="异步任务" url="https://doc.iocoder.cn/async-task/" />
-  <doc-alert title="消息队列" url="https://doc.iocoder.cn/message-queue/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 3
src/views/infra/redis/index.vue

@@ -1,7 +1,4 @@
 <template>
-  <doc-alert title="Redis 缓存" url="https://doc.iocoder.cn/redis-cache/" />
-  <doc-alert title="本地缓存" url="https://doc.iocoder.cn/local-cache/" />
-
   <el-scrollbar height="calc(100vh - 88px - 40px - 50px)">
     <el-row>
       <!-- 基本信息 -->

+ 0 - 2
src/views/infra/server/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="服务监控" url="https://doc.iocoder.cn/server-monitor/" />
-
   <ContentWrap :bodyStyle="{ padding: '0px' }" class="!mb-0">
     <IFrame v-if="!loading" v-loading="loading" :src="src" />
   </ContentWrap>

+ 0 - 2
src/views/infra/skywalking/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="服务监控" url="https://doc.iocoder.cn/server-monitor/" />
-
   <ContentWrap :bodyStyle="{ padding: '0px' }" class="!mb-0">
     <IFrame v-if="!loading" v-loading="loading" :src="src" />
   </ContentWrap>

+ 0 - 2
src/views/infra/swagger/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="接口文档" url="https://doc.iocoder.cn/api-doc/" />
-
   <ContentWrap :bodyStyle="{ padding: '0px' }" class="!mb-0">
     <IFrame v-if="!loading" v-loading="loading" :src="src" />
   </ContentWrap>

+ 0 - 2
src/views/infra/webSocket/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="WebSocket 实时通信" url="https://doc.iocoder.cn/websocket/" />
-
   <div class="flex">
     <!-- 左侧:建立连接、发送消息 -->
     <el-card :gutter="12" class="w-1/2" shadow="always">

+ 0 - 2
src/views/mp/account/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="公众号接入" url="https://doc.iocoder.cn/mp/account/" />
-
   <!-- 搜索工作栏 -->
   <ContentWrap>
     <el-form

+ 0 - 2
src/views/mp/autoReply/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="自动回复" url="https://doc.iocoder.cn/mp/auto-reply/" />
-
   <!-- 搜索工作栏 -->
   <ContentWrap>
     <el-form class="-mb-15px" :model="queryParams" :inline="true" label-width="68px">

+ 0 - 2
src/views/mp/draft/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="公众号图文" url="https://doc.iocoder.cn/mp/article/" />
-
   <!-- 搜索工作栏 -->
   <ContentWrap>
     <el-form

+ 0 - 2
src/views/mp/freePublish/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="公众号图文" url="https://doc.iocoder.cn/mp/article/" />
-
   <!-- 搜索工作栏 -->
   <ContentWrap>
     <el-form

+ 0 - 1
src/views/mp/material/index.vue

@@ -1,5 +1,4 @@
 <template>
-  <doc-alert title="公众号素材" url="https://doc.iocoder.cn/mp/material/" />
   <!-- 搜索工作栏 -->
   <ContentWrap>
     <el-form class="-mb-15px" :inline="true" label-width="68px">

+ 0 - 1
src/views/mp/menu/index.vue

@@ -1,5 +1,4 @@
 <template>
-  <doc-alert title="公众号菜单" url="https://doc.iocoder.cn/mp/menu/" />
   <!-- 搜索工作栏 -->
   <ContentWrap>
     <el-form class="-mb-15px" ref="queryFormRef" :inline="true" label-width="68px">

+ 0 - 2
src/views/mp/messageTemplate/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="模版消息" url="https://doc.iocoder.cn/mp/message-template/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 2
src/views/mp/tag/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="公众号标签" url="https://doc.iocoder.cn/mp/tag/" />
-
   <!-- 搜索工作栏 -->
   <ContentWrap>
     <el-form

+ 16 - 15
src/views/mp/user/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="公众号粉丝" url="https://doc.iocoder.cn/mp/user/" />
-
   <!-- 搜索工作栏 -->
   <ContentWrap>
     <el-form
@@ -50,12 +48,12 @@
   <!-- 列表 -->
   <ContentWrap>
     <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" v-if="isDialog"/>
+      <el-table-column type="selection" width="55" v-if="isDialog" />
       <el-table-column label="编号" align="center" prop="id" />
       <el-table-column label="用户标识" align="center" prop="openid" width="260" />
       <el-table-column label="用户头像" min-width="80px" prop="headImageUrl">
         <template #default="scope">
-          <el-avatar :src="scope.row.headImageUrl"/>
+          <el-avatar :src="scope.row.headImageUrl" />
         </template>
       </el-table-column>
       <el-table-column label="昵称" align="center" prop="nickname" />
@@ -106,13 +104,13 @@
   <UserForm ref="formRef" @success="getList" />
 </template>
 <script lang="ts" setup>
-import {dateFormatter} from '@/utils/formatTime'
+import { dateFormatter } from '@/utils/formatTime'
 import * as MpUserApi from '@/api/mp/user'
 import * as MpTagApi from '@/api/mp/tag'
 import WxAccountSelect from '@/views/mp/components/wx-account-select'
-import type {FormInstance} from 'element-plus'
+import type { FormInstance } from 'element-plus'
 import UserForm from './UserForm.vue'
-import {ref} from "vue";
+import { ref } from 'vue'
 
 defineOptions({ name: 'MpUser' })
 
@@ -159,7 +157,7 @@ const getList = async () => {
 const handleQuery = () => {
   queryParams.pageNo = 1
   getList()
-  if(isDialog.value){
+  if (isDialog.value) {
     emitChange()
   }
 }
@@ -194,21 +192,24 @@ defineExpose({
     onAccountChanged(accountId)
     isDialog.value = true
   }
-});
+})
 
 /** Emits*/
 interface Emits {
-  (e: 'change', data: {
-    multipleSelection: any[]
-    total: number
-    queryParams: object
-  }): void
+  (
+    e: 'change',
+    data: {
+      multipleSelection: any[]
+      total: number
+      queryParams: object
+    }
+  ): void
   // (e: 'select', user: any): void
   // (e: 'cancel'): void
 }
 const emit = defineEmits<Emits>()
 const emitChange = () => {
-  emit('change', {multipleSelection: multipleSelection.value, total: total.value, queryParams})
+  emit('change', { multipleSelection: multipleSelection.value, total: total.value, queryParams })
 }
 
 const handleSelectionChange = (val: any[]) => {

+ 0 - 2
src/views/system/area/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="地区 & IP" url="https://doc.iocoder.cn/area-and-ip/" />
-
   <!-- 操作栏 -->
   <ContentWrap>
     <el-button type="primary" plain @click="openForm()">

+ 0 - 2
src/views/system/loginlog/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="系统日志" url="https://doc.iocoder.cn/system-log/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 2
src/views/system/mail/account/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="邮件配置" url="https://doc.iocoder.cn/mail" />
-
   <ContentWrap>
     <el-form
       class="-mb-15px"

+ 0 - 2
src/views/system/mail/log/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="邮件配置" url="https://doc.iocoder.cn/mail" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 2
src/views/system/mail/template/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="邮件配置" url="https://doc.iocoder.cn/mail" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 3
src/views/system/menu/index.vue

@@ -1,7 +1,4 @@
 <template>
-  <doc-alert title="功能权限" url="https://doc.iocoder.cn/resource-permission" />
-  <doc-alert title="菜单路由" url="https://doc.iocoder.cn/vue3/route/" />
-
   <!-- 搜索工作栏 -->
   <ContentWrap>
     <el-form

+ 0 - 2
src/views/system/notify/message/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="站内信配置" url="https://doc.iocoder.cn/notify/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 2
src/views/system/notify/my/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="站内信配置" url="https://doc.iocoder.cn/notify/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 2
src/views/system/notify/template/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="站内信配置" url="https://doc.iocoder.cn/notify/" />
-
   <!-- 搜索工作栏 -->
   <ContentWrap>
     <el-form

+ 0 - 2
src/views/system/oauth2/client/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="OAuth 2.0(SSO 单点登录)" url="https://doc.iocoder.cn/oauth2/" />
-
   <!-- 搜索 -->
   <ContentWrap>
     <el-form

+ 0 - 2
src/views/system/oauth2/token/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="OAuth 2.0(SSO 单点登录)" url="https://doc.iocoder.cn/oauth2/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 2
src/views/system/operatelog/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="系统日志" url="https://doc.iocoder.cn/system-log/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 3
src/views/system/role/index.vue

@@ -1,7 +1,4 @@
 <template>
-  <doc-alert title="功能权限" url="https://doc.iocoder.cn/resource-permission" />
-  <doc-alert title="数据权限" url="https://doc.iocoder.cn/data-permission" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 2
src/views/system/sms/channel/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="短信配置" url="https://doc.iocoder.cn/sms/" />
-
   <ContentWrap>
     <el-form
       class="-mb-15px"

+ 0 - 2
src/views/system/sms/log/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="短信配置" url="https://doc.iocoder.cn/sms/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 2
src/views/system/sms/template/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="短信配置" url="https://doc.iocoder.cn/sms/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 2
src/views/system/social/client/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="三方登录" url="https://doc.iocoder.cn/social-user/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 2
src/views/system/social/user/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="三方登录" url="https://doc.iocoder.cn/social-user/" />
-
   <ContentWrap>
     <!-- 搜索工作栏 -->
     <el-form

+ 0 - 2
src/views/system/tenant/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="SaaS 多租户" url="https://doc.iocoder.cn/saas-tenant/" />
-
   <!-- 搜索 -->
   <ContentWrap>
     <el-form

+ 0 - 2
src/views/system/tenantPackage/index.vue

@@ -1,6 +1,4 @@
 <template>
-  <doc-alert title="SaaS 多租户" url="https://doc.iocoder.cn/saas-tenant/" />
-
   <!-- 搜索 -->
   <ContentWrap>
     <el-form

+ 0 - 4
src/views/system/user/index.vue

@@ -1,8 +1,4 @@
 <template>
-  <doc-alert title="用户体系" url="https://doc.iocoder.cn/user-center/" />
-  <doc-alert title="三方登陆" url="https://doc.iocoder.cn/social-user/" />
-  <doc-alert title="Excel 导入导出" url="https://doc.iocoder.cn/excel-import-and-export/" />
-
   <el-row :gutter="20">
     <!-- 左侧部门树 -->
     <el-col :span="4" :xs="24">