瑞吉外卖总结篇1

目录

后台登录功能开发

需求分析

代码开发 

后台退出功能开发 

需求分析

代码开发 

完善登录功能

 需求分析

代码实现 

新增员工 

需求分析

代码开发 

员工信息分页查询 

需求分析

代码开发

 启用/禁用员工账号

 需求分析

代码开发

 编辑员工信息

需求分析

代码开发

公共字段自动填充 

需求分析

代码开发

新增分类 

需求分析

代码开发

分类信息分页查询

需求分析

代码开发

删除分类

需求分析

代码开发

修改分类

需求分析

代码开发

新增菜品

需求分析

代码开发

菜品信息分页查询

需求分析

代码开发

修改菜品

需求分析

代码开发

新增套餐

需求分析

代码开发

套餐信息分页查询

需求分析

代码开发

删除套餐

需求分析

代码开发

面试相关问题总结

问题1:那如果套餐库存为0或者套餐下架业务逻辑是什么样呢?

问题2:如何保证操作多张表的时候数据一致性。

问题3:什么情况可能导致事务异常?

问题4:springboot中哪里用到了反射?


后台登录功能开发

需求分析

页面原型展示;

  • 查看登录请求信息;
  • 登录页面展示(页面位置:项目/resources/backend/page/login/login.html);
  • 通过浏览然调试工具(F12),可以发现,点击登录按时,页会发送请(请求地址为http://localhost:8080/empioyee/login)并提交参数(username和password);此时报404,是因为我们的后台系统还没有响应此请求的处理器,所以我们要创建相关类来处理登录请求
  • 数据模型(empioyee表)

代码开发 

创建实体类Employee,和employee表进行映射;
创建Controller、Service、Mapper;

导入返回结果类R。此类是一个通用结果类,服务端响应的所有结果最终都会包装成此种类型返回给前端页面;

4)在Controller中创建登录方法
处理逻辑如下:

  • 将页面提交的密码password进行md5加密处理
  • 根据页面提交的用户名username查询数据库
  • 如果没有查询到则选回登录失败結果
  • 密码比对,如果不一致则返回登录失败结果
  • 查看员工状态,如果为已禁用状态,则返回员工已禁用结果
  • 登录成功,将员工id存入Session并返回登录成功结果

后台退出功能开发 

需求分析

员工登录成功后,页面跳转到后台系统首页面(backend/index.html),此时会显示当前登录用户的姓名。如果员工需要退出系统,直接点击右侧的退出按钮即可退出系统,退出系统后页面应跳转回登录页面。

代码开发 

用户点击页面中退出按钮,发送请求,请求地址为/employee/logout,请求方式为POST。
我们只需要在Controller中创建对应的处理方法即可,具体的处理逻辑:
1、清理Session中的用户id
2、返回结果

完善登录功能

 需求分析

还存在一个同题:用户如果不登录,直接访同系统首员面,照样可以正常访网。
这种设计并不合理,我们希望看到的效果应该是,只有登最成功后才可以访间系统中的页面,如果没有景则转到登
那么,具体应该怎么实现呢?
答案就是使用设滤器或者拦截裁,在过滤总或者拦截然中判断用户是香已经完成登录,如果没有登录则跳转到登录页面。

代码实现 

实现步骤:
1、创建自定义过滤器LoginCheckfilter
2、在启动类上加入注解@Servletcomponentscan
3、完善过滤器的处理功能

新增员工 

需求分析

完成点击[添加员工]按钮跳转到新增页面。

代码开发 

1、页面发送ajax请求,将新增员工页面中输入的数据以json的形式提交到服务端
2、服务端Controller接收页面提交的数据并调用Service将数据进行保存
3、Service调用Mapper操作数据库,保存数据

员工信息分页查询 

需求分析

员工信息在不同的页面展示

代码开发

1、页面发送ajax请求,将分页查询参数(page、pageSize、name)提交到服务端
2、服务端Controller接收页面提交的数据并调用Service查询数据
3、Service调用Mapper操作数据库,查询分页数据
4、Controller将查询到的分页数据响应给页面
5、页面接收到分页数据并通过ElementUl的Table组件展示到页面上

 启用/禁用员工账号

 需求分析

