From 05fe558f722590aa706c2296c8a9a619d12b42be Mon Sep 17 00:00:00 2001
From: rentaiming <806181062@qq.com>
Date: 星期一, 27 五月 2024 14:35:06 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/MgtAuctionGoodsController.java |    6 +
 ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java            |   11 +
 ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/impl/ArticleServiceImpl.java                 |    2 
 ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/IMemberLikeService.java                      |   16 ++
 ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/Article.java                                  |    2 
 ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/MemberLike.java                               |   62 ++++++++++
 ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/SensitiveWords.java                           |    2 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSeckillService.java                        |    5 
 ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/IArticleCommentsService.java                 |    1 
 ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/controller/SensitiveWordsController.java             |   11 -
 ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/SensitiveWordsMapper.java                     |    2 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java          |   34 ++++-
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/async/AsyncMethodService.java                    |    7 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/inner/GoodsSeckillController.java             |   15 ++
 ruoyi-modules/ruoyi-article/src/main/resources/mapper/article/MemberLikeMapper.xml                               |    5 
 ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/IArticleService.java                         |    3 
 ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/impl/MemberLikeServiceImpl.java              |   21 +++
 ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/controller/ArticleController.java                    |    4 
 ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/IAuctionGoodsService.java                    |    7 +
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constants/NotificationTypeConstant.java            |   11 +
 ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/ISensitiveWordsService.java                  |    3 
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java                |   31 ++++-
 ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/ArticleCommentsMapper.java                    |    2 
 ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/MemberLikeMapper.java                         |   16 ++
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/inner/GoodsGroupPurchaseController.java       |   15 ++
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsGroupPurchaseService.java                  |    5 
 ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/ArticleMapper.java                            |    2 
 ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/ArticleComments.java                          |    2 
 ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/impl/SensitiveWordsServiceImpl.java          |   10 -
 ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/controller/MemberLikeController.java                 |   20 +++
 30 files changed, 278 insertions(+), 55 deletions(-)

diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constants/NotificationTypeConstant.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constants/NotificationTypeConstant.java
new file mode 100644
index 0000000..b5e2e23
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constants/NotificationTypeConstant.java
@@ -0,0 +1,11 @@
+package com.ruoyi.system.api.constants;
+
+/**
+ * @author mitao
+ * @date 2024/5/27
+ */
+public interface NotificationTypeConstant {
+
+    String SECKILL = "seckill";
+    String GROUP_PURCHASE = "group_purchase";
+}
diff --git a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/controller/ArticleController.java b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/controller/ArticleController.java
index 660147e..f5dfd23 100644
--- a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/controller/ArticleController.java
+++ b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/controller/ArticleController.java
@@ -1,7 +1,7 @@
 package com.ruoyi.article.controller;
 
 
-import com.ruoyi.article.domain.pojo.Article;
+import com.ruoyi.article.domain.Article;
 import com.ruoyi.article.dto.ArticleDTO;
 import com.ruoyi.article.service.IArticleService;
 import com.ruoyi.article.vo.ArticleCommentsVO;
@@ -12,9 +12,9 @@
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.apache.poi.ss.formula.functions.T;
+import javax.annotation.Resource;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
-
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.RestController;
 
diff --git a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/controller/MemberLikeController.java b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/controller/MemberLikeController.java
new file mode 100644
index 0000000..9dc38ce
--- /dev/null
+++ b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/controller/MemberLikeController.java
@@ -0,0 +1,20 @@
+package com.ruoyi.article.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 用户点赞关联表 前端控制器
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-05-27
+ */
+@RestController
+@RequestMapping("/member-like")
+public class MemberLikeController {
+
+}
diff --git a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/controller/SensitiveWordsController.java b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/controller/SensitiveWordsController.java
index 44ef633..0f17b8d 100644
--- a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/controller/SensitiveWordsController.java
+++ b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/controller/SensitiveWordsController.java
@@ -1,21 +1,16 @@
 package com.ruoyi.article.controller;
 
 
