This commit is contained in:
张良(004796)
2024-03-12 15:27:05 +08:00
parent 2bd2871df0
commit 7bc31dc69e
22 changed files with 298 additions and 90 deletions

View File

@@ -13,6 +13,7 @@ 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.UserAuth;
import com.ruoyi.xq.dto.admin.user.UserAuthAdminVo;
import com.ruoyi.xq.service.UserAuthService;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
@@ -41,8 +42,8 @@ public class UserAuthController extends BaseController {
*/
@SaCheckPermission("xq:userAuth:list")
@GetMapping("/list")
public TableDataInfo<UserAuth> list(UserAuth bo, PageQuery pageQuery) {
Page<UserAuth> page = userAuthService.page(pageQuery.build(), Wrappers.lambdaQuery(bo));
public TableDataInfo<UserAuthAdminVo> list(UserAuthAdminVo bo, PageQuery pageQuery) {
Page<UserAuthAdminVo> page = userAuthService.pageApp(pageQuery, bo);
return TableDataInfo.build(page);
}

View File

@@ -15,12 +15,15 @@ import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.xq.domain.User;
import com.ruoyi.xq.service.UserService;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
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;
import java.util.List;
import java.util.stream.Collectors;
/**
* 用户管理
@@ -46,6 +49,22 @@ public class UserController extends BaseController {
return TableDataInfo.build(page);
}
@GetMapping("/getByUsercode")
public R<User> getByUsercode(String usercode){
return R.ok(userService.getByUsercode(usercode));
}
@GetMapping("/listByUserCode")
public R<List<String>> listByUserCode(String usercode, int limit){
if(limit == 0){
limit = 40;
}
List<User> users = userService.list(Wrappers.lambdaQuery(User.class)
.select(User::getUsercode)
.like(StringUtils.isNotEmpty(usercode), User::getUsercode, usercode)
.last("limit " + limit));
return R.ok(users.stream().map(User::getUsercode).collect(Collectors.toList()));
}
/**
* 获取用户管理详细信息

View File

@@ -12,7 +12,11 @@ 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.User;
import com.ruoyi.xq.domain.UserVip;
import com.ruoyi.xq.dto.admin.user.UserVipAdminVo;
import com.ruoyi.xq.dto.admin.user.req.AddVipReq;
import com.ruoyi.xq.service.UserService;
import com.ruoyi.xq.service.UserVipService;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
@@ -35,14 +39,15 @@ import java.util.Arrays;
public class UserVipController extends BaseController {
private final UserVipService userVipService;
private final UserService userService;
/**
* 查询VIP用户列表
*/
@SaCheckPermission("xq:userVip:list")
@GetMapping("/list")
public TableDataInfo<UserVip> list(UserVip bo, PageQuery pageQuery) {
Page<UserVip> page = userVipService.page(pageQuery.build(), Wrappers.lambdaQuery(bo));
public TableDataInfo<UserVipAdminVo> list(UserVipAdminVo bo, PageQuery pageQuery) {
Page<UserVipAdminVo> page = userVipService.pageApp(pageQuery, bo);
return TableDataInfo.build(page);
}
@@ -58,38 +63,28 @@ public class UserVipController extends BaseController {
return R.ok(userVipService.getById(id));
}
/**
* 新增VIP用户
*/
@SaCheckPermission("xq:userVip:add")
@Log(title = "VIP用户", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody UserVip bo) {
return toAjax(userVipService.save(bo));
}
/**
* 修改VIP用户
*/
@SaCheckPermission("xq:userVip:edit")
@Log(title = "VIP用户", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody UserVip bo) {
return toAjax(userVipService.updateById(bo));
@PostMapping("/addVip")
public R<Void> addVip(@RequestBody AddVipReq bo) {
User user = userService.getByUsercode(bo.getUsercode());
if(user == null){
return R.fail("用户不存在!");
}
userVipService.updateVipOrderAdmin(bo,user);
return R.ok();
}
/**
* 删除VIP用户
*
* @param ids 主键串
*/
@SaCheckPermission("xq:userVip:remove")
@Log(title = "VIP用户", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(userVipService.removeBatchByIds(Arrays.asList(ids)));
@DeleteMapping("/{id}")
public R<Void> remove(@NotNull(message = "主键不能为空") @PathVariable Long id) {
userVipService.removeVip(id);
return R.ok();
}
}

View File

@@ -13,6 +13,7 @@ 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.VipOrder;
import com.ruoyi.xq.dto.admin.vipOrder.VipOrderAdminVo;
import com.ruoyi.xq.service.VipOrderService;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
@@ -41,8 +42,8 @@ public class VipOrderController extends BaseController {
*/
@SaCheckPermission("xq:vipOrder:list")
@GetMapping("/list")
public TableDataInfo<VipOrder> list(VipOrder bo, PageQuery pageQuery) {
Page<VipOrder> page = vipOrderService.page(pageQuery.build(), Wrappers.lambdaQuery(bo));
public TableDataInfo<VipOrderAdminVo> list(VipOrderAdminVo bo, PageQuery pageQuery) {
Page<VipOrderAdminVo> page = vipOrderService.pageApp(pageQuery, bo);
return TableDataInfo.build(page);
}

View File

@@ -41,6 +41,10 @@ public class VipOrder implements Serializable {
* 1-普通会员 2-黄金会员 3-钻石会员
*/
private Integer vipType;
/**
* 开通月份
*/
private Integer vipMonth;
/**
* 1-月卡 2-季卡 3-年卡
*/
@@ -81,7 +85,7 @@ public class VipOrder implements Serializable {
/**
* 是否为后台管理新增
*/
private String admin;
private Boolean admin;
/**
* 后台操作管理员ID
*/

View File

@@ -0,0 +1,15 @@
package com.ruoyi.xq.dto.admin.user;
import com.ruoyi.xq.domain.UserAuth;
import lombok.Data;
@Data
public class UserAuthAdminVo extends UserAuth {
/**
* 昵称
*/
private String nickname;
private String mobile;
private String avatar;
}

View File

@@ -0,0 +1,15 @@
package com.ruoyi.xq.dto.admin.user;
import com.ruoyi.xq.domain.UserVip;
import lombok.Data;
@Data
public class UserVipAdminVo extends UserVip {
/**
* 昵称
*/
private String nickname;
private String mobile;
private String avatar;
}

View File

@@ -0,0 +1,10 @@
package com.ruoyi.xq.dto.admin.user.req;
import lombok.Data;
@Data
public class AddVipReq {
private String usercode;
private Integer openVipType;
private Integer openVipMonthNum;
}

View File

@@ -0,0 +1,12 @@
package com.ruoyi.xq.dto.admin.vipOrder;
import com.ruoyi.xq.domain.VipOrder;
import lombok.Data;
@Data
public class VipOrderAdminVo extends VipOrder {
private String nickname;
private String mobile;
private String avatar;
}

View File

@@ -1,13 +1,14 @@
package com.ruoyi.xq.enums.vip;
import lombok.Getter;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.Arrays;
@Getter
public enum VipTypeEnum {
ONE(1,"一级会员"),
TWO(2,"二级会员"),
THREE(3,"三级会员"),
ONE(1,"普通会员"),
TWO(2,"黄金会员"),
THREE(3,"钻石会员"),
;
private final Integer code;
private final String text;
@@ -16,4 +17,8 @@ public enum VipTypeEnum {
this.code = code;
this.text = text;
}
public static VipTypeEnum getByCode(Integer code){
return Arrays.stream(VipTypeEnum.values()).filter(i -> i.getCode().equals(code)).findFirst().orElse(null);
}
}

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.UserAuth;
import com.ruoyi.xq.dto.admin.user.UserAuthAdminVo;
import org.apache.ibatis.annotations.Param;
/**
* 用户认证管理Mapper接口
@@ -11,4 +14,5 @@ import com.ruoyi.xq.domain.UserAuth;
*/
public interface UserAuthMapper extends BaseMapper<UserAuth> {
Page<UserAuthAdminVo> pageApp(@Param("build") Page<Object> build, @Param("bo") UserAuthAdminVo bo);
}

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.UserVip;
import com.ruoyi.xq.dto.admin.user.UserVipAdminVo;
import org.apache.ibatis.annotations.Param;
/**
* VIP用户Mapper接口
@@ -11,4 +14,5 @@ import com.ruoyi.xq.domain.UserVip;
*/
public interface UserVipMapper extends BaseMapper<UserVip> {
Page<UserVipAdminVo> pageApp(@Param("build") Page<Object> build, @Param("bo") UserVipAdminVo bo);
}

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.VipOrder;
import com.ruoyi.xq.dto.admin.vipOrder.VipOrderAdminVo;
import org.apache.ibatis.annotations.Param;
/**
* VIP订单Mapper接口
@@ -11,4 +14,5 @@ import com.ruoyi.xq.domain.VipOrder;
*/
public interface VipOrderMapper extends BaseMapper<VipOrder> {
Page<VipOrderAdminVo> pageApp(@Param("build") Page<Object> build, @Param("bo") VipOrderAdminVo bo);
}

View File

@@ -1,7 +1,10 @@
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.UserAuth;
import com.ruoyi.xq.dto.admin.user.UserAuthAdminVo;
/**
* 用户认证管理Service接口
@@ -11,4 +14,6 @@ import com.ruoyi.xq.domain.UserAuth;
*/
public interface UserAuthService extends IService<UserAuth> {
UserAuth getByUserId(Long userId);
Page<UserAuthAdminVo> pageApp(PageQuery pageQuery, UserAuthAdminVo bo);
}

View File

@@ -1,8 +1,13 @@
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.domain.UserVip;
import com.ruoyi.xq.domain.VipOrder;
import com.ruoyi.xq.dto.admin.user.UserVipAdminVo;
import com.ruoyi.xq.dto.admin.user.req.AddVipReq;
/**
* VIP用户Service接口
@@ -18,4 +23,11 @@ public interface UserVipService extends IService<UserVip> {
UserVip getByUserVipMaster(Long userId);
void updateVipOrderAdmin(AddVipReq bo, User user);
void incsVip(User user, Integer vipType, Integer vipMonth);
Page<UserVipAdminVo> pageApp(PageQuery pageQuery, UserVipAdminVo bo);
void removeVip(Long id);
}

View File

@@ -1,7 +1,10 @@
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.VipOrder;
import com.ruoyi.xq.dto.admin.vipOrder.VipOrderAdminVo;
/**
* VIP订单Service接口
@@ -11,4 +14,6 @@ import com.ruoyi.xq.domain.VipOrder;
*/
public interface VipOrderService extends IService<VipOrder> {
VipOrder createVipOrder(Long userId, Long vipPriceSettingId);
Page<VipOrderAdminVo> pageApp(PageQuery pageQuery, VipOrderAdminVo bo);
}

View File

@@ -1,8 +1,11 @@
package com.ruoyi.xq.service.impl;
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.xq.domain.UserAuth;
import com.ruoyi.xq.dto.admin.user.UserAuthAdminVo;
import com.ruoyi.xq.mapper.UserAuthMapper;
import com.ruoyi.xq.service.UserAuthService;
import org.springframework.stereotype.Service;
@@ -21,4 +24,9 @@ public class UserAuthServiceImpl extends ServiceImpl<UserAuthMapper,UserAuth> im
return this.getOne(Wrappers.lambdaQuery(UserAuth.class)
.eq(UserAuth::getUserId, userId));
}
@Override
public Page<UserAuthAdminVo> pageApp(PageQuery pageQuery, UserAuthAdminVo bo) {
return baseMapper.pageApp(pageQuery.build(), bo);
}
}

View File

@@ -1,15 +1,32 @@
package com.ruoyi.xq.service.impl;
import cn.hutool.extra.spring.SpringUtil;
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.helper.LoginHelper;
import com.ruoyi.xq.domain.User;
import com.ruoyi.xq.domain.UserVip;
import com.ruoyi.xq.domain.VipOrder;
import com.ruoyi.xq.dto.admin.user.UserVipAdminVo;
import com.ruoyi.xq.dto.admin.user.req.AddVipReq;
import com.ruoyi.xq.enums.common.OrderTypeEnum;
import com.ruoyi.xq.enums.pay.PayStatusEnum;
import com.ruoyi.xq.enums.vip.VipStatusEnum;
import com.ruoyi.xq.enums.vip.VipTypeEnum;
import com.ruoyi.xq.manager.OrderNoUtil;
import com.ruoyi.xq.mapper.UserVipMapper;
import com.ruoyi.xq.service.UserVipService;
import lombok.RequiredArgsConstructor;
import com.ruoyi.xq.service.VipOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Comparator;
import java.util.List;
@@ -19,10 +36,12 @@ import java.util.List;
* @author 77
* @date 2024-03-04
*/
@RequiredArgsConstructor
@Service
public class UserVipServiceImpl extends ServiceImpl<UserVipMapper,UserVip> implements UserVipService {
@Autowired
private VipOrderService vipOrderService;
@Override
public UserVip getUserVip(Long userId, Integer vipType){
return this.getOne(Wrappers.lambdaQuery(UserVip.class)
@@ -50,4 +69,70 @@ public class UserVipServiceImpl extends ServiceImpl<UserVipMapper,UserVip> imple
return userVipList.stream().max(Comparator.comparing(UserVip::getVipType)).orElse(null);
}
/**
* 后台管理强制覆盖VIP
* @param bo
* @param user
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void updateVipOrderAdmin(AddVipReq bo, User user) {
VipTypeEnum vipTypeEnum = VipTypeEnum.getByCode(bo.getOpenVipType());
if(vipTypeEnum == null || bo.getOpenVipMonthNum() == null || bo.getOpenVipMonthNum() < 1){
throw new ServiceException("参数异常!");
}
String text = String.format("管理员开通%s %s个月", vipTypeEnum.getText(), bo.getOpenVipMonthNum());
VipOrder vipOrder = new VipOrder();
vipOrder.setUserId(user.getId());
vipOrder.setUsercode(user.getUsercode());
vipOrder.setVipType(vipTypeEnum.getCode());
vipOrder.setVipMonth(bo.getOpenVipMonthNum());
vipOrder.setOrderName(text);
vipOrder.setOrderNo(OrderNoUtil.gen(OrderTypeEnum.VIP));
vipOrder.setPayStatus(PayStatusEnum.NO_PAY.getCode());
vipOrder.setAdmin(true);
vipOrder.setAdminId(LoginHelper.getUserId());
vipOrderService.save(vipOrder);
UserVipService userVipService = SpringUtil.getBean(UserVipService.class);
userVipService.incsVip(user,bo.getOpenVipType(),bo.getOpenVipMonthNum());
}
@Override
public void incsVip(User user, Integer vipType, Integer vipMonth){
// TODO 加锁
UserVip userVip = this.getUserVip(user.getId(),vipType);
LocalDateTime now = LocalDateTime.now();
// 以前会员失效
if(userVip == null ||
!VipStatusEnum.NORMAL.getCode().equals(userVip.getVipStatus()) || // 会员不可用
userVip.getVipTimeout().isBefore(now)){
if(userVip == null){
userVip = new UserVip();
}
userVip.setUserId(user.getId());
userVip.setUsercode(user.getUsercode());
userVip.setVipType(vipType);
LocalDate expireDate = now.plusMonths(vipMonth).plusDays(1).toLocalDate();
userVip.setVipTimeout(LocalDateTime.of(expireDate, LocalTime.MIN));
userVip.setVipStatus(VipStatusEnum.NORMAL.getCode());
this.saveOrUpdate(userVip);
}else{
userVip.setVipTimeout(userVip.getVipTimeout().plusMonths(vipMonth));
this.saveOrUpdate(userVip);
}
}
@Override
public Page<UserVipAdminVo> pageApp(PageQuery pageQuery, UserVipAdminVo bo) {
return baseMapper.pageApp(pageQuery.build(), bo);
}
@Override
public void removeVip(Long id) {
this.update(Wrappers.lambdaUpdate(UserVip.class)
.eq(UserVip::getId,id)
.set(UserVip::getVipStatus, VipStatusEnum.CLOSE.getCode()));
}
}

View File

@@ -1,10 +1,13 @@
package com.ruoyi.xq.service.impl;
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.xq.domain.User;
import com.ruoyi.xq.domain.VipOrder;
import com.ruoyi.xq.domain.VipPrice;
import com.ruoyi.xq.dto.admin.vipOrder.VipOrderAdminVo;
import com.ruoyi.xq.enums.common.OrderTypeEnum;
import com.ruoyi.xq.enums.pay.PayStatusEnum;
import com.ruoyi.xq.manager.OrderNoUtil;
@@ -51,4 +54,9 @@ public class VipOrderServiceImpl extends ServiceImpl<VipOrderMapper,VipOrder> im
this.save(vipOrder);
return vipOrder;
}
@Override
public Page<VipOrderAdminVo> pageApp(PageQuery pageQuery, VipOrderAdminVo bo) {
return baseMapper.pageApp(pageQuery.build(), bo);
}
}