@appthen/cli 1.2.11 → 1.2.13

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 (59) hide show
  1. package/bin/main.js +47 -0
  2. package/dist/index.js +6185 -15001
  3. package/package.json +8 -4
  4. package/tests/test-app/.appthen/shadow-space-100001-test-app-e99876b1.json +1197 -741
  5. package/tests/test-app/.appthen/space-config.json +2 -2
  6. package/tests/test-app/src/components/MessageCenter.tsx +506 -0
  7. package/tests/test-app/src/pages/CustomerManagement.tsx +535 -0
  8. package/tests/test-app/src/pages/CyberpunkDashboard.tsx +348 -0
  9. package/tests/test-app/src/pages/CyberpunkProductManagement.tsx +637 -0
  10. package/tests/test-app/src/pages/CyberpunkUserList.tsx +316 -0
  11. package/tests/test-app/src/pages/DashboardV2.tsx +334 -0
  12. package/tests/test-app/src/pages/DataReport.tsx +298 -0
  13. package/tests/test-app/src/pages/DataStatistics.tsx +317 -0
  14. package/tests/test-app/src/pages/DepartmentManagement.tsx +503 -0
  15. package/tests/test-app/src/pages/FileExplorer.tsx +441 -0
  16. package/tests/test-app/src/pages/OrderDetail.tsx +393 -0
  17. package/tests/test-app/src/pages/ProductManagement.tsx +521 -0
  18. package/tests/test-app/src/pages/ProjectTimeline.tsx +395 -0
  19. package/tests/test-app/src/pages/RoleManagement.tsx +523 -0
  20. package/tests/test-app/src/pages/StaticCyberpunkDashboard.tsx +462 -0
  21. package/tests/test-app/src/pages/StaticCyberpunkUserList.tsx +567 -0
  22. package/tests/test-app/src/pages/StudentWeaknessList.tsx +547 -0
  23. package/tests/test-app/src/pages/SystemSettings.tsx +422 -0
  24. package/tests/test-app/src/pages/TaskManagement.tsx +467 -0
  25. package/tests/test-app/src/pages/TicketManagement.tsx +402 -0
  26. package/tests/test-app/src/pages/UserProfile.tsx +404 -0
  27. package/tests/test-app/src/pages/WorkflowDesigner.tsx +434 -0
  28. package/tests/test-app/src/pages/admin/dashboard.tsx +591 -0
  29. package/tests/test-app/src/pages/article-list.tsx +222 -0
  30. package/tests/test-app/src/pages/babyProductRecommendationPage.tsx +168 -0
  31. package/tests/test-app/src/pages/category-list.tsx +179 -0
  32. package/tests/test-app/src/pages/comment-list.tsx +194 -0
  33. package/tests/test-app/src/pages/cyberpunk/cyberpunkCRMPage.tsx +1299 -0
  34. package/tests/test-app/src/pages/data-analytics.tsx +1872 -0
  35. package/tests/test-app/src/pages/data-overview.tsx +600 -0
  36. package/tests/test-app/src/pages/demo-error-page.tsx +119 -0
  37. package/tests/test-app/src/pages/department-list.tsx +183 -0
  38. package/tests/test-app/src/pages/goods-list.tsx +233 -0
  39. package/tests/test-app/src/pages/housekeeping/adminDashboardPage.tsx +880 -0
  40. package/tests/test-app/src/pages/mobile_terminal/uiHandsOnPractice.tsx +1 -1
  41. package/tests/test-app/src/pages/notice-list.tsx +217 -0
  42. package/tests/test-app/src/pages/order-detail.tsx +330 -0
  43. package/tests/test-app/src/pages/order-list.tsx +195 -0
  44. package/tests/test-app/src/pages/order-management.tsx +563 -0
  45. package/tests/test-app/src/pages/page/OrderList.tsx +230 -0
  46. package/tests/test-app/src/pages/role-list.tsx +184 -0
  47. package/tests/test-app/src/pages/simple/simplePage.tsx +92 -0
  48. package/tests/test-app/src/pages/simple-page.tsx +43 -0
  49. package/tests/test-app/src/pages/test-destructure.tsx +44 -0
  50. package/tests/test-app/src/pages/test-error-page.tsx +75 -0
  51. package/tests/test-app/src/pages/test-page-with-errors.tsx +51 -0
  52. package/tests/test-app/src/pages/test-page.tsx +101 -0
  53. package/tests/test-app/src/pages/test-render.tsx +52 -0
  54. package/tests/test-app/src/pages/test-return-type.tsx +41 -0
  55. package/tests/test-app/src/pages/test-type-assertion.tsx +37 -0
  56. package/tests/test-app/src/pages/ui/styleSelectorPage.tsx +1554 -0
  57. package/tests/test-app/src/pages/user-list.tsx +212 -0
  58. package/tests/test-app/src/pages/wrong-page.tsx +50 -0
  59. package/tests/test-app/.appthen/shadow-space-unknown-user-test-app-e99876b1.json +0 -1060
@@ -0,0 +1,547 @@
1
+ /**
2
+ * 学生知识点薄弱项列表
3
+ * 记录和管理学生的知识点薄弱项
4
+ *
5
+ * @type Page
6
+ * @route /student-weakness
7
+ * @screen 1920w
8
+ * @frames web
9
+ */
10
+ import React from 'react';
11
+ import { Modal, Page, Text, View } from '@appthen/react';
12
+ import { Button, Card, Form, Input, Rate, Select, Space, Table, Tag } from '@appthen/antd';
13
+
14
+
15
+ class IProps {}
16
+
17
+ /*
18
+ * 数据与接口请求定义
19
+ */
20
+ class IState {
21
+ weaknessList?: {
22
+ /* @example 1 */id?: number,
23
+ /* @example 张三 */studentName?: string,
24
+ /* @example 数学 */subject?: string,
25
+ /* @example 二次函数 */knowledgePoint?: string,
26
+ /* @example 2 */level?: number,
27
+ /* @example 公式记忆不牢固 */note?: string,
28
+ /* @example 2024-01-15 10:30:25 */createTime?: string,
29
+ }[];
30
+ loading?: boolean;
31
+ searchKeyword?: string;
32
+ subjectFilter?: string;
33
+ levelFilter?: string;
34
+ modalVisible?: boolean;
35
+ editingRecord?: any;
36
+ formValues?: any;
37
+ }
38
+
39
+ class Document extends React.Component<IProps, IState> {
40
+ state = {
41
+ weaknessList: [
42
+ {
43
+ id: 1,
44
+ studentName: '张三',
45
+ subject: '数学',
46
+ knowledgePoint: '二次函数',
47
+ level: 2,
48
+ note: '公式记忆不牢固',
49
+ createTime: '2024-01-15 10:30:25',
50
+ },
51
+ {
52
+ id: 2,
53
+ studentName: '张三',
54
+ subject: '数学',
55
+ knowledgePoint: '三角函数',
56
+ level: 3,
57
+ note: '计算经常出错',
58
+ createTime: '2024-02-20 14:15:30',
59
+ },
60
+ {
61
+ id: 3,
62
+ studentName: '李四',
63
+ subject: '语文',
64
+ knowledgePoint: '古诗词背诵',
65
+ level: 1,
66
+ note: '完全不会背诵',
67
+ createTime: '2024-03-10 09:45:18',
68
+ },
69
+ {
70
+ id: 4,
71
+ studentName: '李四',
72
+ subject: '英语',
73
+ knowledgePoint: '时态运用',
74
+ level: 2,
75
+ note: '过去完成时掌握不好',
76
+ createTime: '2024-04-05 16:20:45',
77
+ },
78
+ {
79
+ id: 5,
80
+ studentName: '王五',
81
+ subject: '数学',
82
+ knowledgePoint: '立体几何',
83
+ level: 3,
84
+ note: '空间想象力不足',
85
+ createTime: '2024-05-12 11:55:28',
86
+ },
87
+ {
88
+ id: 6,
89
+ studentName: '王五',
90
+ subject: '物理',
91
+ knowledgePoint: '牛顿定律',
92
+ level: 2,
93
+ note: '受力分析不熟练',
94
+ createTime: '2024-05-13 09:20:15',
95
+ },
96
+ {
97
+ id: 7,
98
+ studentName: '赵六',
99
+ subject: '化学',
100
+ knowledgePoint: '化学方程式',
101
+ level: 1,
102
+ note: '配平困难',
103
+ createTime: '2024-05-14 15:30:45',
104
+ },
105
+ {
106
+ id: 8,
107
+ studentName: '钱七',
108
+ subject: '英语',
109
+ knowledgePoint: '阅读理解',
110
+ level: 3,
111
+ note: '长难句理解困难',
112
+ createTime: '2024-05-15 10:10:20',
113
+ },
114
+ ],
115
+ loading: false,
116
+ searchKeyword: '',
117
+ subjectFilter: '',
118
+ levelFilter: '',
119
+ modalVisible: false,
120
+ formValues: {},
121
+ };
122
+
123
+ handleSearch(value) {
124
+ this.setState({
125
+ searchKeyword: value,
126
+ });
127
+ }
128
+
129
+ handleSubjectFilter(value) {
130
+ this.setState({
131
+ subjectFilter: value,
132
+ });
133
+ }
134
+
135
+ handleLevelFilter(value) {
136
+ this.setState({
137
+ levelFilter: value,
138
+ });
139
+ }
140
+
141
+ handleAdd() {
142
+ this.setState({
143
+ modalVisible: true,
144
+ editingRecord: null,
145
+ formValues: {},
146
+ });
147
+ }
148
+
149
+ handleEdit(record) {
150
+ this.setState({
151
+ modalVisible: true,
152
+ editingRecord: record,
153
+ formValues: {
154
+ ...record,
155
+ },
156
+ });
157
+ }
158
+
159
+ handleDelete(record) {
160
+ Modal.confirm({
161
+ title: '确认删除',
162
+ content: `确定要删除 ${record.studentName} 的 ${record.knowledgePoint} 薄弱项记录吗?`,
163
+ onOk: () => {
164
+ const weaknessList = this.state.weaknessList?.filter(
165
+ item => item.id !== record.id
166
+ );
167
+ this.setState({
168
+ weaknessList,
169
+ });
170
+ message.success('删除成功');
171
+ },
172
+ });
173
+ }
174
+
175
+ handleModalOk() {
176
+ const { editingRecord, formValues, weaknessList } = this.state;
177
+ if (
178
+ !formValues.studentName ||
179
+ !formValues.subject ||
180
+ !formValues.knowledgePoint
181
+ ) {
182
+ message.error('请填写完整信息');
183
+ return;
184
+ }
185
+ if (editingRecord) {
186
+ const updatedList = weaknessList?.map(item => {
187
+ if (item.id === editingRecord.id) {
188
+ return {
189
+ ...item,
190
+ ...formValues,
191
+ level: formValues.level || 2,
192
+ };
193
+ }
194
+ return item;
195
+ });
196
+ this.setState({
197
+ weaknessList: updatedList,
198
+ });
199
+ message.success('更新成功');
200
+ } else {
201
+ const newRecord = {
202
+ id: Date.now(),
203
+ ...formValues,
204
+ level: formValues.level || 2,
205
+ createTime: new Date()
206
+ .toLocaleString('zh-CN', {
207
+ hour12: false,
208
+ })
209
+ .replace(/\//g, '-'),
210
+ };
211
+ this.setState({
212
+ weaknessList: [newRecord, ...(weaknessList || [])],
213
+ });
214
+ message.success('添加成功');
215
+ }
216
+ this.setState({
217
+ modalVisible: false,
218
+ });
219
+ }
220
+
221
+ handleModalCancel() {
222
+ this.setState({
223
+ modalVisible: false,
224
+ });
225
+ }
226
+
227
+ handleFormChange(field, value) {
228
+ const formValues = {
229
+ ...this.state.formValues,
230
+ };
231
+ formValues[field] = value;
232
+ this.setState({
233
+ formValues,
234
+ });
235
+ }
236
+
237
+ getSubjectTag(subject) {
238
+ const colorMap = {
239
+ 数学: 'blue',
240
+ 语文: 'green',
241
+ 英语: 'purple',
242
+ 物理: 'orange',
243
+ 化学: 'red',
244
+ 生物: 'cyan',
245
+ };
246
+ return <Tag color={colorMap[subject] || 'default'}>{subject}</Tag>;
247
+ }
248
+
249
+ getLevelTag(level) {
250
+ const levelMap = {
251
+ 1: {
252
+ text: '严重薄弱',
253
+ color: 'red',
254
+ },
255
+ 2: {
256
+ text: '一般薄弱',
257
+ color: 'orange',
258
+ },
259
+ 3: {
260
+ text: '略有不足',
261
+ color: 'gold',
262
+ },
263
+ };
264
+ const info = levelMap[level] || levelMap[2];
265
+ return <Tag color={info.color}>{info.text}</Tag>;
266
+ }
267
+
268
+ getFilteredData() {
269
+ const { weaknessList, searchKeyword, subjectFilter, levelFilter } =
270
+ this.state;
271
+ return weaknessList?.filter(item => {
272
+ const matchSearch =
273
+ !searchKeyword ||
274
+ item.studentName?.includes(searchKeyword) ||
275
+ item.knowledgePoint?.includes(searchKeyword);
276
+ const matchSubject = !subjectFilter || item.subject === subjectFilter;
277
+ const matchLevel = !levelFilter || item.level === parseInt(levelFilter);
278
+ return matchSearch && matchSubject && matchLevel;
279
+ });
280
+ }
281
+
282
+ getStatistics() {
283
+ const { weaknessList } = this.state;
284
+ const subjectStats = {};
285
+ const levelStats = {
286
+ 1: 0,
287
+ 2: 0,
288
+ 3: 0,
289
+ };
290
+ weaknessList?.forEach(item => {
291
+ subjectStats[item.subject] = (subjectStats[item.subject] || 0) + 1;
292
+ levelStats[item.level] = (levelStats[item.level] || 0) + 1;
293
+ });
294
+ return {
295
+ subjectStats,
296
+ levelStats,
297
+ };
298
+ }
299
+
300
+ render() {
301
+ const {
302
+ searchKeyword,
303
+ subjectFilter,
304
+ levelFilter,
305
+ modalVisible,
306
+ editingRecord,
307
+ formValues,
308
+ } = this.state;
309
+ const filteredData = this.getFilteredData();
310
+ const { subjectStats, levelStats } = this.getStatistics();
311
+ return (
312
+ <Page className="p-[24px] bg-[var(--gray-50)] min-h-screen">
313
+ <View className="mb-[24px]">
314
+ <h1 className="text-2xl font-bold text-[#1f2937]">
315
+ 学生知识点薄弱项记录
316
+ </h1>
317
+ <p className="text-[#6b7280] text-sm mt-[4px]">
318
+ 记录和管理学生的知识点薄弱项,帮助学生针对性提升
319
+ </p>
320
+ </View>
321
+ <View className="grid grid-cols-1 md:grid-cols-4 gap-4 mb-[24px]">
322
+ <Card>
323
+ <View className="text-[var(--center)]">
324
+ <View className="text-3xl font-bold text-[var(--blue-600)]">
325
+ {0}
326
+ </View>
327
+ <View className="text-[#6b7280] text-sm">薄弱项总数</View>
328
+ </View>
329
+ </Card>
330
+ <Card>
331
+ <View className="text-[var(--center)]">
332
+ <View className="text-3xl font-bold text-[var(--red-600)]">
333
+ <Text>{levelStats[1]}</Text>
334
+ </View>
335
+ <View className="text-[#6b7280] text-sm">严重薄弱</View>
336
+ </View>
337
+ </Card>
338
+ <Card>
339
+ <View className="text-[var(--center)]">
340
+ <View className="text-3xl font-bold text-[var(--orange-600)]">
341
+ <Text>{levelStats[2]}</Text>
342
+ </View>
343
+ <View className="text-[#6b7280] text-sm">一般薄弱</View>
344
+ </View>
345
+ </Card>
346
+ <Card>
347
+ <View className="text-[var(--center)]">
348
+ <View className="text-3xl font-bold text-[var(--yellow-600)]">
349
+ <Text>{levelStats[3]}</Text>
350
+ </View>
351
+ <View className="text-[#6b7280] text-sm">略有不足</View>
352
+ </View>
353
+ </Card>
354
+ </View>
355
+ <Card className="mb-[24px]">
356
+ <View className="gap-4 flex flex-wrap items-center">
357
+ <Input
358
+ placeholder="搜索学生/知识点"
359
+ value={searchKeyword}
360
+ onChange={e => this.handleSearch(e.target.value)}
361
+ className=""
362
+ />
363
+ <Select
364
+ placeholder="选择科目"
365
+ value={subjectFilter}
366
+ onChange={value => this.handleSubjectFilter(value)}
367
+ allowClear={true}
368
+ className=""
369
+ >
370
+ <Select.Option value="数学">数学</Select.Option>
371
+ <Select.Option value="语文">语文</Select.Option>
372
+ <Select.Option value="英语">英语</Select.Option>
373
+ <Select.Option value="物理">物理</Select.Option>
374
+ <Select.Option value="化学">化学</Select.Option>
375
+ <Select.Option value="生物">生物</Select.Option>
376
+ </Select>
377
+ <Select
378
+ placeholder="掌握程度"
379
+ value={levelFilter}
380
+ onChange={value => this.handleLevelFilter(value)}
381
+ allowClear={true}
382
+ className=""
383
+ >
384
+ <Select.Option value="1">严重薄弱</Select.Option>
385
+ <Select.Option value="2">一般薄弱</Select.Option>
386
+ <Select.Option value="3">略有不足</Select.Option>
387
+ </Select>
388
+ <View className="flex-1" />
389
+ <Button type="primary" onClick={() => this.handleAdd()}>
390
+ + 添加薄弱项
391
+ </Button>
392
+ </View>
393
+ </Card>
394
+ <Card>
395
+ <Table
396
+ loading={this.state.loading}
397
+ columns={[
398
+ { title: 'ID', dataIndex: 'id', key: 'id', width: 80 },
399
+ {
400
+ title: '学生姓名',
401
+ dataIndex: 'studentName',
402
+ key: 'studentName',
403
+ width: 120,
404
+ },
405
+ {
406
+ title: '科目',
407
+ dataIndex: 'subject',
408
+ key: 'subject',
409
+ width: 100,
410
+ render: text => <View>{this.getSubjectTag(text)}</View>,
411
+ },
412
+ {
413
+ title: '知识点',
414
+ dataIndex: 'knowledgePoint',
415
+ key: 'knowledgePoint',
416
+ width: 150,
417
+ },
418
+ {
419
+ title: '掌握程度',
420
+ dataIndex: 'level',
421
+ key: 'level',
422
+ width: 120,
423
+ render: text => <View>{this.getLevelTag(text)}</View>,
424
+ },
425
+ {
426
+ title: '备注说明',
427
+ dataIndex: 'note',
428
+ key: 'note',
429
+ ellipsis: true,
430
+ },
431
+ {
432
+ title: '记录时间',
433
+ dataIndex: 'createTime',
434
+ key: 'createTime',
435
+ width: 180,
436
+ },
437
+ {
438
+ title: '操作',
439
+ key: 'action',
440
+ width: 150,
441
+ fixed: 'right',
442
+ render: (text, record) => (
443
+ <Space>
444
+ <Button type="link" onClick={() => this.handleEdit(record)}>
445
+ 编辑
446
+ </Button>
447
+ <Button
448
+ type="link"
449
+ danger={true}
450
+ onClick={() => this.handleDelete(record)}
451
+ >
452
+ 删除
453
+ </Button>
454
+ </Space>
455
+ ),
456
+ },
457
+ ]}
458
+ dataSource={filteredData}
459
+ rowKey="id"
460
+ pagination={{
461
+ pageSize: 10,
462
+ showTotal: function (total) {
463
+ return `共 ${total} 条`;
464
+ },
465
+ }}
466
+ scroll={{ x: 1200, scrollToFirstRowOnChange: true }}
467
+ showHeader={true}
468
+ size="default"
469
+ tableLayout=""
470
+ />
471
+ </Card>
472
+ <Modal
473
+ title={editingRecord ? '编辑薄弱项' : '添加薄弱项'}
474
+ open={modalVisible}
475
+ onOk={() => this.handleModalOk()}
476
+ onCancel={() => this.handleModalCancel()}
477
+ width={600}
478
+ okText="确定"
479
+ cancelText="取消"
480
+ >
481
+ <Form layout="vertical">
482
+ <Form.Item label="学生姓名" required={true}>
483
+ <Input
484
+ placeholder="请输入学生姓名"
485
+ value={formValues.studentName}
486
+ onChange={e =>
487
+ this.handleFormChange('studentName', e.target.value)
488
+ }
489
+ />
490
+ </Form.Item>
491
+ <Form.Item label="科目" required={true}>
492
+ <Select
493
+ placeholder="请选择科目"
494
+ value={formValues.subject}
495
+ onChange={value => this.handleFormChange('subject', value)}
496
+ >
497
+ <Select.Option value="数学">数学</Select.Option>
498
+ <Select.Option value="语文">语文</Select.Option>
499
+ <Select.Option value="英语">英语</Select.Option>
500
+ <Select.Option value="物理">物理</Select.Option>
501
+ <Select.Option value="化学">化学</Select.Option>
502
+ <Select.Option value="生物">生物</Select.Option>
503
+ </Select>
504
+ </Form.Item>
505
+ <Form.Item label="知识点" required={true}>
506
+ <Input
507
+ placeholder="请输入薄弱的知识点"
508
+ value={formValues.knowledgePoint}
509
+ onChange={e =>
510
+ this.handleFormChange('knowledgePoint', e.target.value)
511
+ }
512
+ />
513
+ </Form.Item>
514
+ <Form.Item label="掌握程度">
515
+ <View className="gap-4 flex items-center">
516
+ <Rate
517
+ count={3}
518
+ value={formValues.level || 2}
519
+ onChange={value => this.handleFormChange('level', value)}
520
+ character="★"
521
+ />
522
+ <Text className="text-[#6b7280] text-sm">
523
+ {formValues.level === 1 && '严重薄弱'}
524
+ {formValues.level === 2 && '一般薄弱'}
525
+ {formValues.level === 3 && '略有不足'}
526
+ </Text>
527
+ </View>
528
+ <View className="text-[#9ca3af] text-xs mt-[4px]">
529
+ 1星=严重薄弱,2星=一般薄弱,3星=略有不足
530
+ </View>
531
+ </Form.Item>
532
+ <Form.Item label="备注说明">
533
+ <Input.TextArea
534
+ placeholder="请输入备注说明(可选)"
535
+ value={formValues.note}
536
+ onChange={e => this.handleFormChange('note', e.target.value)}
537
+ rows={3}
538
+ />
539
+ </Form.Item>
540
+ </Form>
541
+ </Modal>
542
+ </Page>
543
+ );
544
+ }
545
+ }
546
+
547
+ export default Document;