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("修改分类信息成功");
}