From a743b95a50e575d4d6f9203db77da129544bef9e Mon Sep 17 00:00:00 2001 From: zhuibobo Date: Tue, 7 Jul 2026 22:18:08 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E7=BD=AE=E5=AF=86=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/IEfcodeVirtualUnitService.java | 10 ++++++ .../impl/EfcodeVirtualUnitServiceImpl.java | 31 +++++++++++++++++++ .../EfcodeVirtualUnitController.java | 16 ++++++++++ .../src/api/efcode/virtualUnit/index.ts | 15 +++++++++ .../efcode/virtualUnit/unitUserManager.vue | 6 ++-- 5 files changed, 75 insertions(+), 3 deletions(-) diff --git a/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/service/IEfcodeVirtualUnitService.java b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/service/IEfcodeVirtualUnitService.java index c825a467..48a18764 100644 --- a/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/service/IEfcodeVirtualUnitService.java +++ b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/service/IEfcodeVirtualUnitService.java @@ -162,6 +162,16 @@ public interface IEfcodeVirtualUnitService { */ void updateUser(UnitUserBo bo); + /** + * 重置执法人员密码 + *

+ * 使用与登录校验一致的 MD5(loginName + password + salt) 方式加密 + * + * @param userId 用户ID + * @param password 新密码明文 + */ + void resetUserPwd(Long userId, String password); + /** * 根据 sys_dept_id 查找对应的虚拟单位 vir_id * diff --git a/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeVirtualUnitServiceImpl.java b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeVirtualUnitServiceImpl.java index b7fbf81e..d0134c24 100644 --- a/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeVirtualUnitServiceImpl.java +++ b/zdxt-modules/zdxt-enforcement-code-common/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeVirtualUnitServiceImpl.java @@ -435,6 +435,37 @@ public class EfcodeVirtualUnitServiceImpl implements IEfcodeVirtualUnitService { sysUserMapper.update(null, uw); } + /** + * 重置执法人员密码 + *

+ * 使用与登录校验一致的 MD5(loginName + password + salt) 方式加密, + * 确保重置后用户可正常登录(登录校验见 PasswordService.matches)。 + */ + @Override + public void resetUserPwd(Long userId, String password) { + if (userId == null) { + throw new ServiceException("用户ID不能为空"); + } + if (StringUtils.isBlank(password)) { + throw new ServiceException("新密码不能为空"); + } + SysUser user = sysUserMapper.selectById(userId); + if (user == null) { + throw new ServiceException("用户不存在"); + } + // salt 为空时生成新的 salt,保证与登录校验方式一致 + String salt = user.getSalt(); + LambdaUpdateWrapper uw = Wrappers.lambdaUpdate() + .eq(SysUser::getUserId, userId); + if (StringUtils.isBlank(salt)) { + salt = cn.hutool.core.util.RandomUtil.randomString("0123456789abcdef", 6); + uw.set(SysUser::getSalt, salt); + } + uw.set(SysUser::getPassword, DigestUtil.md5Hex(user.getLoginName() + password + salt)); + sysUserMapper.update(null, uw); + } + + /** * 根据 sys_dept_id 查找对应的虚拟单位 vir_id */ diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/EfcodeVirtualUnitController.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/EfcodeVirtualUnitController.java index 03d9d648..848e56a5 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/EfcodeVirtualUnitController.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/EfcodeVirtualUnitController.java @@ -22,11 +22,13 @@ import com.zdxt.enforcementcode.domain.vo.UnitUserVo; import com.zdxt.enforcementcode.domain.vo.VirtualUnitDeptTreeVo; import com.zdxt.enforcementcode.domain.bo.EfcodeVirtualUnitBo; import com.zdxt.enforcementcode.domain.bo.UnitUserBo; +import com.zdxt.enforcementcode.domain.bo.UnitUserResetPwdBo; import com.zdxt.enforcementcode.domain.bo.RefUserBo; import com.zdxt.enforcementcode.domain.bo.RefUserRemarkBo; import com.zdxt.enforcementcode.service.IEfcodeVirtualUnitService; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.encrypt.annotation.ApiEncrypt; /** * 虚拟单位树 @@ -226,6 +228,20 @@ public class EfcodeVirtualUnitController extends BaseController { return R.ok(); } + /** + * 重置执法人员密码 + *

+ * 请求体加密传输(与登录一致),密码存储使用 MD5(loginName + password + salt)。 + */ + @ApiEncrypt + @Log(title = "执法人员", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping("/user/resetPwd") + public R resetUserPwd(@Validated @RequestBody UnitUserResetPwdBo bo) { + efcodeVirtualUnitService.resetUserPwd(bo.getUserId(), bo.getPassword()); + return R.ok(); + } + /** * 删除执法人员 */ diff --git a/zdxt-web-client/zdxt-admin-plus-ui/src/api/efcode/virtualUnit/index.ts b/zdxt-web-client/zdxt-admin-plus-ui/src/api/efcode/virtualUnit/index.ts index f8389a95..d7dda817 100644 --- a/zdxt-web-client/zdxt-admin-plus-ui/src/api/efcode/virtualUnit/index.ts +++ b/zdxt-web-client/zdxt-admin-plus-ui/src/api/efcode/virtualUnit/index.ts @@ -128,6 +128,21 @@ export const deleteUnitUser = (userIds: (number | string)[]) => { }); }; +/** + * 重置执法人员密码(加密传输,与登录一致) + */ +export const resetUnitUserPwd = (userId: number | string, password: string) => { + return request({ + url: '/enforcementcode/virtualUnit/user/resetPwd', + method: 'put', + headers: { + isEncrypt: true, + repeatSubmit: false + }, + data: { userId, password } + }); +}; + /** * 查询虚拟单位引用的人员列表(分页) */ diff --git a/zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/virtualUnit/unitUserManager.vue b/zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/virtualUnit/unitUserManager.vue index 65d070b8..ba09f6b9 100644 --- a/zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/virtualUnit/unitUserManager.vue +++ b/zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/virtualUnit/unitUserManager.vue @@ -2,8 +2,8 @@ import { ref, computed, onMounted, watch, reactive, nextTick } from 'vue'; import { Search, Edit } from '@element-plus/icons-vue'; import { ElMessage, ElMessageBox } from 'element-plus'; -import { getBusinessTreeList, getUnitUsers, addUnitUser, updateUnitUser, deleteUnitUser, getReferencedUsers, addReferencedUsers, deleteReferencedUsers, updateReferencedUserRemark } from '@/api/efcode/virtualUnit'; -import { getAuthRole, updateAuthRole, resetUserPwd } from '@/api/system/user'; +import { getBusinessTreeList, getUnitUsers, addUnitUser, updateUnitUser, deleteUnitUser, resetUnitUserPwd, getReferencedUsers, addReferencedUsers, deleteReferencedUsers, updateReferencedUserRemark } from '@/api/efcode/virtualUnit'; +import { getAuthRole, updateAuthRole } from '@/api/system/user'; import type { VirtualUnitVo, UnitUserVo } from '@/api/efcode/virtualUnit/types'; import type { RoleVO } from '@/api/system/role/types'; @@ -631,7 +631,7 @@ const handleResetPwd = (row: UnitUserVo) => { const submitResetPwd = async () => { const valid = await resetPwdFormRef.value?.validate().catch(() => false); if (!valid) return; - await resetUserPwd(currentResetUser.value.userId, resetPwdForm.newPassword); + await resetUnitUserPwd(currentResetUser.value.userId, resetPwdForm.newPassword); ElMessage.success('密码重置成功'); resetPwdDialogVisible.value = false; };