8 Commits

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

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

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

表数量: v2(23张) → v3(27张)
2026-02-17 12:55:41 +01:00
e5b454351c docs: 新增数据库设计概要(含评审问题清单) 2026-02-17 12:45:33 +01:00
阿米狗
0192fc3523 feat: database design v2.0 - fix 15 defects, add 6 new tables
fixes:
- as_platform_type/platform: add status/del_flag/timestamps, sort_order varchar->int
- as_sub_plan: platform_id varchar->bigint, capacity varchar->int
- as_sub_payroll: rename sub_plans->sub_plan_id, add duration_months/original_price/is_active
- as_sub_product: fix Tags->tags naming bug, add platform_id/cover_image/status/total_capacity, type fields Long->tinyint
- as_sub_account: 4 int->bigint fields, passwd_salt int->varchar(64), add encrypt_type/status
- as_user_sub: remark int->varchar(bug fix), int->bigint fields, add product_id/status/expire_time, rename user_id->host_user_id/main_account->account_id
- as_sub_product_comment: add order_id/is_anonymous/reply_id/del_flag

new tables:
- as_user_sub_member: individual subscription record (critical missing table)
- as_order: full order table with state machine
- as_wallet: user wallet with optimistic lock
- as_wallet_log: balance transaction log
- as_invite: invitation relationship
- as_notification: system notifications
2026-02-17 19:36:55 +08:00
阿米狗
d6af71ec14 feat: add Phase D - system design (functions + business flows + DB design) 2026-02-17 19:29:09 +08:00
690c900f81 add iShare development plan (PigX 5.11.0) 2026-02-17 10:20:24 +00:00
purovps
c29589887d docs: add work summary for 2026-02-16 2026-02-16 23:35:29 +08:00
purovps
c93ef1ca9b docs: add design documents and requirements 2026-02-16 23:22:55 +08:00
12 changed files with 3051 additions and 0 deletions

232
DATABASE_DESIGN_OVERVIEW.md Normal file
View File

@@ -0,0 +1,232 @@
# iShare 数据库设计概要
> 版本v4决策确认后最终版
> 修订时间2026-02-17
> 完整建表 SQLv2 基础版):`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_logtype=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=2capacity_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
View File

@@ -0,0 +1,427 @@
# iShare 数据库设计 v2.0(修订版)
> 基于原版 v1.02023-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`:随机 IV16字节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_notificationtype=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
View File

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

371
SYSTEM_DESIGN.md Normal file
View 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_productproduct_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` 是 int0=全部 含义混乱 | 改用独立 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 | 目标用户ID0=全部用户) |
| `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** | 测试 + 上线 | — |

View 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-sys111个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
- 数据库MySQLutf8mb4
- 前端Vuepigx-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
View 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/Hex16字节随机',
`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_id0=全体广播)',
`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;

View File

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

View File

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

277
iShare-dev-plan.md Normal file
View 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/pigxPigX 框架备份)|
---
## 二、技术路线
### 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 17javax → 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: 用户端 H52-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.2Java 8 + Spring Boot 2Spring Boot 2 已于 2023 年 EOLJava 8 缺少现代特性。新版 5.11.0 支持单体模式,开发阶段不需要 Nacos/Gateway本地启动一个 JAR 即可,和旧版微服务架构相比开发效率高得多。
### Q2: 单体模式 vs 微服务?
**开发阶段**: 用 `pigx-boot` 单体模式 — 一个进程,本地开发零运维负担。
**生产上线后**: 如并发压力大,再按模块拆分微服务(业务模块无需改代码,只需改部署配置)。
### Q3: 用户端用 H5 还是小程序?
一期先做响应式 H5Vue3可在微信内置浏览器打开无需发布审核。小程序适配二期按需追加。
### 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 |

View 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>

View 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": "主题色和中性色规范"
}
]
}
}

Binary file not shown.