@lovrabet/rabetbase-cli 2.0.2-beta.1

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.
Files changed (163) hide show
  1. package/LICENSE +45 -0
  2. package/README.md +605 -0
  3. package/lib/ai-setup/config.js +1 -0
  4. package/lib/api/api-doc-ui.js +1 -0
  5. package/lib/api/api-doc.js +1 -0
  6. package/lib/api/api-pull-ui.js +1 -0
  7. package/lib/api/fetch-model-list.js +1 -0
  8. package/lib/api/generate-api-file.js +1 -0
  9. package/lib/api/main.js +1 -0
  10. package/lib/api/pull-silent.js +1 -0
  11. package/lib/app-menu/app-menu-sync-ui.js +1 -0
  12. package/lib/app-menu/create-menu.js +1 -0
  13. package/lib/app-menu/get-local-pages.js +1 -0
  14. package/lib/app-menu/get-online-menu-list.js +1 -0
  15. package/lib/app-menu/types.js +1 -0
  16. package/lib/app-menu/use-get-online-menu-list.js +1 -0
  17. package/lib/app-menu/utils.js +1 -0
  18. package/lib/app-menu/valid-url.js +1 -0
  19. package/lib/app-menu-update-cdn/current-content.js +1 -0
  20. package/lib/app-menu-update-cdn/input-cdn-asset.js +1 -0
  21. package/lib/app-menu-update-cdn/main.js +1 -0
  22. package/lib/app-menu-update-cdn/types.js +1 -0
  23. package/lib/app-menu-update-cdn/update-menu-cdn-url.js +1 -0
  24. package/lib/auth/auth-server-ui.js +1 -0
  25. package/lib/auth/auth-server.js +1 -0
  26. package/lib/auth/constant.js +1 -0
  27. package/lib/auth/get-cookie.js +1 -0
  28. package/lib/auth/is-session-valid.js +1 -0
  29. package/lib/auth/logout.js +1 -0
  30. package/lib/cli-flags.js +1 -0
  31. package/lib/cli.js +2 -0
  32. package/lib/commands/api.js +1 -0
  33. package/lib/commands/app.js +1 -0
  34. package/lib/commands/auth.js +1 -0
  35. package/lib/commands/bff/delete.js +1 -0
  36. package/lib/commands/bff/detail.js +1 -0
  37. package/lib/commands/bff/index.js +1 -0
  38. package/lib/commands/bff/list.js +1 -0
  39. package/lib/commands/bff/new.js +1 -0
  40. package/lib/commands/bff/pull.js +1 -0
  41. package/lib/commands/bff/push.js +1 -0
  42. package/lib/commands/bff/status.js +1 -0
  43. package/lib/commands/build.js +1 -0
  44. package/lib/commands/codegen/index.js +1 -0
  45. package/lib/commands/codegen/sdk.js +1 -0
  46. package/lib/commands/codegen/sql.js +1 -0
  47. package/lib/commands/config.js +1 -0
  48. package/lib/commands/create.js +1 -0
  49. package/lib/commands/dataset/detail.js +1 -0
  50. package/lib/commands/dataset/index.js +1 -0
  51. package/lib/commands/dataset/links.js +1 -0
  52. package/lib/commands/dataset/list.js +1 -0
  53. package/lib/commands/dataset/operations.js +1 -0
  54. package/lib/commands/init.js +1 -0
  55. package/lib/commands/logout.js +1 -0
  56. package/lib/commands/logs.js +1 -0
  57. package/lib/commands/mcp.js +1 -0
  58. package/lib/commands/menu.js +1 -0
  59. package/lib/commands/preview.js +1 -0
  60. package/lib/commands/registry.js +1 -0
  61. package/lib/commands/run.js +1 -0
  62. package/lib/commands/skill.js +1 -0
  63. package/lib/commands/sql/detail.js +1 -0
  64. package/lib/commands/sql/exec.js +1 -0
  65. package/lib/commands/sql/index.js +1 -0
  66. package/lib/commands/sql/list.js +1 -0
  67. package/lib/commands/sql/save.js +1 -0
  68. package/lib/commands/sql/validate.js +1 -0
  69. package/lib/commands/start.js +1 -0
  70. package/lib/config/config-help.js +1 -0
  71. package/lib/config/main.js +1 -0
  72. package/lib/constant/cli.js +1 -0
  73. package/lib/constant/domain.js +1 -0
  74. package/lib/constant/env.js +1 -0
  75. package/lib/context.js +1 -0
  76. package/lib/core/alias-resolver.js +1 -0
  77. package/lib/core/api-client.js +1 -0
  78. package/lib/core/bff/config.js +1 -0
  79. package/lib/core/bff/file-system.js +1 -0
  80. package/lib/core/bff/hash.js +1 -0
  81. package/lib/core/bff/lock.js +1 -0
  82. package/lib/core/bff/types.js +1 -0
  83. package/lib/core/bff/utils.js +1 -0
  84. package/lib/core/db-resolver.js +1 -0
  85. package/lib/core/sql-validator.js +1 -0
  86. package/lib/create-app/enhanced-guided-create.js +1 -0
  87. package/lib/create-app/format-elapsed.js +1 -0
  88. package/lib/create-app/main.js +1 -0
  89. package/lib/create-app/non-interactive.js +1 -0
  90. package/lib/create-app/task-finished.js +1 -0
  91. package/lib/create-app/task-loading.js +1 -0
  92. package/lib/create-app/task-running.js +1 -0
  93. package/lib/create-app/task-time.js +1 -0
  94. package/lib/create-app/use-copy-project-template.js +1 -0
  95. package/lib/create-app/use-format-code.js +1 -0
  96. package/lib/create-app/use-install-dependencies.js +1 -0
  97. package/lib/errors.js +1 -0
  98. package/lib/framework/flags.js +1 -0
  99. package/lib/framework/help.js +1 -0
  100. package/lib/framework/index.js +1 -0
  101. package/lib/framework/output.js +1 -0
  102. package/lib/framework/response.js +1 -0
  103. package/lib/framework/runner.js +1 -0
  104. package/lib/framework/types.js +1 -0
  105. package/lib/generated/build-info.js +1 -0
  106. package/lib/help.js +1 -0
  107. package/lib/init/main.js +1 -0
  108. package/lib/mcp/McpInstallUI.js +1 -0
  109. package/lib/mcp/claude.js +1 -0
  110. package/lib/mcp/cursor.js +1 -0
  111. package/lib/mcp/main.js +1 -0
  112. package/lib/mcp/mcp-install-non-interactive.js +1 -0
  113. package/lib/mcp/mcp-installer.js +1 -0
  114. package/lib/skills/main.js +1 -0
  115. package/lib/skills/npx-skills-add.js +1 -0
  116. package/lib/types/index.js +1 -0
  117. package/lib/ui/IDESelector.js +1 -0
  118. package/lib/ui/useIDESelection.js +1 -0
  119. package/lib/utils/ai_config.js +1 -0
  120. package/lib/utils/cdn-config.js +1 -0
  121. package/lib/utils/check-sdk-version.js +1 -0
  122. package/lib/utils/cli-version-check.js +1 -0
  123. package/lib/utils/config.js +1 -0
  124. package/lib/utils/copy-directory.js +1 -0
  125. package/lib/utils/file-utils.js +1 -0
  126. package/lib/utils/guides-cdn.js +1 -0
  127. package/lib/utils/http-client.js +1 -0
  128. package/lib/utils/logger.js +1 -0
  129. package/lib/utils/rules-cdn.js +1 -0
  130. package/lib/utils/sleep.js +1 -0
  131. package/lib/utils/template-replacer.js +1 -0
  132. package/package.json +77 -0
  133. package/sidecar/flags.json +10 -0
  134. package/templates/README.md +97 -0
  135. package/templates/generate-api/api.ts.tpl +47 -0
  136. package/templates/generate-api/client.ts.tpl +64 -0
  137. package/templates/projects/sub-app-react-demo/.prettierrc +1 -0
  138. package/templates/projects/sub-app-react-demo/CHANGELOG.md +53 -0
  139. package/templates/projects/sub-app-react-demo/README.md +318 -0
  140. package/templates/projects/sub-app-react-demo/docs/API_RULE_CHANGE.md +212 -0
  141. package/templates/projects/sub-app-react-demo/docs/quick-start.md +526 -0
  142. package/templates/projects/sub-app-react-demo/index.html +27 -0
  143. package/templates/projects/sub-app-react-demo/package.json +34 -0
  144. package/templates/projects/sub-app-react-demo/public/logo.svg +1 -0
  145. package/templates/projects/sub-app-react-demo/public/vite.svg +1 -0
  146. package/templates/projects/sub-app-react-demo/src/api/api.ts +83 -0
  147. package/templates/projects/sub-app-react-demo/src/api/client.ts +64 -0
  148. package/templates/projects/sub-app-react-demo/src/layouts/MainLayout.tsx +311 -0
  149. package/templates/projects/sub-app-react-demo/src/main.tsx +48 -0
  150. package/templates/projects/sub-app-react-demo/src/pages/dashboard/index.tsx +572 -0
  151. package/templates/projects/sub-app-react-demo/src/pages/data-screen/index.tsx +526 -0
  152. package/templates/projects/sub-app-react-demo/src/pages/index.tsx +467 -0
  153. package/templates/projects/sub-app-react-demo/src/pages/sdk-demo/index.tsx +453 -0
  154. package/templates/projects/sub-app-react-demo/src/pages/workbench/index.module.css +293 -0
  155. package/templates/projects/sub-app-react-demo/src/pages/workbench/index.tsx +155 -0
  156. package/templates/projects/sub-app-react-demo/src/router/index.tsx +30 -0
  157. package/templates/projects/sub-app-react-demo/src/style.css +92 -0
  158. package/templates/projects/sub-app-react-demo/src/utils/api.ts +12 -0
  159. package/templates/projects/sub-app-react-demo/src/vite-env.d.ts +2 -0
  160. package/templates/projects/sub-app-react-demo/tsconfig.json +26 -0
  161. package/templates/projects/sub-app-react-demo/vite.config.ts +111 -0
  162. package/templates/rules/lovrabet_rules.mdc.tpl +891 -0
  163. package/templates/skill/SKILL.md.tpl +120 -0
