• 我的第一个项目(三):注册登陆功能(后端)


    好家伙,前端出了点bug

     

    我们来搞定后端先: 

    后端我们用的框架是Spring boot 

    数据库:MySQl

    代码已开源,连接在最后

     

    新建项目:

     

     

    只点Java Web

     

    项目目录如下:

     

     

     

     

    1.首先,我们在pom.xml文件中导入第三方包:

    web服务,mysql连接驱动等一系列包

     

    pom.xml文件:

    复制代码
    "1.0" encoding="UTF-8"?>
    "http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        4.0.0
        
            org.springframework.boot
            spring-boot-starter-parent
            2.7.1
             
        
        com.wulaoda
        loginhouduan
        0.0.1-SNAPSHOT
        loginhouduan
        loginhouduan
        
            1.8
        
        
            
            
                org.springframework.boot
                spring-boot-starter-web
            
            
            
                org.springframework.boot
                spring-boot-starter-test
                test
            
            
            
                com.alibaba
                druid
                1.1.0
            
            
            
                mysql
                mysql-connector-java
                8.0.11
            
            
            
                com.baomidou
                mybatis-plus-boot-starter
                3.1.0
            
            
            
                org.springframework.boot
                spring-boot-starter-validation
            
        
    
        
            
                
                    org.springframework.boot
                    spring-boot-maven-plugin
                
            
        
    
    
    复制代码

     

     

    2.然后我们配置数据库的连接参数:

    application.yml文件:

    复制代码
    server:
      port: 3312
    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/cruddemo?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=UTC
        username: root
        password: root
        driver-class-name: com.mysql.cj.jdbc.Driver
    复制代码

     

    3.定义实体类entity:

    SysUserController.java

    定义数据类型

    并为其创建相应的getter和setter方法:

     

     

     

     

     

     

     

     

     然后就是这样:

    复制代码
    package com.wulaoda.loginhouduan.entity;
    
    import com.baomidou.mybatisplus.annotation.TableName;
    
    @TableName("sys_user")
    public class SysUserEntity {
        private Long id;
    
        private String LoginName;
    
        private String name;
    
        private String password;
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getLoginName() {
            return LoginName;
        }
    
        public void setLoginName(String loginName) {
            LoginName = loginName;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        @Override
        public String toString() {
            return "SysUserEntity{" +
                    "id=" + id +
                    ", LoginName='" + LoginName + '\'' +
                    ", name='" + name + '\'' +
                    ", password='" + password + '\'' +
                    '}';
        }
    }
    复制代码

     

    4.controller类:

     SysUserController.java文件:

    复制代码
    package com.wulaoda.loginhouduan.controller;
    
    
    import com.wulaoda.loginhouduan.req.SysUserLoginReq;
    import com.wulaoda.loginhouduan.req.SysUserSaveReq;
    import com.wulaoda.loginhouduan.resp.CommonResp;
    import com.wulaoda.loginhouduan.resp.SysUserLoginResp;
    import com.wulaoda.loginhouduan.service.SysUserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.util.DigestUtils;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    //绑定数据库表名
    @RequestMapping("/sys-user")
    public class SysUserController {
    
        @Autowired
        private SysUserService sysUserService;
    
        @PostMapping("register")
    //    zxcv1234
        public CommonResp register(@RequestBody  SysUserSaveReq req){
            req.setPassword(DigestUtils.md5DigestAsHex(req.getPassword().getBytes()));
            CommonResp resp = new CommonResp<>();
            sysUserService.register(req);
            return resp;
        }
    
        @PostMapping("login")
        public CommonResp login(@RequestBody SysUserLoginReq req){
    //        zxcv1234
            req.setPassword(DigestUtils.md5DigestAsHex(req.getPassword().getBytes()));
            CommonResp resp = new CommonResp<>();
            SysUserLoginResp loginResp = sysUserService.login(req);
            resp.setContent(loginResp);
            return resp;
        }
    
    }
    复制代码

     

     

    5.mapper类:

    SysUserMapper.java文件:

    复制代码
    package com.wulaoda.loginhouduan.mapper;
    
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.wulaoda.loginhouduan.entity.SysUserEntity;
    import org.apache.ibatis.annotations.Mapper;
    
    @Mapper
    public interface SysUserMapper extends BaseMapper {
    }
    复制代码

     

     

    6.req请求类:

    SysUserLoginReq.java文件:

    复制代码
    package com.wulaoda.loginhouduan.req;
    
    public class SysUserLoginReq {
    
    
        private String LoginName;
    
    
        private String password;
    
    
    
        public String getLoginName() {
            return LoginName;
        }
    
        public void setLoginName(String loginName) {
            LoginName = loginName;
        }
    
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        @Override
        public String toString() {
            return "SysUserEntity{" +
                    ", LoginName='" + LoginName + '\'' +
                    ", password='" + password + '\'' +
                    '}';
        }
    }
    复制代码

     

    SysUserSaveReq.java文件:

    复制代码
    package com.wulaoda.loginhouduan.req;
    
    import com.baomidou.mybatisplus.annotation.TableName;
    
    public class SysUserSaveReq {
        private Long id;
    
        private String LoginName;
    
        private String name;
    
        private String password;
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getLoginName() {
            return LoginName;
        }
    
        public void setLoginName(String loginName) {
            LoginName = loginName;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        @Override
        public String toString() {
            return "SysUserEntity{" +
                    "id=" + id +
                    ", LoginName='" + LoginName + '\'' +
                    ", name='" + name + '\'' +
                    ", password='" + password + '\'' +
                    '}';
        }
    }
    复制代码

     

    7.resp类:

    CommonResp.java文件:

    复制代码
    package com.wulaoda.loginhouduan.resp;
    
    public class CommonResp {
    
        //    业务上的成功与失败
        private Boolean success = true;
    
        //    返回信息
        private String message;
    
        //返回范型数据 自定义类型
        private T content;
    
        public Boolean getSuccess() {
            return success;
        }
    
        public void setSuccess(Boolean success) {
            this.success = success;
        }
    
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    
        public T getContent() {
            return content;
        }
    
        public void setContent(T content) {
            this.content = content;
        }
    
        @Override
        public String toString() {
            return "CommonResp{" +
                    "success=" + success +
                    ", message='" + message + '\'' +
                    ", content=" + content +
                    '}';
        }
    }
    复制代码

     

    SysUserLoginResp

    复制代码
    package com.wulaoda.loginhouduan.resp;
    
    public class CommonResp {
    
        //    业务上的成功与失败
        private Boolean success = true;
    
        //    返回信息
        private String message;
    
        //返回范型数据 自定义类型
        private T content;
    
        public Boolean getSuccess() {
            return success;
        }
    
        public void setSuccess(Boolean success) {
            this.success = success;
        }
    
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    
        public T getContent() {
            return content;
        }
    
        public void setContent(T content) {
            this.content = content;
        }
    
        @Override
        public String toString() {
            return "CommonResp{" +
                    "success=" + success +
                    ", message='" + message + '\'' +
                    ", content=" + content +
                    '}';
        }
    }
    复制代码

     

     

    8.service类

     

     

     impl/SysUserServicelmpl.java文件:

    复制代码
    package com.wulaoda.loginhouduan.service.impl;
    
    import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
    import com.wulaoda.loginhouduan.entity.SysUserEntity;
    import com.wulaoda.loginhouduan.mapper.SysUserMapper;
    import com.wulaoda.loginhouduan.req.SysUserLoginReq;
    import com.wulaoda.loginhouduan.req.SysUserSaveReq;
    import com.wulaoda.loginhouduan.resp.SysUserLoginResp;
    import com.wulaoda.loginhouduan.service.SysUserService;
    import com.wulaoda.loginhouduan.utils.CopyUtil;
    import com.wulaoda.loginhouduan.utils.SnowFlake;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.util.CollectionUtils;
    import org.springframework.util.ObjectUtils;
    
    import javax.annotation.Resource;
    import java.util.List;
    
    @Service
    public class SysUserServiceImpl extends ServiceImpl implements SysUserService {
    
        @Resource
        private SysUserMapper sysUserMapper;
    
        @Autowired
        private SnowFlake snowFlake;
    
    
        @Override
        public void register(SysUserSaveReq req) {
            SysUserEntity user = CopyUtil.copy(req, SysUserEntity.class);
            if(ObjectUtils.isEmpty(req.getId())){
                SysUserEntity userDb = selectByLoginName(req.getLoginName());
                if(ObjectUtils.isEmpty(userDb)){
                    user.setId(snowFlake.nextId());
                    sysUserMapper.insert(user);
                }
            }
        }
    
        @Override
        public SysUserLoginResp login(SysUserLoginReq req) {
            SysUserEntity userDb = selectByLoginName(req.getLoginName());
            if(ObjectUtils.isEmpty(userDb)){
                //用户不存在
                return null;
            }else {
                //登陆成功
                SysUserLoginResp userLoginResp = CopyUtil.copy(userDb, SysUserLoginResp.class);
                return userLoginResp;
            }
        }
    
        //查询loginName是否被注册
        public SysUserEntity selectByLoginName(String loginName){
            QueryWrapper wrapper = new QueryWrapper<>();
            wrapper.lambda().eq(SysUserEntity::getLoginName,loginName);
            List userEntityList = sysUserMapper.selectList(wrapper);
            if(CollectionUtils.isEmpty(userEntityList)){
                return  null;
            }else {
                return userEntityList.get(0);
            }
        }
    }
    复制代码

     

    SysUserService.java文件:

    复制代码
    package com.wulaoda.loginhouduan.service;
    
    import com.wulaoda.loginhouduan.req.SysUserLoginReq;
    import com.wulaoda.loginhouduan.req.SysUserSaveReq;
    import com.wulaoda.loginhouduan.resp.SysUserLoginResp;
    
    public interface SysUserService {
        void register(SysUserSaveReq req);
    
        SysUserLoginResp login(SysUserLoginReq req);
    }
    复制代码

     

     

    9.utils类

    算法优化部分:

    CopyUtil.java文件:

    复制代码
    package com.wulaoda.loginhouduan.utils;
    
    import org.springframework.beans.BeanUtils;
    import org.springframework.util.CollectionUtils;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class CopyUtil {
    
        /**
         * 单体复制
         */
        public static  T copy(Object source, Class clazz) {
            if (source == null) {
                return null;
            }
            T obj = null;
            try {
                obj = clazz.newInstance();
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
            BeanUtils.copyProperties(source, obj);
            return obj;
        }
    
        /**
         * 列表复制
         */
        public static  List copyList(List source, Class clazz) {
            List target = new ArrayList<>();
            if (!CollectionUtils.isEmpty(source)){
                for (Object c: source) {
                    T obj = copy(c, clazz);
                    target.add(obj);
                }
            }
            return target;
        }
    }
    复制代码

     

    SnowFlake.java文件:

    复制代码
    package com.wulaoda.loginhouduan.utils;
    
    import org.springframework.stereotype.Component;
    
    import java.text.ParseException;
    
    /**
     * Twitter的分布式自增ID雪花算法
     **/
    @Component
    public class SnowFlake {
    
        /**
         * 起始的时间戳
         */
        private final static long START_STMP = 1609459200000L; // 2021-01-01 00:00:00
    
        /**
         * 每一部分占用的位数
         */
        private final static long SEQUENCE_BIT = 12; //序列号占用的位数
        private final static long MACHINE_BIT = 5;   //机器标识占用的位数
        private final static long DATACENTER_BIT = 5;//数据中心占用的位数
    
        /**
         * 每一部分的最大值
         */
        private final static long MAX_DATACENTER_NUM = -1L ^ (-1L << DATACENTER_BIT);
        private final static long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT);
        private final static long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT);
    
        /**
         * 每一部分向左的位移
         */
        private final static long MACHINE_LEFT = SEQUENCE_BIT;
        private final static long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;
        private final static long TIMESTMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT;
    
        private long datacenterId = 1;  //数据中心
        private long machineId = 1;     //机器标识
        private long sequence = 0L; //序列号
        private long lastStmp = -1L;//上一次时间戳
    
        public SnowFlake() {
        }
    
        public SnowFlake(long datacenterId, long machineId) {
            if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0) {
                throw new IllegalArgumentException("datacenterId can't be greater than MAX_DATACENTER_NUM or less than 0");
            }
            if (machineId > MAX_MACHINE_NUM || machineId < 0) {
                throw new IllegalArgumentException("machineId can't be greater than MAX_MACHINE_NUM or less than 0");
            }
            this.datacenterId = datacenterId;
            this.machineId = machineId;
        }
    
        /**
         * 产生下一个ID
         *
         * @return
         */
        public synchronized long nextId() {
            long currStmp = getNewstmp();
            if (currStmp < lastStmp) {
                throw new RuntimeException("Clock moved backwards.  Refusing to generate id");
            }
    
            if (currStmp == lastStmp) {
                //相同毫秒内,序列号自增
                sequence = (sequence + 1) & MAX_SEQUENCE;
                //同一毫秒的序列数已经达到最大
                if (sequence == 0L) {
                    currStmp = getNextMill();
                }
            } else {
                //不同毫秒内,序列号置为0
                sequence = 0L;
            }
    
            lastStmp = currStmp;
    
            return (currStmp - START_STMP) << TIMESTMP_LEFT //时间戳部分
                    | datacenterId << DATACENTER_LEFT       //数据中心部分
                    | machineId << MACHINE_LEFT             //机器标识部分
                    | sequence;                             //序列号部分
        }
    
        private long getNextMill() {
            long mill = getNewstmp();
            while (mill <= lastStmp) {
                mill = getNewstmp();
            }
            return mill;
        }
    
        private long getNewstmp() {
            return System.currentTimeMillis();
        }
    
        public static void main(String[] args) throws ParseException {
            // 时间戳
            // System.out.println(System.currentTimeMillis());
            // System.out.println(new Date().getTime());
            //
            // String dateTime = "2021-01-01 08:00:00";
            // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            // System.out.println(sdf.parse(dateTime).getTime());
    
            SnowFlake snowFlake = new SnowFlake(1, 1);
    
            long start = System.currentTimeMillis();
            for (int i = 0; i < 10; i++) {
                System.out.println(snowFlake.nextId());
                System.out.println(System.currentTimeMillis() - start);
            }
        }
    }
    复制代码

     

    10.Git仓库拿代码:

    已开源,前端暂时未写好,后端接口部分后面还要再改

    https://gitee.com/tang-and-han-dynasties/login-entity.git

     

  • 相关阅读:
    嵌套事务与异常处理
    保姆级qt开发环境配置
    Unity-Resources资源同步加载
    【LeetCode】3. 无重复字符的最长子串
    【数据结构与算法】第五篇:B树
    人工智能在汽车业应用的五项挑战
    225. 用队列实现栈、232. 用栈实现队列、622. 设计循环队列
    商品信息&学生信息查询 KQC
    基于nodejs学校宿舍管理系统-计算机毕设 附源码45118
    自动售卖团餐:借助智享直播AI实景无人直播系统,团餐自动售卖,无需人工参与,省时高效。
  • 原文地址:https://www.cnblogs.com/FatTiger4399/p/16919552.html