第一章 绪论
1.1 选题背景
近几年来,传统商业与电商似乎是水火不容,大有不是你死便是我活的劲头。一直以来舆论都是一边倒的电商将迅速取代传统零售的论调,然而几年过去,电商的发展确实值得侧目,但传统商业虽然受到不小的影响,也依然顽强地挺立。
事实上,就零售市场总规模而言,仍然是实体零售的天下,85%以上的市场份额还是在实体零售的手里。而为了实体零售更好更快的发展,很有必要利用现代科学技术提高实体零售的信息化管理,降低销售成本,将销售利益最大化。
商业自动化的管理在欧美等国已实行了多年,也是零售业管理的基础。它最主要的特点是能够实时和准确的控制店内的销售情况。如果可以实时掌控销售流程及销售情况。则可以有效地加速商品的周转率并提高服务质量。一般的零售业销售必须是快速而且不允许出错的,如果能在销售前尽早地了解目前商品的库存情况,并且掌握商品的周转率,就可以减少销售中的供过于求或供不应求等情况的发生。
因此,针对实体零售开发一套界面美观,数据安全,应用灵活的销售管理系统就显得尤为重要了。繁琐复杂的操作反而会降低工作效率,所以销售系统力求简洁,着重点放在商品进销存方面,以达到预期目标。
1.2 目的和意义
随着商品销售的现代化发展,其经营管理也变得愈加复杂,早期售货记账统计的形式已经不能满足销售业的快速发展,这样就迫切地需要引进新的思想和管理技术进行销售管理。
传统人工销售管理中,存在着种种负面状况,如:不能有效地管理每一种商品,收款结算速度慢,容易出现营业差错,不宜进行商品调价,盘点效率低等,而且在日常管理中,商品进销存决策以经验为主,缺乏实时分析功能,管理人员对及时传递资料的要求始终得不到满足,随着零售业销售形态的高速发展,销售过程中产生的数据量也愈加庞大,商业运转的中间环节不断增多,原始的人工管理已无法应对这样复杂的市场。这样,零售业对现代化销售管理系统的需求与日剧增。
因此,在本次课程设计中,我选择开发一款适应市场需求的销售管理系统,将传统销售管理信息化,实时反馈进销存状况,帮助管理人员对市场变化做出快速决策,节省成本投入,提高管理效率,加快商品销售的发展。
1.3 开发工具及技术
本系统基于C/S架构,采用MVC设计模式实现,技术选型为java8 GUI(图形化界面)中的Swing轻量级控件,为了提升系统的数据交互性能,数据持久层方面基于JDBC封装了一套基础工具。
开发工具主要有Eclipse Mars版本、MySQL 5.7版本、HeidiSQL 9.3版本。
下面分别对C/S架构、MVC设计模式、Swing编程、Eclipse Mars集成开发环境、MySQL 5.7数据库和HeidiSQL 9.3数据库管理系统进行简要介绍。
1.3.1 开发工具
Eclipse是著名的跨平台的自由集成开发环境(IDE)。最初主要用来Java语言开发,通过安装不同的插件Eclipse可以支持不同的计算机语言,比如C++和Python等开发工具。Eclipse的本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。许多软件开发商以Eclipse为框架开发自己的IDE。
Eclipse 是替代IBM Visual Age for Java的下一代IDE开发环境,但它未来的目标不仅仅是成为专门开发Java程序的IDE环境,根据Eclipse的体系结构,通过开发插件,它能扩展到任何语言的开发,甚至能成为图片绘制的工具。目前,Eclipse已经开始提供C语言开发的功能插件。更难能可贵的是, Eclipse是一个开放源代码的项目,任何人都可以下载Eclipse的源代码,并且在此基础上开发自己的功能插件。也就是说未来只要有人需要,就会有建立在Eclipse之上的COBOL,Perl,Python等语言的开发插件出现。同时可以通过开发新的插件扩展现有插件的功能,比如在现有的 Java开发环境中加入Tomcat服务器插件。可以无限扩展,而且有着统一的外观,操作和系统资源管理,这也正是Eclipse的潜力所在。
而Eclipse Mars正是Eclipse较新的稳定版本,更好的支持java8的开发。
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言。MySQL软件采用了双授权政策(本词条“授权政策”),它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库。由于其社区版的性能卓越,搭配PHP和Apache可组成良好的开发环境。
而MySQL 5.7作为其最新版本,则拥有更强悍的性能以及更好兼容性,大大提高了数据库的可用性,可管理性和安全性。
HeidiSQL是一个功能非常强大的MySQL客户端软件。它是德国程序员Ansgar Becker和几个Delphi程序员开发的一个开源工具。要通过HeidiSQL来管理数据库,用户应该用有效地凭证登陆到MySQL服务器,创建一个会话。HeidiSQL最大的特色就是操作方便,界面设计合理,功能都是最实用的,尤其适合DBA,它更加强调了对MySQL运行时的参数设置和性能监控等。
作为一款用于简单化你的 MySQL服务器和数据库管理的图形化界面,HeidiSQL软件允许你浏览你的数据库,管理表,浏览和编辑记录,管理用户权限等等。此外,你可以从文本文件导入数据,运行 SQL查询,在两个数据库之间同步表以及导出选择的表到其它数据库或者 SQL 脚本当中。HeidiSQL提供了一个用于在数据库浏览之间切换SQL查询和标签带有语法突出显示的简单易用的界面。其它功能包括BLOB和MEMO编辑,大型SQL脚本支持,用户进程管理等。HeidiSQL软件资源开放。HeidiSQL可以浏览和编辑数据,创建和编辑表格,视图,过程,触发器和安排日程。另外,还可以导出结构和数据SQL文件。
HeidiSQL可以连接到多个服务器窗口,使用命令行连接到服务器。HeidiSQL可以从一台服务器/数据库直接导入数据到另一台服务器/数据库。HeidiSQL可以管理用户权限,导入文本文件。HeidiSQL为CSV,HTML,XML和SQL进行Wiki标记LaTeX和导出表行。HeidiSQL允许用户批量修改表(移动到DB,改变发动机,整理等)。HeidiSQL允许用户批量插入到表中ASCII或二进制文件。HeidiSQL可以自定义语法高亮和代码自动完成查询。HeidiSQL提供漂亮的SQL格式化功能,监视和杀灭客户进程。HeidiSQL提供帮助你找到一个所有数据库的所有表的具体文本服务器。HeidiSQL提供批处理方式优化和修复表工具。
其最新版本则为9.3版本。
1.3.2 开发语言
主要使用Java8 GUI(图形用户界面)的Swing轻量级控件完成开发。
图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口),即人机交互图形化用户界面设计,是指采用图形方式显示的计算机操作用户界面。与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受。
Swing是一组Java程序元件,它能够创建图象用户接口(GUI)元件,如按钮和滚动条,它们独立于特定操作系统的开窗口系统。Swing元件使用Java Foundation Classes(JFC)Swing开发人员只用很少的代码就可以利用Swing丰富、灵活的功能和模块化组件来创建优雅的用户界面。工具包中所有的包都是以swing作为名称,例如javax.swing,javax.swing.event。它能够创建图象用户接口(GUI)元件,如按钮和滚动条,它们独立于特定操作系统的开窗口系统。Swing元件使用Java Foundation Classes(JFC)。
1.3.3 架构及设计模式
C/S 结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server 应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。采用MVC设计模式可以大大降低了程序的耦合性,符合现代软件的标准。
第二章 系统分析
2.1 可行性分析
可行性分析是系统分析阶段的第一项活动。此活动的主要目标是:用最小的代价在尽可能短的时间内确定问题是否能够解决。要从技术可行性,经济可行性,操作可行性三个方面来进行研究。
(1) 技术可行性
该系统并不要求特殊复杂的技术,主要是对数据库的访问、管理。本系统主要使用java编程语言进行开发,采用MySQL 5.7数据库作为应用数据库,在技术方面是可以轻易实现的。
Java8 GUI的Swing开发工具包提供了大量的控件,可用于实现美观的界面,简化了开发,可以有效地提高应用程序的运行效率和可靠性。Java8为系统的开发提供了良好的技术支持。
对于本人来说,精通java编程,能够很好的解决未知技术问题,熟练掌握本系统的开发流程,能够保质保量的完成本系统的开发。
(2) 经济可行性
据调查,我国相当数量的零售店目前仍采用传统销售管理经营手段,管理效率低下。此套管理系统建成后由于不是直接用于生产,因此直接经济效益较小,但其产生的间接经济效益将非常地可观。
由此可见,开发此套系统在经济上是完全可行的。而且,由于此套系统将在未来较长时间内稳定发挥作用,这对于提高店铺的综合管理水平,简化日常业务操作将会起到很大的帮助,随之而来的则是营业成本的降低。
(2) 操作可行性
该系统主要应用在商场,超市以及零售店等地方,在操作方面几乎没有什么难度,一般文化程度的员工都可以轻易掌握。而在平台方面,此套系统秉承java编程语言“一次开发,处处运行”的开发理念,可跨平台进行操作,对硬件要求较低。
另外,此套系统开发完成之后,在实体店面试运行状况良好,完全符合开发要求。
2.2 需求分析
(1) 任务概述
此套系统的重点在于通过有效的进销存管理提高零售店的效益,因此需要
完成商品管理,销售管理,出入库管理,仓库管理,用户管理几个模块,以保证系统能够有效,高效地帮助零售店完成现代化销售管理。而销售管理则对系统数据的精确性和安全性有着较高的要求,即系统要求设计严密的输入输出验证机制,保证对输入与输出的严格把控,另外,系统应当制定灵活的权限机制,对不同身份的用户开放对应的操作权限接口,保证系统有序地运行。
- 功能需求
此套系统首先分为五大部分,分别为登录、首页、基础数据、进销存管理、用户管理,首页为欢迎页面,基础数据下设商品管理功能模块,进销存管理下设销售单、入库单、出库单、仓库管理四个功能模块,用户管理为单独功能模块。
功能结构图如下所示:
图1 系统功能结构图
以下将结合用户调研结果细化分析每个功能模块的需求:
①用户登录
打开登录页面,输入用户名和密码,点击登录,系统验证输入的合法性,若输入不合法,则弹出错误提示,若输入合法,系统自动跳转到首页欢迎页面,等待用和操作。
②商品管理
I.添加商品
点击添加按钮,系统弹出添加商品窗口,输入商品信息,用户提交信息,后台验证输入的合法性,系统返回对应的提示信息,刷新商品列表,保证系统实时同步数据库。
II.修改商品
点击修改按钮,判断用户是否已经选择数据,若未选择数据,系统则返回错误提示信息,若已选择数据,则通过所选商品的id查询商品其他信息,弹出修改商品信息的窗口,回写商品信息,用户修改数据后,提交信息,后台验证输入的合法性,系统返回对应的提示信息,刷新商品列表,保证系统实时同步数据库。
III.删除商品
点击删除按钮,,判断用户是否已经选择数据,若未选择数据,系统则返回错误提示信息,若已选择数据,则弹出确认删除对话框,防止用户的误操作,用户取消删除,则返回上一级,若用户确定删除,点击确定按钮,系统将通过获取到的商品id删除记录,然后返回提示信息,刷新商品列表,保证系统实时同步数据库。
IV.条件查询销售单
系统默认查询所有商品信息,允许用户根据商品种类和所属仓库筛选销售单信息,用户输入商品种类,所属仓库时,系统作条件查询,刷新商品列表,保证系统实时同步数据库。
③销售单
I.添加销售单
点击添加按钮,系统弹出添加销售单窗口,输入销售单信息,用户提交信息,后台验证输入的合法性,并由系统根据时间生成订单号,并减少商品库存,系统返回对应的提示信息,刷新销售单列表,保证系统实时同步数据库。
II.条件查询销售单
系统默认查询所有销售单信息,允许用户根据商品名模糊查询,根据商品种类和所属仓库筛选商品信息,用户输入商品名,商品种类,所属仓库时,系统作条件查询,刷新销售单列表,保证系统实时同步数据库。
④入库单
I.添加入库单
点击添加按钮,系统弹出添加入库单窗口,输入入库单信息,用户提交信息,后台验证输入的合法性,并由系统根据时间生成订单号,并增加商品库存,系统返回对应的提示信息,刷新入库单列表,保证系统实时同步数据库。
II.删除入库单
点击删除按钮,,判断用户是否已经选择数据,若未选择数据,系统则返回错误提示信息,若已选择数据,则弹出确认删除对话框,防止用户的误操作,用户取消删除,则返回上一级,若用户确定删除,点击确定按钮,系统将通过获取到的入库单id删除记录,然后返回提示信息,刷新入库单列表,保证系统实时同步数据库。
III.条件查询入库单
若当前用户身份为管理员,系统默认查询所有入库单信息,若当前用户身份为普通用户,则只允许查看当前用户所经手的入库单,系统支持用户根据商品名模糊查询,根据商品种类和所属仓库筛选入库单信息,用户输入商品名,商品种类,所属仓库时,系统作条件查询,刷新入库单列表,保证系统实时同步数据库。
⑤出库单
I.添加出库单
点击添加按钮,系统弹出添加出库单窗口,输入出库单信息,用户提交信息,后台验证输入的合法性,并由系统根据时间生成订单号,并减少商品库存,系统返回对应的提示信息,刷新出库单列表,保证系统实时同步数据库。
II.删除出库单
点击删除按钮,,判断用户是否已经选择数据,若未选择数据,系统则返回错误提示信息,若已选择数据,则弹出确认删除对话框,防止用户的误操作,用户取消删除,则返回上一级,若用户确定删除,点击确定按钮,系统将通过获取到的出库单id删除记录,然后返回提示信息,刷新出库单列表,保证系统实时同步数据库。
III.条件查询出库单
若当前用户身份为管理员,系统默认查询所有入库单信息,若当前用户身份为普通用户,则只允许查看当前用户所经手的出库单,系统支持用户根据商品名模糊查询,根据商品种类和所属仓库筛选出库单信息,用户输入商品名,商品种类,所属仓库时,系统作条件查询,刷新出库单列表,保证系统实时同步数据库。
⑥仓库管理
I.添加仓库
点击添加按钮,系统弹出添加商品窗口,输入仓库信息,用户提交信息,后台验证输入的合法性,系统返回对应的提示信息,刷新仓库列表,保证系统实时同步数据库。
II.修改仓库
点击修改按钮,判断用户是否已经选择数据,若未选择数据,系统则返回错误提示信息,若已选择数据,则通过所选仓库的id查询仓库其他信息,弹出修改仓库信息的窗口,回写仓库信息,用户修改数据后,提交信息,后台验证输入的合法性,系统返回对应的提示信息,刷新仓库列表,保证系统实时同步数据库。
III.删除仓库
点击删除按钮,,判断用户是否已经选择数据,若未选择数据,系统则返回错误提示信息,若已选择数据,则弹出确认删除对话框,防止用户的误操作,用户取消删除,则返回上一级,若用户确定删除,点击确定按钮,系统将通过获取到的仓库id删除记录,然后返回提示信息,刷新仓库列表,保证系统实时同步数据库。
⑦用户管理
I.修改用户名
进入用户管理,系统将根据当前用户id回写用户信息(隐藏密码),且用户名不允许修改,点击修改按钮,弹出用户验证窗口,要求输入当前用户原始密码,用户确定,系统验证密码的合法性,若密码非法,则返回对应错误提示信息,返回用户管理主页,若密码合法,则允许用户修改信息,当用户提交修改时,系统验证输入的合法性,返回对应的提示信息,修改成功则要求用户重新登录。
II.修改密码
进入用户管理,系统将根据当前用户id回写用户信息(隐藏密码),且密码不允许修改,点击修改按钮,弹出用户验证窗口,要求输入当前用户原始密码,用户确定,系统验证密码的合法性,若密码非法,则返回对应错误提示信息,返回用户管理主页,若密码合法,则允许用户修改信息,当用户提交修改时,系统验证输入的合法性,返回对应的提示信息,修改成功则要求用户重新登录。
⑶ 运行需求
系统界面交互的设计影响着客户的体验度以及黏着度,故特对系统的界面设计做出如下规范:
①系统共分为七大功能模块,所以要求在设计界面时充分考虑不同模块的不同功能特点,但要保持界面风格一致;
②系统登录界面、主界面的风格保持一致,并与Logo保持一定的协调性,便于Logo在嵌入各模块界面中的整体感一致;
③系统登录界面要体现Logo、软件名称、模块名称,输入用户名和密码的提示信息,要将这些信息合理的展现在登录界面上;
④系统主界面要体现Logo、软件名称、模块名称、用户信息,业务的功能分类以及配套的相应图标,主界面图标,菜单等;
⑤图标重点体现具体功能的表达,颜色与整体界面协调一致;
⑥对整体软件界面风格颜色的要求:
表1 界面颜色风格表
登陆 | 主界面 | 图标 | |
总体协调 | √ | √ | √ |
大气 | √ | √ | |
色调清新 | √ | √ | |
色调跳跃 | √ | ||
专业 | √ | ||
内容简洁 | √ | √ | |
内容丰满 | √ | ||
结构明朗 | √ | √ | √ |
友好 | √ | √ | √ |
注释:
①总体协调:总体和谐一致配合得当;
②大气:行业公司的软件界面、Logo、及整体公司的设计均给人一种大气的感觉,而非小家子气;
③色调清新:颜色、色调清爽、新鲜、明快迎合业内人士对色彩的敏感度;
④色调跳跃:与清新相反,主要为了在清新的背景下尽量显现、易见、能突出,映入视线;
⑤专业:在内容或者形式上保持一定IT行业感觉或者专业特色能感受到一定的专业水准;
⑥内容简洁:内容简明扼要,简单明了,逻辑、分类清晰,一目了然;
⑦内容丰满:内容形象,涉及面广,分类清晰,图文并茂;
⑧结构明朗:色块、线条、逻辑、分类、图文合理应用,相得益彰,给人头脑 清晰的感受,能快速判断需要浏览、观察的次序,需要突出的部分能快速映入眼帘;
⑨友好:给人舒适、顺心、和谐的内心感受,没有异样感、厌恶感。
第三章 系统设计
3.1 数据库的分析与设计
数据库是整个系统的各个部分能否紧密地结合在一起以及如何结合的关键所在,因此数据库是系统的核心和基础。计算机信息系统以数据库为核心,在数据库管理系统的支持下,进行信息的收集、整理、存储、检索、更新、加工、统计和传播等操作。数据库设计的好坏直接影响到整个系统的质量和效率。
数据库的设计一般经过需求分析、概念设计、逻辑设计、物理设计四个步骤。
3.1.1数据库的需求分析
根据功能需求分析,要有一个用户表,用户具有id、姓名、密码、身份标识四个属性,用于登陆系统;
而整个销售管理系统的核心是商品,那么就产生的商品表,商品表拥有id、姓名、价格、产地、库存、所属仓库、所属分类、删除标识八个属性;
而商品与仓库、分类均为多对一的逻辑关系,那么就产生了仓库表和分类表,仓库表具有id、名称、删除标识、排序规则四个属性,分类表具有id、名称、删除标识三个属性;
在销售管理过程中,势必会生成订单,根据功能需求分析,首先要将商品入库,这样就生成了入库单,入库单具有id、订单号、经手人id、商品所属仓库id、商品所属分类id、入库数量、商品id、删除标识八个属性;
而在销售中,每有一笔生意,就会生成销售单,需要建立销售表,销售单具有id、订单号、经手人id、商品所属仓库id、商品所属分类id、销售数量、商品id、删除标识八个属性;
在商品销售以及库存调动中又会涉及到出库,这样就生成了出库单,出库单具有id、订单号、经手人id、商品所属仓库id、商品所属分类id、出库数量、商品id、删除标识八个属性,为了数据交互性能的提升,将入库单与出库单合并产生出入库表,他们各自多了一条属性,即出入库标识;
这便是整套系统的数据库需求。
3.1.2数据库的概念结构设计
概念结构设计是指在数据分析的基础上自底向上的建立整个系统的数据库概念结构,从用户的角度进行视图设计,然后将视图集成,最后对集成的结构分析优化得到最后结果。
此处数据库的概念结构设计采用实体—联系(E-R)模型设计方法。如下为整套系统的综合概念结构设计图:
图2 系统E-R图
3.1.3数据库的逻辑结构设计
由于数据库概念模型独立于任何特定的数据库管理系统,因此,需要根据具体使用的数据库管理系统的特点进行转换。即转化为按计算机观点处理的逻辑关系模型,E-R模型向关系数据库模型转换应遵循下列原则:
1.每一个实体要转换成一个关系
2.所有的主键必须定义非空(NOT NULL)
3.对于二元联系应按照一对多、弱对实、一对一、多对多等联系来定义外键。
根据E-R模型,图书管理系统建立了以下逻辑数据结构,下面是各数据表的详细说明:
⑴用户表逻辑结构
表2 用户表逻辑结构表
属性 | 数据类型 | 域范围 | 允许为空 | 主外键说明 | 默认值 |
id | 字符型 | 最大32个字符 | 否 | 主键 | 无 |
用户名 | 字符型 | 最大20个字符 | 否 | 无 | 无 |
密码 | 字符型 | 最大20个字符 | 否 | 无 | 无 |
身份标识 | 整型 | 最大1个字符 | 是 | 无 | 0 |
⑵分类表逻辑结构
表3 分类表逻辑结构表
属性 | 数据类型 | 域范围 | 允许为空 | 主外键说明 | 默认 |
id | 字符型 | 最大32个字符 | 否 | 主键 | 无 |
分类名 | 字符型 | 最大20个字符 | 否 | 无 | 无 |
删除标识 | 整型 | 最大1个字符 | 是 | 无 | 0 |
⑶仓库表逻辑结构
表4 仓库表逻辑结构表
属性 | 数据类型 | 域范围 | 允许为空 | 主外键说明 | 默认 |
id | 字符型 | 最大32个字符 | 否 | 主键 | 无 |
仓库名 | 字符型 | 最大20个字符 | 否 | 无 | 无 |
删除标识 | 整型 | 最大1个字符 | 是 | 无 | 0 |
排序规则 | 整型 | 最大10个字符 | 是 | 无 | 0 |
⑷商品表逻辑结构
表5 商品表逻辑结构表
属性 | 数据类型 | 域范围 | 允许为空 | 主外键说明 | 默认 |
id | 字符型 | 最大32个字符 | 否 | 主键 | 无 |
商品名 | 字符型 | 最大20个字符 | 否 | 无 | 无 |
价格 | 精确值类型 | 最大10个字符,两位小数 | 否 | 无 | 无 |
产地 | 字符型 | 最大20个字符 | 否 | 无 | 无 |
库存 | 实型 | 无 | 否 | 无 | 无 |
所属仓库id | 字符型 | 最大32个字符 | 否 | 外键 | 无 |
所属分类id | 字符型 | 最大32个字符 | 否 | 外键 | 无 |
删除标识 | 整型 | 最大1个字符 | 是 | 无 | 0 |
⑸销售订单表逻辑结构
表6 销售订单表逻辑结构表
属性 | 数据类型 | 域范围 | 允许为空 | 主外键说明 | 默认 |
id | 字符型 | 最大32个字符 | 否 | 主键 | 无 |
订单号 | 字符型 | 最大20个字符 | 否 | 无 | 无 |
经手人id | 实型 | 最大32个字符 | 否 | 外键 | 无 |
所属仓库id | 字符型 | 最大32个字符 | 否 | 外键 | 无 |
所属分类id | 字符型 | 最大32个字符 | 否 | 外键 | 无 |
销售数量 | 实型 | 无 | 否 | 无 | 无 |
商品id | 字符型 | 最大32个字符 | 否 | 外键 | 无 |
删除标识 | 整型 | 最大1个字符 | 是 | 无 | 0 |
⑹出入库订单表逻辑结构
表7 出入库订单表逻辑结构表
属性 | 数据类型 | 域范围 | 允许为空 | 主外键说明 | 默认 |
id | 字符型 | 最大32个字符 | 否 | 主键 | 无 |
订单号 | 字符型 | 最大20个字符 | 否 | 无 | 无 |
经手人id | 实型 | 最大32个字符 | 否 | 外键 | 无 |
所属仓库id | 字符型 | 最大32个字符 | 否 | 外键 | 无 |
所属分类id | 字符型 | 最大32个字符 | 否 | 外键 | 无 |
销售数量 | 实型 | 无 | 否 | 无 | 无 |
商品id | 字符型 | 最大32个字符 | 否 | 外键 | 无 |
出入库标识 | 整形 | 最大1个字符 | 否 | 无 | 无 |
删除标识 | 整型 | 最大1个字符 | 是 | 无 | 0 |
3.1.4数据库的物理结构设计
设计数据库物理结构,并利用数据库管理系统导出数据库关系图,如下:
图3 系统数据库关系图
3.2 数据库操作实现
根据数据库的物理结构设计,在工程中建立数据表对应的实体类,为了实现系统与数据库的交互,此套系统针对java JDBC封装数据库工具类和基础操作类,以下将作详细说明。
3.2.1 编写JDBC管理工具类
连接数据库就要先做数据库相关的一些配置,例如对应数据库的相关驱动、数据库地址、用户名和密码,然后可以放到配置文件中,如果需要更换数据库或者地址,只需要修改这份配置文件即可。在工程中建立数据库配置文件jdbc.properties,文件内容如下:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/salesmanagement?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
而JDBC管理工具类中主要涉及数据库连接与资源释放工具的实现,如下为实现代码:
package org.rancode.framework.util;
/**
*
* 说明:JDBC工具类 用于数据库连接以及数据库资源释放
*
* @author LS
*
*/
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import org.apache.log4j.Logger;
public class JdbcUtil {
private static Logger logger = Logger.getLogger(JdbcUtil.class);
private static JdbcUtil jdbcUtil;
private static String url = null;
private static String username = null;
private static String password = null;
private static String driver = null;
private static Properties props = new Properties();
static {
try {
// 读取数据库配置文件
props.load(JdbcUtil.class.getResourceAsStream("/jdbc.properties"));
} catch (IOException e) {
logger.error("加载jdbc.properties配置文件异常", e);
}
url = (props.getProperty("jdbc.url"));
username = (props.getProperty("jdbc.username"));
password = (props.getProperty("jdbc.password"));
driver = (props.getProperty("jdbc.driver"));
// 加载数据库驱动
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
logger.error("加载数据库驱动异常", e);
}
}
// 单例模式
public JdbcUtil getJdbcUtil() {
if (jdbcUtil == null) {
synchronized (JdbcUtil.class) {
if (jdbcUtil == null) {
jdbcUtil = new JdbcUtil();
}
}
}
return jdbcUtil;
}
/**
* 创建一个数据库连接
*
* @return 一个数据库连接
*
*/
public Connection getConnection() {
Connection conn = null;
// 创建数据库连接
try {
conn = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
logger.error("创建数据库连接发生异常", e);
}
return conn;
}
/**
* 释放数据库资源
*/
public void release(Object o) {
if (o == null) {
return;
}
if (o instanceof ResultSet) {
try {
((ResultSet) o).close();
} catch (SQLException e) {
e.printStackTrace();
}
} else if (o instanceof PreparedStatement) {
try {
((PreparedStatement) o).close();
} catch (SQLException e) {
e.printStackTrace();
}
} else if (o instanceof Connection) {
Connection c = (Connection) o;
try {
if (!c.isClosed()) {
c.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
// 释放数据库资源方法重载
public void release(ResultSet rs, PreparedStatement pst, Connection conn) {
release(rs);
release(pst);
release(conn);
}
}
3.2.2 编写JDBC基础操作类
JDBC基础操作类中包含基础数据库增删改查方法,实现了基础数据库操作的接口,具体实现代码如下:
package org.rancode.module.dao.Impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.rancode.framework.util.JdbcUtil;
import org.rancode.module.dao.BaseDao;
/**
*
* 说明:基础Dao数据库操作实现
*
* @author LS
*
*
*/
public class BaseDaoImpl implements BaseDao {
private static Logger logger = Logger.getLogger(BaseDaoImpl.class);
private Connection conn;
private PreparedStatement pst;
private ResultSet rs;
// 构造方法获取数据库连接
public BaseDaoImpl() {
conn = new JdbcUtil().getJdbcUtil().getConnection();
}
// 重写查询数据方法
@Override
public List select(String sql, int columnNum, Object[] paraArray) throws SQLException {
List list = new ArrayList();
pst = conn.prepareStatement(sql);
if (paraArray != null) {
for (int i = 0, length = paraArray.length; i < length; i++) {
pst.setObject(i + 1, paraArray[i]);
}
}
ResultSet rs = pst.executeQuery();
while (rs.next()) {
Object[] array = new Object[columnNum];
for (int i = 0; i < columnNum; i++) {
array[i] = rs.getObject(i + 1);
}
list.add(array);
}
new JdbcUtil().getJdbcUtil().release(rs, pst, conn);
return list;
}
// 重写插入数据方法
@Override
public int insert(String sql, Object[] paraArray) throws SQLException {
pst = conn.prepareStatement(sql);
for (int i = 0, length = paraArray.length; i < length; i++) {
pst.setObject(i + 1, paraArray[i]);
}
int i = pst.executeUpdate();
new JdbcUtil().getJdbcUtil().release(rs, pst, conn);
return i;
}
// 重写更新数据方法
@Override
public int update(String sql, Object[] paraArray) throws SQLException {
pst = conn.prepareStatement(sql);
for (int i = 0, length = paraArray.length; i < length; i++) {
pst.setObject(i + 1, paraArray[i]);
}
int i = pst.executeUpdate();
new JdbcUtil().getJdbcUtil().release(rs, pst, conn);
return i;
}
// 重写删除数据方法
@Override
public int delete(String sql, Object[] paraArray) throws SQLException {
pst = conn.prepareStatement(sql);
for (int i = 0, length = paraArray.length; i < length; i++) {
pst.setObject(i + 1, paraArray[i]);
}
int i = pst.executeUpdate();
new JdbcUtil().getJdbcUtil().release(rs, pst, conn);
return i;
}
}
第四章 系统实现
数据库设计完成后,就开始进入具体的应用程序的分析与设计阶段。应用程序的分析与设计主要包括了应用程序各个功能模块的总体规划和分析、应用程序界面的选择与设计以及应用程序结构的选择等部分,而系统开发工作主要是集中在逻辑、功能和技术设计上,系统实施阶段要继承此前面各个阶段的工作成果,将技术设计转化为物理实现,因此系统实施的成果是系统分析和设计阶段的结晶。
如下为系统工程结构图:
图4 系统工程结构图
4.1 系统界面布局设计
4.1.1 登录界面布局设计
登录界面使用图形面板工具(自定义)绘制窗口背景,添加输入框组和按钮组控件,用户名输入框和密码输入框构成了输入框组,登录按钮和重置按钮构成了按钮组。
布局草图如下:
图5 用户登录界面布局草图
4.1.2 欢迎界面布局设计
欢迎界面主要由两部分构成,页面顶部为功能导航菜单,页面中部为欢迎界面背景。
布局草图如下:
图6 欢迎界面布局草图
4.1.3 用户管理界面布局设计
用户管理界面主要由两部分构成,页面顶部为功能导航菜单,页面中部为用户信息修改面板,对当前用户分别回写用户名,密码(加密),身份信息,提供修改用户信息的操作按钮。
布局草图如下:
图7 用户管理界面布局草图
4.1.4 通用界面布局设计
通用界面布局适用于商品管理,销售单,入库单,出库单,仓库管理五个功能模块,根据相应的功能对通用布局进行适当修改,即可投入使用。
布局草图如下:
图8 通用界面布局草图
4.2 功能模块实现
4.2.1 系统登录模块实现
系统登录模块的核心问题就是用户身份的验证,应注意的是要控制好输入的合法化,防止系统错误的发生,若用户身份验证失败,系统则弹出错误信息,然后返回登陆界面,提供重新登录;若用户身份验证成功,系统则跳转进入主界面。
流程图如下:
图9 系统登录模块流程图
4.2.2 商品管理模块实现
商品管理模块初始化为所有商品的遍历,同时提供条件查询的功能,通过商品分类和所属仓库进行条件查询。
查询功能流程图如下:
图10 商品查询模块流程图
模块在设计时,在工具栏分别放置了添加,修改,删除商品的按钮,点击相应按钮,系统进行对应的功能。
添加商品模块流程图如下:
图11 商品添加模块流程图
修改商品模块流程图如下:
图12 商品修改模块流程图
删除商品模块流程图如下:
图13 商品删除模块流程图
4.2.3 销售单模块实现
销售单管理模块初始化为所有销售单的遍历,同时提供条件查询的功能,通过商品名,商品分类和所属仓库进行条件查询。
查询功能流程图如下:
图14 销售单查询模块流程图
模块在设计时,在工具栏放置了添加销售单的按钮,点击相应按钮,系统进行对应的功能。
添加销售单模块流程图如下:
图15 销售单添加模块流程图
4.2.4 入库单模块实现
入库单管理模块初始化为所有入库单的遍历,同时提供条件查询的功能,通过商品名称,商品分类和所属仓库进行条件查询。
查询功能流程图如下:
图16 入库单查询模块流程图
模块在设计时,在工具栏分别放置了添加,删除入库单的按钮,点击相应按钮,系统进行对应的功能。
添加入库单模块流程图如下:
图17 入库单添加模块流程图
删除入库单模块流程图如下:
图18 入库单删除模块流程图
4.2.5 出库单模块实现
出库单管理模块初始化为所有出库单的遍历,同时提供条件查询的功能,通过商品名称,商品分类和所属仓库进行条件查询。
查询功能流程图如下:
图19 出库单查询模块流程图
模块在设计时,在工具栏分别放置了添加,删除出库单的按钮,点击相应按钮,系统进行对应的功能。
添加出库单模块流程图如下:
图20 出库单添加模块流程图
删除出库单模块流程图如下:
图21 出库单删除模块流程图
4.2.6 仓库管理模块实现
仓库管理模块初始化为所有仓库的遍历。
模块在设计时,在工具栏分别放置了添加,修改,删除仓库的按钮,点击相应按钮,系统进行对应的功能。
添加仓库模块流程图如下:
图22 仓库添加模块流程图
修改仓库模块流程图如下:
图23 仓库修改模块流程图
删除仓库模块流程图如下:
图24 仓库删除模块流程图
4.2.7 用户管理模块实现
用户管理初始化回写当前用户信息,信息为处于不可修改状态,点击修改信息按钮,系统则弹出用户验证对话框,用户需输入原始密码进行身份验证,若验证失败,则弹出错误提示,若验证成功,系统则跳转到信息编辑页,用户信息可修改,点击保存信息按钮进行提交,系统验证输入的合法性,然后进行相应的交互。
用户管理模块流程图如下:
图25 用户管理模块流程图
结 论
课程设计的完成过程就像一次充实而愉快的旅行。这次“旅行”不仅让我体会到了书本知识的重要性,也让我明白了大学生动手能力的重要性。从书本上学到东西是一回事,如何将所学的知识应用到实际当中才是我们学习的目标。五天的时间说长不长,说短不短。在这段日子里,我查阅了许多和数据库、Java等有关的书籍,也从互联网上找到了很多实用的小知识、小技巧,并结合自己所学知识,逐步开发设计了整套销售管理系统,但在本次课程设计的实践过程中还是遇到了很多问题,比如在开发过程中很多有很多是没有学过或者初学皮毛但又必须用到的知识,然后只能通过去图书馆翻阅相关书籍或者请教老师帮助。这些问题虽然最后都得到了解决,但也耗掉了不少的时间,这也让我明白平时要广泛涉及专业知识的重要性。
在整个系统开发实现的过程中,完全是以软件工程的基本原理为指导,利用大学所学到的以及查阅到的知识完成了登陆,商品管理,销售管理,出库管理,入库管理,仓库管理,用户管理七大主要功能模块,而且整个系统遵循了“高内聚,低耦合”的原则。由于时间紧迫,系统有一些不足之处,但从实现的功能来看,已经符合系统的设计要求。希望以后有时间能够完善系统。
这次课程设计让我学到很多知识,提高了自身实践能力的同时让我明白了自己的不足之处,如所学知识范围局限,拘泥于课本,实践能力差等等。因此在以后的工作学习过程中我的目标是要提高自己的自学、研究、实践能力,让自己的知识功底更加扎实。
总的来说,在本次课程设计中,我真正学到了很多实践知识,都是在课堂内所学不到的知识,收获很大,最后也要感谢同学以及老师的鼓励和帮助,让我顺利的完成了本次课程设计。