docs: 添加项目文档和技术架构说明
添加了关于项目概览、技术架构、业务流程和最佳实践的详细文档,包括: 1. 项目分析报告和评估结果 2. 系统架构图和核心实体关系 3. 订单处理、库存管理等业务流程 4. URL拼接、SSL证书处理等最佳实践方案 5. WooCommerce集成和API访问指南
This commit is contained in:
commit
d467236575
|
|
@ -0,0 +1,24 @@
|
|||
version: '3.8'
|
||||
|
||||
services:
|
||||
mysql-container:
|
||||
image: mysql:8.0
|
||||
container_name: mysql-container
|
||||
restart: on-failure
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: root
|
||||
MYSQL_DATABASE: mydb
|
||||
ports:
|
||||
- "23306:3306"
|
||||
volumes:
|
||||
- ./mysql/data:/var/lib/mysql
|
||||
networks:
|
||||
- mysql-network
|
||||
|
||||
volumes:
|
||||
mysql-data:
|
||||
driver: local
|
||||
|
||||
networks:
|
||||
mysql-network:
|
||||
driver: bridge
|
||||
|
|
@ -0,0 +1,224 @@
|
|||
# SSL证书问题解决方案
|
||||
|
||||
## 【背景意义】
|
||||
|
||||
在开发环境中连接WordPress API时,经常遇到SSL证书相关错误,特别是`DEPTH_ZERO_SELF_SIGNED_CERT`错误。这类问题会阻止API正常调用,影响开发进度。
|
||||
|
||||
## 【概念定义】
|
||||
|
||||
### SSL证书错误类型对比表
|
||||
|
||||
| 错误类型 | 错误代码 | 含义 | 常见场景 |
|
||||
|---------|---------|------|---------|
|
||||
| DEPTH_ZERO_SELF_SIGNED_CERT | self-signed certificate | 自签名证书 | 本地开发环境 |
|
||||
| CERT_HAS_EXPIRED | certificate has expired | 证书已过期 | 测试环境 |
|
||||
| UNABLE_TO_VERIFY_LEAF_SIGNATURE | unable to verify the first certificate | 无法验证证书链 | 配置错误的服务器 |
|
||||
| CERT_UNTRUSTED | certificate not trusted | 证书不受信任 | 使用了未知CA的证书 |
|
||||
|
||||
## 【使用流程】
|
||||
|
||||
### 方案一:忽略SSL验证(仅开发环境)
|
||||
|
||||
#### 1. 修改axios配置
|
||||
|
||||
在`src/service/wp.service.ts`中的`fetchPagedData`方法添加SSL配置:
|
||||
|
||||
```typescript
|
||||
// 在fetchPagedData方法中修改config配置
|
||||
const config: AxiosRequestConfig = {
|
||||
method: 'GET',
|
||||
url: `${wpApiUrl}/wp-json${endpoint}`,
|
||||
headers: {
|
||||
Authorization: `Basic ${auth}`, // 基础认证头
|
||||
},
|
||||
params: {
|
||||
page, // 当前页码
|
||||
per_page: perPage, // 每页数量
|
||||
},
|
||||
// 添加SSL配置 - 仅用于开发环境
|
||||
httpsAgent: new (require('https').Agent)({
|
||||
rejectUnauthorized: false // 忽略SSL证书验证
|
||||
}),
|
||||
// 设置超时时间
|
||||
timeout: 30000 // 30秒超时
|
||||
};
|
||||
```
|
||||
|
||||
#### 2. 全局axios配置
|
||||
|
||||
在项目入口文件中添加全局配置:
|
||||
|
||||
```typescript
|
||||
// 在src/configuration.ts或app.ts中添加
|
||||
import axios from 'axios';
|
||||
import https from 'https';
|
||||
|
||||
// 仅在开发环境中忽略SSL验证
|
||||
if (process.env.NODE_ENV === 'development') {
|
||||
axios.defaults.httpsAgent = new https.Agent({
|
||||
rejectUnauthorized: false // 忽略自签名证书
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
### 方案二:环境变量控制(推荐)
|
||||
|
||||
#### 1. 创建环境配置
|
||||
|
||||
在`.env`文件中添加:
|
||||
|
||||
```bash
|
||||
# SSL配置
|
||||
NODE_TLS_REJECT_UNAUTHORIZED=0 # 仅开发环境使用
|
||||
WP_API_TIMEOUT=30000 # API超时时间
|
||||
WP_API_VERIFY_SSL=false # 是否验证SSL
|
||||
```
|
||||
|
||||
#### 2. 动态SSL配置
|
||||
|
||||
```typescript
|
||||
// 在wp.service.ts中添加动态配置
|
||||
import { Config } from '@midwayjs/core';
|
||||
|
||||
@Provide()
|
||||
export class WPService {
|
||||
@Config('wpSite')
|
||||
sites: WpSite[];
|
||||
|
||||
// 获取SSL配置
|
||||
private getHttpsAgent() {
|
||||
const verifySSL = process.env.WP_API_VERIFY_SSL !== 'false';
|
||||
|
||||
if (!verifySSL) {
|
||||
return new (require('https').Agent)({
|
||||
rejectUnauthorized: false // 开发环境忽略SSL验证
|
||||
});
|
||||
}
|
||||
|
||||
return undefined; // 生产环境使用默认配置
|
||||
}
|
||||
|
||||
async fetchPagedData<T>(
|
||||
endpoint: string,
|
||||
site: WpSite,
|
||||
page: number = 1,
|
||||
perPage: number = 100
|
||||
): Promise<T[]> {
|
||||
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/)
|
||||
|
|
@ -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<T>(
|
||||
endpoint: string,
|
||||
site: WpSite,
|
||||
page: number = 1,
|
||||
perPage: number = 100
|
||||
): Promise<T[]> {
|
||||
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<string, any>) {
|
||||
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<string, string>();
|
||||
|
||||
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)
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 50 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 96 KiB |
|
|
@ -0,0 +1,42 @@
|
|||
# 使用webhook自动同步woocommerce的订单
|
||||
|
||||
## erp-API 服务非 https 也可用配置
|
||||
|
||||
webhook 调用的时候默认是需要 https,但开发时本地一般不配置 ssl(或者只是自签名),所以需要在 wordpress 中添加非 https 也可用配置。
|
||||
执行:在你应用的主题对应的 `functions.php` 中添加以下代码(可以放在最后)即可访问非https地址
|
||||
备注:路径:比如你应用的主题是 `twentytwentyfive`,则对应的文件路径是 `<siteFolder>/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
|
||||
|
||||
地址: <http://wp-test.local/wp-admin/admin.php?page=wc-settings&tab=advanced§ion=webhooks>
|
||||
举例说明:
|
||||

|
||||
|
||||
## 最终在订单更新时会调用地址,然后进而调用 syncSingleOrder 函数
|
||||
|
||||
## 备注
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
# 初始化woocommerce
|
||||
|
||||
## 前提
|
||||
|
||||
- 搭建 wordpress
|
||||
|
||||
## 所需wordpress插件
|
||||
|
||||
- Woocommere
|
||||
- Return Refund and Exchange for WooCommerce
|
||||
|
||||
## woocommerce插件初始化
|
||||
|
||||
按首页的步骤一个步骤一个步骤往下走即可
|
||||
|
|
@ -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 权限即可)
|
||||

|
||||
|
||||
## 常见问题
|
||||
|
||||
### SSL证书问题
|
||||
|
||||
因为是我们访问 woocommerce 所以可以直接忽略 ssl 错误(比如 axios 直接忽略)
|
||||
|
||||
如果遇到SSL证书错误(如`DEPTH_ZERO_SELF_SIGNED_CERT`),请参考:[SSL证书问题解决方案](./SSL证书问题解决方案.md)
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
# 如何快速搭建你的wordpress
|
||||
|
||||
## 直接使用 `local` 这个软件进行搭建
|
||||
网站: https://localwp.com/
|
||||
|
||||
|
|
@ -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`,生产环境应移除
|
||||
- 根据实际网络环境调整超时和重试参数
|
||||
- 定期检查和更新网络配置
|
||||
|
|
@ -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 完整项目*
|
||||
*评估维度: 技术架构、业务功能、代码质量、最佳实践*
|
||||
|
|
@ -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. **数据校验**: 同步前后进行数据完整性校验
|
||||
|
|
@ -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**: 单元测试框架
|
||||
|
|
@ -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星)
|
||||
|
||||
这是一个具有商业价值的成熟项目,适合作为电商中台的基础架构,在现有基础上继续优化和扩展功能。
|
||||
Loading…
Reference in New Issue