556 lines
41 KiB
SQL
556 lines
41 KiB
SQL
-- ============================================================
|
||
-- 零食商城 数据库初始化脚本
|
||
-- 适用 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 '父分类 ID,0 表示一级分类',
|
||
`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 '主键 ID(SPU)',
|
||
`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 '主键 ID(SKU)',
|
||
`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 '接待客服 ID,NULL=待分配',
|
||
`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;
|