feat: 删除JSP视图层,完善评价和通知系统,新增拼团模块

- 删除所有 JSP 页面(20个文件),前端完全迁移至 Vue 3 SPA
- 完善评价系统:ReviewDialog 组件、用户评价历史页、评价状态检查API
- 新增通知系统:Notification 实体/仓库/服务/控制器,NotificationCenter 接入真实API
- 新增拼团模块:GroupBuying 全套后端和前端页面
- 修复 review check API 参数双重包装导致请求格式错误
- 修复通知 API 路径缺少 /api 前缀和响应格式处理
- MessageListenerService 集成 NotificationService 创建持久化通知

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-14 16:40:26 +08:00
parent b684ea38d4
commit c4582655d9
115 changed files with 5968 additions and 12623 deletions

View File

@@ -2,6 +2,8 @@ server:
port: 8080
servlet:
context-path: /
session:
timeout: 30m
spring:
application:

View File

@@ -0,0 +1,32 @@
-- 拼团库存扣减Lua脚本
-- 功能:原子性地检查库存并扣减,防止超卖
-- 参数KEYS[1] = 库存key, ARGV[1] = 扣减数量
-- 返回值:成功返回剩余库存,失败返回负数
local stock_key = KEYS[1]
local quantity_str = ARGV[1]
local quantity = tonumber(quantity_str)
if quantity == nil or quantity <= 0 then
return -3
end
local current_stock = redis.call('GET', stock_key)
if current_stock == false then
return -1
end
local current_stock_num = tonumber(current_stock)
if current_stock_num == nil then
return -1
end
if current_stock_num < quantity then
return -2
end
local remaining_stock = redis.call('DECRBY', stock_key, quantity)
return remaining_stock

View File

@@ -1,22 +1,17 @@
-- 演示账号快速创建脚本
-- 密码都是明文对应的值demo1/demo2/admin的密码分别是123456/123456/admin123
-- 演示账号初始化脚本
-- 账号demo1 / 123456demo2 / 123456admin / admin123
USE flash_sale_db;
-- 插入演示用户(密码已加密)
INSERT INTO users (username, password, email, phone, role, status, created_at, updated_at)
VALUES ('demo1', '$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2uheWG/igi.', 'demo1@example.com', '13800138001', 'USER', 1,
NOW(), NOW()),
('demo2', '$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2uheWG/igi.', 'demo2@example.com', '13800138002', 'USER', 1,
NOW(), NOW()),
('admin', '$2a$10$N.zmdr9k7uOkXUJEkKWZaOh.3VQ8nl83hq8/Qhx6.5PkZKJKJKJKJ', 'admin@example.com', '13800138000', 'ADMIN', 1,
NOW(), NOW())
ON DUPLICATE KEY UPDATE username = VALUES(username),
email = VALUES(email),
phone = VALUES(phone),
updated_at = NOW();
-- 验证插入结果
SELECT id, username, email, phone, status, created_at
FROM users
WHERE username IN ('demo1', 'demo2', 'admin');
INSERT INTO users (username, password, email, phone, avatar, role, status, created_at, updated_at)
VALUES
('demo1', '$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2uheWG/igi.', 'demo1@example.com', '13800138001', '', 'USER', 1, NOW(), NOW()),
('demo2', '$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2uheWG/igi.', 'demo2@example.com', '13800138002', '', 'USER', 1, NOW(), NOW()),
('admin', '$2a$10$DOwVJZHH.5PkZKJKJKJKJOh.3VQ8nl83hq8/Qhx6.5PkZKJKJKJKJ', 'admin@example.com', '13800138000', '', 'ADMIN', 1, NOW(), NOW())
ON DUPLICATE KEY UPDATE
email = VALUES(email),
phone = VALUES(phone),
avatar = VALUES(avatar),
role = VALUES(role),
status = VALUES(status),
updated_at = NOW();

View File

@@ -1,33 +0,0 @@
-- 修复演示账号密码问题
-- 使用正确的BCrypt加密密码
USE flash_sale_db;
-- 删除现有的演示用户(如果存在)
DELETE
FROM users
WHERE username IN ('demo1', 'demo2', 'admin');
-- 插入正确的演示用户
-- demo1/demo2 密码: 123456
-- admin 密码: admin123
INSERT INTO users (username, password, email, phone, role, status, created_at, updated_at)
VALUES ('demo1', '$2a$10$N.zmdr9k7uOkXUJEkKWZaOh.3VQ8nl83hq8/Qhx6.5PkZKJKJKJKJ', 'demo1@example.com', '13800138001', 'USER', 1,
NOW(), NOW()),
('demo2', '$2a$10$N.zmdr9k7uOkXUJEkKWZaOh.3VQ8nl83hq8/Qhx6.5PkZKJKJKJKJ', 'demo2@example.com', '13800138002', 'USER', 1,
NOW(), NOW()),
('admin', '$2a$10$DOwVJZHH.5PkZKJKJKJKJOh.3VQ8nl83hq8/Qhx6.5PkZKJKJKJKJ', 'admin@example.com', '13800138000', 'ADMIN', 1,
NOW(), NOW());
-- 验证插入结果
SELECT id, username, email, phone, status, created_at
FROM users
WHERE username IN ('demo1', 'demo2', 'admin');
-- 显示密码提示
SELECT '演示账号密码信息:' as info;
SELECT 'demo1 / 123456' as account_info
UNION ALL
SELECT 'demo2 / 123456'
UNION ALL
SELECT 'admin / admin123';

View File

