This commit is contained in:
张良(004796)
2024-03-13 14:56:59 +08:00
parent 9559658dda
commit e79d7d8c5c
18 changed files with 494 additions and 41 deletions

View File

@@ -13,6 +13,11 @@ import com.ruoyi.common.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.xq.domain.User;
import com.ruoyi.xq.dto.admin.user.UserAdminVo;
import com.ruoyi.xq.dto.admin.user.req.ResetPasswordAdminReq;
import com.ruoyi.xq.dto.admin.user.req.UpdateMobileAdminReq;
import com.ruoyi.xq.dto.app.common.IdReq;
import com.ruoyi.xq.service.UserInviteService;
import com.ruoyi.xq.service.UserService;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
@@ -38,14 +43,15 @@ import java.util.stream.Collectors;
public class UserController extends BaseController {
private final UserService userService;
private final UserInviteService userInviteService;
/**
* 查询用户管理列表
*/
@SaCheckPermission("xq:user:list")
@GetMapping("/list")
public TableDataInfo<User> list(User bo, PageQuery pageQuery) {
Page<User> page = userService.page(pageQuery.build(), Wrappers.lambdaQuery(bo));
public TableDataInfo<UserAdminVo> list(UserAdminVo bo, PageQuery pageQuery) {
Page<UserAdminVo> page = userService.pageAdmin(pageQuery, bo);
return TableDataInfo.build(page);
}
@@ -66,6 +72,57 @@ public class UserController extends BaseController {
return R.ok(users.stream().map(User::getUsercode).collect(Collectors.toList()));
}
@PostMapping("/resetPwd")
@SaCheckPermission("xq:user:restPwd")
@Log(title = "重置用户密码", businessType = BusinessType.UPDATE)
public R<Void> resetPwd(@RequestBody ResetPasswordAdminReq req) {
User user = userService.getById(req.getUserId());
userService.resetPassword(req.getUserId(),user.getPassword());
return R.ok();
}
@SaCheckPermission("xq:user:updateMobile")
@Log(title = "修改用户手机", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping("/updateMobile")
public R<Void> updateMobile(@RequestBody UpdateMobileAdminReq bo) {
userService.updateMobileUser(bo);
return R.ok();
}
@SaCheckPermission("xq:user:unBindInvite")
@Log(title = "解绑用户邀请人", businessType = BusinessType.OTHER)
@GetMapping("/unBindInvite")
public R<Void> unBindInvite(Long userId) {
userInviteService.unBindInviteUser(userId);
return R.ok();
}
@SaCheckPermission("xq:user:bindInvite")
@Log(title = "绑定用户邀请人", businessType = BusinessType.OTHER)
@GetMapping("/bindInvite")
public R<Void> bindInvite(Long userId,String inviteUsercode) {
userInviteService.bindInvite(userId,inviteUsercode);
return R.ok();
}
@PostMapping("/resetAvatar")
@SaCheckPermission("xq:user:resetAvatar")
@Log(title = "重置用户头像", businessType = BusinessType.UPDATE)
public R<Void> resetAvatar(@RequestBody IdReq res){
userService.resetAvatar(res.getId());
return R.ok();
}
@PostMapping("/resetNickname")
@SaCheckPermission("xq:user:resetNickname")
@Log(title = "重置用户昵称", businessType = BusinessType.UPDATE)
public R<Void> resetNickname(@RequestBody IdReq res){
userService.resetNickname(res.getId());
return R.ok();
}
/**
* 获取用户管理详细信息
*

View File

@@ -0,0 +1,95 @@
package com.ruoyi.xq.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.annotation.RepeatSubmit;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.xq.domain.UserInvite;
import com.ruoyi.xq.service.UserInviteService;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Arrays;
/**
* 用户邀请
*
* @author 77
* @date 2024-03-13
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/xq/userInvite")
public class UserInviteController extends BaseController {
private final UserInviteService userInviteService;
/**
* 查询用户邀请列表
*/
@SaCheckPermission("xq:userInvite:list")
@GetMapping("/list")
public TableDataInfo<UserInvite> list(UserInvite bo, PageQuery pageQuery) {
Page<UserInvite> page = userInviteService.page(pageQuery.build(), Wrappers.lambdaQuery(bo));
return TableDataInfo.build(page);
}
/**
* 获取用户邀请详细信息
*
* @param id 主键
*/
@SaCheckPermission("xq:userInvite:query")
@GetMapping("/{id}")
public R<UserInvite> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(userInviteService.getById(id));
}
/**
* 新增用户邀请
*/
@SaCheckPermission("xq:userInvite:add")
@Log(title = "用户邀请", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody UserInvite bo) {
return toAjax(userInviteService.save(bo));
}
/**
* 修改用户邀请
*/
@SaCheckPermission("xq:userInvite:edit")
@Log(title = "用户邀请", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody UserInvite bo) {
return toAjax(userInviteService.updateById(bo));
}
/**
* 删除用户邀请
*
* @param ids 主键串
*/
@SaCheckPermission("xq:userInvite:remove")
@Log(title = "用户邀请", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(userInviteService.removeBatchByIds(Arrays.asList(ids)));
}
}

View File

@@ -133,10 +133,6 @@ public class User implements Serializable {
* 邀请人
*/
private Long inviteId;
/**
* 邀请人Code
*/
private String inviteCode;
/**
* im_token
*/

View File

@@ -37,14 +37,6 @@ public class UserExtend implements Serializable {
* 收益的余额
*/
private BigDecimal incomeCoin;
/**
* 邀请人
*/
private Long inviteId;
/**
* 邀请人Code
*/
private String inviteCode;
/**
* 消费统计
*/
@@ -53,10 +45,6 @@ public class UserExtend implements Serializable {
* 提现统计
*/
private BigDecimal withdrawTotal;
/**
* 给上家的返现提成
*/
private BigDecimal cashbackTotal;
private LocalDateTime createTime;
private LocalDateTime updateTime;

View File

@@ -0,0 +1,52 @@
package com.ruoyi.xq.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 用户邀请对象 xq_user_invite
*
* @author 77
* @date 2024-03-13
*/
@Data
@TableName("xq_user_invite")
public class UserInvite implements Serializable {
private static final long serialVersionUID=1L;
/**
*
*/
@TableId(value = "id")
private Long id;
/**
* 用户ID
*/
private Long userId;
/**
* 用户号
*/
private String usercode;
/**
* 邀请人
*/
private Long inviteId;
/**
* 邀请人Code
*/
private String inviteCode;
/**
* 给上家的返现提成
*/
private BigDecimal cashbackTotal;
private LocalDateTime createTime;
private LocalDateTime updateTime;
}

View File

@@ -0,0 +1,11 @@
package com.ruoyi.xq.dto.admin.user;
import com.ruoyi.xq.domain.User;
import lombok.Data;
@Data
public class UserAdminVo extends User {
private Long inviteId;
private String inviteNickname;
private String inviteUsercode;
}

View File

@@ -0,0 +1,11 @@
package com.ruoyi.xq.dto.admin.user.req;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@Schema(description = "重置密码入参")
public class ResetPasswordAdminReq {
private Long userId;
private String password;
}

View File

@@ -0,0 +1,9 @@
package com.ruoyi.xq.dto.admin.user.req;
import lombok.Data;
@Data
public class UpdateMobileAdminReq {
private Long id;
private String mobile;
}

View File

@@ -4,6 +4,8 @@ package com.ruoyi.xq.enums.userinfo;
import lombok.Getter;
import java.util.Arrays;
/**
* 性别
* <p>created on 2024/2/26 16:50</p>
@@ -11,17 +13,23 @@ import lombok.Getter;
*/
@Getter
public enum UserGenderEnum {
NONE(0,"未知"),
WOMEN(1,""),
MAN(2,""),
NONE(0,"未知", ""),
WOMEN(1,"", ""),
MAN(2,"", ""),
;
private final Integer code;
private final String text;
private final String defaultAvatar;
UserGenderEnum(Integer code, String text) {
UserGenderEnum(Integer code, String text, String defaultAvatar) {
this.code = code;
this.text = text;
this.defaultAvatar = defaultAvatar;
}
public static UserGenderEnum getByCode(Integer gender) {
return Arrays.stream(UserGenderEnum.values()).filter(i -> gender.equals(i.getCode())).findFirst().orElse(null);
}
}

View File

@@ -6,7 +6,6 @@ import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.enums.UserType;
@@ -65,6 +64,8 @@ public class CaiLoginManager {
private SmsVerifyService smsVerifyService;
@Autowired
private UserExtendService userExtendService;
@Autowired
private UserInviteService userInviteService;
public String login(String username,String password){
User user = userService.getByUsername(username);
@@ -119,30 +120,19 @@ public class CaiLoginManager {
}finally {
lock.unlock();
}
if(user.getInviteId() != null){
if(StringUtils.isNotEmpty(inviteCode)){
User finalUser = user;
ExecutorConstant.COMMON_EXECUTOR.execute(() -> dealInviteId(finalUser));
ExecutorConstant.COMMON_EXECUTOR.execute(() -> dealInviteId(finalUser,inviteCode));
}
return user;
}
public void dealInviteId(User user){
String inviteCode = user.getInviteCode();
public void dealInviteId(User user, String inviteCode){
if(StringUtils.isEmpty(inviteCode)){
return;
}
User inviteUser = userService.getByUsercode(inviteCode);
if(inviteUser == null){
return;
}
userService.update(Wrappers.lambdaUpdate(User.class)
.eq(User::getId,user.getId())
.set(User::getInviteId, inviteUser.getId()));
userExtendService.update(Wrappers.lambdaUpdate(UserExtend.class)
.eq(UserExtend::getUserId, user.getId())
.set(UserExtend::getInviteId, inviteUser.getId())
.set(UserExtend::getInviteCode, inviteUser.getUsercode()));
userInviteService.bindInvite(user.getId(),inviteCode);
}
@@ -189,7 +179,6 @@ public class CaiLoginManager {
add.setPassword(BCrypt.hashpw(usercode+"用户手动滑稽安康黄鼠狼"));
add.setMobile(mobile);
add.setGender(UserGenderEnum.NONE.getCode());
add.setInviteCode(inviteCode);
add.setImToken(IdUtil.simpleUUID());
userService.save(add);
CreateUserReq req = new CreateUserReq();

View File

@@ -0,0 +1,14 @@
package com.ruoyi.xq.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.xq.domain.UserInvite;
/**
* 用户邀请Mapper接口
*
* @author 77
* @date 2024-03-13
*/
public interface UserInviteMapper extends BaseMapper<UserInvite> {
}

View File

@@ -1,7 +1,10 @@
package com.ruoyi.xq.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.xq.domain.User;
import com.ruoyi.xq.dto.admin.user.UserAdminVo;
import org.apache.ibatis.annotations.Param;
/**
* 用户管理Mapper接口
@@ -11,4 +14,5 @@ import com.ruoyi.xq.domain.User;
*/
public interface UserMapper extends BaseMapper<User> {
Page<UserAdminVo> pageAdmin(@Param("build") Page<Object> build, @Param("bo") UserAdminVo bo);
}

View File

@@ -0,0 +1,17 @@
package com.ruoyi.xq.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.xq.domain.UserInvite;
/**
* 用户邀请Service接口
*
* @author 77
* @date 2024-03-13
*/
public interface UserInviteService extends IService<UserInvite> {
void bindInvite(Long userId, String inviteCode);
void unBindInviteUser(Long userId);
}

View File

@@ -1,7 +1,11 @@
package com.ruoyi.xq.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.xq.domain.User;
import com.ruoyi.xq.dto.admin.user.UserAdminVo;
import com.ruoyi.xq.dto.admin.user.req.UpdateMobileAdminReq;
import com.ruoyi.xq.dto.app.user.vo.HomeUserVo;
/**
@@ -19,4 +23,12 @@ public interface UserService extends IService<User> {
User getByUsercode(String usercode);
HomeUserVo homeUser(Long userId);
boolean updateMobileUser(UpdateMobileAdminReq bo);
void resetAvatar(Long userId);
void resetNickname(Long userId);
Page<UserAdminVo> pageAdmin(PageQuery pageQuery, UserAdminVo bo);
}

View File

@@ -0,0 +1,68 @@
package com.ruoyi.xq.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.xq.domain.User;
import com.ruoyi.xq.domain.UserInvite;
import com.ruoyi.xq.mapper.UserInviteMapper;
import com.ruoyi.xq.service.UserInviteService;
import com.ruoyi.xq.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
/**
* 用户邀请Service业务层处理
*
* @author 77
* @date 2024-03-13
*/
@Slf4j
@Service
public class UserInviteServiceImpl extends ServiceImpl<UserInviteMapper, UserInvite> implements UserInviteService {
@Autowired
private UserService userService;
@Override
@Transactional(rollbackFor = Exception.class)
public void bindInvite(Long userId, String inviteCode) {
User user = userService.getById(userId);
User inviteUser = userService.getByUsercode(inviteCode);
if(user == null || inviteUser == null){
throw new ServiceException("用户不存在,邀请用户不存在");
}
// TODO 添加判断,不允许设置自己为邀请人
// TODO 加锁
UserInvite userInvite = this.getOne(Wrappers.lambdaQuery(UserInvite.class)
.eq(UserInvite::getInviteId, inviteUser.getId())
.eq(UserInvite::getUserId, userId)
.last("limit 1"));
if(userInvite == null){
userInvite = new UserInvite();
userInvite.setUserId(userId);
userInvite.setUsercode(user.getUsercode());
userInvite.setInviteId(inviteUser.getId());
userInvite.setInviteCode(inviteUser.getUsercode());
}
userInvite.setCashbackTotal(BigDecimal.ZERO);
this.saveOrUpdate(userInvite);
userService.update(Wrappers.lambdaUpdate(User.class)
.eq(User::getId, userId)
.set(User::getInviteId, inviteUser.getId()));
}
@Override
@Transactional(rollbackFor = Exception.class)
public void unBindInviteUser(Long userId) {
this.remove(Wrappers.lambdaQuery(UserInvite.class)
.eq(UserInvite::getUserId, userId));
userService.update(Wrappers.lambdaUpdate(User.class)
.eq(User::getId, userId)
.set(User::getInviteId, null));
}
}

View File

@@ -1,19 +1,32 @@
package com.ruoyi.xq.service.impl;
import cn.dev33.satoken.secure.BCrypt;
import cn.hutool.core.util.PhoneUtil;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.BeanConvertUtil;
import com.ruoyi.xq.domain.User;
import com.ruoyi.xq.domain.UserInfo;
import com.ruoyi.xq.dto.admin.user.UserAdminVo;
import com.ruoyi.xq.dto.admin.user.req.UpdateMobileAdminReq;
import com.ruoyi.xq.dto.app.user.vo.HomeUserVo;
import com.ruoyi.xq.enums.userinfo.UserGenderEnum;
import com.ruoyi.xq.mapper.UserMapper;
import com.ruoyi.xq.service.UserInfoService;
import com.ruoyi.xq.service.UserService;
import com.ruoyi.yunxin.client.ImUserRefClient;
import com.ruoyi.yunxin.req.UpdateUinfoReq;
import com.ruoyi.yunxin.resp.YxCommonR;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* 用户管理Service业务层处理
@@ -22,9 +35,13 @@ import org.springframework.stereotype.Service;
* @date 2024-03-04
*/
@Service
@Slf4j
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {
@Autowired
private UserInfoService userInfoService;
@Autowired
private ImUserRefClient userRefClient;
@Override
public User getByUsername(String username) {
return this.getOne(Wrappers.lambdaQuery(User.class)
@@ -56,4 +73,75 @@ public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements Use
BeanConvertUtil.copyProperties(user,result);
return result;
}
@Override
public boolean updateMobileUser(UpdateMobileAdminReq bo) {
if(!PhoneUtil.isMobile(bo.getMobile())){
throw new ServiceException("请填写正常的手机号");
}
User user = this.getById(bo.getId());
if(com.ruoyi.common.utils.StringUtils.isNotEmpty(bo.getMobile())){
long count = this.count(Wrappers.lambdaQuery(User.class)
.eq(User::getMobile, bo.getMobile())
.ne(User::getId, user.getId()));
if(count > 0){
throw new BaseException("手机号已存在,无法修改");
}
}
User update = new User();
update.setId(user.getId());
update.setMobile(bo.getMobile());
this.updateById(update);
return true;
}
@Override
public void resetAvatar(Long userId) {
User user = this.getById(userId);
if(user == null){
return;
}
Integer gender = user.getGender();
UserGenderEnum genderEnum = UserGenderEnum.getByCode(gender);
if(genderEnum == null){
return;
}
this.update(Wrappers.lambdaUpdate(User.class)
.eq(User::getId,user.getId())
.set(User::getAvatar,genderEnum.getDefaultAvatar()));
UpdateUinfoReq uinfoReq = new UpdateUinfoReq();
uinfoReq.setAccid(user.getId()+"");
uinfoReq.setIcon(genderEnum.getDefaultAvatar());
YxCommonR r = userRefClient.updateUinfo(uinfoReq);
if(!r.isSuccess()){
log.error("云信更新失败,需要检查!{}", JSON.toJSONString(r));
}
}
@Override
public void resetNickname(Long userId) {
User user = this.getById(userId);
if(user == null){
return;
}
boolean update = this.update(Wrappers.lambdaUpdate(User.class)
.eq(User::getId, user.getId())
.set(User::getNickname, "用户" + user.getUsercode()));
if(!update){
return;
}
UpdateUinfoReq uinfoReq = new UpdateUinfoReq();
uinfoReq.setAccid(user.getId()+"");
uinfoReq.setName("用户"+user.getUsercode());
YxCommonR r = userRefClient.updateUinfo(uinfoReq);
if(!r.isSuccess()){
log.error("云信更新失败,需要检查!{}", JSON.toJSONString(r));
}
}
@Override
public Page<UserAdminVo> pageAdmin(PageQuery pageQuery, UserAdminVo bo) {
return baseMapper.pageAdmin(pageQuery.build(), bo);
}
}