@@ -0,0 +1,526 @@
1
+ import React, { useState, useEffect } from "react";
2
+ import { Card, Row, Col, Statistic, Typography } from "antd";
3
+ import {
4
+ ArrowUpOutlined,
5
+ ArrowDownOutlined,
6
+ UserOutlined,
7
+ ShoppingOutlined,
8
+ DollarOutlined,
9
+ TrophyOutlined,
10
+ } from "@ant-design/icons";
11
+ import ReactECharts from "echarts-for-react";
12
+
13
+ const { Title } = Typography;
14
+
15
+ // Mock 数据
16
+ const mockData = {
17
+ // 顶部统计卡片
18
+ statistics: [
19
+ {
20
+ title: "总用户数",
21
+ value: 125680,
22
+ prefix: <UserOutlined />,
23
+ suffix: "人",
24
+ trend: { value: 12.5, isUp: true },
25
+ color: "#1890ff",
26
+ },
27
+ {
28
+ title: "今日订单",
29
+ value: 3521,
30
+ prefix: <ShoppingOutlined />,
31
+ suffix: "单",
32
+ trend: { value: 8.3, isUp: true },
33
+ color: "#52c41a",
34
+ },
35
+ {
36
+ title: "总销售额",
37
+ value: 8965234,
38
+ prefix: <DollarOutlined />,
39
+ suffix: "元",
40
+ trend: { value: 15.6, isUp: true },
41
+ color: "#fa8c16",
42
+ },
43
+ {
44
+ title: "活跃度",
45
+ value: 89.5,
46
+ prefix: <TrophyOutlined />,
47
+ suffix: "%",
48
+ trend: { value: 3.2, isUp: false },
49
+ color: "#eb2f96",
50
+ },
51
+ ],
52
+
53
+ // 销售趋势数据
54
+ salesTrend: {
55
+ dates: [
56
+ "01月",
57
+ "02月",
58
+ "03月",
59
+ "04月",
60
+ "05月",
61
+ "06月",
62
+ "07月",
63
+ "08月",
64
+ "09月",
65
+ "10月",
66
+ "11月",
67
+ "12月",
68
+ ],
69
+ values: [3200, 4500, 3800, 5200, 6100, 5800, 7200, 6800, 7900, 8500, 9200, 9800],
70
+ },
71
+
72
+ // 地区分布数据
73
+ regionDistribution: [
74
+ { name: "华东", value: 35 },
75
+ { name: "华南", value: 28 },
76
+ { name: "华北", value: 22 },
77
+ { name: "西南", value: 10 },
78
+ { name: "西北", value: 5 },
79
+ ],
80
+
81
+ // 产品分类数据
82
+ productCategory: {
83
+ categories: ["电子产品", "服装", "食品", "家居", "美妆", "其他"],
84
+ values: [3200, 2800, 2400, 1800, 1500, 1200],
85
+ },
86
+
87
+ // 实时订单数据
88
+ realtimeOrders: [
89
+ { time: "10:00", count: 45 },
90
+ { time: "11:00", count: 52 },
91
+ { time: "12:00", count: 68 },
92
+ { time: "13:00", count: 55 },
93
+ { time: "14:00", count: 72 },
94
+ { time: "15:00", count: 61 },
95
+ { time: "16:00", count: 78 },
96
+ { time: "17:00", count: 85 },
97
+ ],
98
+ };
99
+
100
+ const DataScreen: React.FC = () => {
101
+ const [currentTime, setCurrentTime] = useState(new Date());
102
+
103
+ // 更新时间
104
+ useEffect(() => {
105
+ const timer = setInterval(() => {
106
+ setCurrentTime(new Date());
107
+ }, 1000);
108
+ return () => clearInterval(timer);
109
+ }, []);
110
+
111
+ // 销售趋势折线图配置
112
+ const salesTrendOption = {
113
+ backgroundColor: "transparent",
114
+ title: {
115
+ text: "销售趋势",
116
+ left: "center",
117
+ top: 10,
118
+ textStyle: {
119
+ color: "#fff",
120
+ fontSize: 18,
121
+ fontWeight: "bold",
122
+ },
123
+ },
124
+ tooltip: {
125
+ trigger: "axis",
126
+ backgroundColor: "rgba(0, 0, 0, 0.8)",
127
+ borderColor: "#1890ff",
128
+ textStyle: { color: "#fff" },
129
+ },
130
+ grid: {
131
+ left: "3%",
132
+ right: "4%",
133
+ bottom: "3%",
134
+ top: "15%",
135
+ containLabel: true,
136
+ },
137
+ xAxis: {
138
+ type: "category",
139
+ data: mockData.salesTrend.dates,
140
+ axisLine: { lineStyle: { color: "#4a90e2" } },
141
+ axisLabel: { color: "#fff" },
142
+ },
143
+ yAxis: {
144
+ type: "value",
145
+ axisLine: { lineStyle: { color: "#4a90e2" } },
146
+ axisLabel: { color: "#fff" },
147
+ splitLine: { lineStyle: { color: "rgba(74, 144, 226, 0.2)" } },
148
+ },
149
+ series: [
150
+ {
151
+ name: "销售额",
152
+ type: "line",
153
+ data: mockData.salesTrend.values,
154
+ smooth: true,
155
+ lineStyle: { color: "#1890ff", width: 3 },
156
+ itemStyle: { color: "#1890ff" },
157
+ areaStyle: {
158
+ color: {
159
+ type: "linear",
160
+ x: 0,
161
+ y: 0,
162
+ x2: 0,
163
+ y2: 1,
164
+ colorStops: [
165
+ { offset: 0, color: "rgba(24, 144, 255, 0.5)" },
166
+ { offset: 1, color: "rgba(24, 144, 255, 0.1)" },
167
+ ],
168
+ },
169
+ },
170
+ },
171
+ ],
172
+ };
173
+
174
+ // 地区分布饼图配置
175
+ const regionPieOption = {
176
+ backgroundColor: "transparent",
177
+ title: {
178
+ text: "地区分布",
179
+ left: "center",
180
+ top: 10,
181
+ textStyle: {
182
+ color: "#fff",
183
+ fontSize: 18,
184
+ fontWeight: "bold",
185
+ },
186
+ },
187
+ tooltip: {
188
+ trigger: "item",
189
+ backgroundColor: "rgba(0, 0, 0, 0.8)",
190
+ borderColor: "#1890ff",
191
+ textStyle: { color: "#fff" },
192
+ formatter: "{a} <br/>{b}: {c}% ({d}%)",
193
+ },
194
+ legend: {
195
+ orient: "vertical",
196
+ right: 10,
197
+ top: "middle",
198
+ textStyle: { color: "#fff" },
199
+ },
200
+ series: [
201
+ {
202
+ name: "地区分布",
203
+ type: "pie",
204
+ radius: ["40%", "70%"],
205
+ center: ["40%", "60%"],
206
+ avoidLabelOverlap: false,
207
+ itemStyle: {
208
+ borderRadius: 10,
209
+ borderColor: "#0a1929",
210
+ borderWidth: 2,
211
+ },
212
+ label: {
213
+ show: true,
214
+ color: "#fff",
215
+ },
216
+ emphasis: {
217
+ label: {
218
+ show: true,
219
+ fontSize: 16,
220
+ fontWeight: "bold",
221
+ },
222
+ },
223
+ data: mockData.regionDistribution.map((item, index) => ({
224
+ value: item.value,
225
+ name: item.name,
226
+ itemStyle: {
227
+ color: ["#1890ff", "#52c41a", "#fa8c16", "#eb2f96", "#722ed1"][index],
228
+ },
229
+ })),
230
+ },
231
+ ],
232
+ };
233
+
234
+ // 产品分类柱状图配置
235
+ const productBarOption = {
236
+ backgroundColor: "transparent",
237
+ title: {
238
+ text: "产品分类销售",
239
+ left: "center",
240
+ top: 10,
241
+ textStyle: {
242
+ color: "#fff",
243
+ fontSize: 18,
244
+ fontWeight: "bold",
245
+ },
246
+ },
247
+ tooltip: {
248
+ trigger: "axis",
249
+ backgroundColor: "rgba(0, 0, 0, 0.8)",
250
+ borderColor: "#1890ff",
251
+ textStyle: { color: "#fff" },
252
+ },
253
+ grid: {
254
+ left: "3%",
255
+ right: "4%",
256
+ bottom: "3%",
257
+ top: "15%",
258
+ containLabel: true,
259
+ },
260
+ xAxis: {
261
+ type: "category",
262
+ data: mockData.productCategory.categories,
263
+ axisLine: { lineStyle: { color: "#4a90e2" } },
264
+ axisLabel: { color: "#fff", rotate: 45 },
265
+ },
266
+ yAxis: {
267
+ type: "value",
268
+ axisLine: { lineStyle: { color: "#4a90e2" } },
269
+ axisLabel: { color: "#fff" },
270
+ splitLine: { lineStyle: { color: "rgba(74, 144, 226, 0.2)" } },
271
+ },
272
+ series: [
273
+ {
274
+ name: "销售额",
275
+ type: "bar",
276
+ data: mockData.productCategory.values,
277
+ itemStyle: {
278
+ color: {
279
+ type: "linear",
280
+ x: 0,
281
+ y: 0,
282
+ x2: 0,
283
+ y2: 1,
284
+ colorStops: [
285
+ { offset: 0, color: "#52c41a" },
286
+ { offset: 1, color: "#1890ff" },
287
+ ],
288
+ },
289
+ borderRadius: [4, 4, 0, 0],
290
+ },
291
+ },
292
+ ],
293
+ };
294
+
295
+ // 实时订单折线图配置
296
+ const realtimeOrderOption = {
297
+ backgroundColor: "transparent",
298
+ title: {
299
+ text: "实时订单趋势",
300
+ left: "center",
301
+ top: 10,
302
+ textStyle: {
303
+ color: "#fff",
304
+ fontSize: 18,
305
+ fontWeight: "bold",
306
+ },
307
+ },
308
+ tooltip: {
309
+ trigger: "axis",
310
+ backgroundColor: "rgba(0, 0, 0, 0.8)",
311
+ borderColor: "#1890ff",
312
+ textStyle: { color: "#fff" },
313
+ },
314
+ grid: {
315
+ left: "3%",
316
+ right: "4%",
317
+ bottom: "3%",
318
+ top: "15%",
319
+ containLabel: true,
320
+ },
321
+ xAxis: {
322
+ type: "category",
323
+ data: mockData.realtimeOrders.map((item) => item.time),
324
+ axisLine: { lineStyle: { color: "#4a90e2" } },
325
+ axisLabel: { color: "#fff" },
326
+ },
327
+ yAxis: {
328
+ type: "value",
329
+ axisLine: { lineStyle: { color: "#4a90e2" } },
330
+ axisLabel: { color: "#fff" },
331
+ splitLine: { lineStyle: { color: "rgba(74, 144, 226, 0.2)" } },
332
+ },
333
+ series: [
334
+ {
335
+ name: "订单数",
336
+ type: "line",
337
+ data: mockData.realtimeOrders.map((item) => item.count),
338
+ smooth: true,
339
+ lineStyle: { color: "#fa8c16", width: 3 },
340
+ itemStyle: { color: "#fa8c16" },
341
+ areaStyle: {
342
+ color: {
343
+ type: "linear",
344
+ x: 0,
345
+ y: 0,
346
+ x2: 0,
347
+ y2: 1,
348
+ colorStops: [
349
+ { offset: 0, color: "rgba(250, 140, 22, 0.5)" },
350
+ { offset: 1, color: "rgba(250, 140, 22, 0.1)" },
351
+ ],
352
+ },
353
+ },
354
+ },
355
+ ],
356
+ };
357
+
358
+ return (
359
+ <div
360
+ style={{
361
+ minHeight: "calc(100vh - 112px)",
362
+ background: "linear-gradient(135deg, #0a1929 0%, #1a2332 100%)",
363
+ padding: "24px",
364
+ color: "#fff",
365
+ margin: "-24px",
366
+ borderRadius: 0,
367
+ }}
368
+ >
369
+ {/* 顶部标题栏 */}
370
+ <div
371
+ style={{
372
+ display: "flex",
373
+ justifyContent: "space-between",
374
+ alignItems: "center",
375
+ marginBottom: 24,
376
+ }}
377
+ >
378
+ <Title level={2} style={{ color: "#fff", margin: 0 }}>
379
+ 数据大屏
380
+ </Title>
381
+ <div style={{ fontSize: 16, color: "#4a90e2" }}>
382
+ {currentTime.toLocaleString("zh-CN", {
383
+ year: "numeric",
384
+ month: "2-digit",
385
+ day: "2-digit",
386
+ hour: "2-digit",
387
+ minute: "2-digit",
388
+ second: "2-digit",
389
+ })}
390
+ </div>
391
+ </div>
392
+
393
+ {/* 统计卡片 */}
394
+ <Row gutter={[16, 16]} style={{ marginBottom: 24 }}>
395
+ {mockData.statistics.map((stat, index) => (
396
+ <Col xs={24} sm={12} lg={6} key={index}>
397
+ <Card
398
+ style={{
399
+ background: "rgba(24, 144, 255, 0.1)",
400
+ border: "1px solid rgba(24, 144, 255, 0.3)",
401
+ borderRadius: 8,
402
+ }}
403
+ bodyStyle={{ padding: 20 }}
404
+ >
405
+ <Statistic
406
+ title={
407
+ <span style={{ color: "#fff", fontSize: 14 }}>
408
+ {stat.title}
409
+ </span>
410
+ }
411
+ value={stat.value}
412
+ prefix={
413
+ <span style={{ color: stat.color, marginRight: 8 }}>
414
+ {stat.prefix}
415
+ </span>
416
+ }
417
+ suffix={
418
+ <span style={{ color: "#fff", fontSize: 14 }}>
419
+ {stat.suffix}
420
+ </span>
421
+ }
422
+ valueStyle={{
423
+ color: "#fff",
424
+ fontSize: 24,
425
+ fontWeight: "bold",
426
+ }}
427
+ />
428
+ <div style={{ marginTop: 8, fontSize: 12, color: "#4a90e2" }}>
429
+ {stat.trend.isUp ? (
430
+ <ArrowUpOutlined style={{ color: "#52c41a" }} />
431
+ ) : (
432
+ <ArrowDownOutlined style={{ color: "#ff4d4f" }} />
433
+ )}
434
+ <span
435
+ style={{
436
+ color: stat.trend.isUp ? "#52c41a" : "#ff4d4f",
437
+ marginLeft: 4,
438
+ }}
439
+ >
440
+ {stat.trend.value}%
441
+ </span>
442
+ <span style={{ color: "#8c8c8c", marginLeft: 8 }}>
443
+ 较上月
444
+ </span>
445
+ </div>
446
+ </Card>
447
+ </Col>
448
+ ))}
449
+ </Row>
450
+
451
+ {/* 图表区域 */}
452
+ <Row gutter={[16, 16]}>
453
+ {/* 销售趋势 */}
454
+ <Col xs={24} lg={16}>
455
+ <Card
456
+ style={{
457
+ background: "rgba(0, 0, 0, 0.3)",
458
+ border: "1px solid rgba(24, 144, 255, 0.3)",
459
+ borderRadius: 8,
460
+ }}
461
+ bodyStyle={{ padding: 16 }}
462
+ >
463
+ <ReactECharts
464
+ option={salesTrendOption}
465
+ style={{ height: "400px", width: "100%" }}
466
+ />
467
+ </Card>
468
+ </Col>
469
+
470
+ {/* 地区分布 */}
471
+ <Col xs={24} lg={8}>
472
+ <Card
473
+ style={{
474
+ background: "rgba(0, 0, 0, 0.3)",
475
+ border: "1px solid rgba(24, 144, 255, 0.3)",
476
+ borderRadius: 8,
477
+ }}
478
+ bodyStyle={{ padding: 16 }}
479
+ >
480
+ <ReactECharts
481
+ option={regionPieOption}
482
+ style={{ height: "400px", width: "100%" }}
483
+ />
484
+ </Card>
485
+ </Col>
486
+
487
+ {/* 产品分类 */}
488
+ <Col xs={24} lg={12}>
489
+ <Card
490
+ style={{
491
+ background: "rgba(0, 0, 0, 0.3)",
492
+ border: "1px solid rgba(24, 144, 255, 0.3)",
493
+ borderRadius: 8,
494
+ }}
495
+ bodyStyle={{ padding: 16 }}
496
+ >
497
+ <ReactECharts
498
+ option={productBarOption}
499
+ style={{ height: "350px", width: "100%" }}
500
+ />
501
+ </Card>
502
+ </Col>
503
+
504
+ {/* 实时订单 */}
505
+ <Col xs={24} lg={12}>
506
+ <Card
507
+ style={{
508
+ background: "rgba(0, 0, 0, 0.3)",
509
+ border: "1px solid rgba(24, 144, 255, 0.3)",
510
+ borderRadius: 8,
511
+ }}
512
+ bodyStyle={{ padding: 16 }}
513
+ >
514
+ <ReactECharts
515
+ option={realtimeOrderOption}
516
+ style={{ height: "350px", width: "100%" }}
517
+ />
518
+ </Card>
519
+ </Col>
520
+ </Row>
521
+ </div>
522
+ );
523
+ };
524
+
525
+ export default DataScreen;
526
+