From d467236575b54a834718bb2d9fcdbaa24ad00b32 Mon Sep 17 00:00:00 2001 From: tikkhun Date: Fri, 14 Nov 2025 10:45:08 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E6=B7=BB=E5=8A=A0=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E5=92=8C=E6=8A=80=E6=9C=AF=E6=9E=B6=E6=9E=84?= =?UTF-8?q?=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加了关于项目概览、技术架构、业务流程和最佳实践的详细文档,包括: 1. 项目分析报告和评估结果 2. 系统架构图和核心实体关系 3. 订单处理、库存管理等业务流程 4. URL拼接、SSL证书处理等最佳实践方案 5. WooCommerce集成和API访问指南 --- .DS_Store | Bin 0 -> 6148 bytes container/docker-compose.yml | 24 ++ docs/实际经验/SSL证书问题解决方案.md | 224 ++++++++++++++ docs/实际经验/URL拼接最佳实践.md | 283 ++++++++++++++++++ .../1760338330047.png | Bin 0 -> 50641 bytes .../image/如何连接wordpress/1760323937560.png | Bin 0 -> 98359 bytes .../使用webhook自动同步woocommerce的订单.md | 42 +++ docs/实际经验/初始化API项目.md | 0 docs/实际经验/初始化woocommere.md | 14 + docs/实际经验/如何访问woocommerceAPI.md | 38 +++ docs/实际经验/快速搭建你的wordpress.md | 5 + docs/实际经验/网络连接问题解决方案.md | 150 ++++++++++ docs/项目概览/README.md | 102 +++++++ docs/项目概览/业务流程图.md | 233 ++++++++++++++ docs/项目概览/技术架构图.md | 200 +++++++++++++ docs/项目概览/项目分析报告.md | 198 ++++++++++++ 16 files changed, 1513 insertions(+) create mode 100644 .DS_Store create mode 100644 container/docker-compose.yml create mode 100644 docs/实际经验/SSL证书问题解决方案.md create mode 100644 docs/实际经验/URL拼接最佳实践.md create mode 100644 docs/实际经验/image/使用webhook自动同步woocommerce的订单/1760338330047.png create mode 100644 docs/实际经验/image/如何连接wordpress/1760323937560.png create mode 100644 docs/实际经验/使用webhook自动同步woocommerce的订单.md create mode 100644 docs/实际经验/初始化API项目.md create mode 100644 docs/实际经验/初始化woocommere.md create mode 100644 docs/实际经验/如何访问woocommerceAPI.md create mode 100644 docs/实际经验/快速搭建你的wordpress.md create mode 100644 docs/实际经验/网络连接问题解决方案.md create mode 100644 docs/项目概览/README.md create mode 100644 docs/项目概览/业务流程图.md create mode 100644 docs/项目概览/技术架构图.md create mode 100644 docs/项目概览/项目分析报告.md diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c2d867a540cdf7e29cdd15c41418695d5c3afa14 GIT binary patch literal 6148 zcmeHKJ5B>J5S@V(K{P2T-Ee^P6ic);6f`*ikOV=bgpCk1h{A{9Al!m$@t$Y+tS}M< zLI}-B_8WUX_C9HCkBI2xZZQ@aiO3L*s8lM#>8feVod-ZIInHG%*K#2@tIJBFzc|Ic z@5o#_?E6+e?0-C+ck2zeynp<7TK8IaZ97|aGgwK`!~Mzg;a8rEZ+dR7-d9csPe>OM z3Cy( + endpoint: string, + site: WpSite, + page: number = 1, + perPage: number = 100 + ): Promise { + const { wpApiUrl, consumerKey, consumerSecret } = site; + const allData: T[] = []; + + // Base64编码认证信息 + const auth = Buffer.from(`${consumerKey}:${consumerSecret}`).toString('base64'); + + let hasMore = true; + while (hasMore) { + const config: AxiosRequestConfig = { + method: 'GET', + url: `${wpApiUrl}/wp-json${endpoint}`, + headers: { + Authorization: `Basic ${auth}`, // 基础认证 + 'Content-Type': 'application/json', // 内容类型 + }, + params: { + page, // 分页参数 + per_page: perPage, // 每页条数 + }, + httpsAgent: this.getHttpsAgent(), // 动态SSL配置 + timeout: parseInt(process.env.WP_API_TIMEOUT || '30000'), // 超时配置 + }; + + try { + const response = await axios.request(config); + + // 添加当前页数据 + allData.push(...response.data); + + // 检查是否还有更多页 + const totalPages = parseInt(response.headers['x-wp-totalpages'] || '1', 10); + hasMore = page < totalPages; + page += 1; + + } catch (error) { + // 增强错误处理 + if (error.code === 'DEPTH_ZERO_SELF_SIGNED_CERT') { + console.error('SSL证书错误:请检查证书配置或在开发环境中忽略SSL验证'); + } + throw error; + } + } + + return allData; + } +} +``` + +### 方案三:安装自签名证书(生产环境推荐) + +#### 1. 生成证书 + +```bash +# 生成私钥 +openssl genrsa -out server.key 2048 + +# 生成证书签名请求 +openssl req -new -key server.key -out server.csr + +# 生成自签名证书 +openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt +``` + +#### 2. 配置服务器 + +将生成的证书配置到WordPress服务器的SSL设置中。 + +## 安全最佳实践 + +### 环境配置对比表 + +| 环境类型 | SSL验证 | 推荐方案 | 安全级别 | +|---------|---------|---------|---------| +| 开发环境 | 可忽略 | 环境变量控制 | 低 | +| 测试环境 | 建议验证 | 使用测试证书 | 中 | +| 生产环境 | 必须验证 | 有效SSL证书 | 高 | + +### 代码示例:环境检测 + +```typescript +// 环境安全检测 +class SSLSecurityChecker { + static checkEnvironment(): void { + // 检查是否在生产环境中禁用了SSL验证 + if (process.env.NODE_ENV === 'production' && + process.env.NODE_TLS_REJECT_UNAUTHORIZED === '0') { + throw new Error('生产环境不允许禁用SSL验证!'); + } + + // 开发环境警告 + if (process.env.NODE_ENV === 'development' && + process.env.WP_API_VERIFY_SSL === 'false') { + console.warn('⚠️ 开发环境已禁用SSL验证,请勿在生产环境使用此配置'); + } + } +} + +// 在应用启动时调用 +SSLSecurityChecker.checkEnvironment(); +``` + +## 故障排查步骤 + +### 排查流程表 + +| 步骤 | 检查项目 | 命令/方法 | 预期结果 | +|------|---------|----------|---------| +| 1 | 网络连通性 | `ping wp-test.local` | 能够ping通 | +| 2 | SSL证书状态 | `openssl s_client -connect wp-test.local:443` | 显示证书信息 | +| 3 | API端点可访问性 | `curl -k https://wp-test.local/wp-json/wc/v3/` | 返回API信息 | +| 4 | 认证信息正确性 | 检查Consumer Key/Secret | 密钥格式正确 | + +## 参考文档 + +- [Node.js HTTPS文档](https://nodejs.org/api/https.html) +- [Axios配置文档](https://axios-http.com/docs/config_defaults) +- [WooCommerce REST API文档](https://woocommerce.github.io/woocommerce-rest-api-docs/) +- [OpenSSL证书生成指南](https://www.openssl.org/docs/) \ No newline at end of file diff --git a/docs/实际经验/URL拼接最佳实践.md b/docs/实际经验/URL拼接最佳实践.md new file mode 100644 index 0000000..294f7c7 --- /dev/null +++ b/docs/实际经验/URL拼接最佳实践.md @@ -0,0 +1,283 @@ +# URL拼接最佳实践 + +## 【背景意义】 + +在API开发中,URL拼接是常见操作,但不当的拼接方式会导致重复斜杠、路径错误等问题。科学的URL拼接能提高代码可靠性和可维护性。 + +## 【概念定义】 + +### URL拼接问题对比表 + +| 问题类型 | 错误示例 | 正确示例 | 影响 | +|---------|---------|---------|------| +| 重复斜杠 | `http://api.com//path` | `http://api.com/path` | 可能导致404错误 | +| 缺少斜杠 | `http://api.compath` | `http://api.com/path` | 路径解析错误 | +| 路径混乱 | `http://api.com/path//sub` | `http://api.com/path/sub` | 服务器解析异常 | +| 协议破坏 | `http:/api.com/path` | `http://api.com/path` | 无法访问 | + +### 常见拼接方式对比表 + +| 拼接方式 | 优点 | 缺点 | 适用场景 | +|---------|------|------|---------| +| 字符串模板 | 简单直观 | 容易出错,难维护 | 简单固定路径 | +| 手动处理 | 灵活控制 | 代码冗余,易出错 | 特殊需求 | +| 工具函数 | 安全可靠,可复用 | 需要额外实现 | 生产环境推荐 | +| 第三方库 | 功能完善 | 增加依赖 | 复杂项目 | + +## 【使用流程】 + +### 步骤1:创建URL工具类 + +```typescript +// src/utils/url.util.ts +export class UrlUtil { + /** + * 安全地拼接URL路径 + * @param baseUrl 基础URL - 可以带或不带尾部斜杠 + * @param paths 路径片段数组 - 可以带或不带前后斜杠 + * @returns 拼接后的完整URL + */ + static joinUrl(baseUrl: string, ...paths: string[]): string { + // 移除baseUrl的尾部斜杠 + let result = baseUrl.replace(/\/+$/, ''); + + // 处理每个路径片段 + for (const path of paths) { + if (path) { + // 移除路径的首尾斜杠,然后添加单个斜杠前缀 + const cleanPath = path.replace(/^\/+|\/+$/g, ''); + if (cleanPath) { + result += '/' + cleanPath; + } + } + } + + return result; + } + + /** + * 标准化URL路径(移除重复斜杠) + * @param url 原始URL + * @returns 标准化后的URL + */ + static normalizeUrl(url: string): string { + // 保护协议部分的双斜杠(如 http://) + const protocolMatch = url.match(/^([a-zA-Z][a-zA-Z\d+\-.]*:\/\/)/); + const protocol = protocolMatch ? protocolMatch[1] : ''; + const restUrl = protocolMatch ? url.slice(protocol.length) : url; + + // 移除重复斜杠,但保留协议部分 + return protocol + restUrl.replace(/\/+/g, '/'); + } +} +``` + +### 步骤2:创建专用API URL构建器 + +```typescript +// 扩展UrlUtil类,添加WordPress专用方法 +export class UrlUtil { + // ... 基础方法 ... + + /** + * 构建WordPress API URL + * @param wpApiUrl WordPress站点URL + * @param endpoint API端点路径 + * @returns 完整的API URL + */ + static buildWpApiUrl(wpApiUrl: string, endpoint: string): string { + return this.joinUrl(wpApiUrl, 'wp-json', endpoint); + } + + /** + * 构建WooCommerce API URL + * @param wpApiUrl WordPress站点URL + * @param endpoint WooCommerce API端点 + * @param version API版本,默认为v3 + * @returns 完整的WooCommerce API URL + */ + static buildWcApiUrl(wpApiUrl: string, endpoint: string, version: string = 'v3'): string { + return this.joinUrl(wpApiUrl, 'wp-json', 'wc', version, endpoint); + } +} +``` + +### 步骤3:在服务中应用 + +```typescript +// src/service/wp.service.ts +import { UrlUtil } from '../utils/url.util'; + +@Provide() +export class WPService { + async fetchPagedData( + endpoint: string, + site: WpSite, + page: number = 1, + perPage: number = 100 + ): Promise { + const { wpApiUrl, consumerKey, consumerSecret } = site; + + // 原始方式(容易出错) + // const url = `${wpApiUrl}/wp-json${endpoint}`; + + // 推荐方式(安全可靠) + const url = UrlUtil.buildWpApiUrl(wpApiUrl, endpoint); + + // ... 其他代码 + } + + async createShipment(site: WpSite, orderId: string, data: Record) { + const { wpApiUrl, consumerKey, consumerSecret } = site; + + // 复杂路径拼接示例 + const url = UrlUtil.joinUrl( + wpApiUrl, + 'wp-json', + 'wc-ast', + 'v3', + 'orders', + orderId, + 'shipment-trackings' + ); + + // ... 其他代码 + } +} +``` + +## 实际应用示例 + +### 问题场景演示 + +```typescript +// 问题场景:配置文件中的URL格式不统一 +const configs = [ + { wpApiUrl: 'http://wp-test.local/' }, // 带尾部斜杠 + { wpApiUrl: 'http://wp-test.local' }, // 不带尾部斜杠 + { wpApiUrl: 'https://wp-prod.com/' }, // HTTPS带斜杠 +]; + +const endpoints = [ + '/wc/v3/orders', // 带前缀斜杠 + 'wc/v3/products', // 不带前缀斜杠 + '//wc/v3/customers', // 多重斜杠 +]; + +// 原始拼接方式的问题 +configs.forEach(config => { + endpoints.forEach(endpoint => { + const badUrl = `${config.wpApiUrl}/wp-json${endpoint}`; + console.log('问题URL:', badUrl); + // 输出可能包含: + // http://wp-test.local//wp-json/wc/v3/orders + // http://wp-test.localwp-json/wc/v3/products + }); +}); +``` + +### 解决方案演示 + +```typescript +// 使用UrlUtil的安全拼接 +configs.forEach(config => { + endpoints.forEach(endpoint => { + const safeUrl = UrlUtil.buildWpApiUrl(config.wpApiUrl, endpoint); + console.log('安全URL:', safeUrl); + // 输出始终正确: + // http://wp-test.local/wp-json/wc/v3/orders + // http://wp-test.local/wp-json/wc/v3/products + }); +}); +``` + +## 测试用例 + +### 单元测试示例 + +```typescript +// tests/utils/url.util.test.ts +describe('UrlUtil', () => { + describe('joinUrl', () => { + it('应该正确处理带尾部斜杠的baseUrl', () => { + const result = UrlUtil.joinUrl('http://api.com/', 'path', 'sub'); + expect(result).toBe('http://api.com/path/sub'); + }); + + it('应该正确处理不带尾部斜杠的baseUrl', () => { + const result = UrlUtil.joinUrl('http://api.com', '/path/', '/sub/'); + expect(result).toBe('http://api.com/path/sub'); + }); + + it('应该处理空路径片段', () => { + const result = UrlUtil.joinUrl('http://api.com', '', 'path', null, 'sub'); + expect(result).toBe('http://api.com/path/sub'); + }); + }); + + describe('buildWpApiUrl', () => { + it('应该构建正确的WordPress API URL', () => { + const result = UrlUtil.buildWpApiUrl('http://wp.local/', '/wc/v3/orders'); + expect(result).toBe('http://wp.local/wp-json/wc/v3/orders'); + }); + }); +}); +``` + +## 性能优化建议 + +### 性能对比表 + +| 方案 | 执行时间 | 内存占用 | 代码复杂度 | 推荐指数 | +|------|---------|---------|-----------|---------| +| 字符串模板 | 最快 | 最低 | 低 | ⭐⭐ | +| 正则处理 | 中等 | 中等 | 中 | ⭐⭐⭐⭐ | +| 工具函数 | 稍慢 | 稍高 | 低 | ⭐⭐⭐⭐⭐ | +| 第三方库 | 最慢 | 最高 | 最低 | ⭐⭐⭐ | + +### 缓存优化 + +```typescript +// 为频繁调用的URL拼接添加缓存 +export class UrlUtil { + private static urlCache = new Map(); + + static joinUrlCached(baseUrl: string, ...paths: string[]): string { + const cacheKey = `${baseUrl}|${paths.join('|')}`; + + if (this.urlCache.has(cacheKey)) { + return this.urlCache.get(cacheKey)!; + } + + const result = this.joinUrl(baseUrl, ...paths); + this.urlCache.set(cacheKey, result); + + return result; + } +} +``` + +## 最佳实践总结 + +### 开发规范表 + +| 规范项 | 要求 | 示例 | 备注 | +|--------|------|------|------| +| 基础URL | 统一格式,可带可不带尾部斜杠 | `http://api.com` | 工具会自动处理 | +| 路径片段 | 使用数组传递,避免手动拼接 | `['wp-json', 'wc', 'v3']` | 提高可读性 | +| 变量路径 | 作为独立参数传递 | `orderId`, `productId` | 便于参数验证 | +| 错误处理 | 验证URL格式和参数有效性 | 检查空值、特殊字符 | 提高健壮性 | + +### 代码审查清单 + +- [ ] 是否使用了UrlUtil工具类 +- [ ] 是否避免了字符串模板拼接URL +- [ ] 是否处理了空值和特殊字符 +- [ ] 是否添加了适当的注释 +- [ ] 是否编写了单元测试 + +## 参考文档 + +- [MDN URL API文档](https://developer.mozilla.org/en-US/docs/Web/API/URL) +- [Node.js URL模块](https://nodejs.org/api/url.html) +- [RFC 3986 URI规范](https://tools.ietf.org/html/rfc3986) \ No newline at end of file diff --git a/docs/实际经验/image/使用webhook自动同步woocommerce的订单/1760338330047.png b/docs/实际经验/image/使用webhook自动同步woocommerce的订单/1760338330047.png new file mode 100644 index 0000000000000000000000000000000000000000..3ea109ac9a97567f8e2a8619ae7ed0eb6b32942c GIT binary patch literal 50641 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 EZ=9~BrT_o{ literal 0 HcmV?d00001 diff --git a/docs/实际经验/image/如何连接wordpress/1760323937560.png b/docs/实际经验/image/如何连接wordpress/1760323937560.png new file mode 100644 index 0000000000000000000000000000000000000000..dce24c427acc7303f4226b5af4df9275172dffc7 GIT binary patch literal 98359 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 f*Z*13WAX&v2b?A;3$AWK;GlQ?#/app/public/wp-content/themes/twentytwentyfive/functions.php` + +```php +add_filter( 'http_request_args', function( $args ) { + $args['reject_unsafe_urls'] = false; + return $args; +} ); + +// 跨平台获取请求头 +$headers = []; +foreach ($_SERVER as $key => $value) { + if (strpos($key, 'HTTP_') === 0) { + $header_name = str_replace('_', '-', ucwords(substr($key, 5), '-')); + $headers[$header_name] = $value; + } +} + +// 修正后的条件判断 +if ( (isset($_GET['consumer_key']) && isset($_GET['consumer_secret'])) || isset($headers['Authorization']) ) { + $_SERVER['HTTPS'] = 'on'; + if (!is_ssl()) { // WordPress内置函数检查 + wp_redirect(str_replace('http://', 'https://', $_SERVER['REQUEST_URI'])); + exit; + } +} +``` + +## 在wordpress管理端网页添加webhook + +地址: +举例说明: +![1760338330047](image/使用webhook自动同步woocommerce的订单/1760338330047.png) + +## 最终在订单更新时会调用地址,然后进而调用 syncSingleOrder 函数 + +## 备注 diff --git a/docs/实际经验/初始化API项目.md b/docs/实际经验/初始化API项目.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/实际经验/初始化woocommere.md b/docs/实际经验/初始化woocommere.md new file mode 100644 index 0000000..5788904 --- /dev/null +++ b/docs/实际经验/初始化woocommere.md @@ -0,0 +1,14 @@ +# 初始化woocommerce + +## 前提 + +- 搭建 wordpress + +## 所需wordpress插件 + +- Woocommere +- Return Refund and Exchange for WooCommerce + +## woocommerce插件初始化 + +按首页的步骤一个步骤一个步骤往下走即可 diff --git a/docs/实际经验/如何访问woocommerceAPI.md b/docs/实际经验/如何访问woocommerceAPI.md new file mode 100644 index 0000000..463514d --- /dev/null +++ b/docs/实际经验/如何访问woocommerceAPI.md @@ -0,0 +1,38 @@ +# 如何访问woocommerceAPI + +## API服务器配置 + +在 `src\config\config.local.ts` + +```ts +const config = { + wpSite: [ + // + { + id: '111', // 起一个比较大的 + wpApiUrl: 'http://wp-test.local', // wordpress地址 + consumerKey: 'ck_d6fc55914e2aba162bcf979a549e965a751e71ee', // woocommerce advanced 中创建rest api的key + consumerSecret: 'cs_5828d66ddd23f17f7c7693f4414756ddb637fb47',// woocommerce advanced 中创建rest api的key + siteName: 'Local', + // email配置对访问不重要 + email: '*', + emailPswd: '*', + }, + //... + ] +} + +``` + +## 开通woocommere 权限(key) + +key只要添加即可使用(一般测试直接添加具有 READ WRITE 权限即可) +![1760323937560](image/如何连接wordpress/1760323937560.png) + +## 常见问题 + +### SSL证书问题 + +因为是我们访问 woocommerce 所以可以直接忽略 ssl 错误(比如 axios 直接忽略) + +如果遇到SSL证书错误(如`DEPTH_ZERO_SELF_SIGNED_CERT`),请参考:[SSL证书问题解决方案](./SSL证书问题解决方案.md) diff --git a/docs/实际经验/快速搭建你的wordpress.md b/docs/实际经验/快速搭建你的wordpress.md new file mode 100644 index 0000000..23847dc --- /dev/null +++ b/docs/实际经验/快速搭建你的wordpress.md @@ -0,0 +1,5 @@ +# 如何快速搭建你的wordpress + +## 直接使用 `local` 这个软件进行搭建 +网站: https://localwp.com/ + diff --git a/docs/实际经验/网络连接问题解决方案.md b/docs/实际经验/网络连接问题解决方案.md new file mode 100644 index 0000000..f053bea --- /dev/null +++ b/docs/实际经验/网络连接问题解决方案.md @@ -0,0 +1,150 @@ +# 网络连接问题解决方案 + +## 问题描述 + +在产品同步过程中遇到 `ECONNRESET` 错误,导致同步失败。 + +## 错误分析 + +### ECONNRESET 错误原因 + +`ECONNRESET` 是一个网络连接重置错误,通常由以下原因引起: + +1. **服务器主动断开连接** + - 服务器负载过高 + - 服务器配置的连接超时 + - 服务器重启或维护 + +2. **网络不稳定** + - 网络延迟过高 + - 网络丢包 + - 防火墙或代理干预 + +3. **SSL/TLS 握手问题** + - 证书验证失败 + - SSL 协议版本不匹配 + +4. **客户端配置问题** + - 请求频率过高 + - 缺少适当的重试机制 + - 连接池配置不当 + +## 解决方案 + +### 1. 添加重试机制 + +```typescript +// 重试配置 +const maxRetries = 3; +const retryDelay = 1000; // 1秒 + +// 指数退避重试 +const delay = retryDelay * Math.pow(2, retryCount - 1); +await new Promise(resolve => setTimeout(resolve, delay)); +``` + +### 2. 优化网络请求配置 + +```typescript +const config: AxiosRequestConfig = { + method: 'GET', + url: `${wpApiUrl}/wp-json${endpoint}`, + headers: { + Authorization: `Basic ${auth}`, + 'Connection': 'keep-alive', + 'User-Agent': 'API-Client/1.0' + }, + // 添加超时配置 + timeout: 30000, // 30秒超时 + // 优化SSL配置 + httpsAgent: new (require('https').Agent)({ + rejectUnauthorized: false, // 仅用于开发环境 + keepAlive: true, + keepAliveMsecs: 1000, + maxSockets: 5, + maxFreeSockets: 2 + }), +}; +``` + +### 3. 错误处理和日志记录 + +```typescript +try { + const response = await axios.request(config); + // 处理成功响应 +} catch (error) { + if (error.code === 'ECONNRESET' || error.code === 'ETIMEDOUT' || error.code === 'ENOTFOUND') { + console.warn(`网络连接错误 (${error.code}),第 ${retryCount} 次重试...`); + // 重试逻辑 + } else { + console.error(`获取数据失败:`, error.message); + throw new Error(`网络请求失败: ${error.message}`); + } +} +``` + +### 4. 请求频率控制 + +```typescript +// 添加页面间的延迟,避免过于频繁的请求 +if (hasMore) { + await new Promise(resolve => setTimeout(resolve, 200)); +} +``` + +## 最佳实践 + +### 1. 连接池优化 + +- 使用 `keepAlive: true` 保持连接复用 +- 合理设置 `maxSockets` 和 `maxFreeSockets` +- 避免创建过多并发连接 + +### 2. 超时配置 + +- 设置合理的请求超时时间(建议 30-60 秒) +- 根据网络环境调整超时参数 + +### 3. 重试策略 + +- 使用指数退避算法 +- 限制最大重试次数 +- 只对特定错误类型进行重试 + +### 4. 错误监控 + +- 记录详细的错误日志 +- 监控网络请求成功率 +- 设置告警机制 + +## 代码实现 + +已在 `wp.service.ts` 的 `fetchPagedData` 方法中实现以下改进: + +1. ✅ 添加重试机制(最多重试3次) +2. ✅ 实现指数退避算法 +3. ✅ 优化 HTTPS Agent 配置 +4. ✅ 添加请求超时设置 +5. ✅ 改进错误处理和日志记录 +6. ✅ 添加请求间隔控制 + +## 预期效果 + +- 减少因网络波动导致的同步失败 +- 提高产品同步的成功率和稳定性 +- 提供更好的错误信息和调试支持 +- 避免对服务器造成过大压力 + +## 监控建议 + +1. 监控重试次数和成功率 +2. 记录网络错误的发生频率 +3. 观察同步任务的完成时间 +4. 设置异常告警机制 + +## 注意事项 + +- 开发环境中使用 `rejectUnauthorized: false`,生产环境应移除 +- 根据实际网络环境调整超时和重试参数 +- 定期检查和更新网络配置 \ No newline at end of file diff --git a/docs/项目概览/README.md b/docs/项目概览/README.md new file mode 100644 index 0000000..b119175 --- /dev/null +++ b/docs/项目概览/README.md @@ -0,0 +1,102 @@ +# 项目概览文档 + +本目录包含了对 `d:\workcode-new\API` 项目的全面分析和评估文档。 + +## 文档结构 + +### 📊 [项目分析报告](./项目分析报告.md) +- **项目概述**: 项目基本信息和技术栈 +- **核心业务分析**: 详细分析各业务模块的功能和亮点 +- **API设计评估**: 评估API设计质量和改进建议 +- **架构设计评估**: 分析系统架构的优缺点 +- **代码质量评估**: 代码质量和最佳实践评估 +- **业务亮点**: 项目中表现出色的业务功能 +- **改进建议**: 分优先级的改进建议 +- **总体评价**: 综合评分和总结 + +### 🏗️ [技术架构图](./技术架构图.md) +- **系统整体架构**: 系统分层架构图 +- **业务模块架构**: 各业务模块关系图 +- **数据流架构**: 数据流向和处理流程 +- **核心实体关系图**: 数据库实体关系图 +- **技术选型说明**: 技术栈选择理由和说明 + +### 🔄 [业务流程图](./业务流程图.md) +- **订单处理流程**: 从订单创建到完成的完整流程 +- **产品同步流程**: WooCommerce产品同步机制 +- **库存管理流程**: 库存操作和管理流程 +- **物流发货流程**: 物流服务商集成和发货流程 +- **用户认证流程**: JWT认证和授权流程 +- **数据同步流程**: 定时同步和异常处理 +- **异常处理流程**: 系统异常处理机制 + +## 项目核心特点 + +### ✨ 主要优势 +1. **完整的电商业务覆盖**: 产品、订单、库存、物流全流程管理 +2. **多平台集成能力**: 与WooCommerce深度集成,支持多站点管理 +3. **强大的物流管理**: 集成多家物流服务商,智能选择最优方案 +4. **现代化技术栈**: 基于Midway.js + TypeScript,代码质量高 +5. **清晰的架构设计**: 分层架构,职责分离,可维护性好 + +### 🎯 核心业务模块 +- **产品管理系统** ⭐⭐⭐⭐⭐ +- **订单管理系统** ⭐⭐⭐⭐⭐ +- **库存管理系统** ⭐⭐⭐⭐ +- **物流管理系统** ⭐⭐⭐⭐ +- **客户管理系统** ⭐⭐⭐ + +### 🔧 技术栈 +- **后端框架**: Midway.js 3.20.x +- **开发语言**: TypeScript 5.9.x +- **数据库**: MySQL + TypeORM +- **认证**: JWT +- **API文档**: Swagger +- **第三方集成**: WooCommerce, FreightCom, CanadaPost, UniExpress + +## 评估结果 + +### 综合评分: ⭐⭐⭐⭐ (4/5星) + +这是一个**架构清晰、功能完整**的电商中台系统,在产品管理、订单处理、库存管理和物流集成方面表现出色。代码质量良好,使用了现代化的技术栈和最佳实践。 + +### 主要优势 +- ✅ 业务逻辑完整,覆盖电商核心场景 +- ✅ 多平台集成能力强,WooCommerce集成专业 +- ✅ 代码架构清晰,可维护性好 +- ✅ 物流管理功能强大,支持多服务商 + +### 待改进项 +- ⚠️ 测试覆盖率不足 +- ⚠️ 缺少缓存和性能优化 +- ⚠️ 客户管理功能相对简单 +- ⚠️ 监控和日志机制需要完善 + +## 改进建议优先级 + +### 🔴 高优先级 +1. 增加缓存机制 (Redis) +2. 完善测试用例 +3. 优化数据库查询 +4. 增加日志记录 + +### 🟡 中优先级 +1. 客户管理增强 +2. API版本控制 +3. 监控告警机制 +4. 性能优化 + +### 🟢 低优先级 +1. 代码重构 +2. 文档完善 +3. 国际化支持 + +## 总结 + +这是一个具有**商业价值**的成熟项目,适合作为电商中台的基础架构。项目在核心业务功能上表现出色,特别是与第三方平台的集成能力。在现有基础上继续优化性能、完善测试和监控,将是一个非常优秀的企业级电商解决方案。 + +--- + +*文档生成时间: 2024年* +*分析范围: d:\workcode-new\API 完整项目* +*评估维度: 技术架构、业务功能、代码质量、最佳实践* \ No newline at end of file diff --git a/docs/项目概览/业务流程图.md b/docs/项目概览/业务流程图.md new file mode 100644 index 0000000..dff97be --- /dev/null +++ b/docs/项目概览/业务流程图.md @@ -0,0 +1,233 @@ +# 业务流程图 + +## 订单处理流程 + +```mermaid +graph TD + A[WooCommerce新订单] --> B[Webhook接收] + B --> C[订单数据验证] + C --> D[创建内部订单] + D --> E[库存检查] + E --> F{库存充足?} + F -->|是| G[预留库存] + F -->|否| H[标记缺货] + G --> I[订单确认] + H --> I + I --> J[等待发货] + J --> K[生成发货单] + K --> L[选择物流服务商] + L --> M[计算运费] + M --> N[生成运单] + N --> O[更新库存] + O --> P[同步到WooCommerce] + P --> Q[发送跟踪信息] + Q --> R[订单完成] +``` + +## 产品同步流程 + +```mermaid +graph TD + A[WooCommerce产品更新] --> B[Webhook触发] + B --> C[获取产品数据] + C --> D[数据格式转换] + D --> E{本地产品存在?} + E -->|是| F[更新本地产品] + E -->|否| G[创建新产品] + F --> H[同步变体信息] + G --> H + H --> I[更新分类关系] + I --> J[同步库存信息] + J --> K[更新产品状态] + K --> L[触发相关业务] + L --> M[同步完成] +``` + +## 库存管理流程 + +```mermaid +graph TD + A[库存操作请求] --> B{操作类型} + B -->|入库| C[采购订单接收] + B -->|出库| D[订单发货] + B -->|调拨| E[仓库间转移] + B -->|盘点| F[库存盘点] + + C --> G[验证采购单] + G --> H[更新库存数量] + H --> I[创建库存记录] + + D --> J[验证订单] + J --> K[检查库存] + K --> L{库存充足?} + L -->|是| M[扣减库存] + L -->|否| N[库存不足警告] + M --> I + N --> O[处理缺货] + + E --> P[验证调拨单] + P --> Q[源仓库扣减] + Q --> R[目标仓库增加] + R --> I + + F --> S[盘点差异分析] + S --> T[调整库存] + T --> I + + I --> U[更新库存统计] + U --> V[触发库存预警] + V --> W[流程结束] +``` + +## 物流发货流程 + +```mermaid +graph TD + A[订单待发货] --> B[选择物流服务商] + B --> C{服务商类型} + C -->|FreightCom| D[FreightCom API] + C -->|CanadaPost| E[CanadaPost API] + C -->|UniExpress| F[UniExpress API] + + D --> G[获取运费报价] + E --> G + F --> G + + G --> H[比较运费] + H --> I[选择最优方案] + I --> J[创建运单] + J --> K[生成跟踪号] + K --> L[打印运单标签] + L --> M[更新订单状态] + M --> N[同步到WooCommerce] + N --> O[发送客户通知] + O --> P[开始物流跟踪] + P --> Q{包裹送达?} + Q -->|否| R[继续跟踪] + Q -->|是| S[订单完成] + R --> P +``` + +## 用户认证流程 + +```mermaid +graph TD + A[用户登录请求] --> B[验证用户名密码] + B --> C{验证成功?} + C -->|否| D[返回错误信息] + C -->|是| E[生成JWT Token] + E --> F[返回Token给客户端] + F --> G[客户端存储Token] + G --> H[后续请求携带Token] + H --> I[服务器验证Token] + I --> J{Token有效?} + J -->|否| K[返回401未授权] + J -->|是| L[处理业务请求] + L --> M[返回响应] +``` + +## 数据同步流程 + +```mermaid +graph TD + A[定时任务启动] --> B[检查同步队列] + B --> C{有待同步数据?} + C -->|否| D[等待下次执行] + C -->|是| E[获取同步数据] + E --> F{数据类型} + F -->|产品| G[同步产品数据] + F -->|订单| H[同步订单数据] + F -->|库存| I[同步库存数据] + + G --> J[调用WooCommerce API] + H --> J + I --> J + + J --> K{API调用成功?} + K -->|否| L[记录错误日志] + K -->|是| M[更新本地数据] + L --> N[加入重试队列] + M --> O[标记同步完成] + N --> P[等待重试] + O --> Q[继续处理下一条] + P --> Q + Q --> B +``` + +## 异常处理流程 + +```mermaid +graph TD + A[系统异常发生] --> B{异常类型} + B -->|业务异常| C[记录业务日志] + B -->|系统异常| D[记录系统日志] + B -->|网络异常| E[记录网络日志] + + C --> F[返回业务错误码] + D --> G[返回系统错误码] + E --> H[返回网络错误码] + + F --> I[客户端错误处理] + G --> J[系统监控告警] + H --> K[网络重试机制] + + I --> L[用户友好提示] + J --> M[运维人员处理] + K --> N{重试成功?} + + N -->|是| O[继续正常流程] + N -->|否| P[标记失败] + P --> M +``` + +## 核心业务场景 + +### 1. 电商订单全生命周期 + +``` +订单创建 → 库存预留 → 支付确认 → 拣货打包 → 物流发货 → 在途跟踪 → 签收完成 + ↓ ↓ ↓ ↓ ↓ ↓ ↓ + WP同步 库存扣减 状态更新 生成运单 跟踪同步 状态更新 订单完成 +``` + +### 2. 库存管理核心场景 + +``` +采购入库 → 质检验收 → 上架可售 → 订单扣减 → 库存预警 → 补货采购 + ↓ ↓ ↓ ↓ ↓ ↓ + 记录创建 状态更新 库存增加 库存减少 预警通知 采购单生成 +``` + +### 3. 产品管理核心场景 + +``` +产品创建 → 分类设置 → 变体管理 → 库存关联 → 上架销售 → 数据同步 + ↓ ↓ ↓ ↓ ↓ ↓ + 基础信息 分类关系 SKU管理 库存绑定 状态发布 WP同步 +``` + +## 业务规则说明 + +### 订单处理规则 +1. **订单状态流转**: 严格按照预定义状态流转,不允许跳跃 +2. **库存预留**: 订单确认后立即预留库存,避免超卖 +3. **自动取消**: 超时未支付订单自动取消并释放库存 +4. **退款处理**: 退款后自动恢复库存并同步状态 + +### 库存管理规则 +1. **先进先出**: 出库时优先使用较早入库的商品 +2. **安全库存**: 设置最低库存预警线,低于阈值自动预警 +3. **多仓管理**: 支持多个仓库点独立管理库存 +4. **实时同步**: 库存变动实时同步到各个销售渠道 + +### 物流管理规则 +1. **智能选择**: 根据重量、体积、目的地自动选择最优物流方案 +2. **运费计算**: 实时获取各物流商报价并比较 +3. **异常处理**: 物流异常时自动重试或转换服务商 +4. **状态跟踪**: 定时同步物流状态并通知客户 + +### 数据同步规则 +1. **增量同步**: 优先使用增量同步减少数据传输量 +2. **冲突解决**: 数据冲突时以最新时间戳为准 +3. **失败重试**: 同步失败时按指数退避策略重试 +4. **数据校验**: 同步前后进行数据完整性校验 \ No newline at end of file diff --git a/docs/项目概览/技术架构图.md b/docs/项目概览/技术架构图.md new file mode 100644 index 0000000..a301ba5 --- /dev/null +++ b/docs/项目概览/技术架构图.md @@ -0,0 +1,200 @@ +# 技术架构图 + +## 系统整体架构 + +``` +┌─────────────────────────────────────────────────────────────┐ +│ 前端应用层 │ +├─────────────────────────────────────────────────────────────┤ +│ API网关/负载均衡 │ +├─────────────────────────────────────────────────────────────┤ +│ Midway.js 应用层 │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │ Controller │ │ Middleware │ │ Guards │ │ +│ │ 层 │ │ 层 │ │ 层 │ │ +│ └─────────────┘ └─────────────┘ └─────────────┘ │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │ Service │ │ DTO │ │ Utils │ │ +│ │ 层 │ │ 层 │ │ 层 │ │ +│ └─────────────┘ └─────────────┘ └─────────────┘ │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │ Entity │ │ Enum │ │ Config │ │ +│ │ 层 │ │ 层 │ │ 层 │ │ +│ └─────────────┘ └─────────────┘ └─────────────┘ │ +├─────────────────────────────────────────────────────────────┤ +│ 数据持久层 │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │ MySQL │ │ Redis │ │ File Store │ │ +│ │ Database │ │ Cache │ │ (Future) │ │ +│ └─────────────┘ └─────────────┘ └─────────────┘ │ +├─────────────────────────────────────────────────────────────┤ +│ 第三方服务集成 │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │WooCommerce │ │ FreightCom │ │ CanadaPost │ │ +│ │ API │ │ 物流API │ │ 物流API │ │ +│ └─────────────┘ └─────────────┘ └─────────────┘ │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │ UniExpress │ │ 邮件服务 │ │ 其他API │ │ +│ │ 物流API │ │ SMTP │ │ 服务 │ │ +│ └─────────────┘ └─────────────┘ └─────────────┘ │ +└─────────────────────────────────────────────────────────────┘ +``` + +## 业务模块架构 + +``` +┌─────────────────────────────────────────────────────────────┐ +│ 业务模块层 │ +│ │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │ 产品管理 │ │ 订单管理 │ │ 库存管理 │ │ +│ │ │ │ │ │ │ │ +│ │ • 产品CRUD │ │ • 订单同步 │ │ • 库存追踪 │ │ +│ │ • 分类管理 │ │ • 状态管理 │ │ • 多仓管理 │ │ +│ │ • 变体管理 │ │ • 退款处理 │ │ • 采购管理 │ │ +│ │ • WP同步 │ │ • 统计分析 │ │ • 调拨管理 │ │ +│ └─────────────┘ └─────────────┘ └─────────────┘ │ +│ │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │ 物流管理 │ │ 客户管理 │ │ 用户管理 │ │ +│ │ │ │ │ │ │ │ +│ │ • 运单生成 │ │ • 客户信息 │ │ • 用户认证 │ │ +│ │ • 物流集成 │ │ • 标签管理 │ │ • 权限管理 │ │ +│ │ • 运费计算 │ │ • 评级系统 │ │ • 角色管理 │ │ +│ │ • 状态同步 │ │ • 行为分析 │ │ • JWT令牌 │ │ +│ └─────────────┘ └─────────────┘ └─────────────┘ │ +│ │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │ 统计分析 │ │ Webhook │ │ 系统管理 │ │ +│ │ │ │ │ │ │ │ +│ │ • 销售统计 │ │ • WP事件 │ │ • 配置管理 │ │ +│ │ • 库存统计 │ │ • 订单同步 │ │ • 定时任务 │ │ +│ │ • 客户统计 │ │ • 产品同步 │ │ • 日志管理 │ │ +│ │ • 报表生成 │ │ • 状态更新 │ │ • 监控告警 │ │ +│ └─────────────┘ └─────────────┘ └─────────────┘ │ +└─────────────────────────────────────────────────────────────┘ +``` + +## 数据流架构 + +``` +┌─────────────────────────────────────────────────────────────┐ +│ 数据流向图 │ +│ │ +│ WooCommerce ──────┐ │ +│ │ │ │ +│ │ Webhook │ API调用 │ +│ ▼ ▼ │ +│ ┌─────────────────────────────────┐ │ +│ │ API Gateway │ │ +│ │ (Midway.js App) │ │ +│ └─────────────────────────────────┘ │ +│ │ │ +│ ▼ │ +│ ┌─────────────────────────────────┐ │ +│ │ Controller Layer │ │ +│ │ • 请求验证 │ │ +│ │ • 参数转换 │ │ +│ │ • 响应格式化 │ │ +│ └─────────────────────────────────┘ │ +│ │ │ +│ ▼ │ +│ ┌─────────────────────────────────┐ │ +│ │ Service Layer │ │ +│ │ • 业务逻辑处理 │ │ +│ │ • 数据转换 │ │ +│ │ • 第三方服务调用 │ │ +│ └─────────────────────────────────┘ │ +│ │ │ +│ ▼ │ +│ ┌─────────────────────────────────┐ │ +│ │ Entity Layer │ │ +│ │ • ORM映射 │ │ +│ │ • 数据验证 │ │ +│ │ • 关系管理 │ │ +│ └─────────────────────────────────┘ │ +│ │ │ +│ ▼ │ +│ ┌─────────────────────────────────┐ │ +│ │ MySQL Database │ │ +│ │ • 数据持久化 │ │ +│ │ • 事务管理 │ │ +│ │ • 索引优化 │ │ +│ └─────────────────────────────────┘ │ +│ │ +│ 第三方服务 ◄──────────────────────── Service Layer │ +│ • FreightCom │ +│ • CanadaPost │ +│ • UniExpress │ +│ • SMTP邮件 │ +└─────────────────────────────────────────────────────────────┘ +``` + +## 核心实体关系图 + +``` +┌─────────────────────────────────────────────────────────────┐ +│ 核心实体关系 │ +│ │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │ Product │ │ Category │ │ Flavors │ │ +│ │ │────│ │ │ │ │ +│ │ • id │ │ • id │ │ • id │ │ +│ │ • name │ │ • name │ │ • name │ │ +│ │ • sku │ │ • slug │ │ • value │ │ +│ │ • price │ └─────────────┘ └─────────────┘ │ +│ └─────────────┘ │ +│ │ │ +│ │ 1:N │ +│ ▼ │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │ Variation │ │ Stock │ │ StockPoint │ │ +│ │ │ │ │────│ │ │ +│ │ • id │ │ • id │ │ • id │ │ +│ │ • productId │ │ • quantity │ │ • name │ │ +│ │ • sku │ │ • productSku│ │ • address │ │ +│ │ • price │ └─────────────┘ └─────────────┘ │ +│ └─────────────┘ │ +│ │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │ Order │ │ OrderItem │ │ Customer │ │ +│ │ │────│ │ │ │ │ +│ │ • id │ │ • id │ │ • id │ │ +│ │ • status │ │ • orderId │ │ • email │ │ +│ │ • total │ │ • productId │ │ • rate │ │ +│ │ • customerId│────│ • quantity │ └─────────────┘ │ +│ └─────────────┘ └─────────────┘ │ +│ │ │ +│ │ 1:N │ +│ ▼ │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │ Shipment │ │ShipmentItem │ │ Service │ │ +│ │ │────│ │ │ │ │ +│ │ • id │ │ • id │ │ • id │ │ +│ │ • orderId │ │ • shipmentId│ │ • name │ │ +│ │ • trackingNo│ │ • quantity │ │ • type │ │ +│ │ • status │ └─────────────┘ │ • config │ │ +│ └─────────────┘ └─────────────┘ │ +└─────────────────────────────────────────────────────────────┘ +``` + +## 技术选型说明 + +### 框架选择 +- **Midway.js**: 企业级Node.js框架,提供完整的IoC容器和装饰器支持 +- **TypeScript**: 强类型支持,提高代码质量和可维护性 +- **TypeORM**: 功能强大的ORM框架,支持多种数据库 + +### 数据库选择 +- **MySQL**: 成熟稳定的关系型数据库,适合电商业务的复杂关系 +- **Redis**: (建议添加) 高性能缓存,提升系统响应速度 + +### 第三方集成 +- **WooCommerce**: 主流电商平台,API完善 +- **物流服务商**: 多家物流公司集成,提供灵活的物流选择 +- **JWT**: 无状态认证,适合分布式系统 + +### 开发工具 +- **Swagger**: API文档自动生成 +- **ESLint**: 代码规范检查 +- **Jest**: 单元测试框架 \ No newline at end of file diff --git a/docs/项目概览/项目分析报告.md b/docs/项目概览/项目分析报告.md new file mode 100644 index 0000000..95a9502 --- /dev/null +++ b/docs/项目概览/项目分析报告.md @@ -0,0 +1,198 @@ +# API项目分析报告 + +## 项目概述 + +这是一个基于Midway.js框架开发的电商中台API系统,主要服务于电商业务的后端管理和数据处理。项目采用TypeScript开发,使用MySQL作为数据库,集成了多个第三方服务。 + +## 技术栈分析 + +### 核心框架 +- **Midway.js 3.20.x**: 企业级Node.js框架,提供依赖注入、装饰器等特性 +- **TypeScript 5.9.x**: 强类型语言支持 +- **TypeORM 0.3.x**: ORM框架,支持实体关系映射 +- **Koa**: Web服务器框架 + +### 主要依赖 +- **@midwayjs/swagger**: API文档生成 +- **@midwayjs/jwt**: JWT认证 +- **@midwayjs/validate**: 数据验证 +- **@midwayjs/cron**: 定时任务 +- **MySQL2**: 数据库驱动 +- **Axios**: HTTP客户端 +- **bcryptjs**: 密码加密 +- **dayjs**: 日期处理 + +## 核心业务分析 + +### 1. 电商产品管理 ⭐⭐⭐⭐⭐ +**业务描述**: 完整的产品管理体系,支持多站点产品同步 + +**精彩之处**: +- 支持WooCommerce产品同步,实现多平台产品管理 +- 产品分类、口味(Flavors)、强度(Strength)等属性管理完善 +- 产品变体(Variation)支持,适应电商复杂SKU管理 +- 产品状态管理完善,支持发布、草稿、私有等多种状态 + +**核心实体**: +- `Product`: 核心产品实体 +- `WpProduct`: WooCommerce产品映射 +- `Variation`: 产品变体 +- `Category`: 产品分类 +- `Flavors`: 口味管理 +- `Strength`: 强度管理 + +### 2. 订单管理系统 ⭐⭐⭐⭐⭐ +**业务描述**: 完整的订单生命周期管理,从创建到发货的全流程 + +**精彩之处**: +- 双状态管理:WooCommerce状态 + ERP内部状态 +- 完整的订单项目管理,支持原始订单和销售订单分离 +- 订单退款、优惠券、运费等复杂业务场景支持 +- 订单同步机制,支持从WooCommerce自动同步订单 +- 订单统计分析功能,支持多维度数据分析 + +**核心实体**: +- `Order`: 订单主体 +- `OrderItem`: 订单项目 +- `OrderSale`: 销售订单项 +- `OrderRefund`: 退款管理 +- `OrderShipping`: 运输信息 + +### 3. 库存管理系统 ⭐⭐⭐⭐ +**业务描述**: 多仓库库存管理,支持采购、调拨、出入库记录 + +**精彩之处**: +- 多仓库点(StockPoint)管理 +- 完整的库存记录追踪,每次操作都有记录 +- 采购订单管理,支持采购入库流程 +- 库存调拨功能,支持仓库间货物转移 +- 库存预警和统计功能 + +**核心实体**: +- `Stock`: 库存主体 +- `StockPoint`: 仓库点 +- `StockRecord`: 库存记录 +- `PurchaseOrder`: 采购订单 +- `Transfer`: 调拨单 + +### 4. 物流管理系统 ⭐⭐⭐⭐ +**业务描述**: 集成多个物流服务商的发货管理系统 + +**精彩之处**: +- 集成多个物流服务商:FreightCom、CanadaPost、UniExpress +- 运费计算和比较功能 +- 自动生成运单和跟踪号 +- 物流状态同步到WooCommerce +- 支持运单取消和重新发货 + +**核心实体**: +- `Shipment`: 运单管理 +- `ShipmentItem`: 运单项目 +- `Service`: 物流服务商 +- `ShippingAddress`: 收货地址 + +### 5. 客户管理系统 ⭐⭐⭐ +**业务描述**: 客户信息管理和标签系统 + +**改进空间**: +- 客户实体过于简单,只有email和rate字段 +- 缺少客户详细信息管理 +- 客户行为分析功能有限 + +## API设计评估 + +### 优点 ⭐⭐⭐⭐ +1. **RESTful设计**: API遵循REST规范,路由设计清晰 +2. **统一响应格式**: 使用`successResponse`和`errorResponse`统一响应格式 +3. **Swagger文档**: 完整的API文档支持 +4. **参数验证**: 使用DTO进行参数验证 +5. **错误处理**: 统一的错误处理机制 + +### 改进建议 +1. **API版本管理**: 缺少版本控制机制 +2. **批量操作**: 部分API缺少批量操作支持 +3. **分页标准化**: 分页参数不够统一 + +## 架构设计评估 + +### 优点 ⭐⭐⭐⭐ +1. **分层架构**: Controller-Service-Entity分层清晰 +2. **依赖注入**: 使用Midway.js的依赖注入,代码解耦良好 +3. **实体设计**: 数据库实体设计合理,关系清晰 +4. **配置管理**: 配置文件管理规范 +5. **中间件**: 认证、跨域等中间件使用合理 + +### 改进建议 +1. **缓存策略**: 缺少Redis等缓存机制 +2. **日志管理**: 日志记录不够完善 +3. **监控告警**: 缺少系统监控和告警机制 + +## 代码质量评估 + +### 优点 ⭐⭐⭐⭐ +1. **TypeScript**: 强类型支持,代码可维护性好 +2. **装饰器**: 合理使用装饰器简化代码 +3. **工具函数**: 响应处理、分页等工具函数封装良好 +4. **枚举管理**: 业务状态使用枚举管理,避免魔法数字 + +### 待改进 +1. **测试覆盖**: 测试用例不足,只有基础的API测试 +2. **代码注释**: 部分复杂业务逻辑缺少注释 +3. **异常处理**: 部分异常处理不够细致 +4. **性能优化**: 部分查询可能存在N+1问题 + +## 业务亮点 + +### 1. 多平台集成 ⭐⭐⭐⭐⭐ +- WooCommerce集成做得非常好,支持产品、订单双向同步 +- Webhook机制处理实时数据同步 +- 多站点管理,支持不同电商平台 + +### 2. 物流集成 ⭐⭐⭐⭐ +- 集成多个物流服务商,提供运费比较 +- 自动化发货流程,减少人工操作 +- 物流状态实时同步 + +### 3. 库存管理 ⭐⭐⭐⭐ +- 完整的库存追踪机制 +- 支持多仓库管理 +- 采购和调拨流程完善 + +## 改进建议 + +### 高优先级 +1. **增加缓存机制**: 对频繁查询的数据添加Redis缓存 +2. **完善测试用例**: 增加单元测试和集成测试 +3. **优化数据库查询**: 解决潜在的N+1查询问题 +4. **增加日志记录**: 完善业务操作日志 + +### 中优先级 +1. **客户管理增强**: 完善客户信息管理功能 +2. **API版本控制**: 添加API版本管理 +3. **监控告警**: 添加系统监控和告警机制 +4. **性能优化**: 对慢查询进行优化 + +### 低优先级 +1. **代码重构**: 部分长方法可以拆分 +2. **文档完善**: 增加业务流程文档 +3. **国际化支持**: 添加多语言支持 + +## 总体评价 + +这是一个**架构清晰、功能完整**的电商中台系统。项目在产品管理、订单处理、库存管理和物流集成方面表现出色,特别是与WooCommerce的集成做得非常专业。代码质量良好,使用了现代化的技术栈和最佳实践。 + +**核心优势**: +- 业务逻辑完整,覆盖电商核心场景 +- 多平台集成能力强 +- 代码架构清晰,可维护性好 +- 物流管理功能强大 + +**主要不足**: +- 测试覆盖率不足 +- 缺少缓存和性能优化 +- 客户管理功能相对简单 +- 监控和日志机制需要完善 + +**综合评分**: ⭐⭐⭐⭐ (4/5星) + +这是一个具有商业价值的成熟项目,适合作为电商中台的基础架构,在现有基础上继续优化和扩展功能。 \ No newline at end of file