Compare commits
4 Commits
b2335d34a5
...
5b4d2afc5a
Author | SHA1 | Date | |
---|---|---|---|
5b4d2afc5a | |||
3daffdf323 | |||
927fab3bdd | |||
f0f2b779f8 |
@ -109,6 +109,7 @@ public class CourseController {
|
|||||||
public BaseResponse<List<CourseCardVO>> miniQueryCourseByKeyword(@Valid @RequestBody CommonStringRequest commonStringRequest) {
|
public BaseResponse<List<CourseCardVO>> miniQueryCourseByKeyword(@Valid @RequestBody CommonStringRequest commonStringRequest) {
|
||||||
String keyword = commonStringRequest.getTemplateString();
|
String keyword = commonStringRequest.getTemplateString();
|
||||||
LambdaQueryWrapper<Course> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<Course> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
lambdaQueryWrapper.eq(Course::getIsShelves, true);
|
||||||
lambdaQueryWrapper.like(Course::getName, keyword);
|
lambdaQueryWrapper.like(Course::getName, keyword);
|
||||||
List<Course> courseList = courseService.list(lambdaQueryWrapper);
|
List<Course> courseList = courseService.list(lambdaQueryWrapper);
|
||||||
List<CourseCardVO> courseCardVOS = commonService.convertList(courseList, CourseCardVO.class);
|
List<CourseCardVO> courseCardVOS = commonService.convertList(courseList, CourseCardVO.class);
|
||||||
|
@ -18,11 +18,9 @@ import com.greenorange.promotion.model.dto.CommonRequest;
|
|||||||
import com.greenorange.promotion.model.dto.courseOrder.CourseOrderAddRequest;
|
import com.greenorange.promotion.model.dto.courseOrder.CourseOrderAddRequest;
|
||||||
import com.greenorange.promotion.model.dto.courseOrder.CourseOrderQueryRequest;
|
import com.greenorange.promotion.model.dto.courseOrder.CourseOrderQueryRequest;
|
||||||
import com.greenorange.promotion.model.dto.courseOrder.CourseOrderUpdateRequest;
|
import com.greenorange.promotion.model.dto.courseOrder.CourseOrderUpdateRequest;
|
||||||
import com.greenorange.promotion.model.entity.Course;
|
import com.greenorange.promotion.model.entity.*;
|
||||||
import com.greenorange.promotion.model.entity.CourseOrder;
|
|
||||||
import com.greenorange.promotion.model.entity.CoursePromotionCommissionPending;
|
|
||||||
import com.greenorange.promotion.model.entity.UserPerformanceSummary;
|
|
||||||
import com.greenorange.promotion.model.enums.CommissionStatusEnum;
|
import com.greenorange.promotion.model.enums.CommissionStatusEnum;
|
||||||
|
import com.greenorange.promotion.model.enums.UserRoleEnum;
|
||||||
import com.greenorange.promotion.model.vo.course.CourseCardVO;
|
import com.greenorange.promotion.model.vo.course.CourseCardVO;
|
||||||
import com.greenorange.promotion.model.vo.course.CourseVO;
|
import com.greenorange.promotion.model.vo.course.CourseVO;
|
||||||
import com.greenorange.promotion.model.vo.courseOrder.CourseOrderBaseInfoVO;
|
import com.greenorange.promotion.model.vo.courseOrder.CourseOrderBaseInfoVO;
|
||||||
@ -93,6 +91,10 @@ public class CourseOrderController {
|
|||||||
@SysLog(title = "课程订单管理", content = "小程序端用户生成课程订单")
|
@SysLog(title = "课程订单管理", content = "小程序端用户生成课程订单")
|
||||||
public BaseResponse<Long> addCourseOrder(@Valid @RequestBody CourseOrderAddRequest courseOrderAddRequest, HttpServletRequest request) {
|
public BaseResponse<Long> addCourseOrder(@Valid @RequestBody CourseOrderAddRequest courseOrderAddRequest, HttpServletRequest request) {
|
||||||
Long userId = (Long) request.getAttribute("userId");
|
Long userId = (Long) request.getAttribute("userId");
|
||||||
|
UserInfo userInfo = userInfoService.getById(userId);
|
||||||
|
String userRole = userInfo.getUserRole();
|
||||||
|
UserRoleEnum userRoleEnum = UserRoleEnum.getEnumByValue(userRole);
|
||||||
|
ThrowUtils.throwIf(!UserRoleEnum.USER.equals(userRoleEnum), ErrorCode.NO_AUTH_ERROR, "只有普通用户才能创建订单");
|
||||||
Long courseId = courseOrderAddRequest.getCourseId();
|
Long courseId = courseOrderAddRequest.getCourseId();
|
||||||
Course course = courseService.getById(courseId);
|
Course course = courseService.getById(courseId);
|
||||||
ThrowUtils.throwIf(course == null, ErrorCode.OPERATION_ERROR, "该课程不存在");
|
ThrowUtils.throwIf(course == null, ErrorCode.OPERATION_ERROR, "该课程不存在");
|
||||||
|
@ -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);
|
||||||
}
|
// }
|
||||||
}
|
//}
|
@ -37,7 +37,7 @@ 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;
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -5,6 +5,7 @@ import cn.binarywang.wx.miniapp.bean.WxMaQrcode;
|
|||||||
import com.auth0.jwt.interfaces.DecodedJWT;
|
import com.auth0.jwt.interfaces.DecodedJWT;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.greenorange.promotion.annotation.RequiresPermission;
|
import com.greenorange.promotion.annotation.RequiresPermission;
|
||||||
import com.greenorange.promotion.annotation.SysLog;
|
import com.greenorange.promotion.annotation.SysLog;
|
||||||
@ -97,33 +98,48 @@ public class UserInfoController {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 小程序端用户修改用户头像
|
||||||
|
* @param commonStringRequest 头像view值
|
||||||
|
* @return 是否修改成功
|
||||||
|
*/
|
||||||
|
@PostMapping("modify/avatar")
|
||||||
|
@Operation(summary = "小程序端用户修改用户头像", description = "参数:头像view值,权限:管理员(boss, admin),方法名:modifyUserAvatar")
|
||||||
|
@RequiresPermission(mustRole = UserConstant.DEFAULT_ROLE)
|
||||||
|
public BaseResponse<Boolean> modifyUserAvatar(@Valid @RequestBody CommonStringRequest commonStringRequest, HttpServletRequest request) {
|
||||||
|
Long userId = (Long) request.getAttribute("userId");
|
||||||
|
String view = commonStringRequest.getTemplateString();
|
||||||
|
LambdaUpdateWrapper<UserInfo> updateWrapper = new LambdaUpdateWrapper<>();
|
||||||
|
updateWrapper.eq(UserInfo::getId, userId).set(UserInfo::getUserAvatar, view);
|
||||||
|
userInfoService.update(updateWrapper);
|
||||||
|
return ResultUtils.success(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 小程序端用户获取验证码(用于注册)
|
* 小程序端用户获取验证码(用于注册)
|
||||||
* @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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
}
|
@ -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);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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();
|
||||||
@ -220,15 +228,26 @@ public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo>
|
|||||||
ThrowUtils.throwIf(RegexUtils.isPhoneInvalid(phoneNumber), ErrorCode.PARAMS_ERROR, "手机号格式无效");
|
ThrowUtils.throwIf(RegexUtils.isPhoneInvalid(phoneNumber), ErrorCode.PARAMS_ERROR, "手机号格式无效");
|
||||||
String userPassword = userInfoMiniPasswordLoginRequest.getUserPassword();
|
String userPassword = userInfoMiniPasswordLoginRequest.getUserPassword();
|
||||||
String userRole = userInfoMiniPasswordLoginRequest.getUserRole();
|
String userRole = userInfoMiniPasswordLoginRequest.getUserRole();
|
||||||
|
UserRoleEnum userRoleEnum = UserRoleEnum.getEnumByValue(userRole);
|
||||||
LambdaQueryWrapper<UserInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<UserInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||||
lambdaQueryWrapper.eq(UserInfo::getPhoneNumber, phoneNumber);
|
if (UserRoleEnum.USER.equals(userRoleEnum)) {
|
||||||
lambdaQueryWrapper.eq(UserInfo::getUserRole, userRole);
|
lambdaQueryWrapper.eq(UserInfo::getUserRole, userRole);
|
||||||
|
lambdaQueryWrapper.eq(UserInfo::getPhoneNumber, phoneNumber);
|
||||||
UserInfo userInfo = this.getOne(lambdaQueryWrapper);
|
UserInfo userInfo = this.getOne(lambdaQueryWrapper);
|
||||||
ThrowUtils.throwIf(userInfo == null, ErrorCode.OPERATION_ERROR, "手机号未注册");
|
ThrowUtils.throwIf(userInfo == null, ErrorCode.OPERATION_ERROR, "手机号未注册");
|
||||||
|
} else {
|
||||||
|
lambdaQueryWrapper.eq(UserInfo::getPhoneNumber, phoneNumber);
|
||||||
|
lambdaQueryWrapper.in(UserInfo::getUserRole, UserRoleEnum.STAFF.getValue(), UserRoleEnum.SUPERVISOR.getValue(), UserRoleEnum.MANAGER.getValue());
|
||||||
|
UserInfo userInfo = this.getOne(lambdaQueryWrapper);
|
||||||
|
ThrowUtils.throwIf(userInfo == null, ErrorCode.OPERATION_ERROR, "手机号未注册");
|
||||||
|
UserRoleEnum currentUserRoleEnum = UserRoleEnum.getEnumByValue(userInfo.getUserRole());
|
||||||
|
ThrowUtils.throwIf(!userRoleEnum.equals(currentUserRoleEnum), ErrorCode.OPERATION_ERROR, "该手机号为" + currentUserRoleEnum.getText() + "账号");
|
||||||
|
}
|
||||||
lambdaQueryWrapper.eq(UserInfo::getUserPassword, userPassword);
|
lambdaQueryWrapper.eq(UserInfo::getUserPassword, userPassword);
|
||||||
userInfo = this.getOne(lambdaQueryWrapper);
|
UserInfo userInfo = this.getOne(lambdaQueryWrapper);
|
||||||
ThrowUtils.throwIf(userInfo == null, ErrorCode.OPERATION_ERROR, "密码不正确");
|
ThrowUtils.throwIf(userInfo == null, ErrorCode.OPERATION_ERROR, "密码不正确");
|
||||||
|
|
||||||
|
|
||||||
Map<String, String> payload = new HashMap<>();
|
Map<String, String> payload = new HashMap<>();
|
||||||
payload.put("userAccount", phoneNumber);
|
payload.put("userAccount", phoneNumber);
|
||||||
payload.put("userPassword", userPassword);
|
payload.put("userPassword", userPassword);
|
||||||
@ -301,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, "手机号未注册");
|
||||||
|
|
||||||
@ -321,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, "手机号已注册");
|
||||||
|
|
||||||
@ -348,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, "手机号已注册");
|
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, "验证码已失效");
|
||||||
@ -408,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);
|
||||||
|
|
||||||
// // 批量保存当前用户的项目明细抽佣记录和下级用户项目明细抽佣记录
|
// // 批量保存当前用户的项目明细抽佣记录和下级用户项目明细抽佣记录
|
||||||
|
@ -33,8 +33,8 @@ public class SendSmsUtil {
|
|||||||
|
|
||||||
// 设置请求参数
|
// 设置请求参数
|
||||||
List<NameValuePair> data = new ArrayList<>();
|
List<NameValuePair> data = new ArrayList<>();
|
||||||
data.add(new BasicNameValuePair("account", "C08121984"));
|
data.add(new BasicNameValuePair("account", "C55991947"));
|
||||||
data.add(new BasicNameValuePair("password", "84a27a879413ec629bf26c5d84a25271"));
|
data.add(new BasicNameValuePair("password", "d3979496a8d9c7e9a322804b7ed187e2"));
|
||||||
data.add(new BasicNameValuePair("mobile", phoneNumber));
|
data.add(new BasicNameValuePair("mobile", phoneNumber));
|
||||||
data.add(new BasicNameValuePair("content", content));
|
data.add(new BasicNameValuePair("content", content));
|
||||||
|
|
||||||
|
@ -1,79 +1,79 @@
|
|||||||
package com.greenorange.promotion.junit;
|
//package com.greenorange.promotion.junit;
|
||||||
|
//
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.greenorange.promotion.model.dto.CommonBatchRequest;
|
//import com.greenorange.promotion.model.dto.CommonBatchRequest;
|
||||||
import com.greenorange.promotion.model.entity.PromoCode;
|
//import com.greenorange.promotion.model.entity.PromoCode;
|
||||||
import com.greenorange.promotion.service.project.impl.PromoCodeServiceImpl;
|
//import com.greenorange.promotion.service.project.impl.PromoCodeServiceImpl;
|
||||||
import org.junit.jupiter.api.Test;
|
//import org.junit.jupiter.api.Test;
|
||||||
import org.junit.jupiter.api.extension.ExtendWith;
|
//import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
import org.mockito.InjectMocks;
|
//import org.mockito.InjectMocks;
|
||||||
import org.mockito.Spy;
|
//import org.mockito.Spy;
|
||||||
import org.mockito.junit.jupiter.MockitoExtension;
|
//import org.mockito.junit.jupiter.MockitoExtension;
|
||||||
|
//
|
||||||
import java.util.Arrays;
|
//import java.util.Arrays;
|
||||||
import java.util.Collections;
|
//import java.util.Collections;
|
||||||
import java.util.List;
|
//import java.util.List;
|
||||||
|
//
|
||||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
//import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
//import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
import static org.mockito.Mockito.*;
|
//import static org.mockito.Mockito.*;
|
||||||
|
//
|
||||||
@ExtendWith(MockitoExtension.class)
|
//@ExtendWith(MockitoExtension.class)
|
||||||
class PromoCodeServiceImplTest {
|
//class PromoCodeServiceImplTest {
|
||||||
|
//
|
||||||
@Spy
|
// @Spy
|
||||||
@InjectMocks
|
// @InjectMocks
|
||||||
private PromoCodeServiceImpl service;
|
// private PromoCodeServiceImpl service;
|
||||||
// Spy + InjectMocks:使用真实的 PromoCodeServiceImpl,但可以 stub 它的 list(...) 和 removeByIds(...)
|
// // Spy + InjectMocks:使用真实的 PromoCodeServiceImpl,但可以 stub 它的 list(...) 和 removeByIds(...)
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
* 当存在状态为“占用”的推广码时,应抛出异常并且不执行删除
|
// * 当存在状态为“占用”的推广码时,应抛出异常并且不执行删除
|
||||||
*/
|
// */
|
||||||
@Test
|
// @Test
|
||||||
void delBatchPromoCode_whenCodesInUse_shouldThrow() {
|
// void delBatchPromoCode_whenCodesInUse_shouldThrow() {
|
||||||
// Arrange
|
// // Arrange
|
||||||
List<Long> ids = Arrays.asList(1L, 2L, 3L);
|
// List<Long> ids = Arrays.asList(1L, 2L, 3L);
|
||||||
CommonBatchRequest req = new CommonBatchRequest();
|
// CommonBatchRequest req = new CommonBatchRequest();
|
||||||
req.setIds(ids);
|
// req.setIds(ids);
|
||||||
|
//
|
||||||
// 模拟 list(...) 返回一个非空列表,表示有正在使用的推广码
|
// // 模拟 list(...) 返回一个非空列表,表示有正在使用的推广码
|
||||||
PromoCode inUse = new PromoCode();
|
// PromoCode inUse = new PromoCode();
|
||||||
inUse.setId(2L);
|
// inUse.setId(2L);
|
||||||
inUse.setPromoCodeStatus(true);
|
// inUse.setPromoCodeStatus(true);
|
||||||
doReturn(Collections.singletonList(inUse))
|
// doReturn(Collections.singletonList(inUse))
|
||||||
.when(service).list(any(LambdaQueryWrapper.class));
|
// .when(service).list(any(LambdaQueryWrapper.class));
|
||||||
|
//
|
||||||
// Act & Assert
|
// // Act & Assert
|
||||||
RuntimeException ex = assertThrows(RuntimeException.class,
|
// RuntimeException ex = assertThrows(RuntimeException.class,
|
||||||
() -> service.delBatchPromoCode(req));
|
// () -> service.delBatchPromoCode(req));
|
||||||
assertTrue(ex.getMessage().contains("当前推广码正在使用中"));
|
// assertTrue(ex.getMessage().contains("当前推广码正在使用中"));
|
||||||
|
//
|
||||||
// 验证 removeByIds(...) 从未被调用
|
// // 验证 removeByIds(...) 从未被调用
|
||||||
verify(service, never()).removeByIds(anyList());
|
// verify(service, never()).removeByIds(anyList());
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
* 当所有推广码都未被占用时,应正常调用 removeByIds 删除
|
// * 当所有推广码都未被占用时,应正常调用 removeByIds 删除
|
||||||
*/
|
// */
|
||||||
@Test
|
// @Test
|
||||||
void delBatchPromoCode_whenNoCodesInUse_shouldRemove() {
|
// void delBatchPromoCode_whenNoCodesInUse_shouldRemove() {
|
||||||
// Arrange
|
// // Arrange
|
||||||
List<Long> ids = Arrays.asList(4L, 5L);
|
// List<Long> ids = Arrays.asList(4L, 5L);
|
||||||
CommonBatchRequest req = new CommonBatchRequest();
|
// CommonBatchRequest req = new CommonBatchRequest();
|
||||||
req.setIds(ids);
|
// req.setIds(ids);
|
||||||
|
//
|
||||||
// 模拟 list(...) 返回空列表,表示无任何占用的推广码
|
// // 模拟 list(...) 返回空列表,表示无任何占用的推广码
|
||||||
doReturn(Collections.emptyList())
|
// doReturn(Collections.emptyList())
|
||||||
.when(service).list(any(LambdaQueryWrapper.class));
|
// .when(service).list(any(LambdaQueryWrapper.class));
|
||||||
|
//
|
||||||
// 模拟 removeByIds(...) 返回 true,表示删除成功
|
// // 模拟 removeByIds(...) 返回 true,表示删除成功
|
||||||
doReturn(true).when(service).removeByIds(ids);
|
// doReturn(true).when(service).removeByIds(ids);
|
||||||
|
//
|
||||||
// Act
|
// // Act
|
||||||
service.delBatchPromoCode(req);
|
// service.delBatchPromoCode(req);
|
||||||
|
//
|
||||||
// Assert
|
// // Assert
|
||||||
// 验证 removeByIds(...) 被调用一次,且参数正是传入的 ids
|
// // 验证 removeByIds(...) 被调用一次,且参数正是传入的 ids
|
||||||
verify(service, times(1)).removeByIds(ids);
|
// verify(service, times(1)).removeByIds(ids);
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
@ -1,96 +1,96 @@
|
|||||||
package com.greenorange.promotion.junit;
|
//package com.greenorange.promotion.junit;
|
||||||
|
//
|
||||||
import com.greenorange.promotion.model.dto.userAccount.UserAccountUpdateRequest;
|
//import com.greenorange.promotion.model.dto.userAccount.UserAccountUpdateRequest;
|
||||||
import com.greenorange.promotion.model.entity.UserAccount;
|
//import com.greenorange.promotion.model.entity.UserAccount;
|
||||||
import com.greenorange.promotion.service.common.CommonService;
|
//import com.greenorange.promotion.service.common.CommonService;
|
||||||
import com.greenorange.promotion.service.settle.impl.UserAccountServiceImpl;
|
//import com.greenorange.promotion.service.settle.impl.UserAccountServiceImpl;
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
//import jakarta.servlet.http.HttpServletRequest;
|
||||||
import org.junit.jupiter.api.Test;
|
//import org.junit.jupiter.api.Test;
|
||||||
import org.junit.jupiter.api.extension.ExtendWith;
|
//import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
import org.mockito.ArgumentCaptor;
|
//import org.mockito.ArgumentCaptor;
|
||||||
import org.mockito.InjectMocks;
|
//import org.mockito.InjectMocks;
|
||||||
import org.mockito.Mock;
|
//import org.mockito.Mock;
|
||||||
import org.mockito.Spy;
|
//import org.mockito.Spy;
|
||||||
import org.mockito.junit.jupiter.MockitoExtension;
|
//import org.mockito.junit.jupiter.MockitoExtension;
|
||||||
|
//
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
//import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertSame;
|
//import static org.junit.jupiter.api.Assertions.assertSame;
|
||||||
import static org.mockito.Mockito.*;
|
//import static org.mockito.Mockito.*;
|
||||||
|
//
|
||||||
@ExtendWith(MockitoExtension.class)
|
//@ExtendWith(MockitoExtension.class)
|
||||||
class UserAccountServiceImplTest {
|
//class UserAccountServiceImplTest {
|
||||||
|
//
|
||||||
@Spy
|
// @Spy
|
||||||
@InjectMocks
|
// @InjectMocks
|
||||||
private UserAccountServiceImpl userAccountService;
|
// private UserAccountServiceImpl userAccountService;
|
||||||
// Spy + InjectMocks:用真实的 serviceImpl,但可以对它的方法做部分 stub
|
// // Spy + InjectMocks:用真实的 serviceImpl,但可以对它的方法做部分 stub
|
||||||
|
//
|
||||||
@Mock
|
// @Mock
|
||||||
private CommonService commonService;
|
// private CommonService commonService;
|
||||||
// Mock CommonService,用于模拟 copyProperties
|
// // Mock CommonService,用于模拟 copyProperties
|
||||||
|
//
|
||||||
@Mock
|
// @Mock
|
||||||
private HttpServletRequest request;
|
// private HttpServletRequest request;
|
||||||
// Mock HttpServletRequest,用于模拟获取 userId
|
// // Mock HttpServletRequest,用于模拟获取 userId
|
||||||
|
//
|
||||||
@Test
|
// @Test
|
||||||
void updateUserAccount_shouldCopyProperties_setUserId_andUpdateById() {
|
// void updateUserAccount_shouldCopyProperties_setUserId_andUpdateById() {
|
||||||
// --- Arrange 准备阶段 ---
|
// // --- Arrange 准备阶段 ---
|
||||||
Long userId = 456L;
|
// Long userId = 456L;
|
||||||
// 模拟从 request 中拿到当前登录用户 ID
|
// // 模拟从 request 中拿到当前登录用户 ID
|
||||||
when(request.getAttribute("userId")).thenReturn(userId);
|
// when(request.getAttribute("userId")).thenReturn(userId);
|
||||||
|
//
|
||||||
// 构造更新请求 DTO,并设置要更新的账户 ID
|
// // 构造更新请求 DTO,并设置要更新的账户 ID
|
||||||
UserAccountUpdateRequest req = new UserAccountUpdateRequest();
|
// UserAccountUpdateRequest req = new UserAccountUpdateRequest();
|
||||||
req.setId(99L);
|
// req.setId(99L);
|
||||||
req.setCardHolder("李四");
|
// req.setCardHolder("李四");
|
||||||
req.setIdCardNumber("110101199002022345");
|
// req.setIdCardNumber("110101199002022345");
|
||||||
req.setPhoneNumber("15900001111");
|
// req.setPhoneNumber("15900001111");
|
||||||
req.setBankCardNumber("6222020202020202");
|
// req.setBankCardNumber("6222020202020202");
|
||||||
req.setOpenBank("中国农业银行");
|
// req.setOpenBank("中国农业银行");
|
||||||
|
//
|
||||||
// 准备一个空实体,模拟 commonService.copyProperties 拷贝结果
|
// // 准备一个空实体,模拟 commonService.copyProperties 拷贝结果
|
||||||
UserAccount stubEntity = new UserAccount();
|
// UserAccount stubEntity = new UserAccount();
|
||||||
// 假设 copyProperties 会拷贝所有字段,包括 id
|
// // 假设 copyProperties 会拷贝所有字段,包括 id
|
||||||
stubEntity.setId(req.getId());
|
// stubEntity.setId(req.getId());
|
||||||
stubEntity.setCardHolder(req.getCardHolder());
|
// stubEntity.setCardHolder(req.getCardHolder());
|
||||||
stubEntity.setIdCardNumber(req.getIdCardNumber());
|
// stubEntity.setIdCardNumber(req.getIdCardNumber());
|
||||||
stubEntity.setPhoneNumber(req.getPhoneNumber());
|
// stubEntity.setPhoneNumber(req.getPhoneNumber());
|
||||||
stubEntity.setBankCardNumber(req.getBankCardNumber());
|
// stubEntity.setBankCardNumber(req.getBankCardNumber());
|
||||||
stubEntity.setOpenBank(req.getOpenBank());
|
// stubEntity.setOpenBank(req.getOpenBank());
|
||||||
// stub copyProperties 返回我们准备的 stubEntity
|
// // stub copyProperties 返回我们准备的 stubEntity
|
||||||
when(commonService.copyProperties(req, UserAccount.class))
|
// when(commonService.copyProperties(req, UserAccount.class))
|
||||||
.thenReturn(stubEntity);
|
// .thenReturn(stubEntity);
|
||||||
|
//
|
||||||
// 对 Spy 的 updateById(...) 方法做 stub,避免走到 MyBatis-Plus 真逻辑
|
// // 对 Spy 的 updateById(...) 方法做 stub,避免走到 MyBatis-Plus 真逻辑
|
||||||
doReturn(true).when(userAccountService).updateById(any(UserAccount.class));
|
// doReturn(true).when(userAccountService).updateById(any(UserAccount.class));
|
||||||
|
//
|
||||||
// --- Act 执行阶段 ---
|
// // --- Act 执行阶段 ---
|
||||||
userAccountService.updateUserAccount(req, request);
|
// userAccountService.updateUserAccount(req, request);
|
||||||
// 方法内部执行顺序:
|
// // 方法内部执行顺序:
|
||||||
// 1. 取 request.getAttribute("userId") -> 456L
|
// // 1. 取 request.getAttribute("userId") -> 456L
|
||||||
// 2. commonService.copyProperties(req, UserAccount.class) -> stubEntity
|
// // 2. commonService.copyProperties(req, UserAccount.class) -> stubEntity
|
||||||
// 3. stubEntity.setUserId(456L)
|
// // 3. stubEntity.setUserId(456L)
|
||||||
// 4. 调用 updateById(stubEntity)
|
// // 4. 调用 updateById(stubEntity)
|
||||||
|
//
|
||||||
// --- Assert 验证阶段 ---
|
// // --- Assert 验证阶段 ---
|
||||||
// 捕获 updateById 调用时传入的参数
|
// // 捕获 updateById 调用时传入的参数
|
||||||
ArgumentCaptor<UserAccount> captor = ArgumentCaptor.forClass(UserAccount.class);
|
// ArgumentCaptor<UserAccount> captor = ArgumentCaptor.forClass(UserAccount.class);
|
||||||
verify(userAccountService).updateById(captor.capture());
|
// verify(userAccountService).updateById(captor.capture());
|
||||||
UserAccount updated = captor.getValue();
|
// UserAccount updated = captor.getValue();
|
||||||
|
//
|
||||||
// 验证传给 updateById 的正是 stubEntity 对象
|
// // 验证传给 updateById 的正是 stubEntity 对象
|
||||||
assertSame(stubEntity, updated, "应该传入同一个 stubEntity 实例");
|
// assertSame(stubEntity, updated, "应该传入同一个 stubEntity 实例");
|
||||||
|
//
|
||||||
// 验证 userId 已正确赋值
|
// // 验证 userId 已正确赋值
|
||||||
assertEquals(userId, updated.getUserId(), "userId 应该从 request 中取出并赋值");
|
// assertEquals(userId, updated.getUserId(), "userId 应该从 request 中取出并赋值");
|
||||||
|
//
|
||||||
// 验证其他字段都被 copyProperties 拷贝过来,包括账户 ID
|
// // 验证其他字段都被 copyProperties 拷贝过来,包括账户 ID
|
||||||
assertEquals(req.getId(), updated.getId(), "账户 ID 应保持一致");
|
// assertEquals(req.getId(), updated.getId(), "账户 ID 应保持一致");
|
||||||
assertEquals("李四", updated.getCardHolder(), "持卡人应一致");
|
// assertEquals("李四", updated.getCardHolder(), "持卡人应一致");
|
||||||
assertEquals("110101199002022345", updated.getIdCardNumber(), "身份证号应一致");
|
// assertEquals("110101199002022345", updated.getIdCardNumber(), "身份证号应一致");
|
||||||
assertEquals("15900001111", updated.getPhoneNumber(), "手机号应一致");
|
// assertEquals("15900001111", updated.getPhoneNumber(), "手机号应一致");
|
||||||
assertEquals("6222020202020202", updated.getBankCardNumber(),"银行卡号应一致");
|
// assertEquals("6222020202020202", updated.getBankCardNumber(),"银行卡号应一致");
|
||||||
assertEquals("中国农业银行", updated.getOpenBank(), "开户银行应一致");
|
// assertEquals("中国农业银行", updated.getOpenBank(), "开户银行应一致");
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
@ -1,103 +1,103 @@
|
|||||||
package com.greenorange.promotion.junit;
|
//package com.greenorange.promotion.junit;
|
||||||
|
//
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.greenorange.promotion.model.dto.userInfo.UserInfoMiniPasswordLoginRequest;
|
//import com.greenorange.promotion.model.dto.userInfo.UserInfoMiniPasswordLoginRequest;
|
||||||
import com.greenorange.promotion.model.entity.UserInfo;
|
//import com.greenorange.promotion.model.entity.UserInfo;
|
||||||
import com.greenorange.promotion.service.userInfo.impl.UserInfoServiceImpl;
|
//import com.greenorange.promotion.service.userInfo.impl.UserInfoServiceImpl;
|
||||||
import com.greenorange.promotion.utils.JWTUtils;
|
//import com.greenorange.promotion.utils.JWTUtils;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
//import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
//import org.junit.jupiter.api.Test;
|
||||||
import org.junit.jupiter.api.extension.ExtendWith;
|
//import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
import org.mockito.*;
|
//import org.mockito.*;
|
||||||
import org.mockito.junit.jupiter.MockitoExtension;
|
//import org.mockito.junit.jupiter.MockitoExtension;
|
||||||
|
//
|
||||||
import java.util.Map;
|
//import java.util.Map;
|
||||||
|
//
|
||||||
import static org.junit.jupiter.api.Assertions.*;
|
//import static org.junit.jupiter.api.Assertions.*;
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
//import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.Mockito.*;
|
//import static org.mockito.Mockito.*;
|
||||||
|
//
|
||||||
@ExtendWith(MockitoExtension.class)
|
//@ExtendWith(MockitoExtension.class)
|
||||||
class UserInfoServiceImplTest {
|
//class UserInfoServiceImplTest {
|
||||||
|
//
|
||||||
@Spy
|
// @Spy
|
||||||
@InjectMocks
|
// @InjectMocks
|
||||||
private UserInfoServiceImpl userService; // 真实的 ServiceImpl,部分方法用 spy
|
// private UserInfoServiceImpl userService; // 真实的 ServiceImpl,部分方法用 spy
|
||||||
|
//
|
||||||
@Mock
|
// @Mock
|
||||||
private JWTUtils jwtUtils; // 用来生成 token 的工具
|
// private JWTUtils jwtUtils; // 用来生成 token 的工具
|
||||||
|
//
|
||||||
@BeforeEach
|
// @BeforeEach
|
||||||
void setUp() {
|
// void setUp() {
|
||||||
// MockitoAnnotations.openMocks(this); // @ExtendWith 已自动初始化
|
// // MockitoAnnotations.openMocks(this); // @ExtendWith 已自动初始化
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
private UserInfoMiniPasswordLoginRequest buildRequest(String phone, String pwd) {
|
// private UserInfoMiniPasswordLoginRequest buildRequest(String phone, String pwd) {
|
||||||
UserInfoMiniPasswordLoginRequest req = new UserInfoMiniPasswordLoginRequest();
|
// UserInfoMiniPasswordLoginRequest req = new UserInfoMiniPasswordLoginRequest();
|
||||||
req.setPhoneNumber(phone);
|
// req.setPhoneNumber(phone);
|
||||||
req.setUserPassword(pwd);
|
// req.setUserPassword(pwd);
|
||||||
return req;
|
// return req;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
/** 1. 手机号格式无效,应直接抛参数错误 */
|
// /** 1. 手机号格式无效,应直接抛参数错误 */
|
||||||
@Test
|
// @Test
|
||||||
void givenInvalidPhone_whenLoginByPwd_thenThrow() {
|
// void givenInvalidPhone_whenLoginByPwd_thenThrow() {
|
||||||
UserInfoMiniPasswordLoginRequest req = buildRequest("not-a-phone", "whatever");
|
// UserInfoMiniPasswordLoginRequest req = buildRequest("not-a-phone", "whatever");
|
||||||
assertThrows(RuntimeException.class, () -> userService.userInfoMiniLoginByPwd(req));
|
// assertThrows(RuntimeException.class, () -> userService.userInfoMiniLoginByPwd(req));
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
/** 2. 手机号未注册,应抛操作错误 */
|
// /** 2. 手机号未注册,应抛操作错误 */
|
||||||
@Test
|
// @Test
|
||||||
void givenUnregisteredPhone_whenLoginByPwd_thenThrow() {
|
// void givenUnregisteredPhone_whenLoginByPwd_thenThrow() {
|
||||||
// stub 第一次 getOne(...) 返回 null
|
// // stub 第一次 getOne(...) 返回 null
|
||||||
doReturn(null)
|
// doReturn(null)
|
||||||
.when(userService).getOne(any(LambdaQueryWrapper.class));
|
// .when(userService).getOne(any(LambdaQueryWrapper.class));
|
||||||
|
//
|
||||||
UserInfoMiniPasswordLoginRequest req = buildRequest("13812345678", "pwd");
|
// UserInfoMiniPasswordLoginRequest req = buildRequest("13812345678", "pwd");
|
||||||
assertThrows(RuntimeException.class, () -> userService.userInfoMiniLoginByPwd(req));
|
// assertThrows(RuntimeException.class, () -> userService.userInfoMiniLoginByPwd(req));
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
/** 3. 密码不正确,应抛操作错误 */
|
// /** 3. 密码不正确,应抛操作错误 */
|
||||||
@Test
|
// @Test
|
||||||
void givenWrongPassword_whenLoginByPwd_thenThrow() {
|
// void givenWrongPassword_whenLoginByPwd_thenThrow() {
|
||||||
UserInfo dummy = new UserInfo();
|
// UserInfo dummy = new UserInfo();
|
||||||
dummy.setPhoneNumber("13812345678");
|
// dummy.setPhoneNumber("13812345678");
|
||||||
dummy.setUserPassword("rightPwd");
|
// dummy.setUserPassword("rightPwd");
|
||||||
|
//
|
||||||
// stub 第一次 getOne(...) 返回非 null(手机号存在)
|
// // stub 第一次 getOne(...) 返回非 null(手机号存在)
|
||||||
// stub 第二次 getOne(...) 返回 null(密码校验失败)
|
// // stub 第二次 getOne(...) 返回 null(密码校验失败)
|
||||||
doReturn(dummy, null)
|
// doReturn(dummy, null)
|
||||||
.when(userService).getOne(any(LambdaQueryWrapper.class));
|
// .when(userService).getOne(any(LambdaQueryWrapper.class));
|
||||||
|
//
|
||||||
UserInfoMiniPasswordLoginRequest req = buildRequest("13812345678", "wrongPwd");
|
// UserInfoMiniPasswordLoginRequest req = buildRequest("13812345678", "wrongPwd");
|
||||||
assertThrows(RuntimeException.class, () -> userService.userInfoMiniLoginByPwd(req));
|
// assertThrows(RuntimeException.class, () -> userService.userInfoMiniLoginByPwd(req));
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
/** 4. 成功场景:正确手机号 + 密码,返回 token,并验证 jwtUtils 调用 */
|
// /** 4. 成功场景:正确手机号 + 密码,返回 token,并验证 jwtUtils 调用 */
|
||||||
@Test
|
// @Test
|
||||||
void givenValidCredentials_whenLoginByPwd_thenReturnToken() {
|
// void givenValidCredentials_whenLoginByPwd_thenReturnToken() {
|
||||||
UserInfo dummy = new UserInfo();
|
// UserInfo dummy = new UserInfo();
|
||||||
dummy.setPhoneNumber("13812345678");
|
// dummy.setPhoneNumber("13812345678");
|
||||||
dummy.setUserPassword("rightPwd");
|
// dummy.setUserPassword("rightPwd");
|
||||||
|
//
|
||||||
// stub getOne(...) 两次都返回同一个 dummy(表示手机号存在且密码正确)
|
// // stub getOne(...) 两次都返回同一个 dummy(表示手机号存在且密码正确)
|
||||||
doReturn(dummy, dummy)
|
// doReturn(dummy, dummy)
|
||||||
.when(userService).getOne(any(LambdaQueryWrapper.class));
|
// .when(userService).getOne(any(LambdaQueryWrapper.class));
|
||||||
|
//
|
||||||
// stub jwtUtils.generateToken(...)
|
// // stub jwtUtils.generateToken(...)
|
||||||
String expectedToken = "jwt-token-xyz";
|
// String expectedToken = "jwt-token-xyz";
|
||||||
when(jwtUtils.generateToken(anyMap())).thenReturn(expectedToken);
|
// when(jwtUtils.generateToken(anyMap())).thenReturn(expectedToken);
|
||||||
|
//
|
||||||
UserInfoMiniPasswordLoginRequest req = buildRequest("13812345678", "rightPwd");
|
// UserInfoMiniPasswordLoginRequest req = buildRequest("13812345678", "rightPwd");
|
||||||
String token = userService.userInfoMiniLoginByPwd(req);
|
// String token = userService.userInfoMiniLoginByPwd(req);
|
||||||
|
//
|
||||||
assertEquals(expectedToken, token);
|
// assertEquals(expectedToken, token);
|
||||||
|
//
|
||||||
// 验证 payload 内容正确
|
// // 验证 payload 内容正确
|
||||||
ArgumentCaptor<Map<String, String>> captor = ArgumentCaptor.forClass(Map.class);
|
// ArgumentCaptor<Map<String, String>> captor = ArgumentCaptor.forClass(Map.class);
|
||||||
verify(jwtUtils, times(1)).generateToken(captor.capture());
|
// verify(jwtUtils, times(1)).generateToken(captor.capture());
|
||||||
Map<String, String> payload = captor.getValue();
|
// Map<String, String> payload = captor.getValue();
|
||||||
assertEquals("13812345678", payload.get("userAccount"));
|
// assertEquals("13812345678", payload.get("userAccount"));
|
||||||
assertEquals("rightPwd", payload.get("userPassword"));
|
// assertEquals("rightPwd", payload.get("userPassword"));
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
Reference in New Issue
Block a user