基础功能完整

This commit is contained in:
cheney 2026-07-16 10:48:58 +08:00
parent 5bff1a186f
commit f14501f586
4 changed files with 31 additions and 36 deletions

View File

@ -18,24 +18,6 @@ body {
} }
/* 顶部工具栏 */ /* 顶部工具栏 */
.toolbar {
display: flex;
align-items: center;
justify-content: space-between;
height: 44px;
padding: 0 12px;
background: linear-gradient(to bottom, #fdfdfd, #e8e8e8);
border-bottom: 1px solid #c0c0c0;
flex-shrink: 0;
}
.toolbar-left,
.toolbar-center,
.toolbar-right {
display: flex;
align-items: center;
gap: 8px;
}
.app-title { .app-title {
font-weight: 600; font-weight: 600;
@ -141,6 +123,22 @@ body {
color: #666; color: #666;
} }
.tree-header-actions {
display: flex;
align-items: center;
gap: 6px;
}
.tree-header-actions .icon-btn {
padding: 0 4px;
border-radius: 3px;
}
.tree-header-actions .icon-btn:hover {
background: #e5f1fb;
color: #0078d4;
}
.tree-content { .tree-content {
flex: 1; flex: 1;
overflow: auto; overflow: auto;
@ -554,10 +552,10 @@ body.mode-readonly .row-btn:not(.view) {
/* ===== 工具栏(分组处理) ===== */ /* ===== 工具栏(分组处理) ===== */
.toolbar { .toolbar {
display: flex; display: flex;
align-items: stretch; align-items: center;
gap: 4px; gap: 6px 4px;
min-height: 46px; min-height: 46px;
padding: 4px 8px; padding: 5px 8px;
background: linear-gradient(to bottom, #fdfdfd, #eaeaea); background: linear-gradient(to bottom, #fdfdfd, #eaeaea);
border-bottom: 1px solid #c0c0c0; border-bottom: 1px solid #c0c0c0;
flex-shrink: 0; flex-shrink: 0;
@ -571,6 +569,11 @@ body.mode-readonly .row-btn:not(.view) {
gap: 6px; gap: 6px;
padding: 2px 10px; padding: 2px 10px;
border-right: 1px solid #d5d5d5; border-right: 1px solid #d5d5d5;
white-space: nowrap;
}
.tool-group:last-child {
border-right: none;
} }
.tool-group .group-label { .tool-group .group-label {
@ -591,10 +594,6 @@ body.mode-readonly .row-btn:not(.view) {
flex-wrap: wrap; flex-wrap: wrap;
} }
.dim-empty {
color: #8aa;
font-size: 12px;
}
.dim-item { .dim-item {
display: flex; display: flex;

View File

@ -33,11 +33,6 @@
</div> </div>
</div> </div>
<div class="tool-group" title="配置操作">
<span class="group-label">配置</span>
<button id="btn-add-config" class="toolbar-btn" title="新增配置项"> 新增</button>
<button id="btn-collapse-all" class="toolbar-btn" title="全部折叠">⊟ 折叠</button>
</div>
<div class="tool-group" title="数据操作"> <div class="tool-group" title="数据操作">
<span class="group-label">数据</span> <span class="group-label">数据</span>
@ -49,7 +44,7 @@
<!-- 维度栏:展示已启用维度的筛选器与映射配置入口 --> <!-- 维度栏:展示已启用维度的筛选器与映射配置入口 -->
<div class="dimension-bar" id="dimension-bar"> <div class="dimension-bar" id="dimension-bar">
<span class="dim-empty" id="dim-empty">选择项目后展示维度筛选</span>
<div class="dim-item" id="dim-idc" style="display:none"> <div class="dim-item" id="dim-idc" style="display:none">
<span class="dim-name">机房</span> <span class="dim-name">机房</span>
<select class="dim-select" id="dim-idc-select"></select> <select class="dim-select" id="dim-idc-select"></select>
@ -74,6 +69,10 @@
<aside class="tree-panel" id="tree-panel"> <aside class="tree-panel" id="tree-panel">
<div class="tree-header"> <div class="tree-header">
<span>配置树</span> <span>配置树</span>
<div class="tree-header-actions">
<button id="btn-add-config" class="icon-btn" title="新增配置项"></button>
<button id="btn-collapse-all" class="icon-btn" title="全部折叠"></button>
</div>
</div> </div>
<div class="tree-content" id="tree-content"> <div class="tree-content" id="tree-content">
<div class="tree-empty">请先选择一个项目</div> <div class="tree-empty">请先选择一个项目</div>

View File

@ -174,7 +174,6 @@ function collectDimValues(field) {
*/ */
function renderDimensionBar() { function renderDimensionBar() {
const p = state.currentProject; const p = state.currentProject;
const empty = document.getElementById("dim-empty");
const mappingBtn = document.getElementById("btn-dim-mapping"); const mappingBtn = document.getElementById("btn-dim-mapping");
const items = [ const items = [
{ key: "idc", enable: "enableIdc", mapping: "idcMapping", field: "idc", box: "dim-idc", sel: "dim-idc-select", map: "dim-idc-mapping" }, { key: "idc", enable: "enableIdc", mapping: "idcMapping", field: "idc", box: "dim-idc", sel: "dim-idc-select", map: "dim-idc-mapping" },
@ -183,14 +182,12 @@ function renderDimensionBar() {
]; ];
if (!p) { if (!p) {
empty.style.display = "";
mappingBtn.style.display = "none"; mappingBtn.style.display = "none";
items.forEach((it) => (document.getElementById(it.box).style.display = "none")); items.forEach((it) => (document.getElementById(it.box).style.display = "none"));
return; return;
} }
const anyEnabled = p.enableIdc || p.enableEnvironment || p.enableGroup; const anyEnabled = p.enableIdc || p.enableEnvironment || p.enableGroup;
empty.style.display = anyEnabled ? "none" : "";
mappingBtn.style.display = anyEnabled ? "" : "none"; mappingBtn.style.display = anyEnabled ? "" : "none";
items.forEach((it) => { items.forEach((it) => {

View File

@ -14,8 +14,8 @@ const PORT = process.env.PORT || 3000;
// 解析 JSON 请求体 // 解析 JSON 请求体
app.use(express.json()); app.use(express.json());
// 静态资源服务 // 静态资源服务(禁用缓存,避免浏览器加载到旧版本页面/脚本)
app.use(express.static(path.join(__dirname, "..", "public"))); app.use(express.static(path.join(__dirname, "..", "public"), { etag: false, lastModified: false, cacheControl: false, setHeaders: (res) => res.setHeader("Cache-Control", "no-store") }));
// API 路由 // API 路由
app.use("/api/projects", projectRoutes); app.use("/api/projects", projectRoutes);