diff --git a/src/assets/image/router/fuwu-bg-active.svg b/src/assets/image/router/fuwu-bg-active.svg deleted file mode 100644 index 0e17492..0000000 --- a/src/assets/image/router/fuwu-bg-active.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/src/assets/image/router/fuwu-bg.svg b/src/assets/image/router/fuwu-bg.svg index d06052a..4a7f7a3 100644 --- a/src/assets/image/router/fuwu-bg.svg +++ b/src/assets/image/router/fuwu-bg.svg @@ -1,10 +1,10 @@ - + - - + + diff --git a/src/assets/image/router/fuwu-gd-active.svg b/src/assets/image/router/fuwu-gd-active.svg deleted file mode 100644 index 132391a..0000000 --- a/src/assets/image/router/fuwu-gd-active.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/src/assets/image/router/fuwu-gd.svg b/src/assets/image/router/fuwu-gd.svg index b9fcc12..99b125e 100644 --- a/src/assets/image/router/fuwu-gd.svg +++ b/src/assets/image/router/fuwu-gd.svg @@ -2,10 +2,10 @@ - - - - + + + + diff --git a/src/assets/image/router/kehu-fw-active.svg b/src/assets/image/router/kehu-fw-active.svg deleted file mode 100644 index 731834d..0000000 --- a/src/assets/image/router/kehu-fw-active.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/src/assets/image/router/kehu-fw.svg b/src/assets/image/router/kehu-fw.svg index 5b26019..e0289c4 100644 --- a/src/assets/image/router/kehu-fw.svg +++ b/src/assets/image/router/kehu-fw.svg @@ -1,6 +1,6 @@ - - + + diff --git a/src/assets/image/router/kehu-jljf-active.svg b/src/assets/image/router/kehu-jljf-active.svg deleted file mode 100644 index 587ef00..0000000 --- a/src/assets/image/router/kehu-jljf-active.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/src/assets/image/router/kehu-jljf.svg b/src/assets/image/router/kehu-jljf.svg index 59c235f..98f8e57 100644 --- a/src/assets/image/router/kehu-jljf.svg +++ b/src/assets/image/router/kehu-jljf.svg @@ -1,6 +1,6 @@ - - + + diff --git a/src/assets/image/router/yiyuan-xx-active.svg b/src/assets/image/router/yiyuan-xx-active.svg deleted file mode 100644 index 1e64454..0000000 --- a/src/assets/image/router/yiyuan-xx-active.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/assets/image/router/yiyuan-xx.svg b/src/assets/image/router/yiyuan-xx.svg index ac573db..f695c51 100644 --- a/src/assets/image/router/yiyuan-xx.svg +++ b/src/assets/image/router/yiyuan-xx.svg @@ -1,7 +1,7 @@ - - - + + + diff --git a/src/assets/image/router/yy-gd-active.svg b/src/assets/image/router/yy-gd-active.svg deleted file mode 100644 index b0c2aec..0000000 --- a/src/assets/image/router/yy-gd-active.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/src/assets/image/router/yy-gd.svg b/src/assets/image/router/yy-gd.svg index ebd359e..d1f6707 100644 --- a/src/assets/image/router/yy-gd.svg +++ b/src/assets/image/router/yy-gd.svg @@ -1,12 +1,12 @@ - - - - - - + + + + + + diff --git a/src/assets/image/router/yy-gzt-active.svg b/src/assets/image/router/yy-gzt-active.svg deleted file mode 100644 index 45b386e..0000000 --- a/src/assets/image/router/yy-gzt-active.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/src/assets/image/router/yy-gzt.svg b/src/assets/image/router/yy-gzt.svg index a051427..df91d64 100644 --- a/src/assets/image/router/yy-gzt.svg +++ b/src/assets/image/router/yy-gzt.svg @@ -2,11 +2,11 @@ - - - - - + + + + + diff --git a/src/assets/image/router/yy-jf-active.svg b/src/assets/image/router/yy-jf-active.svg deleted file mode 100644 index 5bb585d..0000000 --- a/src/assets/image/router/yy-jf-active.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/assets/image/router/yy-jf.svg b/src/assets/image/router/yy-jf.svg index 5587250..e62ee99 100644 --- a/src/assets/image/router/yy-jf.svg +++ b/src/assets/image/router/yy-jf.svg @@ -1,7 +1,7 @@ - - - + + + diff --git a/src/assets/image/router/zhanghao-gl-active.svg b/src/assets/image/router/zhanghao-gl-active.svg deleted file mode 100644 index ea68274..0000000 --- a/src/assets/image/router/zhanghao-gl-active.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/assets/image/router/zhanghao-gl.svg b/src/assets/image/router/zhanghao-gl.svg index 8048704..79aebb4 100644 --- a/src/assets/image/router/zhanghao-gl.svg +++ b/src/assets/image/router/zhanghao-gl.svg @@ -1,7 +1,7 @@ - - + + diff --git a/src/assets/style/admin-common.scss b/src/assets/style/admin-common.scss index 19afa16..268341f 100644 --- a/src/assets/style/admin-common.scss +++ b/src/assets/style/admin-common.scss @@ -13,6 +13,25 @@ $primaryLightBlue: #3289fb; border: 1px solid #e0e0e0 !important; padding: 24px !important; + .pagination { + position: sticky; + bottom: 0; + z-index: 10; + background-color: #fff; + padding-bottom: 24px; + margin-top: 16px; + display: flex; + justify-content: flex-end; + } + + // 靠分页的padding + &.order-list, + &.order-report, + &.hospital-list, + &.account-list { + padding-bottom: 0 !important; + } + // 表格主题(与 order-list 中一致): // - 隐藏 el-table 外层伪元素边框,仅保留 cell 之间的分隔线 // - 表头浅色背景 + 中等字重 @@ -57,13 +76,6 @@ $primaryLightBlue: #3289fb; margin-left: auto !important; } } - - // 分页器 - .admin-pagination { - margin-top: 16px !important; - display: flex !important; - justify-content: flex-end !important; - } } // ========================================================== diff --git a/src/assets/style/index.scss b/src/assets/style/index.scss index a45d7a5..e69de29 100644 --- a/src/assets/style/index.scss +++ b/src/assets/style/index.scss @@ -1,4 +0,0 @@ -@use './theme/dark.scss'; -@use './theme/red.scss'; -@use './theme/blue.scss'; -@use './theme/purple.scss'; \ No newline at end of file diff --git a/src/assets/style/theme/blue.scss b/src/assets/style/theme/blue.scss deleted file mode 100644 index 0b11996..0000000 --- a/src/assets/style/theme/blue.scss +++ /dev/null @@ -1,205 +0,0 @@ -/** blue 穹宇蓝 */ -:root , -// 不跟随主题走的添加default-theme类 -.default-theme{ -/* 主题色&功能色 开始 */ - - // 品牌色 - --brand-color: #3289FB; - // 品牌色 hover - --brand-color-hover: #5298FC; - // 品牌色 active - --brand-color-active: #1B6FDB; - // 品牌色disabled - --brand-color-disabled: #B2D2FE; - // 品牌色focus - --brand-color-focus: #DCE9FE; - // 品牌色light交互状态使用 - --brand-color-light: #ECF2FF; - // 错误色 - --error-color: #FF4040; - // 错误色 hover - --error-color-hover: #FF7474; - // 错误色 active - --error-color-active: #DB3131; - // 错误色 disabled - --error-color-disabled: #FFB9B0; - // 错误色 focus - --error-color-focus: #FFD8D2; - // 错误色 light交互状态使用 - --error-color-light: #FFF0ED; - // 警示色 - --warning-color: #FF9000; - // 警示色 hover - --warning-color-hover: #FFA938; - // 警示色 active - --warning-color-active: #EA8A0E; - // 警示色 disabled - --warning-color-disabled: #FFC882; - // 警示色 focus - --warning-color-focus: #FFE2C2; - // 警示色 light交互状态使用 - --warning-color-light: #FFF4E9; - // 成功色 - --success-color: #1FBB79; - // 成功色 hover - --success-color-hover: #43C78F; - // 成功色 active - --success-color-active: #2BA471; - // 成功色 disabled - --success-color-disabled: #92DAB2; - // 成功色 focus - --success-color-focus: #C6F3D7; - // 成功色 light交互状态使用 - --success-color-light: #E3F9E9; - - /* 主题色&功能色 结束 */ - - - /* 文字&图标色彩 开始 */ - - // 主文本色 - --text-color-primary: #191919; - // 次文本色 - --text-color-secondary: #666666; - // 占位符文字色彩 - --text-color-placeholder: #999999; - // 文字disabled态 - --text-color-disabled: #BDBDBD; - // 文字反色色彩 - --text-color-anti: #FFFFFF; - // 文字反色背景 透明度 - --text-color-anti-opacity: rgba(255, 255, 255, 0.24); - // 主题色文字色彩 - --text-color-brand: var(--brand-color); - // 链接文字 - --text-color-link: var(--brand-color); - - /* 文字&图标色彩 结束 */ - - - /* 中性色彩交互token 开始 */ - - // 主要容器背景hover 次要层级页面背景hover - --bg-color-container-hover: #F5F7FA; - // 主要容器背景click 次要层级页面背景click - --bg-color-container-active: #EBEEF5; - // 次要容器背景hover - --bg-color-secondarycontainer-hover: #F4F6FA; - // 次要容器背景click - --bg-color-secondarycontainer-active: #E1E5ED; - // 组件背景hover 主要容器之上组件背景hover - --bg-color-component-hover: #E1E5ED; - //组件背景active 主要容器之上组件背景active - --bg-color-component-active: #B8BECA; - // 组件背景disabled 主要容器之上组件背景disabled - --bg-color-component-disabled: #F4F6FA; - - /* 中性色彩交互token 结束 */ - - - - /* 中性色彩 开始 */ - - // 默认页面底层背景 - --bg-color-page: #F4F6FA; - // 主要容器背景 次要层级页面背景 - --bg-color-container:#FFFFFF; - // 次要容器背景 - --bg-color-secondarycontainer: #F5F7FA; - // 组件背景 主要容器之上组件背景 - --bg-color-component: #EBEEF5; - // 默认组件分割线 - --component-stroke: #EBEEF5; - // 默认边框 - --component-border: #E1E5ED; - - /* 中性色彩 结束 */ - - // Element Plus 颜色变量,统一使用自定义颜色 - --el-color-primary: var(--brand-color); - --el-color-primary-light-3: var(--brand-color-hover); - --el-color-primary-light-5: var(--brand-color-active); - --el-color-primary-light-7: var(--brand-color-disabled); - --el-color-primary-light-8: var(--brand-color-focus); - --el-color-primary-light-9: var(--brand-color-light); - --el-color-primary-dark-2: var(--brand-color-hover); - - --el-color-success: var(--success-color); - --el-color-success-light-3: var(--success-color-hover); - --el-color-success-light-5: var(--success-color-active); - --el-color-success-light-7: var(--success-color-disabled); - --el-color-success-light-8: var(--success-color-focus); - --el-color-success-light-9: var(--success-color-light); - --el-color-success-dark-2: var(--success-color-hover); - - --el-color-warning: var(--warning-color); - --el-color-warning-light-3: var(--warning-color-hover); - --el-color-warning-light-5: var(--warning-color-active); - --el-color-warning-light-7: var(--warning-color-disabled); - --el-color-warning-light-8: var(--warning-color-focus); - --el-color-warning-light-9: var(--warning-color-light); - --el-color-warning-dark-2: var(--warning-color-hover); - - --el-color-danger: var(--error-color); - --el-color-danger-light-3: var(--error-color-hover); - --el-color-danger-light-5: var(--error-color-active); - --el-color-danger-light-7: var(--error-color-disabled); - --el-color-danger-light-8: var(--error-color-focus); - --el-color-danger-light-9: var(--error-color-light); - --el-color-danger-dark-2: var(--error-color-hover); - - --el-color-error: var(--error-color); - --el-color-error-light-3: var(--error-color-hover); - --el-color-error-light-5: var(--error-color-active); - --el-color-error-light-7: var(--error-color-disabled); - --el-color-error-light-8: var(--error-color-focus); - --el-color-error-light-9: var(--error-color-light); - --el-color-error-dark-2: var(--error-color-hover); - - --el-color-info: var(--text-color-secondary); - --el-color-info-light-3: var(--text-color-secondary); - --el-color-info-light-5: var(--text-color-placeholder); - --el-color-info-light-7: var(--text-color-disabled); - --el-color-info-light-8: var(--text-color-disabled); - --el-color-info-light-9: var(--text-color-disabled); - --el-color-info-dark-2: var(--text-color-secondary); - -// --el-box-shadow: 0px 12px 32px 4px rgba(0, 0, 0, 0.36), 0px 8px 20px rgba(0, 0, 0, 0.72); -// --el-box-shadow-light: 0px 0px 12px rgba(0, 0, 0, 0.72); -// --el-box-shadow-lighter: 0px 0px 6px rgba(0, 0, 0, 0.72); -// --el-box-shadow-dark: 0px 16px 48px 16px rgba(0, 0, 0, 0.72), 0px 12px 32px #000000, 0px 8px 16px -8px #000000; - --el-bg-color-page: var(--bg-color-page); - --el-bg-color: var(--bg-color-container); - --el-bg-color-overlay: var(--bg-color-secondarycontainer); - --el-text-color-primary: var(--text-color-primary); - --el-text-color-regular: var(--text-color-primary); - --el-text-color-secondary: var(--text-color-secondary); - --el-text-color-placeholder: var(--text-color-placeholder); - --el-text-color-disabled: var(--text-color-disabled); - --el-border-color-darker: var(--component-border); - --el-border-color-dark: var(--component-border); - --el-border-color: var(--component-stroke); - --el-border-color-light: var(--component-stroke); - --el-border-color-lighter: var(--component-stroke); - --el-border-color-extra-light: var(--component-stroke); - --el-fill-color-darker: var(--bg-color-container-active); - --el-fill-color-dark: var(--bg-color-secondarycontainer); - --el-fill-color: var(--bg-color-component); - --el-fill-color-light: var(--bg-color-component-hover); - --el-fill-color-lighter: var(--bg-color-container-hover); - --el-fill-color-extra-light: var(--bg-color-page); - --el-fill-color-blank: transparent; -// --el-mask-color: rgba(0, 0, 0, 0.8); -// --el-mask-color-extra-light: rgba(0, 0, 0, 0.3); - --el-menu-base-level-padding:8px; - --el-menu-level-padding:25px; - --el-menu-level:0; - --el-menu-item-height:40px; - --el-menu-hover-bg-color:var(--brand-color-light); - --el-text-color-secondary:var(--brand-color); - --el-menu-text-color:var(--text-color-secondary); - --el-menu-active-color:var(--brand-color); - --el-menu-active-background:var(--brand-color-light); - --el-font-size-base: 0.875rem -} \ No newline at end of file diff --git a/src/assets/style/theme/dark.scss b/src/assets/style/theme/dark.scss deleted file mode 100644 index 83eb331..0000000 --- a/src/assets/style/theme/dark.scss +++ /dev/null @@ -1,201 +0,0 @@ -/* 耀石黑 dark*/ -html.dark { - /* 主题色&功能色 开始 */ - - // 品牌色 - --brand-color: #1764ff; - // 品牌色 hover - --brand-color-hover: #2b7aff; - // 品牌色 active - --brand-color-active: #1557db; - // 品牌色disabled - --brand-color-disabled: #b2ccff; - // 品牌色focus - --brand-color-focus: #d9e5ff; - // 品牌色light交互状态使用 - --brand-color-light: #24365c; - // 错误色 - --error-color: #ff4040; - // 错误色 hover - --error-color-hover: #ff7474; - // 错误色 active - --error-color-active: #db3131; - // 错误色 disabled - --error-color-disabled: #ffb9b0; - // 错误色 focus - --error-color-focus: #ffd8d2; - // 错误色 light交互状态使用 - --error-color-light: #fff0ed; - // 警示色 - --warning-color: #ff9000; - // 警示色 hover - --warning-color-hover: #ffa938; - // 警示色 active - --warning-color-active: #ea8a0e; - // 警示色 disabled - --warning-color-disabled: #ffc882; - // 警示色 focus - --warning-color-focus: #ffe2c2; - // 警示色 light交互状态使用 - --warning-color-light: #fff4e9; - // 成功色 - --success-color: #1fbb79; - // 成功色 hover - --success-color-hover: #43c78f; - // 成功色 active - --success-color-active: #2ba471; - // 成功色 disabled - --success-color-disabled: #92dab2; - // 成功色 focus - --success-color-focus: #c6f3d7; - // 成功色 light交互状态使用 - --success-color-light: #e3f9e9; - - /* 主题色&功能色 结束 */ - - /* 文字&图标色彩 开始 */ - - --text-color-primary: #e6e6e6; - --text-color-secondary: #b3b3b3; - --text-color-placeholder: #808080; - --text-color-disabled: #808080; - --text-color-anti: #ffffff; - --text-color-anti-opacity: rgba(255, 255, 255, 0.24); - // 主题色文字色彩 - --text-color-brand: var(--brand-color); - // 链接文字 - --text-color-link: var(--brand-color); - - /* 文字&图标色彩 结束 */ - - /* 中性色彩交互token 开始 */ - - --bg-color-container-hover: #333333; - --bg-color-container-active: #404040; - --bg-color-secondarycontainer-hover: #404040; - --bg-color-secondarycontainer-active: #4d4d4d; - --bg-color-component-hover: #404040; - --bg-color-component-active: #4d4d4d; - --bg-color-component-disabled: #1a1a1a; - - /* 中性色彩交互token 结束 */ - - /* 中性色彩 开始 */ - - --bg-color-page: #181818; - --bg-color-container: #262626; - --bg-color-secondarycontainer: #333333; - --bg-color-component: #333333; - --component-stroke: #3c3c3c; - --component-border: #262626; - - /* 中性色彩 结束 */ - - // Element Plus 颜色变量,统一使用自定义颜色 - --el-color-primary: var(--brand-color); - --el-color-primary-light-3: var(--brand-color-hover); - --el-color-primary-light-5: var(--brand-color-active); - --el-color-primary-light-7: var(--brand-color-disabled); - --el-color-primary-light-8: var(--brand-color-focus); - --el-color-primary-light-9: var(--brand-color-light); - --el-color-primary-dark-2: var(--brand-color-hover); - - --el-color-success: var(--success-color); - --el-color-success-light-3: var(--success-color-hover); - --el-color-success-light-5: var(--success-color-active); - --el-color-success-light-7: var(--success-color-disabled); - --el-color-success-light-8: var(--success-color-focus); - --el-color-success-light-9: var(--success-color-light); - --el-color-success-dark-2: var(--success-color-hover); - - --el-color-warning: var(--warning-color); - --el-color-warning-light-3: var(--warning-color-hover); - --el-color-warning-light-5: var(--warning-color-active); - --el-color-warning-light-7: var(--warning-color-disabled); - --el-color-warning-light-8: var(--warning-color-focus); - --el-color-warning-light-9: var(--warning-color-light); - --el-color-warning-dark-2: var(--warning-color-hover); - - --el-color-danger: var(--error-color); - --el-color-danger-light-3: var(--error-color-hover); - --el-color-danger-light-5: var(--error-color-active); - --el-color-danger-light-7: var(--error-color-disabled); - --el-color-danger-light-8: var(--error-color-focus); - --el-color-danger-light-9: var(--error-color-light); - --el-color-danger-dark-2: var(--error-color-hover); - - --el-color-error: var(--error-color); - --el-color-error-light-3: var(--error-color-hover); - --el-color-error-light-5: var(--error-color-active); - --el-color-error-light-7: var(--error-color-disabled); - --el-color-error-light-8: var(--error-color-focus); - --el-color-error-light-9: var(--error-color-light); - --el-color-error-dark-2: var(--error-color-hover); - - --el-color-info: var(--text-color-secondary); - --el-color-info-light-3: var(--text-color-secondary); - --el-color-info-light-5: var(--text-color-placeholder); - --el-color-info-light-7: var(--text-color-disabled); - --el-color-info-light-8: var(--text-color-disabled); - --el-color-info-light-9: var(--text-color-disabled); - --el-color-info-dark-2: var(--text-color-secondary); - - // --el-box-shadow: 0px 12px 32px 4px rgba(0, 0, 0, 0.36), 0px 8px 20px rgba(0, 0, 0, 0.72); - // --el-box-shadow-light: 0px 0px 12px rgba(0, 0, 0, 0.72); - // --el-box-shadow-lighter: 0px 0px 6px rgba(0, 0, 0, 0.72); - // --el-box-shadow-dark: 0px 16px 48px 16px rgba(0, 0, 0, 0.72), 0px 12px 32px #000000, 0px 8px 16px -8px #000000; - --el-bg-color-page: var(--bg-color-page); - --el-bg-color: var(--bg-color-container); - --el-bg-color-overlay: var(--bg-color-secondarycontainer); - --el-text-color-primary: var(--text-color-primary); - --el-text-color-regular: var(--text-color-primary); - --el-text-color-secondary: var(--text-color-secondary); - --el-text-color-placeholder: var(--text-color-placeholder); - --el-text-color-disabled: var(--text-color-disabled); - --el-border-color-darker: var(--component-border); - --el-border-color-dark: var(--component-border); - --el-border-color: var(--component-stroke); - --el-border-color-light: var(--component-stroke); - --el-border-color-lighter: var(--component-stroke); - --el-border-color-extra-light: var(--component-stroke); - --el-fill-color-darker: var(--bg-color-container-active); - --el-fill-color-dark: var(--bg-color-secondarycontainer); - --el-fill-color: var(--bg-color-component); - --el-fill-color-light: var(--bg-color-component-hover); - --el-fill-color-lighter: var(--bg-color-container-hover); - --el-fill-color-extra-light: var(--bg-color-page); - --el-fill-color-blank: transparent; - --el-mask-color: rgba(0, 0, 0, 0.8); - --el-mask-color-extra-light: rgba(0, 0, 0, 0.3); - - --el-menu-base-level-padding: 8px; - --el-menu-level-padding: 25px; - --el-menu-level: 0; - --el-menu-item-height: 40px; - --el-menu-hover-bg-color: var(--brand-color-hover); - --el-text-color-secondary: var(--text-color-anti); - --el-menu-text-color: var(--text-color-secondary); - --el-menu-active-color: var(--text-color-anti); - --el-menu-active-background: var(--brand-color); -} - -html.dark .el-button { - --el-button-disabled-text-color: rgba(255, 255, 255, 0.5); -} - -html.dark .el-card { - --el-card-bg-color: var(--el-bg-color-overlay); -} - -html.dark .el-empty { - --el-empty-fill-color-0: var(--el-color-black); - --el-empty-fill-color-1: #4b4b52; - --el-empty-fill-color-2: #36383d; - --el-empty-fill-color-3: #1e1e20; - --el-empty-fill-color-4: #262629; - --el-empty-fill-color-5: #202124; - --el-empty-fill-color-6: #212224; - --el-empty-fill-color-7: #1b1c1f; - --el-empty-fill-color-8: #1c1d1f; - --el-empty-fill-color-9: #18181a; -} diff --git a/src/assets/style/theme/purple.scss b/src/assets/style/theme/purple.scss deleted file mode 100644 index 60b0ae4..0000000 --- a/src/assets/style/theme/purple.scss +++ /dev/null @@ -1,203 +0,0 @@ -/** purple 星轨紫 */ -html.purple { -/* 主题色&功能色 开始 */ - - // 品牌色 - --brand-color: #6155F5; - // 品牌色 hover - --brand-color-hover: #8470F8; - // 品牌色 active - --brand-color-active: #4338CA; - // 品牌色disabled - --brand-color-disabled: #C7BDFC; - // 品牌色focus - --brand-color-focus: #E3DEFC; - // 品牌色light交互状态使用 - --brand-color-light: #F3F0FE; - // 错误色 - --error-color: #FF4040; - // 错误色 hover - --error-color-hover: #FF7474; - // 错误色 active - --error-color-active: #DB3131; - // 错误色 disabled - --error-color-disabled: #FFB9B0; - // 错误色 focus - --error-color-focus: #FFD8D2; - // 错误色 light交互状态使用 - --error-color-light: #FFF0ED; - // 警示色 - --warning-color: #FF9000; - // 警示色 hover - --warning-color-hover: #FFA938; - // 警示色 active - --warning-color-active: #EA8A0E; - // 警示色 disabled - --warning-color-disabled: #FFC882; - // 警示色 focus - --warning-color-focus: #FFE2C2; - // 警示色 light交互状态使用 - --warning-color-light: #FFF4E9; - // 成功色 - --success-color: #1FBB79; - // 成功色 hover - --success-color-hover: #43C78F; - // 成功色 active - --success-color-active: #2BA471; - // 成功色 disabled - --success-color-disabled: #92DAB2; - // 成功色 focus - --success-color-focus: #C6F3D7; - // 成功色 light交互状态使用 - --success-color-light: #E3F9E9; - - /* 主题色&功能色 结束 */ - - - /* 文字&图标色彩 开始 */ - - // 主文本色 - --text-color-primary: #191919; - // 次文本色 - --text-color-secondary: #666666; - // 占位符文字色彩 - --text-color-placeholder: #999999; - // 文字disabled态 - --text-color-disabled: #BDBDBD; - // 文字反色色彩 - --text-color-anti: #FFFFFF; - // 文字反色背景 透明度 - --text-color-anti-opacity: rgba(255, 255, 255, 0.24); - // 主题色文字色彩 - --text-color-brand: var(--brand-color); - // 链接文字 - --text-color-link: var(--brand-color); - - /* 文字&图标色彩 结束 */ - - - /* 中性色彩交互token 开始 */ - - // 主要容器背景hover 次要层级页面背景hover - --bg-color-container-hover: #F5F7FA; - // 主要容器背景click 次要层级页面背景click - --bg-color-container-active: #EBEEF5; - // 次要容器背景hover - --bg-color-secondarycontainer-hover: #F4F6FA; - // 次要容器背景click - --bg-color-secondarycontainer-active: #E1E5ED; - // 组件背景hover 主要容器之上组件背景hover - --bg-color-component-hover: #E1E5ED; - //组件背景active 主要容器之上组件背景active - --bg-color-component-active: #B8BECA; - // 组件背景disabled 主要容器之上组件背景disabled - --bg-color-component-disabled: #F4F6FA; - - /* 中性色彩交互token 结束 */ - - - - /* 中性色彩 开始 */ - - // 默认页面底层背景 - --bg-color-page: #F4F6FA; - // 主要容器背景 次要层级页面背景 - --bg-color-container:#FFFFFF; - // 次要容器背景 - --bg-color-secondarycontainer: #F5F7FA; - // 组件背景 主要容器之上组件背景 - --bg-color-component: #EBEEF5; - // 默认组件分割线 - --component-stroke: #EBEEF5; - // 默认边框 - --component-border: #E1E5ED; - - /* 中性色彩 结束 */ - - // Element Plus 颜色变量,统一使用自定义颜色 - --el-color-primary: var(--brand-color); - --el-color-primary-light-3: var(--brand-color-hover); - --el-color-primary-light-5: var(--brand-color-active); - --el-color-primary-light-7: var(--brand-color-disabled); - --el-color-primary-light-8: var(--brand-color-focus); - --el-color-primary-light-9: var(--brand-color-light); - --el-color-primary-dark-2: var(--brand-color-hover); - - --el-color-success: var(--success-color); - --el-color-success-light-3: var(--success-color-hover); - --el-color-success-light-5: var(--success-color-active); - --el-color-success-light-7: var(--success-color-disabled); - --el-color-success-light-8: var(--success-color-focus); - --el-color-success-light-9: var(--success-color-light); - --el-color-success-dark-2: var(--success-color-hover); - - --el-color-warning: var(--warning-color); - --el-color-warning-light-3: var(--warning-color-hover); - --el-color-warning-light-5: var(--warning-color-active); - --el-color-warning-light-7: var(--warning-color-disabled); - --el-color-warning-light-8: var(--warning-color-focus); - --el-color-warning-light-9: var(--warning-color-light); - --el-color-warning-dark-2: var(--warning-color-hover); - - --el-color-danger: var(--error-color); - --el-color-danger-light-3: var(--error-color-hover); - --el-color-danger-light-5: var(--error-color-active); - --el-color-danger-light-7: var(--error-color-disabled); - --el-color-danger-light-8: var(--error-color-focus); - --el-color-danger-light-9: var(--error-color-light); - --el-color-danger-dark-2: var(--error-color-hover); - - --el-color-error: var(--error-color); - --el-color-error-light-3: var(--error-color-hover); - --el-color-error-light-5: var(--error-color-active); - --el-color-error-light-7: var(--error-color-disabled); - --el-color-error-light-8: var(--error-color-focus); - --el-color-error-light-9: var(--error-color-light); - --el-color-error-dark-2: var(--error-color-hover); - - --el-color-info: var(--text-color-secondary); - --el-color-info-light-3: var(--text-color-secondary); - --el-color-info-light-5: var(--text-color-placeholder); - --el-color-info-light-7: var(--text-color-disabled); - --el-color-info-light-8: var(--text-color-disabled); - --el-color-info-light-9: var(--text-color-disabled); - --el-color-info-dark-2: var(--text-color-secondary); - -// --el-box-shadow: 0px 12px 32px 4px rgba(0, 0, 0, 0.36), 0px 8px 20px rgba(0, 0, 0, 0.72); -// --el-box-shadow-light: 0px 0px 12px rgba(0, 0, 0, 0.72); -// --el-box-shadow-lighter: 0px 0px 6px rgba(0, 0, 0, 0.72); -// --el-box-shadow-dark: 0px 16px 48px 16px rgba(0, 0, 0, 0.72), 0px 12px 32px #000000, 0px 8px 16px -8px #000000; - --el-bg-color-page: var(--bg-color-page); - --el-bg-color: var(--bg-color-container); - --el-bg-color-overlay: var(--bg-color-secondarycontainer); - --el-text-color-primary: var(--text-color-primary); - --el-text-color-regular: var(--text-color-primary); - --el-text-color-secondary: var(--text-color-secondary); - --el-text-color-placeholder: var(--text-color-placeholder); - --el-text-color-disabled: var(--text-color-disabled); - --el-border-color-darker: var(--component-border); - --el-border-color-dark: var(--component-border); - --el-border-color: var(--component-stroke); - --el-border-color-light: var(--component-stroke); - --el-border-color-lighter: var(--component-stroke); - --el-border-color-extra-light: var(--component-stroke); - --el-fill-color-darker: var(--bg-color-container-active); - --el-fill-color-dark: var(--bg-color-secondarycontainer); - --el-fill-color: var(--bg-color-component); - --el-fill-color-light: var(--bg-color-component-hover); - --el-fill-color-lighter: var(--bg-color-container-hover); - --el-fill-color-extra-light: var(--bg-color-page); - --el-fill-color-blank: transparent; -// --el-mask-color: rgba(0, 0, 0, 0.8); -// --el-mask-color-extra-light: rgba(0, 0, 0, 0.3); - - --el-menu-base-level-padding:8px; - --el-menu-level-padding:25px; - --el-menu-level:0; - --el-menu-item-height:40px; - --el-menu-hover-bg-color:var(--brand-color-light); - --el-text-color-secondary:var(--brand-color); - --el-menu-text-color:var(--text-color-secondary); - --el-menu-active-color:var(--brand-color); - --el-menu-active-background:var(--brand-color-light); -} \ No newline at end of file diff --git a/src/assets/style/theme/red.scss b/src/assets/style/theme/red.scss deleted file mode 100644 index 0453b30..0000000 --- a/src/assets/style/theme/red.scss +++ /dev/null @@ -1,202 +0,0 @@ -/** 流金粉 red */ -html.red { -/* 主题色&功能色 开始 */ - - // 品牌色 - --brand-color: #DE6262; - // 品牌色 hover - --brand-color-hover: #EA8585; - // 品牌色 active - --brand-color-active: #B73E3E; - // 品牌色disabled - --brand-color-disabled: rgba(222,98,98,0.4); - // 品牌色focus - --brand-color-focus: rgba(222,98,98,0.2); - // 品牌色light交互状态使用 - --brand-color-light: rgba(222,98,98,0.2); - // 错误色 - --error-color: #FF4040; - // 错误色 hover - --error-color-hover: #FF7474; - // 错误色 active - --error-color-active: #DB3131; - // 错误色 disabled - --error-color-disabled: #FFB9B0; - // 错误色 focus - --error-color-focus: #FFD8D2; - // 错误色 light交互状态使用 - --error-color-light: #FFF0ED; - // 警示色 - --warning-color: #FF9000; - // 警示色 hover - --warning-color-hover: #FFA938; - // 警示色 active - --warning-color-active: #EA8A0E; - // 警示色 disabled - --warning-color-disabled: #FFC882; - // 警示色 focus - --warning-color-focus: #FFE2C2; - // 警示色 light交互状态使用 - --warning-color-light: #FFF4E9; - // 成功色 - --success-color: #1FBB79; - // 成功色 hover - --success-color-hover: #43C78F; - // 成功色 active - --success-color-active: #2BA471; - // 成功色 disabled - --success-color-disabled: #92DAB2; - // 成功色 focus - --success-color-focus: #C6F3D7; - // 成功色 light交互状态使用 - --success-color-light: #E3F9E9; - - /* 主题色&功能色 结束 */ - - - /* 文字&图标色彩 开始 */ - - // 主文本色 - --text-color-primary: #191919; - // 次文本色 - --text-color-secondary: #666666; - // 占位符文字色彩 - --text-color-placeholder: #999999; - // 文字disabled态 - --text-color-disabled: #BDBDBD; - // 文字反色色彩 - --text-color-anti: #FFFFFF; - // 文字反色背景 透明度 - --text-color-anti-opacity: rgba(255, 255, 255, 0.24); - // 主题色文字色彩 - --text-color-brand: var(--brand-color); - // 链接文字 - --text-color-link: var(--brand-color); - - /* 文字&图标色彩 结束 */ - - - /* 中性色彩交互token 开始 */ - - // 主要容器背景hover 次要层级页面背景hover - --bg-color-container-hover: #F5F7FA; - // 主要容器背景click 次要层级页面背景click - --bg-color-container-active: #EBEEF5; - // 次要容器背景hover - --bg-color-secondarycontainer-hover: #F4F6FA; - // 次要容器背景click - --bg-color-secondarycontainer-active: #E1E5ED; - // 组件背景hover 主要容器之上组件背景hover - --bg-color-component-hover: #E1E5ED; - //组件背景active 主要容器之上组件背景active - --bg-color-component-active: #B8BECA; - // 组件背景disabled 主要容器之上组件背景disabled - --bg-color-component-disabled: #F4F6FA; - - /* 中性色彩交互token 结束 */ - - - - /* 中性色彩 开始 */ - - // 默认页面底层背景 - --bg-color-page: #F4F6FA; - // 主要容器背景 次要层级页面背景 - --bg-color-container:#FFFFFF; - // 次要容器背景 - --bg-color-secondarycontainer: #F5F7FA; - // 组件背景 主要容器之上组件背景 - --bg-color-component: #EBEEF5; - // 默认组件分割线 - --component-stroke: #EBEEF5; - // 默认边框 - --component-border: #E1E5ED; - - /* 中性色彩 结束 */ - - // Element Plus 颜色变量,统一使用自定义颜色 - --el-color-primary: var(--brand-color); - --el-color-primary-light-3: var(--brand-color-hover); - --el-color-primary-light-5: var(--brand-color-active); - --el-color-primary-light-7: var(--brand-color-disabled); - --el-color-primary-light-8: var(--brand-color-focus); - --el-color-primary-light-9: var(--brand-color-light); - --el-color-primary-dark-2: var(--brand-color-hover); - - --el-color-success: var(--success-color); - --el-color-success-light-3: var(--success-color-hover); - --el-color-success-light-5: var(--success-color-active); - --el-color-success-light-7: var(--success-color-disabled); - --el-color-success-light-8: var(--success-color-focus); - --el-color-success-light-9: var(--success-color-light); - --el-color-success-dark-2: var(--success-color-hover); - - --el-color-warning: var(--warning-color); - --el-color-warning-light-3: var(--warning-color-hover); - --el-color-warning-light-5: var(--warning-color-active); - --el-color-warning-light-7: var(--warning-color-disabled); - --el-color-warning-light-8: var(--warning-color-focus); - --el-color-warning-light-9: var(--warning-color-light); - --el-color-warning-dark-2: var(--warning-color-hover); - - --el-color-danger: var(--error-color); - --el-color-danger-light-3: var(--error-color-hover); - --el-color-danger-light-5: var(--error-color-active); - --el-color-danger-light-7: var(--error-color-disabled); - --el-color-danger-light-8: var(--error-color-focus); - --el-color-danger-light-9: var(--error-color-light); - --el-color-danger-dark-2: var(--error-color-hover); - - --el-color-error: var(--error-color); - --el-color-error-light-3: var(--error-color-hover); - --el-color-error-light-5: var(--error-color-active); - --el-color-error-light-7: var(--error-color-disabled); - --el-color-error-light-8: var(--error-color-focus); - --el-color-error-light-9: var(--error-color-light); - --el-color-error-dark-2: var(--error-color-hover); - - --el-color-info: var(--text-color-secondary); - --el-color-info-light-3: var(--text-color-secondary); - --el-color-info-light-5: var(--text-color-placeholder); - --el-color-info-light-7: var(--text-color-disabled); - --el-color-info-light-8: var(--text-color-disabled); - --el-color-info-light-9: var(--text-color-disabled); - --el-color-info-dark-2: var(--text-color-secondary); - -// --el-box-shadow: 0px 12px 32px 4px rgba(0, 0, 0, 0.36), 0px 8px 20px rgba(0, 0, 0, 0.72); -// --el-box-shadow-light: 0px 0px 12px rgba(0, 0, 0, 0.72); -// --el-box-shadow-lighter: 0px 0px 6px rgba(0, 0, 0, 0.72); -// --el-box-shadow-dark: 0px 16px 48px 16px rgba(0, 0, 0, 0.72), 0px 12px 32px #000000, 0px 8px 16px -8px #000000; - --el-bg-color-page: var(--bg-color-page); - --el-bg-color: var(--bg-color-container); - --el-bg-color-overlay: var(--bg-color-secondarycontainer); - --el-text-color-primary: var(--text-color-primary); - --el-text-color-regular: var(--text-color-primary); - --el-text-color-secondary: var(--text-color-secondary); - --el-text-color-placeholder: var(--text-color-placeholder); - --el-text-color-disabled: var(--text-color-disabled); - --el-border-color-darker: var(--component-border); - --el-border-color-dark: var(--component-border); - --el-border-color: var(--component-stroke); - --el-border-color-light: var(--component-stroke); - --el-border-color-lighter: var(--component-stroke); - --el-border-color-extra-light: var(--component-stroke); - --el-fill-color-darker: var(--bg-color-container-active); - --el-fill-color-dark: var(--bg-color-secondarycontainer); - --el-fill-color: var(--bg-color-component); - --el-fill-color-light: var(--bg-color-component-hover); - --el-fill-color-lighter: var(--bg-color-container-hover); - --el-fill-color-extra-light: var(--bg-color-page); - --el-fill-color-blank: transparent; -// --el-mask-color: rgba(0, 0, 0, 0.8); -// --el-mask-color-extra-light: rgba(0, 0, 0, 0.3); - --el-menu-base-level-padding:8px; - --el-menu-level-padding:25px; - --el-menu-level:0; - --el-menu-item-height:40px; - --el-menu-hover-bg-color:var(--brand-color-light); - --el-text-color-secondary:var(--brand-color); - --el-menu-text-color:var(--text-color-secondary); - --el-menu-active-color:var(--brand-color); - --el-menu-active-background:var(--brand-color-light); -} diff --git a/src/components/layout/AdminLayout.vue b/src/components/layout/AdminLayout.vue index 846af1f..ccd5209 100644 --- a/src/components/layout/AdminLayout.vue +++ b/src/components/layout/AdminLayout.vue @@ -11,13 +11,8 @@
- - - + + @@ -72,9 +67,9 @@
-
{{ t.name }}
@@ -117,6 +112,7 @@ import { ArrowDown } from "@element-plus/icons-vue"; import SvgIcon from "@/components/SvgIcon/index.vue"; import { useUserStore } from "@/stores/api/user"; import { useThemeStore } from "@/stores/theme"; +import { PRESET_THEMES } from "@/stores/theme/buildThemeVars.js"; import { useOrderDialogStore } from "@/stores/orderDialog"; import { useSignInDialogStore } from "@/stores/signInDialog"; import { useRewardResultStore } from "@/stores/rewardResult"; @@ -129,28 +125,6 @@ import AssetsDialog from "@/views/hospital/AssetsDialog.vue"; import { getPoints, getPointsDetails } from "@/service/modular/hospital"; import dayjs from "dayjs"; -// 顶部菜单图标(直接以静态资源方式 import,绕开 SvgIcon 的 fill 干扰) -// 管理端 -import fuwuGd from "@/assets/image/router/fuwu-gd.svg"; -import fuwuGdActive from "@/assets/image/router/fuwu-gd-active.svg"; -import fuwuBg from "@/assets/image/router/fuwu-bg.svg"; -import fuwuBgActive from "@/assets/image/router/fuwu-bg-active.svg"; -import yiyuanXx from "@/assets/image/router/yiyuan-xx.svg"; -import yiyuanXxActive from "@/assets/image/router/yiyuan-xx-active.svg"; -import kehuFw from "@/assets/image/router/kehu-fw.svg"; -import kehuFwActive from "@/assets/image/router/kehu-fw-active.svg"; -import kehuJljf from "@/assets/image/router/kehu-jljf.svg"; -import kehuJljfActive from "@/assets/image/router/kehu-jljf-active.svg"; -import zhanghaoGl from "@/assets/image/router/zhanghao-gl.svg"; -import zhanghaoGlActive from "@/assets/image/router/zhanghao-gl-active.svg"; -// 医院端 -import yyGzt from "@/assets/image/router/yy-gzt.svg"; -import yyGztActive from "@/assets/image/router/yy-gzt-active.svg"; -import yyGd from "@/assets/image/router/yy-gd.svg"; -import yyGdActive from "@/assets/image/router/yy-gd-active.svg"; -import yyJf from "@/assets/image/router/yy-jf.svg"; -import yyJfActive from "@/assets/image/router/yy-jf-active.svg"; - // 头像(按性别) import avatarMale from "@/assets/image/avatar-male.svg"; import avatarFemale from "@/assets/image/avatar-female.svg"; @@ -252,89 +226,43 @@ const openAssetsDialogWithFreshData = async () => { } }; -// 预设主题配置(与现有 scss 主题保持一致) -const presetThemes = [ - { - borderColor: "#3289FB", - boxShadow: "0 4px 12px 0 rgba(50, 137, 251, 0.5)", - value: "blue", - name: "穹宇蓝", - desc: "深邃星空\n科技感十足", - preview: "linear-gradient(to bottom, #3289FB 0%, #77B2FF 100%)", - }, - { - borderColor: "#6155F5", - boxShadow: "0 4px 12px 0 rgba(97, 85, 245, 0.5)", - value: "purple", - name: "星轨紫", - desc: "神秘优雅\n梦幻氛围", - preview: "linear-gradient(to bottom, #6155F5 0%, #9B93FF 100%)", - }, - { - borderColor: "#DE6262", - boxShadow: "0 4px 12px 0 rgba(222, 98, 98, 0.5)", - value: "red", - name: "流金粉", - desc: "晨雾染金\n自带光芒", - preview: "linear-gradient(to bottom, #DE6262 0%, #FF988B 100%)", - }, -]; +// 预设主题配置:颜色 / 渐变端点 / 阴影 / 名称 / 描述均来自 buildThemeVars.PRESET_THEMES; +// preview 按当前 brandColor + gradientTo 组装,保持 to bottom(卡片圆球视觉)。 +const presetThemes = computed(() => + Object.entries(PRESET_THEMES).map( + ([value, { borderColor, gradientTo, boxShadow, name, desc }]) => ({ + value, + borderColor, + preview: `linear-gradient(to bottom, ${borderColor} 0%, ${gradientTo} 100%)`, + boxShadow, + name, + desc, + }), + ), +); // 选择预设主题 const handlePresetTheme = (value) => { themeStore.setTheme(value); }; -// 图标查找表:route meta.icon -> { normal, active } -// 管理端 SVG -const ICON_MAP = { - "admin-router-fuwu-gd": { normal: fuwuGd, active: fuwuGdActive }, - "admin-router-fuwu-bg": { normal: fuwuBg, active: fuwuBgActive }, - "admin-router-yiyuan-xx": { normal: yiyuanXx, active: yiyuanXxActive }, - "admin-router-kehu-fw": { normal: kehuFw, active: kehuFwActive }, - "admin-router-kehu-jljf": { normal: kehuJljf, active: kehuJljfActive }, - "admin-router-zhanghao-gl": { normal: zhanghaoGl, active: zhanghaoGlActive }, -}; -// 医院端 SVG -const HOSPITAL_SVG_ICON_MAP = { - "hospital-router-yy-gzt": { normal: yyGzt, active: yyGztActive }, - "hospital-router-yy-gd": { normal: yyGd, active: yyGdActive }, - "hospital-router-yy-jf": { normal: yyJf, active: yyJfActive }, -}; -// 当前 hover 的菜单项 path -const hoveredPath = ref(""); -// 判断菜单项是否处于激活态 -const isActiveMenu = (path) => { - if (!path || !route.path) return false; - return route.path === path; -}; - -// hover 或激活时都用 active 图标 -const isMenuHoveredOrActive = (path) => { - return isActiveMenu(path) || hoveredPath.value === path; -}; // 顶部水平菜单:根据当前顶层路由(/admin 或 /hospital)动态生成 +// 图标 name 直接使用 meta.icon(去掉 admin-/hospital- 前缀后即为 SvgIcon 的 name) const sideRoutes = computed(() => { const groupPath = isHospitalMode.value ? "/hospital" : "/admin"; const groupRoute = route.matched.find((r) => r.path === groupPath); if (!groupRoute || !groupRoute.children) return []; return groupRoute.children .filter((c) => c.meta?.title && !c.meta?.hidden && !c.path.includes(":")) - .map((c) => { - // 管理端 / 医院端都按 SVG(normal + active)查表 - const iconMap = isHospitalMode.value ? HOSPITAL_SVG_ICON_MAP : ICON_MAP; - const icon = iconMap[c.meta?.icon]; - return { - path: `${groupPath}/${c.path}`, - title: c.meta.title, - iconUrl: icon?.normal || "", - iconUrlActive: icon?.active || "", - }; - }); + .map((c) => ({ + path: `${groupPath}/${c.path}`, + title: c.meta.title, + iconName: (c.meta?.icon || "").replace(/^(admin|hospital)-/, ""), + })); }); const currentTitle = computed(() => { @@ -359,7 +287,7 @@ const handleCommand = async (cmd) => { if (cmd === "logout") { try { await ElMessageBox.confirm("确定要退出登录吗?", "提示", { - confirmButtonText: "退出", + confirmButtonText: "确定", cancelButtonText: "取消", type: "warning", }); @@ -388,7 +316,6 @@ const handleCommand = async (cmd) => { .admin-header { flex-shrink: 0; - height: 96px; display: flex; align-items: center; justify-content: space-between; @@ -397,6 +324,7 @@ const handleCommand = async (cmd) => { border-radius: 16px 16px 16px 16px; border: 1px solid rgba(0, 0, 0, 0.1); background: linear-gradient(to right, #f9faff 0, #f9faff 75%, #a6cffe 100%); + background: linear-gradient(to right, #f9faff 0, #f9faff 75%, var(--el-color-primary-light-8) 100%); .logo-bar { display: flex; @@ -409,7 +337,7 @@ const handleCommand = async (cmd) => { height: 100%; .logo-text { - background: linear-gradient(to right, #3fc5fd, #3b90fa); + background: var(--linear-right); -webkit-background-clip: text; -webkit-text-fill-color: transparent; font-size: 22px; @@ -439,8 +367,9 @@ const handleCommand = async (cmd) => { padding: 0 16px; border-radius: 18px; font-weight: 500; - background: linear-gradient(90deg, #3289FB 0%, #00B2FF 100%); - border-radius: 28px 28px 28px 28px; + // background: linear-gradient(90deg, #3289FB 0%, #00B2FF 100%); + background: var(--linear-right); + border-radius: 28px 28px 28px 28px !important; border: 1px solid rgba(255, 255, 255, 0.15); width: 155px; height: 43px; @@ -498,7 +427,7 @@ const handleCommand = async (cmd) => { &:hover { // background-color: rgba(50, 137, 251, 0.08) !important; - color: #3289fb !important; + color: var(--brand-color) !important; } } @@ -506,7 +435,7 @@ const handleCommand = async (cmd) => { :deep(.el-menu-item.is-active) { font-weight: 400; font-size: 16px; - color: #3289fb !important; + color: var(--brand-color) !important; background-color: transparent !important; border-bottom: none !important; @@ -531,6 +460,7 @@ const handleCommand = async (cmd) => { vertical-align: middle; object-fit: contain; flex-shrink: 0; + color: currentColor; } // 医院端 Element Plus 图标尺寸 @@ -611,12 +541,12 @@ const handleCommand = async (cmd) => { flex-direction: column; align-items: center; - &:hover { - border-color: var(--border-color); + &:hover { + border-color: var(--brand-color); } &.active { - border-color: var(--border-color); + border-color: var(--brand-color); } } diff --git a/src/main.js b/src/main.js index e136a5c..d63ff95 100644 --- a/src/main.js +++ b/src/main.js @@ -30,9 +30,4 @@ app.use(router); app.use(ElementPlus); app.mount("#app"); -// 初始化主题 -import { useThemeStore } from "./stores/theme"; -const themeStore = useThemeStore(); - -// 应用保存的主题到 html -themeStore.applyTheme(themeStore.themeValue); +// 主题在 stores/theme setup 内已自动初始化,无须在 main.js 手动调用 diff --git a/src/stores/theme/buildCustomThemeVars.js b/src/stores/theme/buildCustomThemeVars.js deleted file mode 100644 index 4f07350..0000000 --- a/src/stores/theme/buildCustomThemeVars.js +++ /dev/null @@ -1,147 +0,0 @@ -const clamp = (value, min, max) => Math.min(max, Math.max(min, value)); - -const hueToRgb = (p, q, t) => { - let temp = t; - if (temp < 0) temp += 1; - if (temp > 1) temp -= 1; - if (temp < 1 / 6) return p + (q - p) * 6 * temp; - if (temp < 1 / 2) return q; - if (temp < 2 / 3) return p + (q - p) * (2 / 3 - temp) * 6; - return p; -}; - -const hslToRgb = (h, s, l) => { - const hue = (((h % 360) + 360) % 360) / 360; - const saturation = clamp(s, 0, 100) / 100; - const lightness = clamp(l, 0, 100) / 100; - - if (saturation === 0) { - const gray = Math.round(lightness * 255); - return { r: gray, g: gray, b: gray }; - } - - const q = - lightness < 0.5 - ? lightness * (1 + saturation) - : lightness + saturation - lightness * saturation; - const p = 2 * lightness - q; - - return { - r: Math.round(hueToRgb(p, q, hue + 1 / 3) * 255), - g: Math.round(hueToRgb(p, q, hue) * 255), - b: Math.round(hueToRgb(p, q, hue - 1 / 3) * 255), - }; -}; - -const parseColor = (color) => { - const value = (color || "").trim(); - - if (value.startsWith("#")) { - const normalized = value.replace("#", ""); - - if (normalized.length === 3 || normalized.length === 4) { - const full = normalized - .split("") - .map((item) => item + item) - .join(""); - const hasAlpha = normalized.length === 4; - return { - r: Number.parseInt(full.slice(0, 2), 16), - g: Number.parseInt(full.slice(2, 4), 16), - b: Number.parseInt(full.slice(4, 6), 16), - a: hasAlpha ? Number.parseInt(full.slice(6, 8), 16) / 255 : 1, - }; - } - - if (normalized.length === 6 || normalized.length === 8) { - const hasAlpha = normalized.length === 8; - return { - r: Number.parseInt(normalized.slice(0, 2), 16), - g: Number.parseInt(normalized.slice(2, 4), 16), - b: Number.parseInt(normalized.slice(4, 6), 16), - a: hasAlpha ? Number.parseInt(normalized.slice(6, 8), 16) / 255 : 1, - }; - } - } - - const rgbaMatch = value.match(/rgba?\(([^)]+)\)/i); - if (rgbaMatch) { - const [r = 0, g = 0, b = 0, a = 1] = rgbaMatch[1] - .split(",") - .map((item) => item.trim()); - return { - r: clamp(Number.parseFloat(r), 0, 255), - g: clamp(Number.parseFloat(g), 0, 255), - b: clamp(Number.parseFloat(b), 0, 255), - a: clamp(Number.parseFloat(a), 0, 1), - }; - } - - const hslaMatch = value.match(/hsla?\(([^)]+)\)/i); - if (hslaMatch) { - const [h = 0, s = 0, l = 0, a = 1] = hslaMatch[1] - .split(",") - .map((item) => item.trim().replace("%", "")); - const rgb = hslToRgb( - Number.parseFloat(h), - Number.parseFloat(s), - Number.parseFloat(l), - ); - return { - ...rgb, - a: clamp(Number.parseFloat(a), 0, 1), - }; - } - - return { r: 23, g: 100, b: 255, a: 1 }; -}; - -const colorToCss = ({ r, g, b, a = 1 }) => { - const alpha = clamp(a, 0, 1); - if (alpha < 1) { - return `rgba(${Math.round(r)}, ${Math.round(g)}, ${Math.round(b)}, ${Number(alpha.toFixed(3))})`; - } - - const toHex = (value) => - clamp(Math.round(value), 0, 255).toString(16).padStart(2, "0"); - return `#${toHex(r)}${toHex(g)}${toHex(b)}`.toUpperCase(); -}; - -const mixColor = (color, target, amount) => { - const sourceRgb = parseColor(color); - const targetRgb = parseColor(target); - return colorToCss({ - r: sourceRgb.r + (targetRgb.r - sourceRgb.r) * amount, - g: sourceRgb.g + (targetRgb.g - sourceRgb.g) * amount, - b: sourceRgb.b + (targetRgb.b - sourceRgb.b) * amount, - a: sourceRgb.a, - }); -}; - -const colorToRgba = (color, alpha) => { - const { r, g, b, a } = parseColor(color); - const nextAlpha = clamp(a * alpha, 0, 1); - return `rgba(${Math.round(r)}, ${Math.round(g)}, ${Math.round(b)}, ${Number(nextAlpha.toFixed(3))})`; -}; - -export const buildCustomThemeVars = (brandColor) => ({ - "--brand-color": brandColor, - "--brand-color-hover": mixColor(brandColor, "#FFFFFF", 0.12), - "--brand-color-active": mixColor(brandColor, "#000000", 0.14), - "--brand-color-disabled": colorToRgba(brandColor, 0.4), - "--brand-color-focus": colorToRgba(brandColor, 0.18), - "--brand-color-light": colorToRgba(brandColor, 0.12), - "--text-color-brand": brandColor, - "--text-color-link": brandColor, - "--el-color-primary": brandColor, - "--el-color-primary-light-3": mixColor(brandColor, "#FFFFFF", 0.12), - "--el-color-primary-light-5": mixColor(brandColor, "#FFFFFF", 0.28), - "--el-color-primary-light-7": mixColor(brandColor, "#FFFFFF", 0.48), - "--el-color-primary-light-8": mixColor(brandColor, "#FFFFFF", 0.64), - "--el-color-primary-light-9": mixColor(brandColor, "#FFFFFF", 0.82), - "--el-color-primary-dark-2": mixColor(brandColor, "#000000", 0.14), - "--el-menu-hover-bg-color": colorToRgba(brandColor, 0.12), - "--el-menu-active-color": brandColor, - "--el-menu-active-background": colorToRgba(brandColor, 0.12), - "--el-text-color-secondary": brandColor, -}); diff --git a/src/stores/theme/buildThemeVars.js b/src/stores/theme/buildThemeVars.js new file mode 100644 index 0000000..c80d127 --- /dev/null +++ b/src/stores/theme/buildThemeVars.js @@ -0,0 +1,102 @@ +const clamp = (v, min, max) => Math.min(max, Math.max(min, v)); + +const toHex2 = (n) => + clamp(Math.round(n), 0, 255).toString(16).padStart(2, "0"); + +const parseHex = (hex) => { + const v = (hex || "").trim().replace("#", ""); + if (v.length === 3) { + const [r, g, b] = v.split("").map((c) => c + c); + return { r: parseInt(r, 16), g: parseInt(g, 16), b: parseInt(b, 16) }; + } + return { + r: parseInt(v.slice(0, 2), 16), + g: parseInt(v.slice(2, 4), 16), + b: parseInt(v.slice(4, 6), 16), + }; +}; + +const mix = (hex, target, amount) => { + const s = parseHex(hex); + const t = parseHex(target); + return ( + "#" + + toHex2(s.r + (t.r - s.r) * amount) + + toHex2(s.g + (t.g - s.g) * amount) + + toHex2(s.b + (t.b - s.b) * amount) + ).toUpperCase(); +}; + +const rgbaOf = (hex, a) => { + const { r, g, b } = parseHex(hex); + return `rgba(${Math.round(r)}, ${Math.round(g)}, ${Math.round(b)}, ${a})`; +}; + +// 单一数据源:每个预设主题的 brandColor + 渐变端点 + 弹窗 UI 字段 +export const PRESET_THEMES = { + blue: { + borderColor: "#3289FB", + gradientTo: "#77B2FF", + boxShadow: "0 4px 12px 0 rgba(50, 137, 251, 0.5)", + name: "穹宇蓝", + desc: "深邃星空\n科技感十足", + }, + purple: { + borderColor: "#6155F5", + gradientTo: "#9B93FF", + boxShadow: "0 4px 12px 0 rgba(97, 85, 245, 0.5)", + name: "星轨紫", + desc: "神秘优雅\n梦幻氛围", + }, + red: { + borderColor: "#DE6262", + gradientTo: "#FF988B", + boxShadow: "0 4px 12px 0 rgba(222, 98, 98, 0.5)", + name: "流金粉", + desc: "晨雾染金\n自带光芒", + }, +}; + +export const DEFAULT_THEME = "blue"; + +export const normalizeThemeValue = (v) => + PRESET_THEMES[v] ? v : DEFAULT_THEME; + +export const buildLinearRight = (themeValue) => { + const t = PRESET_THEMES[normalizeThemeValue(themeValue)]; + return `linear-gradient(to right, ${t.borderColor} 0%, ${t.gradientTo} 100%)`; +}; + +export const buildPreview = (themeValue) => { + const t = PRESET_THEMES[normalizeThemeValue(themeValue)]; + return `linear-gradient(to bottom, ${t.borderColor} 0%, ${t.gradientTo} 100%)`; +}; + +export const buildThemeVars = (themeValue) => { + const t = PRESET_THEMES[normalizeThemeValue(themeValue)]; + const c = t.borderColor; + + return { + "--brand-color": c, + "--brand-color-bg": rgbaOf(c, 0.21), + "--brand-color-hover": mix(c, "#FFFFFF", 0.12), + "--brand-color-active": mix(c, "#000000", 0.14), + "--brand-color-disabled": rgbaOf(c, 0.4), + "--brand-color-focus": rgbaOf(c, 0.18), + "--brand-color-light": rgbaOf(c, 0.12), + "--text-color-brand": c, + "--text-color-link": c, + "--el-color-primary": c, + "--el-color-primary-light-3": mix(c, "#FFFFFF", 0.2), + "--el-color-primary-light-5": mix(c, "#FFFFFF", 0.28), + "--el-color-primary-light-7": mix(c, "#FFFFFF", 0.48), + "--el-color-primary-light-8": mix(c, "#FFFFFF", 0.64), + "--el-color-primary-light-9": mix(c, "#FFFFFF", 0.82), + "--el-color-primary-dark-2": mix(c, "#000000", 0.14), + "--el-menu-hover-bg-color": rgbaOf(c, 0.12), + "--el-menu-active-color": c, + "--el-menu-active-background": rgbaOf(c, 0.12), + "--el-text-color-secondary": c, + "--linear-right": buildLinearRight(normalizeThemeValue(themeValue)), + }; +}; \ No newline at end of file diff --git a/src/stores/theme/index.js b/src/stores/theme/index.js index 8aa6984..4318af6 100644 --- a/src/stores/theme/index.js +++ b/src/stores/theme/index.js @@ -1,89 +1,36 @@ import { defineStore } from "pinia"; import { ref } from "vue"; -import { buildCustomThemeVars } from "./buildCustomThemeVars.js"; - -const DEFAULT_THEME = "blue"; // 默认主题 -const CUSTOM_THEME = "custom"; -const CUSTOM_THEME_COLOR_KEY = "customThemeColor"; -const THEME_CLASS_MAP = { - blue: "", - purple: "purple", - red: "red", - black: "dark", - dark: "dark", - custom: "", -}; - -const normalizeThemeValue = (theme) => { - return THEME_CLASS_MAP[theme] !== undefined ? theme : DEFAULT_THEME; -}; - -const clearCustomThemeVars = (html) => { - Object.keys(buildCustomThemeVars("#1764FF")).forEach((key) => { - html.style.removeProperty(key); - }); +import { + buildThemeVars, + normalizeThemeValue, + DEFAULT_THEME, +} from "./buildThemeVars.js"; + +const APPLIED_KEYS = Object.keys(buildThemeVars(DEFAULT_THEME)); + +const applyToRoot = (theme) => { + const root = document.documentElement; + // 先清掉旧变量,避免切主题后留下脏数据 + APPLIED_KEYS.forEach((k) => root.style.removeProperty(k)); + Object.entries(buildThemeVars(theme)).forEach(([k, v]) => + root.style.setProperty(k, v), + ); }; export const useThemeStore = defineStore("theme", () => { - // 当前主题值,默认为 localStorage 中的值或 DEFAULT_THEME const themeValue = ref( normalizeThemeValue(localStorage.getItem("theme") || DEFAULT_THEME), ); - // 定制主题颜色,默认为 localStorage 中的值或 "#1764FF" - const customThemeColor = ref( - localStorage.getItem(CUSTOM_THEME_COLOR_KEY) || "#1764FF", - ); - // 应用主题 - const applyTheme = (theme) => { - const normalizedTheme = normalizeThemeValue(theme); - const html = document.documentElement; - const themeClass = THEME_CLASS_MAP[normalizedTheme] || ""; - // 预设主题通过 class 切换 - html.className = themeClass; - clearCustomThemeVars(html); - // 定制主题通过 CSS 变量实现 - if (normalizedTheme === CUSTOM_THEME) { - const customVars = buildCustomThemeVars(customThemeColor.value); - Object.entries(customVars).forEach(([key, value]) => { - html.style.setProperty(key, value); - }); - } - }; - // 设置自定义主题颜色 - const setCustomThemeColor = (color) => { - customThemeColor.value = color; - localStorage.setItem(CUSTOM_THEME_COLOR_KEY, color); - - if (themeValue.value === CUSTOM_THEME) { - applyTheme(CUSTOM_THEME); - } - }; - - const previewCustomThemeColor = (color) => { - customThemeColor.value = color; - - if (themeValue.value === CUSTOM_THEME) { - applyTheme(CUSTOM_THEME); - } - }; const setTheme = (theme) => { - const normalizedTheme = normalizeThemeValue(theme); - themeValue.value = normalizedTheme; - localStorage.setItem("theme", normalizedTheme); - applyTheme(normalizedTheme); + const next = normalizeThemeValue(theme); + themeValue.value = next; + localStorage.setItem("theme", next); + applyToRoot(next); }; - // 初始化时应用默认主题 - applyTheme(themeValue.value); + // 初始化:setup 内即生效,不依赖外部调用 + applyToRoot(themeValue.value); - return { - themeValue, - customThemeColor, - setTheme, - setCustomThemeColor, - previewCustomThemeColor, - applyTheme, - buildCustomThemeVars, - }; -}); + return { themeValue, setTheme }; +}); \ No newline at end of file diff --git a/src/views/admin/accounts/list.vue b/src/views/admin/accounts/list.vue index 8052404..edd4222 100644 --- a/src/views/admin/accounts/list.vue +++ b/src/views/admin/accounts/list.vue @@ -7,7 +7,7 @@ {{ t.label }}
- + {{ addBtnText }} @@ -44,12 +44,12 @@ -
+ - @@ -174,12 +174,12 @@ onMounted(loadList); border-bottom: 3px solid transparent; &:hover { - color: #3289fb; + color: var(--brand-color); } &.active { - color: #3289fb; - border-bottom-color: #3289fb; + color: var(--brand-color); + border-bottom-color: var(--brand-color); } } diff --git a/src/views/admin/hospitals/components/MonthlyViewDialog.vue b/src/views/admin/hospitals/components/MonthlyViewDialog.vue index ab46594..bee6f20 100644 --- a/src/views/admin/hospitals/components/MonthlyViewDialog.vue +++ b/src/views/admin/hospitals/components/MonthlyViewDialog.vue @@ -1,6 +1,7 @@