zoujiajian 3 rokov pred
rodič
commit
0c5f021353

+ 66 - 0
netflix-common/src/main/java/com/cyksj/common/constant/RandomConstant.java

@@ -0,0 +1,66 @@
+package com.cyksj.common.constant;
+
+/*
+ *项目名: netflix
+ *文件名: RandomConstant
+ *创建者: JavaZou
+ *创建时间:2023/6/29 16:47
+ */
+
+import cn.hutool.core.util.RandomUtil;
+
+import java.util.List;
+
+public class RandomConstant {
+
+	public final static List<String> names = List.of("花火少年",
+			"雪糕梦想家",
+			"心跳旅人",
+			"音乐掌门",
+			"糖果宝贝",
+			"天空漫步者",
+			"小小火箭",
+			"快乐果冻",
+			"梦幻舞者",
+			"果味冰淇淋",
+			"雨后彩虹",
+			"奇思妙想家",
+			"糖果王子",
+			"糖果公主",
+			"跳跃精灵",
+			"魔法微笑",
+			"彩虹糖果",
+			"旋律梦想家",
+			"幻想探险家",
+			"快乐飞行员",
+			"悠闲游戏者");
+
+	public final static List<String> imgs = List.of("https://cdn2.liuliangbang.vip/picture/3d31de8deaa69d860483dbf4b5bdf495-1682238950376.png",
+			"https://cdn2.liuliangbang.vip/picture/4d8782126a98b0f35f4313011b4c56f7-1682238950431.png",
+			"https://cdn2.liuliangbang.vip/picture/438892d60ec935e174e5c6c59ca02542-1682238950278.png",
+			"https://cdn2.liuliangbang.vip/picture/b01f30f75283585d613136e339781962-1682238950404.png",
+			"https://cdn2.liuliangbang.vip/picture/043dd1a9457c4feadb3c6627b3abd152-1682238950316.png",
+			"https://cdn2.liuliangbang.vip/picture/c08fc448e0b494b9ff2b62dc4e3660f6-1682238950349.png",
+			"https://cdn2.liuliangbang.vip/picture/47cb6ea39a5005f6fddb1413bdc81ea7-1682238950532.png",
+			"https://cdn2.liuliangbang.vip/picture/40794090747d848ca142473aa2e3ca6a-1682238950559.png",
+			"https://cdn2.liuliangbang.vip/picture/bb6f0ab1406d1fb9bbed32eef0168ba7-1682238950474.png",
+			"https://cdn2.liuliangbang.vip/picture/e904769134d846046e2d3d4c84090875-1682239434345.png",
+			"https://cdn2.liuliangbang.vip/picture/f2e65a63af190b592b3166698d54adaa-1682239434318.png",
+			"https://cdn2.liuliangbang.vip/picture/e79c30bd0740ee66a70ea26ba2c73d50-1682239434256.png",
+			"https://cdn2.liuliangbang.vip/picture/98902342b15406fe3d170d8d4aad6f49-1682239434286.png",
+			"https://cdn2.liuliangbang.vip/picture/d28416360ed022e8f27767c1fef6bd69-1682239434384.png",
+			"https://cdn2.liuliangbang.vip/picture/c7bc9ba763d3ec97e0aed906e974af9d-1682239434469.png",
+			"https://cdn2.liuliangbang.vip/picture/7c017d1910efd32f56f3ef1b10c574d5-1682239434116.png",
+			"https://cdn2.liuliangbang.vip/picture/aa5333d89cf1dafa11905c86ba10948e-1682239434416.png",
+			"https://cdn2.liuliangbang.vip/picture/2fdea3f9b383e594a0a3b3b908b2eac6-1682239434498.png");
+
+	public static String getName() {
+		int i = RandomUtil.randomInt(names.size());
+		return names.get(i);
+	}
+
+	public static String getHeadUrlImg() {
+		int i = RandomUtil.randomInt(imgs.size());
+		return imgs.get(i);
+	}
+}

+ 14 - 0
netflix-dao/src/main/java/com/cyksj/mapper/mini/ArticleMapper.java

