Java项目实战跟练day8——分类管理

Java项目实战跟练day8——springboot + mybatis plus开发

分类管理

实现对该页面的各项操作
在这里插入图片描述
搭建框架:
实体类Category、Mapper接口CategoryMapper、业务层接口CategoryService、业务层实现类CategoryServicelmpl、控制层CategoryController
Category.java

@Data
public class Category implements Serializable {

    private static final long serialVersionUID = 1L;
    private Long id;

    //类型 1 菜品分类 2 套餐分类
    private Integer type;

    //分类名称
    private String name;

    //顺序
    private Integer sort;

    //创建时间
    @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)
    private Long updateUser;
}

CategoryMapper.java

@Mapper
public interface CategoryMapper extends BaseMapper<Category> {
}

CategoryService.java

@Service
public interface CategoryService extends IService<Category> {
}

CategoryServicelmpl.java

@Service
public class CategoryServicelmpl extends ServiceImpl<CategoryMapper, Category> implements CategoryService {
}

CategoryController.java

@Slf4j
@RestController
@RequestMapping("/category")
public class CategoryController {
    @Autowired
    private CategoryService categoryService ;
}

新增分类

前端模拟发送请求:
在这里插入图片描述
在这里插入图片描述
代码实现思路:
1、页面(backend/page/category/list.html)发送ajax请求,将新增分类窗口输入的数据以json形式提交到服务端;
2、服务端Controller接收页面提交的数据并调用Service将数据进行保存;
3、Service调用Mapper操作数据库,保存数据。
CategoryController.java

    /*
    新增分类
    @Param:category
    @return
     */
    @PostMapping
    public R<String> add( @RequestBody Category category) {
        log.info("接收数据:{}",category);
        categoryService.save(category);
        return R.success("新增分类成功");

分页查询分类

前端模拟发送请求:
在这里插入图片描述

在这里插入图片描述
前端代码

        methods: {
          async init () {
            await getCategoryPage({'page': this.page, 'pageSize': this.pageSize}).then(res => {
              if (String(res.code) === '1') {
                this.tableData = res.data.records
                this.counts = Number(res.data.total)
              } else {
                this.$message.error(res.msg || '操作失败')
              }
            }).catch(err => {
              this.$message.error('请求出错了:' + err)
            })
          },
// 查询列表接口
const getCategoryPage = (params) => {
  return $axios({
    url: '/category/page',
    method: 'get',
    params
  })
}

代码实现思路:
1、页面发送ajax请求,将分页查询参数(page、pageSize)提交到服务端;
2、服务端Controller接收页面提交的数据并调用Service查询数据;
3、Service调用Mapper操作数据库,查询分页数据;
4、Controller将查询到的分页数据响应给页面;
5、页面接收到分页数据并通过Elementul的Table组件展示到页面。
CategoryController.java

    /*
       分类分页查询
       @Param:

        */
    @GetMapping("/page")
    public R<Page> page(int page, int pageSize){
        log.info("page={},pageSize={},name={}",page,pageSize);
        //构建分页构造器
        Page pageInfo = new Page(page,pageSize);

        //构建条件构造器
        LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();

        //添加排序条件
        queryWrapper.orderByDesc(Category::getSort);

        //执行查询
        categoryService.page(pageInfo,queryWrapper);//jdk17版本会报错,切换至8后正常

        return R.success(pageInfo);
    }

页面展示如下
在这里插入图片描述

删除分类

前端模拟发送请求:
在这里插入图片描述
在这里插入图片描述
前端代码

 //删除
          deleteHandle(id) {
            this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
              'confirmButtonText': '确定',
              'cancelButtonText': '取消',
              'type': 'warning'
            }).then(() => {
              deleCategory(id).then(res => {
                if (res.code === 1) {
                  this.$message.success('删除成功!')
                  this.handleQuery()
                } else {
                  this.$message.error(res.msg || '操作失败')
                }
              }).catch(err => {
                this.$message.error('请求出错了:' + err)
              })
            })
          },
// 删除当前列的接口
const deleCategory = (ids) => {
  return $axios({
    url: '/category',
    method: 'delete',
    params: { ids }
  })
}

代码实现思路
1、页面发送ajax请求,将参数(id)提交到服务端;
2、服务端Controller接收页面提交的数据并调用Service删除数据;
3、Service调用Mapper操作数据库。
CategoryController.java

    /*
    根据id删除分类
    @Param:id
     */
    @DeleteMapping
    public R<String> delete(Long id){
        log.info("待删除分类id:{}",id);
        categoryService.removeById(id);
        return R.success("分类删除成功");
    }