@@ -1,31 +1,32 @@
-- 秒杀系统数据库结构
-- 创建数据库和所有必要的表
-- 秒杀系统数据库结构
-- 说明:本脚本只负责数据库对象定义,不包含演示数据。
CREATE DATABASE IF NOT EXISTS flash_sale_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- 创建数据库
CREATE DATABASE IF NOT EXISTS flash_sale_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE flash_sale_db;
-- ================================
-- 1. 用户表
-- ================================
CREATE TABLE IF NOT EXISTS users
(
CREATE TABLE IF NOT EXISTS users (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
password VARCHAR(255) NOT NULL COMMENT '密码(加密)',
email VARCHAR(100) COMMENT '邮箱',
phone VARCHAR(20) COMMENT '手机号',
avatar VARCHAR(500) COMMENT '头像',
role VARCHAR(20) DEFAULT 'USER' COMMENT '角色ADMIN/USER',
status TINYINT DEFAULT 1 COMMENT '状态1-正常0-禁用',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_username (username),
INDEX idx_email (email),
INDEX idx_phone (phone),
INDEX idx_status (status),
INDEX idx_created_at (created_at)
role VARCHAR(20) NOT NULL DEFAULT 'USER' COMMENT '角色ADMIN/USER',
status TINYINT NOT NULL DEFAULT 1 COMMENT '状态1-正常0-禁用',
last_login TIMESTAMP NULL COMMENT '最后登录时间',
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_users_username (username),
INDEX idx_users_email (email),
INDEX idx_users_phone (phone),
INDEX idx_users_status (status),
INDEX idx_users_created_at (created_at)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_unicode_ci COMMENT ='用户表';
@@ -33,8 +34,7 @@ CREATE TABLE IF NOT EXISTS users
-- ================================
-- 2. 商品表
-- ================================
CREATE TABLE IF NOT EXISTS products
(
CREATE TABLE IF NOT EXISTS products (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '商品ID',
name VARCHAR(200) NOT NULL COMMENT '商品名称',
description TEXT COMMENT '商品描述',
@@ -42,15 +42,15 @@ CREATE TABLE IF NOT EXISTS products
category VARCHAR(100) COMMENT '商品分类',
stock INT NOT NULL DEFAULT 0 COMMENT '库存数量',
image_url VARCHAR(500) COMMENT '商品图片URL',
status TINYINT DEFAULT 1 COMMENT '状态1-上架0-下架',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_name (name),
INDEX idx_price (price),
INDEX idx_stock (stock),
INDEX idx_status (status),
INDEX idx_created_at (created_at)
status TINYINT NOT NULL DEFAULT 1 COMMENT '状态1-上架0-下架',
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_products_name (name),
INDEX idx_products_category (category),
INDEX idx_products_price (price),
INDEX idx_products_stock (stock),
INDEX idx_products_status (status),
INDEX idx_products_created_at (created_at)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_unicode_ci COMMENT ='商品表';
@@ -58,42 +58,41 @@ CREATE TABLE IF NOT EXISTS products
-- ================================
-- 3. 秒杀活动表
-- ================================
CREATE TABLE IF NOT EXISTS flash_sales
(
CREATE TABLE IF NOT EXISTS flash_sales (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '秒杀活动ID',
product_id BIGINT NOT NULL COMMENT '商品ID',
flash_price DECIMAL(10, 2) NOT NULL COMMENT '秒杀价格',
flash_stock INT NOT NULL COMMENT '秒杀库存',
start_time TIMESTAMP NOT NULL COMMENT '开始时间',
end_time TIMESTAMP NOT NULL COMMENT '结束时间',
status TINYINT DEFAULT 1 COMMENT '状态1-未开始2-进行中3-已结束',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
FOREIGN KEY (product_id) REFERENCES products (id) ON DELETE CASCADE,
INDEX idx_product_id (product_id),
INDEX idx_start_time (start_time),
INDEX idx_end_time (end_time),
INDEX idx_status (status),
INDEX idx_created_at (created_at)
status TINYINT NOT NULL DEFAULT 1 COMMENT '状态1-未开始2-进行中3-已结束',
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
CONSTRAINT fk_flash_sales_product FOREIGN KEY (product_id) REFERENCES products (id) ON DELETE CASCADE,
INDEX idx_flash_sales_product_id (product_id),
INDEX idx_flash_sales_start_time (start_time),
INDEX idx_flash_sales_end_time (end_time),
INDEX idx_flash_sales_status (status),
INDEX idx_flash_sales_created_at (created_at)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_unicode_ci COMMENT ='秒杀活动表';
-- ================================
-- 4. 订单表
-- 4. 订单
-- ================================
CREATE TABLE IF NOT EXISTS orders
(
CREATE TABLE IF NOT EXISTS orders (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '订单ID',
order_no VARCHAR(64) NOT NULL UNIQUE COMMENT '订单号',
group_no VARCHAR(64) COMMENT '聚合订单号',
group_no VARCHAR(64) COMMENT '聚合订单号(兼容旧数据)',
user_id BIGINT NOT NULL COMMENT '用户ID',
product_id BIGINT NOT NULL COMMENT '商品ID',
quantity INT NOT NULL DEFAULT 1 COMMENT '购买数量',
total_price DECIMAL(10, 2) NOT NULL COMMENT '总价',
status TINYINT DEFAULT 1 COMMENT '状态1-待支付2-已支付3-已发货4-已完成5-已取消',
order_type TINYINT DEFAULT 1 COMMENT '订单类型1-普通订单2-秒杀订单',
product_id BIGINT NOT NULL COMMENT '兼容字段:主商品ID',
flash_sale_id BIGINT COMMENT '秒杀活动ID',
group_buying_group_id BIGINT COMMENT '拼团团组ID',
quantity INT NOT NULL DEFAULT 1 COMMENT '兼容字段:总购买数量',
total_price DECIMAL(10, 2) NOT NULL COMMENT '订单总价',
status TINYINT NOT NULL DEFAULT 1 COMMENT '状态1-待支付2-已支付3-已发货4-已完成5-已取消',
order_type TINYINT NOT NULL DEFAULT 1 COMMENT '订单类型1-普通订单2-秒杀订单',
receiver_name VARCHAR(100) COMMENT '收货人',
receiver_phone VARCHAR(20) COMMENT '收货手机号',
receiver_address VARCHAR(255) COMMENT '收货地址',
@@ -102,30 +101,26 @@ CREATE TABLE IF NOT EXISTS orders
paid_at TIMESTAMP NULL COMMENT '支付时间',
shipped_at TIMESTAMP NULL COMMENT '发货时间',
completed_at TIMESTAMP NULL COMMENT '完成时间',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE,
FOREIGN KEY (product_id) REFERENCES products (id) ON DELETE CASCADE,
INDEX idx_user_id (user_id),
INDEX idx_product_id (product_id),
INDEX idx_status (status),
INDEX idx_order_type (order_type),
INDEX idx_created_at (created_at),
INDEX idx_user_product (user_id, product_id)
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
CONSTRAINT fk_orders_user FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE,
CONSTRAINT fk_orders_product FOREIGN KEY (product_id) REFERENCES products (id) ON DELETE CASCADE,
INDEX idx_orders_order_no (order_no),
INDEX idx_orders_group_no (group_no),
INDEX idx_orders_user_id (user_id),
INDEX idx_orders_product_id (product_id),
INDEX idx_orders_flash_sale_id (flash_sale_id),
INDEX idx_orders_status (status),
INDEX idx_orders_order_type (order_type),
INDEX idx_orders_created_at (created_at)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_unicode_ci COMMENT ='订单表';
COLLATE = utf8mb4_unicode_ci COMMENT ='订单';
-- ================================
-- 5. 订单明细表
-- ================================
CREATE TABLE IF NOT EXISTS order_items
(
CREATE TABLE IF NOT EXISTS order_items (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '明细ID',
order_id BIGINT NOT NULL COMMENT '主订单ID',
product_id BIGINT NOT NULL COMMENT '商品ID',
@@ -134,10 +129,9 @@ CREATE TABLE IF NOT EXISTS order_items
price DECIMAL(10, 2) NOT NULL COMMENT '下单单价',
quantity INT NOT NULL COMMENT '购买数量',
subtotal DECIMAL(10, 2) NOT NULL COMMENT '小计',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
FOREIGN KEY (order_id) REFERENCES orders (id) ON DELETE CASCADE,
FOREIGN KEY (product_id) REFERENCES products (id) ON DELETE CASCADE,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
CONSTRAINT fk_order_items_order FOREIGN KEY (order_id) REFERENCES orders (id) ON DELETE CASCADE,
CONSTRAINT fk_order_items_product FOREIGN KEY (product_id) REFERENCES products (id) ON DELETE CASCADE,
INDEX idx_order_items_order_id (order_id),
INDEX idx_order_items_product_id (product_id)
) ENGINE = InnoDB
@@ -147,8 +141,7 @@ CREATE TABLE IF NOT EXISTS order_items
-- ================================
-- 6. 用户地址表
-- ================================
CREATE TABLE IF NOT EXISTS user_addresses
(
CREATE TABLE IF NOT EXISTS user_addresses (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '地址ID',
user_id BIGINT NOT NULL COMMENT '用户ID',
name VARCHAR(100) NOT NULL COMMENT '收货人',
@@ -157,13 +150,12 @@ CREATE TABLE IF NOT EXISTS user_addresses
city VARCHAR(50) COMMENT '城市',
district VARCHAR(50) COMMENT '区县',
address VARCHAR(255) NOT NULL COMMENT '详细地址',
is_default TINYINT DEFAULT 0 COMMENT '是否默认地址',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE,
INDEX idx_address_user_id (user_id),
INDEX idx_address_default (is_default)
is_default TINYINT NOT NULL DEFAULT 0 COMMENT '是否默认地址',
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
CONSTRAINT fk_user_addresses_user FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE,
INDEX idx_user_addresses_user_id (user_id),
INDEX idx_user_addresses_default (is_default)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_unicode_ci COMMENT ='用户地址表';
@@ -171,61 +163,127 @@ CREATE TABLE IF NOT EXISTS user_addresses
-- ================================
-- 7. 商品评价表
-- ================================
CREATE TABLE IF NOT EXISTS product_reviews
(
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '评价ID',
product_id BIGINT NOT NULL COMMENT '商品ID',
user_id BIGINT NOT NULL COMMENT '用户ID',
order_id BIGINT NOT NULL COMMENT '订单ID',
rating TINYINT NOT NULL DEFAULT 5 COMMENT '',
content TEXT NOT NULL COMMENT '评价内容',
status TINYINT NOT NULL DEFAULT 1 COMMENT '状态1-显示0-隐藏',
CREATE TABLE IF NOT EXISTS product_reviews (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '评价ID',
product_id BIGINT NOT NULL COMMENT '商品ID',
user_id BIGINT NOT NULL COMMENT '用户ID',
order_id BIGINT NOT NULL COMMENT '订单ID',
rating TINYINT NOT NULL DEFAULT 5 COMMENT '评分',
content TEXT NOT NULL COMMENT '价内容',
status TINYINT NOT NULL DEFAULT 1 COMMENT '状态1-显示0-隐藏',
admin_reply TEXT COMMENT '管理员回复',
replied_at TIMESTAMP NULL COMMENT '回复时间',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
FOREIGN KEY (product_id) REFERENCES products (id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE,
FOREIGN KEY (order_id) REFERENCES orders (id) ON DELETE CASCADE,
INDEX idx_review_product_id (product_id),
INDEX idx_review_user_id (user_id),
UNIQUE KEY uk_review_order_user (order_id, user_id)
replied_at TIMESTAMP NULL COMMENT '回复时间',
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
CONSTRAINT fk_product_reviews_product FOREIGN KEY (product_id) REFERENCES products (id) ON DELETE CASCADE,
CONSTRAINT fk_product_reviews_user FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE,
CONSTRAINT fk_product_reviews_order FOREIGN KEY (order_id) REFERENCES orders (id) ON DELETE CASCADE,
UNIQUE KEY uk_review_order_user_product (order_id, user_id, product_id),
INDEX idx_product_reviews_product_id (product_id),
INDEX idx_product_reviews_user_id (user_id),
INDEX idx_product_reviews_status (status)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_unicode_ci COMMENT ='商品评价表';
-- ================================
-- 8. 用户收藏表
-- ================================
CREATE TABLE IF NOT EXISTS user_favorites
(
CREATE TABLE IF NOT EXISTS user_favorites (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '收藏ID',
user_id BIGINT NOT NULL COMMENT '用户ID',
product_id BIGINT NOT NULL COMMENT '商品ID',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE,
FOREIGN KEY (product_id) REFERENCES products (id) ON DELETE CASCADE,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
CONSTRAINT fk_user_favorites_user FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE,
CONSTRAINT fk_user_favorites_product FOREIGN KEY (product_id) REFERENCES products (id) ON DELETE CASCADE,
UNIQUE KEY uk_favorite_user_product (user_id, product_id),
INDEX idx_favorite_user_id (user_id),
INDEX idx_favorite_product_id (product_id)
INDEX idx_user_favorites_user_id (user_id),
INDEX idx_user_favorites_product_id (product_id)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_unicode_ci COMMENT ='用户收藏表';
-- ================================
-- 9. 创建视图(可选)
-- 9. 视图
-- ================================
-- ================================
-- 9. 拼团活动表
-- ================================
CREATE TABLE IF NOT EXISTS group_buying (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '拼团活动ID',
product_id BIGINT NOT NULL COMMENT '商品ID',
group_price DECIMAL(10, 2) NOT NULL COMMENT '拼团价格',
required_members INT NOT NULL DEFAULT 2 COMMENT '成团人数',
duration_minutes INT NOT NULL DEFAULT 1440 COMMENT '拼团有效期(分钟)',
total_stock INT NOT NULL COMMENT '总库存',
remaining_stock INT NOT NULL COMMENT '剩余库存',
max_per_user INT NOT NULL DEFAULT 1 COMMENT '每人限购',
status TINYINT NOT NULL DEFAULT 0 COMMENT '状态0-草稿 1-未开始 2-进行中 3-已结束',
start_time DATETIME NOT NULL COMMENT '开始时间',
end_time DATETIME NOT NULL COMMENT '结束时间',
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
CONSTRAINT fk_group_buying_product FOREIGN KEY (product_id) REFERENCES products (id) ON DELETE CASCADE,
INDEX idx_group_buying_product_id (product_id),
INDEX idx_group_buying_status (status),
INDEX idx_group_buying_start_time (start_time),
INDEX idx_group_buying_end_time (end_time)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_unicode_ci COMMENT ='拼团活动表';
-- 活跃秒杀活动视图
-- ================================
-- 10. 拼团团组表
-- ================================
CREATE TABLE IF NOT EXISTS group_buying_group (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '团组ID',
group_no VARCHAR(64) NOT NULL UNIQUE COMMENT '团号',
group_buying_id BIGINT NOT NULL COMMENT '关联拼团活动',
leader_user_id BIGINT NOT NULL COMMENT '团长用户ID',
required_members INT NOT NULL COMMENT '需要人数',
current_members INT NOT NULL DEFAULT 1 COMMENT '当前人数',
status TINYINT NOT NULL DEFAULT 1 COMMENT '状态1-拼团中 2-已成团 3-已失败(超时)',
expire_time DATETIME NOT NULL COMMENT '过期时间',
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
completed_at TIMESTAMP NULL COMMENT '成团时间',
CONSTRAINT fk_gbg_group_buying FOREIGN KEY (group_buying_id) REFERENCES group_buying (id) ON DELETE CASCADE,
CONSTRAINT fk_gbg_leader FOREIGN KEY (leader_user_id) REFERENCES users (id) ON DELETE CASCADE,
INDEX idx_gbg_group_no (group_no),
INDEX idx_gbg_group_buying_id (group_buying_id),
INDEX idx_gbg_status (status),
INDEX idx_gbg_expire_time (expire_time)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_unicode_ci COMMENT ='拼团团组表';
-- ================================
-- 11. 拼团成员表
-- ================================
CREATE TABLE IF NOT EXISTS group_buying_member (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '成员ID',
group_id BIGINT NOT NULL COMMENT '关联团组',
user_id BIGINT NOT NULL COMMENT '用户ID',
order_id BIGINT COMMENT '关联订单',
status TINYINT NOT NULL DEFAULT 1 COMMENT '状态1-已加入 2-已成团 3-已退出',
joined_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '加入时间',
CONSTRAINT fk_gbm_group FOREIGN KEY (group_id) REFERENCES group_buying_group (id) ON DELETE CASCADE,
CONSTRAINT fk_gbm_user FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE,
UNIQUE KEY uk_group_user (group_id, user_id),
INDEX idx_gbm_group_id (group_id),
INDEX idx_gbm_user_id (user_id),
INDEX idx_gbm_order_id (order_id)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_unicode_ci COMMENT ='拼团成员表';
-- ================================
-- 12. 视图
-- ================================
CREATE OR REPLACE VIEW active_flash_sales AS
SELECT fs.id,
fs.product_id,
p.name as product_name,
p.price as original_price,
p.name AS product_name,
p.price AS original_price,
fs.flash_price,
fs.flash_stock,
fs.start_time,
@@ -233,35 +291,20 @@ SELECT fs.id,
fs.status,
p.image_url
FROM flash_sales fs
JOIN products p ON fs.product_id = p.id
JOIN products p ON fs.product_id = p.id
WHERE fs.status = 2
AND fs.start_time <= NOW()
AND fs.end_time > NOW()
AND p.status = 1;
-- 订单统计视图
CREATE OR REPLACE VIEW order_statistics AS
SELECT DATE(created_at) as order_date,
COUNT(*) as total_orders,
SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) as pending_orders,
SUM(CASE WHEN status = 2 THEN 1 ELSE 0 END) as paid_orders,
SUM(CASE WHEN status = 4 THEN 1 ELSE 0 END) as completed_orders,
SUM(CASE WHEN order_type = 2 THEN 1 ELSE 0 END) as flash_sale_orders,
SUM(total_price) as total_amount
SELECT DATE(created_at) AS order_date,
COUNT(*) AS total_orders,
SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) AS pending_orders,
SUM(CASE WHEN status = 2 THEN 1 ELSE 0 END) AS paid_orders,
SUM(CASE WHEN status = 4 THEN 1 ELSE 0 END) AS completed_orders,
SUM(CASE WHEN order_type = 2 THEN 1 ELSE 0 END) AS flash_sale_orders,
SUM(total_price) AS total_amount
FROM orders
GROUP BY DATE(created_at)
ORDER BY order_date DESC;
-- ================================
-- 6. 显示表结构
-- ================================
SHOW TABLES;
-- 显示表结构信息
SELECT TABLE_NAME as '表名',
TABLE_COMMENT as '表注释',
TABLE_ROWS as '估计行数'
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'flash_sale_db'
AND TABLE_TYPE = 'BASE TABLE'
ORDER BY TABLE_NAME;

View File

@@ -1,161 +1,126 @@
-- 秒杀系统测试数据SQL脚本
-- 包含演示账号、测试商品、秒杀活动等数据
-- 测试业务数据初始化脚本
-- 依赖:请先执行 schema.sql 和 demo-users.sql
-- 创建数据库(如果不存在)
CREATE DATABASE IF NOT EXISTS flash_sale_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE flash_sale_db;
-- 清理现有数据(谨慎使用)
-- DELETE FROM orders WHERE id > 0;
-- DELETE FROM flash_sales WHERE id > 0;
-- DELETE FROM products WHERE id > 0;
-- DELETE FROM users WHERE id > 0;
-- 重置自增ID
-- ALTER TABLE users AUTO_INCREMENT = 1;
-- ALTER TABLE products AUTO_INCREMENT = 1;
-- ALTER TABLE flash_sales AUTO_INCREMENT = 1;
-- ALTER TABLE orders AUTO_INCREMENT = 1;
SET FOREIGN_KEY_CHECKS = 0;
DELETE FROM user_favorites;
DELETE FROM product_reviews;
DELETE FROM user_addresses;
DELETE FROM order_items;
DELETE FROM orders;
DELETE FROM flash_sales;
DELETE FROM products;
DELETE FROM users WHERE username LIKE 'testuser%';
ALTER TABLE products AUTO_INCREMENT = 1;
ALTER TABLE flash_sales AUTO_INCREMENT = 1;
ALTER TABLE orders AUTO_INCREMENT = 1;
ALTER TABLE order_items AUTO_INCREMENT = 1;
ALTER TABLE user_addresses AUTO_INCREMENT = 1;
ALTER TABLE product_reviews AUTO_INCREMENT = 1;
ALTER TABLE user_favorites AUTO_INCREMENT = 1;
SET FOREIGN_KEY_CHECKS = 1;
-- ================================
-- 1. 插入测试用户数据
-- 1. 测试用户
-- ================================
INSERT INTO users (username, password, email, phone, role, status, created_at, updated_at)
INSERT INTO users (username, password, email, phone, avatar, role, status, created_at, updated_at)
VALUES
-- 演示账号(密码都是明文,实际应用中应该加密)
('demo1', '$2a$10$N.zmdr9k7uOkXUJEkKWZaOh.3VQ8nl83hq8/Qhx6.5PkZKJKJKJKJ', 'demo1@example.com', '13800138001', 'USER', 1, NOW(),
NOW()),
('demo2', '$2a$10$N.zmdr9k7uOkXUJEkKWZaOh.3VQ8nl83hq8/Qhx6.5PkZKJKJKJKJ', 'demo2@example.com', '13800138002', 'USER', 1, NOW(),
NOW()),
('admin', '$2a$10$N.zmdr9k7uOkXUJEkKWZaOh.3VQ8nl83hq8/Qhx6.5PkZKJKJKJKJ', 'admin@example.com', '13800138000', 'ADMIN', 1, NOW(),
NOW()),
-- 普通测试用户
('testuser1', '$2a$10$N.zmdr9k7uOkXUJEkKWZaOh.3VQ8nl83hq8/Qhx6.5PkZKJKJKJKJ', 'test1@example.com', '13800138003', 'USER', 1,
NOW(), NOW()),
('testuser2', '$2a$10$N.zmdr9k7uOkXUJEkKWZaOh.3VQ8nl83hq8/Qhx6.5PkZKJKJKJKJ', 'test2@example.com', '13800138004', 'USER', 1,
NOW(), NOW()),
('testuser3', '$2a$10$N.zmdr9k7uOkXUJEkKWZaOh.3VQ8nl83hq8/Qhx6.5PkZKJKJKJKJ', 'test3@example.com', '13800138005', 'USER', 1,
NOW(), NOW()),
('testuser4', '$2a$10$N.zmdr9k7uOkXUJEkKWZaOh.3VQ8nl83hq8/Qhx6.5PkZKJKJKJKJ', 'test4@example.com', '13800138006', 'USER', 1,
NOW(), NOW()),
('testuser5', '$2a$10$N.zmdr9k7uOkXUJEkKWZaOh.3VQ8nl83hq8/Qhx6.5PkZKJKJKJKJ', 'test5@example.com', '13800138007', 'USER', 1,
NOW(), NOW());
('testuser1', '$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2uheWG/igi.', 'test1@example.com', '13800138003', '', 'USER', 1, NOW(), NOW()),
('testuser2', '$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2uheWG/igi.', 'test2@example.com', '13800138004', '', 'USER', 1, NOW(), NOW()),
('testuser3', '$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2uheWG/igi.', 'test3@example.com', '13800138005', '', 'USER', 1, NOW(), NOW())
ON DUPLICATE KEY UPDATE
email = VALUES(email),
phone = VALUES(phone),
updated_at = NOW();
-- ================================
-- 2. 插入测试商品数据
-- 2. 商品
-- ================================
INSERT INTO products (name, description, price, category, stock, image_url, status, created_at, updated_at)
VALUES
-- 电子产品类
('iPhone 15 Pro Max', '苹果最新旗舰手机A17 Pro芯片钛金属设计', 9999.00, '电子产品', 100, '/images/iphone15.jpg', 1, NOW(), NOW()),
('MacBook Pro 16英寸', 'M3 Max芯片36GB内存1TB存储', 25999.00, '电子产品', 50, '/images/macbook.jpg', 1, NOW(), NOW()),
('iPad Air', '10.9英寸液晶显示屏M1芯片', 4399.00, '电子产品', 80, '/images/ipad.jpg', 1, NOW(), NOW()),
('AirPods Pro 2', '主动降噪无线耳机,空间音频', 1899.00, '电子产品', 200, '/images/airpods.jpg', 1, NOW(), NOW()),
('Apple Watch Series 9', '健康监测GPS+蜂窝网络', 3199.00, '子产品', 150, '/images/watch.jpg', 1, NOW(), NOW()),
-- 家电类
('小米电视 65英寸', '4K超高清120Hz刷新率', 2999.00, '家电', 60, '/images/tv.jpg', 1, NOW(), NOW()),
('戴森吸尘器 V15', '激光显微尘,强劲吸力', 4690.00, '家电', 40, '/images/dyson.jpg', 1, NOW(), NOW()),
('美的空调 1.5匹', '变频节能,静音运行', 2599.00, '家电', 80, '/images/airconditioner.jpg', 1, NOW(), NOW()),
-- 服装类
('Nike Air Jordan 1', '经典篮球鞋,限量版配色', 1299.00, '服饰鞋包', 120, '/images/jordan.jpg', 1, NOW(), NOW()),
('Adidas Ultra Boost', '缓震跑鞋Boost中底', 1599.00, '服饰鞋包', 100, '/images/ultraboost.jpg', 1, NOW(), NOW()),
-- 图书类
('深入理解Java虚拟机', 'JVM原理与实践第3版', 89.00, '图书音像', 500, '/images/jvm-book.jpg', 1, NOW(), NOW()),
('Redis设计与实现', 'Redis内部机制详解', 79.00, '图书音像', 300, '/images/redis-book.jpg', 1, NOW(), NOW()),
-- 食品类
('茅台酒 53度 500ml', '国酒茅台,收藏佳品', 2680.00, '食品饮料', 30, '/images/maotai.jpg', 1, NOW(), NOW()),
('五常大米 10kg', '东北优质大米,香甜可口', 168.00, '食品饮料', 200, '/images/rice.jpg', 1, NOW(), NOW()),
-- 美妆类
('SK-II神仙水 230ml', '护肤精华,改善肌肤', 1690.00, '美妆个护', 80, '/images/skii.jpg', 1, NOW(), NOW());
('iPhone 15 Pro Max', '苹果最新旗舰手机A17 Pro 芯片,钛金属设计。', 9999.00, '电子产品', 100, '/images/iphone15.svg', 1, NOW(), NOW()),
('MacBook Pro 16英寸', 'M3 Max 芯片36GB 内存1TB 存储。', 25999.00, '电子产品', 50, '/images/macbook.svg', 1, NOW(), NOW()),
('iPad Air', '10.9 英寸显示屏,轻薄便携。', 4399.00, '电子产品', 80, '/images/ipad.svg', 1, NOW(), NOW()),
('AirPods Pro 2', '主动降噪无线耳机。', 1899.00, '电子产品', 200, '/images/default-product.svg', 1, NOW(), NOW()),
('Apple Watch Series 9', '健康监测与运动记录。', 3199.00, '电子产品', 150, '/images/default-product.svg', 1, NOW(), NOW()),
('小米电视 65英寸', '4K 超高清120Hz 刷新率。', 2999.00, '', 60, '/images/default-product.svg', 1, NOW(), NOW()),
('戴森吸尘器 V15', '激光显微尘,强劲吸力。', 4690.00, '家电', 40, '/images/default-product.svg', 1, NOW(), NOW()),
('Nike Air Jordan 1', '经典篮球鞋,限量版配色。', 1299.00, '服饰鞋包', 120, '/images/default-product.svg', 1, NOW(), NOW()),
('深入理解Java虚拟机', 'JVM 原理与实践,第 3 版。', 89.00, '图书音像', 500, '/images/default-product.svg', 1, NOW(), NOW()),
('五常大米 10kg', '东北优质大米,香甜可口。', 168.00, '食品饮料', 200, '/images/default-product.svg', 1, NOW(), NOW());
-- ================================
-- 3. 插入秒杀活动数据
-- 3. 秒杀活动
-- ================================
INSERT INTO flash_sales (product_id, flash_price, flash_stock, start_time, end_time, status, created_at, updated_at)
VALUES
-- 正在进行的秒杀活动
(1, 7999.00, 20, DATE_SUB(NOW(), INTERVAL 10 MINUTE), DATE_ADD(NOW(), INTERVAL 2 HOUR), 2, NOW(), NOW()),
(4, 1299.00, 50, DATE_SUB(NOW(), INTERVAL 5 MINUTE), DATE_ADD(NOW(), INTERVAL 1 HOUR), 2, NOW(), NOW()),
(6, 1999.00, 15, DATE_SUB(NOW(), INTERVAL 1 MINUTE), DATE_ADD(NOW(), INTERVAL 3 HOUR), 2, NOW(), NOW()),
-- 即将开始的秒杀活动
(2, 19999.00, 10, DATE_ADD(NOW(), INTERVAL 30 MINUTE), DATE_ADD(NOW(), INTERVAL 4 HOUR), 1, NOW(), NOW()),
(9, 899.00, 30, DATE_ADD(NOW(), INTERVAL 1 HOUR), DATE_ADD(NOW(), INTERVAL 5 HOUR), 1, NOW(), NOW()),
(13, 1999.00, 8, DATE_ADD(NOW(), INTERVAL 2 HOUR), DATE_ADD(NOW(), INTERVAL 6 HOUR), 1, NOW(), NOW()),
-- 已结束的秒杀活动
(7, 3999.00, 10, DATE_SUB(NOW(), INTERVAL 2 HOUR), DATE_SUB(NOW(), INTERVAL 30 MINUTE), 3, NOW(), NOW()),
(11, 59.00, 100, DATE_SUB(NOW(), INTERVAL 1 DAY), DATE_SUB(NOW(), INTERVAL 22 HOUR), 3, NOW(), NOW());
(1, 7999.00, 20, DATE_SUB(NOW(), INTERVAL 10 MINUTE), DATE_ADD(NOW(), INTERVAL 2 HOUR), 2, NOW(), NOW()),
(4, 1299.00, 50, DATE_SUB(NOW(), INTERVAL 5 MINUTE), DATE_ADD(NOW(), INTERVAL 1 HOUR), 2, NOW(), NOW()),
(6, 1999.00, 15, DATE_SUB(NOW(), INTERVAL 1 MINUTE), DATE_ADD(NOW(), INTERVAL 3 HOUR), 2, NOW(), NOW()),
(2, 19999.00, 10, DATE_ADD(NOW(), INTERVAL 30 MINUTE), DATE_ADD(NOW(), INTERVAL 4 HOUR), 1, NOW(), NOW()),
(8, 899.00, 30, DATE_ADD(NOW(), INTERVAL 1 HOUR), DATE_ADD(NOW(), INTERVAL 5 HOUR), 1, NOW(), NOW()),
(9, 59.00, 100, DATE_SUB(NOW(), INTERVAL 1 DAY), DATE_SUB(NOW(), INTERVAL 22 HOUR), 3, NOW(), NOW());
-- ================================
-- 4. 插入测试订单数据
-- 4. 地址
-- ================================
INSERT INTO user_addresses (user_id, name, phone, province, city, district, address, is_default, created_at, updated_at)
SELECT id, '演示用户一', '13800138001', '上海市', '上海市', '浦东新区', '张江高科技园区 100 号', 1, NOW(), NOW() FROM users WHERE username = 'demo1'
UNION ALL
SELECT id, '演示用户二', '13800138002', '浙江省', '杭州市', '西湖区', '文三路 88 号', 1, NOW(), NOW() FROM users WHERE username = 'demo2'
UNION ALL
SELECT id, '测试用户一', '13800138003', '广东省', '深圳市', '南山区', '科技园科苑路 18 号', 1, NOW(), NOW() FROM users WHERE username = 'testuser1';
INSERT INTO orders (user_id, product_id, quantity, total_price, status, order_type, created_at, updated_at)
-- ================================
-- 5. 订单主表
-- ================================
INSERT INTO orders (
order_no, group_no, user_id, product_id, flash_sale_id, quantity, total_price, status, order_type,
receiver_name, receiver_phone, receiver_address, remark, payment_method,
paid_at, shipped_at, completed_at, created_at, updated_at
)
VALUES
-- demo1用户的订单
(1, 11, 1, 89.00, 4, 1, DATE_SUB(NOW(), INTERVAL 2 DAY), DATE_SUB(NOW(), INTERVAL 1 DAY)),
(1, 12, 1, 79.00, 2, 1, DATE_SUB(NOW(), INTERVAL 1 DAY), DATE_SUB(NOW(), INTERVAL 1 DAY)),
-- demo2用户的订单
(2, 14, 1, 168.00, 3, 1, DATE_SUB(NOW(), INTERVAL 3 HOUR), DATE_SUB(NOW(), INTERVAL 2 HOUR)),
(2, 7, 1, 3999.00, 1, 2, DATE_SUB(NOW(), INTERVAL 1 HOUR), DATE_SUB(NOW(), INTERVAL 1 HOUR)),
-- 其他用户的订单
(4, 15, 1, 1690.00, 2, 1, DATE_SUB(NOW(), INTERVAL 6 HOUR), DATE_SUB(NOW(), INTERVAL 5 HOUR)),
(5, 10, 1, 1599.00, 4, 1, DATE_SUB(NOW(), INTERVAL 12 HOUR), DATE_SUB(NOW(), INTERVAL 10 HOUR)),
(6, 8, 1, 2599.00, 3, 1, DATE_SUB(NOW(), INTERVAL 1 DAY), DATE_SUB(NOW(), INTERVAL 20 HOUR)),
(7, 5, 1, 3199.00, 2, 1, DATE_SUB(NOW(), INTERVAL 2 DAY), DATE_SUB(NOW(), INTERVAL 1 DAY));
('ORD202603110001', NULL, (SELECT id FROM users WHERE username = 'demo1'), 9, NULL, 1, 89.00, 4, 1, '演示用户一', '13800138001', '上海市 上海市 浦东新区 张江高科技园区 100 号', '已完成测试订单', 'ALIPAY', DATE_SUB(NOW(), INTERVAL 2 DAY), DATE_SUB(NOW(), INTERVAL 2 DAY), DATE_SUB(NOW(), INTERVAL 1 DAY), DATE_SUB(NOW(), INTERVAL 2 DAY), DATE_SUB(NOW(), INTERVAL 1 DAY)),
('ORD202603110002', NULL, (SELECT id FROM users WHERE username = 'demo1'), 4, NULL, 1, 1899.00, 2, 1, '演示用户一', '13800138001', '上海市 上海市 浦东新区 张江高科技园区 100 号', '待发货测试订单', 'WECHAT', DATE_SUB(NOW(), INTERVAL 1 DAY), NULL, NULL, DATE_SUB(NOW(), INTERVAL 1 DAY), DATE_SUB(NOW(), INTERVAL 1 DAY)),
('ORD202603110003', NULL, (SELECT id FROM users WHERE username = 'demo2'), 10, NULL, 1, 168.00, 3, 1, '演示用户二', '13800138002', '浙江省 杭州市 西湖区 文三路 88 号', '已发货测试订单', 'ONLINE', DATE_SUB(NOW(), INTERVAL 4 HOUR), DATE_SUB(NOW(), INTERVAL 2 HOUR), NULL, DATE_SUB(NOW(), INTERVAL 6 HOUR), DATE_SUB(NOW(), INTERVAL 2 HOUR)),
('ORD202603110004', NULL, (SELECT id FROM users WHERE username = 'demo2'), 4, 2, 1, 1299.00, 1, 2, '演示用户二', '13800138002', '浙江省 杭州市 西湖区 文三路 88 号', '秒杀待支付订单', NULL, NULL, NULL, NULL, DATE_SUB(NOW(), INTERVAL 1 HOUR), DATE_SUB(NOW(), INTERVAL 1 HOUR)),
('ORD202603110005', NULL, (SELECT id FROM users WHERE username = 'testuser1'), 1, NULL, 2, 11798.00, 2, 1, '测试用户一', '13800138003', '广东省 深圳市 南山区 科技园科苑路 18 号', '多商品主订单', 'ONLINE', DATE_SUB(NOW(), INTERVAL 5 HOUR), NULL, NULL, DATE_SUB(NOW(), INTERVAL 5 HOUR), DATE_SUB(NOW(), INTERVAL 5 HOUR));
-- ================================
-- 5. 查询验证数据
-- 6. 订单明细
-- ================================
-- 查看用户数据
SELECT 'Users:' as table_name;
SELECT id, username, email, phone, status, created_at
FROM users
ORDER BY id;
-- 查看商品数据
SELECT 'Products:' as table_name;
SELECT id, name, price, stock, status
FROM products
ORDER BY id
LIMIT 10;
-- 查看秒杀活动数据
SELECT 'Flash Sales:' as table_name;
SELECT fs.id, p.name as product_name, fs.flash_price, fs.flash_stock, fs.start_time, fs.end_time, fs.status
FROM flash_sales fs
JOIN products p ON fs.product_id = p.id
ORDER BY fs.id;
-- 查看订单数据
SELECT 'Orders:' as table_name;
SELECT o.id, u.username, p.name as product_name, o.quantity, o.total_price, o.status, o.order_type
FROM orders o
JOIN users u ON o.user_id = u.id
JOIN products p ON o.product_id = p.id
ORDER BY o.id;
INSERT INTO order_items (order_id, product_id, product_name, product_image_url, price, quantity, subtotal, created_at)
SELECT o.id, 9, '深入理解Java虚拟机', '/images/default-product.svg', 89.00, 1, 89.00, o.created_at FROM orders o WHERE o.order_no = 'ORD202603110001'
UNION ALL
SELECT o.id, 4, 'AirPods Pro 2', '/images/default-product.svg', 1899.00, 1, 1899.00, o.created_at FROM orders o WHERE o.order_no = 'ORD202603110002'
UNION ALL
SELECT o.id, 10, '五常大米 10kg', '/images/default-product.svg', 168.00, 1, 168.00, o.created_at FROM orders o WHERE o.order_no = 'ORD202603110003'
UNION ALL
SELECT o.id, 4, 'AirPods Pro 2', '/images/default-product.svg', 1299.00, 1, 1299.00, o.created_at FROM orders o WHERE o.order_no = 'ORD202603110004'
UNION ALL
SELECT o.id, 1, 'iPhone 15 Pro Max', '/images/iphone15.svg', 9999.00, 1, 9999.00, o.created_at FROM orders o WHERE o.order_no = 'ORD202603110005'
UNION ALL
SELECT o.id, 9, '深入理解Java虚拟机', '/images/default-product.svg', 89.00, 2, 178.00, o.created_at FROM orders o WHERE o.order_no = 'ORD202603110005'
UNION ALL
SELECT o.id, 10, '五常大米 10kg', '/images/default-product.svg', 168.00, 1, 168.00, o.created_at FROM orders o WHERE o.order_no = 'ORD202603110005'
UNION ALL
SELECT o.id, 4, 'AirPods Pro 2', '/images/default-product.svg', 1899.00, 1, 1899.00, o.created_at FROM orders o WHERE o.order_no = 'ORD202603110005';
-- ================================
-- 6. 统计信息
-- 7. 评价
-- ================================
INSERT INTO product_reviews (product_id, user_id, order_id, rating, content, status, admin_reply, replied_at, created_at, updated_at)
VALUES
(9, (SELECT id FROM users WHERE username = 'demo1'), (SELECT id FROM orders WHERE order_no = 'ORD202603110001'), 5, '内容很扎实,适合深入学习 JVM。', 1, '感谢支持,后续会持续补充相关图书。', NOW(), DATE_SUB(NOW(), INTERVAL 1 DAY), NOW()),
(4, (SELECT id FROM users WHERE username = 'demo1'), (SELECT id FROM orders WHERE order_no = 'ORD202603110002'), 4, '耳机效果不错,降噪很明显。', 1, NULL, NULL, DATE_SUB(NOW(), INTERVAL 12 HOUR), DATE_SUB(NOW(), INTERVAL 12 HOUR));
SELECT 'Statistics:' as info;
SELECT (SELECT COUNT(*) FROM users) as total_users,
(SELECT COUNT(*) FROM products) as total_products,
(SELECT COUNT(*) FROM flash_sales) as total_flash_sales,
(SELECT COUNT(*) FROM orders) as total_orders,
(SELECT COUNT(*) FROM flash_sales WHERE status = 2) as active_flash_sales,
(SELECT COUNT(*) FROM orders WHERE status = 1) as pending_orders;
-- ================================
-- 8. 收藏
-- ================================
INSERT INTO user_favorites (user_id, product_id, created_at)
VALUES
((SELECT id FROM users WHERE username = 'demo1'), 1, NOW()),
((SELECT id FROM users WHERE username = 'demo1'), 4, NOW()),
((SELECT id FROM users WHERE username = 'demo2'), 2, NOW()),
((SELECT id FROM users WHERE username = 'testuser1'), 9, NOW());

View File

@@ -1,42 +0,0 @@
-- 更新演示账号密码为BCrypt格式
-- 这些是使用BCryptPasswordEncoder生成的正确哈希值
USE flash_sale_db;
-- 删除现有演示用户(如果存在)
DELETE
FROM users
WHERE username IN ('demo1', 'demo2', 'admin');
-- 插入使用BCrypt加密的演示用户
-- demo1/demo2 密码: 123456 (BCrypt哈希)
-- admin 密码: admin123 (BCrypt哈希)
INSERT INTO users (username, password, email, phone, role, status, created_at, updated_at)
VALUES ('demo1', '$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2uheWG/igi.', 'demo1@example.com', '13800138001', 'USER', 1,
NOW(), NOW()),
('demo2', '$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2uheWG/igi.', 'demo2@example.com', '13800138002', 'USER', 1,
NOW(), NOW()),
('admin', '$2a$10$DOwVJZHH.5PkZKJKJKJKJOh.3VQ8nl83hq8/Qhx6.5PkZKJKJKJKJ', 'admin@example.com', '13800138000', 'ADMIN', 1,
NOW(), NOW());
-- 验证插入结果
SELECT id,
username,
email,
phone,
status,
SUBSTRING(password, 1, 30) as password_hash_preview,
created_at
FROM users
WHERE username IN ('demo1', 'demo2', 'admin')
ORDER BY username;
-- 显示账号信息
SELECT '=== 演示账号信息 ===' as info;
SELECT CONCAT(username, ' / ', CASE
WHEN username = 'admin' THEN 'admin123'
ELSE '123456'
END) as '用户名/密码'
FROM users
WHERE username IN ('demo1', 'demo2', 'admin')
ORDER BY username;