Compare commits

...

4 Commits

Author SHA1 Message Date
xiaoxian521
bbe23ce0a2 release: update 3.8.7 2022-11-28 01:49:35 +08:00
xiaoxian521
68492ec362 docs: update 2022-11-27 18:05:55 +08:00
xiaoxian521
bc3b199860 release: update 3.8.6 2022-11-27 17:40:35 +08:00
xiaoxian521
4407dd5d10 perf: 无需安装 @vue/runtime-core,兼容 element-plus 的组件 volar 提示 2022-11-27 09:56:19 +08:00
13 changed files with 269 additions and 310 deletions

View File

@@ -4,9 +4,9 @@
**English** | [中文](./README.md) **English** | [中文](./README.md)
## introduce ## Introduce
The Lite version is based on the shelf extracted from [vue-pure-admin](https://github.com/xiaoxian521/vue-pure-admin), including the main functions, which is more suitable for actual project development, and the packaged size is lower than ` 3MB`, and will permanently sync the full version of the code. After enabling `brotli` compression and `cdn` to replace the native library mode, the package size is less than `500kb` The simplified version is based on the shelf extracted from [vue-pure-admin](https://github.com/xiaoxian521/vue-pure-admin), which contains main functions and is more suitable for actual project development. The packaged size is introduced globally [element-plus](https://element-plus.org) is still below `2.3MB`, and the full version of the code will be permanently synchronized. After enabling `brotli` compression and `cdn` to replace the local library mode, the package size is less than `350kb`
## Supporting Video ## Supporting Video

View File

@@ -6,7 +6,7 @@
## 介绍 ## 介绍
精简版是基于 [vue-pure-admin](https://github.com/xiaoxian521/vue-pure-admin) 提炼出的架子,包含主体功能,更适合实际项目开发,打包后的大小低于 `3MB`,并且会永久同步完整版的代码。开启 `brotli` 压缩和 `cdn` 替换本地库模式后,打包大小低于 `500kb` 精简版是基于 [vue-pure-admin](https://github.com/xiaoxian521/vue-pure-admin) 提炼出的架子,包含主体功能,更适合实际项目开发,打包后的大小在全局引入 [element-plus](https://element-plus.org) 的情况下仍然低于 `2.3MB`,并且会永久同步完整版的代码。开启 `brotli` 压缩和 `cdn` 替换本地库模式后,打包大小低于 `350kb`
## 版本选择 ## 版本选择

View File

@@ -3,13 +3,13 @@ import vue from "@vitejs/plugin-vue";
import { viteBuildInfo } from "./info"; import { viteBuildInfo } from "./info";
import svgLoader from "vite-svg-loader"; import svgLoader from "vite-svg-loader";
import vueJsx from "@vitejs/plugin-vue-jsx"; import vueJsx from "@vitejs/plugin-vue-jsx";
import VueMacros from "unplugin-vue-macros/vite";
import { viteMockServe } from "vite-plugin-mock"; import { viteMockServe } from "vite-plugin-mock";
import { configCompressPlugin } from "./compress"; import { configCompressPlugin } from "./compress";
// import ElementPlus from "unplugin-element-plus/vite"; // import ElementPlus from "unplugin-element-plus/vite";
import { visualizer } from "rollup-plugin-visualizer"; import { visualizer } from "rollup-plugin-visualizer";
import removeConsole from "vite-plugin-remove-console"; import removeConsole from "vite-plugin-remove-console";
import themePreprocessorPlugin from "@pureadmin/theme"; import themePreprocessorPlugin from "@pureadmin/theme";
import DefineOptions from "unplugin-vue-define-options/vite";
import { genScssMultipleScopeVars } from "../src/layout/theme"; import { genScssMultipleScopeVars } from "../src/layout/theme";
export function getPluginsList( export function getPluginsList(
@@ -25,7 +25,7 @@ export function getPluginsList(
vueJsx(), vueJsx(),
VITE_CDN ? cdn : null, VITE_CDN ? cdn : null,
configCompressPlugin(VITE_COMPRESSION), configCompressPlugin(VITE_COMPRESSION),
VueMacros(), DefineOptions(),
// 线上环境删除console // 线上环境删除console
removeConsole({ external: ["src/assets/iconfont/iconfont.js"] }), removeConsole({ external: ["src/assets/iconfont/iconfont.js"] }),
viteBuildInfo(), viteBuildInfo(),

View File

@@ -1,6 +1,6 @@
{ {
"name": "pure-admin-thin", "name": "pure-admin-thin",
"version": "3.8.5", "version": "3.8.7",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "NODE_OPTIONS=--max-old-space-size=4096 vite", "dev": "NODE_OPTIONS=--max-old-space-size=4096 vite",
@@ -80,7 +80,6 @@
"@vitejs/plugin-vue-jsx": "^2.1.1", "@vitejs/plugin-vue-jsx": "^2.1.1",
"@vue/eslint-config-prettier": "^7.0.0", "@vue/eslint-config-prettier": "^7.0.0",
"@vue/eslint-config-typescript": "^11.0.2", "@vue/eslint-config-typescript": "^11.0.2",
"@vue/runtime-core": "^3.2.45",
"autoprefixer": "^10.4.13", "autoprefixer": "^10.4.13",
"cloc": "^2.10.0", "cloc": "^2.10.0",
"cssnano": "^5.1.14", "cssnano": "^5.1.14",
@@ -111,7 +110,7 @@
"tailwindcss": "^3.2.4", "tailwindcss": "^3.2.4",
"terser": "^5.15.1", "terser": "^5.15.1",
"typescript": "^4.9.3", "typescript": "^4.9.3",
"unplugin-vue-macros": "^1.0.3", "unplugin-vue-define-options": "^1.0.0",
"vite": "3.1.8", "vite": "3.1.8",
"vite-plugin-cdn-import": "^0.3.5", "vite-plugin-cdn-import": "^0.3.5",
"vite-plugin-compression": "^0.5.1", "vite-plugin-compression": "^0.5.1",

273
pnpm-lock.yaml generated
View File

@@ -26,7 +26,6 @@ specifiers:
"@vitejs/plugin-vue-jsx": ^2.1.1 "@vitejs/plugin-vue-jsx": ^2.1.1
"@vue/eslint-config-prettier": ^7.0.0 "@vue/eslint-config-prettier": ^7.0.0
"@vue/eslint-config-typescript": ^11.0.2 "@vue/eslint-config-typescript": ^11.0.2
"@vue/runtime-core": ^3.2.45
"@vueuse/core": ^9.6.0 "@vueuse/core": ^9.6.0
"@vueuse/motion": 2.0.0-beta.12 "@vueuse/motion": 2.0.0-beta.12
animate.css: ^4.1.1 animate.css: ^4.1.1
@@ -76,7 +75,7 @@ specifiers:
tailwindcss: ^3.2.4 tailwindcss: ^3.2.4
terser: ^5.15.1 terser: ^5.15.1
typescript: ^4.9.3 typescript: ^4.9.3
unplugin-vue-macros: ^1.0.3 unplugin-vue-define-options: ^1.0.0
vite: 3.1.8 vite: 3.1.8
vite-plugin-cdn-import: ^0.3.5 vite-plugin-cdn-import: ^0.3.5
vite-plugin-compression: ^0.5.1 vite-plugin-compression: ^0.5.1
@@ -143,7 +142,6 @@ devDependencies:
"@vitejs/plugin-vue-jsx": 2.1.1_vite@3.1.8+vue@3.2.45 "@vitejs/plugin-vue-jsx": 2.1.1_vite@3.1.8+vue@3.2.45
"@vue/eslint-config-prettier": 7.0.0_5qrnzwqb344w6up62gv3safeoi "@vue/eslint-config-prettier": 7.0.0_5qrnzwqb344w6up62gv3safeoi
"@vue/eslint-config-typescript": 11.0.2_5ma4o5namqj2syekqcvrgakwe4 "@vue/eslint-config-typescript": 11.0.2_5ma4o5namqj2syekqcvrgakwe4
"@vue/runtime-core": 3.2.45
autoprefixer: 10.4.13_postcss@8.4.19 autoprefixer: 10.4.13_postcss@8.4.19
cloc: 2.10.0 cloc: 2.10.0
cssnano: 5.1.14_postcss@8.4.19 cssnano: 5.1.14_postcss@8.4.19
@@ -174,7 +172,7 @@ devDependencies:
tailwindcss: 3.2.4_postcss@8.4.19 tailwindcss: 3.2.4_postcss@8.4.19
terser: 5.16.0 terser: 5.16.0
typescript: 4.9.3 typescript: 4.9.3
unplugin-vue-macros: 1.0.3_5wosmox4cb7ovevlqdhap7knuu unplugin-vue-define-options: 1.0.0
vite: 3.1.8_sass@1.56.1+terser@5.16.0 vite: 3.1.8_sass@1.56.1+terser@5.16.0
vite-plugin-cdn-import: 0.3.5 vite-plugin-cdn-import: 0.3.5
vite-plugin-compression: 0.5.1_vite@3.1.8 vite-plugin-compression: 0.5.1_vite@3.1.8
@@ -196,13 +194,6 @@ packages:
"@jridgewell/trace-mapping": 0.3.17 "@jridgewell/trace-mapping": 0.3.17
dev: true dev: true
/@antfu/utils/0.6.3:
resolution:
{
integrity: sha512-sEYpyyKUPOew9QsXZ8feRVMzW6DWLviwOl+/ap06UQW02A8Srbc95CPHVm4eUbiBzBgD46eyIT+przv//KSSlQ==
}
dev: true
/@babel/code-frame/7.18.6: /@babel/code-frame/7.18.6:
resolution: resolution:
{ {
@@ -1297,6 +1288,7 @@ packages:
{ {
integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ== integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==
} }
dev: false
/@typescript-eslint/eslint-plugin/5.44.0_fnsv2sbzcckq65bwfk7a5xwslu: /@typescript-eslint/eslint-plugin/5.44.0_fnsv2sbzcckq65bwfk7a5xwslu:
resolution: resolution:
@@ -1558,30 +1550,6 @@ packages:
"@volar/vue-language-core": 1.0.9 "@volar/vue-language-core": 1.0.9
dev: true dev: true
/@vue-macros/api/0.2.0:
resolution:
{
integrity: sha512-E0rhhszd3MSE8l+A78gj9ONs4lsqOLHpONNzrc7H2nlPhEDsp4ZyQt+A9rRfxX+BTeLYfq64mli2qRV0tixiaw==
}
engines: { node: ">=14.19.0" }
dependencies:
"@babel/types": 7.20.2
"@vue-macros/common": 0.13.4
dev: true
/@vue-macros/better-define/1.0.0:
resolution:
{
integrity: sha512-SVQky3fk9wRrSH153Tw1+0sP5i6OB5iiUOtAC/mceH0IN5NGbDXt2YagELEM2+6caDquXNRL6jbG0HfRH6u0cA==
}
engines: { node: ">=14.19.0" }
dependencies:
"@rollup/pluginutils": 4.2.1
"@vue-macros/api": 0.2.0
"@vue-macros/common": 0.13.4
unplugin: 1.0.0
dev: true
/@vue-macros/common/0.13.4: /@vue-macros/common/0.13.4:
resolution: resolution:
{ {
@@ -1594,158 +1562,6 @@ packages:
magic-string: 0.26.7 magic-string: 0.26.7
dev: true dev: true
/@vue-macros/define-model/1.0.0_@vueuse+core@9.6.0:
resolution:
{
integrity: sha512-Nyh1fidDcfCzEKAo/ljwdQbpgMOrNowdJomB/qnkz/Lx4CVEaRk87LA2o3T99qIOogRfya8af+bLM8dNOq8dAQ==
}
engines: { node: ">=14.19.0" }
peerDependencies:
"@vueuse/core": ^9.0.0
peerDependenciesMeta:
"@vueuse/core":
optional: true
dependencies:
"@rollup/pluginutils": 4.2.1
"@vue-macros/common": 0.13.4
"@vueuse/core": 9.6.0_vue@3.2.45
ast-walker-scope: 0.3.0
unplugin: 1.0.0
dev: true
/@vue-macros/define-props/0.0.3_vue@3.2.45:
resolution:
{
integrity: sha512-GAiALWSrIogwdjbIe60Hi4CSvWFmZG7KySK8JBf7lszWNgoSirj/NKzmJOaHY0/I217tfq4Ew/brbdvcEhCikg==
}
engines: { node: ">=14.19.0" }
peerDependencies:
vue: ^3.2.25
dependencies:
"@rollup/pluginutils": 4.2.1
"@vue-macros/common": 0.13.4
unplugin: 1.0.0
vue: 3.2.45
dev: true
/@vue-macros/define-render/1.0.1_vue@3.2.45:
resolution:
{
integrity: sha512-B4ttYDZkXqVuciN23WNuVnr6L8dKrxEvz74gaYTXbdybv9jLEYMagSm/nFBLin+32EGYKeZu/D393r2EGAzeNg==
}
engines: { node: ">=14.19.0" }
peerDependencies:
vue: ^2.7.0 || ^3.0.0
dependencies:
"@rollup/pluginutils": 4.2.1
"@vue-macros/common": 0.13.4
unplugin: 1.0.0
vue: 3.2.45
dev: true
/@vue-macros/define-slots/0.0.6_vue@3.2.45:
resolution:
{
integrity: sha512-pK4P/oUjcrP/Rr5clsV2eZ53OJ3QlU2fZlnn91w++L0+lio+0M06ptr/IkHNVLNQ9U9Z43MkjHkMLX8Df8BknA==
}
engines: { node: ">=14.19.0" }
peerDependencies:
vue: ^2.7.0 || ^3.0.0
dependencies:
"@rollup/pluginutils": 4.2.1
"@vue-macros/common": 0.13.4
unplugin: 1.0.0
vue: 3.2.45
dev: true
/@vue-macros/hoist-static/1.0.0:
resolution:
{
integrity: sha512-NcFVAfKM9UjChOXy+yno4vhTsSHT6qUKbmd4/I8ucoiJT8IfFyGCwFoZZ8uqgjIwlzSUDxJ/vYoDRjiziTiNKg==
}
engines: { node: ">=14.19.0" }
dependencies:
"@rollup/pluginutils": 4.2.1
"@vue-macros/common": 0.13.4
unplugin: 1.0.0
dev: true
/@vue-macros/named-template/0.0.6_vite@3.1.8+vue@3.2.45:
resolution:
{
integrity: sha512-nEoutSYbwu7QC+uWcs90rD28erP6xZ0aU4uYnrxTUnVcbga9xMchxcs3MgI/2ax6dz/EXf1f1utYXXpGgLi+Tw==
}
engines: { node: ">=14.19.0" }
dependencies:
"@rollup/pluginutils": 4.2.1
"@vitejs/plugin-vue": 3.2.0_vite@3.1.8+vue@3.2.45
"@vue-macros/common": 0.13.4
"@vue/compiler-dom": 3.2.45
unplugin: 1.0.0
unplugin-combine: 0.2.8_vite@3.1.8
transitivePeerDependencies:
- esbuild
- rollup
- vite
- vue
- webpack
dev: true
/@vue-macros/setup-block/0.0.1:
resolution:
{
integrity: sha512-Zr7yudMN7Q+8Rb/4ZuZzNewHTejeH9fbt3104sFK53XqL4uLkDCz0fIG2AD9bR71RA+12H+yqn/jQ3vP4OaKGA==
}
engines: { node: ">=14.19.0" }
dependencies:
"@rollup/pluginutils": 4.2.1
"@vue-macros/common": 0.13.4
"@vue/compiler-dom": 3.2.45
unplugin: 1.0.0
dev: true
/@vue-macros/setup-component/0.12.8_vite@3.1.8:
resolution:
{
integrity: sha512-2tRMl8l8OYMpIRYsZyAZfH0dNT7CONMTcmdGEffJb5GvK8XOmdgGk7NFUhaQg3EEnk1SUq1Kdcx+gyH/a0qE4A==
}
engines: { node: ">=14.19.0" }
dependencies:
"@rollup/pluginutils": 4.2.1
"@vue-macros/common": 0.13.4
unplugin: 1.0.0
unplugin-combine: 0.2.8_vite@3.1.8
transitivePeerDependencies:
- esbuild
- rollup
- vite
- webpack
dev: true
/@vue-macros/setup-sfc/0.12.8:
resolution:
{
integrity: sha512-eOQxlY53GD/WkJrDHpDvHecWQ70Cw9aSYwS9eT1dQ9vWJVeJ/2R96z09GfYKz6cr9T00OPeZjftU5sC1FO+3xA==
}
engines: { node: ">=14.19.0" }
dependencies:
"@rollup/pluginutils": 4.2.1
"@vue-macros/common": 0.13.4
unplugin: 1.0.0
dev: true
/@vue-macros/short-emits/1.0.1:
resolution:
{
integrity: sha512-iyCZu35uPOAUJOPrmJrc3pQdY8TswoRrF4Kfcga7xUPvE5ck0Yq4pmOIE+NKz/pGQzzOkxC1qMDc2kaoJ2qAzg==
}
engines: { node: ">=14.19.0" }
dependencies:
"@rollup/pluginutils": 4.2.1
"@vue-macros/common": 0.13.4
unplugin: 1.0.0
dev: true
/@vue/babel-helper-vue-transform-on/1.0.2: /@vue/babel-helper-vue-transform-on/1.0.2:
resolution: resolution:
{ {
@@ -1956,6 +1772,7 @@ packages:
transitivePeerDependencies: transitivePeerDependencies:
- "@vue/composition-api" - "@vue/composition-api"
- vue - vue
dev: false
/@vueuse/metadata/8.9.4: /@vueuse/metadata/8.9.4:
resolution: resolution:
@@ -1969,6 +1786,7 @@ packages:
{ {
integrity: sha512-sIC8R+kWkIdpi5X2z2Gk8TRYzmczDwHRhEFfCu2P+XW2JdPoXrziqsGpDDsN7ykBx4ilwieS7JUIweVGhvZ93w== integrity: sha512-sIC8R+kWkIdpi5X2z2Gk8TRYzmczDwHRhEFfCu2P+XW2JdPoXrziqsGpDDsN7ykBx4ilwieS7JUIweVGhvZ93w==
} }
dev: false
/@vueuse/motion/2.0.0-beta.12_vue@3.2.45: /@vueuse/motion/2.0.0-beta.12_vue@3.2.45:
resolution: resolution:
@@ -2019,6 +1837,7 @@ packages:
transitivePeerDependencies: transitivePeerDependencies:
- "@vue/composition-api" - "@vue/composition-api"
- vue - vue
dev: false
/@zougt/some-loader-utils/1.4.3: /@zougt/some-loader-utils/1.4.3:
resolution: resolution:
@@ -4966,14 +4785,6 @@ packages:
wrap-ansi: 7.0.0 wrap-ansi: 7.0.0
dev: true dev: true
/local-pkg/0.4.2:
resolution:
{
integrity: sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==
}
engines: { node: ">=14" }
dev: true
/locate-path/5.0.0: /locate-path/5.0.0:
resolution: resolution:
{ {
@@ -7486,32 +7297,6 @@ packages:
engines: { node: ">= 0.8" } engines: { node: ">= 0.8" }
dev: true dev: true
/unplugin-combine/0.2.8_vite@3.1.8:
resolution:
{
integrity: sha512-Z38AC/TEjXbVyZ5HjVqo+lADj0/dcfwWC0Z4y0LNhybJzJQwmcMxm+ZsqHY3faauj4YigmlRMdptR5JEW9RuLg==
}
engines: { node: ">=14.19.0" }
peerDependencies:
esbuild: ">=0.13"
rollup: ^2.50.0
vite: ^2.3.0 || ^3.0.0
webpack: 4 || 5
peerDependenciesMeta:
esbuild:
optional: true
rollup:
optional: true
vite:
optional: true
webpack:
optional: true
dependencies:
"@antfu/utils": 0.6.3
unplugin: 0.10.2
vite: 3.1.8_sass@1.56.1+terser@5.16.0
dev: true
/unplugin-vue-define-options/1.0.0: /unplugin-vue-define-options/1.0.0:
resolution: resolution:
{ {
@@ -7525,51 +7310,6 @@ packages:
unplugin: 1.0.0 unplugin: 1.0.0
dev: true dev: true
/unplugin-vue-macros/1.0.3_5wosmox4cb7ovevlqdhap7knuu:
resolution:
{
integrity: sha512-QONC2iP0JNmIpbpL2jwsY89Lq6oTZf8JSbhQSVGB7xu+/iY52ZdfEB/bysai3lS5ScTH3M4y0KQHWVcyxBof7g==
}
engines: { node: ">=14.19.0" }
peerDependencies:
vue: ^2.7.0 || ^3.2.25
dependencies:
"@rollup/pluginutils": 4.2.1
"@vue-macros/better-define": 1.0.0
"@vue-macros/define-model": 1.0.0_@vueuse+core@9.6.0
"@vue-macros/define-props": 0.0.3_vue@3.2.45
"@vue-macros/define-render": 1.0.1_vue@3.2.45
"@vue-macros/define-slots": 0.0.6_vue@3.2.45
"@vue-macros/hoist-static": 1.0.0
"@vue-macros/named-template": 0.0.6_vite@3.1.8+vue@3.2.45
"@vue-macros/setup-block": 0.0.1
"@vue-macros/setup-component": 0.12.8_vite@3.1.8
"@vue-macros/setup-sfc": 0.12.8
"@vue-macros/short-emits": 1.0.1
local-pkg: 0.4.2
unplugin-combine: 0.2.8_vite@3.1.8
unplugin-vue-define-options: 1.0.0
vue: 3.2.45
transitivePeerDependencies:
- "@vueuse/core"
- esbuild
- rollup
- vite
- webpack
dev: true
/unplugin/0.10.2:
resolution:
{
integrity: sha512-6rk7GUa4ICYjae5PrAllvcDeuT8pA9+j5J5EkxbMFaV+SalHhxZ7X2dohMzu6C3XzsMT+6jwR/+pwPNR3uK9MA==
}
dependencies:
acorn: 8.8.1
chokidar: 3.5.3
webpack-sources: 3.2.3
webpack-virtual-modules: 0.4.6
dev: true
/unplugin/1.0.0: /unplugin/1.0.0:
resolution: resolution:
{ {
@@ -7772,6 +7512,7 @@ packages:
optional: true optional: true
dependencies: dependencies:
vue: 3.2.45 vue: 3.2.45
dev: false
/vue-eslint-parser/9.1.0_eslint@8.28.0: /vue-eslint-parser/9.1.0_eslint@8.28.0:
resolution: resolution:

View File

@@ -1,5 +1,5 @@
{ {
"Version": "3.8.5", "Version": "3.8.7",
"Title": "PureAdmin", "Title": "PureAdmin",
"FixedHeader": true, "FixedHeader": true,
"HiddenSideBar": false, "HiddenSideBar": false,

View File

@@ -155,4 +155,25 @@ html.dark {
.el-dropdown-menu__item:not(.is-disabled):hover { .el-dropdown-menu__item:not(.is-disabled):hover {
background: transparent; background: transparent;
} }
/* 克隆并自定义 ElMessage 样式,不会影响 ElMessage 原本样式,在 src/utils/message.ts 中调用自定义样式 ElMessage 方法即可,非暗黑模式在 src/style/element-plus.scss 文件进行了适配 */
.pure-message {
background-image: initial !important;
background-color: rgb(36, 37, 37) !important;
box-shadow: rgb(13 13 13 / 12%) 0px 3px 6px -4px,
rgb(13 13 13 / 8%) 0px 6px 16px 0px, rgb(13 13 13 / 5%) 0px 9px 28px 8px !important;
& .el-message__content {
color: $color-white !important;
pointer-events: all !important;
background-image: initial !important;
}
& .el-message__closeBtn {
&:hover {
color: rgba(255, 255, 255, 0.85);
background-color: rgba(255, 255, 255, 0.12);
}
}
}
} }

View File

@@ -62,3 +62,37 @@
border-left-color: var(--el-color-primary); border-left-color: var(--el-color-primary);
} }
} }
/* 克隆并自定义 ElMessage 样式,不会影响 ElMessage 原本样式,在 src/utils/message.ts 中调用自定义样式 ElMessage 方法即可,暗黑模式在 src/style/dark.scss 文件进行了适配 */
.pure-message {
border-width: 0 !important;
background: #fff !important;
padding: 10px 13px !important;
box-shadow: 0 3px 6px -4px #0000001f, 0 6px 16px #00000014,
0 9px 28px 8px #0000000d !important;
&.el-message.is-closable .el-message__content {
padding-right: 17px !important;
}
& .el-message__content {
color: #000000d9 !important;
pointer-events: all !important;
background-image: initial !important;
}
& .el-message__icon {
margin-right: 8px !important;
}
& .el-message__closeBtn {
outline: none;
border-radius: 4px;
right: 9px !important;
transition: background-color 0.2s, color 0.2s;
&:hover {
background-color: rgba(0, 0, 0, 0.06);
}
}
}

View File

@@ -1,32 +1,84 @@
import { type VNode } from "vue";
import { isFunction } from "@pureadmin/utils";
import { type MessageHandler, ElMessage } from "element-plus"; import { type MessageHandler, ElMessage } from "element-plus";
// 更多配置请看https://element-plus.org/zh-CN/component/message.html#message-%E9%85%8D%E7%BD%AE%E9%A1%B9 type messageStyle = "el" | "antd";
type messageTypes = "info" | "success" | "warning" | "error";
type messageTypes = "success" | "info" | "warning" | "error"; interface MessageParams {
/** 消息类型,可选 `info` 、`success` 、`warning` 、`error` ,默认 `info` */
type?: messageTypes;
/** 自定义图标,该属性会覆盖 `type` 的图标 */
icon?: any;
/** 是否将 `message` 属性作为 `HTML` 片段处理,默认 `false` */
dangerouslyUseHTMLString?: boolean;
/** 消息风格,可选 `el` 、`antd` ,默认 `antd` */
customClass?: messageStyle;
/** 显示时间,单位为毫秒。设为 `0` 则不会自动关闭,`element-plus` 默认是 `3000` ,平台改成默认 `2000` */
duration?: number;
/** 是否显示关闭按钮,默认值 `false` */
showClose?: boolean;
/** 文字是否居中,默认值 `false` */
center?: boolean;
/** `Message` 距离窗口顶部的偏移量,默认 `20` */
offset?: number;
/** 设置组件的根元素,默认 `document.body` */
appendTo?: string | HTMLElement;
/** 合并内容相同的消息,不支持 `VNode` 类型的消息,默认值 `false` */
grouping?: boolean;
/** 关闭时的回调函数, 参数为被关闭的 `message` 实例 */
onClose?: Function | null;
}
/** 用法非常简单,参考 src/views/components/message/index.vue 文件 */
/** /**
* `element-plus` 的 `info` 消息类型 * `Message` 消息提示函数
*/ */
const message = ( const message = (
message: string, message: string | VNode | (() => VNode),
type = "info" as messageTypes, params?: MessageParams
showClose = true,
duration = 2000,
center = false,
grouping = false
): MessageHandler => { ): MessageHandler => {
return ElMessage({ if (!params) {
message, return ElMessage({
type, message,
showClose, customClass: "pure-message"
duration, });
center, } else {
grouping const {
}); icon,
type = "info",
dangerouslyUseHTMLString = false,
customClass = "antd",
duration = 2000,
showClose = false,
center = false,
offset = 20,
appendTo = document.body,
grouping = false,
onClose
} = params;
return ElMessage({
message,
type,
icon,
dangerouslyUseHTMLString,
duration,
showClose,
center,
offset,
appendTo,
grouping,
// 全局搜 pure-message 即可知道该类的样式位置
customClass: customClass === "antd" ? "pure-message" : "",
onClose: () => (isFunction(onClose) ? onClose() : null)
});
}
}; };
/** /**
* 关闭 `element-plus` 的所有消息实例 * 关闭所有 `Message` 消息提示函数
*/ */
const closeAllMessage = (): void => ElMessage.closeAll(); const closeAllMessage = (): void => ElMessage.closeAll();

View File

@@ -47,7 +47,7 @@ const onLogin = async (formEl: FormInstance | undefined) => {
// 获取后端路由 // 获取后端路由
initRouter().then(() => { initRouter().then(() => {
router.push("/"); router.push("/");
message("登录成功", "success"); message("登录成功", { type: "success" });
}); });
} }
}); });

View File

@@ -21,8 +21,7 @@
"incremental": true, "incremental": true,
"paths": { "paths": {
"@/*": ["src/*"], "@/*": ["src/*"],
"@build/*": ["build/*"], "@build/*": ["build/*"]
"/#/*": ["types/*"]
}, },
"types": [ "types": [
"node", "node",
@@ -30,16 +29,16 @@
"element-plus/global", "element-plus/global",
"@pureadmin/table/volar", "@pureadmin/table/volar",
"@pureadmin/descriptions/volar", "@pureadmin/descriptions/volar",
"unplugin-vue-macros/macros-global" "unplugin-vue-define-options/macros-global"
], ],
"typeRoots": ["./node_modules/@types/", "./types"] "typeRoots": ["./node_modules/@types/", "./types"]
}, },
"include": [ "include": [
"mock/*.ts",
"src/**/*.ts", "src/**/*.ts",
"src/**/*.tsx", "src/**/*.tsx",
"src/**/*.vue", "src/**/*.vue",
"types/*.d.ts", "types/*.d.ts",
"mock/*.ts",
"vite.config.ts" "vite.config.ts"
], ],
"exclude": ["node_modules", "dist", "**/*.js"] "exclude": ["node_modules", "dist", "**/*.js"]

124
types/global-components.d.ts vendored Normal file
View File

@@ -0,0 +1,124 @@
declare module "vue" {
/**
* 自定义全局组件获得 Volar 提示(自定义的全局组件需要在这里声明下才能获得 Volar 类型提示哦)
*/
export interface GlobalComponents {
IconifyIconOffline: typeof import("../src/components/ReIcon")["IconifyIconOffline"];
IconifyIconOnline: typeof import("../src/components/ReIcon")["IconifyIconOnline"];
FontIcon: typeof import("../src/components/ReIcon")["FontIcon"];
Auth: typeof import("../src/components/ReAuth")["Auth"];
}
}
/**
* todohttps://github.com/element-plus/element-plus/blob/dev/global.d.ts#L2
* No need to install @vue/runtime-core
*/
declare module "vue" {
export interface GlobalComponents {
ElAffix: typeof import("element-plus")["ElAffix"];
ElAlert: typeof import("element-plus")["ElAlert"];
ElAside: typeof import("element-plus")["ElAside"];
ElAutocomplete: typeof import("element-plus")["ElAutocomplete"];
ElAvatar: typeof import("element-plus")["ElAvatar"];
ElBacktop: typeof import("element-plus")["ElBacktop"];
ElBadge: typeof import("element-plus")["ElBadge"];
ElBreadcrumb: typeof import("element-plus")["ElBreadcrumb"];
ElBreadcrumbItem: typeof import("element-plus")["ElBreadcrumbItem"];
ElButton: typeof import("element-plus")["ElButton"];
ElButtonGroup: typeof import("element-plus")["ElButtonGroup"];
ElCalendar: typeof import("element-plus")["ElCalendar"];
ElCard: typeof import("element-plus")["ElCard"];
ElCarousel: typeof import("element-plus")["ElCarousel"];
ElCarouselItem: typeof import("element-plus")["ElCarouselItem"];
ElCascader: typeof import("element-plus")["ElCascader"];
ElCascaderPanel: typeof import("element-plus")["ElCascaderPanel"];
ElCheckbox: typeof import("element-plus")["ElCheckbox"];
ElCheckboxButton: typeof import("element-plus")["ElCheckboxButton"];
ElCheckboxGroup: typeof import("element-plus")["ElCheckboxGroup"];
ElCol: typeof import("element-plus")["ElCol"];
ElCollapse: typeof import("element-plus")["ElCollapse"];
ElCollapseItem: typeof import("element-plus")["ElCollapseItem"];
ElCollapseTransition: typeof import("element-plus")["ElCollapseTransition"];
ElColorPicker: typeof import("element-plus")["ElColorPicker"];
ElContainer: typeof import("element-plus")["ElContainer"];
ElConfigProvider: typeof import("element-plus")["ElConfigProvider"];
ElDatePicker: typeof import("element-plus")["ElDatePicker"];
ElDialog: typeof import("element-plus")["ElDialog"];
ElDivider: typeof import("element-plus")["ElDivider"];
ElDrawer: typeof import("element-plus")["ElDrawer"];
ElDropdown: typeof import("element-plus")["ElDropdown"];
ElDropdownItem: typeof import("element-plus")["ElDropdownItem"];
ElDropdownMenu: typeof import("element-plus")["ElDropdownMenu"];
ElEmpty: typeof import("element-plus")["ElEmpty"];
ElFooter: typeof import("element-plus")["ElFooter"];
ElForm: typeof import("element-plus")["ElForm"];
ElFormItem: typeof import("element-plus")["ElFormItem"];
ElHeader: typeof import("element-plus")["ElHeader"];
ElIcon: typeof import("element-plus")["ElIcon"];
ElImage: typeof import("element-plus")["ElImage"];
ElImageViewer: typeof import("element-plus")["ElImageViewer"];
ElInput: typeof import("element-plus")["ElInput"];
ElInputNumber: typeof import("element-plus")["ElInputNumber"];
ElLink: typeof import("element-plus")["ElLink"];
ElMain: typeof import("element-plus")["ElMain"];
ElMenu: typeof import("element-plus")["ElMenu"];
ElMenuItem: typeof import("element-plus")["ElMenuItem"];
ElMenuItemGroup: typeof import("element-plus")["ElMenuItemGroup"];
ElOption: typeof import("element-plus")["ElOption"];
ElOptionGroup: typeof import("element-plus")["ElOptionGroup"];
ElPageHeader: typeof import("element-plus")["ElPageHeader"];
ElPagination: typeof import("element-plus")["ElPagination"];
ElPopconfirm: typeof import("element-plus")["ElPopconfirm"];
ElPopper: typeof import("element-plus")["ElPopper"];
ElPopover: typeof import("element-plus")["ElPopover"];
ElProgress: typeof import("element-plus")["ElProgress"];
ElRadio: typeof import("element-plus")["ElRadio"];
ElRadioButton: typeof import("element-plus")["ElRadioButton"];
ElRadioGroup: typeof import("element-plus")["ElRadioGroup"];
ElRate: typeof import("element-plus")["ElRate"];
ElRow: typeof import("element-plus")["ElRow"];
ElScrollbar: typeof import("element-plus")["ElScrollbar"];
ElSelect: typeof import("element-plus")["ElSelect"];
ElSlider: typeof import("element-plus")["ElSlider"];
ElStep: typeof import("element-plus")["ElStep"];
ElSteps: typeof import("element-plus")["ElSteps"];
ElSubMenu: typeof import("element-plus")["ElSubMenu"];
ElSwitch: typeof import("element-plus")["ElSwitch"];
ElTabPane: typeof import("element-plus")["ElTabPane"];
ElTable: typeof import("element-plus")["ElTable"];
ElTableColumn: typeof import("element-plus")["ElTableColumn"];
ElTabs: typeof import("element-plus")["ElTabs"];
ElTag: typeof import("element-plus")["ElTag"];
ElTimePicker: typeof import("element-plus")["ElTimePicker"];
ElTimeSelect: typeof import("element-plus")["ElTimeSelect"];
ElTimeline: typeof import("element-plus")["ElTimeline"];
ElTimelineItem: typeof import("element-plus")["ElTimelineItem"];
ElTooltip: typeof import("element-plus")["ElTooltip"];
ElTransfer: typeof import("element-plus")["ElTransfer"];
ElTree: typeof import("element-plus")["ElTree"];
ElTreeV2: typeof import("element-plus")["ElTreeV2"];
ElUpload: typeof import("element-plus")["ElUpload"];
ElSpace: typeof import("element-plus")["ElSpace"];
ElSkeleton: typeof import("element-plus")["ElSkeleton"];
ElSkeletonItem: typeof import("element-plus")["ElSkeletonItem"];
ElCheckTag: typeof import("element-plus")["ElCheckTag"];
ElDescriptions: typeof import("element-plus")["ElDescriptions"];
ElDescriptionsItem: typeof import("element-plus")["ElDescriptionsItem"];
ElResult: typeof import("element-plus")["ElResult"];
ElSelectV2: typeof import("element-plus")["ElSelectV2"];
}
interface ComponentCustomProperties {
$message: typeof import("element-plus")["ElMessage"];
$notify: typeof import("element-plus")["ElNotification"];
$msgbox: typeof import("element-plus")["ElMessageBox"];
$messageBox: typeof import("element-plus")["ElMessageBox"];
$alert: typeof import("element-plus")["ElMessageBox"]["alert"];
$confirm: typeof import("element-plus")["ElMessageBox"]["confirm"];
$prompt: typeof import("element-plus")["ElMessageBox"]["prompt"];
$loading: typeof import("element-plus")["ElLoadingService"];
}
}
export {};

13
types/global.d.ts vendored
View File

@@ -214,6 +214,7 @@ declare global {
/** /**
* @description 当前路由动画效果 * @description 当前路由动画效果
* @see {@link https://next.router.vuejs.org/guide/advanced/transitions.html#transitions} * @see {@link https://next.router.vuejs.org/guide/advanced/transitions.html#transitions}
* @see animate.css {@link https://animate.style}
*/ */
name?: string; name?: string;
/** 进场动画 */ /** 进场动画 */
@@ -265,15 +266,3 @@ declare global {
$config: ServerConfigs; $config: ServerConfigs;
} }
} }
declare module "vue" {
/**
* 自定义全局组件获得 Volar 提示(自定义的全局组件需要在这里声明下才能获得 Volar 类型提示哦)
*/
export interface GlobalComponents {
IconifyIconOffline: typeof import("../src/components/ReIcon")["IconifyIconOffline"];
IconifyIconOnline: typeof import("../src/components/ReIcon")["IconifyIconOnline"];
FontIcon: typeof import("../src/components/ReIcon")["FontIcon"];
Auth: typeof import("../src/components/ReAuth")["Auth"];
}
}