Bläddra i källkod

获取积分列表

jin 3 månader sedan
förälder
incheckning
c986b9cb50

+ 30 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/recovery/domain/RecContentUser.java

@@ -0,0 +1,30 @@
+package com.ruoyi.framework.recovery.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class RecContentUser {
+    /**
+     * 记录id
+     */
+    private Long id;
+
+    /**
+     * 评论id
+     */
+    private Long contentId;
+
+    /**
+     * 微信id
+     */
+    private String openId;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+}

+ 25 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/recovery/domain/dto/ContentDto.java

@@ -0,0 +1,25 @@
+package com.ruoyi.framework.recovery.domain.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class ContentDto {
+    /**
+     * 评论id
+     */
+    private Long contentId;
+
+    /**
+     * 微信id
+     */
+    private String openId;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+}

+ 28 - 8
ruoyi-framework/src/main/java/com/ruoyi/framework/recovery/mapper/RecContentMapper.java

@@ -2,18 +2,21 @@ package com.ruoyi.framework.recovery.mapper;
 
 import java.util.List;
 import com.ruoyi.framework.recovery.domain.RecContent;
+import com.ruoyi.framework.recovery.domain.RecContentUser;
+import com.ruoyi.framework.recovery.domain.dto.ContentDto;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 评论Mapper接口
- * 
+ *
  * @author jin
  * @date 2024-11-16
  */
-public interface RecContentMapper 
+public interface RecContentMapper
 {
     /**
      * 查询评论
-     * 
+     *
      * @param id 评论主键
      * @return 评论
      */
@@ -21,7 +24,7 @@ public interface RecContentMapper
 
     /**
      * 查询评论列表
-     * 
+     *
      * @param recContent 评论
      * @return 评论集合
      */
@@ -29,7 +32,7 @@ public interface RecContentMapper
 
     /**
      * 新增评论
-     * 
+     *
      * @param recContent 评论
      * @return 结果
      */
@@ -37,7 +40,7 @@ public interface RecContentMapper
 
     /**
      * 修改评论
-     * 
+     *
      * @param recContent 评论
      * @return 结果
      */
@@ -45,7 +48,7 @@ public interface RecContentMapper
 
     /**
      * 删除评论
-     * 
+     *
      * @param id 评论主键
      * @return 结果
      */
@@ -53,9 +56,26 @@ public interface RecContentMapper
 
     /**
      * 批量删除评论
-     * 
+     *
      * @param ids 需要删除的数据主键集合
      * @return 结果
      */
     public int deleteRecContentByIds(Long[] ids);
+
+    /**
+     * 插入微信用户点赞
+     *
+     * @param dto 入参
+     * @return 结果集
+     */
+    int insertRecContentUser(@Param("dto") ContentDto dto);
+
+    /**
+     * 根据评论id和用户编号查询当前用户是否评论过
+     *
+     * @param wxOpenid 用户id
+     * @param id 评论id
+     * @return 结果集
+     */
+    List<RecContentUser> selectContentUserByOpenId(@Param("openId") String wxOpenid, @Param("contentId") Long id);
 }

+ 17 - 8
ruoyi-framework/src/main/java/com/ruoyi/framework/recovery/service/IRecContentService.java

@@ -5,15 +5,15 @@ import com.ruoyi.framework.recovery.domain.RecContent;
 
 /**
  * 评论Service接口
- * 
+ *
  * @author jin
  * @date 2024-11-16
  */
-public interface IRecContentService 
+public interface IRecContentService
 {
     /**
      * 查询评论
-     * 
+     *
      * @param id 评论主键
      * @return 评论
      */
@@ -21,7 +21,7 @@ public interface IRecContentService
 
     /**
      * 查询评论列表
-     * 
+     *
      * @param recContent 评论
      * @return 评论集合
      */
@@ -29,7 +29,7 @@ public interface IRecContentService
 
     /**
      * 新增评论
-     * 
+     *
      * @param recContent 评论
      * @return 结果
      */
@@ -37,7 +37,7 @@ public interface IRecContentService
 
     /**
      * 修改评论
-     * 
+     *
      * @param recContent 评论
      * @return 结果
      */
@@ -45,7 +45,7 @@ public interface IRecContentService
 
     /**
      * 批量删除评论
-     * 
+     *
      * @param ids 需要删除的评论主键集合
      * @return 结果
      */
@@ -53,9 +53,18 @@ public interface IRecContentService
 
     /**
      * 删除评论信息
-     * 
+     *
      * @param id 评论主键
      * @return 结果
      */
     public int deleteRecContentById(Long id);
+
+    /**
+     * 记录用户点赞
+     *
+     * @param wxOpenid 微信唯一标识
+     * @param id 评论id
+     * @return 结果集
+     */
+    int insertRecContentUser(String wxOpenid, Long id);
 }

+ 11 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/recovery/service/impl/RecContentServiceImpl.java

