From 074fc7dcdde6c9501e0f6ee8b247205c2f427e79 Mon Sep 17 00:00:00 2001
From: KKSU <15274802129@163.com>
Date: Thu, 17 Apr 2025 10:19:08 +0800
Subject: [PATCH] 初始化

---
 src/main/java/cc/mrbird/febs/mall/controller/ApiHappyActivityController.java           |  102 ++++
 src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java           |  319 ++++++++++++++
 src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityDto.java                  |   20 
 src/main/java/cc/mrbird/febs/mall/service/HappyActivityCategoryService.java            |   11 
 src/main/java/cc/mrbird/febs/mall/entity/HappyActivityCategory.java                    |   23 +
 src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityOptionMapper.java                |    7 
 src/main/resources/mapper/modules/HappyActivityMapper.xml                              |   45 ++
 src/main/java/cc/mrbird/febs/mall/vo/api/activity/category/ApiCategoryInfoVo.java      |   25 +
 src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityInfoVo.java               |   44 ++
 src/main/java/cc/mrbird/febs/mall/vo/api/activity/follow/ApiOperateDoDto.java          |   27 +
 src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiActivityOptionVo.java     |   43 +
 src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiActivityOptionListVo.java |   26 +
 src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java                     |    2 
 src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityVo.java                   |   69 +++
 src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiOperateRegisterActivityDto.java   |   55 ++
 src/main/java/cc/mrbird/febs/mall/controller/ApiHappyActivityCategoryController.java   |   46 ++
 src/main/java/cc/mrbird/febs/common/enumerates/StateUpDownEnum.java                    |   55 ++
 src/main/java/cc/mrbird/febs/mall/service/HappyActivityService.java                    |   34 +
 src/main/resources/application-test.yml                                                |    4 
 src/main/java/cc/mrbird/febs/mall/entity/HappyActivityOption.java                      |   54 ++
 src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityCategoryMapper.java              |    7 
 src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiVoteRecordInPageVo.java   |   26 +
 src/main/java/cc/mrbird/febs/mall/entity/HappyActivity.java                            |   64 ++
 src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityInfoDto.java              |   30 +
 src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiOperateVoteDto.java       |   25 +
 src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityCategoryServiceImpl.java   |   80 +++
 src/main/java/cc/mrbird/febs/mall/entity/HappyFollow.java                              |   27 +
 src/main/java/cc/mrbird/febs/mall/mapper/HappyFollowMapper.java                        |    7 
 src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityMapper.java                      |   17 
 src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiVoteRecordInPageDto.java  |   26 +
 30 files changed, 1,318 insertions(+), 2 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java b/src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java
index 4d0b4b3..8993c1e 100644
--- a/src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java
+++ b/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");
     }
 }
diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/StateUpDownEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/StateUpDownEnum.java
new file mode 100644
index 0000000..c4f4ba4
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/common/enumerates/StateUpDownEnum.java
@@ -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;
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiHappyActivityCategoryController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiHappyActivityCategoryController.java
new file mode 100644
index 0000000..182db24
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiHappyActivityCategoryController.java
@@ -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();
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiHappyActivityController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiHappyActivityController.java
new file mode 100644
index 0000000..0c1adc8
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiHappyActivityController.java
@@ -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);
+    }
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/HappyActivity.java b/src/main/java/cc/mrbird/febs/mall/entity/HappyActivity.java
new file mode 100644
index 0000000..83dd49f
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/HappyActivity.java
@@ -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;
+
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/HappyActivityCategory.java b/src/main/java/cc/mrbird/febs/mall/entity/HappyActivityCategory.java
new file mode 100644
index 0000000..79d41ad
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/HappyActivityCategory.java
@@ -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;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/HappyActivityOption.java b/src/main/java/cc/mrbird/febs/mall/entity/HappyActivityOption.java
new file mode 100644
index 0000000..28bbbab
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/HappyActivityOption.java
@@ -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;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/HappyFollow.java b/src/main/java/cc/mrbird/febs/mall/entity/HappyFollow.java
new file mode 100644
index 0000000..4325b83
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/HappyFollow.java
@@ -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;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityCategoryMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityCategoryMapper.java
new file mode 100644
index 0000000..2a84d8f
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityCategoryMapper.java
@@ -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> {
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityMapper.java
new file mode 100644
index 0000000..34e8702
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityMapper.java
@@ -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);
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityOptionMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityOptionMapper.java
new file mode 100644
index 0000000..2f1cc67
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityOptionMapper.java
@@ -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> {
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/HappyFollowMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/HappyFollowMapper.java
new file mode 100644
index 0000000..a3fcee3
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/HappyFollowMapper.java
@@ -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> {
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/HappyActivityCategoryService.java b/src/main/java/cc/mrbird/febs/mall/service/HappyActivityCategoryService.java
new file mode 100644
index 0000000..9ad7a34
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/service/HappyActivityCategoryService.java
@@ -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();
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/HappyActivityService.java b/src/main/java/cc/mrbird/febs/mall/service/HappyActivityService.java
new file mode 100644
index 0000000..78dfe73
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/service/HappyActivityService.java
@@ -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);
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityCategoryServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityCategoryServiceImpl.java
new file mode 100644
index 0000000..84246f9
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityCategoryServiceImpl.java
@@ -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);
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java
new file mode 100644
index 0000000..b088dd0
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java
@@ -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);
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityDto.java b/src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityDto.java
new file mode 100644
index 0000000..1622193
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityDto.java
@@ -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;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityInfoDto.java b/src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityInfoDto.java
new file mode 100644
index 0000000..80b14e8
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityInfoDto.java
@@ -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;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityInfoVo.java b/src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityInfoVo.java
new file mode 100644
index 0000000..c2e531a
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityInfoVo.java
@@ -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;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityVo.java b/src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityVo.java
new file mode 100644
index 0000000..5decd94
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiActivityVo.java
@@ -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;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiOperateRegisterActivityDto.java b/src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiOperateRegisterActivityDto.java
new file mode 100644
index 0000000..50e21b3
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/api/activity/ApiOperateRegisterActivityDto.java
@@ -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是
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/category/ApiCategoryInfoVo.java b/src/main/java/cc/mrbird/febs/mall/vo/api/activity/category/ApiCategoryInfoVo.java
new file mode 100644
index 0000000..121dcbe
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/api/activity/category/ApiCategoryInfoVo.java
@@ -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;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/follow/ApiOperateDoDto.java b/src/main/java/cc/mrbird/febs/mall/vo/api/activity/follow/ApiOperateDoDto.java
new file mode 100644
index 0000000..37ab08b
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/api/activity/follow/ApiOperateDoDto.java
@@ -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;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiActivityOptionListVo.java b/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiActivityOptionListVo.java
new file mode 100644
index 0000000..dce99ba
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiActivityOptionListVo.java
@@ -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;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiActivityOptionVo.java b/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiActivityOptionVo.java
new file mode 100644
index 0000000..991d30c
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiActivityOptionVo.java
@@ -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;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiOperateVoteDto.java b/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiOperateVoteDto.java
new file mode 100644
index 0000000..3402938
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiOperateVoteDto.java
@@ -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;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiVoteRecordInPageDto.java b/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiVoteRecordInPageDto.java
new file mode 100644
index 0000000..ba2864f
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiVoteRecordInPageDto.java
@@ -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;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiVoteRecordInPageVo.java b/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiVoteRecordInPageVo.java
new file mode 100644
index 0000000..dc1a495
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/api/activity/options/ApiVoteRecordInPageVo.java
@@ -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;
+}
diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml
index 2292ceb..9443759 100644
--- a/src/main/resources/application-test.yml
+++ b/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
diff --git a/src/main/resources/mapper/modules/HappyActivityMapper.xml b/src/main/resources/mapper/modules/HappyActivityMapper.xml
new file mode 100644
index 0000000..90a0a01
--- /dev/null
+++ b/src/main/resources/mapper/modules/HappyActivityMapper.xml
@@ -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>
\ No newline at end of file

--
Gitblit v1.9.1