fix(ui): 主题与脑图浅色适配、标签配色及静态资源缓存
- 浅色模式下用例脑图区域改为浅色样式 - 恢复 el-tag 按 success/warning/info 等类型的颜色 - 启动时应用主题,Home 内容区深色样式兜底 - nginx 禁止缓存 index.html,hash 静态资源长期缓存 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
27
index.html
27
index.html
@@ -6,18 +6,37 @@
|
||||
<title>效能平台</title>
|
||||
<link rel="stylesheet" href="https://unpkg.com/wangeditor@4.7.15/dist/css/style.css" />
|
||||
<style>
|
||||
body{
|
||||
html {
|
||||
height: 100%;
|
||||
}
|
||||
body {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
background: #070b16;
|
||||
color: #dbeafe;
|
||||
}
|
||||
html{
|
||||
height: 100%;
|
||||
body.theme-light {
|
||||
background: #eef4ff;
|
||||
color: #1f2937;
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
(function () {
|
||||
var theme = 'dark';
|
||||
try {
|
||||
theme = localStorage.getItem('uiTheme') || 'dark';
|
||||
} catch (e) {}
|
||||
document.documentElement.className = theme === 'light' ? 'theme-light' : 'theme-dark';
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
document.body.classList.remove('theme-dark', 'theme-light');
|
||||
document.body.classList.add(theme === 'light' ? 'theme-light' : 'theme-dark');
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<body class="theme-dark">
|
||||
<div id="app"></div>
|
||||
<!-- built files will be auto injected -->
|
||||
</body>
|
||||
|
||||
14
nginx.conf
14
nginx.conf
@@ -1,12 +1,24 @@
|
||||
# 发版后避免浏览器长期使用旧 index 引用旧 js/css
|
||||
server {
|
||||
listen 80;
|
||||
server_name localhost;
|
||||
|
||||
|
||||
client_max_body_size 100m;
|
||||
|
||||
root /usr/share/nginx/html;
|
||||
index index.html;
|
||||
|
||||
location = /index.html {
|
||||
add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0" always;
|
||||
add_header Pragma "no-cache" always;
|
||||
}
|
||||
|
||||
location ^~ /static/ {
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable" always;
|
||||
access_log off;
|
||||
}
|
||||
|
||||
location /it/api/ {
|
||||
proxy_pass http://172.18.0.1:5010;
|
||||
proxy_set_header Host $host;
|
||||
|
||||
52
src/App.vue
52
src/App.vue
@@ -233,12 +233,36 @@ button,
|
||||
border-color: rgba(56, 189, 248, 0.5);
|
||||
}
|
||||
|
||||
.el-tag {
|
||||
.el-tag:not(.el-tag--success):not(.el-tag--warning):not(.el-tag--danger):not(.el-tag--info) {
|
||||
border-color: rgba(56, 189, 248, 0.28);
|
||||
background: rgba(56, 189, 248, 0.12);
|
||||
color: #bae6fd;
|
||||
}
|
||||
|
||||
.el-tag.el-tag--success {
|
||||
border-color: rgba(103, 194, 58, 0.45);
|
||||
background: rgba(103, 194, 58, 0.16);
|
||||
color: #86efac;
|
||||
}
|
||||
|
||||
.el-tag.el-tag--warning {
|
||||
border-color: rgba(230, 162, 60, 0.45);
|
||||
background: rgba(230, 162, 60, 0.16);
|
||||
color: #fcd34d;
|
||||
}
|
||||
|
||||
.el-tag.el-tag--danger {
|
||||
border-color: rgba(245, 108, 108, 0.45);
|
||||
background: rgba(245, 108, 108, 0.16);
|
||||
color: #fca5a5;
|
||||
}
|
||||
|
||||
.el-tag.el-tag--info {
|
||||
border-color: rgba(148, 163, 184, 0.35);
|
||||
background: rgba(148, 163, 184, 0.14);
|
||||
color: #cbd5e1;
|
||||
}
|
||||
|
||||
.el-card__header {
|
||||
background: #162033;
|
||||
border-bottom-color: rgba(148, 163, 184, 0.18);
|
||||
@@ -439,12 +463,36 @@ body.theme-light .el-tabs__nav-wrap::after {
|
||||
background-color: #e2e8f0;
|
||||
}
|
||||
|
||||
body.theme-light .el-tag {
|
||||
body.theme-light .el-tag:not(.el-tag--success):not(.el-tag--warning):not(.el-tag--danger):not(.el-tag--info) {
|
||||
border-color: #bfdbfe;
|
||||
background: #eff6ff;
|
||||
color: #1d4ed8;
|
||||
}
|
||||
|
||||
body.theme-light .el-tag.el-tag--success {
|
||||
border-color: #e1f3d8;
|
||||
background: #f0f9eb;
|
||||
color: #67c23a;
|
||||
}
|
||||
|
||||
body.theme-light .el-tag.el-tag--warning {
|
||||
border-color: #faecd8;
|
||||
background: #fdf6ec;
|
||||
color: #e6a23c;
|
||||
}
|
||||
|
||||
body.theme-light .el-tag.el-tag--danger {
|
||||
border-color: #fde2e2;
|
||||
background: #fef0f0;
|
||||
color: #f56c6c;
|
||||
}
|
||||
|
||||
body.theme-light .el-tag.el-tag--info {
|
||||
border-color: #e9e9eb;
|
||||
background: #f4f4f5;
|
||||
color: #909399;
|
||||
}
|
||||
|
||||
body.theme-light .el-tree,
|
||||
body.theme-light .el-tree-node__content {
|
||||
color: #334155;
|
||||
|
||||
@@ -680,4 +680,58 @@ export default {
|
||||
.theme-shell-light .main-form {
|
||||
background: linear-gradient(135deg, #f8fbff 0%, #eef4ff 100%);
|
||||
}
|
||||
|
||||
/* 深色壳下内容区兜底:避免旧缓存 bundle 未加载 App.vue 全局样式时出现白卡片/白分页 */
|
||||
.theme-shell-dark >>> .page-section.el-card {
|
||||
background: #111827;
|
||||
border-color: rgba(148, 163, 184, 0.2);
|
||||
color: #e5e7eb;
|
||||
}
|
||||
|
||||
.theme-shell-dark >>> .page-section .el-card__header {
|
||||
background: #162033;
|
||||
border-bottom-color: rgba(148, 163, 184, 0.18);
|
||||
color: #f8fafc;
|
||||
}
|
||||
|
||||
.theme-shell-dark >>> .page-section .el-table,
|
||||
.theme-shell-dark >>> .page-section .el-table__expanded-cell,
|
||||
.theme-shell-dark >>> .page-section .el-table th,
|
||||
.theme-shell-dark >>> .page-section .el-table tr,
|
||||
.theme-shell-dark >>> .page-section .el-table td {
|
||||
background-color: #111827 !important;
|
||||
color: #e5e7eb !important;
|
||||
}
|
||||
|
||||
.theme-shell-dark >>> .page-section .el-table th,
|
||||
.theme-shell-dark >>> .page-section .el-table thead th {
|
||||
background: #1f2937 !important;
|
||||
color: #f8fafc !important;
|
||||
}
|
||||
|
||||
.theme-shell-dark >>> .page-section .el-form-item__label {
|
||||
color: #dbeafe;
|
||||
}
|
||||
|
||||
.theme-shell-dark >>> .page-section .el-input__inner,
|
||||
.theme-shell-dark >>> .page-section .el-textarea__inner,
|
||||
.theme-shell-dark >>> .page-section .el-select .el-input__inner {
|
||||
background-color: #0f172a;
|
||||
border-color: rgba(148, 163, 184, 0.28);
|
||||
color: #f8fafc;
|
||||
}
|
||||
|
||||
.theme-shell-dark >>> .page-section .el-pagination,
|
||||
.theme-shell-dark >>> .page-section .el-pagination button,
|
||||
.theme-shell-dark >>> .page-section .el-pagination span:not([class*=suffix]) {
|
||||
color: #dbeafe;
|
||||
}
|
||||
|
||||
.theme-shell-dark >>> .page-section .el-pagination .btn-prev,
|
||||
.theme-shell-dark >>> .page-section .el-pagination .btn-next,
|
||||
.theme-shell-dark >>> .page-section .el-pager li {
|
||||
background: #111827;
|
||||
color: #dbeafe;
|
||||
border: 1px solid rgba(148, 163, 184, 0.18);
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -2604,4 +2604,64 @@ body.theme-light .auto-gen-case-title {
|
||||
body.theme-light .ai-gen-params-hint {
|
||||
color: #64748b;
|
||||
}
|
||||
|
||||
body.theme-light .mindmap-wrap {
|
||||
background: #f8fbff;
|
||||
border-color: #dbe5f3;
|
||||
}
|
||||
|
||||
body.theme-light .xmind-tree /deep/ .el-tree-node__children:before {
|
||||
border-left-color: #cbd5e1;
|
||||
}
|
||||
|
||||
body.theme-light .xmind-tree /deep/ .el-tree-node__content:before {
|
||||
border-top-color: #94a3b8;
|
||||
}
|
||||
|
||||
body.theme-light .mindmap-node {
|
||||
background: #ffffff;
|
||||
border-color: #dbe5f3;
|
||||
box-shadow: 0 1px 6px rgba(37, 99, 235, 0.08);
|
||||
}
|
||||
|
||||
body.theme-light .mindmap-node-title {
|
||||
color: #0f172a;
|
||||
}
|
||||
|
||||
body.theme-light .mindmap-node-project {
|
||||
border-color: #67c23a;
|
||||
box-shadow: 0 1px 6px rgba(103, 194, 58, 0.12);
|
||||
}
|
||||
|
||||
body.theme-light .mindmap-node-module {
|
||||
border-color: #e6a23c;
|
||||
box-shadow: 0 1px 6px rgba(230, 162, 60, 0.1);
|
||||
}
|
||||
|
||||
body.theme-light .mindmap-node-case {
|
||||
border-color: #93c5fd;
|
||||
}
|
||||
|
||||
body.theme-light .mindmap-inline-detail-line {
|
||||
border-top-color: #94a3b8;
|
||||
}
|
||||
|
||||
body.theme-light .mindmap-inline-detail-card {
|
||||
background: #ffffff;
|
||||
border-color: #dbe5f3;
|
||||
box-shadow: 0 4px 16px rgba(37, 99, 235, 0.08);
|
||||
}
|
||||
|
||||
body.theme-light .mindmap-inline-detail-title {
|
||||
color: #0f172a;
|
||||
}
|
||||
|
||||
body.theme-light .mindmap-inline-detail-item {
|
||||
color: #475569;
|
||||
}
|
||||
|
||||
body.theme-light .mindmap-meta-text,
|
||||
body.theme-light .mindmap-empty {
|
||||
color: #64748b;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -8,6 +8,14 @@ import ElementUI from 'element-ui';
|
||||
import store from '@/vuex/store'
|
||||
import 'element-ui/lib/theme-chalk/index.css';
|
||||
import axios from 'axios'
|
||||
|
||||
function applyInitialTheme() {
|
||||
const theme = localStorage.getItem('uiTheme') || 'dark'
|
||||
document.body.classList.remove('theme-dark', 'theme-light')
|
||||
document.body.classList.add(theme === 'light' ? 'theme-light' : 'theme-dark')
|
||||
}
|
||||
applyInitialTheme()
|
||||
|
||||
Vue.use(ElementUI);
|
||||
Vue.prototype.$axios = axios
|
||||
|
||||
|
||||
Reference in New Issue
Block a user