在员工管理列表页面,可以对某个员工账号进行启用或者禁用操作。账号禁用的员工不能登录系统,启用后的员工可以正常登录。
需要注意,只有管理员(admin用户)可以对其他普通用户进行启用、禁用操作,所以普通用户登录系统后启用禁用按钮不显示。

代码开发

 启用、禁用员工账号本质上就是一个更新操作,也就是对status状态字段进行操作
在Controller中创建update方法,此方法是一个通用的修改员工信息的方法

 编辑员工信息

需求分析

在员工管理列表页面点击编辑按钮,跳转到编辑页面,在编辑页面回显员工信息并进行修改,最后点击保存按钮完成编辑操作。

代码开发

1、点击编辑按钮时,页面跳转到add.html,并在url中携带参数[员工id];
2、在add.html页面获取url中的参数[员工ld];
3、发送ajax请求,请求服务端,同时提交员工id参数;
4、服务端接收请求,根据员工id查询员工信息,将员工信息以json形式应给页面
5、页面接收服务端响应的Json数据,通过VUE的数据定进行员工信息回显
6、点击保存按钮,发送ajax请求,将页面中的员工信息以json方服务端
7、服务端接收员工信息,并进行处理,完成后给页面响应
8、页面接收到服务端响应信息后进行相应处理

公共字段自动填充 

需求分析

在新增员工时需要设置创建时间、创建人、修改时间、修改人等字段,在编辑员工时需要设置修改时间和修改人等字段。这些学段属于公共字段,也就是很多表中都有这些字段。

代码开发

Mybatis Plus公共字段自动填充,也就是在插入或者更新的时候为指定字段赋予指定的值,使用它的好处就是可以统一对这些字段进行处理,避免了重复代码。
实现步骤:
1、在实体类的属性上加入@TableField注解,指定自动填充的策路
2、按照框架要求缤写元数据对象处理器,在此类中统一为公共字段赋值,此类需要实现MetaobjectHandler接口

新增分类 

需求分析

后台系统中可以管理分类信息,分类包括两种类型,分别是菜品分类和套餐分类。当我们在后台系统中添加菜品时要选择一个菜品分类,当我们在后台系统中添加一个套餐时需要选择一个套餐分类,在移动端也会按照菜品分类和套餐分类来展示对应的菜品和套餐。

代码开发

实体类Category
Mapper接口CategoryMapper
业务层接口CategoryService
业务层实现类CategoryServicelmpl
控制层CategoryController

分类信息分页查询

需求分析

分页展示信息。

代码开发

1、页面发送ajax请求,将分页查询参数(page、pagesize)提交到服务端
2、服务端Controller接收页面提交的数据并调用Service查询数据
3、Service调用Mapper操作数据库,查询分页数据
4、Controller将查询到的分页数据响应给页面
5、页面接收到分页数据并通过ElementUl的Table组件展示到页面上

删除分类

需求分析

在分类管理列表页面,可以对某个分类进行制除操作。需要注意的是当分类关联了菜品或者套餐时,此分类不允许删除。

代码开发

1、页面发送ajax请求,将参数(id)提交到服务端
2、服务端Controller接收页面提交的数据并调用Service制除数据
3、Service调用Mapper操作数据库

修改分类

需求分析

在分类管理列表页面点击修改按钮,弹出修改窗口,在修改窗口回显分类信息并进行修改,最后点击确定按钮,完成惨改操作。

代码开发

1、页面发送ajax请求,将参数(id)提交到服务端
2、服务端Controller接收页面提交的数据并调用Service制除数据
3、Service调用Mapper操作数据库

新增菜品

需求分析

后台系统中可以管理菜品信息,通过新增功能来添加一个新的菜品,在添加菜品时需要选择当前菜品所属的菜品分类。并且需要上传菜品图片,在移动端会按照菜品分类来展示对应的菜品信息。

代码开发

准备工作:

实体类DishFlavor
Mapper接□ DishFlavorMapper
业务层接口 DishflavorService
业务层实现类 DishFlavorServicelmpl
控制层 DishController

交互过程

  • 页面(backend/page/food/add.html)发送ajax请求,请求服务端获取菜品分类数据并展示到下拉框中
  • 页面发送请求进行图片上传,请求服务端将图片保存到服务器
  • 页面发送请求进行图片下载,将上传的图片进行回显
  • 点击保存按钮,发送ajax请求,将菜品相关数据以json形式提交到服务端

