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

文章目录

1.数据库表设计

1.IDEA连接MySQL
1.选择database,添加数据源
2.填写信息,然后点击测试连接
3.查找指定数据库
4.查看某个表的DDL
5.新建查询
2.删除测试的user表
3.创建一个新的user表
4.创建user表
sql 复制代码
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

2.MyBatisX插件自动生成bean
1.右键表名,选择第一个
2.进行配置
3.查看生成的内容
4.将生成的内容放到指定位置
3.alt + enter 自动生成UserService的测试类
1.使用JUint5
2.注意:要提前创建好跟源文件目录相同的测试目录结构
3.测试这个MyBatisX生成的Service是否可以正常使用
1.使用GenerateaAllSetter插件自动生成实体类的setter方法
2.代码
java 复制代码
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中的映射
5.解决问题,src/main/resources/application.yml 关闭驼峰命名转下划线
4.注册功能-后端
1.设计
2.com/sun/usercenter/service/UserService.java 编写Service接口
java 复制代码
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实现类
java 复制代码
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.单元测试
java 复制代码
    @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);

    }
相关推荐
陈希瑞2 分钟前
【保姆级教程】安卓手机免Root一键部署AutoGLM:支持语音控制与自动化操作
android·智能手机·自动化
TheNextByte15 分钟前
如何将联系人从Android传输到计算机的 6 种方法
android
喂_balabala7 分钟前
excludeFromRecents
android
sc.溯琛14 分钟前
MySQL 入门实验:环境搭建与基础操作全攻略
数据库·mysql
JIngJaneIL19 分钟前
基于java+ vue建筑材料管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
一 乐22 分钟前
办公系统|基于springboot + vueOA办公管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·spring
麦麦鸡腿堡29 分钟前
MySQL表的操作指令与常用数值类型
数据库·mysql
TimeFine31 分钟前
Android AI解放生产力(五)实战:解放写API接口的繁琐工作
android
煎蛋学姐33 分钟前
SSM小学教师教辅管理平台526h9(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库
java1234_小锋1 小时前
说说Redis的内存淘汰策略?
数据库·redis·缓存