修复验证码发送权限问题

This commit is contained in:
2025-08-09 22:12:36 +08:00
parent 3daffdf323
commit 5b4d2afc5a
5 changed files with 136 additions and 88 deletions

View File

@ -1,72 +1,72 @@
package com.greenorange.promotion.controller.course; //package com.greenorange.promotion.controller.course;
//
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; //import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.greenorange.promotion.annotation.RequiresPermission; //import com.greenorange.promotion.annotation.RequiresPermission;
import com.greenorange.promotion.annotation.SysLog; //import com.greenorange.promotion.annotation.SysLog;
import com.greenorange.promotion.common.BaseResponse; //import com.greenorange.promotion.common.BaseResponse;
import com.greenorange.promotion.common.ResultUtils; //import com.greenorange.promotion.common.ResultUtils;
import com.greenorange.promotion.constant.UserConstant; //import com.greenorange.promotion.constant.UserConstant;
import com.greenorange.promotion.model.dto.CommonBatchRequest; //import com.greenorange.promotion.model.dto.CommonBatchRequest;
import com.greenorange.promotion.model.dto.refundRecord.RefundRecordAddRequest; //import com.greenorange.promotion.model.dto.refundRecord.RefundRecordAddRequest;
import com.greenorange.promotion.model.dto.refundRecord.RefundRecordQueryRequest; //import com.greenorange.promotion.model.dto.refundRecord.RefundRecordQueryRequest;
import com.greenorange.promotion.model.dto.refundRecord.RefundRecordUpdateRequest; //import com.greenorange.promotion.model.dto.refundRecord.RefundRecordUpdateRequest;
import com.greenorange.promotion.model.entity.RefundRecord; //import com.greenorange.promotion.model.entity.RefundRecord;
import com.greenorange.promotion.model.vo.refundRecord.RefundRecordVO; //import com.greenorange.promotion.model.vo.refundRecord.RefundRecordVO;
import com.greenorange.promotion.service.common.CommonService; //import com.greenorange.promotion.service.common.CommonService;
import com.greenorange.promotion.service.refund.RefundRecordService; //import com.greenorange.promotion.service.refund.RefundRecordService;
import io.swagger.v3.oas.annotations.Operation; //import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; //import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource; //import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; //import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional; //import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping; //import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; //import org.springframework.web.bind.annotation.RequestBody;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; //import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.greenorange.promotion.model.dto.CommonRequest; //import com.greenorange.promotion.model.dto.CommonRequest;
import jakarta.validation.Valid; //import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.RequestMapping; //import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; //import org.springframework.web.bind.annotation.RestController;
//
import java.util.List; //import java.util.List;
//
//
/** ///**
* 退款记录 控制器 // * 退款记录 控制器
*/ // */
@RestController //@RestController
@RequestMapping("refundRecord") //@RequestMapping("refundRecord")
@Slf4j //@Slf4j
@Tag(name = "退款记录模块") //@Tag(name = "退款记录模块")
@Transactional //@Transactional
public class RefundRecordController { //public class RefundRecordController {
//
@Resource // @Resource
private RefundRecordService refundRecordService; // private RefundRecordService refundRecordService;
//
@Resource // @Resource
private CommonService commonService; // private CommonService commonService;
//
//
/** // /**
* Web端管理员分页查询退款记录 // * Web端管理员分页查询退款记录
* @param refundRecordQueryRequest 退款记录查询请求体 // * @param refundRecordQueryRequest 退款记录查询请求体
* @return 退款记录列表 // * @return 退款记录列表
*/ // */
@PostMapping("page") // @PostMapping("page")
@Operation(summary = "Web端管理员分页查询退款记录", description = "参数退款记录查询请求体权限管理员方法名listRefundRecordByPage") // @Operation(summary = "Web端管理员分页查询退款记录", description = "参数退款记录查询请求体权限管理员方法名listRefundRecordByPage")
@RequiresPermission(mustRole = UserConstant.ADMIN_ROLE) // @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE)
@SysLog(title = "退款记录管理", content = "Web端管理员分页查询退款记录") // @SysLog(title = "退款记录管理", content = "Web端管理员分页查询退款记录")
public BaseResponse<Page<RefundRecordVO>> listRefundRecordByPage(@Valid @RequestBody RefundRecordQueryRequest refundRecordQueryRequest) { // public BaseResponse<Page<RefundRecordVO>> listRefundRecordByPage(@Valid @RequestBody RefundRecordQueryRequest refundRecordQueryRequest) {
long current = refundRecordQueryRequest.getCurrent(); // long current = refundRecordQueryRequest.getCurrent();
long pageSize = refundRecordQueryRequest.getPageSize(); // long pageSize = refundRecordQueryRequest.getPageSize();
QueryWrapper<RefundRecord> queryWrapper = refundRecordService.getQueryWrapper(refundRecordQueryRequest); // QueryWrapper<RefundRecord> queryWrapper = refundRecordService.getQueryWrapper(refundRecordQueryRequest);
Page<RefundRecord> page = refundRecordService.page(new Page<>(current, pageSize), queryWrapper); // Page<RefundRecord> page = refundRecordService.page(new Page<>(current, pageSize), queryWrapper);
List<RefundRecord> refundRecordList = page.getRecords(); // List<RefundRecord> refundRecordList = page.getRecords();
List<RefundRecordVO> refundRecordVOList = commonService.convertList(refundRecordList, RefundRecordVO.class); // List<RefundRecordVO> refundRecordVOList = commonService.convertList(refundRecordList, RefundRecordVO.class);
Page<RefundRecordVO> voPage = new Page<>(current, pageSize); // Page<RefundRecordVO> voPage = new Page<>(current, pageSize);
voPage.setRecords(refundRecordVOList); // voPage.setRecords(refundRecordVOList);
voPage.setPages(page.getPages()); // voPage.setPages(page.getPages());
voPage.setTotal(page.getTotal()); // voPage.setTotal(page.getTotal());
return ResultUtils.success(voPage); // return ResultUtils.success(voPage);
} // }
} //}