开发新增菜品功能,其实就是在服务端编写代码去处理前端页面发送的这4次请求即可。

菜品信息分页查询

需求分析

分页展示。

代码开发

1、页面(backend/page/food/list.html)发送ajax请求,将分页查询参数(page、pageSize、name)提交到服务端,获取分页数据
2、页面发送请求,请求服务端进行图片下载,用于页面图片展示
开发菜品信息分页查询功能,其实就是在服务端编写代码去处理前端页面发送的这2次请求即可。

修改菜品

需求分析

在菜品管理列表页面点击修改按钮,跳转到修改菜品页面,在修改页面回显菜品相关信息并进行修改,最后点击确定按钮完成修改操作。

代码开发

1、页面发送ajax请求,请求服务端获取分类数据,用于菜品分类下拉框中数据展示
2、页面发送ajax请求,请求服务端,根据id查询当前菜品信息,用于菜品信息回显
3、页面发送请求,请求服务端进行图片下载,用于页图片四显
4、点击保存按钮,页面发送ajax请求,将修改后的菜品相关数据以json形式提交到服务端
开发修改菜品功能,其实就是在服务端编写代码去处理前端页面发送的这4次请术即可

新增套餐

需求分析

套餐就是菜品的焦合。
后台系统中可以管理套餐信息,通过新增套餐功能来添加一个新的餐,在添加套餐时需要选择当前套餐所属的套餐分类和包含的菜品,并且需要上传套餐对应的图片,在移动端会按照套餐分类来展示对应的套餐。

代码开发

准备工作:

在开发业务功能前,先将需要用到的类和接口基本结构创建好:

  • 实体类 SetmealDish
  • DTO SetmealDto
  • Mapper接囗SetmealDishMapper
  • 业务层接口 SetmealDishService
  • 业务层实现类 SetmealDishServicelmpl
  • 控制层 SetmealController

交互过程

  • 页面(backend/page/combo/add.html)发送ajax请求,请求服务端获取套餐分类数据并展示到下拉框中
  • 页面发送ajax请求,请求服务端获取菜品分类数据并展示到添加菜品窗口中
  • 页面发送ajax请求,请求服务端,根据菜品分类查询对应的品数据并展示到添加菜品窗口中
  • 页面发送请求进行图片上传,请求服务端将图片保存到服务器
  • 页面发送请求进行图片下载,将上传的图片进行回显
  • 点击保存按钮,发送ajax请求,将套餐相关数据以json形式提交到服务端

开发新增套餐功能,其实就是在服务端编写代码去处理前端页面发送的这6次请求即可

套餐信息分页查询

需求分析

系统中的套餐数据很多的时候,如果在一个页面中全部展示出来会显得比较乱,不便于查看,所以一般的系统中都会以分页的方式来展示列表数据。

代码开发

1、页面(backend/page/combo/list.html)发送ajax请求,将分页查询参数(page、pagesize.
name)提交到服务端,获取分页数据
2、页面发送请求,请求服务端进行图片下载,用于页面图片展示
开发套餐信息分页查询功能,其实就是在服务端编写代码去处理前端页面发送的这2次请求即可

删除套餐

需求分析

在套餐管理列表页面点击删除按钮,可以删除对应的套餐信息。也可以通过复选框选择多个套餐,点击批量删除按钮一次删除多个套餐。

注意,对于状态为售卖中的套餐不能删除,需要先停售,然后才能删除。

代码开发

1、页面(backend/page/combo/list.html)发送ajax请求,将分页查询参数(page、pagesize.
name)提交到服务端,获取分页数据
2、页面发送请求,请求服务端进行图片下载,用于页面图片展示
开发套餐信息分页查询功能,其实就是在服务端编写代码去处理前端页面发送的这2次请求即可

面试相关问题总结

问题的原文链接:https://blog.csdn.net/Panci_/article/details/134872534 

问题1:那如果套餐库存为0或者套餐下架业务逻辑是什么样呢?

套餐库存为0的业务逻辑:

