diff --git a/.editorconfig b/.editorconfig
index da599f40..9d08a1a8 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -3,10 +3,7 @@ root = true
[*]
charset = utf-8
indent_style = space
-indent_size = 4
+indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
-
-[*.md]
-trim_trailing_whitespace = false
diff --git a/.env.example b/.env.example
index ab9e6cd5..7ea58d8f 100644
--- a/.env.example
+++ b/.env.example
@@ -10,10 +10,8 @@ VITE_APP_API_BASEURL = /
VITE_APP_DEBUG_TOOL =
# 是否在打包时启用 Mock
-VITE_BUILD_MOCK = true
+VITE_BUILD_MOCK = false
# 是否在打包时生成 sourcemap
VITE_BUILD_SOURCEMAP = false
-# 是否在打包时删除 console 代码
-VITE_BUILD_DROP_CONSOLE = true
# 是否在打包时开启压缩,支持 gzip 和 brotli
VITE_BUILD_COMPRESS = gzip,brotli
diff --git a/.env.production b/.env.production
deleted file mode 100644
index 17fad7c5..00000000
--- a/.env.production
+++ /dev/null
@@ -1,17 +0,0 @@
-NODE_ENV = production
-
-# 页面标题
-VITE_APP_TITLE = Fantastic-admin 基础版
-# 接口请求地址,会设置到 axios 的 baseURL 参数上
-VITE_APP_API_BASEURL = /
-# 调试工具,可设置 eruda 或 vconsole,如果不需要开启则留空
-VITE_APP_DEBUG_TOOL =
-
-# 是否在打包时启用 Mock
-VITE_BUILD_MOCK = false
-# 是否在打包时生成 sourcemap
-VITE_BUILD_SOURCEMAP = false
-# 是否在打包时删除 console 代码
-VITE_BUILD_DROP_CONSOLE = true
-# 是否在打包时开启压缩,支持 gzip 和 brotli
-VITE_BUILD_COMPRESS = gzip,brotli
diff --git a/.env.test b/.env.test
deleted file mode 100644
index 9a2b3b61..00000000
--- a/.env.test
+++ /dev/null
@@ -1,17 +0,0 @@
-NODE_ENV = production
-
-# 页面标题
-VITE_APP_TITLE = Fantastic-admin 专业版
-# 接口请求地址,会设置到 axios 的 baseURL 参数上
-VITE_APP_API_BASEURL = /
-# 调试工具,可设置 eruda 或 vconsole,如果不需要开启则留空
-VITE_APP_DEBUG_TOOL =
-
-# 是否在打包时启用 Mock
-VITE_BUILD_MOCK = true
-# 是否在打包时生成 sourcemap
-VITE_BUILD_SOURCEMAP = true
-# 是否在打包时删除 console 代码
-VITE_BUILD_DROP_CONSOLE = true
-# 是否在打包时开启压缩,支持 gzip 和 brotli
-VITE_BUILD_COMPRESS = gzip,brotli
diff --git a/.eslintignore b/.eslintignore
index 58ce8430..1eae0cf6 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -1,4 +1,2 @@
dist/
node_modules/
-babel.config.js
-.eslintrc.js
diff --git a/.eslintrc b/.eslintrc
new file mode 100644
index 00000000..09c2e423
--- /dev/null
+++ b/.eslintrc
@@ -0,0 +1,3 @@
+{
+ "extends": "@antfu"
+}
diff --git a/.eslintrc.js b/.eslintrc.js
deleted file mode 100644
index 3f4cb551..00000000
--- a/.eslintrc.js
+++ /dev/null
@@ -1,101 +0,0 @@
-module.exports = {
- root: true,
- env: {
- browser: true,
- es6: true
- },
- globals: {
- __dirname: true,
- process: true,
- require: true,
- module: true,
- // element-plus
- ElMessage: true,
- ElMessageBox: true,
- ElNotification: true,
- ElLoading: true
- },
- extends: [
- 'plugin:vue/vue3-recommended',
- 'plugin:vue/vue3-strongly-recommended',
- 'eslint:recommended',
- './.eslintrc-auto-import.json'
- ],
- parser: 'vue-eslint-parser',
- parserOptions: {
- ecmaVersion: '2020',
- ecmaFeatures: {
- jsx: true
- }
- },
- rules: {
- // 代码风格
- 'block-spacing': [2, 'always'],
- 'brace-style': [2, '1tbs', {
- 'allowSingleLine': true
- }],
- 'comma-spacing': [2, {
- 'before': false,
- 'after': true
- }],
- 'comma-dangle': [2, 'never'],
- 'comma-style': [2, 'last'],
- 'computed-property-spacing': [2, 'never'],
- 'indent': [2, 4, {
- 'SwitchCase': 1
- }],
- 'key-spacing': [2, {
- 'beforeColon': false,
- 'afterColon': true
- }],
- 'keyword-spacing': [2, {
- 'before': true,
- 'after': true
- }],
- 'linebreak-style': 0,
- 'multiline-ternary': [2, 'always-multiline'],
- 'no-multiple-empty-lines': [2, {
- 'max': 1
- }],
- 'no-unneeded-ternary': [2, {
- 'defaultAssignment': false
- }],
- 'quotes': [2, 'single'],
- 'semi': [2, 'never'],
- 'space-before-blocks': [2, 'always'],
- 'space-before-function-paren': [2, 'never'],
- 'space-in-parens': [2, 'never'],
- 'space-infix-ops': 2,
- 'space-unary-ops': [2, {
- 'words': true,
- 'nonwords': false
- }],
- 'spaced-comment': [2, 'always', {
- 'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']
- }],
- 'switch-colon-spacing': [2, {
- 'after': true,
- 'before': false
- }],
- 'object-curly-spacing': [2, 'always'],
- // ES6
- 'arrow-parens': [2, 'as-needed'],
- 'arrow-spacing': [2, {
- 'before': true,
- 'after': true
- }],
- // Vue - https://github.com/vuejs/eslint-plugin-vue
- 'vue/multi-word-component-names': 0,
- 'vue/html-indent': [2, 4],
- 'vue/no-v-html': 0,
- 'vue/max-attributes-per-line': 0,
- 'vue/require-default-prop': 0,
- 'vue/singleline-html-element-content-newline': 0,
- 'vue/require-explicit-emits': [2, {
- 'allowProps': true
- }],
- 'vue/script-indent': [2, 4, {
- 'switchCase': 1
- }]
- }
-};
diff --git a/.gitignore b/.gitignore
index c66a0a66..165d220b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,5 @@ node_modules
dist*
dist-ssr
*.local
-.eslintrc-auto-import.json
-public/icons
src/assets/sprites/*.*
+!src/assets/sprites/.gitkeep
diff --git a/.lintstagedrc b/.lintstagedrc
index b35aaba8..fc89276a 100644
--- a/.lintstagedrc
+++ b/.lintstagedrc
@@ -1,5 +1,5 @@
{
- "src/**/*.{js,jsx}": "eslint --fix",
- "src/**/*.{css,scss}": "stylelint --fix --allow-empty-input",
- "src/**/*.vue": ["eslint --fix", "stylelint --fix --allow-empty-input"]
+ "src/**/*.{js,jsx,ts,tsx}": "eslint --fix",
+ "src/**/*.{css,scss}": "stylelint --fix --allow-empty-input",
+ "src/**/*.vue": ["eslint --fix", "stylelint --fix --allow-empty-input"]
}
diff --git a/.npmrc b/.npmrc
new file mode 100644
index 00000000..cf040424
--- /dev/null
+++ b/.npmrc
@@ -0,0 +1,2 @@
+shamefully-hoist=true
+strict-peer-dependencies=false
diff --git a/.stylelintrc b/.stylelintrc
index a848b996..f397ec98 100644
--- a/.stylelintrc
+++ b/.stylelintrc
@@ -1,48 +1,23 @@
{
- "extends": [
- "stylelint-config-standard",
- "stylelint-config-recommended-vue/scss"
- ],
- "overrides": [
- {
- "files": ["**/*.scss"],
- "customSyntax": "postcss-scss"
- }
- ],
- "plugins": [
- "stylelint-scss"
- ],
- "rules": {
- "indentation": 4,
- "rule-empty-line-before": "never",
- "at-rule-empty-line-before": "never",
- "at-rule-no-unknown": null,
- "no-descending-specificity": null,
- "selector-pseudo-class-no-unknown": null,
- "property-no-unknown": null,
- "font-family-no-missing-generic-family-keyword": null,
- "selector-id-pattern": null,
- "selector-class-pattern": null,
- "scss/no-global-function-names": null,
- "scss/at-import-partial-extension": null,
- "function-no-unknown": [
- true,
- {
- "ignoreFunctions": [
- "v-bind",
- "lighten",
- "darken"
- ]
- }
- ],
- "property-no-vendor-prefix": [
- true,
- {
- "ignoreProperties": [
- "mask-image"
- ]
- }
- ],
- "max-line-length": null
+ "extends": [
+ "stylelint-config-standard",
+ "stylelint-config-standard-vue/scss"
+ ],
+ "overrides": [
+ {
+ "files": ["**/*.scss"],
+ "customSyntax": "postcss-scss"
}
+ ],
+ "plugins": [
+ "stylelint-scss"
+ ],
+ "rules": {
+ "at-rule-no-unknown": null,
+ "no-descending-specificity": null,
+ "property-no-unknown": null,
+ "font-family-no-missing-generic-family-keyword": null,
+ "selector-class-pattern": null,
+ "max-line-length": null
+ }
}
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
index bd128e51..fef58956 100644
--- a/.vscode/extensions.json
+++ b/.vscode/extensions.json
@@ -1,9 +1,9 @@
{
- "recommendations": [
- "EditorConfig.EditorConfig",
- "mikestead.dotenv",
- "dbaeumer.vscode-eslint",
- "stylelint.vscode-stylelint",
- "vue.volar"
- ]
+ "recommendations": [
+ "EditorConfig.EditorConfig",
+ "mikestead.dotenv",
+ "dbaeumer.vscode-eslint",
+ "stylelint.vscode-stylelint",
+ "vue.volar"
+ ]
}
diff --git a/.vscode/settings.json b/.vscode/settings.json
index f1783033..e5e29ce4 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,7 +1,7 @@
{
- "editor.codeActionsOnSave": {
- "source.fixAll.eslint": true,
- "source.fixAll.stylelint": true
- },
- "stylelint.validate": ["css", "scss", "vue"]
+ "editor.codeActionsOnSave": {
+ "source.fixAll.eslint": true,
+ "source.fixAll.stylelint": true
+ },
+ "stylelint.validate": ["css", "scss", "vue"]
}
diff --git a/index.html b/index.html
index b673219b..c801c4c5 100644
--- a/index.html
+++ b/index.html
@@ -1,78 +1,40 @@
-
-
-
-
-
- <%= title %>
- <%- copyrightScript %>
- <% if (appMode == 'example') { %>
-
- <% } %>
-
-
-
-
-
+
+
+
+
+
+
<%= title %>
+ <%- copyrightScript %>
+
+
+
+
+
-
-
- <% if (debugTool == 'eruda') { %>
-
-
- <% } %>
- <% if (debugTool == 'vconsole') { %>
-
-
- <% } %>
-
+
<%= title %>载入中…
+
+
+
+ <%- loadingScript %>
+
+ <%- devtoolScript %>
+
diff --git a/jsconfig.json b/jsconfig.json
deleted file mode 100644
index bfb2bc61..00000000
--- a/jsconfig.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "compilerOptions": {
- "target": "es2017",
- "allowSyntheticDefaultImports": false,
- "baseUrl": "./",
- "paths": {
- "@/*": ["src/*"]
- },
- "jsx": "preserve"
- },
- "exclude": ["node_modules", "dist", "dist-test"]
-}
diff --git a/package.json b/package.json
index df044936..edba3dba 100644
--- a/package.json
+++ b/package.json
@@ -1,79 +1,77 @@
{
- "name": "fantastic-admin",
- "version": "0.1.0",
- "scripts": {
- "dev": "vite",
- "build:test": "vite build --mode test",
- "build": "vite build",
- "build:example": "vite build --mode example",
- "serve:test": "http-server ./dist-test -o",
- "serve": "http-server ./dist -o",
- "serve:example": "http-server ./dist-example -o",
- "svgo": "svgo -f src/assets/icons",
- "new": "plop",
- "lint:eslint": "eslint src/**/*.{js,vue} --fix",
- "lint:stylelint": "stylelint src/**/*.{css,scss,vue} --fix",
- "prepare": "husky install",
- "postinstall": "esno scripts/prepare.js",
- "preinstall": "npx only-allow pnpm"
- },
- "dependencies": {
- "@tinymce/tinymce-vue": "^5.0.0",
- "@vueuse/core": "^9.2.0",
- "@vueuse/integrations": "^9.2.0",
- "axios": "^0.27.2",
- "dayjs": "^1.11.5",
- "element-plus": "^2.2.16",
- "hotkeys-js": "^3.10.0",
- "js-cookie": "^3.0.1",
- "mavon-editor": "^3.0.0-beta",
- "mitt": "^3.0.0",
- "mockjs": "^1.1.0",
- "nprogress": "^0.2.0",
- "path-browserify": "^1.0.1",
- "path-to-regexp": "^6.2.1",
- "pinia": "^2.0.22",
- "qs": "^6.11.0",
- "tinymce": "^6.2.0",
- "vue": "^3.2.39",
- "vue-router": "^4.1.3"
- },
- "devDependencies": {
- "@iconify-json/ep": "^1.1.7",
- "@iconify/vue": "^4.0.0",
- "@vitejs/plugin-vue": "^3.1.0",
- "@vitejs/plugin-vue-jsx": "^2.0.1",
- "@vue/compiler-sfc": "^3.2.39",
- "eslint": "^8.23.1",
- "eslint-plugin-vue": "^9.3.0",
- "esno": "^0.16.3",
- "fs-extra": "^10.1.0",
- "http-server": "^14.1.1",
- "husky": "^8.0.1",
- "lint-staged": "^13.0.3",
- "plop": "^3.1.1",
- "postcss-html": "^1.5.0",
- "postcss-scss": "^4.0.5",
- "sass": "^1.54.9",
- "stylelint": "^14.10.0",
- "stylelint-config-recommended-scss": "^7.0.0",
- "stylelint-config-recommended-vue": "^1.4.0",
- "stylelint-config-standard": "^28.0.0",
- "stylelint-scss": "^4.3.0",
- "svgo": "^2.8.0",
- "unplugin-auto-import": "^0.11.2",
- "unplugin-vue-components": "^0.22.7",
- "vite": "^3.1.1",
- "vite-plugin-banner": "^0.5.0",
- "vite-plugin-compression": "^0.5.1",
- "vite-plugin-html": "^3.2.0",
- "vite-plugin-mock": "^2.9.6",
- "vite-plugin-pages": "^0.26.0",
- "vite-plugin-restart": "^0.2.0",
- "vite-plugin-spritesmith": "^0.1.1",
- "vite-plugin-svg-icons": "^2.0.1",
- "vite-plugin-vue-layouts": "^0.6.0",
- "vite-plugin-vue-setup-extend": "^0.4.0",
- "vue-eslint-parser": "^9.1.0"
- }
+ "version": "1.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build:example": "vue-tsc --noEmit && vite build --mode example",
+ "serve:example": "http-server ./dist-example -o",
+ "svgo": "svgo -f src/assets/icons",
+ "new": "plop",
+ "lint:eslint": "eslint src/**/*.{ts,tsx,vue} --fix",
+ "lint:stylelint": "stylelint src/**/*.{css,scss,vue} --fix",
+ "prepare": "husky install",
+ "postinstall": "esno scripts/prepare.js",
+ "preinstall": "npx only-allow pnpm"
+ },
+ "dependencies": {
+ "@tinymce/tinymce-vue": "^5.0.0",
+ "@vueuse/core": "^9.2.0",
+ "@vueuse/integrations": "^9.2.0",
+ "axios": "^0.27.2",
+ "dayjs": "^1.11.5",
+ "element-plus": "^2.2.17",
+ "hotkeys-js": "^3.10.0",
+ "lodash-es": "^4.17.21",
+ "mitt": "^3.0.0",
+ "mockjs": "^1.1.0",
+ "nprogress": "^0.2.0",
+ "path-browserify": "^1.0.1",
+ "path-to-regexp": "^6.2.1",
+ "pinia": "^2.0.22",
+ "qs": "^6.11.0",
+ "tinymce": "^6.2.0",
+ "vue": "^3.2.39",
+ "vue-router": "^4.1.5"
+ },
+ "devDependencies": {
+ "@antfu/eslint-config": "^0.27.0",
+ "@iconify-json/ep": "^1.1.7",
+ "@iconify/vue": "^4.0.0",
+ "@types/nprogress": "^0.2.0",
+ "@types/path-browserify": "^1.0.0",
+ "@types/qs": "^6.9.7",
+ "@vitejs/plugin-vue": "^3.1.0",
+ "@vitejs/plugin-vue-jsx": "^2.0.1",
+ "autoprefixer": "^10.4.12",
+ "eslint": "^8.24.0",
+ "esno": "^0.16.3",
+ "fs-extra": "^10.1.0",
+ "http-server": "^14.1.1",
+ "husky": "^8.0.1",
+ "lint-staged": "^13.0.3",
+ "plop": "^3.1.1",
+ "postcss-html": "^1.5.0",
+ "postcss-scss": "^4.0.5",
+ "sass": "^1.55.0",
+ "stylelint": "^14.12.1",
+ "stylelint-config-standard": "^28.0.0",
+ "stylelint-config-standard-scss": "^5.0.0",
+ "stylelint-config-standard-vue": "^1.0.0",
+ "stylelint-scss": "^4.3.0",
+ "svgo": "^2.8.0",
+ "typescript": "^4.8.3",
+ "unplugin-auto-import": "^0.11.2",
+ "unplugin-vue-components": "^0.22.7",
+ "vite": "^3.1.3",
+ "vite-plugin-banner": "^0.5.0",
+ "vite-plugin-compression": "^0.5.1",
+ "vite-plugin-html": "^3.2.0",
+ "vite-plugin-mock": "^2.9.6",
+ "vite-plugin-pages": "^0.26.0",
+ "vite-plugin-restart": "^0.2.0",
+ "vite-plugin-spritesmith": "^0.1.1",
+ "vite-plugin-svg-icons": "^2.0.1",
+ "vite-plugin-vue-layouts": "^0.6.0",
+ "vite-plugin-vue-setup-extend": "^0.4.0",
+ "vue-tsc": "^0.40.13"
+ }
}
diff --git a/plop-templates/component/index.hbs b/plop-templates/component/index.hbs
index 2ca042bb..cc1916c9 100644
--- a/plop-templates/component/index.hbs
+++ b/plop-templates/component/index.hbs
@@ -1,12 +1,11 @@
-
-
-
-
+
+
+
\ No newline at end of file
diff --git a/src/assets/icons/eye-open.svg b/src/assets/icons/eye-open.svg
deleted file mode 100644
index b80fd2b6..00000000
--- a/src/assets/icons/eye-open.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/assets/icons/eye.svg b/src/assets/icons/eye.svg
deleted file mode 100644
index 16ed2d87..00000000
--- a/src/assets/icons/eye.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/assets/icons/password.svg b/src/assets/icons/password.svg
deleted file mode 100644
index e291d85d..00000000
--- a/src/assets/icons/password.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/assets/icons/sidebar-element.svg b/src/assets/icons/sidebar-element.svg
deleted file mode 100644
index 6965ced0..00000000
--- a/src/assets/icons/sidebar-element.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/assets/icons/sidebar-permission.svg b/src/assets/icons/sidebar-permission.svg
deleted file mode 100644
index 2f812c4f..00000000
--- a/src/assets/icons/sidebar-permission.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/assets/icons/user.svg b/src/assets/icons/user.svg
deleted file mode 100644
index 0ba0716a..00000000
--- a/src/assets/icons/user.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/assets/sprites/.gitkeep b/src/assets/sprites/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/src/assets/sprites/example/address.png b/src/assets/sprites/example/address.png
deleted file mode 100644
index 2b5d1db3..00000000
Binary files a/src/assets/sprites/example/address.png and /dev/null differ
diff --git a/src/assets/sprites/example/feedback.png b/src/assets/sprites/example/feedback.png
deleted file mode 100644
index 065b55dd..00000000
Binary files a/src/assets/sprites/example/feedback.png and /dev/null differ
diff --git a/src/assets/sprites/example/payment.png b/src/assets/sprites/example/payment.png
deleted file mode 100644
index 1c2f680a..00000000
Binary files a/src/assets/sprites/example/payment.png and /dev/null differ
diff --git a/src/assets/styles/element-plus/dark.scss b/src/assets/styles/element-plus/dark.scss
index 1e3ddf33..c20a369e 100644
--- a/src/assets/styles/element-plus/dark.scss
+++ b/src/assets/styles/element-plus/dark.scss
@@ -1,9 +1,10 @@
// 暗黑模式
@forward "element-plus/theme-chalk/src/dark/var.scss" with (
- $bg-color: (
- "page": #0a0a0a,
- "": #141414,
- "overlay": #1d1e1f,
- )
+ $bg-color: (
+ "page": #0a0a0a,
+ "": #141414,
+ "overlay": #1d1e1f,
+ )
);
+
@use "element-plus/theme-chalk/src/dark/css-vars.scss" as *;
diff --git a/src/assets/styles/element-plus/index.scss b/src/assets/styles/element-plus/index.scss
index 14cacee8..4ff67107 100644
--- a/src/assets/styles/element-plus/index.scss
+++ b/src/assets/styles/element-plus/index.scss
@@ -1,9 +1,10 @@
// @forward "element-plus/theme-chalk/src/common/var.scss" with (
-// $colors: (
-// "primary": (
-// "base": green
-// )
+// $colors: (
+// "primary": (
+// "base": green
// )
+// )
// );
+
@use "element-plus/theme-chalk/src/index.scss" as *;
@use "./dark.scss";
diff --git a/src/assets/styles/globals.scss b/src/assets/styles/globals.scss
index ae012a7f..fedf28c6 100644
--- a/src/assets/styles/globals.scss
+++ b/src/assets/styles/globals.scss
@@ -3,73 +3,82 @@
// 全局变量
:root {
- // 头部宽度(默认自适应宽度,可固定宽度,固定宽度后为居中显示)
- --g-header-width: 100%;
- // 头部高度
- --g-header-height: 70px;
- // 侧边栏宽度
- --g-main-sidebar-width: 70px;
- --g-sub-sidebar-width: 220px;
- // 侧边栏Logo高度
- --g-sidebar-logo-height: 50px;
- // 顶栏高度
- --g-topbar-height: 50px;
+ // 头部宽度(默认自适应宽度,可固定宽度,固定宽度后为居中显示)
+ --g-header-width: 100%;
+ // 头部高度
+ --g-header-height: 70px;
+ // 侧边栏宽度
+ --g-main-sidebar-width: 70px;
+ --g-sub-sidebar-width: 220px;
+ // 侧边栏Logo高度
+ --g-sidebar-logo-height: 50px;
+ // 顶栏高度
+ --g-topbar-height: 50px;
}
// 全局样式
::-webkit-scrollbar {
- width: 12px;
- height: 12px;
+ width: 12px;
+ height: 12px;
}
+
::-webkit-scrollbar-thumb {
- background-color: rgb(0 0 0 / 40%);
- background-clip: padding-box;
- border: 3px solid transparent;
- border-radius: 6px;
+ background-color: rgb(0 0 0 / 40%);
+ background-clip: padding-box;
+ border: 3px solid transparent;
+ border-radius: 6px;
}
+
::-webkit-scrollbar-thumb:hover {
- background-color: rgb(0 0 0 / 50%);
+ background-color: rgb(0 0 0 / 50%);
}
+
::-webkit-scrollbar-track {
- background-color: transparent;
+ background-color: transparent;
}
+
html,
body {
- height: 100%;
+ height: 100%;
}
+
body {
- margin: 0;
- box-sizing: border-box;
- font-family: Lato, "PingFang SC", "Microsoft YaHei", sans-serif;
- -webkit-tap-highlight-color: transparent;
- &.hidden {
- overflow: hidden;
- }
+ margin: 0;
+ box-sizing: border-box;
+ font-family: Lato, "PingFang SC", "Microsoft YaHei", sans-serif;
+ -webkit-tap-highlight-color: transparent;
+
+ &.hidden {
+ overflow: hidden;
+ }
}
+
* {
- box-sizing: inherit;
+ box-sizing: inherit;
}
// 右侧内容区针对fixed元素,有横向铺满的需求,可在fixed元素上设置 [data-fixed-calc-width]
[data-fixed-calc-width] {
- position: fixed;
- left: 50%;
- right: 0;
- width: calc(100% - var(--g-main-sidebar-actual-width) - var(--g-sub-sidebar-actual-width));
- transform: translateX(-50%) translateX(calc(var(--g-main-sidebar-actual-width) / 2)) translateX(calc(var(--g-sub-sidebar-actual-width) / 2));
+ position: fixed;
+ left: 50%;
+ right: 0;
+ width: calc(100% - var(--g-main-sidebar-actual-width) - var(--g-sub-sidebar-actual-width));
+ transform: translateX(-50%) translateX(calc(var(--g-main-sidebar-actual-width) / 2)) translateX(calc(var(--g-sub-sidebar-actual-width) / 2));
}
+
[data-mode="mobile"] {
- [data-fixed-calc-width] {
- width: 100% !important;
- transform: translateX(-50%) !important;
- }
+ [data-fixed-calc-width] {
+ width: 100% !important;
+ transform: translateX(-50%) !important;
+ }
}
// textarea 字体跟随系统
textarea {
- font-family: inherit;
+ font-family: inherit;
}
// 列表页全局样式
.el-table.list-table {
- margin: 20px 0;
- .el-button + .el-dropdown {
- margin-left: 10px;
- }
+ margin: 20px 0;
+
+ .el-button + .el-dropdown {
+ margin-left: 10px;
+ }
}
diff --git a/src/assets/styles/nprogress.scss b/src/assets/styles/nprogress.scss
index a96b4945..9947aa68 100644
--- a/src/assets/styles/nprogress.scss
+++ b/src/assets/styles/nprogress.scss
@@ -1,55 +1,63 @@
#nprogress {
- pointer-events: none;
- .bar {
- position: fixed;
- z-index: 1031;
- top: 0;
- left: 0;
- width: 100%;
- height: 2px;
- background: var(--g-nprogress-color);
- }
- .peg {
- display: block;
- position: absolute;
- right: 0;
- width: 100px;
- height: 100%;
- opacity: 1;
- transform: rotate(3deg) translate(0, -4px);
- box-shadow: 0 0 10px var(--g-nprogress-color), 0 0 5px var(--g-nprogress-color);
- }
- .spinner {
- display: block;
- position: fixed;
- z-index: 1031;
- top: 11px;
- right: 14px;
- .spinner-icon {
- width: 18px;
- height: 18px;
- box-sizing: border-box;
- border: solid 2px transparent;
- border-radius: 50%;
- animation: nprogress-spinner 400ms linear infinite;
- border-top-color: var(--g-nprogress-color);
- border-left-color: var(--g-nprogress-color);
- }
+ pointer-events: none;
+
+ .bar {
+ position: fixed;
+ z-index: 1031;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 2px;
+ background: var(--g-nprogress-color);
+ }
+
+ .peg {
+ display: block;
+ position: absolute;
+ right: 0;
+ width: 100px;
+ height: 100%;
+ opacity: 1;
+ transform: rotate(3deg) translate(0, -4px);
+ box-shadow: 0 0 10px var(--g-nprogress-color), 0 0 5px var(--g-nprogress-color);
+ }
+
+ .spinner {
+ display: block;
+ position: fixed;
+ z-index: 1031;
+ top: 11px;
+ right: 14px;
+
+ .spinner-icon {
+ width: 18px;
+ height: 18px;
+ box-sizing: border-box;
+ border: solid 2px transparent;
+ border-radius: 50%;
+ animation: nprogress-spinner 400ms linear infinite;
+ border-top-color: var(--g-nprogress-color);
+ border-left-color: var(--g-nprogress-color);
}
+ }
}
+
.nprogress-custom-parent {
- overflow: hidden;
- position: relative;
- #nprogress .spinner,
- #nprogress .bar {
- position: absolute;
- }
+ overflow: hidden;
+ position: relative;
+
+ #nprogress .spinner,
+ #nprogress .bar {
+ position: absolute;
+ }
}
+
@keyframes nprogress-spinner {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
}
+
@keyframes nprogress-spinner {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
}
diff --git a/src/assets/styles/resources/utils.scss b/src/assets/styles/resources/utils.scss
index 40d054ac..ce32009a 100644
--- a/src/assets/styles/resources/utils.scss
+++ b/src/assets/styles/resources/utils.scss
@@ -1,50 +1,55 @@
// 文字超出隐藏,默认为单行超出隐藏,可设置多行
@mixin text-overflow($line: 1, $fixed-width: true) {
- @if ($line == 1 and $fixed-width == true) {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
- @else {
- /* stylelint-disable-next-line value-no-vendor-prefix */
- display: -webkit-box;
- -webkit-box-orient: vertical;
- -webkit-line-clamp: $line;
- overflow: hidden;
- }
+ @if ($line == 1 and $fixed-width == true) {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+
+ @else {
+ /* stylelint-disable-next-line value-no-vendor-prefix */
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: $line;
+ overflow: hidden;
+ }
}
// 定位居中,默认水平居中,可选择垂直居中,或者水平垂直都居中
@mixin position-center($type: x) {
- position: absolute;
- @if ($type == x) {
- left: 50%;
- transform: translateX(-50%);
- }
- @if ($type == y) {
- top: 50%;
- transform: translateY(-50%);
- }
- @if ($type == xy) {
- left: 50%;
- top: 50%;
- transform: translateX(-50%) translateY(-50%);
- }
+ position: absolute;
+
+ @if ($type == x) {
+ left: 50%;
+ transform: translateX(-50%);
+ }
+
+ @if ($type == y) {
+ top: 50%;
+ transform: translateY(-50%);
+ }
+
+ @if ($type == xy) {
+ left: 50%;
+ top: 50%;
+ transform: translateX(-50%) translateY(-50%);
+ }
}
// 文字两端对齐
%justify-align {
- text-align: justify;
- text-align-last: justify;
+ text-align: justify;
+ text-align-last: justify;
}
// 清除浮动
%clearfix {
- zoom: 1;
- &::before,
- &::after {
- content: "";
- display: block;
- clear: both;
- }
+ zoom: 1;
+
+ &::before,
+ &::after {
+ content: "";
+ display: block;
+ clear: both;
+ }
}
diff --git a/src/assets/styles/themes.scss b/src/assets/styles/themes.scss
index 3ce94315..179e406f 100644
--- a/src/assets/styles/themes.scss
+++ b/src/assets/styles/themes.scss
@@ -1,5 +1,67 @@
:root {
- --g-box-shadow-color: rgb(0 0 0 / 12%);
+ --g-box-shadow-color: rgb(0 0 0 / 12%);
+
+ /* ----- 应用 ----- */
+ // 应用背景色
+ --g-app-bg: var(--el-bg-color);
+ // 主区域背景色
+ --g-main-bg: var(--el-bg-color-page);
+
+ /* ----- 顶部 ----- */
+ // 背景色
+ --g-header-bg: #222b45;
+ // 文字颜色
+ --g-header-color: #fff;
+ // 导航文字颜色
+ --g-header-menu-color: #fff;
+ // 导航鼠标悬浮文字颜色
+ --g-header-menu-hover-color: #fff;
+ // 导航鼠标悬浮背景色
+ --g-header-menu-hover-bg: #334067;
+ // 导航选中文字颜色
+ --g-header-menu-active-color: #fff;
+ // 导航选中背景色
+ --g-header-menu-active-bg: #334067;
+
+ /* ----- 主导航 ----- */
+ // 背景色
+ --g-main-sidebar-bg: #222b45;
+ // 菜单文字颜色
+ --g-main-sidebar-menu-color: #eee;
+ // 菜单鼠标悬浮文字颜色
+ --g-main-sidebar-menu-hover-color: #fff;
+ // 菜单鼠标悬浮背景色
+ --g-main-sidebar-menu-hover-bg: #334067;
+ // 菜单选中文字颜色
+ --g-main-sidebar-menu-active-color: #fff;
+ // 菜单选中背景色
+ --g-main-sidebar-menu-active-bg: #334067;
+
+ /* ----- 次导航 ----- */
+ // 背景色
+ --g-sub-sidebar-bg: #fff;
+ // 菜单背景色
+ --g-sub-sidebar-menu-bg: #e8e8e8;
+ // 菜单文字颜色
+ --g-sub-sidebar-menu-color: var(--el-text-color-primary);
+ // 菜单鼠标悬浮文字颜色
+ --g-sub-sidebar-menu-hover-color: var(--el-text-color-primary);
+ // 菜单鼠标悬浮背景色
+ --g-sub-sidebar-menu-hover-bg: #e1e1e1;
+ // 菜单选中文字颜色
+ --g-sub-sidebar-menu-active-color: #fff;
+ // 菜单选中背景色
+ --g-sub-sidebar-menu-active-bg: var(--el-color-primary);
+
+ /* ----- 顶栏 ----- */
+ --g-toolbar-bg: var(--el-bg-color);
+
+ /* ----- 进度条 ----- */
+ --g-nprogress-color: var(--el-color-primary);
+
+ /* ----- 暗黑模式 ----- */
+ &.dark {
+ --g-box-shadow-color: rgb(0 0 0 / 72%);
/* ----- 应用 ----- */
// 应用背景色
@@ -9,116 +71,54 @@
/* ----- 顶部 ----- */
// 背景色
- --g-header-bg: #222b45;
+ --g-header-bg: var(--el-bg-color);
// 文字颜色
--g-header-color: #fff;
// 导航文字颜色
- --g-header-menu-color: #fff;
+ --g-header-menu-color: #ccc;
// 导航鼠标悬浮文字颜色
--g-header-menu-hover-color: #fff;
// 导航鼠标悬浮背景色
- --g-header-menu-hover-bg: #334067;
+ --g-header-menu-hover-bg: var(--el-color-primary-light-5);
// 导航选中文字颜色
--g-header-menu-active-color: #fff;
// 导航选中背景色
- --g-header-menu-active-bg: #334067;
+ --g-header-menu-active-bg: var(--el-color-primary-light-3);
/* ----- 主导航 ----- */
// 背景色
- --g-main-sidebar-bg: #222b45;
+ --g-main-sidebar-bg: var(--el-bg-color);
// 菜单文字颜色
- --g-main-sidebar-menu-color: #eee;
+ --g-main-sidebar-menu-color: #ccc;
// 菜单鼠标悬浮文字颜色
--g-main-sidebar-menu-hover-color: #fff;
// 菜单鼠标悬浮背景色
- --g-main-sidebar-menu-hover-bg: #334067;
+ --g-main-sidebar-menu-hover-bg: var(--el-color-primary-light-5);
// 菜单选中文字颜色
--g-main-sidebar-menu-active-color: #fff;
// 菜单选中背景色
- --g-main-sidebar-menu-active-bg: #334067;
+ --g-main-sidebar-menu-active-bg: var(--el-color-primary-light-3);
/* ----- 次导航 ----- */
// 背景色
- --g-sub-sidebar-bg: #fff;
+ --g-sub-sidebar-bg: var(--el-bg-color-page);
// 菜单背景色
- --g-sub-sidebar-menu-bg: #e8e8e8;
+ --g-sub-sidebar-menu-bg: var(--el-bg-color);
// 菜单文字颜色
- --g-sub-sidebar-menu-color: var(--el-text-color-primary);
+ --g-sub-sidebar-menu-color: var(--el-text-color-secondary);
// 菜单鼠标悬浮文字颜色
--g-sub-sidebar-menu-hover-color: var(--el-text-color-primary);
// 菜单鼠标悬浮背景色
- --g-sub-sidebar-menu-hover-bg: #e1e1e1;
+ --g-sub-sidebar-menu-hover-bg: var(--el-color-primary-light-5);
// 菜单选中文字颜色
- --g-sub-sidebar-menu-active-color: #fff;
+ --g-sub-sidebar-menu-active-color: var(--el-text-color-primary);
// 菜单选中背景色
- --g-sub-sidebar-menu-active-bg: var(--el-color-primary);
+ --g-sub-sidebar-menu-active-bg: var(--el-color-primary-light-3);
/* ----- 顶栏 ----- */
--g-toolbar-bg: var(--el-bg-color);
/* ----- 进度条 ----- */
--g-nprogress-color: var(--el-color-primary);
-
- /* ----- 暗黑模式 ----- */
- &.dark {
- --g-box-shadow-color: rgb(0 0 0 / 72%);
-
- /* ----- 应用 ----- */
- // 应用背景色
- --g-app-bg: var(--el-bg-color);
- // 主区域背景色
- --g-main-bg: var(--el-bg-color-page);
-
- /* ----- 顶部 ----- */
- // 背景色
- --g-header-bg: var(--el-bg-color);
- // 文字颜色
- --g-header-color: #fff;
- // 导航文字颜色
- --g-header-menu-color: #ccc;
- // 导航鼠标悬浮文字颜色
- --g-header-menu-hover-color: #fff;
- // 导航鼠标悬浮背景色
- --g-header-menu-hover-bg: var(--el-color-primary-light-5);
- // 导航选中文字颜色
- --g-header-menu-active-color: #fff;
- // 导航选中背景色
- --g-header-menu-active-bg: var(--el-color-primary-light-3);
-
- /* ----- 主导航 ----- */
- // 背景色
- --g-main-sidebar-bg: var(--el-bg-color);
- // 菜单文字颜色
- --g-main-sidebar-menu-color: #ccc;
- // 菜单鼠标悬浮文字颜色
- --g-main-sidebar-menu-hover-color: #fff;
- // 菜单鼠标悬浮背景色
- --g-main-sidebar-menu-hover-bg: var(--el-color-primary-light-5);
- // 菜单选中文字颜色
- --g-main-sidebar-menu-active-color: #fff;
- // 菜单选中背景色
- --g-main-sidebar-menu-active-bg: var(--el-color-primary-light-3);
-
- /* ----- 次导航 ----- */
- // 背景色
- --g-sub-sidebar-bg: var(--el-bg-color-page);
- // 菜单背景色
- --g-sub-sidebar-menu-bg: var(--el-bg-color);
- // 菜单文字颜色
- --g-sub-sidebar-menu-color: var(--el-text-color-secondary);
- // 菜单鼠标悬浮文字颜色
- --g-sub-sidebar-menu-hover-color: var(--el-text-color-primary);
- // 菜单鼠标悬浮背景色
- --g-sub-sidebar-menu-hover-bg: var(--el-color-primary-light-5);
- // 菜单选中文字颜色
- --g-sub-sidebar-menu-active-color: var(--el-text-color-primary);
- // 菜单选中背景色
- --g-sub-sidebar-menu-active-bg: var(--el-color-primary-light-3);
-
- /* ----- 顶栏 ----- */
- --g-toolbar-bg: var(--el-bg-color);
-
- /* ----- 进度条 ----- */
- --g-nprogress-color: var(--el-color-primary);
- }
+ }
}
diff --git a/src/auto-imports.d.ts b/src/auto-imports.d.ts
new file mode 100644
index 00000000..5e30355b
--- /dev/null
+++ b/src/auto-imports.d.ts
@@ -0,0 +1,75 @@
+// Generated by 'unplugin-auto-import'
+export {}
+declare global {
+ const EffectScope: typeof import('vue')['EffectScope']
+ const ElMessage: typeof import('element-plus/es')['ElMessage']
+ const ElNotification: typeof import('element-plus/es')['ElNotification']
+ const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate']
+ const computed: typeof import('vue')['computed']
+ const createApp: typeof import('vue')['createApp']
+ const createPinia: typeof import('pinia')['createPinia']
+ const customRef: typeof import('vue')['customRef']
+ const defineAsyncComponent: typeof import('vue')['defineAsyncComponent']
+ const defineComponent: typeof import('vue')['defineComponent']
+ const defineStore: typeof import('pinia')['defineStore']
+ const effectScope: typeof import('vue')['effectScope']
+ const getActivePinia: typeof import('pinia')['getActivePinia']
+ const getCurrentInstance: typeof import('vue')['getCurrentInstance']
+ const getCurrentScope: typeof import('vue')['getCurrentScope']
+ const h: typeof import('vue')['h']
+ const inject: typeof import('vue')['inject']
+ const isProxy: typeof import('vue')['isProxy']
+ const isReactive: typeof import('vue')['isReactive']
+ const isReadonly: typeof import('vue')['isReadonly']
+ const isRef: typeof import('vue')['isRef']
+ const mapActions: typeof import('pinia')['mapActions']
+ const mapGetters: typeof import('pinia')['mapGetters']
+ const mapState: typeof import('pinia')['mapState']
+ const mapStores: typeof import('pinia')['mapStores']
+ const mapWritableState: typeof import('pinia')['mapWritableState']
+ const markRaw: typeof import('vue')['markRaw']
+ const nextTick: typeof import('vue')['nextTick']
+ const onActivated: typeof import('vue')['onActivated']
+ const onBeforeMount: typeof import('vue')['onBeforeMount']
+ const onBeforeUnmount: typeof import('vue')['onBeforeUnmount']
+ const onBeforeUpdate: typeof import('vue')['onBeforeUpdate']
+ const onDeactivated: typeof import('vue')['onDeactivated']
+ const onErrorCaptured: typeof import('vue')['onErrorCaptured']
+ const onMounted: typeof import('vue')['onMounted']
+ const onRenderTracked: typeof import('vue')['onRenderTracked']
+ const onRenderTriggered: typeof import('vue')['onRenderTriggered']
+ const onScopeDispose: typeof import('vue')['onScopeDispose']
+ const onServerPrefetch: typeof import('vue')['onServerPrefetch']
+ const onUnmounted: typeof import('vue')['onUnmounted']
+ const onUpdated: typeof import('vue')['onUpdated']
+ const provide: typeof import('vue')['provide']
+ const reactive: typeof import('vue')['reactive']
+ const readonly: typeof import('vue')['readonly']
+ const ref: typeof import('vue')['ref']
+ const resolveComponent: typeof import('vue')['resolveComponent']
+ const setActivePinia: typeof import('pinia')['setActivePinia']
+ const setMapStoreSuffix: typeof import('pinia')['setMapStoreSuffix']
+ const shallowReactive: typeof import('vue')['shallowReactive']
+ const shallowReadonly: typeof import('vue')['shallowReadonly']
+ const shallowRef: typeof import('vue')['shallowRef']
+ const storeToRefs: typeof import('pinia')['storeToRefs']
+ const toRaw: typeof import('vue')['toRaw']
+ const toRef: typeof import('vue')['toRef']
+ const toRefs: typeof import('vue')['toRefs']
+ const triggerRef: typeof import('vue')['triggerRef']
+ const unref: typeof import('vue')['unref']
+ const useAttrs: typeof import('vue')['useAttrs']
+ const useAuth: typeof import('./utils/composables/useAuth')['default']
+ const useCssModule: typeof import('vue')['useCssModule']
+ const useCssVars: typeof import('vue')['useCssVars']
+ const useCurrentInstance: typeof import('./utils/composables/useCurrentInstance')['default']
+ const useMainPage: typeof import('./utils/composables/useMainPage')['default']
+ const useMenu: typeof import('./utils/composables/useMenu')['default']
+ const useRoute: typeof import('vue-router')['useRoute']
+ const useRouter: typeof import('vue-router')['useRouter']
+ const useSlots: typeof import('vue')['useSlots']
+ const watch: typeof import('vue')['watch']
+ const watchEffect: typeof import('vue')['watchEffect']
+ const watchPostEffect: typeof import('vue')['watchPostEffect']
+ const watchSyncEffect: typeof import('vue')['watchSyncEffect']
+}
diff --git a/src/components.d.ts b/src/components.d.ts
new file mode 100644
index 00000000..d96655b3
--- /dev/null
+++ b/src/components.d.ts
@@ -0,0 +1,30 @@
+// generated by unplugin-vue-components
+// We suggest you to commit this file into source control
+// Read more: https://github.com/vuejs/core/pull/3399
+import '@vue/runtime-core'
+
+export {}
+
+declare module '@vue/runtime-core' {
+ export interface GlobalComponents {
+ Auth: typeof import('./components/Auth/index.vue')['default']
+ AuthAll: typeof import('./components/AuthAll/index.vue')['default']
+ BatchActionBar: typeof import('./components/BatchActionBar/index.vue')['default']
+ Copyright: typeof import('./components/Copyright/index.vue')['default']
+ Editor: typeof import('./components/Editor/index.vue')['default']
+ FileUpload: typeof import('./components/FileUpload/index.vue')['default']
+ FixedActionBar: typeof import('./components/FixedActionBar/index.vue')['default']
+ ImagePreview: typeof import('./components/ImagePreview/index.vue')['default']
+ ImagesUpload: typeof import('./components/ImagesUpload/index.vue')['default']
+ ImageUpload: typeof import('./components/ImageUpload/index.vue')['default']
+ PageHeader: typeof import('./components/PageHeader/index.vue')['default']
+ PageMain: typeof import('./components/PageMain/index.vue')['default']
+ PcasCascader: typeof import('./components/PcasCascader/index.vue')['default']
+ RouterLink: typeof import('vue-router')['RouterLink']
+ RouterView: typeof import('vue-router')['RouterView']
+ SearchBar: typeof import('./components/SearchBar/index.vue')['default']
+ SvgIcon: typeof import('./components/SvgIcon/index.vue')['default']
+ SystemInfo: typeof import('./components/SystemInfo/index.vue')['default']
+ Trend: typeof import('./components/Trend/index.vue')['default']
+ }
+}
diff --git a/src/components/Auth/index.vue b/src/components/Auth/index.vue
index 9f475e72..a43fa74a 100644
--- a/src/components/Auth/index.vue
+++ b/src/components/Auth/index.vue
@@ -1,21 +1,16 @@
-
-
-
-
-
+
+
+
+
diff --git a/src/components/AuthAll/index.vue b/src/components/AuthAll/index.vue
index 49390e99..3c4178c8 100644
--- a/src/components/AuthAll/index.vue
+++ b/src/components/AuthAll/index.vue
@@ -1,21 +1,16 @@
-
-
-
-
-
+
+
+
+
diff --git a/src/components/BatchActionBar/index.vue b/src/components/BatchActionBar/index.vue
index 803ffdc1..1e0dc48a 100644
--- a/src/components/BatchActionBar/index.vue
+++ b/src/components/BatchActionBar/index.vue
@@ -1,73 +1,82 @@
-
-
-
当页全选
-
已选 {{ selectionData.length }} 项
-
-
-
+
+
+ 当页全选
+
+
+ 已选 {{ selectionData.length }} 项
+
+
+
+
diff --git a/src/components/Copyright/index.vue b/src/components/Copyright/index.vue
index 25c7196a..e770b65c 100644
--- a/src/components/Copyright/index.vue
+++ b/src/components/Copyright/index.vue
@@ -1,44 +1,50 @@
-
-
+
diff --git a/src/components/Editor/index.vue b/src/components/Editor/index.vue
index 09f2331c..2d96b9c5 100644
--- a/src/components/Editor/index.vue
+++ b/src/components/Editor/index.vue
@@ -1,4 +1,4 @@
-
-
-
-
+
+
+
diff --git a/src/components/FileUpload/index.vue b/src/components/FileUpload/index.vue
index bee145b8..37a1db78 100644
--- a/src/components/FileUpload/index.vue
+++ b/src/components/FileUpload/index.vue
@@ -1,107 +1,117 @@
-
-
-
-
-
-
-
将文件拖到此处,或点击上传
+
+
+
+
+
+
+ 将文件拖到此处,或点击上传
+
+
+
+
+
+
diff --git a/src/components/FixedActionBar/index.vue b/src/components/FixedActionBar/index.vue
index c4839659..86bd7eac 100644
--- a/src/components/FixedActionBar/index.vue
+++ b/src/components/FixedActionBar/index.vue
@@ -1,53 +1,49 @@
-
-
-
-
+
+
+
diff --git a/src/components/ImagePreview/index.vue b/src/components/ImagePreview/index.vue
index 86b1c05c..cd6fc591 100644
--- a/src/components/ImagePreview/index.vue
+++ b/src/components/ImagePreview/index.vue
@@ -1,61 +1,64 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/src/components/ImageUpload/index.vue b/src/components/ImageUpload/index.vue
index e3214837..ac369cbe 100644
--- a/src/components/ImageUpload/index.vue
+++ b/src/components/ImageUpload/index.vue
@@ -1,242 +1,263 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/ImagesUpload/index.vue b/src/components/ImagesUpload/index.vue
index 7696c251..5e765389 100644
--- a/src/components/ImagesUpload/index.vue
+++ b/src/components/ImagesUpload/index.vue
@@ -1,275 +1,298 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/PageHeader/index.vue b/src/components/PageHeader/index.vue
index 52955afb..3dc41f39 100644
--- a/src/components/PageHeader/index.vue
+++ b/src/components/PageHeader/index.vue
@@ -1,59 +1,68 @@
-
-