Просмотр исходного кода

Merge branch 'mini_auth'

# Conflicts:
#	netflix-web/src/main/resources/application-prd.yml
zoujiajian 3 лет назад
Родитель
Сommit
24ce83176c
20 измененных файлов с 898 добавлено и 5 удалено
  1. 18 0
      netflix-dao/src/main/java/com/cyksj/mapper/mini/ArticleMapper.java
  2. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/mini/ArticleRecommendMapper.java
  3. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/mini/ArticleUserMarkMapper.java
  4. 44 0
      netflix-dao/src/main/java/com/cyksj/model/entity/Article.java
  5. 18 0
      netflix-dao/src/main/java/com/cyksj/model/entity/ArticleRecommend.java
  6. 28 0
      netflix-dao/src/main/java/com/cyksj/model/entity/ArticleUserMark.java
  7. 27 0
      netflix-dao/src/main/java/com/cyksj/model/request/MiniArticleReq.java
  8. 43 0
      netflix-dao/src/main/java/com/cyksj/model/views/ArticleDetailView.java
  9. 68 0
      netflix-dao/src/main/java/com/cyksj/model/views/ArticleFrontView.java
  10. 55 0
      netflix-dao/src/main/java/com/cyksj/model/views/ArticleSelfFrontView.java
  11. 68 0
      netflix-dao/src/main/java/com/cyksj/model/views/ArticleView.java
  12. 73 0
      netflix-dao/src/main/resources/mapper/ArticleMapper.xml
  13. 16 0
      netflix-service/src/main/java/com/cyksj/service/mange/article/ArticleService.java
  14. 82 0
      netflix-service/src/main/java/com/cyksj/service/mange/article/impl/ArticleServiceImpl.java
  15. 11 0
      netflix-service/src/main/java/com/cyksj/service/mini/MiniService.java
  16. 110 0
      netflix-service/src/main/java/com/cyksj/service/mini/impl/MiniServiceImpl.java
  17. 102 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/article/ArticleController.java
  18. 109 5
      netflix-web/src/main/java/com/cyksj/web/controller/mini/MiniController.java
  19. 0 0
      netflix-web/src/main/resources/application-dev.yml
  20. 0 0
      netflix-web/src/main/resources/application-prd.yml

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

@@ -0,0 +1,18 @@
+package com.cyksj.mapper.mini;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.Article;
+import com.cyksj.model.views.ArticleDetailView;
+
+/*
+ *项目名: netflix
+ *文件名: ArticleMapper
+ *创建者: JavaZou
+ *创建时间:2023/6/27 13:49
+ */
+public interface ArticleMapper extends BaseMapper<Article> {
+
+	ArticleDetailView getArticleDetailById(Long articleId);
+
+	Article getArticleDetail(Long articleId);
+}

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/mini/ArticleRecommendMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.mini;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.ArticleRecommend;
+
+/*
+ *项目名: netflix
+ *文件名: ArticleRecommendMapper
+ *创建者: JavaZou
+ *创建时间:2023/6/27 15:39
+ */
+public interface ArticleRecommendMapper extends BaseMapper<ArticleRecommend> {
+}

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/mini/ArticleUserMarkMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.mini;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.ArticleUserMark;
+
+/*
+ *项目名: netflix
+ *文件名: ArticleUserMarkMapper
+ *创建者: JavaZou
+ *创建时间:2023/6/27 13:50
+ */
+public interface ArticleUserMarkMapper extends BaseMapper<ArticleUserMark> {
+}

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

@@ -0,0 +1,44 @@
+package com.cyksj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: Article
+ *创建者: JavaZou
+ *创建时间:2023/6/27 13:47
+ */
+@Getter
+@Setter
+public class Article extends BaseEntity{
+	private String name;
+
+	private String banner;
+
+	private String author;
+
+	private String headImgUrl;
+
+	private String img;
+
+	private String content;
+
+	private Integer tvType;
+
+	private Integer boxType;
+
+	private Integer routeType;
+
+	private Boolean status;
+
+	private Boolean deleted;
+
+	@TableField(exist = false)
+	@DbIgnore
+	private List<Long> otherArticleIds;
+}

+ 18 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/ArticleRecommend.java

