项目实战

点击这里,观看项目说明视频讲解

我们通过一个项目来锻炼 Python 图形界面程序 和 数据处理的 软件开发能力。

该项目主要是为实战班学员提供, 其中的一部分功能是免费开放的,游客也可以锻炼。

可以微信咨询 byhy444 ,购买全部实战功能 和 视频讲解、参考代码。

背景概述

假设你是一家互联网教育公司的员工, 该公司有一个教学系统 黑羽学院 ,为老师学生提供学习平台。

使用该系统一段时间后, 发现我们还需要一些额外的功能 ,比如:数据批量导入导出、消费数据分析等。

公司领导指定你来开发这个软件,名称为 黑羽数据管理 简称 HYDM

要求做成一个 MDI 多功能子窗口的 图形界面程序,方便公司内部使用。 界面如下

image


下面我们通过分阶段的实战练习,来一步步的开发这个软件。

黑羽学院网站系统安装

点击这里,观看黑羽学院网站系统安装视频讲解

要开发的 HYDM 是用来管理 黑羽学院 网站系统 的数据的。

所以要开发,首先得安装好 黑羽学院 网站系统。

为了方便大家开发,我们把 黑羽学院 网站系统 安装到了VirtualBox虚拟机中,并且导出了该镜像,保存在如下的网盘链接中:

https://cloud.189.cn/t/BJbq2qMzEVjm


请大家在自己的电脑上安装VirtualBox, 并下载该镜像文件。

然后,按照这里的视频讲解 导入该镜像为自己的虚拟机。导入过程参考这里的视频讲解

该虚拟机开机即可自动运行 黑羽学院 网站系统。


由于虚拟机的是桥接网络,所以IP地址是由你电脑连接的路由器分配的,不是固定的。

要查看虚拟机的网络地址,请在虚拟机内的Linux系统使用 账号 jcy 密码 sdfsdf 登录。

登录成功后,会显示系统的IP地址。 如果电脑休眠后打开,IP地址可能会变化,可以执行命令 python3 showip.py 查看


注意:该系统有一部分功能是为实战班学习提供的,需要激活才能使用。

实战1 实现登录功能

系统功能需要登录后才能使用。

登录的账号是 黑羽学院 里面的管理员账号。 目前黑羽学院系统 中已经存在了一个管理员账号 byhy ,密码 sdfsdf

登录时,要使用 黑羽学院系统的登录接口, 接口定义点击此处查看接口文档


该功能实现后,软件界面如下所示:

image

点击登录后的主界面可以先只显示一个简单的主窗口即可

点击这里 观看具体的题目要求


大家先自己做。

做完后, 点击这里 观看讲解视频

点击这里 下载参考代码

实战2 菜单栏、工具栏、退出功能

本次练习主要是实现主窗口界面的 菜单栏、工具, 并且实现点击 退出 菜单,可以退回到登录界面的功能。


该功能实现后,软件界面如下所示:

image


点击这里 观看具体的题目要求


大家先自己做。

做完后, 点击这里 观看讲解视频

点击这里 下载参考代码

实战3 主界面 MDI 子窗口功能

实现 Qt 加载展现 MDI 多个子窗口的功能。

把 系统参数配置功能做在一个子窗口内,并且实现 配置数据的加载 和 修改实时保存


点击这里 观看具体的题目要求


该功能实现后,软件界面如下所示:

image

实战4 优化 - 同类子窗口单例化

MDI子窗口界面一个常见的问题是,每次双击菜单打开,都会启动一个子窗口, 即使该子窗口已经存在。

请改进代码,实现 如果要打开的子窗口已经存在,不要重复打开,而是把存在的子窗口提升到界面最前面。

点击这里 观看具体的题目要求

实战5 操作菜单树控件

图形界面如果功能稍微多一些,功能菜单都放在菜单栏里面就显得很臃肿。

一种常见的做法是,把子功能的操作项放在一个树状的子菜单区。

这次练习开发一个树状控件 存放在主界面左边的 菜单区。


点击这里 观看具体的题目要求


该功能实现后,软件界面如下所示:

image

实战6 Excel导入账号功能

黑羽学院网站可以一个个的添加用户账号。

但是有的客户是学校,会提交学生名单在Excel中。 这时一个个的添加就很麻烦。

请实现: 点击选择 Excel 文件,通过黑羽学院系统的API接口,批量导入的功能。

学生名单Excel文件里面有多个表单,每个表单存储一个班级的学生信息。


点击这里下载示例学生名单Excel文件 。


黑羽学院系统的添加账号API接口,点击这里查看接口文档


点击这里 观看具体的题目要求


该功能实现后,软件界面如下所示:

image

实战7 导入课程信息到数据库

有些老师的课程录制视频和教程都是本地存储好的。

要上传课程到平台,一个个的添加太麻烦了。

现在要求老师们 按照一定的格式把 课程信息 和内容 存在在目录中。

请实现: 点击选择 课程信息目录,使用SQL客户端库,直接导入数据库中。


点击这里下载要导入的课程信息zip包,然后解压到本地目录。


点击这里 观看具体的题目要求


要导入数据库,请使用 黑羽平台内部开放的 数据库账号: 用户名 user1 密码 sdfsdf

课程信息涉及到2张表 : by_videoby_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是该视频的名字


该功能实现后,软件界面如下所示:

image

实战8 深度优先算法 - 树数据保存加载

本次练习的重点是:图形界面树状控件的数据,如何保存到磁盘文件? 如何从磁盘文件加载?


黑羽学院系统中的 目录 和 标签 是一个树状的结构。

我们要实现在HYDM界面上创建、修改 目录、标签树的功能, 并且能够把树的信息保存在本地文件中,方便重启软件时,从本地文件加载。

本次练习使用 递归深度优先算法来实现树结构的 保存和读取。


点击这里 观看具体的题目要求


该功能实现后,软件界面如下所示:

image

实战9 广度优先算法 - 树数据导入数据库

本次练习的重点是:图形界面树状控件的数据,如何导入到数据库?


黑羽学院系统中的 目录 和 标签 是存储在MySQL数据库表中的。

我们要实现把 Qt界面上的树结构信息推送到数据。

本次练习使用 循环广度优先算法来实现树结构的 数据库存储。


要导入数据库,请使用 黑羽平台内部开放的 数据库账号: 用户名 user1 密码 sdfsdf

目录树 和 标签树 分别对应2张表 : by_categoryby_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 中


点击这里 观看具体的题目要求


该功能实现后,软件界面如下所示:

image

实战11 数据分析 饼图

本次练习承接上次的练习,要完成:在指定的 某个时间段,获取和分析每种购买渠道的订单量,画出饼图

该功能实现后,软件界面如下所示

image


点击这里 观看具体的题目要求

实战12 数据分析 柱状图

本次练习要完成:在指定的 某个时间段,获取前10名购买量最大的课程 和 前10名购买量最大的专辑。

结果分别画在两张柱状图中,并且在每根柱子的下方列出对应哪套课程名称 和 作者姓名,已经购买量。

该功能实现后,软件界面如下所示:

image


点击这里 观看具体的题目要求

上一页