1. 系统概述
超市销售管理系统是为中小型超市设计的信息化管理解决方案,旨在实现商品管理、销售处理、库存管理、会员管理等核心业务流程的信息化,提高超市运营效率和服务质量。
2. 系统功能需求
2.1 核心功能模块
功能模块 | 子功能 | 描述 |
---|---|---|
销售管理 | 商品销售 | 处理顾客购买商品的交易,支持会员折扣 |
销售退货 | 处理顾客退货业务 | |
销售查询 | 查询历史销售记录 | |
库存管理 | 商品管理 | 商品信息的增删改查 |
进货管理 | 处理商品进货业务 | |
库存查询 | 查询当前库存状态 | |
库存预警 | 低库存商品提醒 | |
会员管理 | 会员注册 | 新增会员信息 |
会员查询 | 查询会员信息和消费记录 | |
会员积分 | 管理会员积分和等级 | |
报表统计 | 销售统计 | 按时间、商品等维度统计销售情况 |
商品排行 | 热销商品排行 | |
会员消费 | 会员消费分析 |
2.2 用户角色及权限
角色 | 权限 |
---|---|
收银员 | 商品销售、销售退货、会员查询 |
库存管理员 | 商品管理、进货管理、库存查询 |
经理 | 全部功能,包括报表统计 |
3. 数据流图
3.1 顶层数据流图
3.2 销售处理数据流图
4. 行为流程图
4.1 销售流程
4.2 进货流程
5. 数据表结构
5.1 员工表
字段名 | 数据类型 | 长度 | 约束 | 描述 |
---|---|---|---|---|
员工ID | INT | - | PRIMARY KEY, AUTO_INCREMENT | 员工唯一标识 |
姓名 | VARCHAR | 20 | NOT NULL | 员工姓名 |
性别 | ENUM | - | NOT NULL | '男'或'女' |
电话 | VARCHAR | 20 | - | 联系电话 |
角色 | ENUM | - | NOT NULL | '收银员','库存管理员','经理' |
用户名 | VARCHAR | 20 | NOT NULL, UNIQUE | 登录用户名 |
密码 | VARCHAR | 32 | NOT NULL | MD5加密密码 |
5.2 供应商表
字段名 | 数据类型 | 长度 | 约束 | 描述 |
---|---|---|---|---|
供应商ID | INT | - | PRIMARY KEY, AUTO_INCREMENT | 供应商唯一标识 |
名称 | VARCHAR | 50 | NOT NULL | 供应商名称 |
联系人 | VARCHAR | 20 | - | 联系人姓名 |
联系电话 | VARCHAR | 20 | - | 联系电话 |
5.3 会员表
字段名 | 数据类型 | 长度 | 约束 | 描述 |
---|---|---|---|---|
会员ID | INT | - | PRIMARY KEY, AUTO_INCREMENT | 会员唯一标识 |
姓名 | VARCHAR | 20 | NOT NULL | 会员姓名 |
电话 | VARCHAR | 20 | NOT NULL | 会员电话 |
积分 | INT | - | DEFAULT 0 | 累计积分 |
消费总额 | DECIMAL | 10,2 | DEFAULT 0 | 累计消费金额 |
折扣率 | DECIMAL | 3,2 | DEFAULT 1.0, CHECK(0.5-1.0) | 会员折扣率 |
注册日期 | DATE | - | NOT NULL | 注册日期 |
5.4 商品表
字段名 | 数据类型 | 长度 | 约束 | 描述 |
---|---|---|---|---|
商品条码 | VARCHAR | 20 | PRIMARY KEY | 商品条形码 |
商品名称 | VARCHAR | 100 | NOT NULL | 商品名称 |
规格 | VARCHAR | 20 | - | 规格描述 |
零售价 | DECIMAL | 10,2 | NOT NULL | 销售价格 |
成本价 | DECIMAL | 10,2 | NOT NULL | 进货价格 |
库存数量 | INT | - | NOT NULL, DEFAULT 0 | 当前库存量 |
供应商ID | INT | - | FOREIGN KEY | 供应商ID |
5.5 销售单表
字段名 | 数据类型 | 长度 | 约束 | 描述 |
---|---|---|---|---|
销售单号 | INT | - | PRIMARY KEY, AUTO_INCREMENT | 销售单唯一标识 |
销售日期 | DATETIME | - | NOT NULL | 销售时间 |
员工ID | INT | - | NOT NULL, FOREIGN KEY | 操作员工 |
会员ID | INT | - | FOREIGN KEY | 会员ID(可为空) |
总金额 | DECIMAL | 10,2 | NOT NULL | 销售总金额 |
支付方式 | ENUM | - | NOT NULL | '现金','会员卡','微信','支付宝' |
5.6 销售明细表
字段名 | 数据类型 | 长度 | 约束 | 描述 |
---|---|---|---|---|
明细ID | INT | - | PRIMARY KEY, AUTO_INCREMENT | 明细唯一标识 |
销售单号 | INT | - | NOT NULL, FOREIGN KEY | 关联销售单 |
商品条码 | VARCHAR | 20 | NOT NULL, FOREIGN KEY | 商品条码 |
销售数量 | INT | - | NOT NULL | 销售数量 |
售价 | DECIMAL | 10,2 | NOT NULL | 实际售价 |
折扣率 | DECIMAL | 3,2 | DEFAULT 1.0 | 折扣率 |
5.7 进货单表
字段名 | 数据类型 | 长度 | 约束 | 描述 |
---|---|---|---|---|
进货单号 | INT | - | PRIMARY KEY, AUTO_INCREMENT | 进货单唯一标识 |
进货日期 | DATETIME | - | NOT NULL | 进货时间 |
员工ID | INT | - | NOT NULL, FOREIGN KEY | 操作员工 |
供应商ID | INT | - | NOT NULL, FOREIGN KEY | 供应商ID |
总金额 | DECIMAL | 10,2 | NOT NULL | 进货总金额 |
5.8 进货明细表
字段名 | 数据类型 | 长度 | 约束 | 描述 |
---|---|---|---|---|
明细ID | INT | - | PRIMARY KEY, AUTO_INCREMENT | 明细唯一标识 |
进货单号 | INT | - | NOT NULL, FOREIGN KEY | 关联进货单 |
商品条码 | VARCHAR | 20 | NOT NULL, FOREIGN KEY | 商品条码 |
进货数量 | INT | - | NOT NULL | 进货数量 |
进价 | DECIMAL | 10,2 | NOT NULL | 进货单价 |
6. 数据关系图
6.1 销售E-R关系图
6.2 库存 E-R关系图
6.3 会员E-R关系图
1. 员工表 (Employee)
- 一对一关系:无直接一对一关系。
- 一对多关系:
- 一个员工可以处理多个销售单(
销售单表
)。 - 一个员工可以处理多个进货单(
进货单表
)。
- 一个员工可以处理多个销售单(
2. 供应商表 (Supplier)
- 一对一关系:无直接一对一关系。
- 一对多关系:
- 一个供应商可以提供多种商品(
商品表
)。 - 一个供应商可以对应多个进货单(
进货单表
)。
- 一个供应商可以提供多种商品(
3. 会员表 (Member)
- 一对一关系:无直接一对一关系。
- 一对多关系:
- 一个会员可以进行多次购买,生成多个销售单(
销售单表
)。 - 一个会员可以发表多条评论(
评论表
)。 - 一个会员可以有多个互动行为(
互动表
),如点赞、收藏等。
- 一个会员可以进行多次购买,生成多个销售单(
- 多对多关系:
- 会员之间存在关注关系(
关注关系表
),一个会员可以关注多个其他会员,同时也可以被多个会员关注。
- 会员之间存在关注关系(
4. 商品表 (Product)
- 一对一关系:无直接一对一关系。
- 一对多关系:
- 一种商品可以出现在多个销售明细中(
销售明细表
)。 - 一种商品可以出现在多个进货明细中(
进货明细表
)。 - 一种商品可以有多个多媒体文件关联(
多媒体文件表
)。 - 一种商品可以收到多条评论(
评论表
)。 - 一种商品可以有多个互动行为(
互动表
),如被点赞、被收藏。
- 一种商品可以出现在多个销售明细中(
- 多对多关系:
- 商品与标签之间是多对多关系,通过
内容-标签关联表
实现。一种商品可以有多个标签,一个标签也可以对应多种商品。
- 商品与标签之间是多对多关系,通过
5. 销售单表 (SalesOrder)
- 一对一关系:无直接一对一关系。
- 一对多关系:
- 一个销售单可以包含多个销售明细(
销售明细表
)。
- 一个销售单可以包含多个销售明细(
6. 销售明细表 (SalesDetail)
- 一对一关系:无直接一对一关系。
- 多对一关系:
- 多条销售明细对应一个销售单(
销售单表
)。 - 多条销售明细对应一种商品(
商品表
)。
- 多条销售明细对应一个销售单(
7. 进货单表 (PurchaseOrder)
- 一对一关系:无直接一对一关系。
- 一对多关系:
- 一个进货单可以包含多个进货明细(
进货明细表
)。
- 一个进货单可以包含多个进货明细(
8. 进货明细表 (PurchaseDetail)
- 一对一关系:无直接一对一关系。
- 多对一关系:
- 多条进货明细对应一个进货单(
进货单表
)。 - 多条进货明细对应一种商品(
商品表
)。
- 多条进货明细对应一个进货单(
7. 会员管理需求分析
7.1 会员等级规则
等级 | 积分要求 | 折扣率 | 描述 |
---|---|---|---|
新会员 | 0-99 | 1.0 | 无折扣 |
普通会员 | 100-199 | 0.95 | 5%折扣 |
白银会员 | 200-499 | 0.9 | 10%折扣 |
黄金会员 | 500-999 | 0.85 | 15%折扣 |
钻石会员 | ≥1000 | 0.75 | 25%折扣 |
7.2 会员积分规则
-
每消费1元获得1积分
-
积分可用于提升会员等级
-
积分不清零
7.3 会员管理数据流
8. 退货处理需求分析
8.1 退货规则
-
必须提供原始销售单号
-
退货商品必须与销售记录一致
-
退货数量不能超过原始销售数量
-
退货后恢复库存
-
会员退货需扣除相应积分
8.2 退货流程
9. 库存预警机制
9.1 预警规则
-
库存数量 ≤ 10:需补货(红色预警)
-
10 < 库存数量 ≤ 20:库存紧张(黄色预警)
-
库存数量 > 20:库存充足(绿色正常)
9.2 预警处理流程
10.数据库结构设计
10.1数据库创建与各表创建
CREATE DATABASE IF NOT EXISTS 超市销售管理系统;
USE 超市销售管理系统;
-- 1. 员工表
CREATE TABLE 员工表 (
员工ID INT PRIMARY KEY AUTO_INCREMENT,
姓名 VARCHAR(20) NOT NULL,
性别 ENUM('男','女') NOT NULL,
电话 VARCHAR(20),
角色 ENUM('收银员','库存管理员','经理') NOT NULL,
用户名 VARCHAR(20) NOT NULL UNIQUE,
密码 VARCHAR(32) NOT NULL
);
-- 2. 供应商表
CREATE TABLE 供应商表 (
供应商ID INT PRIMARY KEY AUTO_INCREMENT,
名称 VARCHAR(50) NOT NULL,
联系人 VARCHAR(20),
联系电话 VARCHAR(20)
);
-- 3. 会员表
CREATE TABLE 会员表 (
会员ID INT PRIMARY KEY AUTO_INCREMENT,
姓名 VARCHAR(20) NOT NULL,
电话 VARCHAR(20) NOT NULL,
积分 INT DEFAULT 0,
消费总额 DECIMAL(10,2) DEFAULT 0,
折扣率 DECIMAL(3,2) DEFAULT 1.0 CHECK (折扣率 BETWEEN 0.5 AND 1.0),
注册日期 DATE NOT NULL
);
-- 4. 商品表
CREATE TABLE 商品表 (
商品条码 VARCHAR(20) PRIMARY KEY,
商品名称 VARCHAR(100) NOT NULL,
规格 VARCHAR(20),
零售价 DECIMAL(10,2) NOT NULL,
成本价 DECIMAL(10,2) NOT NULL,
库存数量 INT NOT NULL DEFAULT 0,
供应商ID INT,
FOREIGN KEY (供应商ID) REFERENCES 供应商表(供应商ID)
);
-- 5. 销售单表
CREATE TABLE 销售单表 (
销售单号 INT PRIMARY KEY AUTO_INCREMENT,
销售日期 DATETIME NOT NULL,
员工ID INT NOT NULL,
会员ID INT,
总金额 DECIMAL(10,2) NOT NULL,
支付方式 ENUM('现金','会员卡','微信','支付宝') NOT NULL,
FOREIGN KEY (员工ID) REFERENCES 员工表(员工ID),
FOREIGN KEY (会员ID) REFERENCES 会员表(会员ID)
);
-- 6. 销售明细表
CREATE TABLE 销售明细表 (
明细ID INT PRIMARY KEY AUTO_INCREMENT,
销售单号 INT NOT NULL,
商品条码 VARCHAR(20) NOT NULL,
销售数量 INT NOT NULL,
售价 DECIMAL(10,2) NOT NULL,
折扣率 DECIMAL(3,2) DEFAULT 1.0,
FOREIGN KEY (销售单号) REFERENCES 销售单表(销售单号),
FOREIGN KEY (商品条码) REFERENCES 商品表(商品条码)
);
-- 7. 进货单表
CREATE TABLE 进货单表 (
进货单号 INT PRIMARY KEY AUTO_INCREMENT,
进货日期 DATETIME NOT NULL,
员工ID INT NOT NULL,
供应商ID INT NOT NULL,
总金额 DECIMAL(10,2) NOT NULL,
FOREIGN KEY (员工ID) REFERENCES 员工表(员工ID),
FOREIGN KEY (供应商ID) REFERENCES 供应商表(供应商ID)
);
-- 8. 进货明细表
CREATE TABLE 进货明细表 (
明细ID INT PRIMARY KEY AUTO_INCREMENT,
进货单号 INT NOT NULL,
商品条码 VARCHAR(20) NOT NULL,
进货数量 INT NOT NULL,
进价 DECIMAL(10,2) NOT NULL,
FOREIGN KEY (进货单号) REFERENCES 进货单表(进货单号),
FOREIGN KEY (商品条码) REFERENCES 商品表(商品条码)
);
10.2 销售、库存、会员视图(对应第6点的数据关系E-R图)
(1)销售视图
-- 1. 销售汇总视图
CREATE VIEW 销售汇总视图 AS
SELECT
s.销售单号,
s.销售日期,
e.姓名 AS 收银员,
IFNULL(m.姓名, '非会员') AS 顾客,
s.总金额,
s.支付方式,
COUNT(d.明细ID) AS 商品种类数
FROM 销售单表 s
JOIN 员工表 e ON s.员工ID = e.员工ID
LEFT JOIN 会员表 m ON s.会员ID = m.会员ID
JOIN 销售明细表 d ON s.销售单号 = d.销售单号
GROUP BY s.销售单号, s.销售日期, e.姓名, m.姓名, s.总金额, s.支付方式;
(2)库存视图
-- 2. 商品库存视图
CREATE VIEW 商品库存视图 AS
SELECT
p.商品条码,
p.商品名称,
p.规格,
p.零售价,
p.库存数量,
v.名称 AS 供应商,
CASE
WHEN p.库存数量 <= 10 THEN '需补货'
WHEN p.库存数量 <= 20 THEN '库存紧张'
ELSE '库存充足'
END AS 库存状态
FROM 商品表 p
LEFT JOIN 供应商表 v ON p.供应商ID = v.供应商ID;
(3)会员视图
-- 3. 会员消费视图
CREATE VIEW 会员消费视图 AS
SELECT
m.会员ID,
m.姓名,
m.电话,
m.积分,
m.消费总额,
COUNT(DISTINCT s.销售单号) AS 消费次数,
MAX(s.销售日期) AS 最近消费日期
FROM 会员表 m
LEFT JOIN 销售单表 s ON m.会员ID = s.会员ID
GROUP BY m.会员ID, m.姓名, m.电话, m.积分, m.消费总额;
10.3 存储过程创建
10.3.1 处理销售的存储过程
在点击“结账”按钮时会调用触发器,把购物车里的所有商品计算总价后按会员折扣率算,修改数据库值
销售更新
-- 删除已存在的"处理销售"存储过程,防止重复创建
DROP PROCEDURE IF EXISTS 处理销售;
-- 创建处理销售业务的存储过程
DELIMITER // -- 临时修改分隔符为//,以便在存储过程中使用分号
CREATE PROCEDURE 处理销售(
IN p_员工ID INT, -- 输入参数:操作员工的ID编号
IN p_会员ID INT, -- 输入参数:会员ID,可为NULL表示非会员购买
IN p_支付方式 ENUM('现金','会员卡','微信','支付宝'), -- 输入参数:支付方式枚举值
IN p_商品列表 JSON -- 输入参数:JSON格式的商品列表数据
)
BEGIN
-- 声明所有需要的变量
DECLARE v_销售单号 INT; -- 存储生成的销售单编号
DECLARE v_总金额 DECIMAL(10,2) DEFAULT 0; -- 存储订单总金额,初始化为0
DECLARE v_折扣率 DECIMAL(3,2); -- 存储会员折扣率(0.75-1.0)
DECLARE i INT DEFAULT 0; -- 循环计数器,用于遍历JSON数组
DECLARE v_商品条码 VARCHAR(20); -- 存储当前处理的商品条码
DECLARE v_购买数量 INT; -- 存储当前商品的购买数量
DECLARE v_库存数量 INT; -- 存储当前商品的库存数量
DECLARE v_零售价 DECIMAL(10,2); -- 存储当前商品的零售价格
DECLARE v_商品名称 VARCHAR(100); -- 存储当前商品的名称
-- 获取会员折扣率:如果是会员则查询折扣率,非会员默认1.0(无折扣)
IF p_会员ID IS NOT NULL THEN
SELECT 折扣率 INTO v_折扣率 FROM 会员表 WHERE 会员ID = p_会员ID;
ELSE
SET v_折扣率 = 1.0; -- 非会员不打折
END IF;
-- 创建销售单记录,初始总金额设为0,后面会更新
INSERT INTO 销售单表 (销售日期, 员工ID, 会员ID, 总金额, 支付方式)
VALUES (NOW(), p_员工ID, p_会员ID, 0, p_支付方式);
-- 获取刚插入的销售单ID
SET v_销售单号 = LAST_INSERT_ID();
-- 循环处理JSON数组中的每个商品
WHILE i < JSON_LENGTH(p_商品列表) DO
-- 从JSON中提取商品条码(使用双引号包裹中文键名)
SET v_商品条码 = JSON_UNQUOTE(JSON_EXTRACT(p_商品列表, CONCAT('$[', i, ']."条码"')));
-- 从JSON中提取购买数量
SET v_购买数量 = JSON_EXTRACT(p_商品列表, CONCAT('$[', i, ']."数量"'));
-- 从商品表查询当前商品的详细信息
SELECT 商品名称, 零售价, 库存数量 INTO v_商品名称, v_零售价, v_库存数量
FROM 商品表 WHERE 商品条码 = v_商品条码;
-- 检查库存是否足够
IF v_库存数量 < v_购买数量 THEN
-- 库存不足时,构造错误信息并抛出异常
SET @error_msg = CONCAT('商品库存不足: ', v_商品名称);
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = @error_msg;
END IF;
-- 添加销售明细记录
INSERT INTO 销售明细表 (销售单号, 商品条码, 销售数量, 售价, 折扣率)
VALUES (v_销售单号, v_商品条码, v_购买数量, v_零售价, v_折扣率);
-- 更新商品库存(减去已售数量)
UPDATE 商品表 SET 库存数量 = 库存数量 - v_购买数量
WHERE 商品条码 = v_商品条码;
-- 累加计算总金额(考虑折扣)
SET v_总金额 = v_总金额 + (v_零售价 * v_折扣率 * v_购买数量);
-- 计数器加1,处理下一个商品
SET i = i + 1;
END WHILE;
-- 更新销售单的总金额
UPDATE 销售单表 SET 总金额 = v_总金额 WHERE 销售单号 = v_销售单号;
-- 如果是会员购买,更新会员积分和消费总额
IF p_会员ID IS NOT NULL THEN
-- 每消费4元积1分(FLOOR取整)
UPDATE 会员表
SET 积分 = 积分 + FLOOR(v_总金额/4),
消费总额 = 消费总额 + v_总金额
WHERE 会员ID = p_会员ID;
-- 调用更新会员折扣的存储过程
CALL 更新会员折扣(p_会员ID);
END IF;
-- 返回生成的销售单号和总金额
SELECT v_销售单号 AS 销售单号, v_总金额 AS 总金额;
END //
DELIMITER ; -- 恢复分隔符为分号
10.3.2 处理进货的存储过程
在“库存”按钮点击后,可以通过点击“进货”按钮
-- 删除已存在的"处理进货"存储过程
DROP PROCEDURE IF EXISTS 处理进货;
-- 创建处理进货业务的存储过程
DELIMITER //
CREATE PROCEDURE 处理进货(
IN p_员工ID INT, -- 输入参数:操作员工ID
IN p_供应商ID INT, -- 输入参数:供应商ID
IN p_商品列表 JSON -- 输入参数:JSON格式的商品信息数组
)
BEGIN
-- 声明变量
DECLARE v_进货单号 INT; -- 存储生成的进货单号
DECLARE v_总金额 DECIMAL(10,2) DEFAULT 0; -- 存储进货总金额
DECLARE i INT DEFAULT 0; -- 循环计数器
DECLARE v_商品条码 VARCHAR(20); -- 存储商品条码
DECLARE v_商品名称 VARCHAR(100); -- 存储商品名称
DECLARE v_规格 VARCHAR(20); -- 存储商品规格
DECLARE v_数量 INT; -- 存储进货数量
DECLARE v_进价 DECIMAL(10,2); -- 存储商品进价
DECLARE v_零售价 DECIMAL(10,2); -- 存储商品零售价
-- 创建进货单记录,初始总金额设为0
INSERT INTO 进货单表 (进货日期, 员工ID, 供应商ID, 总金额)
VALUES (NOW(), p_员工ID, p_供应商ID, 0);
-- 获取刚插入的进货单ID
SET v_进货单号 = LAST_INSERT_ID();
-- 循环处理每个进货商品
WHILE i < JSON_LENGTH(p_商品列表) DO
-- 从JSON中提取完整的商品信息
SET v_商品条码 = JSON_UNQUOTE(JSON_EXTRACT(p_商品列表, CONCAT('$[', i, ']."条码"')));
SET v_商品名称 = JSON_UNQUOTE(JSON_EXTRACT(p_商品列表, CONCAT('$[', i, ']."名称"')));
SET v_规格 = JSON_UNQUOTE(JSON_EXTRACT(p_商品列表, CONCAT('$[', i, ']."规格"')));
SET v_进价 = JSON_EXTRACT(p_商品列表, CONCAT('$[', i, ']."进价"'));
SET v_零售价 = JSON_EXTRACT(p_商品列表, CONCAT('$[', i, ']."零售价"'));
SET v_数量 = JSON_EXTRACT(p_商品列表, CONCAT('$[', i, ']."数量"'));
-- 检查商品是否已存在
IF NOT EXISTS (SELECT 1 FROM 商品表 WHERE 商品条码 = v_商品条码) THEN
-- 新商品:插入完整商品信息
INSERT INTO 商品表 (商品条码, 商品名称, 规格, 零售价, 成本价, 库存数量, 供应商ID)
VALUES (
v_商品条码,
v_商品名称,
v_规格,
v_零售价,
v_进价,
0, -- 初始库存为0,下面会增加
p_供应商ID
);
ELSE
-- 已有商品:更新价格信息
UPDATE 商品表
SET 零售价 = v_零售价,
成本价 = v_进价
WHERE 商品条码 = v_商品条码;
END IF;
-- 添加进货明细记录
INSERT INTO 进货明细表 (进货单号, 商品条码, 进货数量, 进价)
VALUES (v_进货单号, v_商品条码, v_数量, v_进价);
-- 更新商品库存(增加进货数量)
UPDATE 商品表
SET 库存数量 = 库存数量 + v_数量
WHERE 商品条码 = v_商品条码;
-- 累加计算总金额(进价×数量)
SET v_总金额 = v_总金额 + (v_进价 * v_数量);
-- 处理下一个商品
SET i = i + 1;
END WHILE;
-- 更新进货单总金额
UPDATE 进货单表 SET 总金额 = v_总金额 WHERE 进货单号 = v_进货单号;
-- 返回进货单号和总金额
SELECT v_进货单号 AS 进货单号, v_总金额 AS 总金额;
END //
DELIMITER ;
10.3.3 处理更新会员折扣的存储过程
DELIMITER //
CREATE PROCEDURE 更新会员折扣(
IN p_会员ID INT -- 输入参数:需要更新折扣的会员ID
)
BEGIN
DECLARE v_积分 INT; -- 存储会员当前积分
-- 查询会员当前积分
SELECT 积分 INTO v_积分 FROM 会员表 WHERE 会员ID = p_会员ID;
-- 根据积分设置不同的折扣等级
UPDATE 会员表
SET 折扣率 = CASE
WHEN v_积分 >= 1000 THEN 0.75 -- 钻石会员:75折
WHEN v_积分 >= 500 THEN 0.85 -- 黄金会员:85折
WHEN v_积分 >= 200 THEN 0.9 -- 白银会员:9折
WHEN v_积分 >= 100 THEN 0.95 -- 普通会员:95折
ELSE 1.0 -- 新会员:无折扣
END
WHERE 会员ID = p_会员ID;
END //
DELIMITER ;
10.4 创建商品价格检查触发器
DELIMITER //
CREATE TRIGGER 检查商品价格
BEFORE UPDATE ON 商品表 -- 在更新商品表前触发
FOR EACH ROW -- 对每行数据执行
BEGIN
-- 确保更新后的零售价不低于成本价
IF NEW.零售价 < NEW.成本价 THEN
-- 如果低于成本价,抛出错误
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '零售价不能低于成本价';
END IF;
END //
DELIMITER ;
10.5 创建用户并分配权限
现在是暂时先创建几个用户,后期应该完成注册后还会通过可视化按钮增加用户
-- 创建系统用户
CREATE USER '收银员'@'localhost' IDENTIFIED BY 'cashier123'; -- 收银员账户
CREATE USER '库存员'@'localhost' IDENTIFIED BY 'stock123'; -- 库存管理员账户
CREATE USER '经理'@'localhost' IDENTIFIED BY 'manager123'; -- 经理账户
-- 设置收银员权限
GRANT SELECT, INSERT ON 超市销售管理系统.销售单表 TO '收银员'@'localhost'; -- 销售单表权限
GRANT SELECT, INSERT ON 超市销售管理系统.销售明细表 TO '收银员'@'localhost'; -- 销售明细表权限
GRANT SELECT ON 超市销售管理系统.商品表 TO '收银员'@'localhost'; -- 商品查询权限
GRANT SELECT ON 超市销售管理系统.会员表 TO '收银员'@'localhost'; -- 会员查询权限
GRANT EXECUTE ON PROCEDURE 超市销售管理系统.处理销售 TO '收银员'@'localhost'; -- 执行销售流程权限
-- 设置库存管理员权限
GRANT SELECT, INSERT, UPDATE ON 超市销售管理系统.商品表 TO '库存员'@'localhost'; -- 商品管理权限
GRANT SELECT, INSERT ON 超市销售管理系统.进货单表 TO '库存员'@'localhost'; -- 进货单权限
GRANT SELECT, INSERT ON 超市销售管理系统.进货明细表 TO '库存员'@'localhost'; -- 进货明细权限
GRANT SELECT ON 超市销售管理系统.供应商表 TO '库存员'@'localhost'; -- 供应商查询权限
GRANT EXECUTE ON PROCEDURE 超市销售管理系统.处理进货 TO '库存员'@'localhost'; -- 执行进货流程权限
-- 设置经理权限(所有权限)
GRANT ALL PRIVILEGES ON 超市销售管理系统.* TO '经理'@'localhost';
11.前端QT实现
代码部分文件代码量太大,后续如需,便添加进来并加以解释,暂时先实现到这里
暂时还未美化,美化部分在QT里实现比较简单,所以等所有逻辑部分实现了,再进行美化
销售更新