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

好家伙,前端出了点bug

 

我们来搞定后端先: 

后端我们用的框架是Spring boot 

数据库:MySQl

代码已开源,连接在最后

 

新建项目:

 

 

只点Java Web

 

项目目录如下:

 

 

 

 

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

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

 

pom.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="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">
 <modelVersion>4.0.0</modelVersion>
 <parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>2.7.1</version>
 <relativePath/> <!-- lookup parent from repository -->
 </parent>
 <groupId>com.wulaoda</groupId>
 <artifactId>loginhouduan</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <name>loginhouduan</name>
 <description>loginhouduan</description>
 <properties>
 <java.version>1.8</java.version>
 </properties>
 <dependencies>
 <!-- web-->
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <!--测试-->
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-test</artifactId>
 <scope>test</scope>
 </dependency>
 <!-- 链接池-->
 <dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>druid</artifactId>
 <version>1.1.0</version>
 </dependency>
 <!-- mysql-->
 <dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <version>8.0.11</version>
 </dependency>
 <!-- mybatis-plus-->
 <dependency>
 <groupId>com.baomidou</groupId>
 <artifactId>mybatis-plus-boot-starter</artifactId>
 <version>3.1.0</version>
 </dependency>
 <!-- 实体字段校验-->
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-validation</artifactId>
 </dependency>
 </dependencies>
 <build>
 <plugins>
 <plugin>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-maven-plugin</artifactId>
 </plugin>
 </plugins>
 </build>
</project>

 

 

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<SysUserEntity> {
}

 

 

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<T> {
 // 业务上的成功与失败
 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<T> {
 // 业务上的成功与失败
 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<SysUserMapper, SysUserEntity> 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<SysUserEntity> wrapper = new QueryWrapper<>();
 wrapper.lambda().eq(SysUserEntity::getLoginName,loginName);
 List<SysUserEntity> 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> T copy(Object source, Class<T> 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 <T> List<T> copyList(List source, Class<T> clazz) {
 List<T> 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

 

作者:养肥胖虎原文地址:https://www.cnblogs.com/FatTiger4399/p/16919552.html

%s 个评论

要回复文章请先登录注册