目 录
设 计 总 说 明 I
目 录 i
第1章 绪论 1
1.1 开发背景及目的意义 1
1.2 国内外现状 1
1.2.1 国内现状 1
1.2.2 国外现状 1
1.3 开发工具、语言及环境 1
1.3.1 pyCharm 简介 1
1.3.2 msSQL简介 1
1.3.3 开发语言python 1
第2章 系统分析 3
2.1 系统需求分析 3
2.2 系统目标 3
2.3 系统功能 3
2.3.1 前台应用程序 3
2.3.2 后台数据库 3
2.4 可行性分析 3
2.4.1 经济可行性分析 3
2.4.2 技术可行性分析 3
2.4.3 操作可行性分析 4
2.5 数据流图 4
2.6数据字典 4
2.6.1 数据元素 4
2.6.2数据存储 5
2.6.3 数据流 6
2.6.4 数据处理 6
第3章开发技术介绍 8
3.1 pymssql介绍 8
3.1.1 配置环境 8
3.1.2 连接MSSQL 8
3.2 PyQt5介绍 8
3.2.1 配置环境 8
第4章 系统设计 9
4.1 系统目标 9
4.2 系统功能划分 9
4.2 模块简介及功能 9
4.2.1 图书管理模块 9
4.2.2 顾客管理模块 10
4.2.3 销售模块 10
4.3.4 图书查询模块 10
4.3.5 人员信息管理 10
4.3.6 销售统计模块 10
4.3 业务流程图 11
第5章 数据库设计 13
5.1 数据库概要设计 13
5.1.1系统E-R图 13
5.2数据库逻辑设计 13
5.3 数据库物理设计 13
第6章 数据库实施 17
6.1 数据库构建 17
6.1.1 数据说明表 17
6.1.2 数据库创建(使用SQL语句的数据库模型) 17
6.2 数据库迁移和导入方案 20
6.2.1数据库迁移 20
6.2.2数据库导入 20
第7章 系统界面设计和后台代码 21
7.1 系统界面设计 21
7.1.1 登录模块界面 21
7.1.2 管理员界面 21
7.1.3售货员界面 22
7.1.4图书查找界面 23
7.1.5 图书管理模块界面 24
7.1.6 销售人员管理模块 25
7.1.7 信息查看模块 25
7.1.8 购买模块 25
7.1.9 退货模块 26
7.2 主要模块代码 27
7.2.1 数据处理 27
7.2.2 登录模块 29
7.2.3 图书管理模块 30
7.2.4 图书购买模块 31
7.2.5 密码修改模块 33
第8章 安装使用和说明 34
8.1安装说明 34
8.1.1安装python 34
8.1.2安装插件 34
8.1.3附加数据库 34
8.1.4运行 34
第9章 结论与展望 35
9.1 结论 35
9.2 不足之处及未来展望 35
参考文献 36
第2章 系统分析
2.1 系统需求分析
本次课程设计的题目是:书店销售管理子系统,其具体内容如下:
书店希望借助一个销售管理子系统实现对现有业务的管理。该书店目前采用会员制,顾客购买书籍累积达到一定金额后,凭购书发票可填表申请成为正式会员,会员在购书时享有一定折扣,折扣额度可变化。该书店不定期地会推出促销活动,要求图书的价格是可变更的。系统主要功能如下:
★ 图书入库管理:维护入库图书信息(如图书编号、书名、作者、价格、图书分类、出版社等),自动计算库存。
★ 图书查询统计:按图书分类,出版社、书名、作者等条件查询图书的详细信息。
★ 销售管理:销售过的图书都记录在销售列表中,方便统计收入。图书销售后,实时记录图书库存,按每天统计销售额、按每个月或季度统计销售额并生成报表,并能根据销售数量统计生成畅销书名单。
★ 书店会员管理:提供会员信息的维护功能,可设置会员等级,不同级别的会员享受不同的折扣,可以变更折扣额度。
★ 系统管理:包括参数设置、权限设置、更改密码等。用户包括系统管理员和销售人员。系统管理员维护整个系统的数据
2.2 系统目标
本系统要实现书店销售管理,实现书店销售的系统化,自动化和高效率。能够实现,图书管理,图书销售,销售统计,管理员对销售人员的管理,等功能,以及各角色的交互等。
2.3 系统功能
书店销售管理子系统的开发主要包括应用程序系统和后台数据库,应用程序系统要求界面友好,功能完备,易使用等特点.而后台数据库的数据要具有一致性、完整性、安全性.
2.3.1 前台应用程序
前台应用程序重在实现用户和系统的交互,在功能强大的同时,也要简洁和操作方便。目的是让调度环节更高效,在保证操作正确性的情况下,免去不必要的操作。
2.3.2 后台数据库
后台数据库在考虑前台访问操作简便的同时,提供强大的管理模式。数据库结构合理,完整,权限设计符合实际,安全性良好。
2.4 可行性分析
2.4.1 经济可行性分析
系统的经济可行性分析是指对组织的经济状况和投资能力进行分析,对系统的建设运营和维护费用进行估算,对系统建成后可能取得的社会及经济效益进行估计.
由于本系统作为平时的课程设计,所以在资金上几乎没有任何需求。
所以说在经济方面本系统的开发是完全可行的.
2.4.2 技术可行性分析
随着互联网和信息技术的发展,信息技术从根本上改变了人类社会的生产方式和生活方式,计算机的应用随处可见.书店销售管理子系统主要是对书店信息进行管理,实现增、删、改、查等功能。既然利用计算机管理是大势所趋,而开发一个书店销售管理又能够获得事半功倍的效果.并且,随着数据库管理系统的广泛应用以及可视化编程工具的出现,本系统便使用了pyCharm集成开发环境以及PyQt5, QT进行前台的开发,由于可视化模块比较强大,所以在系统的设计过程中不会有太大问题,本文转载自http://www.biyezuopin.vip/onews.asp?id=15236同时本系统使用ms SQL对后台的数据进行操作,使得数据完整性得以保证,同时数据操作简单化.
以上这些都为开发一个餐饮管理系统提供了技术上的支持,所以说开发一个书店销售管理子系统在技术方面来讲是完全可行的.
2.4.3 操作可行性分析
本系统直观易懂,本身不是很复杂,使用非常方便,测试完毕后即可用于实际的管理.管理员经过简单的培训就可以熟练的使用,当进行数据修改时都有适当的提示,和消息确认,增加了人工错误的容错性。
综上所述,开发一个书店销售管理系统,在一定程度优化了书店的销售管理,因此开发这个书店销售管理系统是完全可行的.
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QFrame, QDialog
from UIMyBase import UIMy_base
from UIBookManage_frame import Ui_Frame_BookManage
from DbMyClass import *
class UIBookManage(QFrame, Ui_Frame_BookManage , UIMy_base):
def __init__(self, parent=None, x = 0, y = 0, xx = 1, yy = 1, mode = None, pushButton = None):
"""
:param parent: 父窗口
:param x: X位置
:param y: Y位置
:param xx: 占高度
:param yy: 占宽度
布局管理, 咱也不太明白怎么回事
:param mode:模式 MODE_ADD MODE_DEL MODE_CHANGE 三种
:param pushButton: 按本返回键后要显示的内容,不一定要是pushButtonButton
"""
super(UIBookManage, self).__init__()
self.setupUi(self)
self.time = 0
self.connect_to_db()
self.my_layout(parent, x, y, xx, yy)
self.extern_button = pushButton
self.mode = mode
self.pushButton_pre_view_cancel.hide()
if mode == self.MODE_ADD:
self.label_bno.hide()
self.pushButton_choose.hide()
self.pushButton_del.hide()
self.pushButton_change.hide()
self.widget_3.hide()
self.widget_2.hide()
self.lineEdit_bno_choose.hide()
self.pushButton_add.setEnabled(False)
self.pushButton_add.setEnabled(False)
elif mode == self.MODE_DEL:
self.pushButton_change.hide()
self.pushButton_add.hide()
self.pushButton_del.setEnabled(False)
self.widget.hide()
self.widget_4.hide()
elif mode == self.MODE_CHANGE:
self.pushButton_del.hide()
self.pushButton_add.hide()
self.pushButton_change.setEnabled(False)
self.label_table_name.setText('修改后的书籍信息')
def on_pushButton_back_released(self):
print("返回")
self.close()
try:
self.extern_button.show()
del(self)
except AttributeError:
print("no EXtern show")
def on_pushButton_choose_released(self):
print("book chose pushButton is prsed")
bno = self.lineEdit_bno_choose.text()
exec = self.dbcur.select_parmeter_deal("Book", Bno = DbSelect.str_add_quotation(bno))
self.dbcur.run_exec(exec)
list = self.dbcur.cursor_data_to_list()
if len(list) == 0:
self.pushButton_choose.setEnabled(False)
self.dialog_text("该书号不存在", "提示")
self.pushButton_choose.setEnabled(True)
return
else:
self.lineEdit_bno_3.setText(str(bno))
self.lineEdit_bname_3.setText(str(list[0][1]))
self.lineEdit_bauthor_3.setText(str(list[0][2]))
self.lineEdit_bprice_3.setText(str(list[0][3]))
self.comboBox_btype_3.setCurrentText(str(list[0][4]))
self.lineEdit_bpublish_3.setText(str(list[0][5]))
self.lineEdit_bnum_3.setText(str(list[0][6]))
self.pushButton_del.setEnabled(True)
self.data_copy_widget1_to_widget3()
def data_copy_widget1_to_widget3(self):
self.lineEdit_bno.setText(str(self.lineEdit_bno_3.text().strip()))
self.lineEdit_bname.setText(str(self.lineEdit_bname_3.text().strip()))
self.lineEdit_bauthor.setText(str(self.lineEdit_bauthor_3.text().strip()))
self.lineEdit_bprice.setText(str(self.lineEdit_bprice_3.text().strip()))
self.comboBox_btype.setCurrentText(str(self.comboBox_btype_3.currentText().strip()))
self.lineEdit_bpublish.setText(str(self.lineEdit_bpublish_3.text().strip()))
self.lineEdit_bnum.setText(str(self.lineEdit_bnum_3.text().strip()))
def data_clear_widget(self):
self.lineEdit_bno.clear()
self.lineEdit_bname.clear()
self.lineEdit_bauthor.clear()
self.lineEdit_bprice.clear()
self.lineEdit_bpublish.clear()
self.lineEdit_bnum.clear()
self.comboBox_btype.setCurrentText("无")
def data_clear_widget_3(self):
self.lineEdit_bno_3.clear()
self.lineEdit_bname_3.clear()
self.lineEdit_bauthor_3.clear()
self.lineEdit_bprice_3.clear()
self.comboBox_btype_3.setCurrentText("无")
self.lineEdit_bpublish_3.clear()
self.lineEdit_bnum_3.clear()
def on_pushButton_del_released(self):
print('on_pushButton_del_released')
bno = self.lineEdit_bno_3.text()
if bno == '':
return
self.pushButton_del.setEnabled(False)
flag = self.dialog_yes_no("是否删除?", "确认")
if flag is True:
if self.dbcur.delete_book(bno):
self.dialog_text("删除成功","提示窗")
self.data_clear_widget_3()
self.pushButton_del.setEnabled(False)
else:
self.dialog_text("删除失败 可能存在外键限制","提示窗")
def on_pushButton_add_released(self):
print("on_pushButton_add_released")
self.pushButton_add.setEnabled(False)
flag = self.dialog_yes_no("是否添加","提示")
if flag is True:
flag = self.dbcur.book_insert(
self.lineEdit_bno.text().strip(),
self.lineEdit_bname.text().strip(),
self.lineEdit_bauthor.text().strip(),
self.lineEdit_bprice.text().strip(),
self.comboBox_btype.currentText().strip(),
self.lineEdit_bpublish.text().strip(),
self.lineEdit_bnum.text().strip(),
)
if flag is True:
self.dialog_text("添加成功", "提示")
self.widget_3.setEnabled(True)
else:
self.dialog_text("添回失败 可能主键冲突", "提示")
else:
self.pushButton_add.setEnabled(True)
def on_pushButton_pre_view_released(self):
print("on_pushButton_pre_view_released")
if self.check_add_book() is True:
self.widget.setEnabled(False)
self.pushButton_pre_view_cancel.show()
self.pushButton_pre_view.hide()
self.pushButton_add.setEnabled(True)
self.pushButton_change.setEnabled(True)
else:
self.pushButton_pre_view.setEnabled(False)
self.dialog_text("输入模式有误 请检查看重新输入", "提示")
self.pushButton_pre_view.setEnabled(True)
def on_pushButton_pre_view_cancel_released(self):
self.widget.setEnabled(True)
self.pushButton_pre_view_cancel.hide()
self.pushButton_pre_view.show()
self.pushButton_add.setEnabled(False)
self.pushButton_change.setEnabled(False)
def on_pushButton_cancel_released(self):
print('on_pushButton_cancel_released')
self.data_clear_widget_3()
self.data_clear_widget()
self.pushButton_del.setEnabled(False)
self.pushButton_change.setEnabled(False)
def on_pushButton_change_released(self):
print('on_puchButton_change_released')
self.pushButton_change.setEnabled(False)
set = self.get_set_parmeter()
print(set)
if len(set) == 0:
self.dialog_text("内容未做变更", '提示')
else:
if self.dialog_yes_no("确认修改", "确认") is True:
updata = self.dbcur.updata_parmeter_deal('Book', set, {'Bno':self.lineEdit_bno.text().strip()})
# print(updata)
if self.dbcur.update_run_exec(updata):
self.dialog_text("修改成功", '提示')
else:
self.dialog_text("修改失败", '提示')
else:
self.widget.setEnabled(True)
self.pushButton_pre_view.show()
self.pushButton_pre_view_cancel.hide()
def get_set_parmeter(self):
set = {}
if self.lineEdit_bno_3.text().strip() == self.lineEdit_bno.text().strip():
pass
else:
set['Bno'] = self.lineEdit_bno.text().strip()
if self.lineEdit_bname_3.text().strip() == self.lineEdit_bname.text().strip():
pass
else:
set['Bname'] = self.lineEdit_bname.text().strip()
if self.lineEdit_bauthor_3.text().strip() == self.lineEdit_bauthor.text().strip():
pass
else:
set['Bauthor'] = self.lineEdit_bauthor.text().strip()
if self.lineEdit_bprice_3.text().strip() == self.lineEdit_bprice.text().strip():
pass
else:
set['Bprice'] = self.lineEdit_bprice.text().strip()
if self.comboBox_btype.currentText().strip() == self.comboBox_btype.currentText().strip():
pass
else:
set['Btype'] = self.comboBox_btype.currentText().strip()
if self.lineEdit_bpublish_3.text().strip() == self.lineEdit_bpublish.text().strip():
pass
else:
set['Bpublish'] = self.lineEdit_bpublish.text().strip()
if self.lineEdit_bnum_3.text().strip() == self.lineEdit_bnum.text().strip():
pass
else:
set['Bnum'] = self.lineEdit_bnum.text().strip()
return set
def check_add_book(self):
flag = DbInsert.insert_data_check_book(
self.lineEdit_bno.text().strip(),
self.lineEdit_bname.text().strip(),
self.lineEdit_bauthor.text().strip(),
self.lineEdit_bprice.text().strip(),
self.comboBox_btype.currentText().strip(),
self.lineEdit_bpublish.text().strip(),
self.lineEdit_bnum.text().strip(),
)
if flag == DbInsert.BOOK_INSERT_OK:
return True
else:
return False
MODE_ADD = 1
MODE_DEL = 2
MODE_CHANGE = 3
if __name__ == '__main__':
app = QApplication(sys.argv)
book_choose = UIBookManage()
book_choose.show()
sys.exit(app.exec_())