@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,572 @@
1
+ import React from "react";
2
+ import {
3
+ Row,
4
+ Col,
5
+ Card,
6
+ Statistic,
7
+ Typography,
8
+ Table,
9
+ Progress,
10
+ Space,
11
+ Alert,
12
+ } from "antd";
13
+ import { ArrowUpOutlined, ArrowDownOutlined } from "@ant-design/icons";
14
+ import ReactECharts from "echarts-for-react";
15
+ import Paragraph from "antd/es/skeleton/Paragraph";
16
+
17
+ const { Title } = Typography;
18
+
19
+ const Dashboard: React.FC = () => {
20
+ // 模拟数据
21
+ const topCardsData = [
22
+ { title: "个人销售成交额", value: 120565, color: "#5B8FF9", unit: "" },
23
+ { title: "成交订单数", value: 352100, color: "#FF6B6B", unit: "" },
24
+ { title: "分销商收入", value: 596850, color: "#FFB800", unit: "" },
25
+ { title: "个人销售成交额", value: 7982991, color: "#5AD8A6", unit: "" },
26
+ { title: "分销商收入", value: 27890.0, color: "#999", unit: "" },
27
+ ];
28
+
29
+ // 市场占率折线图配置
30
+ const marketShareOption = {
31
+ title: {
32
+ text: "市场占率",
33
+ left: 20,
34
+ top: 10,
35
+ textStyle: { fontSize: 16, fontWeight: "bold" },
36
+ },
37
+ tooltip: { trigger: "axis" },
38
+ legend: { data: ["商场一", "商场二"], right: 20, top: 10 },
39
+ grid: { left: 40, right: 40, bottom: 40, top: 60 },
40
+ xAxis: {
41
+ type: "category",
42
+ data: ["数据1", "数据2", "数据3", "数据4", "数据5", "数据6"],
43
+ },
44
+ yAxis: { type: "value" },
45
+ series: [
46
+ {
47
+ name: "商场一",
48
+ type: "line",
49
+ data: [620, 750, 900, 620, 450, 400],
50
+ smooth: true,
51
+ lineStyle: { color: "#5B8FF9" },
52
+ areaStyle: { color: "rgba(91, 143, 249, 0.1)" },
53
+ },
54
+ {
55
+ name: "商场二",
56
+ type: "line",
57
+ data: [650, 600, 400, 800, 300, 250],
58
+ smooth: true,
59
+ lineStyle: { color: "#5AD8A6" },
60
+ areaStyle: { color: "rgba(90, 216, 166, 0.1)" },
61
+ },
62
+ ],
63
+ };
64
+
65
+ // 市场数据柱状图配置
66
+ const marketDataOption = {
67
+ title: {
68
+ text: "市场数据",
69
+ left: 20,
70
+ top: 10,
71
+ textStyle: { fontSize: 16, fontWeight: "bold" },
72
+ },
73
+ tooltip: { trigger: "axis" },
74
+ legend: { data: ["商场一", "商场二"], right: 20, top: 10 },
75
+ grid: { left: 40, right: 40, bottom: 40, top: 60 },
76
+ xAxis: {
77
+ type: "category",
78
+ data: ["数据1", "数据2", "数据3", "数据4", "数据5", "数据6"],
79
+ },
80
+ yAxis: { type: "value" },
81
+ series: [
82
+ {
83
+ name: "商场一",
84
+ type: "bar",
85
+ data: [400, 500, 900, 200, 300, 600],
86
+ itemStyle: { color: "#5B8FF9" },
87
+ },
88
+ {
89
+ name: "商场二",
90
+ type: "bar",
91
+ data: [300, 800, 400, 500, 400, 500],
92
+ itemStyle: { color: "#5AD8A6" },
93
+ },
94
+ ],
95
+ };
96
+
97
+ // 客户转换漏斗图配置
98
+ const funnelOption = {
99
+ title: {
100
+ text: "客户转换漏斗",
101
+ left: "center",
102
+ top: 10,
103
+ textStyle: { fontSize: 16, fontWeight: "bold" },
104
+ },
105
+ tooltip: { trigger: "item", formatter: "{a} <br/>{b} : {c}%" },
106
+ series: [
107
+ {
108
+ name: "客户转换",
109
+ type: "funnel",
110
+ left: "10%",
111
+ top: "60",
112
+ width: "80%",
113
+ height: "60%",
114
+ data: [
115
+ { value: 10, name: "商场二", itemStyle: { color: "#5AD8A6" } },
116
+ { value: 10, name: "商场一", itemStyle: { color: "#5B8FF9" } },
117
+ { value: 10, name: "商场三", itemStyle: { color: "#FFB800" } },
118
+ { value: 10, name: "商场四", itemStyle: { color: "#FF6B6B" } },
119
+ { value: 10, name: "商场五", itemStyle: { color: "#9270CA" } },
120
+ ],
121
+ label: { show: true, position: "inside" },
122
+ },
123
+ ],
124
+ };
125
+
126
+ // 客户分布饼图配置
127
+ const pieOption = {
128
+ title: {
129
+ text: "客户分布",
130
+ left: "center",
131
+ top: 10,
132
+ textStyle: { fontSize: 16, fontWeight: "bold" },
133
+ },
134
+ tooltip: { trigger: "item" },
135
+ legend: { orient: "vertical", right: 20, top: "middle" },
136
+ series: [
137
+ {
138
+ name: "客户分布",
139
+ type: "pie",
140
+ radius: ["50%", "70%"],
141
+ center: ["40%", "60%"],
142
+ data: [
143
+ { value: 20, name: "商场二", itemStyle: { color: "#5B8FF9" } },
144
+ { value: 20, name: "商场一", itemStyle: { color: "#FF6B6B" } },
145
+ { value: 20, name: "商场三", itemStyle: { color: "#FFB800" } },
146
+ { value: 30, name: "商场四", itemStyle: { color: "#5AD8A6" } },
147
+ { value: 10, name: "商场五", itemStyle: { color: "#9270CA" } },
148
+ ],
149
+ },
150
+ ],
151
+ };
152
+
153
+ // 市场趋势面积图配置
154
+ const trendOption = {
155
+ title: {
156
+ text: "市场趋势",
157
+ left: 20,
158
+ top: 10,
159
+ textStyle: { fontSize: 16, fontWeight: "bold" },
160
+ },
161
+ tooltip: { trigger: "axis" },
162
+ grid: { left: 40, right: 40, bottom: 40, top: 60 },
163
+ xAxis: {
164
+ type: "category",
165
+ data: ["数据1", "数据2", "数据3", "数据4", "数据5", "数据6"],
166
+ },
167
+ yAxis: { type: "value" },
168
+ series: [
169
+ {
170
+ type: "line",
171
+ data: [400, 350, 300, 622, 400, 700],
172
+ smooth: true,
173
+ areaStyle: {
174
+ color: {
175
+ type: "linear",
176
+ x: 0,
177
+ y: 0,
178
+ x2: 0,
179
+ y2: 1,
180
+ colorStops: [
181
+ { offset: 0, color: "rgba(255, 107, 107, 0.8)" },
182
+ { offset: 1, color: "rgba(255, 107, 107, 0.1)" },
183
+ ],
184
+ },
185
+ },
186
+ lineStyle: { color: "#FF6B6B" },
187
+ },
188
+ ],
189
+ };
190
+
191
+ // 销售明细表格数据
192
+ const salesDetailData = [
193
+ {
194
+ key: "1",
195
+ name: "用户满意度",
196
+ branch: "45122",
197
+ city: "广州",
198
+ status: "已装",
199
+ },
200
+ {
201
+ key: "2",
202
+ name: "用户满意度",
203
+ branch: "43122",
204
+ city: "广州",
205
+ status: "已装",
206
+ },
207
+ {
208
+ key: "3",
209
+ name: "用户满意度",
210
+ branch: "45122",
211
+ city: "广州",
212
+ status: "已装",
213
+ },
214
+ {
215
+ key: "4",
216
+ name: "用户满意度",
217
+ branch: "45122",
218
+ city: "广州",
219
+ status: "已装",
220
+ },
221
+ {
222
+ key: "5",
223
+ name: "用户满意度",
224
+ branch: "45122",
225
+ city: "广州",
226
+ status: "已装",
227
+ },
228
+ {
229
+ key: "6",
230
+ name: "用户满意度",
231
+ branch: "45122",
232
+ city: "广州",
233
+ status: "已装",
234
+ },
235
+ {
236
+ key: "7",
237
+ name: "用户满意度",
238
+ branch: "45122",
239
+ city: "广州",
240
+ status: "已装",
241
+ },
242
+ {
243
+ key: "8",
244
+ name: "用户满意度",
245
+ branch: "45122",
246
+ city: "广州",
247
+ status: "已装",
248
+ },
249
+ ];
250
+
251
+ const salesColumns = [
252
+ { title: "分销商用户名", dataIndex: "name", key: "name" },
253
+ { title: "分销商名称", dataIndex: "branch", key: "branch" },
254
+ { title: "分销商等级", dataIndex: "city", key: "city" },
255
+ { title: "覆盖地域", dataIndex: "status", key: "status" },
256
+ ];
257
+
258
+ return (
259
+ <div
260
+ style={{ padding: "16px", backgroundColor: "#fff", minHeight: "100vh" }}
261
+ >
262
+ {/* 顶部提示信息 */}
263
+ <Alert
264
+ message="Dashboard 展示页面"
265
+ description="本页面为静态页面,用于展示 Dashboard 数据可视化效果,未使用任何 API 接口"
266
+ type="info"
267
+ showIcon
268
+ style={{ marginBottom: "16px" }}
269
+ />
270
+
271
+ {/* 顶部数据卡片 */}
272
+ <Row gutter={16} style={{ marginBottom: "16px" }}>
273
+ <Col span={4}>
274
+ <div
275
+ style={{
276
+ padding: "20px",
277
+ backgroundColor: "#fafafa",
278
+ borderRadius: "8px",
279
+ }}
280
+ >
281
+ <Statistic
282
+ title="个人销售成交额"
283
+ value={120565}
284
+ valueStyle={{ color: "#5B8FF9", fontSize: "20px" }}
285
+ />
286
+ </div>
287
+ </Col>
288
+ <Col span={4}>
289
+ <div
290
+ style={{
291
+ padding: "20px",
292
+ backgroundColor: "#fafafa",
293
+ borderRadius: "8px",
294
+ }}
295
+ >
296
+ <Statistic
297
+ title="成交订单数"
298
+ value={352100}
299
+ valueStyle={{ color: "#FF6B6B", fontSize: "20px" }}
300
+ />
301
+ </div>
302
+ </Col>
303
+ <Col span={4}>
304
+ <div
305
+ style={{
306
+ padding: "20px",
307
+ backgroundColor: "#fafafa",
308
+ borderRadius: "8px",
309
+ }}
310
+ >
311
+ <Statistic
312
+ title="分销商收入"
313
+ value={596850}
314
+ valueStyle={{ color: "#FFB800", fontSize: "20px" }}
315
+ />
316
+ </div>
317
+ </Col>
318
+ <Col span={4}>
319
+ <div
320
+ style={{
321
+ padding: "20px",
322
+ backgroundColor: "#fafafa",
323
+ borderRadius: "8px",
324
+ }}
325
+ >
326
+ <Statistic
327
+ title="个人销售成交额"
328
+ value={7982991}
329
+ valueStyle={{ color: "#5AD8A6", fontSize: "20px" }}
330
+ />
331
+ </div>
332
+ </Col>
333
+ <Col span={8}>
334
+ <div
335
+ style={{
336
+ padding: "20px",
337
+ backgroundColor: "#fafafa",
338
+ borderRadius: "8px",
339
+ }}
340
+ >
341
+ <Statistic
342
+ title="分销商收入"
343
+ value={27890.0}
344
+ valueStyle={{ color: "#999", fontSize: "24px" }}
345
+ suffix={<ArrowUpOutlined style={{ color: "#52C41A" }} />}
346
+ />
347
+ </div>
348
+ </Col>
349
+ </Row>
350
+
351
+ {/* 第二行 - 图表区域 */}
352
+ <Row gutter={16} style={{ marginBottom: "16px" }}>
353
+ <Col span={8}>
354
+ <div
355
+ style={{
356
+ padding: "16px",
357
+ backgroundColor: "#fafafa",
358
+ borderRadius: "8px",
359
+ height: "400px",
360
+ }}
361
+ >
362
+ <ReactECharts
363
+ option={marketShareOption}
364
+ style={{ height: "360px" }}
365
+ />
366
+ </div>
367
+ </Col>
368
+ <Col span={4}>
369
+ <div
370
+ style={{
371
+ display: "flex",
372
+ flexDirection: "column",
373
+ height: "400px",
374
+ gap: "16px",
375
+ }}
376
+ >
377
+ <div
378
+ style={{
379
+ padding: "16px",
380
+ backgroundColor: "#fafafa",
381
+ borderRadius: "8px",
382
+ flex: 1,
383
+ }}
384
+ >
385
+ <div
386
+ style={{
387
+ fontSize: "16px",
388
+ fontWeight: "bold",
389
+ marginBottom: "12px",
390
+ color: "#333",
391
+ }}
392
+ >
393
+ 个人销售额
394
+ </div>
395
+ <Statistic
396
+ value={352100}
397
+ valueStyle={{ color: "#5B8FF9", fontSize: "28px" }}
398
+ suffix={
399
+ <div
400
+ style={{
401
+ display: "inline-flex",
402
+ alignItems: "center",
403
+ gap: "4px",
404
+ }}
405
+ >
406
+ <span style={{ color: "#52C41A", fontSize: "14px" }}>
407
+ +85%
408
+ </span>
409
+ <ArrowUpOutlined style={{ color: "#52C41A" }} />
410
+ </div>
411
+ }
412
+ />
413
+ <div
414
+ style={{ marginTop: "8px", color: "#999", fontSize: "12px" }}
415
+ >
416
+ 目标完成:4,825,000
417
+ </div>
418
+ </div>
419
+ <div
420
+ style={{
421
+ padding: "16px",
422
+ backgroundColor: "#fafafa",
423
+ borderRadius: "8px",
424
+ flex: 1,
425
+ }}
426
+ >
427
+ <div
428
+ style={{
429
+ fontSize: "16px",
430
+ fontWeight: "bold",
431
+ marginBottom: "12px",
432
+ color: "#333",
433
+ }}
434
+ >
435
+ 本月目标销售额
436
+ </div>
437
+ <Statistic
438
+ value={7982991}
439
+ valueStyle={{ color: "#FF6B6B", fontSize: "28px" }}
440
+ suffix={
441
+ <div
442
+ style={{
443
+ display: "inline-flex",
444
+ alignItems: "center",
445
+ gap: "4px",
446
+ }}
447
+ >
448
+ <span style={{ color: "#52C41A", fontSize: "14px" }}>
449
+ +21%
450
+ </span>
451
+ <ArrowUpOutlined style={{ color: "#52C41A" }} />
452
+ </div>
453
+ }
454
+ />
455
+ <div
456
+ style={{ marginTop: "8px", color: "#999", fontSize: "12px" }}
457
+ >
458
+ 目标完成:33,555,000
459
+ </div>
460
+ </div>
461
+ </div>
462
+ </Col>
463
+ <Col span={12}>
464
+ <div
465
+ style={{
466
+ padding: "16px",
467
+ backgroundColor: "#fafafa",
468
+ borderRadius: "8px",
469
+ height: "400px",
470
+ }}
471
+ >
472
+ <ReactECharts
473
+ option={marketDataOption}
474
+ style={{ height: "360px" }}
475
+ />
476
+ </div>
477
+ </Col>
478
+ </Row>
479
+
480
+ {/* 第三行 - 底部图表 */}
481
+ <Row gutter={16}>
482
+ <Col span={6}>
483
+ <div
484
+ style={{
485
+ padding: "16px",
486
+ backgroundColor: "#fafafa",
487
+ borderRadius: "8px",
488
+ height: "350px",
489
+ }}
490
+ >
491
+ <ReactECharts option={funnelOption} style={{ height: "310px" }} />
492
+ </div>
493
+ </Col>
494
+ <Col span={6}>
495
+ <div
496
+ style={{
497
+ padding: "16px",
498
+ backgroundColor: "#fafafa",
499
+ borderRadius: "8px",
500
+ height: "350px",
501
+ }}
502
+ >
503
+ <ReactECharts option={pieOption} style={{ height: "310px" }} />
504
+ </div>
505
+ </Col>
506
+ <Col span={6}>
507
+ <div
508
+ style={{
509
+ padding: "16px",
510
+ backgroundColor: "#fafafa",
511
+ borderRadius: "8px",
512
+ height: "350px",
513
+ }}
514
+ >
515
+ <ReactECharts option={trendOption} style={{ height: "310px" }} />
516
+ </div>
517
+ </Col>
518
+ <Col span={6}>
519
+ <div
520
+ style={{
521
+ padding: "12px",
522
+ backgroundColor: "#fafafa",
523
+ borderRadius: "8px",
524
+ height: "350px",
525
+ }}
526
+ >
527
+ <div
528
+ style={{
529
+ display: "flex",
530
+ justifyContent: "space-between",
531
+ alignItems: "center",
532
+ marginBottom: "12px",
533
+ }}
534
+ >
535
+ <span
536
+ style={{ fontSize: "16px", fontWeight: "bold", color: "#333" }}
537
+ >
538
+ 销售明细
539
+ </span>
540
+ <div style={{ fontSize: "12px", color: "#999" }}>
541
+ 1-20 共 41 条 &lt; &gt;
542
+ </div>
543
+ </div>
544
+ <div style={{ height: "280px", overflow: "hidden" }}>
545
+ <Table
546
+ dataSource={salesDetailData}
547
+ columns={salesColumns.map((col) => ({
548
+ ...col,
549
+ width:
550
+ col.key === "name"
551
+ ? 60
552
+ : col.key === "branch"
553
+ ? 50
554
+ : col.key === "city"
555
+ ? 40
556
+ : 40,
557
+ }))}
558
+ size="small"
559
+ pagination={false}
560
+ scroll={{ y: 250, x: "max-content" }}
561
+ style={{ fontSize: "11px" }}
562
+ showHeader={true}
563
+ />
564
+ </div>
565
+ </div>
566
+ </Col>
567
+ </Row>
568
+ </div>
569
+ );
570
+ };
571
+
572
+ export default Dashboard;