Compare commits
1 Commits
206d5a4459
...
tauri
Author | SHA1 | Date | |
---|---|---|---|
|
9683480f6a |
@@ -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': [
|
||||||
|
@@ -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",
|
||||||
"commit:zh": "sa git-commit -l=zh-cn",
|
"commit:zh": "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"
|
||||||
},
|
},
|
||||||
@@ -54,6 +57,7 @@
|
|||||||
"@sa/hooks": "workspace:*",
|
"@sa/hooks": "workspace:*",
|
||||||
"@sa/materials": "workspace:*",
|
"@sa/materials": "workspace:*",
|
||||||
"@sa/utils": "workspace:*",
|
"@sa/utils": "workspace:*",
|
||||||
|
"@tauri-apps/api": "2.5.0",
|
||||||
"@vueuse/core": "13.4.0",
|
"@vueuse/core": "13.4.0",
|
||||||
"clipboard": "2.0.11",
|
"clipboard": "2.0.11",
|
||||||
"dayjs": "1.11.13",
|
"dayjs": "1.11.13",
|
||||||
@@ -75,6 +79,7 @@
|
|||||||
"@sa/scripts": "workspace:*",
|
"@sa/scripts": "workspace:*",
|
||||||
"@sa/uno-preset": "workspace:*",
|
"@sa/uno-preset": "workspace:*",
|
||||||
"@soybeanjs/eslint-config": "1.6.1",
|
"@soybeanjs/eslint-config": "1.6.1",
|
||||||
|
"@tauri-apps/cli": "2.5.0",
|
||||||
"@types/node": "24.0.3",
|
"@types/node": "24.0.3",
|
||||||
"@types/nprogress": "0.2.3",
|
"@types/nprogress": "0.2.3",
|
||||||
"@unocss/eslint-config": "66.2.3",
|
"@unocss/eslint-config": "66.2.3",
|
||||||
|
134
pnpm-lock.yaml
generated
@@ -29,6 +29,9 @@ importers:
|
|||||||
'@sa/utils':
|
'@sa/utils':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:packages/utils
|
version: link:packages/utils
|
||||||
|
'@tauri-apps/api':
|
||||||
|
specifier: 2.5.0
|
||||||
|
version: 2.5.0
|
||||||
'@vueuse/core':
|
'@vueuse/core':
|
||||||
specifier: 13.4.0
|
specifier: 13.4.0
|
||||||
version: 13.4.0(vue@3.5.17(typescript@5.8.3))
|
version: 13.4.0(vue@3.5.17(typescript@5.8.3))
|
||||||
@@ -87,6 +90,9 @@ importers:
|
|||||||
'@soybeanjs/eslint-config':
|
'@soybeanjs/eslint-config':
|
||||||
specifier: 1.6.1
|
specifier: 1.6.1
|
||||||
version: 1.6.1(@unocss/eslint-config@66.2.3(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint-plugin-vue@10.2.0(eslint@9.29.0(jiti@2.4.2))(vue-eslint-parser@10.1.4(eslint@9.29.0(jiti@2.4.2))))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)(vue-eslint-parser@10.1.4(eslint@9.29.0(jiti@2.4.2)))
|
version: 1.6.1(@unocss/eslint-config@66.2.3(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint-plugin-vue@10.2.0(eslint@9.29.0(jiti@2.4.2))(vue-eslint-parser@10.1.4(eslint@9.29.0(jiti@2.4.2))))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)(vue-eslint-parser@10.1.4(eslint@9.29.0(jiti@2.4.2)))
|
||||||
|
'@tauri-apps/cli':
|
||||||
|
specifier: 2.5.0
|
||||||
|
version: 2.5.0
|
||||||
'@types/node':
|
'@types/node':
|
||||||
specifier: 24.0.3
|
specifier: 24.0.3
|
||||||
version: 24.0.3
|
version: 24.0.3
|
||||||
@@ -1081,6 +1087,85 @@ packages:
|
|||||||
vue-eslint-parser:
|
vue-eslint-parser:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
'@tauri-apps/api@2.5.0':
|
||||||
|
resolution: {integrity: sha512-Ldux4ip+HGAcPUmuLT8EIkk6yafl5vK0P0c0byzAKzxJh7vxelVtdPONjfgTm96PbN24yjZNESY8CKo8qniluA==}
|
||||||
|
|
||||||
|
'@tauri-apps/cli-darwin-arm64@2.5.0':
|
||||||
|
resolution: {integrity: sha512-VuVAeTFq86dfpoBDNYAdtQVLbP0+2EKCHIIhkaxjeoPARR0sLpFHz2zs0PcFU76e+KAaxtEtAJAXGNUc8E1PzQ==}
|
||||||
|
engines: {node: '>= 10'}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [darwin]
|
||||||
|
|
||||||
|
'@tauri-apps/cli-darwin-x64@2.5.0':
|
||||||
|
resolution: {integrity: sha512-hUF01sC06cZVa8+I0/VtsHOk9BbO75rd+YdtHJ48xTdcYaQ5QIwL4yZz9OR1AKBTaUYhBam8UX9Pvd5V2/4Dpw==}
|
||||||
|
engines: {node: '>= 10'}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [darwin]
|
||||||
|
|
||||||
|
'@tauri-apps/cli-linux-arm-gnueabihf@2.5.0':
|
||||||
|
resolution: {integrity: sha512-LQKqttsK252LlqYyX8R02MinUsfFcy3+NZiJwHFgi5Y3+ZUIAED9cSxJkyNtuY5KMnR4RlpgWyLv4P6akN1xhg==}
|
||||||
|
engines: {node: '>= 10'}
|
||||||
|
cpu: [arm]
|
||||||
|
os: [linux]
|
||||||
|
|
||||||
|
'@tauri-apps/cli-linux-arm64-gnu@2.5.0':
|
||||||
|
resolution: {integrity: sha512-mTQufsPcpdHg5RW0zypazMo4L55EfeE5snTzrPqbLX4yCK2qalN7+rnP8O8GT06xhp6ElSP/Ku1M2MR297SByQ==}
|
||||||
|
engines: {node: '>= 10'}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [linux]
|
||||||
|
libc: [glibc]
|
||||||
|
|
||||||
|
'@tauri-apps/cli-linux-arm64-musl@2.5.0':
|
||||||
|
resolution: {integrity: sha512-rQO1HhRUQqyEaal5dUVOQruTRda/TD36s9kv1hTxZiFuSq3558lsTjAcUEnMAtBcBkps20sbyTJNMT0AwYIk8Q==}
|
||||||
|
engines: {node: '>= 10'}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [linux]
|
||||||
|
libc: [musl]
|
||||||
|
|
||||||
|
'@tauri-apps/cli-linux-riscv64-gnu@2.5.0':
|
||||||
|
resolution: {integrity: sha512-7oS18FN46yDxyw1zX/AxhLAd7T3GrLj3Ai6s8hZKd9qFVzrAn36ESL7d3G05s8wEtsJf26qjXnVF4qleS3dYsA==}
|
||||||
|
engines: {node: '>= 10'}
|
||||||
|
cpu: [riscv64]
|
||||||
|
os: [linux]
|
||||||
|
libc: [glibc]
|
||||||
|
|
||||||
|
'@tauri-apps/cli-linux-x64-gnu@2.5.0':
|
||||||
|
resolution: {integrity: sha512-SG5sFNL7VMmDBdIg3nO3EzNRT306HsiEQ0N90ILe3ZABYAVoPDO/ttpCO37ApLInTzrq/DLN+gOlC/mgZvLw1w==}
|
||||||
|
engines: {node: '>= 10'}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [linux]
|
||||||
|
libc: [glibc]
|
||||||
|
|
||||||
|
'@tauri-apps/cli-linux-x64-musl@2.5.0':
|
||||||
|
resolution: {integrity: sha512-QXDM8zp/6v05PNWju5ELsVwF0VH1n6b5pk2E6W/jFbbiwz80Vs1lACl9pv5kEHkrxBj+aWU/03JzGuIj2g3SkQ==}
|
||||||
|
engines: {node: '>= 10'}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [linux]
|
||||||
|
libc: [musl]
|
||||||
|
|
||||||
|
'@tauri-apps/cli-win32-arm64-msvc@2.5.0':
|
||||||
|
resolution: {integrity: sha512-pFSHFK6b+o9y4Un8w0gGLwVyFTZaC3P0kQ7umRt/BLDkzD5RnQ4vBM7CF8BCU5nkwmEBUCZd7Wt3TWZxe41o6Q==}
|
||||||
|
engines: {node: '>= 10'}
|
||||||
|
cpu: [arm64]
|
||||||
|
os: [win32]
|
||||||
|
|
||||||
|
'@tauri-apps/cli-win32-ia32-msvc@2.5.0':
|
||||||
|
resolution: {integrity: sha512-EArv1IaRlogdLAQyGlKmEqZqm5RfHCUMhJoedWu7GtdbOMUfSAz6FMX2boE1PtEmNO4An+g188flLeVErrxEKg==}
|
||||||
|
engines: {node: '>= 10'}
|
||||||
|
cpu: [ia32]
|
||||||
|
os: [win32]
|
||||||
|
|
||||||
|
'@tauri-apps/cli-win32-x64-msvc@2.5.0':
|
||||||
|
resolution: {integrity: sha512-lj43EFYbnAta8pd9JnUq87o+xRUR0odz+4rixBtTUwUgdRdwQ2V9CzFtsMu6FQKpFQ6mujRK6P1IEwhL6ADRsQ==}
|
||||||
|
engines: {node: '>= 10'}
|
||||||
|
cpu: [x64]
|
||||||
|
os: [win32]
|
||||||
|
|
||||||
|
'@tauri-apps/cli@2.5.0':
|
||||||
|
resolution: {integrity: sha512-rAtHqG0Gh/IWLjN2zTf3nZqYqbo81oMbqop56rGTjrlWk9pTTAjkqOjSL9XQLIMZ3RbeVjveCqqCA0s8RnLdMg==}
|
||||||
|
engines: {node: '>= 10'}
|
||||||
|
hasBin: true
|
||||||
|
|
||||||
'@trysound/sax@0.2.0':
|
'@trysound/sax@0.2.0':
|
||||||
resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
|
resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
|
||||||
engines: {node: '>=10.13.0'}
|
engines: {node: '>=10.13.0'}
|
||||||
@@ -4915,6 +5000,55 @@ snapshots:
|
|||||||
- '@types/eslint'
|
- '@types/eslint'
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
|
'@tauri-apps/api@2.5.0': {}
|
||||||
|
|
||||||
|
'@tauri-apps/cli-darwin-arm64@2.5.0':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@tauri-apps/cli-darwin-x64@2.5.0':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@tauri-apps/cli-linux-arm-gnueabihf@2.5.0':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@tauri-apps/cli-linux-arm64-gnu@2.5.0':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@tauri-apps/cli-linux-arm64-musl@2.5.0':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@tauri-apps/cli-linux-riscv64-gnu@2.5.0':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@tauri-apps/cli-linux-x64-gnu@2.5.0':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@tauri-apps/cli-linux-x64-musl@2.5.0':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@tauri-apps/cli-win32-arm64-msvc@2.5.0':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@tauri-apps/cli-win32-ia32-msvc@2.5.0':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@tauri-apps/cli-win32-x64-msvc@2.5.0':
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
'@tauri-apps/cli@2.5.0':
|
||||||
|
optionalDependencies:
|
||||||
|
'@tauri-apps/cli-darwin-arm64': 2.5.0
|
||||||
|
'@tauri-apps/cli-darwin-x64': 2.5.0
|
||||||
|
'@tauri-apps/cli-linux-arm-gnueabihf': 2.5.0
|
||||||
|
'@tauri-apps/cli-linux-arm64-gnu': 2.5.0
|
||||||
|
'@tauri-apps/cli-linux-arm64-musl': 2.5.0
|
||||||
|
'@tauri-apps/cli-linux-riscv64-gnu': 2.5.0
|
||||||
|
'@tauri-apps/cli-linux-x64-gnu': 2.5.0
|
||||||
|
'@tauri-apps/cli-linux-x64-musl': 2.5.0
|
||||||
|
'@tauri-apps/cli-win32-arm64-msvc': 2.5.0
|
||||||
|
'@tauri-apps/cli-win32-ia32-msvc': 2.5.0
|
||||||
|
'@tauri-apps/cli-win32-x64-msvc': 2.5.0
|
||||||
|
|
||||||
'@trysound/sax@0.2.0': {}
|
'@trysound/sax@0.2.0': {}
|
||||||
|
|
||||||
'@tybys/wasm-util@0.9.0':
|
'@tybys/wasm-util@0.9.0':
|
||||||
|
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/
|
4580
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 = "2", features = [] }
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
serde_json = "1.0"
|
||||||
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
|
tauri = { version = "2", 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()
|
||||||
|
}
|
7
src-tauri/capabilities/migrated.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"identifier": "migrated",
|
||||||
|
"description": "permissions that were migrated from v1",
|
||||||
|
"local": true,
|
||||||
|
"windows": ["main"],
|
||||||
|
"permissions": ["core:default"]
|
||||||
|
}
|
1676
src-tauri/gen/schemas/acl-manifests.json
Normal file
9
src-tauri/gen/schemas/capabilities.json
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"migrated": {
|
||||||
|
"identifier": "migrated",
|
||||||
|
"description": "permissions that were migrated from v1",
|
||||||
|
"local": true,
|
||||||
|
"windows": ["main"],
|
||||||
|
"permissions": ["core:default"]
|
||||||
|
}
|
||||||
|
}
|
1778
src-tauri/gen/schemas/desktop-schema.json
Normal file
1778
src-tauri/gen/schemas/macOS-schema.json
Normal file
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");
|
||||||
|
}
|
57
src-tauri/tauri.conf.json
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
{
|
||||||
|
"$schema": "../node_modules/@tauri-apps/cli/config.schema.json",
|
||||||
|
"build": {
|
||||||
|
"beforeBuildCommand": "npm run build",
|
||||||
|
"beforeDevCommand": "npm run dev",
|
||||||
|
"frontendDist": "../dist",
|
||||||
|
"devUrl": "http://localhost:9527"
|
||||||
|
},
|
||||||
|
"bundle": {
|
||||||
|
"active": true,
|
||||||
|
"category": "DeveloperTool",
|
||||||
|
"copyright": "",
|
||||||
|
"targets": "all",
|
||||||
|
"externalBin": [],
|
||||||
|
"icon": ["icons/32x32.png", "icons/128x128.png", "icons/128x128@2x.png", "icons/icon.icns", "icons/icon.ico"],
|
||||||
|
"windows": {
|
||||||
|
"certificateThumbprint": null,
|
||||||
|
"digestAlgorithm": "sha256",
|
||||||
|
"timestampUrl": ""
|
||||||
|
},
|
||||||
|
"longDescription": "",
|
||||||
|
"macOS": {
|
||||||
|
"entitlements": null,
|
||||||
|
"exceptionDomain": "",
|
||||||
|
"frameworks": [],
|
||||||
|
"providerShortName": null,
|
||||||
|
"signingIdentity": null
|
||||||
|
},
|
||||||
|
"resources": [],
|
||||||
|
"shortDescription": "",
|
||||||
|
"linux": {
|
||||||
|
"deb": {
|
||||||
|
"depends": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"productName": "soybean-admin",
|
||||||
|
"mainBinaryName": "soybean-admin",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"identifier": "cn.soybeanjs.admin",
|
||||||
|
"plugins": {},
|
||||||
|
"app": {
|
||||||
|
"windows": [
|
||||||
|
{
|
||||||
|
"fullscreen": false,
|
||||||
|
"height": 768,
|
||||||
|
"resizable": true,
|
||||||
|
"title": "SoybeanAdmin",
|
||||||
|
"width": 1366,
|
||||||
|
"useHttpsScheme": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"security": {
|
||||||
|
"csp": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -5,9 +5,9 @@ export const GLOBAL_HEADER_MENU_ID = '__GLOBAL_HEADER_MENU__';
|
|||||||
export const GLOBAL_SIDER_MENU_ID = '__GLOBAL_SIDER_MENU__';
|
export const GLOBAL_SIDER_MENU_ID = '__GLOBAL_SIDER_MENU__';
|
||||||
|
|
||||||
export const themeSchemaRecord: Record<UnionKey.ThemeScheme, App.I18n.I18nKey> = {
|
export const themeSchemaRecord: Record<UnionKey.ThemeScheme, App.I18n.I18nKey> = {
|
||||||
light: 'theme.appearance.themeSchema.light',
|
light: 'theme.themeSchema.light',
|
||||||
dark: 'theme.appearance.themeSchema.dark',
|
dark: 'theme.themeSchema.dark',
|
||||||
auto: 'theme.appearance.themeSchema.auto'
|
auto: 'theme.themeSchema.auto'
|
||||||
};
|
};
|
||||||
|
|
||||||
export const themeSchemaOptions = transformRecordToOption(themeSchemaRecord);
|
export const themeSchemaOptions = transformRecordToOption(themeSchemaRecord);
|
||||||
@@ -21,43 +21,43 @@ export const loginModuleRecord: Record<UnionKey.LoginModule, App.I18n.I18nKey> =
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const themeLayoutModeRecord: Record<UnionKey.ThemeLayoutMode, App.I18n.I18nKey> = {
|
export const themeLayoutModeRecord: Record<UnionKey.ThemeLayoutMode, App.I18n.I18nKey> = {
|
||||||
vertical: 'theme.layout.layoutMode.vertical',
|
vertical: 'theme.layoutMode.vertical',
|
||||||
'vertical-mix': 'theme.layout.layoutMode.vertical-mix',
|
'vertical-mix': 'theme.layoutMode.vertical-mix',
|
||||||
horizontal: 'theme.layout.layoutMode.horizontal',
|
horizontal: 'theme.layoutMode.horizontal',
|
||||||
'horizontal-mix': 'theme.layout.layoutMode.horizontal-mix'
|
'horizontal-mix': 'theme.layoutMode.horizontal-mix'
|
||||||
};
|
};
|
||||||
|
|
||||||
export const themeLayoutModeOptions = transformRecordToOption(themeLayoutModeRecord);
|
export const themeLayoutModeOptions = transformRecordToOption(themeLayoutModeRecord);
|
||||||
|
|
||||||
export const themeScrollModeRecord: Record<UnionKey.ThemeScrollMode, App.I18n.I18nKey> = {
|
export const themeScrollModeRecord: Record<UnionKey.ThemeScrollMode, App.I18n.I18nKey> = {
|
||||||
wrapper: 'theme.layout.content.scrollMode.wrapper',
|
wrapper: 'theme.scrollMode.wrapper',
|
||||||
content: 'theme.layout.content.scrollMode.content'
|
content: 'theme.scrollMode.content'
|
||||||
};
|
};
|
||||||
|
|
||||||
export const themeScrollModeOptions = transformRecordToOption(themeScrollModeRecord);
|
export const themeScrollModeOptions = transformRecordToOption(themeScrollModeRecord);
|
||||||
|
|
||||||
export const themeTabModeRecord: Record<UnionKey.ThemeTabMode, App.I18n.I18nKey> = {
|
export const themeTabModeRecord: Record<UnionKey.ThemeTabMode, App.I18n.I18nKey> = {
|
||||||
chrome: 'theme.layout.tab.mode.chrome',
|
chrome: 'theme.tab.mode.chrome',
|
||||||
button: 'theme.layout.tab.mode.button'
|
button: 'theme.tab.mode.button'
|
||||||
};
|
};
|
||||||
|
|
||||||
export const themeTabModeOptions = transformRecordToOption(themeTabModeRecord);
|
export const themeTabModeOptions = transformRecordToOption(themeTabModeRecord);
|
||||||
|
|
||||||
export const themePageAnimationModeRecord: Record<UnionKey.ThemePageAnimateMode, App.I18n.I18nKey> = {
|
export const themePageAnimationModeRecord: Record<UnionKey.ThemePageAnimateMode, App.I18n.I18nKey> = {
|
||||||
'fade-slide': 'theme.layout.content.page.mode.fade-slide',
|
'fade-slide': 'theme.page.mode.fade-slide',
|
||||||
fade: 'theme.layout.content.page.mode.fade',
|
fade: 'theme.page.mode.fade',
|
||||||
'fade-bottom': 'theme.layout.content.page.mode.fade-bottom',
|
'fade-bottom': 'theme.page.mode.fade-bottom',
|
||||||
'fade-scale': 'theme.layout.content.page.mode.fade-scale',
|
'fade-scale': 'theme.page.mode.fade-scale',
|
||||||
'zoom-fade': 'theme.layout.content.page.mode.zoom-fade',
|
'zoom-fade': 'theme.page.mode.zoom-fade',
|
||||||
'zoom-out': 'theme.layout.content.page.mode.zoom-out',
|
'zoom-out': 'theme.page.mode.zoom-out',
|
||||||
none: 'theme.layout.content.page.mode.none'
|
none: 'theme.page.mode.none'
|
||||||
};
|
};
|
||||||
|
|
||||||
export const themePageAnimationModeOptions = transformRecordToOption(themePageAnimationModeRecord);
|
export const themePageAnimationModeOptions = transformRecordToOption(themePageAnimationModeRecord);
|
||||||
|
|
||||||
export const resetCacheStrategyRecord: Record<UnionKey.ResetCacheStrategy, App.I18n.I18nKey> = {
|
export const resetCacheStrategyRecord: Record<UnionKey.ResetCacheStrategy, App.I18n.I18nKey> = {
|
||||||
close: 'theme.layout.resetCacheStrategy.close',
|
close: 'theme.resetCacheStrategy.close',
|
||||||
refresh: 'theme.layout.resetCacheStrategy.refresh'
|
refresh: 'theme.resetCacheStrategy.refresh'
|
||||||
};
|
};
|
||||||
|
|
||||||
export const resetCacheStrategyOptions = transformRecordToOption(resetCacheStrategyRecord);
|
export const resetCacheStrategyOptions = transformRecordToOption(resetCacheStrategyRecord);
|
||||||
|
@@ -68,11 +68,11 @@ function handleChangeMode(mode: UnionKey.ThemeLayoutMode) {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="grid grid-cols-3 gap-x-32px gap-y-16px">
|
<div class="flex-center flex-wrap gap-x-32px gap-y-16px">
|
||||||
<div
|
<div
|
||||||
v-for="(item, key) in layoutConfig"
|
v-for="(item, key) in layoutConfig"
|
||||||
:key="key"
|
:key="key"
|
||||||
class="flex-center cursor-pointer border-2px rounded-6px hover:border-primary"
|
class="flex cursor-pointer border-2px rounded-6px hover:border-primary"
|
||||||
:class="[mode === key ? 'border-primary' : 'border-transparent']"
|
:class="[mode === key ? 'border-primary' : 'border-transparent']"
|
||||||
@click="handleChangeMode(key)"
|
@click="handleChangeMode(key)"
|
||||||
>
|
>
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref } from 'vue';
|
|
||||||
import { useAppStore } from '@/store/modules/app';
|
import { useAppStore } from '@/store/modules/app';
|
||||||
import { $t } from '@/locales';
|
import { $t } from '@/locales';
|
||||||
import AppearanceSettings from './modules/appearance/index.vue';
|
import DarkMode from './modules/dark-mode.vue';
|
||||||
import LayoutSettings from './modules/layout/index.vue';
|
import LayoutMode from './modules/layout-mode.vue';
|
||||||
import GeneralSettings from './modules/general/index.vue';
|
import ThemeColor from './modules/theme-color.vue';
|
||||||
|
import PageFun from './modules/page-fun.vue';
|
||||||
import ConfigOperation from './modules/config-operation.vue';
|
import ConfigOperation from './modules/config-operation.vue';
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
@@ -12,26 +12,15 @@ defineOptions({
|
|||||||
});
|
});
|
||||||
|
|
||||||
const appStore = useAppStore();
|
const appStore = useAppStore();
|
||||||
const activeTab = ref('appearance');
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<NDrawer v-model:show="appStore.themeDrawerVisible" display-directive="show" :width="460">
|
<NDrawer v-model:show="appStore.themeDrawerVisible" display-directive="show" :width="360">
|
||||||
<NDrawerContent :title="$t('theme.themeDrawerTitle')" :native-scrollbar="false" closable>
|
<NDrawerContent :title="$t('theme.themeDrawerTitle')" :native-scrollbar="false" closable>
|
||||||
<NTabs v-model:value="activeTab" type="segment" size="medium" class="mb-16px">
|
<DarkMode />
|
||||||
<NTab name="appearance" :tab="$t('theme.tabs.appearance')"></NTab>
|
<LayoutMode />
|
||||||
<NTab name="layout" :tab="$t('theme.tabs.layout')"></NTab>
|
<ThemeColor />
|
||||||
<NTab name="general" :tab="$t('theme.tabs.general')"></NTab>
|
<PageFun />
|
||||||
</NTabs>
|
|
||||||
|
|
||||||
<div class="min-h-400px">
|
|
||||||
<KeepAlive>
|
|
||||||
<AppearanceSettings v-if="activeTab === 'appearance'" />
|
|
||||||
<LayoutSettings v-else-if="activeTab === 'layout'" />
|
|
||||||
<GeneralSettings v-else-if="activeTab === 'general'" />
|
|
||||||
</KeepAlive>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<ConfigOperation />
|
<ConfigOperation />
|
||||||
</template>
|
</template>
|
||||||
@@ -39,14 +28,4 @@ const activeTab = ref('appearance');
|
|||||||
</NDrawer>
|
</NDrawer>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped></style>
|
||||||
:deep(.n-tab) {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.n-tab-pane) {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
@@ -1,17 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import ThemeSchema from './modules/theme-schema.vue';
|
|
||||||
import ThemeColor from './modules/theme-color.vue';
|
|
||||||
|
|
||||||
defineOptions({
|
|
||||||
name: 'AppearanceSettings'
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="flex-col-stretch gap-16px">
|
|
||||||
<ThemeSchema />
|
|
||||||
<ThemeColor />
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style scoped></style>
|
|
@@ -3,10 +3,10 @@ import { computed } from 'vue';
|
|||||||
import { themeSchemaRecord } from '@/constants/app';
|
import { themeSchemaRecord } from '@/constants/app';
|
||||||
import { useThemeStore } from '@/store/modules/theme';
|
import { useThemeStore } from '@/store/modules/theme';
|
||||||
import { $t } from '@/locales';
|
import { $t } from '@/locales';
|
||||||
import SettingItem from '../../../components/setting-item.vue';
|
import SettingItem from '../components/setting-item.vue';
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: 'ThemeSchema'
|
name: 'DarkMode'
|
||||||
});
|
});
|
||||||
|
|
||||||
const themeStore = useThemeStore();
|
const themeStore = useThemeStore();
|
||||||
@@ -33,7 +33,7 @@ const showSiderInverted = computed(() => !themeStore.darkMode && themeStore.layo
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<NDivider>{{ $t('theme.appearance.themeSchema.title') }}</NDivider>
|
<NDivider>{{ $t('theme.themeSchema.title') }}</NDivider>
|
||||||
<div class="flex-col-stretch gap-16px">
|
<div class="flex-col-stretch gap-16px">
|
||||||
<div class="i-flex-center">
|
<div class="i-flex-center">
|
||||||
<NTabs
|
<NTabs
|
||||||
@@ -50,14 +50,14 @@ const showSiderInverted = computed(() => !themeStore.darkMode && themeStore.layo
|
|||||||
</NTabs>
|
</NTabs>
|
||||||
</div>
|
</div>
|
||||||
<Transition name="sider-inverted">
|
<Transition name="sider-inverted">
|
||||||
<SettingItem v-if="showSiderInverted" :label="$t('theme.layout.sider.inverted')">
|
<SettingItem v-if="showSiderInverted" :label="$t('theme.sider.inverted')">
|
||||||
<NSwitch v-model:value="themeStore.sider.inverted" />
|
<NSwitch v-model:value="themeStore.sider.inverted" />
|
||||||
</SettingItem>
|
</SettingItem>
|
||||||
</Transition>
|
</Transition>
|
||||||
<SettingItem :label="$t('theme.appearance.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.appearance.colourWeakness')">
|
<SettingItem :label="$t('theme.colourWeakness')">
|
||||||
<NSwitch :value="themeStore.colourWeakness" @update:value="handleColourWeaknessChange" />
|
<NSwitch :value="themeStore.colourWeakness" @update:value="handleColourWeaknessChange" />
|
||||||
</SettingItem>
|
</SettingItem>
|
||||||
</div>
|
</div>
|
@@ -1,15 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import GlobalSettings from './modules/global-settings.vue';
|
|
||||||
|
|
||||||
defineOptions({
|
|
||||||
name: 'GeneralSettings'
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="flex-col-stretch gap-16px">
|
|
||||||
<GlobalSettings />
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style scoped></style>
|
|
@@ -1,59 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import { useThemeStore } from '@/store/modules/theme';
|
|
||||||
import { $t } from '@/locales';
|
|
||||||
import SettingItem from '../../../components/setting-item.vue';
|
|
||||||
|
|
||||||
defineOptions({
|
|
||||||
name: 'GlobalSettings'
|
|
||||||
});
|
|
||||||
|
|
||||||
const themeStore = useThemeStore();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="flex-col-stretch gap-16px">
|
|
||||||
<SettingItem :label="$t('theme.general.multilingual.visible')">
|
|
||||||
<NSwitch v-model:value="themeStore.header.multilingual.visible" />
|
|
||||||
</SettingItem>
|
|
||||||
|
|
||||||
<SettingItem :label="$t('theme.general.globalSearch.visible')">
|
|
||||||
<NSwitch v-model:value="themeStore.header.globalSearch.visible" />
|
|
||||||
</SettingItem>
|
|
||||||
|
|
||||||
<TransitionGroup tag="div" name="setting-list" class="flex-col-stretch gap-12px">
|
|
||||||
<SettingItem key="1" :label="$t('theme.general.watermark.visible')">
|
|
||||||
<NSwitch v-model:value="themeStore.watermark.visible" />
|
|
||||||
</SettingItem>
|
|
||||||
<SettingItem v-if="themeStore.watermark.visible" key="2" :label="$t('theme.general.watermark.enableUserName')">
|
|
||||||
<NSwitch v-model:value="themeStore.watermark.enableUserName" />
|
|
||||||
</SettingItem>
|
|
||||||
<SettingItem v-if="themeStore.watermark.visible" key="3" :label="$t('theme.general.watermark.text')">
|
|
||||||
<NInput
|
|
||||||
v-model:value="themeStore.watermark.text"
|
|
||||||
autosize
|
|
||||||
type="text"
|
|
||||||
size="small"
|
|
||||||
class="w-120px"
|
|
||||||
placeholder="SoybeanAdmin"
|
|
||||||
/>
|
|
||||||
</SettingItem>
|
|
||||||
</TransitionGroup>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
.setting-list-move,
|
|
||||||
.setting-list-enter-active,
|
|
||||||
.setting-list-leave-active {
|
|
||||||
--uno: transition-all-300;
|
|
||||||
}
|
|
||||||
|
|
||||||
.setting-list-enter-from,
|
|
||||||
.setting-list-leave-to {
|
|
||||||
--uno: opacity-0 -translate-x-30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.setting-list-leave-active {
|
|
||||||
--uno: absolute;
|
|
||||||
}
|
|
||||||
</style>
|
|
@@ -2,8 +2,8 @@
|
|||||||
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 { $t } from '@/locales';
|
import { $t } from '@/locales';
|
||||||
import LayoutModeCard from '../../../components/layout-mode-card.vue';
|
import LayoutModeCard from '../components/layout-mode-card.vue';
|
||||||
import SettingItem from '../../../components/setting-item.vue';
|
import SettingItem from '../components/setting-item.vue';
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: 'LayoutMode'
|
name: 'LayoutMode'
|
||||||
@@ -18,7 +18,7 @@ function handleReverseHorizontalMixChange(value: boolean) {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<NDivider>{{ $t('theme.layout.layoutMode.title') }}</NDivider>
|
<NDivider>{{ $t('theme.layoutMode.title') }}</NDivider>
|
||||||
<LayoutModeCard v-model:mode="themeStore.layout.mode" :disabled="appStore.isMobile">
|
<LayoutModeCard v-model:mode="themeStore.layout.mode" :disabled="appStore.isMobile">
|
||||||
<template #vertical>
|
<template #vertical>
|
||||||
<div class="layout-sider h-full w-18px"></div>
|
<div class="layout-sider h-full w-18px"></div>
|
||||||
@@ -51,7 +51,7 @@ function handleReverseHorizontalMixChange(value: boolean) {
|
|||||||
</LayoutModeCard>
|
</LayoutModeCard>
|
||||||
<SettingItem
|
<SettingItem
|
||||||
v-if="themeStore.layout.mode === 'horizontal-mix'"
|
v-if="themeStore.layout.mode === 'horizontal-mix'"
|
||||||
:label="$t('theme.layout.layoutMode.reverseHorizontalMix')"
|
:label="$t('theme.layoutMode.reverseHorizontalMix')"
|
||||||
class="mt-16px"
|
class="mt-16px"
|
||||||
>
|
>
|
||||||
<NSwitch :value="themeStore.layout.reverseHorizontalMix" @update:value="handleReverseHorizontalMixChange" />
|
<NSwitch :value="themeStore.layout.reverseHorizontalMix" @update:value="handleReverseHorizontalMixChange" />
|
@@ -1,25 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import LayoutMode from './modules/layout-mode.vue';
|
|
||||||
import TabSettings from './modules/tab-settings.vue';
|
|
||||||
import HeaderSettings from './modules/header-settings.vue';
|
|
||||||
import SiderSettings from './modules/sider-settings.vue';
|
|
||||||
import FooterSettings from './modules/footer-settings.vue';
|
|
||||||
import ContentSettings from './modules/content-settings.vue';
|
|
||||||
|
|
||||||
defineOptions({
|
|
||||||
name: 'LayoutSettings'
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="flex-col-stretch gap-16px">
|
|
||||||
<LayoutMode />
|
|
||||||
<TabSettings />
|
|
||||||
<HeaderSettings />
|
|
||||||
<SiderSettings />
|
|
||||||
<FooterSettings />
|
|
||||||
<ContentSettings />
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style scoped></style>
|
|
@@ -1,61 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import { computed } from 'vue';
|
|
||||||
import { themePageAnimationModeOptions, themeScrollModeOptions } from '@/constants/app';
|
|
||||||
import { useThemeStore } from '@/store/modules/theme';
|
|
||||||
import { translateOptions } from '@/utils/common';
|
|
||||||
import { $t } from '@/locales';
|
|
||||||
import SettingItem from '../../../components/setting-item.vue';
|
|
||||||
|
|
||||||
defineOptions({
|
|
||||||
name: 'ContentSettings'
|
|
||||||
});
|
|
||||||
|
|
||||||
const themeStore = useThemeStore();
|
|
||||||
|
|
||||||
const isWrapperScrollMode = computed(() => themeStore.layout.scrollMode === 'wrapper');
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<NDivider>{{ $t('theme.layout.content.title') }}</NDivider>
|
|
||||||
<TransitionGroup tag="div" name="setting-list" class="flex-col-stretch gap-12px">
|
|
||||||
<SettingItem key="1" :label="$t('theme.layout.content.scrollMode.title')">
|
|
||||||
<NSelect
|
|
||||||
v-model:value="themeStore.layout.scrollMode"
|
|
||||||
:options="translateOptions(themeScrollModeOptions)"
|
|
||||||
size="small"
|
|
||||||
class="w-120px"
|
|
||||||
/>
|
|
||||||
</SettingItem>
|
|
||||||
<SettingItem key="2" :label="$t('theme.layout.content.page.animate')">
|
|
||||||
<NSwitch v-model:value="themeStore.page.animate" />
|
|
||||||
</SettingItem>
|
|
||||||
<SettingItem v-if="themeStore.page.animate" key="3" :label="$t('theme.layout.content.page.mode.title')">
|
|
||||||
<NSelect
|
|
||||||
v-model:value="themeStore.page.animateMode"
|
|
||||||
:options="translateOptions(themePageAnimationModeOptions)"
|
|
||||||
size="small"
|
|
||||||
class="w-120px"
|
|
||||||
/>
|
|
||||||
</SettingItem>
|
|
||||||
<SettingItem v-if="isWrapperScrollMode" key="4" :label="$t('theme.layout.content.fixedHeaderAndTab')">
|
|
||||||
<NSwitch v-model:value="themeStore.fixedHeaderAndTab" />
|
|
||||||
</SettingItem>
|
|
||||||
</TransitionGroup>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
.setting-list-move,
|
|
||||||
.setting-list-enter-active,
|
|
||||||
.setting-list-leave-active {
|
|
||||||
--uno: transition-all-300;
|
|
||||||
}
|
|
||||||
|
|
||||||
.setting-list-enter-from,
|
|
||||||
.setting-list-leave-to {
|
|
||||||
--uno: opacity-0 -translate-x-30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.setting-list-leave-active {
|
|
||||||
--uno: absolute;
|
|
||||||
}
|
|
||||||
</style>
|
|
@@ -1,58 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import { computed } from 'vue';
|
|
||||||
import { useThemeStore } from '@/store/modules/theme';
|
|
||||||
import { $t } from '@/locales';
|
|
||||||
import SettingItem from '../../../components/setting-item.vue';
|
|
||||||
|
|
||||||
defineOptions({
|
|
||||||
name: 'FooterSettings'
|
|
||||||
});
|
|
||||||
|
|
||||||
const themeStore = useThemeStore();
|
|
||||||
|
|
||||||
const layoutMode = computed(() => themeStore.layout.mode);
|
|
||||||
const isWrapperScrollMode = computed(() => themeStore.layout.scrollMode === 'wrapper');
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<NDivider>{{ $t('theme.layout.footer.title') }}</NDivider>
|
|
||||||
<TransitionGroup tag="div" name="setting-list" class="flex-col-stretch gap-12px">
|
|
||||||
<SettingItem key="1" :label="$t('theme.layout.footer.visible')">
|
|
||||||
<NSwitch v-model:value="themeStore.footer.visible" />
|
|
||||||
</SettingItem>
|
|
||||||
<SettingItem
|
|
||||||
v-if="themeStore.footer.visible && isWrapperScrollMode"
|
|
||||||
key="2"
|
|
||||||
:label="$t('theme.layout.footer.fixed')"
|
|
||||||
>
|
|
||||||
<NSwitch v-model:value="themeStore.footer.fixed" />
|
|
||||||
</SettingItem>
|
|
||||||
<SettingItem v-if="themeStore.footer.visible" key="3" :label="$t('theme.layout.footer.height')">
|
|
||||||
<NInputNumber v-model:value="themeStore.footer.height" size="small" :step="1" class="w-120px" />
|
|
||||||
</SettingItem>
|
|
||||||
<SettingItem
|
|
||||||
v-if="themeStore.footer.visible && layoutMode === 'horizontal-mix'"
|
|
||||||
key="4"
|
|
||||||
:label="$t('theme.layout.footer.right')"
|
|
||||||
>
|
|
||||||
<NSwitch v-model:value="themeStore.footer.right" />
|
|
||||||
</SettingItem>
|
|
||||||
</TransitionGroup>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
.setting-list-move,
|
|
||||||
.setting-list-enter-active,
|
|
||||||
.setting-list-leave-active {
|
|
||||||
--uno: transition-all-300;
|
|
||||||
}
|
|
||||||
|
|
||||||
.setting-list-enter-from,
|
|
||||||
.setting-list-leave-to {
|
|
||||||
--uno: opacity-0 -translate-x-30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.setting-list-leave-active {
|
|
||||||
--uno: absolute;
|
|
||||||
}
|
|
||||||
</style>
|
|
@@ -1,47 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import { useThemeStore } from '@/store/modules/theme';
|
|
||||||
import { $t } from '@/locales';
|
|
||||||
import SettingItem from '../../../components/setting-item.vue';
|
|
||||||
|
|
||||||
defineOptions({
|
|
||||||
name: 'HeaderSettings'
|
|
||||||
});
|
|
||||||
|
|
||||||
const themeStore = useThemeStore();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<NDivider>{{ $t('theme.layout.header.title') }}</NDivider>
|
|
||||||
<TransitionGroup tag="div" name="setting-list" class="flex-col-stretch gap-12px">
|
|
||||||
<SettingItem key="1" :label="$t('theme.layout.header.height')">
|
|
||||||
<NInputNumber v-model:value="themeStore.header.height" size="small" :step="1" class="w-120px" />
|
|
||||||
</SettingItem>
|
|
||||||
<SettingItem key="2" :label="$t('theme.layout.header.breadcrumb.visible')">
|
|
||||||
<NSwitch v-model:value="themeStore.header.breadcrumb.visible" />
|
|
||||||
</SettingItem>
|
|
||||||
<SettingItem
|
|
||||||
v-if="themeStore.header.breadcrumb.visible"
|
|
||||||
key="3"
|
|
||||||
:label="$t('theme.layout.header.breadcrumb.showIcon')"
|
|
||||||
>
|
|
||||||
<NSwitch v-model:value="themeStore.header.breadcrumb.showIcon" />
|
|
||||||
</SettingItem>
|
|
||||||
</TransitionGroup>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
.setting-list-move,
|
|
||||||
.setting-list-enter-active,
|
|
||||||
.setting-list-leave-active {
|
|
||||||
--uno: transition-all-300;
|
|
||||||
}
|
|
||||||
|
|
||||||
.setting-list-enter-from,
|
|
||||||
.setting-list-leave-to {
|
|
||||||
--uno: opacity-0 -translate-x-30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.setting-list-leave-active {
|
|
||||||
--uno: absolute;
|
|
||||||
}
|
|
||||||
</style>
|
|
@@ -1,53 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import { computed } from 'vue';
|
|
||||||
import { useThemeStore } from '@/store/modules/theme';
|
|
||||||
import { $t } from '@/locales';
|
|
||||||
import SettingItem from '../../../components/setting-item.vue';
|
|
||||||
|
|
||||||
defineOptions({
|
|
||||||
name: 'SiderSettings'
|
|
||||||
});
|
|
||||||
|
|
||||||
const themeStore = useThemeStore();
|
|
||||||
|
|
||||||
const layoutMode = computed(() => themeStore.layout.mode);
|
|
||||||
const isMixLayoutMode = computed(() => layoutMode.value.includes('mix'));
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<NDivider>{{ $t('theme.layout.sider.title') }}</NDivider>
|
|
||||||
<TransitionGroup tag="div" name="setting-list" class="flex-col-stretch gap-12px">
|
|
||||||
<SettingItem v-if="layoutMode === 'vertical'" key="1" :label="$t('theme.layout.sider.width')">
|
|
||||||
<NInputNumber v-model:value="themeStore.sider.width" size="small" :step="1" class="w-120px" />
|
|
||||||
</SettingItem>
|
|
||||||
<SettingItem v-if="layoutMode === 'vertical'" key="2" :label="$t('theme.layout.sider.collapsedWidth')">
|
|
||||||
<NInputNumber v-model:value="themeStore.sider.collapsedWidth" size="small" :step="1" class="w-120px" />
|
|
||||||
</SettingItem>
|
|
||||||
<SettingItem v-if="isMixLayoutMode" key="3" :label="$t('theme.layout.sider.mixWidth')">
|
|
||||||
<NInputNumber v-model:value="themeStore.sider.mixWidth" size="small" :step="1" class="w-120px" />
|
|
||||||
</SettingItem>
|
|
||||||
<SettingItem v-if="isMixLayoutMode" key="4" :label="$t('theme.layout.sider.mixCollapsedWidth')">
|
|
||||||
<NInputNumber v-model:value="themeStore.sider.mixCollapsedWidth" size="small" :step="1" class="w-120px" />
|
|
||||||
</SettingItem>
|
|
||||||
<SettingItem v-if="layoutMode === 'vertical-mix'" key="5" :label="$t('theme.layout.sider.mixChildMenuWidth')">
|
|
||||||
<NInputNumber v-model:value="themeStore.sider.mixChildMenuWidth" size="small" :step="1" class="w-120px" />
|
|
||||||
</SettingItem>
|
|
||||||
</TransitionGroup>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
.setting-list-move,
|
|
||||||
.setting-list-enter-active,
|
|
||||||
.setting-list-leave-active {
|
|
||||||
--uno: transition-all-300;
|
|
||||||
}
|
|
||||||
|
|
||||||
.setting-list-enter-from,
|
|
||||||
.setting-list-leave-to {
|
|
||||||
--uno: opacity-0 -translate-x-30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.setting-list-leave-active {
|
|
||||||
--uno: absolute;
|
|
||||||
}
|
|
||||||
</style>
|
|
@@ -1,61 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import { resetCacheStrategyOptions, themeTabModeOptions } from '@/constants/app';
|
|
||||||
import { useThemeStore } from '@/store/modules/theme';
|
|
||||||
import { translateOptions } from '@/utils/common';
|
|
||||||
import { $t } from '@/locales';
|
|
||||||
import SettingItem from '../../../components/setting-item.vue';
|
|
||||||
|
|
||||||
defineOptions({
|
|
||||||
name: 'TabSettings'
|
|
||||||
});
|
|
||||||
|
|
||||||
const themeStore = useThemeStore();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<NDivider>{{ $t('theme.layout.tab.title') }}</NDivider>
|
|
||||||
<TransitionGroup tag="div" name="setting-list" class="flex-col-stretch gap-12px">
|
|
||||||
<SettingItem key="0" :label="$t('theme.layout.resetCacheStrategy.title')">
|
|
||||||
<NSelect
|
|
||||||
v-model:value="themeStore.resetCacheStrategy"
|
|
||||||
:options="translateOptions(resetCacheStrategyOptions)"
|
|
||||||
size="small"
|
|
||||||
class="w-120px"
|
|
||||||
/>
|
|
||||||
</SettingItem>
|
|
||||||
<SettingItem key="1" :label="$t('theme.layout.tab.visible')">
|
|
||||||
<NSwitch v-model:value="themeStore.tab.visible" />
|
|
||||||
</SettingItem>
|
|
||||||
<SettingItem v-if="themeStore.tab.visible" key="2" :label="$t('theme.layout.tab.cache')">
|
|
||||||
<NSwitch v-model:value="themeStore.tab.cache" />
|
|
||||||
</SettingItem>
|
|
||||||
<SettingItem v-if="themeStore.tab.visible" key="3" :label="$t('theme.layout.tab.height')">
|
|
||||||
<NInputNumber v-model:value="themeStore.tab.height" size="small" :step="1" class="w-120px" />
|
|
||||||
</SettingItem>
|
|
||||||
<SettingItem v-if="themeStore.tab.visible" key="4" :label="$t('theme.layout.tab.mode.title')">
|
|
||||||
<NSelect
|
|
||||||
v-model:value="themeStore.tab.mode"
|
|
||||||
:options="translateOptions(themeTabModeOptions)"
|
|
||||||
size="small"
|
|
||||||
class="w-120px"
|
|
||||||
/>
|
|
||||||
</SettingItem>
|
|
||||||
</TransitionGroup>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
.setting-list-move,
|
|
||||||
.setting-list-enter-active,
|
|
||||||
.setting-list-leave-active {
|
|
||||||
--uno: transition-all-300;
|
|
||||||
}
|
|
||||||
|
|
||||||
.setting-list-enter-from,
|
|
||||||
.setting-list-leave-to {
|
|
||||||
--uno: opacity-0 -translate-x-30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.setting-list-leave-active {
|
|
||||||
--uno: absolute;
|
|
||||||
}
|
|
||||||
</style>
|
|
157
src/layouts/modules/theme-drawer/modules/page-fun.vue
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { computed } from 'vue';
|
||||||
|
import {
|
||||||
|
resetCacheStrategyOptions,
|
||||||
|
themePageAnimationModeOptions,
|
||||||
|
themeScrollModeOptions,
|
||||||
|
themeTabModeOptions
|
||||||
|
} from '@/constants/app';
|
||||||
|
import { useThemeStore } from '@/store/modules/theme';
|
||||||
|
import { translateOptions } from '@/utils/common';
|
||||||
|
import { $t } from '@/locales';
|
||||||
|
import SettingItem from '../components/setting-item.vue';
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
|
name: 'PageFun'
|
||||||
|
});
|
||||||
|
|
||||||
|
const themeStore = useThemeStore();
|
||||||
|
|
||||||
|
const layoutMode = computed(() => themeStore.layout.mode);
|
||||||
|
|
||||||
|
const isMixLayoutMode = computed(() => layoutMode.value.includes('mix'));
|
||||||
|
|
||||||
|
const isWrapperScrollMode = computed(() => themeStore.layout.scrollMode === 'wrapper');
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<NDivider>{{ $t('theme.pageFunTitle') }}</NDivider>
|
||||||
|
<TransitionGroup tag="div" name="setting-list" class="flex-col-stretch gap-12px">
|
||||||
|
<SettingItem key="0" :label="$t('theme.resetCacheStrategy.title')">
|
||||||
|
<NSelect
|
||||||
|
v-model:value="themeStore.resetCacheStrategy"
|
||||||
|
:options="translateOptions(resetCacheStrategyOptions)"
|
||||||
|
size="small"
|
||||||
|
class="w-120px"
|
||||||
|
/>
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem key="1" :label="$t('theme.scrollMode.title')">
|
||||||
|
<NSelect
|
||||||
|
v-model:value="themeStore.layout.scrollMode"
|
||||||
|
:options="translateOptions(themeScrollModeOptions)"
|
||||||
|
size="small"
|
||||||
|
class="w-120px"
|
||||||
|
/>
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem key="1-1" :label="$t('theme.page.animate')">
|
||||||
|
<NSwitch v-model:value="themeStore.page.animate" />
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem v-if="themeStore.page.animate" key="1-2" :label="$t('theme.page.mode.title')">
|
||||||
|
<NSelect
|
||||||
|
v-model:value="themeStore.page.animateMode"
|
||||||
|
:options="translateOptions(themePageAnimationModeOptions)"
|
||||||
|
size="small"
|
||||||
|
class="w-120px"
|
||||||
|
/>
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem v-if="isWrapperScrollMode" key="2" :label="$t('theme.fixedHeaderAndTab')">
|
||||||
|
<NSwitch v-model:value="themeStore.fixedHeaderAndTab" />
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem key="3" :label="$t('theme.header.height')">
|
||||||
|
<NInputNumber v-model:value="themeStore.header.height" size="small" :step="1" class="w-120px" />
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem key="4" :label="$t('theme.header.breadcrumb.visible')">
|
||||||
|
<NSwitch v-model:value="themeStore.header.breadcrumb.visible" />
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem v-if="themeStore.header.breadcrumb.visible" key="4-1" :label="$t('theme.header.breadcrumb.showIcon')">
|
||||||
|
<NSwitch v-model:value="themeStore.header.breadcrumb.showIcon" />
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem key="5" :label="$t('theme.tab.visible')">
|
||||||
|
<NSwitch v-model:value="themeStore.tab.visible" />
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem v-if="themeStore.tab.visible" key="5-1" :label="$t('theme.tab.cache')">
|
||||||
|
<NSwitch v-model:value="themeStore.tab.cache" />
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem v-if="themeStore.tab.visible" key="5-2" :label="$t('theme.tab.height')">
|
||||||
|
<NInputNumber v-model:value="themeStore.tab.height" size="small" :step="1" class="w-120px" />
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem v-if="themeStore.tab.visible" key="5-3" :label="$t('theme.tab.mode.title')">
|
||||||
|
<NSelect
|
||||||
|
v-model:value="themeStore.tab.mode"
|
||||||
|
:options="translateOptions(themeTabModeOptions)"
|
||||||
|
size="small"
|
||||||
|
class="w-120px"
|
||||||
|
/>
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem v-if="layoutMode === 'vertical'" key="6-1" :label="$t('theme.sider.width')">
|
||||||
|
<NInputNumber v-model:value="themeStore.sider.width" size="small" :step="1" class="w-120px" />
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem v-if="layoutMode === 'vertical'" key="6-2" :label="$t('theme.sider.collapsedWidth')">
|
||||||
|
<NInputNumber v-model:value="themeStore.sider.collapsedWidth" size="small" :step="1" class="w-120px" />
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem v-if="isMixLayoutMode" key="6-3" :label="$t('theme.sider.mixWidth')">
|
||||||
|
<NInputNumber v-model:value="themeStore.sider.mixWidth" size="small" :step="1" class="w-120px" />
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem v-if="isMixLayoutMode" key="6-4" :label="$t('theme.sider.mixCollapsedWidth')">
|
||||||
|
<NInputNumber v-model:value="themeStore.sider.mixCollapsedWidth" size="small" :step="1" class="w-120px" />
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem v-if="layoutMode === 'vertical-mix'" key="6-5" :label="$t('theme.sider.mixChildMenuWidth')">
|
||||||
|
<NInputNumber v-model:value="themeStore.sider.mixChildMenuWidth" size="small" :step="1" class="w-120px" />
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem key="7" :label="$t('theme.footer.visible')">
|
||||||
|
<NSwitch v-model:value="themeStore.footer.visible" />
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem v-if="themeStore.footer.visible && isWrapperScrollMode" key="7-1" :label="$t('theme.footer.fixed')">
|
||||||
|
<NSwitch v-model:value="themeStore.footer.fixed" />
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem v-if="themeStore.footer.visible" key="7-2" :label="$t('theme.footer.height')">
|
||||||
|
<NInputNumber v-model:value="themeStore.footer.height" size="small" :step="1" class="w-120px" />
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem
|
||||||
|
v-if="themeStore.footer.visible && layoutMode === 'horizontal-mix'"
|
||||||
|
key="7-3"
|
||||||
|
:label="$t('theme.footer.right')"
|
||||||
|
>
|
||||||
|
<NSwitch v-model:value="themeStore.footer.right" />
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem 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.enableUserName')">
|
||||||
|
<NSwitch v-model:value="themeStore.watermark.enableUserName" />
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem v-if="themeStore.watermark.visible" key="8-2" :label="$t('theme.watermark.text')">
|
||||||
|
<NInput
|
||||||
|
v-model:value="themeStore.watermark.text"
|
||||||
|
autosize
|
||||||
|
type="text"
|
||||||
|
size="small"
|
||||||
|
class="w-120px"
|
||||||
|
placeholder="SoybeanAdmin"
|
||||||
|
/>
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem key="9" :label="$t('theme.header.multilingual.visible')">
|
||||||
|
<NSwitch v-model:value="themeStore.header.multilingual.visible" />
|
||||||
|
</SettingItem>
|
||||||
|
<SettingItem key="10" :label="$t('theme.header.globalSearch.visible')">
|
||||||
|
<NSwitch v-model:value="themeStore.header.globalSearch.visible" />
|
||||||
|
</SettingItem>
|
||||||
|
</TransitionGroup>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.setting-list-move,
|
||||||
|
.setting-list-enter-active,
|
||||||
|
.setting-list-leave-active {
|
||||||
|
--uno: transition-all-300;
|
||||||
|
}
|
||||||
|
|
||||||
|
.setting-list-enter-from,
|
||||||
|
.setting-list-leave-to {
|
||||||
|
--uno: opacity-0 -translate-x-30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.setting-list-leave-active {
|
||||||
|
--uno: absolute;
|
||||||
|
}
|
||||||
|
</style>
|
@@ -1,7 +1,7 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { useThemeStore } from '@/store/modules/theme';
|
import { useThemeStore } from '@/store/modules/theme';
|
||||||
import { $t } from '@/locales';
|
import { $t } from '@/locales';
|
||||||
import SettingItem from '../../../components/setting-item.vue';
|
import SettingItem from '../components/setting-item.vue';
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: 'ThemeColor'
|
name: 'ThemeColor'
|
||||||
@@ -34,16 +34,16 @@ const swatches: string[] = [
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<NDivider>{{ $t('theme.appearance.themeColor.title') }}</NDivider>
|
<NDivider>{{ $t('theme.themeColor.title') }}</NDivider>
|
||||||
<div class="flex-col-stretch gap-12px">
|
<div class="flex-col-stretch gap-12px">
|
||||||
<NTooltip placement="top-start">
|
<NTooltip placement="top-start">
|
||||||
<template #trigger>
|
<template #trigger>
|
||||||
<SettingItem key="recommend-color" :label="$t('theme.appearance.recommendColor')">
|
<SettingItem key="recommend-color" :label="$t('theme.recommendColor')">
|
||||||
<NSwitch v-model:value="themeStore.recommendColor" />
|
<NSwitch v-model:value="themeStore.recommendColor" />
|
||||||
</SettingItem>
|
</SettingItem>
|
||||||
</template>
|
</template>
|
||||||
<p>
|
<p>
|
||||||
<span class="pr-12px">{{ $t('theme.appearance.recommendColorDesc') }}</span>
|
<span class="pr-12px">{{ $t('theme.recommendColorDesc') }}</span>
|
||||||
<br />
|
<br />
|
||||||
<NButton
|
<NButton
|
||||||
text
|
text
|
||||||
@@ -57,14 +57,10 @@ const swatches: string[] = [
|
|||||||
</NButton>
|
</NButton>
|
||||||
</p>
|
</p>
|
||||||
</NTooltip>
|
</NTooltip>
|
||||||
<SettingItem
|
<SettingItem v-for="(_, key) in themeStore.themeColors" :key="key" :label="$t(`theme.themeColor.${key}`)">
|
||||||
v-for="(_, key) in themeStore.themeColors"
|
|
||||||
:key="key"
|
|
||||||
:label="$t(`theme.appearance.themeColor.${key}`)"
|
|
||||||
>
|
|
||||||
<template v-if="key === 'info'" #suffix>
|
<template v-if="key === 'info'" #suffix>
|
||||||
<NCheckbox v-model:checked="themeStore.isInfoFollowPrimary">
|
<NCheckbox v-model:checked="themeStore.isInfoFollowPrimary">
|
||||||
{{ $t('theme.appearance.themeColor.followPrimary') }}
|
{{ $t('theme.themeColor.followPrimary') }}
|
||||||
</NCheckbox>
|
</NCheckbox>
|
||||||
</template>
|
</template>
|
||||||
<NColorPicker
|
<NColorPicker
|
@@ -58,120 +58,101 @@ const local: App.I18n.Schema = {
|
|||||||
tokenExpired: 'The requested token has expired'
|
tokenExpired: 'The requested token has expired'
|
||||||
},
|
},
|
||||||
theme: {
|
theme: {
|
||||||
themeDrawerTitle: 'Theme Configuration',
|
themeSchema: {
|
||||||
tabs: {
|
title: 'Theme Schema',
|
||||||
appearance: 'Appearance',
|
light: 'Light',
|
||||||
layout: 'Layout',
|
dark: 'Dark',
|
||||||
general: 'General'
|
auto: 'Follow System'
|
||||||
},
|
},
|
||||||
appearance: {
|
grayscale: 'Grayscale',
|
||||||
themeSchema: {
|
colourWeakness: 'Colour Weakness',
|
||||||
title: 'Theme Schema',
|
layoutMode: {
|
||||||
light: 'Light',
|
title: 'Layout Mode',
|
||||||
dark: 'Dark',
|
vertical: 'Vertical Menu Mode',
|
||||||
auto: 'Follow System'
|
horizontal: 'Horizontal Menu Mode',
|
||||||
},
|
'vertical-mix': 'Vertical Mix Menu Mode',
|
||||||
grayscale: 'Grayscale',
|
'horizontal-mix': 'Horizontal Mix menu Mode',
|
||||||
colourWeakness: 'Colour Weakness',
|
reverseHorizontalMix: 'Reverse first level menus and child level menus position'
|
||||||
themeColor: {
|
|
||||||
title: 'Theme Color',
|
|
||||||
primary: 'Primary',
|
|
||||||
info: 'Info',
|
|
||||||
success: 'Success',
|
|
||||||
warning: 'Warning',
|
|
||||||
error: 'Error',
|
|
||||||
followPrimary: 'Follow Primary'
|
|
||||||
},
|
|
||||||
recommendColor: 'Apply Recommended Color Algorithm',
|
|
||||||
recommendColorDesc: 'The recommended color algorithm refers to'
|
|
||||||
},
|
},
|
||||||
layout: {
|
recommendColor: 'Apply Recommended Color Algorithm',
|
||||||
layoutMode: {
|
recommendColorDesc: 'The recommended color algorithm refers to',
|
||||||
title: 'Layout Mode',
|
themeColor: {
|
||||||
vertical: 'Vertical Menu Mode',
|
title: 'Theme Color',
|
||||||
horizontal: 'Horizontal Menu Mode',
|
primary: 'Primary',
|
||||||
'vertical-mix': 'Vertical Mix Menu Mode',
|
info: 'Info',
|
||||||
'horizontal-mix': 'Horizontal Mix menu Mode',
|
success: 'Success',
|
||||||
reverseHorizontalMix: 'Reverse first level menus and child level menus position'
|
warning: 'Warning',
|
||||||
},
|
error: 'Error',
|
||||||
tab: {
|
followPrimary: 'Follow Primary'
|
||||||
title: 'Tab Settings',
|
},
|
||||||
visible: 'Tab Visible',
|
scrollMode: {
|
||||||
cache: 'Tag Bar Info Cache',
|
title: 'Scroll Mode',
|
||||||
height: 'Tab Height',
|
wrapper: 'Wrapper',
|
||||||
mode: {
|
content: 'Content'
|
||||||
title: 'Tab Mode',
|
},
|
||||||
chrome: 'Chrome',
|
page: {
|
||||||
button: 'Button'
|
animate: 'Page Animate',
|
||||||
}
|
mode: {
|
||||||
},
|
title: 'Page Animate Mode',
|
||||||
header: {
|
fade: 'Fade',
|
||||||
title: 'Header Settings',
|
'fade-slide': 'Slide',
|
||||||
height: 'Header Height',
|
'fade-bottom': 'Fade Zoom',
|
||||||
breadcrumb: {
|
'fade-scale': 'Fade Scale',
|
||||||
visible: 'Breadcrumb Visible',
|
'zoom-fade': 'Zoom Fade',
|
||||||
showIcon: 'Breadcrumb Icon Visible'
|
'zoom-out': 'Zoom Out',
|
||||||
}
|
none: 'None'
|
||||||
},
|
|
||||||
sider: {
|
|
||||||
title: 'Sider Settings',
|
|
||||||
inverted: 'Dark Sider',
|
|
||||||
width: 'Sider Width',
|
|
||||||
collapsedWidth: 'Sider Collapsed Width',
|
|
||||||
mixWidth: 'Mix Sider Width',
|
|
||||||
mixCollapsedWidth: 'Mix Sider Collapse Width',
|
|
||||||
mixChildMenuWidth: 'Mix Child Menu Width'
|
|
||||||
},
|
|
||||||
footer: {
|
|
||||||
title: 'Footer Settings',
|
|
||||||
visible: 'Footer Visible',
|
|
||||||
fixed: 'Fixed Footer',
|
|
||||||
height: 'Footer Height',
|
|
||||||
right: 'Right Footer'
|
|
||||||
},
|
|
||||||
content: {
|
|
||||||
title: 'Content Area Settings',
|
|
||||||
scrollMode: {
|
|
||||||
title: 'Scroll Mode',
|
|
||||||
wrapper: 'Wrapper',
|
|
||||||
content: 'Content'
|
|
||||||
},
|
|
||||||
page: {
|
|
||||||
animate: 'Page Animate',
|
|
||||||
mode: {
|
|
||||||
title: 'Page Animate Mode',
|
|
||||||
fade: 'Fade',
|
|
||||||
'fade-slide': 'Slide',
|
|
||||||
'fade-bottom': 'Fade Zoom',
|
|
||||||
'fade-scale': 'Fade Scale',
|
|
||||||
'zoom-fade': 'Zoom Fade',
|
|
||||||
'zoom-out': 'Zoom Out',
|
|
||||||
none: 'None'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
fixedHeaderAndTab: 'Fixed Header And Tab'
|
|
||||||
},
|
|
||||||
resetCacheStrategy: {
|
|
||||||
title: 'Reset Cache Strategy',
|
|
||||||
close: 'Close Page',
|
|
||||||
refresh: 'Refresh Page'
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
general: {
|
fixedHeaderAndTab: 'Fixed Header And Tab',
|
||||||
watermark: {
|
header: {
|
||||||
visible: 'Watermark Full Screen Visible',
|
height: 'Header Height',
|
||||||
text: 'Watermark Text',
|
breadcrumb: {
|
||||||
enableUserName: 'Enable User Name Watermark'
|
visible: 'Breadcrumb Visible',
|
||||||
|
showIcon: 'Breadcrumb Icon Visible'
|
||||||
},
|
},
|
||||||
multilingual: {
|
multilingual: {
|
||||||
title: 'Multilingual Settings',
|
|
||||||
visible: 'Display multilingual button'
|
visible: 'Display multilingual button'
|
||||||
},
|
},
|
||||||
globalSearch: {
|
globalSearch: {
|
||||||
title: 'Global Search Settings',
|
|
||||||
visible: 'Display GlobalSearch button'
|
visible: 'Display GlobalSearch button'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
tab: {
|
||||||
|
visible: 'Tab Visible',
|
||||||
|
cache: 'Tag Bar Info Cache',
|
||||||
|
height: 'Tab Height',
|
||||||
|
mode: {
|
||||||
|
title: 'Tab Mode',
|
||||||
|
chrome: 'Chrome',
|
||||||
|
button: 'Button'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
sider: {
|
||||||
|
inverted: 'Dark Sider',
|
||||||
|
width: 'Sider Width',
|
||||||
|
collapsedWidth: 'Sider Collapsed Width',
|
||||||
|
mixWidth: 'Mix Sider Width',
|
||||||
|
mixCollapsedWidth: 'Mix Sider Collapse Width',
|
||||||
|
mixChildMenuWidth: 'Mix Child Menu Width'
|
||||||
|
},
|
||||||
|
footer: {
|
||||||
|
visible: 'Footer Visible',
|
||||||
|
fixed: 'Fixed Footer',
|
||||||
|
height: 'Footer Height',
|
||||||
|
right: 'Right Footer'
|
||||||
|
},
|
||||||
|
watermark: {
|
||||||
|
visible: 'Watermark Full Screen Visible',
|
||||||
|
text: 'Watermark Text',
|
||||||
|
enableUserName: 'Enable User Name Watermark'
|
||||||
|
},
|
||||||
|
themeDrawerTitle: 'Theme Configuration',
|
||||||
|
pageFunTitle: 'Page Function',
|
||||||
|
resetCacheStrategy: {
|
||||||
|
title: 'Reset Cache Strategy',
|
||||||
|
close: 'Close Page',
|
||||||
|
refresh: 'Refresh Page'
|
||||||
|
},
|
||||||
configOperation: {
|
configOperation: {
|
||||||
copyConfig: 'Copy Config',
|
copyConfig: 'Copy Config',
|
||||||
copySuccessMsg: 'Copy Success, Please replace the variable "themeSettings" in "src/theme/settings.ts"',
|
copySuccessMsg: 'Copy Success, Please replace the variable "themeSettings" in "src/theme/settings.ts"',
|
||||||
|
@@ -58,120 +58,101 @@ const local: App.I18n.Schema = {
|
|||||||
tokenExpired: 'token已过期'
|
tokenExpired: 'token已过期'
|
||||||
},
|
},
|
||||||
theme: {
|
theme: {
|
||||||
themeDrawerTitle: '主题配置',
|
themeSchema: {
|
||||||
tabs: {
|
title: '主题模式',
|
||||||
appearance: '外观',
|
light: '亮色模式',
|
||||||
layout: '布局',
|
dark: '暗黑模式',
|
||||||
general: '通用'
|
auto: '跟随系统'
|
||||||
},
|
},
|
||||||
appearance: {
|
grayscale: '灰色模式',
|
||||||
themeSchema: {
|
colourWeakness: '色弱模式',
|
||||||
title: '主题模式',
|
layoutMode: {
|
||||||
light: '亮色模式',
|
title: '布局模式',
|
||||||
dark: '暗黑模式',
|
vertical: '左侧菜单模式',
|
||||||
auto: '跟随系统'
|
'vertical-mix': '左侧菜单混合模式',
|
||||||
},
|
horizontal: '顶部菜单模式',
|
||||||
grayscale: '灰色模式',
|
'horizontal-mix': '顶部菜单混合模式',
|
||||||
colourWeakness: '色弱模式',
|
reverseHorizontalMix: '一级菜单与子级菜单位置反转'
|
||||||
themeColor: {
|
|
||||||
title: '主题颜色',
|
|
||||||
primary: '主色',
|
|
||||||
info: '信息色',
|
|
||||||
success: '成功色',
|
|
||||||
warning: '警告色',
|
|
||||||
error: '错误色',
|
|
||||||
followPrimary: '跟随主色'
|
|
||||||
},
|
|
||||||
recommendColor: '应用推荐算法的颜色',
|
|
||||||
recommendColorDesc: '推荐颜色的算法参照'
|
|
||||||
},
|
},
|
||||||
layout: {
|
recommendColor: '应用推荐算法的颜色',
|
||||||
layoutMode: {
|
recommendColorDesc: '推荐颜色的算法参照',
|
||||||
title: '布局模式',
|
themeColor: {
|
||||||
vertical: '左侧菜单模式',
|
title: '主题颜色',
|
||||||
'vertical-mix': '左侧菜单混合模式',
|
primary: '主色',
|
||||||
horizontal: '顶部菜单模式',
|
info: '信息色',
|
||||||
'horizontal-mix': '顶部菜单混合模式',
|
success: '成功色',
|
||||||
reverseHorizontalMix: '一级菜单与子级菜单位置反转'
|
warning: '警告色',
|
||||||
},
|
error: '错误色',
|
||||||
tab: {
|
followPrimary: '跟随主色'
|
||||||
title: '标签栏设置',
|
},
|
||||||
visible: '显示标签栏',
|
scrollMode: {
|
||||||
cache: '标签栏信息缓存',
|
title: '滚动模式',
|
||||||
height: '标签栏高度',
|
wrapper: '外层滚动',
|
||||||
mode: {
|
content: '主体滚动'
|
||||||
title: '标签栏风格',
|
},
|
||||||
chrome: '谷歌风格',
|
page: {
|
||||||
button: '按钮风格'
|
animate: '页面切换动画',
|
||||||
}
|
mode: {
|
||||||
},
|
title: '页面切换动画类型',
|
||||||
header: {
|
'fade-slide': '滑动',
|
||||||
title: '头部设置',
|
fade: '淡入淡出',
|
||||||
height: '头部高度',
|
'fade-bottom': '底部消退',
|
||||||
breadcrumb: {
|
'fade-scale': '缩放消退',
|
||||||
visible: '显示面包屑',
|
'zoom-fade': '渐变',
|
||||||
showIcon: '显示面包屑图标'
|
'zoom-out': '闪现',
|
||||||
}
|
none: '无'
|
||||||
},
|
|
||||||
sider: {
|
|
||||||
title: '侧边栏设置',
|
|
||||||
inverted: '深色侧边栏',
|
|
||||||
width: '侧边栏宽度',
|
|
||||||
collapsedWidth: '侧边栏折叠宽度',
|
|
||||||
mixWidth: '混合布局侧边栏宽度',
|
|
||||||
mixCollapsedWidth: '混合布局侧边栏折叠宽度',
|
|
||||||
mixChildMenuWidth: '混合布局子菜单宽度'
|
|
||||||
},
|
|
||||||
footer: {
|
|
||||||
title: '底部设置',
|
|
||||||
visible: '显示底部',
|
|
||||||
fixed: '固定底部',
|
|
||||||
height: '底部高度',
|
|
||||||
right: '底部局右'
|
|
||||||
},
|
|
||||||
content: {
|
|
||||||
title: '内容区域设置',
|
|
||||||
scrollMode: {
|
|
||||||
title: '滚动模式',
|
|
||||||
wrapper: '外层滚动',
|
|
||||||
content: '主体滚动'
|
|
||||||
},
|
|
||||||
page: {
|
|
||||||
animate: '页面切换动画',
|
|
||||||
mode: {
|
|
||||||
title: '页面切换动画类型',
|
|
||||||
'fade-slide': '滑动',
|
|
||||||
fade: '淡入淡出',
|
|
||||||
'fade-bottom': '底部消退',
|
|
||||||
'fade-scale': '缩放消退',
|
|
||||||
'zoom-fade': '渐变',
|
|
||||||
'zoom-out': '闪现',
|
|
||||||
none: '无'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
fixedHeaderAndTab: '固定头部和标签栏'
|
|
||||||
},
|
|
||||||
resetCacheStrategy: {
|
|
||||||
title: '重置缓存策略',
|
|
||||||
close: '关闭页面',
|
|
||||||
refresh: '刷新页面'
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
general: {
|
fixedHeaderAndTab: '固定头部和标签栏',
|
||||||
watermark: {
|
header: {
|
||||||
visible: '显示全屏水印',
|
height: '头部高度',
|
||||||
text: '水印文本',
|
breadcrumb: {
|
||||||
enableUserName: '启用用户名水印'
|
visible: '显示面包屑',
|
||||||
|
showIcon: '显示面包屑图标'
|
||||||
},
|
},
|
||||||
multilingual: {
|
multilingual: {
|
||||||
title: '多语言设置',
|
|
||||||
visible: '显示多语言按钮'
|
visible: '显示多语言按钮'
|
||||||
},
|
},
|
||||||
globalSearch: {
|
globalSearch: {
|
||||||
title: '全局搜索设置',
|
|
||||||
visible: '显示全局搜索按钮'
|
visible: '显示全局搜索按钮'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
tab: {
|
||||||
|
visible: '显示标签栏',
|
||||||
|
cache: '标签栏信息缓存',
|
||||||
|
height: '标签栏高度',
|
||||||
|
mode: {
|
||||||
|
title: '标签栏风格',
|
||||||
|
chrome: '谷歌风格',
|
||||||
|
button: '按钮风格'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
sider: {
|
||||||
|
inverted: '深色侧边栏',
|
||||||
|
width: '侧边栏宽度',
|
||||||
|
collapsedWidth: '侧边栏折叠宽度',
|
||||||
|
mixWidth: '混合布局侧边栏宽度',
|
||||||
|
mixCollapsedWidth: '混合布局侧边栏折叠宽度',
|
||||||
|
mixChildMenuWidth: '混合布局子菜单宽度'
|
||||||
|
},
|
||||||
|
footer: {
|
||||||
|
visible: '显示底部',
|
||||||
|
fixed: '固定底部',
|
||||||
|
height: '底部高度',
|
||||||
|
right: '底部局右'
|
||||||
|
},
|
||||||
|
watermark: {
|
||||||
|
visible: '显示全屏水印',
|
||||||
|
text: '水印文本',
|
||||||
|
enableUserName: '启用用户名水印'
|
||||||
|
},
|
||||||
|
themeDrawerTitle: '主题配置',
|
||||||
|
pageFunTitle: '页面功能',
|
||||||
|
resetCacheStrategy: {
|
||||||
|
title: '重置缓存策略',
|
||||||
|
close: '关闭页面',
|
||||||
|
refresh: '刷新页面'
|
||||||
|
},
|
||||||
configOperation: {
|
configOperation: {
|
||||||
copyConfig: '复制配置',
|
copyConfig: '复制配置',
|
||||||
copySuccessMsg: '复制成功,请替换 src/theme/settings.ts 中的变量 themeSettings',
|
copySuccessMsg: '复制成功,请替换 src/theme/settings.ts 中的变量 themeSettings',
|
||||||
|
113
src/typings/app.d.ts
vendored
@@ -358,82 +358,63 @@ declare namespace App {
|
|||||||
tokenExpired: string;
|
tokenExpired: string;
|
||||||
};
|
};
|
||||||
theme: {
|
theme: {
|
||||||
themeDrawerTitle: string;
|
themeSchema: { title: string } & Record<UnionKey.ThemeScheme, string>;
|
||||||
tabs: {
|
grayscale: string;
|
||||||
appearance: string;
|
colourWeakness: string;
|
||||||
layout: string;
|
layoutMode: { title: string; reverseHorizontalMix: string } & Record<UnionKey.ThemeLayoutMode, string>;
|
||||||
general: string;
|
recommendColor: string;
|
||||||
|
recommendColorDesc: string;
|
||||||
|
themeColor: {
|
||||||
|
title: string;
|
||||||
|
followPrimary: string;
|
||||||
|
} & Theme.ThemeColor;
|
||||||
|
scrollMode: { title: string } & Record<UnionKey.ThemeScrollMode, string>;
|
||||||
|
page: {
|
||||||
|
animate: string;
|
||||||
|
mode: { title: string } & Record<UnionKey.ThemePageAnimateMode, string>;
|
||||||
};
|
};
|
||||||
appearance: {
|
fixedHeaderAndTab: string;
|
||||||
themeSchema: { title: string } & Record<UnionKey.ThemeScheme, string>;
|
header: {
|
||||||
grayscale: string;
|
height: string;
|
||||||
colourWeakness: string;
|
breadcrumb: {
|
||||||
themeColor: {
|
|
||||||
title: string;
|
|
||||||
followPrimary: string;
|
|
||||||
} & Theme.ThemeColor;
|
|
||||||
recommendColor: string;
|
|
||||||
recommendColorDesc: string;
|
|
||||||
};
|
|
||||||
layout: {
|
|
||||||
layoutMode: { title: string; reverseHorizontalMix: string } & Record<UnionKey.ThemeLayoutMode, string>;
|
|
||||||
tab: {
|
|
||||||
title: string;
|
|
||||||
visible: string;
|
visible: string;
|
||||||
cache: string;
|
showIcon: string;
|
||||||
height: string;
|
|
||||||
mode: { title: string } & Record<UnionKey.ThemeTabMode, string>;
|
|
||||||
};
|
|
||||||
header: {
|
|
||||||
title: string;
|
|
||||||
height: string;
|
|
||||||
breadcrumb: {
|
|
||||||
visible: string;
|
|
||||||
showIcon: string;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
sider: {
|
|
||||||
title: string;
|
|
||||||
inverted: string;
|
|
||||||
width: string;
|
|
||||||
collapsedWidth: string;
|
|
||||||
mixWidth: string;
|
|
||||||
mixCollapsedWidth: string;
|
|
||||||
mixChildMenuWidth: string;
|
|
||||||
};
|
|
||||||
footer: {
|
|
||||||
title: string;
|
|
||||||
visible: string;
|
|
||||||
fixed: string;
|
|
||||||
height: string;
|
|
||||||
right: string;
|
|
||||||
};
|
|
||||||
content: {
|
|
||||||
title: string;
|
|
||||||
scrollMode: { title: string } & Record<UnionKey.ThemeScrollMode, string>;
|
|
||||||
page: {
|
|
||||||
animate: string;
|
|
||||||
mode: { title: string } & Record<UnionKey.ThemePageAnimateMode, string>;
|
|
||||||
};
|
|
||||||
fixedHeaderAndTab: string;
|
|
||||||
};
|
|
||||||
resetCacheStrategy: { title: string } & Record<UnionKey.ResetCacheStrategy, string>;
|
|
||||||
};
|
|
||||||
general: {
|
|
||||||
watermark: {
|
|
||||||
visible: string;
|
|
||||||
text: string;
|
|
||||||
enableUserName: string;
|
|
||||||
};
|
};
|
||||||
multilingual: {
|
multilingual: {
|
||||||
title: string;
|
|
||||||
visible: string;
|
visible: string;
|
||||||
};
|
};
|
||||||
globalSearch: {
|
globalSearch: {
|
||||||
title: string;
|
|
||||||
visible: string;
|
visible: string;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
tab: {
|
||||||
|
visible: string;
|
||||||
|
cache: string;
|
||||||
|
height: string;
|
||||||
|
mode: { title: string } & Record<UnionKey.ThemeTabMode, string>;
|
||||||
|
};
|
||||||
|
sider: {
|
||||||
|
inverted: string;
|
||||||
|
width: string;
|
||||||
|
collapsedWidth: string;
|
||||||
|
mixWidth: string;
|
||||||
|
mixCollapsedWidth: string;
|
||||||
|
mixChildMenuWidth: string;
|
||||||
|
};
|
||||||
|
footer: {
|
||||||
|
visible: string;
|
||||||
|
fixed: string;
|
||||||
|
height: string;
|
||||||
|
right: string;
|
||||||
|
};
|
||||||
|
watermark: {
|
||||||
|
visible: string;
|
||||||
|
text: string;
|
||||||
|
enableUserName: string;
|
||||||
|
};
|
||||||
|
themeDrawerTitle: string;
|
||||||
|
pageFunTitle: string;
|
||||||
|
resetCacheStrategy: { title: string } & Record<UnionKey.ResetCacheStrategy, string>;
|
||||||
configOperation: {
|
configOperation: {
|
||||||
copyConfig: string;
|
copyConfig: string;
|
||||||
copySuccessMsg: string;
|
copySuccessMsg: string;
|
||||||
|