fogact 1.1.4 → 1.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -196
- package/README.zh-CN.md +40 -196
- package/frontend/activate.html +56 -17
- package/frontend/admin/admin-panel-v2.js +27 -21
- package/frontend/admin/index.html +21 -11
- package/frontend/assets/market-ui.css +75 -1
- package/frontend/index.html +66 -30
- package/frontend/user/index.html +4 -4
- package/install.sh +5 -14
- package/lib/index.js +118 -32
- package/lib/services/activation-orchestrator.js +26 -15
- package/lib/services/cliproxy-api.js +1 -1
- package/lib/services/newapi.js +1 -1
- package/package.json +2 -2
package/frontend/activate.html
CHANGED
|
@@ -3,13 +3,22 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
-
<title>激活 CDK |
|
|
7
|
-
<meta name="description" content="输入
|
|
6
|
+
<title>激活 CDK | FogAct</title>
|
|
7
|
+
<meta name="description" content="输入 FogAct 激活码,完成服务绑定并查看额度与有效期。" />
|
|
8
|
+
<script>
|
|
9
|
+
;(function () {
|
|
10
|
+
var theme = localStorage.getItem('fogact_theme') || localStorage.getItem('admin_theme') || localStorage.getItem('yunyi_user_theme') || 'system';
|
|
11
|
+
var prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
12
|
+
var isDark = theme === 'dark' || (theme === 'system' && prefersDark);
|
|
13
|
+
document.documentElement.classList.toggle('dark', isDark);
|
|
14
|
+
document.documentElement.style.colorScheme = isDark ? 'dark' : 'light';
|
|
15
|
+
})();
|
|
16
|
+
</script>
|
|
8
17
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
9
18
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
10
19
|
<link href="https://fonts.googleapis.com/css2?family=Manrope:wght@600;700;800&family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet" />
|
|
11
20
|
<link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200" rel="stylesheet" />
|
|
12
|
-
<link rel="stylesheet" href="/assets/market-ui.css?v=
|
|
21
|
+
<link rel="stylesheet" href="/assets/market-ui.css?v=20260619-theme1" />
|
|
13
22
|
</head>
|
|
14
23
|
<body class="market-page">
|
|
15
24
|
<span class="market-mouse-light" aria-hidden="true"></span>
|
|
@@ -19,8 +28,8 @@
|
|
|
19
28
|
<a class="market-brand" href="/">
|
|
20
29
|
<span class="market-logo">F</span>
|
|
21
30
|
<span>
|
|
22
|
-
<span class="market-brand-title">
|
|
23
|
-
<span class="market-brand-subtitle"
|
|
31
|
+
<span class="market-brand-title">FogAct</span>
|
|
32
|
+
<span class="market-brand-subtitle">输入激活码完成服务绑定</span>
|
|
24
33
|
</span>
|
|
25
34
|
</a>
|
|
26
35
|
|
|
@@ -29,14 +38,20 @@
|
|
|
29
38
|
<a href="/admin/">管理后台</a>
|
|
30
39
|
<a href="/">首页</a>
|
|
31
40
|
</nav>
|
|
41
|
+
|
|
42
|
+
<div class="market-actions">
|
|
43
|
+
<button type="button" class="market-button market-theme-toggle" data-theme-toggle aria-label="切换暗黑模式">
|
|
44
|
+
<span class="material-symbols-outlined" data-theme-icon>light_mode</span>
|
|
45
|
+
</button>
|
|
46
|
+
</div>
|
|
32
47
|
</header>
|
|
33
48
|
|
|
34
49
|
<main class="market-activation">
|
|
35
50
|
<section class="market-activation-copy" aria-labelledby="activation-title">
|
|
36
|
-
<div class="market-kicker"><span class="market-kicker-dot"></span>
|
|
51
|
+
<div class="market-kicker"><span class="market-kicker-dot"></span> 快速激活流程</div>
|
|
37
52
|
<h1 id="activation-title" class="market-title">输入 CDK,立即开通 <span>CLI 服务</span></h1>
|
|
38
53
|
<p class="market-copy">
|
|
39
|
-
|
|
54
|
+
输入 CDK 后即可绑定服务;用户名和邮箱用于后台识别,可按需填写。
|
|
40
55
|
</p>
|
|
41
56
|
|
|
42
57
|
<div class="market-flow" aria-label="激活流程">
|
|
@@ -50,7 +65,7 @@
|
|
|
50
65
|
</div>
|
|
51
66
|
<div class="market-flow-step">
|
|
52
67
|
<span class="market-flow-index">3</span>
|
|
53
|
-
<span><strong
|
|
68
|
+
<span><strong>开通服务</strong><span>写入服务、额度和有效期</span></span>
|
|
54
69
|
</div>
|
|
55
70
|
</div>
|
|
56
71
|
|
|
@@ -61,7 +76,7 @@
|
|
|
61
76
|
<p class="market-mini-title">安全校验</p>
|
|
62
77
|
<p class="market-mini-copy">激活过程通过本地 API 完成,失败会返回明确提示。</p>
|
|
63
78
|
</div>
|
|
64
|
-
<span class="market-status-pill"
|
|
79
|
+
<span class="market-status-pill">安全</span>
|
|
65
80
|
</div>
|
|
66
81
|
<div class="market-mini-card">
|
|
67
82
|
<span class="market-icon material-symbols-outlined">rocket_launch</span>
|
|
@@ -69,7 +84,7 @@
|
|
|
69
84
|
<p class="market-mini-title">多服务支持</p>
|
|
70
85
|
<p class="market-mini-copy">适配 Codex、Claude Code、OpenCode 与 OpenClaw 场景。</p>
|
|
71
86
|
</div>
|
|
72
|
-
<span class="market-status-pill"
|
|
87
|
+
<span class="market-status-pill">多平台</span>
|
|
73
88
|
</div>
|
|
74
89
|
</div>
|
|
75
90
|
</section>
|
|
@@ -84,22 +99,22 @@
|
|
|
84
99
|
<div class="market-form-header">
|
|
85
100
|
<span class="market-icon material-symbols-outlined">vpn_key</span>
|
|
86
101
|
<h1>激活 CDK</h1>
|
|
87
|
-
<p
|
|
102
|
+
<p>输入 CDK 后即可绑定服务;用户名和邮箱用于后台识别,可按需填写。</p>
|
|
88
103
|
</div>
|
|
89
104
|
|
|
90
105
|
<form id="activate-form" class="market-form">
|
|
91
106
|
<div class="market-field">
|
|
92
|
-
<label for="activation-code">激活码 <span
|
|
107
|
+
<label for="activation-code">激活码 <span>必填</span></label>
|
|
93
108
|
<input type="text" id="activation-code" placeholder="例如 XXXX-XXXX-XXXX-XXXX" required />
|
|
94
109
|
</div>
|
|
95
110
|
|
|
96
111
|
<div class="market-field">
|
|
97
|
-
<label for="username">用户名 <span
|
|
112
|
+
<label for="username">用户名 <span>选填</span></label>
|
|
98
113
|
<input type="text" id="username" placeholder="用于后台识别的用户名" />
|
|
99
114
|
</div>
|
|
100
115
|
|
|
101
116
|
<div class="market-field">
|
|
102
|
-
<label for="email">邮箱 <span
|
|
117
|
+
<label for="email">邮箱 <span>选填</span></label>
|
|
103
118
|
<input type="email" id="email" placeholder="name@example.com" />
|
|
104
119
|
</div>
|
|
105
120
|
|
|
@@ -107,7 +122,7 @@
|
|
|
107
122
|
|
|
108
123
|
<button type="submit" id="submit-btn" class="market-button market-button-primary" style="width: 100%; min-height: 50px;">
|
|
109
124
|
<span class="material-symbols-outlined">bolt</span>
|
|
110
|
-
|
|
125
|
+
立即激活
|
|
111
126
|
</button>
|
|
112
127
|
</form>
|
|
113
128
|
|
|
@@ -127,7 +142,7 @@
|
|
|
127
142
|
</div>
|
|
128
143
|
|
|
129
144
|
<h2>激活成功</h2>
|
|
130
|
-
<p
|
|
145
|
+
<p>服务已开通,以下是本次激活详情。</p>
|
|
131
146
|
|
|
132
147
|
<div class="market-result-list">
|
|
133
148
|
<div class="market-result-row"><span>激活码</span><span id="result-code"></span></div>
|
|
@@ -175,6 +190,8 @@
|
|
|
175
190
|
});
|
|
176
191
|
});
|
|
177
192
|
|
|
193
|
+
initThemeToggle();
|
|
194
|
+
|
|
178
195
|
form.addEventListener('submit', async (event) => {
|
|
179
196
|
event.preventDefault();
|
|
180
197
|
|
|
@@ -210,10 +227,32 @@
|
|
|
210
227
|
showError('网络错误,请稍后重试');
|
|
211
228
|
} finally {
|
|
212
229
|
submitBtn.disabled = false;
|
|
213
|
-
submitBtn.innerHTML = '<span class="material-symbols-outlined">bolt</span>
|
|
230
|
+
submitBtn.innerHTML = '<span class="material-symbols-outlined">bolt</span> 立即激活';
|
|
214
231
|
}
|
|
215
232
|
});
|
|
216
233
|
|
|
234
|
+
function initThemeToggle() {
|
|
235
|
+
const button = document.querySelector('[data-theme-toggle]');
|
|
236
|
+
const icon = document.querySelector('[data-theme-icon]');
|
|
237
|
+
if (!button || !icon) return;
|
|
238
|
+
|
|
239
|
+
const sync = () => {
|
|
240
|
+
const isDark = document.documentElement.classList.contains('dark');
|
|
241
|
+
icon.textContent = isDark ? 'dark_mode' : 'light_mode';
|
|
242
|
+
button.setAttribute('aria-label', isDark ? '切换浅色模式' : '切换暗黑模式');
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
button.addEventListener('click', () => {
|
|
246
|
+
const isDark = !document.documentElement.classList.contains('dark');
|
|
247
|
+
document.documentElement.classList.toggle('dark', isDark);
|
|
248
|
+
document.documentElement.style.colorScheme = isDark ? 'dark' : 'light';
|
|
249
|
+
localStorage.setItem('fogact_theme', isDark ? 'dark' : 'light');
|
|
250
|
+
sync();
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
sync();
|
|
254
|
+
}
|
|
255
|
+
|
|
217
256
|
function showError(message) {
|
|
218
257
|
errorMessage.textContent = message;
|
|
219
258
|
errorMessage.classList.remove('hidden');
|
|
@@ -229,7 +229,7 @@ function getServiceOptionsForScope(currentValue = '') {
|
|
|
229
229
|
|
|
230
230
|
const DEFAULT_SETTINGS = {
|
|
231
231
|
site: {
|
|
232
|
-
siteName: '
|
|
232
|
+
siteName: 'FogAct',
|
|
233
233
|
siteDescription: '统一管理用户、激活码与订阅配置。',
|
|
234
234
|
siteUrl: 'https://example.com',
|
|
235
235
|
logoUrl: '',
|
|
@@ -259,7 +259,7 @@ const DEFAULT_SETTINGS = {
|
|
|
259
259
|
email: {
|
|
260
260
|
smtpHost: '',
|
|
261
261
|
smtpPort: 587,
|
|
262
|
-
senderName: '
|
|
262
|
+
senderName: 'FogAct',
|
|
263
263
|
senderEmail: '',
|
|
264
264
|
enableTls: true
|
|
265
265
|
},
|
|
@@ -356,18 +356,22 @@ const UI = {
|
|
|
356
356
|
initThemeToggle() {
|
|
357
357
|
const button = document.getElementById('theme-toggle');
|
|
358
358
|
const html = document.documentElement;
|
|
359
|
-
const savedTheme = localStorage.getItem('admin_theme') || '
|
|
359
|
+
const savedTheme = localStorage.getItem('fogact_theme') || localStorage.getItem('admin_theme') || 'system';
|
|
360
|
+
const prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
361
|
+
const initialDark = savedTheme === 'dark' || (savedTheme === 'system' && prefersDark);
|
|
360
362
|
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
363
|
+
html.classList.toggle('dark', initialDark);
|
|
364
|
+
html.style.colorScheme = initialDark ? 'dark' : 'light';
|
|
365
|
+
button.querySelector('.material-symbols-outlined').textContent = initialDark ? 'dark_mode' : 'light_mode';
|
|
366
|
+
button.setAttribute('aria-label', initialDark ? '切换浅色模式' : '切换暗黑模式');
|
|
365
367
|
|
|
366
368
|
button.addEventListener('click', () => {
|
|
367
369
|
html.classList.toggle('dark');
|
|
368
370
|
const isDark = html.classList.contains('dark');
|
|
369
371
|
button.querySelector('.material-symbols-outlined').textContent = isDark ? 'dark_mode' : 'light_mode';
|
|
370
|
-
|
|
372
|
+
button.setAttribute('aria-label', isDark ? '切换浅色模式' : '切换暗黑模式');
|
|
373
|
+
html.style.colorScheme = isDark ? 'dark' : 'light';
|
|
374
|
+
localStorage.setItem('fogact_theme', isDark ? 'dark' : 'light');
|
|
371
375
|
});
|
|
372
376
|
},
|
|
373
377
|
|
|
@@ -375,13 +379,15 @@ const UI = {
|
|
|
375
379
|
const palette = {
|
|
376
380
|
success: 'bg-green-50 border-green-500 text-green-800',
|
|
377
381
|
error: 'bg-error-container border-error text-on-error-container',
|
|
378
|
-
info: 'bg-primary-fixed border-primary text-on-primary-fixed'
|
|
382
|
+
info: 'bg-primary-fixed border-primary text-on-primary-fixed',
|
|
383
|
+
warning: 'bg-warning-container border-warning text-on-surface'
|
|
379
384
|
};
|
|
380
385
|
|
|
381
386
|
const icons = {
|
|
382
387
|
success: 'check_circle',
|
|
383
388
|
error: 'error',
|
|
384
|
-
info: 'info'
|
|
389
|
+
info: 'info',
|
|
390
|
+
warning: 'warning'
|
|
385
391
|
};
|
|
386
392
|
|
|
387
393
|
const node = document.createElement('div');
|
|
@@ -569,7 +575,7 @@ const UserManagement = {
|
|
|
569
575
|
renderTable() {
|
|
570
576
|
const container = document.getElementById('users-table-container');
|
|
571
577
|
if (!AppState.users.length) {
|
|
572
|
-
container.innerHTML = '<p class="text-on-surface-variant text-center py-8"
|
|
578
|
+
container.innerHTML = '<p class="text-on-surface-variant text-center py-8">暂无用户数据,可点击右上角添加用户。</p>';
|
|
573
579
|
return;
|
|
574
580
|
}
|
|
575
581
|
|
|
@@ -700,7 +706,7 @@ const UserManagement = {
|
|
|
700
706
|
try {
|
|
701
707
|
const result = await API.deleteUser(id);
|
|
702
708
|
if (!result.success) {
|
|
703
|
-
UI.showNotification(result.message || '
|
|
709
|
+
UI.showNotification(result.message || '用户删除失败', 'error');
|
|
704
710
|
return;
|
|
705
711
|
}
|
|
706
712
|
UI.showNotification('用户已删除', 'success');
|
|
@@ -712,7 +718,7 @@ const UserManagement = {
|
|
|
712
718
|
return;
|
|
713
719
|
}
|
|
714
720
|
console.error(error);
|
|
715
|
-
UI.showNotification('
|
|
721
|
+
UI.showNotification('用户删除失败', 'error');
|
|
716
722
|
}
|
|
717
723
|
}
|
|
718
724
|
};
|
|
@@ -761,7 +767,7 @@ const CodeManagement = {
|
|
|
761
767
|
renderTable() {
|
|
762
768
|
const container = document.getElementById('codes-table-container');
|
|
763
769
|
if (!AppState.codes.length) {
|
|
764
|
-
container.innerHTML = '<p class="text-on-surface-variant text-center py-8"
|
|
770
|
+
container.innerHTML = '<p class="text-on-surface-variant text-center py-8">暂无激活码数据,可点击右上角生成 CDK。</p>';
|
|
765
771
|
return;
|
|
766
772
|
}
|
|
767
773
|
|
|
@@ -1196,7 +1202,7 @@ const CodeManagement = {
|
|
|
1196
1202
|
try {
|
|
1197
1203
|
const result = await API.createCode(payload);
|
|
1198
1204
|
if (!result.success) {
|
|
1199
|
-
UI.showNotification(result.message || '
|
|
1205
|
+
UI.showNotification(result.message || '激活码创建失败', 'error');
|
|
1200
1206
|
return;
|
|
1201
1207
|
}
|
|
1202
1208
|
UI.hideModal();
|
|
@@ -1209,7 +1215,7 @@ const CodeManagement = {
|
|
|
1209
1215
|
return;
|
|
1210
1216
|
}
|
|
1211
1217
|
console.error(error);
|
|
1212
|
-
UI.showNotification('
|
|
1218
|
+
UI.showNotification('激活码创建失败', 'error');
|
|
1213
1219
|
}
|
|
1214
1220
|
},
|
|
1215
1221
|
|
|
@@ -1225,7 +1231,7 @@ const CodeManagement = {
|
|
|
1225
1231
|
try {
|
|
1226
1232
|
const result = await API.updateCode(id, payload);
|
|
1227
1233
|
if (!result.success) {
|
|
1228
|
-
UI.showNotification(result.message || '
|
|
1234
|
+
UI.showNotification(result.message || '激活码更新失败', 'error');
|
|
1229
1235
|
return;
|
|
1230
1236
|
}
|
|
1231
1237
|
UI.hideModal();
|
|
@@ -1238,7 +1244,7 @@ const CodeManagement = {
|
|
|
1238
1244
|
return;
|
|
1239
1245
|
}
|
|
1240
1246
|
console.error(error);
|
|
1241
|
-
UI.showNotification('
|
|
1247
|
+
UI.showNotification('激活码更新失败', 'error');
|
|
1242
1248
|
}
|
|
1243
1249
|
},
|
|
1244
1250
|
|
|
@@ -1247,7 +1253,7 @@ const CodeManagement = {
|
|
|
1247
1253
|
try {
|
|
1248
1254
|
const result = await API.deleteCode(id);
|
|
1249
1255
|
if (!result.success) {
|
|
1250
|
-
UI.showNotification(result.message || '
|
|
1256
|
+
UI.showNotification(result.message || '激活码删除失败', 'error');
|
|
1251
1257
|
return;
|
|
1252
1258
|
}
|
|
1253
1259
|
UI.showNotification('激活码已删除', 'success');
|
|
@@ -1259,14 +1265,14 @@ const CodeManagement = {
|
|
|
1259
1265
|
return;
|
|
1260
1266
|
}
|
|
1261
1267
|
console.error(error);
|
|
1262
|
-
UI.showNotification('
|
|
1268
|
+
UI.showNotification('激活码删除失败', 'error');
|
|
1263
1269
|
}
|
|
1264
1270
|
}
|
|
1265
1271
|
};
|
|
1266
1272
|
|
|
1267
1273
|
const LogsManagement = {
|
|
1268
1274
|
render() {
|
|
1269
|
-
document.getElementById('logs-container').innerHTML = '<p class="text-on-surface-variant text-center py-8"
|
|
1275
|
+
document.getElementById('logs-container').innerHTML = '<p class="text-on-surface-variant text-center py-8">暂无日志记录,后续操作会在这里展示。</p>';
|
|
1270
1276
|
}
|
|
1271
1277
|
};
|
|
1272
1278
|
|
|
@@ -1,9 +1,19 @@
|
|
|
1
1
|
<!DOCTYPE html>
|
|
2
|
-
<html
|
|
2
|
+
<html lang="zh-CN">
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
-
<title>管理中心 |
|
|
6
|
+
<title>管理中心 | FogAct</title>
|
|
7
|
+
|
|
8
|
+
<script>
|
|
9
|
+
;(function () {
|
|
10
|
+
var theme = localStorage.getItem('fogact_theme') || localStorage.getItem('admin_theme') || localStorage.getItem('yunyi_user_theme') || 'system';
|
|
11
|
+
var prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
12
|
+
var isDark = theme === 'dark' || (theme === 'system' && prefersDark);
|
|
13
|
+
document.documentElement.classList.toggle('dark', isDark);
|
|
14
|
+
document.documentElement.style.colorScheme = isDark ? 'dark' : 'light';
|
|
15
|
+
})();
|
|
16
|
+
</script>
|
|
7
17
|
|
|
8
18
|
<!-- Fonts -->
|
|
9
19
|
<link href="https://fonts.googleapis.com/css2?family=Manrope:wght@600;700;800&family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
|
|
@@ -381,7 +391,7 @@
|
|
|
381
391
|
height: 80%;
|
|
382
392
|
}
|
|
383
393
|
</style>
|
|
384
|
-
<link rel="stylesheet" href="/assets/market-ui.css?v=
|
|
394
|
+
<link rel="stylesheet" href="/assets/market-ui.css?v=20260619-theme1">
|
|
385
395
|
</head>
|
|
386
396
|
<body class="market-admin bg-surface text-on-surface min-h-screen flex overflow-hidden">
|
|
387
397
|
<span class="market-mouse-light" aria-hidden="true"></span>
|
|
@@ -394,8 +404,8 @@
|
|
|
394
404
|
<div class="w-16 h-16 bg-primary rounded-2xl flex items-center justify-center mx-auto mb-4">
|
|
395
405
|
<span class="material-symbols-outlined text-on-primary text-3xl">shield</span>
|
|
396
406
|
</div>
|
|
397
|
-
<h1 class="text-2xl font-bold text-on-surface mb-2"
|
|
398
|
-
<p class="text-sm text-on-surface-variant">
|
|
407
|
+
<h1 class="text-2xl font-bold text-on-surface mb-2">登录管理中心</h1>
|
|
408
|
+
<p class="text-sm text-on-surface-variant">FogAct 管理中心</p>
|
|
399
409
|
</div>
|
|
400
410
|
|
|
401
411
|
<div id="login-alert" class="hidden mb-4 p-3 rounded-xl text-sm bg-error-container border border-error text-on-error-container"></div>
|
|
@@ -421,7 +431,7 @@
|
|
|
421
431
|
</form>
|
|
422
432
|
|
|
423
433
|
<div class="text-center mt-6 text-xs text-on-surface-variant">
|
|
424
|
-
|
|
434
|
+
管理密码可通过 ADMIN_PASSWORD 环境变量配置
|
|
425
435
|
</div>
|
|
426
436
|
</div>
|
|
427
437
|
</div>
|
|
@@ -435,8 +445,8 @@
|
|
|
435
445
|
<div class="text-xl font-black text-on-surface mb-8 px-4 flex items-center gap-3">
|
|
436
446
|
<span class="market-logo">F</span>
|
|
437
447
|
<span>
|
|
438
|
-
<span class="block leading-none">
|
|
439
|
-
<span class="block text-xs font-bold text-on-surface-variant mt-1"
|
|
448
|
+
<span class="block leading-none">FogAct</span>
|
|
449
|
+
<span class="block text-xs font-bold text-on-surface-variant mt-1">管理中心</span>
|
|
440
450
|
</span>
|
|
441
451
|
</div>
|
|
442
452
|
|
|
@@ -661,7 +671,7 @@
|
|
|
661
671
|
<div class="bg-surface-container-lowest rounded-2xl p-6 border border-outline-variant/20">
|
|
662
672
|
<h3 class="text-lg font-bold text-on-surface mb-6">系统日志</h3>
|
|
663
673
|
<div id="logs-container">
|
|
664
|
-
<p class="text-on-surface-variant text-center py-8"
|
|
674
|
+
<p class="text-on-surface-variant text-center py-8">暂无日志记录,后续操作会在这里展示。</p>
|
|
665
675
|
</div>
|
|
666
676
|
</div>
|
|
667
677
|
</div>
|
|
@@ -671,7 +681,7 @@
|
|
|
671
681
|
<div class="bg-surface-container-lowest rounded-2xl p-6 border border-outline-variant/20">
|
|
672
682
|
<h3 class="text-lg font-bold text-on-surface mb-6">系统设置</h3>
|
|
673
683
|
<div id="settings-container">
|
|
674
|
-
<p class="text-on-surface-variant text-center py-8"
|
|
684
|
+
<p class="text-on-surface-variant text-center py-8">请选择需要维护的系统配置。</p>
|
|
675
685
|
</div>
|
|
676
686
|
</div>
|
|
677
687
|
</div>
|
|
@@ -684,7 +694,7 @@
|
|
|
684
694
|
<div id="modal-root"></div>
|
|
685
695
|
|
|
686
696
|
<!-- JavaScript -->
|
|
687
|
-
<script src="/admin/admin-panel-v2.js?v=
|
|
697
|
+
<script src="/admin/admin-panel-v2.js?v=20260619-theme1"></script>
|
|
688
698
|
<script>
|
|
689
699
|
let marketPointerRaf = 0;
|
|
690
700
|
window.addEventListener('load', () => {
|
|
@@ -211,6 +211,16 @@ body.market-user::after {
|
|
|
211
211
|
box-shadow: var(--market-shadow-soft);
|
|
212
212
|
}
|
|
213
213
|
|
|
214
|
+
.market-theme-toggle {
|
|
215
|
+
width: 40px;
|
|
216
|
+
min-width: 40px;
|
|
217
|
+
padding: 0;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.market-theme-toggle .material-symbols-outlined {
|
|
221
|
+
font-size: 20px;
|
|
222
|
+
}
|
|
223
|
+
|
|
214
224
|
.market-button-primary {
|
|
215
225
|
border-color: color-mix(in srgb, var(--market-primary) 70%, transparent);
|
|
216
226
|
color: #fff;
|
|
@@ -222,6 +232,11 @@ body.market-user::after {
|
|
|
222
232
|
color: #fff;
|
|
223
233
|
}
|
|
224
234
|
|
|
235
|
+
html.dark .market-button:not(.market-button-primary),
|
|
236
|
+
body.market-dark .market-button:not(.market-button-primary) {
|
|
237
|
+
box-shadow: 0 1px 0 rgba(255, 255, 255, 0.08) inset;
|
|
238
|
+
}
|
|
239
|
+
|
|
225
240
|
.market-hero {
|
|
226
241
|
display: grid;
|
|
227
242
|
grid-template-columns: minmax(0, 1.05fr) minmax(320px, 0.75fr);
|
|
@@ -263,7 +278,13 @@ body.market-user::after {
|
|
|
263
278
|
|
|
264
279
|
html.dark .market-hero-main::before,
|
|
265
280
|
html.dark .market-card::before,
|
|
266
|
-
html.dark .market-auth-card::before
|
|
281
|
+
html.dark .market-auth-card::before,
|
|
282
|
+
body.market-dark .market-hero-main::before,
|
|
283
|
+
body.market-dark .market-card::before,
|
|
284
|
+
body.market-dark .market-auth-card::before {
|
|
285
|
+
background:
|
|
286
|
+
radial-gradient(circle at 12% 0%, rgba(255, 255, 255, 0.12), transparent 25%),
|
|
287
|
+
linear-gradient(135deg, rgba(255, 255, 255, 0.08), transparent 36%);
|
|
267
288
|
opacity: 0.09;
|
|
268
289
|
}
|
|
269
290
|
|
|
@@ -1041,6 +1062,59 @@ body.market-admin {
|
|
|
1041
1062
|
background-color: color-mix(in srgb, var(--market-danger) 14%, transparent) !important;
|
|
1042
1063
|
}
|
|
1043
1064
|
|
|
1065
|
+
html.dark .market-admin .bg-green-50,
|
|
1066
|
+
body.market-dark .market-admin .bg-green-50 {
|
|
1067
|
+
background-color: color-mix(in srgb, var(--market-success) 18%, transparent) !important;
|
|
1068
|
+
}
|
|
1069
|
+
|
|
1070
|
+
html.dark .market-admin .text-green-700,
|
|
1071
|
+
html.dark .market-admin .text-green-800,
|
|
1072
|
+
body.market-dark .market-admin .text-green-700,
|
|
1073
|
+
body.market-dark .market-admin .text-green-800 {
|
|
1074
|
+
color: color-mix(in srgb, var(--market-success) 82%, #fff 18%) !important;
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1077
|
+
html.dark .market-admin .bg-amber-50,
|
|
1078
|
+
body.market-dark .market-admin .bg-amber-50 {
|
|
1079
|
+
background-color: color-mix(in srgb, var(--market-warning) 18%, transparent) !important;
|
|
1080
|
+
}
|
|
1081
|
+
|
|
1082
|
+
html.dark .market-admin .text-amber-700,
|
|
1083
|
+
body.market-dark .market-admin .text-amber-700 {
|
|
1084
|
+
color: color-mix(in srgb, var(--market-warning) 82%, #fff 18%) !important;
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
html.dark .market-admin tbody tr,
|
|
1088
|
+
body.market-dark .market-admin tbody tr {
|
|
1089
|
+
box-shadow: 0 10px 24px rgba(0, 0, 0, 0.24);
|
|
1090
|
+
}
|
|
1091
|
+
|
|
1092
|
+
html.dark .market-admin option,
|
|
1093
|
+
body.market-dark .market-admin option {
|
|
1094
|
+
color: var(--market-ink);
|
|
1095
|
+
background: var(--market-bg-soft);
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
html.dark .market-admin .modal-backdrop,
|
|
1099
|
+
body.market-dark .market-admin .modal-backdrop {
|
|
1100
|
+
background: rgba(0, 0, 0, 0.68) !important;
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1103
|
+
html.dark .market-admin .border-b,
|
|
1104
|
+
body.market-dark .market-admin .border-b {
|
|
1105
|
+
border-color: var(--market-line) !important;
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1108
|
+
html.dark .market-admin [class*="bg-error-container"],
|
|
1109
|
+
body.market-dark .market-admin [class*="bg-error-container"] {
|
|
1110
|
+
background-color: color-mix(in srgb, var(--market-danger) 16%, transparent) !important;
|
|
1111
|
+
}
|
|
1112
|
+
|
|
1113
|
+
html.dark .market-admin [class*="text-on-error-container"],
|
|
1114
|
+
body.market-dark .market-admin [class*="text-on-error-container"] {
|
|
1115
|
+
color: color-mix(in srgb, var(--market-danger) 76%, #fff 24%) !important;
|
|
1116
|
+
}
|
|
1117
|
+
|
|
1044
1118
|
/* Built user app polish */
|
|
1045
1119
|
body.market-user {
|
|
1046
1120
|
overflow-x: hidden;
|