@@ -0,0 +1,18 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: ArticleRecommend
+ *创建者: JavaZou
+ *创建时间:2023/6/27 15:37
+ */
+@Getter
+@Setter
+public class ArticleRecommend extends BaseEntity {
+	private Long articleId;
+
+	private Long recommendId;
+}

+ 28 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/ArticleUserMark.java

@@ -0,0 +1,28 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: ArticleUserMark
+ *创建者: JavaZou
+ *创建时间:2023/6/27 13:48
+ */
+@Getter
+@Setter
+public class ArticleUserMark extends BaseEntity{
+	private Long userId;
+
+	private Long articleId;
+
+	/**
+	 * 是否是点赞
+	 */
+	private Boolean isDz;
+
+	/**
+	 * 是否是收藏
+	 */
+	private Boolean isCol;
+}

+ 27 - 0
netflix-dao/src/main/java/com/cyksj/model/request/MiniArticleReq.java

@@ -0,0 +1,27 @@
+package com.cyksj.model.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+/*
+ *项目名: netflix
+ *文件名: MiniArticleReq
+ *创建者: JavaZou
+ *创建时间:2023/6/27 12:16
+ */
+@Getter
+@Setter
+public class MiniArticleReq {
+	@NotNull
+	private Long id;
+
+	/**
+	 * 1、点赞,2、收藏
+	 */
+	@NotNull
+	private Integer type;
+
+	private Long userId;
+}

+ 43 - 0
netflix-dao/src/main/java/com/cyksj/model/views/ArticleDetailView.java

@@ -0,0 +1,43 @@
+package com.cyksj.model.views;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: ArticleDetailView
+ *创建者: JavaZou
+ *创建时间:2023/6/27 14:49
+ */
+@Getter
+@Setter
+public class ArticleDetailView {
+	private Long id;
+
+	private String name;
+
+	private String banner;
+
+	private String author;
+
+	private String headImgUrl;
+
+	private String img;
+
+	private String content;
+
+	private Boolean isDz;
+
+	private Boolean isCol;
+
+	private Integer dzNum;
+
+	private Integer colNum;
+
+	private Date releaseTime;
+
+	private List<ArticleDetailView> others;
+}

+ 68 - 0
netflix-dao/src/main/java/com/cyksj/model/views/ArticleFrontView.java

@@ -0,0 +1,68 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: ArticleFrontView
+ *创建者: JavaZou
+ *创建时间:2023/6/27 13:59
+ */
+@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:",
+		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")
+public class ArticleFrontView {
+	@DbField("a.id")
+	private Long id;
+
+	@DbField("a.name")
+	private String name;
+
+	@DbField("a.banner")
+	private String banner;
+
+	@DbField("a.author")
+	private String author;
+
+	@DbField("a.head_img_url")
+	private String headImgUrl;
+
+	@DbField("a.img")
+	private String img;
+
+	@DbField("a.update_time")
+	private Date releaseTime;
+
+	@DbField("a.tv_type")
+	@JsonIgnore
+	private Integer tvType;
+
+	@DbField("a.box_type")
+	@JsonIgnore
+	private Integer boxType;
+
+	@DbField("a.route_type")
+	@JsonIgnore
+	private Integer routeType;
+
+	@DbField("count(if(aum.is_dz is true,1,NULL))")
+	private Integer dzNum;
+
+	@DbField("count(if(aum.is_col is true,1,NULL))")
+	private Integer colNum;
+
+	@DbField("if(count(if(aum2.id is not null and aum2.is_dz is true,1,NULL))>0, true,false)")
+	private Boolean isDz = false;
+
+	@DbField("if(count(if(aum2.id is not null and aum2.id is true,1,NULL))>0,true,false)")
+	private Boolean isCol = false;
+}

+ 55 - 0
netflix-dao/src/main/java/com/cyksj/model/views/ArticleSelfFrontView.java

