This commit is contained in:
@@ -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 # 用於模板顯示
|
||||
|
||||
|
||||
@@ -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 端點
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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' %}
|
||||
|
||||
Reference in New Issue
Block a user