src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java
@@ -32,5 +32,7 @@ registration.excludePathPatterns("/api/xcxPay/wxpayCallback"); registration.excludePathPatterns("/api/xcxPay/rechargeCallBack"); registration.excludePathPatterns("/api/xcxPay/fapiaoCallBack"); registration.excludePathPatterns("/api/happyCategory/allCategory"); registration.excludePathPatterns("/api/happyCategory/indexCategory"); } } src/main/java/cc/mrbird/febs/common/enumerates/StateUpDownEnum.java
New file @@ -0,0 +1,55 @@ package cc.mrbird.febs.common.enumerates; import lombok.Getter; @Getter public enum StateUpDownEnum { /** * 来源类型 1-活动 2-社区圈子发布 */ SOURCE_TYPE_ACTIVITY(1), SOURCE_TYPE_SOCIAL_CIRCLE(2), /** * 操作类型 1-关注 2-点赞 3-分享 4-投票 */ FOLLOW(1), LIKE(2), SHARE(3), VOTE(4), /** * 投票活动选项是否审核 0.未审核 1.审核成功 2.拒绝 */ VOTE_OPTION_STATE_NOT_AUDIT(0), VOTE_OPTION_STATE_AUDIT_SUCCESS(1), VOTE_OPTION_STATE_AUDIT_REFUSE(2), /** * 活动类型 1-普通活动 2-众筹活动 3-投票活动 */ ACTIVITY_TYPE_NORMAL(1), ACTIVITY_TYPE_CROWDFUNDING(2), ACTIVITY_TYPE_VOTE(3), /** * 状态 0-未开始 1-报名中(进行中) 2-已结束 */ ACTIVITY_STATE_NOT_START(0), ACTIVITY_STATE_ENROLLING(1), ACTIVITY_STATE_END(2), /** * 状态 0-未开启 1-已开启 * 是否推荐到首页 0-不推荐 1-推荐 * 删除标识 0-未删除 1-已删除 */ DOWN(0), UP(1); private final int code; StateUpDownEnum(int code) { this.code = code; } } src/main/java/cc/mrbird/febs/mall/controller/ApiHappyActivityCategoryController.java
New file @@ -0,0 +1,46 @@ package cc.mrbird.febs.mall.controller; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.service.HappyActivityCategoryService; import cc.mrbird.febs.mall.vo.api.activity.category.ApiCategoryInfoVo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @Slf4j @Validated @RestController @RequiredArgsConstructor @RequestMapping(value = "/api/happyCategory") @Api(value = "ApiHappyActivityCategoryController", tags = "365活动") public class ApiHappyActivityCategoryController { private final HappyActivityCategoryService happyActivityCategoryService; @ApiOperation(value = "全部分类", notes = "全部分类") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiCategoryInfoVo.class) }) @GetMapping(value = "/allCategory") public FebsResponse allCategory() { return happyActivityCategoryService.allCategory(); } @ApiOperation(value = "首页分类", notes = "首页分类") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiCategoryInfoVo.class) }) @GetMapping(value = "/indexCategory") public FebsResponse indexCategory() { return happyActivityCategoryService.indexCategory(); } } src/main/java/cc/mrbird/febs/mall/controller/ApiHappyActivityController.java
New file @@ -0,0 +1,102 @@ package cc.mrbird.febs.mall.controller; import cc.mrbird.febs.common.annotation.Limit; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.service.HappyActivityService; import cc.mrbird.febs.mall.vo.api.activity.*; import cc.mrbird.febs.mall.vo.api.activity.follow.ApiOperateDoDto; import cc.mrbird.febs.mall.vo.api.activity.options.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @Slf4j @Validated @RestController @RequiredArgsConstructor @RequestMapping(value = "/api/happyActivity") @Api(value = "ApiHappyActivityController", tags = "365活动分类") public class ApiHappyActivityController{ private final HappyActivityService happyActivityService; @ApiOperation(value = "活动列表", notes = "活动列表") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiActivityInfoVo.class) }) @PostMapping(value = "/activityList") public FebsResponse activityList(@RequestBody @Validated ApiActivityInfoDto dto) { return happyActivityService.activityList(dto); } @ApiOperation(value = "活动详情", notes = "活动详情") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiActivityVo.class) }) @PostMapping(value = "/activityInfo") public FebsResponse activityInfo(@RequestBody @Validated ApiActivityDto dto) { return happyActivityService.activityInfo(dto); } @ApiOperation(value = "投票活动选项列表", notes = "投票活动选项列表") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiActivityOptionListVo.class) }) @GetMapping(value = "/voteOptionList/{id}") public FebsResponse voteOptionList(@PathVariable("id") Long id) { return happyActivityService.voteOptionList(id); } @ApiOperation(value = "投票活动选项详情", notes = "投票活动选项详情") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiActivityOptionVo.class) }) @GetMapping(value = "/voteOption/{id}") public FebsResponse voteOption(@PathVariable("id") Long id) { return happyActivityService.voteOption(id); } @ApiOperation(value = "点赞关注转发", notes = "点赞关注转发") @PostMapping(value = "/operateDo") @Limit(key = "operateDo", period = 60, count = 1, name = "点赞关注转发接口", prefix = "limit") public FebsResponse operateDo(@RequestBody @Validated ApiOperateDoDto dto) { return happyActivityService.operateDo(dto); } @ApiOperation(value = "投票活动选项投票", notes = "投票活动选项投票") @PostMapping(value = "/operateVote") @Limit(key = "operateVote", period = 60, count = 1, name = "投票接口", prefix = "limit") public FebsResponse operateVote(@RequestBody @Validated ApiOperateVoteDto dto) { return happyActivityService.operateVote(dto); } @ApiOperation(value = "投票活动选项投票记录", notes = "投票活动选项投票记录") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiVoteRecordInPageVo.class) }) @PostMapping(value = "/voteRecordInPage") public FebsResponse voteRecordInPage(@RequestBody @Validated ApiVoteRecordInPageDto dto) { return happyActivityService.voteRecordInPage(dto); } @ApiOperation(value = "活动报名", notes = "活动报名") @PostMapping(value = "/operateRegister") @Limit(key = "operateRegister", period = 60, count = 1, name = "活动报名接口", prefix = "limit") public FebsResponse operateRegister(@RequestBody @Validated ApiOperateRegisterActivityDto dto) { return happyActivityService.operateRegister(dto); } } src/main/java/cc/mrbird/febs/mall/entity/HappyActivity.java
New file @@ -0,0 +1,64 @@ package cc.mrbird.febs.mall.entity; import cc.mrbird.febs.common.entity.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.math.BigDecimal; import java.util.Date; @Data @TableName("happy_activity") public class HappyActivity extends BaseEntity { /** * `category_id` bigint(20) DEFAULT NULL COMMENT '活动分类ID', `code` varchar(200) DEFAULT NULL COMMENT '编码', `name` varchar(500) DEFAULT NULL COMMENT '名称', `type` int(11) DEFAULT NULL COMMENT '活动类型 1-普通活动 2-众筹活动 3-投票活动', `join_cnt` int(11) DEFAULT NULL COMMENT '参与人数', `state` int(11) DEFAULT '0' COMMENT '状态 0-未开始 1-报名中(进行中) 2-已结束', `start_time` datetime DEFAULT NULL COMMENT '开始时间', `end_time` datetime DEFAULT NULL COMMENT '结束时间', `phone` varchar(100) DEFAULT NULL COMMENT '联系方式', `address` varchar(500) DEFAULT NULL COMMENT '活动地址', `expect_cnt` int(11) DEFAULT NULL COMMENT '门票预计数量', `surplus_cnt` int(11) DEFAULT NULL COMMENT '门票剩余数量', `pay_state` int(11) DEFAULT NULL COMMENT '是否众筹 0-关闭 1-开启(开启代表收取参与费用)', `pay_amount` decimal(20,2) DEFAULT NULL COMMENT '众筹金额', `img_remark` text COMMENT '图片描述', `text_remark` text COMMENT '文字描述', `index_img` varchar(200) DEFAULT NULL COMMENT '活动封面', `order_cnt` int(11) DEFAULT '0' COMMENT '排序', `hot_state` int(11) DEFAULT '0' COMMENT '是否推荐到首页 0-不推荐 1-推荐', `back_img` varchar(500) DEFAULT NULL COMMENT '背景图片', `DELETE_FLAG` int(11) DEFAULT '0' COMMENT '删除标识 0-未删除 1-已删除', */ private Long categoryId; private String code; private String name; private Integer type; private Integer joinCnt; private Integer state; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date startTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date endTime; private String phone; private String address; private Integer expectCnt; private Integer surplusCnt; private Integer payState; private BigDecimal payAmount; private String imgRemark; private String textRemark; private String indexImg; private Integer orderCnt; private Integer hotState; private String backImg; private Integer deleteFlag; } src/main/java/cc/mrbird/febs/mall/entity/HappyActivityCategory.java
New file @@ -0,0 +1,23 @@ package cc.mrbird.febs.mall.entity; import cc.mrbird.febs.common.entity.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @Data @TableName("happy_activity_category") public class HappyActivityCategory extends BaseEntity { /** * `name` varchar(500) DEFAULT NULL, `order_cnt` int(11) DEFAULT '0' COMMENT '排序', `hot_state` int(11) DEFAULT '0' COMMENT '是否推荐到首页 0-不推荐 1-推荐', `state` int(11) DEFAULT NULL COMMENT '状态 0-未开启 1-已开启', `DELETE_FLAG` int(11) DEFAULT '0' COMMENT '删除标识 0-未删除 1-已删除', */ private String name; private Integer orderCnt; private Integer hotState; private Integer state; private Integer deleteFlag; } src/main/java/cc/mrbird/febs/mall/entity/HappyActivityOption.java
New file @@ -0,0 +1,54 @@ package cc.mrbird.febs.mall.entity; import cc.mrbird.febs.common.entity.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @Data @TableName("happy_activity_option") public class HappyActivityOption extends BaseEntity { /** * `ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `member_id` bigint(20) DEFAULT NULL COMMENT '用户ID', `activity_id` bigint(20) DEFAULT NULL COMMENT '活动ID', `order_cnt` int(11) DEFAULT NULL COMMENT '排序', `option_name` varchar(256) NOT NULL COMMENT '选项名称', `rank` int(11) DEFAULT NULL COMMENT '排名', `likes_cnt` int(11) DEFAULT '0' COMMENT '点赞数量', `image` varchar(500) DEFAULT NULL COMMENT '投票选项图片 URL', `video_url` varchar(500) DEFAULT NULL COMMENT '投票选项视频URL', `description` text COMMENT '选项描述', `state` int(11) DEFAULT '0' COMMENT '是否审核 0.未审核 1.审核成功 2.拒绝', `real_name` varchar(256) DEFAULT NULL COMMENT '注册名称', `mobile_phone` varchar(64) DEFAULT NULL COMMENT '手机', `province` varchar(128) DEFAULT NULL COMMENT '省', `city` varchar(128) DEFAULT NULL COMMENT '市', `address` varchar(512) DEFAULT NULL COMMENT '地址', `email` varchar(256) DEFAULT '' COMMENT '邮箱', `sex` int(8) DEFAULT NULL COMMENT '性别 0-女1-男 2-保密', `hobby` varchar(256) DEFAULT NULL COMMENT '爱好', `mcn_state` int(8) DEFAULT NULL COMMENT '是否签约mcn机构 0否 1是', `DELETE_FLAG` int(11) DEFAULT '0' COMMENT '删除标识 0-未删除 1-已删除', */ private Long memberId; private Long activityId; private Integer orderCnt; private String optionName; private Integer rank; private Integer likesCnt; private String image; private String videoUrl; private String description; private Integer state; private String realName; private String mobilePhone; private String province; private String city; private String address; private String email; private Integer sex; private String hobby; private Integer mcnState; private Integer deleteFlag; } src/main/java/cc/mrbird/febs/mall/entity/HappyFollow.java
New file @@ -0,0 +1,27 @@ package cc.mrbird.febs.mall.entity; import cc.mrbird.febs.common.entity.BaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @Data @TableName("happy_follow") public class HappyFollow extends BaseEntity { /** * `ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `member_id` bigint(20) DEFAULT NULL, `source_type` int(11) DEFAULT NULL COMMENT '来源类型 1-活动 2-社区圈子发布', `source_id` bigint(20) DEFAULT NULL COMMENT '来源ID', `source_option_id` bigint(20) DEFAULT NULL COMMENT '来源选项ID', `type` int(11) DEFAULT NULL COMMENT '操作类型 1-关注 2-点赞 3-分享 4-投票', `DELETE_FLAG` int(11) DEFAULT '0' COMMENT '删除标识 0-未删除 1-已删除', */ private Long memberId; private Integer sourceType; private Long sourceId; private Long sourceOptionId; private Integer type; private Integer deleteFlag; } src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityCategoryMapper.java
New file @@ -0,0 +1,7 @@ package cc.mrbird.febs.mall.mapper; import cc.mrbird.febs.mall.entity.HappyActivityCategory; import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface HappyActivityCategoryMapper extends BaseMapper<HappyActivityCategory> { } src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityMapper.java
New file @@ -0,0 +1,17 @@ package cc.mrbird.febs.mall.mapper; import cc.mrbird.febs.mall.entity.HappyActivity; import cc.mrbird.febs.mall.vo.api.activity.ApiActivityInfoDto; import cc.mrbird.febs.mall.vo.api.activity.ApiActivityInfoVo; import cc.mrbird.febs.mall.vo.api.activity.options.ApiVoteRecordInPageDto; import cc.mrbird.febs.mall.vo.api.activity.options.ApiVoteRecordInPageVo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; public interface HappyActivityMapper extends BaseMapper<HappyActivity> { Page<ApiActivityInfoVo> selectActivityPage(Page<ApiActivityInfoVo> page, @Param("record")ApiActivityInfoDto dto); Page<ApiVoteRecordInPageVo> getVoteRecordInPage(Page<ApiActivityInfoVo> page, @Param("record")ApiVoteRecordInPageDto dto); } src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityOptionMapper.java
New file @@ -0,0 +1,7 @@ package cc.mrbird.febs.mall.mapper; import cc.mrbird.febs.mall.entity.HappyActivityOption; import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface HappyActivityOptionMapper extends BaseMapper<HappyActivityOption> { } src/main/java/cc/mrbird/febs/mall/mapper/HappyFollowMapper.java
New file @@ -0,0 +1,7 @@ package cc.mrbird.febs.mall.mapper; import cc.mrbird.febs.mall.entity.HappyFollow; import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface HappyFollowMapper extends BaseMapper<HappyFollow> { } src/main/java/cc/mrbird/febs/mall/service/HappyActivityCategoryService.java
New file @@ -0,0 +1,11 @@ package cc.mrbird.febs.mall.service; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.entity.HappyActivityCategory; import com.baomidou.mybatisplus.extension.service.IService; public interface HappyActivityCategoryService extends IService<HappyActivityCategory> { FebsResponse allCategory(); FebsResponse indexCategory(); } src/main/java/cc/mrbird/febs/mall/service/HappyActivityService.java
New file @@ -0,0 +1,34 @@ package cc.mrbird.febs.mall.service; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.entity.HappyActivity; import cc.mrbird.febs.mall.vo.api.activity.ApiActivityDto; import cc.mrbird.febs.mall.vo.api.activity.ApiActivityInfoDto; import cc.mrbird.febs.mall.vo.api.activity.ApiOperateRegisterActivityDto; import cc.mrbird.febs.mall.vo.api.activity.follow.ApiOperateDoDto; import cc.mrbird.febs.mall.vo.api.activity.options.ApiOperateVoteDto; import cc.mrbird.febs.mall.vo.api.activity.options.ApiVoteRecordInPageDto; import com.baomidou.mybatisplus.extension.service.IService; public interface HappyActivityService extends IService<HappyActivity> { FebsResponse activityList(ApiActivityInfoDto dto); FebsResponse activityInfo(ApiActivityDto dto); FebsResponse voteOptionList(Long id); FebsResponse voteOption(Long id); FebsResponse operateDo(ApiOperateDoDto dto); void operateDoVote(Long memberId, int code, Long sourceId, Long sourceOptionId, Integer type); void operateDo(Long memberId, int code, Long sourceId, Integer type); FebsResponse operateVote(ApiOperateVoteDto dto); FebsResponse voteRecordInPage(ApiVoteRecordInPageDto dto); FebsResponse operateRegister(ApiOperateRegisterActivityDto dto); } src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityCategoryServiceImpl.java
New file @@ -0,0 +1,80 @@ package cc.mrbird.febs.mall.service.impl; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.enumerates.StateUpDownEnum; import cc.mrbird.febs.mall.entity.HappyActivityCategory; import cc.mrbird.febs.mall.mapper.HappyActivityCategoryMapper; import cc.mrbird.febs.mall.service.HappyActivityCategoryService; import cc.mrbird.febs.mall.vo.api.activity.category.ApiCategoryInfoVo; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.ArrayList; import java.util.List; import java.util.stream.Collectors; @Slf4j @Service @RequiredArgsConstructor @Transactional public class HappyActivityCategoryServiceImpl extends ServiceImpl<HappyActivityCategoryMapper, HappyActivityCategory> implements HappyActivityCategoryService { /** * 公共方法:根据查询条件获取分类列表 * * @param queryWrapper 查询条件 * @return 分类列表 */ private List<ApiCategoryInfoVo> getCategoryList(LambdaQueryWrapper<HappyActivityCategory> queryWrapper) { try { List<HappyActivityCategory> happyActivityCategories = this.baseMapper.selectList(queryWrapper); if (CollUtil.isEmpty(happyActivityCategories)) { log.info("查询结果为空,查询条件: {}", queryWrapper); return new ArrayList<>(); } // 使用 Stream API 简化转换逻辑 return happyActivityCategories.stream() .map(item -> { ApiCategoryInfoVo apiCategoryInfoVo = new ApiCategoryInfoVo(); apiCategoryInfoVo.setId(item.getId()); apiCategoryInfoVo.setName(item.getName()); return apiCategoryInfoVo; }) .collect(Collectors.toList()); } catch (Exception e) { log.error("查询分类列表时发生异常", e); throw new RuntimeException("查询分类列表失败,请稍后重试"); } } @Override public FebsResponse allCategory() { LambdaQueryWrapper<HappyActivityCategory> queryWrapper = new LambdaQueryWrapper<HappyActivityCategory>() .select(HappyActivityCategory::getId, HappyActivityCategory::getName) .eq(HappyActivityCategory::getState, StateUpDownEnum.UP.getCode()) .eq(HappyActivityCategory::getDeleteFlag, StateUpDownEnum.DOWN.getCode()) .orderByAsc(HappyActivityCategory::getOrderCnt); List<ApiCategoryInfoVo> categoryList = getCategoryList(queryWrapper); return new FebsResponse().success().data(categoryList); } @Override public FebsResponse indexCategory() { LambdaQueryWrapper<HappyActivityCategory> queryWrapper = new LambdaQueryWrapper<HappyActivityCategory>() .select(HappyActivityCategory::getId, HappyActivityCategory::getName) .eq(HappyActivityCategory::getState, StateUpDownEnum.UP.getCode()) .eq(HappyActivityCategory::getDeleteFlag, StateUpDownEnum.DOWN.getCode()) .eq(HappyActivityCategory::getHotState, StateUpDownEnum.UP.getCode()) .orderByAsc(HappyActivityCategory::getOrderCnt); List<ApiCategoryInfoVo> categoryList = getCategoryList(queryWrapper); return new FebsResponse().success().data(categoryList); } } src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java
New file @@ -0,0 +1,319 @@ package cc.mrbird.febs.mall.service.impl; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.enumerates.StateUpDownEnum; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.LoginUserUtil; import cc.mrbird.febs.mall.entity.HappyActivity; import cc.mrbird.febs.mall.entity.HappyActivityOption; import cc.mrbird.febs.mall.entity.HappyFollow; import cc.mrbird.febs.mall.entity.MallMember; import cc.mrbird.febs.mall.mapper.HappyActivityMapper; import cc.mrbird.febs.mall.mapper.HappyActivityOptionMapper; import cc.mrbird.febs.mall.mapper.HappyFollowMapper; import cc.mrbird.febs.mall.mapper.MallMemberMapper; import cc.mrbird.febs.mall.service.HappyActivityService; import cc.mrbird.febs.mall.vo.api.activity.*; import cc.mrbird.febs.mall.vo.api.activity.follow.ApiOperateDoDto; import cc.mrbird.febs.mall.vo.api.activity.options.*; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.*; import java.util.stream.Collectors; @Slf4j @Service @RequiredArgsConstructor @Transactional public class HappyActivityServiceImpl extends ServiceImpl<HappyActivityMapper, HappyActivity> implements HappyActivityService { private final HappyFollowMapper happyFollowMapper; private final MallMemberMapper mallMemberMapper; private final HappyActivityOptionMapper happyActivityOptionMapper; @Override public FebsResponse activityList(ApiActivityInfoDto dto) { // 创建分页对象,传入当前页和每页大小 Page<ApiActivityInfoVo> page = new Page<>(dto.getPageNow(), dto.getPageSize()); // 调用Mapper方法获取活动分页数据 Page<ApiActivityInfoVo> happyActivityPage = this.baseMapper.selectActivityPage(page, dto); // 检查分页结果是否包含数据 if(CollUtil.isNotEmpty(happyActivityPage.getRecords())){ List<ApiActivityInfoVo> records = happyActivityPage.getRecords(); // 使用Stream流操作records,获取所有活动的ID List<Long> ids = records.stream().map(ApiActivityInfoVo::getId).collect(Collectors.toList()); // 查询关注点赞转发记录,筛选出关注活动类型且未删除的关注记录,并按ID升序排序,限制结果数量为3 List<HappyFollow> happyFollows = happyFollowMapper.selectList( new LambdaQueryWrapper<HappyFollow>() .select(HappyFollow::getMemberId) .eq(HappyFollow::getSourceType, StateUpDownEnum.SOURCE_TYPE_ACTIVITY.getCode()) .in(HappyFollow::getSourceId, ids) .eq(HappyFollow::getDeleteFlag, StateUpDownEnum.DOWN.getCode()) .orderByAsc(HappyFollow::getId) .last("limit 3") ); // 检查关注记录是否不为空 if(CollUtil.isNotEmpty(happyFollows)){ // 使用Stream流操作关注记录,获取所有成员ID的集合 Set<Long> memberIds = happyFollows.stream().collect(Collectors.mapping(HappyFollow::getMemberId, Collectors.toSet())); // 查询成员信息,获取成员的ID和头像 List<MallMember> mallMembers = mallMemberMapper.selectList( new LambdaQueryWrapper<MallMember>() .select(MallMember::getId,MallMember::getAvatar) .in(MallMember::getId, memberIds) ); // 使用Stream流操作成员信息,生成一个以成员ID为键,成员信息为值的Map Map<Long, MallMember> memberMap = mallMembers.stream() .collect(Collectors.toMap(MallMember::getId, member -> member)); // 使用Stream流操作关注记录,生成一个以活动ID为键,成员ID列表为值的Map Map<Long, List<Long>> followMap = happyFollows.stream() .collect(Collectors.groupingBy( HappyFollow::getSourceId, Collectors.mapping(HappyFollow::getMemberId, Collectors.toList()) )); // 遍历活动记录,为每个活动添加成员头像信息 records.forEach(record -> { List<Long> memberIdsForRecord = followMap.get(record.getId()); if (CollUtil.isNotEmpty(memberIdsForRecord)) { List<String> memberAvatars = memberIdsForRecord.stream() .map(memberMap::get) .filter(member -> member != null) .map(MallMember::getAvatar) .collect(Collectors.toList()); record.setMemberAvatars(memberAvatars); } }); } } // 返回成功响应,包含活动分页数据 return new FebsResponse().success().data(happyActivityPage); } @Override public FebsResponse activityInfo(ApiActivityDto dto) { ApiActivityVo apiActivityVo = new ApiActivityVo(); HappyActivity happyActivity = this.baseMapper.selectOne( new LambdaQueryWrapper<HappyActivity>() .eq(HappyActivity::getId, dto.getId()) .eq(HappyActivity::getType, dto.getType()) .eq(HappyActivity::getDeleteFlag, StateUpDownEnum.DOWN.getCode()) .ne(HappyActivity::getState, StateUpDownEnum.ACTIVITY_STATE_NOT_START.getCode()) ); if(happyActivity != null){ BeanUtil.copyProperties(happyActivity,apiActivityVo); } return new FebsResponse().success().data(apiActivityVo); } @Override public FebsResponse voteOptionList(Long id) { ArrayList<ApiActivityOptionListVo> apiActivityOptionListVos = new ArrayList<>(); HappyActivity happyActivity = this.baseMapper.selectById(id); if(StateUpDownEnum.ACTIVITY_TYPE_VOTE.getCode() != happyActivity.getType()){ throw new FebsException("投票活动才可获取投票选项"); } List<HappyActivityOption> happyActivityOptions = happyActivityOptionMapper.selectList( new LambdaQueryWrapper<HappyActivityOption>() .select( HappyActivityOption::getId, HappyActivityOption::getOptionName, HappyActivityOption::getRank, HappyActivityOption::getLikesCnt, HappyActivityOption::getImage ) .eq(HappyActivityOption::getActivityId,id) .eq(HappyActivityOption::getState,StateUpDownEnum.VOTE_OPTION_STATE_AUDIT_SUCCESS.getCode()) .eq(HappyActivityOption::getDeleteFlag,StateUpDownEnum.DOWN.getCode()) .orderByAsc(HappyActivityOption::getRank) ); if(CollUtil.isNotEmpty(happyActivityOptions)){ happyActivityOptions.forEach(option -> { ApiActivityOptionListVo apiActivityOptionListVo = new ApiActivityOptionListVo(); BeanUtil.copyProperties(option, apiActivityOptionListVo); apiActivityOptionListVos.add(apiActivityOptionListVo); }); } return new FebsResponse().success().data(apiActivityOptionListVos); } @Override public FebsResponse voteOption(Long id) { ApiActivityOptionVo apiActivityOptionVo = new ApiActivityOptionVo(); HappyActivityOption happyActivityOption = happyActivityOptionMapper.selectById(id); if(happyActivityOption != null){ BeanUtil.copyProperties(happyActivityOption, apiActivityOptionVo); } return new FebsResponse().success().data(apiActivityOptionVo); } @Override public FebsResponse operateDo(ApiOperateDoDto dto) { Long memberId = LoginUserUtil.getLoginUser().getId(); Integer sourceType = dto.getSourceType(); Long sourceId = dto.getSourceId(); Integer type = dto.getType(); try { if (StateUpDownEnum.SOURCE_TYPE_ACTIVITY.getCode() == sourceType) { // 活动点赞或关注 HappyActivity happyActivity = this.baseMapper.selectById(sourceId); if (happyActivity == null) { throw new FebsException("活动不存在"); } if (StateUpDownEnum.ACTIVITY_TYPE_VOTE.getCode() == happyActivity.getType()) { Long sourceOptionId = dto.getSourceOptionId(); if (sourceOptionId == null) { throw new FebsException("选项ID不能为空"); } this.operateDoVote(memberId, StateUpDownEnum.SOURCE_TYPE_ACTIVITY.getCode(), sourceId, sourceOptionId, type); } else { this.operateDo(memberId, StateUpDownEnum.SOURCE_TYPE_ACTIVITY.getCode(), sourceId, type); } } else if (StateUpDownEnum.SOURCE_TYPE_SOCIAL_CIRCLE.getCode() == sourceType) { // 朋友圈点赞或关注 this.operateDo(memberId, StateUpDownEnum.SOURCE_TYPE_SOCIAL_CIRCLE.getCode(), sourceId, type); } else { throw new FebsException("不支持的操作类型"); } } catch (Exception e) { // 捕获异常并返回错误信息 log.error("操作失败:{}", e.getMessage()); throw new FebsException("操作失败"); } return new FebsResponse().success(); } @Override public void operateDoVote(Long memberId, int code, Long sourceId, Long sourceOptionId, Integer type) { HappyFollow happyFollow = new HappyFollow(); happyFollow.setMemberId(memberId); happyFollow.setSourceType(code); happyFollow.setSourceId(sourceId); happyFollow.setSourceOptionId(sourceOptionId); happyFollow.setType(type); happyFollowMapper.insert(happyFollow); } @Override public void operateDo(Long memberId, int code, Long sourceId, Integer type) { HappyFollow happyFollow = new HappyFollow(); happyFollow.setMemberId(memberId); happyFollow.setSourceType(code); happyFollow.setSourceId(sourceId); happyFollow.setType(type); happyFollowMapper.insert(happyFollow); } @Override public FebsResponse operateVote(ApiOperateVoteDto dto) { Long memberId = LoginUserUtil.getLoginUser().getId(); Long sourceId = dto.getSourceId(); Long sourceOptionId = dto.getSourceOptionId(); Integer sourceType = dto.getSourceType(); Integer type = StateUpDownEnum.VOTE.getCode(); //验证当前登录人员今日是否已经投票 List<HappyFollow> happyFollows = happyFollowMapper.selectList( new LambdaQueryWrapper<HappyFollow>() .eq(HappyFollow::getMemberId, memberId) .eq(HappyFollow::getSourceId, sourceId) .eq(HappyFollow::getSourceOptionId, sourceOptionId) .eq(HappyFollow::getType, type) .gt(HappyFollow::getCreatedTime, DateUtil.beginOfDay(new Date())) ); if (CollUtil.isNotEmpty(happyFollows)){ throw new FebsException("今日已经投票"); } if (StateUpDownEnum.SOURCE_TYPE_ACTIVITY.getCode() == sourceType) { HappyActivityOption happyActivityOption = happyActivityOptionMapper.selectById(sourceOptionId); if (happyActivityOption == null) { throw new FebsException("投票对象不存在"); } if (StateUpDownEnum.VOTE_OPTION_STATE_AUDIT_SUCCESS.getCode() != happyActivityOption.getState()) { throw new FebsException("请重新选择投票对象"); } Integer likesCnt = happyActivityOption.getLikesCnt(); if (likesCnt == null) { likesCnt = 0; } likesCnt += 1; happyActivityOption.setLikesCnt(likesCnt); boolean updateSuccess = happyActivityOptionMapper.updateById(happyActivityOption) > 0; if (!updateSuccess) { throw new FebsException("更新票数失败"); } this.operateDoVote(memberId, sourceType, sourceId, sourceOptionId, type); } return new FebsResponse().success(); } @Override public FebsResponse voteRecordInPage(ApiVoteRecordInPageDto dto) { // 创建分页对象,传入当前页和每页大小 Page<ApiActivityInfoVo> page = new Page<>(dto.getPageNow(), dto.getPageSize()); Page<ApiVoteRecordInPageVo> voteRecordInPage = this.baseMapper.getVoteRecordInPage(page, dto); List<ApiVoteRecordInPageVo> records = voteRecordInPage.getRecords(); if(CollUtil.isNotEmpty(records)){ //stream流操作records,获取全部的memberId(全部投票人) Set<Long> memberIds = records.stream().map(ApiVoteRecordInPageVo::getMemberId).collect(Collectors.toSet()); if(CollUtil.isEmpty(memberIds)){ List<MallMember> mallMembers = mallMemberMapper.selectList( new LambdaQueryWrapper<MallMember>() .select(MallMember::getId, MallMember::getName, MallMember::getAvatar) .in(MallMember::getId,memberIds) ); //stream流操作mallMembers得到一个Map<memberId,MallMember>的map对象 Map<Long, MallMember> mallMemberMap = mallMembers.stream().collect(Collectors.toMap(MallMember::getId, mallMember -> mallMember)); records.forEach(record -> { MallMember mallMember = mallMemberMap.get(record.getMemberId()); record.setName(mallMember.getName()); record.setAvatar(mallMember.getAvatar()); }); } } return new FebsResponse().success().data(voteRecordInPage); } @Override public FebsResponse operateRegister(ApiOperateRegisterActivityDto dto) { return null; } public static void main(String[] args) { Date date = new Date(); //获取今日的凌晨的时间 DateTime dateTime = DateUtil.beginOfDay(date); System.out.println(dateTime); } } src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityDto.java
New file @@ -0,0 +1,20 @@ package cc.mrbird.febs.mall.vo.api.activity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotNull; @Data @ApiModel(value = "ApiActivityDto", description = "接收参数类") public class ApiActivityDto { @NotNull(message = "ID不能为空") @ApiModelProperty(value = "ID") private Long id; @NotNull(message = "活动类型不能为空") @ApiModelProperty(value = "活动类型 1-普通活动 2-众筹活动 3-投票活动") private Integer type; } src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityInfoDto.java
New file @@ -0,0 +1,30 @@ package cc.mrbird.febs.mall.vo.api.activity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotNull; @Data @ApiModel(value = "ApiActivityInfoDto", description = "参数") public class ApiActivityInfoDto { @NotNull(message = "页码不能为空") @ApiModelProperty(value = "页码", example = "1") private Integer pageNow; @NotNull(message = "每页数量不能为空") @ApiModelProperty(value = "每页数量", example = "10") private Integer pageSize; @ApiModelProperty(value = "分类ID") private Long categoryId; @ApiModelProperty(value = "首页活动 0-不推荐 1-推荐", example = "1") private Integer hotState; @ApiModelProperty(value = "查询名称", example = "123") private String query; } src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityInfoVo.java
New file @@ -0,0 +1,44 @@ package cc.mrbird.febs.mall.vo.api.activity; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.Date; import java.util.List; @Data @ApiModel(value = "ApiActivityInfoVo", description = "参数") public class ApiActivityInfoVo { @ApiModelProperty(value = "ID") private Long id; @ApiModelProperty(value = "活动封面") private String indexImg; @ApiModelProperty(value = "编码") private String code; @ApiModelProperty(value = "名称") private String name; @ApiModelProperty(value = "状态 0-未开始 1-报名中(进行中) 2-已结束") private Integer state; @ApiModelProperty(value = "开始时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date startTime; @ApiModelProperty(value = "结束时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date endTime; @ApiModelProperty(value = "参与人数") private Integer joinCnt; @ApiModelProperty(value = "参与头像") private List<String> memberAvatars; } src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityVo.java
New file @@ -0,0 +1,69 @@ package cc.mrbird.febs.mall.vo.api.activity; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.util.Date; @Data @ApiModel(value = "ApiActivityVo", description = "参数") public class ApiActivityVo { @ApiModelProperty(value = "ID") private Long id; @ApiModelProperty(value = "编码") private String code; @ApiModelProperty(value = "名称") private String name; @ApiModelProperty(value = "活动类型 1-普通活动 2-众筹活动 3-投票活动") private Integer type; @ApiModelProperty(value = "参与人数") private Integer joinCnt; @ApiModelProperty(value = "状态 0-未开始 1-报名中(进行中) 2-已结束") private Integer state; @ApiModelProperty(value = "开始时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date startTime; @ApiModelProperty(value = "结束时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date endTime; @ApiModelProperty(value = "活动联系方式") private String phone; @ApiModelProperty(value = "活动地址") private String address; @ApiModelProperty(value = "门票预计数量") private Integer expectCnt; @ApiModelProperty(value = "门票剩余数量") private Integer surplusCnt; @ApiModelProperty(value = "是否众筹 0-关闭 1-开启(开启代表收取参与费用)") private Integer payState; @ApiModelProperty(value = "众筹金额(单价)") private BigDecimal payAmount; @ApiModelProperty(value = "图片描述") private String imgRemark; @ApiModelProperty(value = "文字描述") private String textRemark; @ApiModelProperty(value = "活动封面") private String indexImg; @ApiModelProperty(value = "背景图片") private String backImg; } src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiOperateRegisterActivityDto.java
New file @@ -0,0 +1,55 @@ package cc.mrbird.febs.mall.vo.api.activity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; @Data @ApiModel(value = "ApiOperateRegisterActivityDto", description = "参数") public class ApiOperateRegisterActivityDto { @NotBlank(message = "活动ID不可为空") @ApiModelProperty(value = "活动ID", example = "1") private Long activityId;//投票活动ID @ApiModelProperty(value = "投票选项图片 URL", example = "http://www.baidu.com") private String image;//投票选项图片 URL @ApiModelProperty(value = "视频url", example = "http://www.baidu.com") private String videoUrl; //视频url @ApiModelProperty(value = "详情描述", example = "详情描述") private String description;//详情描述 @NotBlank(message = "选手名称不可为空") @ApiModelProperty(value = "选手名称", example = "丽丽") private String realName;//选手名称 @NotBlank(message = "手机不可为空") @ApiModelProperty(value = "手机", example = "18700000000") private String mobilePhone;//手机 @ApiModelProperty(value = "省份", example = "湖南省") private String province;//省份 @ApiModelProperty(value = "城市", example = "长沙市") private String city;//城市 @ApiModelProperty(value = "地址", example = "XX街道20") private String address;//地址 @ApiModelProperty(value = "邮箱", example = "123456@qq.com") private String email;//邮箱 @ApiModelProperty(value = "性别", example = "男") private String sex;//性别 @ApiModelProperty(value = "兴趣爱好", example = "篮球") private String hobby;//兴趣爱好 @ApiModelProperty(value = "是否签约MCN机构", example = "1") private String mcnState;//是否签约MCN机构 0否 1是 } src/main/java/cc/mrbird/febs/mall/vo/api/activity/category/ApiCategoryInfoVo.java
New file @@ -0,0 +1,25 @@ package cc.mrbird.febs.mall.vo.api.activity.category; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value = "ApiCategoryInfoVo", description = "参数") public class ApiCategoryInfoVo { @ApiModelProperty(value = "ID") private Long id; @ApiModelProperty(value = "名称") private String name; // @ApiModelProperty(value = "排序") // private Integer orderCnt; // // @ApiModelProperty(value = "是否推荐到首页 0-不推荐 1-推荐") // private Integer hotState; // // @ApiModelProperty(value = "状态 0-未开启 1-已开启") // private Integer state; } src/main/java/cc/mrbird/febs/mall/vo/api/activity/follow/ApiOperateDoDto.java
New file @@ -0,0 +1,27 @@ package cc.mrbird.febs.mall.vo.api.activity.follow; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotNull; @Data @ApiModel(value = "ApiOperateDoDto", description = "接收参数类") public class ApiOperateDoDto { @NotNull(message = "来源ID不能为空") @ApiModelProperty(value = "来源ID") private Long sourceId; @ApiModelProperty(value = "来源选项ID") private Long sourceOptionId; @NotNull(message = "来源类型不能为空") @ApiModelProperty(value = "来源类型 1-活动 2-社区圈子发布") private Integer sourceType; @NotNull(message = "操作类型不能为空") @ApiModelProperty(value = "操作类型 1-关注 2-点赞 3-分享 4-投票") private Integer type; } src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiActivityOptionListVo.java
New file @@ -0,0 +1,26 @@ package cc.mrbird.febs.mall.vo.api.activity.options; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value = "ApiActivityOptionListVo", description = "接收参数类") public class ApiActivityOptionListVo { @ApiModelProperty(value = "选项ID") private Long id; @ApiModelProperty(value = "选项名称") private String optionName; @ApiModelProperty(value = "排名") private Integer rank; @ApiModelProperty(value = "点赞数量") private Integer likesCnt; @ApiModelProperty(value = "投票选项图片 URL") private String image; } src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiActivityOptionVo.java
New file @@ -0,0 +1,43 @@ package cc.mrbird.febs.mall.vo.api.activity.options; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value = "ApiActivityOptionVo", description = "参数") public class ApiActivityOptionVo { @ApiModelProperty(value = "选项ID") private Long id; @ApiModelProperty(value = "选项名称") private String optionName; @ApiModelProperty(value = "排名") private Integer rank; @ApiModelProperty(value = "点赞数量") private Integer likesCnt; @ApiModelProperty(value = "投票选项图片 URL") private String image; @ApiModelProperty(value = "投票选项视频URL") private String videoUrl; @ApiModelProperty(value = "选项描述") private String description; @ApiModelProperty(value = "名称") private String realName; @ApiModelProperty(value = "性别 0-女1-男 2-保密") private Integer sex; @ApiModelProperty(value = "爱好") private String hobby; @ApiModelProperty(value = "是否签约mcn机构 0否 1是") private Integer mcnState; } src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiOperateVoteDto.java
New file @@ -0,0 +1,25 @@ package cc.mrbird.febs.mall.vo.api.activity.options; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotNull; @Data @ApiModel(value = "ApiOperateVoteDto", description = "接收参数类") public class ApiOperateVoteDto { @NotNull(message = "来源ID不能为空") @ApiModelProperty(value = "来源ID") private Long sourceId; @NotNull(message = "来源选项ID不能为空") @ApiModelProperty(value = "来源选项ID") private Long sourceOptionId; @NotNull(message = "来源类型不能为空") @ApiModelProperty(value = "来源类型 1-活动 2-社区圈子发布") private Integer sourceType; } src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiVoteRecordInPageDto.java
New file @@ -0,0 +1,26 @@ package cc.mrbird.febs.mall.vo.api.activity.options; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotNull; @Data @ApiModel(value = "ApiVoteRecordInPageDto", description = "参数") public class ApiVoteRecordInPageDto { @NotNull(message = "页码不能为空") @ApiModelProperty(value = "页码", example = "1") private Integer pageNow; @NotNull(message = "每页数量不能为空") @ApiModelProperty(value = "每页数量", example = "10") private Integer pageSize; @NotNull(message = "选项ID不能为空") @ApiModelProperty(value = "选项ID") private Long sourceOptionId; } src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiVoteRecordInPageVo.java
New file @@ -0,0 +1,26 @@ package cc.mrbird.febs.mall.vo.api.activity.options; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.Date; @Data @ApiModel(value = "ApiVoteRecordInPageVo", description = "参数") public class ApiVoteRecordInPageVo { @ApiModelProperty(value = "用户memberId") private Long memberId; @ApiModelProperty(value = "投票时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createdTime; @ApiModelProperty(value = "会员名称") private String name; @ApiModelProperty(value = "头像") private String avatar; } src/main/resources/application-test.yml
@@ -70,8 +70,8 @@ # wecharpaySecret: CSxc168888CSxc168888CSxc168888xc xcx: wechar_login_url: https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code xcx_appid: wxad2fdb2fcad10fb2 xcx_secret: 9bb58d655bff419feec3a6d948ca8b8d xcx_appid: wxad2fdb2fcad10fb21 xcx_secret: 9bb58d655bff419feec3a6d948ca8b8d1 debug: true wecharPaynotifyUrl: http://blnka.csxuncong.com/api/xcxPay/wxpayCallback wecharRechargePaynotifyUrl: http://blnka.csxuncong.com/api/xcxPay/rechargeCallBack src/main/resources/mapper/modules/HappyActivityMapper.xml
New file @@ -0,0 +1,45 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cc.mrbird.febs.mall.mapper.HappyActivityMapper"> <select id="selectActivityPage" resultType="cc.mrbird.febs.mall.vo.api.activity.ApiActivityInfoVo"> select a.id, a.index_img, a.code, a.name, a.state, a.join_cnt, a.start_time, a.end_time from happy_activity a <where> a.state != 0 and a.DELETE_FLAG = 0 <if test="record != null"> <if test="record.query != null and record.query != ''"> and a.name like CONCAT('%', CONCAT(#{record.query}, '%')) </if> <if test="record.hotState != null"> and a.hot_state=#{record.hotState} </if> <if test="record.categoryId != null"> and a.category_id=#{record.categoryId} </if> </if> </where> order by a.order_cnt asc, a.id desc </select> <select id="getVoteRecordInPage" resultType="cc.mrbird.febs.mall.vo.api.activity.options.ApiVoteRecordInPageVo"> select a.member_id as memberId, a.created_time as createdTime from happy_follow a where a.type = 4 and a.source_option_id = #{record.sourceOptionId} order by a.id desc </select> </mapper>