@@ -0,0 +1,55 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: ArticleSelfFrontView
+ *创建者: JavaZou
+ *创建时间:2023/6/27 13:50
+ */
+@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",
+		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")
+public class ArticleSelfFrontView {
+	@DbField("a.id")
+	private Long id;
+
+	@DbField("a.name")
+	private String name;
+
+	@DbField("a.banner")
+	private String banner;
+
+	@DbField("a.author")
+	private String author;
+
+	@DbField("a.head_img_url")
+	private String headImgUrl;
+
+	@DbField("a.img")
+	private String img;
+
+	@DbField("a.update_time")
+	private Date releaseTime;
+
+	@DbField("count(if(aum2.is_dz is true,1,NULL))")
+	private Integer dzNum;
+
+	@DbField("count(if(aum2.is_col is true,1,NULL))")
+	private Integer colNum;
+
+	@DbField("if(count(if(aum.id is not null and aum.is_dz is true,1,NULL))>0, true,false)")
+	private Boolean isDz = false;
+
+	@DbField("if(count(if(aum.id is not null and aum.id is true,1,NULL))>0,true,false)")
+	private Boolean isCol = false;
+}

+ 68 - 0
netflix-dao/src/main/java/com/cyksj/model/views/ArticleView.java

@@ -0,0 +1,68 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: ArticleView
+ *创建者: JavaZou
+ *创建时间:2023/6/27 15:19
+ */
+@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")
+public class ArticleView {
+	@DbField("a.id")
+	private Long id;
+
+	@DbField("a.name")
+	private String name;
+
+	@DbField("a.author")
+	private String author;
+
+	@DbField("a.head_img_url")
+	private String headImgUrl;
+
+	@DbField("a.img")
+	private String img;
+
+	@DbField("a.banner")
+	private String banner;
+
+	@DbField("a.content")
+	private String content;
+
+	@DbField("a.tv_type")
+	private Integer tvType;
+
+	@DbField("a.box_type")
+	private Integer boxType;
+
+	@DbField("a.route_type")
+	private Integer routeType;
+
+	@DbField("count(if(aum.is_dz is true,1,NULL))")
+	private Integer dzNum;
+
+	@DbField("count(if(aum.is_col is true,1,NULL))")
+	private Integer colNum;
+
+	@DbField("a.status")
+	private Boolean status;
+
+	@DbIgnore
+	private List<Long> otherArticleIds;
+
+	@DbField("a.created_time")
+	private Date createdTime;
+}

+ 73 - 0
netflix-dao/src/main/resources/mapper/ArticleMapper.xml

@@ -0,0 +1,73 @@
+<?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.cyksj.mapper.mini.ArticleMapper">
+    <resultMap id="recommendArticle" type="com.cyksj.model.views.ArticleDetailView">
+        <id column="id" property="id"></id>
+        <collection property="others" ofType="com.cyksj.model.views.ArticleDetailView" column="{id=id}"
+                    select="selectOtherRecommendArticles"/>
+    </resultMap>
+
+    <resultMap id="recommendArticleBack" type="com.cyksj.model.entity.Article">
+        <id column="id" property="id"></id>
+        <collection property="otherArticleIds" ofType="java.lang.Long" column="{id=id}"
+                    select="selectOtherRecommendArticlesBack"/>
+    </resultMap>
+
+    <select id="getArticleDetailById" resultMap="recommendArticle">
+        select a.id,
+               a.name,
+               a.banner,
+               a.content,
+               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
+    </select>
+
+    <select id="selectOtherRecommendArticles" resultType="com.cyksj.model.views.ArticleDetailView">
+        select a.id,
+               a.name,
+               a.banner,
+               a.content,
+               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
+        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">
+        select *
+        from article
+        where id = #{articleId}
+          and deleted is true limit 1
+    </select>
+
+    <select id="selectOtherRecommendArticlesBack" resultType="java.lang.Long">
+        select ar.id
+        from `article_recommend` ar
+                 left join `article` a on a.id = ar.article_id
+        where a.status is true
+          and a.deleted is true
+          and recommend_id = #{id}
+    </select>
+</mapper>

+ 16 - 0
netflix-service/src/main/java/com/cyksj/service/mange/article/ArticleService.java

@@ -0,0 +1,16 @@
+package com.cyksj.service.mange.article;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.Article;
+
+/*
+ *项目名: netflix
+ *文件名: ArticleService
+ *创建者: JavaZou
+ *创建时间:2023/6/27 15:17
+ */
+public interface ArticleService extends IService<Article> {
+	Article getArticleDetail(Long id);
+
+	void saveOrUpdateArticle(Article articleDto);
+}

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

