0
点赞
收藏
分享

微信扫一扫

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

代码敲到深夜 03-22 13:00 阅读 2

文章目录

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

    }
举报

相关推荐

0 条评论