代码拉取完成,页面将自动刷新
【模板】
接口定义:
请求路径:
请求方式:
请求参数:
响应数据:
思路分析:
controller:
service:
mapper:
day02:
员工模块:employee
1.新增员工:
接口定义:
请求路径:/admin/employee
请求方式:POST
请求参数:json格式--> {"username":"xxx","name":"xxx"...} 使用DTO封装
响应数据:Result data:null
思路分析:
controller:
在EmployeeController中定义一个新增方法:
1.打印日志
2.调用service的新增方法
3.返回结果对象
service:
在EmployeeService接口中定义一个新增方法,并在实现类中实现该方法:
0.补充基础属性
1.密码加密之后再插入到数据库
2.调用mapper的insert方法
mapper:
在EmployeeMapper接口中定义一个新增方法:
--基于注解写sql句: insert into employee values(null,#{},#{},#{},#{},#{},#{})
存在的问题:
1.java.sql.SQLIntegrityConstraintViolationException: Duplicate entry 'lisi' for key 'employee.idx_username'
原因:因为username在表中设置了唯一约束,添加相同的用户名会报上述的错
解决方案:通过全局异常处理器处理该异常,返回响应的错误信息
2.设置创建人和更新人的时候,id直接写死了
解决方案:通过jwt令牌解析之后,获取当前登录人id,给创建人和更新人赋值
TheadLocal
2.员工分页:
接口定义:
请求路径:/admin/employee/page
请求方式:GET
请求参数:?name=xx&page=xx&pageSize=xx
响应数据:Result<PageResult>
思路分析:
controller:
在EmployeeController中定义一个分页查询方法:
1.调用service的分页查询方法,获取分页结果对象PageResult
2.返回结果
service:
在EmployeeService接口中定义一个分页方法,并在实现类中实现该方法:
//使用分页插件完成分页
0.导入分页插件依赖
1.设置分页参数 PageHelper.startPage(x,x)
2.调用mapper的条件分页查询
3.强转Page类型
4.封装PageResult对象,并返回
mapper:
在EmployeeMapper接口中定义一个条件分页方法:
基于xml开发--动态sql <if>
sql语句:select * from employee where name like concat('%',#{name},'%') order by create_time desc
【扩展】修改密码:
接口分析:
请求路径:/admin/employee/editPassword
请求方式:PUT
请求参数:{oldPassword: "123456", newPassword: "111111"} //需要自己补充员工id
响应数据:Result data:null
思路分析:
controller:
调用service
service:
1.需要自己补充员工id--从哪里获取?需要动态获取(获取当前登陆人的id)
-- ThreadLocal存了id,从ThreadLocal获取
2.对比数据库中的密码和前端传递过来的旧密码(加密之后对比)是否一致
3.如果一致,对新密码进行加密
4.调用mapper层的更新方法
mapper:
update employee set password = 111111 where id = ?
day03:
公共字段自动填充:
思路分析: 选择用AOP技术实现
0.导入aop相关依赖
1.定义切面类,在类中定义方法(通知--选择前置通知@Before)
2.在方法上面打上注解,并且写上表达式(使用注解的方式)
2.1 自定义一个注解
3.方法体逻辑分析:
3.1 根据连接点,获取到方法签名,根据方法签名,拿到方法的参数对象 Employee
3.2 判断方法的操作类型(根据注解里面的属性值判断)---注解的属性类型选择枚举类型
如果是新增,那么赋值四个字段(创建时间、更新时间、创建人、更新人)
如果是更新,那么赋值两个字段(更新时间、更新人)
3.2 通过反射,可以拿到字节码对象,根据字节码对象获取方法对象,调用方法对象,赋值
通过反射,可以拿到字节码对象,根据字节码对象获取成员变量,设置该变量的值
注解里面定义两个变量
public class XXX{
public static final String INSERT = "insert";
public static final String UPDATE = "update";
}
用枚举类
public Enum Opreation {
INSERT,UPDATE
}
涉及的技术点:AOP、自定义注解、反射、枚举
删除菜品:
接口定义:
请求路径:/admin/dish
请求方式:DELETE
请求参数:ids=1,2,3..
响应数据:Result data:null
思路分析:
controller:
service:
//0.开启事务
1.启售中的菜品不能删除,查dish
2.被套餐关联的菜品不能删除,查setmeal_dish
3.先删菜品
4.再删口味
mapper:
sql语句:
delete from dish where id in (1,2,3);
delete from dish_flavor where dish_id in (1,2,3);
修改菜品:
根据id查询菜品
接口定义:
请求路径:/admin/dish/{id}
请求方式:GET
请求参数:路径参数 id
响应数据:Result data:DishVO
根据类型查询分类【已完成】
文件上传【已完成】
修改菜品
接口定义:
请求路径:/admin/dish
请求方式:PUT
请求参数:json 使用DishDTO封装
响应数据:Result data:null
思路分析:
菜品启售停售:【作业】
接口定义:
请求路径:/admin/dish/status/{status}
请求方式:POST
请求参数:路径参数status+普通参数id
响应数据:Result data:null
思路分析:
菜品停售,则包含菜品的套餐同时停售
controller:
在DishController中定义一个启售停售方法:
1.调用service的方法
2.返回结果
service:
在DishService接口中定义一个启售停售方法,并在实现类中实现:
1.构造Dish对象,调用mapper更新方法,更新状态
2.如果是停售,需要将关联的套餐也停售
2.1 根据菜品id查询套餐信息(联表查询dish、setmeal、setmeal_dish)
2.2 如果能查出套餐,则调用套餐mapper,修改套餐状态为停售
注意:此处涉及到多张表的修改操作,所以需要开启事务
mapper:
在DishMapper中定义更新方法
在SetmealMapper中定义查询方法和更新方法
---------------------------------------------------------------------------------------
day04: 项目实战--完成套餐管理
- 新增套餐
- 套餐分页查询
- 删除套餐
- 修改套餐
- 起售停售套餐
---------------------------------------------------------------------------------------
1.新增套餐
1.1 文件上传【已完成】
1.2 根据分类类型查询分类列表【已完成】
1.3 根据分类id或菜品名称查询菜品
接口定义:
请求路径:/admin/dish/list
请求方式:GET
请求参数:categoryId \ name
响应参数:Result data:菜品对象dish
1.4 新增套餐
接口定义:
请求路径:/admin/setmeal
请求方式:POST
请求参数:json格式 使用SetmealDTO封装
响应参数:Result data:null
2.套餐分页查询
接口定义:
请求路径:/admin/setmeal/page
请求方式:GET
请求参数:page=1&pageSize=10&name=test&categoryId=13&status=1
响应参数:Result data:套餐分页列表 PageResult
3.删除套餐
接口定义:
请求路径:/admin/setmeal
请求方式:DELETE
请求参数:ids (数组参数)
响应参数:Result data:null
4.修改套餐
4.1 根据id查询套餐
接口定义:
请求路径:/admin/setmeal/{id}
请求方式:GET
请求参数:路径参数 id
响应参数:Result data: SetmealVO
4.2 根据类型查询分类(已完成)
4.3 根据分类id查询菜品(已完成)
4.4 图片上传(已完成)
4.5 修改套餐
接口定义:
请求路径:/admin/setmeal
请求方式:PUT
请求参数:json格式 封装到SetmealDTO
响应参数:Result data: null
5.起售停售套餐
接口定义:
请求路径:/admin/setmeal/status/{status}
请求方式:POST
请求参数:路径参数 status + 普通参数 id
响应参数:Result data: null
day05:
店铺营业状态设置--基于redis存在状态
思路分析:
controller:
在ShopController中定义一个设置状态的方法:
1.注入RedisTemplate对象,通过对象获取ValueOperations对象
2.通过ValueOperations对象操作String类型数据
3.直接往redis中设置一个字符串类型,value就是状态值
service: 无
mapper: 无
管理端-店铺营业状态获取--基于redis获取状态
思路分析:
controller:
在ShopController中定义一个查询状态的方法:
1.通过RedisTemplate对象获取ValueOperations对象
2.通过ValueOperations对象获取SHOP_STATUS
3.将得到的value值响应给前端
service: 无
mapper: 无
day06:
微信登录
接口定义:
请求地址:/user/user/login
请求方式:POST
请求参数:json格式 {"code":"xxx"} DTO封装
响应数据:Result Data:xxxVO封装
day07:
缓存菜品:
1.查询的时候,给每个分类下的菜品缓存到redis中
2.增删改的时候,需要清理缓存
情况一:新增菜品的时候,只清除当前菜品所属分类下的缓存菜品数据
情况二:修改菜品和更新菜品的时候,全部清除所有分类下的菜品缓存数据
购物车:
添加购物车
接口定义:
请求路径:/user/shoppingCart/add
请求方式:POST
请求参数:{"dishId":"xxx","dishFlavor":"xxx",...} JSON格式,使用DTO封装
响应数据:Result data:null
查看购物车
接口定义:
请求路径:/user/shoppingCart/list
请求方式:GET
请求参数:无 【注意:根据用户id查询购物车】
响应数据:Result data:List<ShoppingCart>
清空购物车
接口定义:
请求路径:/user/shoppingCart/clean
请求方式:DELETE
请求参数:无 【注意:需要根据用户id进行删除】
响应数据:Result data:null
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。