2 Commits

Author SHA1 Message Date
fda1c8bdda docs(db): v4 定稿 - 决策确认,Phase D 完成
决策1: 余额+支付宝+微信(复用 pigx-pay)
决策2: 拼车广场 Phase2,一期仅自营
决策3: 凭据查看需二次验证(SMS OTP)
决策4: 邀请返现完全可配置,新增 as_invite_config 表
决策5: 已在 v3 改为关联表
决策6: 提现 Phase2,一期只充值+消费

变更:
- 新增 db/ishare_schema_v4_delta.sql(含 as_invite_config)
- 新增 DECISIONS.md(完整决策记录)
- 更新 DATABASE_DESIGN_OVERVIEW.md(v4 定稿,28张表)

Phase D (系统设计) 正式完成
2026-02-17 13:17:01 +01:00
3f5652e235 docs(db): v3 修订 - 处理全部评审问题(新增3表,修复唯一键,完善索引)
- R1: 新增 as_recharge 充值单表(支持外部支付充值追踪)
- R2: 移除 as_user_sub_member UNIQUE(sub_id,user_id),续费改为新建记录
- I1: 新增 as_banner 首页广告位表
- I2: 新增 as_product_plan_rel 关联表,移除 sub_plan_ids 逗号字段
- I3: DATABASE_DESIGN_OVERVIEW 统一字段名至 v2 修订版
- L1: as_user_sub_member.status 增加 4=等待车主录入凭据
- L2: 补充 12 项关键查询索引

表数量: v2(23张) → v3(27张)
2026-02-17 12:55:41 +01:00
4 changed files with 433 additions and 116 deletions

View File

