1.swagger的使用
1.使用knife4j坐标
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>3.0.2</version>
</dependency>
2.在webmvc配置类加上注解
@EnableKnife4j
@EnableSwagger2
public class WebMvcConfig implements WebMvcConfigurer {
3.配置扫描的包
// 在配置类中声明一个Docket类型的bean, 通过该bean来指定生成文档的信息
@Bean
public Docket createRestApi() {
// 文档类型
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
//更改为自己项目的路径:
.apis(RequestHandlerSelectors.basePackage("com.maidou.reggie.controller"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("瑞吉外卖")
.version("1.0")
.description("瑞吉外卖接口文档")
.build();
}
4.设置静态资源映射
/**
* 设置静态资源映射
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
log.info("开始进行静态资源映射...");
registry.addResourceHandler("doc.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
5.配置登录过滤器
"/doc.html",
"/webjars/**",
"/swagger-resources",
"/v2/api-docs"
2.注解的使用
@ApiModel注解写在实体类上
@ApiModelProperty("")写在属性上
@Data
@ApiModel("分类")
public class Category implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("主键")
private Long id;
//类型 1 菜品分类 2 套餐分类
@ApiModelProperty("类型")
private Integer type;
//分类名称
@ApiModelProperty("分类名称")
private String name;
//顺序
@ApiModelProperty("顺序")
private Integer sort;
@ApiModelProperty("创建时间")
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@ApiModelProperty("修改时间")
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@ApiModelProperty("修改人")
@TableField(fill = FieldFill.INSERT)
private Long createUser;
@ApiModelProperty("创建人")
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateUser;
//是否删除
@ApiModelProperty("是否删除")
@TableField(exist = false)
private Integer isDeleted;
}
@Api(tags = "") 写在controller上
@ApiOperation("")写在方法上
@Slf4j
@RestController
@Api(tags = "套餐相关接口")
@RequestMapping("/setmeal")
public class SetMealController {
@Autowired
private SetMealService setMealService;
@Autowired
private SetMealDishService setMealDishService;
@Autowired
private CategoryService categoryService;
/**
* 保存新增套餐
*
* @param setmealDto
* @return
*/
@CacheEvict(value = "setMealCache",allEntries = true)
@PostMapping
@ApiOperation("保存新增套餐接口")
public R<String> save(@RequestBody SetmealDto setmealDto) {
log.info("保存新增套餐: {}", setmealDto.toString());
setMealService.saveWithDish(setmealDto);
return R.success("新增套餐成功");
}
/**
* 套餐分页查询
*
* @param page
* @param pageSize
* @param name
* @return
*/
@ApiOperation("套餐分页查询接口")
@GetMapping("/page")
public R<Page> page(Integer page, Integer pageSize, String name) {
Page<Setmeal> pageInfo = new Page<>(page, pageSize);
Page<SetmealDto> dtoPage = new Page<>();
LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(name != null, Setmeal::getName, name);
queryWrapper.orderByDesc(Setmeal::getUpdateTime);
setMealService.page(pageInfo, queryWrapper);
//对象拷贝
BeanUtils.copyProperties(pageInfo, dtoPage, "records");
List<Setmeal> records = pageInfo.getRecords();
List<SetmealDto> list = records.stream().map((item) -> {
SetmealDto setmealDto = new SetmealDto();
//对象拷贝
BeanUtils.copyProperties(item, setmealDto);
//分类id
Long categoryId = item.getCategoryId();
//根据分类id查询分类对象
Category category = categoryService.getById(categoryId);
if (category != null) {
//分类名称
String categoryName = category.getName();
setmealDto.setCategoryName(categoryName);
}
return setmealDto;
}).collect(Collectors.toList());
dtoPage.setRecords(list);
return R.success(dtoPage);
}
/**
* 删除套餐
*
* @param ids
* @return
*/
@ApiOperation("删除套餐接口")
@CacheEvict(value = "setMealCache",allEntries = true)
@DeleteMapping
public R<String> delete(@RequestParam List<Long> ids) {
log.info("ids: {}", ids);
setMealService.removeWithDish(ids);
return R.success("删除套餐成功");
}
/**
* 批量修改状态
*
* @param status
* @param ids
* @return
*/
@ApiOperation("批量修改状态接口")
@PostMapping("/status/{status}")
public R<String> updateStatus(@PathVariable Integer status, @RequestParam List<Long> ids) {
log.info("修改套餐状态为: {} ids: {}", status, ids);
//判断状态是否一致sql: select count(*) from setmeal where in ? and status = ?
LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(Setmeal::getId, ids);
queryWrapper.eq(Setmeal::getStatus, status);
int count = setMealService.count(queryWrapper);
if (count != 0) {
throw new BusinessException("套餐状态不一致~无法批量修改!");
}
//修改状态 sql:update setmeal set status = 0 where id = ?
ArrayList<Setmeal> setMeals = new ArrayList<>();
for (Long id : ids) {
Setmeal s = new Setmeal();
s.setStatus(status);
s.setId(id);
setMeals.add(s);
}
setMealService.updateBatchById(setMeals);
return R.success("修改状态成功");
}
/**
* 根据id回显关系表数据
*
* @param id
* @return
*/
@ApiOperation("根据id回显关系表数据接口")
@GetMapping("/{id}")
public R<SetmealDto> selectById(@PathVariable Long id) {
//select * from setmeal_dish where id = ?
log.info("根据setMealId: {}回显菜品", id);
SetmealDto setmealDto = setMealService.selectWithDish(id);
return R.success(setmealDto);
}
/**
* 保存套餐的修改
*
* @param setmealDto
* @return
*/
@ApiOperation("保存套餐的修改接口")
@PutMapping
public R<String> update(@RequestBody SetmealDto setmealDto) {
log.info("保存套餐修改: {}", setmealDto.toString());
setMealService.updateWithDish(setmealDto);
return R.success("套餐修改成功");
}
/**
* 根据id查询套餐
*
* @param setmeal
* @return
*/
@ApiOperation("根据id查询套餐接口")
@Cacheable(value = "setMealCache",key = "#setmeal.categoryId + '_' + #setmeal.status")
@GetMapping("/list")
public R<List<Setmeal>> list(Setmeal setmeal) {
LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(setmeal.getCategoryId() != null, Setmeal::getCategoryId, setmeal.getCategoryId());
queryWrapper.eq(setmeal.getStatus() != null, Setmeal::getStatus, setmeal.getStatus());
queryWrapper.orderByDesc(Setmeal::getUpdateTime);
List<Setmeal> list = setMealService.list(queryWrapper);
return R.success(list);
}
}