Java EE课程设计
这是本学期的Java EE课程设计。通过答辩后整理的。
选题:基于SSM的超市销售系统
1.运行环境:
操作系统:windows10 中文版, 16G内存
客户端:桌面版Google Chrome
数据库:MySQL 5,或MySQL 8
IDE:Eclipse for Java EE, 或IDEA
JDK:JDK 8
2.运行界面与功能示意:
主要功能分作3个页面:欢迎页面、登录页面、主页面。
2.1 欢迎页面:
欢迎页面index.html,是一个非常简单的静态页面,用于快速响应、引导用户登录。

2.2 登录页面:
登录页面login.html,是一个表单,用于提交用户名、密码。
采用简洁的风格、利于快速响应。而没有使用花里胡哨的皮肤、背景、图形化按钮。

2.3 主页面:
主页面有菜单栏、以及菜单对应的嵌入式页面。
功能分作6个菜单项:销售记录、商品信息、进货记录、仓储查询、会员管理、用户管理。
同样采用简洁风格。主页面使用了iframe,点击菜单后,内容页面显示在iframe.

3.详细设计
3.1 数据库设计
数据库、数据表在MySQL Workbench中的结构如下。
仅利用了数据表Tables,暂时没有使用到Views, Functions, Stored Procedures。
数据表依次是administrators用户表, commodities商品表, consumer会员表, purchase进货订单表, sale售货订单表, saleitem售货订单商品表。

3.1.1 administrators用户表
各字段依次是ID,用户名,密码,是否激活