@@ -2,6 +2,8 @@ package com.ruoyi.framework.recovery.service.impl;
 
 import java.util.Date;
 import java.util.List;
+
+import com.ruoyi.framework.recovery.domain.dto.ContentDto;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.ruoyi.framework.recovery.mapper.RecContentMapper;
@@ -92,4 +94,13 @@ public class RecContentServiceImpl implements IRecContentService
     {
         return recContentMapper.deleteRecContentById(id);
     }
+
+    @Override
+    public int insertRecContentUser(String wxOpenid, Long id) {
+        ContentDto dto = new ContentDto();
+        dto.setContentId(id);
+        dto.setOpenId(wxOpenid);
+        dto.setCreateTime(new Date());
+        return recContentMapper.insertRecContentUser(dto);
+    }
 }

+ 15 - 0
ruoyi-system/src/main/resources/mapper/system/RecContentMapper.xml

@@ -34,6 +34,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <include refid="selectRecContentVo"/>
         where id = #{id}
     </select>
+    <select id="selectContentUserByOpenId" resultType="com.ruoyi.framework.recovery.domain.RecContentUser">
+        select id, content_id as contentId, open_id as openId, create_time as createTime
+        from wx_content_user
+        <where>
+            <if test="contentId != null and contentId != ''">
+                content_id = #{contentId}
+            </if>
+            <if test="openId != null and openId != ''">
+                and open_id = #{openId}
+            </if>
+        </where>
+    </select>
 
     <insert id="insertRecContent" parameterType="RecContent">
         insert into rec_content
@@ -58,6 +70,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="images != null">#{images},</if>
          </trim>
     </insert>
+    <insert id="insertRecContentUser">
+        insert into wx_content_user (content_id, open_id, create_time) values (#{dto.contentId}, #{dto.openId}, #{dto.createTime})
+    </insert>
 
     <update id="updateRecContent" parameterType="RecContent">
         update rec_content

+ 25 - 0
ruoyi-wx/src/main/java/com/ruoyi/wx/web/controller/WxHomeController.java

@@ -3,6 +3,7 @@ package com.ruoyi.wx.web.controller;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.utils.ExceptionUtil;
 import com.ruoyi.framework.recovery.domain.RecContent;
+import com.ruoyi.framework.recovery.domain.RecContentUser;
 import com.ruoyi.wx.web.domain.vo.SaleInfoVo;
 import com.ruoyi.wx.web.service.IWxHomeService;
 import lombok.extern.slf4j.Slf4j;
@@ -43,6 +44,10 @@ public class WxHomeController {
         }
     }
 
