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

文章目录

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);

    }
相关推荐
顾北川_野14 分钟前
Android CALL关于电话音频和紧急电话设置和获取
android·音视频
&岁月不待人&24 分钟前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin
superman超哥1 小时前
04 深入 Oracle 并发世界:MVCC、锁、闩锁、事务隔离与并发性能优化的探索
数据库·oracle·性能优化·dba
用户8007165452001 小时前
HTAP数据库国产化改造技术可行性方案分析
数据库
engchina2 小时前
Neo4j 和 Python 初学者指南:如何使用可选关系匹配优化 Cypher 查询
数据库·python·neo4j
engchina2 小时前
使用 Cypher 查询语言在 Neo4j 中查找最短路径
数据库·neo4j
尘浮生2 小时前
Java项目实战II基于Spring Boot的光影视频平台(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·maven·intellij-idea
威哥爱编程2 小时前
SQL Server 数据太多如何优化
数据库·sql·sqlserver
小华同学ai2 小时前
AJ-Report:一款开源且非常强大的数据可视化大屏和报表工具
数据库·信息可视化·开源
Winston Wood2 小时前
Android Parcelable和Serializable的区别与联系
android·序列化