创建表的SQL语句为:
CREATE TABLE `administrators` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) NOT NULL, `password` varchar(45) NOT NULL, `active` tinyint(1) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `name_UNIQUE` (`name`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
3.1.2 commodities商品表:
各字段依次是ID,条码,商品名,描述,供应商,进价,售价,生产日期,进货日期,过期日期。

创建表的SQL语句为:
CREATE TABLE `commodities` ( `id` int(11) NOT NULL AUTO_INCREMENT, `barcode` varchar(45) NOT NULL, `name` varchar(45) NOT NULL, `description` varchar(90) NOT NULL, `supplier` varchar(45) NOT NULL, `cost` double NOT NULL, `price` double NOT NULL, `producedate` date NOT NULL, `arrivedate` date NOT NULL, `expiredate` date NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `barcode_UNIQUE` (`barcode`) ) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8
3.1.3 purchase进货订单表
各字段依次是ID,商品ID,进货量,进货日期,总货值,订单号,供应商,备注。

创建表的SQL语句为:
注意到这个表中,商品ID字段是外键,所以本表依赖于commodities表;
另外,总货值,订单号,供应商,备注字段的默认值是NULL。
CREATE TABLE `purchase` ( `id` int(11) NOT NULL AUTO_INCREMENT, `commodityid` int(11) NOT NULL, `quantity` double NOT NULL, `date` date NOT NULL, `amount` double DEFAULT NULL, `po` varchar(45) DEFAULT NULL, `supplier` varchar(45) DEFAULT NULL, `remark` varchar(90) DEFAULT NULL, PRIMARY KEY (`id`), KEY `commodityid_idx` (`commodityid`), CONSTRAINT `commodityid` FOREIGN KEY (`commodityid`) REFERENCES `commodities` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8
3.1.4 consumer会员表
各字段依次是ID,会员名字,会员积分,备注。

创建表的SQL语句为:
CREATE TABLE `consumer` ( `idconsumer` varchar(45) NOT NULL, `name` varchar(45) NOT NULL, `point` double NOT NULL DEFAULT '0', `remark` varchar(90) DEFAULT NULL, PRIMARY KEY (`idconsumer`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
3.1.5 sale销售订单表
各字段依次是ID,会员ID,累计积分,应收款,收款,找零,实收款,新增积分,交易时刻。

创建表的SQL语句为:
CREATE TABLE `sale` ( `idsale` int(11) NOT NULL AUTO_INCREMENT, `idconsumer` varchar(45) DEFAULT NULL, `pointconsumer` double DEFAULT NULL, `sumAmount` double NOT NULL, `receivedmoney` double NOT NULL, `change` double NOT NULL, `income` double NOT NULL, `newpoint` double DEFAULT NULL, `datetime` datetime NOT NULL, PRIMARY KEY (`idsale`) ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8
3.1.6 saleitem销售订单商品列表
各字段依次是ID,销售订单ID,商品ID,销售单价,销售数量,金额小计。

创建表的SQL语句为:
注意到这个表中,商品ID字段、销售订单ID字段是外键;
另外,本表的ID使用长整型bigint(20)。
CREATE TABLE `saleitem` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `idsale` int(11) NOT NULL, `idcommodity` int(11) NOT NULL, `unitprice` double NOT NULL, `quantity` double NOT NULL, `amount` double NOT NULL, PRIMARY KEY (`id`), KEY `idsale_idx` (`idsale`), KEY `idcommodity_idx` (`idcommodity`), CONSTRAINT `idcommodity` FOREIGN KEY (`idcommodity`) REFERENCES `commodities` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `idsale` FOREIGN KEY (`idsale`) REFERENCES `sale` (`idsale`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8
3.2 前端设计
前端使用PC机浏览器,便于展示大量信息,也便于键盘、扫描枪扫描商品条码。
浏览器使用Google Chrome,它的调试能力强,较少出现奇怪行为。
由于美工方面是弱项,所以前端技术较多使用HTML, JavaScript 及 AJAX实现基本功能;而较少使用CSS去美化效果。
3.3 后端设计
构建工具采用maven。
后端采用SpringBoot + SpringMVC + MyBatis。
网页模板采用thymeleaf。
日志采用log4j。
4.项目文件组织结构:
本项目是基于Maven、SpringBoot、Mybatis的Web项目。
4.1 项目文件:
https://files.cnblogs.com/files/blogs/668053/market.zip
4.2 项目文件的组织结构
如下图(图4-1,以实际项目文件为准):

项目结构图(图4-1)
4.3 SSM框架整合所需的JAR包
如下图(图4-2,以实际项目文件为准):

SSM框架整合所需的JAR包(图4-2)
5.运行过程解说:
5.1 启动程序
EclipseIDE中,右键项目,选择run as Springboot.
IDEA中,右键MarketApplication.java,选择运行main()方法。
IDEA 2021.1版启动结果如下:

注意到上图中提示:Tomcat started on port(s): 80 (http) with context path '',表示在浏览器输入localhost就可以进入欢迎页。
5.2 程序运行流程图
如下图(图5-1):

主流程图(图5-1)
5.3 功能页面截图
5.3.1 销售记录菜单:

其中,”添加销售记录“是作为新页面显示的,在等待客户付款的同时,可以输入新的销售订单。
下面展示”添加销售记录“页面。

5.3.2 商品信息菜单

其中,”修改商品信息“略微麻烦些,使用AJAX与后端交互。
下面展示”修改商品信息“子菜单。

5.3.3 进货记录菜单

进货信息的”商品“必须是商品列表中已经添加的商品。
下面展示”添加进货信息“子菜单。

5.3.4 仓储查询菜单

下面展示”临期商品“子菜单。

5.3.5 会员管理菜单

下面展示”会员列表“子菜单。
由于功能比较简单,所以把删除、修改、展示做到一起。

5.3.6 用户管理菜单

6.总结报告:
练习巩固了许多Java EE相关知识。
虽然看着好大一个项目,功能还很弱,界面也很丑,自家用用可以,还没有商业价值。
路漫漫其修远兮吾将上下而求索!
7.答辩问题:
每个同学只有十来分钟时间,两个问题。
问题1:请以SaleController控制器介绍一下注解的作用。
注解可以放在类、字段或方法前面,添加配置信息,让SpringBoot实现自动配置。
在SaleController.java中,
修饰类的注解有两个:
@Controller, 表示这是一个控制器,方法默认返回视图。
@RequestMapping("/sale")。表示对"/sale"路径的访问由这个控制器处理。
修饰字段的注解是@Autowired。表示无需手工赋值,你就可以使用saleService对象了。
修饰方法的注解有四个:
@GetMapping("/addSale")表示本方法处理对"/sale/addSale"路径的GET请求。
@PostMapping("/addSale")表示本方法处理对"/sale/addSale"路径的POST请求。
@ResponseBody指明方法返回的字符串是json数据,而不是默认的视图名字。
@RequestMapping("/selectSale")表示本方法处理对"/sale/selectSale"路径的各种请求,包括GET, POST。
问题2:请以SaleController控制器为例,介绍一下各应用层之间的调用。
Tomcat调用控制器controller,控制器调用服务器service, 服务器调用DAO,DAO操作数据库,传递的信息封装成实体类。
产生的信息原路返回。
控制器类放在controller包中,服务器接口和实现类放在service包中,DAO接口放在repository包中,实体类放在mybatis.entity包中。
以SaleController控制器为例:
店主点击浏览器网页的“添加销售订单”,--> 浏览器发出GET请求,路径是"/sale/addSale"。
Tomcat服务器收到请求,--> Tomcat预备model参数,调用SaleController控制器的getAddSale()方法。
getAddSale()方法返回"sale/addSale.html"模板 --> Themleaf填充模板 --> Tomcat服务器返回html页面。
店主填写表单并提交, --> 浏览器发出POST请求,路径是"/sale/addSale"。
Tomcat服务器收到请求,--> Tomcat预备model参数,把POST过来的资料组合成Sale对象,调用SaleController控制器的postAddSale()方法。
控制器的postAddSale()方法调用服务器saleService.addSale(sale)方法;
saleService.addSale(sale)方法调用多个DAO方法:
--> 调用saleDao.addSale(sale);产生订单;
--> 调用saleDao.addSaleList(saleList);产生销售商品列表;
--> 调用saleDao.getSaleById(idsale);获取订单生成日期时间;
浙公网安备 33010602011771号