@appthen/cli 1.2.10 → 1.2.12

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 (173) hide show
  1. package/.gitignore +1 -0
  2. package/bin/main.js +92 -0
  3. package/dist/index.js +7014 -14988
  4. package/package.json +8 -1
  5. package/tests/test-app/.appthen/shadow-space-100001-test-app-e99876b1.json +1862 -0
  6. package/tests/test-app/.appthen/space-config.json +8 -0
  7. package/tests/test-app/docs/AI-Workflow.flow +112 -0
  8. package/tests/test-app/docs/Logic-1.flow +16 -0
  9. package/tests/test-app/docs/Logic.flow +16 -0
  10. package/tests/test-app/docs/Project-Blueprint-1.flow +119 -0
  11. package/tests/test-app/docs/Project-Blueprint.flow +119 -0
  12. package/tests/test-app/docs/README.md +3 -0
  13. package/tests/test-app/docs/claude.md +194 -0
  14. package/tests/test-app/docs/page_requirement_analysis.md +149 -0
  15. package/tests/test-app/docs//345/267/245/345/215/225/347/256/241/347/220/206/347/263/273/347/273/237/350/257/246/347/273/206/350/256/276/350/256/241.md +377 -0
  16. package/tests/test-app/src/apis/AddTodoPost.api.ts +42 -0
  17. package/tests/test-app/src/apis/DeleteTodoPost.api.ts +32 -0
  18. package/tests/test-app/src/apis/GetListPost.api.ts +38 -0
  19. package/tests/test-app/src/apis/TicketAttachmentUploadPost.api.ts +42 -0
  20. package/tests/test-app/src/apis/UpdateTodoPost.api.ts +46 -0
  21. package/tests/test-app/src/app.css +15 -0
  22. package/tests/test-app/src/cloud_functions/ticket|attachment|upload.node.ts +86 -0
  23. package/tests/test-app/src/cloud_functions/ticket|comment|add.node.ts +65 -0
  24. package/tests/test-app/src/cloud_functions/types|entity|Ticket.node.ts +88 -0
  25. package/tests/test-app/src/cloud_functions/types|entity|TicketAttachment.node.ts +70 -0
  26. package/tests/test-app/src/cloud_functions/types|entity|TicketCategory.node.ts +56 -0
  27. package/tests/test-app/src/cloud_functions/types|entity|TicketComment.node.ts +62 -0
  28. package/tests/test-app/src/cloud_functions/types|entity|TicketHistory.node.ts +74 -0
  29. package/tests/test-app/src/cloud_functions/types|entity|TicketPriority.node.ts +68 -0
  30. package/tests/test-app/src/cloud_functions/types|entity|TicketStatus.node.ts +63 -0
  31. package/tests/test-app/src/cloud_functions/types|models|CreateTicketParams.node.ts +20 -0
  32. package/tests/test-app/src/cloud_functions/types|models|TicketListParams.node.ts +30 -0
  33. package/tests/test-app/src/cloud_functions/types|models|UpdateTicketParams.node.ts +22 -0
  34. package/tests/test-app/src/components/Button.js +11 -0
  35. package/tests/test-app/src/components/MessageCenter.tsx +506 -0
  36. package/tests/test-app/src/components/MouduleDemoNzp.tsx +40 -0
  37. package/tests/test-app/src/components/Timeline.tsx +145 -0
  38. package/tests/test-app/src/index.ts +2 -0
  39. package/tests/test-app/src/modules/work_order_module/apis/TicketCommentAddPost.api.ts +48 -0
  40. package/tests/test-app/src/modules/work_order_module/apis/TicketCreatePost.api.ts +52 -0
  41. package/tests/test-app/src/modules/work_order_module/apis/TicketDeleteDelete.api.ts +39 -0
  42. package/tests/test-app/src/modules/work_order_module/apis/TicketDetailGet.api.ts +39 -0
  43. package/tests/test-app/src/modules/work_order_module/apis/TicketListGet.api.ts +61 -0
  44. package/tests/test-app/src/modules/work_order_module/apis/TicketUpdatePut.api.ts +57 -0
  45. package/tests/test-app/src/modules/work_order_module/apis/TrainDoorFaultListGet.ts +76 -0
  46. package/tests/test-app/src/modules/work_order_module/apis/TrainDoorListGet.ts +76 -0
  47. package/tests/test-app/src/modules/work_order_module/apis/TrainDoorOperationRecordsGet.ts +284 -0
  48. package/tests/test-app/src/modules/work_order_module/apis/TrainDoorStatisticsGet.ts +96 -0
  49. package/tests/test-app/src/modules/work_order_module/cloud_function/category|list.node.ts +40 -0
  50. package/tests/test-app/src/modules/work_order_module/cloud_function/priority|list.node.ts +26 -0
  51. package/tests/test-app/src/modules/work_order_module/cloud_function/status|list.node.ts +26 -0
  52. package/tests/test-app/src/modules/work_order_module/cloud_function/ticket|create.node.ts +54 -0
  53. package/tests/test-app/src/modules/work_order_module/cloud_function/ticket|delete.node.ts +55 -0
  54. package/tests/test-app/src/modules/work_order_module/cloud_function/ticket|detail.node.ts +65 -0
  55. package/tests/test-app/src/modules/work_order_module/cloud_function/ticket|list.node.ts +85 -0
  56. package/tests/test-app/src/modules/work_order_module/cloud_function/ticket|update.node.ts +73 -0
  57. package/tests/test-app/src/modules/work_order_module/data_model/Ticket.m.ts +85 -0
  58. package/tests/test-app/src/modules/work_order_module/data_model/TicketCategory.m.ts +53 -0
  59. package/tests/test-app/src/modules/work_order_module/data_model/TicketStatus.m.ts +60 -0
  60. package/tests/test-app/src/modules/work_order_module//345/267/245/345/215/225/347/263/273/347/273/237/344/272/247/345/223/201/350/256/276/350/256/241/346/226/207/346/241/243.md +301 -0
  61. package/tests/test-app/src/modules/work_order_module//345/267/245/345/215/225/347/263/273/347/273/237/345/274/200/345/217/221/344/273/273/345/212/241/345/210/206/345/267/245/346/226/207/346/241/243.md +345 -0
  62. package/tests/test-app/src/pages/CustomerManagement.tsx +535 -0
  63. package/tests/test-app/src/pages/CyberpunkDashboard.tsx +348 -0
  64. package/tests/test-app/src/pages/CyberpunkProductManagement.tsx +637 -0
  65. package/tests/test-app/src/pages/CyberpunkUserList.tsx +316 -0
  66. package/tests/test-app/src/pages/DashboardV2.tsx +334 -0
  67. package/tests/test-app/src/pages/DataReport.tsx +298 -0
  68. package/tests/test-app/src/pages/DataStatistics.tsx +317 -0
  69. package/tests/test-app/src/pages/DepartmentManagement.tsx +503 -0
  70. package/tests/test-app/src/pages/FileExplorer.tsx +441 -0
  71. package/tests/test-app/src/pages/OrderDetail.tsx +393 -0
  72. package/tests/test-app/src/pages/ProductManagement.tsx +521 -0
  73. package/tests/test-app/src/pages/ProjectTimeline.tsx +395 -0
  74. package/tests/test-app/src/pages/RoleManagement.tsx +523 -0
  75. package/tests/test-app/src/pages/SLAManagement.tsx +668 -0
  76. package/tests/test-app/src/pages/StaticCyberpunkDashboard.tsx +462 -0
  77. package/tests/test-app/src/pages/StaticCyberpunkUserList.tsx +567 -0
  78. package/tests/test-app/src/pages/StudentWeaknessList.tsx +547 -0
  79. package/tests/test-app/src/pages/SystemSettings.tsx +422 -0
  80. package/tests/test-app/src/pages/TaskManagement.tsx +467 -0
  81. package/tests/test-app/src/pages/TicketCreate.tsx +27 -0
  82. package/tests/test-app/src/pages/TicketDetail.tsx +27 -0
  83. package/tests/test-app/src/pages/TicketList.tsx +27 -0
  84. package/tests/test-app/src/pages/TicketManagement.tsx +402 -0
  85. package/tests/test-app/src/pages/TicketManagementPage.tsx +1238 -0
  86. package/tests/test-app/src/pages/UserProfile.tsx +404 -0
  87. package/tests/test-app/src/pages/VisualAIIDEUpgrade.tsx +245 -0
  88. package/tests/test-app/src/pages/WorkflowDesigner.tsx +434 -0
  89. package/tests/test-app/src/pages/admin/dashboard.tsx +591 -0
  90. package/tests/test-app/src/pages/appthen_guide/ComponentTreeUnderstanding.tsx +26 -0
  91. package/tests/test-app/src/pages/appthen_guide/DataBindingLearning.tsx +26 -0
  92. package/tests/test-app/src/pages/article-list.tsx +222 -0
  93. package/tests/test-app/src/pages/babyProductRecommendationPage.tsx +168 -0
  94. package/tests/test-app/src/pages/back-end/adminRootLayout.tsx +155 -0
  95. package/tests/test-app/src/pages/back-end/adminRootLayout10.tsx +157 -0
  96. package/tests/test-app/src/pages/back-end/adminRootLayout2.tsx +156 -0
  97. package/tests/test-app/src/pages/back-end/adminRootLayout3.tsx +156 -0
  98. package/tests/test-app/src/pages/back-end/adminRootLayout4.tsx +157 -0
  99. package/tests/test-app/src/pages/back-end/adminRootLayout5.tsx +157 -0
  100. package/tests/test-app/src/pages/back-end/adminRootLayout6.tsx +157 -0
  101. package/tests/test-app/src/pages/back-end/adminRootLayout7.tsx +157 -0
  102. package/tests/test-app/src/pages/back-end/adminRootLayout8.tsx +157 -0
  103. package/tests/test-app/src/pages/back-end/adminRootLayout9.tsx +157 -0
  104. package/tests/test-app/src/pages/back-end/backgroundManagementSystem.css +5 -0
  105. package/tests/test-app/src/pages/back-end/backgroundManagementSystem.tsx +1745 -0
  106. package/tests/test-app/src/pages/category-list.tsx +179 -0
  107. package/tests/test-app/src/pages/comment-list.tsx +194 -0
  108. package/tests/test-app/src/pages/component/WorkOrderCard.tsx +140 -0
  109. package/tests/test-app/src/pages/cover.tsx +42 -0
  110. package/tests/test-app/src/pages/cyberpunk/cyberpunkCRMPage.tsx +1299 -0
  111. package/tests/test-app/src/pages/data-analytics.tsx +1872 -0
  112. package/tests/test-app/src/pages/data-overview.tsx +600 -0
  113. package/tests/test-app/src/pages/data_dashboard/blueBrightGreenTechnologyWind.css +181 -0
  114. package/tests/test-app/src/pages/data_dashboard/blueBrightGreenTechnologyWind.tsx +225 -0
  115. package/tests/test-app/src/pages/data_dashboard/blueLargeScreen.css +181 -0
  116. package/tests/test-app/src/pages/data_dashboard/blueLargeScreen.tsx +138 -0
  117. package/tests/test-app/src/pages/data_dashboard/component_library/BlueBrightGreenBorder.tsx +47 -0
  118. package/tests/test-app/src/pages/data_dashboard/component_library/FullScreenContainer.tsx +133 -0
  119. package/tests/test-app/src/pages/demo-error-page.tsx +119 -0
  120. package/tests/test-app/src/pages/department-list.tsx +183 -0
  121. package/tests/test-app/src/pages/description_of_mock_interface.md +32 -0
  122. package/tests/test-app/src/pages/digitalLargeScreen.css +181 -0
  123. package/tests/test-app/src/pages/digitalLargeScreen.tsx +1417 -0
  124. package/tests/test-app/src/pages/goods-list.tsx +233 -0
  125. package/tests/test-app/src/pages/housekeeping/adminDashboardPage.tsx +880 -0
  126. package/tests/test-app/src/pages/mobile_terminal/PersonalCenter.css +3 -0
  127. package/tests/test-app/src/pages/mobile_terminal/PersonalCenter.tsx +362 -0
  128. package/tests/test-app/src/pages/mobile_terminal/WorkOrderHomepage.tsx +337 -0
  129. package/tests/test-app/src/pages/mobile_terminal/newWorkOrder.tsx +224 -0
  130. package/tests/test-app/src/pages/mobile_terminal/tabbar.tsx +67 -0
  131. package/tests/test-app/src/pages/mobile_terminal/uiHandsOnPractice.tsx +638 -0
  132. package/tests/test-app/src/pages/mobile_terminal/workOrderDetails.tsx +346 -0
  133. package/tests/test-app/src/pages/mobile_terminal/workOrderPage.tsx +345 -0
  134. package/tests/test-app/src/pages/notice-list.tsx +217 -0
  135. package/tests/test-app/src/pages/order-detail.tsx +330 -0
  136. package/tests/test-app/src/pages/order-list.tsx +195 -0
  137. package/tests/test-app/src/pages/order-management.tsx +563 -0
  138. package/tests/test-app/src/pages/page/OrderList.tsx +230 -0
  139. package/tests/test-app/src/pages/role-list.tsx +184 -0
  140. package/tests/test-app/src/pages/simple/simplePage.tsx +92 -0
  141. package/tests/test-app/src/pages/simple-page.tsx +43 -0
  142. package/tests/test-app/src/pages/test-destructure.tsx +44 -0
  143. package/tests/test-app/src/pages/test-error-page.tsx +75 -0
  144. package/tests/test-app/src/pages/test-page-with-errors.tsx +51 -0
  145. package/tests/test-app/src/pages/test-page.tsx +101 -0
  146. package/tests/test-app/src/pages/test-render.tsx +52 -0
  147. package/tests/test-app/src/pages/test-return-type.tsx +41 -0
  148. package/tests/test-app/src/pages/test-type-assertion.tsx +37 -0
  149. package/tests/test-app/src/pages/testPage.css +3 -0
  150. package/tests/test-app/src/pages/testPage.tsx +158 -0
  151. package/tests/test-app/src/pages/ui/styleSelectorPage.tsx +1554 -0
  152. package/tests/test-app/src/pages/user-list.tsx +212 -0
  153. package/tests/test-app/src/pages/web_version/website.css +205 -0
  154. package/tests/test-app/src/pages/web_version/website.tsx +1066 -0
  155. package/tests/test-app/src/pages/wrong-page.tsx +50 -0
  156. package/tests/test-app/src/pages//345/276/205/345/212/236.apidoc.json +336 -0
  157. package/tests/test-app/src/project.json +1120 -0
  158. package/tests/test-app/src/store/global.store.ts +10 -0
  159. package/tests/test-app/src/types/CreateTicketParams.m.ts +20 -0
  160. package/tests/test-app/src/types/SLAPolicy.ts +50 -0
  161. package/tests/test-app/src/types/Ticket.ts +68 -0
  162. package/tests/test-app/src/types/TicketAttachment.m.ts +67 -0
  163. package/tests/test-app/src/types/TicketComment.m.ts +59 -0
  164. package/tests/test-app/src/types/TicketEvaluation.ts +44 -0
  165. package/tests/test-app/src/types/TicketHistory.m.ts +71 -0
  166. package/tests/test-app/src/types/TicketListParams.m.ts +30 -0
  167. package/tests/test-app/src/types/TicketPriority.m.ts +65 -0
  168. package/tests/test-app/src/types/TicketRecord.ts +47 -0
  169. package/tests/test-app/src/types/TrainDoor.ts +284 -0
  170. package/tests/test-app/src/types/UpdateTicketParams.m.ts +22 -0
  171. package/tests/test-app/src/utils/__afterRequest.util.ts +3 -0
  172. package/tests/test-app/src/utils/__beforeRequest.util.ts +10 -0
  173. package/tests/test-app/src/utils/testGlobalAction.util.ts +7 -0
@@ -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;