我的第一个项目(三):注册登陆功能(后端)
  6dLT7EsVU3rP 2023年11月01日 52 0

好家伙,前端出了点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

 

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  2Vtxr3XfwhHq   2024年05月17日   54   0   0 Java
  Tnh5bgG19sRf   2024年05月20日   109   0   0 Java
  8s1LUHPryisj   2024年05月17日   46   0   0 Java
  aRSRdgycpgWt   2024年05月17日   47   0   0 Java
6dLT7EsVU3rP