-import com.ruoyi.article.domain.pojo.Article;
-import com.ruoyi.article.domain.pojo.SensitiveWords;
-import com.ruoyi.article.dto.ArticleDTO;
+import com.ruoyi.article.domain.SensitiveWords;
 import com.ruoyi.article.service.ISensitiveWordsService;
 import com.ruoyi.common.core.domain.R;
-import com.ruoyi.common.core.utils.page.PageDTO;
 import io.swagger.annotations.ApiOperation;
+import java.util.List;
+import javax.annotation.Resource;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
-
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-import java.util.List;
 
 /**
  * <p>
diff --git a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/pojo/Article.java b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/Article.java
similarity index 98%
rename from ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/pojo/Article.java
rename to ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/Article.java
index 6aca620..b454e5e 100644
--- a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/pojo/Article.java
+++ b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/Article.java
@@ -1,4 +1,4 @@
-package com.ruoyi.article.domain.pojo;
+package com.ruoyi.article.domain;
 
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.IdType;
diff --git a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/pojo/ArticleComments.java b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/ArticleComments.java
similarity index 98%
rename from ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/pojo/ArticleComments.java
rename to ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/ArticleComments.java
index c744096..01597c6 100644
--- a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/pojo/ArticleComments.java
+++ b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/ArticleComments.java
@@ -1,4 +1,4 @@
-package com.ruoyi.article.domain.pojo;
+package com.ruoyi.article.domain;
 
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.IdType;
diff --git a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/MemberLike.java b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/MemberLike.java
new file mode 100644
index 0000000..1666013
--- /dev/null
+++ b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/MemberLike.java
@@ -0,0 +1,62 @@
+package com.ruoyi.article.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 用户点赞关联表
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-05-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("t_member_like")
+@ApiModel(value = "MemberLike对象", description = "用户点赞关联表")
+public class MemberLike implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "会员id")
+    private Long memberId;
+
+    @ApiModelProperty(value = "资讯id/评论id/回复id")
+    private Long articleId;
+
+    @ApiModelProperty(value = "1 点赞资讯,2 点赞评论, 3 点赞回复")
+    private Long type;
+
+    @ApiModelProperty(value = "创建者")
+    private String createBy;
+
+    @ApiModelProperty(value = "创建时间")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "更新者")
+    private String updateBy;
+
+    @ApiModelProperty(value = "更新时间")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "删除标志(0代表存在 1代表删除)")
+    private Integer delFlag;
+
+    @ApiModelProperty(value = "点赞数")
+    private Long likeNum;
+
+
+}
diff --git a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/pojo/SensitiveWords.java b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/SensitiveWords.java
similarity index 97%
rename from ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/pojo/SensitiveWords.java
rename to ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/SensitiveWords.java
index 3a9e1e5..a07a293 100644
--- a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/pojo/SensitiveWords.java
+++ b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/domain/SensitiveWords.java
@@ -1,4 +1,4 @@
-package com.ruoyi.article.domain.pojo;
+package com.ruoyi.article.domain;
 
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.IdType;
diff --git a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/ArticleCommentsMapper.java b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/ArticleCommentsMapper.java
index 6543e59..f6af9fb 100644
--- a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/ArticleCommentsMapper.java
+++ b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/ArticleCommentsMapper.java
@@ -1,7 +1,7 @@
 package com.ruoyi.article.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.ruoyi.article.domain.pojo.ArticleComments;
+import com.ruoyi.article.domain.ArticleComments;
 
 /**
  * <p>
diff --git a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/ArticleMapper.java b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/ArticleMapper.java
index 2df9bcb..213c012 100644
--- a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/ArticleMapper.java
+++ b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/ArticleMapper.java
@@ -1,7 +1,7 @@
 package com.ruoyi.article.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.ruoyi.article.domain.pojo.Article;
+import com.ruoyi.article.domain.Article;
 
 /**
  * <p>
diff --git a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/MemberLikeMapper.java b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/MemberLikeMapper.java
new file mode 100644
index 0000000..e1c0493
--- /dev/null
+++ b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/MemberLikeMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.article.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.article.domain.MemberLike;
+
+/**
+ * <p>
+ * 用户点赞关联表 Mapper 接口
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-05-27
+ */
+public interface MemberLikeMapper extends BaseMapper<MemberLike> {
+
+}
diff --git a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/SensitiveWordsMapper.java b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/SensitiveWordsMapper.java
index 00a0c20..1c75036 100644
--- a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/SensitiveWordsMapper.java
+++ b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/mapper/SensitiveWordsMapper.java
@@ -1,7 +1,7 @@
 package com.ruoyi.article.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.ruoyi.article.domain.pojo.SensitiveWords;
