From e17411b470748506a601127b59cde7b25825ac14 Mon Sep 17 00:00:00 2001 From: lijun Date: Sat, 14 Feb 2026 22:52:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BC=9A=E5=91=98=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/user/MemberUserController.java | 8 +++ .../admin/user/vo/MemberUserCreateRespVO.java | 23 ++++++++ .../service/user/MemberUserService.java | 10 ++++ .../service/user/MemberUserServiceImpl.java | 56 +++++++++++++++++++ .../src/api/member/user/index.ts | 5 ++ .../src/views/member/user/UserForm.vue | 3 +- .../src/views/member/user/index.vue | 4 ++ .../sheep/validate/form.js | 4 +- 8 files changed, 109 insertions(+), 4 deletions(-) create mode 100644 yanzhu-module-member/src/main/java/com/yanzhu/module/member/controller/admin/user/vo/MemberUserCreateRespVO.java diff --git a/yanzhu-module-member/src/main/java/com/yanzhu/module/member/controller/admin/user/MemberUserController.java b/yanzhu-module-member/src/main/java/com/yanzhu/module/member/controller/admin/user/MemberUserController.java index e5fb8c6..9dbc7ed 100644 --- a/yanzhu-module-member/src/main/java/com/yanzhu/module/member/controller/admin/user/MemberUserController.java +++ b/yanzhu-module-member/src/main/java/com/yanzhu/module/member/controller/admin/user/MemberUserController.java @@ -51,6 +51,14 @@ public class MemberUserController { @Resource private MemberPointRecordService memberPointRecordService; + @PostMapping("/create") + @Operation(summary = "创建会员用户") + @PreAuthorize("@ss.hasPermission('member:user:create')") + public CommonResult createUser(@Valid @RequestBody MemberUserBaseVO createReqVO) { + MemberUserCreateRespVO respVO = memberUserService.createUser(createReqVO); + return success(respVO); + } + @PutMapping("/update") @Operation(summary = "更新会员用户") @PreAuthorize("@ss.hasPermission('member:user:update')") diff --git a/yanzhu-module-member/src/main/java/com/yanzhu/module/member/controller/admin/user/vo/MemberUserCreateRespVO.java b/yanzhu-module-member/src/main/java/com/yanzhu/module/member/controller/admin/user/vo/MemberUserCreateRespVO.java new file mode 100644 index 0000000..96cd446 --- /dev/null +++ b/yanzhu-module-member/src/main/java/com/yanzhu/module/member/controller/admin/user/vo/MemberUserCreateRespVO.java @@ -0,0 +1,23 @@ +package com.yanzhu.module.member.controller.admin.user.vo; + +import lombok.Data; + +/** + * 会员用户创建响应 VO + * + * @author 研筑科技 + */ +@Data +public class MemberUserCreateRespVO { + + /** + * 用户编号 + */ + private Long userId; + + /** + * 生成的密码 + */ + private String password; + +} diff --git a/yanzhu-module-member/src/main/java/com/yanzhu/module/member/service/user/MemberUserService.java b/yanzhu-module-member/src/main/java/com/yanzhu/module/member/service/user/MemberUserService.java index b3f50a4..e86573f 100644 --- a/yanzhu-module-member/src/main/java/com/yanzhu/module/member/service/user/MemberUserService.java +++ b/yanzhu-module-member/src/main/java/com/yanzhu/module/member/service/user/MemberUserService.java @@ -3,6 +3,8 @@ package com.yanzhu.module.member.service.user; import com.yanzhu.framework.common.enums.TerminalEnum; import com.yanzhu.framework.common.pojo.PageResult; import com.yanzhu.framework.common.validation.Mobile; +import com.yanzhu.module.member.controller.admin.user.vo.MemberUserBaseVO; +import com.yanzhu.module.member.controller.admin.user.vo.MemberUserCreateRespVO; import com.yanzhu.module.member.controller.admin.user.vo.MemberUserPageReqVO; import com.yanzhu.module.member.controller.admin.user.vo.MemberUserUpdateReqVO; import com.yanzhu.module.member.controller.app.user.vo.*; @@ -130,6 +132,14 @@ public interface MemberUserService { */ boolean isPasswordMatch(String rawPassword, String encodedPassword); + /** + * 【管理员】创建会员用户 + * + * @param createReqVO 创建信息 + * @return 用户编号和生成的密码 + */ + MemberUserCreateRespVO createUser(@Valid MemberUserBaseVO createReqVO); + /** * 【管理员】更新会员用户 * diff --git a/yanzhu-module-member/src/main/java/com/yanzhu/module/member/service/user/MemberUserServiceImpl.java b/yanzhu-module-member/src/main/java/com/yanzhu/module/member/service/user/MemberUserServiceImpl.java index 19a4d58..ae06987 100644 --- a/yanzhu-module-member/src/main/java/com/yanzhu/module/member/service/user/MemberUserServiceImpl.java +++ b/yanzhu-module-member/src/main/java/com/yanzhu/module/member/service/user/MemberUserServiceImpl.java @@ -6,8 +6,12 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.*; import com.yanzhu.framework.common.enums.CommonStatusEnum; import com.yanzhu.framework.common.enums.UserTypeEnum; +import com.yanzhu.framework.common.enums.TerminalEnum; import com.yanzhu.framework.common.pojo.PageResult; import com.yanzhu.framework.common.util.object.BeanUtils; +import com.yanzhu.framework.common.util.servlet.ServletUtils; +import com.yanzhu.module.member.controller.admin.user.vo.MemberUserBaseVO; +import com.yanzhu.module.member.controller.admin.user.vo.MemberUserCreateRespVO; import com.yanzhu.module.member.controller.admin.user.vo.MemberUserPageReqVO; import com.yanzhu.module.member.controller.admin.user.vo.MemberUserUpdateReqVO; import com.yanzhu.module.member.controller.app.user.vo.*; @@ -231,6 +235,58 @@ public class MemberUserServiceImpl implements MemberUserService { return passwordEncoder.encode(password); } + @Override + @Transactional(rollbackFor = Exception.class) + public MemberUserCreateRespVO createUser(MemberUserBaseVO createReqVO) { + // 校验手机唯一 + validateMobileUnique(null, createReqVO.getMobile()); + + // 创建用户 + MemberUserDO user = new MemberUserDO(); + user.setMobile(createReqVO.getMobile()); + if (createReqVO.getStatus() != null) { + user.setStatus(Integer.valueOf(createReqVO.getStatus())); + } + user.setNickname(createReqVO.getNickname()); + user.setAvatar(createReqVO.getAvatar()); + user.setName(createReqVO.getName()); + user.setSex(createReqVO.getSex()); + if (createReqVO.getAreaId() != null) { + user.setAreaId(Math.toIntExact(createReqVO.getAreaId())); + } + user.setBirthday(createReqVO.getBirthday()); + user.setMark(createReqVO.getMark()); + user.setTagIds(createReqVO.getTagIds()); + user.setLevelId(createReqVO.getLevelId()); + user.setGroupId(createReqVO.getGroupId()); + + // 使用手机号码的后6位作为密码 + String password = createReqVO.getMobile().substring(createReqVO.getMobile().length() - 6); + user.setPassword(encodePassword(password)); + + // 设置注册信息 + user.setRegisterIp(ServletUtils.getClientIP()); + user.setRegisterTerminal(TerminalEnum.H5.getTerminal()); + + // 插入数据库 + memberUserMapper.insert(user); + + // 发送 MQ 消息:用户创建 + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + @Override + public void afterCommit() { + memberUserProducer.sendUserCreateMessage(user.getId()); + } + }); + + // 构建返回结果 + MemberUserCreateRespVO respVO = new MemberUserCreateRespVO(); + respVO.setUserId(user.getId()); + respVO.setPassword(password); + + return respVO; + } + @Override @Transactional(rollbackFor = Exception.class) public void updateUser(MemberUserUpdateReqVO updateReqVO) { diff --git a/yanzhu-ui/yanzhu-ui-admin-vue3/src/api/member/user/index.ts b/yanzhu-ui/yanzhu-ui-admin-vue3/src/api/member/user/index.ts index 1f8acf4..e511648 100644 --- a/yanzhu-ui/yanzhu-ui-admin-vue3/src/api/member/user/index.ts +++ b/yanzhu-ui/yanzhu-ui-admin-vue3/src/api/member/user/index.ts @@ -32,6 +32,11 @@ export const getUser = async (id: number) => { return await request.get({ url: `/member/user/get?id=` + id }) } +// 创建会员用户 +export const createUser = async (data: UserVO) => { + return await request.post({ url: `/member/user/create`, data }) +} + // 修改会员用户 export const updateUser = async (data: UserVO) => { return await request.put({ url: `/member/user/update`, data }) diff --git a/yanzhu-ui/yanzhu-ui-admin-vue3/src/views/member/user/UserForm.vue b/yanzhu-ui/yanzhu-ui-admin-vue3/src/views/member/user/UserForm.vue index 615d92a..308bf1c 100644 --- a/yanzhu-ui/yanzhu-ui-admin-vue3/src/views/member/user/UserForm.vue +++ b/yanzhu-ui/yanzhu-ui-admin-vue3/src/views/member/user/UserForm.vue @@ -138,8 +138,7 @@ const submitForm = async () => { try { const data = formData.value as unknown as UserApi.UserVO if (formType.value === 'create') { - // 说明:目前暂时没有新增操作。如果自己业务需要,可以进行扩展 - // await UserApi.createUser(data) + await UserApi.createUser(data) message.success(t('common.createSuccess')) } else { await UserApi.updateUser(data) diff --git a/yanzhu-ui/yanzhu-ui-admin-vue3/src/views/member/user/index.vue b/yanzhu-ui/yanzhu-ui-admin-vue3/src/views/member/user/index.vue index acfb810..e1bc86b 100644 --- a/yanzhu-ui/yanzhu-ui-admin-vue3/src/views/member/user/index.vue +++ b/yanzhu-ui/yanzhu-ui-admin-vue3/src/views/member/user/index.vue @@ -58,6 +58,10 @@ + + + 新增 + 搜索 diff --git a/yanzhu-ui/yanzhu-ui-mall-uniapp/sheep/validate/form.js b/yanzhu-ui/yanzhu-ui-mall-uniapp/sheep/validate/form.js index 07b5725..0af24a9 100644 --- a/yanzhu-ui/yanzhu-ui-mall-uniapp/sheep/validate/form.js +++ b/yanzhu-ui/yanzhu-ui-mall-uniapp/sheep/validate/form.js @@ -31,8 +31,8 @@ export const password = { }, { validateFunction: function (rule, value, data, callback) { - if (!/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]+\S{5,12}$/.test(value)) { - callback('需包含字母和数字,长度在6-12之间'); + if (value.length < 6) { + callback('密码长度至少6位'); } return true; },