@@ -0,0 +1,82 @@
+package com.cyksj.service.mange.article.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.mapper.mini.ArticleMapper;
+import com.cyksj.mapper.mini.ArticleRecommendMapper;
+import com.cyksj.model.entity.Article;
+import com.cyksj.model.entity.ArticleRecommend;
+import com.cyksj.service.mange.article.ArticleService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.dao.DuplicateKeyException;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/*
+ *项目名: netflix
+ *文件名: ArticleServiceImpl
+ *创建者: JavaZou
+ *创建时间:2023/6/27 15:17
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class ArticleServiceImpl extends ServiceImpl<ArticleMapper, Article> implements ArticleService {
+	private final ArticleMapper articleMapper;
+
+	private final ArticleRecommendMapper articleRecommendMapper;
+
+	@Override
+	public void saveOrUpdateArticle(Article articleDto) {
+		Long id = articleDto.getId();
+		List<Long> otherArticleIds = articleDto.getOtherArticleIds();
+
+		if (id == null) {
+			articleMapper.insert(articleDto);
+			if (CollUtil.isNotEmpty(otherArticleIds)) {
+				otherArticleIds.forEach(otherArticleId -> {
+					saveArticleRecommendRelation(articleDto.getId(), otherArticleId);
+				});
+			}
+			return;
+		}
+		articleMapper.updateById(articleDto);
+
+		List<ArticleRecommend> articleRecommends = articleRecommendMapper.selectList(Wrappers.lambdaQuery(ArticleRecommend.class).eq(ArticleRecommend::getRecommendId, articleDto.getId()));
+		Map<Long, List<ArticleRecommend>> collect = articleRecommends.stream().collect(Collectors.groupingBy(ArticleRecommend::getArticleId));
+		if (CollUtil.isEmpty(otherArticleIds)) {
+			articleRecommendMapper.delete(Wrappers.lambdaQuery(ArticleRecommend.class)
+					.eq(ArticleRecommend::getRecommendId, articleDto.getId()));
+		}
+		otherArticleIds.forEach(otherArticleId -> {
+			List<ArticleRecommend> recommends = collect.get(otherArticleId);
+			if (CollUtil.isEmpty(recommends)) {
+				saveArticleRecommendRelation(articleDto.getId(), otherArticleId);
+			}
+		});
+	}
+
+	@Override
+	public Article getArticleDetail(Long id) {
+		return articleMapper.getArticleDetail(id);
+	}
+
+	public void saveArticleRecommendRelation(Long recommendId, Long otherArticleId) {
+		if (recommendId == otherArticleId) return;
+		Article article = articleMapper.selectById(otherArticleId);
+		if (article == null) return;
+		ArticleRecommend articleRecommend = new ArticleRecommend();
+		articleRecommend.setArticleId(otherArticleId);
+		articleRecommend.setRecommendId(recommendId);
+		try {
+			articleRecommendMapper.insert(articleRecommend);
+		} catch (DuplicateKeyException e) {
+
+		}
+	}
+}

+ 11 - 0
netflix-service/src/main/java/com/cyksj/service/mini/MiniService.java

@@ -1,5 +1,10 @@
 package com.cyksj.service.mini;
 
+import com.cyksj.dto.Result;
+import com.cyksj.model.entity.User;
+import com.cyksj.model.request.MiniArticleReq;
+import com.cyksj.model.views.ArticleDetailView;
+
 /*
  *项目名: netflix
  *文件名: MiniService
@@ -8,4 +13,10 @@ package com.cyksj.service.mini;
  */
 public interface MiniService {
 	String getMiniURLLink(String path, String minType) throws Exception;
+
+	User wxlogin(String code, String appId) throws Exception;
+
+	Result<String> markArticle(MiniArticleReq miniArticleReq);
+
+	ArticleDetailView getArticleDetailView(Long articleId, Long userId);
 }

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

@@ -1,14 +1,30 @@
 package com.cyksj.service.mini.impl;
 
