利用MySQL实现一个类似美团外卖的外卖订单的数据库管理系统
2018-01-28 21:20
453 查看
利用MySQL实现一个类似美团外卖的外卖订单的数据库管理系统
本文的重点在于MySQL触发器的应用1、数据库需求分析
1)数据库实体:客户、商家、商品、订单。 2)一个客户对应多个订单。
3)一个商家对应多种商品和多个订单。
4)一个订单对应一种商品。
2、系统功能分析
1)客户注册:客户通过添加必要的信息到数据库来完成注册。 2)客户信息修改:客户根据自己的编号来修改除编号外的其他信息。
3)商家注册:商家通过添加必要的信息到数据库来完成注册。
4)商家信息修改:商家根据自己的编号来修改除编号外的其他信息。
5)商品录入:商家通过添加商品必要的信息到数据库来完成商品录入。
6)商品信息修改:商家根据商品编号来修改商品除编号外的其他信息。
7)客户下单:客户通过添加订单信息到数据库来提交订单。
8)商家接单:商家通过修改订单状态来接受订单。
9)客户确认收货:客户通过修改订单状态来确认收货。
10)取消订单:客户通过修改订单状态来退款,但必须在商家接单之前退款。
11)订单状态:“0”表示已支付,“1”表示已接单,“2”表示已送达,“3”表示已退款。
3、关系模式
1)客户(客户编号,客户姓名,消费金额 ,客户电话,客户地址) 2)商家(商家编号,商户名称,营业额 ,商户电话,商户地址)
3)商品(商品编号,商品名称,商户编号,商品价格,限购数量)
4)订单(订单编号,订购时间,客户编号,商品编号,数量,总额,状态)
注:含下划线字段为主键或外键。
4、创建数据库及表
1)创建数据库CREATE DATABASE takeout;
2)创建客户表
CREATE TABLE customers( id int NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(40) NOT NULL , consumption DOUBLE(16,2) NOT NULL DEFAULT 0, phone VARCHAR(16) NOT NULL , address VARCHAR(45) NOT NULL );
3)创建商家表
CREATE TABLE businesses( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(40) NOT NULL , turnover DOUBLE(16,2) NOT NULL DEFAULT 0, phone VARCHAR(16) NOT NULL , address VARCHAR(45) NOT NULL );
4)创建商品表
CREATE TABLE goods( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(40) NOT NULL , business_id INT NOT NULL , price DOUBLE(16,2) NOT NULL , limit_num INT , FOREIGN KEY (business_id) REFERENCES businesses(id) );
5)创建订单表
CREATE TABLE orders( id INT NOT NULL AUTO_INCREMENT, order_time DATETIME NOT NULL , customer_id INT NOT NULL , goods_id INT NOT NULL , number INT NOT NULL , total_cost DOUBLE(16,2) NOT NULL , state INT NOT NULL DEFAULT 0 , PRIMARY KEY (id), FOREIGN KEY (customer_id) REFERENCES customers(id), FOREIGN KEY (goods_id) REFERENCES goods(id) );
5、创建触发器
1)创建触发器前修改sql语句结束符为#
DELIMITER #
2)限购以及计算订单总额
创建之后,在客户订购的商品数量超过限购数量时,自动将订购的数量改为限购数量,然后计算出订单总额。
CREATE TRIGGER limit_buy BEFORE INSERT ON orders FOR EACH ROW BEGIN DECLARE p DOUBLE(16,2); /*商品单价*/ DECLARE lim INT; /*限购数量*/ SET p=(SELECT price FROM goods WHERE goods.id=NEW.goods_id); SET lim=(SELECT limit_num FROM goods WHERE goods.id=NEW.goods_id); if (lim IS NOT NULL AND NEW.number>lim) THEN SET NEW.number=lim; END IF ; SET NEW.total_cost=NEW.number*p; END #
3)更新客户消费总额
在客户提交订单之后,自动将消费金额累加到客户总的消费金额里。
CREATE TRIGGER calculate_consumption AFTER INSERT ON orders FOR EACH ROW BEGIN UPDATE customers SET consumption=consumption+NEW.total_cost WHERE customers.id=NEW.customer_id; END #
4)更新商家总营业额以及退款
商家接单后,自动将订单金额累加到商家的营业额里;客户取消订单,自动将客户总消费减去本次订单金额。
CREATE TRIGGER calculate_turnover BEFORE UPDATE ON orders FOR EACH ROW BEGIN IF (NEW.state=1 AND OLD.state=0) THEN UPDATE businesses SET turnover=turnover+OLD.total_cost WHERE id=(SELECT business_id FROM goods WHERE goods.id=NEW.goods_id); ELSEIF (NEW.state=3 AND OLD.state=0) THEN UPDATE customers SET consumption=consumption-OLD.total_cost WHERE id=OLD.customer_id; ELSEIF (NEW.state<OLD.state) THEN SET NEW.state=OLD.state; END IF ; END #
5)创建完触发器后将sql语句结束符修改回
;
DELIMITER ;
6)查看触发器
SHOW TRIGGERS;
结果截图(局部)
6、客户注册及信息修改
1)客户注册INSERT INTO customers(name, phone, address) VALUES ('李白','18512312300','华东交通大学42公寓'); INSERT INTO customers(name, phone, address) VALUES ('杜甫','18612312301','华东交通大学43公寓'); INSERT INTO customers(name, phone, address) VALUES ('马云云','18712312302','华东交通大学37公寓'); INSERT INTO customers(name, phone, address) VALUES ('马花腾','18712412303','江西理工大学11公寓'); INSERT INTO customers(name, phone, address) VALUES ('孙悟空','18572352304','江西财经大学32公寓'); INSERT INTO customers(name, phone, address) VALUES ('唐僧','18632314305','江西财经大学9公寓'); INSERT INTO customers(name, phone, address) VALUES ('武则天','18712312406','江西财经大学21公寓'); INSERT INTO customers(name, phone, address) VALUES ('独孤求败','18519312307','江西理工大学13公寓'); INSERT INTO customers(name, phone, address) VALUES ('展昭','18112332808','江西理工大学25公寓'); INSERT INTO customers(name, phone, address) VALUES ('赵灵儿','18112812309','华东交通大学8公寓'); INSERT INTO customers(name, phone, address) VALUES ('东方不败','18152862310','江西财经大学34公寓'); INSERT INTO customers(name, phone, address) VALUES ('貂蝉','18352388511','江西理工大学24公寓');
结果截图
2)客户信息修改
UPDATE customers SET phone='15789654314' WHERE id=2; UPDATE customers SET address='华东交通大学创新大楼' WHERE id=3; UPDATE customers SET address='江西财经大学大学生活动中心' WHERE id=7;
结果截图
7、商家注册及信息修改
1)商家注册INSERT INTO businesses(name, phone, address) VALUES ('回家吃饭','400123100','南昌市双港东大街333号'); INSERT INTO businesses(name, phone, address) VALUES ('佳佳饺子馆','400123101','南昌市双港东大街531号'); INSERT INTO businesses(name, phone, address) VALUES ('港式脆排饭','400123102','南昌市邹家自然村交通学院旁'); INSERT INTO businesses(name, phone, address) VALUES ('膳当家','400123103','南昌市华东交通大学'); INSERT INTO businesses(name, phone, address) VALUES ('沙县小吃','400123104','南昌市双港东大街立通大厦旁');
结果截图
2)商家信息修改
UPDATE businesses SET phone='18788484186' WHERE id=2; UPDATE businesses SET address='南昌市江西理工大学对面' WHERE id=3; UPDATE businesses SET address='南昌云鹏大酒店旁' WHERE id=5;
结果截图
8、商品录入及商品信息修改
1)商品录入INSERT INTO goods(name, business_id, price, limit_num) VALUES ('重庆鸡公煲',1,13.9,1); INSERT INTO goods(name, business_id, price, limit_num) VALUES ('麻辣香锅',1,12.5,5); INSERT INTO goods(name, business_id, price, limit_num) VALUES ('土豆烧牛腩',1,14.9,NULL); INSERT INTO goods(name, business_id, price, limit_num) VALUES ('韭菜猪肉馅',2,14.9,3); INSERT INTO goods(name, business_id, price, limit_num) VALUES ('香菇猪肉馅',2,14.9,3); INSERT INTO goods(name, business_id, price, limit_num) VALUES ('玉米猪肉馅',2,15.9,3); INSERT INTO goods(name, business_id, price, limit_num) VALUES ('黑椒脆排饭',3,9.9,NULL); INSERT INTO goods(name, business_id, price, limit_num) VALUES ('孜然脆排饭',3,9.5,NULL); INSERT INTO goods(name, business_id, price, limit_num) VALUES ('叉烧脆排饭',3,11.8,2); INSERT INTO goods(name, business_id, price, limit_num) VALUES ('腐竹黄焖鸡',4,10.8,3); INSERT INTO goods(name, business_id, price, limit_num) VALUES ('黄焖鸡小份微辣',4,13,5); INSERT INTO goods(name, business_id, price, limit_num) VALUES ('黄焖鸡小份中辣',4,14,5); INSERT INTO goods(name, business_id, price, limit_num) VALUES ('鲜肉蒸饺',5,4,6); INSERT INTO goods(name, business_id, price, limit_num) VALUES ('香拌混沌',5,5,3); INSERT INTO goods(name, business_id, price, limit_num) VALUES ('蛋炒南昌米粉',5,7,NULL);
结果截图
2)商品信息修改
UPDATE goods SET name='韭菜牛肉馅' WHERE id=4; UPDATE goods SET limit_num=5 WHERE id=6; UPDATE goods SET price=4.5 WHERE id=13;
结果截图
9、外卖订购流程
1)客户提交订单INSERT orders(order_time, customer_id, goods_id, number) VALUES ('2017-12-8 12:14:35',2,3,2); INSERT orders(order_time, customer_id, goods_id, number) VALUES ('2017-12-8 11:45:12',4,5,5); INSERT orders(order_time, customer_id, goods_id, number) VALUES ('2017-12-9 18:14:35',5,13,7); INSERT orders(order_time, customer_id, goods_id, number) VALUES ('2017-12-9 19:44:35',9,12,1); INSERT orders(order_time, customer_id, goods_id, number) VALUES ('2017-12-10 11:55:34',7,14,6); INSERT orders(order_time, customer_id, goods_id, number) VALUES ('2018-1-3 12:04:42',1,7,9); INSERT orders(order_time, customer_id, goods_id, number) VALUES ('2018-1-5 13:11:56',3,4,1); INSERT orders(order_time, customer_id, goods_id, number) VALUES ('2018-1-11 18:09:27',9,8,1); INSERT orders(order_time, customer_id, goods_id, number) VALUES ('2018-1-12 13:11:56',11,8,4); INSERT orders(order_time, customer_id, goods_id, number) VALUES ('2018-1-15 19:28:49',5,14,3); INSERT orders(order_time, customer_id, goods_id, number) VALUES ('2018-1-16 13:08:40',7,1,2); INSERT orders(order_time, customer_id, goods_id, number) VALUES ('2018-1-17 17:30:29',9,4,5); INSERT orders(order_time, customer_id, goods_id, number) VALUES ('2018-1-19 12:00:26',12,9,2); INSERT orders(order_time, customer_id, goods_id, number) VALUES ('2018-1-21 17:34:56',4,14,4);
结果截图
可以看到订单表的订单金额已自动计算好了
客户的消费金额也已经自动更新
2)客户取消订单
UPDATE orders SET state=3 WHERE id=4; UPDATE orders SET state=3 WHERE id=10;
结果截图
3)商家接单
UPDATE orders SET state=1 WHERE id=1; UPDATE orders SET state=1 WHERE id=2; UPDATE orders SET state=1 WHERE id=3; UPDATE orders SET state=1 WHERE id=5; UPDATE orders SET state=1 WHERE id=6; UPDATE orders SET state=1 WHERE id=7; UPDATE orders SET state=1 WHERE id=8; UPDATE orders SET state=1 WHERE id=9; UPDATE orders SET state=1 WHERE id=11; UPDATE orders SET state=1 WHERE id=12; UPDATE orders SET state=1 WHERE id=13; UPDATE orders SET state=1 WHERE id=14;
结果截图
商家的营业额已自动更新
4)客户确认收货
UPDATE orders SET state=2 WHERE id=1; UPDATE orders SET state=2 WHERE id=2; UPDATE orders SET state=2 WHERE id=3; UPDATE orders SET state=2 WHERE id=5; UPDATE orders SET state=2 WHERE id=6; UPDATE orders SET state=2 WHERE id=7; UPDATE orders SET state=2 WHERE id=8; UPDATE orders SET state=2 WHERE id=9; UPDATE orders SET state=2 WHERE id=11; UPDATE orders SET state=2 WHERE id=12; UPDATE orders SET state=2 WHERE id=13; UPDATE orders SET state=2 WHERE id=14;
结果截图
10、创建订单详情视图
CREATE VIEW order_details AS SELECT orders.id AS 订单编号, businesses.name AS 商家名称, goods.name AS 商品名称, number AS 数量, total_cost AS 总额, state AS 订单状态, customers.name AS 客户姓名, customers.phone AS 电话, customers.address AS 地址, order_time AS 时间 FROM ((businesses INNER JOIN goods ON businesses.id = goods.business_id) INNER JOIN orders ON goods.id = orders.goods_id) INNER JOIN customers ON orders.customer_id=customers.id;
查看视图
SELECT * FROM order_details;
11、客户总消费及商家总营业额对比
SELECT sum(consumption) AS 总消费 FROM customers; SELECT sum(turnover) AS 总营业额 FROM businesses;
得出的结果应该是一样的,结果截图
12、查看2018年1月份商家的营业额排行榜
SELECT businesses.id AS 商家编号, businesses.name AS 商家名称, sum(total_cost) AS 2018年1月营业额 FROM (orders INNER JOIN goods ON orders.goods_id = goods.id) INNER JOIN businesses ON business_id = businesses.id WHERE state IN (1,2) AND date(order_time) BETWEEN '2018-01-01' AND '2018-01-31' GROUP BY businesses.id ORDER BY 2018年1月营业额 DESC ;
结果截图
相关文章推荐
- iOS 类似美团外卖app两个tableView联动效果实现
- 利用MySQL的一个特性实现MySQL查询结果的分页显示
- iOS 类似美团外卖 app 两个 tableView 联动效果实现
- 利用RecycleView实现类似ListView的Item点击,长按等操作事件以及点击后每一项在添加一个列表
- Mysql 5.7.18 利用MySQL proxies_priv实现类似用户组管理
- 利用html+css+mysql+php实现类似google suggest的功能
- iOS 类似美团外卖 app 两个 tableView 联动效果实现
- Linux-(C)利用Mysql相关API实现类似mysql的操作
- 利用MySQL的一个特性实现MySQL查询结果的分页显示
- 利用PHP的GD2图像函数 + mysql实现的一个简单的投票系统
- iOS 类似美团外卖 app 两个 tableView 联动效果实现
- iOS 类似美团外卖 app 两个 tableView 联动效果实现
- iOS 类似美团外卖 app 两个 tableView 联动效果实现
- iOS 类似美团外卖 app 两个 tableView 联动效果实现
- 利用数学方法来大大降低一个逻辑判断实现的难度的例子
- 利用VC和ADO接口编写一个dll模块实现对数据库数据的处理
- 一个利用客户端空间存储树形导航栏信息,从而实现ajax技术动态导航的雏形
- 利用数学方法来大大降低一个逻辑判断实现的难度的例子
- 利用HttpModuler实现WEB程序同一时间只让一个用户实例登陆
- 【原创源码】(01):利用事件-委托,实现主-子窗体动态显示,不同菜单栏,不同工具栏。(类似SQL Server 2000 企业管理器)