Java项目——苍穹外卖总结

news2024/11/17 1:56:48

附上本人代码连接:xiaoming325/sky-take-out (github.com)

项目概述

此项目是一个外卖点餐项目,分为商家端(管理员端)和用户端,商家端是一个网站,用户端是一个微信小程序,由于微信小程序没有上线,目前只能用微信开发者工具模拟手机进行操作测试。

后端环境

sky-common

constant:存放常量类,将一些常量(数字和字符串)封装为是实体类的属性,便于调用

context:存放BaseContext类,是基于ThreadLocal封装工具类,用于保存和获取当前登录用户id

enumeration:存放枚举类,将数据库的操作类型封装为枚举类的属性。将枚举类作为自定义注解类的属性,在AOP中对切入点方法进行注解时,可直接使用注解类的属性指定数据库操作类型,便于在AOP通知时用反射获取注解中指定的数据库操作类型,以便根据不同操作类型进行不同的通知

exception:存放各种自定义异常类,例如:登录失败异常,密码错误异常,套餐启用失败异常……

json:存放JacksonObjectMapper,是一个对象映射器,可以将Java和JSON互相序列化和反序列化,并可以指定格式

properties

存放配置属性类,阿里云、微信小程序、微信支付、JWT的相关配置属性类。

  • 配置属性类中存放相关变量属性,在配置文件中写好相关属性的值
  • 加注解,@Component,@ConfigurationProperties(将配置文件中相关属性的值赋给类中的成员),@Data

result:存放结果类,PageResult和Result,用于返回给前端。加相关lombok注解

utils:存放工具类,和配置属性类相对应。工具类中存放相关方法,工具类一般不加注解(视情况而定)

sky-pojo

存放DTO,VO和entity,需要视情况加相关lombok注解和@Builder(便于构造对象)

sky-server

后端服务,存放后端的三层架构、配置文件等。此模块中除了自定义注解类全局异常处理类,其余都需要加注解注册成为IOC容器中的bean。

其中controller,service,mapper不在这里做多解释,其余包依次为:

annotation:存放自定义注解类,上文已解释过

aspect:自定义切面类,用来编写切入点表达式和通知,实现AOP

@Aspect//设置当前类为切面类,告诉spring这个类是用来做AOP的

@Component//通知类(切面类)必须配置成Spring管理的bean

config:配置类,加上@Configuration注解。在这些配置类中通常编写方法,并将加入@Bean注解将方法返回对象注册为Bean

handler:存放全局异常处理器类,类上加@RestControllerAdvice注解,方法上加@ExceptionHandler注解,方法中捕获各种业务异常和sql异常并封装为Result进行返回(业务中的异常通过层层上抛最终到达这里被处理)

interceptor:存放管理员端和用户端的jwt令牌校验拦截器,类上加@Component。类中编写校验JWT的方法,除登录请求和用户端的查询营业状态请求外都需要校验JWT

task:利用Spring Task实现定时执行任务功能

WebSocket:存放WebSocketServer类,在类中编写代码实现客户端和服务端的连接,和互相发送消息。在其他地方依赖注入WebSocketServer类,可使用其内部的方法发送消息。

数据库表

employee员工表

user用户表

category分类表:分类的相关信息,根据type的值1和2分为两类(菜品类套餐类),每一个菜品类包含可多种菜品,每一个套餐类可包含多种套餐

shopping_cart购物车表:有user_id,dish_id,setmeal_id,dish_flavor分别关联用户表菜品表套餐表菜品口味表

address_book地址簿表:有user_id关联用户表

菜品类:

dish菜品表:菜品(除口味)的相关信息,包含逻辑外键category_id关联category分类表中的菜品类

dish_flavor菜品口味表:菜品口味的相关信息,包含逻辑外键dish_id关联dish菜品表

套餐类:

setmeal套餐表:套餐的相关信息,包含逻辑外键category_id关联category分类表中的套餐类

setmeal_dish套餐菜品关系表:套餐和菜品的关联关系,包含逻辑外键dish_id关联dish菜品表,逻辑外键category_id关联category分类表

订单类:

orders订单表:address_book_id关联地址簿表

order_detail订单细节表:order_id,dish_id,setmeal_id关联订单表菜品表套餐表

总结(部分):

category表:

category表中的菜品类对dish表中的菜品是一对多

category表中的套餐类对setmeal表中的套餐是一对多

dish表:

dish表中的菜品对dish_flavor口味表中的口味是一对多

setmeal_dish表:

一个套餐可能包含多个菜品,并且不同套餐的菜品可以重复,同一个套餐的菜品不能重复

所以setmeal_dish表中的dish_id、name、category_id都可以重复

