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<String> 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<String> searchUserPermissions(int userId) {
        Set<String> 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<String> 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 实现用户登陆功能(持久层&业务层)

  <select id="searchIdByOpenId" resultType="Integer" parameterType="String">
    select id from tb_user where open_id = #{openId} and status=1;
  </select>
  <select id="searchUserPermissions" resultType="String" parameterType="int">
    SELECT DISTINCT p.permission_name
    FROM tb_user u
           JOIN tb_role r ON JSON_CONTAINS(u.role, CAST(r.id AS CHAR))
           JOIN tb_permission p ON JSON_CONTAINS(r.permissions, CAST(p.id AS CHAR))
    WHERE u.id=#{userId} AND u.status=1;
  </select>

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<String> 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: "执行异常"
						})
					}
				})
			}
		

11 观察Emos后端项目运行细节

12 章节总结

posted @ 2021-11-05 11:07  小沈曰  阅读(243)  评论(0编辑  收藏  举报