統一系統工具頁新版殼層
All checks were successful
CD Pipeline / deploy (push) Successful in 1m3s

This commit is contained in:
OoO
2026-05-14 18:02:03 +08:00
parent 869cf2da31
commit 87a83aed64
9 changed files with 188 additions and 167 deletions

View File

@@ -320,7 +320,7 @@ YOUTUBE_API_KEY = os.getenv('YOUTUBE_API_KEY', '')
# ==========================================
# 系統版本與路徑
# ==========================================
SYSTEM_VERSION = "V10.149"
SYSTEM_VERSION = "V10.150"
LOG_FILE_PATH = os.path.join(BASE_DIR, 'logs/system.log')
public_url = PUBLIC_URL # 用於模板顯示

View File

@@ -121,7 +121,7 @@ ENVIRONMENTS = {
@cicd_bp.route('/cicd')
def cicd_dashboard():
"""CI/CD Dashboard 主頁面"""
return render_template('cicd_dashboard.html')
return render_template('cicd_dashboard.html', active_page='cicd')
# =============================================================================
# API 端點

View File

@@ -104,4 +104,4 @@ def api_history():
@code_review_bp.route("/", methods=["GET"])
def dashboard():
return render_template("code_review.html")
return render_template("code_review.html", active_page="code_review")

View File

@@ -37,4 +37,4 @@ def test_url():
@misc_bp.route('/brand_assets')
def brand_assets():
"""顯示品牌資產庫"""
return render_template('brand_assets.html')
return render_template('brand_assets.html', active_page='brand_assets')

View File

@@ -1,62 +1,64 @@
<!DOCTYPE html>
<html lang="zh-TW">
{% extends "ewoooc_base.html" %}
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WOOO TECH 品牌資產庫</title>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap" rel="stylesheet">
{% block title %}品牌資產庫 - EwoooC{% endblock %}
{% block extra_css %}
<style>
body {
font-family: 'Inter', sans-serif;
background: #f8f9fa;
color: #333;
margin: 0;
padding: 40px;
.brand-assets-page {
color: var(--momo-text-primary);
font-family: var(--momo-font-family);
}
.container {
.brand-assets-page .container {
max-width: 1000px;
margin: 0 auto;
}
h1 {
text-align: center;
margin-bottom: 40px;
color: #1a1a1a;
.brand-assets-page h1 {
margin-bottom: 24px;
color: var(--momo-text-primary);
font-family: var(--momo-font-display);
font-size: var(--momo-text-headline);
font-weight: 800;
letter-spacing: 0;
}
.section {
background: white;
border-radius: 12px;
padding: 30px;
margin-bottom: 30px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
.brand-assets-page .section {
background: var(--momo-bg-surface);
border: 1px solid var(--momo-border-light);
border-radius: var(--momo-radius-md);
padding: 24px;
margin-bottom: 24px;
box-shadow: none;
}
.section-title {
font-size: 1.5rem;
.brand-assets-page .section-title {
color: var(--momo-text-primary);
font-family: var(--momo-font-display);
font-size: var(--momo-text-title);
font-weight: 800;
margin-bottom: 20px;
border-bottom: 2px solid #eee;
border-bottom: 1px solid var(--momo-border-light);
padding-bottom: 10px;
}
.asset-grid {
.brand-assets-page .asset-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 30px;
gap: 24px;
align-items: end;
}
.asset-item {
.brand-assets-page .asset-item {
text-align: center;
min-width: 0;
}
.preview-box {
background: #fff;
border: 1px solid #eee;
.brand-assets-page .preview-box {
background: var(--momo-bg-elevated);
border: 1px solid var(--momo-border-light);
padding: 20px;
border-radius: 8px;
border-radius: var(--momo-radius-md);
margin-bottom: 15px;
height: 150px;
display: flex;
@@ -68,32 +70,33 @@
background-position: 0 0, 0 10px, 10px -10px, -10px 0px;
}
.preview-box img {
.brand-assets-page .preview-box img {
max-width: 100%;
max-height: 100%;
object-fit: contain;
}
.format-links a {
.brand-assets-page .format-links a {
display: inline-block;
margin: 5px;
text-decoration: none;
color: #4F46E5;
color: var(--momo-page-accent-dark);
font-size: 0.9rem;
border: 1px solid #4F46E5;
border: 1px solid var(--momo-page-accent-line);
padding: 4px 8px;
border-radius: 4px;
border-radius: var(--momo-radius-sm);
transition: all 0.2s;
}
.format-links a:hover {
background: #4F46E5;
color: white;
.brand-assets-page .format-links a:hover {
background: var(--momo-page-accent);
color: var(--momo-page-inverse);
}
</style>
</head>
{% endblock %}
<body>
{% block content %}
<div class="brand-assets-page">
<div class="container">
<h1>WOOO TECH 品牌資產庫</h1>
@@ -102,23 +105,23 @@
<div class="asset-grid">
<div class="asset-item">
<div class="preview-box">
<img src="/static/exports/WOOO_Main_Logo.svg" alt="Main Logo">
<img src="/static/images/logo_navbar.svg" alt="Main Logo">
</div>
<div>
<strong>SVG (向量)</strong><br>
<div class="format-links">
<a href="/static/exports/WOOO_Main_Logo.svg" download>下載 SVG</a>
<a href="/static/images/logo_navbar.svg" download>下載 SVG</a>
</div>
</div>
</div>
<div class="asset-item">
<div class="preview-box">
<img src="/static/exports/WOOO_Main_Logo.jpg" alt="Main Logo JPG">
<img src="/static/images/logo.png" alt="Main Logo PNG">
</div>
<div>
<strong>JPG (白底)</strong><br>
<strong>PNG</strong><br>
<div class="format-links">
<a href="/static/exports/WOOO_Main_Logo.jpg" download>下載 JPG</a>
<a href="/static/images/logo.png" download>下載 PNG</a>
</div>
</div>
</div>
@@ -127,9 +130,8 @@
<div style="padding: 20px;">
<strong>其他格式</strong><br>
<div class="format-links">
<a href="/static/exports/WOOO_Main_Logo.eps" download>EPS</a>
<a href="/static/exports/WOOO_Main_Logo.pdf" download>PDF/AI</a>
<a href="/static/exports/WOOO_Main_Logo.tiff" download>TIFF</a>
<a href="/static/images/logo.png" download>標準 PNG</a>
<a href="/static/images/logo_circle.svg" download>圓標 SVG</a>
</div>
</div>
</div>
@@ -141,23 +143,23 @@
<div class="asset-grid">
<div class="asset-item">
<div class="preview-box">
<img src="/static/exports/WOOO_Glass_Logo.svg" alt="Glass Logo">
<img src="/static/images/logo_v4_glass.png" alt="Glass Logo">
</div>
<div>
<strong>SVG (向量)</strong><br>
<strong>PNG</strong><br>
<div class="format-links">
<a href="/static/exports/WOOO_Glass_Logo.svg" download>下載 SVG</a>
<a href="/static/images/logo_v4_glass.png" download>下載 PNG</a>
</div>
</div>
</div>
<div class="asset-item">
<div class="preview-box">
<img src="/static/exports/WOOO_Glass_Logo.jpg" alt="Glass Logo JPG">
<img src="/static/images/logo.png" alt="Standard Logo">
</div>
<div>
<strong>JPG (白底)</strong><br>
<strong>標準 PNG</strong><br>
<div class="format-links">
<a href="/static/exports/WOOO_Glass_Logo.jpg" download>下載 JPG</a>
<a href="/static/images/logo.png" download>下載 PNG</a>
</div>
</div>
</div>
@@ -169,29 +171,28 @@
<div class="asset-grid">
<div class="asset-item">
<div class="preview-box">
<img src="/static/exports/WOOO_Gradient_Logo.svg" alt="Gradient Logo">
<img src="/static/images/logo_v4_gradient.png" alt="Gradient Logo">
</div>
<div>
<strong>SVG (向量)</strong><br>
<strong>PNG</strong><br>
<div class="format-links">
<a href="/static/exports/WOOO_Gradient_Logo.svg" download>下載 SVG</a>
<a href="/static/images/logo_v4_gradient.png" download>下載 PNG</a>
</div>
</div>
</div>
<div class="asset-item">
<div class="preview-box">
<img src="/static/exports/WOOO_Gradient_Logo.jpg" alt="Gradient Logo JPG">
<img src="/static/images/logo_circle.svg" alt="Circle Logo">
</div>
<div>
<strong>JPG (白底)</strong><br>
<strong>圓標 SVG</strong><br>
<div class="format-links">
<a href="/static/exports/WOOO_Gradient_Logo.jpg" download>下載 JPG</a>
<a href="/static/images/logo_circle.svg" download>下載 SVG</a>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
</div>
{% endblock %}

View File

@@ -1,39 +1,43 @@
<!DOCTYPE html>
<html lang="zh-TW">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CI/CD Dashboard - MOMO Pro System</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
{% extends "ewoooc_base.html" %}
{% block title %}CI/CD Dashboard - EwoooC{% endblock %}
{% block extra_head %}
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.css" rel="stylesheet">
{% endblock %}
{% block extra_css %}
<style>
:root {
--primary-gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
--success-color: #28a745;
--danger-color: #dc3545;
--warning-color: #ffc107;
--info-color: #17a2b8;
--uat-color: #3498db;
--prod-color: #e74c3c;
.cicd-page {
--success-color: var(--momo-success);
--danger-color: var(--momo-danger);
--warning-color: var(--momo-warning);
--info-color: var(--momo-info);
--uat-color: var(--momo-info);
--prod-color: var(--momo-danger);
color: var(--momo-text-primary);
font-family: var(--momo-font-family);
}
body {
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
color: #fff;
min-height: 100vh;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
.cicd-page * {
letter-spacing: 0;
}
.dashboard-header {
background: var(--primary-gradient);
padding: 1.5rem 0;
background: var(--momo-dot-grid), var(--momo-bg-surface);
border: 1px solid var(--momo-border-strong);
border-radius: var(--momo-radius-md);
padding: 1.25rem;
margin-bottom: 2rem;
box-shadow: 0 4px 20px rgba(102, 126, 234, 0.3);
box-shadow: var(--momo-shadow-soft);
}
.dashboard-header h1 {
margin: 0;
font-weight: 600;
color: var(--momo-text-primary);
font-family: var(--momo-font-display);
font-size: var(--momo-text-headline);
font-weight: 800;
}
.status-indicator {
@@ -56,22 +60,24 @@
}
.card {
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 12px;
backdrop-filter: blur(10px);
background: var(--momo-bg-surface);
border: 1px solid var(--momo-border-light);
border-radius: var(--momo-radius-md);
backdrop-filter: none;
transition: transform 0.3s, box-shadow 0.3s;
}
.card:hover {
transform: translateY(-2px);
box-shadow: 0 8px 30px rgba(0, 0, 0, 0.3);
box-shadow: var(--momo-shadow-soft);
}
.card-header {
background: rgba(255, 255, 255, 0.05);
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
font-weight: 600;
background: transparent;
border-bottom: 1px solid var(--momo-border-light);
color: var(--momo-text-primary);
font-family: var(--momo-font-display);
font-weight: 800;
}
/* Pipeline Flow */
@@ -108,10 +114,10 @@
transform: scale(1.05);
}
.stage-box.success { background: linear-gradient(135deg, #28a745, #20c997); }
.stage-box.failed { background: linear-gradient(135deg, #dc3545, #e83e8c); }
.stage-box.running { background: linear-gradient(135deg, #007bff, #6610f2); animation: glow 1.5s infinite; }
.stage-box.pending { background: linear-gradient(135deg, #6c757d, #495057); }
.stage-box.success { background: var(--momo-success-bg); color: var(--momo-success-text); border: 1px solid var(--momo-success-border); }
.stage-box.failed { background: var(--momo-danger-bg); color: var(--momo-danger-text); border: 1px solid var(--momo-danger-border); }
.stage-box.running { background: var(--momo-info-bg); color: var(--momo-info-text); border: 1px solid var(--momo-info-border); animation: glow 1.5s infinite; }
.stage-box.pending { background: var(--momo-bg-subtle); color: var(--momo-text-secondary); border: 1px solid var(--momo-border-light); }
@keyframes glow {
0%, 100% { box-shadow: 0 0 5px rgba(0, 123, 255, 0.5); }
@@ -137,7 +143,7 @@
.pipeline-arrow {
width: 40px;
height: 2px;
background: linear-gradient(90deg, rgba(255,255,255,0.3), rgba(255,255,255,0.8));
background: var(--momo-border-strong);
position: relative;
}
@@ -147,7 +153,7 @@
right: -5px;
top: -4px;
border: 5px solid transparent;
border-left-color: rgba(255, 255, 255, 0.8);
border-left-color: var(--momo-border-strong);
}
/* Environment Cards */
@@ -172,8 +178,9 @@
display: flex;
align-items: center;
padding: 0.5rem;
background: rgba(255, 255, 255, 0.05);
border-radius: 8px;
background: var(--momo-bg-paper);
border: 1px solid var(--momo-border-light);
border-radius: var(--momo-radius-sm);
margin-bottom: 0.5rem;
}
@@ -198,14 +205,15 @@
display: flex;
align-items: center;
padding: 0.75rem;
background: rgba(255, 255, 255, 0.03);
border-radius: 8px;
background: var(--momo-bg-paper);
border: 1px solid var(--momo-border-light);
border-radius: var(--momo-radius-sm);
margin-bottom: 0.5rem;
transition: background 0.3s;
}
.pipeline-item:hover {
background: rgba(255, 255, 255, 0.08);
background: var(--momo-page-accent-soft);
}
.pipeline-id {
@@ -226,12 +234,12 @@
.pipeline-commit {
font-size: 0.85rem;
color: rgba(255, 255, 255, 0.7);
color: var(--momo-text-secondary);
}
.pipeline-time {
font-size: 0.8rem;
color: rgba(255, 255, 255, 0.5);
color: var(--momo-text-tertiary);
}
/* Summary Stats */
@@ -270,13 +278,15 @@
}
.action-btn.primary {
background: var(--primary-gradient);
color: white;
background: var(--momo-page-accent);
border: 1px solid var(--momo-page-accent-dark);
color: var(--momo-page-inverse);
}
.action-btn.danger {
background: linear-gradient(135deg, #dc3545, #c82333);
color: white;
background: var(--momo-danger);
border: 1px solid var(--momo-danger);
color: var(--momo-text-inverse);
}
.action-btn:hover {
@@ -295,8 +305,8 @@
.spinner {
width: 40px;
height: 40px;
border: 3px solid rgba(255, 255, 255, 0.1);
border-top-color: #667eea;
border: 3px solid var(--momo-border-light);
border-top-color: var(--momo-page-accent);
border-radius: 50%;
animation: spin 1s linear infinite;
}
@@ -452,8 +462,10 @@
margin-top: 0.25rem;
}
</style>
</head>
<body>
{% endblock %}
{% block content %}
<div class="cicd-page">
<!-- Header -->
<div class="dashboard-header">
<div class="container">
@@ -637,8 +649,11 @@
<div class="toast-body" id="toastMessage"></div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
{% endblock %}
{% block extra_js %}
<script>
// 配置
const REFRESH_INTERVAL = 10000; // 10 秒刷新
@@ -1192,5 +1207,4 @@
});
}
</script>
</body>
</html>
{% endblock %}

View File

@@ -1,38 +1,39 @@
<!DOCTYPE html>
<html lang="zh-TW">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>EwoooC — AI Code Review Dashboard</title>
{% extends "ewoooc_base.html" %}
{% block title %}AI Code Review - EwoooC{% endblock %}
{% block extra_css %}
<style>
:root {
--bg: #0d1117;
--panel: #161b22;
--border: #30363d;
--text: #e6edf3;
--muted: #8b949e;
--red: #f85149;
--orange: #d29922;
--yellow: #e3b341;
--green: #3fb950;
--blue: #58a6ff;
--purple: #bc8cff;
--accent: #e94560;
.code-review-page {
--bg: var(--momo-bg-paper);
--panel: var(--momo-bg-surface);
--border: var(--momo-border-light);
--text: var(--momo-text-primary);
--muted: var(--momo-text-secondary);
--red: var(--momo-danger);
--orange: var(--momo-warm-clay);
--yellow: var(--momo-warning);
--green: var(--momo-success);
--blue: var(--momo-info);
--purple: var(--momo-warm-saffron);
--accent: var(--momo-page-accent);
color: var(--text);
font-family: var(--momo-font-family);
font-size: 14px;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body { background: var(--bg); color: var(--text); font-family: -apple-system, 'Segoe UI', sans-serif; font-size: 14px; }
.code-review-page * { box-sizing: border-box; }
/* ── Layout ─────────────────────────────────────────── */
.topbar { background: var(--panel); border-bottom: 1px solid var(--border); padding: 12px 24px; display: flex; align-items: center; gap: 12px; }
.topbar h1 { font-size: 18px; font-weight: 700; color: var(--accent); }
.topbar .badge { font-size: 11px; padding: 2px 8px; border-radius: 12px; background: #21262d; color: var(--muted); }
.topbar { background: var(--momo-dot-grid), var(--panel); border: 1px solid var(--momo-border-strong); border-radius: var(--momo-radius-md); margin-bottom: 12px; padding: 14px 18px; display: flex; align-items: center; gap: 12px; }
.topbar h1 { font-size: 18px; font-weight: 800; color: var(--text); margin: 0; letter-spacing: 0; }
.topbar .badge { font-size: 11px; padding: 3px 8px; border-radius: var(--momo-radius-sm); background: var(--momo-tag-terra-bg); border: 1px solid var(--momo-tag-terra-border); color: var(--momo-tag-terra-text); }
.live-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--green); animation: pulse 1.5s infinite; margin-left: auto; }
.live-dot.idle { background: var(--muted); animation: none; }
@keyframes pulse { 0%,100% { opacity: 1; } 50% { opacity: 0.3; } }
.layout { display: grid; grid-template-columns: 340px 1fr; gap: 0; height: calc(100vh - 49px); overflow: hidden; }
.sidebar { background: var(--panel); border-right: 1px solid var(--border); overflow-y: auto; padding: 16px; }
.main { overflow-y: auto; padding: 16px; }
.layout { display: grid; grid-template-columns: minmax(280px, 340px) minmax(0, 1fr); gap: 12px; min-height: 680px; overflow: visible; }
.sidebar { background: transparent; overflow: visible; }
.main { overflow: visible; min-width: 0; }
.layout,
.sidebar,
.main,
@@ -43,17 +44,17 @@
}
/* ── Card ───────────────────────────────────────────── */
.card { background: var(--panel); border: 1px solid var(--border); border-radius: 8px; margin-bottom: 12px; overflow: hidden; }
.card { background: var(--panel); border: 1px solid var(--border); border-radius: var(--momo-radius-md); margin-bottom: 12px; overflow: hidden; box-shadow: none; }
.card-header { padding: 10px 14px; border-bottom: 1px solid var(--border); font-weight: 600; font-size: 13px; display: flex; align-items: center; gap: 8px; }
.card-body { padding: 14px; }
/* ── Pipeline Steps ──────────────────────────────────── */
.pipeline { display: flex; flex-direction: column; gap: 6px; }
.step { display: flex; align-items: center; gap: 10px; padding: 8px 10px; border-radius: 6px; border: 1px solid var(--border); background: #0d1117; transition: border-color .3s; }
.step { display: flex; align-items: center; gap: 10px; padding: 8px 10px; border-radius: var(--momo-radius-sm); border: 1px solid var(--border); background: var(--momo-bg-paper); transition: border-color .3s; }
.step.running { border-color: var(--blue); background: rgba(88,166,255,.07); }
.step.ok { border-color: var(--green); background: rgba(63,185,80,.06); }
.step.error { border-color: var(--red); background: rgba(248,81,73,.07); }
.step-num { width: 22px; height: 22px; border-radius: 50%; background: #21262d; font-size: 11px; font-weight: 700; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.step-num { width: 22px; height: 22px; border-radius: var(--momo-radius-sm); background: var(--momo-bg-subtle); font-size: 11px; font-weight: 700; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.step.ok .step-num { background: var(--green); color: #000; }
.step.running .step-num { background: var(--blue); color: #000; }
.step.error .step-num { background: var(--red); color: #fff; }
@@ -86,11 +87,11 @@
.badge-HIGH { background: rgba(210,153,34,.2); color: var(--orange); }
.badge-MEDIUM { background: rgba(227,179,65,.2); color: var(--yellow); }
.badge-LOW { background: rgba(63,185,80,.2); color: var(--green); }
.badge-type { display: inline-block; padding: 1px 6px; border-radius: 8px; font-size: 10px; background: #21262d; color: var(--muted); }
code { background: #21262d; padding: 1px 5px; border-radius: 4px; font-size: 12px; color: var(--blue); }
.badge-type { display: inline-block; padding: 1px 6px; border-radius: var(--momo-radius-sm); font-size: 10px; background: var(--momo-bg-paper); color: var(--muted); }
code { background: var(--momo-bg-paper); padding: 1px 5px; border-radius: var(--momo-radius-xs); font-size: 12px; color: var(--momo-info-text); }
/* ── OpenClaw Report ─────────────────────────────────── */
.report-box { background: #0d1117; border: 1px solid var(--border); border-radius: 6px; padding: 12px; font-size: 13px; line-height: 1.6; }
.report-box { background: var(--momo-bg-paper); border: 1px solid var(--border); border-radius: var(--momo-radius-sm); padding: 12px; font-size: 13px; line-height: 1.6; }
.report-box b { color: var(--text); }
/* ── EA Decision ─────────────────────────────────────── */
@@ -125,7 +126,7 @@
/* ── Tabs ────────────────────────────────────────────── */
.tabs { display: flex; gap: 4px; margin-bottom: 12px; }
.tab { padding: 6px 14px; border-radius: 6px; cursor: pointer; font-size: 13px; color: var(--muted); border: 1px solid transparent; }
.tab.active { background: #21262d; color: var(--text); border-color: var(--border); }
.tab.active { background: var(--momo-page-accent-soft); color: var(--text); border-color: var(--momo-page-accent-line); }
.tab-pane { display: none; }
.tab-pane.active { display: block; }
@@ -264,8 +265,10 @@
#findingsTable td:nth-child(5)::before { content: "修復建議"; }
}
</style>
</head>
<body>
{% endblock %}
{% block content %}
<div class="code-review-page">
<!-- Top Bar -->
<div class="topbar">
@@ -380,7 +383,10 @@
</div>
</div>
</div>
{% endblock %}
{% block extra_js %}
<script>
const SEV_ORDER = { CRITICAL: 0, HIGH: 1, MEDIUM: 2, LOW: 3 };
let _polling = null;
@@ -613,5 +619,4 @@ poll();
loadHistory();
setInterval(loadHistory, 60000);
</script>
</body>
</html>
{% endblock %}

View File

@@ -165,7 +165,7 @@
{# 群組 5: 系統terra #}
<div class="momo-nav-group">
<div class="momo-nav-group-title">系統</div>
<a class="momo-nav-link {% if _active_page in ['settings', 'system_settings', 'logs', 'crawler', 'user_management', 'login_history', 'change_password', 'notification_templates', 'ai_automation_smoke'] %}is-active{% endif %}" href="/settings">
<a class="momo-nav-link {% if _active_page in ['settings', 'system_settings', 'logs', 'crawler', 'user_management', 'login_history', 'change_password', 'notification_templates', 'ai_automation_smoke', 'brand_assets', 'code_review', 'cicd'] %}is-active{% endif %}" href="/settings">
<span class="momo-nav-icon"><i class="fas fa-gear"></i></span>
<span class="momo-nav-label">系統管理</span>
<span class="momo-nav-code">14</span>

View File

@@ -352,7 +352,8 @@
'obs_ppt_audit'] %}
{% set _group_system = ['settings', 'system_settings', 'logs', 'crawler',
'user_management', 'login_history', 'change_password',
'notification_templates', 'ai_automation_smoke'] %}
'notification_templates', 'ai_automation_smoke',
'brand_assets', 'code_review', 'cicd'] %}
{% if _page in _group_monitor %}{% set _page_group = 'monitor' %}
{% elif _page in _group_analytics %}{% set _page_group = 'analytics' %}
{% elif _page in _group_ops %}{% set _page_group = 'ops' %}