瑞吉外卖逻辑分析

业务

service

ShopServiceImpl:

使用redis设置和查询店铺的状态。redistemplate.opsforvalue.set/get(key)

AddressBookServiceImpl:

新增地址,实体类设置字段的值,然后调用mapper的insert方法。

修改地址,调用updata调用主键去更新方法更新

设置默认地址,设置默认地址,然后获取当前用户的id,然后在sql中set用于默认地址,where userid。然后更新默认字段 return

使用LambdaUpdateWrapper去写一个查询条件

1
2
3
4
5
6
7
8
9
10
11
Long userId = BaseContext.getCurrentId();

// 1. 将该用户的所有地址设为非默认
LambdaUpdateWrapper<AddressBook> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(AddressBook::getUserId, userId).set(AddressBook::getIsDefault, 0);
addressBookMapper.update(null, wrapper);

// 2. 将当前地址设为默认
addressBook.setIsDefault(1);
addressBookMapper.updateById(addressBook);

CategoryServiceImpl:

新增菜品,新建菜品的实体类,使用beanuntil,拷贝DTO层数据,然后set状态,然后insert

分类查询,使用pagehelper插件,=.startpage(num,size);

然后使用Page<>保证菜品类,然后根据模糊匹配进行搜索,然后mapper调用,然后新建一个分页包装的reseponse返回这个数量和结果。

根据id删除菜品,先mapper查,然后看dishcount字段是不是关联了菜品,关联套餐不能删除,抛出异常。没有的话,就del删除。

ReportServiceImpl:

查询,使用一个map来装这个数据,然后返回数据,传入到mapper中的where/if标签里面一般是。

Mapper XML 中使用 <if test="xxx != null"> 拼接 where 条件。

TOPk,还是使用map,但是加上了连表查询。

1
2
3
4
5
6
7
SELECT d.name, SUM(od.number) as total_sales
FROM order_detail od
JOIN dish d ON od.dish_id = d.id
GROUP BY d.id
ORDER BY total_sales DESC
LIMIT #{topK}

SetmealServiceImpl:

新增套餐,先新建套餐实体类,拷贝dto数据,插入条数据,获取外键,然后获取关联的菜品,设置外键,然后保存。然后mapper里面使用foreach来遍历填写数据

分页插件查询。

批量删除套餐,使用foreach,lamda表达式,通过id查找数据,如果套餐的stuse为1.说明在售卖,不能删除,抛出异常。然后通过id删除套餐表中的数据。删除菜品关系表中的数据。

套餐的启用和停售,判断套餐内是否有停售菜品,有停售菜品的时候不能启用套餐,

如果是起售状态的话,直接更新为停售

修改套餐:

获取实体类对象,然后拷贝dto,然后更新数据。获取外键,删除套餐和菜品的关联关系。设置新的关系。然后重新插入

controller

DishController:

查询的时候,先从redis中根据key来拿数据,查到缓存的话,就直接返回缓存。没有的话,就从数据库中拿,然后存入redis中。

查询缓存:注解 @Cacheable,用于 将方法的返回值缓存起来,提高查询效率,避免重复查数据库。你这段代码的意思是:按分类 ID 查询套餐,并将结果缓存,条件是结果不为空。