@lovrabet/cli 1.1.0
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 +28 -0
- package/lib/add-page/input-page-router.js +1 -0
- package/lib/add-page/main.js +1 -0
- package/lib/add-page/select-page-template.js +1 -0
- package/lib/api/api-pull-ui.js +1 -0
- package/lib/api/format-dataset.js +1 -0
- package/lib/api/generate-api-file.js +1 -0
- package/lib/api/main.js +1 -0
- package/lib/api/pull-silent.js +1 -0
- package/lib/api/pull.js +1 -0
- package/lib/api/types.js +1 -0
- package/lib/auth/auth-server-ui.js +1 -0
- package/lib/auth/auth-server.js +1 -0
- package/lib/auth/constant.js +1 -0
- package/lib/auth/get-cookie.js +1 -0
- package/lib/auth/is-session-valid.js +1 -0
- package/lib/auth/logout.js +1 -0
- package/lib/cli.js +2 -0
- package/lib/cmd/build-watch.js +1 -0
- package/lib/cmd/build.js +1 -0
- package/lib/cmd/logs.js +1 -0
- package/lib/cmd/preview.js +1 -0
- package/lib/cmd/start.js +1 -0
- package/lib/config/config-help.js +1 -0
- package/lib/config/main.js +1 -0
- package/lib/constant/domain.js +1 -0
- package/lib/constant/env.js +1 -0
- package/lib/create-app/enhanced-guided-create.js +1 -0
- package/lib/create-app/format-elapsed.js +1 -0
- package/lib/create-app/main.js +1 -0
- package/lib/create-app/task-finished.js +1 -0
- package/lib/create-app/task-loading.js +1 -0
- package/lib/create-app/task-running.js +1 -0
- package/lib/create-app/task-time.js +1 -0
- package/lib/create-app/use-copy-project-template.js +1 -0
- package/lib/create-app/use-format-code.js +1 -0
- package/lib/create-app/use-install-dependencies.js +1 -0
- package/lib/help.js +1 -0
- package/lib/utils/config.js +1 -0
- package/lib/utils/copy-directory.js +1 -0
- package/lib/utils/logger.js +1 -0
- package/lib/utils/router-updater.js +1 -0
- package/lib/utils/template-replacer.js +1 -0
- package/package.json +41 -0
- package/templates/README.md +115 -0
- package/templates/generate-api/api.ts.tpl +42 -0
- package/templates/generate-api/client.ts.tpl +64 -0
- package/templates/pages/blank/index.tsx.tpl +13 -0
- package/templates/pages/sdk-fetch/index.tsx.tpl +82 -0
- package/templates/projects/sub-app-react-demo/.prettierrc +1 -0
- package/templates/projects/sub-app-react-demo/.vscode/extensions.json +3 -0
- package/templates/projects/sub-app-react-demo/.vscode/settings.json +57 -0
- package/templates/projects/sub-app-react-demo/CHANGELOG.md +37 -0
- package/templates/projects/sub-app-react-demo/README.md +209 -0
- package/templates/projects/sub-app-react-demo/bun.lock +600 -0
- package/templates/projects/sub-app-react-demo/docs/API_RULE_CHANGE.md +212 -0
- package/templates/projects/sub-app-react-demo/docs/quick-start.md +526 -0
- package/templates/projects/sub-app-react-demo/index.html +39 -0
- package/templates/projects/sub-app-react-demo/package.json +34 -0
- package/templates/projects/sub-app-react-demo/public/vite.svg +1 -0
- package/templates/projects/sub-app-react-demo/src/api/api.ts +66 -0
- package/templates/projects/sub-app-react-demo/src/api/client.ts +63 -0
- package/templates/projects/sub-app-react-demo/src/components/ApiUrlDisplay.tsx +111 -0
- package/templates/projects/sub-app-react-demo/src/layouts/MainLayout.tsx +116 -0
- package/templates/projects/sub-app-react-demo/src/main.tsx +48 -0
- package/templates/projects/sub-app-react-demo/src/pages/chart-fetch/index.tsx +137 -0
- package/templates/projects/sub-app-react-demo/src/pages/dashboard/index.tsx +572 -0
- package/templates/projects/sub-app-react-demo/src/pages/index.tsx +129 -0
- package/templates/projects/sub-app-react-demo/src/pages/sdk-demo/index.tsx +182 -0
- package/templates/projects/sub-app-react-demo/src/pages/table-display.tsx +130 -0
- package/templates/projects/sub-app-react-demo/src/router/index.tsx +30 -0
- package/templates/projects/sub-app-react-demo/src/style.css +47 -0
- package/templates/projects/sub-app-react-demo/src/utils/api.ts +12 -0
- package/templates/projects/sub-app-react-demo/src/vite-env.d.ts +2 -0
- package/templates/projects/sub-app-react-demo/tsconfig.json +26 -0
- package/templates/projects/sub-app-react-demo/vite.config.ts +88 -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 条 < >
|
|
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;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Typography, Card, Row, Col, Space, Tag, Divider } from 'antd';
|
|
3
|
+
import {
|
|
4
|
+
ApiOutlined,
|
|
5
|
+
RocketOutlined,
|
|
6
|
+
CodeOutlined,
|
|
7
|
+
ExperimentOutlined,
|
|
8
|
+
BulbOutlined,
|
|
9
|
+
ToolOutlined,
|
|
10
|
+
CloudServerOutlined
|
|
11
|
+
} from '@ant-design/icons';
|
|
12
|
+
|
|
13
|
+
const { Title, Paragraph, Text } = Typography;
|
|
14
|
+
|
|
15
|
+
function HomePage() {
|
|
16
|
+
return (
|
|
17
|
+
<div style={{ padding: '24px' }}>
|
|
18
|
+
<Space direction="vertical" size="large" style={{ width: '100%' }}>
|
|
19
|
+
{/* 项目概述 */}
|
|
20
|
+
<Card>
|
|
21
|
+
<Title level={2}>
|
|
22
|
+
<RocketOutlined style={{ color: '#1890ff' }} /> Lovrabet SDK React 演示项目
|
|
23
|
+
</Title>
|
|
24
|
+
<Paragraph style={{ fontSize: 16, color: '#666' }}>
|
|
25
|
+
这是一个专门用于演示和测试 <Text strong>@lovrabet/sdk</Text> 功能的 React 应用。
|
|
26
|
+
项目展示了如何在现代 React 应用中集成和使用 Lovrabet SDK 进行数据操作。
|
|
27
|
+
</Paragraph>
|
|
28
|
+
</Card>
|
|
29
|
+
|
|
30
|
+
{/* 核心功能 */}
|
|
31
|
+
<Card title={<><BulbOutlined /> 核心功能</>} size="small">
|
|
32
|
+
<Row gutter={[16, 16]}>
|
|
33
|
+
<Col xs={24} sm={12} md={8}>
|
|
34
|
+
<Card size="small" style={{ height: '100%', background: '#f6ffed' }}>
|
|
35
|
+
<ApiOutlined style={{ fontSize: 24, color: '#52c41a', marginBottom: 8 }} />
|
|
36
|
+
<Title level={4} style={{ margin: '8px 0' }}>SDK 调用演示</Title>
|
|
37
|
+
<Text type="secondary">
|
|
38
|
+
展示 SDK 的 CRUD 操作方法,包括数据获取、创建、更新和删除
|
|
39
|
+
</Text>
|
|
40
|
+
</Card>
|
|
41
|
+
</Col>
|
|
42
|
+
<Col xs={24} sm={12} md={8}>
|
|
43
|
+
<Card size="small" style={{ height: '100%', background: '#e6f7ff' }}>
|
|
44
|
+
<CloudServerOutlined style={{ fontSize: 24, color: '#1890ff', marginBottom: 8 }} />
|
|
45
|
+
<Title level={4} style={{ margin: '8px 0' }}>API 集成</Title>
|
|
46
|
+
<Text type="secondary">
|
|
47
|
+
演示如何配置和使用 Lovrabet Runtime API 进行数据交互
|
|
48
|
+
</Text>
|
|
49
|
+
</Card>
|
|
50
|
+
</Col>
|
|
51
|
+
<Col xs={24} sm={12} md={8}>
|
|
52
|
+
<Card size="small" style={{ height: '100%', background: '#fff2e8' }}>
|
|
53
|
+
<ExperimentOutlined style={{ fontSize: 24, color: '#fa8c16', marginBottom: 8 }} />
|
|
54
|
+
<Title level={4} style={{ margin: '8px 0' }}>微前端集成</Title>
|
|
55
|
+
<Text type="secondary">
|
|
56
|
+
支持作为子应用集成到 Lovrabet 主应用的微前端架构中
|
|
57
|
+
</Text>
|
|
58
|
+
</Card>
|
|
59
|
+
</Col>
|
|
60
|
+
</Row>
|
|
61
|
+
</Card>
|
|
62
|
+
|
|
63
|
+
{/* 技术栈 */}
|
|
64
|
+
<Card title={<><ToolOutlined /> 技术栈</>} size="small">
|
|
65
|
+
<Row gutter={[24, 16]}>
|
|
66
|
+
<Col xs={24} md={12}>
|
|
67
|
+
<Title level={5}>前端技术</Title>
|
|
68
|
+
<Space wrap>
|
|
69
|
+
<Tag color="blue">React 18</Tag>
|
|
70
|
+
<Tag color="green">TypeScript</Tag>
|
|
71
|
+
<Tag color="purple">Vite</Tag>
|
|
72
|
+
<Tag color="cyan">Ant Design 5</Tag>
|
|
73
|
+
</Space>
|
|
74
|
+
<Paragraph style={{ marginTop: 8, color: '#666' }}>
|
|
75
|
+
使用现代化的前端技术栈,提供优秀的开发体验和用户体验
|
|
76
|
+
</Paragraph>
|
|
77
|
+
</Col>
|
|
78
|
+
<Col xs={24} md={12}>
|
|
79
|
+
<Title level={5}>SDK 集成</Title>
|
|
80
|
+
<Space wrap>
|
|
81
|
+
<Tag color="orange">@lovrabet/sdk</Tag>
|
|
82
|
+
<Tag color="red">Runtime API</Tag>
|
|
83
|
+
<Tag color="geekblue">icestark</Tag>
|
|
84
|
+
<Tag color="magenta">微前端</Tag>
|
|
85
|
+
</Space>
|
|
86
|
+
<Paragraph style={{ marginTop: 8, color: '#666' }}>
|
|
87
|
+
集成 Lovrabet SDK 和微前端框架,支持灵活的应用架构
|
|
88
|
+
</Paragraph>
|
|
89
|
+
</Col>
|
|
90
|
+
</Row>
|
|
91
|
+
</Card>
|
|
92
|
+
|
|
93
|
+
{/* 页面导航 */}
|
|
94
|
+
<Card title={<><CodeOutlined /> 功能页面</>} size="small">
|
|
95
|
+
<Row gutter={[16, 8]}>
|
|
96
|
+
<Col xs={24} sm={8}>
|
|
97
|
+
<Text strong>SDK 演示</Text>
|
|
98
|
+
<br />
|
|
99
|
+
<Text type="secondary">查看 SDK 的核心调用方法和代码示例</Text>
|
|
100
|
+
</Col>
|
|
101
|
+
<Col xs={24} sm={8}>
|
|
102
|
+
<Text strong>表格展示</Text>
|
|
103
|
+
<br />
|
|
104
|
+
<Text type="secondary">展示数据表格的渲染和交互功能</Text>
|
|
105
|
+
</Col>
|
|
106
|
+
<Col xs={24} sm={8}>
|
|
107
|
+
<Text strong>图表获取</Text>
|
|
108
|
+
<br />
|
|
109
|
+
<Text type="secondary">演示图表数据的获取和可视化展示</Text>
|
|
110
|
+
</Col>
|
|
111
|
+
</Row>
|
|
112
|
+
</Card>
|
|
113
|
+
|
|
114
|
+
<Divider />
|
|
115
|
+
|
|
116
|
+
{/* 项目信息 */}
|
|
117
|
+
<Card size="small" style={{ background: '#fafafa' }}>
|
|
118
|
+
<Text type="secondary">
|
|
119
|
+
💡 <strong>提示:</strong>
|
|
120
|
+
本项目主要用于 SDK 功能验证和演示,帮助开发者快速了解如何在 React 应用中使用 Lovrabet SDK。
|
|
121
|
+
所有代码示例都经过实际测试,可以直接参考使用。
|
|
122
|
+
</Text>
|
|
123
|
+
</Card>
|
|
124
|
+
</Space>
|
|
125
|
+
</div>
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export default HomePage;
|