@@ -3,6 +3,11 @@ package com.cyksj.mapper.mini;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.cyksj.model.entity.Article;
 import com.cyksj.model.views.ArticleDetailView;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
 
 /*
  *项目名: netflix
@@ -15,4 +20,13 @@ public interface ArticleMapper extends BaseMapper<Article> {
 	ArticleDetailView getArticleDetailById(Long articleId);
 
 	Article getArticleDetail(Long articleId);
+
+	@Update("update article set dz_num = dz_num + #{offset}  where id = #{articleId} and dz_num = #{dzNum}")
+	Integer updateDzNum(@Param("articleId") Long articleId, @Param("dzNum") Integer dzNum, @Param("offset") Integer offset);
+
+	@Update("update article set col_num = col_num + #{offset}  where id = #{articleId} and col_num = #{colNum}")
+	Integer updateColNum(@Param("articleId") Long articleId, @Param("colNum") Integer colNum, @Param("offset") Integer offset);
+
+	@Select("select id from article")
+	List<Long> selectAll();
 }

+ 4 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/Article.java

@@ -36,6 +36,10 @@ public class Article extends BaseEntity{
 
 	private Boolean status;
 
+	private Integer dzNum;
+
+	private Integer colNum;
+
 	private Boolean deleted;
 
 	@TableField(exist = false)

+ 4 - 5
netflix-dao/src/main/java/com/cyksj/model/views/ArticleFrontView.java

@@ -16,10 +16,9 @@ import java.util.Date;
  */
 @Getter
 @Setter
