refactor: 重构项目结构并优化代码
- 删除无用的文件和错误日志 - 创建统一的 imports 模块集中管理依赖 - 重构组件使用新的 imports 方式 - 修复文档路径大小写问题 - 优化类型定义和接口导出 - 更新依赖版本 - 改进错误处理和API配置 - 统一组件导出方式
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import React, { createContext, useState, useContext, ReactNode } from 'react';
|
||||
import { createContext, useState, useContext, ReactNode, FC, useCallback } from 'react';
|
||||
|
||||
interface LocaleContextType {
|
||||
locale: string;
|
||||
@@ -91,6 +91,131 @@ const zhCN = {
|
||||
'settings.users': '用户管理',
|
||||
'settings.language': '语言设置',
|
||||
'settings.theme': '主题设置',
|
||||
// Menu translations
|
||||
'menu.dashboard': '数据概览',
|
||||
'menu.aiOperations': 'AI运营中心',
|
||||
'menu.operationAgent': '运营Agent',
|
||||
'menu.autoPilot': '自动驾驶',
|
||||
'menu.taskCenter': '任务中心',
|
||||
'menu.taskManager': '任务管理',
|
||||
'menu.aiSuggestion': 'AI建议',
|
||||
'menu.humanApproval': '人工确认',
|
||||
'menu.clientManagement': '客户端管理',
|
||||
'menu.executionResults': '执行结果',
|
||||
'menu.aiDecisionLog': 'AI决策日志',
|
||||
'menu.strategyMarketplace': '策略市场',
|
||||
'menu.autoProductSelection': '自动选品',
|
||||
'menu.autoExecution': '自动执行',
|
||||
'menu.productCycle': '商品闭环',
|
||||
'menu.productManagement': '商品管理',
|
||||
'menu.productPublish': '商品发布',
|
||||
'menu.inventoryManagement': '库存管理',
|
||||
'menu.warehouseManagement': '仓库管理',
|
||||
'menu.aiPricing': 'AI定价',
|
||||
'menu.profitMonitor': '利润监控',
|
||||
'menu.orderCycle': '订单闭环',
|
||||
'menu.orderManagement': '订单管理',
|
||||
'menu.exceptionOrders': '异常订单',
|
||||
'menu.afterSales': '售后服务',
|
||||
'menu.refundProcessing': '退款处理',
|
||||
'menu.logisticsCycle': '物流闭环',
|
||||
'menu.logisticsQuery': '物流查询',
|
||||
'menu.freightCalculation': '运费计算',
|
||||
'menu.financeCycle': '财务闭环',
|
||||
'menu.financeOverview': '财务概览',
|
||||
'menu.transactionRecords': '交易记录',
|
||||
'menu.financeReconciliation': '财务对账',
|
||||
'menu.userAssets': '用户资产',
|
||||
'menu.marketingCycle': '营销闭环',
|
||||
'menu.adManagement': '广告管理',
|
||||
'menu.competitorAnalysis': '竞品分析',
|
||||
'menu.dynamicPricing': '动态定价',
|
||||
'menu.abTest': 'AB测试',
|
||||
'menu.analytics': '数据分析',
|
||||
'menu.dataAnalysis': '数据分析',
|
||||
'menu.reportCenter': '报表中心',
|
||||
'menu.multiShopReport': '多店报表',
|
||||
'menu.leaderboard': '收益排行',
|
||||
'menu.b2bTrade': 'B2B贸易',
|
||||
'menu.merchantManagement': '商户管理',
|
||||
'menu.b2bTradeManagement': 'B2B贸易',
|
||||
'menu.batchOrder': '批量订单',
|
||||
'menu.enterpriseQuote': '企业报价',
|
||||
'menu.contractManagement': '合同管理',
|
||||
'menu.procurementManagement': '采购管理',
|
||||
'menu.suppliers': '供应商',
|
||||
'menu.warehouseInventory': '仓库库存',
|
||||
'menu.independentSite': '独立站',
|
||||
'menu.siteManagement': '站点管理',
|
||||
'menu.createSite': '创建站点',
|
||||
'menu.siteTemplates': '站点模板',
|
||||
'menu.siteAnalytics': '站点分析',
|
||||
'menu.independentSiteOrders': '独立站订单',
|
||||
'menu.independentSiteProducts': '独立站商品',
|
||||
'menu.domainManagement': '域名管理',
|
||||
'menu.riskCompliance': '风控合规',
|
||||
'menu.riskMonitoring': '风险监控',
|
||||
'menu.complianceCheck': '合规检查',
|
||||
'menu.auditLogs': '审计日志',
|
||||
'menu.operationLogs': '操作日志',
|
||||
'menu.governanceCenter': '治理中心',
|
||||
'menu.sovereigntyManagement': '主权管理',
|
||||
'menu.certificateManagement': '证书管理',
|
||||
'menu.settings': '系统设置',
|
||||
'menu.settingsOverview': '设置概览',
|
||||
'menu.platformAuth': '平台授权',
|
||||
'menu.serviceManager': '服务管理',
|
||||
'menu.userManagement': '用户管理',
|
||||
'menu.rolePermissions': '角色权限',
|
||||
// Product publish form translations
|
||||
'product.publish.title': '商品发布',
|
||||
'product.publish.basicInfo': '基本信息',
|
||||
'product.publish.variants': '商品变体',
|
||||
'product.publish.images': '商品图片',
|
||||
'product.publish.materialProcessing': 'AI素材处理',
|
||||
'product.publish.materialProcessingDesc': '上传图片后,可使用AI进行图生图、图生视频等处理。点击已上传图片上的AI按钮开始处理。',
|
||||
'product.publish.selectImage': '请先选择要处理的图片',
|
||||
'product.publish.taskCreated': '任务已创建: {id}',
|
||||
'product.publish.processingComplete': '素材处理完成!',
|
||||
'product.publish.videoGenerated': '视频已生成,可在素材库中查看',
|
||||
'product.publish.processFailed': '处理失败',
|
||||
'product.publish.saveLocal': 'Step 1: 先保存到本地系统',
|
||||
'product.publish.pendingSync': '待同步状态',
|
||||
'product.publish.saveToDatabase': '模拟保存到本地数据库',
|
||||
'product.publish.complianceCheck': 'Step 2: 合规检查(本地进行)',
|
||||
'product.publish.submitReview': 'Step 3: 提交审核(本地状态变更)',
|
||||
'product.publish.resetForm': '重置表单',
|
||||
'product.publish.processingTasks': '处理中的任务',
|
||||
'product.publish.imageToImage': '图生图',
|
||||
'product.publish.imageToVideo': '图生视频',
|
||||
'product.publish.originalPreview': '原图预览:',
|
||||
'product.publish.prompt': '提示词',
|
||||
'product.publish.promptPlaceholder': '描述你想要生成的图片效果...',
|
||||
'product.publish.style': '风格',
|
||||
'product.publish.strength': '转换强度',
|
||||
'product.publish.motion': '运动类型',
|
||||
'product.publish.motionZoom': '缩放',
|
||||
'product.publish.motionPan': '平移',
|
||||
'product.publish.motionRotate': '旋转',
|
||||
'product.publish.motionDynamic': '动态',
|
||||
'product.publish.duration': '时长(秒)',
|
||||
'product.publish.fps': '帧率',
|
||||
'product.publish.startProcessing': '开始处理',
|
||||
'product.publish.cancel': '取消',
|
||||
// Product publish form additional translations
|
||||
'product.publish.productImages': '商品图片',
|
||||
'product.publish.images': '图片',
|
||||
'product.publish.upload': '上传',
|
||||
'product.publish.pricing': '定价',
|
||||
'product.publish.profitMarginValidation': '利润率验证',
|
||||
'product.publish.profitMarginDesc': 'B2B商品必须保持至少15%的利润率。B2C商品要求最低20%。',
|
||||
'product.publish.sellingPrice': '销售价格',
|
||||
'product.publish.enterPrice': '请输入价格',
|
||||
'product.publish.costPrice': '成本价格',
|
||||
'product.publish.enterCostPrice': '请输入成本价格',
|
||||
'product.publish.currency': '货币',
|
||||
'product.publish.draftSaved': '草稿保存成功',
|
||||
'product.publish.fillRequiredFields': '请填写必填字段',
|
||||
};
|
||||
|
||||
const enUS = {
|
||||
@@ -178,6 +303,131 @@ const enUS = {
|
||||
'settings.users': 'User Management',
|
||||
'settings.language': 'Language',
|
||||
'settings.theme': 'Theme',
|
||||
// Menu translations
|
||||
'menu.dashboard': 'Dashboard',
|
||||
'menu.aiOperations': 'AI Operations',
|
||||
'menu.operationAgent': 'Operation Agent',
|
||||
'menu.autoPilot': 'Auto Pilot',
|
||||
'menu.taskCenter': 'Task Center',
|
||||
'menu.taskManager': 'Task Manager',
|
||||
'menu.aiSuggestion': 'AI Suggestions',
|
||||
'menu.humanApproval': 'Human Approval',
|
||||
'menu.clientManagement': 'Client Management',
|
||||
'menu.executionResults': 'Execution Results',
|
||||
'menu.aiDecisionLog': 'AI Decision Log',
|
||||
'menu.strategyMarketplace': 'Strategy Marketplace',
|
||||
'menu.autoProductSelection': 'Auto Product Selection',
|
||||
'menu.autoExecution': 'Auto Execution',
|
||||
'menu.productCycle': 'Product Cycle',
|
||||
'menu.productManagement': 'Product Management',
|
||||
'menu.productPublish': 'Product Publish',
|
||||
'menu.inventoryManagement': 'Inventory Management',
|
||||
'menu.warehouseManagement': 'Warehouse Management',
|
||||
'menu.aiPricing': 'AI Pricing',
|
||||
'menu.profitMonitor': 'Profit Monitor',
|
||||
'menu.orderCycle': 'Order Cycle',
|
||||
'menu.orderManagement': 'Order Management',
|
||||
'menu.exceptionOrders': 'Exception Orders',
|
||||
'menu.afterSales': 'After Sales',
|
||||
'menu.refundProcessing': 'Refund Processing',
|
||||
'menu.logisticsCycle': 'Logistics Cycle',
|
||||
'menu.logisticsQuery': 'Logistics Query',
|
||||
'menu.freightCalculation': 'Freight Calculation',
|
||||
'menu.financeCycle': 'Finance Cycle',
|
||||
'menu.financeOverview': 'Finance Overview',
|
||||
'menu.transactionRecords': 'Transaction Records',
|
||||
'menu.financeReconciliation': 'Finance Reconciliation',
|
||||
'menu.userAssets': 'User Assets',
|
||||
'menu.marketingCycle': 'Marketing Cycle',
|
||||
'menu.adManagement': 'Ad Management',
|
||||
'menu.competitorAnalysis': 'Competitor Analysis',
|
||||
'menu.dynamicPricing': 'Dynamic Pricing',
|
||||
'menu.abTest': 'A/B Test',
|
||||
'menu.analytics': 'Analytics',
|
||||
'menu.dataAnalysis': 'Data Analysis',
|
||||
'menu.reportCenter': 'Report Center',
|
||||
'menu.multiShopReport': 'Multi-Shop Report',
|
||||
'menu.leaderboard': 'Leaderboard',
|
||||
'menu.b2bTrade': 'B2B Trade',
|
||||
'menu.merchantManagement': 'Merchant Management',
|
||||
'menu.b2bTradeManagement': 'B2B Trade',
|
||||
'menu.batchOrder': 'Batch Order',
|
||||
'menu.enterpriseQuote': 'Enterprise Quote',
|
||||
'menu.contractManagement': 'Contract Management',
|
||||
'menu.procurementManagement': 'Procurement Management',
|
||||
'menu.suppliers': 'Suppliers',
|
||||
'menu.warehouseInventory': 'Warehouse Inventory',
|
||||
'menu.independentSite': 'Independent Site',
|
||||
'menu.siteManagement': 'Site Management',
|
||||
'menu.createSite': 'Create Site',
|
||||
'menu.siteTemplates': 'Site Templates',
|
||||
'menu.siteAnalytics': 'Site Analytics',
|
||||
'menu.independentSiteOrders': 'Independent Site Orders',
|
||||
'menu.independentSiteProducts': 'Independent Site Products',
|
||||
'menu.domainManagement': 'Domain Management',
|
||||
'menu.riskCompliance': 'Risk & Compliance',
|
||||
'menu.riskMonitoring': 'Risk Monitoring',
|
||||
'menu.complianceCheck': 'Compliance Check',
|
||||
'menu.auditLogs': 'Audit Logs',
|
||||
'menu.operationLogs': 'Operation Logs',
|
||||
'menu.governanceCenter': 'Governance Center',
|
||||
'menu.sovereigntyManagement': 'Sovereignty Management',
|
||||
'menu.certificateManagement': 'Certificate Management',
|
||||
'menu.settings': 'System Settings',
|
||||
'menu.settingsOverview': 'Settings Overview',
|
||||
'menu.platformAuth': 'Platform Authorization',
|
||||
'menu.serviceManager': 'Service Manager',
|
||||
'menu.userManagement': 'User Management',
|
||||
'menu.rolePermissions': 'Role Permissions',
|
||||
// Product publish form translations
|
||||
'product.publish.title': 'Product Publish',
|
||||
'product.publish.basicInfo': 'Basic Information',
|
||||
'product.publish.variants': 'Product Variants',
|
||||
'product.publish.images': 'Product Images',
|
||||
'product.publish.materialProcessing': 'AI Material Processing',
|
||||
'product.publish.materialProcessingDesc': 'After uploading images, you can use AI for image-to-image, image-to-video processing. Click the AI button on uploaded images to start processing.',
|
||||
'product.publish.selectImage': 'Please select an image to process first',
|
||||
'product.publish.taskCreated': 'Task created: {id}',
|
||||
'product.publish.processingComplete': 'Material processing completed!',
|
||||
'product.publish.videoGenerated': 'Video has been generated, you can view it in the material library',
|
||||
'product.publish.processFailed': 'Processing failed',
|
||||
'product.publish.saveLocal': 'Step 1: Save to local system first',
|
||||
'product.publish.pendingSync': 'Pending sync status',
|
||||
'product.publish.saveToDatabase': 'Simulate saving to local database',
|
||||
'product.publish.complianceCheck': 'Step 2: Compliance check (locally)',
|
||||
'product.publish.submitReview': 'Step 3: Submit for review (local status change)',
|
||||
'product.publish.resetForm': 'Reset form',
|
||||
'product.publish.processingTasks': 'Processing tasks',
|
||||
'product.publish.imageToImage': 'Image to Image',
|
||||
'product.publish.imageToVideo': 'Image to Video',
|
||||
'product.publish.originalPreview': 'Original preview:',
|
||||
'product.publish.prompt': 'Prompt',
|
||||
'product.publish.promptPlaceholder': 'Describe the image effect you want to generate...',
|
||||
'product.publish.style': 'Style',
|
||||
'product.publish.strength': 'Conversion strength',
|
||||
'product.publish.motion': 'Motion type',
|
||||
'product.publish.motionZoom': 'Zoom',
|
||||
'product.publish.motionPan': 'Pan',
|
||||
'product.publish.motionRotate': 'Rotate',
|
||||
'product.publish.motionDynamic': 'Dynamic',
|
||||
'product.publish.duration': 'Duration (seconds)',
|
||||
'product.publish.fps': 'FPS',
|
||||
'product.publish.startProcessing': 'Start processing',
|
||||
'product.publish.cancel': 'Cancel',
|
||||
// Product publish form additional translations
|
||||
'product.publish.productImages': 'Product Images',
|
||||
'product.publish.images': 'Images',
|
||||
'product.publish.upload': 'Upload',
|
||||
'product.publish.pricing': 'Pricing',
|
||||
'product.publish.profitMarginValidation': 'Profit Margin Validation',
|
||||
'product.publish.profitMarginDesc': 'B2B products must maintain at least 15% profit margin. B2C products require 20% minimum.',
|
||||
'product.publish.sellingPrice': 'Selling Price',
|
||||
'product.publish.enterPrice': 'Please enter price',
|
||||
'product.publish.costPrice': 'Cost Price',
|
||||
'product.publish.enterCostPrice': 'Please enter cost price',
|
||||
'product.publish.currency': 'Currency',
|
||||
'product.publish.draftSaved': 'Draft saved successfully',
|
||||
'product.publish.fillRequiredFields': 'Please fill in required fields',
|
||||
};
|
||||
|
||||
const translations: Record<string, Record<string, string>> = {
|
||||
@@ -187,10 +437,10 @@ const translations: Record<string, Record<string, string>> = {
|
||||
|
||||
const LocaleContext = createContext<LocaleContextType | undefined>(undefined);
|
||||
|
||||
export const LocaleProvider: React.FC<{ children: ReactNode }> = ({ children }) => {
|
||||
export const LocaleProvider: FC<{ children: ReactNode }> = ({ children }) => {
|
||||
const [locale, setLocale] = useState<string>('zh-CN');
|
||||
|
||||
const t = (key: string, options?: Record<string, any>): string => {
|
||||
const t = useCallback((key: string, options?: Record<string, any>): string => {
|
||||
const translation = translations[locale]?.[key] || translations['en-US']?.[key] || key;
|
||||
if (options) {
|
||||
return Object.entries(options).reduce((result, [placeholder, value]) => {
|
||||
@@ -198,7 +448,7 @@ export const LocaleProvider: React.FC<{ children: ReactNode }> = ({ children })
|
||||
}, translation);
|
||||
}
|
||||
return translation;
|
||||
};
|
||||
}, [locale]);
|
||||
|
||||
return (
|
||||
<LocaleContext.Provider value={{ locale, setLocale, t }}>
|
||||
@@ -210,7 +460,15 @@ export const LocaleProvider: React.FC<{ children: ReactNode }> = ({ children })
|
||||
const defaultContext: LocaleContextType = {
|
||||
locale: 'zh-CN',
|
||||
setLocale: () => {},
|
||||
t: (key: string) => key,
|
||||
t: (key: string, options?: Record<string, any>): string => {
|
||||
const translation = zhCN[key] || enUS[key] || key;
|
||||
if (options) {
|
||||
return Object.entries(options).reduce((result, [placeholder, value]) => {
|
||||
return result.replace(new RegExp(`\{${placeholder}\}`, 'g'), String(value));
|
||||
}, translation);
|
||||
}
|
||||
return translation;
|
||||
},
|
||||
};
|
||||
|
||||
export const useLocale = (): LocaleContextType => {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import React, { createContext, useContext, useState, useEffect, ReactNode } from 'react';
|
||||
import { createContext, useContext, useState, useEffect, ReactNode, FC } from 'react';
|
||||
|
||||
export type UserRole = 'ADMIN' | 'MANAGER' | 'OPERATOR' | 'FINANCE' | 'SOURCING' | 'LOGISTICS' | 'ANALYST';
|
||||
|
||||
@@ -135,7 +135,7 @@ interface UserContextType {
|
||||
|
||||
const UserContext = createContext<UserContextType | undefined>(undefined);
|
||||
|
||||
export const UserProvider: React.FC<{ children: ReactNode }> = ({ children }) => {
|
||||
export const UserProvider: FC<{ children: ReactNode }> = ({ children }) => {
|
||||
const [currentUser, setCurrentUser] = useState<User>(() => {
|
||||
return MOCK_USERS[0];
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user