+import cn.hutool.core.util.RandomUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.config.YhMiniConfig;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+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.ArticleUserMark;
+import com.cyksj.model.entity.User;
+import com.cyksj.model.request.MiniArticleReq;
+import com.cyksj.model.views.ArticleDetailView;
 import com.cyksj.model.wechat.MiniURLLink;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.mini.MiniService;
 import com.cyksj.service.wechat.WeChatService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.dao.DuplicateKeyException;
 import org.springframework.stereotype.Service;
 
+import java.util.Optional;
+
 /*
  *项目名: netflix
  *文件名: MiniServiceImpl
@@ -25,6 +41,12 @@ public class MiniServiceImpl implements MiniService {
 
 	private final RedisService redisService;
 
+	private final UserMapper userMapper;
+
+	private final ArticleUserMarkMapper articleUserMarkMapper;
+
+	private final ArticleMapper articleMapper;
+
 	@Override
 	public String getMiniURLLink(String path, String query) throws Exception {
 		MiniURLLink miniURLLink = new MiniURLLink();
@@ -34,4 +56,92 @@ public class MiniServiceImpl implements MiniService {
 		String linkUrl = weChatService.getMiniURLLink(accessToken, miniURLLink);
 		return linkUrl;
 	}
+
+	@Override
+	public User wxlogin(String code, String appId) throws Exception {
+		MiniProgramSession code2Session = weChatService.code2Session(appId, code);
+		String unionId = code2Session.getUnionid();
+		String openId = code2Session.getOpenid();
+		User user = Optional.ofNullable(
+				userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getUnionid, unionId)
+						.last("limit 1")))
+				.orElseGet(() -> userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getOpenId, openId)
+						.last("limit 1")));
+
+		user = Optional.ofNullable(user).orElseGet(() -> new User().setOpenId(openId).setUnionid(unionId));
+		user.setUnionid(unionId);
+		user.setOpenId(openId);
+		user.setRegisterEnv(User.RegisterEnv.h5.name());
+		if (user.getId() == null) {
+			user.setNickname(String.format("银河小程序用户%s", RandomUtil.randomString(5)));
+			userMapper.insert(user);
+
+		} else {
+			userMapper.updateById(user);
+		}
+		return user;
+	}
+
+	@Override
+	public Result<String> markArticle(MiniArticleReq miniArticleReq) {
+		Long userId = miniArticleReq.getUserId();
+		Long articleId = miniArticleReq.getId();
+		Integer type = miniArticleReq.getType();
+		ArticleUserMark mark = articleUserMarkMapper.selectOne(Wrappers.lambdaQuery(ArticleUserMark.class)
+				.eq(ArticleUserMark::getUserId, userId)
+				.eq(ArticleUserMark::getArticleId, articleId).last("limit 1"));
+		if (mark == null) {
+			mark = new ArticleUserMark();
+			mark.setUserId(userId);
+			mark.setArticleId(articleId);
+			if (type == 1) mark.setIsDz(true);
+			if (type == 2) mark.setIsCol(true);
+			try {
+				articleUserMarkMapper.insert(mark);
+			} catch (DuplicateKeyException e) {
+
+			}
+			if (type == 1) return GatewayResponse.SUCCESS.newBuilder().toResult("点赞成功");
+			if (type == 2) return GatewayResponse.SUCCESS.newBuilder().toResult("收藏成功");
+		}
+		if (type == 1) {
+			Boolean isDz = mark.getIsDz();
+
+			mark.setIsDz(!isDz);
+			articleUserMarkMapper.updateById(mark);
+			if (!isDz) {
+				return GatewayResponse.SUCCESS.newBuilder().toResult("点赞成功");
+			}
+			return GatewayResponse.SUCCESS.newBuilder().toResult("取消成功");
+		}
+		if (type == 2) {
+			Boolean isCol = mark.getIsCol();
+
+			mark.setIsCol(!isCol);
+			articleUserMarkMapper.updateById(mark);
+			if (!isCol) {
+				return GatewayResponse.SUCCESS.newBuilder().toResult("收藏成功");
+			}
+			return GatewayResponse.SUCCESS.newBuilder().toResult("取消成功");
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	@Override
+	public ArticleDetailView getArticleDetailView(Long articleId, Long userId) {
+		ArticleDetailView detailView = articleMapper.getArticleDetailById(articleId);
+		if (userId != null) {
+			Optional.ofNullable(articleUserMarkMapper.selectOne(Wrappers.lambdaQuery(ArticleUserMark.class)
+					.eq(ArticleUserMark::getUserId, userId)
+					.eq(ArticleUserMark::getArticleId, articleId)
+					.last("limit 1"))).ifPresentOrElse(mark -> {
+				detailView.setIsDz(mark.getIsDz());
+				detailView.setIsCol(mark.getIsCol());
+			}, () -> {
+				detailView.setIsDz(false);
+				detailView.setIsCol(false);
+			});
+		}
+		return detailView;
+	}
 }

+ 102 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/article/ArticleController.java

@@ -0,0 +1,102 @@
+package com.cyksj.web.controller.manage.article;
+
+import cn.hutool.core.lang.Assert;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.mini.ArticleRecommendMapper;
+import com.cyksj.model.entity.Article;
+import com.cyksj.model.entity.ArticleRecommend;
+import com.cyksj.model.views.ArticleView;
+import com.cyksj.service.mange.article.ArticleService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.stream.Collectors;
+
+/*
+ *项目名: netflix
+ *文件名: ArticleController
+ *创建者: JavaZou
+ *创建时间:2023/6/27 15:02
+ */
+@RestController
+@RequestMapping("/manage/article")
+@RequiredArgsConstructor
+public class ArticleController {
+	private final ArticleService articleService;
+
+	private final BeanSearcher beanSearcher;
+
+	private final HttpServletRequest request;
+
+	private final ArticleRecommendMapper articleRecommendMapper;
+
+	/**
+	 * 文章列表
+	 */
+	@GetMapping("/get")
+	public Result<SearchResult<ArticleView>> get() {
+		SearchResult<ArticleView> search = beanSearcher.search(ArticleView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+		search.getDataList().forEach(data->{
+			data.setOtherArticleIds(articleRecommendMapper.selectList(Wrappers.lambdaQuery(ArticleRecommend.class)
+					.eq(ArticleRecommend::getRecommendId, data.getId())).stream().map(ArticleRecommend::getId).collect(Collectors.toList()));
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 新建文章
+	 */
+	@PostMapping("/post")
+	public Result<String> post(@RequestBody Article dto) {
+		articleService.saveOrUpdateArticle(dto);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 修改文章
+	 */
+	@PutMapping("/put")
+	public Result<String> update(@RequestBody Article dto) {
+		articleService.saveOrUpdateArticle(dto);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 文章详情
+	 */
+	@GetMapping("/get/detail/{id}")
+	public Result<Article> getArticleDetail(@PathVariable Long id) {
+		Article article = articleService.getArticleDetail(id);
+		Assert.notNull(article, "文章不存在");
+		return GatewayResponse.SUCCESS.newBuilder().toResult(article);
+	}
+
+	/**
+	 * 删除文章
+	 */
+	@DeleteMapping("/delete/{id}")
+	public Result<String> deleteById(@PathVariable Long id) {
+		articleService.update(null, Wrappers.lambdaUpdate(Article.class)
+				.set(Article::getDeleted, false)
+				.eq(Article::getId, id));
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 上下架文章
+	 */
+	@PutMapping("/put/status/{id}")
+	public Result<String> updateStatus(@PathVariable Long id) {
+		Article article = articleService.getById(id);
+		Assert.notNull(article, "文章不存在");
+		article.setStatus(!article.getStatus());
+		articleService.updateById(article);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+}

+ 109 - 5
netflix-web/src/main/java/com/cyksj/web/controller/mini/MiniController.java

@@ -1,12 +1,27 @@
 package com.cyksj.web.controller.mini;
 
+import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.entity.User;
+import com.cyksj.model.request.MiniArticleReq;
+import com.cyksj.model.request.MiniProgramLoginPost;
+import com.cyksj.model.views.ArticleDetailView;
+import com.cyksj.model.views.ArticleFrontView;
+import com.cyksj.model.views.ArticleSelfFrontView;
 import com.cyksj.service.mini.MiniService;
+import com.cyksj.web.util.StpUserUtil;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapBuilder;
+import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RestController;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
 
 /*
  *项目名: netflix
@@ -17,15 +32,104 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 @RequestMapping("/applets/mini")
 @RequiredArgsConstructor
+@Slf4j
 public class MiniController {
 	private final MiniService miniService;
 
+	private final BeanSearcher beanSearcher;
+
+	private final HttpServletRequest request;
+
 	/**
-	 * 生成小程序商品详情二维码
+	 * 生成小程序跳转链接二维码
 	 */
 	@RequestMapping(value = "/linkUrl", method = RequestMethod.GET)
 	public Result<String> getMiniLinkURL(String path, String query) throws Exception {
 		String linkUrl = miniService.getMiniURLLink(path, query);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(linkUrl);
-	};
+	}
+
+	/**
+	 * 银河小程序 静默授权登录
+	 */
+	@PostMapping("/user/login")
+	public Result<String> userLogin(@RequestBody MiniProgramLoginPost miniDataParams) throws Exception {
+		String methodName = "银河小程序静默授权";
+		log.info("{}[start] params:{}", methodName, miniDataParams);
+
+		if (StringUtils.isBlank(miniDataParams.getCode())) {
+			throw BusinessRuntimeException.getInstance("需要登录凭证code.");
+		}
+		User user = miniService.wxlogin(miniDataParams.getCode(), miniDataParams.getAppId());
+		StpUserUtil.login(user.getId());
+
+		log.info("{}[end] uuid:{}", methodName, user.getId());
+
+		return GatewayResponse.SUCCESS.newBuilder().toResult(StpUserUtil.getTokenValue());
+	}
+
+
+	/**
+	 * 文章列表
+	 */
+	@GetMapping("/get/article")
+	public Result<SearchResult<ArticleFrontView>> getArticleFrontView(@RequestParam(defaultValue = "0") Boolean login) {
+		Long userId = null;
+		if (login) {
+			userId = StpUserUtil.getLoginIdAsLong();
+		}
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		if (userId != null) builder.put("user_id", String.format("and aum2.user_id = %s", userId));
+		SearchResult<ArticleFrontView> search = beanSearcher.search(ArticleFrontView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 文章标记
+	 */
+	@PostMapping("/mark/article")
+	public Result<String> markArticle(@RequestBody @Validated MiniArticleReq miniArticleReq) {
+		Integer type = miniArticleReq.getType();
+		long userId = StpUserUtil.getLoginIdAsLong();
+		if (type < 0 || type > 2) {
+			return GatewayResponse.SUCCESS.newBuilder().toResult();
+		}
+		miniArticleReq.setUserId(userId);
+		return miniService.markArticle(miniArticleReq);
+	}
+
+	/**
+	 * 文章筛选自身标记列表
+	 */
+	@GetMapping("/get/mark/article")
+	public Result<SearchResult<ArticleSelfFrontView>> getArticleByType(@RequestParam(defaultValue = "1") Integer type) {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		if (type < 0 || type > 2) {
+			return GatewayResponse.SUCCESS.newBuilder().toResult();
+		}
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		String conditionSql = String.format(" where user_id = %s", userId);
+		if (type == 1) {
+			conditionSql += " and is_dz is true";
+		}
+		if (type == 2) {
+			conditionSql += " and is_col is true";
+		}
+		builder.put("condition", conditionSql);
+		SearchResult<ArticleSelfFrontView> search = beanSearcher.search(ArticleSelfFrontView.class, builder.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 文章详情
+	 */
+	@GetMapping("/get/article/detail/{articleId}")
+	public Result<ArticleDetailView> getArticleDetailView(@PathVariable Long articleId, @RequestParam(defaultValue = "0") Boolean login) {
+		Long userId = null;
+		if (login) {
+			userId = StpUserUtil.getLoginIdAsLong();
+		}
+		ArticleDetailView view = miniService.getArticleDetailView(articleId, userId);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(view);
+	}
 }

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
netflix-web/src/main/resources/application-dev.yml


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
netflix-web/src/main/resources/application-prd.yml


Некоторые файлы не были показаны из-за большого количества измененных файлов