ChangeStaffPwdCmd.java
7.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
/**
* 修改员工密码命令类
*
* 该类负责处理员工密码修改的业务逻辑,包括验证请求参数、校验原始密码、更新新密码等操作
* 通过注解@Java110Cmd(serviceCode = "user.changeStaffPwd")标识为服务命令
*
* @author Java110
* @version 1.0
* @since 2023
*/
package com.java110.user.cmd.user;
import com.alibaba.fastjson.JSONObject;
import com.java110.core.annotation.Java110Cmd;
import com.java110.core.context.Environment;
import com.java110.core.context.ICmdDataFlowContext;
import com.java110.core.event.cmd.Cmd;
import com.java110.core.event.cmd.CmdEvent;
import com.java110.core.factory.AuthenticationFactory;
import com.java110.dto.user.UserDto;
import com.java110.intf.user.IUserInnerServiceSMO;
import com.java110.intf.user.IUserV1InnerServiceSMO;
import com.java110.po.user.UserPo;
import com.java110.utils.exception.CmdException;
import com.java110.utils.util.Assert;
import com.java110.utils.util.BeanConvertUtil;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
/**
* 修改员工密码命令类
*
* 该类继承自Cmd基类,通过Spring注解实现依赖注入,主要功能包括:
* 1. 验证请求参数的完整性
* 2. 对密码进行MD5加密处理
* 3. 校验原始密码的正确性
* 4. 更新用户的新密码
* 5. 处理密码修改过程中的异常情况
*
* @author Java110
* @version 1.0
*/
@Java110Cmd(serviceCode = "user.changeStaffPwd")
public class ChangeStaffPwdCmd extends Cmd {
/**
* 用户内部服务接口,用于查询用户信息
*/
@Autowired
private IUserInnerServiceSMO userInnerServiceSMOImpl;
/**
* 用户V1版本内部服务接口,用于更新用户信息
*/
@Autowired
private IUserV1InnerServiceSMO userV1InnerServiceSMOImpl;
/**
* 参数验证方法
*
* 在开发环境下进行环境检查,确保在正确的环境中运行
* 该方法主要用于开发阶段的调试和验证
*
* @param event 命令事件对象,包含事件相关信息
* @param context 命令数据流上下文,包含请求和响应数据
* @param reqJson 请求参数的JSON对象
* @throws CmdException 当命令执行出现异常时抛出
*/
@Override
public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException {
// 检查当前是否为开发环境,用于开发阶段的调试
Environment.isDevEnv();
}
/**
* 执行修改密码命令的主要业务逻辑
*
* 验证请求参数完整性,对密码进行MD5加密处理,然后调用修改员工密码方法
* 该方法包含密码修改的核心流程控制
*
* @param event 命令事件对象,包含事件触发信息
* @param context 命令数据流上下文,用于获取和设置数据流
* @param reqJson 包含用户ID、旧密码和新密码的请求JSON对象
* @throws CmdException 当命令执行出现异常时抛出,如参数缺失或业务逻辑错误
*/
@Override
public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException {
// 验证请求参数中必须包含userId、oldPwd和newPwd字段
// 如果缺少任一字段,Assert会抛出异常中断执行
Assert.jsonObjectHaveKey(reqJson, "userId", "请求参数中未包含userId 节点,请确认");
Assert.jsonObjectHaveKey(reqJson, "oldPwd", "请求参数中未包含oldPwd 节点,请确认");
Assert.jsonObjectHaveKey(reqJson, "newPwd", "请求参数中未包含newPwd 节点,请确认");
// 对原始密码和新密码进行MD5加密处理,确保密码在传输和存储中的安全性
reqJson.put("oldPwd", AuthenticationFactory.passwdMd5(reqJson.getString("oldPwd")));
reqJson.put("newPwd", AuthenticationFactory.passwdMd5(reqJson.getString("newPwd")));
// 调用修改员工密码方法,执行具体的密码更新逻辑
modifyStaff(reqJson);
}
/**
* 修改员工密码的核心方法
*
* 构建员工信息对象,调用服务层更新用户密码
* 该方法负责将业务逻辑转换为数据层操作
*
* @param paramObj 包含用户ID、加密后的旧密码和新密码的参数对象
* @throws CmdException 当密码修改失败时抛出异常,通常是由于数据库操作失败
*/
public void modifyStaff(JSONObject paramObj) {
// 构建员工信息JSON对象,包含更新密码所需的所有信息
JSONObject staffInfo = builderStaffInfo(paramObj);
// 将JSON对象转换为UserPo对象,便于服务层处理
UserPo userPo = BeanConvertUtil.covertBean(staffInfo, UserPo.class);
// 调用用户服务更新用户信息,返回影响的行数
int flag = userV1InnerServiceSMOImpl.updateUser(userPo);
// 检查更新结果,如果影响行数小于1则抛出异常,表示更新失败
if(flag <1){
throw new CmdException("修改密码失败");
}
}
/**
* 构建员工信息JSON对象
*
* 根据用户ID查询用户信息,验证原始密码是否正确,然后构建包含新密码的用户信息对象
* 该方法包含密码验证和用户信息构建的核心逻辑
*
* @param paramObj 包含用户ID、加密后的旧密码和新密码的参数对象
* @return JSONObject 构建好的包含更新后密码的用户信息对象
* @throws IllegalArgumentException 当原始密码不匹配时抛出异常
* @throws CmdException 当查询到多条用户记录时抛出异常
*/
private JSONObject builderStaffInfo(JSONObject paramObj) {
// 创建用户查询条件对象,设置查询条件
UserDto userDto = new UserDto();
userDto.setStatusCd("0"); // 设置状态为有效状态,只查询有效用户
userDto.setUserId(paramObj.getString("userId")); // 设置要查询的用户ID
// 查询用户信息(包含密码),获取用户的完整信息用于密码验证
List<UserDto> userDtos = userInnerServiceSMOImpl.getUserHasPwd(userDto);
// 验证查询结果,确保只查询到一条用户记录,避免数据不一致
Assert.listOnlyOne(userDtos, "数据错误查询到多条用户信息或单条");
// 将查询到的用户DTO对象转换为JSON对象,便于后续处理
JSONObject userInfo = JSONObject.parseObject(JSONObject.toJSONString(userDtos.get(0)));
// 验证原始密码是否正确,比较加密后的输入密码与数据库中的密码
if (!paramObj.getString("oldPwd").equals(userDtos.get(0).getPassword())) {
throw new IllegalArgumentException("原始密码错误");
}
// 将参数对象中的内容合并到用户信息中,准备更新操作
userInfo.putAll(paramObj);
// 更新密码字段为新密码,完成密码的更新准备
userInfo.put("password", paramObj.getString("newPwd"));
return userInfo;
}
}