超市管理系统

目录

 

写代码之前的分析

相关数据表的创建

对应的配置文件

用户管理场景的实现 

相关的数据对象

Mapper对象

Service对象 

关于密码加密

 Controller对象

 关于用户名和密码的校验

前端代码 

货物管理场景

 数据对象

Service层 

 Controller

JsonController​编辑

前端页面

订单管理场景 

数据对象

Mapper对象

 Service对象

Controller对象

前端部分

纯前端设计 


与我的文件搜索项目不同,上个项目我是为了练习我学的Java基础知识和多线程的使用,这个项目我会根据我学的SSM框架下进行制作,这个项目的代码量会更多

  • 首先这个项目是是模拟出一个超市后台管理系统的
  • 写这个项目的目的是为了巩固这一阶段我学的关于SSM框架学习的知识

写代码之前的分析

现实超市的用户角色:

  • 1顾客:可以从超市进行购物
  • 2货管:货品上架,货品下架,货品增量,货品减量,更新货品信息等
  • 3收银:录入订单,结账....(比如订单的创建,和订单的状态变化(未结账——>结账,或者取消订单))
  • 4老板:一些统计需求,进货情况,售货情况(也就是账单和货物量的情况)

 场景梳理(我们这里将所有用户的功能集中到一个用户上)

  • 用户管理=用户注册+用户登录
  • 货物管理=货物上架+货物下架+货物信息更新+货物的浏览
  • 订单管理=订单的创建+订单的状态变化+订单的浏览

关于如何实现

  • 因为我是基于SSM框架进行创建项目,就涉及到SSM框架的分层,我分为三大层 Contoller(用于存储动态资源)+Service(提供一些模块化业务化的功能)+Mapper(用于操纵Mybatis),这些都是过程对象,和一些数据对象

关于订单状态的变化情况

比如创建订单这个过程会涉及什么呢? 

  • 我们发现一个订单的状态的变化,会涉及到多个操作(多条SQL语句),所以我们必须要保证操作的原子性,假如我们在创建订单的时候,已经把商品的库存减去了,但是出现bug,那么我们的订单没有插入到表中,但是库存已经 减去了。这样就发生了错误,所以就要引入事务,将这一系列的操作变成了一个原子性的操作

相关数据表的创建

  • 创建数据库
  • orders表,用来存储订单信息
  • order_items表,用来存储的订单中的相关货物信息
  • users表,用来存储我们注册的用户信息
  • products表,用来存储我们的货物信息

各个数据表的关系 

 

对应的配置文件

用户管理场景的实现 

相关的数据对象

  • 这个数据对象对应着我们的数据表users的封装数据,在我们操纵数据库的时候对应一行数据 
  • 关于User数据对象,因为要被Mybatis调用,所以必须存在一个无参构造方法,和相关属性的setter方法,因为Mybatis就是默认先调用无参构造方法,和setter方法来注入相应的属性值,这里有@Date,所以不用我们自己写

Mapper对象

Service对象 

  •  利用构造方法依赖注入我们的UserMapper对象

关于密码加密

  • 我们之前都是明文去保存密码,这次我们引入一个加密库(实际就是做hash,不是真正的加密),我们不再保存明文密码,我们这里引入的就是BCrypt算法

  • 关于密码的等级
  •  密码一般我们都采用md5加密的方式,但是用md5加密,对于一个固定的字符串,其md5值是固定的,这样就会出现彩虹表攻击情况。所谓彩虹表攻击就是指攻击者有一张表,里面有密码明文和对应md5值的对应关系,攻击者利用这些关系来破解用户密码。

 Controller对象

  • 我们将异常(将不合法的数据的校验也变为异常的样式)的处理与我们的业务分开

 关于用户名和密码的校验

 抽象父类类

  • 对于密码和用户名这些校验都会有的校验方式,比如数据不能为空,不为null这些通用的放在一个抽象类中,然后让子类去继承,进一步减少了代码的数量 

密码校验

 用户名校验

  •  用户名校验对父类多了一个用户名的长度判断

关于异常的处理

前端代码 

  • 用户注册的表单,输入相应的数据,根据name和申请的路径找到对应的资源,提交对应的数据,经过各层的处理保存到数据库和session当前浏览器保存了当前用户 ,注册也是这套逻辑

货物管理场景

 数据对象

Product数据对象

  • 这个数据对象是对应着我们数据表的对象,是为了从数据表Product中获得数据和存储数据

ProductParam

  •  这个对象是对应我们前端表单输入的数据的接收对象,因为我们前端不是将所有的货物信息都要手动输入的,比如user_id,这个数据是我们通过当前登录的用户是是谁得到的(通过session得到)

 Mapper层