+import com.ruoyi.article.domain.SensitiveWords;
 
 /**
  * <p>
diff --git a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/IArticleCommentsService.java b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/IArticleCommentsService.java
index f94bad4..39ce0b5 100644
--- a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/IArticleCommentsService.java
+++ b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/IArticleCommentsService.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.article.domain.pojo.ArticleComments;
 import com.ruoyi.article.dto.ArticleCommentsDTO;
+import com.ruoyi.article.domain.ArticleComments;
 
 /**
  * <p>
diff --git a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/IArticleService.java b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/IArticleService.java
index 9624520..5b522b4 100644
--- a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/IArticleService.java
+++ b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/IArticleService.java
@@ -1,11 +1,10 @@
 package com.ruoyi.article.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.ruoyi.article.domain.pojo.Article;
+import com.ruoyi.article.domain.Article;
 import com.ruoyi.article.dto.ArticleDTO;
 import com.ruoyi.article.vo.ArticleCommentsVO;
 import com.ruoyi.common.core.utils.page.PageDTO;
-import com.ruoyi.system.api.domain.MemberAddress;
 
 /**
  * <p>
diff --git a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/IMemberLikeService.java b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/IMemberLikeService.java
new file mode 100644
index 0000000..b5d537a
--- /dev/null
+++ b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/IMemberLikeService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.article.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.article.domain.MemberLike;
+
+/**
+ * <p>
+ * 用户点赞关联表 服务类
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-05-27
+ */
+public interface IMemberLikeService extends IService<MemberLike> {
+
+}
diff --git a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/ISensitiveWordsService.java b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/ISensitiveWordsService.java
index e495227..3c1a2f9 100644
--- a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/ISensitiveWordsService.java
+++ b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/ISensitiveWordsService.java
@@ -1,8 +1,7 @@
 package com.ruoyi.article.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.ruoyi.article.domain.pojo.SensitiveWords;