View File

@ -119,29 +119,27 @@ public class UserInfoController {
/** /**
* 小程序端用户获取验证码(用于注册) * 小程序端用户获取验证码(用于注册)
* @param commonStringRequest 手机号 * @param verificationCodeGetRequest 验证码获取请求体
* @return 验证码 * @return 验证码
*/ */
@PostMapping("code/register") @PostMapping("code/register")
@Operation(summary = "小程序端用户获取验证码(用于注册)", description = "参数手机号权限管理员boss, admin)方法名getVerificationCodeForRegister") @Operation(summary = "小程序端用户获取验证码(用于注册)", description = "参数手机号权限管理员boss, admin)方法名getVerificationCodeForRegister")
public BaseResponse<String> getVerificationCodeForRegister(@Valid @RequestBody CommonStringRequest commonStringRequest) { public BaseResponse<String> getVerificationCodeForRegister(@Valid @RequestBody VerificationCodeGetRequest verificationCodeGetRequest) {
String phoneNumber = commonStringRequest.getTemplateString(); String verificationCode = userInfoService.getVerificationCodeForRegister(verificationCodeGetRequest);
String verificationCode = userInfoService.getVerificationCodeForRegister(phoneNumber);
return ResultUtils.success(verificationCode); return ResultUtils.success(verificationCode);
} }
/** /**
* 小程序端用户获取验证码(用于密码登录和忘记密码) * 小程序端用户获取验证码(用于密码登录和忘记密码)
* @param commonStringRequest 手机号 * @param verificationCodeGetRequest 验证码获取请求体
* @return 验证码 * @return 验证码
*/ */
@PostMapping("code/pwd") @PostMapping("code/pwd")
@Operation(summary = "小程序端用户获取验证码(用于密码登录和忘记密码)", description = "参数手机号权限管理员boss, admin)方法名getVerificationCode") @Operation(summary = "小程序端用户获取验证码(用于密码登录和忘记密码)", description = "参数手机号权限管理员boss, admin)方法名getVerificationCode")
// @SysLog(title = "用户管理", content = "小程序端用户获取验证码") // @SysLog(title = "用户管理", content = "小程序端用户获取验证码")
public BaseResponse<String> getVerificationCode(@Valid @RequestBody CommonStringRequest commonStringRequest) { public BaseResponse<String> getVerificationCode(@Valid @RequestBody VerificationCodeGetRequest verificationCodeGetRequest) {
String phoneNumber = commonStringRequest.getTemplateString(); String verificationCode = userInfoService.getVerificationCodeForPwdLogin(verificationCodeGetRequest);
String verificationCode = userInfoService.getVerificationCodeForPwdLogin(phoneNumber);
return ResultUtils.success(verificationCode); return ResultUtils.success(verificationCode);
} }

View File

@ -0,0 +1,36 @@
package com.greenorange.promotion.model.dto.userInfo;
import com.greenorange.promotion.annotation.EnumValue;
import com.greenorange.promotion.model.enums.UserRoleEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 验证码发送请求体
*/
@Data
@Schema(description = "验证码发送请求体", requiredProperties = {"phoneNumber", "userRole"})
public class VerificationCodeGetRequest implements Serializable {
/**
* 手机号
*/
@NotBlank(message = "手机号不能为空")
@Schema(description = "手机号", example = "15888610253")
private String phoneNumber;
/**
* 权限
*/
@NotBlank(message = "权限不能为空")
@EnumValue(enumClass = UserRoleEnum.class)
@Schema(description = "权限", example = "user")
private String userRole;
@Serial
private static final long serialVersionUID = 1L;
}

View File

@ -58,13 +58,13 @@ public interface UserInfoService extends IService<UserInfo> {
/** /**
* 小程序用户获取验证码(用于密码登录和忘记密码) * 小程序用户获取验证码(用于密码登录和忘记密码)
*/ */
String getVerificationCodeForPwdLogin(String phoneNumber); String getVerificationCodeForPwdLogin(VerificationCodeGetRequest verificationCodeGetRequest);
/** /**
* 小程序用户获取验证码(用于注册) * 小程序用户获取验证码(用于注册)
*/ */
String getVerificationCodeForRegister(String phoneNumber); String getVerificationCodeForRegister(VerificationCodeGetRequest verificationCodeGetRequest);
/** /**

View File

@ -162,12 +162,20 @@ public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo>
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void userInfoMiniRegister(UserInfoRegisterRequest userInfoRegisterRequest) { public void userInfoMiniRegister(UserInfoRegisterRequest userInfoRegisterRequest) {
String nickName = userInfoRegisterRequest.getNickName();
String phoneNumber = userInfoRegisterRequest.getPhoneNumber(); String phoneNumber = userInfoRegisterRequest.getPhoneNumber();
String verificationCode = userInfoRegisterRequest.getVerificationCode(); String verificationCode = userInfoRegisterRequest.getVerificationCode();
String userRole = userInfoRegisterRequest.getUserRole(); String userRole = userInfoRegisterRequest.getUserRole();
UserRoleEnum userRoleEnum = UserRoleEnum.getEnumByValue(userRole); UserRoleEnum userRoleEnum = UserRoleEnum.getEnumByValue(userRole);
// 校验用户手机号和验证码 // 校验用户手机号和验证码
checkPhoneAndVerificationCode(phoneNumber, verificationCode, userRoleEnum); checkPhoneAndVerificationCode(phoneNumber, verificationCode, userRoleEnum);
// 如果注册主管,校验昵称是否重复
if (UserRoleEnum.SUPERVISOR.equals(userRoleEnum)) {
LambdaQueryWrapper<UserInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(UserInfo::getNickName, nickName).eq(UserInfo::getUserRole, UserConstant.SUPERVISOR_ROLE);
UserInfo userInfo = this.getOne(lambdaQueryWrapper);
ThrowUtils.throwIf(userInfo != null, ErrorCode.OPERATION_ERROR, "昵称重复");
}
// 根据邀请码获得上级用户信息 // 根据邀请码获得上级用户信息
String invitationCode = userInfoRegisterRequest.getInvitationCode(); String invitationCode = userInfoRegisterRequest.getInvitationCode();
@ -312,12 +320,14 @@ public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo>
* 小程序用户获取验证码(用于密码登录和忘记密码) * 小程序用户获取验证码(用于密码登录和忘记密码)
*/ */
@Override @Override
public String getVerificationCodeForPwdLogin(String phoneNumber) { public String getVerificationCodeForPwdLogin(VerificationCodeGetRequest verificationCodeGetRequest) {
String phoneNumber = verificationCodeGetRequest.getPhoneNumber();
String userRole = verificationCodeGetRequest.getUserRole();
ThrowUtils.throwIf(RegexUtils.isPhoneInvalid(phoneNumber), ErrorCode.PARAMS_ERROR, "手机号格式错误"); ThrowUtils.throwIf(RegexUtils.isPhoneInvalid(phoneNumber), ErrorCode.PARAMS_ERROR, "手机号格式错误");
// 判断手机号是否已注册 // 判断手机号是否已注册
LambdaQueryWrapper<UserInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<UserInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(UserInfo::getPhoneNumber, phoneNumber); lambdaQueryWrapper.eq(UserInfo::getPhoneNumber, phoneNumber).eq(UserInfo::getUserRole, userRole);
UserInfo userInfo = this.getOne(lambdaQueryWrapper); UserInfo userInfo = this.getOne(lambdaQueryWrapper);
ThrowUtils.throwIf(userInfo == null, ErrorCode.OPERATION_ERROR, "手机号未注册"); ThrowUtils.throwIf(userInfo == null, ErrorCode.OPERATION_ERROR, "手机号未注册");
@ -332,12 +342,14 @@ public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo>
* 小程序用户获取验证码(用于注册) * 小程序用户获取验证码(用于注册)
*/ */
@Override @Override
public String getVerificationCodeForRegister(String phoneNumber) { public String getVerificationCodeForRegister(VerificationCodeGetRequest verificationCodeGetRequest) {
String phoneNumber = verificationCodeGetRequest.getPhoneNumber();
String userRole = verificationCodeGetRequest.getUserRole();
ThrowUtils.throwIf(RegexUtils.isPhoneInvalid(phoneNumber), ErrorCode.PARAMS_ERROR, "手机号格式错误"); ThrowUtils.throwIf(RegexUtils.isPhoneInvalid(phoneNumber), ErrorCode.PARAMS_ERROR, "手机号格式错误");
// 判断手机号是否已注册 // 判断手机号是否已注册
LambdaQueryWrapper<UserInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<UserInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(UserInfo::getPhoneNumber, phoneNumber); lambdaQueryWrapper.eq(UserInfo::getPhoneNumber, phoneNumber).eq(UserInfo::getUserRole, userRole);
UserInfo userInfo = this.getOne(lambdaQueryWrapper); UserInfo userInfo = this.getOne(lambdaQueryWrapper);
ThrowUtils.throwIf(userInfo != null, ErrorCode.OPERATION_ERROR, "手机号已注册"); ThrowUtils.throwIf(userInfo != null, ErrorCode.OPERATION_ERROR, "手机号已注册");
@ -359,7 +371,9 @@ public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo>
phoneNumberLambdaQueryWrapper.eq(UserInfo::getPhoneNumber, phoneNumber); phoneNumberLambdaQueryWrapper.eq(UserInfo::getPhoneNumber, phoneNumber);
phoneNumberLambdaQueryWrapper = getQueryWrapperByUserRole(userRoleEnum, phoneNumberLambdaQueryWrapper); phoneNumberLambdaQueryWrapper = getQueryWrapperByUserRole(userRoleEnum, phoneNumberLambdaQueryWrapper);
UserInfo userInfo = this.getOne(phoneNumberLambdaQueryWrapper); UserInfo userInfo = this.getOne(phoneNumberLambdaQueryWrapper);
ThrowUtils.throwIf(userInfo != null, ErrorCode.OPERATION_ERROR, "该手机号为"+ userRoleEnum.getText() +"账号"); String userRole = userInfo.getUserRole();
UserRoleEnum currentUserRoleEnum = UserRoleEnum.getEnumByValue(userRole);
ThrowUtils.throwIf(userInfo != null, ErrorCode.OPERATION_ERROR, "该手机号为"+ currentUserRoleEnum.getText() +"账号");
} }
String code = redisTemplate.opsForValue().get(SystemConstant.VERIFICATION_CODE + ":" + verificationCode); String code = redisTemplate.opsForValue().get(SystemConstant.VERIFICATION_CODE + ":" + verificationCode);
ThrowUtils.throwIf(code == null, ErrorCode.OPERATION_ERROR, "验证码已失效"); ThrowUtils.throwIf(code == null, ErrorCode.OPERATION_ERROR, "验证码已失效");
@ -419,7 +433,7 @@ public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo>
// 生成邀请二维码 // 生成邀请二维码
String invitationQrcode = generateInvitationQrcode(myUserInfo.getInvitationCode(), UserRoleEnum.STAFF); String invitationQrcode = generateInvitationQrcode(myUserInfo.getInvitationCode(), UserRoleEnum.STAFF);
UserMainInfo userMainInfo = UserMainInfo.builder().userId(userId).inviteQrCode(invitationQrcode).build(); UserMainInfo userMainInfo = UserMainInfo.builder().userId(myUserInfo.getId()).inviteQrCode(invitationQrcode).build();
userMainInfoService.save(userMainInfo); userMainInfoService.save(userMainInfo);
// // 批量保存当前用户的项目明细抽佣记录和下级用户项目明细抽佣记录 // // 批量保存当前用户的项目明细抽佣记录和下级用户项目明细抽佣记录