最近身体不太舒服,休息了一段。今天继续书写笔记。
接上一篇的项目架构,返回的数据类型比较乱,有时候返回boolean类型,有时候又返回List类型。
所以我们今天把所有的返回数据同意封装一下。
数据封装
在common文件下新建一个DataResult类,名字可以自动,代码为
package com.zhuoaninfo.vueDemo.common;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DataResult {
private String code;
private String message;
private Object data;
public static DataResult Success(Object data) {
return new DataResult(Contants.Code_200, "查询成功", data);
}
public static DataResult Success( String message) {
return new DataResult(Contants.Code_200, message,null);
}
public static DataResult error( ) {
return new DataResult(Contants.Code_500, "系统错误,请联系管理员",null);
}
public static DataResult error(String code ,String message ) {
return new DataResult(code, message,null);
}
}
上面的代码使用@data注释,如果不加注释,就需要getter和setter函数,否者前端调用会报错。
为了将错误代码也统一管理,新建一个接口类contans,代码
package com.zhuoaninfo.vueDemo.common;
public interface Contants {
final String Code_200="200";
final String Code_400="400";
final String Code_500="500";
final String Code_401="401";
}
使用封装类
使用封装类改造userController,代码如下:
package com.zhuoaninfo.vueDemo.controller;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
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.zhuoaninfo.vueDemo.common.DataResult;
import com.zhuoaninfo.vueDemo.dto.UserDto;
import com.zhuoaninfo.vueDemo.entity.User;
import com.zhuoaninfo.vueDemo.service.UserService;
import org.apache.poi.util.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;
@RestController
@Controller
@RequestMapping("/vueDemo")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/users")
public DataResult getUsers() {
return DataResult.Success(userService.list());
}
@PostMapping("/user")
public DataResult addUser(@RequestBody User vo) {
return DataResult.Success(userService.saveOrUpdate(vo));
}
@PutMapping("/user")
public DataResult updateUser(@RequestBody User vo) {
return DataResult.Success(userService.updateById(vo));
}
@RequestMapping("/getPages")
public DataResult getPages(@RequestParam Integer pageNum, @RequestParam Integer pageSize, @RequestParam String name, @RequestParam String real_name) {
IPage<User> page = new Page<>(pageNum, pageSize);
QueryWrapper<User> query = new QueryWrapper<>();
if(null !=name){
query.like("name",name);
}
if(null !=real_name){
query.like("real_name",real_name);
}
return DataResult.Success(userService.page(page, query));
}
@PostMapping("/login")
public DataResult Login(@RequestBody UserDto userDto){
if(StringUtils.isEmpty(userDto.getUsername())){
return DataResult.error();
}
if(StringUtils.isEmpty(userDto.getPassword())){
return DataResult.error();
}
UserDto login = userService.login(userDto);
if(null!=login){
return DataResult.Success(login);
}
return DataResult.error();
}
}
因为时间原因,代码改造了一部分,以后新的代码就可以按照封装类书写了,或者使用代码生成器的模版就行优化,详见之前的笔记–代码生成器。
springboot自定义异常
在common文件下新建exception文件夹,新建ServiceException类,代码如下:
package com.zhuoaninfo.vueDemo.common.exception;
import lombok.Getter;
@Getter
public class ServiceException extends RuntimeException {
private String code;
public ServiceException(String code,String msg){
super(msg);
this.code=code;
}
}
然后再新建一个自定义的异常处理类 GloblelExceptionHandler,代码如下:
package com.zhuoaninfo.vueDemo.common.exception;
import com.zhuoaninfo.vueDemo.common.DataResult;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@ControllerAdvice
public class GloblelExceptionHandler {
@ExceptionHandler(ServiceException.class)
@ResponseBody
public DataResult handle(ServiceException se){
return DataResult.error(se.getCode(),se.getMessage());
}
}
使用自定义异常
我们在userServceImpl中的登录功能进行使用,代码如下
package com.zhuoaninfo.vueDemo.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.log.Log;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zhuoaninfo.vueDemo.common.Contants;
import com.zhuoaninfo.vueDemo.common.exception.ServiceException;
import com.zhuoaninfo.vueDemo.dto.UserDto;
import com.zhuoaninfo.vueDemo.entity.User;
import com.zhuoaninfo.vueDemo.mapper.UserMapper;
import com.zhuoaninfo.vueDemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService{
private static final Log LOG = Log.get();
public UserDto login(UserDto userDto){
QueryWrapper<User> query = new QueryWrapper<>();
query.eq("name", userDto.getUsername());
query.eq("password", userDto.getPassword());
User one;
try{
one=getOne(query);
}catch (Exception e){
LOG.error("");
throw new ServiceException(Contants.Code_500,"系统错误");
}
if(one!=null){
BeanUtil.copyProperties(one, userDto,true);
return userDto;
}else{
throw new ServiceException(Contants.Code_400,"程序员定义:用户名或密码错误");
}
}
}
启动后端项目,启动前端项目,输入不存在的用户。
测试成功!