1.实现逻辑分页
Controller层
@GetMapping("/query")
public IPage<MonitorRo> queryList(
@Min(1) @RequestParam (required = false, defaultValue = "10") Integer size,
@Min(1) @RequestParam (required = false, defaultValue = "1") Integer current,
@RequestParam (required = false) String name,
@RequestParam (required = false) String uid,
@RequestParam (required = false) String status)
{
MonitorVo monitorVo = new MonitorVo();
monitorVo.setName(name);
monitorVo.setUid(uid);
monitorVo.setStatus(status);
封装入参为对象
IPage<MonitorRo> result = monitorService.listDTO(size, current, monitorVo);
return result;
}
采用 ?关键字=传入数值&&关键字=传入数值方式
抽象接口
IPage<MonitorRo> listDTO(Integer size, Integer current, MonitorVo monitorVo);
业务实现
public IPage<MonitorRo> listDTO(Integer size, Integer current, MonitorVo monitorVo) {
QueryWrapper<Monitor> queryWrapper = new QueryWrapper<>();
if (monitorVo != null) {
queryWrapper.lambda().
eq(monitorVo.getName() != null, Monitor::getName, monitorVo.getName()).
eq(monitorVo.getStatus() != null, Monitor::getStatus, monitorVo.getStatus()).
eq(monitorVo.getUid() != null, Monitor::getUid, monitorVo.getUid());
}
获取合适的过滤对象
若三个入参都不为空,则过滤条件需都满足
若有参数为空,后跟过滤条件作废
Page<Monitor> page = new Page(current, size);
IPage<Monitor> entityPage = iMonitorService.page(page, queryWrapper);
List<Monitor> DTO = entityPage.getRecords(); 获得全部记录
List<MonitorRo> new_list = new ArrayList<>();
for (Monitor monitor : DTO) {
MonitorRo monitorRo = new MonitorRo();
BeanUtils.copyProperties(monitor, monitorRo);
new_list.add(monitorRo);
}
封装内层出参
IPage<MonitorRo> result = new Page();
result.setCurrent(entityPage.getCurrent()); 当前页数
result.setPages(entityPage.getPages()); 总页数
result.setTotal(entityPage.getTotal()); 总对象数
result.setSize(entityPage.getSize()); 一页的数据条数
result.setRecords(new_list); 展示全部记录
封装外层出参
return result;
}
2.项目整体代码实现
Controller层
这里仅展示AlarmController代码
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.fitmgr.ces.api.v1.request.AlarmEo;
import com.fitmgr.ces.api.v1.request.AlarmVo;
import com.fitmgr.ces.api.v1.response.AlarmRo;
import com.fitmgr.ces.db.entity.Alarm;
import com.fitmgr.ces.service.alarm.AlarmManager;
import com.fitmgr.common.core.constant.enums.BusinessEnum;
import com.fitmgr.common.core.exception.BusinessException;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.constraints.Min;
import java.time.LocalDateTime;
import java.util.List;
/**
* <p>
* 前端控制器
* </p>
*
* @author lifc
* @since 2020-10-20
*/
@Data
@RestController
@RequestMapping("/v1/alarm")
public class AlarmController {
@Autowired
private AlarmManager alarmManager;
@GetMapping("/{id}")
public AlarmRo getOneDetail(@PathVariable Integer id) {
return alarmManager.getOneById(id);
}
@GetMapping("/getall")
public List<Alarm> getAll(@RequestParam(required = false) String name,
@RequestParam(required = false) String source,
@RequestParam(required = false) String alarm_level) {
AlarmVo alarmVo = new AlarmVo();
alarmVo.setName(name);
alarmVo.setAlarmLevel(alarm_level);
alarmVo.setSource(source);
List<Alarm> result = alarmManager.getAll(alarmVo);
return result;
}
@GetMapping("")
public IPage<AlarmRo> getList(
@Min(1) @RequestParam(required = false, defaultValue = "10") Integer size,
@Min(1) @RequestParam(required = false, defaultValue = "1") Integer current,
@RequestParam(required = false) String name,
@RequestParam(required = false) String source,
@RequestParam(required = false) String alarm_level
) {
AlarmVo alarmVo = new AlarmVo();
alarmVo.setName(name);
alarmVo.setAlarmLevel(alarm_level);
alarmVo.setSource(source);
IPage<AlarmRo> result = alarmManager.getList(size, current, alarmVo);
return result;
}
@PostMapping("")
public Alarm createOne(@Valid @RequestBody AlarmEo alarmEo) {
return alarmManager.createOne(alarmEo);
}
@PutMapping("")
public Alarm updateOne(@Valid @RequestBody AlarmEo alarmEo) {
return alarmManager.updateOne(alarmEo);
}
@DeleteMapping("/{id}")
public void delete(@PathVariable Integer id) {
alarmManager.deleteOne(id);
}
}
其中 AlarmVo 为查询接口封装入参
AlarmEo 为增加、修改封装入参
AlarmRo 为封装出参
Alarm 为数据库表
这里展示了三种传参方式, params ?xx=xx body体 路径入参
数据库表结构
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
*
* </p>
*
* @author lifc
* @since 2020-10-20
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class Alarm implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
private Integer id;
private String name;
private String source;
private String alarmLevel;
private String uniqueId;
private LocalDateTime timeStamp;
private String project;
private String resource;
private String description;
private String metedata;
private String reason;
private String alarmType;
}
封装入参体参数校验及属性名同步
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonProperty;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
public class AlarmEo implements Serializable {
@NotNull
@Max(255)
private Integer id;
// 唯一标识
@NotBlank
@Size(max = 255)
private String name;
@NotBlank
@Size(max = 255)
private String source;
@NotBlank
@Size(max = 255)
@JsonProperty("alarm_level")
private String alarmLevel;
@JsonProperty("unique_id")
private String uniqueId;
@NotBlank
@JsonProperty("time_stamp")
private String timeStamp;
@Size(max = 255)
private String project;
@Size(max = 255)
private String resource;
private String description;
@Size(max = 255)
private String metedata;
@Size(max = 255)
private String reason;
@Size(max = 255)
@JsonProperty("alarm_type")
private String alarmType;
}
出参体
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
public class AlarmRo implements Serializable {
private Integer id;
private String name;
private String source;
private String alarmLevel;
private String uniqueId;
private LocalDateTime timeStamp;
private String project;
private String resource;
private String description;
private String metedata;
private String reason;
private String alarmType;
}
AlarmManager 业务实现
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fitmgr.ces.api.v1.request.AlarmEo;
import com.fitmgr.ces.api.v1.request.AlarmVo;
import com.fitmgr.ces.api.v1.response.AlarmRo;
import com.fitmgr.ces.common.constant.MessageConstant;
import com.fitmgr.ces.common.enums.ReturnCodes;
import com.fitmgr.ces.db.entity.Alarm;
import com.fitmgr.ces.db.service.IAlarmService;
import com.fitmgr.ces.exceptions.NotFoundException;
import com.fitmgr.common.core.constant.enums.BusinessEnum;
import com.fitmgr.common.core.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.fitmgr.ces.exceptions.*;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Component
public class AlarmManager {
@Autowired
IAlarmService iAlarmService;
/**
* 根据ID查询告警
*
* @param id
* @return alarmRo
* @throw BaseException
*/
public AlarmRo getOneById(Integer id) {
Alarm alarm = iAlarmService.getById(id);
if (alarm == null) {
log.error("告警查找失败,未找到该告警" + "{id=" + id + " }");
throw new NotFoundException(ReturnCodes.ALARM_QUERY);
}
AlarmRo alarmRo = new AlarmRo();
BeanUtils.copyProperties(alarm, alarmRo);
return alarmRo;
}
/**
* 根据unique_id查询告警,内部调用
*
* @param unique_id
* @return alarm
*/
public Alarm getOneByUnique_id(String unique_id) {
QueryWrapper<Alarm> queryWrapper = new QueryWrapper<>();
Alarm alarm = iAlarmService.getOne(queryWrapper.lambda().
eq(Alarm::getUniqueId, unique_id));
if (alarm == null) {
log.error("告警查找失败,未找到该告警" + "{unique_id=" + unique_id + " }");
throw new NotFoundException(ReturnCodes.ALARM_QUERY);
}
return alarm;
}
/**
* 查询所有告警,内部调用
*
* @param alarmVo
* @return List<Alarm>
*/
public List<Alarm> getAll(AlarmVo alarmVo) {
QueryWrapper<Alarm> queryWrapper = new QueryWrapper<>();
List<Alarm> alarms = iAlarmService.list(queryWrapper.lambda().
eq(alarmVo.getAlarmLevel() != null, Alarm::getAlarmLevel, alarmVo.getAlarmLevel()).
eq(alarmVo.getName() != null, Alarm::getName, alarmVo.getName()).
eq(alarmVo.getSource() != null, Alarm::getSource, alarmVo.getSource()));
return alarms;
}
/**
* 根据平台、名称、等级过滤查询告警,分页显示,默认显示第一页十条信息
*
* @param size
* @param current
* @param alarmVo
* @return IPage<AlarmRo>
*/
public IPage<AlarmRo> getList(Integer size, Integer current, AlarmVo alarmVo) {
QueryWrapper<Alarm> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().
eq(alarmVo.getAlarmLevel() != null, Alarm::getAlarmLevel, alarmVo.getAlarmLevel()).
eq(alarmVo.getName() != null, Alarm::getName, alarmVo.getName()).
eq(alarmVo.getSource() != null, Alarm::getSource, alarmVo.getSource());
Page<Alarm> page = new Page(current, size);
IPage<Alarm> entityPage = iAlarmService.page(page, queryWrapper);
List<Alarm> alarmList = entityPage.getRecords();
List<AlarmRo> alarmRoList = new ArrayList<>();
for (Alarm alarm : alarmList) {
AlarmRo alarmRo = new AlarmRo();
BeanUtils.copyProperties(alarm, alarmRo);
alarmRoList.add(alarmRo);
}
IPage<AlarmRo> result = new Page();
result.setCurrent(entityPage.getCurrent());
result.setPages(entityPage.getPages());
result.setTotal(entityPage.getTotal());
result.setSize(entityPage.getSize());
result.setRecords(alarmRoList);
return result;
}
/**
* 创建告警,内部调用
*
* @param alarmEo
* @return alarmNew
*/
public Alarm createOne(AlarmEo alarmEo) {
Alarm alarmNew = new Alarm();
BeanUtils.copyProperties(alarmEo, alarmNew);
String uniqueId = alarmEo.getSource() + alarmEo.getId().toString();
alarmNew.setUniqueId(uniqueId);
alarmNew.setDescription(alarmEo.getTimeStamp());
LocalDateTime nowTime = LocalDateTime.now();
alarmNew.setTimeStamp(nowTime);
iAlarmService.save(alarmNew);
log.info("创建告警成功");
return alarmNew;
}
/**
* 更新告警,内部调用
*
* @param alarmE0
* @return alarmOri
*/
public Alarm updateOne(AlarmEo alarmE0) {
Integer id = alarmE0.getId();
QueryWrapper<Alarm> queryWrapper = new QueryWrapper<>();
Alarm alarmOri = iAlarmService.getOne(queryWrapper.lambda().
eq(Alarm::getId, id));
if (alarmOri == null) {
log.error("更新告警失败,未找到该告警" + "{id=" + id + " }");
throw new NotFoundException(ReturnCodes.ALARM_UPDATE);
}
BeanUtils.copyProperties(alarmE0, alarmOri);
LocalDateTime nowTime = LocalDateTime.now();
alarmOri.setTimeStamp(nowTime);
iAlarmService.saveOrUpdate(alarmOri);
log.info("更新告警成功");
return alarmOri;
}
/**
* 删除告警,内部调用
*
* @param id
* @return
*/
public void deleteOne(Integer id) {
Alarm alarm = iAlarmService.getById(id);
if (alarm != null) {
iAlarmService.removeById(id);
log.info("删除告警成功");
} else {
log.error("删除告警失败,告警不存在" + "{id=" + id + " }");
throw new NotFoundException(ReturnCodes.ALARM_DELETE);
}
}
}
异常定义在统一文件中,不再展示