用户中心项目(数据库表设计 + 用户注册后端)

news2024/11/22 7:07:56

文章目录

    • 1.数据库表设计
        • 1.IDEA连接MySQL
          • 1.选择database,添加数据源
          • 2.填写信息,然后点击测试连接
          • 3.查找指定数据库
          • 4.查看某个表的DDL
          • 5.新建查询
        • 2.删除测试的user表
        • 3.创建一个新的user表
        • 4.创建user表
    • 2.注册功能
        • 1.换了台电脑,重新打开后端项目发现maven插件一直安装不了
        • 2.MyBatisX插件自动生成bean
          • 1.右键表名,选择第一个
          • 2.进行配置
          • 3.查看生成的内容
          • 4.将生成的内容放到指定位置
        • 3.alt + enter 自动生成UserService的测试类
          • 1.使用JUint5
          • 2.注意:要提前创建好跟源文件目录相同的测试目录结构
          • 3.测试这个MyBatisX生成的Service是否可以正常使用
            • 1.使用GenerateaAllSetter插件自动生成实体类的setter方法
            • 2.代码
          • 4.报错,sql语句变成驼峰命名了!
          • 5.解决问题,src/main/resources/application.yml 关闭驼峰命名转下划线
        • 4.注册功能-后端
          • 1.设计
          • 2.com/sun/usercenter/service/UserService.java 编写Service接口
          • 3.com/sun/usercenter/service/impl/UserServiceImpl.java 编写Service实现类
          • 4.单元测试

1.数据库表设计

1.IDEA连接MySQL
1.选择database,添加数据源

image-20240320171203907

2.填写信息,然后点击测试连接

image-20240320171320822

3.查找指定数据库

image-20240320172408285

image-20240320172422615

image-20240320172434197

4.查看某个表的DDL

image-20240320172653339

5.新建查询

image-20240320173037005

2.删除测试的user表
3.创建一个新的user表

image-20240320173417069

4.创建user表
create table user (
#     用户名
    username varchar(256) ,
#     id
    id bigint auto_increment primary key,
#     账号
    userAccount varchar(256),
#     头像图片地址
    avatarUrl varchar(1024),
#     性别
    gender tinyint,
#     密码
    userPassword varchar(512) not null,
#     电话
    phone varchar(128),
#     邮箱
    email varchar(512),
#     用户状态,0表示正常
    userStatus int default 0 not null,
#     创建时间
    createTime datetime  default current_timestamp,
#     更改时间,默认为创建时间,更改时会自动更新时间
    updateTime datetime default current_timestamp on update current_timestamp,
#     是否被删除,企业中往往不会真的删除记录,只是使用这个字段来表示用户被删除
    isDelete tinyint default 0 not null
)

2.注册功能

1.换了台电脑,重新打开后端项目发现maven插件一直安装不了

项目文件夹下输入 mvn clean install -U

image-20240320202457551

2.MyBatisX插件自动生成bean
1.右键表名,选择第一个

image-20240320203353869

2.进行配置

image-20240320203102956

image-20240320203729442

3.查看生成的内容

image-20240320204020383

4.将生成的内容放到指定位置

image-20240320204144188

3.alt + enter 自动生成UserService的测试类
1.使用JUint5

image-20240320204729781

2.注意:要提前创建好跟源文件目录相同的测试目录结构

image-20240320204916121

3.测试这个MyBatisX生成的Service是否可以正常使用
1.使用GenerateaAllSetter插件自动生成实体类的setter方法

image-20240320214341272

2.代码
package com.sun.usercenter.service;

import com.sun.usercenter.model.domain.User;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;


/**
 * Description:
 *
 * @Author sun
 * @Create 2024/3/20 20:45
 * @Version 1.0
 */
@SpringBootTest
class UserServiceTest {
    @Resource
    private UserService userService;

