mall-components 1.0.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.
Files changed (122) hide show
  1. package/README.md +128 -0
  2. package/build/_components-raw.css +791 -0
  3. package/build/_shims/antd.js +1 -0
  4. package/build/_shims/icons.js +1 -0
  5. package/build/_shims/moment.js +1 -0
  6. package/build/_shims/react-dom.js +1 -0
  7. package/build/_shims/react.js +1 -0
  8. package/build/adapters/DataSourceAdapter.d.ts +46 -0
  9. package/build/components/AdminLayout/AdminLayout.d.ts +5 -0
  10. package/build/components/AdminLayout/Breadcrumb.d.ts +8 -0
  11. package/build/components/AdminLayout/MainContent.d.ts +17 -0
  12. package/build/components/AdminLayout/Navbar.d.ts +10 -0
  13. package/build/components/AdminLayout/Sidebar.d.ts +14 -0
  14. package/build/components/AdminLayout/TabBar.d.ts +13 -0
  15. package/build/components/AdminLayout/TabPane.d.ts +4 -0
  16. package/build/components/AdminLayout/index.d.ts +3 -0
  17. package/build/components/AdminLayout/types.d.ts +42 -0
  18. package/build/components/CouponCard/CouponCard.d.ts +20 -0
  19. package/build/components/CouponCard/index.d.ts +1 -0
  20. package/build/components/OrderForm/OrderForm.d.ts +18 -0
  21. package/build/components/OrderForm/index.d.ts +1 -0
  22. package/build/components/OrderList/OrderList.d.ts +29 -0
  23. package/build/components/OrderList/index.d.ts +1 -0
  24. package/build/components/ProductForm/ProductForm.d.ts +18 -0
  25. package/build/components/ProductForm/index.d.ts +3 -0
  26. package/build/components/ProductList/ProductList.d.ts +47 -0
  27. package/build/components/ProductList/index.d.ts +3 -0
  28. package/build/components/PromotionCard/PromotionCard.d.ts +22 -0
  29. package/build/components/PromotionCard/index.d.ts +1 -0
  30. package/build/components/RoleCard/RoleCard.d.ts +18 -0
  31. package/build/components/RoleCard/index.d.ts +1 -0
  32. package/build/components/UserCard/UserCard.d.ts +17 -0
  33. package/build/components/UserCard/index.d.ts +1 -0
  34. package/build/entry-meta.d.ts +603 -0
  35. package/build/index.css +1 -0
  36. package/build/index.js +1 -0
  37. package/build/mall-components-meta.js +2563 -0
  38. package/build/mall-components.cdn.umd.css +1 -0
  39. package/build/mall-components.cdn.umd.js +8 -0
  40. package/build/mall-components.codesandbox.combined.js +1094 -0
  41. package/build/mall-components.codesandbox.css +401 -0
  42. package/build/mall-components.codesandbox.js +1080 -0
  43. package/build/mall-components.umd.css +1 -0
  44. package/build/mall-components.umd.js +8 -0
  45. package/build/meta/adminLayoutMeta.d.ts +3 -0
  46. package/build/meta/couponCardMeta.d.ts +128 -0
  47. package/build/meta/icons.d.ts +10 -0
  48. package/build/meta/orderFormMeta.d.ts +111 -0
  49. package/build/meta/orderListMeta.d.ts +170 -0
  50. package/build/meta/productFormMeta.d.ts +3 -0
  51. package/build/meta/productListMeta.d.ts +200 -0
  52. package/build/meta/promotionCardMeta.d.ts +129 -0
  53. package/build/meta/roleCardMeta.d.ts +3 -0
  54. package/build/meta/tabPaneMeta.d.ts +3 -0
  55. package/build/meta/userCardMeta.d.ts +3 -0
  56. package/build/meta.d.ts +605 -0
  57. package/build/setters/RestApiTester.d.ts +11 -0
  58. package/build/types/common.d.ts +17 -0
  59. package/build/types/marketing.d.ts +128 -0
  60. package/build/types/order.d.ts +174 -0
  61. package/build/types/permission.d.ts +101 -0
  62. package/build/types/product.d.ts +47 -0
  63. package/package.json +1 -0
  64. package/src/adapters/DataSourceAdapter.ts +445 -0
  65. package/src/components/AdminLayout/AdminLayout.scss +447 -0
  66. package/src/components/AdminLayout/AdminLayout.tsx +681 -0
  67. package/src/components/AdminLayout/Breadcrumb.tsx +60 -0
  68. package/src/components/AdminLayout/MainContent.tsx +54 -0
  69. package/src/components/AdminLayout/Navbar.tsx +76 -0
  70. package/src/components/AdminLayout/Sidebar.tsx +256 -0
  71. package/src/components/AdminLayout/TabBar.tsx +177 -0
  72. package/src/components/AdminLayout/TabPane.tsx +29 -0
  73. package/src/components/AdminLayout/index.ts +3 -0
  74. package/src/components/AdminLayout/types.ts +46 -0
  75. package/src/components/CouponCard/CouponCard.scss +55 -0
  76. package/src/components/CouponCard/CouponCard.tsx +687 -0
  77. package/src/components/CouponCard/index.ts +1 -0
  78. package/src/components/OrderForm/OrderForm.scss +148 -0
  79. package/src/components/OrderForm/OrderForm.tsx +503 -0
  80. package/src/components/OrderForm/index.ts +1 -0
  81. package/src/components/OrderList/OrderList.scss +160 -0
  82. package/src/components/OrderList/OrderList.tsx +885 -0
  83. package/src/components/OrderList/index.ts +1 -0
  84. package/src/components/ProductForm/ProductForm.scss +23 -0
  85. package/src/components/ProductForm/ProductForm.tsx +442 -0
  86. package/src/components/ProductForm/index.ts +3 -0
  87. package/src/components/ProductList/ProductList.scss +293 -0
  88. package/src/components/ProductList/ProductList.tsx +454 -0
  89. package/src/components/ProductList/index.ts +3 -0
  90. package/src/components/PromotionCard/PromotionCard.scss +71 -0
  91. package/src/components/PromotionCard/PromotionCard.tsx +579 -0
  92. package/src/components/PromotionCard/index.ts +1 -0
  93. package/src/components/RoleCard/RoleCard.scss +77 -0
  94. package/src/components/RoleCard/RoleCard.tsx +463 -0
  95. package/src/components/RoleCard/index.ts +1 -0
  96. package/src/components/UserCard/UserCard.scss +51 -0
  97. package/src/components/UserCard/UserCard.tsx +432 -0
  98. package/src/components/UserCard/index.ts +1 -0
  99. package/src/entry-components.ts +39 -0
  100. package/src/entry-meta.ts +23 -0
  101. package/src/index.scss +4 -0
  102. package/src/index.ts +36 -0
  103. package/src/index.tsx +17 -0
  104. package/src/meta/adminLayoutMeta.ts +154 -0
  105. package/src/meta/couponCardMeta.ts +287 -0
  106. package/src/meta/icons.ts +41 -0
  107. package/src/meta/orderFormMeta.ts +279 -0
  108. package/src/meta/orderListMeta.ts +443 -0
  109. package/src/meta/productFormMeta.ts +253 -0
  110. package/src/meta/productListMeta.ts +434 -0
  111. package/src/meta/promotionCardMeta.ts +276 -0
  112. package/src/meta/roleCardMeta.ts +142 -0
  113. package/src/meta/tabPaneMeta.ts +69 -0
  114. package/src/meta/userCardMeta.ts +128 -0
  115. package/src/meta.ts +25 -0
  116. package/src/setters/RestApiTester.tsx +219 -0
  117. package/src/shims/require.js +8 -0
  118. package/src/types/common.ts +19 -0
  119. package/src/types/marketing.ts +124 -0
  120. package/src/types/order.ts +169 -0
  121. package/src/types/permission.ts +102 -0
  122. package/src/types/product.ts +49 -0