分类删除功能优化:
上面已经实现根据id删除分类,但没有检查删除的分类是否关联菜品或者套餐,进行功能完善。
准备基础的类和接口:
1、实体类Dish和Setmeal
2、Mapper接口DishMapper和SetmealMapper
3、Service接口DishService和SetmealService
4、Service实现类DishServicelmpl和SetmealServicelmpl
Dish和Setmeal两个实体类中均通过categoryId关联Category类

    //菜品分类id
    private Long categoryId;
    //套餐分类id
    private Long categoryId;

上面使用mybatis-plus框架中的removeById方法实现,现自定义remove实现根据id删除分类:
CategoryService.java

@Service
public interface CategoryService extends IService<Category> {
    public void remove(Long id);
}

CategoryServicelmpl.java

@Service
public class CategoryServicelmpl extends ServiceImpl<CategoryMapper, Category> implements CategoryService {

    @Autowired
    private DishService dishService;

    @Autowired
    private SetmealService setmealService;

    /**
     * 根据id删除分类,删除之前需要进行判断
     * @param id
     */
    @Override
    public void remove(Long id) {
        LambdaQueryWrapper<Dish> dishLambdaQueryWrapper = new LambdaQueryWrapper<>();
        //添加查询条件,根据分类id进行查询
        dishLambdaQueryWrapper.eq(Dish::getCategoryId,id);
        int count1 = dishService.count(dishLambdaQueryWrapper);
        //查询当前分类是否关联了菜品,如果已经关联,抛出一个业务异常
        if(count1>0){
            throw new CustomException("该分类关联了菜品,不能删除");
        }
        LambdaQueryWrapper<Setmeal> setmealLambdaQueryWrapper = new LambdaQueryWrapper<>();
        //添加查询条件,根据分类id进行查询
        setmealLambdaQueryWrapper.eq(Setmeal::getCategoryId,id);
        int count2 = setmealService.count(setmealLambdaQueryWrapper);
        //查询当前分类是否关联了套餐,如果已经关联,抛出一个业务异常
        if(count2>0){
            throw new CustomException("该分类关联了套餐,不能删除");
        }
        //正常删除分类
        super.removeById(id);
    }
}

上述代码抛出异常CustomException,利用全局异常捕捉一下:
CustomException.java

/**
 * 自定义业务异常类
 */
public class CustomException extends RuntimeException {
    public CustomException(String message){
        super(message);
    }
}

GlobalExceptionHandler.java

 /**
     *业务类异常处理
     * @param ex
     * @return
     */
    @ExceptionHandler(CustomException.class)
    public R<String> exceptionHandler(CustomException ex){
        log.info(ex.getMessage());
        return R.error(ex.getMessage());
    }

CategoryController.java

 /*
    根据id删除分类
    @Param:ids
     */
    @DeleteMapping
    public R<String> delete(Long ids){
        //注意:方法的参数保持与前端页面传过来的一致
        log.info("待删除分类id:{}",ids);
//        categoryService.removeById(ids);
       categoryService.remove(ids);
        return R.success("分类删除成功");
    }

修改分类

前端模拟发送请求:
在这里插入图片描述
在这里插入图片描述
前端代码

              const reg = /^\d+$/
              if (reg.test(this.classData.sort)) {
                editCategory({'id':this.classData.id,'name': this.classData.name, sort: this.classData.sort}).then(res => {
                  if (res.code === 1) {
                    this.$message.success('分类修改成功!')
                    this.classData.dialogVisible = false
                    this.handleQuery()
                  } else {
                    this.$message.error(res.msg || '操作失败')
                  }
                }).catch(err => {
                  this.$message.error('请求出错了:' + err)
                })
              } else {
                this.$message.error('排序只能输入数字类型')
              }
            } else {
              this.$message.error('请输入分类名称或排序')
            }
// 修改接口
const editCategory = (params) => {
  return $axios({
    url: '/category',
    method: 'put',
    data: { ...params }
  })
}

后端代码

    /**
     * 根据id修改分类信息
     * @param category
     * @return
     */
    @PutMapping
    public R<String> edit(@RequestBody Category category){
        log.info("接收到分类信息为:{}",category);
        categoryService.updateById(category);
        return R.success("修改分类信息成功");
    }
  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值