Web项目中关于返回结果类和泛型以及vue中await的问题
今天在学习web项目的时候发现需要自定义一个返回结果类用于处理前后端之间可能发生的各种情况。
public class R<T> {
private Integer code; //编码:1成功,0和其它数字为失败
private String msg; //错误信息
private T data; //数据
private Map map = new HashMap(); //动态数据
public static <T> R<T> success(T object) {
R<T> r = new R<T>();
r.data = object;
r.code = 1;
return r;
}
public static <T> R<T> error(String msg) {
R r = new R();
r.msg = msg;
r.code = 0;
return r;
}
public R<T> add(String key, Object value) {
this.map.put(key, value);
return this;
}
}
<T>代表一个未确定的类,也就是泛型。
R<T>代表R这个对象的类不确定,需要根据实例化时T的值才能确定。
其中,R的data属性由T进行定义。
关于泛型的静态方法需要在普通定义静态方法的语法基础上在前面多写一个泛型。
在研究前端html文件的时候发现下面一段代码
async handleLogin() {
this.$refs.loginForm.validate(async (valid) => {
if (valid) {
this.loading = true
let res = await loginApi(this.loginForm)
if (String(res.code) === '1') {
localStorage.setItem('userInfo',JSON.stringify(res.data))
window.location.href= '/backend/index.html'
} else {
this.$message.error(res.msg)
this.loading = false
}
}
})
}
发现res由loginApi赋值。而loginApi是由await修饰的,await只能在async中使用,可以在异步中实现同步。那么只有当loginApi函数执行完以后才会执行后面的语句。
function loginApi(data) {
return $axios({
'url': '/employee/login',
'method': 'post',
data
})
}
loginApi将this.loginform作为data发送至后端,后端的Controller根据url调用方法
public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee) {
//密码进行加密
String password=employee.getPassword();
password=DigestUtils.md5DigestAsHex(password.getBytes());
//进入数据库按照用户名进行查询
LambdaQueryWrapper<Employee> queryWrapper= new LambdaQueryWrapper<>();
queryWrapper.eq(Employee::getUsername,employee.getUsername());
Employee emp=employeeService.getOne(queryWrapper);
//用户名查询不到
if (emp==null){
return R.error("登录失败");
}
//密码比对
if (!emp.getPassword().equals(password)){
return R.error("登录失败");
}
//查询员工状态
if(emp.getStatus()==0){
return R.error("账号已禁用");
}
request.getSession().setAttribute("employee",emp.getId());
return R.success(emp);
}
调用方法如果成功后返回R<Employee>,其中code赋值为1,所以在html文件中继续执行后面的语句对code进行判定。