|
|
@@ -4,23 +4,24 @@
|
|
|
> 本项目为**全新项目,尚未上线**,当前处于 **MVP(最小可行产品)阶段**。
|
|
|
> 本文档描述的是 MVP 版本的架构设计,后续将根据业务发展和技术演进持续优化。
|
|
|
>
|
|
|
-> 版本:v1.0-MVP | 更新日期:2026-06-16 | 状态:开发中
|
|
|
+> 版本:v1.1-MVP | 更新日期:2026-06-25 | 状态:开发中
|
|
|
|
|
|
---
|
|
|
|
|
|
## 1. 技术栈
|
|
|
|
|
|
-| 层次 | 技术 | 版本 | MVP说明 |
|
|
|
+| 层次 | 技术 | 版本 | MVP状态 |
|
|
|
|------|------|------|---------|
|
|
|
| 语言 | Java | 17 | ✅ |
|
|
|
| 框架 | Spring Boot | 3.5.14 | ✅ |
|
|
|
| ORM | MyBatis-Plus | 3.5.16 | ✅ |
|
|
|
-| 数据库 | MySQL | 8.0+ | ✅ |
|
|
|
-| 缓存 | Redis (Lettuce) | 6.0+ | ⚠️ Mock实现,生产环境需接入真实Redis |
|
|
|
+| 数据库 | MySQL | 8.0+(驱动 9.3.0) | ✅ |
|
|
|
+| 缓存 | Redis (Lettuce) | 6.0+ | ✅ 已接入真实Redis |
|
|
|
| 认证 | JWT (jjwt) | 0.12.6 | ✅ |
|
|
|
+| 安全 | Spring Security + BouncyCastle | 1.84 | ✅ |
|
|
|
| 短信 | 阿里云 SMS | 4.5.1 | ✅ |
|
|
|
+| 二维码 | Google ZXing | 3.5.3 | ✅ |
|
|
|
| 工具库 | Hutool | 5.8.44 | ✅ |
|
|
|
-| 安全 | Spring Security + BouncyCastle | 1.84 | ✅ |
|
|
|
| 构建 | Maven | 3.8+ | ✅ |
|
|
|
|
|
|
---
|
|
|
@@ -31,11 +32,12 @@
|
|
|
|
|
|
```
|
|
|
zhijiayun-pharmacy (父工程)
|
|
|
-├── zhijiayun-common # 公共模块:Result、ErrorCode、BusinessException
|
|
|
-├── zhijiayun-user # 用户模块:认证、等级、优惠券、爬虫配额
|
|
|
-├── zhijiayun-invite # 邀请模块:邀请码、裂变、运营配置
|
|
|
-├── zhijiayun-payment # 支付模块(预留)
|
|
|
-└── zhijiayun-gateway # 网关模块:聚合启动、请求日志、限流
|
|
|
+├── zhijiayun-common # 公共模块:Result、ErrorCode、BusinessException、TraceIdGenerator、ValidateUtil
|
|
|
+├── zhijiayun-user # 用户模块:认证、会员、优惠券、爬虫配额、搜索、关注、营业执照、审计日志
|
|
|
+├── zhijiayun-invite # 邀请模块:邀请码、裂变、会员奖励、运营配置
|
|
|
+├── zhijiayun-payment # 支付模块:微信/支付宝支付、订单管理、套餐方案、二维码生成
|
|
|
+├── zhijiayun-gateway # 网关模块:聚合启动、请求日志、Redis限流、全局异常处理
|
|
|
+└── zhijiayun-test # 测试模块:集成测试页面、端到端测试
|
|
|
```
|
|
|
|
|
|
### 2.2 模块依赖关系
|
|
|
@@ -45,7 +47,7 @@ zhijiayun-gateway (聚合启动入口)
|
|
|
├── zhijiayun-user
|
|
|
│ └── zhijiayun-common
|
|
|
├── zhijiayun-invite
|
|
|
-│ ├── zhijiayun-user (依赖 CrawlerQuotaGrantService)
|
|
|
+│ ├── zhijiayun-user (依赖 CrawlerQuotaGrantService、MembershipService)
|
|
|
│ └── zhijiayun-common
|
|
|
└── zhijiayun-payment
|
|
|
└── zhijiayun-common
|
|
|
@@ -57,42 +59,82 @@ zhijiayun-gateway (聚合启动入口)
|
|
|
com.xuekairui
|
|
|
├── common/ # zhijiayun-common
|
|
|
│ ├── Result.java # 统一响应封装
|
|
|
-│ ├── ErrorCode.java # 错误码枚举
|
|
|
-│ └── BusinessException.java # 业务异常
|
|
|
+│ ├── ErrorCode.java # 错误码枚举(用户/验证码/微信/Token/支付/等级/优惠券/爬虫/邀请/搜索/关注)
|
|
|
+│ ├── BusinessException.java # 业务异常
|
|
|
+│ ├── TraceIdGenerator.java # 链路追踪ID生成器
|
|
|
+│ └── ValidateUtil.java # 参数校验工具(IP提取等)
|
|
|
│
|
|
|
├── user/ # zhijiayun-user
|
|
|
│ ├── config/ # 配置类
|
|
|
│ │ ├── AliyunSmsProperties.java
|
|
|
│ │ ├── MyBatisPlusMetaHandler.java
|
|
|
│ │ ├── RedisConfig.java
|
|
|
-│ │ └── SecurityConfig.java
|
|
|
-│ ├── controller/ # 控制器
|
|
|
-│ │ ├── AuthController.java
|
|
|
-│ │ ├── CrawlerController.java
|
|
|
-│ │ ├── CouponController.java
|
|
|
-│ │ └── UserLevelController.java
|
|
|
-│ ├── dto/ # 数据传输对象
|
|
|
-│ ├── entity/ # 数据库实体
|
|
|
-│ ├── mapper/ # MyBatis-Plus Mapper
|
|
|
+│ │ └── SecurityConfig.java # Spring Security + RBAC
|
|
|
+│ ├── controller/ # 控制器(18个)
|
|
|
+│ │ ├── AuthController.java # 认证(短信/密码/微信登录、Token刷新、用户信息)
|
|
|
+│ │ ├── CrawlerController.java # 爬虫配额状态、消耗、日志
|
|
|
+│ │ ├── CouponController.java # 优惠券发放、查询
|
|
|
+│ │ ├── UserLevelController.java # 等级列表、用户等级设置
|
|
|
+│ │ ├── MembershipController.java # 会员信息查询、权益查询
|
|
|
+│ │ ├── DrugSearchController.java # 药品搜索比价、搜索建议
|
|
|
+│ │ ├── SearchHistoryController.java # 搜索历史管理
|
|
|
+│ │ ├── WatchlistController.java # 关注/收藏列表管理
|
|
|
+│ │ ├── PlatformAccountController.java # B2B平台账号绑定
|
|
|
+│ │ ├── CrawlerPlatformConfigController.java # 平台配置查询
|
|
|
+│ │ ├── BusinessLicenseController.java # 营业执照上传
|
|
|
+│ │ ├── FileUploadController.java # 文件上传
|
|
|
+│ │ ├── TrialQuotaConfigController.java # 体验配额查询
|
|
|
+│ │ ├── AdminUserController.java # 用户管理(SUPER_ADMIN)
|
|
|
+│ │ ├── AdminMembershipController.java # 会员发放管理
|
|
|
+│ │ ├── AdminLicenseController.java # 营业执照审核
|
|
|
+│ │ ├── AdminTrialQuotaConfigController.java # 体验配额配置管理
|
|
|
+│ │ └── OperationAuditLogController.java # 审计日志查询
|
|
|
+│ ├── dto/ # 数据传输对象(30+)
|
|
|
+│ ├── entity/ # 数据库实体(16个)
|
|
|
+│ ├── enums/ # 枚举(MembershipLevel、UserRole、OperationType)
|
|
|
+│ ├── event/ # 事件(UserRegisteredEvent)
|
|
|
+│ ├── mapper/ # MyBatis-Plus Mapper(15个)
|
|
|
│ ├── security/ # JWT过滤器
|
|
|
-│ ├── service/ # 业务逻辑
|
|
|
+│ ├── service/ # 业务逻辑(18个服务)
|
|
|
│ └── util/ # 工具类
|
|
|
│
|
|
|
├── invite/ # zhijiayun-invite
|
|
|
│ ├── controller/
|
|
|
-│ │ ├── InviteController.java
|
|
|
-│ │ └── AdminController.java
|
|
|
+│ │ ├── InviteController.java # 邀请码、统计、记录、落地页
|
|
|
+│ │ └── AdminController.java # 邀请配置、爬虫发放、记录查看
|
|
|
│ ├── dto/
|
|
|
│ ├── entity/
|
|
|
+│ ├── listener/ # UserRegisteredListener(事件驱动)
|
|
|
│ ├── mapper/
|
|
|
│ └── service/
|
|
|
+│ ├── InviteService.java # 邀请核心服务
|
|
|
+│ └── InviteConfigService.java # 邀请配置服务
|
|
|
+│
|
|
|
+├── payment/ # zhijiayun-payment
|
|
|
+│ ├── config/ # PaymentConfig、PaymentProperties
|
|
|
+│ ├── controller/
|
|
|
+│ │ ├── PaymentController.java # 支付方案、创建订单、查询订单
|
|
|
+│ │ ├── PaymentCallbackController.java # 微信/支付宝回调
|
|
|
+│ │ └── AdminPaymentController.java # 支付方案管理
|
|
|
+│ ├── dto/
|
|
|
+│ ├── entity/ # PaymentOrder、PaymentPlan
|
|
|
+│ ├── enums/ # PaymentChannel、PaymentStatus
|
|
|
+│ ├── mapper/
|
|
|
+│ └── service/
|
|
|
+│ ├── PaymentOrderService.java # 订单管理
|
|
|
+│ ├── PaymentPlanService.java # 方案管理
|
|
|
+│ └── QRCodeService.java # 二维码生成
|
|
|
│
|
|
|
└── gateway/ # zhijiayun-gateway
|
|
|
├── Application.java # 启动类
|
|
|
- ├── handler/
|
|
|
- │ └── GlobalExceptionHandler.java
|
|
|
- ├── filter/ # 请求日志、限流过滤器
|
|
|
- └── config/
|
|
|
+ ├── config/
|
|
|
+ │ ├── GatewayConfig.java # 网关配置
|
|
|
+ │ └── GatewayProperties.java # 网关属性(日志、限流规则)
|
|
|
+ ├── filter/
|
|
|
+ │ ├── RequestLoggingFilter.java # 请求日志+慢请求检测
|
|
|
+ │ └── RateLimitFilter.java # Redis限流过滤器
|
|
|
+ └── handler/
|
|
|
+ └── GlobalExceptionHandler.java # 全局异常处理
|
|
|
```
|
|
|
|
|
|
---
|
|
|
@@ -103,27 +145,44 @@ com.xuekairui
|
|
|
|
|
|
| 表名 | 说明 | 核心字段 |
|
|
|
|------|------|----------|
|
|
|
-| t_user | 用户表 | phone, nickname, avatar, wechat_open_id, level_id, status |
|
|
|
-| t_user_level | 等级配置表 | level_name, level_code, crawler_quota, monthly_quota, max_concurrent |
|
|
|
-| t_coupon | 优惠券模板表 | name, type, value, total_count, valid_type, min_level_code |
|
|
|
-| t_user_coupon | 用户优惠券表 | user_id, coupon_id, status, expire_time, source |
|
|
|
-| t_crawler_usage_log | 爬虫使用记录表 | user_id, usage_date, usage_count, source(QUOTA/COUPON) |
|
|
|
-| t_crawler_quota_grant | 爬虫配额发放表 | user_id, grant_type(INVITE/PURCHASE/ADMIN), quota_count, used_count, expire_time |
|
|
|
-| t_invite_config | 邀请奖励配置表 | reward_crawler_count, app_download_url, landing_title, 多渠道字段 |
|
|
|
-| t_invite_code | 邀请码表 | user_id, code, max_uses, used_count, click_count |
|
|
|
+| t_user | 用户表 | phone, nickname, password, wechat_open_id, role(USER/ADMIN/SUPER_ADMIN), membership_level(PLUS/PRO/ULTRA), pharmacy_name, login_source |
|
|
|
+| t_user_membership | 用户会员记录表 | user_id, level(PLUS/PRO/ULTRA), source(ADMIN_GRANT/RECHARGE/SYSTEM), effective_from, effective_to, status |
|
|
|
+| t_membership_benefit | 会员权益配置表 | level, benefit_type(DAILY/MONTHLY/YEARLY_QUOTA, MAX_CONCURRENT), benefit_value |
|
|
|
+| t_coupon | 优惠券模板表 | name, type(CRAWLER), value, total_count, valid_type, min_level_code |
|
|
|
+| t_user_coupon | 用户优惠券表 | user_id, coupon_id, status(0未使用/1已使用/2已过期), expire_time, source |
|
|
|
+| t_crawler_usage_log | 爬虫使用记录表 | user_id, usage_date, usage_count, platform, source(QUOTA/COUPON) |
|
|
|
+| t_crawler_quota_grant | 爬虫配额发放表 | user_id, grant_type(INVITE/PURCHASE/ADMIN), quota_count, used_count, expire_time, status(1有效/2用完/3过期) |
|
|
|
+| t_invite_config | 邀请奖励配置表 | reward_type(MEMBERSHIP/CRAWLER), reward_months, max_daily_reward, 多渠道字段, landing_title |
|
|
|
+| t_invite_code | 邀请码表 | user_id, code, max_uses, used_count, click_count, expire_time |
|
|
|
| t_invite_relation | 邀请关系表 | inviter_id, invitee_id, invite_code_id, registered, reward_granted |
|
|
|
+| t_payment_plan | 支付方案表 | plan_code, plan_name, membership_level, price(DECIMAL), original_price(DECIMAL), duration_days, status |
|
|
|
+| t_payment_order | 支付订单表 | order_no, user_id, plan_id, amount(DECIMAL), channel(WECHAT/ALIPAY), status(PENDING/PAID/EXPIRED/REFUNDED), qr_code_url, trade_no |
|
|
|
+| t_platform_account | B2B平台账号绑定表 | user_id, platform_code, account_encrypted, password_encrypted, verify_status(PENDING/SUCCESS/FAILED) |
|
|
|
+| t_platform_config | 平台配置表 | platform_code, platform_name, enabled, query_cost, priority, official_url, binding_instructions |
|
|
|
+| t_business_license | 营业执照表 | user_id, license_image_url, credit_code, pharmacy_name, review_status(PENDING/APPROVED/REJECTED) |
|
|
|
+| t_trial_quota_config | 体验配额配置表 | config_name, trial_days, daily_query_limit, monthly_watchlist_limit, config_type(DEFAULT/COUPON/ACTIVITY) |
|
|
|
+| t_operation_audit_log | 操作审计日志表 | operator_id, operator_role, module, operation_type, target_type, target_id, before_data, after_data, result, is_sensitive |
|
|
|
+| t_search_history | 搜索历史表 | user_id, keyword, platform, result_count, search_time |
|
|
|
+| t_watchlist | 关注/收藏表 | user_id, drug_name, spec, manufacturer, min_price, min_price_platform, last_price, price_change |
|
|
|
|
|
|
### 3.2 ER关系
|
|
|
|
|
|
```
|
|
|
t_user ──1:N──> t_invite_code (每个用户一个邀请码)
|
|
|
t_user ──1:N──> t_invite_relation (作为邀请人)
|
|
|
+t_user ──1:N──> t_user_membership (会员记录)
|
|
|
t_user ──1:N──> t_crawler_quota_grant (配额发放)
|
|
|
t_user ──1:N──> t_crawler_usage_log (使用记录)
|
|
|
-t_user ──N:1──> t_user_level (等级)
|
|
|
t_user ──1:N──> t_user_coupon (优惠券)
|
|
|
+t_user ──1:N──> t_platform_account (平台账号绑定)
|
|
|
+t_user ──1:1──> t_business_license (营业执照)
|
|
|
+t_user ──1:N──> t_search_history (搜索历史)
|
|
|
+t_user ──1:N──> t_watchlist (关注列表)
|
|
|
+t_user ──1:N──> t_payment_order (支付订单)
|
|
|
t_coupon ──1:N──> t_user_coupon (模板-实例)
|
|
|
t_invite_code ──1:N──> t_invite_relation (邀请码-关系)
|
|
|
+t_membership_benefit ──N:1──> MembershipLevel (等级-权益)
|
|
|
+t_payment_plan ──1:N──> t_payment_order (方案-订单)
|
|
|
```
|
|
|
|
|
|
---
|
|
|
@@ -133,35 +192,72 @@ t_invite_code ──1:N──> t_invite_relation (邀请码-关系)
|
|
|
### 4.1 认证流程
|
|
|
|
|
|
```
|
|
|
-客户端 → POST /api/auth/sms/login → 验证成功
|
|
|
+客户端 → POST /api/auth/sms/login 或 /api/auth/password/login → 验证成功
|
|
|
→ 生成 JWT (Access Token 24h + Refresh Token 7d)
|
|
|
→ 后续请求携带 Authorization: Bearer <token>
|
|
|
→ JwtAuthenticationFilter 校验 → 放行/拒绝
|
|
|
```
|
|
|
|
|
|
-### 4.2 接口权限
|
|
|
+### 4.2 三级RBAC权限模型
|
|
|
+
|
|
|
+| 角色 | 权限范围 | 说明 |
|
|
|
+|------|----------|------|
|
|
|
+| USER | 用户侧接口 | 比价、搜索、关注、邀请、支付等 |
|
|
|
+| ADMIN | 运营后台接口 | 用户管理、配置管理、审核、发放等 |
|
|
|
+| SUPER_ADMIN | 全部权限 | 包括角色赋权(/api/admin/users/**) |
|
|
|
+
|
|
|
+### 4.3 接口权限
|
|
|
|
|
|
| 类型 | 路径 | 说明 |
|
|
|
|------|------|------|
|
|
|
-| 公开 | /api/auth/sms/**, /api/auth/wechat/** | 登录注册 |
|
|
|
-| 公开 | /api/invite/page/**, /api/invite/click/** | 邀请落地页 |
|
|
|
+| 公开 | /api/auth/sms/send, /api/auth/sms/login | 短信验证码 |
|
|
|
+| 公开 | /api/auth/password/login | 密码登录 |
|
|
|
+| 公开 | /api/auth/refresh | 刷新Token |
|
|
|
+| 公开 | /api/auth/wechat/** | 微信登录相关 |
|
|
|
+| 公开 | /api/invite/page/**, /api/invite/click/**, /api/invite/{code} | 邀请落地页 |
|
|
|
+| 公开 | /api/invite/resolve-link, /api/invite/validate | 邀请码解析/验证 |
|
|
|
+| 公开 | /api/platform-config/** | 平台配置查询 |
|
|
|
+| 公开 | /api/trial-quota/** | 体验配额查询 |
|
|
|
+| 公开 | /api/search/suggestions | 搜索建议 |
|
|
|
+| 公开 | /api/payment/plans | 支付方案列表 |
|
|
|
+| 公开 | /api/payment/callback/** | 支付回调 |
|
|
|
| 公开 | /api/level/list, /api/level/{id} | 等级列表 |
|
|
|
-| 认证 | /api/auth/user/** | 用户信息 |
|
|
|
-| 认证 | /api/crawler/** | 爬虫操作 |
|
|
|
-| 认证 | /api/invite/** | 邀请操作 |
|
|
|
-| 认证 | /api/coupon/** | 优惠券 |
|
|
|
-| 管理 | /api/admin/** | 运营管理 |
|
|
|
+| 认证 | /api/auth/user/**, /api/auth/password/set, /api/auth/phone/change | 用户信息 |
|
|
|
+| 认证 | /api/crawler/**, /api/search/query | 爬虫/搜索 |
|
|
|
+| 认证 | /api/invite/code, /api/invite/stats, /api/invite/rewards | 邀请操作 |
|
|
|
+| 认证 | /api/coupon/**, /api/membership/** | 优惠券/会员 |
|
|
|
+| 认证 | /api/platform-account/**, /api/watchlist/** | 账号绑定/关注 |
|
|
|
+| 认证 | /api/payment/order/** | 支付订单 |
|
|
|
+| 管理 | /api/admin/** (ADMIN + SUPER_ADMIN) | 运营管理 |
|
|
|
+| 超管 | /api/admin/users/** (仅SUPER_ADMIN) | 用户角色管理 |
|
|
|
+| 管理 | /api/coupon/issue, /api/level/user/** (ADMIN + SUPER_ADMIN) | 散落管理操作 |
|
|
|
|
|
|
-### 4.3 限流策略
|
|
|
+### 4.4 限流策略
|
|
|
|
|
|
-基于 Redis 滑动窗口计数器:
|
|
|
+基于 Redis 固定窗口计数器,按客户端IP + 路径前缀限流:
|
|
|
|
|
|
-| 路径 | 窗口 | 限制 |
|
|
|
-|------|------|------|
|
|
|
-| /api/auth/sms | 60s | 10次 |
|
|
|
-| /api/auth/login | 60s | 20次 |
|
|
|
-| /api/crawler | 60s | 60次 |
|
|
|
-| 其他 | 60s | 100次 |
|
|
|
+| 路径前缀 | 窗口 | 限制 | 说明 |
|
|
|
+|----------|------|------|------|
|
|
|
+| /api/auth/sms | 60s | 10次 | 短信验证码发送 |
|
|
|
+| /api/auth/login | 60s | 20次 | 登录接口 |
|
|
|
+| /api/crawler | 60s | 60次 | 爬虫操作 |
|
|
|
+| 其他 | 60s | 100次 | 默认限制 |
|
|
|
+
|
|
|
+**限流响应**:HTTP 429 + `X-RateLimit-Limit` / `X-RateLimit-Remaining` 响应头
|
|
|
+
|
|
|
+### 4.5 密码安全
|
|
|
+
|
|
|
+- 密码使用 **BCryptPasswordEncoder** 加密存储
|
|
|
+- 支持 手机号 + 密码 / 昵称 + 密码 双模登录
|
|
|
+- 支持设置/修改密码(需验证旧密码)
|
|
|
+- 平台账号密码使用 **AES-256** 加密存储
|
|
|
+
|
|
|
+### 4.6 短信验证码安全
|
|
|
+
|
|
|
+- 开发环境:测试模式(固定验证码 123456,不发送真实短信)
|
|
|
+- 生产环境:阿里云SMS真实发送
|
|
|
+- IP维度限流:1分钟内同IP最多1次,防止短信轰炸
|
|
|
+- 验证码5分钟过期
|
|
|
|
|
|
---
|
|
|
|
|
|
@@ -170,8 +266,9 @@ t_invite_code ──1:N──> t_invite_relation (邀请码-关系)
|
|
|
### 5.1 配额计算
|
|
|
|
|
|
```
|
|
|
-每日总配额 = 等级每日配额 + 额外配额之和
|
|
|
-每月总配额 = 等级每月配额 + 额外配额之和
|
|
|
+每日总配额 = 会员每日权益配额 + 额外配额之和
|
|
|
+每月总配额 = 会员每月权益配额 + 额外配额之和
|
|
|
+每年总配额 = 会员每年权益配额 + 额外配额之和
|
|
|
|
|
|
额外配额 = SUM(所有有效 grant 的 quota_count - used_count)
|
|
|
```
|
|
|
@@ -181,7 +278,7 @@ t_invite_code ──1:N──> t_invite_relation (邀请码-关系)
|
|
|
```
|
|
|
1. 优惠券 (COUPON) → 优先使用,避免浪费
|
|
|
2. 额外配额 (EXTRA) → 快过期优先消耗
|
|
|
-3. 等级基础配额 (QUOTA) → 兜底
|
|
|
+3. 会员权益配额 (QUOTA) → 兜底
|
|
|
```
|
|
|
|
|
|
### 5.3 过期控制
|
|
|
@@ -190,54 +287,106 @@ t_invite_code ──1:N──> t_invite_relation (邀请码-关系)
|
|
|
- 定时任务每小时扫描标记过期记录(status = 3)
|
|
|
- 消耗时自动跳过已过期记录
|
|
|
|
|
|
+### 5.4 会员权益配置
|
|
|
+
|
|
|
+会员权益通过 `t_membership_benefit` 表配置,支持运营动态调整:
|
|
|
+
|
|
|
+| 会员等级 | 每日配额 | 每月配额 | 每年配额 | 最大并发 |
|
|
|
+|----------|----------|----------|----------|----------|
|
|
|
+| PLUS | 10 | 300 | 3650 | - |
|
|
|
+| PRO | 999 | 29970 | 364635 | 5 |
|
|
|
+| ULTRA | 999 | 29970 | 364635 | 10 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 6. 支付架构
|
|
|
+
|
|
|
+### 6.1 支付流程
|
|
|
+
|
|
|
+```
|
|
|
+用户选择套餐 → 创建订单(PENDING) → 生成支付二维码
|
|
|
+→ 用户扫码支付 → 第三方异步回调 → 验签
|
|
|
+→ 订单状态更新为PAID → 自动发放会员等级 → 配额生效
|
|
|
+```
|
|
|
+
|
|
|
+### 6.2 支付渠道
|
|
|
+
|
|
|
+| 渠道 | 编码 | 回调地址 | 说明 |
|
|
|
+|------|------|----------|------|
|
|
|
+| 微信支付 | WECHAT | /api/payment/callback/wechat | Native扫码支付(API v3) |
|
|
|
+| 支付宝 | ALIPAY | /api/payment/callback/alipay | 当面付/扫码支付(RSA2验签) |
|
|
|
+
|
|
|
+### 6.3 模拟支付
|
|
|
+
|
|
|
+开发环境(`payment.mock=true`)支持模拟支付:
|
|
|
+- POST /api/payment/order/{orderNo}/pay 直接标记订单为已支付
|
|
|
+- 回调接口接收模拟通知,跳过验签
|
|
|
+
|
|
|
+### 6.4 生产环境接入
|
|
|
+
|
|
|
+生产环境需配置:
|
|
|
+- 微信支付:app-id、mch-id、api-v3-key、private-key-path、serial-no、notify-url
|
|
|
+- 支付宝:app-id、private-key、alipay-public-key、notify-url
|
|
|
+- 回调验签:微信需接入SDK实现RSA验签+解密;支付宝需接入SDK实现RSA2验签
|
|
|
+
|
|
|
---
|
|
|
|
|
|
-## 6. 模块间通信
|
|
|
+## 7. 模块间通信
|
|
|
|
|
|
-### 6.1 直接依赖
|
|
|
+### 7.1 直接依赖
|
|
|
|
|
|
- invite 模块依赖 user 模块的 `CrawlerQuotaGrantService`(配额发放)
|
|
|
+- invite 模块依赖 user 模块的 `MembershipService`(会员时长奖励发放)
|
|
|
|
|
|
-### 6.2 事件驱动
|
|
|
+### 7.2 事件驱动
|
|
|
|
|
|
-- 用户注册事件 → 检查邀请码 → 建立邀请关系 → 发放奖励
|
|
|
+- 用户注册事件(`UserRegisteredEvent`)→ `UserRegisteredListener` → 检查邀请码 → 建立邀请关系 → 发放会员奖励
|
|
|
- 避免循环依赖,保持模块边界清晰
|
|
|
|
|
|
+### 7.3 支付与会员联动
|
|
|
+
|
|
|
+- 支付成功回调 → `PaymentOrderService.processPaidCallback` → 调用 `MembershipService` 发放对应会员等级
|
|
|
+
|
|
|
---
|
|
|
|
|
|
-## 7. MVP 架构特点与后续演进
|
|
|
+## 8. MVP 架构特点与后续演进
|
|
|
|
|
|
-### 7.1 MVP 架构特点 ✅
|
|
|
+### 8.1 MVP 架构特点 ✅
|
|
|
|
|
|
**当前采用单体架构,模块边界清晰:**
|
|
|
|
|
|
-1. **Maven 多模块**:common、user、invite、payment、gateway 五个模块
|
|
|
+1. **Maven 多模块**:common、user、invite、payment、gateway、test 六个模块
|
|
|
2. **直接依赖**:模块间通过接口调用,无消息队列
|
|
|
3. **单数据库**:所有表在同一 MySQL 实例
|
|
|
-4. **Mock Redis**:测试环境使用 Mock,生产需接入真实 Redis
|
|
|
-5. **同步处理**:邀请奖励发放为同步操作
|
|
|
+4. **真实 Redis**:已接入 Redis 缓存(Lettuce 连接池),用于限流、验证码存储
|
|
|
+5. **同步处理**:邀请奖励发放为同步操作(事件驱动但同步执行)
|
|
|
+6. **RBAC 安全**:三级角色模型 + Spring Security 细粒度权限控制
|
|
|
+7. **网关层增强**:请求日志 + 慢请求检测 + Redis IP限流
|
|
|
|
|
|
**优势:**
|
|
|
- 部署简单,运维成本低
|
|
|
- 开发效率高,调试方便
|
|
|
- 适合 MVP 阶段快速验证
|
|
|
|
|
|
-### 7.2 后续架构演进规划 🚀
|
|
|
+### 8.2 后续架构演进规划 🚀
|
|
|
|
|
|
#### Phase 2:性能优化
|
|
|
-- [ ] 接入真实 Redis 缓存
|
|
|
-- [ ] 数据库连接池优化(HikariCP 调优)
|
|
|
-- [ ] SQL 慢查询优化
|
|
|
+- [ ] 数据库读写分离
|
|
|
+- [ ] SQL 慢查询优化与索引调优
|
|
|
+- [ ] 接口限流细化(按用户维度)
|
|
|
+- [ ] Redis 缓存策略优化
|
|
|
|
|
|
#### Phase 3:异步化改造
|
|
|
- [ ] 引入消息队列(RabbitMQ/Kafka)
|
|
|
- [ ] 邀请奖励发放改为异步处理
|
|
|
- [ ] 爬虫日志记录异步化
|
|
|
+- [ ] 支付回调异步处理
|
|
|
|
|
|
#### Phase 4:微服务拆分
|
|
|
- [ ] 用户服务独立部署(zhijiayun-user)
|
|
|
- [ ] 配额服务独立部署(新建 zhijiayun-quota)
|
|
|
- [ ] 邀请服务独立部署(zhijiayun-invite)
|
|
|
+- [ ] 支付服务独立部署(zhijiayun-payment)
|
|
|
- [ ] API Gateway 替代当前 gateway 模块
|
|
|
|
|
|
#### Phase 5:云原生
|
|
|
@@ -248,13 +397,16 @@ t_invite_code ──1:N──> t_invite_relation (邀请码-关系)
|
|
|
|
|
|
---
|
|
|
|
|
|
-## 8. 扩展点
|
|
|
+## 9. 扩展点
|
|
|
|
|
|
| 扩展方向 | 预留设计 | MVP状态 |
|
|
|
|----------|----------|---------|
|
|
|
-| 支付模块 | zhijiayun-payment 已预留,待实现微信/支付宝支付 | ⏳ 未实现 |
|
|
|
+| 支付渠道 | PaymentChannel 枚举可扩展新渠道 | ✅ 已实现微信/支付宝 |
|
|
|
| 新渠道 | t_invite_config 支持 dingtalk/feishu 等渠道字段 | ✅ 已支持 |
|
|
|
| 新配额来源 | t_crawler_quota_grant.grant_type 可扩展新类型 | ✅ 已支持 |
|
|
|
+| 会员权益类型 | t_membership_benefit.benefit_type 可扩展 | ✅ 已支持 |
|
|
|
+| 平台扩展 | t_platform_config 支持动态启用/禁用平台 | ✅ 已支持 |
|
|
|
+| 操作审计 | OperationType 枚举覆盖9大模块 | ✅ 已实现 |
|
|
|
| 分布式 | 当前单体,模块边界清晰,可拆分为微服务 | ⏳ 后续演进 |
|
|
|
|
|
|
---
|