业务需求分析

商家端(管理员端)

员工管理功能

接口

controller层

service层

mapper层

员工登录

参数:

EmployeeLoginDTO

返回值:

Result

参数:

EmployeeLoginDTO

返回值:

Employee

参数:

String username

返回值:

Employee

员工退出

参数:

void

返回值:

Result

新增员工

参数:

EmployeeDTO

返回值:

Result

参数:

EmployeeDTO

返回值:

void

参数:

Employee

返回值:

void

员工分页查询

参数:

EmployeePageQueryDTO

返回值:

Result

参数:

EmployeePageQueryDTO

返回值:

PageResult

参数:

EmployeePageQueryDTO

返回值:

Page

启用禁用员工账号

参数:

Integer status, Long id

返回值:

Result

参数:

Integer status, Long id

返回值:

void

参数:

Employee

返回值:

void

根据id查询员工信息

参数:

Long id

返回值:

Result

参数:

Long id

返回值:

Employee

参数:

Long id

返回值:

Employee

修改员工信息

参数:

EmployeeDTO

返回值:

Result

参数:

EmployeeDTO

返回值:

void

参数:

Employee

返回值:

void

总结
  1. Controller层接收的对象参数为DTO,一般不进行业务逻辑处理(除了登录功能要在Controller层中为登录成功的用户生成JWT令牌返回给前端),直接调用Service层方法将DTO传给Service层,并将返回结果封装给Result返回给前端
  2. Service层进行各种业务处理,一般是将DTO转换为entity实体类(并补全实体类缺少的属性,可使用AOP),直接调用Mapper层方法将entity实体类传给Mapper层
  3. Mapper层接收实体类参数,直接对数据库进行操作(复杂逻辑用动态sql编写)

1、Controller层的方法一般和Service层是一一对应的(一对一),但不同Service层中的请求可以调用同一个Mapper层方法(可以多对一),例如:修改员工信息和启用禁用员工账号是两个不同的请求,但调用的都是Mapper层中的update方法

2、Mapper层是整个业务的重点难点,要考虑如何操作数据库从而的到想要的数据。Mapper层也是最容易报错的地方,SQL编写容易出错,尤其注意动态SQL的语法

公共字段填充(AOP)

见以前博客和笔记

分类管理,菜品管理和套餐管理

三者类似,主要有新增,修改,删除,查询,分页查询,启用禁用等接口

店铺营业状态

只需要Controller层,设置营业状态时将其放入缓存,获取时直接从缓存中取出 

订单管理

订单状态:1待付款 2待接单 3已接单 4派送中 5已完成 6已取消

支付状态:0未支付 1已支付 2退款

订单搜索(分页查询):根据条件对订单进行分页查询

各个状态的订单数量统计:查询待接单、待派送、派送中的订单数量

订单详情:分别查询order订单表和order_detail订单细节表

接单:直接修改订单状态为已接单(前端已写好,只有已付款的订单才有接单按钮)

拒单:1、只有状态为待接单的订单才可以拒单 2、如果用户已支付则要退款 3、将订单状态改为已取消,并设置订单拒单原因和取消时间

取消订单:1、前端中已设置好,只有已完成的订单才可取消 2、如果用户已支付则要退款 3、将订单状态改为已取消,并设置订单取消原因和取消时间

派送订单:1、只有状态为已接单的订单才可以进行派送 2、将订单状态改为派送中

完成订单:1、只有状态为派送中的订单才可以改为已完成 2、更新订单状态为已完成并设置送达时间

数据统计

营业额统计、用户统计、订单统计、销量top10:这四者类似,根据开始日期和截止日期查询相关的数据

导出运营数据报表

工作台

今日数据查询:营业额、有效订单、订单完成率、平均客单价、新增用户

查询订单管理数据、查询菜品总览、查询套餐总览:类似以上,设置开始日期,截止日期和状态,用动态SQL进行查询

用户端

用户登录

微信用户登录,有相应的专门API

店铺营业状态

直接从缓存中读取店铺营业状态

分类管理

查询分类:根据类型查询分类

菜品管理

根据id查询菜品:先从缓存中查,查不到再去查数据库并放入缓存

套餐管理

条件查询套餐:利用缓存

查询套餐包含的菜品列表:查询dish菜品表和setmeal_dish套餐菜品表

订单管理

用户下单:1、地址簿不为空,收货地址没有超出配送范围、购物车不为空 2、向订单表和订单明细表插入数据,支付状态为待支付,订单状态为待付款 3、清空用户购物车

订单支付:1、调用微信支付接口 2、设置订单状态为待接单,更新支付时间 3、利用WebSocket向客户端浏览器发消息出发订单提醒

