src/main/java/cc/mrbird/febs/video/controller/AdminVideoMemberController.java
@@ -4,12 +4,14 @@ import cc.mrbird.febs.common.controller.BaseController; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.video.dto.AdminSetVipDto; import cc.mrbird.febs.video.service.IAdminVideoMemberService; import cc.mrbird.febs.video.entity.VideoMemberEntity; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import javax.validation.constraints.NotNull; import java.util.Map; @@ -31,7 +33,7 @@ } @PostMapping("resetPwd/{id}") @ControllerEndpoint(operation = "会员列表---重置密码", exceptionMessage = "重置密码失败") @ControllerEndpoint(operation = "会员列表---重置密码", exceptionMessage = "操作失败") public FebsResponse resetPwd(@PathVariable("id") Long id) { return adminVideoMemberService.resetPwd(id); } @@ -42,7 +44,7 @@ * @return */ @GetMapping("closeAccount/{id}") @ControllerEndpoint(operation = "会员列表---禁止", exceptionMessage = "禁止失败") @ControllerEndpoint(operation = "会员列表---禁止", exceptionMessage = "操作失败") public FebsResponse closeAccount(@NotNull(message = "{required}") @PathVariable Long id) { return adminVideoMemberService.closeAccount(id); } @@ -53,11 +55,30 @@ * @return */ @GetMapping("openAccount/{id}") @ControllerEndpoint(operation = "会员列表---开启", exceptionMessage = "开启失败") @ControllerEndpoint(operation = "会员列表---开启", exceptionMessage = "操作失败") public FebsResponse openAccount(@NotNull(message = "{required}") @PathVariable Long id) { return adminVideoMemberService.openAccount(id); } /** * 会员列表-会员VIP设置 */ @PostMapping("setVip") @ControllerEndpoint(operation = "会员列表-会员VIP设置", exceptionMessage = "操作失败") public FebsResponse setVip(@Valid AdminSetVipDto adminSetVipDto) { return adminVideoMemberService.setVip(adminSetVipDto); } /** * 会员列表-取消会员资格 */ @GetMapping("cancelVip/{id}") @ControllerEndpoint(operation = "会员列表---取消会员资格", exceptionMessage = "操作失败") public FebsResponse cancelVip(@PathVariable("id") Long id) { return adminVideoMemberService.cancelVip(id); } } src/main/java/cc/mrbird/febs/video/dto/AdminSetVipDto.java
New file @@ -0,0 +1,14 @@ package cc.mrbird.febs.video.dto; import io.swagger.annotations.ApiModel; import lombok.Data; @Data @ApiModel(value = "ApiMyVideoCollectionDto", description = "接收参数类") public class AdminSetVipDto { private Long id; private String vipType; } src/main/java/cc/mrbird/febs/video/entity/VideoVipInfoEntity.java
@@ -23,4 +23,9 @@ private Date buyTime; private Date expireTime; /** * 生效状态 1:生效中 2:已过期 */ private Integer state; } src/main/java/cc/mrbird/febs/video/mapper/VideoVipInfoMapper.java
@@ -2,11 +2,12 @@ import cc.mrbird.febs.video.entity.VideoVipInfoEntity; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import io.lettuce.core.dynamic.annotation.Param; import java.util.List; public interface VideoVipInfoMapper extends BaseMapper<VideoVipInfoEntity> { List<VideoVipInfoEntity> selectVideoVipInfoByMemberId(long id); List<VideoVipInfoEntity> selectVideoVipInfoByMemberIdAndState(@Param("memberId") long id, @Param("state")Integer state); } src/main/java/cc/mrbird/febs/video/service/IAdminVideoMemberService.java
@@ -2,6 +2,7 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.video.dto.AdminSetVipDto; import cc.mrbird.febs.video.entity.VideoMemberEntity; import cc.mrbird.febs.video.vo.AdminVideoMemberVo; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -18,4 +19,8 @@ FebsResponse openAccount(Long id); AdminVideoMemberVo getAdminVideoMemberVoById(long id); FebsResponse setVip(AdminSetVipDto adminSetVipDto); FebsResponse cancelVip(Long id); } src/main/java/cc/mrbird/febs/video/service/impl/AdminVideoMemberServiceImpl.java
@@ -3,22 +3,28 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.video.dto.AdminSetVipDto; import cc.mrbird.febs.video.entity.VideoMemberEntity; import cc.mrbird.febs.video.entity.VideoVipInfoEntity; import cc.mrbird.febs.video.enumeration.VipTypeEnum; import cc.mrbird.febs.video.mapper.VideoMemberMapper; import cc.mrbird.febs.video.mapper.VideoVipInfoMapper; import cc.mrbird.febs.video.service.IAdminVideoMemberService; import cc.mrbird.febs.video.vo.AdminVideoMemberVo; import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.crypto.SecureUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.kotlin.KtQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.List; @Slf4j @@ -36,6 +42,7 @@ } @Override @Transactional(rollbackFor = Exception.class) public FebsResponse resetPwd(Long id) { VideoMemberEntity videoMemberEntity = this.baseMapper.selectById(id); if (videoMemberEntity == null) { @@ -49,6 +56,7 @@ } @Override @Transactional(rollbackFor = Exception.class) public FebsResponse closeAccount(Long id) { VideoMemberEntity videoMemberEntity = this.baseMapper.selectById(id); if(ObjectUtil.isEmpty(videoMemberEntity)) { @@ -60,6 +68,7 @@ } @Override @Transactional(rollbackFor = Exception.class) public FebsResponse openAccount(Long id) { VideoMemberEntity videoMemberEntity = this.baseMapper.selectById(id); if(ObjectUtil.isEmpty(videoMemberEntity)) { @@ -74,9 +83,61 @@ public AdminVideoMemberVo getAdminVideoMemberVoById(long id) { VideoMemberEntity videoMemberEntity = this.baseMapper.selectById(id); AdminVideoMemberVo adminVideoMemberVo = new AdminVideoMemberVo(); adminVideoMemberVo.setMemberId(videoMemberEntity.getId()); adminVideoMemberVo.setId(videoMemberEntity.getId()); return adminVideoMemberVo; } @Override @Transactional(rollbackFor = Exception.class) public FebsResponse setVip(AdminSetVipDto adminSetVipDto) { VideoMemberEntity videoMemberEntity = this.baseMapper.selectById(adminSetVipDto.getId()); videoMemberEntity.setIsVip(VideoMemberEntity.ISVIP_STATUS_YES); this.baseMapper.updateById(videoMemberEntity); List<VideoVipInfoEntity> videoVipInfoEntities = videoVipInfoMapper.selectVideoVipInfoByMemberIdAndState(adminSetVipDto.getId(),1); if(CollUtil.isNotEmpty(videoVipInfoEntities)){ return new FebsResponse().fail().message("用户的会员还未失效"); } VideoVipInfoEntity videoVipInfoEntity = new VideoVipInfoEntity(); videoVipInfoEntity.setMemberId(adminSetVipDto.getId()); videoVipInfoEntity.setVipType(adminSetVipDto.getVipType()); videoVipInfoEntity.setBuyTime(new Date()); videoVipInfoEntity.setState(1); if(VipTypeEnum.MONTH.name().equals(adminSetVipDto.getVipType())){ videoVipInfoEntity.setExpireTime(DateUtil.offset(new Date(), DateField.MONTH,1)); } if(VipTypeEnum.PERIOD.name().equals(adminSetVipDto.getVipType())){ videoVipInfoEntity.setExpireTime(DateUtil.offset(new Date(), DateField.MONTH,3)); } if(VipTypeEnum.YEAR.name().equals(adminSetVipDto.getVipType())){ videoVipInfoEntity.setExpireTime(DateUtil.offset(new Date(), DateField.MONTH,12)); } videoVipInfoMapper.insert(videoVipInfoEntity); return new FebsResponse().success(); } @Override @Transactional(rollbackFor = Exception.class) public FebsResponse cancelVip(Long id) { VideoMemberEntity videoMemberEntity = this.baseMapper.selectById(id); if(ObjectUtil.isEmpty(videoMemberEntity)) { return new FebsResponse().fail().message("用户不存在"); } if(VideoMemberEntity.ISVIP_STATUS_NO.equals(videoMemberEntity.getIsVip())){ return new FebsResponse().fail().message("当前用户还不是会员,无法取消"); } videoMemberEntity.setIsVip(VideoMemberEntity.ISVIP_STATUS_NO); this.baseMapper.updateById(videoMemberEntity); List<VideoVipInfoEntity> videoVipInfoEntities = videoVipInfoMapper.selectVideoVipInfoByMemberIdAndState(videoMemberEntity.getId(),1); if(CollUtil.isNotEmpty(videoVipInfoEntities)){ for(VideoVipInfoEntity videoVipInfoEntity : videoVipInfoEntities){ videoVipInfoEntity.setState(2); videoVipInfoMapper.updateById(videoVipInfoEntity); } } return new FebsResponse().success(); } } src/main/java/cc/mrbird/febs/video/vo/AdminVideoMemberVo.java
@@ -7,6 +7,6 @@ @ApiModel(value = "AdminVideoMemberVo", description = "返回参数类") public class AdminVideoMemberVo { private Long memberId; private Long id; } src/main/resources/mapper/modules/VideoVipInfoMapper.xml
@@ -4,8 +4,8 @@ <select id="selectVideoVipInfoByMemberId" resultType="cc.mrbird.febs.video.entity.VideoVipInfoEntity"> select * from video_vip_info where member_id=#{memberId} <select id="selectVideoVipInfoByMemberIdAndState" resultType="cc.mrbird.febs.video.entity.VideoVipInfoEntity"> select * from video_vip_info where member_id = #{id} and state = #{state} </select> src/main/resources/templates/febs/views/videoMember/memberList.html
@@ -98,34 +98,58 @@ resetPwd(data.id); }); } if (layEvent === 'cancelVip') { if(data.isVip == 1){ febs.modal.confirm('会员设置', '是否取消用户会员资格?', function () { cancelVip(data.id); }); }else if(data.isVip == 2){ febs.alert.success('当前用户还不是会员,无法取消'); }else{ febs.alert.success('请刷新页面重试'); } } if (layEvent === 'setVip') { febs.modal.open('系统拨付', 'videoMember/setVip/' + data.id, { btn: ['提交', '取消'], yes: function (index, layero) { $('#setVip-update').find('#submit').trigger('click'); }, btn2: function () { layer.closeAll(); } }); if(data.isVip == 2){ febs.modal.open('会员设置', 'videoMember/setVip/' + data.id, { btn: ['提交', '取消'], yes: function (index, layero) { $('#setVip-update').find('#submit').trigger('click'); }, btn2: function () { layer.closeAll(); } }); }else if(data.isVip == 1){ febs.alert.success('当前用户已经是会员,无法重新设置'); }else{ febs.alert.success('请刷新页面重试'); } } }); function closeAccount(id) { febs.get(ctx + 'admin/videoMember/closeAccount/' + id, null, function () { febs.alert.success('禁用成功'); febs.alert.success('成功'); $query.click(); }); } function openAccount(id) { febs.get(ctx + 'admin/videoMember/openAccount/' + id, null, function () { febs.alert.success('开启成功'); febs.alert.success('成功'); $query.click(); }); } function resetPwd(id) { febs.post(ctx + 'admin/videoMember/resetPwd/' + id, null, function () { febs.alert.success('重置成功'); febs.alert.success('成功'); $query.click(); }); } function cancelVip(id) { febs.get(ctx + 'admin/videoMember/cancelVip/' + id, null, function () { febs.alert.success('成功'); $query.click(); }); } @@ -189,6 +213,7 @@ return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="resetPwd" shiro:hasPermission="user:update">重置密码</button>' +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="close" shiro:hasPermission="user:update">禁用</button>' +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="setVip" shiro:hasPermission="user:update">设置会员</button>' +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="cancelVip" shiro:hasPermission="user:update">取消会员</button>' }else{ return'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="resetPwd" shiro:hasPermission="user:update">重置密码</button>' +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="open" shiro:hasPermission="user:update">启用</button>' src/main/resources/templates/febs/views/videoMember/setVip.html
@@ -18,8 +18,8 @@ #setVip-update img{ max-width:100px } </style> <div class="layui-fluid" id="setVip-update"> <form class="layui-form" action="" lay-filter="setVip-update-form"> <div class="layui-form-item febs-hide"> @@ -29,15 +29,17 @@ </div> </div> <div class="layui-form-item"> <label class="layui-form-label febs-form-item-require">当前余额:</label> <div class="layui-input-block"> <input type="number" name="balance" lay-verify="required" autocomplete="off" class="layui-input" readonly> </div> </div> <div class="layui-form-item"> <label class="layui-form-label febs-form-item-require">拨付数目:</label> <div class="layui-input-block"> <input type="number" name="addBalance" lay-verify="required" autocomplete="off" class="layui-input"> <label class="layui-form-label febs-form-item-require">会员级别:</label> <div class="layui-form-item"> <div class="layui-input-block"> <input type="radio" name="vipType" value="MONTH" title="月卡" checked=""> </div> <div class="layui-input-block"> <input type="radio" name="vipType" value="PERIOD" title="季卡"> </div> <div class="layui-input-block"> <input type="radio" name="vipType" value="YEAR" title="年卡"> </div> </div> </div> <div class="layui-form-item febs-hide"> @@ -56,7 +58,7 @@ form = layui.form, laydate = layui.laydate, eleTree = layui.eleTree, systemPay = [[${systemPay}]], setVip = [[${setVip}]], $view = $('#setVip-update'), validate = layui.validate; @@ -66,22 +68,19 @@ }); formSelects.render(); initUserValue(); function initUserValue() { form.val("setVip-update-form", { "id": systemPay.id, "balance": systemPay.balance, "id": setVip.id }); } form.on('submit(setVip-update-form-submit)', function (data) { febs.post(ctx + 'admin/mallMember/updateSystemPay', data.field, function () { febs.post(ctx + 'admin/videoMember/setVip/', data.field, function () { layer.closeAll(); febs.alert.success('操作成功'); $('#febs-newInfo').find('#reset').click(); $('#febs-user').find('#reset').click(); }); return false; });