@@ -0,0 +1,445 @@
1
+ export type DataSourceType = 'rest' | 'mock' | 'variable'
2
+
3
+ export type DataSourceConfig = {
4
+ type: DataSourceType
5
+ api?: string
6
+ method?: 'GET' | 'POST' | 'PUT' | 'DELETE'
7
+ headers?: Record<string, string>
8
+ mockData?: any
9
+ variableName?: string
10
+ dataSource?: any
11
+ transform?: string
12
+ }
13
+
14
+ export interface DataSourceAdapter {
15
+ fetch(params?: any): Promise<any>
16
+ submit(data: any): Promise<any>
17
+ delete(id: string | number): Promise<any>
18
+ update(id: string | number, data: any): Promise<any>
19
+ }
20
+
21
+ export class DataSourceAdapterFactory {
22
+ static create(config: DataSourceConfig): DataSourceAdapter {
23
+ if (!config) {
24
+ console.warn('[DataSourceAdapterFactory] config is undefined, using mock adapter')
25
+ return new MockDataAdapter({
26
+ type: 'mock',
27
+ mockData: {
28
+ code: 200,
29
+ message: 'success',
30
+ data: {
31
+ pageNum: 1,
32
+ pageSize: 10,
33
+ total: 0,
34
+ list: [],
35
+ },
36
+ },
37
+ })
38
+ }
39
+
40
+ if (!config.type) {
41
+ console.warn('[DataSourceAdapterFactory] config.type is undefined, using mock adapter')
42
+ return new MockDataAdapter({
43
+ type: 'mock',
44
+ mockData: config.mockData || {
45
+ code: 200,
46
+ message: 'success',
47
+ data: {
48
+ pageNum: 1,
49
+ pageSize: 10,
50
+ total: 0,
51
+ list: [],
52
+ },
53
+ },
54
+ })
55
+ }
56
+
57
+ switch (config.type) {
58
+ case 'rest':
59
+ return new RestApiAdapter(config)
60
+ case 'mock':
61
+ return new MockDataAdapter(config)
62
+ case 'variable':
63
+ return new VariableAdapter(config)
64
+ default:
65
+ console.warn(`[DataSourceAdapterFactory] Unsupported data source type: ${config.type}, using mock adapter`)
66
+ return new MockDataAdapter({
67
+ type: 'mock',
68
+ mockData: {
69
+ code: 200,
70
+ message: 'success',
71
+ data: {
72
+ pageNum: 1,
73
+ pageSize: 10,
74
+ total: 0,
75
+ list: [],
76
+ },
77
+ },
78
+ })
79
+ }
80
+ }
81
+ }
82
+
83
+ import type { DataSourceConfig as IDataSourceConfig } from './DataSourceAdapter'
84
+
85
+ export class RestApiAdapter implements DataSourceAdapter {
86
+ private config: IDataSourceConfig
87
+
88
+ constructor(config: IDataSourceConfig) {
89
+ this.config = config
90
+ }
91
+
92
+ async fetch(params?: any): Promise<any> {
93
+ const url = this.buildUrl(params)
94
+ const response = await fetch(url, {
95
+ method: this.config.method || 'GET',
96
+ headers: {
97
+ 'Content-Type': 'application/json',
98
+ ...this.config.headers,
99
+ },
100
+ body: this.config.method !== 'GET' ? JSON.stringify(params) : undefined,
101
+ })
102
+
103
+ if (!response.ok) {
104
+ throw new Error(`HTTP error! status: ${response.status}`)
105
+ }
106
+
107
+ let data = await response.json()
108
+
109
+ if (this.config.transform) {
110
+ try {
111
+ const transformFn = new Function('data', this.config.transform)
112
+ data = transformFn(data)
113
+ } catch (error) {
114
+ console.error('Transform function error:', error)
115
+ }
116
+ }
117
+
118
+ return data
119
+ }
120
+
121
+ async submit(data: any): Promise<any> {
122
+ const response = await fetch(this.config.api!, {
123
+ method: 'POST',
124
+ headers: {
125
+ 'Content-Type': 'application/json',
126
+ ...this.config.headers,
127
+ },
128
+ body: JSON.stringify(data),
129
+ })
130
+
131
+ return response.json()
132
+ }
133
+
134
+ async delete(id: string | number): Promise<any> {
135
+ const response = await fetch(`${this.config.api}/${id}`, {
136
+ method: 'DELETE',
137
+ headers: this.config.headers,
138
+ })
139
+
140
+ return response.json()
141
+ }
142
+
143
+ async update(id: string | number, data: any): Promise<any> {
144
+ const response = await fetch(`${this.config.api}/${id}`, {
145
+ method: 'PUT',
146
+ headers: {
147
+ 'Content-Type': 'application/json',
148
+ ...this.config.headers,
149
+ },
150
+ body: JSON.stringify(data),
151
+ })
152
+
153
+ return response.json()
154
+ }
155
+
156
+ private buildUrl(params?: any): string {
157
+ if (!params || this.config.method !== 'GET') {
158
+ return this.config.api!
159
+ }
160
+
161
+ const url = new URL(this.config.api!, window.location.origin)
162
+ Object.keys(params).forEach(key => {
163
+ if (params[key] !== undefined && params[key] !== null && params[key] !== '') {
164
+ url.searchParams.append(key, params[key])
165
+ }
166
+ })
167
+
168
+ return url.toString()
169
+ }
170
+ }
171
+
172
+ export class MockDataAdapter implements DataSourceAdapter {
173
+ private config: IDataSourceConfig
174
+
175
+ constructor(config: IDataSourceConfig) {
176
+ this.config = config
177
+ }
178
+
179
+ async fetch(params?: any): Promise<any> {
180
+ console.log('[MockDataAdapter] fetch 被调用,config:', this.config, 'params:', params)
181
+ await new Promise(resolve => setTimeout(resolve, 300))
182
+
183
+ let data = this.config.mockData
184
+ console.log('[MockDataAdapter] 原始 mockData:', data, '类型:', typeof data)
185
+
186
+ if (!data || data === '') {
187
+ console.log('[MockDataAdapter] mockData 为空,使用默认数据')
188
+ data = {
189
+ code: 200,
190
+ message: 'success',
191
+ data: {
192
+ pageNum: 1,
193
+ pageSize: 10,
194
+ total: 50,
195
+ list: [
196
+ {
197
+ id: 1,
198
+ name: '时尚运动鞋',
199
+ productSn: 'PRODUCT001',
200
+ price: 269,
201
+ stock: 100,
202
+ sale: 120,
203
+ brandName: '时尚运动',
204
+ productCategoryName: '鞋子',
205
+ pic: 'https://img.yzcdn.cn/vant/cat.jpeg',
206
+ publishStatus: 1,
207
+ newStatus: 1,
208
+ recommandStatus: 1,
209
+ verifyStatus: 1,
210
+ },
211
+ {
212
+ id: 2,
213
+ name: '休闲T恤',
214
+ productSn: 'PRODUCT002',
215
+ price: 99,
216
+ stock: 200,
217
+ sale: 350,
218
+ brandName: '休闲服饰',
219
+ productCategoryName: '衣服',
220
+ pic: 'https://img.yzcdn.cn/vant/cat.jpeg',
221
+ publishStatus: 1,
222
+ newStatus: 1,
223
+ recommandStatus: 0,
224
+ verifyStatus: 1,
225
+ },
226
+ {
227
+ id: 3,
228
+ name: '双肩背包',
229
+ productSn: 'PRODUCT003',
230
+ price: 189,
231
+ stock: 80,
232
+ sale: 80,
233
+ brandName: '旅行箱包',
234
+ productCategoryName: '配饰',
235
+ pic: 'https://img.yzcdn.cn/vant/cat.jpeg',
236
+ publishStatus: 1,
237
+ newStatus: 0,
238
+ recommandStatus: 1,
239
+ verifyStatus: 1,
240
+ },
241
+ {
242
+ id: 4,
243
+ name: '运动手表',
244
+ productSn: 'PRODUCT004',
245
+ price: 499,
246
+ stock: 50,
247
+ sale: 60,
248
+ brandName: '智能数码',
249
+ productCategoryName: '数码',
250
+ pic: 'https://img.yzcdn.cn/vant/cat.jpeg',
251
+ publishStatus: 1,
252
+ newStatus: 1,
253
+ recommandStatus: 1,
254
+ verifyStatus: 1,
255
+ },
256
+ {
257
+ id: 5,
258
+ name: '牛仔裤',
259
+ productSn: 'PRODUCT005',
260
+ price: 199,
261
+ stock: 150,
262
+ sale: 280,
263
+ brandName: '时尚牛仔',
264
+ productCategoryName: '衣服',
265
+ pic: 'https://img.yzcdn.cn/vant/cat.jpeg',
266
+ publishStatus: 1,
267
+ newStatus: 0,
268
+ recommandStatus: 0,
269
+ verifyStatus: 1,
270
+ },
271
+ ],
272
+ },
273
+ }
274
+ } else {
275
+ try {
276
+ if (typeof data === 'string') {
277
+ data = JSON.parse(data)
278
+ }
279
+ console.log('[MockDataAdapter] JSON 解析后的数据:', data)
280
+ } catch (error) {
281
+ console.error('[MockDataAdapter] JSON 解析失败:', error)
282
+ data = {
283
+ code: 200,
284
+ message: 'success',
285
+ data: {
286
+ pageNum: 1,
287
+ pageSize: 10,
288
+ total: 0,
289
+ list: [],
290
+ },
291
+ }
292
+ }
293
+ }
294
+
295
+ if (this.config.transform) {
296
+ try {
297
+ const transformFn = new Function('data', this.config.transform)
298
+ data = transformFn(data)
299
+ } catch (error) {
300
+ console.error('Transform function error:', error)
301
+ }
302
+ }
303
+
304
+ console.log('[MockDataAdapter] 最终返回数据:', data)
305
+
306
+ if (params?.pageNum && params?.pageSize && data?.data?.list) {
307
+ const start = (params.pageNum - 1) * params.pageSize
308
+ const end = start + params.pageSize
309
+ return {
310
+ ...data,
311
+ data: {
312
+ ...data.data,
313
+ list: data.data.list.slice(start, end),
314
+ },
315
+ }
316
+ }
317
+
318
+ return data
319
+ }
320
+
321
+ async submit(data: any): Promise<any> {
322
+ await new Promise(resolve => setTimeout(resolve, 300))
323
+ return { code: 200, message: 'success', data }
324
+ }
325
+
326
+ async delete(id: string | number): Promise<any> {
327
+ await new Promise(resolve => setTimeout(resolve, 300))
328
+ return { code: 200, message: 'success' }
329
+ }
330
+
331
+ async update(id: string | number, data: any): Promise<any> {
332
+ await new Promise(resolve => setTimeout(resolve, 300))
333
+ return { code: 200, message: 'success', data }
334
+ }
335
+ }
336
+
337
+ export class VariableAdapter implements DataSourceAdapter {
338
+ private config: IDataSourceConfig
339
+
340
+ constructor(config: IDataSourceConfig) {
341
+ this.config = config
342
+ }
343
+
344
+ async fetch(params?: any): Promise<any> {
345
+ console.log('[VariableAdapter] fetch 被调用,config:', {
346
+ variableName: this.config.variableName,
347
+ dataSource: this.config.dataSource
348
+ })
349
+
350
+ if (this.config.dataSource !== undefined && this.config.dataSource !== null) {
351
+ console.log('[VariableAdapter] 使用 dataSource:', this.config.dataSource)
352
+ let data = this.config.dataSource
353
+
354
+ if (typeof data === 'string') {
355
+ try {
356
+ data = JSON.parse(data)
357
+ } catch (e) {
358
+ console.error('[VariableAdapter] dataSource JSON 解析失败:', e)
359
+ }
360
+ }
361
+
362
+ if (data && typeof data === 'object') {
363
+ if (data.code === 200 && data.data) {
364
+ return data
365
+ }
366
+ if (data.list || Array.isArray(data)) {
367
+ return {
368
+ code: 200,
369
+ message: 'success',
370
+ data: {
371
+ pageNum: 1,
372
+ pageSize: 10,
373
+ total: Array.isArray(data) ? data.length : (data.total || 0),
374
+ list: Array.isArray(data) ? data : (data.list || []),
375
+ }
376
+ }
377
+ }
378
+ return { code: 200, message: 'success', data: data }
379
+ }
380
+
381
+ return {
382
+ code: 200,
383
+ message: 'success',
384
+ data: {
385
+ pageNum: 1,
386
+ pageSize: 10,
387
+ total: 0,
388
+ list: [],
389
+ }
390
+ }
391
+ }
392
+
393
+ const variableName = this.config.variableName
394
+ if (!variableName) {
395
+ console.warn('[VariableAdapter] variableName 和 dataSource 都为空,返回空数据')
396
+ return {
397
+ code: 200,
398
+ message: 'success',
399
+ data: {
400
+ pageNum: 1,
401
+ pageSize: 10,
402
+ total: 0,
403
+ list: [],
404
+ }
405
+ }
406
+ }
407
+
408
+ const value = (window as any)[variableName]
409
+ console.log('[VariableAdapter] 从 window 获取的值:', value)
410
+
411
+ if (value === undefined || value === null) {
412
+ console.warn('[VariableAdapter] 变量不存在,返回空数据')
413
+ return {
414
+ code: 200,
415
+ message: 'success',
416
+ data: {
417
+ pageNum: 1,
418
+ pageSize: 10,
419
+ total: 0,
420
+ list: [],
421
+ }
422
+ }
423
+ }
424
+
425
+ return { code: 200, message: 'success', data: value }
426
+ }
427
+
428
+ async submit(data: any): Promise<any> {
429
+ const variableName = this.config.variableName
430
+ if (!variableName) {
431
+ throw new Error('Variable name is required for variable adapter')
432
+ }
433
+
434
+ (window as any)[variableName] = data
435
+ return { code: 200, message: 'success', data }
436
+ }
437
+
438
+ async delete(id: string | number): Promise<any> {
439
+ return { code: 200, message: 'success' }
440
+ }
441
+
442
+ async update(id: string | number, data: any): Promise<any> {
443
+ return this.submit(data)
444
+ }
445
+ }