Compare commits
	
		
			18 Commits
		
	
	
		
			v1.3.1
			...
			tauri-v1.3
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | b6a15bbb22 | ||
|  | e6aa25e9f8 | ||
|  | 968370b1aa | ||
|  | cb1d44525d | ||
|  | 939c512f02 | ||
|  | 3f23993a83 | ||
|  | ebc838c3e0 | ||
|  | 5646a50ddf | ||
|  | 217a3bb259 | ||
|  | d37591dd7a | ||
|  | cf67d55cbf | ||
|  | 98b75c22c3 | ||
|  | 993e9caf79 | ||
|  | f26d0a61eb | ||
|  | eed617f9eb | ||
|  | ea8aa6c4e6 | ||
|  | 4dde4c22b1 | ||
|  | 59f07d8ac4 | 
							
								
								
									
										66
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						| @@ -1,6 +1,72 @@ | |||||||
| # Changelog | # Changelog | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ## [v1.3.4](https://github.com/honghuangdc/soybean-admin/compare/v1.3.3...v1.3.4) (2024-08-01) | ||||||
|  |  | ||||||
|  | ###    🚨 Breaking Changes | ||||||
|  |  | ||||||
|  | - **projects**: don't reset active menu of vertical-mix layout when it is mixSiderFixed  -  by @honghuangdc [<samp>(939c5)</samp>](https://github.com/honghuangdc/soybean-admin/commit/939c512) | ||||||
|  |  | ||||||
|  | ###    🛠 Optimizations | ||||||
|  |  | ||||||
|  | - **projects**: optimize code  -  by @honghuangdc [<samp>(cb1d4)</samp>](https://github.com/honghuangdc/soybean-admin/commit/cb1d445) | ||||||
|  |  | ||||||
|  | ###    🏡 Chore | ||||||
|  |  | ||||||
|  | - **projects**: update deps & fix vue-router type  -  by @honghuangdc [<samp>(96837)</samp>](https://github.com/honghuangdc/soybean-admin/commit/968370b) | ||||||
|  |  | ||||||
|  | ###    ❤️ Contributors | ||||||
|  |  | ||||||
|  | [](https://github.com/honghuangdc)   | ||||||
|  |  | ||||||
|  | ## [v1.3.3](https://github.com/honghuangdc/soybean-admin/compare/v1.3.2...v1.3.3) (2024-07-30) | ||||||
|  |  | ||||||
|  | ###    🐞 Bug Fixes | ||||||
|  |  | ||||||
|  | - **projects**: fix watermark settings  -  by @honghuangdc [<samp>(5646a)</samp>](https://github.com/honghuangdc/soybean-admin/commit/5646a50) | ||||||
|  |  | ||||||
|  | ###    📖 Documentation | ||||||
|  |  | ||||||
|  | - **projects**: update CHANGELOG  -  by @honghuangdc [<samp>(ebc83)</samp>](https://github.com/honghuangdc/soybean-admin/commit/ebc838c) | ||||||
|  |  | ||||||
|  | ###    ❤️ Contributors | ||||||
|  |  | ||||||
|  | [](https://github.com/honghuangdc)   | ||||||
|  |  | ||||||
|  | ## [v1.3.2](https://github.com/honghuangdc/soybean-admin/compare/v1.3.1...v1.3.2) (2024-07-30) | ||||||
|  |  | ||||||
|  | ###    🚀 Features | ||||||
|  |  | ||||||
|  | - **projects**: | ||||||
|  |   - add color fading mode.close #567  -  by @Azir-11 in https://github.com/honghuangdc/soybean-admin/issues/569 and https://github.com/honghuangdc/soybean-admin/issues/567 [<samp>(4dde4)</samp>](https://github.com/honghuangdc/soybean-admin/commit/4dde4c2) | ||||||
|  |   - add full screen watermark. close#571  -  by @paynezhuang in https://github.com/honghuangdc/soybean-admin/issues/573 and https://github.com/honghuangdc/soybean-admin/issues/571 [<samp>(ea8aa)</samp>](https://github.com/honghuangdc/soybean-admin/commit/ea8aa6c) | ||||||
|  |  | ||||||
|  | ###    🐞 Bug Fixes | ||||||
|  |  | ||||||
|  | - **projects**: fix vertical-mix menu selected  -  by @honghuangdc [<samp>(59f07)</samp>](https://github.com/honghuangdc/soybean-admin/commit/59f07d8) | ||||||
|  |  | ||||||
|  | ###    🛠 Optimizations | ||||||
|  |  | ||||||
|  | - **projects**: | ||||||
|  |   - add type WatermarkProps  -  by @honghuangdc [<samp>(f26d0)</samp>](https://github.com/honghuangdc/soybean-admin/commit/f26d0a6) | ||||||
|  |   - remove home NAlert closable  -  by @honghuangdc [<samp>(98b75)</samp>](https://github.com/honghuangdc/soybean-admin/commit/98b75c2) | ||||||
|  |   - optimize response code comparison  -  by @honghuangdc [<samp>(cf67d)</samp>](https://github.com/honghuangdc/soybean-admin/commit/cf67d55) | ||||||
|  | - **types**: | ||||||
|  |   - remove useless types.  -  by **Azir** [<samp>(eed61)</samp>](https://github.com/honghuangdc/soybean-admin/commit/eed617f) | ||||||
|  |  | ||||||
|  | ###    📖 Documentation | ||||||
|  |  | ||||||
|  | - **projects**: update CHANGELOG  -  by @honghuangdc [<samp>(d3759)</samp>](https://github.com/honghuangdc/soybean-admin/commit/d37591d) | ||||||
|  |  | ||||||
|  | ###    🏡 Chore | ||||||
|  |  | ||||||
|  | - **deps**: update deps  -  by @honghuangdc [<samp>(993e9)</samp>](https://github.com/honghuangdc/soybean-admin/commit/993e9ca) | ||||||
|  |  | ||||||
|  | ###    ❤️ Contributors | ||||||
|  |  | ||||||
|  | [](https://github.com/honghuangdc)  [](https://github.com/paynezhuang)  [](https://github.com/Azir-11)   | ||||||
|  | [Azir](mailto:2075125282@qq.com),  | ||||||
|  |  | ||||||
| ## [v1.3.1](https://github.com/honghuangdc/soybean-admin/compare/v1.3.0...v1.3.1) (2024-07-22) | ## [v1.3.1](https://github.com/honghuangdc/soybean-admin/compare/v1.3.0...v1.3.1) (2024-07-22) | ||||||
|  |  | ||||||
| ###    🐞 Bug Fixes | ###    🐞 Bug Fixes | ||||||
|   | |||||||
| @@ -1,5 +1,61 @@ | |||||||
| # 更新日志 | # 更新日志 | ||||||
|  |  | ||||||
|  | ## [v1.3.2](https://github.com/honghuangdc/soybean-admin/compare/v1.3.1...v1.3.2) (2024-07-30) | ||||||
|  |  | ||||||
|  | ###    🚀 新功能 | ||||||
|  |  | ||||||
|  | - **项目**: | ||||||
|  |   - 添加颜色渐变模式。关闭 #567  -  由 @Azir-11 在 https://github.com/honghuangdc/soybean-admin/issues/569 和 https://github.com/honghuangdc/soybean-admin/issues/567 [<samp>(4dde4)</samp>](https://github.com/honghuangdc/soybean-admin/commit/4dde4c2) | ||||||
|  |   - 添加全屏水印。关闭 #571  -  由 @paynezhuang 在 https://github.com/honghuangdc/soybean-admin/issues/573 和 https://github.com/honghuangdc/soybean-admin/issues/571 [<samp>(ea8aa)</samp>](https://github.com/honghuangdc/soybean-admin/commit/ea8aa6c) | ||||||
|  |  | ||||||
|  | ###    🐞 Bug 修复 | ||||||
|  |  | ||||||
|  | - **项目**: 修复 vertical-mix 菜单选中问题  -  由 @honghuangdc [<samp>(59f07)</samp>](https://github.com/honghuangdc/soybean-admin/commit/59f07d8) | ||||||
|  |  | ||||||
|  | ###    🛠 优化 | ||||||
|  |  | ||||||
|  | - **项目**: | ||||||
|  |   - 添加类型 WatermarkProps  -  由 @honghuangdc [<samp>(f26d0)</samp>](https://github.com/honghuangdc/soybean-admin/commit/f26d0a6) | ||||||
|  |   - 移除 home NAlert 可关闭  -  由 @honghuangdc [<samp>(98b75)</samp>](https://github.com/honghuangdc/soybean-admin/commit/98b75c2) | ||||||
|  |   - 优化响应代码比较  -  由 @honghuangdc [<samp>(cf67d)</samp>](https://github.com/honghuangdc/soybean-admin/commit/cf67d55) | ||||||
|  | - **类型**: | ||||||
|  |   - 移除无用类型。  -  由 **Azir** [<samp>(eed61)</samp>](https://github.com/honghuangdc/soybean-admin/commit/eed617f) | ||||||
|  |  | ||||||
|  | ###    📖 文档 | ||||||
|  |  | ||||||
|  | - **项目**: 更新更新日志  -  由 @honghuangdc [<samp>(d3759)</samp>](https://github.com/honghuangdc/soybean-admin/commit/d37591d) | ||||||
|  |  | ||||||
|  | ###    🏡 杂项 | ||||||
|  |  | ||||||
|  | - **依赖**: 更新依赖  -  由 @honghuangdc [<samp>(993e9)</samp>](https://github.com/honghuangdc/soybean-admin/commit/993e9ca) | ||||||
|  |  | ||||||
|  | ###    ❤️ 贡献者 | ||||||
|  |  | ||||||
|  | [](https://github.com/honghuangdc)  [](https://github.com/paynezhuang)  [](https://github.com/Azir-11)   | ||||||
|  | [Azir](mailto:2075125282@qq.com),  | ||||||
|  |  | ||||||
|  | ## [v1.3.1](https://github.com/honghuangdc/soybean-admin/compare/v1.3.0...v1.3.1) (2024-07-22) | ||||||
|  |  | ||||||
|  | ###    🐞 Bug 修复 | ||||||
|  |  | ||||||
|  | - **项目**: | ||||||
|  |   - 修复顶部菜单混合和反向模式下侧边栏宽度异常的问题  -  由 @Azir-11 在 https://github.com/honghuangdc/soybean-admin/issues/562 修复 [<samp>(c4695)</samp>](https://github.com/honghuangdc/soybean-admin/commit/c469512) | ||||||
|  |   - 修复水平混合菜单反转问题。修复 #563  -  由 @honghuangdc 在 https://github.com/honghuangdc/soybean-admin/issues/563 修复 [<samp>(4e55b)</samp>](https://github.com/honghuangdc/soybean-admin/commit/4e55b0e) | ||||||
|  |   - 修复当布局来自移动端时垂直菜单不渲染的问题  -  由 @honghuangdc 修复 [<samp>(84027)</samp>](https://github.com/honghuangdc/soybean-admin/commit/8402734) | ||||||
|  |  | ||||||
|  | ###    📖 文档 | ||||||
|  |  | ||||||
|  | - **项目**: 更新更新日志  -  由 @honghuangdc 更新 [<samp>(613c8)</samp>](https://github.com/honghuangdc/soybean-admin/commit/613c836) | ||||||
|  |  | ||||||
|  | ###    🎨 样式 | ||||||
|  |  | ||||||
|  | - **其他**: 修改灰度模式的中文名称  -  由 **Azir** 修改 [<samp>(53770)</samp>](https://github.com/honghuangdc/soybean-admin/commit/5377002) | ||||||
|  |  | ||||||
|  | ###    ❤️ 贡献者 | ||||||
|  |  | ||||||
|  | [](https://github.com/honghuangdc)  [](https://github.com/Azir-11)   | ||||||
|  | [Azir](mailto:2075125282@qq.com),  | ||||||
|  |  | ||||||
|  |  | ||||||
| ## [v1.3.0](https://github.com/soybeanjs/soybean-admin/compare/v1.2.8...v1.3.0) (2024-07-22) | ## [v1.3.0](https://github.com/soybeanjs/soybean-admin/compare/v1.2.8...v1.3.0) (2024-07-22) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| import { defineConfig } from '@soybeanjs/eslint-config'; | import { defineConfig } from '@soybeanjs/eslint-config'; | ||||||
|  |  | ||||||
| export default defineConfig( | export default defineConfig( | ||||||
|   { vue: true, unocss: true }, |   { vue: true, unocss: true, ignores: ['src-tauri/target'] }, | ||||||
|   { |   { | ||||||
|     rules: { |     rules: { | ||||||
|       'vue/multi-word-component-names': [ |       'vue/multi-word-component-names': [ | ||||||
|   | |||||||
							
								
								
									
										48
									
								
								package.json
									
									
									
									
									
								
							
							
						
						| @@ -1,7 +1,7 @@ | |||||||
| { | { | ||||||
|   "name": "soybean-admin", |   "name": "soybean-admin", | ||||||
|   "type": "module", |   "type": "module", | ||||||
|   "version": "1.3.1", |   "version": "1.3.4", | ||||||
|   "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", | ||||||
| @@ -32,17 +32,20 @@ | |||||||
|   }, |   }, | ||||||
|   "scripts": { |   "scripts": { | ||||||
|     "build": "vite build --mode prod", |     "build": "vite build --mode prod", | ||||||
|  |     "build:tauri": "pnpm tauri build", | ||||||
|     "build:test": "vite build --mode test", |     "build:test": "vite build --mode test", | ||||||
|     "cleanup": "sa cleanup", |     "cleanup": "sa cleanup", | ||||||
|     "commit": "sa git-commit", |     "commit": "sa git-commit", | ||||||
|     "czh": "sa git-commit -l=zh-cn", |     "czh": "sa git-commit -l=zh-cn", | ||||||
|     "dev": "vite --mode test", |     "dev": "vite --mode test", | ||||||
|     "dev:prod": "vite --mode prod", |     "dev:prod": "vite --mode prod", | ||||||
|  |     "dev:tauri": "pnpm tauri dev", | ||||||
|     "gen-route": "sa gen-route", |     "gen-route": "sa gen-route", | ||||||
|     "lint": "eslint . --fix", |     "lint": "eslint . --fix", | ||||||
|     "prepare": "simple-git-hooks", |     "prepare": "simple-git-hooks", | ||||||
|     "preview": "vite preview", |     "preview": "vite preview", | ||||||
|     "release": "sa release", |     "release": "sa release", | ||||||
|  |     "tauri-icon": "pnpm tauri icon ./public/logo.png", | ||||||
|     "typecheck": "vue-tsc --noEmit --skipLibCheck", |     "typecheck": "vue-tsc --noEmit --skipLibCheck", | ||||||
|     "update-pkg": "sa update-pkg" |     "update-pkg": "sa update-pkg" | ||||||
|   }, |   }, | ||||||
| @@ -60,44 +63,45 @@ | |||||||
|     "echarts": "5.5.1", |     "echarts": "5.5.1", | ||||||
|     "naive-ui": "2.39.0", |     "naive-ui": "2.39.0", | ||||||
|     "nprogress": "0.2.0", |     "nprogress": "0.2.0", | ||||||
|     "pinia": "2.1.7", |     "pinia": "2.2.0", | ||||||
|     "tailwind-merge": "2.4.0", |     "tailwind-merge": "2.4.0", | ||||||
|     "vue": "3.4.33", |     "vue": "3.4.35", | ||||||
|     "vue-draggable-plus": "0.5.2", |     "vue-draggable-plus": "0.5.2", | ||||||
|     "vue-i18n": "9.13.1", |     "vue-i18n": "9.13.1", | ||||||
|     "vue-router": "4.4.0" |     "vue-router": "4.4.1" | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|     "@elegant-router/vue": "0.3.7", |     "@elegant-router/vue": "0.3.8", | ||||||
|     "@iconify/json": "2.2.230", |     "@iconify/json": "2.2.232", | ||||||
|     "@sa/scripts": "workspace:*", |     "@sa/scripts": "workspace:*", | ||||||
|     "@sa/uno-preset": "workspace:*", |     "@sa/uno-preset": "workspace:*", | ||||||
|     "@soybeanjs/eslint-config": "1.3.7", |     "@soybeanjs/eslint-config": "1.4.0", | ||||||
|     "@types/node": "20.14.11", |     "@tauri-apps/cli": "1.6.0", | ||||||
|  |     "@types/node": "22.0.1", | ||||||
|     "@types/nprogress": "0.2.3", |     "@types/nprogress": "0.2.3", | ||||||
|     "@unocss/eslint-config": "0.61.5", |     "@unocss/eslint-config": "0.61.9", | ||||||
|     "@unocss/preset-icons": "0.61.5", |     "@unocss/preset-icons": "0.61.9", | ||||||
|     "@unocss/preset-uno": "0.61.5", |     "@unocss/preset-uno": "0.61.9", | ||||||
|     "@unocss/transformer-directives": "0.61.5", |     "@unocss/transformer-directives": "0.61.9", | ||||||
|     "@unocss/transformer-variant-group": "0.61.5", |     "@unocss/transformer-variant-group": "0.61.9", | ||||||
|     "@unocss/vite": "0.61.5", |     "@unocss/vite": "0.61.9", | ||||||
|     "@vitejs/plugin-vue": "5.0.5", |     "@vitejs/plugin-vue": "5.1.1", | ||||||
|     "@vitejs/plugin-vue-jsx": "4.0.0", |     "@vitejs/plugin-vue-jsx": "4.0.0", | ||||||
|     "eslint": "9.7.0", |     "eslint": "9.8.0", | ||||||
|     "eslint-plugin-vue": "9.27.0", |     "eslint-plugin-vue": "9.27.0", | ||||||
|     "lint-staged": "15.2.7", |     "lint-staged": "15.2.7", | ||||||
|     "sass": "1.77.8", |     "sass": "1.77.8", | ||||||
|     "simple-git-hooks": "2.11.1", |     "simple-git-hooks": "2.11.1", | ||||||
|     "tsx": "4.16.2", |     "tsx": "4.16.3", | ||||||
|     "typescript": "5.5.3", |     "typescript": "5.5.4", | ||||||
|     "unplugin-icons": "0.19.0", |     "unplugin-icons": "0.19.1", | ||||||
|     "unplugin-vue-components": "0.27.3", |     "unplugin-vue-components": "0.27.3", | ||||||
|     "vite": "5.3.4", |     "vite": "5.3.5", | ||||||
|     "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.3.6", |     "vite-plugin-vue-devtools": "7.3.7", | ||||||
|     "vue-eslint-parser": "9.4.3", |     "vue-eslint-parser": "9.4.3", | ||||||
|     "vue-tsc": "2.0.26" |     "vue-tsc": "2.0.29" | ||||||
|   }, |   }, | ||||||
|   "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/axios", |   "name": "@sa/axios", | ||||||
|   "version": "1.3.1", |   "version": "1.3.4", | ||||||
|   "exports": { |   "exports": { | ||||||
|     ".": "./src/index.ts" |     ".": "./src/index.ts" | ||||||
|   }, |   }, | ||||||
| @@ -12,7 +12,7 @@ | |||||||
|   "dependencies": { |   "dependencies": { | ||||||
|     "@sa/utils": "workspace:*", |     "@sa/utils": "workspace:*", | ||||||
|     "axios": "1.7.2", |     "axios": "1.7.2", | ||||||
|     "axios-retry": "4.4.1", |     "axios-retry": "4.4.2", | ||||||
|     "qs": "6.12.3" |     "qs": "6.12.3" | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|   "name": "@sa/color", |   "name": "@sa/color", | ||||||
|   "version": "1.3.1", |   "version": "1.3.4", | ||||||
|   "exports": { |   "exports": { | ||||||
|     ".": "./src/index.ts" |     ".": "./src/index.ts" | ||||||
|   }, |   }, | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|   "name": "@sa/hooks", |   "name": "@sa/hooks", | ||||||
|   "version": "1.3.1", |   "version": "1.3.4", | ||||||
|   "exports": { |   "exports": { | ||||||
|     ".": "./src/index.ts" |     ".": "./src/index.ts" | ||||||
|   }, |   }, | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|   "name": "@sa/materials", |   "name": "@sa/materials", | ||||||
|   "version": "1.3.1", |   "version": "1.3.4", | ||||||
|   "exports": { |   "exports": { | ||||||
|     ".": "./src/index.ts" |     ".": "./src/index.ts" | ||||||
|   }, |   }, | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|   "name": "@sa/fetch", |   "name": "@sa/fetch", | ||||||
|   "version": "1.3.1", |   "version": "1.3.4", | ||||||
|   "exports": { |   "exports": { | ||||||
|     ".": "./src/index.ts" |     ".": "./src/index.ts" | ||||||
|   }, |   }, | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|   "name": "@sa/scripts", |   "name": "@sa/scripts", | ||||||
|   "version": "1.3.1", |   "version": "1.3.4", | ||||||
|   "bin": { |   "bin": { | ||||||
|     "sa": "./bin.ts" |     "sa": "./bin.ts" | ||||||
|   }, |   }, | ||||||
| @@ -21,7 +21,7 @@ | |||||||
|     "enquirer": "2.4.1", |     "enquirer": "2.4.1", | ||||||
|     "execa": "9.3.0", |     "execa": "9.3.0", | ||||||
|     "kolorist": "1.8.0", |     "kolorist": "1.8.0", | ||||||
|     "npm-check-updates": "16.14.20", |     "npm-check-updates": "17.0.0", | ||||||
|     "rimraf": "6.0.1" |     "rimraf": "6.0.1" | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|   "name": "@sa/uno-preset", |   "name": "@sa/uno-preset", | ||||||
|   "version": "1.3.1", |   "version": "1.3.4", | ||||||
|   "exports": { |   "exports": { | ||||||
|     ".": "./src/index.ts" |     ".": "./src/index.ts" | ||||||
|   }, |   }, | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|   "name": "@sa/utils", |   "name": "@sa/utils", | ||||||
|   "version": "1.3.1", |   "version": "1.3.4", | ||||||
|   "exports": { |   "exports": { | ||||||
|     ".": "./src/index.ts" |     ".": "./src/index.ts" | ||||||
|   }, |   }, | ||||||
|   | |||||||
							
								
								
									
										4007
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								public/logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 20 KiB | 
							
								
								
									
										3
									
								
								src-tauri/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,3 @@ | |||||||
|  | # Generated by Cargo | ||||||
|  | # will have compiled files and executables | ||||||
|  | /target/ | ||||||
							
								
								
									
										3664
									
								
								src-tauri/Cargo.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										26
									
								
								src-tauri/Cargo.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,26 @@ | |||||||
|  | [package] | ||||||
|  | name = "app" | ||||||
|  | version = "0.1.0" | ||||||
|  | description = "A Tauri App" | ||||||
|  | authors = ["you"] | ||||||
|  | license = "" | ||||||
|  | repository = "" | ||||||
|  | default-run = "app" | ||||||
|  | edition = "2021" | ||||||
|  | rust-version = "1.60" | ||||||
|  |  | ||||||
|  | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html | ||||||
|  |  | ||||||
|  | [build-dependencies] | ||||||
|  | tauri-build = { version = "1.5.1", features = [] } | ||||||
|  |  | ||||||
|  | [dependencies] | ||||||
|  | serde_json = "1.0" | ||||||
|  | serde = { version = "1.0", features = ["derive"] } | ||||||
|  | tauri = { version = "1.6.1", features = [] } | ||||||
|  |  | ||||||
|  | [features] | ||||||
|  | # this feature is used for production builds or when `devPath` points to the filesystem and the built-in dev server is disabled. | ||||||
|  | # If you use cargo directly instead of tauri's cli you can use this feature flag to switch between tauri's `dev` and `build` modes. | ||||||
|  | # DO NOT REMOVE!! | ||||||
|  | custom-protocol = [ "tauri/custom-protocol" ] | ||||||
							
								
								
									
										3
									
								
								src-tauri/build.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,3 @@ | |||||||
|  | fn main() { | ||||||
|  |   tauri_build::build() | ||||||
|  | } | ||||||
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/128x128.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 8.8 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/128x128@2x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 19 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/32x32.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/Square107x107Logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 7.4 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/Square142x142Logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 9.9 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/Square150x150Logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 10 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/Square284x284Logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 21 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/Square30x30Logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.6 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/Square310x310Logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 23 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/Square44x44Logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.6 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/Square71x71Logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 4.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/Square89x89Logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 6.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/StoreLogo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.0 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/icon.icns
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/icon.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 31 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src-tauri/icons/icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 39 KiB | 
							
								
								
									
										8
									
								
								src-tauri/src/main.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,8 @@ | |||||||
|  | // Prevents additional console window on Windows in release, DO NOT REMOVE!! | ||||||
|  | #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] | ||||||
|  |  | ||||||
|  | fn main() { | ||||||
|  |   tauri::Builder::default() | ||||||
|  |     .run(tauri::generate_context!()) | ||||||
|  |     .expect("error while running tauri application"); | ||||||
|  | } | ||||||
							
								
								
									
										60
									
								
								src-tauri/tauri.conf.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,60 @@ | |||||||
|  | { | ||||||
|  |   "$schema": "../node_modules/@tauri-apps/cli/schema.json", | ||||||
|  |   "build": { | ||||||
|  |     "beforeBuildCommand": "npm run build", | ||||||
|  |     "beforeDevCommand": "npm run dev", | ||||||
|  |     "devPath": "http://localhost:9527", | ||||||
|  |     "distDir": "../dist" | ||||||
|  |   }, | ||||||
|  |   "package": { | ||||||
|  |     "productName": "soybean-admin", | ||||||
|  |     "version": "1.0.0" | ||||||
|  |   }, | ||||||
|  |   "tauri": { | ||||||
|  |     "allowlist": { | ||||||
|  |       "all": false | ||||||
|  |     }, | ||||||
|  |     "bundle": { | ||||||
|  |       "active": true, | ||||||
|  |       "category": "DeveloperTool", | ||||||
|  |       "copyright": "", | ||||||
|  |       "deb": { | ||||||
|  |         "depends": [] | ||||||
|  |       }, | ||||||
|  |       "externalBin": [], | ||||||
|  |       "icon": ["icons/32x32.png", "icons/128x128.png", "icons/128x128@2x.png", "icons/icon.icns", "icons/icon.ico"], | ||||||
|  |       "identifier": "cn.soybeanjs.admin", | ||||||
|  |       "longDescription": "", | ||||||
|  |       "macOS": { | ||||||
|  |         "entitlements": null, | ||||||
|  |         "exceptionDomain": "", | ||||||
|  |         "frameworks": [], | ||||||
|  |         "providerShortName": null, | ||||||
|  |         "signingIdentity": null | ||||||
|  |       }, | ||||||
|  |       "resources": [], | ||||||
|  |       "shortDescription": "", | ||||||
|  |       "targets": "all", | ||||||
|  |       "windows": { | ||||||
|  |         "certificateThumbprint": null, | ||||||
|  |         "digestAlgorithm": "sha256", | ||||||
|  |         "timestampUrl": "" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "security": { | ||||||
|  |       "csp": null | ||||||
|  |     }, | ||||||
|  |     "updater": { | ||||||
|  |       "active": false | ||||||
|  |     }, | ||||||
|  |     "windows": [ | ||||||
|  |       { | ||||||
|  |         "fullscreen": false, | ||||||
|  |         "height": 768, | ||||||
|  |         "resizable": true, | ||||||
|  |         "title": "SoybeanAdmin", | ||||||
|  |         "width": 1366 | ||||||
|  |       } | ||||||
|  |     ] | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										18
									
								
								src/App.vue
									
									
									
									
									
								
							
							
						
						| @@ -1,6 +1,7 @@ | |||||||
| <script setup lang="ts"> | <script setup lang="ts"> | ||||||
| import { computed } from 'vue'; | import { computed } from 'vue'; | ||||||
| import { NConfigProvider, darkTheme } from 'naive-ui'; | import { NConfigProvider, darkTheme } from 'naive-ui'; | ||||||
|  | import type { WatermarkProps } from 'naive-ui'; | ||||||
| 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 { naiveDateLocales, naiveLocales } from './locales/naive'; | import { naiveDateLocales, naiveLocales } from './locales/naive'; | ||||||
| @@ -21,6 +22,22 @@ const naiveLocale = computed(() => { | |||||||
| const naiveDateLocale = computed(() => { | const naiveDateLocale = computed(() => { | ||||||
|   return naiveDateLocales[appStore.locale]; |   return naiveDateLocales[appStore.locale]; | ||||||
| }); | }); | ||||||
|  |  | ||||||
|  | const watermarkProps = computed<WatermarkProps>(() => { | ||||||
|  |   return { | ||||||
|  |     content: themeStore.watermark?.text || 'SoybeanAdmin', | ||||||
|  |     cross: true, | ||||||
|  |     fullscreen: true, | ||||||
|  |     fontSize: 16, | ||||||
|  |     lineHeight: 16, | ||||||
|  |     width: 384, | ||||||
|  |     height: 384, | ||||||
|  |     xOffset: 12, | ||||||
|  |     yOffset: 60, | ||||||
|  |     rotate: -15, | ||||||
|  |     zIndex: 9999 | ||||||
|  |   }; | ||||||
|  | }); | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
| <template> | <template> | ||||||
| @@ -33,6 +50,7 @@ const naiveDateLocale = computed(() => { | |||||||
|   > |   > | ||||||
|     <AppProvider> |     <AppProvider> | ||||||
|       <RouterView class="bg-layout" /> |       <RouterView class="bg-layout" /> | ||||||
|  |       <NWatermark v-if="themeStore.watermark?.visible" v-bind="watermarkProps" /> | ||||||
|     </AppProvider> |     </AppProvider> | ||||||
|   </NConfigProvider> |   </NConfigProvider> | ||||||
| </template> | </template> | ||||||
|   | |||||||
| @@ -56,9 +56,7 @@ function handleSelectMixMenu(menu: App.Global.Menu) { | |||||||
|       :theme-color="themeStore.themeColor" |       :theme-color="themeStore.themeColor" | ||||||
|       @select="handleSelectMixMenu" |       @select="handleSelectMixMenu" | ||||||
|       @toggle-sider-collapse="appStore.toggleSiderCollapse" |       @toggle-sider-collapse="appStore.toggleSiderCollapse" | ||||||
|     > |     /> | ||||||
|       <slot></slot> |  | ||||||
|     </FirstLevelMenu> |  | ||||||
|   </Teleport> |   </Teleport> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
|   | |||||||
| @@ -49,8 +49,11 @@ function handleSelectMixMenu(menu: App.Global.Menu) { | |||||||
| } | } | ||||||
|  |  | ||||||
| function handleResetActiveMenu() { | function handleResetActiveMenu() { | ||||||
|   getActiveFirstLevelMenuKey(); |  | ||||||
|   setDrawerVisible(false); |   setDrawerVisible(false); | ||||||
|  |  | ||||||
|  |   if (!appStore.mixSiderFixed) { | ||||||
|  |     getActiveFirstLevelMenuKey(); | ||||||
|  |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| const selectedKey = computed(() => { | const selectedKey = computed(() => { | ||||||
| @@ -117,6 +120,7 @@ watch( | |||||||
|             <NMenu |             <NMenu | ||||||
|               v-model:expanded-keys="expandedKeys" |               v-model:expanded-keys="expandedKeys" | ||||||
|               mode="vertical" |               mode="vertical" | ||||||
|  |               :value="selectedKey" | ||||||
|               :options="childLevelMenus" |               :options="childLevelMenus" | ||||||
|               :collapsed="appStore.siderCollapse" |               :collapsed="appStore.siderCollapse" | ||||||
|               :collapsed-width="themeStore.sider.collapsedWidth" |               :collapsed-width="themeStore.sider.collapsedWidth" | ||||||
|   | |||||||
| @@ -25,6 +25,10 @@ function handleGrayscaleChange(value: boolean) { | |||||||
|   themeStore.setGrayscale(value); |   themeStore.setGrayscale(value); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | function handleColourWeaknessChange(value: boolean) { | ||||||
|  |   themeStore.setColourWeakness(value); | ||||||
|  | } | ||||||
|  |  | ||||||
| const showSiderInverted = computed(() => !themeStore.darkMode && themeStore.layout.mode.includes('vertical')); | const showSiderInverted = computed(() => !themeStore.darkMode && themeStore.layout.mode.includes('vertical')); | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
| @@ -53,6 +57,9 @@ const showSiderInverted = computed(() => !themeStore.darkMode && themeStore.layo | |||||||
|     <SettingItem :label="$t('theme.grayscale')"> |     <SettingItem :label="$t('theme.grayscale')"> | ||||||
|       <NSwitch :value="themeStore.grayscale" @update:value="handleGrayscaleChange" /> |       <NSwitch :value="themeStore.grayscale" @update:value="handleGrayscaleChange" /> | ||||||
|     </SettingItem> |     </SettingItem> | ||||||
|  |     <SettingItem :label="$t('theme.colourWeakness')"> | ||||||
|  |       <NSwitch :value="themeStore.colourWeakness" @update:value="handleColourWeaknessChange" /> | ||||||
|  |     </SettingItem> | ||||||
|   </div> |   </div> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
|   | |||||||
| @@ -101,6 +101,19 @@ 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')"> | ||||||
|  |       <NSwitch v-model:value="themeStore.watermark.visible" /> | ||||||
|  |     </SettingItem> | ||||||
|  |     <SettingItem v-if="themeStore.watermark?.visible" key="8-1" :label="$t('theme.watermark.text')"> | ||||||
|  |       <NInput | ||||||
|  |         v-model:value="themeStore.watermark.text" | ||||||
|  |         autosize | ||||||
|  |         type="text" | ||||||
|  |         size="small" | ||||||
|  |         class="w-120px" | ||||||
|  |         placeholder="SoybeanAdmin" | ||||||
|  |       /> | ||||||
|  |     </SettingItem> | ||||||
|   </TransitionGroup> |   </TransitionGroup> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
|   | |||||||
| @@ -65,6 +65,7 @@ const local: App.I18n.Schema = { | |||||||
|       auto: 'Follow System' |       auto: 'Follow System' | ||||||
|     }, |     }, | ||||||
|     grayscale: 'Grayscale', |     grayscale: 'Grayscale', | ||||||
|  |     colourWeakness: 'Colour Weakness', | ||||||
|     layoutMode: { |     layoutMode: { | ||||||
|       title: 'Layout Mode', |       title: 'Layout Mode', | ||||||
|       vertical: 'Vertical Menu Mode', |       vertical: 'Vertical Menu Mode', | ||||||
| @@ -134,6 +135,10 @@ const local: App.I18n.Schema = { | |||||||
|       height: 'Footer Height', |       height: 'Footer Height', | ||||||
|       right: 'Right Footer' |       right: 'Right Footer' | ||||||
|     }, |     }, | ||||||
|  |     watermark: { | ||||||
|  |       visible: 'Watermark Full Screen Visible', | ||||||
|  |       text: 'Watermark Text' | ||||||
|  |     }, | ||||||
|     themeDrawerTitle: 'Theme Configuration', |     themeDrawerTitle: 'Theme Configuration', | ||||||
|     pageFunTitle: 'Page Function', |     pageFunTitle: 'Page Function', | ||||||
|     configOperation: { |     configOperation: { | ||||||
|   | |||||||
| @@ -65,6 +65,7 @@ const local: App.I18n.Schema = { | |||||||
|       auto: '跟随系统' |       auto: '跟随系统' | ||||||
|     }, |     }, | ||||||
|     grayscale: '灰色模式', |     grayscale: '灰色模式', | ||||||
|  |     colourWeakness: '色弱模式', | ||||||
|     layoutMode: { |     layoutMode: { | ||||||
|       title: '布局模式', |       title: '布局模式', | ||||||
|       vertical: '左侧菜单模式', |       vertical: '左侧菜单模式', | ||||||
| @@ -134,6 +135,10 @@ const local: App.I18n.Schema = { | |||||||
|       height: '底部高度', |       height: '底部高度', | ||||||
|       right: '底部局右' |       right: '底部局右' | ||||||
|     }, |     }, | ||||||
|  |     watermark: { | ||||||
|  |       visible: '显示全屏水印', | ||||||
|  |       text: '水印文本' | ||||||
|  |     }, | ||||||
|     themeDrawerTitle: '主题配置', |     themeDrawerTitle: '主题配置', | ||||||
|     pageFunTitle: '页面功能', |     pageFunTitle: '页面功能', | ||||||
|     configOperation: { |     configOperation: { | ||||||
|   | |||||||
| @@ -101,6 +101,9 @@ function transformElegantRouteToVueRoute( | |||||||
|         const singleLevelRoute: RouteRecordRaw = { |         const singleLevelRoute: RouteRecordRaw = { | ||||||
|           path, |           path, | ||||||
|           component: layouts[layout], |           component: layouts[layout], | ||||||
|  |           meta: { | ||||||
|  |             title: route.meta?.title || '' | ||||||
|  |           }, | ||||||
|           children: [ |           children: [ | ||||||
|             { |             { | ||||||
|               name, |               name, | ||||||
| @@ -132,7 +135,6 @@ function transformElegantRouteToVueRoute( | |||||||
|     return []; |     return []; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|    |  | ||||||
|   // add redirect to child |   // add redirect to child | ||||||
|   if (children?.length && !vueRoute.redirect) { |   if (children?.length && !vueRoute.redirect) { | ||||||
|     vueRoute.redirect = { |     vueRoute.redirect = { | ||||||
|   | |||||||
| @@ -35,6 +35,7 @@ export const request = createFlatRequest<App.Service.Response, RequestInstanceSt | |||||||
|     }, |     }, | ||||||
|     async onBackendFail(response, instance) { |     async onBackendFail(response, instance) { | ||||||
|       const authStore = useAuthStore(); |       const authStore = useAuthStore(); | ||||||
|  |       const responseCode = String(response.data.code); | ||||||
|  |  | ||||||
|       function handleLogout() { |       function handleLogout() { | ||||||
|         authStore.resetStore(); |         authStore.resetStore(); | ||||||
| @@ -49,14 +50,14 @@ export const request = createFlatRequest<App.Service.Response, RequestInstanceSt | |||||||
|  |  | ||||||
|       // when the backend response code is in `logoutCodes`, it means the user will be logged out and redirected to login page |       // when the backend response code is in `logoutCodes`, it means the user will be logged out and redirected to login page | ||||||
|       const logoutCodes = import.meta.env.VITE_SERVICE_LOGOUT_CODES?.split(',') || []; |       const logoutCodes = import.meta.env.VITE_SERVICE_LOGOUT_CODES?.split(',') || []; | ||||||
|       if (logoutCodes.includes(response.data.code)) { |       if (logoutCodes.includes(responseCode)) { | ||||||
|         handleLogout(); |         handleLogout(); | ||||||
|         return null; |         return null; | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       // when the backend response code is in `modalLogoutCodes`, it means the user will be logged out by displaying a modal |       // when the backend response code is in `modalLogoutCodes`, it means the user will be logged out by displaying a modal | ||||||
|       const modalLogoutCodes = import.meta.env.VITE_SERVICE_MODAL_LOGOUT_CODES?.split(',') || []; |       const modalLogoutCodes = import.meta.env.VITE_SERVICE_MODAL_LOGOUT_CODES?.split(',') || []; | ||||||
|       if (modalLogoutCodes.includes(response.data.code) && !request.state.errMsgStack?.includes(response.data.msg)) { |       if (modalLogoutCodes.includes(responseCode) && !request.state.errMsgStack?.includes(response.data.msg)) { | ||||||
|         request.state.errMsgStack = [...(request.state.errMsgStack || []), response.data.msg]; |         request.state.errMsgStack = [...(request.state.errMsgStack || []), response.data.msg]; | ||||||
|  |  | ||||||
|         // prevent the user from refreshing the page |         // prevent the user from refreshing the page | ||||||
| @@ -82,7 +83,7 @@ export const request = createFlatRequest<App.Service.Response, RequestInstanceSt | |||||||
|       // when the backend response code is in `expiredTokenCodes`, it means the token is expired, and refresh token |       // when the backend response code is in `expiredTokenCodes`, it means the token is expired, and refresh token | ||||||
|       // the api `refreshToken` can not return error code in `expiredTokenCodes`, otherwise it will be a dead loop, should return `logoutCodes` or `modalLogoutCodes` |       // the api `refreshToken` can not return error code in `expiredTokenCodes`, otherwise it will be a dead loop, should return `logoutCodes` or `modalLogoutCodes` | ||||||
|       const expiredTokenCodes = import.meta.env.VITE_SERVICE_EXPIRED_TOKEN_CODES?.split(',') || []; |       const expiredTokenCodes = import.meta.env.VITE_SERVICE_EXPIRED_TOKEN_CODES?.split(',') || []; | ||||||
|       if (expiredTokenCodes.includes(response.data.code) && !request.state.isRefreshingToken) { |       if (expiredTokenCodes.includes(responseCode) && !request.state.isRefreshingToken) { | ||||||
|         request.state.isRefreshingToken = true; |         request.state.isRefreshingToken = true; | ||||||
|  |  | ||||||
|         const refreshConfig = await handleRefreshToken(response.config); |         const refreshConfig = await handleRefreshToken(response.config); | ||||||
| @@ -108,7 +109,7 @@ export const request = createFlatRequest<App.Service.Response, RequestInstanceSt | |||||||
|       // get backend error message and code |       // get backend error message and code | ||||||
|       if (error.code === BACKEND_ERROR_CODE) { |       if (error.code === BACKEND_ERROR_CODE) { | ||||||
|         message = error.response?.data?.msg || message; |         message = error.response?.data?.msg || message; | ||||||
|         backendErrorCode = error.response?.data?.code || ''; |         backendErrorCode = String(error.response?.data?.code || ''); | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       // the error message is displayed in the modal |       // the error message is displayed in the modal | ||||||
|   | |||||||
| @@ -10,8 +10,8 @@ import { | |||||||
|   createThemeToken, |   createThemeToken, | ||||||
|   getNaiveTheme, |   getNaiveTheme, | ||||||
|   initThemeSettings, |   initThemeSettings, | ||||||
|   toggleCssDarkMode, |   toggleAuxiliaryColorModes, | ||||||
|   toggleGrayscaleMode |   toggleCssDarkMode | ||||||
| } from './shared'; | } from './shared'; | ||||||
|  |  | ||||||
| /** Theme store */ | /** Theme store */ | ||||||
| @@ -33,6 +33,9 @@ export const useThemeStore = defineStore(SetupStoreId.Theme, () => { | |||||||
|   /** grayscale mode */ |   /** grayscale mode */ | ||||||
|   const grayscaleMode = computed(() => settings.value.grayscale); |   const grayscaleMode = computed(() => settings.value.grayscale); | ||||||
|  |  | ||||||
|  |   /** colourWeakness mode */ | ||||||
|  |   const colourWeaknessMode = computed(() => settings.value.colourWeakness); | ||||||
|  |  | ||||||
|   /** Theme colors */ |   /** Theme colors */ | ||||||
|   const themeColors = computed(() => { |   const themeColors = computed(() => { | ||||||
|     const { themeColor, otherColor, isInfoFollowPrimary } = settings.value; |     const { themeColor, otherColor, isInfoFollowPrimary } = settings.value; | ||||||
| @@ -79,6 +82,15 @@ export const useThemeStore = defineStore(SetupStoreId.Theme, () => { | |||||||
|     settings.value.grayscale = isGrayscale; |     settings.value.grayscale = isGrayscale; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * Set colourWeakness value | ||||||
|  |    * | ||||||
|  |    * @param isColourWeakness | ||||||
|  |    */ | ||||||
|  |   function setColourWeakness(isColourWeakness: boolean) { | ||||||
|  |     settings.value.colourWeakness = isColourWeakness; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   /** Toggle theme scheme */ |   /** Toggle theme scheme */ | ||||||
|   function toggleThemeScheme() { |   function toggleThemeScheme() { | ||||||
|     const themeSchemes: UnionKey.ThemeScheme[] = ['light', 'dark', 'auto']; |     const themeSchemes: UnionKey.ThemeScheme[] = ['light', 'dark', 'auto']; | ||||||
| @@ -167,9 +179,9 @@ export const useThemeStore = defineStore(SetupStoreId.Theme, () => { | |||||||
|     ); |     ); | ||||||
|  |  | ||||||
|     watch( |     watch( | ||||||
|       grayscaleMode, |       [grayscaleMode, colourWeaknessMode], | ||||||
|       val => { |       val => { | ||||||
|         toggleGrayscaleMode(val); |         toggleAuxiliaryColorModes(val[0], val[1]); | ||||||
|       }, |       }, | ||||||
|       { immediate: true } |       { immediate: true } | ||||||
|     ); |     ); | ||||||
| @@ -197,6 +209,7 @@ export const useThemeStore = defineStore(SetupStoreId.Theme, () => { | |||||||
|     naiveTheme, |     naiveTheme, | ||||||
|     settingsJson, |     settingsJson, | ||||||
|     setGrayscale, |     setGrayscale, | ||||||
|  |     setColourWeakness, | ||||||
|     resetStore, |     resetStore, | ||||||
|     setThemeScheme, |     setThemeScheme, | ||||||
|     toggleThemeScheme, |     toggleThemeScheme, | ||||||
|   | |||||||
| @@ -180,20 +180,16 @@ export function toggleCssDarkMode(darkMode = false) { | |||||||
| } | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Toggle grayscale mode |  * Toggle auxiliary color modes | ||||||
|  * |  * | ||||||
|  * @param grayscaleMode Is grayscale mode |  * @param grayscaleMode | ||||||
|  |  * @param colourWeakness | ||||||
|  */ |  */ | ||||||
| export function toggleGrayscaleMode(grayscaleMode = false) { | export function toggleAuxiliaryColorModes(grayscaleMode = false, colourWeakness = false) { | ||||||
|   const GRAYSCALE_CLASS = 'grayscale'; |   const htmlElement = document.documentElement; | ||||||
|  |   htmlElement.style.filter = [grayscaleMode ? 'grayscale(100%)' : '', colourWeakness ? 'invert(80%)' : ''] | ||||||
|   const { add, remove } = toggleHtmlClass(GRAYSCALE_CLASS); |     .filter(Boolean) | ||||||
|  |     .join(' '); | ||||||
|   if (grayscaleMode) { |  | ||||||
|     add(); |  | ||||||
|   } else { |  | ||||||
|     remove(); |  | ||||||
|   } |  | ||||||
| } | } | ||||||
|  |  | ||||||
| type NaiveColorScene = '' | 'Suppl' | 'Hover' | 'Pressed' | 'Active'; | type NaiveColorScene = '' | 'Suppl' | 'Hover' | 'Pressed' | 'Active'; | ||||||
|   | |||||||
| @@ -11,7 +11,3 @@ body, | |||||||
| html { | html { | ||||||
|   overflow-x: hidden; |   overflow-x: hidden; | ||||||
| } | } | ||||||
|  |  | ||||||
| html.grayscale { |  | ||||||
|   filter: grayscale(100%); |  | ||||||
| } |  | ||||||
|   | |||||||
| @@ -2,6 +2,7 @@ | |||||||
| export const themeSettings: App.Theme.ThemeSetting = { | export const themeSettings: App.Theme.ThemeSetting = { | ||||||
|   themeScheme: 'light', |   themeScheme: 'light', | ||||||
|   grayscale: false, |   grayscale: false, | ||||||
|  |   colourWeakness: false, | ||||||
|   recommendColor: false, |   recommendColor: false, | ||||||
|   themeColor: '#646cff', |   themeColor: '#646cff', | ||||||
|   otherColor: { |   otherColor: { | ||||||
| @@ -48,6 +49,10 @@ export const themeSettings: App.Theme.ThemeSetting = { | |||||||
|     height: 48, |     height: 48, | ||||||
|     right: true |     right: true | ||||||
|   }, |   }, | ||||||
|  |   watermark: { | ||||||
|  |     visible: false, | ||||||
|  |     text: 'SoybeanAdmin' | ||||||
|  |   }, | ||||||
|   tokens: { |   tokens: { | ||||||
|     light: { |     light: { | ||||||
|       colors: { |       colors: { | ||||||
|   | |||||||
							
								
								
									
										138
									
								
								src/typings/api.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -81,142 +81,4 @@ declare namespace Api { | |||||||
|       home: import('@elegant-router/types').LastLevelRouteKey; |       home: import('@elegant-router/types').LastLevelRouteKey; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /** |  | ||||||
|    * namespace SystemManage |  | ||||||
|    * |  | ||||||
|    * backend api module: "systemManage" |  | ||||||
|    */ |  | ||||||
|   namespace SystemManage { |  | ||||||
|     type CommonSearchParams = Pick<Common.PaginatingCommonParams, 'current' | 'size'>; |  | ||||||
|  |  | ||||||
|     /** role */ |  | ||||||
|     type Role = Common.CommonRecord<{ |  | ||||||
|       /** role name */ |  | ||||||
|       roleName: string; |  | ||||||
|       /** role code */ |  | ||||||
|       roleCode: string; |  | ||||||
|       /** role description */ |  | ||||||
|       roleDesc: string; |  | ||||||
|     }>; |  | ||||||
|  |  | ||||||
|     /** role search params */ |  | ||||||
|     type RoleSearchParams = CommonType.RecordNullable< |  | ||||||
|       Pick<Api.SystemManage.Role, 'roleName' | 'roleCode' | 'status'> & CommonSearchParams |  | ||||||
|     >; |  | ||||||
|  |  | ||||||
|     /** role list */ |  | ||||||
|     type RoleList = Common.PaginatingQueryRecord<Role>; |  | ||||||
|  |  | ||||||
|     /** all role */ |  | ||||||
|     type AllRole = Pick<Role, 'id' | 'roleName' | 'roleCode'>; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * user gender |  | ||||||
|      * |  | ||||||
|      * - "1": "male" |  | ||||||
|      * - "2": "female" |  | ||||||
|      */ |  | ||||||
|     type UserGender = '1' | '2'; |  | ||||||
|  |  | ||||||
|     /** user */ |  | ||||||
|     type User = Common.CommonRecord<{ |  | ||||||
|       /** user name */ |  | ||||||
|       userName: string; |  | ||||||
|       /** user gender */ |  | ||||||
|       userGender: UserGender | null; |  | ||||||
|       /** user nick name */ |  | ||||||
|       nickName: string; |  | ||||||
|       /** user phone */ |  | ||||||
|       userPhone: string; |  | ||||||
|       /** user email */ |  | ||||||
|       userEmail: string; |  | ||||||
|       /** user role code collection */ |  | ||||||
|       userRoles: string[]; |  | ||||||
|     }>; |  | ||||||
|  |  | ||||||
|     /** user search params */ |  | ||||||
|     type UserSearchParams = CommonType.RecordNullable< |  | ||||||
|       Pick<Api.SystemManage.User, 'userName' | 'userGender' | 'nickName' | 'userPhone' | 'userEmail' | 'status'> & |  | ||||||
|         CommonSearchParams |  | ||||||
|     >; |  | ||||||
|  |  | ||||||
|     /** user list */ |  | ||||||
|     type UserList = Common.PaginatingQueryRecord<User>; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * menu type |  | ||||||
|      * |  | ||||||
|      * - "1": directory |  | ||||||
|      * - "2": menu |  | ||||||
|      */ |  | ||||||
|     type MenuType = '1' | '2'; |  | ||||||
|  |  | ||||||
|     type MenuButton = { |  | ||||||
|       /** |  | ||||||
|        * button code |  | ||||||
|        * |  | ||||||
|        * it can be used to control the button permission |  | ||||||
|        */ |  | ||||||
|       code: string; |  | ||||||
|       /** button description */ |  | ||||||
|       desc: string; |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * icon type |  | ||||||
|      * |  | ||||||
|      * - "1": iconify icon |  | ||||||
|      * - "2": local icon |  | ||||||
|      */ |  | ||||||
|     type IconType = '1' | '2'; |  | ||||||
|  |  | ||||||
|     type MenuPropsOfRoute = Pick< |  | ||||||
|       import('vue-router').RouteMeta, |  | ||||||
|       | 'i18nKey' |  | ||||||
|       | 'keepAlive' |  | ||||||
|       | 'constant' |  | ||||||
|       | 'order' |  | ||||||
|       | 'href' |  | ||||||
|       | 'hideInMenu' |  | ||||||
|       | 'activeMenu' |  | ||||||
|       | 'multiTab' |  | ||||||
|       | 'fixedIndexInTab' |  | ||||||
|       | 'query' |  | ||||||
|     >; |  | ||||||
|  |  | ||||||
|     type Menu = Common.CommonRecord<{ |  | ||||||
|       /** parent menu id */ |  | ||||||
|       parentId: number; |  | ||||||
|       /** menu type */ |  | ||||||
|       menuType: MenuType; |  | ||||||
|       /** menu name */ |  | ||||||
|       menuName: string; |  | ||||||
|       /** route name */ |  | ||||||
|       routeName: string; |  | ||||||
|       /** route path */ |  | ||||||
|       routePath: string; |  | ||||||
|       /** component */ |  | ||||||
|       component?: string; |  | ||||||
|       /** iconify icon name or local icon name */ |  | ||||||
|       icon: string; |  | ||||||
|       /** icon type */ |  | ||||||
|       iconType: IconType; |  | ||||||
|       /** buttons */ |  | ||||||
|       buttons?: MenuButton[] | null; |  | ||||||
|       /** children menu */ |  | ||||||
|       children?: Menu[] | null; |  | ||||||
|     }> & |  | ||||||
|       MenuPropsOfRoute; |  | ||||||
|  |  | ||||||
|     /** menu list */ |  | ||||||
|     type MenuList = Common.PaginatingQueryRecord<Menu>; |  | ||||||
|  |  | ||||||
|     type MenuTree = { |  | ||||||
|       id: number; |  | ||||||
|       label: string; |  | ||||||
|       pId: number; |  | ||||||
|       children?: MenuTree[]; |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								src/typings/app.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -10,6 +10,8 @@ declare namespace App { | |||||||
|       themeScheme: UnionKey.ThemeScheme; |       themeScheme: UnionKey.ThemeScheme; | ||||||
|       /** grayscale mode */ |       /** grayscale mode */ | ||||||
|       grayscale: boolean; |       grayscale: boolean; | ||||||
|  |       /** colour weakness mode */ | ||||||
|  |       colourWeakness: boolean; | ||||||
|       /** Whether to recommend color */ |       /** Whether to recommend color */ | ||||||
|       recommendColor: boolean; |       recommendColor: boolean; | ||||||
|       /** Theme color */ |       /** Theme color */ | ||||||
| @@ -93,6 +95,13 @@ declare namespace App { | |||||||
|         /** Whether float the footer to the right when the layout is 'horizontal-mix' */ |         /** Whether float the footer to the right when the layout is 'horizontal-mix' */ | ||||||
|         right: boolean; |         right: boolean; | ||||||
|       }; |       }; | ||||||
|  |       /** Watermark */ | ||||||
|  |       watermark?: { | ||||||
|  |         /** Whether to show the watermark */ | ||||||
|  |         visible: boolean; | ||||||
|  |         /** Watermark text */ | ||||||
|  |         text: string; | ||||||
|  |       }; | ||||||
|       /** define some theme settings tokens, will transform to css variables */ |       /** define some theme settings tokens, will transform to css variables */ | ||||||
|       tokens: { |       tokens: { | ||||||
|         light: ThemeSettingToken; |         light: ThemeSettingToken; | ||||||
| @@ -332,6 +341,7 @@ declare namespace App { | |||||||
|       theme: { |       theme: { | ||||||
|         themeSchema: { title: string } & Record<UnionKey.ThemeScheme, string>; |         themeSchema: { title: string } & Record<UnionKey.ThemeScheme, string>; | ||||||
|         grayscale: string; |         grayscale: string; | ||||||
|  |         colourWeakness: string; | ||||||
|         layoutMode: { title: string; reverseHorizontalMix: string } & Record<UnionKey.ThemeLayoutMode, string>; |         layoutMode: { title: string; reverseHorizontalMix: string } & Record<UnionKey.ThemeLayoutMode, string>; | ||||||
|         recommendColor: string; |         recommendColor: string; | ||||||
|         recommendColorDesc: string; |         recommendColorDesc: string; | ||||||
| @@ -372,6 +382,10 @@ declare namespace App { | |||||||
|           height: string; |           height: string; | ||||||
|           right: string; |           right: string; | ||||||
|         }; |         }; | ||||||
|  |         watermark: { | ||||||
|  |           visible: string; | ||||||
|  |           text: string; | ||||||
|  |         }; | ||||||
|         themeDrawerTitle: string; |         themeDrawerTitle: string; | ||||||
|         pageFunTitle: string; |         pageFunTitle: string; | ||||||
|         configOperation: { |         configOperation: { | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								src/typings/components.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -84,6 +84,7 @@ declare module 'vue' { | |||||||
|     NThing: typeof import('naive-ui')['NThing'] |     NThing: typeof import('naive-ui')['NThing'] | ||||||
|     NTooltip: typeof import('naive-ui')['NTooltip'] |     NTooltip: typeof import('naive-ui')['NTooltip'] | ||||||
|     NTree: typeof import('naive-ui')['NTree'] |     NTree: typeof import('naive-ui')['NTree'] | ||||||
|  |     NWatermark: typeof import('naive-ui')['NWatermark'] | ||||||
|     PinToggler: typeof import('./../components/common/pin-toggler.vue')['default'] |     PinToggler: typeof import('./../components/common/pin-toggler.vue')['default'] | ||||||
|     ReloadButton: typeof import('./../components/common/reload-button.vue')['default'] |     ReloadButton: typeof import('./../components/common/reload-button.vue')['default'] | ||||||
|     RouterLink: typeof import('vue-router')['RouterLink'] |     RouterLink: typeof import('vue-router')['RouterLink'] | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ const gap = computed(() => (appStore.isMobile ? 0 : 16)); | |||||||
|  |  | ||||||
| <template> | <template> | ||||||
|   <NSpace vertical :size="16"> |   <NSpace vertical :size="16"> | ||||||
|     <NAlert :title="$t('common.warning')" type="warning" closable> |     <NAlert :title="$t('common.warning')" type="warning"> | ||||||
|       {{ $t('page.home.branchDesc') }} |       {{ $t('page.home.branchDesc') }} | ||||||
|     </NAlert> |     </NAlert> | ||||||
|     <HeaderBanner /> |     <HeaderBanner /> | ||||||
|   | |||||||