目录
后台登录功能开发
需求分析
页面原型展示;
- 查看登录请求信息;
- 登录页面展示(页面位置:项目/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注解,当发生异常的时候,事务会回滚。)
事务管理:使用数据库事务来确保多个操作在一个原子操作中执行。事务可以保证所有操作要么全部成功提交,要么全部回滚,以确保数据的一致性。
外键约束:在数据库中使用外键约束来建立表之间的关系并保持引用完整性。通过定义外键关系,可以确保在进行更新、插入或删除操作时,相关表之间的数据保持一致。
批量更新:在需要操作多张表的情况下,尽量使用批量更新操作,而不是逐个操作每张表。这样可以减少操作的次数,降低出错的可能性,并减少数据不一致的风险。
业务层面的校验:在应用程序的业务逻辑层面进行校验,确保多张表的数据操作符合业务规则和约束条件。例如,在更新操作之前,可以进行一些验证和检查,确保操作的合法性和数据的一致性。
数据库触发器:使用数据库触发器来在数据修改前后执行自定义的逻辑,例如在更新操作前后进行一些额外的数据验证和处理,以确保数据的一致性。
数据同步机制:如果数据分布在不同的数据库或数据源中,可以考虑使用数据同步机制来保持数据的一致性。例如,使用数据库复制或消息队列等技术,将数据变更同步到其他数据源。
问题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 的属性。