@@ -1,58 +1,57 @@
# iShare 数据库设计概要 # iShare 数据库设计概要
> 基于 DATABASE_DESIGN_V2.md 整理 > 版本v4决策确认后最终版
> 评审时间2026-02-17 > 修订时间2026-02-17
> 完整建表 SQL`db/ishare_schema_v2.sql` > 完整建表 SQLv2 基础版)`db/ishare_schema_v2.sql`
> 完整字段说明:`DATABASE_DESIGN_V2.md` > 增量 SQL`db/ishare_schema_v3_delta.sql` → `db/ishare_schema_v4_delta.sql`
> 完整字段说明:`DATABASE_DESIGN_V2.md`
> 设计决策记录:`DECISIONS.md`
--- ---
## 一、表总览23 张表) ## 一、表总览28 张表)
### 1.1 App 基础表(复用 PigX共 9 张) ### 1.1 App 基础表(复用 PigX共 9 张)
| # | 表名 | 说明 | 变更 | | # | 表名 | 说明 | 变更 |
|---|------|------|------| |---|------|------|------|
| 1 | `app_user` | 用户 | 追加 `invite_code``inviter_id` | | 1 | `app_user` | 用户 | 追加 `invite_code``inviter_id` |
| 2 | `app_role` | 角色 | 沿用 | | 2-9 | `app_role` / `app_user_role` / `app_social_details` / `app_article*` / `app_page` / `app_tabbar` | 框架基础 | 沿用 |
| 3 | `app_user_role` | 用户角色关联 | 沿用 |
| 4 | `app_social_details` | 第三方登录 | 沿用 |
| 5 | `app_article_category` | 文章分类 | 沿用 |
| 6 | `app_article` | 文章/公告 | 沿用 |
| 7 | `app_article_collect` | 文章收藏 | 沿用 |
| 8 | `app_page` | 页面配置 | 沿用 |
| 9 | `app_tabbar` | 底部导航 | 沿用 |
### 1.2 业务表iShare 专属,共 14 张) ### 1.2 业务表iShare 专属,共 19 张)
#### 平台与产品 #### 平台与产品
| # | 表名 | 说明 | | # | 表名 | 说明 | Phase |
|---|------|------| |---|------|------|-------|
| 10 | `as_platform_type` | 平台分类(视频/音乐/AI等 | | 10 | `as_platform_type` | 平台分类 | P1 |
| 11 | `as_platform` | 流媒体平台Netflix/Spotify等 | | 11 | `as_platform` | 流媒体平台 | P1 |
| 12 | `as_sub_plan` | 订阅计划(高级版/家庭版等) | | 12 | `as_sub_plan` | 订阅计划 | P1 |
| 13 | `as_sub_payroll` | 付费方案(月/季/年,含价格 | | 13 | `as_sub_payroll` | 付费方案(月/季/年) | P1 |
| 14 | `as_sub_product` | 合租商品(自营 or 个人发布) | | 14 | `as_sub_product` | 合租商品(P1仅 type=1 自营) | P1 |
| 15 | `as_sub_account` | 平台账号凭据AES 加密存储) | | 15 | `as_product_plan_rel` | 产品-计划 M:N 关联 | P1 |
| 16 | `as_sub_product_comment` | 商品评价 | | 16 | `as_sub_account` | 平台账号凭据AES 加密) | P1 |
| 17 | `as_sub_product_comment` | 商品评价 | P1 |
| 18 | `as_banner` | 首页 Banner 广告位 | P1 |
#### 订阅与订单 #### 订阅与订单
| # | 表名 | 说明 | | # | 表名 | 说明 | Phase |
|---|------|------| |---|------|------|-------|
| 17 | `as_user_sub` | 合租槽/共享池(一个账号对应一个槽) | | 19 | `as_user_sub` | 合租槽/共享池 | P1 |
| 18 | `as_user_sub_member` | 个人订阅记录(原版缺失最关键表) | | 20 | `as_user_sub_member` | 个人订阅记录(status=4 P2用 | P1 |
| 19 | `as_order` | 订单(含状态机、价格快照) | | 21 | `as_order` | 订单(三种支付方式,复用 pigx-pay | P1 |
#### 钱包与推广 #### 钱包与推广
| # | 表名 | 说明 | | # | 表名 | 说明 | Phase |
|---|------|------| |---|------|------|-------|
| 20 | `as_wallet` | 用户钱包(乐观锁防并发) | | 22 | `as_recharge` | 充值单(人工/支付宝/微信) | P1 |
| 21 | `as_wallet_log` | 钱包流水(含余额快照便于对账) | | 23 | `as_wallet` | 用户钱包(乐观锁防并发) | P1 |
| 22 | `as_invite` | 邀请关系与返现 | | 24 | `as_wallet_log` | 钱包流水type=5 提现 P2用 | P1 |
| 23 | `as_notification` | 系统通知(续费提醒/订单/公告/奖励) | | 25 | `as_invite` | 邀请关系与返现记录 | P1 |
| 26 | `as_invite_config` | 邀请返现规则配置(可配置) | P1 |
| 27 | `as_notification` | 系统通知 | P1 |
--- ---
@@ -62,23 +61,27 @@
as_platform_type (1) ──< (N) as_platform as_platform_type (1) ──< (N) as_platform
as_platform (1) ──< (N) as_sub_plan as_platform (1) ──< (N) as_sub_plan
as_sub_plan (1) ──< (N) as_sub_payroll as_sub_plan (1) ──< (N) as_sub_payroll
as_sub_plan (N) >──< (N) as_sub_product ← sub_plan_ids 逗号分隔(待决策改关联表) as_sub_plan (N) >──< (N) as_sub_product [via as_product_plan_rel]
as_platform (1) ──< (N) as_sub_product [platform_id 冗余加速查询] as_platform (1) ──< (N) as_sub_product [platform_id 冗余]
as_sub_product (1) ──< (N) as_sub_account [product_id] as_sub_product (1) ──< (N) as_sub_account
as_sub_product (1) ──< (N) as_user_sub [product_id] as_sub_product (1) ──< (N) as_user_sub
as_user_sub (1) ──< (N) as_user_sub_member [sub_id] ← 新增关键关联 as_user_sub (1) ──< (N) as_user_sub_member
as_sub_product (1) ──< (N) as_order [product_id] as_sub_product (1) ──< (N) as_order
as_order (1) ──< (1) as_user_sub_member [order_id] as_order (1) ──< (1) as_user_sub_member [order_id]
app_user (1) ──< (1) as_wallet app_user (1) ──< (1) as_wallet
as_wallet (1) ──< (N) as_wallet_log as_wallet (1) ──< (N) as_wallet_log
as_wallet (1) ──< (N) as_recharge [user_id]
app_user (1) ──< (N) as_order app_user (1) ──< (N) as_order
app_user (1) ──< (N) as_recharge
app_user (1) ──< (N) as_user_sub_member app_user (1) ──< (N) as_user_sub_member
app_user (1) ──< (N) as_invite [as inviter] app_user (1) ──< (N) as_invite [as inviter]
app_user (1) ──< (1) as_invite [as invitee] app_user (1) ──< (1) as_invite [as invitee]
app_user (1) ──< (N) as_notification app_user (1) ──< (N) as_notification
as_invite_config (1:active) ──→ as_invite [规则快照到 reward_amount]
``` ```
--- ---
@@ -88,25 +91,41 @@ app_user (1) ──< (N) as_notification
### 3.1 订单as_order ### 3.1 订单as_order
``` ```
[待支付] ─→ 15min 超时 ─→ [已取消] [待支付(0)] ─→ 15min 超时 ─→ [已取消(4)]
[待支付] ─→ 支付成功 ─→ [已支付] ─→ 激活订阅 ─→ [已完成] [待支付(0)] ─→ 支付成功 ─→ [已支付(1)] ─→ 激活订阅 ─→ [已完成(2)]
[已支付/完成] ─→ 退款 ─→ [已退款] [已支付/完成] ─→ 退款 ─→ [已退款(3)]
``` ```
### 3.2 个人订阅as_user_sub_member **支付方式:** 1=余额 / 2=支付宝 / 3=微信(均通过 pigx-pay 模块处理
### 3.2 充值单as_recharge
``` ```
[待激活] ─→ 订单完成 ─→ [使用中] 人工充值(管理员): 直接创建 status=1 记录
├─→ 到期 ─→ [已到期] ─→ 续费 ─→ [使用中] 外部支付:
└─→ 主动退订 ─→ [已退订] [待支付(0)] ─→ 支付成功 ─→ [已到账(1)] ─→ as_wallet.balance +amount
─→ 15min 超时 ─→ [已取消(3)]
─→ 支付失败 ─→ [失败(2)]
``` ```
### 3.3 合租槽as_user_sub ### 3.3 个人订阅as_user_sub_member
``` ```
[可加入(0)] ─→ 席位满(capacity_loaded = capacity) ─→ [已满(1)] [待激活(0)] ─→ 订单完成 ─→ [使用中(1)]
[使用中(1)] ─→ 到期 ─→ [已到期(2)] ─→ 续费 → 新建记录回到[待激活(0)]
─→ 主动退订 ─→ [已退订(3)]
[Phase2] 拼车广场付款后 → [等待车主录入凭据(4)] → 车主录入 → [使用中(1)]
```
> 续费策略:新建 member 记录旧记录置为2=已到期(保留历史,便于对账)
### 3.4 合租槽as_user_sub
```
[可加入(0)] ─→ 席位满 ─→ [已满(1)]
[可加入/已满] ─→ 到期 ─→ [已到期(2)] [可加入/已满] ─→ 到期 ─→ [已到期(2)]
[可加入/已满] ─→ 车主关闭 ─→ [已关闭(3)] ─→ 车主关闭 ─→ [已关闭(3)]
``` ```
--- ---
@@ -116,96 +135,98 @@ app_user (1) ──< (N) as_notification
### 4.1 席位超卖防护(乐观锁) ### 4.1 席位超卖防护(乐观锁)
```sql ```sql
-- 购买时原子性占位row affected = 0 则席位已满
UPDATE as_user_sub UPDATE as_user_sub
SET capacity_loaded = capacity_loaded + 1 SET capacity_loaded = capacity_loaded + 1
WHERE id = ? AND capacity_loaded < capacity WHERE id = ? AND capacity_loaded < capacity;
-- affected rows = 0 → 席位已满,拒绝购买
``` ```
### 4.2 账号凭据加密 ### 4.2 账号凭据安全
- 算法AES-256-GCM`as_sub_account.encrypt_type = 1` - 存储AES-256-GCM 加密,密钥存环境变量不入库
- `account_passwd`密文Base64 - 查看:**需二次验证SMS OTP 或密码重输OTP 存 Redis TTL 5min**
- `passwd_salt`:随机 IV16 字节 Base64**原设计为 int 已修复** - 返回:服务端解密后返回明文,不记录日志,前端倒计时隐藏
- 密钥:服务端环境变量,不入库
- 查看凭据:仅限 `as_user_sub_member.status = 1使用中`,服务端解密后返回明文,不记录日志
### 4.3 钱包余额并发控制(乐观锁) ### 4.3 支付集成
- **复用 pigx-pay 模块**(已集成支付宝 + 微信)
- 购买商品 → `as_order`pay_type 2/3→ pigx-pay 回调 → 更新订单状态 → 创建 member 记录
- 余额充值 → `as_recharge`pay_type 2/3→ pigx-pay 回调 → 更新充值单 → 增加钱包余额
### 4.4 邀请返现(可配置规则)
```
1. 管理后台配置 as_invite_config选择激活规则
2. 被邀请人注册 → 写入 as_invite 记录
3. 触发条件满足(首次购买 or 每次购买)
→ 读取当前 is_active=1 的 as_invite_config
→ 计算返现金额(快照到 as_invite.reward_amount
→ 延迟发放reward_delay_days 天后)
→ as_wallet_logtype=4+ as_wallet.balance +reward_amount
```
### 4.5 钱包余额并发控制(乐观锁)
```sql ```sql
UPDATE as_wallet UPDATE as_wallet
SET balance = balance - ?, version = version + 1 SET balance = balance - ?, version = version + 1
WHERE user_id = ? AND version = ? AND balance >= ? WHERE user_id = ? AND version = ? AND balance >= ?;
-- row affected = 0并发冲突或余额不足 -- affected rows = 0 → 并发冲突或余额不足
``` ```
### 4.4 订阅到期定时任务(建议每日 02:00 ### 4.6 订阅到期定时任务(每日 02:00
``` ```
1. expire_time < now() + 7天 且 status=1 → 推送续费提醒通知 1. expire_time < now()+7天 且 status=1 → 推送续费提醒
2. expire_time < now() 且 status=1 → 标记 status=2(已到期) 2. expire_time < now() 且 status=1 → status=2capacity_loaded -1
→ as_user_sub.capacity_loaded -1释放席位 3. as_order.expire_time < now() 且 status=0 → 置 status=4取消
4. as_recharge.expire_time < now() 且 status=0 → 置 status=3取消
``` ```
--- ---
## 五、设计评审问题清单 ## 五、关键索引清单
> 评审时间2026-02-17 | 表 | 索引字段 | 用途 |
|----|---------|------|
### 🔴 严重(影响核心功能,需修复) | `as_user_sub_member` | `(user_id, status)` | 我的订阅列表 |
| `as_user_sub_member` | `(expire_time, status)` | 定时任务扫描到期 |
| # | 问题 | 影响 | 建议方案 | | `as_order` | `(user_id, status)` | 用户订单列表 |
|---|------|------|----------| | `as_notification` | `(user_id, is_read)` | 未读通知数 |
| R1 | **充值流水追踪缺失** | 一旦接入外部支付充值(支付宝/微信),充值过程(待支付→成功)无法追踪,无法对账 | 新增 `as_recharge`order_no / user_id / amount / pay_type / pay_no / status / expire_time / pay_time| | `as_user_sub` | `(product_id, status)` | 商品可用合租槽 |
| R2 | **`as_user_sub_member` 唯一键问题** | `UNIQUE(sub_id, user_id)` 导致续费只能覆盖,历史续费记录丢失,退款/对账有问题 | 去掉唯一键;改为逻辑约束:同 `sub_id+user_id` 只允许一条 `status=1` 记录续费时新增记录旧的置为2=已到期) | | `as_sub_account` | `(product_id, status)` | 产品账号列表 |
| `as_sub_product` | `(product_type, status)` | 商品分类查询 |
### 🟠 重要(功能不完整,建议修复) | `as_banner` | `(status, sort_order)` | 首页 Banner |
| `as_recharge` | `(user_id, status)` | 充值记录查询 |
| # | 问题 | 影响 | 建议方案 | | `as_product_plan_rel` | `(product_id)` / `(plan_id)` | M:N 双向查询 |
|---|------|------|----------| | `as_invite_config` | `(is_active)` | 读取当前规则 |
| I1 | **Banner 广告位表缺失** | 首页有 Banner 需求,但无对应表 | 新增 `as_banner`image_url / link_url / link_type / sort_order / status / start_time / end_time|
| I2 | **`as_sub_product.sub_plan_ids` 逗号分隔反范式** | 反向查询(某计划关联哪些商品)需 LIKE 模糊查,不走索引 | 改为关联表 `as_product_plan_rel(product_id, plan_id)`(现在改成本最低)|
| I3 | **SYSTEM_DESIGN.md 与 DATABASE_DESIGN_V2.md 字段不一致** | 开发时若参考旧文档会导致实现错误 | 更新 SYSTEM_DESIGN.md ER 图:`user_sub_id→member_id``main_account→account_id`、移除已不存在的 `available_seats` |
### 🟡 轻微(可优化,不影响上线)
| # | 问题 | 影响 | 建议方案 |
|---|------|------|----------|
| L1 | **广场拼车凭据录入状态未建模** | 个人拼车:用户付款后,车主需事后录入凭据,这段时间状态不明确 | `as_user_sub_member.status` 增加值:`4=等待车主录入凭据` |
| L2 | **缺少关键索引规划** | 高频查询无索引影响性能 | 见下方索引清单 |
### 建议索引清单
```sql
-- 我的订阅列表
CREATE INDEX idx_member_user_status ON as_user_sub_member(user_id, status);
-- 定时任务扫描到期
CREATE INDEX idx_member_expire ON as_user_sub_member(expire_time, status);
-- 用户订单列表
CREATE INDEX idx_order_user_status ON as_order(user_id, status);
-- 订单号查询(已设 UNIQUE跳过
-- 未读通知数
CREATE INDEX idx_notif_user_read ON as_notification(user_id, is_read);
-- 合租槽状态
CREATE INDEX idx_sub_product_status ON as_user_sub(product_id, status);
-- 账号凭据查询
CREATE INDEX idx_account_product ON as_sub_account(product_id, status);
```
--- ---
## 六、待决策项(需 Ami 确认) ## 六、版本变更记录
| # | 问题 | 选项 | | 版本 | 变更内容 |
|------|----------|
| v1 | 原版骨架2023-08有多项严重缺陷 |
| v2 | 全面修订修复15项缺陷新增6张表23张 |
| v3 | 评审修订修复7个问题新增3张表27张 |
| **v4** | **决策确认:新增 `as_invite_config`28张Phase 1/2 范围明确** |
---
## 七、所有待决策项(已全部确认 ✅)
| # | 问题 | 决策 |
|---|------|------| |---|------|------|
| 1 | 付费方式一期支持哪些? | A) 仅余额人工充值B) 余额+支付宝 C) 三种都支持 | | 1 | 付费方式一期 | ✅ C - 余额+支付宝+微信(复用 pigx-pay |
| 2 | 拼车广场是否需要审核流程? | A) 管理员审核 B) 自动上架 C) 仅自营,无拼车广场 | | 2 | 拼车广场 | ✅ C - Phase 1 不做Phase 2 追加 |
| 3 | 账号凭据展示方式? | A) 直接明文 B) 需二次验证(短信/密码C) 限时展示30s后隐藏| | 3 | 凭据展示 | ✅ B - 二次验证SMS OTP 或密码重输) |
| 4 | 邀请返现比例和条件? | 需定义:返现金额/比例,是否有上限 | | 4 | 邀请返现 | ✅ 完全可配置(类型/金额/触发条件),无上限 |
| 5 | `as_sub_product` 的多计划关联是否改为关联表? | A) 保持逗号分隔 B) 改关联表(**推荐**,趁现在改成本最低)| | 5 | M:N 关联 | ✅ v3 已改为 `as_product_plan_rel` |
| 6 | 提现功能是否一期上线? | A) 一期上 B) 二期(一期只充值不提现)| | 6 | 提现功能 | ✅ B - Phase 2一期只充值+消费 |
**Phase D系统设计✅ 全部完成**
--- ---
*文档由 AI 评审生成 · 最后更新2026-02-17* *最后更新2026-02-17 · v4 定稿*