历史订单查询:查询订单表和订单明细表

查询订单详情:查询订单

用户取消订单:1、订单必须存在且状态为待付款或待接单,如果是待接单则要退款 2、更新订单状态为已取消、取消原因和取消时间

再来一单:1、查询订单明细表,将订单详情对象转换为购物车对象 2、将购物车对象集合批量添加到购物车表

订单催单:1、校验订单是否存在 2、利用WebSocket向客户端浏览器发消息出发催单提醒

购物车管理

添加购物车:1、先查看购物车是否有此商品,如果有只需将其数量加一,如果没有则直接添加 2、添加时判断是菜品还是套餐,添加方式不同

查看购物车:根据用户id查询购物车数据

清空购物车:根据用户id清空购物车数据

地址簿管理

查询当前用户的所有地址、根据id查询地址、根据id修改地址、根据id删除地址、查询默认地址

新增地址:新增地址都设置为不是默认地址

设置默认地址:1、将当前用户的所有地址修改为非默认地址 2、将当前地址改为默认地址

缓存

缓存套餐

用户端的查询方法使用缓存,先从缓存中查,查不到再从数据库中查,并放入缓存中

用户端的查询为根据分类id查询该分类下的菜品和菜品口味信息,将分类id作为键,多个菜品和菜品口味(DishVo)集合作为值加入缓存

管理员端的删改操作清理全部缓存,新增操作精确清理缓存(新增哪个),查询操作不涉及缓存

缓存菜品

同理缓存套餐

经验

  1. 进行修改操作时:动态sql中的不要用if标签非空判断拼接实体类中int类型的属性,因为int类型有默认值0,int类型肯定是非空并且会把表中本来的数据修改为默认值0。解决方法:修改前先进行查询将原来的数据作为实体类查询出来,在实体类的基础上改变属性后,将实体类作为参数传给mapper层进行修改操作,这样实体类中未修改的属性不会改变

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java ERP管理系统源码解析:微服务架构实践Spring Cloud Alibaba与Spring Boot

在当今数字化浪潮的推动下,企业对于高效、稳定且易于扩展的管理系统需求日益增长。为了满足这一需求,我们精心打造了一款基于Java技术的鸿鹄ERP(Enterprise Resource Planning)管理系统。该系统充分利用了Spring Cloud Alibaba、S…

【刷题5】在排序数组中查找元素的第一个和最后一个位置

目录 一、题目解析二、思路—二分查找(二段性)1、查找最左端区间2、查找最右端区间 三、代码 一、题目解析 题目理解: 返回begin和end,是数组下标 二、思路—二分查找(二段性) 1、查找最左端区间 left和right移动问题: 循环条件问题&…

探索甘肃非遗:Spring Boot网站开发案例

1 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规范化管理。这样的大环境让那些止步不前&#…

2024年中国电子学会青少年软件编程(Python)等级考试(二级)核心考点速查卡

考前练习 2024年03月中国电子学会青少年软件编程(Python)等级考试试卷(二级)答案 解析 2024年06月中国电子学会青少年软件编程(Python)等级考试试卷(二级)答案 解析 知识点描述 …

如何利用 Kafka,实时挖掘企业数据的价值?

首先,问读者老爷们一个简单的问题,如果你需要为你的数据选择一个同时具备高吞吐 、数据持久化、可扩展的数据传递系统,你会选择什么样的工具或架构呢? 答案非常显而易见,那就是 Kafka,不妨再次套用一个被反…

vue el-cascader 级联选择器 多选实现默认勾选并回显前子项

文章目录 前言代码实现总结 前言 最近实现一个需求 接收传递过来的值 并在 el-cascader级联选择器 上 勾选回显出来 记录下代码实现 代码实现 <template><div id"app"><el-card class"box-card"><el-formref"form2"label…

YOLOv7改进之MAE主干: 超强ConvNeXtV2 升级版结构,当MAE+YOLO卷积高效涨点

目录 1,原理概述 2,代码改进 新增一个convnextv2.py文件,增加以下代码 修改部分 第二步:在yolo.py中加入以下代码 然后在 在yolo.py中配置找到./models/yolo.py文件下里的parse_model函数,将类名加入进去 参考代码 YOLOv7网络配置文件 1,原理概述 原文:https://…

MATLAB绘图基础9:多变量图形绘制

参考书&#xff1a;《 M A T L A B {\rm MATLAB} MATLAB与学术图表绘制》(关东升)。 9.多变量图形绘制 9.1 气泡图 气泡图用于展示三个或更多变量变量之间的关系&#xff0c;气泡图的组成要素&#xff1a; 横轴( X {\rm X} X轴)&#xff1a;表示数据集中的一个变量&#xff0c…

