全部开发者教程

企业级在线办公系统

上个小节我们实现了用户记录的分页查询,那么这节课咱们来实现CRUD操作中的添加新用户。添加新用户的时候,弹窗页面要求我们录入新用户的基本信息,这些信息都要被写入到用户表中。

图片描述

一、编写持久层代码

持久层的SQL语句写起来要做很多的判断,为什么呢?这要先看一下tb_user数据表的字段。有大量的字段都是允许空值的。

图片描述
就拿注册超级管理员来说吧,我们在小程序上面填写好激活码,就能注册成为超级管理员,用户名是admin,密码是abc123456,昵称、头像也都能获得到。但是电话、email、部门、入职日期这些东西是获取不到的,所以写入到数据表里面的就是空值。换做在OA系统Web页面添加新用户,用户的open_id、昵称、头像等信息是拿不到的,所以写到数据库里面这些字段是空值。综上所述,我们在写INSERT语句的时候,必须要先判断数据是否不为空,然后再能拼接到INSERT语句里面。

另外,我觉得MySQL方言版本的INSERT语法格式更加友好,例如下面的SQL语句,用方言版本的INSERT语句,每个字段插入什么数据非常清晰。如果用传统的INSERT语法,字段太多,我们都搞不清楚VALUES子句中哪个值对应哪个字段。

INSERT INTO emp 
SET id=1, name="李强", sex="男", tel="13312345678";

INSERT INTO emp(id,name,sex,tel)
VALUES(1,"李强","男","13312345678");

TbUserDao.xml文件中声明INSERT语句,用于插入用户记录。

<insert id="insert" parameterType="com.example.emos.api.db.pojo.TbUser">
    INSERT INTO tb_user
    SET
    <if test="username!=null">
        username = #{username},
    </if>
    <if test="password!=null">
        password = HEX(AES_ENCRYPT(#{password},#{username})),
    </if>
    <if test="openId!=null">
        open_id = #{openId},
    </if>
    <if test="nickname!=null">
        nickname = #{nickname},
    </if>
    <if test="photo!=null">
        photo = #{photo},
    </if>
    <if test="name!=null">
        name = #{name},
    </if>
    <if test="sex!=null">
        sex = #{sex},
    </if>
    <if test="tel!=null">
        tel = #{tel},
    </if>
    <if test="email!=null">
        email=#{email},
    </if>
    <if test="hiredate!=null">
        hiredate = #{hiredate},
    </if>
    role = #{role},
    <if test="root!=null">
        root = #{root},
    </if>
    <if test="deptId!=null">
        dept_id = #{deptId},
    </if>
    status = #{status},
    create_time = #{createTime}
</insert>

TbUserDao.java中定义抽象的DAO方法。

public interface TbUserDao {
    ……
    public int insert(TbUser user);
}

二、编写业务层代码

UserService.java接口中,定义抽象的方法。

public interface UserService {
    ……
    public int insert(TbUser user);
}

UserServiceImpl.java类中实现抽象方法。

public class UserServiceImpl implements UserService{
    ……
    
	@Override
    public int insert(TbUser user) {
        int rows = userDao.insert(user);
        return rows;
    }
}

三、编写Web层代码

创建InsertUserForm.java类,用于保存Ajax提交的数据。

@Schema(description = "添加用户表单")
@Data
public class InsertUserForm {
    @NotBlank(message = "username不能为空")
    @Pattern(regexp = "^[a-zA-Z0-9]{5,20}$", message = "username内容不正确")
    @Schema(description = "用户名")
    private String username;

    @NotBlank(message = "password不能为空")
    @Pattern(regexp = "^[a-zA-Z0-9]{6,20}$", message = "password内容不正确")
    @Schema(description = "密码")
    private String password;

    @NotBlank(message = "name不能为空")
    @Pattern(regexp = "^[\\u4e00-\\u9fa5]{2,10}$", message = "name内容不正确")
    @Schema(description = "姓名")
    private String name;

    @NotBlank(message = "sex不能为空")
    @Pattern(regexp = "^男$|^女$", message = "sex内容不正确")
    @Schema(description = "性别")
    private String sex;

    @NotBlank(message = "tel不能为空")
    @Pattern(regexp = "^1\\d{10}$", message = "tel内容不正确")
    @Schema(description = "电话")
    private String tel;

    @NotBlank(message = "email内容不正确")
    @Email(message = "email内容不正确")
    @Schema(description = "邮箱")
    private String email;

    @NotBlank(message = "hiredate不能为空")
    @Pattern(regexp = "^((((1[6-9]|[2-9]\\d)\\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-0?2-(0?[1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$", message = "hiredate内容不正确")
    @Schema(description = "入职日期")
    private String hiredate;

    @NotEmpty(message = "role不能为空")
    @Schema(description = "角色")
    private Integer[] role;

    @NotNull(message = "deptId不能为空")
    @Min(value = 1, message = "deptId不能小于1")
    @Schema(description = "部门")
    private Integer deptId;

}

UserController.java类中,声明Web方法。

public class UserController {
    ……
    @PostMapping("/insert")
    @SaCheckPermission(value = {"ROOT", "USER:INSERT"}, mode = SaMode.OR)
    @Operation(summary = "添加用户")
    public R insert(@Valid @RequestBody InsertUserForm form) {
        TbUser user = JSONUtil.parse(form).toBean(TbUser.class);
        user.setStatus((byte) 1);
        user.setRole(JSONUtil.parseArray(form.getRole()).toString());
        user.setCreateTime(new Date());
        int rows = userService.insert(user);
        return R.ok().put("rows", rows);
    }
}