sosoeeee

“Good-Exchanging” 软件开发经验浅谈

需求分析

本次开发将实现一个物资交换软件,具有以下基本功能:

  1. 该程序允许添加物品的信息,删除物品的信息,显示物品列表,也允许查找物品的信息

  2. 物品有公共的信息(物品名称,物品说明,物品所在地址,联系人手机,邮箱)。为了便于管理和查询,物品可以分成不同的类别(例如食品、书籍、工具等),不同类别的物品可能有不同的属性(例如食品有保质期,数量;书籍有作者,出版社等)。

  3. 互帮互助系统有两种类型的用户:管理员和普通用户。

    • 管理员可以设置新的物品类型(定义物品类型的名称和各个属性),修改物品类型。
    • 普通用户在添加物品时先选择物品类型,然后再填入物品信息。普通用户搜寻物品时,需要先选择类型,再输入关键字,关键字可以再用户名称和说明中进行匹配。

    普通用户需要注册(填入基本信息,包括住址,联系方式等),管理员批准后才能成为正式用户。

  4. 为了便于使用上述功能,软件需要提供GUI。

指定开发计划

开发共分为两个阶段,第一阶段实现基本功能;第二阶段实现进阶功能。

基本功能开发规划

  • 开发语言选择:python
  • 数据库实现:MongoDB
    • 物品信息数据库(物品名称,物品说明,WANTS, 联系人手机,邮箱)
  • 人机交互界面设计:PyQt

使用上述开发环境与工具实现基本的物品管理功能(添加,删除,显示与查找)

进阶功能开发规划

  • 需要添加的新数据库
    • 用户基本信息数据库(用户名,密码,手机,邮箱,住址)
    • 物品信息数据库(物品名称,物品说明,物品所在地址,联系人手机,邮箱,类型,详细信息)
  • 需要更新的窗口
    • 主窗口 ---- 文本框:关键字(模糊查询)---- 按钮:只给管理员显示的管理按钮
    • 物品添加窗口 ---- 文本框:名称,详细信息(同步更新问题),物品说明
  • 需要添加的窗口
    • 用户登陆窗口 ---- 文本框:用户名,密码 ---- 按钮:登陆,注册
    • 用户注册窗口 ---- 文本框:用户名,密码,确认密码,手机,邮箱,住址 ---- 按钮:确定,取消
    • 管理员编辑窗口 ---- 文本框:物品详细信息种类,添加的新类型 ---- 按钮:添加新类型,通过用户请求

任务流程:

  1. 增加用户数据库,新建用户登录(出错提示)与注册窗口(出错提示),主窗口添加当前登录用户的基本信息
  2. 增加管理员编辑窗口,完善相关管理功能(前提要更新物品信息数据库)
  3. 更新物品信息显示窗口,添加详细信息显示窗口,更新物品添加窗口,更新物品删除判定
  4. 完善关键字查询功能

开发经验汇总

  • 使用控制类实现多窗口协同控制

    本次开发过程中,最大的一个困难就是多窗口协同工作。

    以最基础的物品信息上传功能为例,用户需要在弹出的界面完成新物品信息的输入。在信息输入完成后,需要用户通过确定按钮完成信息的上传。

    • 方案一:多线程

    在开发初期的设计中,每个窗口按钮槽函数的设置局限在自己的类中,也就是所说的边界类的操作实现中。这样带来的问题便是,当上传窗口的“确定上传”事件触发时,对应的槽函数由于是在边界类中实现,只能操作自己窗口中的元素,不能同时操作其余窗口的元素。为了解决这个棘手的问题,最初采用的方案是使用多线程实现。主窗口每产生一个需要其余窗口合作的操作请求,便开启一个对应的监视线程。由于线程函数可以作为全局函数实现,所以通过在子窗口类的操作中引入全局变量,实现与线程函数的通信,从而能够在子窗口“确定上传”事件触发后,通过监视线程将信息传递到主窗口,完成主窗口相关变量的更新。

    如此操作浪费资源,需要线程函数的不断监视子窗口的活动状态且实现代码繁琐冗长,于是在之后的开发中使用新的实现思路。

    • 方案二:单独的控制类

    使用一个专门的控制类实现主窗口和所有子窗口按钮的槽函数,控制类属性为各个窗口边界类的实例对象。这样由于窗口是作为属性在控制类中存在,在进一步设计其槽函数时,便可以控制全部窗口的内部属性从而替代了上述繁琐的实现方案。

  • 使用Qt Designer开发将人机交互界面的功能与布局设计分离

    采用Qt Designer使用现有的人机界面设计软件,通过可视化的界面设计生成 .ui 文件,之后采用自动代码生成对应的 .py 文件。这样可以将人机界面布局设计与功能分离,从而提高功能代码的可重用性。

项目代码

该项目代码开源在本人Github的 Goods-Exchanging 上。

posted on 2022-12-31 22:11  sosoeeee  阅读(36)  评论(0编辑  收藏  举报

导航