本课程开发软件与项目初始代码可以通过云盘下载,答疑服务可以关注视频片头的二维码获取。
https://www.123912.com/s/A75eVv-27mod,提取码:yton
教学视频
上节课我们成功添加了新用户,倘若想要修改用户信息,首先要把用户信息加载到前端页面的弹窗中。我们在VUE页面中修改好用户信息之后,OA系统要把用户信息更新到数据库中。因此这节课我们要写的后端代码分为两部分,其一是查询用户信息,其二是更新用户信息。
视频中有代码讲解,大家认真观看视频,不要快进。有些操作只在视频中演示,只对着手册操作并不能完成案例,切记!
一、编写hxoa-oms
子系统
1. 编写持久层
在UserMapper.xml
文件中,声明SQL语句查询和更改用户信息。
<select id="searchById" parameterType="long" resultType="HashMap">
SELECT username,
name,
gender,
tel,
email,
roles,
dept_id AS deptId,
job_id AS jobId,
status
FROM tb_user
WHERE id = #{id}
</select>
<update id="update" parameterType="Map">
UPDATE tb_user
SET username = #{username},
name = #{name},
gender = #{gender},
tel = #{tel},
email = #{email},
roles = #{roles},
dept_id = #{deptId},
job_id = #{jobId},
status = #{status}
WHERE id = #{id}
</update>
在com.example.hxoa.cloud.oms.db.dao
包UserMapper.java
接口中,创建DAO方法。
public interface UserMapper {
……
public HashMap searchById(long id);
public int update(Map param);
}
2. 编写Dubbo层
在com.example.hxoa.cloud.dubbo
包UserApi.java
接口中,声明抽象方法。
public interface UserApi {
……
public R searchById(long id);
public R update(Map param);
}
在com.example.hxoa.cloud.oms.api
包UserApiHandler.java
类中,实现抽象方法。
@DubboService
@Slf4j
public class UserApiHandler implements UserApi {
……
@Override
@SentinelResource("UserApiHandler.searchById")
public R searchById(long id) {
Map map = userMapper.searchById(id);
JSONArray roles = JSONUtil.parseArray(MapUtil.getStr(map, "roles"));
map.put("roles", roles);
return R.ok().setAttributeAll(new HashMap() {{
put("status", "SUCCESS");
put("user", map);
}});
}
@Override
@Transactional
@SentinelResource("UserApiHandler.update")
public R update(Map param) {
String roles = JSONUtil.toJsonStr(MapUtil.getStr(param, "roles"));
param.replace("roles", roles);
int rows = userMapper.update(param);
if (rows == 1) {
return R.ok().setAttribute("status", "SUCCESS");
}
else {
log.error("更新tb_user表的记录数量不为1");
throw new HxoaException("更新用户失败");
}
}
}
二、编写hxoa-mis
子系统
1. 编写Dubbo层
在com.example.hxoa.cloud.dubbo
包UserApi.java
接口中,声明抽象方法。
public interface UserApi {
……
public R searchById(long id);
public R update(Map param);
}
2. 编写业务层
在com.example.hxoa.cloud.mis.service
包UserService.java
接口中,声明抽象方法。
public interface UserService {
……
public Map searchById(long id);
public Map update(Map param);
}
在com.example.hxoa.cloud.mis.service.impl
包UserServiceImpl.java
类中,实现抽象方法。
@Service
public class UserServiceImpl implements UserService {
……
@Override
public Map searchById(long id) {
R r = userApi.searchById(id);
Map result = r.getAttributeAll();
return result;
}
@Override
@GlobalTransactional
public Map update(Map param) {
R r = userApi.update(param);
Map result = r.getAttributeAll();
return result;
}
}
3. 编写Web层
在com.example.hxoa.cloud.mis.controller.form
包中,创建SearchUserByIdForm.java
类。
@Data
public class SearchUserByIdForm {
@NotNull(message = "id不能为空")
@Min(value = 1, message = "id必须大于0")
private Long id;
}
在com.example.hxoa.cloud.mis.controller.form
包中,创建UpdateUserForm.java
类。
@Data
public class UpdateUserForm {
@NotNull(message = "用户ID不能为空")
@Min(value = 1, message = "用户ID必须大于0")
private Long id;
@NotBlank(message = "用户名不能为空")
@Pattern(regexp = "^[a-zA-Z0-9]{5,50}$", message = "用户名格式不正确")
private String username;
@NotBlank(message = "姓名不能为空")
@Pattern(regexp = "^[\\u4e00-\\u9fa5]{2,20}$", message = "姓名格式不正确")
private String name;
@NotBlank(message = "性别不能为空")
@Pattern(regexp = "^男$|^女$", message = "性别不正确")
private String gender;
@NotBlank(message = "手机号码不能为空")
@Pattern(regexp = "^1[34578]\\d{9}$", message = "手机号码格式不正确")
private String tel;
@NotBlank(message = "邮箱不能为空")
@Email(message = "邮箱格式不正确")
private String email;
@NotEmpty(message = "角色不能为空")
@ArrayElementsGreaterThanZero(message = "roles数组中元素必须大于0")
private Long[] roles;
@NotNull(message = "部门ID不能为空")
@Min(value = 1, message = "部门ID必须大于0")
private Long deptId;
@NotNull(message = "职务ID不能为空")
@Min(value = 1, message = "职务ID必须大于0")
private Long jobId;
@NotNull(message = "状态不能为空")
@Range(min = 1, max = 3, message = "状态必须为1~3之间的整数")
private Byte status;
}
在com.example.hxoa.cloud.mis.controller
包UserController.java
类中,声明Web方法。
@RestController
@RequestMapping("/user")
public class UserController {
……
@PostMapping("/search-by-id")
@SaCheckPermission(value = {"ROOT", "USER:SELECT"}, mode = SaMode.OR)
@SentinelResource("UserController.searchById")
public R searchById(@RequestBody @Valid SearchUserByIdForm form) {
Map result = userService.searchById(form.getId());
return R.ok().setAttributeAll(result);
}
@PostMapping("/update")
@SaCheckPermission(value = {"ROOT", "USER:UPDATE"}, mode = SaMode.OR)
@SentinelResource("UserController.update")
public R update(@RequestBody @Valid UpdateUserForm form) {
Map param = BeanUtil.beanToMap(form);
Map result = userService.update(param);
if ("SUCCESS".equals(MapUtil.getStr(result, "status"))) {
//该账户所有设备的token失效
StpUtil.logout(form.getId());
}
return R.ok().setAttributeAll(result);
}
}