Service层 

 Controller

JsonController

  •  因为修饰的是@RestController,所以是如果返回的是String类型,那么是text/html,如果是对象,集合类则默认是JSON

前端页面

上架货物的前端页面

  •  这里是post方法,将数据提交到后端,其提交的数据跟productParam

展示所有货物信息+AJAX请求所有货物的资源

 更新货物信息的HTML页面

  •  更新货物的数据对象也是对应着productParam,但是比上架货物多了一个关于商品ID,其实productParam中有productId,之所以我们上架的时候不填productId,是因为他在数据表中是自增主键,你不填,相应的数据就是null,那么在插入的时候,会自动根据情况分配主键

流程分析

  • 访问create.html,商品上架的前提是必须先进行用户登录,用户未登录的话,是会跳转到登录页面,如何判断用户有没有登录,就靠session中的currentUser中的信息,货物上架的时候的上架用户id也是通过这个这个对象获得(我们把User类的对象存储在session,通过currentUser名称调用),先进行参数的合法性校验(复用之前的抽象类和异常处理),然后利用各层功能实现一个Product类的对象插入到数据表中,创建成功就跳转首页
  • 浏览商品:我们访问list.html如果用户未登录,我们就不返回资源,而是跳转到登录页面,进行登录,如果是已经登录了,就会返回相应的数据,和跳转到相应货物信息的页面(我们是根据当前redirectUrl是否为空来判断到底是那种处理)
  • 关于我们product/list.json返回类型的规定,因为前端展示的信息和后端存储的信息不一样,所以我们在Controller内部类定义一个PoductView来专门处理返回的数据,返回的类型采用JSON,所以用@Controller+ResposneBody,返回的是集合对象

  • 更新商品的逻辑跟上架商品差不多,就是多了一个参数的输入,商品Id,一个在数据表插入,一个在数据表根据id进行更新操作

订单管理场景 

数据对象

订单对象 

  • 用于封装关于订单的数据,用于存储进我们的orders表中

枚举类的内容

  • 1表示未支付 2表示已支付

  • 这个是用来存储我们具体的订单信息的,其中itemsList存储的是我们这个订单中每个订单项的信息,还有对应信息类型的转换,大概的内容就是这样

订单项的数据对象

  • 首先为什么要有订单项这个数据,是为了让订单和商品的多对多关系变成两个一对多的关系
  • 这个OrderItem对象是为了将关于订单项的数据封装起来,然后对应order_items表的数据,进行存储到数据表中

Mapper对象

OrderMapper对象

OrderItemMapper对象

 Service对象

Controller对象

关于创建订单

 关于具体的订单信息页面

订单取消和确认的操作

 关于前端订单列表信息展示

前端部分

创建订单的大概的流程

  • 用户进入/order/create.html的静态资源,然后填写1-3,2-5这样的数据,点击提交按钮,form表单发起HTTP请求(POST请求/order/create.do的资源)
  • 后端:Controller:先判断是不是已经登录了,没登陆就跳转到首页,登录了就解析了1-3,2-5这种字符串为Map<商品id,购买数量的>的数据结构,然后调用service的创建订单功能
  • Service:(对应订单创建整体作为一个事务@Transactional)
  • Mapper:根据具体的SQL语句将订单信息和订单项的数据插入到相对应的表
  • Cotroller:然后进行重定向到具体的订单信息页面,(order/detail/{uuid})
  • 浏览器会收到HTTP的重定向的响应,继续发送新的HTTP请求,也是就是(order/detail/{uuid}的GET请求)
  • Controller:解析得到url中的uuid数据,然后判断用户是否登录
  • Service:根据uuid查询到订单的基础信息(OrderMapper),根据orderId查询到所有属于这个订单的相关数据项(OrderItemMapper)
  • Controller MVC流程中,将查询到的订单信息作为order放到model中,使用order-detail作为view的名称(对应reasource/templates/order-datail.html文件中),Spring配合(Thymeleaf)将Model和View结合在一起,生成最终的HTML内容,响应给前端

纯前端设计 

我们上面的实现能让我们的功能是可用的,现在下面的设计就是将我们的前端变得美化一对,更加容易操作

首先让我们的页面有两个区域一个导航栏和一个功能区

  •  导航区是一样,功能区在不同功能下进行不同的功能模块的添加
  • 对公用的模块的css修饰
  • 然后各个模块多出来的功能就在这个框架的功能区去添加就行了

关于deatail(就是订单详情页面的确认和取消等的css修饰)