108
DECISIONS.md Normal file
View File

@@ -0,0 +1,108 @@
# iShare 设计决策记录
> 决策时间2026-02-17
> 阶段Phase D系统设计
---
## 决策1付费方式一期
**结论C — 余额 + 支付宝 + 微信全支持**
**原因:** PigX 框架已集成支付功能,无需自行实现,接入成本低。
**影响:**
- `as_order.pay_type`1=余额, 2=支付宝, 3=微信 ✅(已支持)
- `as_recharge.pay_type`:同上 ✅
- 支付接入:复用 `pigx-pay` 模块,配置支付宝/微信商户信息即可
---
## 决策2拼车广场
**结论C — 一期不做广场,仅平台自营商品**
**原因:** 简化一期功能,降低开发复杂度;拼车广场作为 Phase 2 功能后续追加。
**影响:**
- `as_sub_product.product_type=2`(个人发布)一期不启用
- `as_user_sub_member.status=4`(等待车主录入凭据)一期不启用
- `as_user_sub.host_user_id` 一期始终为平台管理员账号
- 管理后台的"广场审核"模块 Phase 2 再开发
---
## 决策3账号凭据展示方式
**结论B — 需二次验证(短信/密码)才能查看**
**原因:** 安全优先,防止他人借用设备盗取账号密码。
**影响:**
- 查看凭据接口前置二次验证步骤
- 验证方式短信验证码发到注册手机号or 账号密码重新输入
- 实现OTP 存 RedisTTL 5min无需额外数据库表
- 凭据展示后建议前端自动隐藏倒计时UX 优化,非强制)
---
## 决策4邀请返现规则
**结论:完全可配置,无上限**
| 配置项 | 说明 |
|--------|------|
| 返现类型 | 可配置:固定金额 or 按比例(% |
| 返现值 | 数字,根据类型解释为金额或百分比 |
| 触发条件 | 可配置:仅首次购买 or 每次购买 |
| 最低订单金额 | 可配置NULL=不限) |
| 延迟发放天数 | 可配置0=立即N天后发放防退款刷单 |
| 返现上限 | 无上限 |
**影响:**
- 新增 `as_invite_config` 表(管理后台可配置规则,同时启用一套)
- `as_invite.reward_amount` 记录实际发放金额(创建时从当前有效规则快照)
---
## 决策5`sub_plan_ids` 关联方式
**结论:改为关联表** ✅(已在 v3 执行)
---
## 决策6提现功能
**结论B — 二期再做,一期只充值+消费**
**原因:** 提现涉及实名认证、合规审核等复杂流程MVP 阶段不上线。
**影响:**
- `as_wallet_log.type=5`(提现)一期不启用
- `as_wallet.frozen_amount` 字段保留,一期无写入场景
- 管理后台"提现审核"模块 Phase 2 开发
---
## Phase 1 功能范围(最终确认)
### ✅ Phase 1 包含
- 用户注册/登录(手机/邮箱)
- 首页Banner + 商品列表)
- 平台自营商品product_type=1购买
- 余额 + 支付宝 + 微信支付(复用 pigx-pay
- 我的订阅 + 账号凭据查看(二次验证)
- 余额充值(支付宝/微信/人工充值)
- 邀请推广 + 可配置返现
- 系统通知(续费提醒/订单通知)
- 管理后台:平台/商品/账号/订单/用户管理
### ❌ Phase 2 延期
- 拼车广场(个人发布 + 审核流程)
- 提现功能
- 微信/社交登录
- 小程序端
---
*决策人Ami · 2026-02-17*

View File

@@ -0,0 +1,129 @@
-- ============================================================
-- iShare 数据库设计 v2 → v3 增量脚本
-- 修订时间: 2026-02-17
-- 处理评审问题: R1, R2, I1, I2, I3(文档), L1, L2
-- ============================================================
USE pigxx_app;
SET NAMES utf8mb4;
-- ============================================================
-- R2: 修复 as_user_sub_member 唯一键问题
-- 原 UNIQUE(sub_id, user_id) 导致续费覆盖历史记录
-- 改为:允许多条记录,逻辑约束同 sub_id+user_id 只有一条 status=1
-- ============================================================
ALTER TABLE `as_user_sub_member`
DROP INDEX IF EXISTS `uk_sub_user`;
-- 补充索引(定时任务/我的订阅高频查询)
ALTER TABLE `as_user_sub_member`
ADD INDEX IF NOT EXISTS `idx_user_status` (`user_id`, `status`),
ADD INDEX IF NOT EXISTS `idx_expire_status` (`expire_time`, `status`);
-- L1: status 增加 4=等待车主录入凭据(广场拼车场景)
-- 注:仅修改注释,逻辑不变;应用层处理状态值
ALTER TABLE `as_user_sub_member`
MODIFY COLUMN `status` tinyint NOT NULL DEFAULT 0
COMMENT '状态: 0=待激活, 1=使用中, 2=已到期, 3=已退订, 4=等待车主录入凭据';
-- ============================================================
-- I2: as_sub_product.sub_plan_ids 逗号分隔改为关联表
-- ============================================================
-- 新增 M:N 关联表
CREATE TABLE IF NOT EXISTS `as_product_plan_rel` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`product_id` bigint NOT NULL COMMENT '产品ID→ as_sub_product.id',
`plan_id` bigint NOT NULL COMMENT '订阅计划ID→ as_sub_plan.id',
`sort_order` int NOT NULL DEFAULT 0 COMMENT '排序权重(同产品内多计划的展示顺序)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_product_plan` (`product_id`, `plan_id`),
KEY `idx_product_id` (`product_id`),
KEY `idx_plan_id` (`plan_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='产品-订阅计划关联表M:N';
-- 移除旧的逗号分隔字段
ALTER TABLE `as_sub_product`
DROP COLUMN IF EXISTS `sub_plan_ids`;
-- 补充 as_sub_product 高频查询索引
ALTER TABLE `as_sub_product`
ADD INDEX IF NOT EXISTS `idx_product_type_status` (`product_type`, `status`);
-- ============================================================
-- R1: 新增 as_recharge — 钱包充值单
-- 支持外部支付充值时追踪(待支付→成功→到账)
-- ============================================================
CREATE TABLE IF NOT EXISTS `as_recharge` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`recharge_no` varchar(32) NOT NULL COMMENT '充值单号RC+时间戳+随机,业务唯一)',
`user_id` bigint NOT NULL COMMENT '用户ID→ app_user.user_id',
`amount` decimal(10,2) NOT NULL COMMENT '充值金额',
`pay_type` tinyint NOT NULL COMMENT '支付方式: 1=人工充值(管理员), 2=支付宝, 3=微信支付',
`pay_no` varchar(64) DEFAULT NULL COMMENT '第三方支付单号(外部支付时回填)',
`status` tinyint NOT NULL DEFAULT 0 COMMENT '状态: 0=待支付, 1=已支付/已到账, 2=支付失败, 3=已取消',
`remark` varchar(256) DEFAULT NULL COMMENT '备注(人工充值时填写原因)',
`operator_id` bigint DEFAULT NULL COMMENT '操作人ID人工充值时为管理员ID',
`expire_time` datetime DEFAULT NULL COMMENT '订单过期时间(外部支付时 +15min',
`pay_time` datetime DEFAULT NULL COMMENT '实际支付/到账时间',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_recharge_no` (`recharge_no`),
KEY `idx_user_id` (`user_id`),
KEY `idx_status` (`status`),
KEY `idx_pay_no` (`pay_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='钱包充值单表(含外部支付追踪)';
-- ============================================================
-- I1: 新增 as_banner — 首页广告位/Banner
-- ============================================================
CREATE TABLE IF NOT EXISTS `as_banner` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`title` varchar(128) NOT NULL COMMENT 'Banner 标题(后台管理用)',
`image_url` varchar(512) NOT NULL COMMENT 'Banner 图片 URL',
`link_type` tinyint NOT NULL DEFAULT 0 COMMENT '跳转类型: 0=无跳转, 1=商品详情, 2=外部链接, 3=平台分类',
`link_target` varchar(512) DEFAULT NULL COMMENT '跳转目标商品ID/URL/分类ID按 link_type 解析)',
`sort_order` int NOT NULL DEFAULT 0 COMMENT '排序权重(升序,值小靠前)',
`status` tinyint NOT NULL DEFAULT 0 COMMENT '状态: 0=草稿, 1=展示中, 2=已下线',
`start_time` datetime DEFAULT NULL COMMENT '展示开始时间NULL=立即生效)',
`end_time` datetime DEFAULT NULL COMMENT '展示结束时间NULL=长期有效)',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_status_sort` (`status`, `sort_order`),
KEY `idx_time_range` (`start_time`, `end_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='首页 Banner 广告位表';
-- ============================================================
-- L2: 补充关键查询索引
-- ============================================================
-- as_order: 用户订单列表 / 状态过滤
ALTER TABLE `as_order`
ADD INDEX IF NOT EXISTS `idx_user_status` (`user_id`, `status`);
-- as_notification: 未读消息数
ALTER TABLE `as_notification`
ADD INDEX IF NOT EXISTS `idx_user_read` (`user_id`, `is_read`);
-- as_user_sub: 商品下的可用合租槽
ALTER TABLE `as_user_sub`
ADD INDEX IF NOT EXISTS `idx_product_status` (`product_id`, `status`);
-- as_sub_account: 产品下的账号列表
ALTER TABLE `as_sub_account`
ADD INDEX IF NOT EXISTS `idx_product_status` (`product_id`, `status`);
-- ============================================================
-- END
-- ============================================================

View File

@@ -0,0 +1,59 @@
-- ============================================================
-- iShare 数据库设计 v3 → v4 增量脚本
-- 修订时间: 2026-02-17
-- 依据: 决策确认决策1-4,6
-- ============================================================
USE pigxx_app;
SET NAMES utf8mb4;
-- ============================================================
-- 决策4: 新增 as_invite_config — 邀请返现规则配置表
-- 返现类型/金额/触发条件均可配置,支持多套规则(启用一套)
-- ============================================================
CREATE TABLE IF NOT EXISTS `as_invite_config` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(64) NOT NULL COMMENT '规则名称(管理后台展示用)',
`reward_type` tinyint NOT NULL DEFAULT 1 COMMENT '返现类型: 1=固定金额, 2=按比例(%',
`reward_value` decimal(10,4) NOT NULL DEFAULT 0 COMMENT '返现值type=1时为金额CNY; type=2时为百分比如5.00=5%',
`trigger_type` tinyint NOT NULL DEFAULT 1 COMMENT '触发条件: 1=被邀请人首次购买, 2=被邀请人每次购买',
`min_order_amount` decimal(10,2) DEFAULT NULL COMMENT '触发最低订单金额NULL=不限)',
`reward_delay_days` int NOT NULL DEFAULT 0 COMMENT '返现延迟天数0=立即N=N天后发放防退款刷单',
`is_active` tinyint NOT NULL DEFAULT 0 COMMENT '是否启用: 0=禁用, 1=启用(同一时刻只有一条有效)',
`remark` varchar(256) DEFAULT NULL COMMENT '规则备注',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_is_active` (`is_active`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='邀请返现规则配置表(可配置,启用一套)';
-- ============================================================
-- 决策2: Phase 1 无拼车广场
-- as_user_sub_member.status=4等待车主录入凭据一期不启用
-- 修改注释说明,字段值保留供 Phase 2 使用
-- ============================================================
ALTER TABLE `as_user_sub_member`
MODIFY COLUMN `status` tinyint NOT NULL DEFAULT 0
COMMENT '状态: 0=待激活, 1=使用中, 2=已到期, 3=已退订 | Phase2: 4=等待车主录入凭据(拼车广场)';
-- as_sub_product.product_type=2个人发布Phase 1 不启用
-- 修改注释说明
ALTER TABLE `as_sub_product`
MODIFY COLUMN `product_type` tinyint NOT NULL DEFAULT 1
COMMENT '产品类型: 1=自营Phase1启用, 2=个人发布Phase2拼车广场';
-- ============================================================
-- 决策6: 提现功能 Phase 2
-- as_wallet_log.type=5提现一期不启用字段保留
-- ============================================================
ALTER TABLE `as_wallet_log`
MODIFY COLUMN `type` tinyint NOT NULL
COMMENT '流水类型: 1=充值, 2=消费, 3=退款, 4=邀请返现 | Phase2: 5=提现';
-- ============================================================
-- END
-- ============================================================