微服务框架搭建(三)用户管理(核心)模块

介绍

搭建好了注册中心、配置中心、网关服务,我们现在终于可以开始进行具体的微服务的开发了!
希望有一个核心模块,它是我们整个框架最核心的内容,在启动服务的时候,它会作为第一个启动的服务,提供一些平台级的基础服务(例如获取当前请求用户的相关信息、给网管提供用户权限判断、告知其他服务我的某些平台配置属性)供其他服务使用。

目标

微服务框架搭建(三)用户管理(核心)模块_第1张图片
希望同架构java服务间的调用通过dubbo,前后端或者其他异构系统的调用通过http接口的方式

项目结构

微服务框架搭建(三)用户管理(核心)模块_第2张图片
整个模块的结构是这样的,核心模块暂时分为3大块内容。

  • auth负责用户、组织、角色、权限的管理
  • config负责系统级配置参数(以键值对的方式存在数据库中)的管理
  • register负责对nacos的服务治理进行封装、提供服务治理相关的服务

实现

这边的用户登录认证相关的功能集成了国内开源框架sa-token
没有选择spring security选择satoken的原因主要两点:
1.satkoen更加轻量级
2.因为是国人开发的,所以使用以及文档查看上更适应

代码实现

这里用用户登录这一个接口作为例子,演示一下整体的代码实现流程

LoginController.java

//@Api(tags = "登录认证 ")
@RestController
public class LoginController {
    @Resource
    private UserService userService;
    @PostMapping("/login")
  //  @ApiOperation(value = "登录")
  //  @ApiImplicitParams({@ApiImplicitParam(name = "msg", value = "登陆信息", required = true, dataType = "LoginDTO")})
    public SaResult doLogin(@RequestBody LoginDTO msg) throws LoginException {
        String id = userService.getId(msg.getName(), msg.getPwd());
        if (id == null) {
            throw new LoginException("登陆失败!");
        }
        StpUtil.login(id);
        UserDTO user = new UserDTO();
        user.setId(id);
        user.setToken(StpUtil.getTokenValue());
        return SaResult.ok("登录成功!").setData(user);
    }   
}

UserService.java

public interface UserService {
    /**
     * 用户登录
     *
     * @param loginName 登录名
     * @param password  密码
     * @return 用户对象
     * @author wangchb
     * @date 2022/5/24 2:02 PM
     **/
    String getId(String loginName, String password);
}

UserServiceImpl.java

@DubboService
@Service
public class UserServiceImpl implements UserService {
    @Resource
    private UserMapper userMapper;
   @Override
    public String getId(String loginName, String password) {
        String id = userMapper.findByIdLoginNameAndPassword(loginName, password);
        if (id == null) {
            return null;
        }
        return id;
    }
}

UserMapper.java

@Mapper
public interface UserMapper{
    /**
     * 根据登录名和密码查询用户主键
     *
     * @param loginName 登录名
     * @param password  密码
     * @return 用户主键
     * @author wangchb
     * @date 2022/5/30 4:31 PM
     **/
    String findByIdLoginNameAndPassword(String loginName, String password);

}

User.java

package cn.wangchb.auth.dao.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;

import java.io.Serializable;

/**
 * 用户DO
 *
 * @author: wangchb
 * @date: 2022/5/30 2:50 PM
 */
@Data
@TableName(value = "user")
public class User implements Serializable {
    /**
     * 主键
     */
    @TableId(value = "id")
    private String id;
    /**
     * 用户编号
     */
    @TableField(value = "user_id")
    private String userId;
    /**
     * 登录名
     */
    @TableField(value = "login_name")
    private String loginName;
    /**
     * 密码
     */
    @TableField(value = "password")
    private String password;
    /**
     * 昵称
     */
    @TableField(value = "nick_name")
    private String nickName;
    /**
     * 邮箱
     */
    @TableField(value = "email")
    private String email;
    /**
     * 电话号码
     */
    @TableField(value = "phone")
    private String phone;
    /**
     * 头像
     */
    @TableField(value = "avatar")
    private String avatar;
    /**
     * 岗位
     */
    @TableField(value = "post")
    private String post;
}

UserMapper.xml


DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.wangchb.auth.dao.mapper.UserMapper">
    <select id="findByIdLoginNameAndPassword" resultType="String">
        select id
        from user
        where login_name = #{loginName}
          and password = #{password};
    select>
mapper>

UserDTO.java

package cn.wangchb.common.entity;

import lombok.*;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * 用户dto
 *
 * @author: wangchb
 * @date: 2022/5/23 2:48 PM
 */
@Data
public class UserDTO implements Serializable {
    /**
     * 主键
     */
    private String id;
    /**
     * 员工编号
     */
    private String userId;
    /**
     * 登录名
     */
    private String loginName;
    /**
     * 电子邮箱
     */
    private String email;
    /**
     * 电话号码
     */
    private String phone;
    /**
     * 用户昵称
     */
    private String nickName;
    /**
     * token
     */
    private String token;
    /**
     * 创建时间
     */
    private String createTime;
    /**
     * 最后修改时间
     */
    private String updateTime;
    /**
     * 角色
     */
    private List<RoleDTO> roles;
    /**
     * 角色id集合
     */
    private List<String> roleList;
    /**
     * 部门
     **/
    private List<OrganizationDTO> organizations;
    /**
     * 部门id集合
     */
    private List<String> organizationList;
    /**
     * 头像
     */
    private String avatar;
    /**
     * 岗位
     */
    private String post;
    /**
     * 关联账号配置信息
     */
    private UserUnion union;

    /**
     * 挂载角色
     *
     * @param roles 角色集合
     * @return 带有角色信息的用户对象
     * @author wangchb
     * @date 2022/8/30 3:01 PM
     **/
    public UserDTO appendRoles(List<RoleDTO> roles) {
        this.roles = roles;
        List<String> roleList = new ArrayList<>();
        roles.forEach(role -> {
            roleList.add(role.getId());
        });
        this.roleList = roleList;
        return this;
    }

    /**
     * 挂载部门
     *
     * @param orgs 部门集合
     * @return 带有部门的用户对象
     * @author wangchb
     * @date 2022/9/19 4:42 PM
     **/
    public UserDTO appendOrgs(List<OrganizationDTO> orgs) {
        this.organizations = orgs;
        List<String> orgList = new ArrayList<>();
        orgs.forEach(org -> {
            orgList.add(org.getId());
        });
        this.organizationList = orgList;
        return this;
    }
}

因为这个项目后面又加了很多其他内容,所以手动删除了一些无关的代码,流转过程就是
微服务框架搭建(三)用户管理(核心)模块_第3张图片

最终效果

启动服务后,访问接口
我本地是18010端口
微服务框架搭建(三)用户管理(核心)模块_第4张图片

本地调试可以跳过网关,直接访问服务地址:
登录失败:
微服务框架搭建(三)用户管理(核心)模块_第5张图片
登录成功:
微服务框架搭建(三)用户管理(核心)模块_第6张图片

你可能感兴趣的:(spring,微服务,java,dubbo)