Java EE课程设计

这是本学期的Java EE课程设计。通过答辩后整理的。

 

选题:基于SSM的超市销售系统

 
1、问题描述
模拟超市实际进销存(进货、销售、存储)情况。
商品信息:商品编号,生产时间,进货时间,保质期等。
进货信息:生产厂家,数量,进价等情况。
存储信息:总量,销售量,存储时间,保质期等。
销售小票信息:货号、货名、销售价格、数量、销售总金额、实收金额、找零、积分等。

2、功能要求
(1)能够从多厂家进货。
(2)能够合理存储。
(3)显示销售情况。
(4)能够监控保质期,数量过少预警。
(5)具有退货、换货等功能。

3、问题的解决方案 
根据系统功能要求,可以将问题解决分为以下步骤:
(1)应用系统分析,建立该系统的功能模块框图以及界面的组织和设计;
(2)分析系统中的各个实体及它们之间的关系;
(3)根据问题描述,设计系统的类层次;
(4)完成类层次中各个类的描述;
(5)完成类中各个方法的定义;
(6)完成系统的应用模块;
(7)功能调试;
(8)完成系统总结报告。

 

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);获取订单生成日期时间;

 

posted @ 2021-07-26 11:44  我的成功之路  阅读(924)  评论(0)    收藏  举报