From 1e6f177e264b130cb69e79e4325156989629ec85 Mon Sep 17 00:00:00 2001
From: KKSU <15274802129@163.com>
Date: Mon, 17 Feb 2025 15:37:19 +0800
Subject: [PATCH] feat(user): 新增客服用户注册功能
---
src/main/java/cc/mrbird/febs/user/req/ApiRegisterDto.java | 39 ++++++
src/main/java/cc/mrbird/febs/user/service/IChatMemberService.java | 8 +
src/main/java/cc/mrbird/febs/user/conversion/ChatMemberConversion.java | 9 +
src/main/java/cc/mrbird/febs/user/service/Impl/ChatMemberServiceImpl.java | 147 ++++++++++++++++++++++++
src/main/java/cc/mrbird/febs/user/controller/ChatUserController.java | 33 +++++
src/main/java/cc/mrbird/febs/user/entity/ChatMember.java | 58 +++++++++
src/main/java/cc/mrbird/febs/common/utils/LoginUserUtil.java | 6 +
src/main/java/cc/mrbird/febs/user/mapper/ChatMemberMapper.java | 7 +
src/main/java/cc/mrbird/febs/common/interceptor/LoginInterceptor.java | 13 -
src/main/java/cc/mrbird/febs/common/utils/SubMailSend.java | 2
10 files changed, 312 insertions(+), 10 deletions(-)
diff --git a/src/main/java/cc/mrbird/febs/common/interceptor/LoginInterceptor.java b/src/main/java/cc/mrbird/febs/common/interceptor/LoginInterceptor.java
index 4e1b19c..690b068 100644
--- a/src/main/java/cc/mrbird/febs/common/interceptor/LoginInterceptor.java
+++ b/src/main/java/cc/mrbird/febs/common/interceptor/LoginInterceptor.java
@@ -4,7 +4,7 @@
import cc.mrbird.febs.common.utils.AppContants;
import cc.mrbird.febs.common.utils.RedisUtils;
import cc.mrbird.febs.common.utils.SpringContextUtil;
-import cc.mrbird.febs.mall.entity.MallMember;
+import cc.mrbird.febs.user.entity.ChatMember;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
@@ -20,10 +20,6 @@
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
-/**
- * @author xxx
- * @date 2020-08-24
- **/
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
@@ -51,10 +47,9 @@
responseUnAuth(response);
return false;
}
- MallMember member = JSON.parseObject(userJsonStr, MallMember.class);
-
- request.getSession().setAttribute("member", member);
-// log.info("登录用户token:"+token+",PHONE:"+member.getPhone());
+ ChatMember chatMember = JSON.parseObject(userJsonStr, ChatMember.class);
+ request.getSession().setAttribute("chatMember", chatMember);
+ log.info("登录用户{},{}",chatMember.getEmail(),token);
return true;
}
diff --git a/src/main/java/cc/mrbird/febs/common/utils/LoginUserUtil.java b/src/main/java/cc/mrbird/febs/common/utils/LoginUserUtil.java
index 08cdb4a..c059894 100644
--- a/src/main/java/cc/mrbird/febs/common/utils/LoginUserUtil.java
+++ b/src/main/java/cc/mrbird/febs/common/utils/LoginUserUtil.java
@@ -1,6 +1,7 @@
package cc.mrbird.febs.common.utils;
import cc.mrbird.febs.mall.entity.MallMember;
+import cc.mrbird.febs.user.entity.ChatMember;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@@ -16,4 +17,9 @@
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
return (MallMember) request.getSession().getAttribute("member");
}
+
+ public static ChatMember getLoginChatMember() {
+ HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
+ return (ChatMember) request.getSession().getAttribute("chatMember");
+ }
}
diff --git a/src/main/java/cc/mrbird/febs/common/utils/SubMailSend.java b/src/main/java/cc/mrbird/febs/common/utils/SubMailSend.java
index 9ff0e30..dd7db56 100644
--- a/src/main/java/cc/mrbird/febs/common/utils/SubMailSend.java
+++ b/src/main/java/cc/mrbird/febs/common/utils/SubMailSend.java
@@ -87,8 +87,8 @@
private static boolean request(JSONObject vars, String project, String to) {
TreeMap<String, Object> requestData = new TreeMap<String, Object>();
requestData.put("appid", APP_ID);
- requestData.put("project", project);
requestData.put("to", to);
+ requestData.put("project", project);
requestData.put("from", FROM);
if (!vars.isEmpty()) {
requestData.put("vars", vars.toString());
diff --git a/src/main/java/cc/mrbird/febs/user/controller/ChatUserController.java b/src/main/java/cc/mrbird/febs/user/controller/ChatUserController.java
new file mode 100644
index 0000000..90e2d82
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/user/controller/ChatUserController.java
@@ -0,0 +1,33 @@
+package cc.mrbird.febs.user.controller;
+
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.user.req.ApiRegisterDto;
+import cc.mrbird.febs.user.service.IChatMemberService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+@Slf4j
+@RestController
+@RequestMapping(value = "/api/chatUser")
+@RequiredArgsConstructor
+@CrossOrigin("*")
+@Api(value = "ChatUserController", tags = "客服用户")
+public class ChatUserController {
+
+ private final IChatMemberService chatMemberService;
+
+ /**
+ * 主账号注册 主账号添加子账号
+ * @param apiRegisterDto
+ * @return
+ */
+ @ApiOperation(value = "注册", notes = "注册")
+ @PostMapping(value = "/register")
+ public FebsResponse register(@RequestBody ApiRegisterDto apiRegisterDto) {
+ return chatMemberService.register(apiRegisterDto);
+ }
+
+}
diff --git a/src/main/java/cc/mrbird/febs/user/conversion/ChatMemberConversion.java b/src/main/java/cc/mrbird/febs/user/conversion/ChatMemberConversion.java
new file mode 100644
index 0000000..9332205
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/user/conversion/ChatMemberConversion.java
@@ -0,0 +1,9 @@
+package cc.mrbird.febs.user.conversion;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+@Mapper
+public abstract class ChatMemberConversion {
+ public static final ChatMemberConversion INSTANCE = Mappers.getMapper(ChatMemberConversion.class);
+}
diff --git a/src/main/java/cc/mrbird/febs/user/entity/ChatMember.java b/src/main/java/cc/mrbird/febs/user/entity/ChatMember.java
new file mode 100644
index 0000000..7d38bba
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/user/entity/ChatMember.java
@@ -0,0 +1,58 @@
+package cc.mrbird.febs.user.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ *
+ `phone` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '联系手机号码',
+ `email` varchar(90) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '注册邮箱',
+ `password` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '登录密码',
+ `trade_password` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '支付密码',
+ `name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '昵称',
+ `sex` int DEFAULT '0' COMMENT '性别 0-女 1-男性 2-未填写',
+ `invite_id` varchar(8) DEFAULT NULL COMMENT '邀请码',
+ `referrer_id` varchar(8) DEFAULT NULL COMMENT '推荐人邀请码',
+ `referrer_ids` text COMMENT '推荐人线路',
+ `level` varchar(255) DEFAULT NULL COMMENT '代理层级',
+ `account_status` int DEFAULT '1' COMMENT '账户状态;1-正常 0-禁用',
+ `account_type` int DEFAULT '0' COMMENT '账户类型;1-正常用户 0-测试账户',
+ `avatar` varchar(500) DEFAULT NULL COMMENT '头像',
+ `director` int DEFAULT '2' COMMENT '是否是主账号 1-是 0-否',
+ `director_time` datetime DEFAULT NULL COMMENT '购买套餐的时间',
+ `director_fail_time` datetime DEFAULT NULL COMMENT '套餐到期时间',
+ `last_login_time` datetime DEFAULT NULL COMMENT '上一次登录时间',
+ `company_id` bigint DEFAULT NULL COMMENT '公司ID',
+ `role_id` bigint DEFAULT NULL COMMENT '角色ID',
+ */
+@Data
+@TableName("chat_member")
+public class ChatMember extends BaseEntity {
+
+ private String phone;//联系手机号码
+ private String email;//注册邮箱
+ private String password;//登录密码
+ private String tradePassword;//支付密码
+ private String name;//昵称
+ private Integer sex;//性别 0-女 1-男性 2-未填写
+ private String inviteId;//邀请码
+ private String referrerId;//推荐人邀请码
+ private String referrerIds;//推荐人线路
+ private String level;//代理层级
+ private Integer accountStatus;//账户状态;1-正常 0-禁用
+ private Integer accountType;//账户类型;1-正常用户 0-测试账户
+ private String avatar;//头像
+ private Integer director;//是否是主账号 1-是 0-否
+ @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+ private Date directorTime;//购买套餐的时间
+ @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+ private Date directorFailTime;//套餐到期时间
+ @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+ private Date lastLoginTime;//上一次登录时间
+ private Long companyId;//公司ID
+ private Long roleId;//角色ID
+}
diff --git a/src/main/java/cc/mrbird/febs/user/mapper/ChatMemberMapper.java b/src/main/java/cc/mrbird/febs/user/mapper/ChatMemberMapper.java
new file mode 100644
index 0000000..6b44beb
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/user/mapper/ChatMemberMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.user.mapper;
+
+import cc.mrbird.febs.user.entity.ChatMember;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface ChatMemberMapper extends BaseMapper<ChatMember> {
+}
diff --git a/src/main/java/cc/mrbird/febs/user/req/ApiRegisterDto.java b/src/main/java/cc/mrbird/febs/user/req/ApiRegisterDto.java
new file mode 100644
index 0000000..9aa774d
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/user/req/ApiRegisterDto.java
@@ -0,0 +1,39 @@
+package cc.mrbird.febs.user.req;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+@ApiModel(value = "ApiRegisterDto", description = "用户注册参数类")
+public class ApiRegisterDto {
+
+ @NotBlank(message = "邮箱不能为空!")
+ @ApiModelProperty(value = "邮箱", example = "152@163.com")
+ private String account;
+
+ @NotBlank(message = "类型不能为空!")
+ @ApiModelProperty(value = "类型 1-手机号 2-邮箱", example = "1")
+ private String type = "1";
+
+ @NotBlank(message = "验证码不能为空")
+ @ApiModelProperty(value = "验证码", example = "123456")
+ private String code;
+
+ @NotBlank(message = "密码不能为空")
+ @ApiModelProperty(value = "密码", example = "123456")
+ private String password;
+
+ @NotBlank(message = "密码不能为空")
+ @ApiModelProperty(value = "重复密码", example = "123456")
+ private String passwordAgain;
+
+ @ApiModelProperty(value = "邀请码")
+ private String inviteId;
+
+ @NotBlank(message = "注册类型不能为空")
+ @ApiModelProperty(value = "注册类型 1-正常注册 0-手动添加子账号", example = "1")
+ private Integer registerType;//注册类型 1-正常注册 0-手动添加子账号
+}
diff --git a/src/main/java/cc/mrbird/febs/user/service/IChatMemberService.java b/src/main/java/cc/mrbird/febs/user/service/IChatMemberService.java
new file mode 100644
index 0000000..a1552d3
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/user/service/IChatMemberService.java
@@ -0,0 +1,8 @@
+package cc.mrbird.febs.user.service;
+
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.user.req.ApiRegisterDto;
+
+public interface IChatMemberService {
+ FebsResponse register(ApiRegisterDto apiRegisterDto);
+}
diff --git a/src/main/java/cc/mrbird/febs/user/service/Impl/ChatMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/user/service/Impl/ChatMemberServiceImpl.java
new file mode 100644
index 0000000..e7963ea
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/user/service/Impl/ChatMemberServiceImpl.java
@@ -0,0 +1,147 @@
+package cc.mrbird.febs.user.service.Impl;
+
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.common.enumerates.YesOrNoEnum;
+import cc.mrbird.febs.common.exception.FebsException;
+import cc.mrbird.febs.common.utils.AppContants;
+import cc.mrbird.febs.common.utils.ShareCodeUtil;
+import cc.mrbird.febs.mall.entity.MallMember;
+import cc.mrbird.febs.mall.entity.MallMemberWallet;
+import cc.mrbird.febs.mall.entity.RunVip;
+import cc.mrbird.febs.user.entity.ChatMember;
+import cc.mrbird.febs.user.mapper.ChatMemberMapper;
+import cc.mrbird.febs.user.req.ApiRegisterDto;
+import cc.mrbird.febs.user.service.IChatMemberService;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.crypto.SecureUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+@Transactional
+public class ChatMemberServiceImpl extends ServiceImpl<ChatMemberMapper, ChatMember> implements IChatMemberService {
+
+ @Override
+ public FebsResponse register(ApiRegisterDto apiRegisterDto) {
+ String account = apiRegisterDto.getAccount();
+
+ MallMember mallMember = this.baseMapper.selectInfoByAccount(account);
+ if (mallMember != null) {
+ throw new FebsException("手机号已注册");
+ }
+ /**
+ * 验证两次密码是否一致
+ */
+ String password = registerDto.getPassword();
+ String passwordAgain = registerDto.getPasswordAgain();
+ if(!password.equals(passwordAgain)){
+ throw new FebsException("密码不一致");
+ }
+
+ //邀请码为admin的时候(后台添加用户),不需要验证验证码
+ if (!"admin".equals(registerDto.getRegistType())) {
+ String code = registerDto.getCode();
+ boolean flags = commonService.verifyCode(account, code);
+ if (!flags) {
+ throw new FebsException("验证码错误");
+ }
+ }
+
+ mallMember = new MallMember();
+ mallMember.setPassword(SecureUtil.md5(registerDto.getPassword()));
+
+ // 判断账号类型
+ if (AppContants.ACCOUNT_TYPE_MOBILE.equals(registerDto.getType())) {
+ mallMember.setPhone(registerDto.getAccount());
+ } else {
+ mallMember.setEmail(registerDto.getAccount());
+ }
+ //对于邀请码的验证和上级联系人的验证
+ Integer count = this.baseMapper.selectCount(null);
+ if (count != null && count != 0) {
+ if(StrUtil.isEmpty(registerDto.getInviteId())){
+ throw new FebsException("请输入邀请码");
+ }
+ String inviteId = registerDto.getInviteId();
+ MallMember inviteMember = this.baseMapper.selectInfoByInviteId(inviteId);
+ if (inviteMember == null) {
+ throw new FebsException("邀请码不存在");
+ }
+ mallMember.setReferrerId(registerDto.getInviteId());
+// if(!StrUtil.isEmpty(registerDto.getInviteId())){
+// String inviteId = registerDto.getInviteId();
+// MallMember inviteMember = this.baseMapper.selectInfoByInviteId(inviteId);
+// if (inviteMember == null) {
+// throw new FebsException("邀请码不存在");
+// }
+// mallMember.setReferrerId(registerDto.getInviteId());
+// }
+ }
+ mallMember.setName(account);
+ mallMember.setAvatar("https://res.runstep.cc/rslogo.png");
+ mallMember.setAccountStatus(YesOrNoEnum.YES.getValue());
+ mallMember.setAccountType(MallMember.ACCOUNT_TYPE_NORMAL);
+ mallMember.setSex("男");
+ mallMember.setDirector(YesOrNoEnum.NO.getValue());
+ mallMember.setDirectorTime(DateUtil.date());
+ mallMember.setBindPhone(account);
+
+ this.baseMapper.insert(mallMember);
+
+ String inviteId = ShareCodeUtil.toSerialCode(mallMember.getId());
+ mallMember.setInviteId(inviteId);
+
+ //推荐人和推荐人链
+ boolean flag = false;
+ String parentId = mallMember.getReferrerId();
+ if (StrUtil.isBlank(parentId)) {
+ flag = true;
+ }
+ String ids = "";
+ while (!flag) {
+ if (StrUtil.isBlank(ids)) {
+ ids += parentId;
+ } else {
+ ids += ("," + parentId);
+ }
+ MallMember parentMember = this.baseMapper.selectInfoByInviteId(parentId);
+ if (parentMember == null) {
+ break;
+ }
+ parentId = parentMember.getReferrerId();
+ if (StrUtil.isBlank(parentMember.getReferrerId())) {
+ flag = true;
+ }
+ }
+
+ if (StrUtil.isNotBlank(ids)) {
+ mallMember.setReferrerIds(ids);
+ }
+ //会员VIP等级
+ List<RunVip> runVips = runVipMapper.selectList(new LambdaQueryWrapper<RunVip>().orderByAsc(RunVip::getOrderNumber));
+ if (StrUtil.isBlank(mallMember.getLevel()) && CollUtil.isNotEmpty(runVips)) {
+ RunVip runVip = runVips.get(0);
+ mallMember.setLevel(runVip.getVipCode());
+ }
+ this.baseMapper.updateById(mallMember);
+
+ MallMemberWallet wallet = new MallMemberWallet();
+ wallet.setBalance(BigDecimal.ZERO);
+ wallet.setMemberId(mallMember.getId());
+ mallMemberWalletMapper.insert(wallet);
+
+ agentProducer.sendNodeUpMsg(mallMember.getId());
+ return new FebsResponse().success().message("注册成功");
+ }
+}
--
Gitblit v1.9.1