上个小节我们实现了用户记录的分页查询,那么这节课咱们来实现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);
}
}