EMOS个人教程-第5章 实现注册与登陆
1 章节介绍
2 实现注册超级管理员功能(持久层)
mybatis-generator生成的文件中pojo的字段不全面的情况下,重现单独文件生成
@Mapper
public interface TbUserDao {
public boolean haveRootUser();
public int insert(HashMap param);
public Integer searchIdByOpenId(String openId);
public Set searchUserPermissions(int userId);
}
3 实现注册超级管理员功能(业务层)
package com.example.emos.wx.service.impl;
import cn.hutool.core.util.IdUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.example.emos.wx.db.dao.TbDeptDao;
import com.example.emos.wx.db.dao.TbUserDao;
import com.example.emos.wx.exception.EmosException;
import com.example.emos.wx.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import java.util.*;
@Service
@Slf4j
@Scope("prototype")
public class UserServiceImpl implements UserService {
@Value("${wx.app-id}")
private String appId;
@Value("${wx.app-secret}")
private String appSecret;
@Autowired
private TbUserDao userDao;
@Autowired
private TbDeptDao deptDao;
private String getOpenId(String code){
String url="https://api.weixin.qq.com/sns/jscode2session";
HashMap map=new HashMap();
map.put("appid", appId);
map.put("secret", appSecret);
map.put("js_code", code);
map.put("grant_type", "authorization_code");
String response=HttpUtil.post(url,map);
JSONObject json=JSONUtil.parseObj(response);
String openId=json.getStr("openid");
if(openId==null||openId.length()==0){
throw new RuntimeException("临时登陆凭证错误");
}
return openId;
}
@Override
public int registerUser(String registerCode, String code, String nickname, String photo) {
if(registerCode.equals("000000")){
boolean bool=userDao.haveRootUser();
if(!bool){
String openId=getOpenId(code);
HashMap param=new HashMap();
param.put("openId", openId);
param.put("nickname", nickname);
param.put("photo", photo);
param.put("role", "[0]");
param.put("status", 1);
param.put("createTime", new Date());
param.put("root", true);
userDao.insert(param);
int id=userDao.searchIdByOpenId(openId);
return id;
}
else{
throw new EmosException("无法绑定超级管理员账号");
}
}
else{
}
return 0;
}
@Override
public Set searchUserPermissions(int userId) {
Set permissions=userDao.searchUserPermissions(userId);
return permissions;
}
}
4 掌握RABC权限模型
5 实现注册超级管理员功能(Web层)
package com.example.emos.wx.controller.form;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
@Data
@ApiModel
public class RegisterForm {
@NotBlank(message = "注册码不能为空")
@Pattern(regexp = "^[0-9]{6}$",message = "注册码必须是6位数字")
private String registerCode;
@NotBlank(message = "微信临时授权不能为空")
private String code;
@NotBlank(message = "昵称不能为空")
private String nickname;
@NotBlank(message = "头像不能为空")
private String photo;
}
@PostMapping("/register")
@ApiOperation("注册用户")
public R register(@Valid @RequestBody RegisterForm form){
int id=userService.registerUser(form.getRegisterCode(),form.getCode(),form.getNickname(),form.getPhoto());
String token=jwtUtil.createToken(id);
Set permsSet=userService.searchUserPermissions(id);
saveCacheToken(token,id);
return R.ok("用户注册成功").put("token",token).put("permission",permsSet);
}
6 定义全局路径和封装Ajax(移动端)
let baseUrl = "http://192.168.121.177:8080/emos-wx-api"
Vue.prototype.url={
register: baseUrl + "/user/register",
login: baseUrl + "/user/login"
}
Vue.prototype.ajax = function(url, method, data, fun) {
uni.request({
"url": url,
"method": method,
"header": {
token: uni.getStorageSync("token")
},
"data": data,
success: function(resp) {
if (resp.statusCode == 401) {
uni.redirectTo({
url: "/pages/login/login.vue"
})
} else if (resp.statusCode == 200 && resp.data.code == 200) {
let data = resp.data
if (data.hasOwnProperty("token")) {
let token = data.token
// console.log(token)
uni.setStorageSync("token", token)
}
fun(resp)
} else {
uni.showToast({
icon: "none",
title: resp.data
})
}
},
})
}
7 完成注册超级管理员功能(移动端)
register: function() {
let that = this
if (that.registerCode == null || that.registerCode.length == 0) {
uni.showToast({
icon: "none",
title: "邀请码不能为空"
})
return
} else if (/^[0-9]{6}$/.test(that.registerCode) == false) {
uni.showToast({
icon: "none",
title: "邀请码必须是6位数字"
})
return
}
uni.login({
provider: "weixin",
success: function(resp) {
console.log(resp)
let code = resp.code;
uni.getUserInfo({
provider: "weixin",
success: function(resp) {
let nickName = resp.userInfo.nickName;
let avatarUrl = resp.userInfo.avatarUrl;
// console.log(nickName);
// console.log(avatarUrl);
let data = {
code: code,
nickname: nickName,
photo: avatarUrl,
registerCode: that.registerCode
}
that.ajax(that.url.register, "POST", data, function(resp) {
let permission = resp.data.permission
uni.setStorageSync("permission", permission)
console.log(permission)
//跳转到index页面
uni.switchTab({
url: "../index/index"
})
})
}
})
},
fail: function(e) {
uni.showToast({
title: '执行异常'
});
}
})
}
8 实现用户登陆功能(持久层&业务层)
9 实现用户登陆功能(Web层)
@PostMapping("/login")
@ApiOperation("登陆系统")
public R login(@Valid @RequestBody LoginForm form){
int id=userService.login(form.getCode());
String token=jwtUtil.createToken(id);
saveCacheToken(token,id);
Set permsSet = userService.searchUserPermissions(id);
return R.ok("登陆成功").put("token",token).put("permission",permsSet);
}
10 实现用户登陆功能(移动端)
login: function() {
let that = this
uni.login({
provider: "weixin",
success: function(resp) {
let code = resp.code
console.log(code)
that.ajax(that.url.login, "POST", {
"code": code
}, function(resp) {
let permission = resp.data.permission
console.log(permission)
uni.setStorageSync("permission", permission)
//跳转到登陆页面
uni.switchTab({
url: "/pages/index/index"
})
})
},
fail: function(e) {
uni.showToast({
icon: "none",
title: "执行异常"
})
}
})
}