.基本信息 {background-color: rgba(255, 255, 255, .7);border-radius: 8px;padding: 16px;
}.下一步 {padding: 8px;
}.下一步 a {background-color: rgba(255, 255, 255, .7);text-decoration: none;
}.功能区 > * {margin: 16px 0;
}

 关于表格的修饰(比如商品的展示和订单的展示)

.功能区 {display: block;padding: 16px;
}table {border-collapse: collapse;border: 1px solid #000;width: 100%;
}th {background-color: blue;text-align: center;padding: 4px 0;
}td {text-align: center;padding: 4px 0;
}tr:nth-child(even) {background-color: bisque;
}tr:nth-child(odd) {background-color: chartreuse;
}

关于表单的修饰(比如登录注册等的表单)

form {background-color: rgba(255, 255, 255, .7);padding: 24px;border-radius: 8px;box-shadow: 0 0 10px #000;width: 400px;display: flex;flex-direction: column;justify-content: flex-start;align-items: stretch;
}form > * {margin: 8px 0;
}label {width: 100%;
}input {width: 100%;
}input {padding: 4px 8px;outline: none;height: 28px;border-radius: 4px;border: 1px solid #000;
}button {outline: none;height: 28px;border-radius: 4px;border: 1px solid #000;background-color: bisque;
}

测试项目功能

web自动化测试用例的设计

功能的改善点 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/31433.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超市零售数据可视化分析(Plotly 指南)

CSDN 上不能插入 HTML&#xff0c;可以在 GitHub Page 上查看&#xff1a; https://paradiseeee.github.io/2022/07/30/超市零售数据可视化分析/ 项目首次发布于 Kesci 上 – 超市零售数据分析。感兴趣的可以直接上去 Fork 之后自己做。由于上面只能用 Jupyter Notebook&#x…

超市数据分析

1 业务背景 数据集来源于&#xff1a;kaggle数据集&#xff08;链接&#xff09;&#xff0c;该数据集记录了某全球超市四年的销售数据&#xff0c;通过分析该超市四年内的销售数据&#xff0c;从不同角度出发&#xff0c;分析经营现状&#xff0c;发掘提高销量的销售策略&…

倒计时四天!第2期大模型讲习班报名中,顶尖专家面授,多角度系统培训

大模型前沿技术讲习班第一季第二期&#xff08;S01E02&#xff09;将在2023年4月24日至25日线下召开&#xff0c;我们邀请了来自顶尖科研领域的权威专家联合授课。上海交通大学助理研究员陈露&#xff0c;中国人民大学准聘助理教授李崇轩&#xff0c;中国人民大学准聘助理教授林…

开放报名|顶尖专家联合打造,首个系统化AI大模型前沿技术讲习班

大模型正在引发人工智能研究与应用范式产生重大变革&#xff0c;越来越多的顶级团队和杰出人才纷纷加入这一技术浪潮。作为AI大模型科研先锋&#xff0c;智源研究院聚集了来自高校院所和创新企业的一大批大模型领域卓越学者与工程师&#xff0c;共同致力于推动我国大模型的创新…

提升大模型研究应用技能:第2期前沿讲习班报名,顶尖专家面授,多角度系统培训...

人工智能研究与应用范式正经历一场剧变&#xff0c;越来越多的顶级团队和杰出人才纷纷加入这一变革浪潮。作为AI大模型科研先锋&#xff0c;智源研究院携手一批卓越的学者与工程师&#xff0c;致力于将尖端技术与经验传授给有潜力的学习者&#xff0c;通过高效的学习方式&#…

后端使用phantomjs对页面进行截图

最近碰到这样一些需求&#xff0c;后端需要对某个图表页面进行动态截图&#xff0c;将截图通过邮件发送到指定邮箱进行每日提醒。 这就需要用到无界浏览器进行此类操作。常见的无界浏览器有以下几种&#xff0c;知识来源于chatgpt3.5&#xff1a; Headless Chrome - Google C…

chatgpt赋能python:Python画图空白的解决方法

Python画图空白的解决方法 Python作为一种高效、简洁的编程语言&#xff0c;被广泛应用于数据分析、机器学习、图像处理等领域。其中&#xff0c;常用的Python画图库有matplotlib、seaborn、plotly等。但是&#xff0c;有时候我们会遇到一个奇怪的问题&#xff0c;就是在画图时…

复旦大学郁喆隽:网络制造出人的“幻象”,深度思考如何可能?

“人是什么?”这是亘古以来人们反复追问的一个古老命题。从元宇宙到ChatGPT&#xff0c;这个人人都在讨论、理解和实践互联网的时代&#xff0c;对“人”的自我定义和认知产生了哪些影响&#xff1f;    在3月12日复旦大学-华盛顿大学EMBA项目主办的“复调艺文沙龙”上&am…

