项目实战
点击这里,观看项目说明视频讲解
我们通过一个项目来锻炼 Python 图形界面程序 和 数据处理的 软件开发能力。
该项目主要是为实战班学员提供, 其中的一部分功能是免费开放的,游客也可以锻炼。
可以微信咨询 byhy444
,购买全部实战功能 和 视频讲解、参考代码。
背景概述
假设你是一家互联网教育公司的员工, 该公司有一个教学系统 黑羽学院
,为老师学生提供学习平台。 点击这里查看黑羽学院详细功能
使用该系统一段时间后, 发现我们还需要一些额外的功能 ,比如:数据批量导入导出、消费数据分析等。
公司领导指定你来开发这个软件,名称为 黑羽数据管理
简称 HYDM
要求做成一个 MDI 多功能子窗口的 图形界面程序,方便公司内部使用。 界面如下
下面我们通过分阶段的实战练习,来一步步的开发这个软件。
黑羽学院网站系统安装
要开发的 HYDM
是用来管理 黑羽学院
网站系统 的数据的。
所以要开发,首先得安装好 黑羽学院
网站系统。
具体参考过程,点击这里查看操作步骤和视频讲解
实战1 实现登录功能
系统功能需要登录后才能使用。
登录的账号是 黑羽学院
里面的管理员账号。 目前黑羽学院
系统 中已经存在了一个管理员账号 byhy
,密码 sdfsdf
。
登录时,要使用 黑羽学院
系统的登录接口, 接口定义点击此处查看接口文档
该功能实现后,软件界面如下所示:
点击登录后的主界面可以先只显示一个简单的主窗口即可
点击这里 观看具体的题目要求
大家先自己做。
做完后, 点击这里 观看讲解视频
点击这里 下载参考代码
实战2 菜单栏、工具栏、退出功能
本次练习主要是实现主窗口界面的 菜单栏、工具, 并且实现点击 退出
菜单,可以退回到登录界面的功能。
该功能实现后,软件界面如下所示:
点击这里 观看具体的题目要求
大家先自己做。
做完后, 点击这里 观看讲解视频
点击这里 下载参考代码
实战3 主界面 MDI 子窗口功能
实现 Qt 加载展现 MDI 多个子窗口的功能。
把 系统参数配置功能做在一个子窗口内,并且实现 配置数据的加载 和 修改实时保存
self.sub1=QUiLoader().load('sub1.ui') self.ui.mdiArea.addSubWindow(self.sub1)
点击这里 观看具体的题目要求
该功能实现后,软件界面如下所示:
实战4 优化 - 同类子窗口单例化
MDI子窗口界面一个常见的问题是,每次双击菜单打开,都会启动一个子窗口, 即使该子窗口已经存在。
请改进代码,实现 如果要打开的子窗口已经存在,不要重复打开,而是把存在的子窗口提升到界面最前面。
点击这里 观看具体的题目要求
实战5 操作菜单树控件
图形界面如果功能稍微多一些,功能菜单都放在菜单栏里面就显得很臃肿。
一种常见的做法是,把子功能的操作项放在一个树状的子菜单区。
这次练习开发一个树状控件 存放在主界面左边的 菜单区。
点击这里 观看具体的题目要求
该功能实现后,软件界面如下所示:
实战6 Excel导入账号功能
黑羽学院网站可以一个个的添加用户账号。
但是有的客户是学校,会提交学生名单在Excel中。 这时一个个的添加就很麻烦。
请实现: 点击选择 Excel 文件,通过黑羽学院系统的API接口,批量导入的功能。
学生名单Excel文件里面有多个表单,每个表单存储一个班级的学生信息。
点击这里下载示例学生名单Excel文件 。
黑羽学院系统的添加账号API接口,点击这里查看接口文档
点击这里 观看具体的题目要求
该功能实现后,软件界面如下所示:
实战7 导入课程信息到数据库
有些老师的课程录制视频和教程都是本地存储好的。
要上传课程到平台,一个个的添加太麻烦了。
现在要求老师们 按照一定的格式把 课程信息 和内容 存在在目录中。
请实现: 点击选择 课程信息目录,使用SQL客户端库,直接导入数据库中。
点击这里下载要导入的课程信息zip包,然后解压到本地目录。
点击这里 观看具体的题目要求
要导入数据库,请使用 黑羽平台内部开放的 数据库账号: 用户名 user1
密码 sdfsdf
课程信息涉及到2张表 : by_video
和 by_lesson
,表定义格式如下
CREATE TABLE `by_video` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(200) CHARACTER SET NOT NULL, `url` varchar(255) CHARACTER SET NOT NULL, `author_id` bigint NOT NULL, CONSTRAINT `by_video_author_id_1180705f_fk_by_user_id` FOREIGN KEY (`author_id`) REFERENCES `by_user` (`id`) ) CREATE TABLE `by_lesson` ( `id` bigint NOT NULL AUTO_INCREMENT, `pubdate` datetime(6) NOT NULL, `title` varchar(200) CHARACTER SET NOT NULL, `content` longtext CHARACTER SET , `coverimage` varchar(300) CHARACTER SET DEFAULT NULL, `status` smallint unsigned NOT NULL, `thumbupcount` int unsigned NOT NULL, `favorcount` int unsigned NOT NULL, `price` decimal(6,0) NOT NULL, `purchasecount` int unsigned NOT NULL, `approved` smallint unsigned NOT NULL, `reviewcomments` longtext CHARACTER SET , `videos` longtext CHARACTER SET , `usage` smallint unsigned NOT NULL, `courses` longtext CHARACTER SET , `author_id` bigint NOT NULL, CONSTRAINT `by_lesson_author_id_596d9291_fk_by_user_id` FOREIGN KEY (`author_id`) REFERENCES `by_user` (`id`), )
其中 by_lesson
表 的
status
表示状态,取值含义为 1-发布 2-草稿 3-封禁
,此处固定填写 1 即可。
approved
表示批准状态 ,取值含义为 0-待批准, 1-批准, 2-待修改
,此处固定填写 1 即可。
usage
表示课程是否可以单独出现,还是只能出现在专辑中 1: 可以单独 0:不可以单独
,此处固定填写 1 即可。
videos
字段,格式是如下的json格式,记录了该课程包含的视频信息
[{"id": 8, "name": "xpath1"}, {"id": 9, "name": "xpath2"}, {"id": 10, "name": "xpath3"}]
每个元素表示一个视频,id是视频在 by_video
表里面的记录ID ,name是该视频的名字
该功能实现后,软件界面如下所示:
实战8 深度优先算法 - 树数据保存加载
本次练习的重点是:图形界面树状控件的数据,如何保存到磁盘文件? 如何从磁盘文件加载?
黑羽学院系统中的 目录 和 标签 是一个树状的结构。
我们要实现在HYDM界面上创建、修改 目录、标签树的功能, 并且能够把树的信息保存在本地文件中,方便重启软件时,从本地文件加载。
本次练习使用 递归深度优先算法来实现树结构的 保存和读取。
点击这里 观看具体的题目要求
该功能实现后,软件界面如下所示:
实战9 广度优先算法 - 树数据导入数据库
本次练习的重点是:图形界面树状控件的数据,如何导入到数据库?
黑羽学院系统中的 目录 和 标签 是存储在MySQL数据库表中的。
我们要实现把 Qt界面上的树结构信息推送到数据。
本次练习使用 循环广度优先算法来实现树结构的 数据库存储。
要导入数据库,请使用 黑羽平台内部开放的 数据库账号: 用户名 user1
密码 sdfsdf
目录树 和 标签树 分别对应2张表 : by_category
和 by_tag
,表定义格式都是一样的,如下:
CREATE TABLE `by_category` ( `id` bigint NOT NULL AUTO_INCREMENT, `text` varchar(200) CHARACTER SET NOT NULL, `pid` bigint NOT NULL ) CREATE TABLE `by_tag` ( `id` bigint NOT NULL AUTO_INCREMENT, `text` varchar(200) CHARACTER SET NOT NULL, `pid` bigint NOT NULL )
其中,每条记录对应一个树节点,每条记录的 pid
值就是其父节点的记录ID。
如果该节点是顶层节点,pid值为0
点击这里 观看具体的题目要求
实战10 数据分析 曲线图 和 坐标响应
黑羽学院系统中的 课程、专辑购买 记录 存储在MySQL数据库表 by_purchase_record
中。
我们要根据购买记录,完成一些数据分析。
本次练习要完成:在指定的 某个时间段,获取和分析每天订单数量和金额 数据,画出曲线图。
并且能做到,当鼠标在曲线图界面上移动时,在图表上方和状态栏 显示当前位置对应当天的日期 和当前的订单数量和金额。
开发之前,我们需要创建一些订单数据。
访问黑羽学院网址 http://网站IP地址/memberop-qt.html
在操作网页上点击按钮 重置数据库 - 数据分析环境1(需激活)
,这样就会重置数据库,导入从2019年1月1日到2021年1月1日的大约6万多条订单数据。
MySQL数据库表 by_purchase_record
,表格式如下:
CREATE TABLE `by_purchase_record` ( `id` bigint NOT NULL AUTO_INCREMENT, `producttypeid` smallint unsigned NOT NULL, `productid` bigint unsigned NOT NULL, `quantity` int unsigned NOT NULL, `total_fee` decimal(6,0) DEFAULT NULL, `paiddatetime` datetime(6) NOT NULL, `paymenttype` smallint unsigned DEFAULT NULL, `tradeno_hy` varchar(100) CHARACTER SET DEFAULT NULL, `tradeno_paychannel` varchar(100) CHARACTER SET DEFAULT NULL, `user_id` bigint NOT NULL )
其中 :
producttypeid 表示订单购买的产品类型ID
值为 1 表示 课程,productid 就是课程的ID,对应课程记录 在表 by_lesson 中,
值为 2 表示 专辑,productid 就是专辑的ID,对应专辑记录 在表 by_course 中,
total_fee 表示订单金额
paiddatetime 就是下订单的时间
paymenttype 是付款方式
其取值含义如下:
{1:‘支付宝’,2:‘微信’,3:‘工行卡’,4:‘农行卡’,5:‘招行卡’,6:‘建行卡’,7:‘其它’}
user_id 表示购买者的ID,对应用户记录在表 by_user 中
点击这里 观看具体的题目要求
该功能实现后,软件界面如下所示:
实战11 数据分析 饼图
本次练习承接上次的练习,要完成:在指定的 某个时间段,获取和分析每种购买渠道的订单量,画出饼图
该功能实现后,软件界面如下所示
点击这里 观看具体的题目要求
实战12 数据分析 柱状图
本次练习要完成:在指定的 某个时间段,获取前10名购买量最大的课程 和 前10名购买量最大的专辑。
结果分别画在两张柱状图中,并且在每根柱子的下方列出对应哪套课程名称 和 作者姓名,已经购买量。
该功能实现后,软件界面如下所示:
点击这里 观看具体的题目要求