超市收银系统设计分析
一、系统整体架构
图1
从图1可以看出,系统框架很清晰,用户登录,根据用户权限的不同,对应不同的操作方法,操作对象为商品。
但本系统要求使用C/S框架结构来设计。
C/S框架介绍:
C/S 结构,即大家熟知的客户机和服务器结构。
C/S 结构的基本原则是将计算机应用任务分解成多个子任务,由多台计算机分工完成,即采用“功能分布”原则。客户端完成数据处理,数据表示以及用户接口功能;服务器端完成DBMS(数据库管理系统)的核心功能。这种客户请求服务、服务器提供服务的处理方式是一种新型的计算机应用模式。
Client和Server常常分别处在相距很远的两台计算机上,Client程序的任务是将用户的要求提交给Server程序,再将Server程序返回的结果以特定的形式显示给用户;Server程序的任务是接收客户程序提出的服务请求,进行相应的处理,再将结果返回给客户程序。
鉴于超市收银系统的特性,本系统不牵扯多个客户端,不需要线程同步。
二、代码设计框架
因为使用C/S框架设计程序,因此有固定的设计步骤:
1. 项目包的设计:
图2
client包:主要由客户端操作界面类和客户端业务类组成,客户端操作类也就是客户端main方法类,主要负责引导用户操作,提供系统界面信息提示操作,包括:初始化登录视图、商品库存管理视图和收银管理视图;客户端业务类主要包括处理客户端请求并将客户端请求打包发送给服务器的方法和一些辅助操作方法。处理库存管理员请求方法为:商品入库、商品出库、新增商品、查询全部商品和按编号查询商品;处理收银员请求方法为:扫描商品、修改购买数量商品和结账。
entity包:主要由系统所涉及的实体类组成,根据操作视图可以确定为用户类和商品类。
图3 用户信息
图4 商品信息
server包:主要由服务器主流程类(线程类)和服务器(数据处理)业务类组成,服务器主流程类也即main方法类,主要负责接收客户端请求,并根据请求标志信息分配相应操作,最后再将处理数据发送给客户端;服务器数据处理业务类主要由处理客户端请求的方法和商品信息库组成。
util包:
util包为实用工具包,主要包括项目中一些工具类,主要包括数据处理类(加密、解密、数据转换、特殊文件操作和数据打包)和常量类。
本项目主要包括数据打包类、常量类和proprties文件操作类。
sys.properties文件:
Properties文件是一个文本文件;properties文件的语法有两种,一种是注释,一种是属性配置;注释:前面加上#号;属性配置:以“键=值”的方式书写一个属性的配置信息。
Properties类本身表示了对一种Map结构的操作,properties文件本身就表示一个“键值对”的集合,因此,Properties类属于集合容器的家族,在使用前应该创建一个Properties的容器,实际上就是创建一个默认不带参数的Properties对象,通过别的方式给里面添加“键值对”。
sys.properties在本项目的作用主要用来配置服务器信息:主机名和端口号。
2、项目设计知识点
本项目主要设计关键知识点:类和对象,封装,继承,异常,集合和泛型,输入/输出,多线程和网络编程。
3、代码编写思路
1) 创建项目
2) 创建Java包:客户端包,服务器包,实体包,实用工具包。
3) 创建配置文件:.properties文件或 .xml文件。
4) 创建各Java包中的类文件:
客户端包:客户端操作界面类和客户端业务类;
服务器包:服务器主流程类(线程类)和服务器业务类(数据处理);
实体包:根据具体项目情况创建;
实用工具包:
ü 数据包类:主要储存客户端和服务器之间交互的关键数据,包括实体对象和逻辑判断标志等;
ü 常量类:客户端和服务器之间需要共同使用的状态常量,一般为业务操作标识符和系统信息常量(正确、错误状态常量,配置信息常量)。
ü 工具类:一般为配置文件的操作类。
5) 编写个项目文件(由简入繁:单个功能实现到全部功能拓展)。
6) 项目调试。
三、具体代码分析
1. sys.properties文件编写
该文件主要用户配置socket套接字属性:主机名和端口号,在此配置信息为:
图5 sys信息
2. 实体类编写
根据entity包分析可知:Goods类和Users类。
Goods类:
图6 Goods类
Users类:
图7 Users类
注:因为涉及到socket编程,因此两实体类均需要序列化。
3. 实用工具包类编写
1)数据包类(Datas类):
因为该项目为超市收银系统,根据项目效果图可知,主要设计对象为:商品对象(goods),用户对象(user);为便于商品信息操作,创建商品集合,又因为牵扯到库存管理和收银两个类,进而创建库存商品集合和 购买商品集合;又因为牵扯到客户端和服务器端业务请求操作,因此创建业务操作标识变量:flag。具体内容如下:
图8 Datas类
图9 库存商品集合应用需求
图10 购买商品集合应用需求
注:因为涉及到socket编程,Datas类需要序列化。
2)工具类(Tools类文件):
Tools文件主要用于操作sys.properties文件,对sys.properties文件操作之前,首先需要加载源文件(鉴于加载操作特殊性(提前操作),使用static块来封装),然后才能读取sys.properties文件中键对应的值。
该类主要是用于读取socket参数信息(host,port)。
图11
Propertis方法:void load(InputStream inStream) 从输入流中读取属性列表(键和元素对)。
ClassLoader类:类加载器是负责加载类的对象。
InputStream getResourceAsStream(String name):返回读取指定资源的输入流。
3)常量类:
由代码编写思路分析可知:常量类列表主要由以下几个部门组成:系统配置常量,系统信息反馈常量,系统操作常量,管理员操作常量,收银员操作常量。
图12 常量列表
注:具体常量参数可以在具体编程中增加或删减。
4. 客户端类编写
1)客户端操作界面类:
客户端操作界面类主要完成如下工作:(1)用户登录(2)用户操作
用户登录有两个选项:管理员和收银员;用户操作也分别按照管理员和收银员来展开。
图13 管理员登录成功视图
图14 收银员登录成功视图
鉴于登录操作只有两个选项,采用if-else编写较为快捷。具体代码截图如下:
图15登录操作代码
管理员操作和业务员操作选择较多,因此采用switch来实现较为合适,具体代码截图如下:
图16 管理员操作代码
图17 收银员操作代码
main()方法:原则上main()越简单越好,具体代码截图如下:
图18 main()方法代码
注:代码编写按如上模块来进行编写(登录方法,管理员操作方法,收银员方法),具体方法的实现依靠客户端业务类,本类中主要负责视图的引导和显示,可以分模块来进行编写和调试,遵循由简入繁原则。
2)客户端业务类:
客户端类的方法编写主要为满足客户端操作界面类的需求且需要实现与服务器端的信息交互(通过socket编程实现),因此具体代码包括登录信息的处理(方法),管理员视图下的业务操作处理(方法),收银员视图下的业务操作处理(方法),以及业务操作过程需要的逻辑操作方法的编写。具体代码截图如下:
图19 客户端业务方法
因为需要使用socket编程来实现客户端与服务器的数据通信,因此需要socket的初始化和socket的关闭操作。具体代码如下:
图20 socket的初始化和关闭操作
注:客户端业务类的调试应该在服务器类的框架搭好之后进行(可以完成基本的通信应答操作)。
客户端编程关键点:
客户端发送数据编写原则,通过Datas类中的属性参数作为载体,即对客户信息,商品信息和业务操作常量标识符进行数据打包,统统将需要发送的关键信息封装到Datas对象内,然后将这个对象发送给服务器,具体代码截图如下:
图21 商品入库关键信息Datas打包发送代码
同时读取服务器端返回的Datas数据,提取需要的信息进行处理和判断,其中包括状态常量信息(success或error),具体代码截图如下:
图22 读取服务器返回数据并处理
5. 服务器类编写
1)服务器主流程类:
服务器主流程类也即线程类,本线程类采用继承Thread父类来实现。
run()方法主要负责读取客户端发送过来的数据,提取业务操作常量标识,然后分别进行相应的操作,具体的数据处理依靠服务器业务类来实现,然后在将处理好的数据打包(Datas)发送给客户端,具体代码截图如下:
图23 读取客户端数据并进行相应的操作代码
图24 将处理好的数据打包发送给客户端操作代码
2)服务器业务类:
服务器业务类主要包括两部分:基础数据:用户信息(管理员和收银员的账号、密码-ROM型),库存商品信息(ROM型),购买商品信息(RAM型);处理客户端请求的数据处理方法。基础数据以后可用数据库来保存处理。
ROM型数据初始化采用static块实现,一次执行,最先执行。具体代码截图如下:
图25 系统基础数据代码
数据处理方法均为有参数方法,因为要将处理信息发送给客户端,具体返回数据类型依据具体业务操作来定。具体代码截图如下:
图26 服务器业务处理方法代码
注:客户端与服务器联调时,可以先把客户端和服务器的基本框架搭好,调试好基本功能后再做后续的代码扩展和调试。
问题点收集: