@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,441 @@
1
+ /**
2
+ * 文件管理器
3
+ * 文件和目录管理
4
+ *
5
+ * @type Page
6
+ * @route /files
7
+ * @screen 1920w
8
+ * @frames web
9
+ */
10
+ import React from 'react';
11
+
12
+
13
+
14
+ class IProps {
15
+ folderId?: number;
16
+ }
17
+
18
+ /*
19
+ * 数据与接口请求定义
20
+ */
21
+ class IState {
22
+ files?: {
23
+ /* @example 1 */id?: number,
24
+ /* @example document.pdf */name?: string,
25
+ /* @example 2048576 */size?: number,
26
+ /* @example pdf */type?: string,
27
+ /* @example 2024-01-15 10:30 */createTime?: string,
28
+ /* @example 15 */downloadCount?: number,
29
+ }[];
30
+ folders?: {
31
+ /* @example 1 */id?: number,
32
+ /* @example 文档 */name?: string,
33
+ /* @example 15 */fileCount?: number,
34
+ /* @example 52428800 */size?: number,
35
+ /* @example 2024-01-01 */createTime?: string,
36
+ }[];
37
+ loading?: boolean;
38
+ selectedFile?: any;
39
+ searchKeyword?: string;
40
+ viewMode?: string;
41
+ uploadProgress?: number;
42
+ }
43
+
44
+ class Document extends React.Component<IProps, IState> {
45
+ state = {
46
+ files: [
47
+ {
48
+ id: 1,
49
+ name: 'document.pdf',
50
+ size: 2048576,
51
+ type: 'pdf',
52
+ createTime: '2024-01-15 10:30',
53
+ downloadCount: 15,
54
+ },
55
+ {
56
+ id: 2,
57
+ name: 'image.png',
58
+ size: 1024000,
59
+ type: 'image',
60
+ createTime: '2024-01-14 15:20',
61
+ downloadCount: 23,
62
+ },
63
+ {
64
+ id: 3,
65
+ name: 'data.xlsx',
66
+ size: 512000,
67
+ type: 'excel',
68
+ createTime: '2024-01-13 09:00',
69
+ downloadCount: 8,
70
+ },
71
+ {
72
+ id: 4,
73
+ name: 'report.docx',
74
+ size: 1536000,
75
+ type: 'word',
76
+ createTime: '2024-01-12 16:45',
77
+ downloadCount: 12,
78
+ },
79
+ {
80
+ id: 5,
81
+ name: 'archive.zip',
82
+ size: 10485760,
83
+ type: 'archive',
84
+ createTime: '2024-01-11 11:30',
85
+ downloadCount: 5,
86
+ },
87
+ ],
88
+ folders: [
89
+ {
90
+ id: 1,
91
+ name: '文档',
92
+ fileCount: 15,
93
+ size: 52428800,
94
+ createTime: '2024-01-01',
95
+ },
96
+ {
97
+ id: 2,
98
+ name: '图片',
99
+ fileCount: 32,
100
+ size: 104857600,
101
+ createTime: '2024-01-01',
102
+ },
103
+ {
104
+ id: 3,
105
+ name: '音乐',
106
+ fileCount: 8,
107
+ size: 52428800,
108
+ createTime: '2024-01-05',
109
+ },
110
+ ],
111
+ loading: false,
112
+ selectedFile: null,
113
+ searchKeyword: '',
114
+ viewMode: 'grid',
115
+ uploadProgress: 0,
116
+ };
117
+
118
+ handleSearch(keyword) {
119
+ this.setState({
120
+ searchKeyword: keyword,
121
+ });
122
+ }
123
+
124
+ handleViewModeChange(mode) {
125
+ this.setState({
126
+ viewMode: mode,
127
+ });
128
+ }
129
+
130
+ handleFileClick(file) {
131
+ this.setState({
132
+ selectedFile: file,
133
+ });
134
+ }
135
+
136
+ handleFileDelete(fileId) {
137
+ this.setState({
138
+ files: this.state.files.filter(f => f.id !== fileId),
139
+ });
140
+ }
141
+
142
+ handleUpload(file) {
143
+ this.setState({
144
+ uploadProgress: 0,
145
+ });
146
+ const interval = setInterval(() => {
147
+ const progress = this.state.uploadProgress + 10;
148
+ if (progress >= 100) {
149
+ clearInterval(interval);
150
+ this.setState({
151
+ uploadProgress: 100,
152
+ });
153
+ } else {
154
+ this.setState({
155
+ uploadProgress: progress,
156
+ });
157
+ }
158
+ }, 200);
159
+ }
160
+
161
+ formatFileSize(bytes) {
162
+ if (bytes < 1024) return bytes + ' B';
163
+ if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(2) + ' KB';
164
+ return (bytes / (1024 * 1024)).toFixed(2) + ' MB';
165
+ }
166
+
167
+ render() {
168
+ // 💀 死亡:变量声明 - 解构赋值
169
+ const {
170
+ files,
171
+ folders,
172
+ loading,
173
+ selectedFile,
174
+ searchKeyword,
175
+ viewMode,
176
+ uploadProgress,
177
+ } = this.state;
178
+
179
+ // 💀 死亡:变量声明 - 计算属性
180
+ // 💀 死亡:变量声明 - 计算属性
181
+ const totalFiles = files.length;
182
+ const totalSize = files.reduce((sum, file) => sum + file.size, 0);
183
+ const totalFolders = folders.length;
184
+ const avgFileSize = Math.round(totalSize / totalFiles);
185
+
186
+ // 💀 死亡:变量声明 - 过滤后的文件
187
+ // 💀 死亡:变量声明 - 过滤后的文件
188
+ const filteredFiles = files.filter(
189
+ file =>
190
+ file.name.includes(searchKeyword) || file.type.includes(searchKeyword)
191
+ );
192
+
193
+ // 💀 死亡:if 语句 - 条件渲染
194
+ // 💀 死亡:if 语句 - 条件渲染
195
+ if (loading) {
196
+ return <View className="p-6">加载中...</View>;
197
+ }
198
+
199
+ // 💀 死亡:变量声明 - 文件类型配置
200
+ // 💀 死亡:变量声明 - 文件类型配置
201
+ const fileTypeConfig = {
202
+ pdf: {
203
+ color: 'red',
204
+ icon: '📄',
205
+ },
206
+ image: {
207
+ color: 'green',
208
+ icon: '🖼️',
209
+ },
210
+ excel: {
211
+ color: 'green',
212
+ icon: '📊',
213
+ },
214
+ word: {
215
+ color: 'blue',
216
+ icon: '📝',
217
+ },
218
+ archive: {
219
+ color: 'orange',
220
+ icon: '📦',
221
+ },
222
+ };
223
+
224
+ // 💀 死亡:变量声明 - 树形数据
225
+ // 💀 死亡:变量声明 - 树形数据
226
+ const treeData = folders.map(folder => ({
227
+ key: folder.id,
228
+ title: folder.name,
229
+ children: [],
230
+ }));
231
+
232
+ // 💀 死亡:变量声明 - 表格列配置
233
+ // 💀 死亡:变量声明 - 表格列配置
234
+ const columns = [
235
+ {
236
+ title: '文件名',
237
+ dataIndex: 'name',
238
+ key: 'name',
239
+ render: text => <Text className="font-medium">{text}</Text>,
240
+ },
241
+ {
242
+ title: '大小',
243
+ dataIndex: 'size',
244
+ key: 'size',
245
+ render: size => <Text>{this.formatFileSize(size)}</Text>,
246
+ },
247
+ {
248
+ title: '类型',
249
+ dataIndex: 'type',
250
+ key: 'type',
251
+ render: type => (
252
+ <Tag color={fileTypeConfig[type]?.color || 'gray'}>
253
+ {fileTypeConfig[type]?.icon || '📁'} {type}
254
+ </Tag>
255
+ ),
256
+ },
257
+ {
258
+ title: '下载次数',
259
+ dataIndex: 'downloadCount',
260
+ key: 'downloadCount',
261
+ },
262
+ ];
263
+
264
+ // 💀 死亡:变量声明 - JSX 片段函数
265
+ // 💀 死亡:变量声明 - JSX 片段函数
266
+ const fileCard = file => (
267
+ <Card
268
+ key={file.id}
269
+ className="hover:shadow-lg transition-shadow cursor-pointer"
270
+ onClick={() => this.handleFileClick(file)}
271
+ >
272
+ <View className="text-center">
273
+ <Text className="text-5xl mb-3 block">
274
+ {fileTypeConfig[file.type]?.icon || '📁'}
275
+ </Text>
276
+ <Text className="font-bold block truncate">{file.name}</Text>
277
+ <Text className="text-gray-500 text-sm block">
278
+ {this.formatFileSize(file.size)}
279
+ </Text>
280
+ </View>
281
+ </Card>
282
+ );
283
+
284
+ // 💀 死亡:变量声明 - 文件夹卡片
285
+ // 💀 死亡:变量声明 - 文件夹卡片
286
+ const folderCard = folder => (
287
+ <Card key={folder.id} className="hover:shadow-lg transition-shadow">
288
+ <View className="text-center">
289
+ <Text className="text-5xl mb-3 block">📁</Text>
290
+ <Text className="font-bold block">{folder.name}</Text>
291
+ <Text className="text-gray-500 text-sm block">
292
+ {folder.fileCount} 个文件
293
+ </Text>
294
+ </View>
295
+ </Card>
296
+ );
297
+
298
+ // 💀 死亡:变量声明 - 快捷操作
299
+ // 💀 死亡:变量声明 - 快捷操作
300
+ const quickActions = [
301
+ {
302
+ label: '上传',
303
+ icon: '📤',
304
+ action: () => this.handleUpload(null),
305
+ },
306
+ {
307
+ label: '新建文件夹',
308
+ icon: '📁+',
309
+ action: () => console.log('新建文件夹'),
310
+ },
311
+ {
312
+ label: '刷新',
313
+ icon: '🔄',
314
+ action: () => console.log('刷新'),
315
+ },
316
+ ];
317
+ return (
318
+ <Page className="p-[24px] bg-[var(--gray-50)] min-h-screen">
319
+ <View className="mb-[24px]">
320
+ <Text className="text-2xl font-bold text-[#1f2937]">文件管理器</Text>
321
+ <Text className="text-[#6b7280] text-sm mt-[4px]">
322
+ 文件和目录管理
323
+ </Text>
324
+ </View>
325
+ <Card className="mb-[24px]">
326
+ <View className="gap-4 grid grid-cols-4">
327
+ <View className="text-[var(--center)] p-[16px] bg-[var(--blue-50)] rounded">
328
+ <Text className="text-3xl font-bold text-[var(--blue-600)]">
329
+ {totalFiles}
330
+ </Text>
331
+ <Text className="block text-sm text-[#4b5563] mt-[4px]">
332
+ 文件总数
333
+ </Text>
334
+ </View>
335
+ <View className="text-[var(--center)] p-[16px] bg-[var(--green-50)] rounded">
336
+ <Text className="text-3xl font-bold text-[var(--green-600)]">
337
+ {this.formatFileSize(totalSize)}
338
+ </Text>
339
+ <Text className="block text-sm text-[#4b5563] mt-[4px]">
340
+ 总大小
341
+ </Text>
342
+ </View>
343
+ <View className="text-[var(--center)] p-[16px] bg-[var(--orange-50)] rounded">
344
+ <Text className="text-3xl font-bold text-[var(--orange-600)]">
345
+ {totalFolders}
346
+ </Text>
347
+ <Text className="block text-sm text-[#4b5563] mt-[4px]">
348
+ 文件夹
349
+ </Text>
350
+ </View>
351
+ <View className="text-[var(--center)] p-[16px] bg-[var(--purple-50)] rounded">
352
+ <Text className="text-3xl font-bold text-[var(--purple-600)]">
353
+ {this.formatFileSize(avgFileSize)}
354
+ </Text>
355
+ <Text className="block text-sm text-[#4b5563] mt-[4px]">
356
+ 平均大小
357
+ </Text>
358
+ </View>
359
+ </View>
360
+ </Card>
361
+ <Card className="mb-[24px]">
362
+ <View className="flex items-center justify-between">
363
+ <View className="gap-4 flex items-center">
364
+ <Input
365
+ placeholder="搜索文件"
366
+ value={searchKeyword}
367
+ onChange={e => this.handleSearch(e.target.value)}
368
+ className=""
369
+ />
370
+ <View className="gap-2 flex">
371
+ <Button
372
+ type={viewMode === 'grid' ? 'primary' : 'default'}
373
+ onClick={() => this.handleViewModeChange('grid')}
374
+ >
375
+ 网格
376
+ </Button>
377
+ <Button
378
+ type={viewMode === 'list' ? 'primary' : 'default'}
379
+ onClick={() => this.handleViewModeChange('list')}
380
+ >
381
+ 列表
382
+ </Button>
383
+ </View>
384
+ </View>
385
+ <View className="gap-2 flex">
386
+ {quickActions.map((action, index) => (
387
+ <Button
388
+ key={action.label}
389
+ onClick={action.action}
390
+ >{`${action.icon}${action.label}`}</Button>
391
+ ))}
392
+ </View>
393
+ </View>
394
+ </Card>
395
+ {!!(viewMode === 'grid') && (
396
+ <Card className="mb-[24px]">
397
+ <Text className="block text-lg font-bold mb-[16px]">文件夹</Text>
398
+ <View className="gap-4 grid grid-cols-4">
399
+ {folders.map((folder, index) => (
400
+ <Text>{folderCard(folder)}</Text>
401
+ ))}
402
+ </View>
403
+ </Card>
404
+ )}
405
+ <Card>
406
+ <View className="flex items-center justify-between mb-[16px]">
407
+ <Text className="text-lg font-bold">文件列表</Text>
408
+ <Text className="text-[#6b7280]">
409
+ 共{filteredFiles.length}个文件
410
+ </Text>
411
+ </View>
412
+ {!!(viewMode === 'grid') && (
413
+ <View className="gap-4 grid grid-cols-4">
414
+ {filteredFiles.map((file, index) => (
415
+ <Text>{fileCard(file)}</Text>
416
+ ))}
417
+ </View>
418
+ )}
419
+ {!(viewMode === 'grid') && (
420
+ <Table
421
+ columns={columns}
422
+ dataSource={filteredFiles}
423
+ rowKey="id"
424
+ onRow={record => ({
425
+ onClick: () => this.handleFileClick(record),
426
+ })}
427
+ />
428
+ )}
429
+ </Card>
430
+ {!!(uploadProgress > 0 && uploadProgress < 100) && (
431
+ <Card className="mt-[24px]">
432
+ <Text className="block mb-[8px]">上传中...</Text>
433
+ <Progress percent={uploadProgress} />
434
+ </Card>
435
+ )}
436
+ </Page>
437
+ );
438
+ }
439
+ }
440
+
441
+ export default Document;