LED显示屏如何通过FMEA进行风险分析:打造无忧显示新境界

LED显示屏作为高科技产品&#xff0c;其性能受到多种因素的影响&#xff0c;包括但不限于设计缺陷、材料质量、制造工艺、使用环境等。任何环节的疏漏都可能导致显示屏出现亮度不均、色彩失真、故障频发等问题&#xff0c;进而影响用户体验和品牌形象。因此&#xff0c;通过FME…

信息安全工程师(23)网络安全体系相关模型

前言 网络安全体系相关模型是描述网络安全体系如何实现的理论框架和抽象模型&#xff0c;它们为理解和设计网络安全解决方案提供了系统化的方法。 1. PDR模型 提出者&#xff1a;美国国际互联网安全系统公司(ISS)核心内容&#xff1a;保护(Protection)、检测(Detection)、响应(…

WWW 2024最新论文分享┆用于用户响应预测的时间兴趣网络

目录 论文简介 1. 团队介绍 2. 研究背景及主要贡献 3. 方法 4. 实验及结果 5. 总结与展望 6. 参考文献 论文简介 本推文详细介绍了一篇上海交通大学高晓沨教授和陈贵海教授团队发表在顶级学术会议WWW 2024的最新论文《Temporal Interest Network for User Response Pre…

MySQL—索引机制详解

索引介绍 基本介绍 MySQL 官方定义索引为一种帮助数据库高效获取数据的结构&#xff0c;其本质是排好序的快速查找数据结构。数据库除了存储表中的数据&#xff0c;还维护一些额外的满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式指向实际的数据&#xff0c;…

Visual Studio使用与“Hello Word“的编写

1.打开Visual Studio点击"创建新项目" 2.点击"空项目"&#xff0c;并点击"下一步" 3.设置"项目名称"并"设置地址" 4.打开项目后&#xff0c;右击"源文件"并选择"添加"的"新建项" 5.点击"…

SylixOS网络之DMA(Direct Memory Access)

目录 DMA 模块在网络设备中的作用Buffer Description (BD) 结构BD 结构定义&#xff1a;BD 结构字段解释BD 结构的工作流程 总结 在嵌入式系统和实时操作系统&#xff08;RTOS&#xff09;中&#xff0c;DMA&#xff08;Direct Memory Access&#xff09;模块是一种非常重要的硬…

1.MySQL的安装

目录 下载安装包 安装前环境的准备 正式安装 下载安装包 MySQL安装网址:https://www.mysql.com/cn/ 进去之后就是上面这个页面&#xff0c;进行汉化的时候将这个网页拉至最下&#xff0c;右下角点成中文就可以&#xff0c;如下这个页面。 回到页面顶端&#xff0c;点击下载&a…

图像特征提取-SIFT

文章目录 一、定义与原理二、主要步骤三、特点与优势四、代码运用五、应用领域 图像特征提取中的SIFT&#xff08;Scale-Invariant Feature Transform&#xff0c;尺度不变特征变换&#xff09;是一种强大的局部特征提取算法&#xff0c;广泛应用于计算机视觉和图像处理领域。以…

算法题——滑动窗口(图示+代码)

什么时候可以使用滑动窗口&#xff1f; 当我们尝试对一条题目进行暴力插解时&#xff0c;若发现 一、长度最小的子数组 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程…

mysql逗号分隔的一行数据转为多行数据

原表&#xff1a; 结果&#xff1a; 方法一&#xff1a;如果每条数据的被逗号分隔的数量在637条以内&#xff0c;使用 mysql.help_topic&#xff08;mysql自带的表&#xff0c;只有637个序号&#xff09;。 select a.id,a.enclosure_ids,SUBSTRING_INDEX(SUBSTRING_INDEX(a.en…

Linux线程同步机制之条件变量

线程同步的概念&#xff1a; 线程同步是多线程编程中的一个重要概念&#xff0c;它确保了多个线程在访问共享资源时能够协调一致&#xff0c;避免出现竞态条件、数据不一致或其他同步相关的问题。线程同步的关键在于控制多个线程的执行顺序和时机。 线程--条件变量的典型应用…

简单的springboot 编写Socket服务接口

简单的springboot 编写Socket服务接口 1.需求 我们项目中有部分老接口为票据接口&#xff0c;其中实现为java socket形式进行实现&#xff0c;但是其中大部分信息都是原始公司封装的包进行实现的&#xff0c;想要修改非常费劲&#xff0c;所以此处简单了解了一下socket&#…