KKSU
2025-04-17 074fc7dcdde6c9501e0f6ee8b247205c2f427e79
初始化
28 files added
2 files modified
1320 ■■■■■ changed files
src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/StateUpDownEnum.java 55 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ApiHappyActivityCategoryController.java 46 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ApiHappyActivityController.java 102 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/HappyActivity.java 64 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/HappyActivityCategory.java 23 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/HappyActivityOption.java 54 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/HappyFollow.java 27 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityCategoryMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityMapper.java 17 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityOptionMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/HappyFollowMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/HappyActivityCategoryService.java 11 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/HappyActivityService.java 34 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityCategoryServiceImpl.java 80 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java 319 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityDto.java 20 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityInfoDto.java 30 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityInfoVo.java 44 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityVo.java 69 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiOperateRegisterActivityDto.java 55 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/api/activity/category/ApiCategoryInfoVo.java 25 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/api/activity/follow/ApiOperateDoDto.java 27 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiActivityOptionListVo.java 26 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiActivityOptionVo.java 43 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiOperateVoteDto.java 25 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiVoteRecordInPageDto.java 26 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiVoteRecordInPageVo.java 26 ●●●●● patch | view | raw | blame | history
src/main/resources/application-test.yml 4 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/HappyActivityMapper.xml 45 ●●●●● patch | view | raw | blame | history
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>