From 48a78137c534b69927bfa82f149de346ad368aa5 Mon Sep 17 00:00:00 2001 From: wurenzhi Date: Fri, 20 Mar 2026 09:43:50 +0800 Subject: [PATCH] =?UTF-8?q?refactor(terminology):=20=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E6=9C=AF=E8=AF=AD=E6=A0=87=E5=87=86=E5=B9=B6=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=B1=BB=E5=9E=8B=E5=AE=89=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将B2B统一为TOB术语 - 将状态值统一为大写格式 - 优化类型声明,避免使用any - 将float类型替换为decimal以提高精度 - 新增术语标准化文档 - 优化路由结构和菜单分类 - 添加TypeORM实体类 - 增强加密模块安全性 - 重构前端路由结构 - 完善任务模板和验收标准 --- client/src/components/MenuComponent.tsx | 30 +- client/src/routes/index.tsx | 20 +- client/src/services/ApiService.ts | 73 +- dashboard/src/.umi/appData.json | 349 ++- dashboard/src/pages/Pricing.tsx | 2 +- .../crossBorderIntegrationDataSource.ts | 191 ++ .../omnichannelCommunicationDataSource.ts | 128 ++ .../omnichannelMarketingDataSource.ts | 137 ++ dashboard/src/services/orderDataSource.ts | 2 +- .../src/services/storeCreationDataSource.ts | 295 +++ .../services/unifiedFulfillmentDataSource.ts | 153 ++ dashboard/src/services/userDataSource.ts | 2 +- docs/00_Business/Business_Blueprint.md | 125 +- docs/00_Business/Business_ClosedLoops.md | 92 +- .../Business_ClosedLoops/01_Product.md | 39 + .../Business_ClosedLoops/02_Order.md | 44 + .../Business_ClosedLoops/03_Marketing.md | 45 + .../{07_B2BTrade.md => 07_TOBTrade.md} | 12 +- .../Business_ClosedLoops/09_Platform.md | 97 + docs/00_Business/Governance_Standards.md | 2 +- docs/00_Business/TASKS_IMPROVEMENT_PLAN.md | 249 ++ docs/00_Business/Task_Overview.md | 14 + docs/00_Business/tasks/TEMPLATE.md | 67 + docs/00_Business/tasks/backend/01_product.md | 41 +- docs/00_Business/tasks/backend/03_order.md | 54 +- docs/00_Business/tasks/backend/04_finance.md | 103 +- .../00_Business/tasks/backend/05_inventory.md | 103 +- docs/00_Business/tasks/backend/06_user.md | 80 +- .../tasks/backend/07_governance.md | 101 +- .../tasks/backend/08_advertisement.md | 124 +- .../tasks/backend/09_after_sales.md | 104 +- docs/00_Business/tasks/backend/10_b2b.md | 10 +- .../tasks/backend/11_compliance.md | 101 +- .../00_Business/tasks/backend/12_logistics.md | 103 +- .../tasks/backend/13_user_asset.md | 100 +- docs/00_Business/tasks/backend/14_ab_test.md | 101 +- docs/00_Business/tasks/backend/15_auth.md | 111 +- docs/00_Business/tasks/backend/16_merchant.md | 152 +- .../tasks/backend/17_cross_border.md | 24 +- .../tasks/backend/20_core_service.md | 16 +- .../tasks/backend/21_customer_service.md | 25 +- .../tasks/backend/25_store_creation.md | 41 + docs/00_Business/tasks/backend/26_settings.md | 126 ++ .../tasks/backend/27_code_review_fixes.md | 196 ++ .../tasks/backend/28_document_fixes.md | 143 ++ docs/00_Business/tasks/frontend/01_product.md | 41 +- docs/00_Business/tasks/frontend/02_order.md | 35 +- .../tasks/frontend/03_marketing.md | 39 +- .../tasks/frontend/04_after_sales.md | 33 +- docs/00_Business/tasks/frontend/05_b2b.md | 33 +- docs/00_Business/tasks/frontend/06_asset.md | 35 +- docs/00_Business/tasks/frontend/07_finance.md | 35 +- docs/00_Business/tasks/frontend/08_report.md | 35 +- .../tasks/frontend/09_permission.md | 35 +- docs/00_Business/tasks/frontend/10_feature.md | 35 +- .../tasks/frontend/11_compliance.md | 35 +- .../tasks/frontend/12_logistics.md | 35 +- .../tasks/frontend/13_code_review_fixes.md | 177 ++ .../tasks/shared/01_plugin_collection.md | 47 +- .../tasks/shared/02_plugin_automation.md | 47 +- .../tasks/shared/03_plugin_after_sales.md | 40 +- .../tasks/shared/04_plugin_logistics.md | 40 +- .../tasks/shared/05_plugin_advertisement.md | 40 +- .../00_Business/tasks/shared/06_plugin_b2b.md | 40 +- .../tasks/shared/07_ai_analysis.md | 46 +- .../tasks/shared/08_ai_decision.md | 41 +- .../tasks/shared/09_ai_advertisement.md | 45 +- docs/00_Business/tasks/shared/10_ai_b2b.md | 49 +- .../tasks/shared/11_ai_user_asset.md | 40 +- .../00_Business/tasks/shared/12_ai_ab_test.md | 40 +- .../tasks/shared/13_ai_merchant.md | 45 +- docs/01_Architecture/00_Architecture_Index.md | 34 +- docs/01_Architecture/01_System.md | 16 +- docs/01_Architecture/06_State_Machine.md | 116 +- docs/01_Architecture/07_SEMANTIC_HUB.md | 5 +- docs/01_Architecture/12_Operation_Agent.md | 66 +- docs/02_Backend/00_Backend_Index.md | 25 +- docs/02_Backend/api/00_API_Index.md | 2 +- docs/05_AI/00_AI_Index.md | 1 - docs/05_AI/03_Implementation_Strategy.md | 252 +++ docs/05_AI/03_Module_List.md | 173 -- docs/06_Reports/00_Reports_Index.md | 2 +- docs/06_Reports/03_Development_Progress.md | 42 +- docs/06_Reports/04_Temporary.md | 146 -- docs/06_Reports/05_Optimization_Report.md | 135 ++ .../05_Terminology_Standardization_Report.md | 326 +++ .../Code_Review_Fix_Summary_2026-03-20.md | 175 ++ .../Code_Review_Report_2026-03-20.md | 346 +++ docs/06_Reports/Document_Review_Report.md | 170 ++ docs/10_Documents_Global/DOC_INDEX.md | 3 +- .../TERMINOLOGY_STANDARDS.md | 335 +++ package-lock.json | 1996 ++++++++++------- server/package.json | 7 + .../api/controllers/OmnichannelController.ts | 776 +++++++ .../src/api/controllers/ProductController.ts | 145 ++ .../src/api/controllers/SettingsController.ts | 791 +++++++ server/src/api/dto/StoreBindingDto.ts | 14 - server/src/api/routes/omnichannel.ts | 284 +++ server/src/api/routes/product.ts | 11 + server/src/api/routes/settings.ts | 355 +++ server/src/core/engine/CoreEngineService.ts | 11 +- .../src/core/governance/DeveloperPlatform.ts | 2 +- .../core/operation/OperationAgentService.ts | 350 +-- .../core/runtime/LegacyTableInitializer.ts | 4 +- .../src/domains/Arbitrage/ArbitrageService.ts | 6 +- .../domains/Billing/SLAGovernanceService.ts | 2 +- .../Finance/CommodityHedgingService.ts | 2 +- .../Finance/SovereignWealthFundService.ts | 8 +- .../Logistics/RouteOptimizerService.ts | 2 +- .../domains/Marketing/ArbitrageAGIService.ts | 4 +- .../domains/Trade/SovereignCarbonService.ts | 6 +- server/src/entities/Store.ts | 49 + server/src/services/AIService.ts | 50 +- server/src/services/CostTemplateService.ts | 152 ++ .../services/CrossBorderIntegrationService.ts | 313 +++ server/src/services/FXHedgingService.ts | 2 +- server/src/services/IndependentSiteService.ts | 238 ++ server/src/services/InventoryService.ts | 25 + server/src/services/MicroCreditService.ts | 8 +- .../services/MultiPlatformProductService.ts | 358 +++ .../OmnichannelCommunicationService.ts | 308 +++ .../services/OmnichannelMarketingService.ts | 289 +++ server/src/services/PlatformAccountService.ts | 216 ++ server/src/services/ProductService.ts | 2 +- server/src/services/ReturnService.ts | 256 +++ server/src/services/StoreCreationService.ts | 456 ++++ server/src/services/TaskCenterService.ts | 190 ++ server/src/services/TaxReportService.ts | 4 +- .../src/services/UnifiedFulfillmentService.ts | 345 +++ server/src/services/WinNodeService.ts | 193 ++ server/src/utils/VaultCrypto.ts | 12 +- server/tsconfig.json | 5 +- 132 files changed, 13767 insertions(+), 2140 deletions(-) create mode 100644 dashboard/src/services/crossBorderIntegrationDataSource.ts create mode 100644 dashboard/src/services/omnichannelCommunicationDataSource.ts create mode 100644 dashboard/src/services/omnichannelMarketingDataSource.ts create mode 100644 dashboard/src/services/storeCreationDataSource.ts create mode 100644 dashboard/src/services/unifiedFulfillmentDataSource.ts rename docs/00_Business/Business_ClosedLoops/{07_B2BTrade.md => 07_TOBTrade.md} (62%) create mode 100644 docs/00_Business/TASKS_IMPROVEMENT_PLAN.md create mode 100644 docs/00_Business/tasks/TEMPLATE.md create mode 100644 docs/00_Business/tasks/backend/25_store_creation.md create mode 100644 docs/00_Business/tasks/backend/26_settings.md create mode 100644 docs/00_Business/tasks/backend/27_code_review_fixes.md create mode 100644 docs/00_Business/tasks/backend/28_document_fixes.md create mode 100644 docs/00_Business/tasks/frontend/13_code_review_fixes.md create mode 100644 docs/05_AI/03_Implementation_Strategy.md delete mode 100644 docs/05_AI/03_Module_List.md delete mode 100644 docs/06_Reports/04_Temporary.md create mode 100644 docs/06_Reports/05_Optimization_Report.md create mode 100644 docs/06_Reports/05_Terminology_Standardization_Report.md create mode 100644 docs/06_Reports/Code_Review_Fix_Summary_2026-03-20.md create mode 100644 docs/06_Reports/Code_Review_Report_2026-03-20.md create mode 100644 docs/06_Reports/Document_Review_Report.md create mode 100644 docs/10_Documents_Global/TERMINOLOGY_STANDARDS.md create mode 100644 server/src/api/controllers/OmnichannelController.ts create mode 100644 server/src/api/controllers/SettingsController.ts create mode 100644 server/src/api/routes/omnichannel.ts create mode 100644 server/src/api/routes/settings.ts create mode 100644 server/src/entities/Store.ts create mode 100644 server/src/services/CostTemplateService.ts create mode 100644 server/src/services/CrossBorderIntegrationService.ts create mode 100644 server/src/services/IndependentSiteService.ts create mode 100644 server/src/services/MultiPlatformProductService.ts create mode 100644 server/src/services/OmnichannelCommunicationService.ts create mode 100644 server/src/services/OmnichannelMarketingService.ts create mode 100644 server/src/services/PlatformAccountService.ts create mode 100644 server/src/services/ReturnService.ts create mode 100644 server/src/services/StoreCreationService.ts create mode 100644 server/src/services/TaskCenterService.ts create mode 100644 server/src/services/UnifiedFulfillmentService.ts create mode 100644 server/src/services/WinNodeService.ts diff --git a/client/src/components/MenuComponent.tsx b/client/src/components/MenuComponent.tsx index ad6fa25..eeef7f0 100644 --- a/client/src/components/MenuComponent.tsx +++ b/client/src/components/MenuComponent.tsx @@ -25,34 +25,39 @@ const MenuComponent: React.FC = () => { label: Dashboard, }, { - key: '/product', + key: '/products', icon: , - label: Product, + label: Products, }, { key: '/orders', icon: , label: Orders, }, - { - key: '/ad', - icon: , - label: Ad, - }, { key: '/inventory', icon: , label: Inventory, }, + { + key: '/finance', + icon: , + label: Finance, + }, + { + key: '/marketing/ads', + icon: , + label: Ads, + }, { key: '/b2b', icon: , label: B2B, }, { - key: '/finance', - icon: , - label: Finance, + key: '/independent-sites', + icon: , + label: Independent Sites, }, { key: '/compliance', @@ -64,11 +69,6 @@ const MenuComponent: React.FC = () => { icon: , label: Settings, }, - { - key: '/independent-site', - icon: , - label: Independent Site, - }, ]; return ( diff --git a/client/src/routes/index.tsx b/client/src/routes/index.tsx index a354b05..12aa532 100644 --- a/client/src/routes/index.tsx +++ b/client/src/routes/index.tsx @@ -16,18 +16,30 @@ const AppRoutes: React.FC = () => { return ( + {/* 根路径重定向到仪表板 */} } /> + + {/* 主布局路由 */} }> + {/* 核心功能路由 */} } /> - } /> + } /> } /> - } /> } /> - } /> } /> + + {/* 营销相关路由 */} + } /> + + {/* B2B相关路由 */} + } /> + + {/* 独立站相关路由 */} + } /> + + {/* 合规与设置路由 */} } /> } /> - } /> diff --git a/client/src/services/ApiService.ts b/client/src/services/ApiService.ts index f33564c..1b84ad1 100644 --- a/client/src/services/ApiService.ts +++ b/client/src/services/ApiService.ts @@ -1,5 +1,9 @@ import axios from 'axios'; +// 请求缓存 +const requestCache = new Map(); +const CACHE_DURATION = 5 * 60 * 1000; // 5分钟缓存 + // 创建axios实例 const api = axios.create({ baseURL: 'http://localhost:3000/api', // 后端API基础URL @@ -23,6 +27,14 @@ api.interceptors.request.use( // 响应拦截器 api.interceptors.response.use( (response) => { + // 缓存GET请求的响应 + if (response.config.method === 'get') { + const cacheKey = `${response.config.url}${JSON.stringify(response.config.params)}`; + requestCache.set(cacheKey, { + data: response.data, + timestamp: Date.now() + }); + } return response.data; }, (error) => { @@ -32,13 +44,45 @@ api.interceptors.response.use( } ); +// 带缓存的GET请求 +const cachedGet = async (url: string, params?: any) => { + const cacheKey = `${url}${JSON.stringify(params)}`; + const cachedItem = requestCache.get(cacheKey); + + if (cachedItem && (Date.now() - cachedItem.timestamp) < CACHE_DURATION) { + return cachedItem.data; + } + + const response = await api.get(url, { params }); + return response; +}; + +// 批量请求处理 +const batchRequest = async (requests: Array<{ url: string; method: string; data?: any; params?: any }>) => { + try { + const responses = await Promise.all( + requests.map(request => { + if (request.method === 'get') { + return cachedGet(request.url, request.params); + } else { + return api[request.method as keyof typeof api](request.url, request.data, { params: request.params }); + } + }) + ); + return responses; + } catch (error) { + console.error('Batch request failed:', error); + throw error; + } +}; + // 商品相关API export const productApi = { // 获取商品列表 - getProducts: (params?: any) => api.get('/products', { params }), + getProducts: (params?: any) => cachedGet('/products', params), // 获取商品详情 - getProduct: (id: string) => api.get(`/products/${id}`), + getProduct: (id: string) => cachedGet(`/products/${id}`), // 创建商品 createProduct: (data: any) => api.post('/products', data), @@ -50,34 +94,51 @@ export const productApi = { updatePrice: (id: string, price: number) => api.patch(`/products/${id}/price`, { price }), // AI定价 - getAiPricing: (id: string) => api.get(`/products/${id}/ai-pricing`), + getAiPricing: (id: string) => cachedGet(`/products/${id}/ai-pricing`), // 上下架商品 toggleStatus: (id: string) => api.patch(`/products/${id}/status`), // 批量操作 batchUpdate: (ids: string[], data: any) => api.post('/products/batch', { ids, data }), + + // 批量获取商品详情 + batchGetProducts: (ids: string[]) => batchRequest( + ids.map(id => ({ url: `/products/${id}`, method: 'get' })) + ), }; // 订单相关API export const orderApi = { // 获取订单列表 - getOrders: (params?: any) => api.get('/orders', { params }), + getOrders: (params?: any) => cachedGet('/orders', params), // 获取订单详情 - getOrder: (id: string) => api.get(`/orders/${id}`), + getOrder: (id: string) => cachedGet(`/orders/${id}`), // 更新订单状态 updateStatus: (id: string, status: string) => api.patch(`/orders/${id}/status`, { status }), // 处理订单 processOrder: (id: string, data: any) => api.post(`/orders/${id}/process`, data), + + // 批量获取订单详情 + batchGetOrders: (ids: string[]) => batchRequest( + ids.map(id => ({ url: `/orders/${id}`, method: 'get' })) + ), }; // Dashboard相关API export const dashboardApi = { // 获取Dashboard数据 - getDashboardData: (params?: any) => api.get('/dashboard', { params }), + getDashboardData: (params?: any) => cachedGet('/dashboard', params), +}; + +// 导出批量请求函数 +export const apiUtils = { + batchRequest, + cachedGet, + clearCache: () => requestCache.clear(), }; export default api; \ No newline at end of file diff --git a/dashboard/src/.umi/appData.json b/dashboard/src/.umi/appData.json index b71db78..b1f85b5 100644 --- a/dashboard/src/.umi/appData.json +++ b/dashboard/src/.umi/appData.json @@ -58,7 +58,7 @@ "config": {}, "time": { "hooks": {}, - "register": 16 + "register": 24 }, "enableBy": "register" }, @@ -75,7 +75,7 @@ 0 ] }, - "register": 5 + "register": 11 }, "enableBy": "register" }, @@ -89,10 +89,10 @@ "time": { "hooks": { "onStart": [ - 3 + 5 ] }, - "register": 4 + "register": 3 }, "enableBy": "register" }, @@ -106,9 +106,6 @@ "time": { "hooks": { "modifyRoutes": [ - 0, - 0, - 0, 0, 0, 0, @@ -129,19 +126,15 @@ "time": { "hooks": { "onDevCompileDone": [ - 23, - 8, + 20, 2, - 3, - 3, - 2, - 6, - 3, 4, - 11 + 2, + 10, + 4 ] }, - "register": 3 + "register": 2 }, "enableBy": "register" }, @@ -155,19 +148,16 @@ "time": { "hooks": { "modifyAppData": [ - 16 + 21 ], "onGenerateFiles": [ - 2, 7, 8, 7, - 8, - 9, - 7 + 8 ] }, - "register": 31 + "register": 27 }, "enableBy": "register" }, @@ -184,9 +174,6 @@ 0, 0, 0, - 0, - 0, - 1, 0 ] }, @@ -207,7 +194,7 @@ 0 ], "onCheck": [ - 0 + 1 ], "onPrepareBuildSuccess": [ 0, @@ -216,53 +203,30 @@ 0, 0, 0, - 1, 0, - 0 + 1 ], "onCheckCode": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, 0, 0, 0, 1, 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, 0 ] }, - "register": 2 + "register": 1 }, "enableBy": "register" }, @@ -309,7 +273,7 @@ 0 ] }, - "register": 15 + "register": 10 }, "enableBy": "register" }, @@ -1175,10 +1139,10 @@ "time": { "hooks": { "onStart": [ - 0 + 1 ] }, - "register": 3 + "register": 1 }, "enableBy": "register" }, @@ -1192,10 +1156,10 @@ "time": { "hooks": { "addBeforeMiddlewares": [ - 12 + 11 ] }, - "register": 2 + "register": 1 }, "enableBy": "register" }, @@ -1208,7 +1172,7 @@ "config": {}, "time": { "hooks": {}, - "register": 97 + "register": 99 }, "enableBy": "register" }, @@ -1221,7 +1185,7 @@ "config": {}, "time": { "hooks": {}, - "register": 46 + "register": 57 }, "enableBy": "config" }, @@ -1234,7 +1198,7 @@ "config": {}, "time": { "hooks": {}, - "register": 22 + "register": 26 }, "enableBy": "config" }, @@ -1254,10 +1218,6 @@ 0 ], "modifyHTMLFavicon": [ - 1, - 0, - 0, - 0, 0, 0, 0, @@ -1293,18 +1253,12 @@ "time": { "hooks": { "onGenerateFiles": [ - 2, + 7, 1, - 0, 1, - 2, - 2, - 2 + 0 ], "addRuntimePlugin": [ - 0, - 0, - 0, 0, 0, 0, @@ -1324,7 +1278,7 @@ "config": {}, "time": { "hooks": {}, - "register": 2 + "register": 3 }, "enableBy": "config" }, @@ -1338,13 +1292,13 @@ "time": { "hooks": { "onStart": [ - 1 + 2 ], "addBeforeMiddlewares": [ 5 ] }, - "register": 45 + "register": 43 } }, "./node_modules/@umijs/preset-umi/dist/features/mpa/mpa": { @@ -1369,7 +1323,7 @@ "config": {}, "time": { "hooks": {}, - "register": 2 + "register": 1 } }, "./node_modules/@umijs/preset-umi/dist/features/overrides/overrides": { @@ -1382,10 +1336,7 @@ "time": { "hooks": { "onGenerateFiles": [ - 0, - 0, - 0, - 0, + 1, 0, 0, 0 @@ -1393,13 +1344,7 @@ "addEntryImports": [ 0, 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, + 1, 0, 0, 0, @@ -1420,7 +1365,7 @@ "config": {}, "time": { "hooks": {}, - "register": 2 + "register": 1 }, "enableBy": "config" }, @@ -1434,24 +1379,15 @@ "time": { "hooks": { "modifyConfig": [ - 1 + 0 ], "onGenerateFiles": [ - 180, - 57, + 141, + 38, 31, - 29, - 22, - 25, - 26 + 22 ], "addPolyfillImports": [ - 0, - 0, - 0, - 0, - 0, - 0, 0, 0, 0, @@ -1475,12 +1411,6 @@ "time": { "hooks": { "addPolyfillImports": [ - 0, - 0, - 0, - 0, - 0, - 0, 0, 0, 0, @@ -1505,16 +1435,13 @@ "time": { "hooks": { "onGenerateFiles": [ - 147, - 0, - 0, - 0, + 137, 0, 0, 0 ] }, - "register": 3 + "register": 2 }, "enableBy": "register" }, @@ -1527,7 +1454,7 @@ "config": {}, "time": { "hooks": {}, - "register": 1 + "register": 0 }, "enableBy": "config" }, @@ -1555,18 +1482,15 @@ "hooks": { "onGenerateFiles": [ 1, - 1, - 0, 0, 1, - 0, 1 ], "addBeforeMiddlewares": [ 0 ] }, - "register": 2 + "register": 1 }, "enableBy": "register" }, @@ -1580,23 +1504,17 @@ "time": { "hooks": { "onGenerateFiles": [ - 19, - 5, - 13, - 2, - 12, - 1, - 8, - 1, - 8, - 1, - 8, + 28, + 4, + 15, + 3, + 18, 2, 8, - 1 + 2 ] }, - "register": 9 + "register": 7 }, "enableBy": "register" }, @@ -1634,7 +1552,7 @@ "config": {}, "time": { "hooks": {}, - "register": 6 + "register": 4 }, "enableBy": "config" }, @@ -1648,16 +1566,13 @@ "time": { "hooks": { "onGenerateFiles": [ - 594, - 30, - 9, - 13, - 7, - 14, + 720, + 11, + 11, 8 ] }, - "register": 5 + "register": 4 }, "enableBy": "register" }, @@ -1674,7 +1589,7 @@ 0 ] }, - "register": 6 + "register": 5 }, "enableBy": "register" }, @@ -1687,7 +1602,7 @@ "config": {}, "time": { "hooks": {}, - "register": 7 + "register": 4 }, "enableBy": "config" }, @@ -1713,7 +1628,7 @@ "config": {}, "time": { "hooks": {}, - "register": 11 + "register": 9 } }, "./node_modules/@umijs/preset-umi/dist/features/monorepo/redirect": { @@ -1725,7 +1640,7 @@ "config": {}, "time": { "hooks": {}, - "register": 34 + "register": 28 }, "enableBy": "config" }, @@ -1739,16 +1654,13 @@ "time": { "hooks": { "onGenerateFiles": [ - 3, + 2, 1, 1, - 1, - 1, - 1, - 1 + 0 ] }, - "register": 3 + "register": 2 } }, "./node_modules/@umijs/preset-umi/dist/features/clickToComponent/clickToComponent": { @@ -1773,7 +1685,7 @@ "config": {}, "time": { "hooks": {}, - "register": 3 + "register": 2 }, "enableBy": "config" }, @@ -1786,7 +1698,7 @@ "config": {}, "time": { "hooks": {}, - "register": 0 + "register": 1 }, "enableBy": "config" }, @@ -1815,7 +1727,7 @@ 0 ] }, - "register": 1 + "register": 0 }, "enableBy": "register" }, @@ -1853,7 +1765,7 @@ "config": {}, "time": { "hooks": {}, - "register": 3 + "register": 1 } }, "./node_modules/@umijs/preset-umi/dist/features/hmrGuardian/hmrGuardian": { @@ -1865,7 +1777,7 @@ "config": {}, "time": { "hooks": {}, - "register": 4 + "register": 3 } }, "./node_modules/@umijs/preset-umi/dist/features/routePreloadOnLoad/routePreloadOnLoad": { @@ -1878,28 +1790,24 @@ "time": { "hooks": { "addHTMLHeadScripts": [ - 3, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 2, 1, 0, 0, 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, 0 ] }, @@ -1915,7 +1823,7 @@ "config": {}, "time": { "hooks": {}, - "register": 1 + "register": 2 }, "enableBy": "config" }, @@ -1929,10 +1837,10 @@ "time": { "hooks": { "modifyUniBundler": [ - 857 + 784 ] }, - "register": 2 + "register": 3 }, "enableBy": "register" }, @@ -1945,7 +1853,7 @@ "config": {}, "time": { "hooks": {}, - "register": 8 + "register": 6 }, "enableBy": "register" }, @@ -1958,7 +1866,7 @@ "config": {}, "time": { "hooks": {}, - "register": 38 + "register": 47 }, "enableBy": "register" }, @@ -1972,10 +1880,10 @@ "time": { "hooks": { "modifyAppData": [ - 14 + 19 ] }, - "register": 47 + "register": 78 } }, "./node_modules/@umijs/preset-umi/dist/commands/help": { @@ -2000,7 +1908,7 @@ "config": {}, "time": { "hooks": {}, - "register": 0 + "register": 1 }, "enableBy": "register" }, @@ -2013,7 +1921,7 @@ "config": {}, "time": { "hooks": {}, - "register": 2 + "register": 1 }, "enableBy": "register" }, @@ -2039,7 +1947,7 @@ "config": {}, "time": { "hooks": {}, - "register": 0 + "register": 1 }, "enableBy": "register" }, @@ -2078,7 +1986,7 @@ "config": {}, "time": { "hooks": {}, - "register": 1 + "register": 2 }, "enableBy": "register" }, @@ -2143,7 +2051,7 @@ "config": {}, "time": { "hooks": {}, - "register": 0 + "register": 1 }, "enableBy": "register" }, @@ -2195,7 +2103,7 @@ "config": {}, "time": { "hooks": {}, - "register": 1 + "register": 0 }, "enableBy": "register" }, @@ -2208,7 +2116,7 @@ "config": {}, "time": { "hooks": {}, - "register": 1 + "register": 2 }, "enableBy": "register" }, @@ -2221,7 +2129,7 @@ "config": {}, "time": { "hooks": {}, - "register": 26 + "register": 29 }, "enableBy": "register" }, @@ -2234,7 +2142,7 @@ "config": {}, "time": { "hooks": {}, - "register": 1 + "register": 2 }, "enableBy": "register" }, @@ -2247,7 +2155,7 @@ "config": {}, "time": { "hooks": {}, - "register": 3 + "register": 4 }, "enableBy": "register" }, @@ -2459,7 +2367,7 @@ "parentId": "5", "id": "6", "absPath": "/auth/login", - "__content": "import React, { useState } from 'react';\nimport { useNavigate } from 'umi';\nimport {\n Card,\n Form,\n Input,\n Button,\n Checkbox,\n Space,\n Divider,\n Typography,\n Alert,\n message,\n Row,\n Col,\n Image,\n} from 'antd';\nimport {\n UserOutlined,\n LockOutlined,\n SafetyOutlined,\n EyeInvisibleOutlined,\n EyeTwoTone,\n LoginOutlined,\n GoogleOutlined,\n GithubOutlined,\n} from '@ant-design/icons';\n\nconst { Title, Text, Link } = Typography;\n\ninterface LoginFormValues {\n username: string;\n password: string;\n remember: boolean;\n captcha?: string;\n}\n\nexport const LoginPage: React.FC = () => {\n const [form] = Form.useForm();\n const [loading, setLoading] = useState(false);\n const [loginError, setLoginError] = useState(null);\n const [captchaCode, setCaptchaCode] = useState('');\n const navigate = useNavigate();\n\n const generateCaptcha = () => {\n const chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';\n let result = '';\n for (let i = 0; i < 4; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n setCaptchaCode(result);\n };\n\n React.useEffect(() => {\n generateCaptcha();\n }, []);\n\n const handleLogin = async (values: LoginFormValues) => {\n setLoading(true);\n setLoginError(null);\n\n try {\n await new Promise(resolve => setTimeout(resolve, 1500));\n\n if (values.captcha?.toUpperCase() !== captchaCode) {\n setLoginError('Invalid verification code');\n generateCaptcha();\n setLoading(false);\n return;\n }\n\n message.success('Login successful! Redirecting...');\n } catch (error) {\n setLoginError('Login failed. Please check your credentials.');\n } finally {\n setLoading(false);\n }\n };\n\n return (\n
\n \n \n
\n \n Crawlful Hub\n \n \n Your all-in-one cross-border e-commerce management platform\n \n \n
✓ Multi-platform integration
\n
✓ Automated operations
\n
✓ Real-time analytics
\n
✓ Compliance management
\n
\n
\n \n\n \n \n
\n Welcome Back\n Sign in to your account\n
\n\n {loginError && (\n setLoginError(null)}\n />\n )}\n\n \n \n }\n placeholder=\"Username or Email\"\n size=\"large\"\n />\n \n\n \n }\n placeholder=\"Password\"\n size=\"large\"\n iconRender={visible => (visible ? : )}\n />\n \n\n \n \n \n \n }\n placeholder=\"Verification Code\"\n size=\"large\"\n maxLength={4}\n />\n \n \n \n \n {captchaCode}\n
\n \n \n \n\n \n \n \n \n Remember me\n \n \n \n Forgot password?\n \n \n \n\n \n }\n >\n Sign In\n \n \n\n Or continue with\n\n \n \n \n \n\n
\n \n Don't have an account? Sign up\n \n
\n \n \n \n \n \n );\n};\n\nexport default LoginPage;\n", + "__content": "import React, { useState } from 'react';\nimport { useNavigate } from 'umi';\nimport {\n Card,\n Form,\n Input,\n Button,\n Checkbox,\n Space,\n Divider,\n Typography,\n Alert,\n message,\n Row,\n Col,\n Image,\n} from 'antd';\nimport {\n UserOutlined,\n LockOutlined,\n SafetyOutlined,\n EyeInvisibleOutlined,\n EyeTwoTone,\n LoginOutlined,\n GoogleOutlined,\n GithubOutlined,\n} from '@ant-design/icons';\n\nconst { Title, Text, Link } = Typography;\n\ninterface LoginFormValues {\n username: string;\n password: string;\n remember: boolean;\n captcha?: string;\n}\n\nexport const LoginPage: React.FC = () => {\n const [form] = Form.useForm();\n const [loading, setLoading] = useState(false);\n const [loginError, setLoginError] = useState(null);\n const [captchaCode, setCaptchaCode] = useState('');\n const navigate = useNavigate();\n\n const generateCaptcha = () => {\n const chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';\n let result = '';\n for (let i = 0; i < 4; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n setCaptchaCode(result);\n };\n\n React.useEffect(() => {\n generateCaptcha();\n }, []);\n\n const handleLogin = async (values: LoginFormValues) => {\n setLoading(true);\n setLoginError(null);\n\n try {\n await new Promise(resolve => setTimeout(resolve, 1500));\n\n if (values.captcha?.toUpperCase() !== captchaCode) {\n setLoginError('Invalid verification code');\n generateCaptcha();\n setLoading(false);\n return;\n }\n\n message.success('Login successful! Redirecting...');\n setTimeout(() => {\n navigate('/dashboard');\n }, 1000);\n } catch (error) {\n setLoginError('Login failed. Please check your credentials.');\n } finally {\n setLoading(false);\n }\n };\n\n return (\n
\n \n \n
\n \n Crawlful Hub\n \n \n Your all-in-one cross-border e-commerce management platform\n \n \n
✓ Multi-platform integration
\n
✓ Automated operations
\n
✓ Real-time analytics
\n
✓ Compliance management
\n
\n
\n \n\n \n \n
\n Welcome Back\n Sign in to your account\n
\n\n {loginError && (\n setLoginError(null)}\n />\n )}\n\n \n \n }\n placeholder=\"Username or Email\"\n size=\"large\"\n />\n \n\n \n }\n placeholder=\"Password\"\n size=\"large\"\n iconRender={visible => (visible ? : )}\n />\n \n\n \n \n \n \n }\n placeholder=\"Verification Code\"\n size=\"large\"\n maxLength={4}\n />\n \n \n \n \n {captchaCode}\n
\n \n \n \n\n \n \n \n \n Remember me\n \n \n \n Forgot password?\n \n \n \n\n \n }\n >\n Sign In\n \n \n\n Or continue with\n\n \n \n \n \n\n
\n \n Don't have an account? Sign up\n \n
\n \n \n \n \n \n );\n};\n\nexport default LoginPage;\n", "__isJSFile": true, "__absFile": "D:/trae_projects/makemd/makemd/dashboard/src/pages/Auth/LoginPage.tsx" }, @@ -2522,18 +2430,16 @@ "done": true, "progresses": [ { - "percent": 0.10513059701492537, + "percent": 0.1, "status": "building", "details": [ - "0/2 entries 5/9 dependencies 10/5 modules" + "0/1 entries 0/0 dependencies 0/0 modules" ] } ] }, "mfsuBundleStatus": { - "done": true, - "percent": 1, - "status": "" + "done": true }, "react": { "version": "18.3.1", @@ -2563,7 +2469,7 @@ "tslibVersion": "2.8.1" }, "faviconFiles": [], - "port": 8001, + "port": 8000, "host": "0.0.0.0", "ip": "192.168.110.169", "prepare": { @@ -3998,13 +3904,18 @@ "format": "esm" }, "src/pages/Auth/LoginPage.tsx": { - "bytes": 7876, + "bytes": 8018, "imports": [ { "path": "react", "kind": "import-statement", "external": true }, + { + "path": "src/.umi/exports.ts", + "kind": "import-statement", + "original": "umi" + }, { "path": "antd", "kind": "import-statement", @@ -5542,7 +5453,7 @@ "bytesInOutput": 358 }, "src/pages/Auth/LoginPage.tsx": { - "bytesInOutput": 9241 + "bytesInOutput": 9383 }, "src/pages/Auth/RegisterPage.tsx": { "bytesInOutput": 14826 @@ -5569,7 +5480,7 @@ "bytesInOutput": 1873 } }, - "bytes": 195368 + "bytes": 195510 } } } @@ -8421,7 +8332,21 @@ "type": "ImportDeclaration" }, { - "end": 189, + "end": 76, + "importKind": "value", + "source": "umi", + "specifiers": [ + { + "imported": "useNavigate", + "local": "useNavigate", + "type": "ImportSpecifier" + } + ], + "start": 42, + "type": "ImportDeclaration" + }, + { + "end": 224, "importKind": "value", "source": "antd", "specifiers": [ @@ -8491,11 +8416,11 @@ "type": "ImportSpecifier" } ], - "start": 42, + "start": 77, "type": "ImportDeclaration" }, { - "end": 367, + "end": 402, "importKind": "value", "source": "@ant-design/icons", "specifiers": [ @@ -8540,7 +8465,7 @@ "type": "ImportSpecifier" } ], - "start": 190, + "start": 225, "type": "ImportDeclaration" } ], diff --git a/dashboard/src/pages/Pricing.tsx b/dashboard/src/pages/Pricing.tsx index aef8cfa..d91455d 100644 --- a/dashboard/src/pages/Pricing.tsx +++ b/dashboard/src/pages/Pricing.tsx @@ -138,7 +138,7 @@ const Pricing: React.FC = () => { ))}