snack-mall/db/schema.sql

556 lines
41 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- ============================================================
-- 零食商城 数据库初始化脚本
-- 适用 MySQL 8.0+
-- 字符集utf8mb4 / 排序规则utf8mb4_unicode_ci
-- 全部表与字段均已添加 COMMENT 注释
-- ============================================================
-- 删除并重建数据库
DROP DATABASE IF EXISTS `snack_mall`;
CREATE DATABASE `snack_mall`
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;
USE `snack_mall`;
-- ============================================================
-- ① 用户表
-- ============================================================
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键 ID',
`username` VARCHAR(50) NOT NULL COMMENT '登录用户名(唯一)',
`password` VARCHAR(100) NOT NULL COMMENT '加密密码BCrypt 强度 10',
`phone` VARCHAR(20) DEFAULT NULL COMMENT '手机号',
`nickname` VARCHAR(50) DEFAULT NULL COMMENT '昵称',
`avatar` VARCHAR(255) DEFAULT NULL COMMENT '头像 URL',
`gender` TINYINT NOT NULL DEFAULT 0 COMMENT '性别0-未知 1-男 2-女',
`birthday` DATE DEFAULT NULL COMMENT '生日',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '账号状态0-禁用 1-启用',
`last_login_time` DATETIME DEFAULT NULL COMMENT '最近登录时间',
`last_login_ip` VARCHAR(50) DEFAULT NULL COMMENT '最近登录 IP',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_username` (`username`),
KEY `idx_phone` (`phone`),
KEY `idx_status` (`status`),
KEY `idx_create_time` (`create_time`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='前台用户表';
-- ============================================================
-- ② 管理员表
-- ============================================================
DROP TABLE IF EXISTS `admin`;
CREATE TABLE `admin` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键 ID',
`username` VARCHAR(50) NOT NULL COMMENT '登录用户名(唯一)',
`password` VARCHAR(100) NOT NULL COMMENT 'BCrypt 加密密码',
`nickname` VARCHAR(50) DEFAULT NULL COMMENT '昵称',
`avatar` VARCHAR(255) DEFAULT NULL COMMENT '头像 URL',
`email` VARCHAR(100) DEFAULT NULL COMMENT '邮箱',
`phone` VARCHAR(20) DEFAULT NULL COMMENT '手机号',
`role` VARCHAR(50) NOT NULL DEFAULT 'admin' COMMENT '角色标识super_admin / admin / operator',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '账号状态0-禁用 1-启用',
`last_login_time` DATETIME DEFAULT NULL COMMENT '最近登录时间',
`last_login_ip` VARCHAR(50) DEFAULT NULL COMMENT '最近登录 IP',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_username` (`username`),
KEY `idx_status` (`status`),
KEY `idx_role` (`role`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='后台管理员表';
-- ============================================================
-- ③ 商品分类表(支持多级树形)
-- ============================================================
DROP TABLE IF EXISTS `category`;
CREATE TABLE `category` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键 ID',
`name` VARCHAR(50) NOT NULL COMMENT '分类名称',
`parent_id` BIGINT NOT NULL DEFAULT 0 COMMENT '父分类 ID0 表示一级分类',
`level` TINYINT NOT NULL DEFAULT 1 COMMENT '层级1-一级 2-二级 3-三级',
`sort` INT NOT NULL DEFAULT 0 COMMENT '排序号(升序展示)',
`icon` VARCHAR(255) DEFAULT NULL COMMENT '分类图标 URL',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态0-禁用 1-启用',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_parent_id` (`parent_id`),
KEY `idx_level` (`level`),
KEY `idx_status` (`status`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='商品分类表(支持多级树形结构)';
-- ============================================================
-- ④ 商品 SPU 表
-- ============================================================
DROP TABLE IF EXISTS `product`;
CREATE TABLE `product` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键 IDSPU',
`name` VARCHAR(200) NOT NULL COMMENT '商品名称',
`category_id` BIGINT NOT NULL COMMENT '所属分类 ID',
`brand` VARCHAR(100) DEFAULT NULL COMMENT '品牌',
`main_image` VARCHAR(255) DEFAULT NULL COMMENT '主图 URL',
`sub_images` TEXT DEFAULT NULL COMMENT '副图列表JSON 数组)',
`detail` LONGTEXT DEFAULT NULL COMMENT '富文本详情HTML',
`origin_price` DECIMAL(10,2) DEFAULT NULL COMMENT '原价/划线价',
`sales` INT NOT NULL DEFAULT 0 COMMENT '累计销量',
`view_count` INT NOT NULL DEFAULT 0 COMMENT '浏览量',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态0-下架 1-上架',
`is_hot` TINYINT NOT NULL DEFAULT 0 COMMENT '是否热门0-否 1-是',
`is_new` TINYINT NOT NULL DEFAULT 0 COMMENT '是否新品0-否 1-是',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_category_id` (`category_id`),
KEY `idx_status` (`status`),
KEY `idx_sales` (`sales`),
KEY `idx_create_time` (`create_time`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='商品 SPU 表';
-- ============================================================
-- ⑤ 商品 SKU 表
-- ============================================================
DROP TABLE IF EXISTS `product_sku`;
CREATE TABLE `product_sku` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键 IDSKU',
`product_id` BIGINT NOT NULL COMMENT '所属 SPU ID',
`sku_name` VARCHAR(100) NOT NULL COMMENT '规格名称,如:原味/500g',
`image` VARCHAR(255) DEFAULT NULL COMMENT '规格图片 URL',
`price` DECIMAL(10,2) NOT NULL COMMENT '售价',
`stock` INT NOT NULL DEFAULT 0 COMMENT '库存数量',
`sales` INT NOT NULL DEFAULT 0 COMMENT '累计销量',
`weight` INT DEFAULT NULL COMMENT '重量(克)',
`sort` INT NOT NULL DEFAULT 0 COMMENT '排序号',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_product_id` (`product_id`),
KEY `idx_create_time` (`create_time`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='商品 SKU 表(具体规格)';
-- ============================================================
-- ⑥ 收货地址
-- ============================================================
DROP TABLE IF EXISTS `address`;
CREATE TABLE `address` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键 ID',
`user_id` BIGINT NOT NULL COMMENT '所属用户 ID',
`receiver` VARCHAR(50) NOT NULL COMMENT '收货人姓名',
`phone` VARCHAR(20) NOT NULL COMMENT '收货人手机号',
`province` VARCHAR(50) DEFAULT NULL COMMENT '',
`city` VARCHAR(50) DEFAULT NULL COMMENT '',
`district` VARCHAR(50) DEFAULT NULL COMMENT '区/县',
`detail` VARCHAR(255) NOT NULL COMMENT '详细地址',
`tag` VARCHAR(20) DEFAULT NULL COMMENT '标签:家/公司/学校',
`is_default` TINYINT NOT NULL DEFAULT 0 COMMENT '是否默认地址0-否 1-是',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_is_default` (`user_id`, `is_default`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='收货地址表';
-- ============================================================
-- ⑦ 购物车
-- ============================================================
DROP TABLE IF EXISTS `cart`;
CREATE TABLE `cart` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键 ID',
`user_id` BIGINT NOT NULL COMMENT '用户 ID',
`product_id` BIGINT NOT NULL COMMENT '商品 SPU ID',
`sku_id` BIGINT NOT NULL COMMENT '商品 SKU ID',
`quantity` INT NOT NULL DEFAULT 1 COMMENT '数量',
`selected` TINYINT NOT NULL DEFAULT 1 COMMENT '选中状态0-未选 1-已选',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '加入时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_sku` (`user_id`, `sku_id`),
KEY `idx_user_id` (`user_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='购物车表';
-- ============================================================
-- ⑧ 订单主表
-- ============================================================
DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键 ID',
`order_no` VARCHAR(32) NOT NULL COMMENT '订单号(业务唯一)',
`user_id` BIGINT NOT NULL COMMENT '下单用户 ID',
`total_amount` DECIMAL(10,2) NOT NULL COMMENT '商品总金额(未优惠)',
`freight_amount` DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT '运费',
`discount_amount` DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT '优惠金额(满减/折扣)',
`coupon_id` BIGINT DEFAULT NULL COMMENT '使用的优惠券 ID',
`coupon_amount` DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT '优惠券抵扣金额',
`pay_amount` DECIMAL(10,2) NOT NULL COMMENT '实付金额',
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '订单状态0-待付款 1-待发货 2-待收货 3-已完成 4-已取消 5-已退款',
`receiver_name` VARCHAR(50) NOT NULL COMMENT '收货人姓名',
`receiver_phone` VARCHAR(20) NOT NULL COMMENT '收货人手机号',
`receiver_address` VARCHAR(255) NOT NULL COMMENT '完整收货地址',
`remark` VARCHAR(500) DEFAULT NULL COMMENT '订单备注',
`tracking_company` VARCHAR(50) DEFAULT NULL COMMENT '物流公司',
`tracking_no` VARCHAR(50) DEFAULT NULL COMMENT '物流单号',
`pay_time` DATETIME DEFAULT NULL COMMENT '支付时间',
`deliver_time` DATETIME DEFAULT NULL COMMENT '发货时间',
`receive_time` DATETIME DEFAULT NULL COMMENT '收货时间',
`cancel_time` DATETIME DEFAULT NULL COMMENT '取消时间',
`finish_time` DATETIME DEFAULT NULL COMMENT '完成时间',
`pay_channel` VARCHAR(20) DEFAULT NULL COMMENT '支付渠道alipay / wechat / balance',
`pay_trade_no` VARCHAR(64) DEFAULT NULL COMMENT '第三方支付平台交易号(支付宝/微信返回)',
`refund_trade_no` VARCHAR(64) DEFAULT NULL COMMENT '退款交易号(支付宝/微信返回)',
`refund_time` DATETIME DEFAULT NULL COMMENT '退款时间',
`refund_reason` VARCHAR(255) DEFAULT NULL COMMENT '退款原因',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_no` (`order_no`),
UNIQUE KEY `uk_pay_trade_no` (`pay_trade_no`),
KEY `idx_user_id` (`user_id`),
KEY `idx_status` (`status`),
KEY `idx_create_time` (`create_time`),
KEY `idx_user_status` (`user_id`, `status`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='订单主表';
-- ============================================================
-- ⑨ 订单商品明细
-- ============================================================
DROP TABLE IF EXISTS `order_item`;
CREATE TABLE `order_item` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键 ID',
`order_id` BIGINT NOT NULL COMMENT '订单 ID',
`order_no` VARCHAR(32) NOT NULL COMMENT '订单号(冗余)',
`product_id` BIGINT NOT NULL COMMENT '商品 SPU ID',
`product_name` VARCHAR(200) NOT NULL COMMENT '商品名(冗余防商品改名)',
`product_image` VARCHAR(255) DEFAULT NULL COMMENT '商品主图(冗余)',
`sku_id` BIGINT NOT NULL COMMENT 'SKU ID',
`sku_name` VARCHAR(100) NOT NULL COMMENT 'SKU 规格(冗余)',
`price` DECIMAL(10,2) NOT NULL COMMENT '成交单价',
`quantity` INT NOT NULL COMMENT '购买数量',
`total_amount` DECIMAL(10,2) NOT NULL COMMENT '小计金额price*quantity',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_order_id` (`order_id`),
KEY `idx_order_no` (`order_no`),
KEY `idx_product_id` (`product_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='订单商品明细表';
-- ============================================================
-- ⑩ 收藏
-- ============================================================
DROP TABLE IF EXISTS `favorite`;
CREATE TABLE `favorite` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键 ID',
`user_id` BIGINT NOT NULL COMMENT '用户 ID',
`product_id` BIGINT NOT NULL COMMENT '商品 SPU ID',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '收藏时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_product` (`user_id`, `product_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_product_id` (`product_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='用户收藏表';
-- ============================================================
-- ⑪ 轮播图
-- ============================================================
DROP TABLE IF EXISTS `banner`;
CREATE TABLE `banner` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键 ID',
`title` VARCHAR(100) DEFAULT NULL COMMENT '标题',
`image` VARCHAR(255) NOT NULL COMMENT '图片 URL',
`link_type` TINYINT NOT NULL DEFAULT 0 COMMENT '跳转类型0-不跳转 1-商品 2-分类 3-外链',
`link_value` VARCHAR(255) DEFAULT NULL COMMENT '跳转目标值(商品 ID / 分类 ID / URL',
`sort` INT NOT NULL DEFAULT 0 COMMENT '排序号(升序)',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态0-下线 1-上线',
`start_time` DATETIME DEFAULT NULL COMMENT '生效时间',
`end_time` DATETIME DEFAULT NULL COMMENT '失效时间',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_status_sort` (`status`, `sort`),
KEY `idx_start_time` (`start_time`),
KEY `idx_end_time` (`end_time`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='首页轮播图表';
-- ============================================================
-- ⑫ 客服会话表WebSocket 长连接)
-- 设计要点:
-- - 客户端通过 WebSocket 建立长连接,服务端实时转发消息
-- - session_no 是对外展示/查询的编号
-- - user_seq / admin_seq 记录各端最大已确认序号,用于断线补发
-- - status 区分会话生命周期
-- ============================================================
DROP TABLE IF EXISTS `chat_session`;
CREATE TABLE `chat_session` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键 ID',
`session_no` VARCHAR(32) NOT NULL COMMENT '会话编号(业务唯一)',
`user_id` BIGINT NOT NULL COMMENT '发起用户 ID',
`admin_id` BIGINT DEFAULT NULL COMMENT '接待客服 IDNULL=待分配',
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '会话状态0-待处理 1-处理中 2-已解决 3-已关闭',
`user_unread` INT NOT NULL DEFAULT 0 COMMENT '用户未读消息数',
`admin_unread` INT NOT NULL DEFAULT 0 COMMENT '客服未读消息数',
`last_message` VARCHAR(500) DEFAULT NULL COMMENT '最后一条消息摘要',
`last_time` DATETIME DEFAULT NULL COMMENT '最后一条消息时间',
`user_seq` BIGINT NOT NULL DEFAULT 0 COMMENT '用户端最大已确认消息序号(用于断线补发)',
`admin_seq` BIGINT NOT NULL DEFAULT 0 COMMENT '客服端最大已确认消息序号(用于断线补发)',
`close_time` DATETIME DEFAULT NULL COMMENT '关闭时间',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_session_no` (`session_no`),
KEY `idx_user_id` (`user_id`),
KEY `idx_admin_id` (`admin_id`),
KEY `idx_status` (`status`),
KEY `idx_last_time` (`last_time`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='客服会话表';
-- ============================================================
-- ⑬ 客服消息表WebSocket 消息持久化)
-- 设计要点:
-- - 每条消息全局递增 seq 编号(同 session 内)
-- - 客户端通过 last_ack_seq 拉取差量消息
-- - type 支持 text / image / file / system / product商品卡片
-- ============================================================
DROP TABLE IF EXISTS `chat_message`;
CREATE TABLE `chat_message` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键 ID',
`session_id` BIGINT NOT NULL COMMENT '所属会话 ID',
`seq` BIGINT NOT NULL DEFAULT 0 COMMENT '消息在会话内的递增序号(用于断线补发和排序)',
`sender_id` BIGINT NOT NULL COMMENT '发送者 ID用户/客服)',
`sender_type` TINYINT NOT NULL COMMENT '发送者类型0-用户 1-客服 2-系统',
`type` VARCHAR(10) NOT NULL DEFAULT 'text' COMMENT '消息类型text / image / file / product / system',
`content` TEXT NOT NULL COMMENT '消息内容(文字 / JSON / 图片 URL',
`extra` JSON DEFAULT NULL COMMENT '扩展字段(商品卡片等结构化数据)',
`is_recalled` TINYINT NOT NULL DEFAULT 0 COMMENT '是否撤回0-否 1-是',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '发送时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_session_seq` (`session_id`, `seq`),
KEY `idx_session_id` (`session_id`),
KEY `idx_create_time` (`create_time`),
KEY `idx_session_time` (`session_id`, `create_time`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='客服消息表WebSocket 持久化)';
-- ============================================================
-- ⑭ 客服快捷回复模板
-- ============================================================
DROP TABLE IF EXISTS `quick_reply`;
CREATE TABLE `quick_reply` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键 ID',
`title` VARCHAR(100) NOT NULL COMMENT '模板标题(用于搜索)',
`content` VARCHAR(500) NOT NULL COMMENT '模板内容',
`category` VARCHAR(50) DEFAULT NULL COMMENT '分类:问候/物流/售后/活动等',
`sort` INT NOT NULL DEFAULT 0 COMMENT '排序号',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态0-禁用 1-启用',
`use_count` INT NOT NULL DEFAULT 0 COMMENT '使用次数(统计)',
`create_by` BIGINT DEFAULT NULL COMMENT '创建人(管理员 ID',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_status_sort` (`status`, `sort`),
KEY `idx_category` (`category`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='客服快捷回复模板表';
-- ============================================================
-- ⑮ 系统公告
-- ============================================================
DROP TABLE IF EXISTS `notice`;
CREATE TABLE `notice` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键 ID',
`title` VARCHAR(200) NOT NULL COMMENT '公告标题',
`content` LONGTEXT NOT NULL COMMENT '公告内容(富文本 HTML',
`type` TINYINT NOT NULL DEFAULT 0 COMMENT '公告类型0-普通 1-重要 2-活动',
`is_top` TINYINT NOT NULL DEFAULT 0 COMMENT '是否置顶0-否 1-是',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态0-下线 1-上线',
`start_time` DATETIME DEFAULT NULL COMMENT '生效时间',
`end_time` DATETIME DEFAULT NULL COMMENT '失效时间',
`view_count` INT NOT NULL DEFAULT 0 COMMENT '浏览量',
`publisher_id` BIGINT DEFAULT NULL COMMENT '发布人(管理员 ID',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_status` (`status`),
KEY `idx_type` (`type`),
KEY `idx_create_time` (`create_time`),
KEY `idx_top_status` (`is_top`, `status`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='系统公告表';
-- ============================================================
-- ⑯ 优惠券模板
-- ============================================================
DROP TABLE IF EXISTS `coupon`;
CREATE TABLE `coupon` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键 ID',
`name` VARCHAR(100) NOT NULL COMMENT '优惠券名称',
`type` TINYINT NOT NULL COMMENT '类型0-满减券 1-折扣券 2-无门槛券',
`amount` DECIMAL(10,2) NOT NULL COMMENT '满减面值 / 折扣率0.85 表示 8.5 折)',
`min_amount` DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT '最低使用金额0 表示无门槛)',
`max_discount` DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT '折扣券最高抵扣金额',
`total` INT NOT NULL COMMENT '发放总量(-1 表示不限量)',
`remain` INT NOT NULL COMMENT '剩余可领取数量',
`per_limit` INT NOT NULL DEFAULT 1 COMMENT '每人限领数量',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态0-未上线 1-已上线 2-已结束',
`start_time` DATETIME NOT NULL COMMENT '领取开始时间',
`end_time` DATETIME NOT NULL COMMENT '领取截止时间',
`valid_days` INT DEFAULT NULL COMMENT '领取后有效天数NULL 时使用固定截止日期)',
`description` VARCHAR(500) DEFAULT NULL COMMENT '使用说明',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_status` (`status`),
KEY `idx_start_time` (`start_time`),
KEY `idx_end_time` (`end_time`),
KEY `idx_type` (`type`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='优惠券模板表';
-- ============================================================
-- ⑰ 用户优惠券(领取记录)
-- ============================================================
DROP TABLE IF EXISTS `user_coupon`;
CREATE TABLE `user_coupon` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键 ID',
`user_id` BIGINT NOT NULL COMMENT '用户 ID',
`coupon_id` BIGINT NOT NULL COMMENT '优惠券模板 ID',
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '状态0-未使用 1-已使用 2-已过期 3-已作废',
`order_id` BIGINT DEFAULT NULL COMMENT '使用时关联的订单 ID',
`receive_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '领取时间',
`use_time` DATETIME DEFAULT NULL COMMENT '使用时间',
`expire_time` DATETIME NOT NULL COMMENT '过期时间',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_coupon_id` (`coupon_id`),
KEY `idx_status` (`status`),
KEY `idx_expire` (`expire_time`),
KEY `idx_user_status` (`user_id`, `status`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='用户优惠券领取记录表';
-- ============================================================
-- ⑱ 限时抢购活动
-- 设计要点(与 Redis 配合):
-- - 活动开启时,把 seckill_product 的 seckill_stock 同步到 Redis
-- key: seckill:stock:{activityId}:{productId}
-- - 用户抢购时 Redis DECR 原子扣减,避免超卖
-- - 抢购成功后再异步写库(消费 MQ 消息)
-- - seckill_order 唯一索引 (user_id, activity_id, product_id) 兜底"一人一单"
-- ============================================================
DROP TABLE IF EXISTS `seckill_activity`;
CREATE TABLE `seckill_activity` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键 ID',
`name` VARCHAR(100) NOT NULL COMMENT '活动名称',
`cover` VARCHAR(255) DEFAULT NULL COMMENT '活动封面图',
`start_time` DATETIME NOT NULL COMMENT '活动开始时间',
`end_time` DATETIME NOT NULL COMMENT '活动结束时间',
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '状态0-未开始 1-进行中 2-已结束',
`description` VARCHAR(500) DEFAULT NULL COMMENT '活动说明',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_start_time` (`start_time`),
KEY `idx_end_time` (`end_time`),
KEY `idx_status` (`status`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='限时抢购活动表';
-- ============================================================
-- ⑲ 抢购活动商品
-- ============================================================
DROP TABLE IF EXISTS `seckill_product`;
CREATE TABLE `seckill_product` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键 ID',
`activity_id` BIGINT NOT NULL COMMENT '所属活动 ID',
`product_id` BIGINT NOT NULL COMMENT '商品 SPU ID',
`sku_id` BIGINT NOT NULL COMMENT '商品 SKU ID',
`seckill_price` DECIMAL(10,2) NOT NULL COMMENT '抢购价',
`origin_price` DECIMAL(10,2) NOT NULL COMMENT '原价(展示用)',
`seckill_stock` INT NOT NULL COMMENT '总库存(同步到 Redis',
`remain_stock` INT NOT NULL COMMENT '剩余库存(兜底用,正常情况下以 Redis 为准)',
`per_limit` INT NOT NULL DEFAULT 1 COMMENT '每人限购数量',
`sales` INT NOT NULL DEFAULT 0 COMMENT '已售数量(异步消费 MQ 后累加)',
`sort` INT NOT NULL DEFAULT 0 COMMENT '活动内排序',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_activity_sku` (`activity_id`, `sku_id`),
KEY `idx_product_id` (`product_id`),
KEY `idx_activity_id` (`activity_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='抢购活动商品表';
-- ============================================================
-- ⑳ 抢购订单(仅作为"成功下单"的最终记录)
-- 设计要点:
-- - 抢购请求先通过 Redis 原子扣库存 + Lua 限流
-- - 抢到后消息进入 MQ由消费者线程消费
-- ① 写 seckill_order唯一索引防一人多单
-- ② 生成主订单
-- ③ 异步扣 MySQL 库存(兜底)
-- - 此表只保留"已成功抢购"的记录,不存失败的请求
-- - (user_id, activity_id, product_id) 唯一索引:兜底防一人多单
-- ============================================================
DROP TABLE IF EXISTS `seckill_order`;
CREATE TABLE `seckill_order` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键 ID',
`user_id` BIGINT NOT NULL COMMENT '用户 ID',
`activity_id` BIGINT NOT NULL COMMENT '活动 ID',
`product_id` BIGINT NOT NULL COMMENT '商品 SPU ID',
`sku_id` BIGINT NOT NULL COMMENT 'SKU ID',
`quantity` INT NOT NULL COMMENT '抢购数量',
`seckill_price` DECIMAL(10,2) NOT NULL COMMENT '成交单价',
`order_id` BIGINT DEFAULT NULL COMMENT '关联主订单 ID支付/取消后回填)',
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '状态0-待支付 1-已支付 2-已取消 3-已退款',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '抢购时间',
`pay_time` DATETIME DEFAULT NULL COMMENT '支付时间',
PRIMARY KEY (`id`),
-- 唯一索引:防止同一用户在同一活动中对同一商品重复抢购
UNIQUE KEY `uk_user_activity_sku` (`user_id`, `activity_id`, `sku_id`),
KEY `idx_order_id` (`order_id`),
KEY `idx_activity_id` (`activity_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_status` (`status`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='抢购成功记录表';
-- ============================================================
-- ㉑ 文件上传记录
-- ============================================================
DROP TABLE IF EXISTS `upload_file`;
CREATE TABLE `upload_file` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键 ID',
`name` VARCHAR(255) NOT NULL COMMENT '原始文件名',
`path` VARCHAR(255) NOT NULL COMMENT '存储路径(相对 uploads/',
`url` VARCHAR(255) NOT NULL COMMENT '访问 URL',
`size` BIGINT NOT NULL DEFAULT 0 COMMENT '文件大小(字节)',
`content_type` VARCHAR(100) DEFAULT NULL COMMENT 'MIME 类型',
`storage_type` VARCHAR(20) NOT NULL DEFAULT 'local' COMMENT '存储类型local / qiniu / aliyun / tencent / minio',
`biz_type` VARCHAR(50) DEFAULT NULL COMMENT '业务类型avatar / product / banner / chat',
`upload_by` BIGINT DEFAULT NULL COMMENT '上传人(用户/管理员 ID',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间',
PRIMARY KEY (`id`),
KEY `idx_upload_by` (`upload_by`),
KEY `idx_biz_type` (`biz_type`),
KEY `idx_create_time`(`create_time`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='文件上传记录表';
-- ============================================================
-- 完成
-- ============================================================
SELECT '✅ 数据库初始化完成,共 21 张表' AS message;