-@SearchBean(tables = "article a left join article_user_mark aum on aum.article_id = a.id" +
-		" left join article_user_mark aum2 on aum2.id = aum.id :user_id:",
+@SearchBean(tables = "article a left join article_user_mark aum2 on aum2.article_id = aum2.id :user_id:",
 		where = "a.status is true and a.deleted is true",
-		groupBy = "a.id,a.author,a.head_img_url,a.tv_type,a.box_type,a.route_type,a.name,a.banner,a.img,a.update_time")
+		groupBy = "a.id,a.author,a.head_img_url,a.tv_type,a.box_type,a.route_type,a.name,a.banner,a.img,a.update_time,a.dz_num,a.col_num")
 public class ArticleFrontView {
 	@DbField("a.id")
 	private Long id;
@@ -54,10 +53,10 @@ public class ArticleFrontView {
 	@JsonIgnore
 	private Integer routeType;
 
-	@DbField("count(if(aum.is_dz is true,1,NULL))")
+	@DbField("a.dz_num")
 	private Integer dzNum;
 
-	@DbField("count(if(aum.is_col is true,1,NULL))")
+	@DbField("a.col_num")
 	private Integer colNum;
 
 	@DbField("if(count(if(aum2.id is not null and aum2.is_dz is true,1,NULL))>0, true,false)")

+ 4 - 5
netflix-dao/src/main/java/com/cyksj/model/views/ArticleSelfFrontView.java

@@ -15,10 +15,9 @@ import java.util.Date;
  */
 @Getter
 @Setter
-@SearchBean(tables = "(select id,article_id,is_dz,is_col from article_user_mark :condition:) aum left join article a on a.id = aum.article_id" +
-		" left join article_user_mark aum2 on aum2.article_id = a.id",
+@SearchBean(tables = "(select id,article_id,is_dz,is_col from article_user_mark :condition:) aum left join article a on a.id = aum.article_id",
 		where = "a.status is true and a.deleted is true",
-		groupBy = "a.id,a.name,a.banner,a.author,a.head_img_url,a.img,a.update_time")
+		groupBy = "a.id,a.name,a.banner,a.author,a.head_img_url,a.img,a.update_time,a.dz_num,a.col_num")
 public class ArticleSelfFrontView {
 	@DbField("a.id")
 	private Long id;
@@ -41,10 +40,10 @@ public class ArticleSelfFrontView {
 	@DbField("a.update_time")
 	private Date releaseTime;
 
-	@DbField("count(if(aum2.is_dz is true,1,NULL))")
+	@DbField("a.dz_num")
 	private Integer dzNum;
 
-	@DbField("count(if(aum2.is_col is true,1,NULL))")
+	@DbField("a.col_num")
 	private Integer colNum;
 
 	@DbField("if(count(if(aum.id is not null and aum.is_dz is true,1,NULL))>0, true,false)")

+ 4 - 5
netflix-dao/src/main/java/com/cyksj/model/views/ArticleView.java

@@ -17,9 +17,8 @@ import java.util.List;
  */
 @Getter
 @Setter
-@SearchBean(tables = "article a left join article_user_mark aum on aum.article_id = a.id",
-		where = "a.deleted is true",
-		groupBy = "a.id,a.name,a.author,a.head_img_url,a.banner,a.content,a.tv_type,a.box_type,a.route_type,a.status,a.created_time")
+@SearchBean(tables = "article a",
+		where = "a.deleted is true")
 public class ArticleView {
 	@DbField("a.id")
 	private Long id;
@@ -51,10 +50,10 @@ public class ArticleView {
 	@DbField("a.route_type")
 	private Integer routeType;
 
-	@DbField("count(if(aum.is_dz is true,1,NULL))")
+	@DbField("a.dz_num")
 	private Integer dzNum;
 
-	@DbField("count(if(aum.is_col is true,1,NULL))")
+	@DbField("a.col_num")
 	private Integer colNum;
 
 	@DbField("a.status")

+ 9 - 16
netflix-dao/src/main/resources/mapper/ArticleMapper.xml

@@ -22,17 +22,13 @@
                a.author,
                a.head_img_url,
                a.img,
-               count(if(aum.is_dz, 1, NULL))  as dzNum,
-               count(if(aum.is_col, 1, NULL)) as colNum,
-               a.update_time                  as releaseTime
-        from (select *
-              from `article`
-              where id = #{articleId}
-                and status is true
-                and deleted is true limit 1) a
-                 left join `article_user_mark` aum
-                           on aum.article_id = a.id
-        group by a.id, a.name, a.banner, a.content, a.author, a.head_img_url, a.img, a.update_time
+               a.dz_num,
+               a.col_num,
+               a.update_time as releaseTime
+        from `article` a
+        where id = #{articleId}
+          and status is true
+          and deleted is true limit 1
     </select>
 
     <select id="selectOtherRecommendArticles" resultType="com.cyksj.model.views.ArticleDetailView">
@@ -43,16 +39,13 @@
                a.author,
                a.head_img_url,
                a.img,
-               count(if(aum.is_dz, 1, NULL))  as dzNum,
-               count(if(aum.is_col, 1, NULL)) as colNum
+               a.dz_num,
+               a.col_num
         from `article_recommend` ar
                  left join `article` a on a.id = ar.article_id
-                 left join `article_user_mark` aum
-                           on aum.article_id = a.id
         where a.status is true
           and a.deleted is true
           and recommend_id = #{id}
-        group by a.id, a.name, a.banner, a.content, a.author, a.head_img_url, a.img
     </select>
 
     <select id="getArticleDetail" resultMap="recommendArticleBack">

+ 8 - 0
netflix-service/src/main/java/com/cyksj/service/mange/article/impl/ArticleServiceImpl.java

@@ -1,8 +1,10 @@
 package com.cyksj.service.mange.article.impl;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.RandomUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.common.constant.RandomConstant;
 import com.cyksj.mapper.mini.ArticleMapper;
 import com.cyksj.mapper.mini.ArticleRecommendMapper;
 import com.cyksj.model.entity.Article;
@@ -31,12 +33,18 @@ public class ArticleServiceImpl extends ServiceImpl<ArticleMapper, Article> impl
 
 	private final ArticleRecommendMapper articleRecommendMapper;
 
+
+
 	@Override
 	public void saveOrUpdateArticle(Article articleDto) {
 		Long id = articleDto.getId();
 		List<Long> otherArticleIds = articleDto.getOtherArticleIds();
 
 		if (id == null) {
+			articleDto.setAuthor(RandomConstant.getName());
+			articleDto.setHeadImgUrl(RandomConstant.getHeadUrlImg());
+			articleDto.setDzNum(RandomUtil.randomInt(200) + 1);
+			articleDto.setColNum(RandomUtil.randomInt(50) + 1);
 			articleMapper.insert(articleDto);
 			if (CollUtil.isNotEmpty(otherArticleIds)) {
 				otherArticleIds.forEach(otherArticleId -> {

+ 26 - 0
netflix-service/src/main/java/com/cyksj/service/mini/impl/MiniServiceImpl.java

@@ -10,6 +10,7 @@ import com.cyksj.mapper.UserMapper;
 import com.cyksj.mapper.mini.ArticleMapper;
 import com.cyksj.mapper.mini.ArticleUserMarkMapper;
 import com.cyksj.model.dto.MiniProgramSession;
+import com.cyksj.model.entity.Article;
 import com.cyksj.model.entity.ArticleUserMark;
 import com.cyksj.model.entity.User;
 import com.cyksj.model.request.MiniArticleReq;
@@ -22,6 +23,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.Optional;
 
@@ -83,6 +85,7 @@ public class MiniServiceImpl implements MiniService {
 	}
 
 	@Override
+	@Transactional(rollbackFor = Throwable.class)
 	public Result<String> markArticle(MiniArticleReq miniArticleReq) {
 		Long userId = miniArticleReq.getUserId();
 		Long articleId = miniArticleReq.getId();
@@ -98,6 +101,7 @@ public class MiniServiceImpl implements MiniService {
 			if (type == 2) mark.setIsCol(true);
 			try {
 				articleUserMarkMapper.insert(mark);
+				updateArticleMarkNum(type, articleId, 1);
 			} catch (DuplicateKeyException e) {
 
 			}
@@ -110,8 +114,10 @@ public class MiniServiceImpl implements MiniService {
 			mark.setIsDz(!isDz);
 			articleUserMarkMapper.updateById(mark);
 			if (!isDz) {
+				updateArticleMarkNum(type, articleId, 1);
 				return GatewayResponse.SUCCESS.newBuilder().toResult("点赞成功");
 			}
+			updateArticleMarkNum(type, articleId, -1);
 			return GatewayResponse.SUCCESS.newBuilder().toResult("取消成功");
 		}
 		if (type == 2) {
@@ -120,8 +126,10 @@ public class MiniServiceImpl implements MiniService {
 			mark.setIsCol(!isCol);
 			articleUserMarkMapper.updateById(mark);
 			if (!isCol) {
+				updateArticleMarkNum(type, articleId, 1);
 				return GatewayResponse.SUCCESS.newBuilder().toResult("收藏成功");
 			}
+			updateArticleMarkNum(type, articleId, -1);
 			return GatewayResponse.SUCCESS.newBuilder().toResult("取消成功");
 		}
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
@@ -144,4 +152,22 @@ public class MiniServiceImpl implements MiniService {
 		}
 		return detailView;
 	}
+
+	public void updateArticleMarkNum(Integer type, Long articleId, Integer offset) {
+		Integer success = 0;
+		while (success != 1) {
+			//文章累计点赞数、收藏数
+			Article article = articleMapper.selectById(articleId);
+			if (article == null) {
+				break;
+			}
+			Integer dzNum = article.getDzNum();
+			Integer colNum = article.getColNum();
+			if (type == 1) {
+				success = articleMapper.updateDzNum(articleId, dzNum, offset);
+			} else {
+				success = articleMapper.updateColNum(articleId, colNum, offset);
+			}
+		}
+	}
 }

+ 28 - 0
netflix-service/src/main/java/com/cyksj/task/Scheduler.java

@@ -17,6 +17,7 @@ import com.cyksj.mapper.manage.cms.CmsUserMapper;
 import com.cyksj.mapper.manage.distribute.DistributeWaitingSendPointsMapper;
 import com.cyksj.mapper.manage.sys.WorkOrderMapper;
 import com.cyksj.mapper.market.task.UserBindDetailMapper;
+import com.cyksj.mapper.mini.ArticleMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.manage.views.AccountView;
 import com.cyksj.model.manage.views.GroupsRelationView;
@@ -104,6 +105,8 @@ public class Scheduler {
 
 	    private final UserBindDetailMapper userBindDetailMapper;
 
+	    private final ArticleMapper articleMapper;
+
 	    private final static List<Long> filter_skuIds = List.of(177l);
 
     /**
@@ -551,5 +554,30 @@ public class Scheduler {
 
 		}
 	}
+
+	/**
+	 * 每日凌晨更新 文章标记数
+	 */
+	@Scheduled(cron = "0 10 0 * * ?")
+	public void updateArticleMarkNum() {
+		List<Long> articleIds = articleMapper.selectAll();
+		articleIds.forEach(articleId -> {
+			Integer dzSuccess = 0;
+			Integer colSuccess = 0;
+			while (dzSuccess != 1) {
+				Article article = articleMapper.selectById(articleId);
+				if (article == null) break;
+				Integer dzNum = article.getDzNum();
+				dzSuccess = articleMapper.updateDzNum(articleId, dzNum, 3);
+			}
+
+			while (colSuccess != 1) {
+				Article article = articleMapper.selectById(articleId);
+				if (article == null) break;
+				Integer colNum = article.getColNum();
+				colSuccess = articleMapper.updateColNum(articleId, colNum, 1);
+			}
+		});
+	}
 }