diff --git a/DATABASE_DESIGN_V2.md b/DATABASE_DESIGN_V2.md new file mode 100644 index 0000000..9822c69 --- /dev/null +++ b/DATABASE_DESIGN_V2.md @@ -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 张表** diff --git a/db/ishare_schema_v2.sql b/db/ishare_schema_v2.sql new file mode 100644 index 0000000..54cfc74 --- /dev/null +++ b/db/ishare_schema_v2.sql @@ -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;