-
+import com.ruoyi.article.domain.SensitiveWords;
 import java.util.List;
 
 /**
diff --git a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/impl/ArticleServiceImpl.java b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/impl/ArticleServiceImpl.java
index 55ac505..b16b40c 100644
--- a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/impl/ArticleServiceImpl.java
+++ b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/impl/ArticleServiceImpl.java
@@ -6,6 +6,7 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.article.domain.pojo.Article;
 import com.ruoyi.article.domain.pojo.ArticleComments;
+import com.ruoyi.article.domain.Article;
 import com.ruoyi.article.dto.ArticleDTO;
 import com.ruoyi.article.mapper.ArticleMapper;
 import com.ruoyi.article.service.IArticleCommentsService;
@@ -23,6 +24,7 @@
 import util.HuaWeiOBSUtil;
 
 import javax.annotation.Resource;
+import org.springframework.stereotype.Service;
 import java.io.IOException;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
diff --git a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/impl/MemberLikeServiceImpl.java b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/impl/MemberLikeServiceImpl.java
new file mode 100644
index 0000000..a855882
--- /dev/null
+++ b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/impl/MemberLikeServiceImpl.java
@@ -0,0 +1,21 @@
+package com.ruoyi.article.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.article.domain.MemberLike;
+import com.ruoyi.article.mapper.MemberLikeMapper;
+import com.ruoyi.article.service.IMemberLikeService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 用户点赞关联表 服务实现类
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-05-27
+ */
+@Service
+public class MemberLikeServiceImpl extends ServiceImpl<MemberLikeMapper, MemberLike> implements
+        IMemberLikeService {
+
+}
diff --git a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/impl/SensitiveWordsServiceImpl.java b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/impl/SensitiveWordsServiceImpl.java
index 4f6387f..0aed3ed 100644
--- a/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/impl/SensitiveWordsServiceImpl.java
+++ b/ruoyi-modules/ruoyi-article/src/main/java/com/ruoyi/article/service/impl/SensitiveWordsServiceImpl.java
@@ -2,17 +2,13 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.article.domain.pojo.Article;
-import com.ruoyi.article.domain.pojo.SensitiveWords;
+import com.ruoyi.article.domain.SensitiveWords;
 import com.ruoyi.article.mapper.SensitiveWordsMapper;
 import com.ruoyi.article.service.ISensitiveWordsService;
-import com.ruoyi.common.core.utils.page.PageDTO;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
 import java.util.List;
