环境 MySQL Community Server 8.0.25 、Python 3.8、Tkinter
需求分析
本程序模拟一个外卖平台系统,该系统由三端构成即用户+商家+配送员。
不同的用户(三类)有不同的ID,姓名可重名。每个用户可以下多个订单,每个订单对应一个配送员,一个订单内可包含多个同一家店铺的商品,每个商家可以同时处理来自多个用户的多个订单。一个配送员可以同时派送多个订单,订单对应的配送员由外卖平台统一分配。
三类用户均可以以自己的账号密码登录对应的系统,可以注册新账号
实现的功能:
- 用户:登录/注册功能,修改用户信息功能,充值账户余额功能,获取正在营业的店铺菜单功能,点外卖提交订单功能,查询订单功能。
- 商家:登录/注册功能,一键上/下班功能 ,修改商家信息功能,营业额提现功能,商品管理模块包括:查询商品详情、新建商品、修改原有商品、删除商品功能。接单窗口显示已接单未出餐商品,标记餐品为我已出餐功能,查询最近已出餐商品功能。
- 配送员:登录/注册功能,一键上/下班功能 ,修改个人信息功能,工资提现功能,工作窗口显示派送给自己的所有订单,修改订单状态为已完成(点击我已送达)功能,查看最近派送完成的订单功能。

数据库设计
逻辑结构设计
- 商家:店名,商家号,登录密码,地址,电话,营业额,状态,
- 商品:编号,商品名,价格,商家号,库存
- 骑手:编号,登录密码,姓名,性别,电话,工资,状态,
- 顾客:ID,登录密码,姓名,性别,地址, 电话,余额。
- 订单:订单号,骑手号,顾客ID,状态,备注,配送费,金额,发起时间
- 订单详情:订单号,商品号,数量
关系属性
- Store(Sno,Spass,Sname,Saddr,Stel,Smoney,Sstate)
- Goods(Gno,Sno,Gname,Gprice,Gstock)
- Customer(Cno,Cpass,Cname,Csex,Caddr,Ctel,Cmoney)
- Deliverer(Dno,Dpass,Dname,Dsex,Dtel,Dmoney,Dstate)
- Order(Ono,Dno,Cno,Ostate,Otip,ODelfee,Omoney,Obtime)
- Purchase(Ono,Gno,Pamount)
E-R图

数据表
商店表(store)
- 主码:Sno
- 自定义完整性:
CHECK (Sstate IN (‘工作’,‘休息’)),
CHECK (Smoney >= 0)
商品表(goods)
- 主码:Gno
- 外码:FOREIGN KEY (Sno) REFERENCES Store(Sno)
顾客表(Customer)
- 主码:Cno
- 自定义完整性:
CHECK (Csex IN (‘M’,‘F’)),
CHECK (Cmoney >= 0)
派送员表(deliverer)
- 主码:Dno
- 自定义完整性:
CHECK (Dsex IN (‘M’,‘F’)),
CHECK (Dstate IN (‘工作’,‘休息’)),
CHECK (Dmoney >= 0)
订单表(orderr)
- 主码:Ono
- 外码:
FOREIGN KEY (Dno) REFERENCES Deliverer(Dno),
FOREIGN KEY (Cno) REFERENCES Customer(Cno) ,
FOREIGN KEY (Sno) REFERENCES Store(Sno) , - 自定义完整性:
CHECK (Omoney >= 0),
CHECK (ODelfee >= 0),
CHECK (Ostate IN(‘正在出餐’,‘正在配送’,‘订单完成’))
订单详情表(purchase)
- 主码:PRIMARY KEY (Ono, Gno ),
- 外码:FOREIGN KEY (Ono) REFERENCES Orderr(Ono) ,
FOREIGN KEY (Gno) REFERENCES Goods(Gno) ,
视图
用户点单视图
用户点单时可以看见所有商家的所有菜品。用户需要看到的是商店名而不是商店编号,商品名而不是商品编号。
CREATE VIEW view_Cus_buy AS
SELECT Sname '店名',Gname '商品',Gprice '价格'
FROM goods,store
WHERE goods.Sno = store.Sno
AND store.Sstate = '工作'
ORDER BY store.Sno ;
用户订单视图
用户可以看到订单的信息。
CREATE VIEW view_Cus_look AS SELECT
orderr.Ono,
store.Sname,
orderr.Omoney,
orderr.Ostate,
orderr.Obtime,
orderr.Cno
FROM orderr,store
WHERE store.Sno = Orderr.Sno
ORDER BY orderr.Obtime DESC ;
密码视图
将三类用户的密码整合在一起,并根据来源添加类型字段。方便验证密码。
CREATE VIEW Password ID,'密码','类型'AS
SELECT Cno ,Cpass ,'用户'
FROM Customer
UNION
SELECT Sno,Spass,'商家'
FROM Store
UNION
SELECT Dno,Dpass,'配送员'
FROM Deliverer ;
配送员视图
骑手无法查看订单所有信息,需要快速查看地址电话等,故需要单独设计视图。
CREATE VIEW view_del_unfinish AS
SELECT store.Sname,customer.Caddress,customer.Ctel,orderr.ODelfee,orderr.Ono
FROM store,customer,orderr
WHERE orderr.Ostate = '正在配送'
AND orderr.Sno=store.Sno
AND orderr.Cno=customer