首页 > 其他分享 >瑞吉外卖day3

瑞吉外卖day3

时间:2023-05-09 19:13:39浏览次数:28  
标签:分类 day3 id 瑞吉 ThreadLocal 线程 外卖 菜品 public

分类管理

公共字段填充

问题分析

  代码实现

1.在实体类属性上加入@TableField注解,指定字段填充策略

 @TableField(fill = FieldFill.INSERT)//插入时填充字段
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)//插入和更新时填充字段
    private LocalDateTime updateTime;

    @TableField(fill = FieldFill.INSERT)//插入时填充字段
    private Long createUser;

    @TableField(fill = FieldFill.INSERT_UPDATE)//插入和更新时填充字段

 

2.按照框架要求编写元数据对象处理器,在此类中统一为公共字段赋值。此类需要实现MetaObjectHandler接口  

@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
    /**
     * 插入字段自动填充
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("插入字段自动填充");
        metaObject.setValue("updateTime", LocalDateTime.now());
        metaObject.setValue("createTime",LocalDateTime.now());
        metaObject.setValue("createUser",new Long(1));
        metaObject.setValue("updateUser",new Long(1));

    }

    /**
     * 更新字段自动填充
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("更新字段自动填充");
        metaObject.setValue("updateTime", LocalDateTime.now());
        metaObject.setValue("updateUser",new Long(1));

    }
}

功能完善

此时在公共字段自动填充时,设置的updateUser和createUSer的值是固定的, 需要改进为动态获取updateUser和createUser的值

客户端每次发送http请求时,对应的服务端都会分配一个线程来处理,在处理过程中涉及到下面类中的方法都属于相同的一个线程:

1.LoginCheckFilter的doFilter方法

2.EmployeeController的update方法

3.MyMetaObjectHandler的updateFill方法

可以使用ThreadLocal来实现动态获取updateUser和createUser的值

ThreadLocal并不是一个Thread,而是Thread的局部变量。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问。
ThreadLocal常用方法:
. public void set(T value)设置当前线程的线程局部变量的值.

  public T get()返回当前线程所对应的线程局部变量的值

我们可以在LoginCheckFilter的doFilter方法中获取当前登录用户id,并调用ThreadLocal的set方法来设置当前线程的线程局部变量的值(用户id),然后在MyMetaObjectHandler的updateFill方法中调用ThreadLocal的get方法来获得当前线程所对应的线程局部变量的值(用户id)。
实现步骤

1.编写BaseContext工具类,基于ThreadLocal封装的工具类

**
 * 功能描述
 *  编写BaseContext工具类,基于ThreadLocal封装的工具类
 * @author 15599
 * @date 2023/05/09  8:40
 */
public class BaseContext {
    private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();

    public static void setCurrentId(Long id){
        threadLocal.set(id);
    }
    public static Long getCurrentId(){
        return threadLocal.get();
    }
}

 

2.在loginCheckFilter的doFilter方法中调用BaseContext来设置当前登录用户的id

3.在MyMetaObjectHandler的方法中调用BaseContext来获取登录用户的id

 

新增分类

需求分析

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

 代码开发

类和基本结构

  • 实体类Category
  • Mapper接口CateGoryMApper
  • 业务层接口CategoryService
  • 业务层接口实现类CategoryServiceImpl
  • 控制层CategoryController

 代码开发

@PostMapping
    public R<String> save(@RequestBody  Category category){
        log.info("category={}",category);
        categoryService.save(category);
        return R.success("新增分类成功");
    }

 分类信息分页查询

 @GetMapping("/page")
    public R<Page> page(int page,int pageSize){
        Page<Category> pageInfo = new Page<>(page,pageSize);
        //条件构造器
        LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper();
        queryWrapper.orderByAsc(Category::getSort);
        categoryService.page(pageInfo,queryWrapper);
        return R.success(pageInfo);
    }

删除分类

需求分析

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

代码实现

在CategoryService实现类中编写remove方法判断分类是否关联菜品或套餐

  @Override
    public void remove(Long id) {
        LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Dish::getCategoryId,id);
        int count1 = dishService.count(queryWrapper);
        if (count1>0){
            //关联菜品。抛出异常
            throw  new CustomException("该菜品分类已经关联菜品,无法删除");
        }

        LambdaQueryWrapper<Setmeal> queryWrapper1 = new LambdaQueryWrapper<>();
        queryWrapper1.eq(Setmeal::getCategoryId,id);
        int count2 = setmealService.count(queryWrapper1);
        if (count2>0){
            //关联套餐  抛出异常
            throw  new CustomException("该菜品分类已经关联套餐,无法删除");

        }

        super.removeById(id);

    }

若关联菜品或套餐,则抛出自定义异常CustomException

public class CustomException extends RuntimeException{
    public CustomException(String message){
        super(message);

    }
}