+import javax.annotation.Resource;
+import org.springframework.stereotype.Service;
 
 /**
  * <p>
diff --git a/ruoyi-modules/ruoyi-article/src/main/resources/mapper/article/MemberLikeMapper.xml b/ruoyi-modules/ruoyi-article/src/main/resources/mapper/article/MemberLikeMapper.xml
new file mode 100644
index 0000000..0606ed7
--- /dev/null
+++ b/ruoyi-modules/ruoyi-article/src/main/resources/mapper/article/MemberLikeMapper.xml
@@ -0,0 +1,5 @@
+<?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="com.ruoyi.article.mapper.MemberLikeMapper">
+
+</mapper>
diff --git a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/MgtAuctionGoodsController.java b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/MgtAuctionGoodsController.java
index 3043837..94848fe 100644
--- a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/MgtAuctionGoodsController.java
+++ b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/MgtAuctionGoodsController.java
@@ -29,6 +29,12 @@
 
     private final IAuctionGoodsService auctionGoodsService;
 
+    /**
+     * 获取拍卖商品列表的分页数据
+     *
+     * @param query 拍卖商品查询对象
+     * @return PageDTO<AuctionGoodsVO>
+     */
     @ApiOperation(value = "获取拍卖商品列表的分页数据", notes = "获取拍卖商品列表的分页数据")
     @PostMapping("/page")
     public R<PageDTO<AuctionGoodsVO>> getAuctionGoodsPage(
diff --git a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/IAuctionGoodsService.java b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/IAuctionGoodsService.java
index 78d5e68..0433a57 100644
--- a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/IAuctionGoodsService.java
+++ b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/IAuctionGoodsService.java
@@ -15,6 +15,11 @@
  * @since 2024-05-16
  */
 public interface IAuctionGoodsService extends IService<AuctionGoods> {
-
+    /**
+     * 获取拍卖商品列表的分页数据
+     *
+     * @param query 拍卖商品查询对象
+     * @return PageDTO<AuctionGoodsVO>
+     */
     PageDTO<AuctionGoodsVO> getAuctionGoodsPage(AuctionGoodsQuery query);
 }
diff --git a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java
index ae47f33..ef6fd3c 100644
--- a/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java
+++ b/ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java
@@ -36,6 +36,12 @@
     @Resource
     private GoodsSkuClient goodsSkuClient;
 
+    /**
+     * 获取拍卖商品列表的分页数据
+     *
+     * @param query 拍卖商品查询对象
+     * @return PageDTO<AuctionGoodsVO>
+     */
     @Override
     public PageDTO<AuctionGoodsVO> getAuctionGoodsPage(AuctionGoodsQuery query) {
         Set<Long> goodsSkuIdList = null;
@@ -45,7 +51,8 @@
             goodsSkuIdList = goodsSku.stream().map(GoodsSku::getId)
                     .collect(Collectors.toSet());
         }
-        this.lambdaQuery().select(AuctionGoods::getId, AuctionGoods::getGoodsSkuId,
+        Page<AuctionGoods> page = this.lambdaQuery()
+                .select(AuctionGoods::getId, AuctionGoods::getGoodsSkuId,
                         AuctionGoods::getListingStatus, AuctionGoods::getStartStatus,
                         AuctionGoods::getStartTime, AuctionGoods::getEndTime,
                         AuctionGoods::getAuctionStock, AuctionGoods::getMinimumMarkupAmount).in(
@@ -57,6 +64,6 @@
                 .eq(StringUtils.isNotNull(query.getStartStatus()), AuctionGoods::getStartStatus,
                         query.getStartStatus())
                 .page(new Page<>(query.getPageCurr(), query.getPageSize()));
-        return null;
+        return PageDTO.of(page, AuctionGoodsVO.class);
     }
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/inner/GoodsGroupPurchaseController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/inner/GoodsGroupPurchaseController.java
index ebad70f..373ceb6 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/inner/GoodsGroupPurchaseController.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/inner/GoodsGroupPurchaseController.java
@@ -1,6 +1,7 @@
 package com.ruoyi.goods.controller.inner;
 
 
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.security.annotation.InnerAuth;
 import com.ruoyi.goods.service.IGoodsGroupPurchaseService;
@@ -35,7 +36,12 @@
     @InnerAuth
     @GetMapping("/start/{groupPurchaseId}")
     R<?> startGroupPurchase(@PathVariable("groupPurchaseId") Long groupPurchaseId) {
-        goodsGroupPurchaseService.startGroupPurchase(groupPurchaseId);
+        try {
+            goodsGroupPurchaseService.startGroupPurchase(groupPurchaseId);
+        } catch (JsonProcessingException e) {
+            log.error("团购商品开始团购失败", e);
+            return R.fail("团购商品开始团购失败");
+        }
         return R.ok();
     }
 
@@ -47,7 +53,12 @@
     @InnerAuth
     @GetMapping("/end/{groupPurchaseId}")
     R<?> endGroupPurchase(@PathVariable("groupPurchaseId") Long groupPurchaseId) {
-        goodsGroupPurchaseService.endGroupPurchase(groupPurchaseId);
+        try {
+            goodsGroupPurchaseService.endGroupPurchase(groupPurchaseId);
+        } catch (JsonProcessingException e) {
+            log.error("团购商品开始团购失败", e);
+            return R.fail("团购商品结束团购失败");
+        }
         return R.ok();
     }
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/inner/GoodsSeckillController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/inner/GoodsSeckillController.java
index 2b97060..09533e1 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/inner/GoodsSeckillController.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/inner/GoodsSeckillController.java
@@ -1,6 +1,7 @@
 package com.ruoyi.goods.controller.inner;
 
 
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.security.annotation.InnerAuth;
 import com.ruoyi.goods.service.IGoodsSeckillService;
@@ -45,7 +46,12 @@
     @InnerAuth
     @GetMapping("/start/{seckillId}")
     R<?> startSeckill(@PathVariable("seckillId") Long seckillId) {
-        goodsSeckillService.startSeckill(seckillId);
+        try {
+            goodsSeckillService.startSeckill(seckillId);
+        } catch (JsonProcessingException e) {
+            log.error("秒杀开始异常", e);
+            return R.fail();
+        }
         return R.ok();
     }
 
@@ -57,7 +63,12 @@
     @InnerAuth
     @GetMapping("/end/{seckillId}")
     R<?> endSeckill(@PathVariable("seckillId") Long seckillId) {
-        goodsSeckillService.endSeckill(seckillId);
+        try {
+            goodsSeckillService.endSeckill(seckillId);
+        } catch (JsonProcessingException e) {
+            log.error("秒杀结束异常", e);
+            return R.fail();
+        }
         return R.ok();
     }
 
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsGroupPurchaseService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsGroupPurchaseService.java
index 04a1f71..1550c37 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsGroupPurchaseService.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsGroupPurchaseService.java
@@ -1,6 +1,7 @@
 package com.ruoyi.goods.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.ruoyi.common.core.utils.page.PageDTO;
 import com.ruoyi.goods.controller.management.dto.GoodsGroupPurchaseDTO;
 import com.ruoyi.goods.controller.management.dto.GoodsGroupPurchaseQuery;
@@ -53,14 +54,14 @@
      *
      * @param groupPurchaseId 团购商品id
      */
-    void startGroupPurchase(Long groupPurchaseId);
+    void startGroupPurchase(Long groupPurchaseId) throws JsonProcessingException;
 
     /**
      * 团购商品结束团购
      *
      * @param groupPurchaseId 团购商品id
      */
-    void endGroupPurchase(Long groupPurchaseId);
+    void endGroupPurchase(Long groupPurchaseId) throws JsonProcessingException;
 
     /**
      * 立即结束团购
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSeckillService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSeckillService.java
index fa85f00..eb363f7 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSeckillService.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSeckillService.java
@@ -1,6 +1,7 @@
 package com.ruoyi.goods.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.ruoyi.common.core.utils.page.PageDTO;
 import com.ruoyi.goods.controller.management.dto.GoodsSeckillDTO;
 import com.ruoyi.goods.controller.management.dto.GoodsSeckillQuery;
@@ -61,12 +62,12 @@
      *
      * @param seckillId 秒杀id
      */
-    void startSeckill(Long seckillId);
+    void startSeckill(Long seckillId) throws JsonProcessingException;
 
     /**
      * 结束秒杀
      *
      * @param seckillId 秒杀id
      */
-    void endSeckill(Long seckillId);
+    void endSeckill(Long seckillId) throws JsonProcessingException;
 }
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/async/AsyncMethodService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/async/AsyncMethodService.java
index a0a2954..975ab4c 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/async/AsyncMethodService.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/async/AsyncMethodService.java
@@ -13,13 +13,14 @@
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.scheduling.annotation.Async;
-import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * @author mitao
  * @date 2024/5/24
  */
-@Component
+@Service
 @Slf4j
 @RequiredArgsConstructor
 public class AsyncMethodService {
@@ -28,6 +29,7 @@
     private final SysUserClient sysUserClient;
 
     @Async
+    @Transactional(rollbackFor = Exception.class)
     public void seckillScheduleTask(GoodsSeckill goodsSeckill) {
         LocalDateTime startTime = goodsSeckill.getStartTime();
         LocalDateTime endTime = goodsSeckill.getEndTime();
@@ -50,6 +52,7 @@
     }
 
     @Async
+    @Transactional(rollbackFor = Exception.class)
     public void groupPurchaseScheduleTask(GoodsGroupPurchase groupPurchase) {
         LocalDateTime startTime = groupPurchase.getStartTime();
         LocalDateTime endTime = groupPurchase.getEndTime();
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java
index dbb37c1..69dc106 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java
@@ -2,6 +2,8 @@
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.ruoyi.common.core.enums.GroupStatusEnum;
 import com.ruoyi.common.core.enums.ListingStatusEnum;
 import com.ruoyi.common.core.enums.PaymentMethodEnum;
@@ -18,15 +20,19 @@
 import com.ruoyi.goods.service.IGoodsGroupPurchaseService;
 import com.ruoyi.goods.service.IGoodsSkuService;
 import com.ruoyi.goods.service.async.AsyncMethodService;
-import com.ruoyi.system.api.WebSocketUsers;
+import com.ruoyi.system.api.constants.NotificationTypeConstant;
 import com.ruoyi.system.api.domain.GoodsSku;
 import com.ruoyi.system.api.domain.Order;
 import com.ruoyi.system.api.domain.dto.ListStatusDTO;
 import com.ruoyi.system.api.feignClient.OrderClient;
+import java.time.LocalDateTime;
 import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import util.WebSocketUsers;
 
 /**
  * <p>
@@ -44,6 +50,8 @@
     private final OrderClient orderClient;
     private final IGoodsSkuService goodsSkuService;
     private final AsyncMethodService asyncMethodService;
+    // 创建一个静态共享的ObjectMapper实例以重用
+    private static final ObjectMapper objectMapper = new ObjectMapper();
     /**
      * 获取团购商品列表的分页数据
      *
@@ -148,15 +156,19 @@
      * @param groupPurchaseId 团购商品id
      */
     @Override
-    public void startGroupPurchase(Long groupPurchaseId) {
+    public void startGroupPurchase(Long groupPurchaseId) throws JsonProcessingException {
         log.info(">>>>>>>>>>>>>>>>>>>>{}团购商品开始团购<<<<<<<<<<<<<<<<<<<<", groupPurchaseId);
         GoodsGroupPurchase groupPurchase = this.getById(groupPurchaseId);
         if (StringUtils.isNotNull(groupPurchase)) {
             this.lambdaUpdate().set(GoodsGroupPurchase::getStartStatus, StartStatusEnum.STARTED)
                     .eq(GoodsGroupPurchase::getId, groupPurchaseId).update();
-            //TODO 通知小程序
-            WebSocketUsers.sendMessageToUsersByText(
-                    "团购商品" + groupPurchase.getGoodsSkuName() + "开始团购");
+            Map<String, Object> map = new ConcurrentHashMap<>();
+            map.put("notification_type", NotificationTypeConstant.GROUP_PURCHASE);
+            map.put("notification_time", LocalDateTime.now());
+            map.put("message_type", "start");
+            String msg = objectMapper.writeValueAsString(map);
+            WebSocketUsers.sendMessageToUsersByText(msg);
+            log.info("===================>发送websocket通知,消息体{}", msg);
         }
     }
 
@@ -166,15 +178,19 @@
      * @param groupPurchaseId 团购商品id
      */
     @Override
-    public void endGroupPurchase(Long groupPurchaseId) {
+    public void endGroupPurchase(Long groupPurchaseId) throws JsonProcessingException {
         log.info(">>>>>>>>>>>>>>>>>>>>{}团购商品结束团购<<<<<<<<<<<<<<<<<<<<", groupPurchaseId);
         GoodsGroupPurchase groupPurchase = this.getById(groupPurchaseId);
         if (StringUtils.isNotNull(groupPurchase)) {
             this.lambdaUpdate().set(GoodsGroupPurchase::getStartStatus, StartStatusEnum.ENDED)
                     .eq(GoodsGroupPurchase::getId, groupPurchaseId).update();
-            //TODO 通知小程序
-            WebSocketUsers.sendMessageToUsersByText(
-                    "团购商品" + groupPurchase.getGoodsSkuName() + "结束团购");
+            Map<String, Object> map = new ConcurrentHashMap<>();
+            map.put("notification_type", NotificationTypeConstant.GROUP_PURCHASE);
+            map.put("notification_time", LocalDateTime.now());
+            map.put("message_type", "end");
+            String msg = objectMapper.writeValueAsString(map);
+            WebSocketUsers.sendMessageToUsersByText(msg);
+            log.info("===================>发送websocket通知,消息体{}", msg);
         }
     }
 
diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java
index 8cf04e0..60955b8 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java
@@ -2,6 +2,8 @@
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.ruoyi.common.core.constant.CacheConstants;
 import com.ruoyi.common.core.enums.StartStatusEnum;
 import com.ruoyi.common.core.exception.ServiceException;
@@ -17,18 +19,22 @@
 import com.ruoyi.goods.service.IGoodsSeckillService;
 import com.ruoyi.goods.service.IGoodsSkuService;
 import com.ruoyi.goods.service.async.AsyncMethodService;
-import com.ruoyi.system.api.WebSocketUsers;
+import com.ruoyi.system.api.constants.NotificationTypeConstant;
 import com.ruoyi.system.api.domain.GoodsSeckill;
 import com.ruoyi.system.api.domain.GoodsSku;
 import com.ruoyi.system.api.domain.dto.ListStatusDTO;
 import com.ruoyi.system.api.feignClient.OrderClient;
 import com.ruoyi.system.api.feignClient.SysUserClient;
+import java.time.LocalDateTime;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import util.WebSocketUsers;
 
 /**
  * <p>
@@ -48,6 +54,8 @@
     private final RedisService redisService;
     private final SysUserClient sysUserClient;
     private final AsyncMethodService asyncMethodService;
+    // 创建一个静态共享的ObjectMapper实例以重用
+    private static final ObjectMapper objectMapper = new ObjectMapper();
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void addGoodsSeckill(GoodsSeckillDTO dto) {
@@ -147,7 +155,7 @@
      * @param seckillId 秒杀id
      */
     @Override
-    public void startSeckill(Long seckillId) {
+    public void startSeckill(Long seckillId) throws JsonProcessingException {
         log.info(">>>>>>>>>>>>>>>>>>>>{}秒杀开始<<<<<<<<<<<<<<<<<<<<", seckillId);
         GoodsSeckill goodsSeckill = this.getById(seckillId);
         //秒杀商品不能为空且状态为未开始
@@ -162,7 +170,13 @@
                     goodsSeckill.getSeckillStock());
         }
         //推送秒杀开始消息
-        WebSocketUsers.sendMessageToUsersByText("秒杀活动已开始");
+        Map<String, Object> map = new ConcurrentHashMap<>();
+        map.put("notification_type", NotificationTypeConstant.SECKILL);
+        map.put("notification_time", LocalDateTime.now());
+        map.put("message_type", "start");
+        String msg = objectMapper.writeValueAsString(map);
+        WebSocketUsers.sendMessageToUsersByText(msg);
+        log.info("===================>发送websocket通知,消息体{}", msg);
     }
 
     /**
@@ -171,7 +185,7 @@
      * @param seckillId 秒杀id
      */
     @Override
-    public void endSeckill(Long seckillId) {
+    public void endSeckill(Long seckillId) throws JsonProcessingException {
         log.info(">>>>>>>>>>>>>>>>>>>>{}秒杀结束<<<<<<<<<<<<<<<<<<<<", seckillId);
         GoodsSeckill goodsSeckill = this.getById(seckillId);
         if (StringUtils.isNotNull(goodsSeckill)
@@ -182,7 +196,12 @@
 //            将秒杀商品从缓存中移除
             redisService.deleteObject(CacheConstants.SECKILL_GOODS + goodsSeckill.getId());
         }
-        //TODO websocket 推送秒杀结束消息
-        WebSocketUsers.sendMessageToUsersByText("秒杀活动已结束");
+        Map<String, Object> map = new ConcurrentHashMap<>();
+        map.put("notification_type", NotificationTypeConstant.SECKILL);
+        map.put("notification_time", LocalDateTime.now());
+        map.put("message_type", "end");
+        String msg = objectMapper.writeValueAsString(map);
+        WebSocketUsers.sendMessageToUsersByText(msg);
+        log.info("===================>发送websocket通知,消息体{}", msg);
     }
 }

--
Gitblit v1.7.1