• 用户中心框架搭建


    1. 用户中心框架搭建
    1. 开发业务子系统前的准备工作

    我们先创建一个通用的工具模块,封装通用的工具在私服上维护。如下图所示:

     

    plugin-common的maven如下:

    com.ys.plugin.common

    <artifactId>plugin-common

    ${common.version}

    pom

    1.0.0

    1.8

                org.projectlombok

                lombok

                1.18.16

    provided

            

    plugin-common-tools

    这里我们定义了统一的版本管理还java的版本

    plugin-common-tools添加统一的返回信息的格式定义。实现如下:

     

    @Data

    public class ReturnResult {

    private int code;

    private String msg;

    private T data;

    public ReturnResult(){

    this.code = 200;

    this.msg = "成功";

    }

    public ReturnResult(int code,String msg){

    this.code = code;

    this.msg = msg;

    }

    public ReturnResult(Enum e){

    try {

    this.code = (Integer) e.getClass().getMethod("getCode").invoke(e);

    this.msg = (String) e.getClass().getMethod("getMsg").invoke(e);

    } catch (Exception e1) {

    throw new RuntimeException("枚举类定义错误");

    }

    }

    public ReturnResult(Enum e,T data){

    try {

    this.code = (Integer) e.getClass().getMethod("getCode").invoke(e);

    this.msg = (String) e.getClass().getMethod("getMsg").invoke(e);

    this.data = data;

    } catch (Exception e1) {

    throw new RuntimeException("枚举类定义错误");

    }

    }

    }

    1. 新建业务子系统-用户中心

    项目的目录结构如下:

     

    我们在open模块中定义对外提供的接口。如下:

    @Api(value = "用户中心 用户操作",tags = {"用户中心 用户操作"})

    @FeignClient(value = "user", contextId = "cn.com.leimon.user.open.api.user.UserCenterFeign")

    @RequestMapping(value = "/user")

    public interface UserCenterFeign {

    @ApiOperation(value="用户注册(使用用户名密码的方式)")

    @PostMapping(value = "/register")

    public ReturnResult register();

    @ApiOperation(value="用户登录")

    @GetMapping(value = "/login")

    public ReturnResult login(

    @ApiParam(value = "用户名",required = true)

    @RequestParam(required = true)String userName,

    @ApiParam(value = "密码",required = true)

    @RequestParam(required = true)String password

    );

    @ApiOperation(value="根据用户id获取用户详情")

    @GetMapping(value = "/getUserInfo")

    public ReturnResult getUserInfo(

    @ApiParam(value = "用户id",required = true,example = "-1")

    @RequestParam(required = true)Long id

    );

    @ApiOperation(value="删除用户")

    public ReturnResult removeUserInfo();

    @ApiOperation(value="修改密码")

    public ReturnResult changePassword();

    @ApiOperation(value="获取用户列表")

    public ReturnResult getUserList();

    @ApiOperation(value="退出登录")

    public ReturnResult unLogin();

    @ApiOperation(value="封号")

    public ReturnResult suspendAccount();

    @ApiOperation(value="解封帐号")

    public ReturnResult unSuspendAccount();

    }

    我们暂时提供以上的接口。

    1. 用户注册功能的实现

    我们先在provider模块中添加对接口的实现如下图所示:

     

    @RestController

    public class UserCenterController implements UserCenterFeign{

    @Override

    public ReturnResult register() {

    return null;

    }

    }

    我们先分析我们注册需要哪些逻辑然后再去做代码实现

    1. 注册功能需求分析

    用户在没有系统帐号的时候可以通过注册帐号/手机号/邮箱/直接登录的方式进入系统

    在用户登录系统之后给一个默认的权限。该权限是该系统的管理人员设定的权限

    由于用这个系统做测试,管理后台并未开发我们在无法完成的模块中使用TODO作为预留的功能

    这里我们暂时实现一个用户名密码注册的功能

    1. 用户名密码注册的流程

    根据上面的结构新建用户中心的表

    判断用户名是否在系统中已经存在

    判断密码是否符合既定的规则

    入库

    返回注册状态

    1. 用户表

    我们暂时新建一个最简单的用户表,在后面的业务中会添加相关的业务字段。表如下:

    CREATE TABLE `user` (

      `id` bigint(20) NOT NULL COMMENT '主键id',

      `parents_id` bigint(20) DEFAULT NULL COMMENT '父id',

      `org_id` bigint(20) DEFAULT NULL COMMENT '所属组织',

      `username` varchar(100) DEFAULT NULL COMMENT '用户名',

      `password` varchar(100) DEFAULT NULL COMMENT '密码',

      PRIMARY KEY (`id`)

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

    我们在infrastructure模块中新建实体类User.infrastructure模块是和数据库打交道的模块。属于一个基础设施模块。实体类如下:

    @Data

    public class User {

    private Long id;//主键id

    private Long parentsId;//父id

    private Long orgId;//所属组织id

    private String username;//用户名

    private String password;//密码

    }

    查询用户名是否存在

    新建一个UserMapper.目录结构如下:

    查询用户名是否存在的代码如下:

    @Mapper

    public interface UserMapper {

    /**

     * 检查用户名是否存在

     * @param userName 用户名

     * @return

     */

    @Select("select id from user where username=#{userName}")

    public User checkUser(@Param("userName")String userName);

    }

    我们在provider层新增service的代码如下:

    @Service

    public class UserInfoService {

    @Autowired

    private UserMapper userMapper;

    /**

     * 坚持指定的用户名是否在系统中注册过

     * @param userName 用户名

     * @return 0 未注册 1已注册

     */

    public int checkRegisterUser(String userName) throws RuntimeException{

    User u = userMapper.checkUser(userName);

    if(u==null) {

    return 0;

    }else {

    return 1;

    }

    }

    }

    在service代码中抛出RuntimeException

    1. 统一的返回信息格式

    我们在provider中定义统一的返回信息格式

    定义一个枚举类如下:

    public enum ResultMessage {

    LOGIN_SUCCESS(2000,"登录成功"),

    LOGIN_ERROR(2001,"用户名密码错误"),

    UNDEFINE(500, "未定义异常信息");

    private int code;

    private String msg;

    ResultMessage(int code,String msg){

    this.code = code;

            this.msg = msg;

    }

    public static String msg(int code) {

            for (ResultMessage m : ResultMessage.values()) {

                if (m.getCode() == code) {

                    return m.getMsg();

                }

            }

            return UNDEFINE.getMsg();

        }

    public int getCode() {

    return code;

    }

    public void setCode(int code) {

    this.code = code;

    }

    public String getMsg() {

    return msg;

    }

    public void setMsg(String msg) {

    this.msg = msg;

    }

    }

    我们新建一个工具类的模块提供给其他模块调用,封装通用的工具类。结构如下:

    在这里定义统一的返回数据的格式。实现如下:

    @Data

    public class ReturnResult {

    private int code;

    private String msg;

    private T data;

    public ReturnResult(){

    this.code = 2000;

    this.msg = "成功";

    }

    public ReturnResult(int code,String msg){

    this.code = code;

    this.msg = msg;

    }

    public ReturnResult(Enum e){

    try {

    this.code = (Integer) e.getClass().getMethod("getCode").invoke(e);

    this.msg = (String) e.getClass().getMethod("getMsg").invoke(e);

    } catch (Exception e1) {

    e1.printStackTrace();

    }

    }

    public ReturnResult(Enum e,T data){

    try {

    this.code = (Integer) e.getClass().getMethod("getCode").invoke(e);

    this.msg = (String) e.getClass().getMethod("getMsg").invoke(e);

    this.data = data;

    } catch (Exception e1) {

    e1.printStackTrace();

    }

    }

    }

    1. Controller返回注册状态

    我们在common模块中添加一个字符校验的工具类并实现一个密码校验的实现方法。我们后面字符校验相关的工具类都可以封装在这里。具体实现如下:

    public class StringCheckUtil {

    private static final String CHECK_PASSWORD = "^[a-zA-Z0-9]{6,12}$";

    public static boolean isLetterDigit(String str) {

    boolean isDigit= false;//定义一个boolean值,用来表示是否包含数字

            boolean isUpperCase = false;//定义一个boolean值,用来表示是否包含大写字母

            boolean isLowerCase = false;//定义一个boolean值,用来表示是否包含小写字母

            for (int i = 0; i < str.length(); i++) {

                if (Character.isDigit(str.charAt(i))) {   //用char包装类中的判断数字的方法判断每一个字符

                    isDigit = true;

                } else if (Character.isUpperCase(str.charAt(i))) {  //用char包装类中的判断字母的方法判断每一个字符

                    isUpperCase = true;

                }

                else if (Character.isLowerCase(str.charAt(i))) {  //用char包装类中的判断字母的方法判断每一个字符

                    isLowerCase = true;

                }

            }

            boolean isRight = isDigit&& isLowerCase&&isUpperCase && str.matches(CHECK_PASSWORD);

            return isRight;

    }

    }

    我们在open模块中添加对外提供的接口

    @ApiOperation(value="用户注册(使用用户名密码的方式)")

    @PostMapping(value = "/register")

    public ReturnResult register(

    @ApiParam(value = "用户名",required = true)

    @RequestParam(required = true)String userName,

    @ApiParam(value = "密码",required = true)

    @RequestParam(required = true)String password

    );

    control的具体实现如下:

    @Override

    public ReturnResult register(String userName,String password) {

    //判断用户是否存在

    int num = userInfoService.checkRegisterUser(userName);

    if(num==1) {//用户已经注册

    return new ReturnResult(ResultMessage.USER_IS_REGISTER);

    }

    if(!StringCheckUtil.isLetterDigit(password)) {

    return new ReturnResult(ResultMessage.PASSWORD_ISNOT_RULE);

    }

    //TODO 入库操作 并返回操作状态

    return null;

    }

    我们在控制层主要对参数校验的工具。具体的业务逻辑放在service层处理

    入库和返回入库状态这些请自行实现。

    后面我们每个人分到子服务模块的时候。按照上面的方式新建一个模块即可。

  • 相关阅读:
    jdk17运行程序报错module java.base does not open java.lang.reflect to unnamed module @
    国海证券:36氪(KRKR):新经济内容平台龙头,多元变现可期
    Hbase命令行语句
    3.1-OR59 字符串中找出连续最长的数字串
    网络安全攻防:软件逆向之反汇编
    UNIAPP----修改原生导航栏样式,加图标,加文字,加点击事件。
    RPC 接口测试技术 —— websocket 自动化测试实践!
    更新win11会格式化吗?win11更新后软件还在吗
    面向不平衡数据的电子病历自动分类研究
    数学建模:运筹学中的主要问题(技术)
  • 原文地址:https://blog.csdn.net/yusongcao7/article/details/126577674