在全局异常处理器中处理自定义异常

    @ExceptionHandler(CustomException.class)
    public R<String> exceptionHandler(CustomException ex){
        log.error(ex.getMessage());


        return R.error(ex.getMessage());
    }

修改分类

@PutMapping
    public R<String> update(@RequestBody Category category){
        log.info("修改分类信息{}",category);
        categoryService.updateById(category);
        return R.success("修改成功");

 

标签:分类,day3,id,瑞吉,ThreadLocal,线程,外卖,菜品,public
From: https://www.cnblogs.com/projectruiji/p/17379613.html

相关文章

  • DAY3
    Day3tcp的三次握手,四次挥手tcp协议在传输数据的时候,需要先进行三次握手,传输上三层数据,四次挥手应用层---》数据传输层---》tcp报文(源端口和目标端口)+数据/udp报头+数据网络层---》源ip和目标ip+tcp报文+数据路由数据链接层---》数据帧源mac和数据mac+ip包+tcp报文+数......
  • 瑞吉外卖day2
    员工信息分页查询整体实现思路前端页面发送ajax请求,将分页查询参数(page,pagesize,name)提交到服务端服务端Controller接受页面提交的数据并调用Service查询数据Service调用MApper操作数据库,查询分页数据Controller将查询到的分页数据响应给页面页面接收到分页数据并通过Elemen......
  • DAY3
    ikuai初始密码admin/admin默认没有开启dhcp自动获取ip,需要手动配置IPikuai配置两块网卡外网使用nat模式内网使用仅主机模式win系统使用仅主机模式镜像安装后应设置IP地址与本机IP差别不大最后一位改变即可q即可退出程序进入之后即可重新设置账户密码(不可太过简单)......
  • 《渗透测试》WEB攻防-通用漏洞&文件上传&js验证&mime&user.ini&语言特性 2022 Day31
     1、文件上传-前端验证2、文件上传-黑白名单3、文件上传-user.ini妙用4、文件上传-PHP语言特性 前置:后门代码需要用特定格式后缀解析,不能以图片后缀解析脚本后门代码(解析漏洞除外)如:jpg图片里面有php后门代码,不能被触发,所以连接不上后门#详细点:1、检测层面:前......
  • 云原生学习笔记-DAY3
    etcd进阶和K8s资源管理1etcd进阶1.1etcd配置etcd没有配置文件,配置是从serivce文件里面加载参数实现的1.2etcd选举机制1.2.1选举简介etcd基于Raft算法进行集群角色选举,使用Raft的还有Consul、InfluxDB、kafka(KRaft)等。Raft算法是由斯坦福大学的DiegoOngaro(迭戈......
  • 每日一练 | 华为认证真题练习Day37
    1、缺省情况下,STP协议中的端口状态由Disabled转化为forwarding状态至少需要30s的时间。A.对B.错2、在路由表中存在到达同一个目的网络的多个NextHop,这些路由称之为?A.等价路由B.默认路由C.多径路由D.次优路由3、OSPF协议在以下哪种网络类型中需要选举DR和BDR?(多选)A.点到点类型......
  • 每日一练 | 华为认证真题练习Day38
    1、静态路由协议的优先级不能手工指定。A.对B.错2、以下关于直连路由说法正确的是?A.直连路由优先级低于动态路由B.直连路由需要管理员手工配置目的网络和下一跳地址C.直连路由优先级最高D.直连路由优先级低于静态路由3、骨干区域内的路由器有它所有区域的全部LSDB。A.对B.......
  • 小程序和外卖app系统如何协同发力,促进用户增长
    小程序作为一种轻量级应用,也逐渐被广泛应用于各个领域。如何让小程序和外卖APP系统协同发力,促进用户增长呢?本文将结合代码分析,从以下几个方面进行阐述:1.提供一致性的用户体验对于用户来说,最重要的是一个良好的用户体验。为了提供一致的用户体验,我们可以在小程序和外卖APP中采用相同......
  • qbxt day3
    有向无环图有向无环图是一种特殊的图,其最大的意义在于能够拓扑排序。拓扑排序是指给这个图的\(n\)个点排序,使得所有\(x\rightarrowy\)的边\(x\)点都在\(y\)前面。求最短路是\(O_{(n+m)}\)的,也可以在这张图上做DP。拓扑排序考虑维护一个入度为\(0\)的点的集......
  • 牛客 55994 2023牛客五一集训派对day3 D Points Construction Problem
    D-PointsConstructionProblem_2023牛客五一集训派对day3(nowcoder.com)将图上恰好\(n\)个点染成黑色,使得图上相邻的黑白点对数量恰好为\(m\)考虑\(n\)个黑点如果不相邻,则两个点的贡献互不影响考虑相邻的情况,我们把相邻的点连边,则贡献为每一个连通块的贡献的和,我们用......