关于一个图书销售系统的设计与制作
写在前边
前言
我终于对学校的内容开始下手了[手动捂脸.jpg]
因为是一个最终内容的复述,可能会存在部分描述不清的部分。
如果哪里有不清楚的或者是错误的欢迎小可爱们留言,我会及时订正的。
提示
本篇内容及其不走心,只是为了记录这个漫长的制作过程。
产生原因
本部分内容为一个叫做信息系统设计
的课程的一个项目总结,包含了大概的设计过程和部分的数据库描述。
说人话就是一个实验报告,因此有一些可能看起来很硬(不可爱)的部分。
所以,接下来就是正文部分啦!
正文部分
该系统的设计与开发意义
传统的书店管理系统其日常管理工作都是人工操作,存在着许多缺点,如:效率低下、保密性差,另外时间一长,将产生大量的文件和数据,这对于数据的查找、更新和维护都带来了不少的困难,并且浪费了许多人力和物力。特别是中小型书店、个体书店,由于其规模小,硬件投入不大,管理人员水平有限,如果没有一个好的书店管理系统,对于书店的经营是非常不利的。在信息时代,传统的书店管理方式必然被计算机为基础的信息管理系统所取代。因为作为计算机应用的一部分,使用计算机对图书信息进行管理,具有着手工管理所无法比拟的优点.例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高书店管理的效率。因此,开发这样一套书店管理软件成为很有必要的事情。针对上述这种情况,我们小组计划开发一个面向中小型书店、个体书店的书店管理系统,实现对人员、物流的全面管理,以帮助这些书店早日实现书店管理信息化。
开发的任务及目标
1.设计一个书店销售管理系统(BookStore Sales System),基本能够实现书店销售的一些流程,做好信息记录。
2.功能模块包括:销售员登录系统(设置不同人员的登录身份(销售员和管理员),以防有人恶意对数据进行更改),仓库管理系统(即图书入库系统,对所有书籍的信息做好记录,以便查找),销售系统(对书的销售量进行统计,以便做出更好的规划,哪些书畅销,哪些书很少有人买),会员管理系统(对于办理会员的用户给予一定的优惠额度),书籍信息管理系统(管理总店所有可以提供书籍的信息,包括书籍的各种信息)。
3.总体目标设计一套软件能够合理有序的对书店进行信息化的管理。最终目地当然是为商家带来利润了。
系统分析与设计
系统分析需求
分析电脑图书销售管理系统功能及其系统架构,运用UML建模原理对系统设计部分建立模型。
系统目标任务
主要实现的三大功能模块
(1) 登录端
- 销售员登录
- 管理员登录
- 记住密码
- 从记住的密码中读取保存的密码
(2) 管理员端
- 书籍信息管理
- 图书库存管理
- 销售员账户管理
- 锁定系统
(3) 销售员端
- 结账模块
- 库存信息查询
- 销售记录查询
- 锁定系统模块
系统功能需求
- 统一登录界面 使用相同登录界面,采用隐藏的键盘控制键登录不同模块。允许销售员记住密码,管理员账户不允许记住密码。
- 书籍信息管理 可以按照书籍ID或者书籍ISBN号查询已有书籍,修改对应书籍的所有信息。添加新的书籍信息。
- 书籍库存管理 可以按照书籍ID或者书籍ISBN号查询已有书籍在库情况,可以修改选中的在库书籍信息(包括库存数量和售价),以及增加(入库)和删除在库信息。
- 员工账户管理 可以按照员工账户进行查找员工账户条目,可以对于员工账户进行增删改查。
- 锁定系统模块 退出当前的账户登录,提供重新登录的入口。
- 结账系统模块 提供可触控屏幕键盘,收银区域顾客屏幕,收银区域主界面,可以通过扫码枪扫描书籍条形码自动进行结算,无需手动输入。
- 书籍库存查询 可以通过书籍ISBN查询库存情况
- 销售记录查询 可以通过销售的订单编号查询具体订单信息
数据流图
数据字典
名字 | 别名 | 描述 | 定义 | 位置 |
销售员账户信息 | 账户信息 | 定义销售员的账户信息,储存在tb_staff表中,可以对表中的账户和密码进行增删改查操作 | 销售员账户信息=销售员账户名称+销售员账户密码 | null |
书籍详细信息 | 书籍信息 | 定义总店所有书籍的全部详细信息,储存在tb_books_information表中,对所有书籍的详细信息进行修改,可以删除或增加条目。 | 书籍详细信息=书籍id+书籍名 | null |
书籍库存信息 | 库存信息 | 定义总店所有书籍的库存详细信息,储存在tb_book_stock_recording表中,可以对所有书籍的库存信息进行修改,可以删除或增加条目。 | 书籍库存信息=书籍id+书籍库存信息+书籍售价 | null |
顾客详细信息 | 顾客信息 | 定义总店所有顾客的详细信息,储存在tb_customer_list表中,可以查询顾客等级和折扣价格。 | 顾客信息=顾客id+姓名+手机号+身份证号+会员等级 | 顾客信息管理模块 |
最大可购书数量 | null | 为保证公平销售,定义顾客可以购买同一书籍的最大购书数量。 | 最大购书数量=用户等级*最大购书数量系数 | 书籍销售模块 |
用户等级折扣 | 折扣列表 | 定义不同等级对应折扣列表,方便后期进行修改,只需要修改一个数据库即可,便于系统维护。 | null | 书籍销售模块 |
书籍售价 | 售价 | 书籍售价根据商店的销售价格和用户折扣等多方面因素共同决定 | 售价=售价*会员等级对应折扣 | 书籍销售模块 |
书籍库存信息 | 书籍最大库存信息 | 定义书籍的库存信息,并且根据实时的销售情况进行更新。 | null | 书籍销售模块 |
售价订单记录信息 | 订单信息 | 定义销售记录信息。 | 信息=记录id+顾客id+总价+日期 | 书籍销售模块 |
订单详细记录信息 | 订单清单 | 定义书籍的销售详细信息列表,并且根据实时的销售情况进行更新。 | 详细信息=记录id+书籍id+售出价格+书籍售出数量 | 书籍销售模块 |
数据库概念结构设计
局部E-R图如下所示:
总体E-R图如下所示
数据库逻辑结构设计
关系模式
关系模式(下划线为关系的主键)
(1)
- A. 书籍信息(书籍编号, 书籍题目, 书籍国际索书号, 书籍基础价格, 书籍出版社, 书籍分类)
- B. tb_books_information(book_id, book_title, book_ISBN, book_basic_price, book_publisher, book_classification)
(2)
- A. 书籍库存信息(书籍编号, 书籍库存量, 书籍售价)
- B.tb_book_stock_recording(book_id, book_inventory, book_selling_price)
(3)
- A. 用户信息表(会员编号, 姓名, 电话号码, 身份证号, 用户等级)
- B.tb_customer_list(customer_member_id, customer_name, customer_phone_number, customer_ID, customer_member_level)
(4)
- A. 会员等级表(等级,折扣)
- B. tb_customer_membership_levels(customer_membership_level, customer_dis)
(5)
- A. 销售记录(记录编号, 书籍编号, 售出价格, 书籍数量)
- B.tb_sales_recordings(recording_id, book_id, selled_price, book_count)
(6)
- A. 记录详细信息(记录编号, 用户编号, 订单总价, 订单日期)
- B. tb_sales_recordings_date(recording_id, customer_id, total_price, date)
(7)
- A. 销售员账户(用户名, 密码)
- B.tb_staff(username, password)
(8)
- A. 管理员账户(用户名, 密码)
- B.tb_suppere_manager (username, password)
表格描述关系模式
列名 | 数据类型 | 宽度 | 字段描述 |
book_id | varchar | 11 | 书籍编号,设为主键 |
book_title | varchar | 255 | 书籍题目,不许为空值 |
book_ISBN | varchar | 255 | 国际索书号,不许为空值 |
book_basic_price | decimal | 10 | 书籍定价,不许为空值 |
book_publisher | varchar | 255 | 书籍出版社,可以为空值 |
book_classification | varchar | 255 | 书籍分类信息,可以为空值 |
列名 | 数据类型 | 宽度 | 字段描述 |
book_id | varchar | 11 | 书籍编号,设为主键 |
book_inventory | Int | 11 | 书籍库存数量,不许为空值 |
book_selling_price | decimal | 10 | 书籍售价,不许为空值 |
列名 | 数据类型 | 宽度 | 字段描述 |
---|---|---|---|
customer_member_id | varchar | 11 | 成员编号,设为主键 |
customer_name | varchar | 255 | 姓名,不许为空值 |
customer_phone_number | varchar | 11 | 用户手机号,不许为空值 |
customer_ID | varchar | 18 | 身份证号,不许为空值 |
customer_member_level | Int | 10 | 成员等级,可以为空值 |
列名 | 数据类型 | 宽度 | 字段描述 |
---|---|---|---|
customer_membership_level | Int | 10 | 用户等级,设为主键 |
customer_discount | Float | 3 | 折扣,不许为空值 |
列名 | 数据类型 | 宽度 | 字段描述 |
---|---|---|---|
recording_id | varchar | 11 | 记录编号,不许为空值 |
book_id | varchar | 13 | 书籍编号,不许为空值 |
selled_price | decimal | 10 | 书籍售价,不许为空值 |
book_count | int | 10 | 售出数量,不许为空值 |
列名 | 数据类型 | 宽度 | 字段描述 |
---|---|---|---|
recording_id | varchar | 11 | 记录编号,设为主键 |
customer_id | varchar | 13 | 用户编号,允许为空值 |
total_price | decimal | 10 | 订单总价,不许为空值 |
date | int | 10 | 订单日期,不许为空值 |
列名 | 数据类型 | 宽度 | 字段描述 |
---|---|---|---|
username | varchar | 20 | 用户名,设为主键 |
password | varchar | 10 | 密码,不许为空值 |
列名 | 数据类型 | 宽度 | 字段描述 |
---|---|---|---|
username | varchar | 20 | 用户名,设为主键 |
password | varchar | 10 | 密码,不许为空值 |
数据库物理结构设计
确定数据的存储结构
MySQL数据库表
给出要创建的索引
- (1)书籍信息表tb_books_information:创建外键自动创建book_ISBN索引
- (2)书籍库存表tb_book_stock_recording:创建外键自动创建fk_book_id索引
- (3)用户信息表tb_customer_list:创建外键自动创建fk_member_level索引
- (4)销售记录表tb_sales_recordings:创建外键自动创建fk_book_id1索引
- (5)销售记录详细表tb_sales_recordings_date:创建外键创建fk_customer_id索引
数据库创建
创建数据库IS_DESIGN
创建一个名为IS_Design
的数据库
在’‘‘IS_DESIGN’’'数据库中建表
创建书籍信息表tb_books_information
创建书籍库存信息表tb_book_stock_recording
(1)创建表
(2)创建外键
创建用户信息表tb_customer_list
(1)创建表
(2) 创建外键
创建用户等级表tb_customer_membership_levels
创建销售记录信息表tb_sales_recordings
(1) 创建表
(2) 创建外键
创建销售记录日期表tb_sales_recordings_date
(1) 创建表
(2) 创建外键
创建销售员账户信息表tb_staff
创建超级管理员账户信息表tb_suppere_manager
数据
关于书籍信息的数据,我采用了python爬虫爬取当当网的信息,在这里有一篇详细介绍的文章。
系统总体结构设计
总体结构图
https://img.cha.moe/img/blog/article/isdesign/AllStructure.png
系统开发及实现
开发技术简述
Client使用C#控制台应用程序实现的可视化窗口,使用MySQL作为后台数据库。
登录模块
实现功能
登录
根据用户是否按下快捷键,查询身份登录到对应的界面。
记住密码
记住销售员的账户和密码。
退出
退出该系统。
界面设计效果
实现方法
登录
在登录按钮被单击之前,根据预设隐藏快捷键,决定是否登录管理员账户,如果隐藏组合键没有被按下,系统自动查询tb_staff表,如果被按下,系统自动查询tb_super_manager表,对应是否应该登录对应界面。
记住密码
登录之前检测账户类型,如果账户类型为销售员,则如果登陆成功,自动保存密码到本地文件userInfo.exe中进行加密二进制处理,如下图所示
退出
使用Application.Exit();退出该系统。
管理员端口
实现功能
信息管理
(1)书籍信息管理模块 在该模块中,管理员可以向书籍信息表中添加新书籍,删除某些书籍条目,更改书籍的基本信息(基准价、出版社、分类、题目允许被修改,但是书籍编号和ISBN编号不允许被修改),在书籍编号和ISBN中的文本框任选一个进行查询。即可查询寻对应信息。
(2)库存信息管理模块 在该模块中,管理员可以向书籍库存管理表中增加新的库存信息,更新某些库存信息。
账户管理
(1)员工账户管理 在该模块中,管理员可以向员工账户信息表中添加新的书籍信息,删除某些员工账户,修改某些员工账户的账户名和密码。
锁定
返回登录模块
退出
退出该系统。
页脚
显示登陆用户,管理员admin
界面设计效果
管理员登录界面
(1) 登陆 账号:admin,密码:admin,按下隐藏加你cmd+opt+s按键
(2) 超级管理员身份登录进入管理端
数据管理
(1) 书籍信息管理 增删改查以及重新写书籍详细信息
(2) 库存管理 更新管理书籍库存信息
销售员账户管理
(1) 员工账户管理模块 增删改查员工账户
锁定 返回登录模块
退出 退出整个程序
页脚 显示登录用户,超级管理员:admin
实现方法
数据管理
(1) 书籍信息管理
- 连接书籍基本信息表进行增删改查。
- 所有数据在listview中显示
- 在点击某一条目之后,在对应文本框中显示,可以修改相应条目的信息。
- 遍历清空文本框、listview信息进行刷新。
- 在书籍编号查询的时候执行语句进行查询
1 | "select * from tb_books_information where book_id = "BookIDtextBox.Text"; |
- 在在书籍国际索书号查询的时候执行语句
1 | select * from tb_books_information where book_ISBN = ' ISBNtextBox.Text'; |
(2) 书籍库存管理
- 连接书籍库存信息表进行增删改查。
- 所有数据在listview中显示
- 在点击某一条目之后,在对应文本框中显示,可以修改相应条目的信息。
- 遍历清空文本框、listview信息进行刷新。
- 进行查询时执行
1 | select * from tb_books_information where book_id = 'BookIDtextBox.Text'; |
账户管理
(1) 员工账户管理模块
- 连接员工账户信息表进行增删改查。
- 可以根据输入的员工账户进行查询。
- 在点击某一条目之后,在对应文本框中显示,可以修改相应条目的信息。
- 进行查询时执行
1 | Insert tb_name Values ('AccounttextBox.Text', 'PasswordtextBox.Text'); |
锁定
(1) 执行语句Application.Restart();
退出
(1) 执行语句Application.Exit();
页脚
(1) 显示登录用户,超级管理员admin。即将登录页面中的账号传到全局变量```GlobalClass.cs``中。
(2) 使用代码如下
1 | GlobalClass.user.strUsrId = comboBox1.Text; |
销售员端口
实现功能
结账
(1) 用户屏幕 用户可以看到实时结算信息。
(2) 操作用屏幕键盘 销售员为用户结算时操作的键盘。
(3) 结算界面 实时自动计算当前扫描过的书籍的价格。
信息查询
(1) 书籍库存查询 在该模块中,销售员可以通过ISBN进行库存查询。
(2) 销售记录查询 在该模块中,销售员可以通过订单编号进行订单查询。
锁定
返回登录模块
退出
退出整个程序
页脚
显示登陆用户,销售员staff
界面设计效果
员工登陆界面
(1) 登陆 账号:staff,密码:staff,选择保存密码,点击登录按钮。
(2) 销售员(员工)身份登录进入管理端
结账
(1) 用户屏幕 显示实时扫描的书籍名称和单本价格,以及总价格。
(2) 销售键盘 显示部分快捷操作
(3) 查询价格 (单本书籍)
(4) 结算界面(收银台) 实时显示当前所有扫描待结算的书籍信息。
信息查询
(1) 库存查询 根据ISBN号查询库存量
(2) 订单查询 根据订单编号查询订单信息
锁定 返回登录模块
退出 退出整个程序
页脚 显示登录用户,超级管理员:admin()
注:这里应该是销售员:staff
但是截图错了,懒得改了
实现方法
结账
(1) 屏幕
- 在非结算的时候,显示欢迎光临。
- 结算的时候显示当前书籍名称和书籍单价,在下方显示总价。
(2) 键盘
- 点击会员按钮可以输入或扫描会员编号,识别会员身份。
- 点击查价格可以弹出查询价格窗口进行ISBN价格查询。
- 点击扫描按钮可以自动定位到ISBN输入框进行输入或者扫描。
- 键盘提供数字键盘便于ISBN号输入
- 键盘提供了上下选择按钮,便于快速选择已经扫描的书籍进行删除或修改本数。
(3) 收银台
- 可以输入会员编号
- 可以修改每本书籍的价格
- 拥有打印购物小票按钮
信息查询
(1) 书籍库存查询
- 连接书籍库存信息表进行查询。
- 所有数据在listview中显示
- 在书籍编号查询的时候执行语句进行查询
1 | select * from tb_books_information where book_id = 'BookIDtextBox.Text'; |
(2) 书籍订单查询
- 连接书籍库存信息表进行增删改查。
- 所有数据在listview中显示
- 在点击某一条目之后,在对应文本框中显示,可以修改相应条目的信息。
- 遍历清空文本框、listview信息进行刷新。
- 进行查询时执行下述代码进行表两个表的查询和拼接。
1 | select * from tb_sales_recordings_date where recording_id = 'RecordingID.Text';和select * from tb_sales_recordings where recording_id = ' RecordingID.Text';进行tb_sales_recordings_date表和tb_sales_recordings |
锁定
(1) 执行语句Application.Restart();
退出
(1) 执行语句Application.Exit();
页脚
(1) 显示登录用户,员工:staff。即将登录页面中的账号传到全局变量GlobalClass.cs中。
(2) 使用代码如下
1 | GlobalClass.user.strUsrId = comboBox1.Text; |
总结
对题目进行系统需求分析。(进行简单的描述目标、画出数据流图、构造数据字典)、设计系统总体结构(画出系统总体结构图)、设计数据库的概念结构(同时绘制E-R图)、设计数据库的逻辑结构(用表格描述关系模式的属性名、类型和完整性约束等等内容)、设计数据库的物理结构(即需要创建的索引)、创建数据库等多步骤。
使用E-R图表示抽象概念,之后转换成关系模式,如上述内容,使用表格表述命令、约束条件和索引等信息。使用基于MySQL的Navicat可视化方式和进行构建所需要的数据库相关信息。
代码部分
鉴于这个系统我写了好多好多代码,所以就不放在这个页面了。
传送门在这里。
在服务器中住着的AKI娘会检测您的输入内容哦, 如果被判断为垃圾内容是看不到的呢!当然抹茶也会定期检查AKI娘的所作所为的!