Compare commits

..

2 Commits

Author SHA1 Message Date
xiaoxian521
132fbbade3 release: update 3.9.3 2022-12-04 18:00:16 +08:00
xiaoxian521
c6e25d6933 release: update 3.9.2 2022-12-03 15:20:30 +08:00
21 changed files with 173 additions and 66 deletions

View File

@@ -9,10 +9,12 @@ export function viteBuildInfo(): Plugin {
let config: { command: string }; let config: { command: string };
let startTime: Dayjs; let startTime: Dayjs;
let endTime: Dayjs; let endTime: Dayjs;
let outDir: string;
return { return {
name: "vite:buildInfo", name: "vite:buildInfo",
configResolved(resolvedConfig: { command: string }) { configResolved(resolvedConfig) {
config = resolvedConfig; config = resolvedConfig;
outDir = resolvedConfig.build?.outDir ?? "dist";
}, },
buildStart() { buildStart() {
console.log( console.log(
@@ -32,6 +34,7 @@ export function viteBuildInfo(): Plugin {
if (config.command === "build") { if (config.command === "build") {
endTime = dayjs(new Date()); endTime = dayjs(new Date());
getPackageSize({ getPackageSize({
folder: outDir,
callback: (size: string) => { callback: (size: string) => {
console.log( console.log(
bold( bold(

View File

@@ -1,8 +1,6 @@
// 模拟后端动态生成路由 // 模拟后端动态生成路由
import { MockMethod } from "vite-plugin-mock"; import { MockMethod } from "vite-plugin-mock";
import Lollipop from "@iconify-icons/ep/lollipop";
/** /**
* roles页面级别权限这里模拟二种 "admin"、"common" * roles页面级别权限这里模拟二种 "admin"、"common"
* admin管理员角色 * admin管理员角色
@@ -13,7 +11,7 @@ const permissionRouter = {
path: "/permission", path: "/permission",
meta: { meta: {
title: "权限管理", title: "权限管理",
icon: Lollipop, icon: "lollipop",
rank: 10 rank: 10
}, },
children: [ children: [

View File

@@ -1,6 +1,6 @@
{ {
"name": "pure-admin-thin", "name": "pure-admin-thin",
"version": "3.9.1", "version": "3.9.3",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "NODE_OPTIONS=--max-old-space-size=4096 vite", "dev": "NODE_OPTIONS=--max-old-space-size=4096 vite",
@@ -31,8 +31,8 @@
"dependencies": { "dependencies": {
"@ctrl/tinycolor": "^3.4.1", "@ctrl/tinycolor": "^3.4.1",
"@pureadmin/descriptions": "^1.1.0", "@pureadmin/descriptions": "^1.1.0",
"@pureadmin/table": "^1.8.1", "@pureadmin/table": "^1.8.3",
"@pureadmin/utils": "^1.7.1", "@pureadmin/utils": "^1.7.4",
"@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",
@@ -49,7 +49,7 @@
"mockjs": "^1.1.0", "mockjs": "^1.1.0",
"nprogress": "^0.2.0", "nprogress": "^0.2.0",
"path": "^0.12.7", "path": "^0.12.7",
"pinia": "^2.0.26", "pinia": "^2.0.27",
"qs": "^6.11.0", "qs": "^6.11.0",
"responsive-storage": "^2.1.0", "responsive-storage": "^2.1.0",
"vue": "^3.2.45", "vue": "^3.2.45",

24
pnpm-lock.yaml generated
View File

@@ -8,9 +8,9 @@ specifiers:
'@iconify-icons/ri': ^1.2.3 '@iconify-icons/ri': ^1.2.3
'@iconify/vue': ^4.0.0 '@iconify/vue': ^4.0.0
'@pureadmin/descriptions': ^1.1.0 '@pureadmin/descriptions': ^1.1.0
'@pureadmin/table': ^1.8.1 '@pureadmin/table': ^1.8.3
'@pureadmin/theme': ^2.4.0 '@pureadmin/theme': ^2.4.0
'@pureadmin/utils': ^1.7.1 '@pureadmin/utils': ^1.7.4
'@types/element-resize-detector': 1.1.3 '@types/element-resize-detector': 1.1.3
'@types/js-cookie': ^3.0.1 '@types/js-cookie': ^3.0.1
'@types/lodash': ^4.14.180 '@types/lodash': ^4.14.180
@@ -52,7 +52,7 @@ specifiers:
nprogress: ^0.2.0 nprogress: ^0.2.0
path: ^0.12.7 path: ^0.12.7
picocolors: ^1.0.0 picocolors: ^1.0.0
pinia: ^2.0.26 pinia: ^2.0.27
postcss: ^8.4.18 postcss: ^8.4.18
postcss-html: ^1.5.0 postcss-html: ^1.5.0
postcss-import: ^15.0.0 postcss-import: ^15.0.0
@@ -93,8 +93,8 @@ specifiers:
dependencies: dependencies:
'@ctrl/tinycolor': 3.4.1 '@ctrl/tinycolor': 3.4.1
'@pureadmin/descriptions': 1.1.1_element-plus@2.2.26 '@pureadmin/descriptions': 1.1.1_element-plus@2.2.26
'@pureadmin/table': 1.8.1_element-plus@2.2.26 '@pureadmin/table': 1.8.3_element-plus@2.2.26
'@pureadmin/utils': 1.7.1_aotapuqn7htzdjltsyimavekky '@pureadmin/utils': 1.7.4_aotapuqn7htzdjltsyimavekky
'@vueuse/core': 9.6.0_vue@3.2.45 '@vueuse/core': 9.6.0_vue@3.2.45
'@vueuse/motion': 2.0.0-beta.12_vue@3.2.45 '@vueuse/motion': 2.0.0-beta.12_vue@3.2.45
animate.css: 4.1.1 animate.css: 4.1.1
@@ -111,7 +111,7 @@ dependencies:
mockjs: 1.1.0 mockjs: 1.1.0
nprogress: 0.2.0 nprogress: 0.2.0
path: 0.12.7 path: 0.12.7
pinia: 2.0.26_mgnvym7yiazkylwwogi5r767ue pinia: 2.0.27_mgnvym7yiazkylwwogi5r767ue
qs: 6.11.0 qs: 6.11.0
responsive-storage: 2.1.0 responsive-storage: 2.1.0
vue: 3.2.45 vue: 3.2.45
@@ -823,8 +823,8 @@ packages:
vue: 3.2.45 vue: 3.2.45
dev: false dev: false
/@pureadmin/table/1.8.1_element-plus@2.2.26: /@pureadmin/table/1.8.3_element-plus@2.2.26:
resolution: {integrity: sha512-oZ5GYmLTDgQ64U6+yKFjvpZG2Seuudk3hOWnUogMvKxhIvaRQsGBHbvyg47asMmXxUyeilq+nRumyuiuV7WJTg==} resolution: {integrity: sha512-M+I+CDu74s/ffNybbDg0rHhiMHTdkgVIaksfmmrEwjuLB2nEaz7R0tob2qC5rKE96U2Z246meDHBidyQNx2z9w==}
peerDependencies: peerDependencies:
element-plus: ^2.0.0 element-plus: ^2.0.0
dependencies: dependencies:
@@ -840,8 +840,8 @@ packages:
string-hash: 1.1.3 string-hash: 1.1.3
dev: true dev: true
/@pureadmin/utils/1.7.1_aotapuqn7htzdjltsyimavekky: /@pureadmin/utils/1.7.4_aotapuqn7htzdjltsyimavekky:
resolution: {integrity: sha512-LqYdMR1xvRDtPp66osOY6usmta6LNGMuON14iONv4ZUC/esQ3RflHlT5glGjOfGUSGCk8O94F5LVS/PVC9Q3Ng==} resolution: {integrity: sha512-uJNHcb2sO7R2avALf+v4TGyuZtJix0Wpw/kMb6eO4C003ZQImuGGi9WlxHaOlESrMyFHZ1AjWm5AqLwJLnpVlw==}
peerDependencies: peerDependencies:
dayjs: '*' dayjs: '*'
echarts: '*' echarts: '*'
@@ -3981,8 +3981,8 @@ packages:
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: true dev: true
/pinia/2.0.26_mgnvym7yiazkylwwogi5r767ue: /pinia/2.0.27_mgnvym7yiazkylwwogi5r767ue:
resolution: {integrity: sha512-tSxZNUcMGxQOvKZRjPKXxd2+/2NZhRF/CoYVE/+K6uE/Z3v1Oi4fcQFpxu5nMB1dCchjXUZ+lz0tBxV5ntwmQQ==} resolution: {integrity: sha512-nOnXP0OFeL8R4WjAHsterU+11vptda643gH02xKNtSCDPiRzVfRYodOLihLDoa0gL1KKuQKV+KOzEgdt3YvqEw==}
peerDependencies: peerDependencies:
'@vue/composition-api': ^1.4.0 '@vue/composition-api': ^1.4.0
typescript: '>=4.4.4' typescript: '>=4.4.4'

View File

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

View File

@@ -0,0 +1,14 @@
import { addIcon } from "@iconify/vue/dist/offline";
/**
* 这里存放本地图标,在 src/layout/index.vue 文件中加载,避免在首启动加载
*/
// 本地菜单图标后端在路由的icon中返回对应的图标字符串并且前端在此处使用addIcon添加即可渲染菜单图标
import HomeFilled from "@iconify-icons/ep/home-filled";
import InformationLine from "@iconify-icons/ri/information-line";
import Lollipop from "@iconify-icons/ep/lollipop";
addIcon("homeFilled", HomeFilled);
addIcon("informationLine", InformationLine);
addIcon("lollipop", Lollipop);

View File

@@ -1,11 +1,27 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref } from "vue"; import { ref, computed } from "vue";
import { onClickOutside } from "@vueuse/core";
import { emitter } from "@/utils/mitt"; import { emitter } from "@/utils/mitt";
import { onClickOutside } from "@vueuse/core";
import Close from "@iconify-icons/ep/close"; import Close from "@iconify-icons/ep/close";
const show = ref<Boolean>(false);
const target = ref(null); const target = ref(null);
const show = ref<Boolean>(false);
const iconClass = computed(() => {
return [
"mr-[20px]",
"outline-none",
"width-[20px]",
"height-[20px]",
"rounded-[4px]",
"cursor-pointer",
"transition-colors",
"hover:bg-[#0000000f]",
"dark:hover:bg-[#ffffff1f]",
"dark:hover:text-[#ffffffd9]"
];
});
onClickOutside(target, (event: any) => { onClickOutside(target, (event: any) => {
if (event.clientX > target.value.offsetLeft) return; if (event.clientX > target.value.offsetLeft) return;
show.value = false; show.value = false;
@@ -23,9 +39,11 @@ emitter.on("openPanel", () => {
<div class="right-panel-items"> <div class="right-panel-items">
<div class="project-configuration"> <div class="project-configuration">
<h4 class="dark:text-white">项目配置</h4> <h4 class="dark:text-white">项目配置</h4>
<span title="关闭配置"> <span title="关闭配置" :class="iconClass">
<IconifyIconOffline <IconifyIconOffline
class="dark:text-white" class="dark:text-white"
width="20px"
height="20px"
:icon="Close" :icon="Close"
@click="show = !show" @click="show = !show"
/> />
@@ -69,7 +87,6 @@ emitter.on("openPanel", () => {
box-shadow: 0 0 15px 0 rgba(0, 0, 0, 0.05); box-shadow: 0 0 15px 0 rgba(0, 0, 0, 0.05);
transition: all 0.25s cubic-bezier(0.7, 0.3, 0.1, 1); transition: all 0.25s cubic-bezier(0.7, 0.3, 0.1, 1);
transform: translate(100%); transform: translate(100%);
// background: #fff;
z-index: 40000; z-index: 40000;
} }
@@ -125,16 +142,6 @@ emitter.on("openPanel", () => {
align-items: center; align-items: center;
top: 15px; top: 15px;
margin-left: 10px; margin-left: 10px;
svg {
font-size: 20px;
margin-right: 20px;
&:hover {
cursor: pointer;
color: var(--el-color-primary);
}
}
} }
:deep(.el-divider--horizontal) { :deep(.el-divider--horizontal) {

View File

@@ -1,4 +1,13 @@
<script setup lang="ts"> <script setup lang="ts">
import {
ref,
unref,
watch,
reactive,
computed,
nextTick,
onBeforeMount
} from "vue";
import { import {
useDark, useDark,
debounce, debounce,
@@ -17,7 +26,6 @@ import { useNav } from "@/layout/hooks/useNav";
import { useAppStoreHook } from "@/store/modules/app"; import { useAppStoreHook } from "@/store/modules/app";
import { toggleTheme } from "@pureadmin/theme/dist/browser-utils"; import { toggleTheme } from "@pureadmin/theme/dist/browser-utils";
import { useMultiTagsStoreHook } from "@/store/modules/multiTags"; import { useMultiTagsStoreHook } from "@/store/modules/multiTags";
import { ref, unref, watch, reactive, computed, nextTick } from "vue";
import { useDataThemeChange } from "@/layout/hooks/useDataThemeChange"; import { useDataThemeChange } from "@/layout/hooks/useDataThemeChange";
import dayIcon from "@/assets/svg/day.svg?component"; import dayIcon from "@/assets/svg/day.svg?component";
@@ -189,16 +197,6 @@ function setLayoutModel(layout: string) {
useAppStoreHook().setLayout(layout); useAppStoreHook().setLayout(layout);
} }
/* 初始化项目配置 */
nextTick(() => {
settings.greyVal &&
document.querySelector("html")?.setAttribute("class", "html-grey");
settings.weakVal &&
document.querySelector("html")?.setAttribute("class", "html-weakness");
settings.tabsVal && tagsChange();
dataThemeChange();
});
watch($storage, ({ layout }) => { watch($storage, ({ layout }) => {
switch (layout["layout"]) { switch (layout["layout"]) {
case "vertical": case "vertical":
@@ -218,6 +216,18 @@ watch($storage, ({ layout }) => {
break; break;
} }
}); });
onBeforeMount(() => {
dataThemeChange();
/* 初始化项目配置 */
nextTick(() => {
settings.greyVal &&
document.querySelector("html")?.setAttribute("class", "html-grey");
settings.weakVal &&
document.querySelector("html")?.setAttribute("class", "html-weakness");
settings.tabsVal && tagsChange();
});
});
</script> </script>
<template> <template>

View File

@@ -35,7 +35,10 @@ watch(
</script> </script>
<template> <template>
<div class="horizontal-header"> <div
v-loading="usePermissionStoreHook().wholeMenus.length === 0"
class="horizontal-header"
>
<div class="horizontal-header-left" @click="backHome"> <div class="horizontal-header-left" @click="backHome">
<FontIcon icon="team-iconlogo" svg style="width: 35px; height: 35px" /> <FontIcon icon="team-iconlogo" svg style="width: 35px; height: 35px" />
<h4>{{ title }}</h4> <h4>{{ title }}</h4>
@@ -93,6 +96,9 @@ watch(
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
:deep(.el-loading-mask) {
opacity: 0.45;
}
.logout { .logout {
max-width: 120px; max-width: 120px;

View File

@@ -1,8 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref } from "vue"; import { ref, computed } from "vue";
import { useNav } from "@/layout/hooks/useNav"; import { useNav } from "@/layout/hooks/useNav";
import MenuFold from "@iconify-icons/ri/menu-fold-fill"; import MenuFold from "@iconify-icons/ri/menu-fold-fill";
import MenuUnfold from "@iconify-icons/ri/menu-unfold-fill";
interface Props { interface Props {
isActive: boolean; isActive: boolean;
@@ -15,6 +14,22 @@ const props = withDefaults(defineProps<Props>(), {
const visible = ref(false); const visible = ref(false);
const { tooltipEffect } = useNav(); const { tooltipEffect } = useNav();
const iconClass = computed(() => {
return [
"ml-4",
"mb-1",
"w-[16px]",
"h-[16px]",
"inline-block",
"align-middle",
"text-primary",
"cursor-pointer",
"duration-[360ms]",
"hover:text-primary",
"dark:hover:!text-white"
];
});
const emit = defineEmits<{ const emit = defineEmits<{
(e: "toggleClick"): void; (e: "toggleClick"): void;
}>(); }>();
@@ -33,8 +48,9 @@ const toggleClick = () => {
:content="props.isActive ? '点击折叠' : '点击展开'" :content="props.isActive ? '点击折叠' : '点击展开'"
> >
<IconifyIconOffline <IconifyIconOffline
:icon="props.isActive ? MenuFold : MenuUnfold" :icon="MenuFold"
class="cursor-pointer inline-block align-middle text-primary hover:text-primary dark:hover:!text-white w-[16px] h-[16px] ml-4 mb-1" :class="iconClass"
:style="{ transform: props.isActive ? 'none' : 'rotateY(180deg)' }"
@click="toggleClick" @click="toggleClick"
@mouseenter="visible = true" @mouseenter="visible = true"
@mouseleave="visible = false" @mouseleave="visible = false"

View File

@@ -51,7 +51,11 @@ watch(
</script> </script>
<template> <template>
<div v-if="device !== 'mobile'" class="horizontal-header"> <div
v-if="device !== 'mobile'"
class="horizontal-header"
v-loading="usePermissionStoreHook().wholeMenus.length === 0"
>
<el-menu <el-menu
router router
ref="menuRef" ref="menuRef"
@@ -124,6 +128,9 @@ watch(
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
:deep(.el-loading-mask) {
opacity: 0.45;
}
.logout { .logout {
max-width: 120px; max-width: 120px;

View File

@@ -202,7 +202,7 @@ function resolvePath(routePath) {
placement="top" placement="top"
:effect="tooltipEffect" :effect="tooltipEffect"
:offset="-10" :offset="-10"
:disabled="!isCollapse && !onlyOneChild.showTooltip" :disabled="!onlyOneChild.showTooltip"
> >
<template #content> <template #content>
{{ onlyOneChild.meta.title }} {{ onlyOneChild.meta.title }}

View File

@@ -59,7 +59,10 @@ watch(
</script> </script>
<template> <template>
<div :class="['sidebar-container', showLogo ? 'has-logo' : '']"> <div
v-loading="menuData.length === 0"
:class="['sidebar-container', showLogo ? 'has-logo' : '']"
>
<Logo v-if="showLogo" :collapse="isCollapse" /> <Logo v-if="showLogo" :collapse="isCollapse" />
<el-scrollbar <el-scrollbar
wrap-class="scrollbar-wrapper" wrap-class="scrollbar-wrapper"
@@ -91,3 +94,9 @@ watch(
/> />
</div> </div>
</template> </template>
<style scoped>
:deep(.el-loading-mask) {
opacity: 0.45;
}
</style>

View File

@@ -1,5 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import "animate.css"; import "animate.css";
// 引入 src/components/ReIcon/src/offlineIcon.ts 文件中所有使用addIcon添加过的本地图标
import "@/components/ReIcon/src/offlineIcon";
// vxe-table的所有icon不支持component模式间接依赖了font-awesome // vxe-table的所有icon不支持component模式间接依赖了font-awesome
// import "font-awesome/css/font-awesome.min.css"; // import "font-awesome/css/font-awesome.min.css";
import { setType } from "./types"; import { setType } from "./types";

View File

@@ -1,5 +1,4 @@
import type { IconifyIcon } from "@iconify/vue"; import type { IconifyIcon } from "@iconify/vue";
import HomeFilled from "@iconify-icons/ep/home-filled";
export const routerArrays: Array<RouteConfigs> = [ export const routerArrays: Array<RouteConfigs> = [
{ {
@@ -7,7 +6,7 @@ export const routerArrays: Array<RouteConfigs> = [
parentPath: "/", parentPath: "/",
meta: { meta: {
title: "首页", title: "首页",
icon: HomeFilled icon: "homeFilled"
} }
} }
]; ];

View File

@@ -1,10 +1,8 @@
import InformationLine from "@iconify-icons/ri/information-line";
export default { export default {
path: "/error", path: "/error",
redirect: "/error/403", redirect: "/error/403",
meta: { meta: {
icon: InformationLine, icon: "informationLine",
title: "异常页面", title: "异常页面",
rank: 9 rank: 9
}, },

View File

@@ -1,5 +1,4 @@
const Layout = () => import("@/layout/index.vue"); const Layout = () => import("@/layout/index.vue");
import HomeFilled from "@iconify-icons/ep/home-filled";
export default { export default {
path: "/", path: "/",
@@ -7,7 +6,7 @@ export default {
component: Layout, component: Layout,
redirect: "/welcome", redirect: "/welcome",
meta: { meta: {
icon: HomeFilled, icon: "homeFilled",
title: "首页", title: "首页",
rank: 0 rank: 0
}, },

View File

@@ -1,5 +1,4 @@
const Layout = () => import("@/layout/index.vue"); const Layout = () => import("@/layout/index.vue");
import HomeFilled from "@iconify-icons/ep/home-filled";
export default [ export default [
{ {
@@ -16,7 +15,7 @@ export default [
path: "/redirect", path: "/redirect",
component: Layout, component: Layout,
meta: { meta: {
icon: HomeFilled, icon: "homeFilled",
title: "首页", title: "首页",
showLink: false, showLink: false,
rank: 104 rank: 104

View File

@@ -198,7 +198,7 @@ function initRouter() {
} else { } else {
return new Promise(resolve => { return new Promise(resolve => {
getAsyncRoutes().then(({ data }) => { getAsyncRoutes().then(({ data }) => {
handleAsyncRoutes(data); handleAsyncRoutes(cloneDeep(data));
storageSession.setItem(key, data); storageSession.setItem(key, data);
resolve(router); resolve(router);
}); });
@@ -207,7 +207,7 @@ function initRouter() {
} else { } else {
return new Promise(resolve => { return new Promise(resolve => {
getAsyncRoutes().then(({ data }) => { getAsyncRoutes().then(({ data }) => {
handleAsyncRoutes(data); handleAsyncRoutes(cloneDeep(data));
resolve(router); resolve(router);
}); });
}); });

View File

@@ -156,6 +156,19 @@ html.dark {
background: transparent; background: transparent;
} }
/* 全局覆盖element-plus的el-dialog、el-drawer、el-message-box、el-notification组件右上角关闭图标的样式表现更鲜明 */
.el-icon {
&.el-dialog__close,
&.el-drawer__close,
&.el-message-box__close,
&.el-notification__closeBtn {
&:hover {
color: rgba(255, 255, 255, 0.85) !important;
background-color: rgba(255, 255, 255, 0.12);
}
}
}
/* 克隆并自定义 ElMessage 样式,不会影响 ElMessage 原本样式,在 src/utils/message.ts 中调用自定义样式 ElMessage 方法即可,非暗黑模式在 src/style/element-plus.scss 文件进行了适配 */ /* 克隆并自定义 ElMessage 样式,不会影响 ElMessage 原本样式,在 src/utils/message.ts 中调用自定义样式 ElMessage 方法即可,非暗黑模式在 src/style/element-plus.scss 文件进行了适配 */
.pure-message { .pure-message {
background-image: initial !important; background-image: initial !important;

View File

@@ -69,6 +69,33 @@
} }
} }
/* 全局覆盖element-plus的el-dialog、el-drawer、el-message-box、el-notification组件右上角关闭图标的样式表现更鲜明 */
.el-dialog__headerbtn,
.el-message-box__headerbtn {
&:hover {
.el-dialog__close {
color: var(--el-color-info) !important;
}
}
}
.el-icon {
&.el-dialog__close,
&.el-drawer__close,
&.el-message-box__close,
&.el-notification__closeBtn {
width: 24px;
height: 24px;
outline: none;
border-radius: 4px;
transition: background-color 0.2s, color 0.2s;
&:hover {
color: rgba(0, 0, 0, 0.88) !important;
background-color: rgba(0, 0, 0, 0.06);
text-decoration: none;
}
}
}
/* 克隆并自定义 ElMessage 样式,不会影响 ElMessage 原本样式,在 src/utils/message.ts 中调用自定义样式 ElMessage 方法即可,暗黑模式在 src/style/dark.scss 文件进行了适配 */ /* 克隆并自定义 ElMessage 样式,不会影响 ElMessage 原本样式,在 src/utils/message.ts 中调用自定义样式 ElMessage 方法即可,暗黑模式在 src/style/dark.scss 文件进行了适配 */
.pure-message { .pure-message {
border-width: 0 !important; border-width: 0 !important;