下单失败: 当用户下单时,系统可以检查套餐的库存,如果库存为0,则拒绝生成订单,返回给用户相应的提示,如“库存不足”或“该套餐已售罄”。

套餐下架的业务逻辑:

阻止下单: 当套餐下架时,用户下单时不会查询到已下架的套餐。

下架套餐: 关联菜品的套餐不能被下架

问题2:如何保证操作多张表的时候数据一致性。

(瑞吉外卖:操作多张表的时候,一般会在IService的抽象方法上加上@transactional注解,当发生异常的时候,事务会回滚。)

  1. 事务管理:使用数据库事务来确保多个操作在一个原子操作中执行。事务可以保证所有操作要么全部成功提交,要么全部回滚,以确保数据的一致性。

  2. 外键约束:在数据库中使用外键约束来建立表之间的关系并保持引用完整性。通过定义外键关系,可以确保在进行更新、插入或删除操作时,相关表之间的数据保持一致。

  3. 批量更新:在需要操作多张表的情况下,尽量使用批量更新操作,而不是逐个操作每张表。这样可以减少操作的次数,降低出错的可能性,并减少数据不一致的风险。

  4. 业务层面的校验:在应用程序的业务逻辑层面进行校验,确保多张表的数据操作符合业务规则和约束条件。例如,在更新操作之前,可以进行一些验证和检查,确保操作的合法性和数据的一致性。

  5. 数据库触发器:使用数据库触发器来在数据修改前后执行自定义的逻辑,例如在更新操作前后进行一些额外的数据验证和处理,以确保数据的一致性。

  6. 数据同步机制:如果数据分布在不同的数据库或数据源中,可以考虑使用数据同步机制来保持数据的一致性。例如,使用数据库复制或消息队列等技术,将数据变更同步到其他数据源。

问题3:什么情况可能导致事务异常?

  • 数据库连接问题: 如果在事务执行期间数据库连接发生问题,比如连接中断或数据库不可用,事务可能会失败。
  • 违反数据库约束: 当尝试向数据库中插入、更新或删除数据时,如果违反了数据库的约束条件,如唯一性约束、外键约束等,事务将失败。
  • 死锁: 当多个事务相互等待对方释放锁资源时,可能发生死锁。如果系统无法解决死锁,某些事务将被终止,导致异常。
  • 超时: 事务执行时间超过了系统设置的最大时间限制,可能会导致事务异常。这通常是为了避免长时间运行的事务阻塞系统。
  • 程序错误: 编程错误可能导致事务异常。例如,在事务中执行的代码中可能包含了错误,或者事务在执行期间遇到了意外情况。
  • 并发问题: 在多用户并发访问的环境中,如果不正确地处理并发控制,可能会导致事务异常,如丢失更新、脏读等问题。
  • 资源耗尽: 如果事务在执行期间请求的资源(如内存、文件句柄等)超出了系统的可用资源,可能会导致事务异常。
  • 中断操作: 在事务执行期间,如果操作系统或硬件发生故障,或者系统被强制关闭,事务可能无法正常完成。

问题4:springboot中哪里用到了反射?

依赖注入(Dependency Injection): Spring Boot 使用反射来实现依赖注入。在你的应用程序中,你可以使用 @Autowired 注解来注入依赖关系。Spring 通过反射来检查和设置注入的属性或构造函数参数。

组件扫描: Spring Boot 通过扫描包路径来发现和注册组件(例如,@Controller、@Service、@Repository等)。这涉及到使用反射来检查类的注解和创建相应的对象。

AOP面向切面编程: Spring Boot 使用 AOP 实现一些横切关注点,例如事务管理、日志记录等。AOP 在运行时通过代理生成机制,使用了反射来创建代理对象,并在方法执行前后织入横切逻辑。

动态代理: Spring Boot 中的一些特性,例如缓存、事务管理等,使用了动态代理。动态代理是通过反射在运行时创建代理对象的一种机制。

数据绑定: Spring Boot 中使用了数据绑定来将外部配置文件中的属性值绑定到 Java 对象上。这个过程中涉及到通过反射设置对象的字段。

BeanPostProcessor: Spring 框架中有一些接口,如 BeanPostProcessor,允许在 bean 初始化前后进行处理。这涉及到使用反射来检查和修改 bean 的属性。

  • 30
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值