    @Test
    void testAddUser() {
        User user = new User();
        user.setUsername("test");
        user.setUserAccount("122");
        user.setAvatarUrl("34353344334342");
        user.setUserPassword("234234234324");
        user.setPhone("23423432");
        user.setEmail("234rrer334");
        boolean save = userService.save(user);
        if (save == true) {
            System.out.println("添加成功!");
        }
        //添加断言
        Assertions.assertTrue(save);
    }
}
4.报错,sql语句变成驼峰命名了!
  • 原因是MyBatisPlus默认是开启驼峰命名自动转换成下划线,也就是将实体类中的bean中的属性使用resultMap,映射成下划线格式的列
  • 在MyBatis中,我们只有在查询的时候才会需要实体类的字段与表的列能够成功映射,原因是最终封装会调用实体类的setter方法,而增删改我们都是根据表中的列来写的语句,并不需要映射
  • 但是在MyBatisPlus中,它并不知道表的列名,所以只能通过resultMap的方式让他知道表的列名,如果开启了自动驼峰转下划线,他就会将userName 映射成 user_name 就是将大写字母的前面加上_然后大写字母转换成小写,这样MyBatisPlus就会根据属性来得到表中的字段,从而编写sql语句
  • 总结一点:实体类的字段一定要正确映射表的列名,如果开启了驼峰命名自动转下划线,会覆盖resultMap中的映射

image-20240320212547220

5.解决问题,src/main/resources/application.yml 关闭驼峰命名转下划线

image-20240320213911531

4.注册功能-后端
1.设计

2.com/sun/usercenter/service/UserService.java 编写Service接口
package com.sun.usercenter.service;

import com.sun.usercenter.model.domain.User;
import com.baomidou.mybatisplus.extension.service.IService;

/**
* @author 8615941515990
* @description 针对表【user】的数据库操作Service
* @createDate 2024-03-20 20:37:26
*/
public interface UserService extends IService<User> {
    public Long userRegister(String userAccount, String userPassword, String checkPassword);
}

3.com/sun/usercenter/service/impl/UserServiceImpl.java 编写Service实现类
package com.sun.usercenter.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sun.usercenter.model.domain.User;
import com.sun.usercenter.service.UserService;
import com.sun.usercenter.mapper.UserMapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

