mirror of
https://github.com/soybeanjs/soybean-admin.git
synced 2025-10-14 13:53:41 +08:00
Compare commits
31 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
a6a47247ff | ||
|
4cc1487f46 | ||
|
b8112613ea | ||
|
a1a5c74c74 | ||
|
be6080ba0f | ||
|
3e0076d466 | ||
|
52c336d7e0 | ||
|
a03becdaed | ||
|
15163d7011 | ||
|
132e101243 | ||
|
9b9455d945 | ||
|
86da767e24 | ||
|
54e7d6d00a | ||
|
5cf3236475 | ||
|
6489ec46ae | ||
|
ac86247876 | ||
|
c9433e1710 | ||
|
60dd22624b | ||
|
56760245d4 | ||
|
d7aebb7dfa | ||
|
214341ee0b | ||
|
2849463bd6 | ||
|
101b6f9000 | ||
|
3e0eb72025 | ||
|
9f4fb8c3fb | ||
|
0dfcf18b64 | ||
|
ba38119efd | ||
|
ab9858c7d0 | ||
|
5c6ab0b595 | ||
|
b93c2036ac | ||
|
af4177e70b |
3
.env
3
.env
@@ -51,3 +51,6 @@ VITE_STORAGE_PREFIX=SOY_
|
|||||||
|
|
||||||
# used to control whether the program automatically detects updates
|
# used to control whether the program automatically detects updates
|
||||||
VITE_AUTOMATICALLY_DETECT_UPDATE=Y
|
VITE_AUTOMATICALLY_DETECT_UPDATE=Y
|
||||||
|
|
||||||
|
# show proxy url log in terminal
|
||||||
|
VITE_PROXY_LOG=Y
|
||||||
|
98
CHANGELOG.md
98
CHANGELOG.md
@@ -1,6 +1,104 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
|
||||||
|
## [v1.3.12](https://github.com/soybeanjs/soybean-admin/compare/v1.3.11...v1.3.12) (2025-03-12)
|
||||||
|
|
||||||
|
### 🚀 Features
|
||||||
|
|
||||||
|
- **projects**:
|
||||||
|
- support loading page dark mode adaptation. - by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/702 [<samp>(9b945)</samp>](https://github.com/soybeanjs/soybean-admin/commit/9b9455d9)
|
||||||
|
- tab support touch event - by @soybeanjs [<samp>(a03be)</samp>](https://github.com/soybeanjs/soybean-admin/commit/a03becda)
|
||||||
|
- support proxy log in terminal - by @soybeanjs [<samp>(4cc14)</samp>](https://github.com/soybeanjs/soybean-admin/commit/4cc1487f)
|
||||||
|
- **projects): feat(projects**:
|
||||||
|
- TableColumnCheck title support VNode - by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/716 [<samp>(a1a5c)</samp>](https://github.com/soybeanjs/soybean-admin/commit/a1a5c74c)
|
||||||
|
- **utils**:
|
||||||
|
- support replaceTab. - by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/713 [<samp>(be608)</samp>](https://github.com/soybeanjs/soybean-admin/commit/be6080ba)
|
||||||
|
|
||||||
|
### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- **projects**:
|
||||||
|
- hidden multi-language button in login page. fix #694 - by **Azir** in https://github.com/soybeanjs/soybean-admin/issues/694 [<samp>(54e7d)</samp>](https://github.com/soybeanjs/soybean-admin/commit/54e7d6d0)
|
||||||
|
- fix multiple calls to the login API when clicking quickly. fixed #697 - by @zsdycs in https://github.com/soybeanjs/soybean-admin/issues/698 and https://github.com/soybeanjs/soybean-admin/issues/697 [<samp>(86da7)</samp>](https://github.com/soybeanjs/soybean-admin/commit/86da767e)
|
||||||
|
- fix multiple calls to the login API when clicking quickly. fixed #697 " - by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/698 and https://github.com/soybeanjs/soybean-admin/issues/697 [<samp>(15163)</samp>](https://github.com/soybeanjs/soybean-admin/commit/15163d70)
|
||||||
|
|
||||||
|
### 🏡 Chore
|
||||||
|
|
||||||
|
- **deps**:
|
||||||
|
- update deps - by @soybeanjs [<samp>(132e1)</samp>](https://github.com/soybeanjs/soybean-admin/commit/132e1012)
|
||||||
|
- update deps - by **Azir** [<samp>(52c33)</samp>](https://github.com/soybeanjs/soybean-admin/commit/52c336d7)
|
||||||
|
- update deps - by @soybeanjs [<samp>(b8112)</samp>](https://github.com/soybeanjs/soybean-admin/commit/b8112613)
|
||||||
|
- **projects**:
|
||||||
|
- update unocss preset - by @Wangijun in https://github.com/soybeanjs/soybean-admin/issues/712 [<samp>(3e007)</samp>](https://github.com/soybeanjs/soybean-admin/commit/3e0076d4)
|
||||||
|
|
||||||
|
### ❤️ Contributors
|
||||||
|
|
||||||
|
[](https://github.com/soybeanjs) [](https://github.com/Azir-11) [](https://github.com/Wangijun) [](https://github.com/zsdycs)
|
||||||
|
[Azir](mailto:2075125282@qq.com),
|
||||||
|
|
||||||
|
## [v1.3.11](https://github.com/soybeanjs/soybean-admin/compare/v1.3.10...v1.3.11) (2025-01-19)
|
||||||
|
|
||||||
|
### 🚀 Features
|
||||||
|
|
||||||
|
- **projects**: multi language buttons support hiding. - by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/683 [<samp>(d7aeb)</samp>](https://github.com/soybeanjs/soybean-admin/commit/d7aebb7)
|
||||||
|
|
||||||
|
### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- **hooks**:
|
||||||
|
- The total number before assigning a value to the table is incorrect. - by @Azir-11 in https://github.com/soybeanjs/soybean-admin/issues/687 [<samp>(56760)</samp>](https://github.com/soybeanjs/soybean-admin/commit/5676024)
|
||||||
|
- **projects**:
|
||||||
|
- fix login success notification. fixed #688 - by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/688 [<samp>(60dd2)</samp>](https://github.com/soybeanjs/soybean-admin/commit/60dd226)
|
||||||
|
- fix update notifications. fixed #691, fixed #692 - by @soybeanjs in https://github.com/soybeanjs/soybean-admin/issues/691 and https://github.com/soybeanjs/soybean-admin/issues/692 [<samp>(ac862)</samp>](https://github.com/soybeanjs/soybean-admin/commit/ac86247)
|
||||||
|
|
||||||
|
### 🛠 Optimizations
|
||||||
|
|
||||||
|
- **projects**: optimize code - by @soybeanjs [<samp>(6489e)</samp>](https://github.com/soybeanjs/soybean-admin/commit/6489ec4)
|
||||||
|
|
||||||
|
### 📖 Documentation
|
||||||
|
|
||||||
|
- **projects**: update README - by @soybeanjs [<samp>(21434)</samp>](https://github.com/soybeanjs/soybean-admin/commit/214341e)
|
||||||
|
|
||||||
|
### 🏡 Chore
|
||||||
|
|
||||||
|
- **deps**: update deps - by @soybeanjs [<samp>(c9433)</samp>](https://github.com/soybeanjs/soybean-admin/commit/c9433e1)
|
||||||
|
|
||||||
|
### ❤️ Contributors
|
||||||
|
|
||||||
|
[](https://github.com/soybeanjs) [](https://github.com/Azir-11)
|
||||||
|
|
||||||
|
## [v1.3.10](https://github.com/honghuangdc/soybean-admin/compare/v1.3.9...v1.3.10) (2024-12-16)
|
||||||
|
|
||||||
|
### 🚀 Features
|
||||||
|
|
||||||
|
- **projects**: support show tab when not loggedIn - by @soybeanjs [<samp>(ba381)</samp>](https://github.com/honghuangdc/soybean-admin/commit/ba38119)
|
||||||
|
|
||||||
|
### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- **deps**:
|
||||||
|
- reduced eslint version to 9.14.0 - by @soybeanjs [<samp>(af417)</samp>](https://github.com/honghuangdc/soybean-admin/commit/af4177e)
|
||||||
|
- **projects**:
|
||||||
|
- fix route guard hook `onRouteSwitchWhenLoggedIn`. fixed #680 - by @soybeanjs in https://github.com/honghuangdc/soybean-admin/issues/680 [<samp>(ab985)</samp>](https://github.com/honghuangdc/soybean-admin/commit/ab9858c)
|
||||||
|
- check if init userInfo when initAuthRoute. fixed #680 - by @soybeanjs in https://github.com/honghuangdc/soybean-admin/issues/680 [<samp>(9f4fb)</samp>](https://github.com/honghuangdc/soybean-admin/commit/9f4fb8c)
|
||||||
|
|
||||||
|
### 🛠 Optimizations
|
||||||
|
|
||||||
|
- **projects**:
|
||||||
|
- optimize router guard - by @soybeanjs [<samp>(0dfcf)</samp>](https://github.com/honghuangdc/soybean-admin/commit/0dfcf18)
|
||||||
|
- use `defu` to fill added theme config - by @soybeanjs [<samp>(101b6)</samp>](https://github.com/honghuangdc/soybean-admin/commit/101b6f9)
|
||||||
|
|
||||||
|
### 📖 Documentation
|
||||||
|
|
||||||
|
- **projects**: ✏️ add element-plus version link - by **一寸灰** in https://github.com/honghuangdc/soybean-admin/issues/679 [<samp>(5c6ab)</samp>](https://github.com/honghuangdc/soybean-admin/commit/5c6ab0b)
|
||||||
|
|
||||||
|
### 🏡 Chore
|
||||||
|
|
||||||
|
- rename env.d.ts to vite-env.d.ts - by @wzc520pyfm in https://github.com/honghuangdc/soybean-admin/issues/675 [<samp>(b93c2)</samp>](https://github.com/honghuangdc/soybean-admin/commit/b93c203)
|
||||||
|
- **projects**: update deps & fix vite config - by @soybeanjs [<samp>(3e0eb)</samp>](https://github.com/honghuangdc/soybean-admin/commit/3e0eb72)
|
||||||
|
|
||||||
|
### ❤️ Contributors
|
||||||
|
|
||||||
|
[](https://github.com/soybeanjs) [](https://github.com/wzc520pyfm)
|
||||||
|
[一寸灰](mailto:webzhangfei@163.com),
|
||||||
|
|
||||||
## [v1.3.9](https://github.com/soybeanjs/soybean-admin/compare/v1.3.8...v1.3.9) (2024-11-17)
|
## [v1.3.9](https://github.com/soybeanjs/soybean-admin/compare/v1.3.8...v1.3.9) (2024-11-17)
|
||||||
|
|
||||||
### 🚀 Features
|
### 🚀 Features
|
||||||
|
@@ -49,6 +49,10 @@
|
|||||||
- [Github Repository](https://github.com/soybeanjs/soybean-admin-antd)
|
- [Github Repository](https://github.com/soybeanjs/soybean-admin-antd)
|
||||||
- [Gitee Repository](https://gitee.com/honghuangdc/soybean-admin-antd)
|
- [Gitee Repository](https://gitee.com/honghuangdc/soybean-admin-antd)
|
||||||
|
|
||||||
|
- **ElementPlus Version:**
|
||||||
|
- [Preview Link](https://elp.soybeanjs.cn/)
|
||||||
|
- [Github Repository](https://github.com/soybeanjs/soybean-admin-element-plus)
|
||||||
|
|
||||||
- **Legacy Version:**
|
- **Legacy Version:**
|
||||||
- [Preview Link](https://legacy.soybeanjs.cn/)
|
- [Preview Link](https://legacy.soybeanjs.cn/)
|
||||||
- [Github Repository](https://github.com/soybeanjs/soybean-admin/tree/legacy)
|
- [Github Repository](https://github.com/soybeanjs/soybean-admin/tree/legacy)
|
||||||
@@ -109,6 +113,10 @@ pnpm dev
|
|||||||
pnpm build
|
pnpm build
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Code Synchronization**
|
||||||
|
|
||||||
|
Refer to the [Code Synchronization](https://docs.soybeanjs.cn/guide/sync) document.
|
||||||
|
|
||||||
## Ecosystem
|
## Ecosystem
|
||||||
|
|
||||||
- [react-soybean-admin](https://github.com/mufeng889/react-soybean-admin): SoybeanAdmin based version of React.
|
- [react-soybean-admin](https://github.com/mufeng889/react-soybean-admin): SoybeanAdmin based version of React.
|
||||||
|
@@ -41,12 +41,13 @@
|
|||||||
- [预览地址](https://naive.soybeanjs.cn/)
|
- [预览地址](https://naive.soybeanjs.cn/)
|
||||||
- [Github 仓库](https://github.com/soybeanjs/soybean-admin)
|
- [Github 仓库](https://github.com/soybeanjs/soybean-admin)
|
||||||
- [Gitee 仓库](https://gitee.com/honghuangdc/soybean-admin)
|
- [Gitee 仓库](https://gitee.com/honghuangdc/soybean-admin)
|
||||||
|
|
||||||
- **AntDesignVue 版本:**
|
- **AntDesignVue 版本:**
|
||||||
- [预览地址](https://antd.soybeanjs.cn/)
|
- [预览地址](https://antd.soybeanjs.cn/)
|
||||||
- [Github 仓库](https://github.com/soybeanjs/soybean-admin-antd)
|
- [Github 仓库](https://github.com/soybeanjs/soybean-admin-antd)
|
||||||
- [Gitee 仓库](https://gitee.com/honghuangdc/soybean-admin-antd)
|
- [Gitee 仓库](https://gitee.com/honghuangdc/soybean-admin-antd)
|
||||||
|
- **ElementPlus 版本:**
|
||||||
|
- [预览地址](https://elp.soybeanjs.cn/)
|
||||||
|
- [Github 仓库](https://github.com/soybeanjs/soybean-admin-element-plus)
|
||||||
- **旧版:**
|
- **旧版:**
|
||||||
- [预览地址](https://legacy.soybeanjs.cn/)
|
- [预览地址](https://legacy.soybeanjs.cn/)
|
||||||
- [Github 仓库](https://github.com/soybeanjs/soybean-admin/tree/legacy)
|
- [Github 仓库](https://github.com/soybeanjs/soybean-admin/tree/legacy)
|
||||||
@@ -137,6 +138,10 @@ pnpm dev
|
|||||||
pnpm build
|
pnpm build
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**代码同步**
|
||||||
|
|
||||||
|
参考 [代码同步](https://docs.soybeanjs.cn/zh/guide/sync) 文档。
|
||||||
|
|
||||||
## 周边生态
|
## 周边生态
|
||||||
|
|
||||||
- [react-soybean-admin](https://github.com/mufeng889/react-soybean-admin): 基于SoybeanAdmin的React版本.
|
- [react-soybean-admin](https://github.com/mufeng889/react-soybean-admin): 基于SoybeanAdmin的React版本.
|
||||||
|
@@ -1,4 +1,6 @@
|
|||||||
import type { ProxyOptions } from 'vite';
|
import type { HttpProxy, ProxyOptions } from 'vite';
|
||||||
|
import { bgRed, bgYellow, green, lightBlue } from 'kolorist';
|
||||||
|
import { consola } from 'consola';
|
||||||
import { createServiceConfig } from '../../src/utils/service';
|
import { createServiceConfig } from '../../src/utils/service';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -12,23 +14,40 @@ export function createViteProxy(env: Env.ImportMeta, enable: boolean) {
|
|||||||
|
|
||||||
if (!isEnableHttpProxy) return undefined;
|
if (!isEnableHttpProxy) return undefined;
|
||||||
|
|
||||||
|
const isEnableProxyLog = env.VITE_PROXY_LOG === 'Y';
|
||||||
|
|
||||||
const { baseURL, proxyPattern, other } = createServiceConfig(env);
|
const { baseURL, proxyPattern, other } = createServiceConfig(env);
|
||||||
|
|
||||||
const proxy: Record<string, ProxyOptions> = createProxyItem({ baseURL, proxyPattern });
|
const proxy: Record<string, ProxyOptions> = createProxyItem({ baseURL, proxyPattern }, isEnableProxyLog);
|
||||||
|
|
||||||
other.forEach(item => {
|
other.forEach(item => {
|
||||||
Object.assign(proxy, createProxyItem(item));
|
Object.assign(proxy, createProxyItem(item, isEnableProxyLog));
|
||||||
});
|
});
|
||||||
|
|
||||||
return proxy;
|
return proxy;
|
||||||
}
|
}
|
||||||
|
|
||||||
function createProxyItem(item: App.Service.ServiceConfigItem) {
|
function createProxyItem(item: App.Service.ServiceConfigItem, enableLog: boolean) {
|
||||||
const proxy: Record<string, ProxyOptions> = {};
|
const proxy: Record<string, ProxyOptions> = {};
|
||||||
|
|
||||||
proxy[item.proxyPattern] = {
|
proxy[item.proxyPattern] = {
|
||||||
target: item.baseURL,
|
target: item.baseURL,
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
|
configure: (_proxy: HttpProxy.Server, options: ProxyOptions) => {
|
||||||
|
_proxy.on('proxyReq', (_proxyReq, req, _res) => {
|
||||||
|
if (!enableLog) return;
|
||||||
|
|
||||||
|
const requestUrl = `${lightBlue('[proxy url]')}: ${bgYellow(` ${req.method} `)} ${green(`${item.proxyPattern}${req.url}`)}`;
|
||||||
|
|
||||||
|
const proxyUrl = `${lightBlue('[real request url]')}: ${green(`${options.target}${req.url}`)}`;
|
||||||
|
|
||||||
|
consola.log(`${requestUrl}\n${proxyUrl}`);
|
||||||
|
});
|
||||||
|
_proxy.on('error', (_err, req, _res) => {
|
||||||
|
if (!enableLog) return;
|
||||||
|
consola.log(bgRed(`Error: ${req.method} `), green(`${options.target}${req.url}`));
|
||||||
|
});
|
||||||
|
},
|
||||||
rewrite: path => path.replace(new RegExp(`^${item.proxyPattern}`), '')
|
rewrite: path => path.replace(new RegExp(`^${item.proxyPattern}`), '')
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -1,12 +1,12 @@
|
|||||||
import process from 'node:process';
|
import process from 'node:process';
|
||||||
import path from 'node:path';
|
import path from 'node:path';
|
||||||
import type { PluginOption } from 'vite';
|
import type { PluginOption } from 'vite';
|
||||||
|
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons';
|
||||||
import Icons from 'unplugin-icons/vite';
|
import Icons from 'unplugin-icons/vite';
|
||||||
import IconsResolver from 'unplugin-icons/resolver';
|
import IconsResolver from 'unplugin-icons/resolver';
|
||||||
import Components from 'unplugin-vue-components/vite';
|
import Components from 'unplugin-vue-components/vite';
|
||||||
import { NaiveUiResolver } from 'unplugin-vue-components/resolvers';
|
import { NaiveUiResolver } from 'unplugin-vue-components/resolvers';
|
||||||
import { FileSystemIconLoader } from 'unplugin-icons/loaders';
|
import { FileSystemIconLoader } from 'unplugin-icons/loaders';
|
||||||
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons';
|
|
||||||
|
|
||||||
export function setupUnplugin(viteEnv: Env.ImportMeta) {
|
export function setupUnplugin(viteEnv: Env.ImportMeta) {
|
||||||
const { VITE_ICON_PREFIX, VITE_ICON_LOCAL_PREFIX } = viteEnv;
|
const { VITE_ICON_PREFIX, VITE_ICON_LOCAL_PREFIX } = viteEnv;
|
||||||
|
67
package.json
67
package.json
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "soybean-admin",
|
"name": "soybean-admin",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "1.3.9",
|
"version": "1.3.12",
|
||||||
"description": "A fresh and elegant admin template, based on Vue3、Vite3、TypeScript、NaiveUI and UnoCSS. 一个基于Vue3、Vite3、TypeScript、NaiveUI and UnoCSS的清新优雅的中后台模版。",
|
"description": "A fresh and elegant admin template, based on Vue3、Vite3、TypeScript、NaiveUI and UnoCSS. 一个基于Vue3、Vite3、TypeScript、NaiveUI and UnoCSS的清新优雅的中后台模版。",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Soybean",
|
"name": "Soybean",
|
||||||
@@ -48,57 +48,60 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@better-scroll/core": "2.5.1",
|
"@better-scroll/core": "2.5.1",
|
||||||
"@iconify/vue": "4.1.2",
|
"@iconify/vue": "4.3.0",
|
||||||
"@sa/axios": "workspace:*",
|
"@sa/axios": "workspace:*",
|
||||||
"@sa/color": "workspace:*",
|
"@sa/color": "workspace:*",
|
||||||
"@sa/hooks": "workspace:*",
|
"@sa/hooks": "workspace:*",
|
||||||
"@sa/materials": "workspace:*",
|
"@sa/materials": "workspace:*",
|
||||||
"@sa/utils": "workspace:*",
|
"@sa/utils": "workspace:*",
|
||||||
"@vueuse/core": "11.2.0",
|
"@vueuse/core": "13.0.0",
|
||||||
"clipboard": "2.0.11",
|
"clipboard": "2.0.11",
|
||||||
"dayjs": "1.11.13",
|
"dayjs": "1.11.13",
|
||||||
"echarts": "5.5.1",
|
"defu": "6.1.4",
|
||||||
|
"echarts": "5.6.0",
|
||||||
"json5": "2.2.3",
|
"json5": "2.2.3",
|
||||||
"naive-ui": "2.40.1",
|
"naive-ui": "2.41.0",
|
||||||
"nprogress": "0.2.0",
|
"nprogress": "0.2.0",
|
||||||
"pinia": "2.2.6",
|
"pinia": "3.0.1",
|
||||||
"tailwind-merge": "2.5.4",
|
"tailwind-merge": "3.0.2",
|
||||||
"vue": "3.5.13",
|
"vue": "3.5.13",
|
||||||
"vue-draggable-plus": "0.6.0",
|
"vue-draggable-plus": "0.6.0",
|
||||||
"vue-i18n": "10.0.4",
|
"vue-i18n": "11.1.2",
|
||||||
"vue-router": "4.4.5"
|
"vue-router": "4.5.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@elegant-router/vue": "0.3.8",
|
"@elegant-router/vue": "0.3.8",
|
||||||
"@iconify/json": "2.2.273",
|
"@iconify/json": "2.2.316",
|
||||||
"@sa/scripts": "workspace:*",
|
"@sa/scripts": "workspace:*",
|
||||||
"@sa/uno-preset": "workspace:*",
|
"@sa/uno-preset": "workspace:*",
|
||||||
"@soybeanjs/eslint-config": "1.4.2",
|
"@soybeanjs/eslint-config": "1.6.0",
|
||||||
"@types/node": "22.9.0",
|
"@types/node": "22.13.10",
|
||||||
"@types/nprogress": "0.2.3",
|
"@types/nprogress": "0.2.3",
|
||||||
"@unocss/eslint-config": "0.64.1",
|
"@unocss/eslint-config": "66.0.0",
|
||||||
"@unocss/preset-icons": "0.64.1",
|
"@unocss/preset-icons": "66.0.0",
|
||||||
"@unocss/preset-uno": "0.64.1",
|
"@unocss/preset-uno": "66.0.0",
|
||||||
"@unocss/transformer-directives": "0.64.1",
|
"@unocss/transformer-directives": "66.0.0",
|
||||||
"@unocss/transformer-variant-group": "0.64.1",
|
"@unocss/transformer-variant-group": "66.0.0",
|
||||||
"@unocss/vite": "0.64.1",
|
"@unocss/vite": "66.0.0",
|
||||||
"@vitejs/plugin-vue": "5.2.0",
|
"@vitejs/plugin-vue": "5.2.1",
|
||||||
"@vitejs/plugin-vue-jsx": "4.1.0",
|
"@vitejs/plugin-vue-jsx": "4.1.1",
|
||||||
"eslint": "9.15.0",
|
"consola": "3.4.0",
|
||||||
"eslint-plugin-vue": "9.31.0",
|
"eslint": "9.22.0",
|
||||||
"lint-staged": "15.2.10",
|
"eslint-plugin-vue": "10.0.0",
|
||||||
"sass": "1.81.0",
|
"kolorist": "1.8.0",
|
||||||
|
"lint-staged": "15.4.3",
|
||||||
|
"sass": "1.85.1",
|
||||||
"simple-git-hooks": "2.11.1",
|
"simple-git-hooks": "2.11.1",
|
||||||
"tsx": "4.19.2",
|
"tsx": "4.19.3",
|
||||||
"typescript": "5.6.3",
|
"typescript": "5.8.2",
|
||||||
"unplugin-icons": "0.20.1",
|
"unplugin-icons": "22.1.0",
|
||||||
"unplugin-vue-components": "0.27.4",
|
"unplugin-vue-components": "28.4.1",
|
||||||
"vite": "5.4.11",
|
"vite": "6.2.1",
|
||||||
"vite-plugin-progress": "0.0.7",
|
"vite-plugin-progress": "0.0.7",
|
||||||
"vite-plugin-svg-icons": "2.0.1",
|
"vite-plugin-svg-icons": "2.0.1",
|
||||||
"vite-plugin-vue-devtools": "7.6.4",
|
"vite-plugin-vue-devtools": "7.7.2",
|
||||||
"vue-eslint-parser": "9.4.3",
|
"vue-eslint-parser": "10.1.1",
|
||||||
"vue-tsc": "2.1.10"
|
"vue-tsc": "2.2.8"
|
||||||
},
|
},
|
||||||
"simple-git-hooks": {
|
"simple-git-hooks": {
|
||||||
"commit-msg": "pnpm sa git-commit-verify",
|
"commit-msg": "pnpm sa git-commit-verify",
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@sa/alova",
|
"name": "@sa/alova",
|
||||||
"version": "1.3.9",
|
"version": "1.3.12",
|
||||||
"exports": {
|
"exports": {
|
||||||
".": "./src/index.ts",
|
".": "./src/index.ts",
|
||||||
"./fetch": "./src/fetch.ts",
|
"./fetch": "./src/fetch.ts",
|
||||||
@@ -13,8 +13,8 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@alova/mock": "2.0.9",
|
"@alova/mock": "2.0.12",
|
||||||
"@sa/utils": "workspace:*",
|
"@sa/utils": "workspace:*",
|
||||||
"alova": "3.2.3"
|
"alova": "3.2.10"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@sa/axios",
|
"name": "@sa/axios",
|
||||||
"version": "1.3.9",
|
"version": "1.3.12",
|
||||||
"exports": {
|
"exports": {
|
||||||
".": "./src/index.ts"
|
".": "./src/index.ts"
|
||||||
},
|
},
|
||||||
@@ -11,11 +11,11 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@sa/utils": "workspace:*",
|
"@sa/utils": "workspace:*",
|
||||||
"axios": "1.7.7",
|
"axios": "1.8.3",
|
||||||
"axios-retry": "4.5.0",
|
"axios-retry": "4.5.0",
|
||||||
"qs": "6.13.0"
|
"qs": "6.14.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/qs": "6.9.17"
|
"@types/qs": "6.9.18"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@sa/color",
|
"name": "@sa/color",
|
||||||
"version": "1.3.9",
|
"version": "1.3.12",
|
||||||
"exports": {
|
"exports": {
|
||||||
".": "./src/index.ts"
|
".": "./src/index.ts"
|
||||||
},
|
},
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@sa/hooks",
|
"name": "@sa/hooks",
|
||||||
"version": "1.3.9",
|
"version": "1.3.12",
|
||||||
"exports": {
|
"exports": {
|
||||||
".": "./src/index.ts"
|
".": "./src/index.ts"
|
||||||
},
|
},
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
import { computed, reactive, ref } from 'vue';
|
import { computed, reactive, ref } from 'vue';
|
||||||
import type { Ref } from 'vue';
|
import type { Ref, VNodeChild } from 'vue';
|
||||||
import { jsonClone } from '@sa/utils';
|
import { jsonClone } from '@sa/utils';
|
||||||
import useBoolean from './use-boolean';
|
import useBoolean from './use-boolean';
|
||||||
import useLoading from './use-loading';
|
import useLoading from './use-loading';
|
||||||
@@ -8,9 +8,11 @@ export type MaybePromise<T> = T | Promise<T>;
|
|||||||
|
|
||||||
export type ApiFn = (args: any) => Promise<unknown>;
|
export type ApiFn = (args: any) => Promise<unknown>;
|
||||||
|
|
||||||
|
export type TableColumnCheckTitle = string | ((...args: any) => VNodeChild);
|
||||||
|
|
||||||
export type TableColumnCheck = {
|
export type TableColumnCheck = {
|
||||||
key: string;
|
key: string;
|
||||||
title: string;
|
title: TableColumnCheckTitle;
|
||||||
checked: boolean;
|
checked: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@sa/materials",
|
"name": "@sa/materials",
|
||||||
"version": "1.3.9",
|
"version": "1.3.12",
|
||||||
"exports": {
|
"exports": {
|
||||||
".": "./src/index.ts"
|
".": "./src/index.ts"
|
||||||
},
|
},
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@sa/utils": "workspace:*",
|
"@sa/utils": "workspace:*",
|
||||||
"simplebar-vue": "2.3.5"
|
"simplebar-vue": "2.4.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"typed-css-modules": "0.9.1"
|
"typed-css-modules": "0.9.1"
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@sa/fetch",
|
"name": "@sa/fetch",
|
||||||
"version": "1.3.9",
|
"version": "1.3.12",
|
||||||
"exports": {
|
"exports": {
|
||||||
".": "./src/index.ts"
|
".": "./src/index.ts"
|
||||||
},
|
},
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@sa/scripts",
|
"name": "@sa/scripts",
|
||||||
"version": "1.3.9",
|
"version": "1.3.12",
|
||||||
"bin": {
|
"bin": {
|
||||||
"sa": "./bin.ts"
|
"sa": "./bin.ts"
|
||||||
},
|
},
|
||||||
@@ -14,14 +14,14 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@soybeanjs/changelog": "0.3.24",
|
"@soybeanjs/changelog": "0.3.24",
|
||||||
"bumpp": "9.8.1",
|
"bumpp": "10.1.0",
|
||||||
"c12": "2.0.1",
|
"c12": "3.0.2",
|
||||||
"cac": "6.7.14",
|
"cac": "6.7.14",
|
||||||
"consola": "3.2.3",
|
"consola": "3.4.0",
|
||||||
"enquirer": "2.4.1",
|
"enquirer": "2.4.1",
|
||||||
"execa": "9.5.1",
|
"execa": "9.5.2",
|
||||||
"kolorist": "1.8.0",
|
"kolorist": "1.8.0",
|
||||||
"npm-check-updates": "17.1.11",
|
"npm-check-updates": "17.1.15",
|
||||||
"rimraf": "6.0.1"
|
"rimraf": "6.0.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@sa/uno-preset",
|
"name": "@sa/uno-preset",
|
||||||
"version": "1.3.9",
|
"version": "1.3.12",
|
||||||
"exports": {
|
"exports": {
|
||||||
".": "./src/index.ts"
|
".": "./src/index.ts"
|
||||||
},
|
},
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@sa/utils",
|
"name": "@sa/utils",
|
||||||
"version": "1.3.9",
|
"version": "1.3.12",
|
||||||
"exports": {
|
"exports": {
|
||||||
".": "./src/index.ts"
|
".": "./src/index.ts"
|
||||||
},
|
},
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
"crypto-js": "4.2.0",
|
"crypto-js": "4.2.0",
|
||||||
"klona": "2.0.6",
|
"klona": "2.0.6",
|
||||||
"localforage": "1.10.0",
|
"localforage": "1.10.0",
|
||||||
"nanoid": "5.0.8"
|
"nanoid": "5.1.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/crypto-js": "4.2.2"
|
"@types/crypto-js": "4.2.2"
|
||||||
|
4647
pnpm-lock.yaml
generated
4647
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -25,7 +25,7 @@ const naiveDateLocale = computed(() => {
|
|||||||
|
|
||||||
const watermarkProps = computed<WatermarkProps>(() => {
|
const watermarkProps = computed<WatermarkProps>(() => {
|
||||||
return {
|
return {
|
||||||
content: themeStore.watermark?.text || 'SoybeanAdmin',
|
content: themeStore.watermark.text,
|
||||||
cross: true,
|
cross: true,
|
||||||
fullscreen: true,
|
fullscreen: true,
|
||||||
fontSize: 16,
|
fontSize: 16,
|
||||||
@@ -50,7 +50,7 @@ const watermarkProps = computed<WatermarkProps>(() => {
|
|||||||
>
|
>
|
||||||
<AppProvider>
|
<AppProvider>
|
||||||
<RouterView class="bg-layout" />
|
<RouterView class="bg-layout" />
|
||||||
<NWatermark v-if="themeStore.watermark?.visible" v-bind="watermarkProps" />
|
<NWatermark v-if="themeStore.watermark.visible" v-bind="watermarkProps" />
|
||||||
</AppProvider>
|
</AppProvider>
|
||||||
</NConfigProvider>
|
</NConfigProvider>
|
||||||
</template>
|
</template>
|
||||||
|
@@ -25,7 +25,10 @@ const columns = defineModel<NaiveUI.TableColumnCheck[]>('columns', {
|
|||||||
<div v-for="item in columns" :key="item.key" class="h-36px flex-y-center rd-4px hover:(bg-primary bg-opacity-20)">
|
<div v-for="item in columns" :key="item.key" class="h-36px flex-y-center rd-4px hover:(bg-primary bg-opacity-20)">
|
||||||
<icon-mdi-drag class="mr-8px h-full cursor-move text-icon" />
|
<icon-mdi-drag class="mr-8px h-full cursor-move text-icon" />
|
||||||
<NCheckbox v-model:checked="item.checked" class="none_draggable flex-1">
|
<NCheckbox v-model:checked="item.checked" class="none_draggable flex-1">
|
||||||
{{ item.title }}
|
<template v-if="typeof item.title === 'function'">
|
||||||
|
<component :is="item.title" />
|
||||||
|
</template>
|
||||||
|
<template v-else>{{ item.title }}</template>
|
||||||
</NCheckbox>
|
</NCheckbox>
|
||||||
</div>
|
</div>
|
||||||
</VueDraggable>
|
</VueDraggable>
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { computed } from 'vue';
|
import { computed } from 'vue';
|
||||||
import { $t } from '@/locales';
|
|
||||||
import { useRouterPush } from '@/hooks/common/router';
|
import { useRouterPush } from '@/hooks/common/router';
|
||||||
|
import { $t } from '@/locales';
|
||||||
|
|
||||||
defineOptions({ name: 'ExceptionBase' });
|
defineOptions({ name: 'ExceptionBase' });
|
||||||
|
|
||||||
|
@@ -61,3 +61,5 @@ export const resetCacheStrategyRecord: Record<UnionKey.ResetCacheStrategy, App.I
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const resetCacheStrategyOptions = transformRecordToOption(resetCacheStrategyRecord);
|
export const resetCacheStrategyOptions = transformRecordToOption(resetCacheStrategyRecord);
|
||||||
|
|
||||||
|
export const DARK_CLASS = 'dark';
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import { computed } from 'vue';
|
import { computed } from 'vue';
|
||||||
import { useCountDown, useLoading } from '@sa/hooks';
|
import { useCountDown, useLoading } from '@sa/hooks';
|
||||||
import { $t } from '@/locales';
|
|
||||||
import { REG_PHONE } from '@/constants/reg';
|
import { REG_PHONE } from '@/constants/reg';
|
||||||
|
import { $t } from '@/locales';
|
||||||
|
|
||||||
export function useCaptcha() {
|
export function useCaptcha() {
|
||||||
const { loading, startLoading, endLoading } = useLoading();
|
const { loading, startLoading, endLoading } = useLoading();
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
import { computed, effectScope, nextTick, onScopeDispose, ref, watch } from 'vue';
|
import { computed, effectScope, nextTick, onScopeDispose, ref, watch } from 'vue';
|
||||||
|
import { useElementSize } from '@vueuse/core';
|
||||||
import * as echarts from 'echarts/core';
|
import * as echarts from 'echarts/core';
|
||||||
import { BarChart, GaugeChart, LineChart, PictorialBarChart, PieChart, RadarChart, ScatterChart } from 'echarts/charts';
|
import { BarChart, GaugeChart, LineChart, PictorialBarChart, PieChart, RadarChart, ScatterChart } from 'echarts/charts';
|
||||||
import type {
|
import type {
|
||||||
@@ -29,7 +30,6 @@ import type {
|
|||||||
} from 'echarts/components';
|
} from 'echarts/components';
|
||||||
import { LabelLayout, UniversalTransition } from 'echarts/features';
|
import { LabelLayout, UniversalTransition } from 'echarts/features';
|
||||||
import { CanvasRenderer } from 'echarts/renderers';
|
import { CanvasRenderer } from 'echarts/renderers';
|
||||||
import { useElementSize } from '@vueuse/core';
|
|
||||||
import { useThemeStore } from '@/store/modules/theme';
|
import { useThemeStore } from '@/store/modules/theme';
|
||||||
|
|
||||||
export type ECOption = echarts.ComposeOption<
|
export type ECOption = echarts.ComposeOption<
|
||||||
|
@@ -18,12 +18,7 @@ export function useRouterPush(inSetup = true) {
|
|||||||
|
|
||||||
const routerBack = router.back;
|
const routerBack = router.back;
|
||||||
|
|
||||||
interface RouterPushOptions {
|
async function routerPushByKey(key: RouteKey, options?: App.Global.RouterPushOptions) {
|
||||||
query?: Record<string, string>;
|
|
||||||
params?: Record<string, string>;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function routerPushByKey(key: RouteKey, options?: RouterPushOptions) {
|
|
||||||
const { query, params } = options || {};
|
const { query, params } = options || {};
|
||||||
|
|
||||||
const routeLocation: RouteLocationRaw = {
|
const routeLocation: RouteLocationRaw = {
|
||||||
@@ -67,7 +62,7 @@ export function useRouterPush(inSetup = true) {
|
|||||||
async function toLogin(loginModule?: UnionKey.LoginModule, redirectUrl?: string) {
|
async function toLogin(loginModule?: UnionKey.LoginModule, redirectUrl?: string) {
|
||||||
const module = loginModule || 'pwd-login';
|
const module = loginModule || 'pwd-login';
|
||||||
|
|
||||||
const options: RouterPushOptions = {
|
const options: App.Global.RouterPushOptions = {
|
||||||
params: {
|
params: {
|
||||||
module
|
module
|
||||||
}
|
}
|
||||||
@@ -102,9 +97,9 @@ export function useRouterPush(inSetup = true) {
|
|||||||
const redirect = route.value.query?.redirect as string;
|
const redirect = route.value.query?.redirect as string;
|
||||||
|
|
||||||
if (needRedirect && redirect) {
|
if (needRedirect && redirect) {
|
||||||
routerPush(redirect);
|
await routerPush(redirect);
|
||||||
} else {
|
} else {
|
||||||
toHome();
|
await toHome();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -64,7 +64,7 @@ export function useTable<A extends NaiveUI.TableApiFn>(config: NaiveUI.NaiveTabl
|
|||||||
if (isTableColumnHasKey(column)) {
|
if (isTableColumnHasKey(column)) {
|
||||||
checks.push({
|
checks.push({
|
||||||
key: column.key as string,
|
key: column.key as string,
|
||||||
title: column.title as string,
|
title: column.title!,
|
||||||
checked: true
|
checked: true
|
||||||
});
|
});
|
||||||
} else if (column.type === 'selection') {
|
} else if (column.type === 'selection') {
|
||||||
@@ -119,6 +119,7 @@ export function useTable<A extends NaiveUI.TableApiFn>(config: NaiveUI.NaiveTabl
|
|||||||
page: 1,
|
page: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
showSizePicker: true,
|
showSizePicker: true,
|
||||||
|
itemCount: 0,
|
||||||
pageSizes: [10, 15, 20, 25, 30],
|
pageSizes: [10, 15, 20, 25, 30],
|
||||||
onUpdatePage: async (page: number) => {
|
onUpdatePage: async (page: number) => {
|
||||||
pagination.page = page;
|
pagination.page = page;
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { useFullscreen } from '@vueuse/core';
|
import { useFullscreen } from '@vueuse/core';
|
||||||
|
import { GLOBAL_HEADER_MENU_ID } from '@/constants/app';
|
||||||
import { useAppStore } from '@/store/modules/app';
|
import { useAppStore } from '@/store/modules/app';
|
||||||
import { useThemeStore } from '@/store/modules/theme';
|
import { useThemeStore } from '@/store/modules/theme';
|
||||||
import { GLOBAL_HEADER_MENU_ID } from '@/constants/app';
|
|
||||||
import GlobalLogo from '../global-logo/index.vue';
|
import GlobalLogo from '../global-logo/index.vue';
|
||||||
import GlobalBreadcrumb from '../global-breadcrumb/index.vue';
|
import GlobalBreadcrumb from '../global-breadcrumb/index.vue';
|
||||||
import GlobalSearch from '../global-search/index.vue';
|
import GlobalSearch from '../global-search/index.vue';
|
||||||
@@ -40,7 +40,12 @@ const { isFullscreen, toggle } = useFullscreen();
|
|||||||
<div class="h-full flex-y-center justify-end">
|
<div class="h-full flex-y-center justify-end">
|
||||||
<GlobalSearch />
|
<GlobalSearch />
|
||||||
<FullScreen v-if="!appStore.isMobile" :full="isFullscreen" @click="toggle" />
|
<FullScreen v-if="!appStore.isMobile" :full="isFullscreen" @click="toggle" />
|
||||||
<LangSwitch :lang="appStore.locale" :lang-options="appStore.localeOptions" @change-lang="appStore.changeLocale" />
|
<LangSwitch
|
||||||
|
v-if="themeStore.header.multilingual.visible"
|
||||||
|
:lang="appStore.locale"
|
||||||
|
:lang-options="appStore.localeOptions"
|
||||||
|
@change-lang="appStore.changeLocale"
|
||||||
|
/>
|
||||||
<ThemeSchemaSwitch
|
<ThemeSchemaSwitch
|
||||||
:theme-schema="themeStore.themeScheme"
|
:theme-schema="themeStore.themeScheme"
|
||||||
:is-dark="themeStore.darkMode"
|
:is-dark="themeStore.darkMode"
|
||||||
|
@@ -2,11 +2,11 @@
|
|||||||
import { computed, ref, watch } from 'vue';
|
import { computed, ref, watch } from 'vue';
|
||||||
import { useRoute } from 'vue-router';
|
import { useRoute } from 'vue-router';
|
||||||
import { SimpleScrollbar } from '@sa/materials';
|
import { SimpleScrollbar } from '@sa/materials';
|
||||||
|
import { GLOBAL_SIDER_MENU_ID } from '@/constants/app';
|
||||||
import { useAppStore } from '@/store/modules/app';
|
import { useAppStore } from '@/store/modules/app';
|
||||||
import { useThemeStore } from '@/store/modules/theme';
|
import { useThemeStore } from '@/store/modules/theme';
|
||||||
import { useRouteStore } from '@/store/modules/route';
|
import { useRouteStore } from '@/store/modules/route';
|
||||||
import { useRouterPush } from '@/hooks/common/router';
|
import { useRouterPush } from '@/hooks/common/router';
|
||||||
import { GLOBAL_SIDER_MENU_ID } from '@/constants/app';
|
|
||||||
import { useMenu } from '../../../context';
|
import { useMenu } from '../../../context';
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
|
@@ -3,12 +3,12 @@ import { computed, ref, watch } from 'vue';
|
|||||||
import { useRoute } from 'vue-router';
|
import { useRoute } from 'vue-router';
|
||||||
import { SimpleScrollbar } from '@sa/materials';
|
import { SimpleScrollbar } from '@sa/materials';
|
||||||
import { useBoolean } from '@sa/hooks';
|
import { useBoolean } from '@sa/hooks';
|
||||||
|
import { GLOBAL_SIDER_MENU_ID } from '@/constants/app';
|
||||||
import { useAppStore } from '@/store/modules/app';
|
import { useAppStore } from '@/store/modules/app';
|
||||||
import { useThemeStore } from '@/store/modules/theme';
|
import { useThemeStore } from '@/store/modules/theme';
|
||||||
import { useRouteStore } from '@/store/modules/route';
|
import { useRouteStore } from '@/store/modules/route';
|
||||||
import { useRouterPush } from '@/hooks/common/router';
|
import { useRouterPush } from '@/hooks/common/router';
|
||||||
import { $t } from '@/locales';
|
import { $t } from '@/locales';
|
||||||
import { GLOBAL_SIDER_MENU_ID } from '@/constants/app';
|
|
||||||
import { useMenu, useMixMenuContext } from '../../../context';
|
import { useMenu, useMixMenuContext } from '../../../context';
|
||||||
import FirstLevelMenu from '../components/first-level-menu.vue';
|
import FirstLevelMenu from '../components/first-level-menu.vue';
|
||||||
import GlobalLogo from '../../global-logo/index.vue';
|
import GlobalLogo from '../../global-logo/index.vue';
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed } from 'vue';
|
import { computed } from 'vue';
|
||||||
|
import { GLOBAL_SIDER_MENU_ID } from '@/constants/app';
|
||||||
import { useAppStore } from '@/store/modules/app';
|
import { useAppStore } from '@/store/modules/app';
|
||||||
import { useThemeStore } from '@/store/modules/theme';
|
import { useThemeStore } from '@/store/modules/theme';
|
||||||
import { GLOBAL_SIDER_MENU_ID } from '@/constants/app';
|
|
||||||
import GlobalLogo from '../global-logo/index.vue';
|
import GlobalLogo from '../global-logo/index.vue';
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
|
@@ -1,9 +1,9 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed } from 'vue';
|
import { computed } from 'vue';
|
||||||
import type { VNode } from 'vue';
|
import type { VNode } from 'vue';
|
||||||
import { $t } from '@/locales';
|
|
||||||
import { useTabStore } from '@/store/modules/tab';
|
import { useTabStore } from '@/store/modules/tab';
|
||||||
import { useSvgIcon } from '@/hooks/common/icon';
|
import { useSvgIcon } from '@/hooks/common/icon';
|
||||||
|
import { $t } from '@/locales';
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: 'ContextMenu'
|
name: 'ContextMenu'
|
||||||
|
@@ -3,12 +3,12 @@ import { nextTick, reactive, ref, watch } from 'vue';
|
|||||||
import { useRoute } from 'vue-router';
|
import { useRoute } from 'vue-router';
|
||||||
import { useElementBounding } from '@vueuse/core';
|
import { useElementBounding } from '@vueuse/core';
|
||||||
import { PageTab } from '@sa/materials';
|
import { PageTab } from '@sa/materials';
|
||||||
import BetterScroll from '@/components/custom/better-scroll.vue';
|
|
||||||
import { useAppStore } from '@/store/modules/app';
|
import { useAppStore } from '@/store/modules/app';
|
||||||
import { useThemeStore } from '@/store/modules/theme';
|
import { useThemeStore } from '@/store/modules/theme';
|
||||||
import { useRouteStore } from '@/store/modules/route';
|
import { useRouteStore } from '@/store/modules/route';
|
||||||
import { useTabStore } from '@/store/modules/tab';
|
import { useTabStore } from '@/store/modules/tab';
|
||||||
import { isPC } from '@/utils/agent';
|
import { isPC } from '@/utils/agent';
|
||||||
|
import BetterScroll from '@/components/custom/better-scroll.vue';
|
||||||
import ContextMenu from './context-menu.vue';
|
import ContextMenu from './context-menu.vue';
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
@@ -114,7 +114,7 @@ function setDropdown(config: Partial<DropdownConfig>) {
|
|||||||
|
|
||||||
let isClickContextMenu = false;
|
let isClickContextMenu = false;
|
||||||
|
|
||||||
function handleDropdownVisible(visible: boolean) {
|
function handleDropdownVisible(visible: boolean | undefined) {
|
||||||
if (!isClickContextMenu) {
|
if (!isClickContextMenu) {
|
||||||
setDropdown({ visible });
|
setDropdown({ visible });
|
||||||
}
|
}
|
||||||
@@ -186,7 +186,7 @@ init();
|
|||||||
:active="tab.id === tabStore.activeTabId"
|
:active="tab.id === tabStore.activeTabId"
|
||||||
:active-color="themeStore.themeColor"
|
:active-color="themeStore.themeColor"
|
||||||
:closable="!tabStore.isTabRetain(tab.id)"
|
:closable="!tabStore.isTabRetain(tab.id)"
|
||||||
@click="tabStore.switchRouteByTab(tab)"
|
@pointerdown="tabStore.switchRouteByTab(tab)"
|
||||||
@close="handleCloseTab(tab)"
|
@close="handleCloseTab(tab)"
|
||||||
@contextmenu="handleContextMenu($event, tab.id)"
|
@contextmenu="handleContextMenu($event, tab.id)"
|
||||||
>
|
>
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, onMounted, ref } from 'vue';
|
import { computed, onMounted, ref } from 'vue';
|
||||||
import Clipboard from 'clipboard';
|
import Clipboard from 'clipboard';
|
||||||
import { $t } from '@/locales';
|
|
||||||
import { useThemeStore } from '@/store/modules/theme';
|
import { useThemeStore } from '@/store/modules/theme';
|
||||||
|
import { $t } from '@/locales';
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: 'ConfigOperation'
|
name: 'ConfigOperation'
|
||||||
|
@@ -1,14 +1,14 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed } from 'vue';
|
import { computed } from 'vue';
|
||||||
import { $t } from '@/locales';
|
|
||||||
import { useThemeStore } from '@/store/modules/theme';
|
|
||||||
import {
|
import {
|
||||||
resetCacheStrategyOptions,
|
resetCacheStrategyOptions,
|
||||||
themePageAnimationModeOptions,
|
themePageAnimationModeOptions,
|
||||||
themeScrollModeOptions,
|
themeScrollModeOptions,
|
||||||
themeTabModeOptions
|
themeTabModeOptions
|
||||||
} from '@/constants/app';
|
} from '@/constants/app';
|
||||||
|
import { useThemeStore } from '@/store/modules/theme';
|
||||||
import { translateOptions } from '@/utils/common';
|
import { translateOptions } from '@/utils/common';
|
||||||
|
import { $t } from '@/locales';
|
||||||
import SettingItem from '../components/setting-item.vue';
|
import SettingItem from '../components/setting-item.vue';
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
@@ -114,10 +114,10 @@ const isWrapperScrollMode = computed(() => themeStore.layout.scrollMode === 'wra
|
|||||||
>
|
>
|
||||||
<NSwitch v-model:value="themeStore.footer.right" />
|
<NSwitch v-model:value="themeStore.footer.right" />
|
||||||
</SettingItem>
|
</SettingItem>
|
||||||
<SettingItem v-if="themeStore.watermark" key="8" :label="$t('theme.watermark.visible')">
|
<SettingItem key="8" :label="$t('theme.watermark.visible')">
|
||||||
<NSwitch v-model:value="themeStore.watermark.visible" />
|
<NSwitch v-model:value="themeStore.watermark.visible" />
|
||||||
</SettingItem>
|
</SettingItem>
|
||||||
<SettingItem v-if="themeStore.watermark?.visible" key="8-1" :label="$t('theme.watermark.text')">
|
<SettingItem v-if="themeStore.watermark.visible" key="8-1" :label="$t('theme.watermark.text')">
|
||||||
<NInput
|
<NInput
|
||||||
v-model:value="themeStore.watermark.text"
|
v-model:value="themeStore.watermark.text"
|
||||||
autosize
|
autosize
|
||||||
@@ -127,6 +127,9 @@ const isWrapperScrollMode = computed(() => themeStore.layout.scrollMode === 'wra
|
|||||||
placeholder="SoybeanAdmin"
|
placeholder="SoybeanAdmin"
|
||||||
/>
|
/>
|
||||||
</SettingItem>
|
</SettingItem>
|
||||||
|
<SettingItem key="9" :label="$t('theme.header.multilingual.visible')">
|
||||||
|
<NSwitch v-model:value="themeStore.header.multilingual.visible" />
|
||||||
|
</SettingItem>
|
||||||
</TransitionGroup>
|
</TransitionGroup>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@@ -109,6 +109,9 @@ const local: App.I18n.Schema = {
|
|||||||
breadcrumb: {
|
breadcrumb: {
|
||||||
visible: 'Breadcrumb Visible',
|
visible: 'Breadcrumb Visible',
|
||||||
showIcon: 'Breadcrumb Icon Visible'
|
showIcon: 'Breadcrumb Icon Visible'
|
||||||
|
},
|
||||||
|
multilingual: {
|
||||||
|
visible: 'Display multilingual button'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
tab: {
|
tab: {
|
||||||
|
@@ -109,6 +109,9 @@ const local: App.I18n.Schema = {
|
|||||||
breadcrumb: {
|
breadcrumb: {
|
||||||
visible: '显示面包屑',
|
visible: '显示面包屑',
|
||||||
showIcon: '显示面包屑图标'
|
showIcon: '显示面包屑图标'
|
||||||
|
},
|
||||||
|
multilingual: {
|
||||||
|
visible: '显示多语言按钮'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
tab: {
|
tab: {
|
||||||
|
@@ -10,22 +10,18 @@ export function setupAppErrorHandle(app: App) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update check interval in milliseconds
|
|
||||||
const UPDATE_CHECK_INTERVAL = 3 * 60 * 1000;
|
|
||||||
|
|
||||||
export function setupAppVersionNotification() {
|
export function setupAppVersionNotification() {
|
||||||
const canAutoUpdateApp = import.meta.env.VITE_AUTOMATICALLY_DETECT_UPDATE === 'Y';
|
// Update check interval in milliseconds
|
||||||
|
const UPDATE_CHECK_INTERVAL = 3 * 60 * 1000;
|
||||||
|
|
||||||
|
const canAutoUpdateApp = import.meta.env.VITE_AUTOMATICALLY_DETECT_UPDATE === 'Y' && import.meta.env.PROD;
|
||||||
if (!canAutoUpdateApp) return;
|
if (!canAutoUpdateApp) return;
|
||||||
|
|
||||||
let isShow = false;
|
let isShow = false;
|
||||||
let updateInterval: ReturnType<typeof setInterval> | undefined;
|
let updateInterval: ReturnType<typeof setInterval> | undefined;
|
||||||
|
|
||||||
// Check if updates should be checked
|
|
||||||
const shouldCheckForUpdates = [!isShow, document.visibilityState === 'visible', !import.meta.env.DEV].every(Boolean);
|
|
||||||
|
|
||||||
const checkForUpdates = async () => {
|
const checkForUpdates = async () => {
|
||||||
if (!shouldCheckForUpdates) return;
|
if (isShow) return;
|
||||||
|
|
||||||
const buildTime = await getHtmlBuildTime();
|
const buildTime = await getHtmlBuildTime();
|
||||||
|
|
||||||
@@ -47,6 +43,7 @@ export function setupAppVersionNotification() {
|
|||||||
{
|
{
|
||||||
onClick() {
|
onClick() {
|
||||||
n?.destroy();
|
n?.destroy();
|
||||||
|
isShow = false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
() => $t('system.updateCancel')
|
() => $t('system.updateCancel')
|
||||||
@@ -77,7 +74,7 @@ export function setupAppVersionNotification() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// If updates should be checked, set up the visibility change listener and start the update interval
|
// If updates should be checked, set up the visibility change listener and start the update interval
|
||||||
if (shouldCheckForUpdates) {
|
if (!isShow && document.visibilityState === 'visible') {
|
||||||
// Check for updates when the document is visible
|
// Check for updates when the document is visible
|
||||||
document.addEventListener('visibilitychange', () => {
|
document.addEventListener('visibilitychange', () => {
|
||||||
if (document.visibilityState === 'visible') {
|
if (document.visibilityState === 'visible') {
|
||||||
|
@@ -1,16 +1,22 @@
|
|||||||
// @unocss-include
|
// @unocss-include
|
||||||
import { getRgb } from '@sa/color';
|
import { getRgb } from '@sa/color';
|
||||||
import { $t } from '@/locales';
|
import { DARK_CLASS } from '@/constants/app';
|
||||||
import { localStg } from '@/utils/storage';
|
import { localStg } from '@/utils/storage';
|
||||||
|
import { toggleHtmlClass } from '@/utils/common';
|
||||||
import systemLogo from '@/assets/svg-icon/logo.svg?raw';
|
import systemLogo from '@/assets/svg-icon/logo.svg?raw';
|
||||||
|
import { $t } from '@/locales';
|
||||||
|
|
||||||
export function setupLoading() {
|
export function setupLoading() {
|
||||||
const themeColor = localStg.get('themeColor') || '#646cff';
|
const themeColor = localStg.get('themeColor') || '#646cff';
|
||||||
|
const darkMode = localStg.get('darkMode') || false;
|
||||||
const { r, g, b } = getRgb(themeColor);
|
const { r, g, b } = getRgb(themeColor);
|
||||||
|
|
||||||
const primaryColor = `--primary-color: ${r} ${g} ${b}`;
|
const primaryColor = `--primary-color: ${r} ${g} ${b}`;
|
||||||
|
|
||||||
|
if (darkMode) {
|
||||||
|
toggleHtmlClass(DARK_CLASS).add();
|
||||||
|
}
|
||||||
|
|
||||||
const loadingClasses = [
|
const loadingClasses = [
|
||||||
'left-0 top-0',
|
'left-0 top-0',
|
||||||
'left-0 bottom-0 animate-delay-500',
|
'left-0 bottom-0 animate-delay-500',
|
||||||
@@ -27,14 +33,14 @@ export function setupLoading() {
|
|||||||
.join('\n');
|
.join('\n');
|
||||||
|
|
||||||
const loading = `
|
const loading = `
|
||||||
<div class="fixed-center flex-col" style="${primaryColor}">
|
<div class="fixed-center flex-col bg-layout" style="${primaryColor}">
|
||||||
${logoWithClass}
|
${logoWithClass}
|
||||||
<div class="w-56px h-56px my-36px">
|
<div class="w-56px h-56px my-36px">
|
||||||
<div class="relative h-full animate-spin">
|
<div class="relative h-full animate-spin">
|
||||||
${dot}
|
${dot}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<h2 class="text-28px font-500 text-#646464">${$t('system.title')}</h2>
|
<h2 class="text-28px font-500 text-primary">${$t('system.title')}</h2>
|
||||||
</div>`;
|
</div>`;
|
||||||
|
|
||||||
const app = document.getElementById('app');
|
const app = document.getElementById('app');
|
||||||
|
@@ -6,10 +6,10 @@ import type {
|
|||||||
Router
|
Router
|
||||||
} from 'vue-router';
|
} from 'vue-router';
|
||||||
import type { RouteKey, RoutePath } from '@elegant-router/types';
|
import type { RouteKey, RoutePath } from '@elegant-router/types';
|
||||||
import { getRouteName } from '@/router/elegant/transform';
|
|
||||||
import { useAuthStore } from '@/store/modules/auth';
|
import { useAuthStore } from '@/store/modules/auth';
|
||||||
import { useRouteStore } from '@/store/modules/route';
|
import { useRouteStore } from '@/store/modules/route';
|
||||||
import { localStg } from '@/utils/storage';
|
import { localStg } from '@/utils/storage';
|
||||||
|
import { getRouteName } from '@/router/elegant/transform';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* create route guard
|
* create route guard
|
||||||
@@ -138,11 +138,11 @@ async function initRoute(to: RouteLocationNormalized): Promise<RouteLocationRaw
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
routeStore.onRouteSwitchWhenLoggedIn();
|
||||||
|
|
||||||
// the auth route is initialized
|
// the auth route is initialized
|
||||||
// it is not the "not-found" route, then it is allowed to access
|
// it is not the "not-found" route, then it is allowed to access
|
||||||
if (!isNotFoundRoute) {
|
if (!isNotFoundRoute) {
|
||||||
routeStore.onRouteSwitchWhenLoggedIn();
|
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
import { useTitle } from '@vueuse/core';
|
|
||||||
import type { Router } from 'vue-router';
|
import type { Router } from 'vue-router';
|
||||||
|
import { useTitle } from '@vueuse/core';
|
||||||
import { $t } from '@/locales';
|
import { $t } from '@/locales';
|
||||||
|
|
||||||
export function createDocumentTitleGuard(router: Router) {
|
export function createDocumentTitleGuard(router: Router) {
|
||||||
|
@@ -1,9 +1,9 @@
|
|||||||
import type { AxiosResponse } from 'axios';
|
import type { AxiosResponse } from 'axios';
|
||||||
import { BACKEND_ERROR_CODE, createFlatRequest, createRequest } from '@sa/axios';
|
import { BACKEND_ERROR_CODE, createFlatRequest, createRequest } from '@sa/axios';
|
||||||
import { useAuthStore } from '@/store/modules/auth';
|
import { useAuthStore } from '@/store/modules/auth';
|
||||||
import { $t } from '@/locales';
|
|
||||||
import { localStg } from '@/utils/storage';
|
import { localStg } from '@/utils/storage';
|
||||||
import { getServiceBaseURL } from '@/utils/service';
|
import { getServiceBaseURL } from '@/utils/service';
|
||||||
|
import { $t } from '@/locales';
|
||||||
import { getAuthorization, handleExpiredRequest, showErrorMsg } from './shared';
|
import { getAuthorization, handleExpiredRequest, showErrorMsg } from './shared';
|
||||||
import type { RequestInstanceState } from './type';
|
import type { RequestInstanceState } from './type';
|
||||||
|
|
||||||
|
@@ -1,12 +1,12 @@
|
|||||||
import { effectScope, nextTick, onScopeDispose, ref, watch } from 'vue';
|
import { effectScope, nextTick, onScopeDispose, ref, watch } from 'vue';
|
||||||
import { defineStore } from 'pinia';
|
|
||||||
import { breakpointsTailwind, useBreakpoints, useEventListener, useTitle } from '@vueuse/core';
|
import { breakpointsTailwind, useBreakpoints, useEventListener, useTitle } from '@vueuse/core';
|
||||||
|
import { defineStore } from 'pinia';
|
||||||
import { useBoolean } from '@sa/hooks';
|
import { useBoolean } from '@sa/hooks';
|
||||||
import { SetupStoreId } from '@/enum';
|
|
||||||
import { router } from '@/router';
|
import { router } from '@/router';
|
||||||
|
import { localStg } from '@/utils/storage';
|
||||||
|
import { SetupStoreId } from '@/enum';
|
||||||
import { $t, setLocale } from '@/locales';
|
import { $t, setLocale } from '@/locales';
|
||||||
import { setDayjsLocale } from '@/locales/dayjs';
|
import { setDayjsLocale } from '@/locales/dayjs';
|
||||||
import { localStg } from '@/utils/storage';
|
|
||||||
import { useRouteStore } from '../route';
|
import { useRouteStore } from '../route';
|
||||||
import { useTabStore } from '../tab';
|
import { useTabStore } from '../tab';
|
||||||
import { useThemeStore } from '../theme';
|
import { useThemeStore } from '../theme';
|
||||||
|
@@ -2,10 +2,10 @@ import { computed, reactive, ref } from 'vue';
|
|||||||
import { useRoute } from 'vue-router';
|
import { useRoute } from 'vue-router';
|
||||||
import { defineStore } from 'pinia';
|
import { defineStore } from 'pinia';
|
||||||
import { useLoading } from '@sa/hooks';
|
import { useLoading } from '@sa/hooks';
|
||||||
import { SetupStoreId } from '@/enum';
|
|
||||||
import { useRouterPush } from '@/hooks/common/router';
|
|
||||||
import { fetchGetUserInfo, fetchLogin } from '@/service/api';
|
import { fetchGetUserInfo, fetchLogin } from '@/service/api';
|
||||||
|
import { useRouterPush } from '@/hooks/common/router';
|
||||||
import { localStg } from '@/utils/storage';
|
import { localStg } from '@/utils/storage';
|
||||||
|
import { SetupStoreId } from '@/enum';
|
||||||
import { $t } from '@/locales';
|
import { $t } from '@/locales';
|
||||||
import { useRouteStore } from '../route';
|
import { useRouteStore } from '../route';
|
||||||
import { useTabStore } from '../tab';
|
import { useTabStore } from '../tab';
|
||||||
@@ -69,17 +69,13 @@ export const useAuthStore = defineStore(SetupStoreId.Auth, () => {
|
|||||||
const pass = await loginByToken(loginToken);
|
const pass = await loginByToken(loginToken);
|
||||||
|
|
||||||
if (pass) {
|
if (pass) {
|
||||||
await routeStore.initAuthRoute();
|
|
||||||
|
|
||||||
await redirectFromLogin(redirect);
|
await redirectFromLogin(redirect);
|
||||||
|
|
||||||
if (routeStore.isInitAuthRoute) {
|
window.$notification?.success({
|
||||||
window.$notification?.success({
|
title: $t('page.login.common.loginSuccess'),
|
||||||
title: $t('page.login.common.loginSuccess'),
|
content: $t('page.login.common.welcomeBack', { userName: userInfo.userName }),
|
||||||
content: $t('page.login.common.welcomeBack', { userName: userInfo.userName }),
|
duration: 4500
|
||||||
duration: 4500
|
});
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
resetStore();
|
resetStore();
|
||||||
|
@@ -3,12 +3,12 @@ import type { RouteRecordRaw } from 'vue-router';
|
|||||||
import { defineStore } from 'pinia';
|
import { defineStore } from 'pinia';
|
||||||
import { useBoolean } from '@sa/hooks';
|
import { useBoolean } from '@sa/hooks';
|
||||||
import type { CustomRoute, ElegantConstRoute, LastLevelRouteKey, RouteKey, RouteMap } from '@elegant-router/types';
|
import type { CustomRoute, ElegantConstRoute, LastLevelRouteKey, RouteKey, RouteMap } from '@elegant-router/types';
|
||||||
import { SetupStoreId } from '@/enum';
|
|
||||||
import { router } from '@/router';
|
import { router } from '@/router';
|
||||||
|
import { fetchGetConstantRoutes, fetchGetUserRoutes, fetchIsRouteExist } from '@/service/api';
|
||||||
|
import { SetupStoreId } from '@/enum';
|
||||||
import { createStaticRoutes, getAuthVueRoutes } from '@/router/routes';
|
import { createStaticRoutes, getAuthVueRoutes } from '@/router/routes';
|
||||||
import { ROOT_ROUTE } from '@/router/routes/builtin';
|
import { ROOT_ROUTE } from '@/router/routes/builtin';
|
||||||
import { getRouteName, getRoutePath } from '@/router/elegant/transform';
|
import { getRouteName, getRoutePath } from '@/router/elegant/transform';
|
||||||
import { fetchGetConstantRoutes, fetchGetUserRoutes, fetchIsRouteExist } from '@/service/api';
|
|
||||||
import { useAuthStore } from '../auth';
|
import { useAuthStore } from '../auth';
|
||||||
import { useTabStore } from '../tab';
|
import { useTabStore } from '../tab';
|
||||||
import {
|
import {
|
||||||
@@ -170,10 +170,17 @@ export const useRouteStore = defineStore(SetupStoreId.Route, () => {
|
|||||||
handleConstantAndAuthRoutes();
|
handleConstantAndAuthRoutes();
|
||||||
|
|
||||||
setIsInitConstantRoute(true);
|
setIsInitConstantRoute(true);
|
||||||
|
|
||||||
|
tabStore.initHomeTab();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Init auth route */
|
/** Init auth route */
|
||||||
async function initAuthRoute() {
|
async function initAuthRoute() {
|
||||||
|
// check if user info is initialized
|
||||||
|
if (!authStore.userInfo.userId) {
|
||||||
|
await authStore.initUserInfo();
|
||||||
|
}
|
||||||
|
|
||||||
if (authRouteMode.value === 'static') {
|
if (authRouteMode.value === 'static') {
|
||||||
initStaticAuthRoute();
|
initStaticAuthRoute();
|
||||||
} else {
|
} else {
|
||||||
@@ -311,7 +318,7 @@ export const useRouteStore = defineStore(SetupStoreId.Route, () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function onRouteSwitchWhenLoggedIn() {
|
async function onRouteSwitchWhenLoggedIn() {
|
||||||
authStore.initUserInfo();
|
await authStore.initUserInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
async function onRouteSwitchWhenNotLoggedIn() {
|
async function onRouteSwitchWhenNotLoggedIn() {
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import type { RouteLocationNormalizedLoaded, RouteRecordRaw, _RouteRecordBase } from 'vue-router';
|
import type { RouteLocationNormalizedLoaded, RouteRecordRaw, _RouteRecordBase } from 'vue-router';
|
||||||
import type { ElegantConstRoute, LastLevelRouteKey, RouteKey, RouteMap } from '@elegant-router/types';
|
import type { ElegantConstRoute, LastLevelRouteKey, RouteKey, RouteMap } from '@elegant-router/types';
|
||||||
import { $t } from '@/locales';
|
|
||||||
import { useSvgIcon } from '@/hooks/common/icon';
|
import { useSvgIcon } from '@/hooks/common/icon';
|
||||||
|
import { $t } from '@/locales';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Filter auth routes by roles
|
* Filter auth routes by roles
|
||||||
|
@@ -1,12 +1,12 @@
|
|||||||
import { computed, ref } from 'vue';
|
import { computed, ref } from 'vue';
|
||||||
import { defineStore } from 'pinia';
|
|
||||||
import { useEventListener } from '@vueuse/core';
|
import { useEventListener } from '@vueuse/core';
|
||||||
|
import { defineStore } from 'pinia';
|
||||||
import type { RouteKey } from '@elegant-router/types';
|
import type { RouteKey } from '@elegant-router/types';
|
||||||
import { router } from '@/router';
|
import { router } from '@/router';
|
||||||
import { SetupStoreId } from '@/enum';
|
import { useRouteStore } from '@/store/modules/route';
|
||||||
import { useRouterPush } from '@/hooks/common/router';
|
import { useRouterPush } from '@/hooks/common/router';
|
||||||
import { localStg } from '@/utils/storage';
|
import { localStg } from '@/utils/storage';
|
||||||
import { useRouteStore } from '@/store/modules/route';
|
import { SetupStoreId } from '@/enum';
|
||||||
import { useThemeStore } from '../theme';
|
import { useThemeStore } from '../theme';
|
||||||
import {
|
import {
|
||||||
extractTabsByAllRoutes,
|
extractTabsByAllRoutes,
|
||||||
@@ -160,6 +160,25 @@ export const useTabStore = defineStore(SetupStoreId.Tab, () => {
|
|||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const { routerPushByKey } = useRouterPush();
|
||||||
|
/**
|
||||||
|
* Replace tab
|
||||||
|
*
|
||||||
|
* @param key Route key
|
||||||
|
* @param options Router push options
|
||||||
|
*/
|
||||||
|
async function replaceTab(key: RouteKey, options?: App.Global.RouterPushOptions) {
|
||||||
|
const oldTabId = activeTabId.value;
|
||||||
|
|
||||||
|
// push new route
|
||||||
|
await routerPushByKey(key, options);
|
||||||
|
|
||||||
|
// remove old tab (exclude fixed tab)
|
||||||
|
if (!isTabRetain(oldTabId)) {
|
||||||
|
await removeTab(oldTabId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Switch route by tab
|
* Switch route by tab
|
||||||
*
|
*
|
||||||
@@ -282,6 +301,7 @@ export const useTabStore = defineStore(SetupStoreId.Tab, () => {
|
|||||||
removeTab,
|
removeTab,
|
||||||
removeActiveTab,
|
removeActiveTab,
|
||||||
removeTabByRouteName,
|
removeTabByRouteName,
|
||||||
|
replaceTab,
|
||||||
clearTabs,
|
clearTabs,
|
||||||
clearLeftTabs,
|
clearLeftTabs,
|
||||||
clearRightTabs,
|
clearRightTabs,
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
import { computed, effectScope, onScopeDispose, ref, toRefs, watch } from 'vue';
|
import { computed, effectScope, onScopeDispose, ref, toRefs, watch } from 'vue';
|
||||||
import type { Ref } from 'vue';
|
import type { Ref } from 'vue';
|
||||||
import { defineStore } from 'pinia';
|
|
||||||
import { useEventListener, usePreferredColorScheme } from '@vueuse/core';
|
import { useEventListener, usePreferredColorScheme } from '@vueuse/core';
|
||||||
|
import { defineStore } from 'pinia';
|
||||||
import { getPaletteColorByNumber } from '@sa/color';
|
import { getPaletteColorByNumber } from '@sa/color';
|
||||||
import { SetupStoreId } from '@/enum';
|
|
||||||
import { localStg } from '@/utils/storage';
|
import { localStg } from '@/utils/storage';
|
||||||
|
import { SetupStoreId } from '@/enum';
|
||||||
import {
|
import {
|
||||||
addThemeVarsToGlobal,
|
addThemeVarsToGlobal,
|
||||||
createThemeToken,
|
createThemeToken,
|
||||||
@@ -174,6 +174,7 @@ export const useThemeStore = defineStore(SetupStoreId.Theme, () => {
|
|||||||
darkMode,
|
darkMode,
|
||||||
val => {
|
val => {
|
||||||
toggleCssDarkMode(val);
|
toggleCssDarkMode(val);
|
||||||
|
localStg.set('darkMode', val);
|
||||||
},
|
},
|
||||||
{ immediate: true }
|
{ immediate: true }
|
||||||
);
|
);
|
||||||
|
@@ -1,11 +1,11 @@
|
|||||||
import type { GlobalThemeOverrides } from 'naive-ui';
|
import type { GlobalThemeOverrides } from 'naive-ui';
|
||||||
|
import { defu } from 'defu';
|
||||||
import { addColorAlpha, getColorPalette, getPaletteColorByNumber, getRgb } from '@sa/color';
|
import { addColorAlpha, getColorPalette, getPaletteColorByNumber, getRgb } from '@sa/color';
|
||||||
import { overrideThemeSettings, themeSettings } from '@/theme/settings';
|
import { DARK_CLASS } from '@/constants/app';
|
||||||
import { themeVars } from '@/theme/vars';
|
|
||||||
import { toggleHtmlClass } from '@/utils/common';
|
import { toggleHtmlClass } from '@/utils/common';
|
||||||
import { localStg } from '@/utils/storage';
|
import { localStg } from '@/utils/storage';
|
||||||
|
import { overrideThemeSettings, themeSettings } from '@/theme/settings';
|
||||||
const DARK_CLASS = 'dark';
|
import { themeVars } from '@/theme/vars';
|
||||||
|
|
||||||
/** Init theme settings */
|
/** Init theme settings */
|
||||||
export function initThemeSettings() {
|
export function initThemeSettings() {
|
||||||
@@ -17,12 +17,15 @@ export function initThemeSettings() {
|
|||||||
// if it is production mode, the theme settings will be cached in localStorage
|
// if it is production mode, the theme settings will be cached in localStorage
|
||||||
// if want to update theme settings when publish new version, please update `overrideThemeSettings` in `src/theme/settings.ts`
|
// if want to update theme settings when publish new version, please update `overrideThemeSettings` in `src/theme/settings.ts`
|
||||||
|
|
||||||
const settings = localStg.get('themeSettings') || themeSettings;
|
const localSettings = localStg.get('themeSettings');
|
||||||
|
|
||||||
|
let settings = defu(localSettings, themeSettings);
|
||||||
|
|
||||||
const isOverride = localStg.get('overrideThemeFlag') === BUILD_TIME;
|
const isOverride = localStg.get('overrideThemeFlag') === BUILD_TIME;
|
||||||
|
|
||||||
if (!isOverride) {
|
if (!isOverride) {
|
||||||
Object.assign(settings, overrideThemeSettings);
|
settings = defu(overrideThemeSettings, settings);
|
||||||
|
|
||||||
localStg.set('overrideThemeFlag', BUILD_TIME);
|
localStg.set('overrideThemeFlag', BUILD_TIME);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -113,7 +113,8 @@ code,
|
|||||||
kbd,
|
kbd,
|
||||||
samp,
|
samp,
|
||||||
pre {
|
pre {
|
||||||
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace; /* 1 */
|
font-family:
|
||||||
|
ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace; /* 1 */
|
||||||
font-size: 1em; /* 2 */
|
font-size: 1em; /* 2 */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -27,6 +27,9 @@ export const themeSettings: App.Theme.ThemeSetting = {
|
|||||||
breadcrumb: {
|
breadcrumb: {
|
||||||
visible: true,
|
visible: true,
|
||||||
showIcon: true
|
showIcon: true
|
||||||
|
},
|
||||||
|
multilingual: {
|
||||||
|
visible: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
tab: {
|
tab: {
|
||||||
@@ -83,10 +86,4 @@ export const themeSettings: App.Theme.ThemeSetting = {
|
|||||||
*
|
*
|
||||||
* If publish new version, use `overrideThemeSettings` to override certain theme settings
|
* If publish new version, use `overrideThemeSettings` to override certain theme settings
|
||||||
*/
|
*/
|
||||||
export const overrideThemeSettings: Partial<App.Theme.ThemeSetting> = {
|
export const overrideThemeSettings: Partial<App.Theme.ThemeSetting> = {};
|
||||||
resetCacheStrategy: 'close',
|
|
||||||
watermark: {
|
|
||||||
visible: false,
|
|
||||||
text: 'SoybeanAdmin'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
20
src/typings/app.d.ts
vendored
20
src/typings/app.d.ts
vendored
@@ -21,7 +21,7 @@ declare namespace App {
|
|||||||
/** Whether info color is followed by the primary color */
|
/** Whether info color is followed by the primary color */
|
||||||
isInfoFollowPrimary: boolean;
|
isInfoFollowPrimary: boolean;
|
||||||
/** Reset cache strategy */
|
/** Reset cache strategy */
|
||||||
resetCacheStrategy?: UnionKey.ResetCacheStrategy;
|
resetCacheStrategy: UnionKey.ResetCacheStrategy;
|
||||||
/** Layout */
|
/** Layout */
|
||||||
layout: {
|
layout: {
|
||||||
/** Layout mode */
|
/** Layout mode */
|
||||||
@@ -33,7 +33,7 @@ declare namespace App {
|
|||||||
*
|
*
|
||||||
* if true, the vertical child level menus in left and horizontal first level menus in top
|
* if true, the vertical child level menus in left and horizontal first level menus in top
|
||||||
*/
|
*/
|
||||||
reverseHorizontalMix?: boolean;
|
reverseHorizontalMix: boolean;
|
||||||
};
|
};
|
||||||
/** Page */
|
/** Page */
|
||||||
page: {
|
page: {
|
||||||
@@ -53,6 +53,11 @@ declare namespace App {
|
|||||||
/** Whether to show the breadcrumb icon */
|
/** Whether to show the breadcrumb icon */
|
||||||
showIcon: boolean;
|
showIcon: boolean;
|
||||||
};
|
};
|
||||||
|
/** Multilingual */
|
||||||
|
multilingual: {
|
||||||
|
/** Whether to show the multilingual */
|
||||||
|
visible: boolean;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
/** Tab */
|
/** Tab */
|
||||||
tab: {
|
tab: {
|
||||||
@@ -98,7 +103,7 @@ declare namespace App {
|
|||||||
right: boolean;
|
right: boolean;
|
||||||
};
|
};
|
||||||
/** Watermark */
|
/** Watermark */
|
||||||
watermark?: {
|
watermark: {
|
||||||
/** Whether to show the watermark */
|
/** Whether to show the watermark */
|
||||||
visible: boolean;
|
visible: boolean;
|
||||||
/** Watermark text */
|
/** Watermark text */
|
||||||
@@ -170,6 +175,12 @@ declare namespace App {
|
|||||||
type RoutePath = import('@elegant-router/types').RoutePath;
|
type RoutePath = import('@elegant-router/types').RoutePath;
|
||||||
type LastLevelRouteKey = import('@elegant-router/types').LastLevelRouteKey;
|
type LastLevelRouteKey = import('@elegant-router/types').LastLevelRouteKey;
|
||||||
|
|
||||||
|
/** The router push options */
|
||||||
|
type RouterPushOptions = {
|
||||||
|
query?: Record<string, string>;
|
||||||
|
params?: Record<string, string>;
|
||||||
|
};
|
||||||
|
|
||||||
/** The global header props */
|
/** The global header props */
|
||||||
interface HeaderProps {
|
interface HeaderProps {
|
||||||
/** Whether to show the logo */
|
/** Whether to show the logo */
|
||||||
@@ -363,6 +374,9 @@ declare namespace App {
|
|||||||
visible: string;
|
visible: string;
|
||||||
showIcon: string;
|
showIcon: string;
|
||||||
};
|
};
|
||||||
|
multilingual: {
|
||||||
|
visible: string;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
tab: {
|
tab: {
|
||||||
visible: string;
|
visible: string;
|
||||||
|
1
src/typings/components.d.ts
vendored
1
src/typings/components.d.ts
vendored
@@ -2,6 +2,7 @@
|
|||||||
// @ts-nocheck
|
// @ts-nocheck
|
||||||
// Generated by unplugin-vue-components
|
// Generated by unplugin-vue-components
|
||||||
// Read more: https://github.com/vuejs/core/pull/3399
|
// Read more: https://github.com/vuejs/core/pull/3399
|
||||||
|
// biome-ignore lint: disable
|
||||||
export {}
|
export {}
|
||||||
|
|
||||||
/* prettier-ignore */
|
/* prettier-ignore */
|
||||||
|
2
src/typings/storage.d.ts
vendored
2
src/typings/storage.d.ts
vendored
@@ -20,6 +20,8 @@ declare namespace StorageType {
|
|||||||
refreshToken: string;
|
refreshToken: string;
|
||||||
/** The theme color */
|
/** The theme color */
|
||||||
themeColor: string;
|
themeColor: string;
|
||||||
|
/** The dark mode */
|
||||||
|
darkMode: boolean;
|
||||||
/** The theme settings */
|
/** The theme settings */
|
||||||
themeSettings: App.Theme.ThemeSetting;
|
themeSettings: App.Theme.ThemeSetting;
|
||||||
/**
|
/**
|
||||||
|
@@ -8,6 +8,7 @@ declare namespace Env {
|
|||||||
type RouterHistoryMode = 'hash' | 'history' | 'memory';
|
type RouterHistoryMode = 'hash' | 'history' | 'memory';
|
||||||
|
|
||||||
/** Interface for import.meta */
|
/** Interface for import.meta */
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-shadow
|
||||||
interface ImportMeta extends ImportMetaEnv {
|
interface ImportMeta extends ImportMetaEnv {
|
||||||
/** The base url of the application */
|
/** The base url of the application */
|
||||||
readonly VITE_BASE_URL: string;
|
readonly VITE_BASE_URL: string;
|
||||||
@@ -105,6 +106,8 @@ declare namespace Env {
|
|||||||
readonly VITE_STORAGE_PREFIX?: string;
|
readonly VITE_STORAGE_PREFIX?: string;
|
||||||
/** Whether to automatically detect updates after configuring application packaging */
|
/** Whether to automatically detect updates after configuring application packaging */
|
||||||
readonly VITE_AUTOMATICALLY_DETECT_UPDATE?: CommonType.YesOrNo;
|
readonly VITE_AUTOMATICALLY_DETECT_UPDATE?: CommonType.YesOrNo;
|
||||||
|
/** show proxy url log in terminal */
|
||||||
|
readonly VITE_PROXY_LOG?: CommonType.YesOrNo;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@@ -2,10 +2,10 @@
|
|||||||
import { computed } from 'vue';
|
import { computed } from 'vue';
|
||||||
import type { Component } from 'vue';
|
import type { Component } from 'vue';
|
||||||
import { getPaletteColorByNumber, mixColor } from '@sa/color';
|
import { getPaletteColorByNumber, mixColor } from '@sa/color';
|
||||||
import { $t } from '@/locales';
|
import { loginModuleRecord } from '@/constants/app';
|
||||||
import { useAppStore } from '@/store/modules/app';
|
import { useAppStore } from '@/store/modules/app';
|
||||||
import { useThemeStore } from '@/store/modules/theme';
|
import { useThemeStore } from '@/store/modules/theme';
|
||||||
import { loginModuleRecord } from '@/constants/app';
|
import { $t } from '@/locales';
|
||||||
import PwdLogin from './modules/pwd-login.vue';
|
import PwdLogin from './modules/pwd-login.vue';
|
||||||
import CodeLogin from './modules/code-login.vue';
|
import CodeLogin from './modules/code-login.vue';
|
||||||
import Register from './modules/register.vue';
|
import Register from './modules/register.vue';
|
||||||
@@ -66,6 +66,7 @@ const bgColor = computed(() => {
|
|||||||
@switch="themeStore.toggleThemeScheme"
|
@switch="themeStore.toggleThemeScheme"
|
||||||
/>
|
/>
|
||||||
<LangSwitch
|
<LangSwitch
|
||||||
|
v-if="themeStore.header.multilingual.visible"
|
||||||
:lang="appStore.locale"
|
:lang="appStore.locale"
|
||||||
:lang-options="appStore.localeOptions"
|
:lang-options="appStore.localeOptions"
|
||||||
:show-tooltip="false"
|
:show-tooltip="false"
|
||||||
|
@@ -1,9 +1,9 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, reactive } from 'vue';
|
import { computed, reactive } from 'vue';
|
||||||
import { $t } from '@/locales';
|
|
||||||
import { useRouterPush } from '@/hooks/common/router';
|
import { useRouterPush } from '@/hooks/common/router';
|
||||||
import { useFormRules, useNaiveForm } from '@/hooks/common/form';
|
import { useFormRules, useNaiveForm } from '@/hooks/common/form';
|
||||||
import { useCaptcha } from '@/hooks/business/captcha';
|
import { useCaptcha } from '@/hooks/business/captcha';
|
||||||
|
import { $t } from '@/locales';
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: 'CodeLogin'
|
name: 'CodeLogin'
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, reactive } from 'vue';
|
import { computed, reactive } from 'vue';
|
||||||
import { $t } from '@/locales';
|
|
||||||
import { loginModuleRecord } from '@/constants/app';
|
import { loginModuleRecord } from '@/constants/app';
|
||||||
|
import { useAuthStore } from '@/store/modules/auth';
|
||||||
import { useRouterPush } from '@/hooks/common/router';
|
import { useRouterPush } from '@/hooks/common/router';
|
||||||
import { useFormRules, useNaiveForm } from '@/hooks/common/form';
|
import { useFormRules, useNaiveForm } from '@/hooks/common/form';
|
||||||
import { useAuthStore } from '@/store/modules/auth';
|
import { $t } from '@/locales';
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: 'PwdLogin'
|
name: 'PwdLogin'
|
||||||
|
@@ -1,9 +1,9 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, reactive } from 'vue';
|
import { computed, reactive } from 'vue';
|
||||||
import { $t } from '@/locales';
|
|
||||||
import { useRouterPush } from '@/hooks/common/router';
|
import { useRouterPush } from '@/hooks/common/router';
|
||||||
import { useFormRules, useNaiveForm } from '@/hooks/common/form';
|
import { useFormRules, useNaiveForm } from '@/hooks/common/form';
|
||||||
import { useCaptcha } from '@/hooks/business/captcha';
|
import { useCaptcha } from '@/hooks/business/captcha';
|
||||||
|
import { $t } from '@/locales';
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: 'Register'
|
name: 'Register'
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, reactive } from 'vue';
|
import { computed, reactive } from 'vue';
|
||||||
import { $t } from '@/locales';
|
|
||||||
import { useRouterPush } from '@/hooks/common/router';
|
import { useRouterPush } from '@/hooks/common/router';
|
||||||
import { useFormRules, useNaiveForm } from '@/hooks/common/form';
|
import { useFormRules, useNaiveForm } from '@/hooks/common/form';
|
||||||
|
import { $t } from '@/locales';
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: 'ResetPwd'
|
name: 'ResetPwd'
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed } from 'vue';
|
import { computed } from 'vue';
|
||||||
import { $t } from '@/locales';
|
|
||||||
import { useAppStore } from '@/store/modules/app';
|
import { useAppStore } from '@/store/modules/app';
|
||||||
import { useAuthStore } from '@/store/modules/auth';
|
import { useAuthStore } from '@/store/modules/auth';
|
||||||
|
import { $t } from '@/locales';
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: 'HeaderBanner'
|
name: 'HeaderBanner'
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { watch } from 'vue';
|
import { watch } from 'vue';
|
||||||
import { $t } from '@/locales';
|
|
||||||
import { useAppStore } from '@/store/modules/app';
|
import { useAppStore } from '@/store/modules/app';
|
||||||
import { useEcharts } from '@/hooks/common/echarts';
|
import { useEcharts } from '@/hooks/common/echarts';
|
||||||
|
import { $t } from '@/locales';
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: 'LineChart'
|
name: 'LineChart'
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { watch } from 'vue';
|
import { watch } from 'vue';
|
||||||
import { $t } from '@/locales';
|
|
||||||
import { useAppStore } from '@/store/modules/app';
|
import { useAppStore } from '@/store/modules/app';
|
||||||
import { useEcharts } from '@/hooks/common/echarts';
|
import { useEcharts } from '@/hooks/common/echarts';
|
||||||
|
import { $t } from '@/locales';
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: 'PieChart'
|
name: 'PieChart'
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import { defineConfig } from '@unocss/vite';
|
import { defineConfig } from '@unocss/vite';
|
||||||
import transformerDirectives from '@unocss/transformer-directives';
|
import transformerDirectives from '@unocss/transformer-directives';
|
||||||
import transformerVariantGroup from '@unocss/transformer-variant-group';
|
import transformerVariantGroup from '@unocss/transformer-variant-group';
|
||||||
import presetUno from '@unocss/preset-uno';
|
import presetWind3 from '@unocss/preset-wind3';
|
||||||
import type { Theme } from '@unocss/preset-uno';
|
import type { Theme } from '@unocss/preset-uno';
|
||||||
import { presetSoybeanAdmin } from '@sa/uno-preset';
|
import { presetSoybeanAdmin } from '@sa/uno-preset';
|
||||||
import { themeVars } from './src/theme/vars';
|
import { themeVars } from './src/theme/vars';
|
||||||
@@ -26,5 +26,5 @@ export default defineConfig<Theme>({
|
|||||||
'card-wrapper': 'rd-8px shadow-sm'
|
'card-wrapper': 'rd-8px shadow-sm'
|
||||||
},
|
},
|
||||||
transformers: [transformerDirectives(), transformerVariantGroup()],
|
transformers: [transformerDirectives(), transformerVariantGroup()],
|
||||||
presets: [presetUno({ dark: 'class' }), presetSoybeanAdmin()]
|
presets: [presetWind3({ dark: 'class' }), presetSoybeanAdmin()]
|
||||||
});
|
});
|
||||||
|
@@ -35,10 +35,7 @@ export default defineConfig(configEnv => {
|
|||||||
host: '0.0.0.0',
|
host: '0.0.0.0',
|
||||||
port: 9527,
|
port: 9527,
|
||||||
open: true,
|
open: true,
|
||||||
proxy: createViteProxy(viteEnv, enableProxy),
|
proxy: createViteProxy(viteEnv, enableProxy)
|
||||||
fs: {
|
|
||||||
cachedChecks: false
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
preview: {
|
preview: {
|
||||||
port: 9725
|
port: 9725
|
||||||
|
Reference in New Issue
Block a user