用AI智能(DALL.E2)搞一个Logo和绘制坤坤的脚

浅谈ChatGPT和DALL.E2 ChatGPT 最近有个叫chatgpt的玩意老火了&#xff0c;不仅在科技圈刮起一阵骚乱&#xff0c;同时在金融圈也闹的沸沸扬扬&#xff0c;很多板块个股纷纷水涨船高 chatgpt是美国人工智能研究所实验室OpenAi开发的一种全新的聊天机器人模型&#xff0c;当然我…

微软 AI 华人先驱黄学东正式宣布离职,将加入 Zoom 担任 CTO

微软华人 AI 版图上一块不可或缺的拼图&#xff0c;现在也离开了。 作者 | 郭思 编辑 | 陈彩娴 雷峰网独家获悉&#xff0c;微软 AI 华人先驱黄学东近日在社交媒体正式宣布从微软离职&#xff0c;将加入 Zoom 担任 CTO。 上世纪六十年代出生的黄学东是与变化共生、在变化中成长…

马斯克怒了:我要起诉微软!

鱼羊 发自 凹非寺量子位 | 公众号 QbitAI OpenAI还没撕完&#xff0c;马斯克又跟微软杠上了&#xff0c;甚至直接在推特上放话&#xff1a; 我要告微软&#xff01; 这又是发生了甚么&#xff1f; 原因无它&#xff1a;微软刚刚“封杀”了推特。公告显示&#xff0c;从4月25日&…

生成式AI的价值与机遇,这家云服务商给出了详细解答

从2022年末一直到2023年上半年&#xff0c;许多人亲眼见证了ChatGPT的风靡全球&#xff0c;以及生成式AI与大语言模型的大爆发。 那么对于广大用户来说&#xff0c;生成式AI究竟意味着怎样的机遇&#xff1f;数据在生成式AI应用中扮演着怎样的角色&#xff1f;如何解锁生成式AI…

Mac版R语言入门(三)数据的导入

R语言&#xff08;三&#xff09;数据的导入&#xff0c;包括以下几个部分的内容&#xff1a; R语言问题讨论交流&#xff0c;欢迎关注我的新浪微博&#xff1a;Jenny爱学习 1.数据类型介绍 2.数据导入 3.抓取网络数据 一.数据类型 1&#xff09;Excel、Spreadsheet数据&…

R语言学习笔记——统计结果保存到本地文件(word、txt、csv)

1. 保存为word或txt文件 sink&#xff08;&#xff09;&#xff1a;在代码开始前&#xff1a;sink(“输出文件名.txt”)&#xff0c;将结果全部输出到工作文件夹下的名为 "输出文件名.txt" 的文档。这时在R控制台的输出窗口中看不到输出结果&#xff0c;代码结束时用…

R/ggplot2保存图片中文字体至PDF——showtext包一文清除所有障碍

R/ggplot2保存图片中文字体至PDF——showtext包一文清除所有障碍 文章概要1.问题描述2.Showtext包使用流程全注释2.1案例介绍——导入线上的谷歌字体2.2实例测试——导入本地字体&#xff0c;以宋体、新罗马为例 3拓展-新罗马与Serif的不同4.showtextggsave保存图片字体大小设置…

Rstudio读取csv文件

读取csv文件老是失败&#xff0c;就一直在社区找方法&#xff0c;结合了多篇文章&#xff0c;终于成功&#xff0c;我谢 错误类型&#xff1a; 1、Error in file(file, "rt", encoding fileEncoding) : cannot open the connection In addition: Warning message…

利用R处理PDF文件

pdftools pdftools是一个专门用来处理pdf文件的包 pdftools pdf_text() pdf_text()#将pdf每页返回成(return)成一个character vector. > #举个例子 > a <- pdf_text("41375_2012_BFleu2012127_MOESM29_ESM.pdf") > #查看pdf页数 > length(a) [1] 2…

R语言NetCDF格式数据的读写

常用函数&#xff1a; nc_open 打开.nc文档 nc_close 关闭.nc文档 nc_create 新建.nc文档 ncvar_get 读取变量数据 ncatt_get 读取变量属性 ncvar_def 设定变量 ncdim_def 设定维度 ncvar_add 添加变量 ncvar_put 写入变量数据 ncatt_put 写入变量属性 一、读取.nc格…

R语言中的导出为pdf文件或txt文件的注意事项

最近看了下R语言的书&#xff0c;练练手发现一些问题 比如保存图像为pdf文件&#xff0c;我一开始老是显示文件为不含页面&#xff0c;后来才想清楚其中的道理 首先输入 pdf("mypdf.pdf") 然后用source执行一段脚本 source("script2.R") 如果你前面没…