/**
 * @author 8615941515990
 * @description 针对表【user】的数据库操作Service实现
 * @createDate 2024-03-20 20:37:26
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
        implements UserService {

    @Override
    public Long userRegister(String userAccount, String userPassword, String checkPassword) {
        // 1 校验
        // 验证非空
        if (StringUtils.isAnyBlank(userAccount, userPassword, checkPassword)) {
            return -1L;
        }
        // 密码不小于8位
        if (userPassword.length() < 8 || checkPassword.length() < 8) {
            return -1L;
        }
        // 账户不能重复
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        userQueryWrapper.eq("userAccount", userAccount);
        long count = this.count(userQueryWrapper);
        if (count > 0) {
            return -1L;
        }
        // 账户4到16位,不能包含特殊字符
        if (!userAccount.matches("^[a-zA-Z0-9]{4,16}$")) {
            return -1L;
        }
        // 密码和校验密码相同
        if (!userPassword.equals(checkPassword)) {
            return -1L;
        }
        // 2 密码加密
        final String SALT = "sun";
        String encryptPassword = DigestUtils.md5DigestAsHex((SALT + userPassword).getBytes());

        // 3 数据库插入数据
        User user = new User();
        user.setUserAccount(userAccount);
        user.setUserPassword(encryptPassword);
        boolean save = this.save(user);

        if (!save) {
            return -1L;
        }

        return user.getId();
    }
}

4.单元测试
    @Test
    void userRegister() {

        // 验证账号为空
        String userAccount = "";
        String userPassword = "12345678";
        String checkPassword = "12345678";
        Long res = userService.userRegister(userAccount, userPassword, checkPassword);
        Assertions.assertEquals(-1L, res);

        // 验证密码小于8位
        userAccount = "12345";
        userPassword = "12";
        checkPassword = "12";
        res = userService.userRegister(userAccount, userPassword, checkPassword);
        Assertions.assertEquals(-1L, res);

        // 验证账户不在4到16位
        userAccount = "123";
        userPassword = "123456789";
        checkPassword = "123456789";
        res = userService.userRegister(userAccount, userPassword, checkPassword);
        Assertions.assertEquals(-1L, res);

        // 验证账户有特殊字符
        userAccount = "12345*";
        userPassword = "123456789";
        checkPassword = "123456789";
        res = userService.userRegister(userAccount, userPassword, checkPassword);
        Assertions.assertEquals(-1L, res);

        // 验证密码和校验密码不同
        userAccount = "12345";
        userPassword = "1234567890";
        checkPassword = "123456789";
        res = userService.userRegister(userAccount, userPassword, checkPassword);
        Assertions.assertEquals(-1L, res);

        // 验证账号重复
        userAccount = "1234567";
        userPassword = "123456789";
        checkPassword = "123456789";
        userService.userRegister(userAccount, userPassword, checkPassword);
        userAccount = "1234567";
        userPassword = "123456789";
        checkPassword = "123456789";
        res = userService.userRegister(userAccount, userPassword, checkPassword);
        Assertions.assertEquals(-1L, res);

        // 验证密码加密
        userAccount = "12345678";
        userPassword = "123456789";
        checkPassword = "123456789";
        res = userService.userRegister(userAccount, userPassword, checkPassword);
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        userQueryWrapper.eq("id", res);
        List<User> list = userService.list(userQueryWrapper);
        System.out.println(list);

    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1533191.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习-2.9梯度不稳定和Glorot条件

梯度不稳定和Glorot条件 一、梯度消失和梯度爆炸 对于神经网络这个复杂系统来说&#xff0c;在模型训练过程中&#xff0c;一个最基础、同时也最常见的问题&#xff0c;就是梯度消失和梯度爆炸。 我们知道&#xff0c;神经网络在进行反向传播的过程中&#xff0c;各参数层的梯…

Cesium for Unreal注意事项

一、Cesium for Unreal使用WGS84坐标系统 原因&#xff1a;在百度、高德、谷歌拾取的坐标经纬度设置在Cesium for Unreal项目中时位置不准确是因为这些厂商使用的坐标系不一样。高德是GCJ02&#xff0c;百度是在GCJ02的基础上再加密&#xff0c;谷歌是WGS84就是原始gps坐标&am…

蓝桥杯Python B组练习——完美的代价

一、题目 问题描述   回文串&#xff0c;是一种特殊的字符串&#xff0c;它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串&#xff0c;它不一定是回文的&#xff0c;请你计算最少的交换次数使得该串变成一个完美的回文串。   交换的定义是…

分布式游戏服务器

1、概念介绍 分布式游戏服务器是一种专门为在线游戏设计的大型系统架构。这种架构通过将游戏服务器分散部署到多台计算机&#xff08;节点&#xff09;上&#xff0c;实现了数据的分散存储和计算任务的并行处理。每个节点都负责处理一部分游戏逻辑和玩家请求&#xff0c;通过高…

环境安装篇 之 安装kubevela

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 环境安装 系列文章&#xff0c;介绍 oam规范标准实施项目 kubevela 的安装详细步骤kubevela 官方安装文档&#xff1a;https://kubevela.io/zh/docs/installation/kubernetes/ 1.CentOS 安装kubevela 1.1.前提…

GIS设计与开发的学习笔记

目录 一、简答题 1.GeoDatabase数据模型结构类型与四种关系。 2.组件式GIS的基本思想是什么&#xff1f; 3.请简述创建空间书签的实现逻辑。 4.请问与地理要素编辑相关的类有哪些&#xff1f;&#xff08;列举至少五个类&#xff09; 5.利用ArcGIS Engine提供的栅格运算工…

【LabVIEW FPGA入门】局部变量和全局变量

局部变量 无法访问某前面板对象或需要在程序框图节点之间传递数据时&#xff0c;可创建前面板对象的局部变量。创建局部变量后&#xff0c;局部变量仅仅出现在程序框图上&#xff0c;而不在前面板上。 局部变量可对前面板上的输入控件或显示件进行数据读写。写入局部变量相当于…

借还款管理神器,高效记录借还款信息,让财务明细不再遗漏

在快节奏的现代生活中&#xff0c;借还款管理成为我们日常财务处理的重要一环。无论是个人生活还是企业运营&#xff0c;都需要一个高效、准确、便捷的方式来记录和追踪借还款信息。传统的记账方式往往容易出错、繁琐且耗时&#xff0c;难以满足现代人的需求。现在&#xff0c;…

数据库系统概论(超详解!!!) 第四节 关系数据库标准语言SQL(Ⅰ)

1.SQL概述 SQL&#xff08;Structured Query Language&#xff09;结构化查询语言&#xff0c;是关系数据库的标准语言 SQL是一个通用的、功能极强的关系数据库语言 SQL的动词 基本概念 基本表 &#xff1a;本身独立存在的表&#xff1b; SQL中一个关系就对应一个基本表&am…

一、初识 Web3

瑾以此系列文章&#xff0c;献给那些出于好奇并且想要学习这方面知识的开发者们 在多数时间里&#xff0c;我们对 web3 的理解是非常模糊的 就好比提及什么是 web1 以及 web2&#xff0c;相关概念的解释是&#xff1a; 1. 从 Web3 的开始 Web3&#xff0c;也被称为Web3.0&…

飞腾+FPGA+AI电力行业智能数据采集与分析网闸解决方案

行业痛点: 安全物联网闸在监控平台中的具体作用&#xff1a;35KV变电站是煤矿的动力核心&#xff0c;采矿人员上下井、煤炭提升输送、矿井通风等核心设备均依靠变电站提供电源。监控中心及时掌握变电站的运行状态对煤矿的安全生产非常重要。如若外部通过监控网络来控制变电站会…

ByteMD - 掘金社区 MarkDown 编辑器的免费开源的版本,可以在 Vue / React / Svelte 中使用

各位元宵节快乐&#xff0c;今天推荐一款字节跳动旗下掘金社区官方出品的 Markdown 编辑器 JS 开发库。 ByteMD 是一个用于 web 开发的 Markdown 编辑器 JavaScript 库&#xff0c;是字节跳动&#xff08;也就是掘金社区&#xff09;出品的 Markdown 格式的富文本编辑器&#…

区域规划(Regional Planning)的学习笔记

目录 一、概念题 1.区域的概念、类型、特性 2.区域分析的概念、主要内容 3.自然环境、自然资源的概念 4.区域自然资源评价的内容 5.可持续发展理论定义 6.经济增长、经济结构定义 7.产业结构概念 8.人口增长分析的含义、指标 9.技术进步概念、类型 10.技术进步对区域…

小侃威胁情报

0x01 什么是情报 百度百科释义&#xff1a; 情报“有情有报告的信息”&#xff0c;学者从情报搜集的手段来给其下定义&#xff0c;说情报是通过秘密手段搜集来的、关于敌对方外交军事政治经济科技等信息。还有学者从情报处理的流程来给其下定义&#xff0c;认为情报是被传递、整…

Vue响应式原理全解析

前言 大家好&#xff0c;我是程序员蒿里行。浅浅记录一下面试中的高频问题&#xff0c;请你谈一下Vue响应式原理。 必备前置知识&#xff0c;​​Vue2​​官方文档中​​深入响应式原理​​​及​​Vue3​​官方文档中​​深入响应式系统​​。 什么是响应式 响应式本质是当…

[隐私计算实训营学习笔记] 第1讲 数据要素流通

信任四基石 数据的分级分类 技术信任&#xff1a;全链路审计、闭环完成的数据可信流通体系 技术信任&#xff1a;开启数据密态时代 数据可流通的基础设施&#xff1a;密态天空计算

react ant design radio group, 自定义modal样式,radio样式

需求&#xff1a; modal 里面需要一个list 列表&#xff0c;列表有单选框&#xff0c;并且可以确认。 遇到的问题&#xff1a;自定义modal的样式&#xff0c;修改radio/ radio group 的样式 设计图如下&#xff1a; 代码&#xff1a; return (<Modaltitle"Duplica…

7.PWM开发SG90(手把手教会)

简介 PWM&#xff0c;英文名Pulse Width Modulation&#xff0c;是脉冲宽度调制缩写&#xff0c;它是通过对一系列脉冲的宽度进 行调制&#xff0c;等效出所需要的波形&#xff08;包含形状以及幅值&#xff09;&#xff0c;对模拟信号电平进行数字编码&#xff0c;也就是说通…

Transformer的前世今生 day02(神经网络语言模型、词向量)

神经网络语言模型 使用神经网络的方法&#xff0c;去完成语言模型的两个问题&#xff0c;下图为两层感知机的神经网络语言模型&#xff1a; 假设词典V内有五个词&#xff1a;“判断”、“这个”、“词”、“的”、“词性”&#xff0c;且要输出P(w_next | “判断”、“这个”、…

李国武:如何评估一家精益制造咨询公司的实施能力?

在制造业转型升级的大背景下&#xff0c;精益制造已成为企业提升竞争力、实现可持续发展的关键。然而&#xff0c;面对市场上众多的精益制造咨询公司&#xff0c;如何评估其实施能力成为了众多企业的难题。本文将从多个方面为大家揭示评估精益制造咨询公司实施能力的方法&#…