+    /**
+     * 销售日历
+     *
+     */
     @GetMapping("/sale/calendar")
     public AjaxResult saleCalendar() {
         try {
@@ -53,6 +58,12 @@ public class WxHomeController {
         }
     }
 
+    /**
+     * 点赞
+     *
+     * @param id 评论Id
+     * @return 结果集
+     */
     @GetMapping("/thumbs/{id}")
     public AjaxResult thumbs(@PathVariable("id") Long id) {
         try {
@@ -63,6 +74,20 @@ public class WxHomeController {
         }
     }
 
+    /**
+     * 当前用户点过的赞
+     *
+     */
+    @GetMapping("/thumbs")
+    public AjaxResult userThumbs() {
+        try {
+            List<RecContentUser> thumbs = wxHomeService.userThumbs();
+            return AjaxResult.success(thumbs);
+        } catch (Exception e) {
+            return AjaxResult.error(ExceptionUtil.getExceptionMessage(e));
+        }
+    }
+
     @PostMapping("/add/content")
     public AjaxResult thumbs(@RequestBody RecContent recContent) {
         try {

+ 7 - 0
ruoyi-wx/src/main/java/com/ruoyi/wx/web/service/IWxHomeService.java

@@ -2,6 +2,7 @@ package com.ruoyi.wx.web.service;
 
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.framework.recovery.domain.RecContent;
+import com.ruoyi.framework.recovery.domain.RecContentUser;
 import com.ruoyi.wx.web.domain.vo.SaleInfoVo;
 
 import java.util.List;
@@ -45,4 +46,10 @@ public interface IWxHomeService {
      * @return 结果集
      */
     int addRecContent(RecContent recContent);
+
+    /**
+     * 获取当前用户点赞记录
+     *
+     */
+    List<RecContentUser> userThumbs();
 }

+ 32 - 35
ruoyi-wx/src/main/java/com/ruoyi/wx/web/service/impl/WxHomeServiceImpl.java

@@ -1,11 +1,15 @@
 package com.ruoyi.wx.web.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
-import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.entity.WxUser;
+import com.ruoyi.common.core.domain.model.LoginWxUser;
 import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.framework.recovery.domain.RecContent;
+import com.ruoyi.framework.recovery.domain.RecContentUser;
 import com.ruoyi.framework.recovery.domain.RecSaleInfo;
 import com.ruoyi.framework.recovery.domain.RecStores;
 import com.ruoyi.framework.recovery.mapper.RecContentMapper;
@@ -19,8 +23,8 @@ import com.ruoyi.wx.web.service.IWxHomeService;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
 import java.time.ZoneId;
@@ -46,9 +50,6 @@ public class WxHomeServiceImpl implements IWxHomeService {
     @Autowired
     private RedisCache redisCache;
 
-    @Autowired
-    private StringRedisTemplate stringRedisTemplate;
-
     @Autowired
     private RecContentMapper recContentMapper;
 
@@ -76,13 +77,6 @@ public class WxHomeServiceImpl implements IWxHomeService {
         executorService.submit(contentTask);
         List<RecContent> contents = contentTask.get();
         String display = wxHomeMapper.selectLotteryDisplay("is_lottery");
-        for (RecContent content : contents) {
-            Object value = redisCache.getCacheMapValue(Constants.THUMBS_UP, "like" + content.getId());
-            if (value != null) {
-                content.setThumbs(Long.parseLong(value.toString()));
-            }
-            redisCache.setCacheMapValue(Constants.THUMBS_UP, "like" + content.getId(), content.getThumbs());
-        }
         List<RecSaleInfo> saleInfos = saleInfoTask.get();
         saleInfos.sort(Comparator.comparing(RecSaleInfo::getTopIndex, Integer::compareTo));
         contents.sort(Comparator.comparing(RecContent::getCreateDate, (t1, t2) -> t2.compareTo(t1)));
@@ -131,32 +125,24 @@ public class WxHomeServiceImpl implements IWxHomeService {
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Long thumbs(Long id) {
-        Object value = redisCache.getCacheMapValue(Constants.THUMBS_UP, "like" + id);
-        long increment = 0L;
-        if (value == null) {
-            increment = stringRedisTemplate.opsForHash().increment(Constants.THUMBS_UP, "like" + id, 1);
-        } else if (value instanceof Integer) {
-            increment = stringRedisTemplate.opsForHash().increment(Constants.THUMBS_UP, "like" + id, 1);
-        } else if (value instanceof Long longValue) {
-            // 如果值是 Long 类型,将其转换为 Integer 类型并更新
-            int intValue = longValue.intValue();  // 转换为 Integer
-            // 更新 Redis 中的值为 Integer 类型
-            stringRedisTemplate.opsForHash().put(Constants.THUMBS_UP, "like" + id, Integer.toString(intValue));
-            // 执行自增操作
-            increment = stringRedisTemplate.opsForHash().increment(Constants.THUMBS_UP, "like" + id, 1);
+        // 点赞记录
+        LoginWxUser loginWxUser = SecurityUtils.getLoginWxUser();
+        if (loginWxUser == null) {
+            throw new SecurityException("请登录");
         }
-        if (increment <= 0) {
-            return 0L;
+        WxUser wxUser = loginWxUser.getWxUser();
+        List<RecContentUser> contentUser = recContentMapper.selectContentUserByOpenId(wxUser.getWxOpenid(), id);
+        if (CollectionUtil.isNotEmpty(contentUser)) {
+            throw new RuntimeException("该用户已点过赞");
         }
-        Object mapValue = redisCache.getCacheMapValue(Constants.THUMBS_UP, "like" + id);
-        long result = 0L;
-        if (mapValue instanceof Integer) {
-            result = ((Integer) mapValue).longValue();
-        } else if (mapValue instanceof Long) {
-            result = (Long) mapValue;
-        }
-        return result;
+        int count = recContentService.insertRecContentUser(wxUser.getWxOpenid(), id);
+        // 点赞数加一
+        RecContent content = recContentService.selectRecContentById(id);
+        content.setThumbs(content.getThumbs() + 1);
+        recContentService.updateRecContent(content);
+        return (long) count;
     }
 
     @Override
@@ -164,6 +150,16 @@ public class WxHomeServiceImpl implements IWxHomeService {
         return recContentMapper.insertRecContent(recContent);
     }
 
+    @Override
+    public List<RecContentUser> userThumbs() {
+        LoginWxUser loginWxUser = SecurityUtils.getLoginWxUser();
+        if (loginWxUser == null) {
+            throw new SecurityException("请登录");
+        }
+        WxUser wxUser = loginWxUser.getWxUser();
+        return recContentMapper.selectContentUserByOpenId(wxUser.getWxOpenid(), null);
+    }
+
     /**
      * 将字符串转日期成Long类型的时间戳,格式为:yyyy-MM-dd HH:mm:ss
      */
@@ -175,6 +171,7 @@ public class WxHomeServiceImpl implements IWxHomeService {
 
     /**
      * 判断时间是否在时间段内
+     *
      * @param nowTime
      * @param beginTime
      * @param endTime

+ 1 - 0
ruoyi-wx/src/main/java/com/ruoyi/wx/web/service/impl/WxPersonCenterServiceImpl.java

@@ -1,5 +1,6 @@
 package com.ruoyi.wx.web.service.impl;
 
+import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.entity.WxUser;