mirror of
https://github.com/soybeanjs/soybean-admin.git
synced 2026-01-22 06:45:57 +08:00
Compare commits
9 Commits
5e40b85018
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cbfb932f8e | ||
|
|
dacee143c0 | ||
|
|
2a0231da55 | ||
|
|
d73947a5ab | ||
|
|
0081b9c022 | ||
|
|
30e3cdc7b9 | ||
|
|
706586439d | ||
|
|
232e1ac40d | ||
|
|
5aac540a4c |
34
.github/workflows/opencode.yml
vendored
Normal file
34
.github/workflows/opencode.yml
vendored
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
name: opencode
|
||||||
|
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
types: [created]
|
||||||
|
pull_request_review_comment:
|
||||||
|
types: [created]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
opencode:
|
||||||
|
if: |
|
||||||
|
contains(github.event.comment.body, ' /oc') ||
|
||||||
|
startsWith(github.event.comment.body, '/oc') ||
|
||||||
|
contains(github.event.comment.body, ' /opencode') ||
|
||||||
|
startsWith(github.event.comment.body, '/opencode')
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
id-token: write
|
||||||
|
contents: read
|
||||||
|
pull-requests: read
|
||||||
|
issues: read
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
persist-credentials: false
|
||||||
|
|
||||||
|
- name: Run opencode
|
||||||
|
uses: anomalyco/opencode/github@latest
|
||||||
|
env:
|
||||||
|
GOOGLE_GENERATIVE_AI_API_KEY: ${{ secrets.GOOGLE_GENERATIVE_AI_API_KEY }}
|
||||||
|
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
|
||||||
|
with:
|
||||||
|
model: google/gemini-3-pro-preview
|
||||||
@@ -23,9 +23,6 @@
|
|||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> The `SoybeanAdmin` quick start series videos have been uploaded to [Bilibili](https://www.bilibili.com/video/BV1YKdRYXELC) Go online [click here](https://www.bilibili.com/video/BV1YKdRYXELC) Go check it out
|
> The `SoybeanAdmin` quick start series videos have been uploaded to [Bilibili](https://www.bilibili.com/video/BV1YKdRYXELC) Go online [click here](https://www.bilibili.com/video/BV1YKdRYXELC) Go check it out
|
||||||
|
|
||||||
> [!WARNING]
|
|
||||||
> `SoybeanAdmin` is planning to develop a `V2` version, see [plan list](https://github.com/soybeanjs/soybean-admin/issues/767)
|
|
||||||
|
|
||||||
## Introduction
|
## Introduction
|
||||||
|
|
||||||
[`SoybeanAdmin`](https://github.com/soybeanjs/soybean-admin) is a clean, elegant, beautiful and powerful admin template, based on the latest front-end technology stack, including Vue3, Vite7, TypeScript, Pinia and UnoCSS. It has built-in rich theme configuration and components, strict code specifications, and an automated file routing system. In addition, it also uses the online mock data solution based on ApiFox. `SoybeanAdmin` provides you with a one-stop admin solution, no additional configuration, and out of the box. It is also a best practice for learning cutting-edge technologies quickly.
|
[`SoybeanAdmin`](https://github.com/soybeanjs/soybean-admin) is a clean, elegant, beautiful and powerful admin template, based on the latest front-end technology stack, including Vue3, Vite7, TypeScript, Pinia and UnoCSS. It has built-in rich theme configuration and components, strict code specifications, and an automated file routing system. In addition, it also uses the online mock data solution based on ApiFox. `SoybeanAdmin` provides you with a one-stop admin solution, no additional configuration, and out of the box. It is also a best practice for learning cutting-edge technologies quickly.
|
||||||
|
|||||||
@@ -23,9 +23,6 @@
|
|||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> `SoybeanAdmin` 快速上手系列视频已在 [Bilibili](https://www.bilibili.com/video/BV1YKdRYXELC) 上线 [点击这里](https://www.bilibili.com/video/BV1YKdRYXELC) 前往查看
|
> `SoybeanAdmin` 快速上手系列视频已在 [Bilibili](https://www.bilibili.com/video/BV1YKdRYXELC) 上线 [点击这里](https://www.bilibili.com/video/BV1YKdRYXELC) 前往查看
|
||||||
|
|
||||||
> [!WARNING]
|
|
||||||
> `SoybeanAdmin` 正在计划开发 `V2` 版本,详情见[计划清单](https://github.com/soybeanjs/soybean-admin/issues/767)
|
|
||||||
|
|
||||||
## 简介
|
## 简介
|
||||||
|
|
||||||
[`SoybeanAdmin`](https://github.com/soybeanjs/soybean-admin) 是一个清新优雅、高颜值且功能强大的后台管理模板,基于最新的前端技术栈,包括 Vue3, Vite7, TypeScript, Pinia 和 UnoCSS。它内置了丰富的主题配置和组件,代码规范严谨,实现了自动化的文件路由系统。此外,它还采用了基于 ApiFox 的在线Mock数据方案。`SoybeanAdmin` 为您提供了一站式的后台管理解决方案,无需额外配置,开箱即用。同样是一个快速学习前沿技术的最佳实践。
|
[`SoybeanAdmin`](https://github.com/soybeanjs/soybean-admin) 是一个清新优雅、高颜值且功能强大的后台管理模板,基于最新的前端技术栈,包括 Vue3, Vite7, TypeScript, Pinia 和 UnoCSS。它内置了丰富的主题配置和组件,代码规范严谨,实现了自动化的文件路由系统。此外,它还采用了基于 ApiFox 的在线Mock数据方案。`SoybeanAdmin` 为您提供了一站式的后台管理解决方案,无需额外配置,开箱即用。同样是一个快速学习前沿技术的最佳实践。
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import type { PluginOption } from 'vite';
|
|||||||
import vue from '@vitejs/plugin-vue';
|
import vue from '@vitejs/plugin-vue';
|
||||||
import vueJsx from '@vitejs/plugin-vue-jsx';
|
import vueJsx from '@vitejs/plugin-vue-jsx';
|
||||||
import progress from 'vite-plugin-progress';
|
import progress from 'vite-plugin-progress';
|
||||||
|
import vueRootValidator from 'vite-plugin-vue-transition-root-validator';
|
||||||
import { setupElegantRouter } from './router';
|
import { setupElegantRouter } from './router';
|
||||||
import { setupUnocss } from './unocss';
|
import { setupUnocss } from './unocss';
|
||||||
import { setupUnplugin } from './unplugin';
|
import { setupUnplugin } from './unplugin';
|
||||||
@@ -17,7 +18,8 @@ export function setupVitePlugins(viteEnv: Env.ImportMeta, buildTime: string) {
|
|||||||
setupUnocss(viteEnv),
|
setupUnocss(viteEnv),
|
||||||
...setupUnplugin(viteEnv),
|
...setupUnplugin(viteEnv),
|
||||||
progress(),
|
progress(),
|
||||||
setupHtmlPlugin(buildTime)
|
setupHtmlPlugin(buildTime),
|
||||||
|
vueRootValidator()
|
||||||
];
|
];
|
||||||
|
|
||||||
return plugins;
|
return plugins;
|
||||||
|
|||||||
39
package.json
39
package.json
@@ -64,43 +64,44 @@
|
|||||||
"nprogress": "0.2.0",
|
"nprogress": "0.2.0",
|
||||||
"pinia": "3.0.4",
|
"pinia": "3.0.4",
|
||||||
"tailwind-merge": "3.4.0",
|
"tailwind-merge": "3.4.0",
|
||||||
"vue": "3.5.26",
|
"vue": "3.5.27",
|
||||||
"vue-draggable-plus": "0.6.0",
|
"vue-draggable-plus": "0.6.1",
|
||||||
"vue-i18n": "11.2.7",
|
"vue-i18n": "11.2.8",
|
||||||
"vue-router": "4.6.4"
|
"vue-router": "4.6.4"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@elegant-router/vue": "0.3.8",
|
"@elegant-router/vue": "0.3.8",
|
||||||
"@iconify/json": "2.2.417",
|
"@iconify/json": "2.2.430",
|
||||||
"@sa/scripts": "workspace:*",
|
"@sa/scripts": "workspace:*",
|
||||||
"@sa/uno-preset": "workspace:*",
|
"@sa/uno-preset": "workspace:*",
|
||||||
"@soybeanjs/eslint-config": "1.7.4",
|
"@soybeanjs/eslint-config": "1.7.5",
|
||||||
"@types/node": "25.0.3",
|
"@types/node": "25.0.9",
|
||||||
"@types/nprogress": "0.2.3",
|
"@types/nprogress": "0.2.3",
|
||||||
"@unocss/eslint-config": "66.5.10",
|
"@unocss/eslint-config": "66.6.0",
|
||||||
"@unocss/preset-icons": "66.5.10",
|
"@unocss/preset-icons": "66.6.0",
|
||||||
"@unocss/preset-uno": "66.5.10",
|
"@unocss/preset-uno": "66.6.0",
|
||||||
"@unocss/transformer-directives": "66.5.10",
|
"@unocss/transformer-directives": "66.6.0",
|
||||||
"@unocss/transformer-variant-group": "66.5.10",
|
"@unocss/transformer-variant-group": "66.6.0",
|
||||||
"@unocss/vite": "66.5.10",
|
"@unocss/vite": "66.6.0",
|
||||||
"@vitejs/plugin-vue": "6.0.3",
|
"@vitejs/plugin-vue": "6.0.3",
|
||||||
"@vitejs/plugin-vue-jsx": "5.1.2",
|
"@vitejs/plugin-vue-jsx": "5.1.3",
|
||||||
"consola": "3.4.2",
|
"consola": "3.4.2",
|
||||||
"eslint": "9.39.2",
|
"eslint": "9.39.2",
|
||||||
"eslint-plugin-vue": "10.6.2",
|
"eslint-plugin-vue": "10.7.0",
|
||||||
"kolorist": "1.8.0",
|
"kolorist": "1.8.0",
|
||||||
"sass": "1.97.1",
|
"sass": "1.97.2",
|
||||||
"simple-git-hooks": "2.13.1",
|
"simple-git-hooks": "2.13.1",
|
||||||
"tsx": "4.21.0",
|
"tsx": "4.21.0",
|
||||||
"typescript": "5.9.3",
|
"typescript": "5.9.3",
|
||||||
"unplugin-icons": "22.5.0",
|
"unplugin-icons": "23.0.1",
|
||||||
"unplugin-vue-components": "30.0.0",
|
"unplugin-vue-components": "31.0.0",
|
||||||
"vite": "7.3.0",
|
"vite": "7.3.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": "8.0.5",
|
"vite-plugin-vue-devtools": "8.0.5",
|
||||||
|
"vite-plugin-vue-transition-root-validator": "^0.0.4",
|
||||||
"vue-eslint-parser": "10.2.0",
|
"vue-eslint-parser": "10.2.0",
|
||||||
"vue-tsc": "3.2.1"
|
"vue-tsc": "3.2.2"
|
||||||
},
|
},
|
||||||
"simple-git-hooks": {
|
"simple-git-hooks": {
|
||||||
"commit-msg": "pnpm sa git-commit-verify",
|
"commit-msg": "pnpm sa git-commit-verify",
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
"@sa/utils": "workspace:*",
|
"@sa/utils": "workspace:*",
|
||||||
"axios": "1.13.2",
|
"axios": "1.13.2",
|
||||||
"axios-retry": "4.5.0",
|
"axios-retry": "4.5.0",
|
||||||
"qs": "6.14.0"
|
"qs": "6.14.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/qs": "6.14.0"
|
"@types/qs": "6.14.0"
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ export type TableColumnCheck = {
|
|||||||
title: TableColumnCheckTitle;
|
title: TableColumnCheckTitle;
|
||||||
checked: boolean;
|
checked: boolean;
|
||||||
visible: boolean;
|
visible: boolean;
|
||||||
|
fixed: 'left' | 'right' | 'unFixed';
|
||||||
};
|
};
|
||||||
|
|
||||||
export interface UseTableOptions<ResponseData, ApiData, Column, Pagination extends boolean> {
|
export interface UseTableOptions<ResponseData, ApiData, Column, Pagination extends boolean> {
|
||||||
@@ -78,12 +79,14 @@ export default function useTable<ResponseData, ApiData, Column, Pagination exten
|
|||||||
|
|
||||||
function reloadColumns() {
|
function reloadColumns() {
|
||||||
const checkMap = new Map(columnChecks.value.map(col => [col.key, col.checked]));
|
const checkMap = new Map(columnChecks.value.map(col => [col.key, col.checked]));
|
||||||
|
const fixedMap = new Map(columnChecks.value.map(col => [col.key, col.fixed]));
|
||||||
|
|
||||||
const defaultChecks = getColumnChecks(columns());
|
const defaultChecks = getColumnChecks(columns());
|
||||||
|
|
||||||
columnChecks.value = defaultChecks.map(col => ({
|
columnChecks.value = defaultChecks.map(col => ({
|
||||||
...col,
|
...col,
|
||||||
checked: checkMap.get(col.key) ?? col.checked
|
checked: checkMap.get(col.key) ?? col.checked,
|
||||||
|
fixed: (fixedMap.get(col.key) !== 'unFixed' ? fixedMap.get(col.key) : undefined) ?? col.fixed
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,15 +13,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@soybeanjs/changelog": "0.3.25",
|
"@soybeanjs/changelog": "0.4.3",
|
||||||
"bumpp": "10.3.2",
|
"bumpp": "10.4.0",
|
||||||
"c12": "3.3.3",
|
"c12": "3.3.3",
|
||||||
"cac": "6.7.14",
|
"cac": "6.7.14",
|
||||||
"consola": "3.4.2",
|
"consola": "3.4.2",
|
||||||
"enquirer": "2.4.1",
|
"enquirer": "2.4.1",
|
||||||
"execa": "9.6.1",
|
"execa": "9.6.1",
|
||||||
"kolorist": "1.8.0",
|
"kolorist": "1.8.0",
|
||||||
"npm-check-updates": "19.2.0",
|
"npm-check-updates": "19.3.1",
|
||||||
"picomatch": "4.0.3",
|
"picomatch": "4.0.3",
|
||||||
"rimraf": "6.1.2"
|
"rimraf": "6.1.2"
|
||||||
}
|
}
|
||||||
|
|||||||
1739
pnpm-lock.yaml
generated
1739
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -1 +1,60 @@
|
|||||||
<svg viewBox="0 0 160 160" xmlns="http://www.w3.org/2000/svg"><path d="M81.28 55.9c-.1-11.67-2.93-22.55-9.37-32.38-1-1.5-2.14-2.86-2.5-4.71a8.1 8.1 0 014-8.61 7.89 7.89 0 019.3 1.23 35.999 35.999 0 015.9 8.83 75.18 75.18 0 018.44 28.58 83.211 83.211 0 01-5.23 36.74 102.983 102.983 0 01-3 7.28 1.2 1.2 0 000 1.41c9.58 13.3 21.76 23 37.85 27.24a54.37 54.37 0 0019.68 1.57 7.72 7.72 0 018.36 6.9 7.903 7.903 0 01-6.7 9 64.744 64.744 0 01-23-1.33 77.68 77.68 0 01-36.93-19.88 93.628 93.628 0 01-11.91-13.71 2.18 2.18 0 00-2.3-1.06 72.744 72.744 0 00-27.38 7.55c-11.6 6-20.67 14.58-26.4 26.45a10.134 10.134 0 01-3.7 4.7 8 8 0 01-9.19-.7 7.86 7.86 0 01-2.36-9.28 60.324 60.324 0 018.72-14.52c12.2-15.43 28.21-24.59 47.32-28.57A85.085 85.085 0 0173.07 87c.524.015 1-.307 1.18-.8a76.06 76.06 0 006.53-22.3c.351-2.652.518-5.325.5-8z" fill="#646cff"/><path d="M136.26 108.34a44.742 44.742 0 01-11.13-2.87 46.108 46.108 0 01-19.66-13.76 8 8 0 015.72-13.22 7.93 7.93 0 016.54 2.93 33.27 33.27 0 0018.87 10.75c1.546.155 3.058.553 4.48 1.18a8.08 8.08 0 013.84 9.21c-.92 3.52-4.13 5.81-8.66 5.78zm-80.6-75.02a7.61 7.61 0 016.64 5 49.139 49.139 0 013.64 17 46.33 46.33 0 01-2.46 17.28c-2 5.77-8.24 7.79-12.89 4.15a8.1 8.1 0 01-2.39-9 31.679 31.679 0 001.68-12.36 35.77 35.77 0 00-2.43-11c-2.1-5.45 1.75-11.07 8.21-11.07zm22.26 93.25a8 8 0 01-6.68 7.86 32.88 32.88 0 00-19.7 12.19 8.13 8.13 0 01-11.21 1.62 8 8 0 01-1.41-11.58A51.043 51.043 0 0154 123.81a45.842 45.842 0 0114-5.1c5.35-1.04 9.91 2.56 9.92 7.86z" fill="#646cff"/></svg>
|
<svg width="100%" height="100%" version="1.1" viewBox="0 0 1000 1000" xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<g>
|
||||||
|
<path
|
||||||
|
d="M 200,866 C 100,866 50,779.4 100,692.8 L 200,519.6 C 220,485 240,490 265,499.6 S 360,542.68 360,542.68 C 480.5,601 498,642.5 500,720 C 498,811 462,856 420,866"
|
||||||
|
fill="url(#LinearGradient)" fill-rule="nonzero" opacity="1" stroke="none" />
|
||||||
|
<path
|
||||||
|
d="M 420,866 C 455,861 478,846 500,827 C 614,696 615,597 500,517 C 394,444 333,374 380,207.82 L 260,415.67 C 240.22,450 254.37,465.1 275.28,481.79 S 360,542.68 360,542.68 C 480.5,601 498,642.5 500,720 C 498,811 462,856 420,866"
|
||||||
|
fill="url(#LinearGradient_2)" fill-rule="nonzero" opacity="1" stroke="none" />
|
||||||
|
<path d="M 500,517 C 394,444 333,374 380,207.82 L 400,173.2 C 367,295 421,350 603,428 C 572,440 524,474 500,517"
|
||||||
|
fill="url(#LinearGradient_3)" fill-rule="nonzero" opacity="1" stroke="none" />
|
||||||
|
<path d="M 500,827 L 660,660 C 738,589 710,482 603,428 C 572,440 524,474 500,517 C 615,597 614,696 500,827"
|
||||||
|
fill="url(#LinearGradient_4)" fill-rule="nonzero" opacity="1" stroke="none" />
|
||||||
|
<path d="M 400,173.2 C 367,295 421,350 603,428 C 690,389, 750,445 788,500 L 600,173.2 C 550,86.6 450,86.6 400,173.2"
|
||||||
|
fill="url(#LinearGradient_5)" fill-rule="nonzero" opacity="1" stroke="none" />
|
||||||
|
<path
|
||||||
|
d="M 500,827 L 660,660 C 738,589 710,482 603,428 C 690,389, 750,445 788,500 C 816,554 797,606 750,640 L 500,827"
|
||||||
|
fill="url(#LinearGradient_6)" fill-rule="nonzero" opacity="1" stroke="none" />
|
||||||
|
<path
|
||||||
|
d="M 788,500 C 816,554 797,606 750,640 L 500,827 C 497,851 513,862 540,866 L 800,866 C 900,866 950,779.4 900,692.8 L 788,500"
|
||||||
|
fill="url(#LinearGradient_7)" fill-rule="nonzero" opacity="1" stroke="none" />
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<linearGradient gradientTransform="matrix(104.391 -73.3432 73.3432 104.391 277.441 710.122)"
|
||||||
|
gradientUnits="userSpaceOnUse" id="LinearGradient" x1="0" x2="1" y1="0" y2="0">
|
||||||
|
<stop offset="0" stop-color="#373ebf" />
|
||||||
|
<stop offset="1" stop-color="#5058e6" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient gradientTransform="matrix(-173.747 557.324 -557.324 -173.747 508.829 258.172)"
|
||||||
|
gradientUnits="userSpaceOnUse" id="LinearGradient_2" x1="0" x2="1" y1="0" y2="0">
|
||||||
|
<stop offset="0" stop-color="#c2d6ff" />
|
||||||
|
<stop offset="1" stop-color="#646cff" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient gradientTransform="matrix(157.951 295.666 -295.666 157.951 382.944 193.642)"
|
||||||
|
gradientUnits="userSpaceOnUse" id="LinearGradient_3" x1="0" x2="1" y1="0" y2="0">
|
||||||
|
<stop offset="0" stop-color="#5058e6" />
|
||||||
|
<stop offset="1" stop-color="#373ebf" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient gradientTransform="matrix(-44.3023 219.578 -219.578 -44.3023 619.69 469.652)"
|
||||||
|
gradientUnits="userSpaceOnUse" id="LinearGradient_4" x1="0" x2="1" y1="0" y2="0">
|
||||||
|
<stop offset="0" stop-color="#91a7ff" />
|
||||||
|
<stop offset="1" stop-color="#5058e6" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient gradientTransform="matrix(125.52 334.256 -334.256 125.52 539.723 235.139)"
|
||||||
|
gradientUnits="userSpaceOnUse" id="LinearGradient_5" x1="0" x2="1" y1="0" y2="0">
|
||||||
|
<stop offset="0" stop-color="#646cff" />
|
||||||
|
<stop offset="1" stop-color="#c2d6ff" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient gradientTransform="matrix(-241.23 357.206 -357.206 -241.23 754.054 449.312)"
|
||||||
|
gradientUnits="userSpaceOnUse" id="LinearGradient_6" x1="0" x2="1" y1="0" y2="0">
|
||||||
|
<stop offset="0" stop-color="#c2d6ff" />
|
||||||
|
<stop offset="1" stop-color="#646cff" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient gradientTransform="matrix(125.978 210.065 -210.065 125.978 596.433 613.665)"
|
||||||
|
gradientUnits="userSpaceOnUse" id="LinearGradient_7" x1="0" x2="1" y1="0" y2="0">
|
||||||
|
<stop offset="0" stop-color="#373ebf" />
|
||||||
|
<stop offset="1" stop-color="#5058e6" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 3.8 KiB |
@@ -1,4 +1,5 @@
|
|||||||
<script setup lang="ts" generic="T extends Record<string, unknown>, K = never">
|
<script setup lang="ts" generic="T extends Record<string, unknown>, K = never">
|
||||||
|
import { computed } from 'vue';
|
||||||
import { VueDraggable } from 'vue-draggable-plus';
|
import { VueDraggable } from 'vue-draggable-plus';
|
||||||
import { $t } from '@/locales';
|
import { $t } from '@/locales';
|
||||||
|
|
||||||
@@ -9,6 +10,53 @@ defineOptions({
|
|||||||
const columns = defineModel<NaiveUI.TableColumnCheck[]>('columns', {
|
const columns = defineModel<NaiveUI.TableColumnCheck[]>('columns', {
|
||||||
required: true
|
required: true
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const tooltipRecord: Record<NaiveUI.TableColumnFixed, App.I18n.I18nKey> = {
|
||||||
|
left: 'datatable.fixed.right',
|
||||||
|
right: 'datatable.fixed.unFixed',
|
||||||
|
unFixed: 'datatable.fixed.left'
|
||||||
|
};
|
||||||
|
|
||||||
|
function handleFixed(column: NaiveUI.TableColumnCheck) {
|
||||||
|
const fixedOptions: NaiveUI.TableColumnFixed[] = ['left', 'right', 'unFixed'];
|
||||||
|
const index = fixedOptions.findIndex(item => item === column.fixed);
|
||||||
|
const nextIndex = index === fixedOptions.length - 1 ? 0 : index + 1;
|
||||||
|
column.fixed = fixedOptions[nextIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
const visibleStats = computed(() => {
|
||||||
|
let total = 0;
|
||||||
|
let checked = 0;
|
||||||
|
|
||||||
|
columns.value.forEach(column => {
|
||||||
|
if (!column.visible) return;
|
||||||
|
|
||||||
|
total += 1;
|
||||||
|
if (column.checked) checked += 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
return { total, checked };
|
||||||
|
});
|
||||||
|
|
||||||
|
const selectAllChecked = computed(() => {
|
||||||
|
const { total, checked } = visibleStats.value;
|
||||||
|
|
||||||
|
return total > 0 && checked === total;
|
||||||
|
});
|
||||||
|
|
||||||
|
const selectAllIndeterminate = computed(() => {
|
||||||
|
const { total, checked } = visibleStats.value;
|
||||||
|
|
||||||
|
return checked > 0 && checked < total;
|
||||||
|
});
|
||||||
|
|
||||||
|
function toggleSelectAll(checked: boolean) {
|
||||||
|
columns.value.forEach(column => {
|
||||||
|
if (!column.visible) return;
|
||||||
|
|
||||||
|
column.checked = checked;
|
||||||
|
});
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -21,22 +69,49 @@ const columns = defineModel<NaiveUI.TableColumnCheck[]>('columns', {
|
|||||||
{{ $t('common.columnSetting') }}
|
{{ $t('common.columnSetting') }}
|
||||||
</NButton>
|
</NButton>
|
||||||
</template>
|
</template>
|
||||||
<VueDraggable v-model="columns" :animation="150" filter=".none_draggable">
|
<div>
|
||||||
<div
|
<div class="h-36px flex-y-center rd-4px pl-26px hover:(bg-primary bg-opacity-20)">
|
||||||
v-for="item in columns"
|
<NCheckbox
|
||||||
:key="item.key"
|
:checked="selectAllChecked"
|
||||||
class="h-36px flex-y-center rd-4px hover:(bg-primary bg-opacity-20)"
|
:indeterminate="selectAllIndeterminate"
|
||||||
:class="{ hidden: !item.visible }"
|
:disabled="visibleStats.total === 0"
|
||||||
>
|
class="flex-1"
|
||||||
<icon-mdi-drag class="mr-8px h-full cursor-move text-icon" />
|
@update:checked="toggleSelectAll"
|
||||||
<NCheckbox v-model:checked="item.checked" class="none_draggable flex-1">
|
>
|
||||||
<template v-if="typeof item.title === 'function'">
|
{{ $t('common.selectAll') }}
|
||||||
<component :is="item.title" />
|
|
||||||
</template>
|
|
||||||
<template v-else>{{ item.title }}</template>
|
|
||||||
</NCheckbox>
|
</NCheckbox>
|
||||||
</div>
|
</div>
|
||||||
</VueDraggable>
|
<NDivider class="!my-4px" />
|
||||||
|
<VueDraggable v-model="columns" :animation="150" filter=".none_draggable" class="max-h-[200px] overflow-y-auto">
|
||||||
|
<div
|
||||||
|
v-for="item in columns"
|
||||||
|
:key="item.key"
|
||||||
|
class="h-36px flex-y-center justify-between gap-6px"
|
||||||
|
:class="{ hidden: !item.visible }"
|
||||||
|
>
|
||||||
|
<div class="h-full flex-y-center flex-1 rd-4px hover:(bg-primary bg-opacity-20)">
|
||||||
|
<icon-mdi-drag class="mr-8px h-full cursor-move text-icon" />
|
||||||
|
<NCheckbox v-model:checked="item.checked" class="none_draggable flex-1">
|
||||||
|
<template v-if="typeof item.title === 'function'">
|
||||||
|
<component :is="item.title" />
|
||||||
|
</template>
|
||||||
|
<template v-else>{{ item.title }}</template>
|
||||||
|
</NCheckbox>
|
||||||
|
</div>
|
||||||
|
<ButtonIcon
|
||||||
|
:disabled="!item.checked"
|
||||||
|
text
|
||||||
|
:focusable="false"
|
||||||
|
:tooltip-content="$t(tooltipRecord[item.fixed!])"
|
||||||
|
@click="handleFixed(item)"
|
||||||
|
>
|
||||||
|
<icon-octicon-pin-16 v-if="item.fixed === 'unFixed'" />
|
||||||
|
<icon-octicon-pin-16 v-else-if="item.fixed === 'left'" class="rotate-270" />
|
||||||
|
<icon-octicon-pin-slash-16 v-else />
|
||||||
|
</ButtonIcon>
|
||||||
|
</div>
|
||||||
|
</VueDraggable>
|
||||||
|
</div>
|
||||||
</NPopover>
|
</NPopover>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,160 @@
|
|||||||
<script lang="ts" setup>
|
|
||||||
defineOptions({ name: 'SystemLogo' });
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<icon-local-logo />
|
<div class="app-logo">
|
||||||
|
<svg
|
||||||
|
width="100%"
|
||||||
|
height="100%"
|
||||||
|
version="1.1"
|
||||||
|
viewBox="0 0 1000 1000"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
>
|
||||||
|
<g>
|
||||||
|
<path
|
||||||
|
d="M 200,866 C 100,866 50,779.4 100,692.8 L 200,519.6 C 220,485 240,490 265,499.6 S 360,542.68 360,542.68 C 480.5,601 498,642.5 500,720 C 498,811 462,856 420,866"
|
||||||
|
fill="url(#LinearGradient)"
|
||||||
|
fill-rule="nonzero"
|
||||||
|
opacity="1"
|
||||||
|
stroke="none"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M 420,866 C 455,861 478,846 500,827 C 614,696 615,597 500,517 C 394,444 333,374 380,207.82 L 260,415.67 C 240.22,450 254.37,465.1 275.28,481.79 S 360,542.68 360,542.68 C 480.5,601 498,642.5 500,720 C 498,811 462,856 420,866"
|
||||||
|
fill="url(#LinearGradient_2)"
|
||||||
|
fill-rule="nonzero"
|
||||||
|
opacity="1"
|
||||||
|
stroke="none"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M 500,517 C 394,444 333,374 380,207.82 L 400,173.2 C 367,295 421,350 603,428 C 572,440 524,474 500,517"
|
||||||
|
fill="url(#LinearGradient_3)"
|
||||||
|
fill-rule="nonzero"
|
||||||
|
opacity="1"
|
||||||
|
stroke="none"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M 500,827 L 660,660 C 738,589 710,482 603,428 C 572,440 524,474 500,517 C 615,597 614,696 500,827"
|
||||||
|
fill="url(#LinearGradient_4)"
|
||||||
|
fill-rule="nonzero"
|
||||||
|
opacity="1"
|
||||||
|
stroke="none"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M 400,173.2 C 367,295 421,350 603,428 C 690,389, 750,445 788,500 L 600,173.2 C 550,86.6 450,86.6 400,173.2"
|
||||||
|
fill="url(#LinearGradient_5)"
|
||||||
|
fill-rule="nonzero"
|
||||||
|
opacity="1"
|
||||||
|
stroke="none"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M 500,827 L 660,660 C 738,589 710,482 603,428 C 690,389, 750,445 788,500 C 816,554 797,606 750,640 L 500,827"
|
||||||
|
fill="url(#LinearGradient_6)"
|
||||||
|
fill-rule="nonzero"
|
||||||
|
opacity="1"
|
||||||
|
stroke="none"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M 788,500 C 816,554 797,606 750,640 L 500,827 C 497,851 513,862 540,866 L 800,866 C 900,866 950,779.4 900,692.8 L 788,500"
|
||||||
|
fill="url(#LinearGradient_7)"
|
||||||
|
fill-rule="nonzero"
|
||||||
|
opacity="1"
|
||||||
|
stroke="none"
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<linearGradient
|
||||||
|
id="LinearGradient"
|
||||||
|
gradientTransform="matrix(104.391 -73.3432 73.3432 104.391 277.441 710.122)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="0"
|
||||||
|
x2="1"
|
||||||
|
y1="0"
|
||||||
|
y2="0"
|
||||||
|
>
|
||||||
|
<stop offset="0" stop-color="var(--logo-color-700)" />
|
||||||
|
<stop offset="1" stop-color="var(--logo-color-600)" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="LinearGradient_2"
|
||||||
|
gradientTransform="matrix(-173.747 557.324 -557.324 -173.747 508.829 258.172)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="0"
|
||||||
|
x2="1"
|
||||||
|
y1="0"
|
||||||
|
y2="0"
|
||||||
|
>
|
||||||
|
<stop offset="0" stop-color="var(--logo-color-300)" />
|
||||||
|
<stop offset="1" stop-color="var(--logo-color-500)" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="LinearGradient_3"
|
||||||
|
gradientTransform="matrix(157.951 295.666 -295.666 157.951 382.944 193.642)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="0"
|
||||||
|
x2="1"
|
||||||
|
y1="0"
|
||||||
|
y2="0"
|
||||||
|
>
|
||||||
|
<stop offset="0" stop-color="var(--logo-color-600)" />
|
||||||
|
<stop offset="1" stop-color="var(--logo-color-700)" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="LinearGradient_4"
|
||||||
|
gradientTransform="matrix(-44.3023 219.578 -219.578 -44.3023 619.69 469.652)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="0"
|
||||||
|
x2="1"
|
||||||
|
y1="0"
|
||||||
|
y2="0"
|
||||||
|
>
|
||||||
|
<stop offset="0" stop-color="var(--logo-color-400)" />
|
||||||
|
<stop offset="1" stop-color="var(--logo-color-600)" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="LinearGradient_5"
|
||||||
|
gradientTransform="matrix(125.52 334.256 -334.256 125.52 539.723 235.139)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="0"
|
||||||
|
x2="1"
|
||||||
|
y1="0"
|
||||||
|
y2="0"
|
||||||
|
>
|
||||||
|
<stop offset="0" stop-color="var(--logo-color-500)" />
|
||||||
|
<stop offset="1" stop-color="var(--logo-color-300)" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="LinearGradient_6"
|
||||||
|
gradientTransform="matrix(-241.23 357.206 -357.206 -241.23 754.054 449.312)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="0"
|
||||||
|
x2="1"
|
||||||
|
y1="0"
|
||||||
|
y2="0"
|
||||||
|
>
|
||||||
|
<stop offset="0" stop-color="var(--logo-color-300)" />
|
||||||
|
<stop offset="1" stop-color="var(--logo-color-500)" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="LinearGradient_7"
|
||||||
|
gradientTransform="matrix(125.978 210.065 -210.065 125.978 596.433 613.665)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="0"
|
||||||
|
x2="1"
|
||||||
|
y1="0"
|
||||||
|
y2="0"
|
||||||
|
>
|
||||||
|
<stop offset="0" stop-color="var(--logo-color-700)" />
|
||||||
|
<stop offset="1" stop-color="var(--logo-color-600)" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped></style>
|
<style scoped>
|
||||||
|
.app-logo {
|
||||||
|
--logo-color-300: rgb(var(--primary-300-color));
|
||||||
|
--logo-color-400: rgb(var(--primary-400-color));
|
||||||
|
--logo-color-500: rgb(var(--primary-500-color));
|
||||||
|
--logo-color-600: rgb(var(--primary-600-color));
|
||||||
|
--logo-color-700: rgb(var(--primary-700-color));
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -266,6 +266,7 @@ function getColumnChecks<Column extends NaiveUI.TableColumn<any>>(
|
|||||||
key: column.key as string,
|
key: column.key as string,
|
||||||
title: column.title!,
|
title: column.title!,
|
||||||
checked: true,
|
checked: true,
|
||||||
|
fixed: column.fixed ?? 'unFixed',
|
||||||
visible: getColumnVisible?.(column) ?? true
|
visible: getColumnVisible?.(column) ?? true
|
||||||
});
|
});
|
||||||
} else if (column.type === 'selection') {
|
} else if (column.type === 'selection') {
|
||||||
@@ -273,6 +274,7 @@ function getColumnChecks<Column extends NaiveUI.TableColumn<any>>(
|
|||||||
key: SELECTION_KEY,
|
key: SELECTION_KEY,
|
||||||
title: $t('common.check'),
|
title: $t('common.check'),
|
||||||
checked: true,
|
checked: true,
|
||||||
|
fixed: column.fixed ?? 'unFixed',
|
||||||
visible: getColumnVisible?.(column) ?? false
|
visible: getColumnVisible?.(column) ?? false
|
||||||
});
|
});
|
||||||
} else if (column.type === 'expand') {
|
} else if (column.type === 'expand') {
|
||||||
@@ -280,6 +282,7 @@ function getColumnChecks<Column extends NaiveUI.TableColumn<any>>(
|
|||||||
key: EXPAND_KEY,
|
key: EXPAND_KEY,
|
||||||
title: $t('common.expandColumn'),
|
title: $t('common.expandColumn'),
|
||||||
checked: true,
|
checked: true,
|
||||||
|
fixed: column.fixed ?? 'unFixed',
|
||||||
visible: getColumnVisible?.(column) ?? false
|
visible: getColumnVisible?.(column) ?? false
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -301,7 +304,14 @@ function getColumns<Column extends NaiveUI.TableColumn<any>>(cols: Column[], che
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const filteredColumns = checks.filter(item => item.checked).map(check => columnMap.get(check.key) as Column);
|
const filteredColumns = checks
|
||||||
|
.filter(item => item.checked)
|
||||||
|
.map(check => {
|
||||||
|
return {
|
||||||
|
...columnMap.get(check.key),
|
||||||
|
fixed: check.fixed
|
||||||
|
} as Column;
|
||||||
|
});
|
||||||
|
|
||||||
return filteredColumns;
|
return filteredColumns;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ withDefaults(defineProps<Props>(), {
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<RouterLink to="/" class="w-full flex-center nowrap-hidden">
|
<RouterLink to="/" class="w-full flex-center nowrap-hidden">
|
||||||
<SystemLogo class="text-32px text-primary" />
|
<SystemLogo class="size-32px" />
|
||||||
<h2 v-show="showTitle" class="pl-8px text-16px text-primary font-bold transition duration-300 ease-in-out">
|
<h2 v-show="showTitle" class="pl-8px text-16px text-primary font-bold transition duration-300 ease-in-out">
|
||||||
{{ $t('system.title') }}
|
{{ $t('system.title') }}
|
||||||
</h2>
|
</h2>
|
||||||
|
|||||||
@@ -24,3 +24,7 @@ export const $t = i18n.global.t as App.I18n.$T;
|
|||||||
export function setLocale(locale: App.I18n.LangType) {
|
export function setLocale(locale: App.I18n.LangType) {
|
||||||
i18n.global.locale.value = locale;
|
i18n.global.locale.value = locale;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getLocale(): App.I18n.LangType {
|
||||||
|
return i18n.global.locale.value as App.I18n.LangType;
|
||||||
|
}
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ const local: App.I18n.Schema = {
|
|||||||
cancel: 'Cancel',
|
cancel: 'Cancel',
|
||||||
close: 'Close',
|
close: 'Close',
|
||||||
check: 'Check',
|
check: 'Check',
|
||||||
|
selectAll: 'Select All',
|
||||||
expandColumn: 'Expand Column',
|
expandColumn: 'Expand Column',
|
||||||
columnSetting: 'Column Setting',
|
columnSetting: 'Column Setting',
|
||||||
config: 'Config',
|
config: 'Config',
|
||||||
@@ -356,7 +357,12 @@ const local: App.I18n.Schema = {
|
|||||||
unpin: 'Unpin'
|
unpin: 'Unpin'
|
||||||
},
|
},
|
||||||
datatable: {
|
datatable: {
|
||||||
itemCount: 'Total {total} items'
|
itemCount: 'Total {total} items',
|
||||||
|
fixed: {
|
||||||
|
left: 'Left Fixed',
|
||||||
|
right: 'Right Fixed',
|
||||||
|
unFixed: 'Unfixed'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ const local: App.I18n.Schema = {
|
|||||||
cancel: '取消',
|
cancel: '取消',
|
||||||
close: '关闭',
|
close: '关闭',
|
||||||
check: '勾选',
|
check: '勾选',
|
||||||
|
selectAll: '全选',
|
||||||
expandColumn: '展开列',
|
expandColumn: '展开列',
|
||||||
columnSetting: '列设置',
|
columnSetting: '列设置',
|
||||||
config: '配置',
|
config: '配置',
|
||||||
@@ -352,7 +353,12 @@ const local: App.I18n.Schema = {
|
|||||||
unpin: '取消固定'
|
unpin: '取消固定'
|
||||||
},
|
},
|
||||||
datatable: {
|
datatable: {
|
||||||
itemCount: '共 {total} 条'
|
itemCount: '共 {total} 条',
|
||||||
|
fixed: {
|
||||||
|
left: '左固定',
|
||||||
|
right: '右固定',
|
||||||
|
unFixed: '取消固定'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import { createApp } from 'vue';
|
import { createApp } from 'vue';
|
||||||
import './plugins/assets';
|
import './plugins/assets';
|
||||||
|
import { setupVueRootValidator } from 'vite-plugin-vue-transition-root-validator/client';
|
||||||
import { setupAppVersionNotification, setupDayjs, setupIconifyOffline, setupLoading, setupNProgress } from './plugins';
|
import { setupAppVersionNotification, setupDayjs, setupIconifyOffline, setupLoading, setupNProgress } from './plugins';
|
||||||
import { setupStore } from './store';
|
import { setupStore } from './store';
|
||||||
import { setupRouter } from './router';
|
import { setupRouter } from './router';
|
||||||
import { setupI18n } from './locales';
|
import { getLocale, setupI18n } from './locales';
|
||||||
import App from './App.vue';
|
import App from './App.vue';
|
||||||
|
|
||||||
async function setupApp() {
|
async function setupApp() {
|
||||||
@@ -25,6 +26,10 @@ async function setupApp() {
|
|||||||
|
|
||||||
setupAppVersionNotification();
|
setupAppVersionNotification();
|
||||||
|
|
||||||
|
setupVueRootValidator(app, {
|
||||||
|
lang: getLocale() === 'zh-CN' ? 'zh' : 'en'
|
||||||
|
});
|
||||||
|
|
||||||
app.mount('#app');
|
app.mount('#app');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +1,25 @@
|
|||||||
// @unocss-include
|
// @unocss-include
|
||||||
import { getRgb } from '@sa/color';
|
import { getColorPalette, getRgb } from '@sa/color';
|
||||||
import { DARK_CLASS } from '@/constants/app';
|
import { DARK_CLASS } from '@/constants/app';
|
||||||
import { localStg } from '@/utils/storage';
|
import { localStg } from '@/utils/storage';
|
||||||
import { toggleHtmlClass } from '@/utils/common';
|
import { toggleHtmlClass } from '@/utils/common';
|
||||||
import systemLogo from '@/assets/svg-icon/logo.svg?raw';
|
|
||||||
import { $t } from '@/locales';
|
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 darkMode = localStg.get('darkMode') || false;
|
||||||
|
const palette = getColorPalette(themeColor);
|
||||||
|
|
||||||
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}`;
|
||||||
|
|
||||||
|
const svgCssVars = Array.from(palette.entries())
|
||||||
|
.map(([key, value]) => `--logo-color-${key}: ${value}`)
|
||||||
|
.join(';');
|
||||||
|
|
||||||
|
const cssVars = `${primaryColor}; ${svgCssVars}`;
|
||||||
|
|
||||||
if (darkMode) {
|
if (darkMode) {
|
||||||
toggleHtmlClass(DARK_CLASS).add();
|
toggleHtmlClass(DARK_CLASS).add();
|
||||||
}
|
}
|
||||||
@@ -24,8 +31,6 @@ export function setupLoading() {
|
|||||||
'right-0 bottom-0 animate-delay-1500'
|
'right-0 bottom-0 animate-delay-1500'
|
||||||
];
|
];
|
||||||
|
|
||||||
const logoWithClass = systemLogo.replace('<svg', `<svg class="size-128px text-primary"`);
|
|
||||||
|
|
||||||
const dot = loadingClasses
|
const dot = loadingClasses
|
||||||
.map(item => {
|
.map(item => {
|
||||||
return `<div class="absolute w-16px h-16px bg-primary rounded-8px animate-pulse ${item}"></div>`;
|
return `<div class="absolute w-16px h-16px bg-primary rounded-8px animate-pulse ${item}"></div>`;
|
||||||
@@ -33,8 +38,10 @@ export function setupLoading() {
|
|||||||
.join('\n');
|
.join('\n');
|
||||||
|
|
||||||
const loading = `
|
const loading = `
|
||||||
<div class="fixed-center flex-col bg-layout" style="${primaryColor}">
|
<div class="fixed-center flex-col bg-layout" style="${cssVars}">
|
||||||
${logoWithClass}
|
<div class="w-128px h-128px">
|
||||||
|
${getLogoSvg()}
|
||||||
|
</div>
|
||||||
<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}
|
||||||
@@ -49,3 +56,155 @@ export function setupLoading() {
|
|||||||
app.innerHTML = loading;
|
app.innerHTML = loading;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getLogoSvg() {
|
||||||
|
const logoSvg = `<svg
|
||||||
|
width="100%"
|
||||||
|
height="100%"
|
||||||
|
version="1.1"
|
||||||
|
viewBox="0 0 1000 1000"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
>
|
||||||
|
<g>
|
||||||
|
<path
|
||||||
|
d="M 200,866 C 100,866 50,779.4 100,692.8 L 200,519.6 C 220,485 240,490 265,499.6 S 360,542.68 360,542.68 C 480.5,601 498,642.5 500,720 C 498,811 462,856 420,866"
|
||||||
|
fill="url(#LinearGradient)"
|
||||||
|
fill-rule="nonzero"
|
||||||
|
opacity="1"
|
||||||
|
stroke="none"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M 420,866 C 455,861 478,846 500,827 C 614,696 615,597 500,517 C 394,444 333,374 380,207.82 L 260,415.67 C 240.22,450 254.37,465.1 275.28,481.79 S 360,542.68 360,542.68 C 480.5,601 498,642.5 500,720 C 498,811 462,856 420,866"
|
||||||
|
fill="url(#LinearGradient_2)"
|
||||||
|
fill-rule="nonzero"
|
||||||
|
opacity="1"
|
||||||
|
stroke="none"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M 500,517 C 394,444 333,374 380,207.82 L 400,173.2 C 367,295 421,350 603,428 C 572,440 524,474 500,517"
|
||||||
|
fill="url(#LinearGradient_3)"
|
||||||
|
fill-rule="nonzero"
|
||||||
|
opacity="1"
|
||||||
|
stroke="none"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M 500,827 L 660,660 C 738,589 710,482 603,428 C 572,440 524,474 500,517 C 615,597 614,696 500,827"
|
||||||
|
fill="url(#LinearGradient_4)"
|
||||||
|
fill-rule="nonzero"
|
||||||
|
opacity="1"
|
||||||
|
stroke="none"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M 400,173.2 C 367,295 421,350 603,428 C 690,389, 750,445 788,500 L 600,173.2 C 550,86.6 450,86.6 400,173.2"
|
||||||
|
fill="url(#LinearGradient_5)"
|
||||||
|
fill-rule="nonzero"
|
||||||
|
opacity="1"
|
||||||
|
stroke="none"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M 500,827 L 660,660 C 738,589 710,482 603,428 C 690,389, 750,445 788,500 C 816,554 797,606 750,640 L 500,827"
|
||||||
|
fill="url(#LinearGradient_6)"
|
||||||
|
fill-rule="nonzero"
|
||||||
|
opacity="1"
|
||||||
|
stroke="none"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M 788,500 C 816,554 797,606 750,640 L 500,827 C 497,851 513,862 540,866 L 800,866 C 900,866 950,779.4 900,692.8 L 788,500"
|
||||||
|
fill="url(#LinearGradient_7)"
|
||||||
|
fill-rule="nonzero"
|
||||||
|
opacity="1"
|
||||||
|
stroke="none"
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<linearGradient
|
||||||
|
id="LinearGradient"
|
||||||
|
gradientTransform="matrix(104.391 -73.3432 73.3432 104.391 277.441 710.122)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="0"
|
||||||
|
x2="1"
|
||||||
|
y1="0"
|
||||||
|
y2="0"
|
||||||
|
>
|
||||||
|
<stop offset="0" stop-color="var(--logo-color-700)" />
|
||||||
|
<stop offset="1" stop-color="var(--logo-color-600)" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="LinearGradient_2"
|
||||||
|
gradientTransform="matrix(-173.747 557.324 -557.324 -173.747 508.829 258.172)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="0"
|
||||||
|
x2="1"
|
||||||
|
y1="0"
|
||||||
|
y2="0"
|
||||||
|
>
|
||||||
|
<stop offset="0" stop-color="var(--logo-color-300)" />
|
||||||
|
<stop offset="1" stop-color="var(--logo-color-500)" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="LinearGradient_3"
|
||||||
|
gradientTransform="matrix(157.951 295.666 -295.666 157.951 382.944 193.642)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="0"
|
||||||
|
x2="1"
|
||||||
|
y1="0"
|
||||||
|
y2="0"
|
||||||
|
>
|
||||||
|
<stop offset="0" stop-color="var(--logo-color-600)" />
|
||||||
|
<stop offset="1" stop-color="var(--logo-color-700)" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="LinearGradient_4"
|
||||||
|
gradientTransform="matrix(-44.3023 219.578 -219.578 -44.3023 619.69 469.652)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="0"
|
||||||
|
x2="1"
|
||||||
|
y1="0"
|
||||||
|
y2="0"
|
||||||
|
>
|
||||||
|
<stop offset="0" stop-color="var(--logo-color-400)" />
|
||||||
|
<stop offset="1" stop-color="var(--logo-color-600)" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="LinearGradient_5"
|
||||||
|
gradientTransform="matrix(125.52 334.256 -334.256 125.52 539.723 235.139)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="0"
|
||||||
|
x2="1"
|
||||||
|
y1="0"
|
||||||
|
y2="0"
|
||||||
|
>
|
||||||
|
<stop offset="0" stop-color="var(--logo-color-500)" />
|
||||||
|
<stop offset="1" stop-color="var(--logo-color-300)" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="LinearGradient_6"
|
||||||
|
gradientTransform="matrix(-241.23 357.206 -357.206 -241.23 754.054 449.312)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="0"
|
||||||
|
x2="1"
|
||||||
|
y1="0"
|
||||||
|
y2="0"
|
||||||
|
>
|
||||||
|
<stop offset="0" stop-color="var(--logo-color-300)" />
|
||||||
|
<stop offset="1" stop-color="var(--logo-color-500)" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="LinearGradient_7"
|
||||||
|
gradientTransform="matrix(125.978 210.065 -210.065 125.978 596.433 613.665)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="0"
|
||||||
|
x2="1"
|
||||||
|
y1="0"
|
||||||
|
y2="0"
|
||||||
|
>
|
||||||
|
<stop offset="0" stop-color="var(--logo-color-700)" />
|
||||||
|
<stop offset="1" stop-color="var(--logo-color-600)" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
`;
|
||||||
|
|
||||||
|
return logoSvg;
|
||||||
|
}
|
||||||
|
|||||||
6
src/typings/app.d.ts
vendored
6
src/typings/app.d.ts
vendored
@@ -326,6 +326,7 @@ declare namespace App {
|
|||||||
cancel: string;
|
cancel: string;
|
||||||
close: string;
|
close: string;
|
||||||
check: string;
|
check: string;
|
||||||
|
selectAll: string;
|
||||||
expandColumn: string;
|
expandColumn: string;
|
||||||
columnSetting: string;
|
columnSetting: string;
|
||||||
config: string;
|
config: string;
|
||||||
@@ -578,6 +579,11 @@ declare namespace App {
|
|||||||
};
|
};
|
||||||
datatable: {
|
datatable: {
|
||||||
itemCount: string;
|
itemCount: string;
|
||||||
|
fixed: {
|
||||||
|
left: string;
|
||||||
|
right: string;
|
||||||
|
unFixed: string;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
1
src/typings/naive-ui.d.ts
vendored
1
src/typings/naive-ui.d.ts
vendored
@@ -7,6 +7,7 @@ declare namespace NaiveUI {
|
|||||||
type DataTableSelectionColumn<T> = import('naive-ui').DataTableSelectionColumn<T>;
|
type DataTableSelectionColumn<T> = import('naive-ui').DataTableSelectionColumn<T>;
|
||||||
type TableColumnGroup<T> = import('naive-ui/es/data-table/src/interface').TableColumnGroup<T>;
|
type TableColumnGroup<T> = import('naive-ui/es/data-table/src/interface').TableColumnGroup<T>;
|
||||||
type TableColumnCheck = import('@sa/hooks').TableColumnCheck;
|
type TableColumnCheck = import('@sa/hooks').TableColumnCheck;
|
||||||
|
type TableColumnFixed = import('@sa/hooks').TableColumnCheck['fixed'];
|
||||||
|
|
||||||
type SetTableColumnKey<C, T> = Omit<C, 'key'> & { key: keyof T | (string & {}) };
|
type SetTableColumnKey<C, T> = Omit<C, 'key'> & { key: keyof T | (string & {}) };
|
||||||
|
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ const bgColor = computed(() => {
|
|||||||
<NCard :bordered="false" class="relative z-4 w-auto rd-12px">
|
<NCard :bordered="false" class="relative z-4 w-auto rd-12px">
|
||||||
<div class="w-400px lt-sm:w-300px">
|
<div class="w-400px lt-sm:w-300px">
|
||||||
<header class="flex-y-center justify-between">
|
<header class="flex-y-center justify-between">
|
||||||
<SystemLogo class="text-64px text-primary lt-sm:text-48px" />
|
<SystemLogo class="size-64px lt-sm:size-48px" />
|
||||||
<h3 class="text-28px text-primary font-500 lt-sm:text-22px">{{ $t('system.title') }}</h3>
|
<h3 class="text-28px text-primary font-500 lt-sm:text-22px">{{ $t('system.title') }}</h3>
|
||||||
<div class="i-flex-col">
|
<div class="i-flex-col">
|
||||||
<ThemeSchemaSwitch
|
<ThemeSchemaSwitch
|
||||||
|
|||||||
Reference in New Issue
Block a user