fogact 1.1.3
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/LICENSE +21 -0
- package/README.md +244 -0
- package/README.zh-CN.md +244 -0
- package/bin/cli.js +9 -0
- package/bin/web-server.js +1434 -0
- package/config/upstream.example.json +14 -0
- package/frontend/activate.html +249 -0
- package/frontend/admin/admin-panel-v2.js +1899 -0
- package/frontend/admin/index.html +705 -0
- package/frontend/assets/market-ui.css +1876 -0
- package/frontend/color-test.html +136 -0
- package/frontend/index.html +191 -0
- package/frontend/user/assets/AnnouncementDetail-Dvxmwz0A.js +12 -0
- package/frontend/user/assets/Announcements-CS1tF2mx.js +11 -0
- package/frontend/user/assets/CardBind-CsCxihhP.js +21 -0
- package/frontend/user/assets/CardContent.vue_vue_type_script_setup_true_lang-D2L-uqSl.js +1 -0
- package/frontend/user/assets/CardDescription.vue_vue_type_script_setup_true_lang-D-v5Pl7F.js +1 -0
- package/frontend/user/assets/CardTitle.vue_vue_type_script_setup_true_lang-a0CCN6D5.js +1 -0
- package/frontend/user/assets/Dashboard-rPsmltm5.js +51 -0
- package/frontend/user/assets/DashboardLayout-BUCWGlXC.css +1 -0
- package/frontend/user/assets/DashboardLayout-DDkxHYFj.js +80 -0
- package/frontend/user/assets/Input.vue_vue_type_script_setup_true_lang-B0SyPmYb.js +6 -0
- package/frontend/user/assets/Label.vue_vue_type_script_setup_true_lang-CxYORSgN.js +1 -0
- package/frontend/user/assets/Progress.vue_vue_type_script_setup_true_lang-2_QbPsEQ.js +1 -0
- package/frontend/user/assets/QuotaPack-B_tJ7Psm.js +6 -0
- package/frontend/user/assets/Renewal-BSDhDmwv.js +6 -0
- package/frontend/user/assets/ScrollArea.vue_vue_type_script_setup_true_lang-DMYwcfpz.js +1 -0
- package/frontend/user/assets/Separator.vue_vue_type_script_setup_true_lang-Ckg8EXj_.js +1 -0
- package/frontend/user/assets/Settings-CBdAa3lw.js +11 -0
- package/frontend/user/assets/TooltipTrigger.vue_vue_type_script_setup_true_lang-DtSBjzGo.js +16 -0
- package/frontend/user/assets/Welcome-7IfzEli4.css +1 -0
- package/frontend/user/assets/Welcome-Dtfp6oER.js +1 -0
- package/frontend/user/assets/_plugin-vue_export-helper-5cjT4u0R.js +16 -0
- package/frontend/user/assets/activity-wYWtyqTJ.js +6 -0
- package/frontend/user/assets/announcement-35mOnjRL.js +16 -0
- package/frontend/user/assets/calendar-BFNuCata.js +6 -0
- package/frontend/user/assets/chart-vendor-CULJE59K.js +37 -0
- package/frontend/user/assets/chevron-down-kDbuU1Py.js +6 -0
- package/frontend/user/assets/chevron-right-BayASIm0.js +6 -0
- package/frontend/user/assets/eye-CY62vip0.js +6 -0
- package/frontend/user/assets/gauge-C5NQ-mV8.js +6 -0
- package/frontend/user/assets/index-B8QSyYhS.css +1 -0
- package/frontend/user/assets/index-Da98HOxL.js +91 -0
- package/frontend/user/assets/link-2-DT5R5nGO.js +6 -0
- package/frontend/user/assets/package-rUbExUEn.js +6 -0
- package/frontend/user/assets/plus-CQc6C8wG.js +11 -0
- package/frontend/user/assets/refresh-cw-Y9hCloPL.js +6 -0
- package/frontend/user/assets/useUserPageRefresh-BYZvpNR9.js +1 -0
- package/frontend/user/assets/zap-l5zbZqrM.js +11 -0
- package/frontend/user/index.html +67 -0
- package/install.sh +402 -0
- package/lib/commands/activate.js +144 -0
- package/lib/commands/restore.js +102 -0
- package/lib/commands/test.js +40 -0
- package/lib/config/claude.js +81 -0
- package/lib/config/codex.js +164 -0
- package/lib/config/upstream.js +79 -0
- package/lib/index.js +164 -0
- package/lib/platforms/claude-code.js +35 -0
- package/lib/platforms/codex-cli.js +35 -0
- package/lib/platforms/editor-codex.js +138 -0
- package/lib/platforms/index.js +32 -0
- package/lib/platforms/openclaw.js +118 -0
- package/lib/platforms/opencode.js +89 -0
- package/lib/services/activation-orchestrator.js +666 -0
- package/lib/services/backup-service.js +162 -0
- package/lib/services/cliproxy-api.js +174 -0
- package/lib/services/database.js +461 -0
- package/lib/services/newapi.js +97 -0
- package/lib/services/node-service.js +49 -0
- package/lib/utils/json-file.js +33 -0
- package/package.json +53 -0
|
@@ -0,0 +1,705 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html class="light" lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>管理中心 | FogIDC Activator</title>
|
|
7
|
+
|
|
8
|
+
<!-- Fonts -->
|
|
9
|
+
<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">
|
|
10
|
+
<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">
|
|
11
|
+
|
|
12
|
+
<!-- Tailwind CSS -->
|
|
13
|
+
<script src="https://cdn.tailwindcss.com?plugins=forms,container-queries"></script>
|
|
14
|
+
<script id="tailwind-config">
|
|
15
|
+
tailwind.config = {
|
|
16
|
+
darkMode: "class",
|
|
17
|
+
theme: {
|
|
18
|
+
extend: {
|
|
19
|
+
colors: {
|
|
20
|
+
// Unified color scheme matching user pages
|
|
21
|
+
"background": "hsl(210, 40%, 98%)",
|
|
22
|
+
"surface": "hsl(210, 40%, 98%)",
|
|
23
|
+
"surface-container-lowest": "#ffffff",
|
|
24
|
+
"surface-container-low": "hsl(210, 40%, 96%)",
|
|
25
|
+
"surface-container": "hsl(210, 30%, 94%)",
|
|
26
|
+
"surface-container-high": "hsl(210, 25%, 92%)",
|
|
27
|
+
"surface-container-highest": "hsl(210, 20%, 90%)",
|
|
28
|
+
|
|
29
|
+
// Primary blue-gray
|
|
30
|
+
"primary": "hsl(210, 100%, 50%)",
|
|
31
|
+
"primary-container": "hsl(210, 100%, 45%)",
|
|
32
|
+
"on-primary": "#ffffff",
|
|
33
|
+
"on-primary-container": "#ffffff",
|
|
34
|
+
|
|
35
|
+
// Text colors
|
|
36
|
+
"on-surface": "hsl(210, 10%, 15%)",
|
|
37
|
+
"on-surface-variant": "hsl(210, 8%, 45%)",
|
|
38
|
+
"on-background": "hsl(210, 10%, 15%)",
|
|
39
|
+
|
|
40
|
+
// Borders
|
|
41
|
+
"outline": "hsl(210, 15%, 70%)",
|
|
42
|
+
"outline-variant": "hsl(210, 15%, 85%)",
|
|
43
|
+
|
|
44
|
+
// Status colors
|
|
45
|
+
"error": "#dc2626",
|
|
46
|
+
"error-container": "#fee2e2",
|
|
47
|
+
"on-error": "#ffffff",
|
|
48
|
+
"on-error-container": "#991b1b",
|
|
49
|
+
|
|
50
|
+
"success": "#16a34a",
|
|
51
|
+
"success-container": "#dcfce7",
|
|
52
|
+
"on-success": "#ffffff",
|
|
53
|
+
|
|
54
|
+
"warning": "#ea580c",
|
|
55
|
+
"warning-container": "#ffedd5",
|
|
56
|
+
|
|
57
|
+
// Secondary
|
|
58
|
+
"secondary": "hsl(210, 60%, 55%)",
|
|
59
|
+
"on-secondary": "#ffffff",
|
|
60
|
+
"secondary-container": "hsl(210, 60%, 90%)",
|
|
61
|
+
|
|
62
|
+
// Grayscale
|
|
63
|
+
"gray-50": "hsl(0, 0%, 99%)",
|
|
64
|
+
"gray-100": "hsl(0, 0%, 97%)",
|
|
65
|
+
"gray-200": "hsl(0, 0%, 95%)",
|
|
66
|
+
"gray-300": "hsl(0, 0%, 90%)",
|
|
67
|
+
"gray-400": "hsl(0, 0%, 78%)",
|
|
68
|
+
"gray-500": "hsl(0, 0%, 56%)",
|
|
69
|
+
"gray-600": "hsl(0, 0%, 43%)",
|
|
70
|
+
"gray-700": "hsl(0, 0%, 30%)",
|
|
71
|
+
"gray-800": "hsl(0, 0%, 15%)",
|
|
72
|
+
"gray-900": "hsl(0, 0%, 9%)"
|
|
73
|
+
},
|
|
74
|
+
fontFamily: {
|
|
75
|
+
"headline": ["Manrope", "sans-serif"],
|
|
76
|
+
"body": ["Inter", "sans-serif"],
|
|
77
|
+
"label": ["Inter", "sans-serif"]
|
|
78
|
+
},
|
|
79
|
+
borderRadius: {
|
|
80
|
+
"DEFAULT": "0.5rem",
|
|
81
|
+
"lg": "0.75rem",
|
|
82
|
+
"xl": "1rem",
|
|
83
|
+
"2xl": "1.25rem",
|
|
84
|
+
"3xl": "1.5rem"
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
</script>
|
|
90
|
+
|
|
91
|
+
<style>
|
|
92
|
+
.material-symbols-outlined {
|
|
93
|
+
font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24;
|
|
94
|
+
vertical-align: middle;
|
|
95
|
+
}
|
|
96
|
+
body {
|
|
97
|
+
font-family: 'Inter', 'PingFang SC', 'Microsoft YaHei', sans-serif;
|
|
98
|
+
}
|
|
99
|
+
h1, h2, h3, h4 {
|
|
100
|
+
font-family: 'Manrope', 'PingFang SC', sans-serif;
|
|
101
|
+
}
|
|
102
|
+
.expandable-row-content {
|
|
103
|
+
display: none;
|
|
104
|
+
}
|
|
105
|
+
tr.expanded + tr.expandable-row-content {
|
|
106
|
+
display: table-row;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/* Dark mode overrides - matching user pages */
|
|
110
|
+
.dark {
|
|
111
|
+
--tw-bg-opacity: 1;
|
|
112
|
+
}
|
|
113
|
+
.dark .bg-background,
|
|
114
|
+
.dark .bg-surface {
|
|
115
|
+
background-color: hsl(240, 10%, 3.9%) !important;
|
|
116
|
+
}
|
|
117
|
+
.dark .bg-surface-container-lowest {
|
|
118
|
+
background-color: hsl(240, 10%, 6%) !important;
|
|
119
|
+
}
|
|
120
|
+
.dark .bg-surface-container-low {
|
|
121
|
+
background-color: hsl(240, 10%, 8%) !important;
|
|
122
|
+
}
|
|
123
|
+
.dark .bg-surface-container {
|
|
124
|
+
background-color: hsl(240, 10%, 10%) !important;
|
|
125
|
+
}
|
|
126
|
+
.dark .bg-surface-container-high {
|
|
127
|
+
background-color: hsl(240, 10%, 12%) !important;
|
|
128
|
+
}
|
|
129
|
+
.dark .bg-surface-container-highest {
|
|
130
|
+
background-color: hsl(240, 10%, 14%) !important;
|
|
131
|
+
}
|
|
132
|
+
.dark .text-on-surface {
|
|
133
|
+
color: hsl(0, 0%, 95%) !important;
|
|
134
|
+
}
|
|
135
|
+
.dark .text-on-surface-variant {
|
|
136
|
+
color: hsl(0, 0%, 70%) !important;
|
|
137
|
+
}
|
|
138
|
+
.dark .border-outline {
|
|
139
|
+
border-color: hsl(240, 10%, 25%) !important;
|
|
140
|
+
}
|
|
141
|
+
.dark .border-outline-variant {
|
|
142
|
+
border-color: hsl(240, 10%, 20%) !important;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/* === 微交互动画系统 === */
|
|
146
|
+
|
|
147
|
+
/* 基础过渡 - 只对颜色做全局过渡 */
|
|
148
|
+
* {
|
|
149
|
+
transition: background-color 0.2s ease, color 0.2s ease, border-color 0.2s ease;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/* 模态框背景 */
|
|
153
|
+
@keyframes fadeInBackdrop {
|
|
154
|
+
from { opacity: 0; }
|
|
155
|
+
to { opacity: 1; }
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/* 加载旋转 */
|
|
159
|
+
@keyframes rotate {
|
|
160
|
+
from { transform: rotate(0deg); }
|
|
161
|
+
to { transform: rotate(360deg); }
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/* === 微交互类 === */
|
|
165
|
+
|
|
166
|
+
@keyframes pulse {
|
|
167
|
+
0%, 100% { opacity: 1; }
|
|
168
|
+
50% { opacity: 0.5; }
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
@keyframes shake {
|
|
172
|
+
0%, 100% { transform: translateX(0); }
|
|
173
|
+
10%, 30%, 50%, 70%, 90% { transform: translateX(-5px); }
|
|
174
|
+
20%, 40%, 60%, 80% { transform: translateX(5px); }
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/* 渐变背景动画 */
|
|
178
|
+
@keyframes gradientShift {
|
|
179
|
+
0% { background-position: 0% 50%; }
|
|
180
|
+
50% { background-position: 100% 50%; }
|
|
181
|
+
100% { background-position: 0% 50%; }
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/* 波纹效果 */
|
|
185
|
+
@keyframes rippleEffect {
|
|
186
|
+
to {
|
|
187
|
+
transform: scale(4);
|
|
188
|
+
opacity: 0;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
.animate-pulse {
|
|
193
|
+
animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
.animate-shake {
|
|
197
|
+
animation: shake 0.5s ease-in-out;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
.animate-spin {
|
|
201
|
+
animation: rotate 1s linear infinite;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/* 悬停效果增强 */
|
|
205
|
+
button, a {
|
|
206
|
+
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
button:hover, a:hover {
|
|
210
|
+
transform: translateY(-2px);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
button:active, a:active {
|
|
214
|
+
transform: translateY(0);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/* 卡片悬停效果 */
|
|
218
|
+
.card-hover {
|
|
219
|
+
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.card-hover:hover {
|
|
223
|
+
transform: translateY(-4px);
|
|
224
|
+
box-shadow: 0 12px 24px rgba(0, 0, 0, 0.15);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/* 表格行悬停 */
|
|
228
|
+
tbody tr {
|
|
229
|
+
transition: all 0.2s ease;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
tbody tr:hover {
|
|
233
|
+
transform: scale(1.01);
|
|
234
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/* 按钮点击波纹效果 */
|
|
238
|
+
.ripple {
|
|
239
|
+
position: relative;
|
|
240
|
+
overflow: hidden;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
.ripple-effect {
|
|
244
|
+
position: absolute;
|
|
245
|
+
border-radius: 50%;
|
|
246
|
+
background: rgba(255, 255, 255, 0.5);
|
|
247
|
+
transform: scale(0);
|
|
248
|
+
animation: rippleEffect 0.6s linear;
|
|
249
|
+
pointer-events: none;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/* 加载动画 */
|
|
253
|
+
.loading-spinner {
|
|
254
|
+
display: inline-block;
|
|
255
|
+
width: 20px;
|
|
256
|
+
height: 20px;
|
|
257
|
+
border: 3px solid rgba(255, 255, 255, 0.3);
|
|
258
|
+
border-radius: 50%;
|
|
259
|
+
border-top-color: white;
|
|
260
|
+
animation: rotate 1s linear infinite;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/* 渐变文字 */
|
|
264
|
+
.gradient-text {
|
|
265
|
+
background: linear-gradient(90deg, hsl(210, 100%, 50%), hsl(280, 100%, 60%));
|
|
266
|
+
background-size: 200% 200%;
|
|
267
|
+
-webkit-background-clip: text;
|
|
268
|
+
-webkit-text-fill-color: transparent;
|
|
269
|
+
background-clip: text;
|
|
270
|
+
animation: gradientShift 3s ease infinite;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/* 列表项延迟淡入 */
|
|
274
|
+
.stagger-item {
|
|
275
|
+
opacity: 0 !important;
|
|
276
|
+
transform: translateY(8px) !important;
|
|
277
|
+
pointer-events: none;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
.stagger-item.visible {
|
|
281
|
+
opacity: 1 !important;
|
|
282
|
+
transform: translateY(0) !important;
|
|
283
|
+
pointer-events: auto;
|
|
284
|
+
transition: opacity 0.3s cubic-bezier(0.16, 1, 0.3, 1),
|
|
285
|
+
transform 0.3s cubic-bezier(0.16, 1, 0.3, 1);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/* 按钮微交互 */
|
|
289
|
+
button, a[role="button"] {
|
|
290
|
+
position: relative;
|
|
291
|
+
transition: transform 0.15s cubic-bezier(0.16, 1, 0.3, 1),
|
|
292
|
+
box-shadow 0.15s cubic-bezier(0.16, 1, 0.3, 1);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
button:hover:not(:disabled), a[role="button"]:hover {
|
|
296
|
+
transform: translateY(-1px);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
button:active:not(:disabled), a[role="button"]:active {
|
|
300
|
+
transform: translateY(0);
|
|
301
|
+
transition-duration: 0.05s;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/* 真实的波纹效果 - 通过 JS 触发 */
|
|
305
|
+
.ripple-effect {
|
|
306
|
+
position: absolute;
|
|
307
|
+
border-radius: 50%;
|
|
308
|
+
background: rgba(255, 255, 255, 0.4);
|
|
309
|
+
pointer-events: none;
|
|
310
|
+
transform: scale(0);
|
|
311
|
+
animation: ripple 0.6s cubic-bezier(0.16, 1, 0.3, 1);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
@keyframes ripple {
|
|
315
|
+
to {
|
|
316
|
+
transform: scale(4);
|
|
317
|
+
opacity: 0;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/* 卡片悬停 */
|
|
322
|
+
.interactive-card {
|
|
323
|
+
transition: transform 0.2s cubic-bezier(0.16, 1, 0.3, 1),
|
|
324
|
+
box-shadow 0.2s cubic-bezier(0.16, 1, 0.3, 1);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
.interactive-card:hover {
|
|
328
|
+
transform: translateY(-2px);
|
|
329
|
+
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.08);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/* 表格行悬停 */
|
|
333
|
+
tbody tr {
|
|
334
|
+
transition: background-color 0.15s ease,
|
|
335
|
+
box-shadow 0.15s ease;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
tbody tr:hover {
|
|
339
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/* 模态框 */
|
|
343
|
+
.modal-backdrop {
|
|
344
|
+
animation: fadeInBackdrop 0.2s ease;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
.modal-backdrop.exit {
|
|
348
|
+
animation: fadeInBackdrop 0.15s ease reverse;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/* 加载旋转 */
|
|
352
|
+
.spinner {
|
|
353
|
+
animation: rotate 1s linear infinite;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/* 输入框聚焦 */
|
|
357
|
+
input:focus, textarea:focus, select:focus {
|
|
358
|
+
transition: box-shadow 0.2s cubic-bezier(0.16, 1, 0.3, 1);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/* 导航项激活 */
|
|
362
|
+
.nav-item {
|
|
363
|
+
position: relative;
|
|
364
|
+
transition: background-color 0.2s ease, color 0.2s ease;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
.nav-item.active::before {
|
|
368
|
+
content: '';
|
|
369
|
+
position: absolute;
|
|
370
|
+
left: 0;
|
|
371
|
+
top: 50%;
|
|
372
|
+
transform: translateY(-50%);
|
|
373
|
+
width: 3px;
|
|
374
|
+
height: 60%;
|
|
375
|
+
background: var(--primary);
|
|
376
|
+
border-radius: 0 2px 2px 0;
|
|
377
|
+
transition: height 0.2s cubic-bezier(0.16, 1, 0.3, 1);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
.nav-item.active:hover::before {
|
|
381
|
+
height: 80%;
|
|
382
|
+
}
|
|
383
|
+
</style>
|
|
384
|
+
<link rel="stylesheet" href="/assets/market-ui.css?v=20260617-platform-scope1">
|
|
385
|
+
</head>
|
|
386
|
+
<body class="market-admin bg-surface text-on-surface min-h-screen flex overflow-hidden">
|
|
387
|
+
<span class="market-mouse-light" aria-hidden="true"></span>
|
|
388
|
+
|
|
389
|
+
<!-- Login Overlay -->
|
|
390
|
+
<div id="login-overlay" class="fixed inset-0 bg-surface z-[9999] flex items-center justify-center">
|
|
391
|
+
<div class="w-full max-w-[400px] px-4">
|
|
392
|
+
<div class="bg-surface-container-lowest border border-outline-variant/20 rounded-2xl p-8 shadow-lg max-w-md mx-auto">
|
|
393
|
+
<div class="text-center mb-6">
|
|
394
|
+
<div class="w-16 h-16 bg-primary rounded-2xl flex items-center justify-center mx-auto mb-4">
|
|
395
|
+
<span class="material-symbols-outlined text-on-primary text-3xl">shield</span>
|
|
396
|
+
</div>
|
|
397
|
+
<h1 class="text-2xl font-bold text-on-surface mb-2">管理后台登录</h1>
|
|
398
|
+
<p class="text-sm text-on-surface-variant">FogIDC Activator 企业版</p>
|
|
399
|
+
</div>
|
|
400
|
+
|
|
401
|
+
<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>
|
|
402
|
+
|
|
403
|
+
<form id="login-form">
|
|
404
|
+
<div class="mb-6">
|
|
405
|
+
<label class="block text-sm font-medium text-on-surface mb-2">管理密码</label>
|
|
406
|
+
<input
|
|
407
|
+
type="password"
|
|
408
|
+
id="login-password"
|
|
409
|
+
class="w-full px-4 py-3 bg-surface-container-low border-none rounded-xl text-sm focus:ring-2 ring-primary/20 outline-none"
|
|
410
|
+
placeholder="请输入管理密码"
|
|
411
|
+
required
|
|
412
|
+
autocomplete="current-password">
|
|
413
|
+
</div>
|
|
414
|
+
|
|
415
|
+
<button
|
|
416
|
+
type="submit"
|
|
417
|
+
id="login-submit"
|
|
418
|
+
class="w-full bg-primary text-on-primary px-6 py-3 rounded-xl text-sm font-bold shadow-sm hover:shadow-md transition-all">
|
|
419
|
+
登录
|
|
420
|
+
</button>
|
|
421
|
+
</form>
|
|
422
|
+
|
|
423
|
+
<div class="text-center mt-6 text-xs text-on-surface-variant">
|
|
424
|
+
默认密码: admin123 (可通过环境变量 ADMIN_PASSWORD 修改)
|
|
425
|
+
</div>
|
|
426
|
+
</div>
|
|
427
|
+
</div>
|
|
428
|
+
</div>
|
|
429
|
+
|
|
430
|
+
<!-- Main App Container -->
|
|
431
|
+
<div id="app-container" class="flex w-full h-screen" style="display: none;">
|
|
432
|
+
|
|
433
|
+
<!-- Sidebar -->
|
|
434
|
+
<aside class="fixed left-0 top-0 h-full z-40 flex flex-col p-4 w-64 border-r border-outline-variant/20 bg-surface-container-low">
|
|
435
|
+
<div class="text-xl font-black text-on-surface mb-8 px-4 flex items-center gap-3">
|
|
436
|
+
<span class="market-logo">F</span>
|
|
437
|
+
<span>
|
|
438
|
+
<span class="block leading-none">FogIDC</span>
|
|
439
|
+
<span class="block text-xs font-bold text-on-surface-variant mt-1">Admin console</span>
|
|
440
|
+
</span>
|
|
441
|
+
</div>
|
|
442
|
+
|
|
443
|
+
<nav class="flex-1 flex flex-col gap-4 overflow-y-auto pr-1">
|
|
444
|
+
<div class="nav-section">
|
|
445
|
+
<div class="px-3 mb-2 text-[11px] font-black uppercase tracking-[0.22em] text-on-surface-variant/70">仪表盘</div>
|
|
446
|
+
<div class="space-y-1">
|
|
447
|
+
<a href="#dashboard" class="nav-item flex items-center gap-3 px-4 py-3 rounded-xl transition-all text-on-surface-variant hover:bg-surface-container" data-tab="dashboard">
|
|
448
|
+
<span class="material-symbols-outlined">dashboard</span>
|
|
449
|
+
<span class="font-medium">概览</span>
|
|
450
|
+
</a>
|
|
451
|
+
<a href="#users" class="nav-item flex items-center gap-3 px-4 py-3 rounded-xl transition-all text-on-surface-variant hover:bg-surface-container" data-tab="users">
|
|
452
|
+
<span class="material-symbols-outlined">group</span>
|
|
453
|
+
<span class="font-medium">用户管理</span>
|
|
454
|
+
</a>
|
|
455
|
+
</div>
|
|
456
|
+
</div>
|
|
457
|
+
|
|
458
|
+
<div class="nav-section">
|
|
459
|
+
<div class="px-3 mb-2 text-[11px] font-black uppercase tracking-[0.22em] text-on-surface-variant/70">Codex</div>
|
|
460
|
+
<div class="space-y-1 pl-2 border-l border-outline-variant/30">
|
|
461
|
+
<a href="#codex-users" class="nav-item flex items-center gap-3 px-4 py-3 rounded-xl transition-all text-on-surface-variant hover:bg-surface-container" data-tab="codex-users">
|
|
462
|
+
<span class="material-symbols-outlined">person_search</span>
|
|
463
|
+
<span class="font-medium">用户管理</span>
|
|
464
|
+
</a>
|
|
465
|
+
<a href="#codex-codes" class="nav-item flex items-center gap-3 px-4 py-3 rounded-xl transition-all text-on-surface-variant hover:bg-surface-container" data-tab="codex-codes">
|
|
466
|
+
<span class="material-symbols-outlined">key_vertical</span>
|
|
467
|
+
<span class="font-medium">激活码创建</span>
|
|
468
|
+
</a>
|
|
469
|
+
</div>
|
|
470
|
+
</div>
|
|
471
|
+
|
|
472
|
+
<div class="nav-section">
|
|
473
|
+
<div class="px-3 mb-2 text-[11px] font-black uppercase tracking-[0.22em] text-on-surface-variant/70">ClaudeCode</div>
|
|
474
|
+
<div class="space-y-1 pl-2 border-l border-outline-variant/30">
|
|
475
|
+
<a href="#claude-users" class="nav-item flex items-center gap-3 px-4 py-3 rounded-xl transition-all text-on-surface-variant hover:bg-surface-container" data-tab="claude-users">
|
|
476
|
+
<span class="material-symbols-outlined">manage_accounts</span>
|
|
477
|
+
<span class="font-medium">用户管理</span>
|
|
478
|
+
</a>
|
|
479
|
+
<a href="#claude-codes" class="nav-item flex items-center gap-3 px-4 py-3 rounded-xl transition-all text-on-surface-variant hover:bg-surface-container" data-tab="claude-codes">
|
|
480
|
+
<span class="material-symbols-outlined">vpn_key</span>
|
|
481
|
+
<span class="font-medium">激活码创建</span>
|
|
482
|
+
</a>
|
|
483
|
+
</div>
|
|
484
|
+
</div>
|
|
485
|
+
|
|
486
|
+
<div class="nav-section mt-1 pt-3 border-t border-outline-variant/20">
|
|
487
|
+
<div class="space-y-1">
|
|
488
|
+
<a href="#logs" class="nav-item flex items-center gap-3 px-4 py-3 rounded-xl transition-all text-on-surface-variant hover:bg-surface-container" data-tab="logs">
|
|
489
|
+
<span class="material-symbols-outlined">receipt_long</span>
|
|
490
|
+
<span class="font-medium">系统日志</span>
|
|
491
|
+
</a>
|
|
492
|
+
<a href="#settings" class="nav-item flex items-center gap-3 px-4 py-3 rounded-xl transition-all text-on-surface-variant hover:bg-surface-container" data-tab="settings">
|
|
493
|
+
<span class="material-symbols-outlined">settings</span>
|
|
494
|
+
<span class="font-medium">系统设置</span>
|
|
495
|
+
</a>
|
|
496
|
+
</div>
|
|
497
|
+
</div>
|
|
498
|
+
</nav>
|
|
499
|
+
|
|
500
|
+
<div class="mt-auto pt-4 border-t border-outline-variant/20 flex items-center gap-3 px-2">
|
|
501
|
+
<div class="w-10 h-10 rounded-full bg-primary-fixed flex items-center justify-center text-on-primary-fixed font-bold">
|
|
502
|
+
AD
|
|
503
|
+
</div>
|
|
504
|
+
<div>
|
|
505
|
+
<div class="text-sm font-bold text-on-surface">管理员</div>
|
|
506
|
+
<div class="text-xs text-on-surface-variant">企业级管理后台</div>
|
|
507
|
+
</div>
|
|
508
|
+
</div>
|
|
509
|
+
</aside>
|
|
510
|
+
|
|
511
|
+
<!-- Main Content Area -->
|
|
512
|
+
<div class="flex-1 ml-64 flex flex-col h-screen overflow-hidden">
|
|
513
|
+
|
|
514
|
+
<!-- Header -->
|
|
515
|
+
<header class="flex flex-col w-full px-6 bg-surface-container-lowest h-20 z-30 border-b border-outline-variant/20">
|
|
516
|
+
<div class="flex justify-between items-center h-full">
|
|
517
|
+
<div class="flex items-center gap-4">
|
|
518
|
+
<h1 id="page-title" class="text-lg font-bold text-on-surface">概览</h1>
|
|
519
|
+
<span class="market-console-badge hidden md:inline-flex">
|
|
520
|
+
<span class="market-kicker-dot"></span>
|
|
521
|
+
Marketplace UI
|
|
522
|
+
</span>
|
|
523
|
+
<div class="relative hidden lg:block">
|
|
524
|
+
<span class="material-symbols-outlined absolute left-3 top-1/2 -translate-y-1/2 text-outline text-sm">search</span>
|
|
525
|
+
<input
|
|
526
|
+
id="global-search"
|
|
527
|
+
class="pl-10 pr-4 py-2 bg-surface-container-low border-none rounded-xl text-sm focus:ring-2 ring-primary/20 w-64 outline-none"
|
|
528
|
+
placeholder="搜索..."
|
|
529
|
+
type="text"/>
|
|
530
|
+
</div>
|
|
531
|
+
</div>
|
|
532
|
+
<div class="flex items-center gap-2">
|
|
533
|
+
<button id="theme-toggle" class="p-2 text-on-surface-variant hover:text-primary transition-all rounded-xl hover:bg-surface-container">
|
|
534
|
+
<span class="material-symbols-outlined">light_mode</span>
|
|
535
|
+
</button>
|
|
536
|
+
<button id="refresh-btn" class="p-2 text-on-surface-variant hover:text-primary transition-all rounded-xl hover:bg-surface-container">
|
|
537
|
+
<span class="material-symbols-outlined">refresh</span>
|
|
538
|
+
</button>
|
|
539
|
+
<button id="logout-btn" class="p-2 text-on-surface-variant hover:text-error transition-all rounded-xl hover:bg-surface-container">
|
|
540
|
+
<span class="material-symbols-outlined">logout</span>
|
|
541
|
+
</button>
|
|
542
|
+
</div>
|
|
543
|
+
</div>
|
|
544
|
+
</header>
|
|
545
|
+
|
|
546
|
+
<!-- Tab Content -->
|
|
547
|
+
<main class="flex-1 overflow-y-auto p-6">
|
|
548
|
+
|
|
549
|
+
<!-- Dashboard Tab -->
|
|
550
|
+
<div id="dashboard-panel" class="tab-panel">
|
|
551
|
+
<div class="grid grid-cols-1 md:grid-cols-4 gap-6 mb-6">
|
|
552
|
+
<!-- Stat Cards will be inserted here -->
|
|
553
|
+
</div>
|
|
554
|
+
|
|
555
|
+
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
|
556
|
+
<!-- Recent Activity -->
|
|
557
|
+
<div class="bg-surface-container-lowest rounded-2xl p-6 border border-outline-variant/20">
|
|
558
|
+
<h3 class="text-lg font-bold text-on-surface mb-4">最近活动</h3>
|
|
559
|
+
<div id="recent-activity" class="space-y-3">
|
|
560
|
+
<!-- Activity items will be inserted here -->
|
|
561
|
+
</div>
|
|
562
|
+
</div>
|
|
563
|
+
|
|
564
|
+
<!-- Quick Actions -->
|
|
565
|
+
<div class="bg-surface-container-lowest rounded-2xl p-6 border border-outline-variant/20 interactive-card">
|
|
566
|
+
<h3 class="text-lg font-bold text-on-surface mb-4">快速操作</h3>
|
|
567
|
+
<div class="grid grid-cols-2 gap-3">
|
|
568
|
+
<button id="quick-add-user" class="p-4 bg-surface-container-low rounded-xl hover:bg-surface-container transition-all text-left interactive-card">
|
|
569
|
+
<span class="material-symbols-outlined text-primary mb-2">person_add</span>
|
|
570
|
+
<div class="text-sm font-medium text-on-surface">添加用户</div>
|
|
571
|
+
</button>
|
|
572
|
+
<button id="quick-add-code" class="p-4 bg-surface-container-low rounded-xl hover:bg-surface-container transition-all text-left interactive-card">
|
|
573
|
+
<span class="material-symbols-outlined text-primary mb-2">add_circle</span>
|
|
574
|
+
<div class="text-sm font-medium text-on-surface">生成激活码</div>
|
|
575
|
+
</button>
|
|
576
|
+
<button class="p-4 bg-surface-container-low rounded-xl hover:bg-surface-container transition-all text-left interactive-card">
|
|
577
|
+
<span class="material-symbols-outlined text-primary mb-2">download</span>
|
|
578
|
+
<div class="text-sm font-medium text-on-surface">导出数据</div>
|
|
579
|
+
</button>
|
|
580
|
+
<button id="quick-settings" class="p-4 bg-surface-container-low rounded-xl hover:bg-surface-container transition-all text-left interactive-card">
|
|
581
|
+
<span class="material-symbols-outlined text-primary mb-2">settings</span>
|
|
582
|
+
<div class="text-sm font-medium text-on-surface">系统设置</div>
|
|
583
|
+
</button>
|
|
584
|
+
</div>
|
|
585
|
+
</div>
|
|
586
|
+
</div>
|
|
587
|
+
</div>
|
|
588
|
+
|
|
589
|
+
<!-- Users Tab -->
|
|
590
|
+
<div id="users-panel" class="tab-panel hidden">
|
|
591
|
+
<div class="bg-surface-container-lowest rounded-2xl p-6 border border-outline-variant/20">
|
|
592
|
+
<div class="flex justify-between items-center mb-6">
|
|
593
|
+
<div>
|
|
594
|
+
<h3 id="users-panel-title" class="text-lg font-bold text-on-surface">用户列表</h3>
|
|
595
|
+
<p id="users-panel-subtitle" class="text-sm text-on-surface-variant mt-1">汇总所有平台用户</p>
|
|
596
|
+
</div>
|
|
597
|
+
<button id="add-user-btn" class="bg-primary text-on-primary px-4 py-2 rounded-xl text-sm font-bold shadow-sm hover:shadow-md transition-all flex items-center gap-2">
|
|
598
|
+
<span class="material-symbols-outlined text-sm">add</span>
|
|
599
|
+
<span id="add-user-btn-label">添加用户</span>
|
|
600
|
+
</button>
|
|
601
|
+
</div>
|
|
602
|
+
|
|
603
|
+
<!-- Filters -->
|
|
604
|
+
<div class="flex gap-3 mb-6">
|
|
605
|
+
<input type="text" id="user-search" placeholder="搜索用户..." class="flex-1 px-4 py-2 bg-surface-container-low border-none rounded-xl text-sm focus:ring-2 ring-primary/20 outline-none">
|
|
606
|
+
<select id="user-status-filter" class="px-4 py-2 bg-surface-container-low border-none rounded-xl text-sm focus:ring-2 ring-primary/20 outline-none">
|
|
607
|
+
<option value="">所有状态</option>
|
|
608
|
+
<option value="active">活跃</option>
|
|
609
|
+
<option value="inactive">未激活</option>
|
|
610
|
+
<option value="disabled">已禁用</option>
|
|
611
|
+
</select>
|
|
612
|
+
</div>
|
|
613
|
+
|
|
614
|
+
<!-- Users Table -->
|
|
615
|
+
<div id="users-table-container" class="overflow-x-auto">
|
|
616
|
+
<!-- Table will be inserted here -->
|
|
617
|
+
</div>
|
|
618
|
+
</div>
|
|
619
|
+
</div>
|
|
620
|
+
|
|
621
|
+
<!-- Codes Tab -->
|
|
622
|
+
<div id="codes-panel" class="tab-panel hidden">
|
|
623
|
+
<div class="bg-surface-container-lowest rounded-2xl p-6 border border-outline-variant/20">
|
|
624
|
+
<div class="flex justify-between items-center mb-6">
|
|
625
|
+
<div>
|
|
626
|
+
<h3 id="codes-panel-title" class="text-lg font-bold text-on-surface">激活码列表</h3>
|
|
627
|
+
<p id="codes-panel-subtitle" class="text-sm text-on-surface-variant mt-1">查看所有平台 CDK</p>
|
|
628
|
+
</div>
|
|
629
|
+
<div class="flex gap-2">
|
|
630
|
+
<button id="export-codes-btn" class="bg-surface-container text-on-surface px-4 py-2 rounded-xl text-sm font-bold shadow-sm hover:shadow-md transition-all flex items-center gap-2">
|
|
631
|
+
<span class="material-symbols-outlined text-sm">download</span>
|
|
632
|
+
导出
|
|
633
|
+
</button>
|
|
634
|
+
<button id="add-code-btn" class="bg-primary text-on-primary px-4 py-2 rounded-xl text-sm font-bold shadow-sm hover:shadow-md transition-all flex items-center gap-2">
|
|
635
|
+
<span class="material-symbols-outlined text-sm">add</span>
|
|
636
|
+
<span id="add-code-btn-label">生成激活码</span>
|
|
637
|
+
</button>
|
|
638
|
+
</div>
|
|
639
|
+
</div>
|
|
640
|
+
|
|
641
|
+
<!-- Filters -->
|
|
642
|
+
<div class="flex gap-3 mb-6">
|
|
643
|
+
<input type="text" id="code-search" placeholder="搜索激活码..." class="flex-1 px-4 py-2 bg-surface-container-low border-none rounded-xl text-sm focus:ring-2 ring-primary/20 outline-none">
|
|
644
|
+
<select id="code-status-filter" class="px-4 py-2 bg-surface-container-low border-none rounded-xl text-sm focus:ring-2 ring-primary/20 outline-none">
|
|
645
|
+
<option value="">所有状态</option>
|
|
646
|
+
<option value="unused">未使用</option>
|
|
647
|
+
<option value="used">已使用</option>
|
|
648
|
+
<option value="expired">已过期</option>
|
|
649
|
+
</select>
|
|
650
|
+
</div>
|
|
651
|
+
|
|
652
|
+
<!-- Codes Table -->
|
|
653
|
+
<div id="codes-table-container" class="overflow-x-auto">
|
|
654
|
+
<!-- Table will be inserted here -->
|
|
655
|
+
</div>
|
|
656
|
+
</div>
|
|
657
|
+
</div>
|
|
658
|
+
|
|
659
|
+
<!-- Logs Tab -->
|
|
660
|
+
<div id="logs-panel" class="tab-panel hidden">
|
|
661
|
+
<div class="bg-surface-container-lowest rounded-2xl p-6 border border-outline-variant/20">
|
|
662
|
+
<h3 class="text-lg font-bold text-on-surface mb-6">系统日志</h3>
|
|
663
|
+
<div id="logs-container">
|
|
664
|
+
<p class="text-on-surface-variant text-center py-8">日志功能开发中...</p>
|
|
665
|
+
</div>
|
|
666
|
+
</div>
|
|
667
|
+
</div>
|
|
668
|
+
|
|
669
|
+
<!-- Settings Tab -->
|
|
670
|
+
<div id="settings-panel" class="tab-panel hidden">
|
|
671
|
+
<div class="bg-surface-container-lowest rounded-2xl p-6 border border-outline-variant/20">
|
|
672
|
+
<h3 class="text-lg font-bold text-on-surface mb-6">系统设置</h3>
|
|
673
|
+
<div id="settings-container">
|
|
674
|
+
<p class="text-on-surface-variant text-center py-8">设置功能开发中...</p>
|
|
675
|
+
</div>
|
|
676
|
+
</div>
|
|
677
|
+
</div>
|
|
678
|
+
|
|
679
|
+
</main>
|
|
680
|
+
</div>
|
|
681
|
+
</div>
|
|
682
|
+
|
|
683
|
+
<!-- Modal Root -->
|
|
684
|
+
<div id="modal-root"></div>
|
|
685
|
+
|
|
686
|
+
<!-- JavaScript -->
|
|
687
|
+
<script src="/admin/admin-panel-v2.js?v=20260617-platform-scope1"></script>
|
|
688
|
+
<script>
|
|
689
|
+
let marketPointerRaf = 0;
|
|
690
|
+
window.addEventListener('load', () => {
|
|
691
|
+
requestAnimationFrame(() => document.body.classList.add('motion-ready'));
|
|
692
|
+
}, { once: true });
|
|
693
|
+
|
|
694
|
+
window.addEventListener('pointermove', (event) => {
|
|
695
|
+
if (marketPointerRaf) return;
|
|
696
|
+
marketPointerRaf = requestAnimationFrame(() => {
|
|
697
|
+
document.body.classList.add('is-pointer-active');
|
|
698
|
+
document.body.style.setProperty('--cursor-x', `${event.clientX}px`);
|
|
699
|
+
document.body.style.setProperty('--cursor-y', `${event.clientY}px`);
|
|
700
|
+
marketPointerRaf = 0;
|
|
701
|
+
});
|
|
702
|
+
});
|
|
703
|
+
</script>
|
|
704
|
+
</body>
|
|
705
|
+
</html>
|