Compare commits
8 Commits
pigx_ishar
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| fda1c8bdda | |||
| 3f5652e235 | |||
| e5b454351c | |||
|
|
0192fc3523 | ||
|
|
d6af71ec14 | ||
| 690c900f81 | |||
|
|
c29589887d | ||
|
|
c93ef1ca9b |
232
DATABASE_DESIGN_OVERVIEW.md
Normal file
232
DATABASE_DESIGN_OVERVIEW.md
Normal file
@@ -0,0 +1,232 @@
|
||||
# iShare 数据库设计概要
|
||||
|
||||
> 版本:v4(决策确认后最终版)
|
||||
> 修订时间:2026-02-17
|
||||
> 完整建表 SQL(v2 基础版):`db/ishare_schema_v2.sql`
|
||||
> 增量 SQL:`db/ishare_schema_v3_delta.sql` → `db/ishare_schema_v4_delta.sql`
|
||||
> 完整字段说明:`DATABASE_DESIGN_V2.md`
|
||||
> 设计决策记录:`DECISIONS.md`
|
||||
|
||||
---
|
||||
|
||||
## 一、表总览(28 张表)
|
||||
|
||||
### 1.1 App 基础表(复用 PigX,共 9 张)
|
||||
|
||||
| # | 表名 | 说明 | 变更 |
|
||||
|---|------|------|------|
|
||||
| 1 | `app_user` | 用户 | 追加 `invite_code`、`inviter_id` |
|
||||
| 2-9 | `app_role` / `app_user_role` / `app_social_details` / `app_article*` / `app_page` / `app_tabbar` | 框架基础 | 沿用 |
|
||||
|
||||
### 1.2 业务表(iShare 专属,共 19 张)
|
||||
|
||||
#### 平台与产品
|
||||
|
||||
| # | 表名 | 说明 | Phase |
|
||||
|---|------|------|-------|
|
||||
| 10 | `as_platform_type` | 平台分类 | P1 |
|
||||
| 11 | `as_platform` | 流媒体平台 | P1 |
|
||||
| 12 | `as_sub_plan` | 订阅计划 | P1 |
|
||||
| 13 | `as_sub_payroll` | 付费方案(月/季/年) | P1 |
|
||||
| 14 | `as_sub_product` | 合租商品(P1仅 type=1 自营) | P1 |
|
||||
| 15 | `as_product_plan_rel` | 产品-计划 M:N 关联 | P1 |
|
||||
| 16 | `as_sub_account` | 平台账号凭据(AES 加密) | P1 |
|
||||
| 17 | `as_sub_product_comment` | 商品评价 | P1 |
|
||||
| 18 | `as_banner` | 首页 Banner 广告位 | P1 |
|
||||
|
||||
#### 订阅与订单
|
||||
|
||||
| # | 表名 | 说明 | Phase |
|
||||
|---|------|------|-------|
|
||||
| 19 | `as_user_sub` | 合租槽/共享池 | P1 |
|
||||
| 20 | `as_user_sub_member` | 个人订阅记录(status=4 P2用) | P1 |
|
||||
| 21 | `as_order` | 订单(三种支付方式,复用 pigx-pay) | P1 |
|
||||
|
||||
#### 钱包与推广
|
||||
|
||||
| # | 表名 | 说明 | Phase |
|
||||
|---|------|------|-------|
|
||||
| 22 | `as_recharge` | 充值单(人工/支付宝/微信) | P1 |
|
||||
| 23 | `as_wallet` | 用户钱包(乐观锁防并发) | P1 |
|
||||
| 24 | `as_wallet_log` | 钱包流水(type=5 提现 P2用) | P1 |
|
||||
| 25 | `as_invite` | 邀请关系与返现记录 | P1 |
|
||||
| 26 | `as_invite_config` | 邀请返现规则配置(可配置) | P1 |
|
||||
| 27 | `as_notification` | 系统通知 | P1 |
|
||||
|
||||
---
|
||||
|
||||
## 二、核心 ER 关系概览
|
||||
|
||||
```
|
||||
as_platform_type (1) ──< (N) as_platform
|
||||
as_platform (1) ──< (N) as_sub_plan
|
||||
as_sub_plan (1) ──< (N) as_sub_payroll
|
||||
as_sub_plan (N) >──< (N) as_sub_product [via as_product_plan_rel]
|
||||
as_platform (1) ──< (N) as_sub_product [platform_id 冗余]
|
||||
|
||||
as_sub_product (1) ──< (N) as_sub_account
|
||||
as_sub_product (1) ──< (N) as_user_sub
|
||||
as_user_sub (1) ──< (N) as_user_sub_member
|
||||
|
||||
as_sub_product (1) ──< (N) as_order
|
||||
as_order (1) ──< (1) as_user_sub_member [order_id]
|
||||
|
||||
app_user (1) ──< (1) as_wallet
|
||||
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_recharge
|
||||
app_user (1) ──< (N) as_user_sub_member
|
||||
app_user (1) ──< (N) as_invite [as inviter]
|
||||
app_user (1) ──< (1) as_invite [as invitee]
|
||||
app_user (1) ──< (N) as_notification
|
||||
|
||||
as_invite_config (1:active) ──→ as_invite [规则快照到 reward_amount]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 三、关键状态机
|
||||
|
||||
### 3.1 订单(as_order)
|
||||
|
||||
```
|
||||
[待支付(0)] ─→ 15min 超时 ─→ [已取消(4)]
|
||||
[待支付(0)] ─→ 支付成功 ─→ [已支付(1)] ─→ 激活订阅 ─→ [已完成(2)]
|
||||
[已支付/完成] ─→ 退款 ─→ [已退款(3)]
|
||||
```
|
||||
|
||||
**支付方式:** 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_member)
|
||||
|
||||
```
|
||||
[待激活(0)] ─→ 订单完成 ─→ [使用中(1)]
|
||||
[使用中(1)] ─→ 到期 ─→ [已到期(2)] ─→ 续费 → 新建记录回到[待激活(0)]
|
||||
─→ 主动退订 ─→ [已退订(3)]
|
||||
|
||||
[Phase2] 拼车广场付款后 → [等待车主录入凭据(4)] → 车主录入 → [使用中(1)]
|
||||
```
|
||||
|
||||
> 续费策略:新建 member 记录,旧记录置为2=已到期(保留历史,便于对账)
|
||||
|
||||
### 3.4 合租槽(as_user_sub)
|
||||
|
||||
```
|
||||
[可加入(0)] ─→ 席位满 ─→ [已满(1)]
|
||||
[可加入/已满] ─→ 到期 ─→ [已到期(2)]
|
||||
─→ 车主关闭 ─→ [已关闭(3)]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 四、关键设计机制
|
||||
|
||||
### 4.1 席位超卖防护(乐观锁)
|
||||
|
||||
```sql
|
||||
UPDATE as_user_sub
|
||||
SET capacity_loaded = capacity_loaded + 1
|
||||
WHERE id = ? AND capacity_loaded < capacity;
|
||||
-- affected rows = 0 → 席位已满,拒绝购买
|
||||
```
|
||||
|
||||
### 4.2 账号凭据安全
|
||||
|
||||
- 存储:AES-256-GCM 加密,密钥存环境变量不入库
|
||||
- 查看:**需二次验证(SMS OTP 或密码重输),OTP 存 Redis TTL 5min**
|
||||
- 返回:服务端解密后返回明文,不记录日志,前端倒计时隐藏
|
||||
|
||||
### 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_log(type=4)+ as_wallet.balance +reward_amount
|
||||
```
|
||||
|
||||
### 4.5 钱包余额并发控制(乐观锁)
|
||||
|
||||
```sql
|
||||
UPDATE as_wallet
|
||||
SET balance = balance - ?, version = version + 1
|
||||
WHERE user_id = ? AND version = ? AND balance >= ?;
|
||||
-- affected rows = 0 → 并发冲突或余额不足
|
||||
```
|
||||
|
||||
### 4.6 订阅到期定时任务(每日 02:00)
|
||||
|
||||
```
|
||||
1. expire_time < now()+7天 且 status=1 → 推送续费提醒
|
||||
2. expire_time < now() 且 status=1 → 置 status=2,capacity_loaded -1
|
||||
3. as_order.expire_time < now() 且 status=0 → 置 status=4(取消)
|
||||
4. as_recharge.expire_time < now() 且 status=0 → 置 status=3(取消)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 五、关键索引清单
|
||||
|
||||
| 表 | 索引字段 | 用途 |
|
||||
|----|---------|------|
|
||||
| `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)` | 未读通知数 |
|
||||
| `as_user_sub` | `(product_id, status)` | 商品可用合租槽 |
|
||||
| `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)` | 读取当前规则 |
|
||||
|
||||
---
|
||||
|
||||
## 六、版本变更记录
|
||||
|
||||
| 版本 | 变更内容 |
|
||||
|------|----------|
|
||||
| v1 | 原版骨架(2023-08,有多项严重缺陷) |
|
||||
| v2 | 全面修订:修复15项缺陷,新增6张表(23张) |
|
||||
| v3 | 评审修订:修复7个问题,新增3张表(27张) |
|
||||
| **v4** | **决策确认:新增 `as_invite_config`(28张),Phase 1/2 范围明确** |
|
||||
|
||||
---
|
||||
|
||||
## 七、所有待决策项(已全部确认 ✅)
|
||||
|
||||
| # | 问题 | 决策 |
|
||||
|---|------|------|
|
||||
| 1 | 付费方式一期 | ✅ C - 余额+支付宝+微信(复用 pigx-pay) |
|
||||
| 2 | 拼车广场 | ✅ C - Phase 1 不做,Phase 2 追加 |
|
||||
| 3 | 凭据展示 | ✅ B - 二次验证(SMS OTP 或密码重输) |
|
||||
| 4 | 邀请返现 | ✅ 完全可配置(类型/金额/触发条件),无上限 |
|
||||
| 5 | M:N 关联 | ✅ v3 已改为 `as_product_plan_rel` |
|
||||
| 6 | 提现功能 | ✅ B - Phase 2,一期只充值+消费 |
|
||||
|
||||
**Phase D(系统设计)✅ 全部完成**
|
||||
|
||||
---
|
||||
|
||||
*最后更新:2026-02-17 · v4 定稿*
|
||||
427
DATABASE_DESIGN_V2.md
Normal file
427
DATABASE_DESIGN_V2.md
Normal file
@@ -0,0 +1,427 @@
|
||||
# iShare 数据库设计 v2.0(修订版)
|
||||
|
||||
> 基于原版 v1.0(2023-08 骨架)审查后全面修订
|
||||
> 修订时间: 2026-02-17
|
||||
> 建表脚本: `db/ishare_schema_v2.sql`
|
||||
|
||||
---
|
||||
|
||||
## 一、修订说明
|
||||
|
||||
### 1.1 原版问题总结
|
||||
|
||||
| 类型 | 数量 | 说明 |
|
||||
|------|------|------|
|
||||
| 🔴 严重缺陷 | 4 项 | 直接导致核心功能不可用 |
|
||||
| 🟠 重要问题 | 6 项 | 数据类型错误/查询困难 |
|
||||
| 🟡 设计缺失 | 5 项 | 运营/安全功能不完整 |
|
||||
|
||||
### 1.2 修订内容
|
||||
|
||||
| 表名 | 修订类型 | 主要变更 |
|
||||
|------|----------|----------|
|
||||
| `as_platform_type` | 补充 | 加 `status`、`del_flag`、时间戳;`sort_order` varchar→int |
|
||||
| `as_platform` | 补充 | 加 `description`、`status`、`del_flag`、时间戳;`sort_order` varchar→int |
|
||||
| `as_sub_plan` | 修复+补充 | `platform_id` varchar→**bigint**;`capacity` varchar→**int**;加状态/软删除/时间戳 |
|
||||
| `as_sub_payroll` | 重构 | `sub_plans`→**`sub_plan_id`**(语义明确);加 `duration_months`、`original_price`、`is_active`;软删除/时间戳 |
|
||||
| `as_sub_product` | 修复+补充 | **`Tags`→`tags`**(命名修复);加 `platform_id`、`cover_image`、`status`、`total_capacity`;`product_type`/`sub_type` Long→**tinyint** |
|
||||
| `as_sub_account` | 修复+补充 | 4个字段 int→**bigint**;`passwd_salt` int→**varchar(64)**;加 `encrypt_type`、`status`、软删除/时间戳 |
|
||||
| `as_user_sub` | 语义修订+修复 | 重定义为"合租槽(共享池)";`remark` int→**varchar**;字段 int→bigint;加 `product_id`、`status`、`expire_time`、软删除/时间戳;`user_id`→`host_user_id`(语义明确);`main_account`→`account_id` |
|
||||
| `as_sub_product_comment` | 补充 | 加 `order_id`(购买验证)、`is_anonymous`、`reply_id`(追评)、`del_flag` |
|
||||
| `as_user_sub_member` | **新增** | 个人订阅记录(原版最大缺失),含 `status`、`start_time`、`expire_time` |
|
||||
| `as_order` | **新增** | 完整订单表(含状态机、价格快照、支付信息) |
|
||||
| `as_wallet` | **新增** | 用户钱包(含乐观锁 `version` 防并发) |
|
||||
| `as_wallet_log` | **新增** | 钱包流水(含 `balance_after` 快照便于对账) |
|
||||
| `as_invite` | **新增** | 邀请关系与返现 |
|
||||
| `as_notification` | **新增** | 系统通知(续费提醒/订单/公告/奖励) |
|
||||
| `app_user` | 追加字段 | 加 `invite_code`(专属邀请码)、`inviter_id` |
|
||||
|
||||
---
|
||||
|
||||
## 二、表结构(v2.0)
|
||||
|
||||
### 2.1 `as_platform_type` — 平台类型
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `id` | bigint PK | 主键 |
|
||||
| `name` | varchar(64) NOT NULL | 类型名称(视频/音乐/AI等) |
|
||||
| `platform_type` | int DEFAULT 0 | 类型编号(0=全部,用于筛选) |
|
||||
| `sort_order` | int DEFAULT 0 | 排序权重(升序,**原为 varchar**) |
|
||||
| `status` | tinyint DEFAULT 1 | **新增** 0=禁用, 1=启用 |
|
||||
| `del_flag` | char(1) DEFAULT '0' | **新增** 软删除 |
|
||||
| `create_time` | datetime | **新增** |
|
||||
| `update_time` | datetime | **新增** |
|
||||
|
||||
### 2.2 `as_platform` — 流媒体平台
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `id` | bigint PK | 主键 |
|
||||
| `platform_name` | varchar(128) NOT NULL | 平台名称 |
|
||||
| `platform_type` | int DEFAULT 0 | 关联类型编号 |
|
||||
| `icon` | varchar(512) | 图标 URL |
|
||||
| `description` | varchar(512) | **新增** 平台简介 |
|
||||
| `company` | varchar(128) | 所属公司 |
|
||||
| `website` | varchar(256) | 官网 |
|
||||
| `sort_order` | int DEFAULT 0 | 排序(**原为 varchar**) |
|
||||
| `status` | tinyint DEFAULT 1 | **新增** 0=禁用, 1=启用 |
|
||||
| `del_flag` | char(1) DEFAULT '0' | **新增** 软删除 |
|
||||
| `create_time` | datetime | **新增** |
|
||||
| `update_time` | datetime | **新增** |
|
||||
|
||||
### 2.3 `as_sub_plan` — 订阅计划
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `id` | bigint PK | 主键 |
|
||||
| `name` | varchar(128) NOT NULL | 计划名称 |
|
||||
| `platform_id` | bigint NOT NULL | 所属平台(**原为 varchar,已修复**) |
|
||||
| `capacity` | int NOT NULL DEFAULT 1 | 席位容量(**原为 varchar,已修复**) |
|
||||
| `remark` | varchar(256) | 备注 |
|
||||
| `sort_order` | int DEFAULT 0 | 排序 |
|
||||
| `status` | tinyint DEFAULT 1 | **新增** 0=禁用, 1=启用 |
|
||||
| `del_flag` | char(1) DEFAULT '0' | **新增** 软删除 |
|
||||
| `create_time` | datetime | **新增** |
|
||||
| `update_time` | datetime | **新增** |
|
||||
|
||||
### 2.4 `as_sub_payroll` — 付费方案
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `id` | bigint PK | 主键 |
|
||||
| `sub_plan_id` | bigint NOT NULL | 所属订阅计划(**原 `sub_plans` 注释混乱,已重命名+澄清**) |
|
||||
| `platform_id` | bigint NOT NULL | 平台ID(冗余) |
|
||||
| `payroll` | tinyint NOT NULL | 周期: 1=月付, 2=季付, 3=年付 |
|
||||
| `duration_months` | int NOT NULL | **新增** 实际月数: 1/3/12 |
|
||||
| `price` | decimal(10,2) | 售价 |
|
||||
| `original_price` | decimal(10,2) | **新增** 划线价(显示折扣用) |
|
||||
| `currency` | varchar(8) DEFAULT 'CNY' | 货币单位 |
|
||||
| `region` | varchar(64) | 适用地区 |
|
||||
| `is_active` | tinyint DEFAULT 1 | **新增** 0=下架, 1=上架 |
|
||||
| `del_flag` | char(1) DEFAULT '0' | **新增** 软删除 |
|
||||
| `create_time` | datetime | **新增** |
|
||||
| `update_time` | datetime | **新增** |
|
||||
|
||||
### 2.5 `as_sub_product` — 订阅产品(合租商品)
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `id` | bigint PK | 主键 |
|
||||
| `title` | varchar(256) NOT NULL | 产品标题 |
|
||||
| `description` | varchar(1024) | 描述 |
|
||||
| `cover_image` | varchar(512) | **新增** 封面图 URL |
|
||||
| `tags` | varchar(256) | 标签(逗号分隔,**原字段名 `Tags` 大写 Bug 已修复**) |
|
||||
| `platform_id` | bigint NOT NULL | **新增** 所属平台(加速查询) |
|
||||
| `sub_plan_ids` | varchar(256) | 关联计划ID列表(逗号分隔,保留现状) |
|
||||
| `product_type` | tinyint NOT NULL DEFAULT 1 | 1=自营, 2=个人(**原为 Long,已修复**) |
|
||||
| `sub_type` | tinyint NOT NULL DEFAULT 1 | 1=单品, 2=多品组合(**原为 Long,已修复**) |
|
||||
| `total_capacity` | int NOT NULL DEFAULT 1 | **新增** 总席位数 |
|
||||
| `amount` | decimal(10,2) | 基准月价 |
|
||||
| `star` | decimal(3,1) DEFAULT 0.0 | 综合评分(由评价聚合更新) |
|
||||
| `status` | tinyint NOT NULL DEFAULT 0 | **新增** 0=草稿, 1=上架, 2=下架, 3=售完 |
|
||||
| `user_id` | bigint | 发布者用户ID |
|
||||
| `del_flag` | char(1) DEFAULT '0' | **新增** 软删除 |
|
||||
| `create_by` / `update_by` | varchar(64) | **新增** |
|
||||
| `create_time` / `update_time` | datetime | |
|
||||
|
||||
### 2.6 `as_sub_account` — 平台账号凭据
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `id` | bigint PK | 主键 |
|
||||
| `product_id` | bigint | 关联产品ID |
|
||||
| `sub_plan_id` | bigint | 订阅计划ID(**原 int,已修复**) |
|
||||
| `sub_payroll_id` | bigint | 付费方案ID(**原 int,已修复**) |
|
||||
| `platform_id` | bigint NOT NULL | 平台ID(**原 int,已修复**) |
|
||||
| `user_id` | bigint NOT NULL | 账号持有者(**原 int,已修复**) |
|
||||
| `account_name` | varchar(256) NOT NULL | 平台登录用户名/邮箱 |
|
||||
| `account_passwd` | varchar(512) NOT NULL | 加密后的密码 |
|
||||
| `passwd_salt` | varchar(64) NOT NULL | 加密盐值(**原 int 已修复为 varchar(64)**) |
|
||||
| `encrypt_type` | tinyint NOT NULL DEFAULT 1 | **新增** 加密算法: 1=AES-256-GCM |
|
||||
| `region` | varchar(64) | 账号地区 |
|
||||
| `share_type` | tinyint | 分享类型 |
|
||||
| `account_type` | tinyint | 账号类型 |
|
||||
| `renew_date` | datetime | 账号下次续费日 |
|
||||
| `status` | tinyint NOT NULL DEFAULT 0 | **新增** 0=正常, 1=已失效, 2=异常/被封 |
|
||||
| `del_flag` | char(1) DEFAULT '0' | **新增** 软删除 |
|
||||
| `create_time` / `update_time` | datetime | **新增** |
|
||||
|
||||
### 2.7 `as_user_sub` — 合租槽(共享池)
|
||||
|
||||
> 语义修订:代表"一个共享席位池",不代表个人订阅。个人订阅记录见 `as_user_sub_member`。
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `id` | bigint PK | 主键 |
|
||||
| `product_id` | bigint NOT NULL | **新增** 关联产品 |
|
||||
| `plan_id` | bigint NOT NULL | 订阅计划(**原 int,已修复**) |
|
||||
| `platform_id` | bigint NOT NULL | 平台(冗余) |
|
||||
| `host_user_id` | bigint NOT NULL | **重命名自 `user_id`**,车主用户ID(语义明确) |
|
||||
| `account_id` | bigint | **重命名自 `main_account`**,关联凭据(语义明确) |
|
||||
| `capacity` | int NOT NULL | 总席位数 |
|
||||
| `capacity_loaded` | int NOT NULL DEFAULT 0 | 已占用席位数 |
|
||||
| `region` | varchar(64) | 地区 |
|
||||
| `status` | tinyint NOT NULL DEFAULT 0 | **新增** 0=可加入, 1=已满, 2=已到期, 3=已关闭 |
|
||||
| `expire_time` | datetime | **新增** 合租槽到期时间 |
|
||||
| `remark` | varchar(512) | 车主说明(**原 int,已修复为 varchar**) |
|
||||
| `del_flag` | char(1) DEFAULT '0' | **新增** 软删除 |
|
||||
| `create_time` / `update_time` | datetime | **新增** |
|
||||
|
||||
### 2.8 `as_sub_product_comment` — 产品评价
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `id` | bigint PK | 主键 |
|
||||
| `product_id` | bigint NOT NULL | 关联产品 |
|
||||
| `user_id` | bigint NOT NULL | 评价用户 |
|
||||
| `order_id` | bigint | **新增** 关联订单(验证是否购买过) |
|
||||
| `star` | tinyint NOT NULL | 评分 1-5 |
|
||||
| `comment` | varchar(1024) | 评价内容 |
|
||||
| `is_anonymous` | tinyint DEFAULT 0 | **新增** 0=公开, 1=匿名 |
|
||||
| `reply_id` | bigint | **新增** 回复的评价ID(追评/商家回复) |
|
||||
| `del_flag` | char(1) DEFAULT '0' | **新增** 软删除 |
|
||||
| `create_time` / `update_time` | datetime | |
|
||||
|
||||
### 2.9 `as_user_sub_member` — 个人订阅记录 【新增,原版最大缺失】
|
||||
|
||||
> 原版无此表,导致"哪些用户加入了哪个合租位"完全无法追踪。
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `id` | bigint PK | 主键 |
|
||||
| `sub_id` | bigint NOT NULL | 所在合租槽(→ `as_user_sub.id`) |
|
||||
| `user_id` | bigint NOT NULL | 订阅用户 |
|
||||
| `order_id` | bigint NOT NULL | 来源订单(→ `as_order.id`) |
|
||||
| `payroll_id` | bigint NOT NULL | 购买的付费方案 |
|
||||
| `status` | tinyint NOT NULL DEFAULT 0 | 0=待激活, 1=使用中, 2=已到期, 3=已退订 |
|
||||
| `start_time` | datetime NOT NULL | 订阅开始时间 |
|
||||
| `expire_time` | datetime NOT NULL | 订阅到期时间 |
|
||||
| `del_flag` | char(1) DEFAULT '0' | 软删除 |
|
||||
| `create_time` / `update_time` | datetime | |
|
||||
| UK: `(sub_id, user_id)` | — | 同一合租槽同一用户只能有一条有效记录 |
|
||||
|
||||
### 2.10 `as_order` — 订单表 【新增】
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `id` | bigint PK | 主键 |
|
||||
| `order_no` | varchar(32) UNIQUE | 业务订单号(AS+时间戳+随机) |
|
||||
| `user_id` | bigint NOT NULL | 购买用户 |
|
||||
| `product_id` | bigint NOT NULL | 商品 |
|
||||
| `payroll_id` | bigint NOT NULL | 付费方案 |
|
||||
| `original_amount` | decimal(10,2) | 原价快照(防价格变动) |
|
||||
| `discount_amount` | decimal(10,2) DEFAULT 0 | 优惠金额 |
|
||||
| `amount` | decimal(10,2) | 实付金额 |
|
||||
| `pay_type` | tinyint | 1=余额, 2=支付宝, 3=微信 |
|
||||
| `pay_no` | varchar(64) | 第三方支付单号 |
|
||||
| `status` | tinyint NOT NULL DEFAULT 0 | 0=待支付, 1=已支付, 2=已完成, 3=已退款, 4=已取消 |
|
||||
| `member_id` | bigint | 关联个人订阅记录(支付后填充) |
|
||||
| `expire_time` | datetime NOT NULL | 订单过期时间(默认 +15min)|
|
||||
| `pay_time` | datetime | 实际支付时间 |
|
||||
| `del_flag` | char(1) DEFAULT '0' | 软删除 |
|
||||
| `create_time` / `update_time` | datetime | |
|
||||
|
||||
**订单状态机:**
|
||||
```
|
||||
[待支付] → 15分钟超时 → [已取消]
|
||||
[待支付] → 支付成功 → [已支付] → 激活订阅 → [已完成]
|
||||
[已支付/已完成] → 退款 → [已退款]
|
||||
```
|
||||
|
||||
### 2.11 `as_wallet` — 用户钱包 【新增】
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `id` | bigint PK | 主键 |
|
||||
| `user_id` | bigint UNIQUE | 用户(一人一钱包) |
|
||||
| `balance` | decimal(10,2) | 可用余额 |
|
||||
| `frozen_amount` | decimal(10,2) | 冻结金额 |
|
||||
| `total_income` | decimal(10,2) | 累计收入 |
|
||||
| `total_expense` | decimal(10,2) | 累计支出 |
|
||||
| `version` | int DEFAULT 0 | 乐观锁版本号(防并发余额错误) |
|
||||
| `create_time` / `update_time` | datetime | |
|
||||
|
||||
### 2.12 `as_wallet_log` — 钱包流水 【新增】
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `id` | bigint PK | 主键 |
|
||||
| `user_id` | bigint NOT NULL | 用户 |
|
||||
| `amount` | decimal(10,2) | 金额(正=收入, 负=支出) |
|
||||
| `type` | tinyint | 1=充值, 2=消费, 3=退款, 4=邀请返现, 5=提现 |
|
||||
| `order_id` | bigint | 关联订单(可空) |
|
||||
| `balance_after` | decimal(10,2) | 操作后余额快照(对账用) |
|
||||
| `remark` | varchar(256) | 说明 |
|
||||
| `create_time` | datetime | |
|
||||
|
||||
### 2.13 `as_invite` — 邀请关系 【新增】
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `id` | bigint PK | 主键 |
|
||||
| `inviter_id` | bigint NOT NULL | 邀请人 |
|
||||
| `invitee_id` | bigint NOT NULL UNIQUE | 被邀请人(一个人只有一条邀请记录) |
|
||||
| `invite_code` | varchar(16) | 使用的邀请码 |
|
||||
| `reward_amount` | decimal(10,2) | 返现金额 |
|
||||
| `reward_status` | tinyint DEFAULT 0 | 0=待发放, 1=已发放, 2=已失效 |
|
||||
| `reward_time` | datetime | 返现时间 |
|
||||
| `create_time` | datetime | 注册时间 |
|
||||
|
||||
### 2.14 `as_notification` — 系统通知 【新增】
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `id` | bigint PK | 主键 |
|
||||
| `user_id` | bigint NOT NULL | 目标用户(0=全体广播) |
|
||||
| `title` | varchar(128) | 通知标题 |
|
||||
| `content` | varchar(1024) | 通知内容 |
|
||||
| `type` | tinyint | 1=续费提醒, 2=订单通知, 3=系统公告, 4=邀请奖励 |
|
||||
| `ref_id` | bigint | 关联业务ID(按 type 解析) |
|
||||
| `is_read` | tinyint DEFAULT 0 | 0=未读, 1=已读 |
|
||||
| `create_time` | datetime | |
|
||||
|
||||
---
|
||||
|
||||
## 三、完整 ER 关系图(v2.0)
|
||||
|
||||
```
|
||||
as_platform_type (1) ──< (N) as_platform [platform_type]
|
||||
as_platform (1) ──< (N) as_sub_plan [platform_id]
|
||||
as_sub_plan (1) ──< (N) as_sub_payroll [sub_plan_id]
|
||||
as_sub_plan (N) >──< (N) as_sub_product [sub_plan_ids 逗号分隔]
|
||||
as_platform (1) ──< (N) as_sub_product [platform_id 冗余]
|
||||
|
||||
as_sub_product (1) ──< (N) as_sub_product_comment [product_id]
|
||||
as_sub_product (1) ──< (N) as_sub_account [product_id]
|
||||
as_sub_product (1) ──< (N) as_user_sub [product_id]
|
||||
as_sub_plan (1) ──< (N) as_sub_account [sub_plan_id]
|
||||
as_sub_payroll (1) ──< (N) as_sub_account [sub_payroll_id]
|
||||
|
||||
as_user_sub (1) ──< (N) as_user_sub_member [sub_id] ← 新增关键表
|
||||
as_order (1) ──< (1) as_user_sub_member [order_id]
|
||||
as_sub_payroll (1) ──< (N) as_user_sub_member [payroll_id]
|
||||
|
||||
as_sub_product (1) ──< (N) as_order [product_id]
|
||||
as_sub_payroll (1) ──< (N) as_order [payroll_id]
|
||||
as_order (1) ──< (N) as_wallet_log [order_id]
|
||||
|
||||
app_user (1) ──< (1) as_wallet [user_id]
|
||||
as_wallet (1) ──< (N) as_wallet_log [user_id]
|
||||
|
||||
app_user (1) ──< (N) as_order [user_id]
|
||||
app_user (1) ──< (N) as_user_sub [as host] [host_user_id]
|
||||
app_user (1) ──< (N) as_user_sub_member [user_id]
|
||||
app_user (1) ──< (N) as_sub_product [user_id 发布者]
|
||||
app_user (1) ──< (N) as_sub_account [user_id 持有者]
|
||||
app_user (1) ──< (N) as_sub_product_comment [user_id]
|
||||
app_user (1) ──< (N) as_notification [user_id]
|
||||
|
||||
app_user (1) ──< (N) as_invite [as inviter] [inviter_id]
|
||||
app_user (1) ──< (1) as_invite [as invitee] [invitee_id]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 四、`as_user_sub_member` 状态机
|
||||
|
||||
```
|
||||
购买成功(order paid)
|
||||
[待激活] ──────────────→ [使用中]
|
||||
│
|
||||
┌───────────┤
|
||||
│ │
|
||||
主动退订 到期
|
||||
│ │
|
||||
↓ ↓
|
||||
[已退订] [已到期]
|
||||
│
|
||||
续费
|
||||
│
|
||||
↓
|
||||
[使用中]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 五、重要设计说明
|
||||
|
||||
### 5.1 容量管理与并发控制
|
||||
|
||||
**席位超卖防护:**
|
||||
- `as_sub_product.total_capacity` — 总席位(固定值)
|
||||
- `as_user_sub.capacity_loaded` — 已占用(购买时 +1,退订/到期时 -1)
|
||||
- 购买时通过 **乐观锁** 控制:
|
||||
```sql
|
||||
UPDATE as_user_sub
|
||||
SET capacity_loaded = capacity_loaded + 1
|
||||
WHERE id = ? AND capacity_loaded < capacity
|
||||
```
|
||||
更新行数 = 0 则说明已满,拒绝购买
|
||||
|
||||
### 5.2 账号凭据加密
|
||||
|
||||
- 算法:AES-256-GCM(`encrypt_type = 1`)
|
||||
- `account_passwd`:密文(Base64 编码)
|
||||
- `passwd_salt`:随机 IV(16字节,Base64 编码,**原 int 类型错误已修复**)
|
||||
- 密钥:存于服务端配置/环境变量,不入库
|
||||
|
||||
### 5.3 钱包余额并发控制
|
||||
|
||||
- `as_wallet.version` 字段实现乐观锁:
|
||||
```sql
|
||||
UPDATE as_wallet
|
||||
SET balance = balance - ?, version = version + 1
|
||||
WHERE user_id = ? AND version = ? AND balance >= ?
|
||||
```
|
||||
更新行数 = 0 则说明并发冲突或余额不足
|
||||
|
||||
### 5.4 订阅到期任务
|
||||
|
||||
定时任务(建议每日 02:00):
|
||||
```
|
||||
1. 查询 expire_time < now() + 7d 且 status = 1 的 as_user_sub_member
|
||||
→ 生成 as_notification(type=1,续费提醒)
|
||||
|
||||
2. 查询 expire_time < now() 且 status = 1 的 as_user_sub_member
|
||||
→ UPDATE status = 2(已到期)
|
||||
→ UPDATE as_user_sub SET capacity_loaded = capacity_loaded - 1
|
||||
```
|
||||
|
||||
### 5.5 评价限制
|
||||
|
||||
- 写评价前校验:`as_order` 存在且 `status IN (2,3)` 且 `user_id` 匹配
|
||||
- `star` 范围 1-5,服务端强制校验
|
||||
- `as_sub_product.star` 由定时任务或触发器聚合更新(AVG)
|
||||
|
||||
---
|
||||
|
||||
## 六、数据库表总览(v2.0)
|
||||
|
||||
| # | 表名 | 类型 | 状态 |
|
||||
|---|------|------|------|
|
||||
| 1 | `app_user` | App基础 | 追加2字段 |
|
||||
| 2 | `app_role` | App基础 | 沿用 |
|
||||
| 3 | `app_user_role` | App基础 | 沿用 |
|
||||
| 4 | `app_social_details` | App基础 | 沿用 |
|
||||
| 5 | `app_article_category` | App基础 | 沿用 |
|
||||
| 6 | `app_article` | App基础 | 沿用 |
|
||||
| 7 | `app_article_collect` | App基础 | 沿用 |
|
||||
| 8 | `app_page` | App基础 | 沿用 |
|
||||
| 9 | `app_tabbar` | App基础 | 沿用 |
|
||||
| 10 | `as_platform_type` | 业务 | 修订 |
|
||||
| 11 | `as_platform` | 业务 | 修订 |
|
||||
| 12 | `as_sub_plan` | 业务 | 修订 |
|
||||
| 13 | `as_sub_payroll` | 业务 | 修订 |
|
||||
| 14 | `as_sub_product` | 业务 | 修订 |
|
||||
| 15 | `as_sub_account` | 业务 | 修订 |
|
||||
| 16 | `as_user_sub` | 业务 | 修订(语义重定义) |
|
||||
| 17 | `as_sub_product_comment` | 业务 | 修订 |
|
||||
| 18 | `as_user_sub_member` | 业务 | **新增** |
|
||||
| 19 | `as_order` | 业务 | **新增** |
|
||||
| 20 | `as_wallet` | 业务 | **新增** |
|
||||
| 21 | `as_wallet_log` | 业务 | **新增** |
|
||||
| 22 | `as_invite` | 业务 | **新增** |
|
||||
| 23 | `as_notification` | 业务 | **新增** |
|
||||
|
||||
合计:9 张 App 基础表 + 14 张业务表 = **23 张表**
|
||||
108
DECISIONS.md
Normal file
108
DECISIONS.md
Normal 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 存 Redis(TTL 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*
|
||||
371
SYSTEM_DESIGN.md
Normal file
371
SYSTEM_DESIGN.md
Normal file
@@ -0,0 +1,371 @@
|
||||
# iShare 系统设计文档
|
||||
|
||||
> 优先级:最高(先于所有开发任务)
|
||||
> 版本:v1.0
|
||||
> 日期:2026-02-17
|
||||
|
||||
---
|
||||
|
||||
## 一、系统角色
|
||||
|
||||
| 角色 | 说明 |
|
||||
|------|------|
|
||||
| **普通用户** | 注册登录,购买合租商品,获取账号凭据 |
|
||||
| **车主(发布者)** | 发布自己的合租位(个人拼车广场) |
|
||||
| **平台运营(管理员)** | 管理平台数据、自营商品、用户、订单 |
|
||||
| **超级管理员** | 全局配置,含财务、权限管理 |
|
||||
|
||||
---
|
||||
|
||||
## 二、功能模块清单
|
||||
|
||||
### 2.1 用户端 H5 功能
|
||||
|
||||
| 模块 | 功能点 |
|
||||
|------|--------|
|
||||
| **账号** | 手机号注册/登录、邮箱注册/登录、找回密码(验证码)、微信/社交登录(二期) |
|
||||
| **首页** | 平台分类Tab、推荐商品卡片、Banner 广告位、热门合租榜 |
|
||||
| **商品列表** | 按平台类型筛选、按价格/评分排序、关键词搜索 |
|
||||
| **商品详情** | 平台介绍、套餐选择(月/季/年)、评价列表、剩余席位数、立即购买 |
|
||||
| **购买流程** | 选套餐 → 确认订单 → 支付(余额/在线支付)→ 获取账号凭据 |
|
||||
| **我的订阅** | 当前有效订阅列表、账号凭据查看、续费、退订 |
|
||||
| **广场/拼车** | 浏览他人发起的合租位、申请加入、发起自己的合租 |
|
||||
| **推广中心** | 邀请码、邀请记录、返现奖励记录 |
|
||||
| **钱包** | 余额查看、充值、提现(二期)、流水记录 |
|
||||
| **通知** | 续费提醒、订单状态变更、系统公告 |
|
||||
| **个人中心** | 基本信息编辑、头像、安全设置(改密)、退出登录 |
|
||||
|
||||
### 2.2 管理后台功能
|
||||
|
||||
| 模块 | 功能点 |
|
||||
|------|--------|
|
||||
| **平台管理** | 平台CRUD、平台分类CRUD、图标上传 |
|
||||
| **订阅计划管理** | 计划CRUD、付费方案CRUD(多地区/多货币) |
|
||||
| **自营商品管理** | 商品CRUD、上下架、库存(账号)管理、绑定账号凭据 |
|
||||
| **订单管理** | 订单列表、状态查看、人工审核、退款处理 |
|
||||
| **用户管理** | 用户列表、封禁/解封、余额调整、查看订阅记录 |
|
||||
| **评价管理** | 评价列表、违规删除 |
|
||||
| **财务管理** | 收入统计、提现申请审核(二期)、优惠券管理(二期) |
|
||||
| **通知配置** | 系统通知模板、续费提醒开关 |
|
||||
| **系统配置** | 站点信息、支付配置、短信/邮件配置 |
|
||||
|
||||
---
|
||||
|
||||
## 三、核心业务流程
|
||||
|
||||
### 3.1 用户注册/登录
|
||||
|
||||
```
|
||||
[用户] → 输入手机/邮箱
|
||||
→ 获取验证码(短信/邮件)
|
||||
→ 验证 → 首次登录自动注册 app_user
|
||||
→ 生成 JWT Token(复用 pigx-auth)
|
||||
→ 进入首页
|
||||
```
|
||||
|
||||
### 3.2 购买合租商品(核心流程)
|
||||
|
||||
```
|
||||
[用户] → 浏览商品列表(as_sub_product, status=上架)
|
||||
→ 商品详情页
|
||||
├── 查看剩余席位 = capacity - capacity_loaded(来自 as_user_sub 聚合)
|
||||
└── 选择付费方案(as_sub_payroll)
|
||||
→ 点击"立即购买"
|
||||
→ 创建订单(as_order, status=待支付)
|
||||
→ 支付
|
||||
├── 余额支付 → 扣减 as_wallet.balance
|
||||
└── 在线支付 → 支付宝/微信回调 → 更新订单状态
|
||||
→ 支付成功
|
||||
├── 订单状态 → 已支付 → 使用中
|
||||
├── 创建 as_user_sub 记录(capacity_loaded +1)
|
||||
├── 返回账号凭据(as_sub_account 解密后展示)
|
||||
└── 推送通知(订阅成功)
|
||||
```
|
||||
|
||||
### 3.3 账号凭据查看
|
||||
|
||||
```
|
||||
[用户] → "我的订阅" → 选择订阅
|
||||
→ 验证身份(二次密码/生物识别,可选)
|
||||
→ 从 as_sub_account 查询 account_name + account_passwd
|
||||
→ AES 解密 account_passwd(服务端解密,不返回明文密钥)
|
||||
→ 展示账号密码(可设置自动隐藏倒计时)
|
||||
```
|
||||
|
||||
### 3.4 订阅到期/续费
|
||||
|
||||
```
|
||||
[定时任务(每日凌晨)]
|
||||
→ 扫描 as_user_sub.expire_time < now() + 7天
|
||||
→ 发送续费提醒通知(as_notification)
|
||||
→ 到期当日:as_user_sub.status = expired
|
||||
→ capacity_loaded -1(释放席位)
|
||||
|
||||
[用户续费]
|
||||
→ 进入"我的订阅" → 点击续费
|
||||
→ 选择续费套餐 → 走购买流程(复用)
|
||||
→ 续费成功:as_user_sub.expire_time 延长
|
||||
```
|
||||
|
||||
### 3.5 广场拼车(个人发布)
|
||||
|
||||
```
|
||||
[车主]
|
||||
→ 填写合租信息(平台、计划、价格、总席位数、说明)
|
||||
→ 创建 as_sub_product(product_type=2 个人)
|
||||
→ 提交审核 → 管理员审核通过 → 上架(status=active)
|
||||
|
||||
[拼车者]
|
||||
→ 广场浏览 → 找到心仪的拼车
|
||||
→ 申请加入 → 走购买流程
|
||||
→ 成功后 → 车主将账号凭据录入 as_sub_account
|
||||
→ 拼车者可查看凭据
|
||||
```
|
||||
|
||||
### 3.6 推广/邀请
|
||||
|
||||
```
|
||||
[用户A] → 分享邀请码/链接
|
||||
[用户B] → 点击链接注册
|
||||
→ as_invite 记录(inviter=A, invitee=B)
|
||||
[用户B首次购买成功]
|
||||
→ 触发返现奖励
|
||||
→ as_wallet_log 记录(用户A 获得返现)
|
||||
→ as_wallet.balance 增加
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 四、数据库设计(完整版)
|
||||
|
||||
### 4.1 现有表评审与修订
|
||||
|
||||
#### ⚠️ 现有设计问题
|
||||
|
||||
| 表 | 问题 | 修订方案 |
|
||||
|----|------|----------|
|
||||
| `as_sub_account` | `passwd_salt` 是 int,不够安全;缺加密字段标记 | 改为 varchar salt,加 `encrypt_type` 字段 |
|
||||
| `as_sub_account` | 缺 `status` 字段(账号可能失效/被封) | 加 `status`: 0=正常,1=失效,2=异常 |
|
||||
| `as_user_sub` | 缺 `status`、`start_time`、`expire_time` | 补充状态和时间字段 |
|
||||
| `as_user_sub` | `remark` 字段类型是 int(应为 varchar) | 改为 varchar |
|
||||
| `as_sub_product` | 缺 `status`(上架/下架/售完)、`available_seats` | 补充状态和实时剩余席位 |
|
||||
| `as_sub_product` | `sub_plan_ids` 用逗号分隔(反范式) | 评估是否改为关联表(影响查询) |
|
||||
| `as_sub_payroll` | 缺促销价/折扣字段 | 加 `original_price`、`discount_rate` |
|
||||
| `as_platform_type` | `platform_type` 是 int,0=全部 含义混乱 | 改用独立 sort_order + is_all 标志位 |
|
||||
|
||||
### 4.2 核心业务表(完整版)
|
||||
|
||||
#### 保留现有(修订后)
|
||||
|
||||
- `as_platform`
|
||||
- `as_platform_type`
|
||||
- `as_sub_plan`
|
||||
- `as_sub_payroll`(加 original_price, discount_rate)
|
||||
- `as_sub_account`(加 status, encrypt_type, 改 passwd_salt 为 varchar)
|
||||
- `as_sub_product`(加 status, available_seats)
|
||||
- `as_sub_product_comment`
|
||||
- `as_user_sub`(加 status, start_time, expire_time, 改 remark 为 varchar)
|
||||
|
||||
#### 新增表
|
||||
|
||||
---
|
||||
|
||||
### `as_order` — 订单表
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `id` | bigint PK | 订单ID |
|
||||
| `order_no` | varchar(32) | 订单号(唯一,业务用) |
|
||||
| `user_id` | bigint | 购买用户 |
|
||||
| `product_id` | bigint | 商品ID (as_sub_product) |
|
||||
| `payroll_id` | bigint | 付费方案ID (as_sub_payroll) |
|
||||
| `amount` | decimal(10,2) | 实付金额 |
|
||||
| `original_amount` | decimal(10,2) | 原价 |
|
||||
| `discount_amount` | decimal(10,2) | 优惠金额 |
|
||||
| `pay_type` | tinyint | 支付方式: 1=余额, 2=支付宝, 3=微信 |
|
||||
| `pay_no` | varchar(64) | 第三方支付单号 |
|
||||
| `status` | tinyint | 0=待支付, 1=已支付, 2=已完成, 3=已退款, 4=已取消 |
|
||||
| `user_sub_id` | bigint | 关联的用户订阅ID (创建后填充) |
|
||||
| `remark` | varchar | 备注 |
|
||||
| `expire_time` | datetime | 订单过期时间(未支付自动取消) |
|
||||
| `pay_time` | datetime | 支付时间 |
|
||||
| `create_time` | datetime | |
|
||||
| `update_time` | datetime | |
|
||||
|
||||
---
|
||||
|
||||
### `as_wallet` — 用户钱包
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `id` | bigint PK | |
|
||||
| `user_id` | bigint UNIQUE | 用户ID(一人一钱包) |
|
||||
| `balance` | decimal(10,2) | 可用余额 |
|
||||
| `frozen_amount` | decimal(10,2) | 冻结金额(待退款/提现) |
|
||||
| `total_income` | decimal(10,2) | 累计收入 |
|
||||
| `total_expense` | decimal(10,2) | 累计支出 |
|
||||
| `create_time` | datetime | |
|
||||
| `update_time` | datetime | |
|
||||
|
||||
---
|
||||
|
||||
### `as_wallet_log` — 钱包流水
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `id` | bigint PK | |
|
||||
| `user_id` | bigint | 用户ID |
|
||||
| `amount` | decimal(10,2) | 金额(正=收入,负=支出) |
|
||||
| `type` | tinyint | 1=充值, 2=消费, 3=退款, 4=邀请返现, 5=提现 |
|
||||
| `order_id` | bigint | 关联订单ID(可空) |
|
||||
| `balance_after` | decimal(10,2) | 操作后余额(快照) |
|
||||
| `remark` | varchar | 说明(如"订阅 Netflix 高级版") |
|
||||
| `create_time` | datetime | |
|
||||
|
||||
---
|
||||
|
||||
### `as_invite` — 邀请关系
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `id` | bigint PK | |
|
||||
| `inviter_id` | bigint | 邀请人用户ID |
|
||||
| `invitee_id` | bigint | 被邀请人用户ID |
|
||||
| `invite_code` | varchar(16) | 使用的邀请码 |
|
||||
| `reward_amount` | decimal(10,2) | 返现金额 |
|
||||
| `reward_status` | tinyint | 0=待发放, 1=已发放(首次购买后触发) |
|
||||
| `create_time` | datetime | |
|
||||
| `reward_time` | datetime | 返现时间 |
|
||||
|
||||
---
|
||||
|
||||
### `as_notification` — 通知消息
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `id` | bigint PK | |
|
||||
| `user_id` | bigint | 目标用户ID(0=全部用户) |
|
||||
| `title` | varchar | 通知标题 |
|
||||
| `content` | varchar | 通知内容 |
|
||||
| `type` | tinyint | 1=续费提醒, 2=订单通知, 3=系统公告, 4=邀请奖励 |
|
||||
| `ref_id` | bigint | 关联业务ID(如订单ID、订阅ID) |
|
||||
| `is_read` | tinyint | 0=未读, 1=已读 |
|
||||
| `create_time` | datetime | |
|
||||
|
||||
---
|
||||
|
||||
### `app_user` 字段补充
|
||||
|
||||
在现有 PigX 的 `app_user` 表上,补充以下字段(via ALTER):
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `invite_code` | varchar(16) UNIQUE | 用户的专属邀请码(注册时生成) |
|
||||
| `inviter_id` | bigint | 邀请人用户ID(注册时记录) |
|
||||
|
||||
---
|
||||
|
||||
### 4.3 完整 ER 关系图
|
||||
|
||||
```
|
||||
as_platform_type (1) ──< (N) as_platform [platform_type]
|
||||
as_platform (1) ──< (N) as_sub_plan [platform_id]
|
||||
as_sub_plan (1) ──< (N) as_sub_payroll [sub_plans]
|
||||
as_sub_plan (N) >──< (N) as_sub_product [sub_plan_ids]
|
||||
as_sub_product (1) ──< (N) as_sub_product_comment [product_id]
|
||||
as_sub_product (1) ──< (N) as_sub_account [product_id]
|
||||
as_sub_plan (1) ──< (N) as_sub_account [sub_plan_id]
|
||||
as_sub_payroll (1) ──< (N) as_sub_account [sub_payroll_id]
|
||||
|
||||
as_sub_product (1) ──< (N) as_order [product_id]
|
||||
as_sub_payroll (1) ──< (N) as_order [payroll_id]
|
||||
as_order (1) ──< (1) as_user_sub [user_sub_id]
|
||||
|
||||
as_sub_plan (1) ──< (N) as_user_sub [plan_id]
|
||||
as_sub_account (1) ──< (N) as_user_sub [main_account]
|
||||
|
||||
app_user (1) ──< (1) as_wallet [user_id]
|
||||
as_wallet (1) ──< (N) as_wallet_log [user_id]
|
||||
as_order (1) ──< (N) as_wallet_log [order_id]
|
||||
|
||||
app_user (1) ──< (N) as_order [user_id]
|
||||
app_user (1) ──< (N) as_user_sub [user_id]
|
||||
app_user (1) ──< (N) as_sub_product [user_id — 发布者]
|
||||
app_user (1) ──< (N) as_sub_account [user_id — 账号持有者]
|
||||
app_user (1) ──< (N) as_sub_product_comment [user_id]
|
||||
app_user (1) ──< (N) as_notification [user_id]
|
||||
|
||||
app_user (1) ──< (N) as_invite [as inviter] [inviter_id]
|
||||
app_user (1) ──< (1) as_invite [as invitee] [invitee_id]
|
||||
```
|
||||
|
||||
### 4.4 `as_user_sub` 状态机
|
||||
|
||||
```
|
||||
购买成功
|
||||
[pending] ──────→ [active] ──→ 到期 ──→ [expired]
|
||||
│ │
|
||||
│ 退款/申请退订 │ 续费
|
||||
↓ ↓
|
||||
[cancelled] [active]
|
||||
```
|
||||
|
||||
状态值:0=待激活, 1=使用中, 2=已到期, 3=已退订
|
||||
|
||||
### 4.5 `as_order` 状态机
|
||||
|
||||
```
|
||||
[pending] → 15分钟未支付 → [cancelled]
|
||||
[pending] → 支付成功 → [paid] → 激活订阅成功 → [completed]
|
||||
[paid/completed] → 退款申请 → 审核通过 → [refunded]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 五、接口设计要点
|
||||
|
||||
### 5.1 账号凭据安全
|
||||
|
||||
- `account_passwd` 使用 **AES-256-GCM** 加密存储
|
||||
- 密钥由服务端持有(存配置中心/环境变量),不入库
|
||||
- `passwd_salt` 用于 AES 的 IV(改为 varchar(32),16字节随机)
|
||||
- 凭据查看接口:仅限订阅状态为 `active` 的用户,且需校验 `as_user_sub.user_id == currentUser`
|
||||
- 返回解密后的明文,但 **不记录日志**(防止泄露)
|
||||
|
||||
### 5.2 席位并发控制
|
||||
|
||||
- 购买时使用 **数据库乐观锁** 或 **Redis 分布式锁** 防止超卖
|
||||
- `as_sub_product.available_seats` 在下单时 -1(乐观锁 version 字段)
|
||||
- 订单取消/超时后 +1 回补
|
||||
|
||||
### 5.3 价格一致性
|
||||
|
||||
- 订单金额在创建时 **快照** 到 `as_order.amount`
|
||||
- 不依赖付费方案的实时价格(防止价格变动导致差异)
|
||||
|
||||
---
|
||||
|
||||
## 六、设计待决策项(需 Ami 确认)
|
||||
|
||||
| # | 问题 | 选项 |
|
||||
|---|------|------|
|
||||
| 1 | 付费方式一期支持哪些? | A) 仅余额(人工充值)B) 余额+支付宝 C) 三种都支持 |
|
||||
| 2 | 拼车广场是否需要审核流程? | A) 管理员审核 B) 自动上架 C) 仅自营,无拼车广场 |
|
||||
| 3 | 账号凭据展示方式? | A) 直接明文 B) 需二次验证(短信/密码)C) 限时展示(30s后隐藏)|
|
||||
| 4 | 邀请返现比例和条件? | 需定义:返现金额/比例,是否有上限 |
|
||||
| 5 | `as_sub_product` 的多计划关联是否改为关联表? | A) 保持逗号分隔(简单)B) 改关联表(规范,便于查询)|
|
||||
| 6 | 提现功能是否一期上线? | A) 一期上 B) 二期(一期只充值不提现)|
|
||||
|
||||
---
|
||||
|
||||
## 七、调整后的项目阶段
|
||||
|
||||
| 阶段 | 内容 | 时间 |
|
||||
|------|------|------|
|
||||
| **Phase D(当前·最高优先)** | 系统设计:功能清单 + 业务流程 + 数据库设计 | 进行中 |
|
||||
| **Phase 0** | 环境搭建:仓库 + Fork PigX + CI/CD + 建库 SQL | D 完成后 |
|
||||
| **Phase 1** | 后端核心 CRUD API | 1-2周 |
|
||||
| **Phase 2** | 管理后台前端 | 1周 |
|
||||
| **Phase 3** | 用户端 H5 | 2-3周 |
|
||||
| **Phase 4** | 支付集成 | 按需 |
|
||||
| **Phase 5** | 测试 + 上线 | — |
|
||||
71
WORK_SUMMARY_2026-02-16.md
Normal file
71
WORK_SUMMARY_2026-02-16.md
Normal file
@@ -0,0 +1,71 @@
|
||||
# 工作总结 - 2026-02-16
|
||||
|
||||
## 项目概述
|
||||
|
||||
**iShare** - 流媒体账号合租平台
|
||||
|
||||
## 今日完成的工作
|
||||
|
||||
### 1. 项目发现与信息记录
|
||||
- 发现项目位置:`/Users/mini/Work/ClaudeCowork/`
|
||||
- 记录到 MEMORY.md 和 TOOLS.md
|
||||
- 记录 Gitea 仓库信息(https://git.puro.im)
|
||||
|
||||
### 2. 代码版本对比与整理
|
||||
- 对比三个版本:ishare (2023-06), as-sys (2024-03), ishare-sys (2026-02)
|
||||
- 确定最新版本:ishare-sys(111个Java文件,功能最完整)
|
||||
- 复制到新目录:`new_pigx_iShare`
|
||||
|
||||
### 3. 数据库设计提取
|
||||
- 分析 as-app-server 模块(新增的核心业务模块)
|
||||
- 识别 17 张表(8个业务表 + 9个App基础表)
|
||||
- 生成 DATABASE_DESIGN.md 文档
|
||||
- 核心业务链路:平台类型 → 平台 → 订阅计划 → 付费方案 → 订阅账号 → 订阅产品 → 用户订阅
|
||||
|
||||
### 4. 代码修复与 SQL 生成
|
||||
- 修复 `AsSubProductComment.java` 的 `@TableName` 注解错误
|
||||
- 生成完整建表 SQL:`db/ishare_schema.sql`
|
||||
|
||||
### 5. Git 仓库管理
|
||||
- 创建 pigx_ishare 仓库
|
||||
- master 分支:README.md + 设计文档
|
||||
- pigx_ishare 分支:完整项目代码(1910文件,21.8万行)
|
||||
- 备份 PigX 原版框架到独立仓库
|
||||
|
||||
### 6. 配置优化
|
||||
- 更新 OpenClaw 模型配置:主会话 Sonnet 4.5,子代理 Opus 4.6
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
new_pigx_iShare/
|
||||
├── as-app-server/ # 核心业务模块(新增)
|
||||
├── as-gateway/ # 网关
|
||||
├── as-upms/ # 权限管理
|
||||
├── pigx-auth/ # 认证服务
|
||||
├── pigx-common/ # 公共模块
|
||||
├── db/
|
||||
│ └── ishare_schema.sql # 建表脚本
|
||||
├── DATABASE_DESIGN.md # 数据库设计文档
|
||||
└── README.md # 项目说明
|
||||
```
|
||||
|
||||
## 技术栈
|
||||
|
||||
- 基于 **PigX 5.2** 企业级框架
|
||||
- 后端:Spring Boot + MyBatis Plus
|
||||
- 数据库:MySQL(utf8mb4)
|
||||
- 前端:Vue(pigx-ui)
|
||||
|
||||
## 下一步计划
|
||||
|
||||
- [ ] 完善业务逻辑实现
|
||||
- [ ] 前端页面开发
|
||||
- [ ] API 接口对接
|
||||
- [ ] 测试环境部署
|
||||
|
||||
## 重要链接
|
||||
|
||||
- Gitea 仓库:https://git.puro.im/purovps/pigx_ishare
|
||||
- 代码分支:https://git.puro.im/purovps/pigx_ishare/src/branch/pigx_ishare
|
||||
- PigX 备份:https://git.puro.im/purovps/pigx
|
||||
370
db/ishare_schema_v2.sql
Normal file
370
db/ishare_schema_v2.sql
Normal file
@@ -0,0 +1,370 @@
|
||||
-- ============================================================
|
||||
-- iShare 数据库设计 v2.0(修订版)
|
||||
-- 修订时间: 2026-02-17
|
||||
-- 修订说明: 修复原版缺陷,补充完整业务字段和新增表
|
||||
-- 数据库: pigxx_app
|
||||
-- ============================================================
|
||||
|
||||
USE pigxx_app;
|
||||
SET NAMES utf8mb4;
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
|
||||
-- ============================================================
|
||||
-- 一、App 基础表(沿用原版,仅 app_user 追加字段)
|
||||
-- ============================================================
|
||||
|
||||
-- app_user 追加字段(ALTER,不重建表)
|
||||
ALTER TABLE `app_user`
|
||||
ADD COLUMN IF NOT EXISTS `invite_code` varchar(16) UNIQUE COMMENT '用户专属邀请码(注册时生成)' AFTER `email`,
|
||||
ADD COLUMN IF NOT EXISTS `inviter_id` bigint DEFAULT NULL COMMENT '邀请人用户ID' AFTER `invite_code`;
|
||||
|
||||
|
||||
-- ============================================================
|
||||
-- 二、iShare 核心业务表(修订版,8 张原表 + 新增 6 张)
|
||||
-- ============================================================
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 2.1 as_platform_type — 平台类型
|
||||
-- 修订: 加 status、del_flag、create_time/update_time
|
||||
-- ------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `as_platform_type`;
|
||||
CREATE TABLE `as_platform_type` (
|
||||
`id` bigint NOT NULL COMMENT '主键',
|
||||
`name` varchar(64) NOT NULL COMMENT '类型名称(视频/音乐/AI等)',
|
||||
`platform_type` int NOT NULL DEFAULT 0 COMMENT '类型编号(用于分类筛选),0=全部',
|
||||
`sort_order` int NOT NULL DEFAULT 0 COMMENT '排序权重(升序)',
|
||||
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态: 0=禁用, 1=启用',
|
||||
`del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标志: 0=正常, 1=已删除',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_platform_type` (`platform_type`),
|
||||
KEY `idx_sort` (`sort_order`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='平台类型表';
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 2.2 as_platform — 流媒体平台
|
||||
-- 修订: 加 description、status、del_flag、create_time/update_time
|
||||
-- sort_order 从 varchar 改为 int
|
||||
-- ------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `as_platform`;
|
||||
CREATE TABLE `as_platform` (
|
||||
`id` bigint NOT NULL COMMENT '主键',
|
||||
`platform_name` varchar(128) NOT NULL COMMENT '平台名称',
|
||||
`platform_type` int NOT NULL DEFAULT 0 COMMENT '平台类型(关联 as_platform_type.platform_type)',
|
||||
`icon` varchar(512) DEFAULT NULL COMMENT '应用图标 URL',
|
||||
`description` varchar(512) DEFAULT NULL COMMENT '平台简介',
|
||||
`company` varchar(128) DEFAULT NULL COMMENT '所属公司',
|
||||
`website` varchar(256) DEFAULT NULL COMMENT '平台官网',
|
||||
`sort_order` int NOT NULL DEFAULT 0 COMMENT '排序权重(升序)',
|
||||
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态: 0=禁用, 1=启用',
|
||||
`del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标志: 0=正常, 1=已删除',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_platform_type` (`platform_type`),
|
||||
KEY `idx_status` (`status`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='流媒体平台表';
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 2.3 as_sub_plan — 订阅计划
|
||||
-- 修订: platform_id varchar→bigint, capacity varchar→int
|
||||
-- 加 status、del_flag、create_time/update_time
|
||||
-- ------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `as_sub_plan`;
|
||||
CREATE TABLE `as_sub_plan` (
|
||||
`id` bigint NOT NULL COMMENT '计划ID',
|
||||
`name` varchar(128) NOT NULL COMMENT '计划名称(标准版/高级版等)',
|
||||
`platform_id` bigint NOT NULL COMMENT '所属平台ID(→ as_platform.id)',
|
||||
`capacity` int NOT NULL DEFAULT 1 COMMENT '席位容量(该计划最多可共享人数)',
|
||||
`remark` varchar(256) DEFAULT NULL COMMENT '备注',
|
||||
`sort_order` int NOT NULL DEFAULT 0 COMMENT '排序权重(升序)',
|
||||
`status` tinyint NOT NULL DEFAULT 1 COMMENT '状态: 0=禁用, 1=启用',
|
||||
`del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标志: 0=正常, 1=已删除',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_platform_id` (`platform_id`),
|
||||
KEY `idx_status` (`status`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订阅计划表';
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 2.4 as_sub_payroll — 付费方案
|
||||
-- 修订: sub_plans(Long,注释混乱) → sub_plan_id(bigint,明确1:1)
|
||||
-- 加 duration_months、original_price、is_active
|
||||
-- del_flag、create_time/update_time
|
||||
-- ------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `as_sub_payroll`;
|
||||
CREATE TABLE `as_sub_payroll` (
|
||||
`id` bigint NOT NULL COMMENT '主键',
|
||||
`sub_plan_id` bigint NOT NULL COMMENT '所属订阅计划ID(→ as_sub_plan.id)',
|
||||
`platform_id` bigint NOT NULL COMMENT '平台ID(冗余,便于查询)',
|
||||
`payroll` tinyint NOT NULL COMMENT '付费周期: 1=月付, 2=季付, 3=年付',
|
||||
`duration_months` int NOT NULL COMMENT '实际月数: 1/3/12(与 payroll 对应)',
|
||||
`price` decimal(10,2) NOT NULL COMMENT '售价',
|
||||
`original_price` decimal(10,2) DEFAULT NULL COMMENT '划线价(原价,用于展示折扣)',
|
||||
`currency` varchar(8) NOT NULL DEFAULT 'CNY' COMMENT '货币单位(CNY/USD等)',
|
||||
`region` varchar(64) DEFAULT NULL COMMENT '适用地区',
|
||||
`is_active` tinyint NOT NULL DEFAULT 1 COMMENT '是否上架: 0=下架, 1=上架',
|
||||
`del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标志: 0=正常, 1=已删除',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_sub_plan_id` (`sub_plan_id`),
|
||||
KEY `idx_platform_id` (`platform_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='付费方案表';
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 2.5 as_sub_product — 订阅产品(合租商品)
|
||||
-- 修订: Tags→tags(命名修复), 加 platform_id、status、cover_image
|
||||
-- product_type/sub_type 从 Long 改为 tinyint
|
||||
-- 加 total_capacity、del_flag、create_by/update_by
|
||||
-- ------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `as_sub_product`;
|
||||
CREATE TABLE `as_sub_product` (
|
||||
`id` bigint NOT NULL COMMENT '主键',
|
||||
`title` varchar(256) NOT NULL COMMENT '产品标题',
|
||||
`description` varchar(1024) DEFAULT NULL COMMENT '产品描述',
|
||||
`cover_image` varchar(512) DEFAULT NULL COMMENT '封面图 URL',
|
||||
`tags` varchar(256) DEFAULT NULL COMMENT '标签(逗号分隔)',
|
||||
`platform_id` bigint NOT NULL COMMENT '所属平台ID(→ as_platform.id,冗余加速查询)',
|
||||
`sub_plan_ids` varchar(256) DEFAULT NULL COMMENT '关联订阅计划ID列表(逗号分隔)',
|
||||
`product_type` tinyint NOT NULL DEFAULT 1 COMMENT '产品类型: 1=自营, 2=个人',
|
||||
`sub_type` tinyint NOT NULL DEFAULT 1 COMMENT '订阅类型: 1=单品, 2=多品组合',
|
||||
`total_capacity` int NOT NULL DEFAULT 1 COMMENT '总席位数(该商品可供多少人购买)',
|
||||
`amount` decimal(10,2) DEFAULT NULL COMMENT '基准价格(月)',
|
||||
`star` decimal(3,1) DEFAULT 0.0 COMMENT '综合评分(0.0-5.0,由评价聚合更新)',
|
||||
`status` tinyint NOT NULL DEFAULT 0 COMMENT '状态: 0=草稿, 1=上架, 2=下架, 3=售完',
|
||||
`user_id` bigint DEFAULT NULL COMMENT '发布者用户ID(→ app_user.user_id)',
|
||||
`del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标志: 0=正常, 1=已删除',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
|
||||
`update_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_platform_id` (`platform_id`),
|
||||
KEY `idx_status` (`status`),
|
||||
KEY `idx_product_type` (`product_type`),
|
||||
KEY `idx_user_id` (`user_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订阅产品表(合租商品)';
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 2.6 as_sub_account — 流媒体平台账号凭据
|
||||
-- 修订: user_id/sub_plan_id/sub_payroll_id/platform_id int→bigint
|
||||
-- passwd_salt int→varchar(64,存hex/base64)
|
||||
-- 加 encrypt_type、status、del_flag、create_time/update_time
|
||||
-- ------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `as_sub_account`;
|
||||
CREATE TABLE `as_sub_account` (
|
||||
`id` bigint NOT NULL COMMENT '主键',
|
||||
`product_id` bigint DEFAULT NULL COMMENT '关联产品ID(→ as_sub_product.id)',
|
||||
`sub_plan_id` bigint DEFAULT NULL COMMENT '订阅计划ID(→ as_sub_plan.id)',
|
||||
`sub_payroll_id` bigint DEFAULT NULL COMMENT '付费方案ID(→ as_sub_payroll.id)',
|
||||
`platform_id` bigint NOT NULL COMMENT '平台ID(→ as_platform.id)',
|
||||
`user_id` bigint NOT NULL COMMENT '账号持有者用户ID(主用户,→ app_user.user_id)',
|
||||
`account_name` varchar(256) NOT NULL COMMENT '平台登录用户名/邮箱',
|
||||
`account_passwd` varchar(512) NOT NULL COMMENT '平台登录密码(加密存储)',
|
||||
`passwd_salt` varchar(64) NOT NULL COMMENT '加密盐值(Base64/Hex,16字节随机)',
|
||||
`encrypt_type` tinyint NOT NULL DEFAULT 1 COMMENT '加密算法: 1=AES-256-GCM',
|
||||
`region` varchar(64) DEFAULT NULL COMMENT '账号所在地区',
|
||||
`share_type` tinyint DEFAULT NULL COMMENT '分享类型',
|
||||
`account_type` tinyint DEFAULT NULL COMMENT '账号类型(主账号/子账号等)',
|
||||
`renew_date` datetime DEFAULT NULL COMMENT '账号在平台的下次续费日',
|
||||
`status` tinyint NOT NULL DEFAULT 0 COMMENT '账号状态: 0=正常, 1=已失效, 2=异常/被封',
|
||||
`del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标志: 0=正常, 1=已删除',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_product_id` (`product_id`),
|
||||
KEY `idx_platform_id` (`platform_id`),
|
||||
KEY `idx_user_id` (`user_id`),
|
||||
KEY `idx_status` (`status`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='流媒体平台账号凭据表';
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 2.7 as_user_sub — 合租槽(共享池)
|
||||
-- 语义修订: 代表"一个合租位池",不代表个人订阅
|
||||
-- 修订: remark int→varchar, plan_id/user_id/main_account int→bigint
|
||||
-- 加 product_id、status、expire_time、del_flag、create_time/update_time
|
||||
-- ------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `as_user_sub`;
|
||||
CREATE TABLE `as_user_sub` (
|
||||
`id` bigint NOT NULL COMMENT '主键',
|
||||
`product_id` bigint NOT NULL COMMENT '关联产品ID(→ as_sub_product.id)',
|
||||
`plan_id` bigint NOT NULL COMMENT '订阅计划ID(→ as_sub_plan.id)',
|
||||
`platform_id` bigint NOT NULL COMMENT '平台ID(冗余,加速查询)',
|
||||
`host_user_id` bigint NOT NULL COMMENT '车主用户ID(提供账号的一方,→ app_user.user_id)',
|
||||
`account_id` bigint DEFAULT NULL COMMENT '关联平台账号ID(→ as_sub_account.id)',
|
||||
`capacity` int NOT NULL COMMENT '总席位数(来自 as_sub_plan.capacity)',
|
||||
`capacity_loaded` int NOT NULL DEFAULT 0 COMMENT '已占用席位数',
|
||||
`region` varchar(64) DEFAULT NULL COMMENT '地区',
|
||||
`status` tinyint NOT NULL DEFAULT 0 COMMENT '状态: 0=可加入, 1=已满, 2=已到期, 3=已关闭',
|
||||
`expire_time` datetime DEFAULT NULL COMMENT '该合租槽到期时间(来自最晚成员到期时间)',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注(车主说明)',
|
||||
`del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标志: 0=正常, 1=已删除',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_product_id` (`product_id`),
|
||||
KEY `idx_plan_id` (`plan_id`),
|
||||
KEY `idx_host_user_id` (`host_user_id`),
|
||||
KEY `idx_status` (`status`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='合租槽表(共享席位池)';
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 2.8 as_sub_product_comment — 产品评价
|
||||
-- 修订: 加 del_flag、is_anonymous、reply_id(支持追评)
|
||||
-- star 字段加注释明确 1-5 范围
|
||||
-- ------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `as_sub_product_comment`;
|
||||
CREATE TABLE `as_sub_product_comment` (
|
||||
`id` bigint NOT NULL COMMENT '主键',
|
||||
`product_id` bigint NOT NULL COMMENT '关联产品ID(→ as_sub_product.id)',
|
||||
`user_id` bigint NOT NULL COMMENT '评价用户ID(→ app_user.user_id)',
|
||||
`order_id` bigint DEFAULT NULL COMMENT '关联订单ID(校验是否已购买)',
|
||||
`star` tinyint NOT NULL COMMENT '评分 1-5(服务端校验范围)',
|
||||
`comment` varchar(1024) DEFAULT NULL COMMENT '评价内容',
|
||||
`is_anonymous` tinyint NOT NULL DEFAULT 0 COMMENT '是否匿名: 0=公开, 1=匿名',
|
||||
`reply_id` bigint DEFAULT NULL COMMENT '回复的评价ID(追评/商家回复,NULL=原始评价)',
|
||||
`del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标志: 0=正常, 1=已删除',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_product_id` (`product_id`),
|
||||
KEY `idx_user_id` (`user_id`),
|
||||
KEY `idx_reply_id` (`reply_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='产品评价表';
|
||||
|
||||
|
||||
-- ============================================================
|
||||
-- 三、新增表(原版缺失的核心业务表)
|
||||
-- ============================================================
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 3.1 as_user_sub_member — 个人订阅记录(原版最大缺失)
|
||||
-- 语义: 某用户购买加入了某合租槽,追踪个人维度
|
||||
-- ------------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `as_user_sub_member` (
|
||||
`id` bigint NOT NULL COMMENT '主键',
|
||||
`sub_id` bigint NOT NULL COMMENT '关联合租槽ID(→ as_user_sub.id)',
|
||||
`user_id` bigint NOT NULL COMMENT '订阅用户ID(→ app_user.user_id)',
|
||||
`order_id` bigint NOT NULL COMMENT '关联订单ID(→ as_order.id)',
|
||||
`payroll_id` bigint NOT NULL COMMENT '购买的付费方案ID(→ as_sub_payroll.id)',
|
||||
`status` tinyint NOT NULL DEFAULT 0 COMMENT '状态: 0=待激活, 1=使用中, 2=已到期, 3=已退订',
|
||||
`start_time` datetime NOT NULL COMMENT '订阅开始时间',
|
||||
`expire_time` datetime NOT NULL COMMENT '订阅到期时间',
|
||||
`del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标志: 0=正常, 1=已删除',
|
||||
`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_sub_user` (`sub_id`, `user_id`),
|
||||
KEY `idx_user_id` (`user_id`),
|
||||
KEY `idx_order_id` (`order_id`),
|
||||
KEY `idx_status` (`status`),
|
||||
KEY `idx_expire` (`expire_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='个人订阅记录表';
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 3.2 as_order — 订单表
|
||||
-- ------------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `as_order` (
|
||||
`id` bigint NOT NULL COMMENT '主键',
|
||||
`order_no` varchar(32) NOT NULL COMMENT '订单号(业务唯一,格式: AS+时间戳+随机)',
|
||||
`user_id` bigint NOT NULL COMMENT '购买用户ID(→ app_user.user_id)',
|
||||
`product_id` bigint NOT NULL COMMENT '商品ID(→ as_sub_product.id)',
|
||||
`payroll_id` bigint NOT NULL COMMENT '付费方案ID(→ as_sub_payroll.id)',
|
||||
`original_amount` decimal(10,2) NOT NULL COMMENT '原价(快照,防止价格变动)',
|
||||
`discount_amount` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '优惠金额',
|
||||
`amount` decimal(10,2) NOT NULL COMMENT '实付金额',
|
||||
`pay_type` tinyint DEFAULT NULL COMMENT '支付方式: 1=余额, 2=支付宝, 3=微信支付',
|
||||
`pay_no` varchar(64) DEFAULT NULL COMMENT '第三方支付单号',
|
||||
`status` tinyint NOT NULL DEFAULT 0 COMMENT '状态: 0=待支付, 1=已支付, 2=已完成, 3=已退款, 4=已取消',
|
||||
`member_id` bigint DEFAULT NULL COMMENT '关联个人订阅记录ID(→ as_user_sub_member.id,支付成功后填充)',
|
||||
`remark` varchar(256) DEFAULT NULL COMMENT '备注',
|
||||
`expire_time` datetime NOT NULL COMMENT '订单过期时间(未支付自动取消,默认 +15min)',
|
||||
`pay_time` datetime DEFAULT NULL COMMENT '实际支付时间',
|
||||
`del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标志: 0=正常, 1=已删除',
|
||||
`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_order_no` (`order_no`),
|
||||
KEY `idx_user_id` (`user_id`),
|
||||
KEY `idx_product_id` (`product_id`),
|
||||
KEY `idx_status` (`status`),
|
||||
KEY `idx_expire` (`expire_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单表';
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 3.3 as_wallet — 用户钱包
|
||||
-- ------------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `as_wallet` (
|
||||
`id` bigint NOT NULL COMMENT '主键',
|
||||
`user_id` bigint NOT NULL COMMENT '用户ID(→ app_user.user_id,一人一钱包)',
|
||||
`balance` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '可用余额',
|
||||
`frozen_amount` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '冻结金额(退款/提现处理中)',
|
||||
`total_income` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '累计收入',
|
||||
`total_expense` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '累计支出',
|
||||
`version` int NOT NULL DEFAULT 0 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_user_id` (`user_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户钱包表';
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 3.4 as_wallet_log — 钱包流水
|
||||
-- ------------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `as_wallet_log` (
|
||||
`id` bigint NOT NULL COMMENT '主键',
|
||||
`user_id` bigint NOT NULL COMMENT '用户ID(→ app_user.user_id)',
|
||||
`amount` decimal(10,2) NOT NULL COMMENT '变动金额(正=收入, 负=支出)',
|
||||
`type` tinyint NOT NULL COMMENT '类型: 1=充值, 2=消费, 3=退款, 4=邀请返现, 5=提现',
|
||||
`order_id` bigint DEFAULT NULL COMMENT '关联订单ID(→ as_order.id,可空)',
|
||||
`balance_after` decimal(10,2) NOT NULL COMMENT '操作后余额(快照,便于对账)',
|
||||
`remark` varchar(256) DEFAULT NULL COMMENT '说明(如:订阅 Netflix 高级版 3 个月)',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_user_id` (`user_id`),
|
||||
KEY `idx_order_id` (`order_id`),
|
||||
KEY `idx_type` (`type`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='钱包流水表';
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 3.5 as_invite — 邀请关系
|
||||
-- ------------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `as_invite` (
|
||||
`id` bigint NOT NULL COMMENT '主键',
|
||||
`inviter_id` bigint NOT NULL COMMENT '邀请人用户ID(→ app_user.user_id)',
|
||||
`invitee_id` bigint NOT NULL COMMENT '被邀请人用户ID(→ app_user.user_id)',
|
||||
`invite_code` varchar(16) NOT NULL COMMENT '使用的邀请码',
|
||||
`reward_amount` decimal(10,2) DEFAULT NULL COMMENT '返现金额(首次购买后确定)',
|
||||
`reward_status` tinyint NOT NULL DEFAULT 0 COMMENT '返现状态: 0=待发放, 1=已发放, 2=已失效',
|
||||
`reward_time` datetime DEFAULT NULL COMMENT '返现发放时间',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间(注册时间)',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_invitee` (`invitee_id`),
|
||||
KEY `idx_inviter_id` (`inviter_id`),
|
||||
KEY `idx_invite_code` (`invite_code`),
|
||||
KEY `idx_reward_status` (`reward_status`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='邀请关系表';
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 3.6 as_notification — 系统通知
|
||||
-- ------------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `as_notification` (
|
||||
`id` bigint NOT NULL COMMENT '主键',
|
||||
`user_id` bigint NOT NULL COMMENT '目标用户ID(→ app_user.user_id,0=全体广播)',
|
||||
`title` varchar(128) NOT NULL COMMENT '通知标题',
|
||||
`content` varchar(1024) NOT NULL COMMENT '通知内容',
|
||||
`type` tinyint NOT NULL COMMENT '类型: 1=续费提醒, 2=订单通知, 3=系统公告, 4=邀请奖励',
|
||||
`ref_id` bigint DEFAULT NULL COMMENT '关联业务ID(订单ID/订阅ID等,按 type 解析)',
|
||||
`is_read` tinyint NOT NULL DEFAULT 0 COMMENT '是否已读: 0=未读, 1=已读',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_user_id` (`user_id`),
|
||||
KEY `idx_is_read` (`is_read`),
|
||||
KEY `idx_type` (`type`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统通知表';
|
||||
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
129
db/ishare_schema_v3_delta.sql
Normal file
129
db/ishare_schema_v3_delta.sql
Normal 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
|
||||
-- ============================================================
|
||||
59
db/ishare_schema_v4_delta.sql
Normal file
59
db/ishare_schema_v4_delta.sql
Normal 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
|
||||
-- ============================================================
|
||||
277
iShare-dev-plan.md
Normal file
277
iShare-dev-plan.md
Normal file
@@ -0,0 +1,277 @@
|
||||
# iShare 开发规划
|
||||
|
||||
> 流媒体账号合租分享平台
|
||||
> 基于 PigX 5.11.0 二次开发
|
||||
> 制定日期: 2026-02-17
|
||||
|
||||
---
|
||||
|
||||
## 一、项目背景
|
||||
|
||||
| 项目 | 说明 |
|
||||
|------|------|
|
||||
| 产品定位 | 流媒体订阅合租平台(Netflix/Spotify/Apple TV 等合租分享) |
|
||||
| 核心价值 | 用户以正价 10%-30% 享受正版流媒体服务 |
|
||||
| 已有资产 | iShare 旧版代码(基于 PigX 5.2)、数据库设计、Figma 设计稿 |
|
||||
| 目标框架 | PigX 5.11.0(最新版,Java 17 + Spring Boot 3) |
|
||||
| 代码仓库 | https://git.puro.im/purovps/pigx(PigX 框架备份)|
|
||||
|
||||
---
|
||||
|
||||
## 二、技术路线
|
||||
|
||||
### 2.1 为什么迁移到 PigX 5.11.0
|
||||
|
||||
| 维度 | 旧版 (5.2) | 新版 (5.11.0) |
|
||||
|------|-----------|--------------|
|
||||
| Java | JDK 8 | JDK 17 (LTS) |
|
||||
| Spring Boot | 2.x | 3.5.9 |
|
||||
| Spring Cloud Alibaba | 旧版 | 2023.0.3.3 |
|
||||
| 包名 | javax.* | jakarta.* |
|
||||
| 部署模式 | 仅微服务 | 支持单体(pigx-boot) + 微服务双模式 |
|
||||
| AI 能力 | 无 | LangChain4j + Spring AI + pgvector |
|
||||
| 前端 | Vue2 | Vue3 + TypeScript + Vite + Tailwind |
|
||||
|
||||
**结论**: 5.11.0 支持单体模式部署,开发初期用 `pigx-boot` 单体模式,极大降低运维复杂度;后期需要时再拆微服务。
|
||||
|
||||
### 2.2 整体技术栈
|
||||
|
||||
**后端**
|
||||
- Java 17 + Spring Boot 3.5.9
|
||||
- Spring Cloud Alibaba 2023(微服务模式时)
|
||||
- MyBatis-Plus + MySQL(业务数据)
|
||||
- Redis(缓存、Session)
|
||||
- Nacos(配置中心、服务发现)
|
||||
- Maven 多模块项目
|
||||
|
||||
**前端(管理后台)**
|
||||
- Vue 3 + TypeScript + Vite
|
||||
- Tailwind CSS
|
||||
- 基于 pigx-ui 二次开发
|
||||
|
||||
**前端(用户 H5/Web)**
|
||||
- Vue 3 + TypeScript + Vite(独立项目)
|
||||
- 移动端优先,响应式设计
|
||||
- 基于 Figma 设计稿实现
|
||||
|
||||
**部署**
|
||||
- 开发阶段: Docker Compose 单体部署(pigx-boot)
|
||||
- 生产阶段: Docker + Drone CI/CD 自动化
|
||||
- 数据库: MySQL(复用 VPS 上的 MariaDB)
|
||||
|
||||
### 2.3 仓库规划
|
||||
|
||||
| 仓库 | 说明 | Git 地址(待创建)|
|
||||
|------|------|-----------------|
|
||||
| `ishare-backend` | PigX 后端主仓库(含 pigx-ishare 业务模块) | git.puro.im/purovps/ishare-backend |
|
||||
| `ishare-admin` | 管理后台前端(基于 pigx-ui) | git.puro.im/purovps/ishare-admin |
|
||||
| `ishare-web` | 用户端 H5/Web 前端 | git.puro.im/purovps/ishare-web |
|
||||
|
||||
---
|
||||
|
||||
## 三、架构设计
|
||||
|
||||
### 3.1 模块结构(后端)
|
||||
|
||||
```
|
||||
ishare-backend/
|
||||
├── pigx-boot/ # 单体部署启动器(开发阶段使用)
|
||||
├── pigx-ishare/ # ★ iShare 业务模块(核心新增)
|
||||
│ └── src/main/java/
|
||||
│ ├── controller/ # REST API
|
||||
│ ├── service/ # 业务逻辑
|
||||
│ ├── mapper/ # MyBatis Mapper
|
||||
│ ├── entity/ # 实体类
|
||||
│ └── dto/ # 数据传输对象
|
||||
├── pigx-auth/ # 认证(PigX 原版,无侵入)
|
||||
├── pigx-upms-biz/ # 用户权限管理(PigX 原版)
|
||||
├── pigx-gateway/ # 网关(微服务模式时使用)
|
||||
├── pigx-common/ # 公共模块(PigX 原版)
|
||||
├── db/
|
||||
│ ├── 0pigxx_boot.sql # PigX 基础表
|
||||
│ └── 1ishare_schema.sql # iShare 业务表(迁移自现有设计)
|
||||
└── docker-compose.yml # 本地开发环境
|
||||
```
|
||||
|
||||
### 3.2 数据库设计(沿用现有,小幅调整)
|
||||
|
||||
**核心业务表(as_*)**(已有设计,直接复用)
|
||||
- `as_platform` — 流媒体平台
|
||||
- `as_platform_type` — 平台分类
|
||||
- `as_sub_plan` — 订阅计划
|
||||
- `as_sub_payroll` — 付费方案
|
||||
- `as_sub_account` — 订阅账号(含加密凭据)
|
||||
- `as_sub_product` — 合租商品
|
||||
- `as_sub_product_comment` — 商品评价
|
||||
- `as_user_sub` — 用户订阅关系
|
||||
|
||||
**新增考虑**(二期)
|
||||
- `as_order` — 订单表(支付流程)
|
||||
- `as_withdraw` — 提现记录
|
||||
- `as_invite` — 邀请关系(推广中心)
|
||||
|
||||
**App 基础表(app_*)**(PigX 原版提供)
|
||||
- `app_user`、`app_social_details`(社交登录)
|
||||
- `app_page`、`app_tabbar`(页面装修)
|
||||
|
||||
### 3.3 核心业务流程
|
||||
|
||||
```
|
||||
用户端:
|
||||
注册/登录(手机/邮箱/社交)
|
||||
→ 浏览平台列表 + 筛选
|
||||
→ 查看合租商品详情
|
||||
→ 下单付款(一期:手动确认)
|
||||
→ 获取账号信息
|
||||
→ 评价
|
||||
|
||||
车主端(合租发起方):
|
||||
发布合租商品 → 等待拼客 → 管理席位 → 续费/关闭
|
||||
|
||||
管理后台:
|
||||
平台管理 → 订阅计划管理 → 商品审核 → 订单管理 → 用户管理
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 四、开发阶段规划
|
||||
|
||||
### Phase 0: 环境搭建(1-2天)
|
||||
|
||||
- [ ] 在 Gitea 创建三个仓库(ishare-backend / ishare-admin / ishare-web)
|
||||
- [ ] fork/copy 新版 PigX 5.11.0 到 ishare-backend,清理无关模块(pigx-knowledge AI相关)
|
||||
- [ ] 本地搭建开发环境(MySQL + Redis + IDEA)
|
||||
- [ ] 配置 VPS Drone CI/CD pipeline(`.drone.yml`)
|
||||
- [ ] 创建 iShare 数据库,导入建表 SQL
|
||||
|
||||
### Phase 1: 后端基础功能(1-2周)
|
||||
|
||||
**目标**: 完成核心 CRUD API,管理后台可用
|
||||
|
||||
- [ ] 新增 `pigx-ishare` Maven 模块,接入 pigx-boot
|
||||
- [ ] 迁移 as-app-server 代码到 Java 17(javax → jakarta,注解调整)
|
||||
- [ ] 实现平台管理接口(CRUD: `as_platform` / `as_platform_type`)
|
||||
- [ ] 实现订阅计划管理接口(`as_sub_plan` / `as_sub_payroll`)
|
||||
- [ ] 实现商品管理接口(`as_sub_product` + 评价)
|
||||
- [ ] 实现账号管理接口(`as_sub_account`,账号密码加密存储)
|
||||
- [ ] 实现用户订阅管理(`as_user_sub`)
|
||||
- [ ] App 用户注册/登录 API(手机+邮箱+验证码,复用 pigx-auth)
|
||||
- [ ] Swagger/Knife4j 接口文档
|
||||
|
||||
### Phase 2: 管理后台前端(1周)
|
||||
|
||||
**目标**: 管理员可通过后台管理数据
|
||||
|
||||
- [ ] fork pigx-ui 到 ishare-admin,调整品牌样式
|
||||
- [ ] 平台管理页面
|
||||
- [ ] 订阅计划 + 付费方案页面
|
||||
- [ ] 合租商品管理页面(含审核)
|
||||
- [ ] 用户管理页面
|
||||
- [ ] 订单/订阅查看页面
|
||||
|
||||
### Phase 3: 用户端 H5(2-3周)
|
||||
|
||||
**目标**: 用户可完成合租全流程
|
||||
|
||||
按 Figma 设计稿实现:
|
||||
|
||||
- [ ] 首页/欢迎页(品牌展示)
|
||||
- [ ] 登录/注册页(手机+邮箱+社交登录入口)
|
||||
- [ ] 忘记密码(验证码找回)
|
||||
- [ ] 主页/服务列表(平台卡片 + 分类筛选)
|
||||
- [ ] 服务详情页(介绍 + 价格套餐 + 评价)
|
||||
- [ ] 购买流程(选套餐 → 确认订单 → 支付 → 获取账号)
|
||||
- [ ] 广场/拼车(浏览他人发起的合租)
|
||||
- [ ] 推广中心(邀请码 + 返现记录)
|
||||
- [ ] 个人中心(我的订阅 + 账单 + 设置)
|
||||
- [ ] 底部 Tab 导航(首页 / 广场 / 推广 / 我的)
|
||||
|
||||
### Phase 4: 支付集成(按需)
|
||||
|
||||
- [ ] 对接支付宝/微信支付(或先用余额/人工确认模式)
|
||||
- [ ] 订单状态流转(待付款→已付款→使用中→已到期)
|
||||
- [ ] 自动续费提醒
|
||||
|
||||
### Phase 5: 测试 & 上线
|
||||
|
||||
- [ ] 接口联调测试
|
||||
- [ ] 账号信息安全审计(加密方案验证)
|
||||
- [ ] VPS 生产环境部署
|
||||
- [ ] 性能基准测试(并发下单)
|
||||
|
||||
---
|
||||
|
||||
## 五、CI/CD 流程
|
||||
|
||||
```yaml
|
||||
# .drone.yml 结构(参考 jshERP 配置)
|
||||
steps:
|
||||
- name: backend-build
|
||||
image: maven:3.9-eclipse-temurin-17
|
||||
commands:
|
||||
- mvn clean package -DskipTests -P boot
|
||||
|
||||
- name: frontend-admin-build
|
||||
image: node:18-alpine
|
||||
commands:
|
||||
- cd ../ishare-admin && npm ci && npm run build
|
||||
|
||||
- name: frontend-web-build
|
||||
image: node:18-alpine
|
||||
commands:
|
||||
- cd ../ishare-web && npm ci && npm run build
|
||||
|
||||
- name: deploy
|
||||
image: docker:dind
|
||||
commands:
|
||||
- docker-compose up -d --build
|
||||
```
|
||||
|
||||
触发条件:
|
||||
- push 到 `main` 分支 → 自动构建 + 部署到 VPS
|
||||
- PR → 只跑构建,不部署
|
||||
|
||||
---
|
||||
|
||||
## 六、里程碑
|
||||
|
||||
| 里程碑 | 内容 | 预计时间 |
|
||||
|--------|------|---------|
|
||||
| M0 | 环境搭建完成,空项目跑通 CI | 第 1 周 |
|
||||
| M1 | 后端 API 完成,Swagger 文档可访问 | 第 2-3 周 |
|
||||
| M2 | 管理后台可用,数据录入正常 | 第 3-4 周 |
|
||||
| M3 | 用户端 H5 完成,全流程可跑通 | 第 5-7 周 |
|
||||
| M4 | 支付接入,正式上线 | 第 8+ 周 |
|
||||
|
||||
---
|
||||
|
||||
## 七、关键技术决策
|
||||
|
||||
### Q1: 为什么不直接改旧代码,而是基于新 PigX 重新集成?
|
||||
|
||||
旧代码基于 PigX 5.2(Java 8 + Spring Boot 2),Spring Boot 2 已于 2023 年 EOL,Java 8 缺少现代特性。新版 5.11.0 支持单体模式,开发阶段不需要 Nacos/Gateway,本地启动一个 JAR 即可,和旧版微服务架构相比开发效率高得多。
|
||||
|
||||
### Q2: 单体模式 vs 微服务?
|
||||
|
||||
**开发阶段**: 用 `pigx-boot` 单体模式 — 一个进程,本地开发零运维负担。
|
||||
**生产上线后**: 如并发压力大,再按模块拆分微服务(业务模块无需改代码,只需改部署配置)。
|
||||
|
||||
### Q3: 用户端用 H5 还是小程序?
|
||||
|
||||
一期先做响应式 H5(Vue3),可在微信内置浏览器打开,无需发布审核。小程序适配二期按需追加。
|
||||
|
||||
### Q4: 账号密码安全?
|
||||
|
||||
`as_sub_account` 存储平台登录密码,需要对称加密(AES)存储,密钥由服务端持有,不直接暴露明文。PigX 本身已有 Jasypt 配置加密,沿用即可。
|
||||
|
||||
---
|
||||
|
||||
## 八、参考资源
|
||||
|
||||
| 资源 | 地址 |
|
||||
|------|------|
|
||||
| PigX 框架(最新版) | https://git.puro.im/purovps/pigx |
|
||||
| iShare 旧版代码 | https://git.puro.im/purovps/pigx_ishare/src/branch/pigx_ishare |
|
||||
| 数据库设计文档 | https://git.puro.im/purovps/pigx_ishare/src/branch/pigx_ishare/DATABASE_DESIGN.md |
|
||||
| Figma 设计稿 | iShare_Design/iShare_设计文档.html |
|
||||
| VPS 环境 | https://git.puro.im/purovps/vps_env/src/branch/main/vps-environment.md |
|
||||
895
iShare_Design/iShare_设计文档.html
Normal file
895
iShare_Design/iShare_设计文档.html
Normal file
@@ -0,0 +1,895 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>iShare 设计文档 - 页面结构与交互流程</title>
|
||||
<script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
|
||||
<style>
|
||||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
||||
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
|
||||
color: #e8e8e8;
|
||||
min-height: 100vh;
|
||||
line-height: 1.6;
|
||||
}
|
||||
.container { max-width: 1400px; margin: 0 auto; padding: 40px 20px; }
|
||||
|
||||
/* Header */
|
||||
header {
|
||||
text-align: center;
|
||||
padding: 60px 20px;
|
||||
background: linear-gradient(135deg, #370CE2 0%, #E94C89 100%);
|
||||
margin-bottom: 40px;
|
||||
border-radius: 20px;
|
||||
}
|
||||
header h1 { font-size: 3em; margin-bottom: 10px; color: white; }
|
||||
header p { font-size: 1.3em; opacity: 0.9; color: white; }
|
||||
|
||||
/* Navigation */
|
||||
.nav-tabs {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
flex-wrap: wrap;
|
||||
justify-content: center;
|
||||
margin-bottom: 40px;
|
||||
position: sticky;
|
||||
top: 0;
|
||||
background: rgba(26, 26, 46, 0.95);
|
||||
padding: 20px;
|
||||
border-radius: 15px;
|
||||
backdrop-filter: blur(10px);
|
||||
z-index: 100;
|
||||
}
|
||||
.nav-tab {
|
||||
padding: 12px 24px;
|
||||
background: rgba(55, 12, 226, 0.3);
|
||||
border: 1px solid #370CE2;
|
||||
border-radius: 25px;
|
||||
color: white;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s;
|
||||
text-decoration: none;
|
||||
}
|
||||
.nav-tab:hover, .nav-tab.active {
|
||||
background: #370CE2;
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
/* Section */
|
||||
section {
|
||||
background: rgba(255,255,255,0.05);
|
||||
border-radius: 20px;
|
||||
padding: 40px;
|
||||
margin-bottom: 40px;
|
||||
border: 1px solid rgba(255,255,255,0.1);
|
||||
}
|
||||
section h2 {
|
||||
font-size: 2em;
|
||||
margin-bottom: 30px;
|
||||
color: #E94C89;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 15px;
|
||||
}
|
||||
section h2::before {
|
||||
content: '';
|
||||
width: 5px;
|
||||
height: 40px;
|
||||
background: linear-gradient(180deg, #370CE2, #E94C89);
|
||||
border-radius: 3px;
|
||||
}
|
||||
section h3 {
|
||||
font-size: 1.4em;
|
||||
margin: 30px 0 15px;
|
||||
color: #FBC7D4;
|
||||
}
|
||||
|
||||
/* Figma Embed */
|
||||
.figma-container {
|
||||
background: #2a2a3e;
|
||||
border-radius: 15px;
|
||||
overflow: hidden;
|
||||
margin: 20px 0;
|
||||
box-shadow: 0 10px 40px rgba(0,0,0,0.3);
|
||||
}
|
||||
.figma-header {
|
||||
background: linear-gradient(90deg, #370CE2, #E94C89);
|
||||
padding: 15px 25px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
.figma-header h4 {
|
||||
color: white;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
.figma-header a {
|
||||
color: white;
|
||||
background: rgba(255,255,255,0.2);
|
||||
padding: 8px 16px;
|
||||
border-radius: 20px;
|
||||
text-decoration: none;
|
||||
font-size: 0.9em;
|
||||
transition: background 0.3s;
|
||||
}
|
||||
.figma-header a:hover {
|
||||
background: rgba(255,255,255,0.3);
|
||||
}
|
||||
.figma-embed {
|
||||
width: 100%;
|
||||
height: 600px;
|
||||
border: none;
|
||||
}
|
||||
.figma-tabs {
|
||||
display: flex;
|
||||
gap: 5px;
|
||||
padding: 15px;
|
||||
background: rgba(0,0,0,0.2);
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.figma-tab {
|
||||
padding: 10px 20px;
|
||||
background: rgba(255,255,255,0.1);
|
||||
border: none;
|
||||
border-radius: 8px;
|
||||
color: #ccc;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s;
|
||||
font-size: 0.95em;
|
||||
}
|
||||
.figma-tab:hover {
|
||||
background: rgba(55, 12, 226, 0.5);
|
||||
color: white;
|
||||
}
|
||||
.figma-tab.active {
|
||||
background: #370CE2;
|
||||
color: white;
|
||||
}
|
||||
|
||||
/* Flow Chart Container */
|
||||
.mermaid {
|
||||
background: rgba(255,255,255,0.03);
|
||||
padding: 30px;
|
||||
border-radius: 15px;
|
||||
margin: 20px 0;
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
/* Page Structure */
|
||||
.page-structure {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
||||
gap: 20px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
.page-card {
|
||||
background: linear-gradient(145deg, rgba(55,12,226,0.2), rgba(233,76,137,0.1));
|
||||
border: 1px solid rgba(255,255,255,0.15);
|
||||
border-radius: 15px;
|
||||
padding: 25px;
|
||||
transition: all 0.3s;
|
||||
}
|
||||
.page-card:hover {
|
||||
transform: translateY(-5px);
|
||||
border-color: #E94C89;
|
||||
box-shadow: 0 10px 30px rgba(233,76,137,0.2);
|
||||
}
|
||||
.page-card h4 {
|
||||
color: #FBC7D4;
|
||||
font-size: 1.2em;
|
||||
margin-bottom: 10px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
.page-card .badge {
|
||||
font-size: 0.7em;
|
||||
padding: 4px 10px;
|
||||
background: #370CE2;
|
||||
border-radius: 20px;
|
||||
color: white;
|
||||
}
|
||||
.page-card ul {
|
||||
list-style: none;
|
||||
margin-top: 15px;
|
||||
}
|
||||
.page-card li {
|
||||
padding: 8px 0;
|
||||
border-bottom: 1px solid rgba(255,255,255,0.1);
|
||||
font-size: 0.95em;
|
||||
}
|
||||
.page-card li:last-child { border-bottom: none; }
|
||||
.page-card li::before {
|
||||
content: '→';
|
||||
color: #E94C89;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
/* Flow Steps */
|
||||
.flow-steps {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 15px;
|
||||
margin: 20px 0;
|
||||
}
|
||||
.flow-step {
|
||||
flex: 1;
|
||||
min-width: 200px;
|
||||
background: rgba(55,12,226,0.15);
|
||||
padding: 20px;
|
||||
border-radius: 12px;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
}
|
||||
.flow-step::after {
|
||||
content: '→';
|
||||
position: absolute;
|
||||
right: -20px;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
color: #E94C89;
|
||||
font-size: 1.5em;
|
||||
}
|
||||
.flow-step:last-child::after { display: none; }
|
||||
.flow-step .step-num {
|
||||
width: 35px;
|
||||
height: 35px;
|
||||
background: #370CE2;
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin: 0 auto 10px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* Color Palette */
|
||||
.color-palette {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 15px;
|
||||
margin: 20px 0;
|
||||
}
|
||||
.color-item {
|
||||
text-align: center;
|
||||
}
|
||||
.color-swatch {
|
||||
width: 80px;
|
||||
height: 80px;
|
||||
border-radius: 15px;
|
||||
margin-bottom: 8px;
|
||||
box-shadow: 0 5px 15px rgba(0,0,0,0.3);
|
||||
}
|
||||
.color-item span {
|
||||
font-size: 0.85em;
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* Info Box */
|
||||
.info-box {
|
||||
background: rgba(55,12,226,0.2);
|
||||
border-left: 4px solid #370CE2;
|
||||
padding: 20px;
|
||||
border-radius: 0 10px 10px 0;
|
||||
margin: 20px 0;
|
||||
}
|
||||
.info-box.warning {
|
||||
background: rgba(233,76,137,0.2);
|
||||
border-left-color: #E94C89;
|
||||
}
|
||||
|
||||
/* Table */
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
margin: 20px 0;
|
||||
}
|
||||
th, td {
|
||||
padding: 15px;
|
||||
text-align: left;
|
||||
border-bottom: 1px solid rgba(255,255,255,0.1);
|
||||
}
|
||||
th {
|
||||
background: rgba(55,12,226,0.3);
|
||||
color: #FBC7D4;
|
||||
}
|
||||
tr:hover {
|
||||
background: rgba(255,255,255,0.05);
|
||||
}
|
||||
|
||||
/* Responsive */
|
||||
@media (max-width: 768px) {
|
||||
header h1 { font-size: 2em; }
|
||||
.nav-tabs { flex-direction: column; }
|
||||
.flow-step::after { display: none; }
|
||||
.figma-embed { height: 400px; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<header>
|
||||
<h1>🎬 iShare 设计文档</h1>
|
||||
<p>流媒体订阅合租分享平台 - 页面结构与交互流程</p>
|
||||
</header>
|
||||
|
||||
<nav class="nav-tabs">
|
||||
<a href="#figma-preview" class="nav-tab">🎨 设计预览</a>
|
||||
<a href="#overview" class="nav-tab">📋 项目概述</a>
|
||||
<a href="#sitemap" class="nav-tab">🗺️ 页面架构</a>
|
||||
<a href="#flow-auth" class="nav-tab">🔐 登录注册流程</a>
|
||||
<a href="#flow-purchase" class="nav-tab">💳 购买流程</a>
|
||||
<a href="#flow-carpool" class="nav-tab">🚗 拼车流程</a>
|
||||
<a href="#pages" class="nav-tab">📱 页面详情</a>
|
||||
<a href="#design" class="nav-tab">🎨 设计规范</a>
|
||||
</nav>
|
||||
|
||||
<!-- Figma 设计预览 -->
|
||||
<section id="figma-preview">
|
||||
<h2>🎨 Figma 设计预览</h2>
|
||||
<p style="margin-bottom: 20px;">以下是嵌入的Figma设计文件,你可以直接在这里浏览和交互查看所有设计页面。点击下方标签切换不同页面。</p>
|
||||
|
||||
<div class="figma-container">
|
||||
<div class="figma-header">
|
||||
<h4>📐 iShare 完整设计稿</h4>
|
||||
<a href="https://www.figma.com/design/LdrKDCBrE4ve4UAYjQxWrC/iShare--Copy-" target="_blank">↗ 在Figma中打开</a>
|
||||
</div>
|
||||
<div class="figma-tabs">
|
||||
<button class="figma-tab active" onclick="switchFigmaPage('2-6')">🔐 登录/注册</button>
|
||||
<button class="figma-tab" onclick="switchFigmaPage('1146-302')">🏠 首页</button>
|
||||
<button class="figma-tab" onclick="switchFigmaPage('1145-913')">📱 主页/服务列表</button>
|
||||
<button class="figma-tab" onclick="switchFigmaPage('1446-350')">🚗 广场/拼车</button>
|
||||
<button class="figma-tab" onclick="switchFigmaPage('1560-673')">📣 推广中心</button>
|
||||
<button class="figma-tab" onclick="switchFigmaPage('245-173')">🎨 设计规范</button>
|
||||
<button class="figma-tab" onclick="switchFigmaPage('0-1')">📊 竞品分析</button>
|
||||
</div>
|
||||
<iframe id="figma-frame" class="figma-embed"
|
||||
src="https://www.figma.com/embed?embed_host=share&url=https://www.figma.com/design/LdrKDCBrE4ve4UAYjQxWrC/iShare--Copy-?node-id=2-6"
|
||||
allowfullscreen></iframe>
|
||||
</div>
|
||||
|
||||
<div class="info-box">
|
||||
<strong>💡 使用提示</strong><br>
|
||||
<ul style="margin-top: 10px; padding-left: 20px;">
|
||||
<li>点击上方标签可快速切换到不同设计页面</li>
|
||||
<li>在嵌入的预览中可以缩放、平移查看设计细节</li>
|
||||
<li>点击"在Figma中打开"可进入完整的Figma编辑器</li>
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- 项目概述 -->
|
||||
<section id="overview">
|
||||
<h2>📋 项目概述</h2>
|
||||
<p style="font-size: 1.1em; margin-bottom: 20px;">
|
||||
<strong>iShare (AiShare)</strong> 是一个流媒体订阅服务合租分享平台。用户可以在平台上购买、分享和合租各种流媒体服务账号(如 Netflix、Spotify、Apple TV 等),通过"拼车"模式降低订阅成本。
|
||||
</p>
|
||||
|
||||
<div class="info-box">
|
||||
<strong>💡 核心价值主张</strong><br>
|
||||
通过合租模式,让用户以 <strong>10%-30%</strong> 的价格享受正版流媒体服务
|
||||
</div>
|
||||
|
||||
<h3>支持的平台</h3>
|
||||
<div class="flow-steps">
|
||||
<div class="flow-step">
|
||||
<div class="step-num">🖥️</div>
|
||||
<strong>Web端</strong><br>
|
||||
<small>响应式桌面网站</small>
|
||||
</div>
|
||||
<div class="flow-step">
|
||||
<div class="step-num">📱</div>
|
||||
<strong>Wap端</strong><br>
|
||||
<small>移动端H5页面</small>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- 页面架构 -->
|
||||
<section id="sitemap">
|
||||
<h2>🗺️ 整体页面架构</h2>
|
||||
|
||||
<div class="mermaid">
|
||||
graph TD
|
||||
subgraph 入口
|
||||
A[首页/欢迎页] --> B{用户状态}
|
||||
end
|
||||
|
||||
subgraph 认证模块
|
||||
B -->|未登录| C[登录页面]
|
||||
B -->|未注册| D[注册页面]
|
||||
C --> E[忘记密码]
|
||||
E --> F[获取验证码]
|
||||
F --> G[设置新密码]
|
||||
D --> H[验证码验证]
|
||||
end
|
||||
|
||||
subgraph 主功能区
|
||||
B -->|已登录| I[主页/服务列表]
|
||||
I --> J[服务详情页]
|
||||
J --> K[支付页面]
|
||||
I --> L[广场/拼车]
|
||||
L --> M[车票详情]
|
||||
M --> K
|
||||
I --> N[推广中心]
|
||||
I --> O[个人中心]
|
||||
end
|
||||
|
||||
subgraph 底部导航
|
||||
P[首页] --- Q[广场] --- R[推广] --- S[我的]
|
||||
end
|
||||
|
||||
style A fill:#370CE2,color:#fff
|
||||
style I fill:#E94C89,color:#fff
|
||||
style K fill:#C22F6C,color:#fff
|
||||
style L fill:#E94C89,color:#fff
|
||||
</div>
|
||||
|
||||
<h3>页面层级关系</h3>
|
||||
<table>
|
||||
<tr>
|
||||
<th>层级</th>
|
||||
<th>页面</th>
|
||||
<th>功能说明</th>
|
||||
<th>入口</th>
|
||||
<th>查看设计</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>L0</td>
|
||||
<td>首页/欢迎页</td>
|
||||
<td>品牌展示、引导登录</td>
|
||||
<td>直接访问</td>
|
||||
<td><button class="figma-tab" onclick="switchFigmaPage('1146-302')" style="padding:5px 10px;font-size:0.8em;">查看</button></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>L1</td>
|
||||
<td>主页(服务列表)</td>
|
||||
<td>浏览所有可购买的服务</td>
|
||||
<td>登录后默认页、底部导航</td>
|
||||
<td><button class="figma-tab" onclick="switchFigmaPage('1145-913')" style="padding:5px 10px;font-size:0.8em;">查看</button></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>L1</td>
|
||||
<td>广场</td>
|
||||
<td>查看他人发起的合租</td>
|
||||
<td>底部导航</td>
|
||||
<td><button class="figma-tab" onclick="switchFigmaPage('1446-350')" style="padding:5px 10px;font-size:0.8em;">查看</button></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>L1</td>
|
||||
<td>推广中心</td>
|
||||
<td>邀请好友、获取返现</td>
|
||||
<td>底部导航</td>
|
||||
<td><button class="figma-tab" onclick="switchFigmaPage('1560-673')" style="padding:5px 10px;font-size:0.8em;">查看</button></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>L1</td>
|
||||
<td>登录/注册</td>
|
||||
<td>用户认证</td>
|
||||
<td>首页点击登录</td>
|
||||
<td><button class="figma-tab" onclick="switchFigmaPage('2-6')" style="padding:5px 10px;font-size:0.8em;">查看</button></td>
|
||||
</tr>
|
||||
</table>
|
||||
</section>
|
||||
|
||||
<!-- 登录注册流程 -->
|
||||
<section id="flow-auth">
|
||||
<h2>🔐 登录注册流程</h2>
|
||||
|
||||
<h3>完整认证流程图</h3>
|
||||
<div class="mermaid">
|
||||
flowchart LR
|
||||
subgraph 登录流程
|
||||
A1[登录页面] --> A2{选择方式}
|
||||
A2 -->|社交登录| A3[微信/谷歌/FB/Twitter]
|
||||
A2 -->|账号登录| A4[输入手机/邮箱+密码]
|
||||
A3 --> A5[授权回调]
|
||||
A4 --> A6[验证账号]
|
||||
A5 --> A7[登录成功]
|
||||
A6 --> A7
|
||||
A4 -->|忘记密码| B1
|
||||
end
|
||||
|
||||
subgraph 忘记密码
|
||||
B1[选择验证方式] --> B2{手机/邮箱}
|
||||
B2 -->|手机| B3[输入手机号]
|
||||
B2 -->|邮箱| B4[输入邮箱]
|
||||
B3 --> B5[获取验证码]
|
||||
B4 --> B5
|
||||
B5 --> B6[输入验证码]
|
||||
B6 --> B7[设置新密码]
|
||||
B7 --> A1
|
||||
end
|
||||
|
||||
subgraph 注册流程
|
||||
C1[注册页面] --> C2[输入手机/邮箱]
|
||||
C2 --> C3[获取验证码]
|
||||
C3 --> C4[输入验证码]
|
||||
C4 --> C5[设置密码]
|
||||
C5 --> C6[注册成功]
|
||||
C6 --> A7
|
||||
end
|
||||
|
||||
style A7 fill:#370CE2,color:#fff
|
||||
style C6 fill:#370CE2,color:#fff
|
||||
</div>
|
||||
|
||||
<div style="text-align:center; margin: 20px 0;">
|
||||
<button class="figma-tab active" onclick="switchFigmaPage('2-6')" style="padding: 15px 30px; font-size: 1em;">
|
||||
🔍 查看登录/注册设计稿
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h3>登录页面状态</h3>
|
||||
<div class="page-structure">
|
||||
<div class="page-card">
|
||||
<h4>登录_默认 <span class="badge">入口</span></h4>
|
||||
<ul>
|
||||
<li>iShare Logo 展示</li>
|
||||
<li>社交登录按钮 (微信/谷歌/FB/Twitter)</li>
|
||||
<li>分隔线 "Or"</li>
|
||||
<li>手机号/邮箱输入框</li>
|
||||
<li>密码输入框</li>
|
||||
<li>记住账号复选框</li>
|
||||
<li>忘记密码链接</li>
|
||||
<li>登录按钮 (主色)</li>
|
||||
<li>创建账户链接</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="page-card">
|
||||
<h4>登录_输入 <span class="badge">交互</span></h4>
|
||||
<ul>
|
||||
<li>输入框获得焦点样式</li>
|
||||
<li>实时格式验证</li>
|
||||
<li>密码显示/隐藏切换</li>
|
||||
<li>按钮激活状态</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="page-card">
|
||||
<h4>忘记密码_手机验证</h4>
|
||||
<ul>
|
||||
<li>标题:找回密码</li>
|
||||
<li>手机号输入框</li>
|
||||
<li>获取验证码按钮</li>
|
||||
<li>验证码输入框</li>
|
||||
<li>下一步按钮</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="page-card">
|
||||
<h4>注册_默认</h4>
|
||||
<ul>
|
||||
<li>创建账户标题</li>
|
||||
<li>手机号/邮箱输入框</li>
|
||||
<li>验证码输入框</li>
|
||||
<li>密码输入框</li>
|
||||
<li>用户协议勾选</li>
|
||||
<li>注册按钮</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- 购买流程 -->
|
||||
<section id="flow-purchase">
|
||||
<h2>💳 服务购买流程</h2>
|
||||
|
||||
<h3>购买流程图</h3>
|
||||
<div class="mermaid">
|
||||
flowchart LR
|
||||
A[主页/服务列表] -->|点击服务卡片| B[服务详情页]
|
||||
B -->|查看| C[服务介绍]
|
||||
B -->|查看| D[价格套餐]
|
||||
B -->|查看| E[会员权益]
|
||||
B -->|查看| F[常见问题]
|
||||
B -->|点击购买| G[确认订单]
|
||||
G --> H[选择支付方式]
|
||||
H --> I[完成支付]
|
||||
I -->|成功| J[获取账号信息]
|
||||
I -->|失败| K[重新支付]
|
||||
K --> H
|
||||
|
||||
style A fill:#370CE2,color:#fff
|
||||
style I fill:#E94C89,color:#fff
|
||||
style J fill:#C22F6C,color:#fff
|
||||
</div>
|
||||
|
||||
<div style="text-align:center; margin: 20px 0;">
|
||||
<button class="figma-tab active" onclick="switchFigmaPage('1145-913')" style="padding: 15px 30px; font-size: 1em;">
|
||||
🔍 查看主页/服务列表设计稿
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h3>操作步骤</h3>
|
||||
<div class="flow-steps">
|
||||
<div class="flow-step">
|
||||
<div class="step-num">1</div>
|
||||
<strong>浏览服务</strong><br>
|
||||
<small>在主页查看服务列表</small>
|
||||
</div>
|
||||
<div class="flow-step">
|
||||
<div class="step-num">2</div>
|
||||
<strong>选择服务</strong><br>
|
||||
<small>点击感兴趣的服务</small>
|
||||
</div>
|
||||
<div class="flow-step">
|
||||
<div class="step-num">3</div>
|
||||
<strong>查看详情</strong><br>
|
||||
<small>了解价格和权益</small>
|
||||
</div>
|
||||
<div class="flow-step">
|
||||
<div class="step-num">4</div>
|
||||
<strong>确认购买</strong><br>
|
||||
<small>选择套餐,确认订单</small>
|
||||
</div>
|
||||
<div class="flow-step">
|
||||
<div class="step-num">5</div>
|
||||
<strong>完成支付</strong><br>
|
||||
<small>支付并获取账号</small>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- 拼车流程 -->
|
||||
<section id="flow-carpool">
|
||||
<h2>🚗 广场/拼车流程</h2>
|
||||
|
||||
<h3>拼车流程图</h3>
|
||||
<div class="mermaid">
|
||||
flowchart LR
|
||||
A[进入广场] --> B[浏览车票列表]
|
||||
B --> C{筛选}
|
||||
C -->|按服务类型| D[Netflix/Spotify等]
|
||||
C -->|按价格| E[价格区间]
|
||||
C -->|按状态| F[可上车/已满员]
|
||||
D --> G[查看车票详情]
|
||||
E --> G
|
||||
F --> G
|
||||
G --> H{决定}
|
||||
H -->|上车| I[确认加入]
|
||||
H -->|返回| B
|
||||
I --> J[支付车费]
|
||||
J --> K[上车成功]
|
||||
K --> L[获取账号信息]
|
||||
|
||||
style A fill:#370CE2,color:#fff
|
||||
style K fill:#E94C89,color:#fff
|
||||
style L fill:#C22F6C,color:#fff
|
||||
</div>
|
||||
|
||||
<div style="text-align:center; margin: 20px 0;">
|
||||
<button class="figma-tab active" onclick="switchFigmaPage('1446-350')" style="padding: 15px 30px; font-size: 1em;">
|
||||
🔍 查看广场/拼车设计稿
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="info-box warning">
|
||||
<strong>⚠️ 拼车规则说明</strong><br>
|
||||
<ul style="margin-top: 10px; padding-left: 20px;">
|
||||
<li>每个车票有固定的座位数量(通常4-6人)</li>
|
||||
<li>上车后不支持退款,请确认后再操作</li>
|
||||
<li>账号信息会在支付成功后自动显示</li>
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- 页面详情 -->
|
||||
<section id="pages">
|
||||
<h2>📱 所有页面清单</h2>
|
||||
|
||||
<h3>Figma 设计文件结构</h3>
|
||||
<table>
|
||||
<tr>
|
||||
<th>Page</th>
|
||||
<th>包含的Frame</th>
|
||||
<th>说明</th>
|
||||
<th>查看</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>原型分析</strong></td>
|
||||
<td>奈飞小镇、银河录像局、Sharesub</td>
|
||||
<td>竞品分析与参考</td>
|
||||
<td><button class="figma-tab" onclick="switchFigmaPage('0-1')" style="padding:5px 10px;font-size:0.8em;">查看</button></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>全局样式</strong></td>
|
||||
<td>颜色系统、字体规范</td>
|
||||
<td>设计系统基础</td>
|
||||
<td><button class="figma-tab" onclick="switchFigmaPage('245-173')" style="padding:5px 10px;font-size:0.8em;">查看</button></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>登录/注册</strong></td>
|
||||
<td>登录_默认、登录_输入、注册、忘记密码、流程图</td>
|
||||
<td>用户认证完整流程</td>
|
||||
<td><button class="figma-tab" onclick="switchFigmaPage('2-6')" style="padding:5px 10px;font-size:0.8em;">查看</button></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>首页</strong></td>
|
||||
<td>登录欢迎页(Web/Mobile)</td>
|
||||
<td>品牌落地页</td>
|
||||
<td><button class="figma-tab" onclick="switchFigmaPage('1146-302')" style="padding:5px 10px;font-size:0.8em;">查看</button></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>主页</strong></td>
|
||||
<td>服务列表、详情页、支付页、FAQ、导航</td>
|
||||
<td>核心功能页面</td>
|
||||
<td><button class="figma-tab" onclick="switchFigmaPage('1145-913')" style="padding:5px 10px;font-size:0.8em;">查看</button></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>广场</strong></td>
|
||||
<td>车票_全部、车票_已上车、车票详情</td>
|
||||
<td>拼车社区功能</td>
|
||||
<td><button class="figma-tab" onclick="switchFigmaPage('1446-350')" style="padding:5px 10px;font-size:0.8em;">查看</button></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>推广</strong></td>
|
||||
<td>推广页面、邀请规则说明</td>
|
||||
<td>用户增长功能</td>
|
||||
<td><button class="figma-tab" onclick="switchFigmaPage('1560-673')" style="padding:5px 10px;font-size:0.8em;">查看</button></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h3>底部导航结构</h3>
|
||||
<div class="mermaid">
|
||||
graph LR
|
||||
A[首页] --- B[广场] --- C[推广] --- D[我的]
|
||||
|
||||
A --> A1[服务列表]
|
||||
B --> B1[车票列表]
|
||||
C --> C1[邀请返现]
|
||||
D --> D1[个人中心]
|
||||
|
||||
style A fill:#370CE2,color:#fff
|
||||
style B fill:#E94C89,color:#fff
|
||||
style C fill:#E94C89,color:#fff
|
||||
style D fill:#E94C89,color:#fff
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- 设计规范 -->
|
||||
<section id="design">
|
||||
<h2>🎨 设计规范</h2>
|
||||
|
||||
<div style="text-align:center; margin-bottom: 30px;">
|
||||
<button class="figma-tab active" onclick="switchFigmaPage('245-173')" style="padding: 15px 30px; font-size: 1em;">
|
||||
🔍 查看完整设计规范
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h3>主题色 (Theme Colors)</h3>
|
||||
<div class="color-palette">
|
||||
<div class="color-item">
|
||||
<div class="color-swatch" style="background: #370CE2;"></div>
|
||||
<span><strong>#370CE2</strong></span>
|
||||
<span>Pink 700 · 主色</span>
|
||||
</div>
|
||||
<div class="color-item">
|
||||
<div class="color-swatch" style="background: #C22F6C;"></div>
|
||||
<span><strong>#C22F6C</strong></span>
|
||||
<span>Pink 600 · 点击</span>
|
||||
</div>
|
||||
<div class="color-item">
|
||||
<div class="color-swatch" style="background: #E94C89;"></div>
|
||||
<span><strong>#E94C89</strong></span>
|
||||
<span>Pink 500 · 常规</span>
|
||||
</div>
|
||||
<div class="color-item">
|
||||
<div class="color-swatch" style="background: #ED6997;"></div>
|
||||
<span><strong>#ED6997</strong></span>
|
||||
<span>Pink 400 · 悬停</span>
|
||||
</div>
|
||||
<div class="color-item">
|
||||
<div class="color-swatch" style="background: #FBC7D4;"></div>
|
||||
<span><strong>#FBC7D4</strong></span>
|
||||
<span>Pink 100</span>
|
||||
</div>
|
||||
<div class="color-item">
|
||||
<div class="color-swatch" style="background: #FFE8ED;"></div>
|
||||
<span><strong>#FFE8ED</strong></span>
|
||||
<span>Pink 50</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3>中性色 (Neutral Colors)</h3>
|
||||
<div class="color-palette">
|
||||
<div class="color-item">
|
||||
<div class="color-swatch" style="background: #1D222A;"></div>
|
||||
<span><strong>#1D222A</strong></span>
|
||||
<span>Neutral 700 · 主文字</span>
|
||||
</div>
|
||||
<div class="color-item">
|
||||
<div class="color-swatch" style="background: #4E596A;"></div>
|
||||
<span><strong>#4E596A</strong></span>
|
||||
<span>Neutral 600</span>
|
||||
</div>
|
||||
<div class="color-item">
|
||||
<div class="color-swatch" style="background: #838C99;"></div>
|
||||
<span><strong>#838C99</strong></span>
|
||||
<span>Neutral 500</span>
|
||||
</div>
|
||||
<div class="color-item">
|
||||
<div class="color-swatch" style="background: #B8BBBF;"></div>
|
||||
<span><strong>#B8BBBF</strong></span>
|
||||
<span>Neutral 400 · 占位符</span>
|
||||
</div>
|
||||
<div class="color-item">
|
||||
<div class="color-swatch" style="background: #F5F5F5; border: 1px solid #999;"></div>
|
||||
<span><strong>#F5F5F5</strong></span>
|
||||
<span>Neutral 100</span>
|
||||
</div>
|
||||
<div class="color-item">
|
||||
<div class="color-swatch" style="background: #FFFFFF; border: 1px solid #999;"></div>
|
||||
<span><strong>#FFFFFF</strong></span>
|
||||
<span>Neutral 50 · 背景</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3>字体规范</h3>
|
||||
<table>
|
||||
<tr>
|
||||
<th>样式</th>
|
||||
<th>字号</th>
|
||||
<th>字重</th>
|
||||
<th>用途</th>
|
||||
</tr>
|
||||
<tr><td>Header</td><td>24px</td><td>700 (Bold)</td><td>页面标题</td></tr>
|
||||
<tr><td>Subtitle</td><td>20px</td><td>700 (Bold)</td><td>副标题、区块标题</td></tr>
|
||||
<tr><td>Body Bold</td><td>16px</td><td>700 (Bold)</td><td>强调文字、按钮</td></tr>
|
||||
<tr><td>Body Regular</td><td>16px</td><td>400 (Regular)</td><td>正文内容</td></tr>
|
||||
<tr><td>Caption Bold</td><td>14px</td><td>700 (Bold)</td><td>标签、小标题</td></tr>
|
||||
<tr><td>Caption Regular</td><td>14px</td><td>400 (Regular)</td><td>辅助说明</td></tr>
|
||||
</table>
|
||||
</section>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer style="text-align: center; padding: 40px; opacity: 0.7;">
|
||||
<p>📎 Figma 设计源文件:<a href="https://www.figma.com/design/LdrKDCBrE4ve4UAYjQxWrC/iShare--Copy-" target="_blank" style="color: #E94C89;">点击查看</a></p>
|
||||
<p style="margin-top: 10px;">生成日期:2026年2月1日</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// Initialize Mermaid
|
||||
mermaid.initialize({
|
||||
startOnLoad: true,
|
||||
theme: 'dark',
|
||||
themeVariables: {
|
||||
primaryColor: '#370CE2',
|
||||
primaryTextColor: '#fff',
|
||||
primaryBorderColor: '#E94C89',
|
||||
lineColor: '#E94C89',
|
||||
secondaryColor: '#E94C89',
|
||||
tertiaryColor: '#1a1a2e'
|
||||
}
|
||||
});
|
||||
|
||||
// Switch Figma page
|
||||
function switchFigmaPage(nodeId) {
|
||||
const iframe = document.getElementById('figma-frame');
|
||||
iframe.src = `https://www.figma.com/embed?embed_host=share&url=https://www.figma.com/design/LdrKDCBrE4ve4UAYjQxWrC/iShare--Copy-?node-id=${nodeId}`;
|
||||
|
||||
// Update active tab
|
||||
document.querySelectorAll('.figma-tabs .figma-tab').forEach(tab => {
|
||||
tab.classList.remove('active');
|
||||
});
|
||||
event.target.classList.add('active');
|
||||
|
||||
// Scroll to preview section
|
||||
document.getElementById('figma-preview').scrollIntoView({ behavior: 'smooth' });
|
||||
}
|
||||
|
||||
// Smooth scroll for navigation
|
||||
document.querySelectorAll('.nav-tab').forEach(tab => {
|
||||
tab.addEventListener('click', function(e) {
|
||||
e.preventDefault();
|
||||
const target = document.querySelector(this.getAttribute('href'));
|
||||
target.scrollIntoView({ behavior: 'smooth' });
|
||||
|
||||
document.querySelectorAll('.nav-tab').forEach(t => t.classList.remove('active'));
|
||||
this.classList.add('active');
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
112
iShare_Design/page_structure.json
Normal file
112
iShare_Design/page_structure.json
Normal file
@@ -0,0 +1,112 @@
|
||||
{
|
||||
"login_register": {
|
||||
"name": "登录/注册模块",
|
||||
"frames": [
|
||||
{
|
||||
"id": "login_default",
|
||||
"name": "登录_默认",
|
||||
"desc": "默认登录页面,包含社交登录和账号密码登录"
|
||||
},
|
||||
{
|
||||
"id": "login_input",
|
||||
"name": "登录_输入",
|
||||
"desc": "输入状态的登录页面"
|
||||
},
|
||||
{
|
||||
"id": "register_default",
|
||||
"name": "注册_默认",
|
||||
"desc": "默认注册页面"
|
||||
},
|
||||
{
|
||||
"id": "register_input",
|
||||
"name": "注册_输入",
|
||||
"desc": "输入状态的注册页面"
|
||||
},
|
||||
{
|
||||
"id": "forgot_phone",
|
||||
"name": "忘记密码_手机验证",
|
||||
"desc": "通过手机验证找回密码"
|
||||
},
|
||||
{
|
||||
"id": "forgot_email",
|
||||
"name": "忘记密码_邮箱验证",
|
||||
"desc": "通过邮箱验证找回密码"
|
||||
},
|
||||
{
|
||||
"id": "set_password",
|
||||
"name": "设置新密码",
|
||||
"desc": "设置新密码页面"
|
||||
}
|
||||
]
|
||||
},
|
||||
"homepage": {
|
||||
"name": "首页",
|
||||
"frames": [
|
||||
{
|
||||
"id": "home_login",
|
||||
"name": "登录欢迎页",
|
||||
"desc": "品牌落地页,引导用户登录"
|
||||
}
|
||||
]
|
||||
},
|
||||
"main": {
|
||||
"name": "主页/服务列表",
|
||||
"frames": [
|
||||
{
|
||||
"id": "service_list",
|
||||
"name": "服务列表",
|
||||
"desc": "展示所有可购买的流媒体服务"
|
||||
},
|
||||
{
|
||||
"id": "service_detail",
|
||||
"name": "服务详情",
|
||||
"desc": "服务介绍、价格、权益"
|
||||
},
|
||||
{
|
||||
"id": "payment",
|
||||
"name": "支付页面",
|
||||
"desc": "订单确认和支付"
|
||||
},
|
||||
{
|
||||
"id": "faq",
|
||||
"name": "常见问题",
|
||||
"desc": "FAQ页面"
|
||||
}
|
||||
]
|
||||
},
|
||||
"plaza": {
|
||||
"name": "广场/拼车",
|
||||
"frames": [
|
||||
{
|
||||
"id": "ticket_all",
|
||||
"name": "车票_全部",
|
||||
"desc": "所有可加入的合租车票"
|
||||
},
|
||||
{
|
||||
"id": "ticket_joined",
|
||||
"name": "车票_已上车",
|
||||
"desc": "已加入的合租列表"
|
||||
}
|
||||
]
|
||||
},
|
||||
"promotion": {
|
||||
"name": "推广中心",
|
||||
"frames": [
|
||||
{
|
||||
"id": "invite",
|
||||
"name": "邀请返现",
|
||||
"desc": "推荐好友获得10%返现"
|
||||
}
|
||||
]
|
||||
},
|
||||
"style": {
|
||||
"name": "设计规范",
|
||||
"frames": [
|
||||
{
|
||||
"id": "colors",
|
||||
"name": "颜色系统",
|
||||
"desc": "主题色和中性色规范"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
BIN
iShare_需求与设计文档.docx
Normal file
BIN
iShare_需求与设计文档.docx
Normal file
Binary file not shown.
Reference in New Issue
Block a user