From 7092cd59d344414c2c798e493563d9b64bb3771d Mon Sep 17 00:00:00 2001
From: dap <15891557205@163.com>
Date: Mon, 9 Feb 2026 16:28:41 +0800
Subject: [PATCH] =?UTF-8?q?chore:=20=E7=A7=BB=E9=99=A4=20web-antdv-next=20?=
=?UTF-8?q?=E5=BA=94=E7=94=A8=E5=8F=8A=E7=9B=B8=E5=85=B3=E6=96=87=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
apps/web-antdv-next/.env | 8 -
apps/web-antdv-next/.env.analyze | 7 -
apps/web-antdv-next/.env.development | 16 -
apps/web-antdv-next/.env.production | 19 -
apps/web-antdv-next/index.html | 35 -
apps/web-antdv-next/package.json | 50 --
apps/web-antdv-next/postcss.config.mjs | 1 -
apps/web-antdv-next/public/favicon.ico | Bin 5430 -> 0 bytes
.../src/adapter/component/index.ts | 603 ------------------
apps/web-antdv-next/src/adapter/form.ts | 49 --
apps/web-antdv-next/src/adapter/vxe-table.ts | 70 --
apps/web-antdv-next/src/api/core/auth.ts | 51 --
apps/web-antdv-next/src/api/core/index.ts | 3 -
apps/web-antdv-next/src/api/core/menu.ts | 10 -
apps/web-antdv-next/src/api/core/user.ts | 10 -
apps/web-antdv-next/src/api/index.ts | 1 -
apps/web-antdv-next/src/api/request.ts | 113 ----
apps/web-antdv-next/src/app.vue | 39 --
apps/web-antdv-next/src/bootstrap.ts | 76 ---
apps/web-antdv-next/src/layouts/auth.vue | 25 -
apps/web-antdv-next/src/layouts/basic.vue | 206 ------
apps/web-antdv-next/src/layouts/index.ts | 6 -
apps/web-antdv-next/src/locales/README.md | 3 -
apps/web-antdv-next/src/locales/index.ts | 102 ---
.../src/locales/langs/en-US/demos.json | 14 -
.../src/locales/langs/en-US/page.json | 15 -
.../src/locales/langs/zh-CN/demos.json | 14 -
.../src/locales/langs/zh-CN/page.json | 15 -
apps/web-antdv-next/src/main.ts | 31 -
apps/web-antdv-next/src/preferences.ts | 13 -
apps/web-antdv-next/src/router/access.ts | 42 --
apps/web-antdv-next/src/router/guard.ts | 133 ----
apps/web-antdv-next/src/router/index.ts | 37 --
apps/web-antdv-next/src/router/routes/core.ts | 97 ---
.../web-antdv-next/src/router/routes/index.ts | 37 --
.../src/router/routes/modules/dashboard.ts | 38 --
.../src/router/routes/modules/demos.ts | 28 -
.../src/router/routes/modules/vben.ts | 116 ----
apps/web-antdv-next/src/store/auth.ts | 118 ----
apps/web-antdv-next/src/store/index.ts | 1 -
apps/web-antdv-next/src/views/_core/README.md | 3 -
.../src/views/_core/about/index.vue | 9 -
.../views/_core/authentication/code-login.vue | 69 --
.../_core/authentication/forget-password.vue | 43 --
.../src/views/_core/authentication/login.vue | 98 ---
.../_core/authentication/qrcode-login.vue | 10 -
.../views/_core/authentication/register.vue | 96 ---
.../src/views/_core/fallback/coming-soon.vue | 7 -
.../src/views/_core/fallback/forbidden.vue | 9 -
.../views/_core/fallback/internal-error.vue | 9 -
.../src/views/_core/fallback/not-found.vue | 9 -
.../src/views/_core/fallback/offline.vue | 9 -
.../src/views/_core/profile/base-setting.vue | 65 --
.../src/views/_core/profile/index.vue | 49 --
.../_core/profile/notification-setting.vue | 31 -
.../views/_core/profile/password-setting.vue | 63 --
.../views/_core/profile/security-setting.vue | 43 --
.../dashboard/analytics/analytics-trends.vue | 98 ---
.../analytics/analytics-visits-data.vue | 82 ---
.../analytics/analytics-visits-sales.vue | 46 --
.../analytics/analytics-visits-source.vue | 65 --
.../dashboard/analytics/analytics-visits.vue | 55 --
.../src/views/dashboard/analytics/index.vue | 90 ---
.../src/views/dashboard/workspace/index.vue | 266 --------
.../src/views/demos/antd/index.vue | 66 --
apps/web-antdv-next/tailwind.config.mjs | 1 -
apps/web-antdv-next/tsconfig.json | 12 -
apps/web-antdv-next/tsconfig.node.json | 10 -
apps/web-antdv-next/vite.config.mts | 20 -
69 files changed, 3685 deletions(-)
delete mode 100644 apps/web-antdv-next/.env
delete mode 100644 apps/web-antdv-next/.env.analyze
delete mode 100644 apps/web-antdv-next/.env.development
delete mode 100644 apps/web-antdv-next/.env.production
delete mode 100644 apps/web-antdv-next/index.html
delete mode 100644 apps/web-antdv-next/package.json
delete mode 100644 apps/web-antdv-next/postcss.config.mjs
delete mode 100644 apps/web-antdv-next/public/favicon.ico
delete mode 100644 apps/web-antdv-next/src/adapter/component/index.ts
delete mode 100644 apps/web-antdv-next/src/adapter/form.ts
delete mode 100644 apps/web-antdv-next/src/adapter/vxe-table.ts
delete mode 100644 apps/web-antdv-next/src/api/core/auth.ts
delete mode 100644 apps/web-antdv-next/src/api/core/index.ts
delete mode 100644 apps/web-antdv-next/src/api/core/menu.ts
delete mode 100644 apps/web-antdv-next/src/api/core/user.ts
delete mode 100644 apps/web-antdv-next/src/api/index.ts
delete mode 100644 apps/web-antdv-next/src/api/request.ts
delete mode 100644 apps/web-antdv-next/src/app.vue
delete mode 100644 apps/web-antdv-next/src/bootstrap.ts
delete mode 100644 apps/web-antdv-next/src/layouts/auth.vue
delete mode 100644 apps/web-antdv-next/src/layouts/basic.vue
delete mode 100644 apps/web-antdv-next/src/layouts/index.ts
delete mode 100644 apps/web-antdv-next/src/locales/README.md
delete mode 100644 apps/web-antdv-next/src/locales/index.ts
delete mode 100644 apps/web-antdv-next/src/locales/langs/en-US/demos.json
delete mode 100644 apps/web-antdv-next/src/locales/langs/en-US/page.json
delete mode 100644 apps/web-antdv-next/src/locales/langs/zh-CN/demos.json
delete mode 100644 apps/web-antdv-next/src/locales/langs/zh-CN/page.json
delete mode 100644 apps/web-antdv-next/src/main.ts
delete mode 100644 apps/web-antdv-next/src/preferences.ts
delete mode 100644 apps/web-antdv-next/src/router/access.ts
delete mode 100644 apps/web-antdv-next/src/router/guard.ts
delete mode 100644 apps/web-antdv-next/src/router/index.ts
delete mode 100644 apps/web-antdv-next/src/router/routes/core.ts
delete mode 100644 apps/web-antdv-next/src/router/routes/index.ts
delete mode 100644 apps/web-antdv-next/src/router/routes/modules/dashboard.ts
delete mode 100644 apps/web-antdv-next/src/router/routes/modules/demos.ts
delete mode 100644 apps/web-antdv-next/src/router/routes/modules/vben.ts
delete mode 100644 apps/web-antdv-next/src/store/auth.ts
delete mode 100644 apps/web-antdv-next/src/store/index.ts
delete mode 100644 apps/web-antdv-next/src/views/_core/README.md
delete mode 100644 apps/web-antdv-next/src/views/_core/about/index.vue
delete mode 100644 apps/web-antdv-next/src/views/_core/authentication/code-login.vue
delete mode 100644 apps/web-antdv-next/src/views/_core/authentication/forget-password.vue
delete mode 100644 apps/web-antdv-next/src/views/_core/authentication/login.vue
delete mode 100644 apps/web-antdv-next/src/views/_core/authentication/qrcode-login.vue
delete mode 100644 apps/web-antdv-next/src/views/_core/authentication/register.vue
delete mode 100644 apps/web-antdv-next/src/views/_core/fallback/coming-soon.vue
delete mode 100644 apps/web-antdv-next/src/views/_core/fallback/forbidden.vue
delete mode 100644 apps/web-antdv-next/src/views/_core/fallback/internal-error.vue
delete mode 100644 apps/web-antdv-next/src/views/_core/fallback/not-found.vue
delete mode 100644 apps/web-antdv-next/src/views/_core/fallback/offline.vue
delete mode 100644 apps/web-antdv-next/src/views/_core/profile/base-setting.vue
delete mode 100644 apps/web-antdv-next/src/views/_core/profile/index.vue
delete mode 100644 apps/web-antdv-next/src/views/_core/profile/notification-setting.vue
delete mode 100644 apps/web-antdv-next/src/views/_core/profile/password-setting.vue
delete mode 100644 apps/web-antdv-next/src/views/_core/profile/security-setting.vue
delete mode 100644 apps/web-antdv-next/src/views/dashboard/analytics/analytics-trends.vue
delete mode 100644 apps/web-antdv-next/src/views/dashboard/analytics/analytics-visits-data.vue
delete mode 100644 apps/web-antdv-next/src/views/dashboard/analytics/analytics-visits-sales.vue
delete mode 100644 apps/web-antdv-next/src/views/dashboard/analytics/analytics-visits-source.vue
delete mode 100644 apps/web-antdv-next/src/views/dashboard/analytics/analytics-visits.vue
delete mode 100644 apps/web-antdv-next/src/views/dashboard/analytics/index.vue
delete mode 100644 apps/web-antdv-next/src/views/dashboard/workspace/index.vue
delete mode 100644 apps/web-antdv-next/src/views/demos/antd/index.vue
delete mode 100644 apps/web-antdv-next/tailwind.config.mjs
delete mode 100644 apps/web-antdv-next/tsconfig.json
delete mode 100644 apps/web-antdv-next/tsconfig.node.json
delete mode 100644 apps/web-antdv-next/vite.config.mts
diff --git a/apps/web-antdv-next/.env b/apps/web-antdv-next/.env
deleted file mode 100644
index 40b046d2..00000000
--- a/apps/web-antdv-next/.env
+++ /dev/null
@@ -1,8 +0,0 @@
-# 应用标题
-VITE_APP_TITLE=Vben Admin Antdv Next
-
-# 应用命名空间,用于缓存、store等功能的前缀,确保隔离
-VITE_APP_NAMESPACE=vben-web-antdv-next
-
-# 对store进行加密的密钥,在将store持久化到localStorage时会使用该密钥进行加密
-VITE_APP_STORE_SECURE_KEY=please-replace-me-with-your-own-key
diff --git a/apps/web-antdv-next/.env.analyze b/apps/web-antdv-next/.env.analyze
deleted file mode 100644
index ffafa8dd..00000000
--- a/apps/web-antdv-next/.env.analyze
+++ /dev/null
@@ -1,7 +0,0 @@
-# public path
-VITE_BASE=/
-
-# Basic interface address SPA
-VITE_GLOB_API_URL=/api
-
-VITE_VISUALIZER=true
diff --git a/apps/web-antdv-next/.env.development b/apps/web-antdv-next/.env.development
deleted file mode 100644
index f2b44428..00000000
--- a/apps/web-antdv-next/.env.development
+++ /dev/null
@@ -1,16 +0,0 @@
-# 端口号
-VITE_PORT=5999
-
-VITE_BASE=/
-
-# 接口地址
-VITE_GLOB_API_URL=/api
-
-# 是否开启 Nitro Mock服务,true 为开启,false 为关闭
-VITE_NITRO_MOCK=true
-
-# 是否打开 devtools,true 为打开,false 为关闭
-VITE_DEVTOOLS=false
-
-# 是否注入全局loading
-VITE_INJECT_APP_LOADING=true
diff --git a/apps/web-antdv-next/.env.production b/apps/web-antdv-next/.env.production
deleted file mode 100644
index 5375847a..00000000
--- a/apps/web-antdv-next/.env.production
+++ /dev/null
@@ -1,19 +0,0 @@
-VITE_BASE=/
-
-# 接口地址
-VITE_GLOB_API_URL=https://mock-napi.vben.pro/api
-
-# 是否开启压缩,可以设置为 none, brotli, gzip
-VITE_COMPRESS=none
-
-# 是否开启 PWA
-VITE_PWA=false
-
-# vue-router 的模式
-VITE_ROUTER_HISTORY=hash
-
-# 是否注入全局loading
-VITE_INJECT_APP_LOADING=true
-
-# 打包后是否生成dist.zip
-VITE_ARCHIVER=true
diff --git a/apps/web-antdv-next/index.html b/apps/web-antdv-next/index.html
deleted file mode 100644
index 480eb84d..00000000
--- a/apps/web-antdv-next/index.html
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- <%= VITE_APP_TITLE %>
-
-
-
-
-
-
-
-
diff --git a/apps/web-antdv-next/package.json b/apps/web-antdv-next/package.json
deleted file mode 100644
index 704cef04..00000000
--- a/apps/web-antdv-next/package.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "name": "@vben/web-antdv-next",
- "version": "5.6.0",
- "homepage": "https://vben.pro",
- "bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
- "repository": {
- "type": "git",
- "url": "git+https://github.com/vbenjs/vue-vben-admin.git",
- "directory": "apps/web-antdv-next"
- },
- "license": "MIT",
- "author": {
- "name": "vben",
- "email": "ann.vben@gmail.com",
- "url": "https://github.com/anncwb"
- },
- "type": "module",
- "scripts": {
- "build": "pnpm vite build --mode production",
- "build:analyze": "pnpm vite build --mode analyze",
- "dev": "pnpm vite --mode development",
- "preview": "vite preview",
- "typecheck": "vue-tsc --noEmit --skipLibCheck"
- },
- "imports": {
- "#/*": "./src/*"
- },
- "dependencies": {
- "@vben/access": "workspace:*",
- "@vben/common-ui": "workspace:*",
- "@vben/constants": "workspace:*",
- "@vben/hooks": "workspace:*",
- "@vben/icons": "workspace:*",
- "@vben/layouts": "workspace:*",
- "@vben/locales": "workspace:*",
- "@vben/plugins": "workspace:*",
- "@vben/preferences": "workspace:*",
- "@vben/request": "workspace:*",
- "@vben/stores": "workspace:*",
- "@vben/styles": "workspace:*",
- "@vben/types": "workspace:*",
- "@vben/utils": "workspace:*",
- "@vueuse/core": "catalog:",
- "antdv-next": "catalog:",
- "dayjs": "catalog:",
- "pinia": "catalog:",
- "vue": "catalog:",
- "vue-router": "catalog:"
- }
-}
diff --git a/apps/web-antdv-next/postcss.config.mjs b/apps/web-antdv-next/postcss.config.mjs
deleted file mode 100644
index 3d807045..00000000
--- a/apps/web-antdv-next/postcss.config.mjs
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from '@vben/tailwind-config/postcss';
diff --git a/apps/web-antdv-next/public/favicon.ico b/apps/web-antdv-next/public/favicon.ico
deleted file mode 100644
index fcf9818e2cf855039b272bdbfbb202d3ff3fa159..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 5430
zcmbtY33L=y7JY$12T+8gBk14=GU5gfn~Es=nm`C4AtVq2WF`B)l8}u>kcfdG`xZh7
z1QH@k!WNbQA}Y8rB4pn?Rn^_qRo&T0_nY^tI}C`PBiiTO^QwMT{dfQSKkwZa04wMM
zy?X=M0kG_E0D}QwzyR}o4vl|CV{g(JUD6xoaWVij{_9_Z+hnMBoj6eCWqqZ|bDG3?
zP1V)7jjOBM^TxNWH(wK5z8fU#uMgCSB?DD--$H2RPrcYwmDwZk?iT=9oB(QH+axi3
z9?DS*P#;M)Y%a>#V-YKdAXdDsz*NrcJ2dtV8t=Z2nsdGH*5&qiyUE>Vm@dqrLZt6>
z(Th+Yvk>*s^HEHlg>AP+S>_mmri!6xDj#NlJ7oxWQ{b1Xzn%o3F2
zJy4EYjGB~r*z(;Z#Hz7qs`{9|A<#8ejX|uNj3&YMhCXf82Xb<7t(@Sce5a-F#rS2Y
zPw=KW-BEkM4vp1Q(NsN!FqN*!*3f;EooLj|vHO`eL|&WtiJTISa&ibti29;|D&^HFD6dLJF=aUl
zQK_g7S%X4w3TiekkUA=zPMK5-kDF8rPMA1{9Ua2-!AA8AkaE6;=1?EdZ_7=RH)f)o
zz6YhW?I?uqK+bnR@_w194oGPgLT0)mW_M}f{ky5|&9E|QX9CL8LEd)~4EqY9IqS?o
z{kEgO$QcJ|@3tc!kcFIoHX)1V*p0kb)a5#dX?;}TF3?iv0EkJTD|G@qe-~Pce+GHo
zUNGz}jFvZLqdGDZxqw5+`{xi25@;Up%^i&{5ngJKR4B7`edHK7AGr+82hKvv;WMv@
zYYyG!LyjO9l#6`eVdBv_&jI9pw_i|sXY^1l+y2P+cXkv&)3*J<2c8E_(&=zM;!EU0
z@{kKYf_xCoLGuVSpE^80voR>Un<^;hk?+}!ZdX2t>o0=%S;@=7@}lqg@B-vQ^J$Kw
z$kRMRNM0isbo4zwI1l*X$GyH9LO9vCUO3gaUR~I)UQ^VszB=pq
zJ72ARzCd00QaRnLwP*Ti2{J*f&gxTfBdPm^TdR65(H6Yc<=&PT;fM6WaKmm2a4u7z
zY0)I8b)GPl_qG;vVa_N8*`pjZ+l*jlZISnwfl
zwR4>1*Y=-YMWLuCHstj@R+ZJSN6o<(K)=KqG#)n4uxOg27&xazjC4dT`IKUoTJp9N
z>Z6DU%ij@>sEM{gL&=Bc{L6Cp!%%!u97-9Vcg-A>{BGewG17na4{SQ#y`>@VSqJV!
zcc^fj1ovi-e@^h8bzUMLBKgvWJD@glA>~?k%K0vo`<)5%mHaPJ4dFIT#QUX`ua$K_
zv`!@kR1+xvrt;y$@z-$}g2rF|jbd>xY&y~NLfzpPo|paXq0w!|VqJ(syG(v`(M}c)
z^C(YyQq5S5hFBLgC>)$ACQisl+Msy;Bg*%~&Gm=YYGUiHG=tS7V<~&aI8v>n*qgzw
zhhqDW|3clxUTvDQeS)f;roW`|oBNea>y*ilMC(*IP%N}m_vCnQ;y|^Jp0PN{>^bdE
zL)sKg8Kh+_=+ri~?4IeHdE|Qz-@)6CF{)<)
zjs-BRjtBk54es*F==&1+kV)$>F7gULf-mibH*%4rpOQ!mtq3B}^A+qlAw8#G}T>Y-?wcHN#jlo%oSHYH%Rm4ro+cZ_?b3=+aWV5Y&5fK;E$%$f_)8BCDP)cJNdD
z5dR5M*#fwd?XFZ~Zg(zdGj@V{^PXPPhOKAhPts6cvkv9eYc2Rhv0`cpHiRc5w`?T^8l1Q&Crn*oxsRVg_ar{VE#)>+#dL67hLvPFyvkW!mt=0{?cCmWIH@mr+o(*k>E2{86CkHbRwjbs_
z;eGcaw{!*8Il9N8dkTDGI}Ok+=`mlwH&Byx8Vtv-fuZ&9*o3w*^g`-N}!37fsOYgx4us+7ZgITsO%AU}9@c0~6uE~i8yCA6W+4Kb70q*X~
z1AYEAXs;5x${9Jk)G_2cgnE{cP7c&Z5fA?1UP|ew%;$pjW$KWFCzc8j?yl(;c%DQUTT-YW=pQN6P`YqPGu^v$A11)>exgV^rWIbW%QR)c`>QsTb
zBe+27tpc;3*gyL~x0Us6C9H27sZKoG$VZs_K92Q$ojlmNVC%O)pq^6AVikBK30GD_
zMZkWz8Mfn3`Trp!2gH5Xq1C9d64zZy7vc&@^BhNW56d_Z=v?p=3wAyk1d0(Kly|Gn
zJG*~_Zw}N39{f|jJ3rFxybe;vRgkt^8=^@)U&}|GR5-Byw=)jB5)0x%RtPO import('antdv-next/dist/auto-complete/index'),
-);
-const Button = defineAsyncComponent(
- () => import('antdv-next/dist/button/index'),
-);
-const Checkbox = defineAsyncComponent(
- () => import('antdv-next/dist/checkbox/index'),
-);
-const CheckboxGroup = defineAsyncComponent(
- () => import('antdv-next/dist/checkbox/Group'),
-);
-const DatePicker = defineAsyncComponent(
- () => import('antdv-next/dist/date-picker/index'),
-);
-const Divider = defineAsyncComponent(
- () => import('antdv-next/dist/divider/index'),
-);
-const Input = defineAsyncComponent(() => import('antdv-next/dist/input/index'));
-const InputNumber = defineAsyncComponent(
- () => import('antdv-next/dist/input-number/index'),
-);
-const InputPassword = defineAsyncComponent(() =>
- import('antdv-next/dist/input/index').then((res) => res.InputPassword),
-);
-const Mentions = defineAsyncComponent(
- () => import('antdv-next/dist/mentions/index'),
-);
-const Radio = defineAsyncComponent(() => import('antdv-next/dist/radio/index'));
-const RadioGroup = defineAsyncComponent(() =>
- import('antdv-next/dist/radio/index').then((res) => res.RadioGroup),
-);
-const RangePicker = defineAsyncComponent(() =>
- import('antdv-next/dist/date-picker/index').then(
- (res) => res.DateRangePicker,
- ),
-);
-const Rate = defineAsyncComponent(() => import('antdv-next/dist/rate/index'));
-const Select = defineAsyncComponent(
- () => import('antdv-next/dist/select/index'),
-);
-const Space = defineAsyncComponent(() => import('antdv-next/dist/space/index'));
-const Switch = defineAsyncComponent(
- () => import('antdv-next/dist/switch/index'),
-);
-const Textarea = defineAsyncComponent(
- () => import('antdv-next/dist/input/TextArea'),
-);
-const TimePicker = defineAsyncComponent(
- () => import('antdv-next/dist/time-picker/index'),
-);
-const TreeSelect = defineAsyncComponent(
- () => import('antdv-next/dist/tree-select/index'),
-);
-const Cascader = defineAsyncComponent(
- () => import('antdv-next/dist/cascader/index'),
-);
-const Upload = defineAsyncComponent(
- () => import('antdv-next/dist/upload/index'),
-);
-const Image = defineAsyncComponent(() => import('antdv-next/dist/image/index'));
-const PreviewGroup = defineAsyncComponent(() =>
- import('antdv-next/dist/image/index').then((res) => res.ImagePreviewGroup),
-);
-
-const withDefaultPlaceholder = (
- component: T,
- type: 'input' | 'select',
- componentProps: Recordable = {},
-) => {
- return defineComponent({
- name: component.name,
- inheritAttrs: false,
- setup: (props: any, { attrs, expose, slots }) => {
- const placeholder =
- props?.placeholder ||
- attrs?.placeholder ||
- $t(`ui.placeholder.${type}`);
- // 透传组件暴露的方法
- const innerRef = ref();
- expose(
- new Proxy(
- {},
- {
- get: (_target, key) => innerRef.value?.[key],
- has: (_target, key) => key in (innerRef.value || {}),
- },
- ),
- );
- return () =>
- h(
- component,
- { ...componentProps, placeholder, ...props, ...attrs, ref: innerRef },
- slots,
- );
- },
- });
-};
-
-const withPreviewUpload = () => {
- // 检查是否为图片文件的辅助函数
- const isImageFile = (file: UploadFile): boolean => {
- const imageExtensions = new Set([
- 'bmp',
- 'gif',
- 'jpeg',
- 'jpg',
- 'png',
- 'svg',
- 'webp',
- ]);
- if (file.url) {
- try {
- const pathname = new URL(file.url, 'http://localhost').pathname;
- const ext = pathname.split('.').pop()?.toLowerCase();
- return ext ? imageExtensions.has(ext) : false;
- } catch {
- const ext = file.url?.split('.').pop()?.toLowerCase();
- return ext ? imageExtensions.has(ext) : false;
- }
- }
- if (!file.type) {
- const ext = file.name?.split('.').pop()?.toLowerCase();
- return ext ? imageExtensions.has(ext) : false;
- }
- return file.type.startsWith('image/');
- };
- // 创建默认的上传按钮插槽
- const createDefaultSlotsWithUpload = (
- listType: string,
- placeholder: string,
- ) => {
- switch (listType) {
- case 'picture-card': {
- return {
- default: () => placeholder,
- };
- }
- default: {
- return {
- default: () =>
- h(
- Button,
- {
- icon: h(IconifyIcon, {
- icon: 'ant-design:upload-outlined',
- class: 'mb-1 size-4',
- }),
- },
- () => placeholder,
- ),
- };
- }
- }
- };
- // 构建预览图片组
- const previewImage = async (
- file: UploadFile,
- visible: Ref,
- fileList: Ref,
- ) => {
- // 如果当前文件不是图片,直接打开
- if (!isImageFile(file)) {
- if (file.url) {
- window.open(file.url, '_blank');
- } else if (file.preview) {
- window.open(file.preview, '_blank');
- } else {
- message.error($t('ui.formRules.previewWarning'));
- }
- return;
- }
-
- // 对于图片文件,继续使用预览组
- const [ImageComponent, PreviewGroupComponent] = await Promise.all([
- Image,
- PreviewGroup,
- ]);
-
- const getBase64 = (file: File) => {
- return new Promise((resolve, reject) => {
- const reader = new FileReader();
- reader.readAsDataURL(file);
- reader.addEventListener('load', () => resolve(reader.result));
- reader.addEventListener('error', (error) => reject(error));
- });
- };
- // 从fileList中过滤出所有图片文件
- const imageFiles = (unref(fileList) || []).filter((element) =>
- isImageFile(element),
- );
-
- // 为所有没有预览地址的图片生成预览
- for (const imgFile of imageFiles) {
- if (!imgFile.url && !imgFile.preview && imgFile.originFileObj) {
- imgFile.preview = (await getBase64(imgFile.originFileObj)) as string;
- }
- }
- const container: HTMLElement | null = document.createElement('div');
- document.body.append(container);
-
- // 用于追踪组件是否已卸载
- let isUnmounted = false;
-
- const PreviewWrapper = {
- setup() {
- return () => {
- if (isUnmounted) return null;
- return h(
- PreviewGroupComponent,
- {
- class: 'hidden',
- preview: {
- open: visible.value,
- // 设置初始显示的图片索引
- current: imageFiles.findIndex((f) => f.uid === file.uid),
- onOpenChange: (value: boolean) => {
- visible.value = value;
- if (!value) {
- // 延迟清理,确保动画完成
- setTimeout(() => {
- if (!isUnmounted && container) {
- isUnmounted = true;
- render(null, container);
- container.remove();
- }
- }, 300);
- }
- },
- },
- },
- () =>
- // 渲染所有图片文件
- imageFiles.map((imgFile) =>
- h(ImageComponent, {
- key: imgFile.uid,
- src: imgFile.url || imgFile.preview,
- }),
- ),
- );
- };
- },
- };
-
- render(h(PreviewWrapper), container);
- };
-
- // 图片裁剪操作
- const cropImage = (file: File, aspectRatio: string | undefined) => {
- return new Promise((resolve, reject) => {
- const container: HTMLElement | null = document.createElement('div');
- document.body.append(container);
-
- // 用于追踪组件是否已卸载
- let isUnmounted = false;
- let objectUrl: null | string = null;
-
- const open = ref(true);
- const cropperRef = ref | null>(null);
-
- const closeModal = () => {
- open.value = false;
- // 延迟清理,确保动画完成
- setTimeout(() => {
- if (!isUnmounted && container) {
- if (objectUrl) {
- URL.revokeObjectURL(objectUrl);
- }
- isUnmounted = true;
- render(null, container);
- container.remove();
- }
- }, 300);
- };
-
- const CropperWrapper = {
- setup() {
- return () => {
- if (isUnmounted) return null;
- if (!objectUrl) {
- objectUrl = URL.createObjectURL(file);
- }
- return h(
- Modal,
- {
- open: open.value,
- title: h('div', {}, [
- $t('ui.crop.title'),
- h(
- 'span',
- {
- class: `${aspectRatio ? '' : 'hidden'} ml-2 text-sm text-gray-400 font-normal`,
- },
- $t('ui.crop.titleTip', [aspectRatio]),
- ),
- ]),
- centered: true,
- width: 548,
- keyboard: false,
- maskClosable: false,
- closable: false,
- cancelText: $t('common.cancel'),
- okText: $t('ui.crop.confirm'),
- destroyOnHidden: true,
- onOk: async () => {
- const cropper = cropperRef.value;
- if (!cropper) {
- reject(new Error('Cropper not found'));
- closeModal();
- return;
- }
- try {
- const dataUrl = await cropper.getCropImage();
- resolve(dataUrl);
- } catch {
- reject(new Error($t('ui.crop.errorTip')));
- } finally {
- closeModal();
- }
- },
- onCancel() {
- resolve('');
- closeModal();
- },
- },
- () =>
- h(VCropper, {
- ref: (ref: any) => (cropperRef.value = ref),
- img: objectUrl as string,
- aspectRatio,
- }),
- );
- };
- },
- };
-
- render(h(CropperWrapper), container);
- });
- };
-
- return defineComponent({
- name: 'AUpload',
- emits: ['update:modelValue'],
- setup: (
- props: any,
- { attrs, slots, emit }: { attrs: any; emit: any; slots: any },
- ) => {
- const previewVisible = ref(false);
-
- const placeholder = attrs?.placeholder || $t(`ui.placeholder.upload`);
-
- const listType = attrs?.listType || attrs?.['list-type'] || 'text';
-
- const fileList = ref(
- attrs?.fileList || attrs?.['file-list'] || [],
- );
-
- const maxSize = computed(() => attrs?.maxSize ?? attrs?.['max-size']);
- const aspectRatio = computed(
- () => attrs?.aspectRatio ?? attrs?.['aspect-ratio'],
- );
-
- const handleBeforeUpload = async (
- file: UploadFile,
- originFileList: Array,
- ) => {
- if (maxSize.value && (file.size || 0) / 1024 / 1024 > maxSize.value) {
- message.error($t('ui.formRules.sizeLimit', [maxSize.value]));
- file.status = 'removed';
- return false;
- }
- // 多选或者非图片不唤起裁剪框
- if (
- attrs.crop &&
- !attrs.multiple &&
- originFileList[0] &&
- isImageFile(file)
- ) {
- file.status = 'removed';
- // antd Upload组件问题 file参数获取的是UploadFile类型对象无法取到File类型 所以通过originFileList[0]获取
- const blob = await cropImage(originFileList[0], aspectRatio.value);
- return new Promise((resolve, reject) => {
- if (!blob) {
- return reject(new Error($t('ui.crop.errorTip')));
- }
- resolve(blob);
- });
- }
-
- return attrs.beforeUpload?.(file) ?? true;
- };
-
- const handleChange = (event: UploadChangeParam) => {
- try {
- // 行内写法 handleChange: (event) => {}
- attrs.handleChange?.(event);
- // template写法 @handle-change="(event) => {}"
- attrs.onHandleChange?.(event);
- } catch (error) {
- // Avoid breaking internal v-model sync on user handler errors
- console.error(error);
- }
- fileList.value = event.fileList.filter(
- (file) => file.status !== 'removed',
- );
- emit(
- 'update:modelValue',
- event.fileList?.length ? fileList.value : undefined,
- );
- };
-
- const handlePreview = async (file: UploadFile) => {
- previewVisible.value = true;
- await previewImage(file, previewVisible, fileList);
- };
-
- const renderUploadButton = (): any => {
- const isDisabled = attrs.disabled;
-
- // 如果禁用,不渲染上传按钮
- if (isDisabled) {
- return null;
- }
-
- // 否则渲染默认上传按钮
- return isEmpty(slots)
- ? createDefaultSlotsWithUpload(listType, placeholder)
- : slots;
- };
-
- // 可以监听到表单API设置的值
- watch(
- () => attrs.modelValue,
- (res) => {
- fileList.value = res;
- },
- );
-
- return () =>
- h(
- Upload,
- {
- ...props,
- ...attrs,
- fileList: fileList.value,
- beforeUpload: handleBeforeUpload,
- onChange: handleChange,
- onPreview: handlePreview,
- },
- renderUploadButton(),
- );
- },
- });
-};
-
-// 这里需要自行根据业务组件库进行适配,需要用到的组件都需要在这里类型说明
-export type ComponentType =
- | 'ApiCascader'
- | 'ApiSelect'
- | 'ApiTreeSelect'
- | 'AutoComplete'
- | 'Cascader'
- | 'Checkbox'
- | 'CheckboxGroup'
- | 'DatePicker'
- | 'DefaultButton'
- | 'Divider'
- | 'IconPicker'
- | 'Input'
- | 'InputNumber'
- | 'InputPassword'
- | 'Mentions'
- | 'PrimaryButton'
- | 'Radio'
- | 'RadioGroup'
- | 'RangePicker'
- | 'Rate'
- | 'Select'
- | 'Space'
- | 'Switch'
- | 'Textarea'
- | 'TimePicker'
- | 'TreeSelect'
- | 'Upload'
- | BaseFormComponentType;
-
-async function initComponentAdapter() {
- const components: Partial> = {
- // 如果你的组件体积比较大,可以使用异步加载
- // Button: () =>
- // import('xxx').then((res) => res.Button),
-
- ApiCascader: withDefaultPlaceholder(ApiComponent, 'select', {
- component: Cascader,
- fieldNames: { label: 'label', value: 'value', children: 'children' },
- loadingSlot: 'suffixIcon',
- modelPropName: 'value',
- visibleEvent: 'onVisibleChange',
- }),
- ApiSelect: withDefaultPlaceholder(ApiComponent, 'select', {
- component: Select,
- loadingSlot: 'suffixIcon',
- modelPropName: 'value',
- visibleEvent: 'onVisibleChange',
- }),
- ApiTreeSelect: withDefaultPlaceholder(ApiComponent, 'select', {
- component: TreeSelect,
- fieldNames: { label: 'label', value: 'value', children: 'children' },
- loadingSlot: 'suffixIcon',
- modelPropName: 'value',
- optionsPropName: 'treeData',
- visibleEvent: 'onVisibleChange',
- }),
- AutoComplete,
- Cascader,
- Checkbox,
- CheckboxGroup,
- DatePicker,
- // 自定义默认按钮
- DefaultButton: (props, { attrs, slots }) => {
- return h(Button, { ...props, attrs, type: 'default' }, slots);
- },
- Divider,
- IconPicker: withDefaultPlaceholder(IconPicker, 'select', {
- iconSlot: 'addonAfter',
- inputComponent: Input,
- modelValueProp: 'value',
- }),
- Input: withDefaultPlaceholder(Input, 'input'),
- InputNumber: withDefaultPlaceholder(InputNumber, 'input'),
- InputPassword: withDefaultPlaceholder(InputPassword, 'input'),
- Mentions: withDefaultPlaceholder(Mentions, 'input'),
- // 自定义主要按钮
- PrimaryButton: (props, { attrs, slots }) => {
- return h(Button, { ...props, attrs, type: 'primary' }, slots);
- },
- Radio,
- RadioGroup,
- RangePicker,
- Rate,
- Select: withDefaultPlaceholder(Select, 'select'),
- Space,
- Switch,
- Textarea: withDefaultPlaceholder(Textarea, 'input'),
- TimePicker,
- TreeSelect: withDefaultPlaceholder(TreeSelect, 'select'),
- Upload: withPreviewUpload(),
- };
-
- // 将组件注册到全局共享状态中
- globalShareState.setComponents(components);
-
- // 定义全局共享状态中的消息提示
- globalShareState.defineMessage({
- // 复制成功消息提示
- copyPreferencesSuccess: (title, content) => {
- notification.success({
- description: content,
- title,
- placement: 'bottomRight',
- });
- },
- });
-}
-
-export { initComponentAdapter };
diff --git a/apps/web-antdv-next/src/adapter/form.ts b/apps/web-antdv-next/src/adapter/form.ts
deleted file mode 100644
index 983a7f51..00000000
--- a/apps/web-antdv-next/src/adapter/form.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import type {
- VbenFormSchema as FormSchema,
- VbenFormProps,
-} from '@vben/common-ui';
-
-import type { ComponentType } from './component';
-
-import { setupVbenForm, useVbenForm as useForm, z } from '@vben/common-ui';
-import { $t } from '@vben/locales';
-
-async function initSetupVbenForm() {
- setupVbenForm({
- config: {
- // ant design vue组件库默认都是 v-model:value
- baseModelPropName: 'value',
-
- // 一些组件是 v-model:checked 或者 v-model:fileList
- modelPropNameMap: {
- Checkbox: 'checked',
- Radio: 'checked',
- Switch: 'checked',
- Upload: 'fileList',
- },
- },
- defineRules: {
- // 输入项目必填国际化适配
- required: (value, _params, ctx) => {
- if (value === undefined || value === null || value.length === 0) {
- return $t('ui.formRules.required', [ctx.label]);
- }
- return true;
- },
- // 选择项目必填国际化适配
- selectRequired: (value, _params, ctx) => {
- if (value === undefined || value === null) {
- return $t('ui.formRules.selectRequired', [ctx.label]);
- }
- return true;
- },
- },
- });
-}
-
-const useVbenForm = useForm;
-
-export { initSetupVbenForm, useVbenForm, z };
-
-export type VbenFormSchema = FormSchema;
-export type { VbenFormProps };
diff --git a/apps/web-antdv-next/src/adapter/vxe-table.ts b/apps/web-antdv-next/src/adapter/vxe-table.ts
deleted file mode 100644
index 3b5d83b3..00000000
--- a/apps/web-antdv-next/src/adapter/vxe-table.ts
+++ /dev/null
@@ -1,70 +0,0 @@
-import type { VxeTableGridOptions } from '@vben/plugins/vxe-table';
-
-import { h } from 'vue';
-
-import { setupVbenVxeTable, useVbenVxeGrid } from '@vben/plugins/vxe-table';
-
-import { Button, Image } from 'antdv-next';
-
-import { useVbenForm } from './form';
-
-setupVbenVxeTable({
- configVxeTable: (vxeUI) => {
- vxeUI.setConfig({
- grid: {
- align: 'center',
- border: false,
- columnConfig: {
- resizable: true,
- },
- minHeight: 180,
- formConfig: {
- // 全局禁用vxe-table的表单配置,使用formOptions
- enabled: false,
- },
- proxyConfig: {
- autoLoad: true,
- response: {
- result: 'items',
- total: 'total',
- list: 'items',
- },
- showActiveMsg: true,
- showResponseMsg: false,
- },
- round: true,
- showOverflow: true,
- size: 'small',
- } as VxeTableGridOptions,
- });
-
- // 表格配置项可以用 cellRender: { name: 'CellImage' },
- vxeUI.renderer.add('CellImage', {
- renderTableDefault(renderOpts, params) {
- const { props } = renderOpts;
- const { column, row } = params;
- return h(Image, { src: row[column.field], ...props });
- },
- });
-
- // 表格配置项可以用 cellRender: { name: 'CellLink' },
- vxeUI.renderer.add('CellLink', {
- renderTableDefault(renderOpts) {
- const { props } = renderOpts;
- return h(
- Button,
- { size: 'small', type: 'link' },
- { default: () => props?.text },
- );
- },
- });
-
- // 这里可以自行扩展 vxe-table 的全局配置,比如自定义格式化
- // vxeUI.formats.add
- },
- useVbenForm,
-});
-
-export { useVbenVxeGrid };
-
-export type * from '@vben/plugins/vxe-table';
diff --git a/apps/web-antdv-next/src/api/core/auth.ts b/apps/web-antdv-next/src/api/core/auth.ts
deleted file mode 100644
index 71d9f994..00000000
--- a/apps/web-antdv-next/src/api/core/auth.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { baseRequestClient, requestClient } from '#/api/request';
-
-export namespace AuthApi {
- /** 登录接口参数 */
- export interface LoginParams {
- password?: string;
- username?: string;
- }
-
- /** 登录接口返回值 */
- export interface LoginResult {
- accessToken: string;
- }
-
- export interface RefreshTokenResult {
- data: string;
- status: number;
- }
-}
-
-/**
- * 登录
- */
-export async function loginApi(data: AuthApi.LoginParams) {
- return requestClient.post('/auth/login', data);
-}
-
-/**
- * 刷新accessToken
- */
-export async function refreshTokenApi() {
- return baseRequestClient.post('/auth/refresh', {
- withCredentials: true,
- });
-}
-
-/**
- * 退出登录
- */
-export async function logoutApi() {
- return baseRequestClient.post('/auth/logout', {
- withCredentials: true,
- });
-}
-
-/**
- * 获取用户权限码
- */
-export async function getAccessCodesApi() {
- return requestClient.get('/auth/codes');
-}
diff --git a/apps/web-antdv-next/src/api/core/index.ts b/apps/web-antdv-next/src/api/core/index.ts
deleted file mode 100644
index 28a5aef4..00000000
--- a/apps/web-antdv-next/src/api/core/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export * from './auth';
-export * from './menu';
-export * from './user';
diff --git a/apps/web-antdv-next/src/api/core/menu.ts b/apps/web-antdv-next/src/api/core/menu.ts
deleted file mode 100644
index 9ef60b11..00000000
--- a/apps/web-antdv-next/src/api/core/menu.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import type { RouteRecordStringComponent } from '@vben/types';
-
-import { requestClient } from '#/api/request';
-
-/**
- * 获取用户所有菜单
- */
-export async function getAllMenusApi() {
- return requestClient.get('/menu/all');
-}
diff --git a/apps/web-antdv-next/src/api/core/user.ts b/apps/web-antdv-next/src/api/core/user.ts
deleted file mode 100644
index 7e28ea84..00000000
--- a/apps/web-antdv-next/src/api/core/user.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import type { UserInfo } from '@vben/types';
-
-import { requestClient } from '#/api/request';
-
-/**
- * 获取用户信息
- */
-export async function getUserInfoApi() {
- return requestClient.get('/user/info');
-}
diff --git a/apps/web-antdv-next/src/api/index.ts b/apps/web-antdv-next/src/api/index.ts
deleted file mode 100644
index 4b0e0413..00000000
--- a/apps/web-antdv-next/src/api/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './core';
diff --git a/apps/web-antdv-next/src/api/request.ts b/apps/web-antdv-next/src/api/request.ts
deleted file mode 100644
index d97a2163..00000000
--- a/apps/web-antdv-next/src/api/request.ts
+++ /dev/null
@@ -1,113 +0,0 @@
-/**
- * 该文件可自行根据业务逻辑进行调整
- */
-import type { RequestClientOptions } from '@vben/request';
-
-import { useAppConfig } from '@vben/hooks';
-import { preferences } from '@vben/preferences';
-import {
- authenticateResponseInterceptor,
- defaultResponseInterceptor,
- errorMessageResponseInterceptor,
- RequestClient,
-} from '@vben/request';
-import { useAccessStore } from '@vben/stores';
-
-import { message } from 'antdv-next';
-
-import { useAuthStore } from '#/store';
-
-import { refreshTokenApi } from './core';
-
-const { apiURL } = useAppConfig(import.meta.env, import.meta.env.PROD);
-
-function createRequestClient(baseURL: string, options?: RequestClientOptions) {
- const client = new RequestClient({
- ...options,
- baseURL,
- });
-
- /**
- * 重新认证逻辑
- */
- async function doReAuthenticate() {
- console.warn('Access token or refresh token is invalid or expired. ');
- const accessStore = useAccessStore();
- const authStore = useAuthStore();
- accessStore.setAccessToken(null);
- if (
- preferences.app.loginExpiredMode === 'modal' &&
- accessStore.isAccessChecked
- ) {
- accessStore.setLoginExpired(true);
- } else {
- await authStore.logout();
- }
- }
-
- /**
- * 刷新token逻辑
- */
- async function doRefreshToken() {
- const accessStore = useAccessStore();
- const resp = await refreshTokenApi();
- const newToken = resp.data;
- accessStore.setAccessToken(newToken);
- return newToken;
- }
-
- function formatToken(token: null | string) {
- return token ? `Bearer ${token}` : null;
- }
-
- // 请求头处理
- client.addRequestInterceptor({
- fulfilled: async (config) => {
- const accessStore = useAccessStore();
-
- config.headers.Authorization = formatToken(accessStore.accessToken);
- config.headers['Accept-Language'] = preferences.app.locale;
- return config;
- },
- });
-
- // 处理返回的响应数据格式
- client.addResponseInterceptor(
- defaultResponseInterceptor({
- codeField: 'code',
- dataField: 'data',
- successCode: 0,
- }),
- );
-
- // token过期的处理
- client.addResponseInterceptor(
- authenticateResponseInterceptor({
- client,
- doReAuthenticate,
- doRefreshToken,
- enableRefreshToken: preferences.app.enableRefreshToken,
- formatToken,
- }),
- );
-
- // 通用的错误处理,如果没有进入上面的错误处理逻辑,就会进入这里
- client.addResponseInterceptor(
- errorMessageResponseInterceptor((msg: string, error) => {
- // 这里可以根据业务进行定制,你可以拿到 error 内的信息进行定制化处理,根据不同的 code 做不同的提示,而不是直接使用 message.error 提示 msg
- // 当前mock接口返回的错误字段是 error 或者 message
- const responseData = error?.response?.data ?? {};
- const errorMessage = responseData?.error ?? responseData?.message ?? '';
- // 如果没有错误信息,则会根据状态码进行提示
- message.error(errorMessage || msg);
- }),
- );
-
- return client;
-}
-
-export const requestClient = createRequestClient(apiURL, {
- responseReturn: 'data',
-});
-
-export const baseRequestClient = new RequestClient({ baseURL: apiURL });
diff --git a/apps/web-antdv-next/src/app.vue b/apps/web-antdv-next/src/app.vue
deleted file mode 100644
index 59ca8618..00000000
--- a/apps/web-antdv-next/src/app.vue
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/apps/web-antdv-next/src/bootstrap.ts b/apps/web-antdv-next/src/bootstrap.ts
deleted file mode 100644
index 8c161703..00000000
--- a/apps/web-antdv-next/src/bootstrap.ts
+++ /dev/null
@@ -1,76 +0,0 @@
-import { createApp, watchEffect } from 'vue';
-
-import { registerAccessDirective } from '@vben/access';
-import { registerLoadingDirective } from '@vben/common-ui/es/loading';
-import { preferences } from '@vben/preferences';
-import { initStores } from '@vben/stores';
-import '@vben/styles';
-import '@vben/styles/antdv-next';
-
-import { useTitle } from '@vueuse/core';
-
-import { $t, setupI18n } from '#/locales';
-
-import { initComponentAdapter } from './adapter/component';
-import { initSetupVbenForm } from './adapter/form';
-import App from './app.vue';
-import { router } from './router';
-
-async function bootstrap(namespace: string) {
- // 初始化组件适配器
- await initComponentAdapter();
-
- // 初始化表单组件
- await initSetupVbenForm();
-
- // // 设置弹窗的默认配置
- // setDefaultModalProps({
- // fullscreenButton: false,
- // });
- // // 设置抽屉的默认配置
- // setDefaultDrawerProps({
- // zIndex: 1020,
- // });
-
- const app = createApp(App);
-
- // 注册v-loading指令
- registerLoadingDirective(app, {
- loading: 'loading', // 在这里可以自定义指令名称,也可以明确提供false表示不注册这个指令
- spinning: 'spinning',
- });
-
- // 国际化 i18n 配置
- await setupI18n(app);
-
- // 配置 pinia-tore
- await initStores(app, { namespace });
-
- // 安装权限指令
- registerAccessDirective(app);
-
- // 初始化 tippy
- const { initTippy } = await import('@vben/common-ui/es/tippy');
- initTippy(app);
-
- // 配置路由及路由守卫
- app.use(router);
-
- // 配置Motion插件
- const { MotionPlugin } = await import('@vben/plugins/motion');
- app.use(MotionPlugin);
-
- // 动态更新标题
- watchEffect(() => {
- if (preferences.app.dynamicTitle) {
- const routeTitle = router.currentRoute.value.meta?.title;
- const pageTitle =
- (routeTitle ? `${$t(routeTitle)} - ` : '') + preferences.app.name;
- useTitle(pageTitle);
- }
- });
-
- app.mount('#app');
-}
-
-export { bootstrap };
diff --git a/apps/web-antdv-next/src/layouts/auth.vue b/apps/web-antdv-next/src/layouts/auth.vue
deleted file mode 100644
index 8ba66e85..00000000
--- a/apps/web-antdv-next/src/layouts/auth.vue
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/apps/web-antdv-next/src/layouts/basic.vue b/apps/web-antdv-next/src/layouts/basic.vue
deleted file mode 100644
index 2226c68a..00000000
--- a/apps/web-antdv-next/src/layouts/basic.vue
+++ /dev/null
@@ -1,206 +0,0 @@
-
-
-
-
-
-
-
-
- item.id && markRead(item.id)"
- @remove="(item) => item.id && remove(item.id)"
- @make-all="handleMakeAll"
- />
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/web-antdv-next/src/layouts/index.ts b/apps/web-antdv-next/src/layouts/index.ts
deleted file mode 100644
index a4320780..00000000
--- a/apps/web-antdv-next/src/layouts/index.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-const BasicLayout = () => import('./basic.vue');
-const AuthPageLayout = () => import('./auth.vue');
-
-const IFrameView = () => import('@vben/layouts').then((m) => m.IFrameView);
-
-export { AuthPageLayout, BasicLayout, IFrameView };
diff --git a/apps/web-antdv-next/src/locales/README.md b/apps/web-antdv-next/src/locales/README.md
deleted file mode 100644
index 7b451032..00000000
--- a/apps/web-antdv-next/src/locales/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# locale
-
-每个app使用的国际化可能不同,这里用于扩展国际化的功能,例如扩展 dayjs、antd组件库的多语言切换,以及app本身的国际化文件。
diff --git a/apps/web-antdv-next/src/locales/index.ts b/apps/web-antdv-next/src/locales/index.ts
deleted file mode 100644
index 2586d859..00000000
--- a/apps/web-antdv-next/src/locales/index.ts
+++ /dev/null
@@ -1,102 +0,0 @@
-import type { Locale } from 'antdv-next/dist/locale/index';
-
-import type { App } from 'vue';
-
-import type { LocaleSetupOptions, SupportedLanguagesType } from '@vben/locales';
-
-import { ref } from 'vue';
-
-import {
- $t,
- setupI18n as coreSetup,
- loadLocalesMapFromDir,
-} from '@vben/locales';
-import { preferences } from '@vben/preferences';
-
-import antdEnLocale from 'antdv-next/dist/locale/en_US';
-import antdDefaultLocale from 'antdv-next/dist/locale/zh_CN';
-import dayjs from 'dayjs';
-
-const antdLocale = ref(antdDefaultLocale);
-
-const modules = import.meta.glob('./langs/**/*.json');
-
-const localesMap = loadLocalesMapFromDir(
- /\.\/langs\/([^/]+)\/(.*)\.json$/,
- modules,
-);
-/**
- * 加载应用特有的语言包
- * 这里也可以改造为从服务端获取翻译数据
- * @param lang
- */
-async function loadMessages(lang: SupportedLanguagesType) {
- const [appLocaleMessages] = await Promise.all([
- localesMap[lang]?.(),
- loadThirdPartyMessage(lang),
- ]);
- return appLocaleMessages?.default;
-}
-
-/**
- * 加载第三方组件库的语言包
- * @param lang
- */
-async function loadThirdPartyMessage(lang: SupportedLanguagesType) {
- await Promise.all([loadAntdLocale(lang), loadDayjsLocale(lang)]);
-}
-
-/**
- * 加载dayjs的语言包
- * @param lang
- */
-async function loadDayjsLocale(lang: SupportedLanguagesType) {
- let locale;
- switch (lang) {
- case 'en-US': {
- locale = await import('dayjs/locale/en');
- break;
- }
- case 'zh-CN': {
- locale = await import('dayjs/locale/zh-cn');
- break;
- }
- // 默认使用英语
- default: {
- locale = await import('dayjs/locale/en');
- }
- }
- if (locale) {
- dayjs.locale(locale);
- } else {
- console.error(`Failed to load dayjs locale for ${lang}`);
- }
-}
-
-/**
- * 加载antd的语言包
- * @param lang
- */
-async function loadAntdLocale(lang: SupportedLanguagesType) {
- switch (lang) {
- case 'en-US': {
- antdLocale.value = antdEnLocale;
- break;
- }
- case 'zh-CN': {
- antdLocale.value = antdDefaultLocale;
- break;
- }
- }
-}
-
-async function setupI18n(app: App, options: LocaleSetupOptions = {}) {
- await coreSetup(app, {
- defaultLocale: preferences.app.locale,
- loadMessages,
- missingWarn: !import.meta.env.PROD,
- ...options,
- });
-}
-
-export { $t, antdLocale, setupI18n };
diff --git a/apps/web-antdv-next/src/locales/langs/en-US/demos.json b/apps/web-antdv-next/src/locales/langs/en-US/demos.json
deleted file mode 100644
index 551f22b4..00000000
--- a/apps/web-antdv-next/src/locales/langs/en-US/demos.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "title": "Demos",
- "antd": "Antdv Next",
- "vben": {
- "title": "Project",
- "about": "About",
- "document": "Document",
- "antdv": "Ant Design Vue Version",
- "antdv-next": "Antdv Next Version",
- "naive-ui": "Naive UI Version",
- "element-plus": "Element Plus Version",
- "tdesign": "TDesign Vue Version"
- }
-}
diff --git a/apps/web-antdv-next/src/locales/langs/en-US/page.json b/apps/web-antdv-next/src/locales/langs/en-US/page.json
deleted file mode 100644
index 39f1641c..00000000
--- a/apps/web-antdv-next/src/locales/langs/en-US/page.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "auth": {
- "login": "Login",
- "register": "Register",
- "codeLogin": "Code Login",
- "qrcodeLogin": "Qr Code Login",
- "forgetPassword": "Forget Password",
- "profile": "Profile"
- },
- "dashboard": {
- "title": "Dashboard",
- "analytics": "Analytics",
- "workspace": "Workspace"
- }
-}
diff --git a/apps/web-antdv-next/src/locales/langs/zh-CN/demos.json b/apps/web-antdv-next/src/locales/langs/zh-CN/demos.json
deleted file mode 100644
index ef4e43fd..00000000
--- a/apps/web-antdv-next/src/locales/langs/zh-CN/demos.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "title": "演示",
- "antd": "Antdv Next",
- "vben": {
- "title": "项目",
- "about": "关于",
- "document": "文档",
- "antdv": "Ant Design Vue 版本",
- "antdv-next": "Antdv Next 版本",
- "naive-ui": "Naive UI 版本",
- "element-plus": "Element Plus 版本",
- "tdesign": "TDesign Vue 版本"
- }
-}
diff --git a/apps/web-antdv-next/src/locales/langs/zh-CN/page.json b/apps/web-antdv-next/src/locales/langs/zh-CN/page.json
deleted file mode 100644
index 2192d1d5..00000000
--- a/apps/web-antdv-next/src/locales/langs/zh-CN/page.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "auth": {
- "login": "登录",
- "register": "注册",
- "codeLogin": "验证码登录",
- "qrcodeLogin": "二维码登录",
- "forgetPassword": "忘记密码",
- "profile": "个人中心"
- },
- "dashboard": {
- "title": "概览",
- "analytics": "分析页",
- "workspace": "工作台"
- }
-}
diff --git a/apps/web-antdv-next/src/main.ts b/apps/web-antdv-next/src/main.ts
deleted file mode 100644
index 5d728a02..00000000
--- a/apps/web-antdv-next/src/main.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import { initPreferences } from '@vben/preferences';
-import { unmountGlobalLoading } from '@vben/utils';
-
-import { overridesPreferences } from './preferences';
-
-/**
- * 应用初始化完成之后再进行页面加载渲染
- */
-async function initApplication() {
- // name用于指定项目唯一标识
- // 用于区分不同项目的偏好设置以及存储数据的key前缀以及其他一些需要隔离的数据
- const env = import.meta.env.PROD ? 'prod' : 'dev';
- const appVersion = import.meta.env.VITE_APP_VERSION;
- const namespace = `${import.meta.env.VITE_APP_NAMESPACE}-${appVersion}-${env}`;
-
- // app偏好设置初始化
- await initPreferences({
- namespace,
- overrides: overridesPreferences,
- });
-
- // 启动应用并挂载
- // vue应用主要逻辑及视图
- const { bootstrap } = await import('./bootstrap');
- await bootstrap(namespace);
-
- // 移除并销毁loading
- unmountGlobalLoading();
-}
-
-initApplication();
diff --git a/apps/web-antdv-next/src/preferences.ts b/apps/web-antdv-next/src/preferences.ts
deleted file mode 100644
index b2e9ace4..00000000
--- a/apps/web-antdv-next/src/preferences.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { defineOverridesPreferences } from '@vben/preferences';
-
-/**
- * @description 项目配置文件
- * 只需要覆盖项目中的一部分配置,不需要的配置不用覆盖,会自动使用默认配置
- * !!! 更改配置后请清空缓存,否则可能不生效
- */
-export const overridesPreferences = defineOverridesPreferences({
- // overrides
- app: {
- name: import.meta.env.VITE_APP_TITLE,
- },
-});
diff --git a/apps/web-antdv-next/src/router/access.ts b/apps/web-antdv-next/src/router/access.ts
deleted file mode 100644
index e9e98511..00000000
--- a/apps/web-antdv-next/src/router/access.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-import type {
- ComponentRecordType,
- GenerateMenuAndRoutesOptions,
-} from '@vben/types';
-
-import { generateAccessible } from '@vben/access';
-import { preferences } from '@vben/preferences';
-
-import { message } from 'antdv-next';
-
-import { getAllMenusApi } from '#/api';
-import { BasicLayout, IFrameView } from '#/layouts';
-import { $t } from '#/locales';
-
-const forbiddenComponent = () => import('#/views/_core/fallback/forbidden.vue');
-
-async function generateAccess(options: GenerateMenuAndRoutesOptions) {
- const pageMap: ComponentRecordType = import.meta.glob('../views/**/*.vue');
-
- const layoutMap: ComponentRecordType = {
- BasicLayout,
- IFrameView,
- };
-
- return await generateAccessible(preferences.app.accessMode, {
- ...options,
- fetchMenuListAsync: async () => {
- message.loading({
- content: `${$t('common.loadingMenu')}...`,
- duration: 1.5,
- });
- return await getAllMenusApi();
- },
- // 可以指定没有权限跳转403页面
- forbiddenComponent,
- // 如果 route.meta.menuVisibleWithForbidden = true
- layoutMap,
- pageMap,
- });
-}
-
-export { generateAccess };
diff --git a/apps/web-antdv-next/src/router/guard.ts b/apps/web-antdv-next/src/router/guard.ts
deleted file mode 100644
index a1ad6d88..00000000
--- a/apps/web-antdv-next/src/router/guard.ts
+++ /dev/null
@@ -1,133 +0,0 @@
-import type { Router } from 'vue-router';
-
-import { LOGIN_PATH } from '@vben/constants';
-import { preferences } from '@vben/preferences';
-import { useAccessStore, useUserStore } from '@vben/stores';
-import { startProgress, stopProgress } from '@vben/utils';
-
-import { accessRoutes, coreRouteNames } from '#/router/routes';
-import { useAuthStore } from '#/store';
-
-import { generateAccess } from './access';
-
-/**
- * 通用守卫配置
- * @param router
- */
-function setupCommonGuard(router: Router) {
- // 记录已经加载的页面
- const loadedPaths = new Set();
-
- router.beforeEach((to) => {
- to.meta.loaded = loadedPaths.has(to.path);
-
- // 页面加载进度条
- if (!to.meta.loaded && preferences.transition.progress) {
- startProgress();
- }
- return true;
- });
-
- router.afterEach((to) => {
- // 记录页面是否加载,如果已经加载,后续的页面切换动画等效果不在重复执行
-
- loadedPaths.add(to.path);
-
- // 关闭页面加载进度条
- if (preferences.transition.progress) {
- stopProgress();
- }
- });
-}
-
-/**
- * 权限访问守卫配置
- * @param router
- */
-function setupAccessGuard(router: Router) {
- router.beforeEach(async (to, from) => {
- const accessStore = useAccessStore();
- const userStore = useUserStore();
- const authStore = useAuthStore();
-
- // 基本路由,这些路由不需要进入权限拦截
- if (coreRouteNames.includes(to.name as string)) {
- if (to.path === LOGIN_PATH && accessStore.accessToken) {
- return decodeURIComponent(
- (to.query?.redirect as string) ||
- userStore.userInfo?.homePath ||
- preferences.app.defaultHomePath,
- );
- }
- return true;
- }
-
- // accessToken 检查
- if (!accessStore.accessToken) {
- // 明确声明忽略权限访问权限,则可以访问
- if (to.meta.ignoreAccess) {
- return true;
- }
-
- // 没有访问权限,跳转登录页面
- if (to.fullPath !== LOGIN_PATH) {
- return {
- path: LOGIN_PATH,
- // 如不需要,直接删除 query
- query:
- to.fullPath === preferences.app.defaultHomePath
- ? {}
- : { redirect: encodeURIComponent(to.fullPath) },
- // 携带当前跳转的页面,登录后重新跳转该页面
- replace: true,
- };
- }
- return to;
- }
-
- // 是否已经生成过动态路由
- if (accessStore.isAccessChecked) {
- return true;
- }
-
- // 生成路由表
- // 当前登录用户拥有的角色标识列表
- const userInfo = userStore.userInfo || (await authStore.fetchUserInfo());
- const userRoles = userInfo.roles ?? [];
-
- // 生成菜单和路由
- const { accessibleMenus, accessibleRoutes } = await generateAccess({
- roles: userRoles,
- router,
- // 则会在菜单中显示,但是访问会被重定向到403
- routes: accessRoutes,
- });
-
- // 保存菜单信息和路由信息
- accessStore.setAccessMenus(accessibleMenus);
- accessStore.setAccessRoutes(accessibleRoutes);
- accessStore.setIsAccessChecked(true);
- const redirectPath = (from.query.redirect ??
- (to.path === preferences.app.defaultHomePath
- ? userInfo.homePath || preferences.app.defaultHomePath
- : to.fullPath)) as string;
-
- return {
- ...router.resolve(decodeURIComponent(redirectPath)),
- replace: true,
- };
- });
-}
-
-/**
- * 项目守卫配置
- * @param router
- */
-function createRouterGuard(router: Router) {
- /** 通用 */
- setupCommonGuard(router);
- /** 权限访问 */
- setupAccessGuard(router);
-}
-
-export { createRouterGuard };
diff --git a/apps/web-antdv-next/src/router/index.ts b/apps/web-antdv-next/src/router/index.ts
deleted file mode 100644
index 48402303..00000000
--- a/apps/web-antdv-next/src/router/index.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import {
- createRouter,
- createWebHashHistory,
- createWebHistory,
-} from 'vue-router';
-
-import { resetStaticRoutes } from '@vben/utils';
-
-import { createRouterGuard } from './guard';
-import { routes } from './routes';
-
-/**
- * @zh_CN 创建vue-router实例
- */
-const router = createRouter({
- history:
- import.meta.env.VITE_ROUTER_HISTORY === 'hash'
- ? createWebHashHistory(import.meta.env.VITE_BASE)
- : createWebHistory(import.meta.env.VITE_BASE),
- // 应该添加到路由的初始路由列表。
- routes,
- scrollBehavior: (to, _from, savedPosition) => {
- if (savedPosition) {
- return savedPosition;
- }
- return to.hash ? { behavior: 'smooth', el: to.hash } : { left: 0, top: 0 };
- },
- // 是否应该禁止尾部斜杠。
- // strict: true,
-});
-
-const resetRoutes = () => resetStaticRoutes(router, routes);
-
-// 创建路由守卫
-createRouterGuard(router);
-
-export { resetRoutes, router };
diff --git a/apps/web-antdv-next/src/router/routes/core.ts b/apps/web-antdv-next/src/router/routes/core.ts
deleted file mode 100644
index 949b0b65..00000000
--- a/apps/web-antdv-next/src/router/routes/core.ts
+++ /dev/null
@@ -1,97 +0,0 @@
-import type { RouteRecordRaw } from 'vue-router';
-
-import { LOGIN_PATH } from '@vben/constants';
-import { preferences } from '@vben/preferences';
-
-import { $t } from '#/locales';
-
-const BasicLayout = () => import('#/layouts/basic.vue');
-const AuthPageLayout = () => import('#/layouts/auth.vue');
-/** 全局404页面 */
-const fallbackNotFoundRoute: RouteRecordRaw = {
- component: () => import('#/views/_core/fallback/not-found.vue'),
- meta: {
- hideInBreadcrumb: true,
- hideInMenu: true,
- hideInTab: true,
- title: '404',
- },
- name: 'FallbackNotFound',
- path: '/:path(.*)*',
-};
-
-/** 基本路由,这些路由是必须存在的 */
-const coreRoutes: RouteRecordRaw[] = [
- /**
- * 根路由
- * 使用基础布局,作为所有页面的父级容器,子级就不必配置BasicLayout。
- * 此路由必须存在,且不应修改
- */
- {
- component: BasicLayout,
- meta: {
- hideInBreadcrumb: true,
- title: 'Root',
- },
- name: 'Root',
- path: '/',
- redirect: preferences.app.defaultHomePath,
- children: [],
- },
- {
- component: AuthPageLayout,
- meta: {
- hideInTab: true,
- title: 'Authentication',
- },
- name: 'Authentication',
- path: '/auth',
- redirect: LOGIN_PATH,
- children: [
- {
- name: 'Login',
- path: 'login',
- component: () => import('#/views/_core/authentication/login.vue'),
- meta: {
- title: $t('page.auth.login'),
- },
- },
- {
- name: 'CodeLogin',
- path: 'code-login',
- component: () => import('#/views/_core/authentication/code-login.vue'),
- meta: {
- title: $t('page.auth.codeLogin'),
- },
- },
- {
- name: 'QrCodeLogin',
- path: 'qrcode-login',
- component: () =>
- import('#/views/_core/authentication/qrcode-login.vue'),
- meta: {
- title: $t('page.auth.qrcodeLogin'),
- },
- },
- {
- name: 'ForgetPassword',
- path: 'forget-password',
- component: () =>
- import('#/views/_core/authentication/forget-password.vue'),
- meta: {
- title: $t('page.auth.forgetPassword'),
- },
- },
- {
- name: 'Register',
- path: 'register',
- component: () => import('#/views/_core/authentication/register.vue'),
- meta: {
- title: $t('page.auth.register'),
- },
- },
- ],
- },
-];
-
-export { coreRoutes, fallbackNotFoundRoute };
diff --git a/apps/web-antdv-next/src/router/routes/index.ts b/apps/web-antdv-next/src/router/routes/index.ts
deleted file mode 100644
index e6fb1440..00000000
--- a/apps/web-antdv-next/src/router/routes/index.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import type { RouteRecordRaw } from 'vue-router';
-
-import { mergeRouteModules, traverseTreeValues } from '@vben/utils';
-
-import { coreRoutes, fallbackNotFoundRoute } from './core';
-
-const dynamicRouteFiles = import.meta.glob('./modules/**/*.ts', {
- eager: true,
-});
-
-// 有需要可以自行打开注释,并创建文件夹
-// const externalRouteFiles = import.meta.glob('./external/**/*.ts', { eager: true });
-// const staticRouteFiles = import.meta.glob('./static/**/*.ts', { eager: true });
-
-/** 动态路由 */
-const dynamicRoutes: RouteRecordRaw[] = mergeRouteModules(dynamicRouteFiles);
-
-/** 外部路由列表,访问这些页面可以不需要Layout,可能用于内嵌在别的系统(不会显示在菜单中) */
-// const externalRoutes: RouteRecordRaw[] = mergeRouteModules(externalRouteFiles);
-// const staticRoutes: RouteRecordRaw[] = mergeRouteModules(staticRouteFiles);
-const staticRoutes: RouteRecordRaw[] = [];
-const externalRoutes: RouteRecordRaw[] = [];
-
-/** 路由列表,由基本路由、外部路由和404兜底路由组成
- * 无需走权限验证(会一直显示在菜单中) */
-const routes: RouteRecordRaw[] = [
- ...coreRoutes,
- ...externalRoutes,
- fallbackNotFoundRoute,
-];
-
-/** 基本路由列表,这些路由不需要进入权限拦截 */
-const coreRouteNames = traverseTreeValues(coreRoutes, (route) => route.name);
-
-/** 有权限校验的路由列表,包含动态路由和静态路由 */
-const accessRoutes = [...dynamicRoutes, ...staticRoutes];
-export { accessRoutes, coreRouteNames, routes };
diff --git a/apps/web-antdv-next/src/router/routes/modules/dashboard.ts b/apps/web-antdv-next/src/router/routes/modules/dashboard.ts
deleted file mode 100644
index 5254dc65..00000000
--- a/apps/web-antdv-next/src/router/routes/modules/dashboard.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-import type { RouteRecordRaw } from 'vue-router';
-
-import { $t } from '#/locales';
-
-const routes: RouteRecordRaw[] = [
- {
- meta: {
- icon: 'lucide:layout-dashboard',
- order: -1,
- title: $t('page.dashboard.title'),
- },
- name: 'Dashboard',
- path: '/dashboard',
- children: [
- {
- name: 'Analytics',
- path: '/analytics',
- component: () => import('#/views/dashboard/analytics/index.vue'),
- meta: {
- affixTab: true,
- icon: 'lucide:area-chart',
- title: $t('page.dashboard.analytics'),
- },
- },
- {
- name: 'Workspace',
- path: '/workspace',
- component: () => import('#/views/dashboard/workspace/index.vue'),
- meta: {
- icon: 'carbon:workspace',
- title: $t('page.dashboard.workspace'),
- },
- },
- ],
- },
-];
-
-export default routes;
diff --git a/apps/web-antdv-next/src/router/routes/modules/demos.ts b/apps/web-antdv-next/src/router/routes/modules/demos.ts
deleted file mode 100644
index 4605d91c..00000000
--- a/apps/web-antdv-next/src/router/routes/modules/demos.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import type { RouteRecordRaw } from 'vue-router';
-
-import { $t } from '#/locales';
-
-const routes: RouteRecordRaw[] = [
- {
- meta: {
- icon: 'ic:baseline-view-in-ar',
- keepAlive: true,
- order: 1000,
- title: $t('demos.title'),
- },
- name: 'Demos',
- path: '/demos',
- children: [
- {
- meta: {
- title: $t('demos.antd'),
- },
- name: 'AntDesignDemos',
- path: '/demos/ant-design-next',
- component: () => import('#/views/demos/antd/index.vue'),
- },
- ],
- },
-];
-
-export default routes;
diff --git a/apps/web-antdv-next/src/router/routes/modules/vben.ts b/apps/web-antdv-next/src/router/routes/modules/vben.ts
deleted file mode 100644
index 96f741ef..00000000
--- a/apps/web-antdv-next/src/router/routes/modules/vben.ts
+++ /dev/null
@@ -1,116 +0,0 @@
-import type { RouteRecordRaw } from 'vue-router';
-
-import {
- VBEN_ANT_PREVIEW_URL,
- VBEN_DOC_URL,
- VBEN_ELE_PREVIEW_URL,
- VBEN_GITHUB_URL,
- VBEN_LOGO_URL,
- VBEN_NAIVE_PREVIEW_URL,
- VBEN_TD_PREVIEW_URL,
-} from '@vben/constants';
-import { SvgAntdvLogoIcon, SvgTDesignIcon } from '@vben/icons';
-
-import { IFrameView } from '#/layouts';
-import { $t } from '#/locales';
-
-const routes: RouteRecordRaw[] = [
- {
- meta: {
- badgeType: 'dot',
- icon: VBEN_LOGO_URL,
- order: 9998,
- title: $t('demos.vben.title'),
- },
- name: 'VbenProject',
- path: '/vben-admin',
- children: [
- {
- name: 'VbenDocument',
- path: '/vben-admin/document',
- component: IFrameView,
- meta: {
- icon: 'lucide:book-open-text',
- link: VBEN_DOC_URL,
- title: $t('demos.vben.document'),
- },
- },
- {
- name: 'VbenGithub',
- path: '/vben-admin/github',
- component: IFrameView,
- meta: {
- icon: 'mdi:github',
- link: VBEN_GITHUB_URL,
- title: 'Github',
- },
- },
- {
- name: 'VbenAntd',
- path: '/vben-admin/antd',
- component: IFrameView,
- meta: {
- badgeType: 'dot',
- icon: SvgAntdvLogoIcon,
- link: VBEN_ANT_PREVIEW_URL,
- title: $t('demos.vben.antdv'),
- },
- },
- {
- name: 'VbenNaive',
- path: '/vben-admin/naive',
- component: IFrameView,
- meta: {
- badgeType: 'dot',
- icon: 'logos:naiveui',
- link: VBEN_NAIVE_PREVIEW_URL,
- title: $t('demos.vben.naive-ui'),
- },
- },
- {
- name: 'VbenTDesign',
- path: '/vben-admin/tdesign',
- component: IFrameView,
- meta: {
- badgeType: 'dot',
- icon: SvgTDesignIcon,
- link: VBEN_TD_PREVIEW_URL,
- title: $t('demos.vben.tdesign'),
- },
- },
- {
- name: 'VbenElementPlus',
- path: '/vben-admin/ele',
- component: IFrameView,
- meta: {
- badgeType: 'dot',
- icon: 'logos:element',
- link: VBEN_ELE_PREVIEW_URL,
- title: $t('demos.vben.element-plus'),
- },
- },
- ],
- },
- {
- name: 'VbenAbout',
- path: '/vben-admin/about',
- component: () => import('#/views/_core/about/index.vue'),
- meta: {
- icon: 'lucide:copyright',
- title: $t('demos.vben.about'),
- order: 9999,
- },
- },
- {
- name: 'Profile',
- path: '/profile',
- component: () => import('#/views/_core/profile/index.vue'),
- meta: {
- icon: 'lucide:user',
- hideInMenu: true,
- title: $t('page.auth.profile'),
- },
- },
-];
-
-export default routes;
diff --git a/apps/web-antdv-next/src/store/auth.ts b/apps/web-antdv-next/src/store/auth.ts
deleted file mode 100644
index 6f7a3750..00000000
--- a/apps/web-antdv-next/src/store/auth.ts
+++ /dev/null
@@ -1,118 +0,0 @@
-import type { Recordable, UserInfo } from '@vben/types';
-
-import { ref } from 'vue';
-import { useRouter } from 'vue-router';
-
-import { LOGIN_PATH } from '@vben/constants';
-import { preferences } from '@vben/preferences';
-import { resetAllStores, useAccessStore, useUserStore } from '@vben/stores';
-
-import { notification } from 'antdv-next';
-import { defineStore } from 'pinia';
-
-import { getAccessCodesApi, getUserInfoApi, loginApi, logoutApi } from '#/api';
-import { $t } from '#/locales';
-
-export const useAuthStore = defineStore('auth', () => {
- const accessStore = useAccessStore();
- const userStore = useUserStore();
- const router = useRouter();
-
- const loginLoading = ref(false);
-
- /**
- * 异步处理登录操作
- * Asynchronously handle the login process
- * @param params 登录表单数据
- */
- async function authLogin(
- params: Recordable,
- onSuccess?: () => Promise | void,
- ) {
- // 异步处理用户登录操作并获取 accessToken
- let userInfo: null | UserInfo = null;
- try {
- loginLoading.value = true;
- const { accessToken } = await loginApi(params);
-
- // 如果成功获取到 accessToken
- if (accessToken) {
- accessStore.setAccessToken(accessToken);
-
- // 获取用户信息并存储到 accessStore 中
- const [fetchUserInfoResult, accessCodes] = await Promise.all([
- fetchUserInfo(),
- getAccessCodesApi(),
- ]);
-
- userInfo = fetchUserInfoResult;
-
- userStore.setUserInfo(userInfo);
- accessStore.setAccessCodes(accessCodes);
-
- if (accessStore.loginExpired) {
- accessStore.setLoginExpired(false);
- } else {
- onSuccess
- ? await onSuccess?.()
- : await router.push(
- userInfo.homePath || preferences.app.defaultHomePath,
- );
- }
-
- if (userInfo?.realName) {
- notification.success({
- description: `${$t('authentication.loginSuccessDesc')}:${userInfo?.realName}`,
- duration: 3,
- title: $t('authentication.loginSuccess'),
- });
- }
- }
- } finally {
- loginLoading.value = false;
- }
-
- return {
- userInfo,
- };
- }
-
- async function logout(redirect: boolean = true) {
- try {
- await logoutApi();
- } catch {
- // 不做任何处理
- }
- resetAllStores();
- accessStore.setLoginExpired(false);
-
- // 回登录页带上当前路由地址
- await router.replace({
- path: LOGIN_PATH,
- query: redirect
- ? {
- redirect: encodeURIComponent(router.currentRoute.value.fullPath),
- }
- : {},
- });
- }
-
- async function fetchUserInfo() {
- let userInfo: null | UserInfo = null;
- userInfo = await getUserInfoApi();
- userStore.setUserInfo(userInfo);
- return userInfo;
- }
-
- function $reset() {
- loginLoading.value = false;
- }
-
- return {
- $reset,
- authLogin,
- fetchUserInfo,
- loginLoading,
- logout,
- };
-});
diff --git a/apps/web-antdv-next/src/store/index.ts b/apps/web-antdv-next/src/store/index.ts
deleted file mode 100644
index 269586ee..00000000
--- a/apps/web-antdv-next/src/store/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './auth';
diff --git a/apps/web-antdv-next/src/views/_core/README.md b/apps/web-antdv-next/src/views/_core/README.md
deleted file mode 100644
index 8248afe6..00000000
--- a/apps/web-antdv-next/src/views/_core/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# \_core
-
-此目录包含应用程序正常运行所需的基本视图。这些视图是应用程序布局中使用的视图。
diff --git a/apps/web-antdv-next/src/views/_core/about/index.vue b/apps/web-antdv-next/src/views/_core/about/index.vue
deleted file mode 100644
index 0ee52433..00000000
--- a/apps/web-antdv-next/src/views/_core/about/index.vue
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
diff --git a/apps/web-antdv-next/src/views/_core/authentication/code-login.vue b/apps/web-antdv-next/src/views/_core/authentication/code-login.vue
deleted file mode 100644
index acfd1fd7..00000000
--- a/apps/web-antdv-next/src/views/_core/authentication/code-login.vue
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
-
diff --git a/apps/web-antdv-next/src/views/_core/authentication/forget-password.vue b/apps/web-antdv-next/src/views/_core/authentication/forget-password.vue
deleted file mode 100644
index fef0d427..00000000
--- a/apps/web-antdv-next/src/views/_core/authentication/forget-password.vue
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
-
diff --git a/apps/web-antdv-next/src/views/_core/authentication/login.vue b/apps/web-antdv-next/src/views/_core/authentication/login.vue
deleted file mode 100644
index 099e4c8c..00000000
--- a/apps/web-antdv-next/src/views/_core/authentication/login.vue
+++ /dev/null
@@ -1,98 +0,0 @@
-
-
-
-
-
diff --git a/apps/web-antdv-next/src/views/_core/authentication/qrcode-login.vue b/apps/web-antdv-next/src/views/_core/authentication/qrcode-login.vue
deleted file mode 100644
index 23f5f2da..00000000
--- a/apps/web-antdv-next/src/views/_core/authentication/qrcode-login.vue
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
diff --git a/apps/web-antdv-next/src/views/_core/authentication/register.vue b/apps/web-antdv-next/src/views/_core/authentication/register.vue
deleted file mode 100644
index b1a5de72..00000000
--- a/apps/web-antdv-next/src/views/_core/authentication/register.vue
+++ /dev/null
@@ -1,96 +0,0 @@
-
-
-
-
-
diff --git a/apps/web-antdv-next/src/views/_core/fallback/coming-soon.vue b/apps/web-antdv-next/src/views/_core/fallback/coming-soon.vue
deleted file mode 100644
index f394930f..00000000
--- a/apps/web-antdv-next/src/views/_core/fallback/coming-soon.vue
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
diff --git a/apps/web-antdv-next/src/views/_core/fallback/forbidden.vue b/apps/web-antdv-next/src/views/_core/fallback/forbidden.vue
deleted file mode 100644
index 8ea65fed..00000000
--- a/apps/web-antdv-next/src/views/_core/fallback/forbidden.vue
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
diff --git a/apps/web-antdv-next/src/views/_core/fallback/internal-error.vue b/apps/web-antdv-next/src/views/_core/fallback/internal-error.vue
deleted file mode 100644
index 819a47d5..00000000
--- a/apps/web-antdv-next/src/views/_core/fallback/internal-error.vue
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
diff --git a/apps/web-antdv-next/src/views/_core/fallback/not-found.vue b/apps/web-antdv-next/src/views/_core/fallback/not-found.vue
deleted file mode 100644
index 4d178e9c..00000000
--- a/apps/web-antdv-next/src/views/_core/fallback/not-found.vue
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
diff --git a/apps/web-antdv-next/src/views/_core/fallback/offline.vue b/apps/web-antdv-next/src/views/_core/fallback/offline.vue
deleted file mode 100644
index 5de4a88d..00000000
--- a/apps/web-antdv-next/src/views/_core/fallback/offline.vue
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
diff --git a/apps/web-antdv-next/src/views/_core/profile/base-setting.vue b/apps/web-antdv-next/src/views/_core/profile/base-setting.vue
deleted file mode 100644
index aa8a4c26..00000000
--- a/apps/web-antdv-next/src/views/_core/profile/base-setting.vue
+++ /dev/null
@@ -1,65 +0,0 @@
-
-
-
-
diff --git a/apps/web-antdv-next/src/views/_core/profile/index.vue b/apps/web-antdv-next/src/views/_core/profile/index.vue
deleted file mode 100644
index 8740894e..00000000
--- a/apps/web-antdv-next/src/views/_core/profile/index.vue
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/web-antdv-next/src/views/_core/profile/notification-setting.vue b/apps/web-antdv-next/src/views/_core/profile/notification-setting.vue
deleted file mode 100644
index 324a4b39..00000000
--- a/apps/web-antdv-next/src/views/_core/profile/notification-setting.vue
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
diff --git a/apps/web-antdv-next/src/views/_core/profile/password-setting.vue b/apps/web-antdv-next/src/views/_core/profile/password-setting.vue
deleted file mode 100644
index adb065a2..00000000
--- a/apps/web-antdv-next/src/views/_core/profile/password-setting.vue
+++ /dev/null
@@ -1,63 +0,0 @@
-
-
-
-
diff --git a/apps/web-antdv-next/src/views/_core/profile/security-setting.vue b/apps/web-antdv-next/src/views/_core/profile/security-setting.vue
deleted file mode 100644
index be30db58..00000000
--- a/apps/web-antdv-next/src/views/_core/profile/security-setting.vue
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
diff --git a/apps/web-antdv-next/src/views/dashboard/analytics/analytics-trends.vue b/apps/web-antdv-next/src/views/dashboard/analytics/analytics-trends.vue
deleted file mode 100644
index f1f0b232..00000000
--- a/apps/web-antdv-next/src/views/dashboard/analytics/analytics-trends.vue
+++ /dev/null
@@ -1,98 +0,0 @@
-
-
-
-
-
diff --git a/apps/web-antdv-next/src/views/dashboard/analytics/analytics-visits-data.vue b/apps/web-antdv-next/src/views/dashboard/analytics/analytics-visits-data.vue
deleted file mode 100644
index 190fb41f..00000000
--- a/apps/web-antdv-next/src/views/dashboard/analytics/analytics-visits-data.vue
+++ /dev/null
@@ -1,82 +0,0 @@
-
-
-
-
-
diff --git a/apps/web-antdv-next/src/views/dashboard/analytics/analytics-visits-sales.vue b/apps/web-antdv-next/src/views/dashboard/analytics/analytics-visits-sales.vue
deleted file mode 100644
index 6ff52086..00000000
--- a/apps/web-antdv-next/src/views/dashboard/analytics/analytics-visits-sales.vue
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
-
-
diff --git a/apps/web-antdv-next/src/views/dashboard/analytics/analytics-visits-source.vue b/apps/web-antdv-next/src/views/dashboard/analytics/analytics-visits-source.vue
deleted file mode 100644
index 0915c7af..00000000
--- a/apps/web-antdv-next/src/views/dashboard/analytics/analytics-visits-source.vue
+++ /dev/null
@@ -1,65 +0,0 @@
-
-
-
-
-
diff --git a/apps/web-antdv-next/src/views/dashboard/analytics/analytics-visits.vue b/apps/web-antdv-next/src/views/dashboard/analytics/analytics-visits.vue
deleted file mode 100644
index 7e0f1013..00000000
--- a/apps/web-antdv-next/src/views/dashboard/analytics/analytics-visits.vue
+++ /dev/null
@@ -1,55 +0,0 @@
-
-
-
-
-
diff --git a/apps/web-antdv-next/src/views/dashboard/analytics/index.vue b/apps/web-antdv-next/src/views/dashboard/analytics/index.vue
deleted file mode 100644
index 5e3d6d28..00000000
--- a/apps/web-antdv-next/src/views/dashboard/analytics/index.vue
+++ /dev/null
@@ -1,90 +0,0 @@
-
-
-
-
-
diff --git a/apps/web-antdv-next/src/views/dashboard/workspace/index.vue b/apps/web-antdv-next/src/views/dashboard/workspace/index.vue
deleted file mode 100644
index b95d6138..00000000
--- a/apps/web-antdv-next/src/views/dashboard/workspace/index.vue
+++ /dev/null
@@ -1,266 +0,0 @@
-
-
-
-
-
-
- 早安, {{ userStore.userInfo?.realName }}, 开始您一天的工作吧!
-
- 今日晴,20℃ - 32℃!
-
-
-
-
-
diff --git a/apps/web-antdv-next/src/views/demos/antd/index.vue b/apps/web-antdv-next/src/views/demos/antd/index.vue
deleted file mode 100644
index 6fb1998d..00000000
--- a/apps/web-antdv-next/src/views/demos/antd/index.vue
+++ /dev/null
@@ -1,66 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/web-antdv-next/tailwind.config.mjs b/apps/web-antdv-next/tailwind.config.mjs
deleted file mode 100644
index f17f556f..00000000
--- a/apps/web-antdv-next/tailwind.config.mjs
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from '@vben/tailwind-config';
diff --git a/apps/web-antdv-next/tsconfig.json b/apps/web-antdv-next/tsconfig.json
deleted file mode 100644
index 02c287fe..00000000
--- a/apps/web-antdv-next/tsconfig.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "$schema": "https://json.schemastore.org/tsconfig",
- "extends": "@vben/tsconfig/web-app.json",
- "compilerOptions": {
- "baseUrl": ".",
- "paths": {
- "#/*": ["./src/*"]
- }
- },
- "references": [{ "path": "./tsconfig.node.json" }],
- "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
-}
diff --git a/apps/web-antdv-next/tsconfig.node.json b/apps/web-antdv-next/tsconfig.node.json
deleted file mode 100644
index c2f0d86c..00000000
--- a/apps/web-antdv-next/tsconfig.node.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "$schema": "https://json.schemastore.org/tsconfig",
- "extends": "@vben/tsconfig/node.json",
- "compilerOptions": {
- "composite": true,
- "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
- "noEmit": false
- },
- "include": ["vite.config.mts"]
-}
diff --git a/apps/web-antdv-next/vite.config.mts b/apps/web-antdv-next/vite.config.mts
deleted file mode 100644
index b6360f1d..00000000
--- a/apps/web-antdv-next/vite.config.mts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { defineConfig } from '@vben/vite-config';
-
-export default defineConfig(async () => {
- return {
- application: {},
- vite: {
- server: {
- proxy: {
- '/api': {
- changeOrigin: true,
- rewrite: (path) => path.replace(/^\/api/, ''),
- // mock代理目标地址
- target: 'http://localhost:5320/api',
- ws: true,
- },
- },
- },
- },
- };
-});