From bccc3bef5b6c76be369a67d30c3e70895acb68c1 Mon Sep 17 00:00:00 2001 From: Ljolan <2018214546@qq.com> Date: Sat, 18 Jul 2020 22:15:55 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=87=A0=E4=B8=AA?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E6=8E=A5=E5=8F=A3=E3=80=90=E6=9C=AA=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E3=80=91=20=E4=BC=98=E5=8C=96=E6=96=87=E7=AB=A0?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E9=A1=B5=EF=BC=8C=E6=B7=BB=E5=8A=A0=E7=99=BB?= =?UTF-8?q?=E9=99=86=E7=9A=84=E7=94=A8=E6=88=B7=E6=98=AF=E5=90=A6=E6=9C=89?= =?UTF-8?q?=E7=82=B9=E8=B5=9E=E5=92=8C=E6=94=B6=E8=97=8F=E8=AF=A5=E6=96=87?= =?UTF-8?q?=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bibi/system/provider/ScDataProvider.java | 38 +++++++++++++++--- .../cn/ljobin/bibi/system/provider/Test.java | 2 +- .../java/cn/ljobin/bibi/api/ScDataApi.java | 39 +++++++++++++++++-- .../bibi/domain/sc/LifeShareDetail.java | 23 +++++++++++ .../domain/wapper/LifeShareDetailWapper.java | 35 +++++++++++++++-- .../cn/ljobin/bibi/mapper/LifeShareDao.java | 3 +- .../bibi/mapper/mapping/LifeShareDao.xml | 11 +++++- .../service/Impl/LifeShareServiceImpl.java | 7 ++-- .../ljobin/bibi/service/LifeShareService.java | 2 +- 9 files changed, 141 insertions(+), 19 deletions(-) diff --git a/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/provider/ScDataProvider.java b/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/provider/ScDataProvider.java index 954f137..2dcfd99 100644 --- a/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/provider/ScDataProvider.java +++ b/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/provider/ScDataProvider.java @@ -78,17 +78,19 @@ public class ScDataProvider implements ScDataApi { public ResponseData getArticleById(Long id,HttpServletRequest request) { if(ToolUtil.isEmpty(id)||id<0) return SuccessResponseData.error(550,"参数不合法"); + //增加阅读量 RedisPrefix.READ_NUM_COVER.offerLast(id); + Long uid=null; try { - Long uid = userUtils.getUid(request); + uid= userUtils.getUid(request); //保存到用户的浏览记录里面 if(!ToolUtil.isEmpty(uid)) footprintService.insert(new Footprint(uid,id)); }catch (Exception e){ - //不需要保存浏览记录,但是可以添加阅读量 + //不需要保存浏览记录,但是可以添加阅读量,在上面已经增加了 log.info("===>>游客访问"); } - LifeShareDetailWapper wapper = lifeShareService.queryById(id); + LifeShareDetailWapper wapper = lifeShareService.queryById(id,uid); List comments = commentsService.queryByArticleId(id); wapper.setComments(comments); return SuccessResponseData.success(wapper); @@ -117,6 +119,13 @@ public class ScDataProvider implements ScDataApi { RedisPrefix.AGREE_NUM_COVER.offerLast(articleId); return SuccessResponseData.success(); } + + @Override + @ApiOperation("取消文章点赞") + public ResponseData articleCancelAgree(Long articleId, HttpServletRequest request) { + return null; + } + @Override @ApiOperation("评论点赞") public ResponseData commentAgree(Long articleId,HttpServletRequest request) { @@ -128,6 +137,13 @@ public class ScDataProvider implements ScDataApi { RedisPrefix.COMMENT_AGREE_NUM_COVER.offerLast(articleId); return SuccessResponseData.success(); } + + @Override + @ApiOperation("取消评论点赞") + public ResponseData commentCancelAgree(Long articleId, HttpServletRequest request) { + return null; + } + @Override @ApiOperation("收藏") public ResponseData collection(Long articleId,HttpServletRequest request) { @@ -140,7 +156,7 @@ public class ScDataProvider implements ScDataApi { Collections collections = new Collections(); collections.setArticleId(articleId); collections.setUserId(uid); - collections.setCollectionsStatus("正常"); + collections.setCollectionsStatus("1"); if(collectionsService.insert(collections)>0){ RedisPrefix.COLLECT_NUM_COVER.offerLast(articleId); return SuccessResponseData.success(); @@ -148,6 +164,12 @@ public class ScDataProvider implements ScDataApi { return SuccessResponseData.error("收藏失败"); } + @Override + @ApiOperation("取消收藏") + public ResponseData cancelCollection(Long articleId, HttpServletRequest request) { + return null; + } + @Override @ApiOperation("评论") @@ -187,12 +209,18 @@ public class ScDataProvider implements ScDataApi { model.andPic(pics.toArray(new String[0])); Long id = lifeShareService.insertArticle(model); if(id>0){ - LifeShareDetailWapper o = lifeShareService.queryById(id); + LifeShareDetailWapper o = lifeShareService.queryById(id,null); redisTemplate.opsForList().leftPushAll(RedisPrefix.PREFIX + model.getMessagesType(),o); return SuccessResponseData.success(200,"发布成功",o); } return SuccessResponseData.error("发布失败"); } + @Override + @ApiOperation("删除已发布文章") + public ResponseData deleteArticle(Long articleId, HttpServletRequest request) { + return null; + } + } diff --git a/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/provider/Test.java b/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/provider/Test.java index ba25f14..0f72781 100644 --- a/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/provider/Test.java +++ b/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/provider/Test.java @@ -31,6 +31,6 @@ public class Test { public ResponseData getArticleById(@RequestParam(value = "id", required = false) @NotNull(message = "参数不合法") @Min(value = 0,message = "参数不合法") Long id) { RedisPrefix.READ_NUM_COVER.offerLast(id); - return SuccessResponseData.success(lifeShareService.queryById(id)); + return SuccessResponseData.success(lifeShareService.queryById(id,null)); } } diff --git a/saltice-sc-api/src/main/java/cn/ljobin/bibi/api/ScDataApi.java b/saltice-sc-api/src/main/java/cn/ljobin/bibi/api/ScDataApi.java index c3b4f6c..d0780d6 100644 --- a/saltice-sc-api/src/main/java/cn/ljobin/bibi/api/ScDataApi.java +++ b/saltice-sc-api/src/main/java/cn/ljobin/bibi/api/ScDataApi.java @@ -49,29 +49,55 @@ public interface ScDataApi { */ @GetMapping("/articleAgree/{articleId}") public ResponseData articleAgree(@PathVariable(value = "articleId") Long articleId,HttpServletRequest request); + /** + * 取消文章点赞 + * @param articleId 文章id + * @param request + * @return + */ + @GetMapping("/articleCancelAgree/{articleId}") + public ResponseData articleCancelAgree(@PathVariable(value = "articleId") Long articleId,HttpServletRequest request); /** * 评论点赞 * @param articleId 评论id * @param request * @return */ - @GetMapping("/commentId/{commentId}") + @GetMapping("/commentAgree/{commentId}") public ResponseData commentAgree(@PathVariable(value = "commentId") Long articleId,HttpServletRequest request); + /** + * 取消评论点赞 + * @param articleId 评论id + * @param request + * @return + */ + @GetMapping("/commentCancelAgree/{commentId}") + public ResponseData commentCancelAgree(@PathVariable(value = "commentId") Long articleId,HttpServletRequest request); /** * 收藏 * 收藏的并发不会太高,直接存数据库了 * @param articleId 文章id + * @param request * @return */ @GetMapping("/collection/{articleId}") public ResponseData collection(@PathVariable(value = "articleId") Long articleId,HttpServletRequest request); - + /** + * 取消收藏 + * 收藏的并发不会太高,直接存数据库了 + * @param articleId 文章id + * @param request + * @return + */ + @GetMapping("/cancelCollection/{articleId}") + public ResponseData cancelCollection(@PathVariable(value = "articleId") Long articleId,HttpServletRequest request); /** * 评论 * @param articleId 文章id * @param commentId 文章中某个评论的id * @param info 评论内容 + * @param request * @return */ @PostMapping("/comment") @@ -88,5 +114,12 @@ public interface ScDataApi { */ @PostMapping("/pushArticle") public ResponseData pushArticle(@RequestBody LifeSharePushModel model, HttpServletRequest request ); - + /** + * 删除已发布文章 + * @param articleId 文章id + * @param request + * @return + */ + @PostMapping("/deleteArticle/{articleId}") + public ResponseData deleteArticle(@PathVariable("articleId") Long articleId, HttpServletRequest request ); } diff --git a/saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/sc/LifeShareDetail.java b/saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/sc/LifeShareDetail.java index 4fce25e..c3ffbb8 100644 --- a/saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/sc/LifeShareDetail.java +++ b/saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/sc/LifeShareDetail.java @@ -68,6 +68,29 @@ public class LifeShareDetail implements Serializable { * 用户头像 */ private String avatar; + /**是否点赞**/ + private Boolean agreed; + /** + * 是否收藏 + */ + private Boolean collected; + + + public Boolean getAgreed() { + return agreed; + } + + public void setAgreed(Boolean agreed) { + this.agreed = agreed; + } + + public Boolean getCollected() { + return collected; + } + + public void setCollected(Boolean collected) { + this.collected = collected; + } public String getAvatar() { return avatar; diff --git a/saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/wapper/LifeShareDetailWapper.java b/saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/wapper/LifeShareDetailWapper.java index e97b092..c3494e5 100644 --- a/saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/wapper/LifeShareDetailWapper.java +++ b/saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/wapper/LifeShareDetailWapper.java @@ -66,7 +66,9 @@ public class LifeShareDetailWapper implements Serializable { * 用户头像 */ private String avatar; - + /** + * 内容 + */ private List content; /** @@ -74,7 +76,14 @@ public class LifeShareDetailWapper implements Serializable { */ private List comments; - + /** + * 是否点赞 + */ + private boolean agreed; + /** + * 是否收藏 + */ + private boolean collected; public LifeShareDetailWapper() { @@ -90,13 +99,13 @@ public class LifeShareDetailWapper implements Serializable { this.build(l.getMessagesId(),l.getMessagesType(),l.getMessagesTitle(), l.getMessagesTime(),l.getMessagesCollectnum(),l.getMessagesCommentnum(), l.getMessagesTranspondnum(),l.getMessagesAgreenum(),l.getMessagesReadnum(), - l.getUname(),l.getAvatar(),contents); + l.getUname(),l.getAvatar(),contents,l.getAgreed(),l.getCollected()); } private void build(Long messagesId, String messagesType, String messagesTitle, Date messagesTime, Integer messagesCollectnum, Integer messagesCommentnum, Integer messagesTranspondnum, Integer messagesAgreenum, Integer messagesReadnum, - String uname,String avatar,List content) { + String uname,String avatar,List content,boolean agreed,boolean collected) { this.messagesId = messagesId; this.messagesType = messagesType; this.messagesTitle = messagesTitle; @@ -109,6 +118,24 @@ public class LifeShareDetailWapper implements Serializable { this.uname = uname; this.avatar = avatar; this.content = content; + this.agreed = agreed; + this.collected = collected; + } + + public boolean isAgreed() { + return agreed; + } + + public void setAgreed(boolean agreed) { + this.agreed = agreed; + } + + public boolean isCollected() { + return collected; + } + + public void setCollected(boolean collected) { + this.collected = collected; } public List getComments() { diff --git a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/LifeShareDao.java b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/LifeShareDao.java index 916c3e1..31cfa56 100644 --- a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/LifeShareDao.java +++ b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/LifeShareDao.java @@ -20,9 +20,10 @@ public interface LifeShareDao { * 通过ID查询单条数据 * * @param messagesId 主键 + * @param uid 用户id,可传空 * @return 实例对象 */ - List queryById(Long messagesId); + List queryById(@Param("messagesId") Long messagesId,@Param("uid") Long uid); /** * 查询指定行数据 diff --git a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/mapping/LifeShareDao.xml b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/mapping/LifeShareDao.xml index 3b069e2..af80209 100644 --- a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/mapping/LifeShareDao.xml +++ b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/mapping/LifeShareDao.xml @@ -44,22 +44,31 @@ + + - + diff --git a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/Impl/LifeShareServiceImpl.java b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/Impl/LifeShareServiceImpl.java index 6263a4c..33890a0 100644 --- a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/Impl/LifeShareServiceImpl.java +++ b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/Impl/LifeShareServiceImpl.java @@ -38,11 +38,12 @@ public class LifeShareServiceImpl implements LifeShareService { * 通过ID查询单条数据 * * @param messagesId 主键 + * @param uid 用户id,可传空 * @return 实例对象 */ @Override - public LifeShareDetailWapper queryById(Long messagesId) { - return new LifeShareDetailWapper(this.lifeShareDao.queryById(messagesId)); + public LifeShareDetailWapper queryById(Long messagesId,Long uid) { + return new LifeShareDetailWapper(this.lifeShareDao.queryById(messagesId,uid)); } /** @@ -96,7 +97,7 @@ public class LifeShareServiceImpl implements LifeShareService { @Override public LifeShareDetailWapper update(LifeShare lifeShare) { this.lifeShareDao.update(lifeShare); - return this.queryById(lifeShare.getMessagesId()); + return this.queryById(lifeShare.getMessagesId(),null); } /** diff --git a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/LifeShareService.java b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/LifeShareService.java index 89989b0..7b9b2af 100644 --- a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/LifeShareService.java +++ b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/LifeShareService.java @@ -22,7 +22,7 @@ public interface LifeShareService { * @param messagesId 主键 * @return 实例对象 */ - LifeShareDetailWapper queryById(Long messagesId); + LifeShareDetailWapper queryById(Long messagesId,Long uid); /** * 查询多条数据 -- Gitee From 5fe780c840c7d8cb30de770c68d67f44224fd5de Mon Sep 17 00:00:00 2001 From: Ljolan <2018214546@qq.com> Date: Sun, 19 Jul 2020 18:56:42 +0800 Subject: [PATCH 2/6] =?UTF-8?q?1=E3=80=81=E6=96=87=E7=AB=A0=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E6=8E=A5=E5=8F=A3=E6=B7=BB=E5=8A=A0uid(=E4=BD=9C?= =?UTF-8?q?=E8=80=85id)=E6=96=B9=E4=BE=BF=E4=BB=A5=E5=90=8E=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=9F=A5=E7=9C=8B=E4=BD=9C=E8=80=85=E7=9A=84=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E6=96=87=E7=AB=A0=E6=8E=A5=E5=8F=A3=202=E3=80=81?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8F=96=E6=B6=88=E6=96=87=E7=AB=A0=E7=82=B9?= =?UTF-8?q?=E8=B5=9E=E3=80=81=E5=8F=96=E6=B6=88=E6=94=B6=E8=97=8F=E3=80=81?= =?UTF-8?q?=E5=8F=96=E6=B6=88=E8=AF=84=E8=AE=BA=E7=82=B9=E8=B5=9E=203?= =?UTF-8?q?=E3=80=81=E8=AF=84=E8=AE=BA=E7=82=B9=E8=B5=9E=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E4=B8=AD=E7=9A=84commentId=E5=8D=95=E8=AF=8D?= =?UTF-8?q?=E6=94=B9=E4=B8=BAcommentAgree=204=E3=80=81=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BA=86=E5=88=A0=E9=99=A4=E5=B7=B2=E5=8F=91=E5=B8=83=E6=96=87?= =?UTF-8?q?=E7=AB=A0=205=E3=80=81=E6=96=87=E7=AB=A0=E8=AF=84=E8=AE=BA?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AD=97=E6=AE=B5agreed=E7=94=A8=E6=9D=A5?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E5=BD=93=E5=89=8D=E7=94=A8=E6=88=B7=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E7=82=B9=E8=B5=9E=206=E3=80=81=E6=96=87=E7=AB=A0?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E4=B8=AD=E6=96=B0=E5=A2=9Eagreed=E3=80=81col?= =?UTF-8?q?lected=E5=AD=97=E6=AE=B5=E4=BD=9C=E4=B8=BA=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E7=82=B9=E8=B5=9E=E5=92=8C=E6=94=B6=E8=97=8F?= =?UTF-8?q?=E8=AF=A5=E8=AF=84=E8=AE=BA=E7=9A=84=E5=88=A4=E6=96=AD=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ljobin/bibi/system/initFunc/InitFunc.java | 1 + .../bibi/system/provider/ScDataProvider.java | 148 ++++++++++++++---- .../bibi/system/schedule/ScheduleArticle.java | 63 ++++++-- .../java/cn/ljobin/bibi/api/ScDataApi.java | 8 +- .../bibi/domain/sc/LifeShareDetail.java | 23 +++ .../bibi/domain/wapper/CommentsWapper.java | 4 + .../domain/wapper/LifeShareDetailWapper.java | 29 +++- .../ljobin/bibi/cache/CommentsAgreeCache.java | 17 ++ .../bibi/constant/ArticleStatusEnum.java | 29 ++++ .../cn/ljobin/bibi/constant/RedisPrefix.java | 6 + .../cn/ljobin/bibi/mapper/CollectionsDao.java | 7 +- .../cn/ljobin/bibi/mapper/LifeShareDao.java | 7 +- .../bibi/mapper/mapping/CollectionsDao.xml | 2 +- .../bibi/mapper/mapping/CommentsDao.xml | 9 +- .../bibi/mapper/mapping/LifeShareDao.xml | 34 ++-- .../bibi/service/CollectionsService.java | 5 +- .../ljobin/bibi/service/CommentsService.java | 3 +- .../service/Impl/CollectionsServiceImpl.java | 7 +- .../service/Impl/CommentsServiceImpl.java | 42 ++++- .../service/Impl/LifeShareServiceImpl.java | 8 +- .../ljobin/bibi/service/LifeShareService.java | 5 +- 21 files changed, 374 insertions(+), 83 deletions(-) create mode 100644 saltice-sc-common/src/main/java/cn/ljobin/bibi/cache/CommentsAgreeCache.java create mode 100644 saltice-sc-common/src/main/java/cn/ljobin/bibi/constant/ArticleStatusEnum.java diff --git a/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/initFunc/InitFunc.java b/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/initFunc/InitFunc.java index c73d4fa..b60958c 100644 --- a/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/initFunc/InitFunc.java +++ b/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/initFunc/InitFunc.java @@ -46,6 +46,7 @@ public class InitFunc implements ApplicationRunner { for (ArticleType a: articleTypeList) { List list = lifeShareDao.queryAllByLimit(0L,100,a.getId()); if(ToolUtil.isEmpty(list)){ + redisTemplate.delete(RedisPrefix.PREFIX + a.getId()); continue; } //删除之前的 diff --git a/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/provider/ScDataProvider.java b/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/provider/ScDataProvider.java index 2dcfd99..de563b2 100644 --- a/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/provider/ScDataProvider.java +++ b/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/provider/ScDataProvider.java @@ -1,6 +1,9 @@ package cn.ljobin.bibi.system.provider; +import cn.hutool.core.collection.ConcurrentHashSet; import cn.ljobin.bibi.api.ScDataApi; +import cn.ljobin.bibi.cache.CommentsAgreeCache; +import cn.ljobin.bibi.constant.ArticleStatusEnum; import cn.ljobin.bibi.constant.RedisPrefix; import cn.ljobin.bibi.domain.sc.Collections; import cn.ljobin.bibi.domain.sc.Comments; @@ -28,10 +31,13 @@ import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import javax.tools.Tool; import javax.validation.Valid; import java.util.ArrayList; import java.util.Date; +import java.util.HashSet; import java.util.List; +import java.util.concurrent.ConcurrentHashMap; /** * @program: IoT-SC @@ -64,7 +70,12 @@ public class ScDataProvider implements ScDataApi { private CommentsService commentsService; @Autowired private FootprintService footprintService; - + /** + * 存放文章被删除,与文章是异常的文章id,在用户查询的时候,先看这个缓存,这个里面没有再去数据库获取 + */ + private static ConcurrentHashMap articleDisEnabled = new ConcurrentHashMap<>(); + /**空list填充用**/ + private List paddingList = new ArrayList<>(); @Override @ApiOperation("获取文章列表,传入当前的条数,一开始为0") public ResponseData getArticleList( Long tag, Integer mType) { @@ -76,24 +87,58 @@ public class ScDataProvider implements ScDataApi { @Override @ApiOperation("获取文章详情") public ResponseData getArticleById(Long id,HttpServletRequest request) { - if(ToolUtil.isEmpty(id)||id<0) - return SuccessResponseData.error(550,"参数不合法"); - //增加阅读量 - RedisPrefix.READ_NUM_COVER.offerLast(id); - Long uid=null; - try { - uid= userUtils.getUid(request); - //保存到用户的浏览记录里面 - if(!ToolUtil.isEmpty(uid)) - footprintService.insert(new Footprint(uid,id)); - }catch (Exception e){ - //不需要保存浏览记录,但是可以添加阅读量,在上面已经增加了 - log.info("===>>游客访问"); + ArticleStatusEnum statusEnum = articleDisEnabled.get(id); + if(!ToolUtil.isEmpty(statusEnum)){ + switch (statusEnum){ + case DISABLE: + return SuccessResponseData.success(201,"请求成功","文章已被作者删除"); + case EXCEPTION: + return SuccessResponseData.success(202,"请求成功","文章未通过审核"); + case NOHAVE: + return SuccessResponseData.success(205,"请求成功","文章不存在"); + default: + return SuccessResponseData.success(205,"请求成功","文章错误"); + } + }else { + if(ToolUtil.isEmpty(id)||id<0) + return SuccessResponseData.error(550,"参数不合法"); + Long uid = null; + //是否保存用户浏览记录的标志 + boolean saveUserFootTag = false; + try { + uid= userUtils.getUid(request); + saveUserFootTag = true; + }catch (Exception e){ + //不需要保存浏览记录,但是可以添加阅读量,在下面已经增加了 + log.info("===>>游客访问"); + } + LifeShareDetailWapper wapper = lifeShareService.queryById(id,uid); + if(ToolUtil.isEmpty(wapper.getEnable())){ + articleDisEnabled.put(id,ArticleStatusEnum.NOHAVE); + return SuccessResponseData.success(205,"请求成功","文章不存在"); + } + //增加文章阅读量 + RedisPrefix.READ_NUM_COVER.offerLast(id); + if(saveUserFootTag){ + //保存到用户的浏览记录里面 + if(!ToolUtil.isEmpty(uid)) + footprintService.insert(new Footprint(uid,id)); + } + if(wapper.getEnable().equals(ArticleStatusEnum.NORMAL.getStatus())){ + List comments = commentsService.queryByArticleId(id,uid); + wapper.setComments(comments); + return SuccessResponseData.success(wapper); + }else if(wapper.getEnable().equals(ArticleStatusEnum.DISABLE.getStatus())){ + articleDisEnabled.put(id,ArticleStatusEnum.DISABLE); + return SuccessResponseData.success(201,"请求成功","文章已被作者删除"); + }else if(wapper.getEnable().equals(ArticleStatusEnum.EXCEPTION.getStatus())){ + articleDisEnabled.put(id,ArticleStatusEnum.EXCEPTION); + return SuccessResponseData.success(202,"请求成功","文章未通过审核"); + }else { + wapper.setComments(paddingList); + return SuccessResponseData.success(wapper); + } } - LifeShareDetailWapper wapper = lifeShareService.queryById(id,uid); - List comments = commentsService.queryByArticleId(id); - wapper.setComments(comments); - return SuccessResponseData.success(wapper); } @Override @@ -116,32 +161,58 @@ public class ScDataProvider implements ScDataApi { return SuccessResponseData.error(4500,"请检查是否登陆"); if(ToolUtil.isEmpty(articleId)||articleId<0) return SuccessResponseData.error(550,"参数不合法"); - RedisPrefix.AGREE_NUM_COVER.offerLast(articleId); + Long num = redisTemplate.opsForSet().add(RedisPrefix.AGREE_PREFIX+uid,articleId); + if(num!=null&&num>0){ + RedisPrefix.AGREE_NUM_COVER.offerLast(articleId); + } return SuccessResponseData.success(); } @Override @ApiOperation("取消文章点赞") public ResponseData articleCancelAgree(Long articleId, HttpServletRequest request) { - return null; + Long uid = userUtils.getUid(request); + if(ToolUtil.isEmpty(uid)) + return SuccessResponseData.error(4500,"请检查是否登陆"); + if(ToolUtil.isEmpty(articleId)||articleId<0) + return SuccessResponseData.error(550,"参数不合法"); + Long num = redisTemplate.opsForSet().remove(RedisPrefix.AGREE_PREFIX+uid,articleId); + if(num!=null&&num>0) + RedisPrefix.AGREE_NUM_COVER.offerLast(-1*articleId); + return SuccessResponseData.success(); } @Override @ApiOperation("评论点赞") - public ResponseData commentAgree(Long articleId,HttpServletRequest request) { + public ResponseData commentAgree(Long commentId,HttpServletRequest request) { Long uid = userUtils.getUid(request); if(ToolUtil.isEmpty(uid)) return SuccessResponseData.error(4500,"请检查是否登陆"); - if(ToolUtil.isEmpty(articleId)||articleId<0) + if(ToolUtil.isEmpty(commentId)||commentId<0) return SuccessResponseData.error(550,"参数不合法"); - RedisPrefix.COMMENT_AGREE_NUM_COVER.offerLast(articleId); + Long num = redisTemplate.opsForSet().add(RedisPrefix.COMMENT_Agree_PREFIX+uid,commentId); + if(num!=null&&num>0){ + RedisPrefix.COMMENT_AGREE_NUM_COVER.offerLast(commentId); + CommentsAgreeCache.cacheComets.get(uid).add(commentId); + } + return SuccessResponseData.success(); } @Override @ApiOperation("取消评论点赞") - public ResponseData commentCancelAgree(Long articleId, HttpServletRequest request) { - return null; + public ResponseData commentCancelAgree(Long commentId, HttpServletRequest request) { + Long uid = userUtils.getUid(request); + if(ToolUtil.isEmpty(uid)) + return SuccessResponseData.error(4500,"请检查是否登陆"); + if(ToolUtil.isEmpty(commentId)||commentId<0) + return SuccessResponseData.error(550,"参数不合法"); + Long num = redisTemplate.opsForSet().remove(RedisPrefix.COMMENT_Agree_PREFIX+uid,commentId); + if(num!=null&&num>0){ + RedisPrefix.COMMENT_AGREE_NUM_COVER.offerLast(-1*commentId); + CommentsAgreeCache.cacheComets.get(uid).remove(commentId); + } + return SuccessResponseData.success(); } @Override @@ -158,6 +229,8 @@ public class ScDataProvider implements ScDataApi { collections.setUserId(uid); collections.setCollectionsStatus("1"); if(collectionsService.insert(collections)>0){ + //TODO 最好放到redis中存一份,或者本地内存中缓存一份 + // RedisPrefix.COLLECT_NUM_COVER.offerLast(articleId); return SuccessResponseData.success(); } @@ -167,7 +240,18 @@ public class ScDataProvider implements ScDataApi { @Override @ApiOperation("取消收藏") public ResponseData cancelCollection(Long articleId, HttpServletRequest request) { - return null; + Long uid = userUtils.getUid(request); + if(ToolUtil.isEmpty(uid)) + return SuccessResponseData.error(4500,"请检查是否登陆"); + if(ToolUtil.isEmpty(articleId)||articleId<0) + return SuccessResponseData.error(550,"参数不合法"); + + if(collectionsService.deleteById(uid,articleId)){ + //TODO 如果在redis中也存了一份,或者本地内存中缓存有一份,也要删除 + RedisPrefix.COLLECT_NUM_COVER.offerLast(-1*articleId); + return SuccessResponseData.success(); + } + return SuccessResponseData.error("取消收藏失败"); } @@ -210,6 +294,7 @@ public class ScDataProvider implements ScDataApi { Long id = lifeShareService.insertArticle(model); if(id>0){ LifeShareDetailWapper o = lifeShareService.queryById(id,null); + //这里如果发送失败无所谓,定时任务还是会更新的 redisTemplate.opsForList().leftPushAll(RedisPrefix.PREFIX + model.getMessagesType(),o); return SuccessResponseData.success(200,"发布成功",o); } @@ -217,9 +302,16 @@ public class ScDataProvider implements ScDataApi { } @Override - @ApiOperation("删除已发布文章") + @ApiOperation("删除已发布文章,查看内容时才会判断作者是否删除") public ResponseData deleteArticle(Long articleId, HttpServletRequest request) { - return null; + Long uid = userUtils.getUid(request); + if(ToolUtil.isEmpty(uid)) + return SuccessResponseData.error(4500,"请检查是否登陆"); + //这里只是简单的删除,没有过多的判断 + if(lifeShareService.deleteById(articleId,uid)){ + return SuccessResponseData.success(); + } + return SuccessResponseData.error("删除失败"); } diff --git a/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/schedule/ScheduleArticle.java b/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/schedule/ScheduleArticle.java index b77e1f1..0817fc3 100644 --- a/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/schedule/ScheduleArticle.java +++ b/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/schedule/ScheduleArticle.java @@ -52,8 +52,9 @@ public class ScheduleArticle { //获取文章类型表 List articleTypeList = articleTypeDao.queryAllByLimit(0,100); for (ArticleType a: articleTypeList) { - List list = lifeShareService.queryAllByLimit(0L,100,a.getId()); + List list = lifeShareDao.queryAllByLimit(0L,100,a.getId()); if(ToolUtil.isEmpty(list)){ + redisTemplate.delete(RedisPrefix.PREFIX + a.getId()); continue; } redisTemplate.delete(RedisPrefix.PREFIX + a.getId()); @@ -78,12 +79,23 @@ public class ScheduleArticle { do { Long elem = RedisPrefix.COMMENT_AGREE_NUM_COVER.pollFirst(); if(elem!=null){ - if(map.containsKey(elem)){ - Integer l = map.get(elem); - l++; - map.put(elem,l); + if(elem<0){ + elem *= -1; + if(map.containsKey(elem)){ + Integer l = map.get(elem); + l--; + map.put(elem,l); + }else { + map.put(elem,-1); + } }else { - map.put(elem,1); + if(map.containsKey(elem)){ + Integer l = map.get(elem); + l++; + map.put(elem,l); + }else { + map.put(elem,1); + } } i++; }else { @@ -91,7 +103,7 @@ public class ScheduleArticle { } }while (i<=100); if(map.size()>0){ - System.err.println(map.toString()); + //System.err.println(map.toString()); Integer num = commentsDao.updateBatch(map); log.info("update comments agree nums : {}",num); } @@ -123,12 +135,26 @@ public class ScheduleArticle { do { Long elem = RedisPrefix.AGREE_NUM_COVER.pollFirst(); if(elem!=null){ + boolean tag = false; + if(elem<0){ + elem = -1*elem; + tag=true; + } if(map.containsKey(elem)){ Content l = map.get(elem); - l.setAgree(l.getAgree()+1); + if(tag){ + l.setAgree(l.getAgree()-1); + }else { + l.setAgree(l.getAgree()+1); + } }else { Content o = new Content(); - o.setAgree(1); + if(tag){ + o.setAgree(-1); + }else { + o.setAgree(1); + } + map.put(elem,o); } j++; @@ -139,12 +165,25 @@ public class ScheduleArticle { do { Long elem = RedisPrefix.COLLECT_NUM_COVER.pollFirst(); if(elem!=null){ + boolean tag = false; + if(elem<0){ + elem *= -1; + tag=true; + } if(map.containsKey(elem)){ Content l = map.get(elem); - l.setCollect(l.getCollect()+1); + if(tag){ + l.setCollect(l.getCollect()-1); + }else { + l.setCollect(l.getCollect()+1); + } }else { Content o = new Content(); - o.setCollect(1); + if(tag){ + o.setCollect(-1); + }else { + o.setCollect(1); + } map.put(elem,o); } k1++; @@ -184,7 +223,7 @@ public class ScheduleArticle { break; } }while (s<=100); - if(i>0){ + if(map.size()>0){ log.info(map.toString()); //更新数据库数据 List lifeShares = new ArrayList<>(); diff --git a/saltice-sc-api/src/main/java/cn/ljobin/bibi/api/ScDataApi.java b/saltice-sc-api/src/main/java/cn/ljobin/bibi/api/ScDataApi.java index d0780d6..6910b65 100644 --- a/saltice-sc-api/src/main/java/cn/ljobin/bibi/api/ScDataApi.java +++ b/saltice-sc-api/src/main/java/cn/ljobin/bibi/api/ScDataApi.java @@ -59,20 +59,20 @@ public interface ScDataApi { public ResponseData articleCancelAgree(@PathVariable(value = "articleId") Long articleId,HttpServletRequest request); /** * 评论点赞 - * @param articleId 评论id + * @param commentId 评论id * @param request * @return */ @GetMapping("/commentAgree/{commentId}") - public ResponseData commentAgree(@PathVariable(value = "commentId") Long articleId,HttpServletRequest request); + public ResponseData commentAgree(@PathVariable(value = "commentId") Long commentId,HttpServletRequest request); /** * 取消评论点赞 - * @param articleId 评论id + * @param commentId 评论id * @param request * @return */ @GetMapping("/commentCancelAgree/{commentId}") - public ResponseData commentCancelAgree(@PathVariable(value = "commentId") Long articleId,HttpServletRequest request); + public ResponseData commentCancelAgree(@PathVariable(value = "commentId") Long commentId,HttpServletRequest request); /** * 收藏 * 收藏的并发不会太高,直接存数据库了 diff --git a/saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/sc/LifeShareDetail.java b/saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/sc/LifeShareDetail.java index c3ffbb8..3f22054 100644 --- a/saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/sc/LifeShareDetail.java +++ b/saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/sc/LifeShareDetail.java @@ -74,7 +74,30 @@ public class LifeShareDetail implements Serializable { * 是否收藏 */ private Boolean collected; + /** + * 文章状态 + */ + private String enable; + /** + * 作者id + */ + private Long uid; + + public Long getUid() { + return uid; + } + public void setUid(Long uid) { + this.uid = uid; + } + + public String getEnable() { + return enable; + } + + public void setEnable(String enable) { + this.enable = enable; + } public Boolean getAgreed() { return agreed; diff --git a/saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/wapper/CommentsWapper.java b/saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/wapper/CommentsWapper.java index 6700c18..f4dba2f 100644 --- a/saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/wapper/CommentsWapper.java +++ b/saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/wapper/CommentsWapper.java @@ -52,6 +52,10 @@ public class CommentsWapper implements Serializable { * 当前评论的点赞数 */ private Integer agreeNum; + /** + * 是否点赞 + */ + private boolean agreed; /** * 当前评论的子评论 */ diff --git a/saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/wapper/LifeShareDetailWapper.java b/saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/wapper/LifeShareDetailWapper.java index c3494e5..2596d09 100644 --- a/saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/wapper/LifeShareDetailWapper.java +++ b/saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/wapper/LifeShareDetailWapper.java @@ -62,6 +62,10 @@ public class LifeShareDetailWapper implements Serializable { * 用户名称 */ private String uname; + /** + * 作者id + */ + private Long uid; /** * 用户头像 */ @@ -85,6 +89,11 @@ public class LifeShareDetailWapper implements Serializable { */ private boolean collected; + /** + * 文章状态 + */ + private String enable; + public LifeShareDetailWapper() { } @@ -99,13 +108,13 @@ public class LifeShareDetailWapper implements Serializable { this.build(l.getMessagesId(),l.getMessagesType(),l.getMessagesTitle(), l.getMessagesTime(),l.getMessagesCollectnum(),l.getMessagesCommentnum(), l.getMessagesTranspondnum(),l.getMessagesAgreenum(),l.getMessagesReadnum(), - l.getUname(),l.getAvatar(),contents,l.getAgreed(),l.getCollected()); + l.getUname(),l.getAvatar(),contents,l.getAgreed(),l.getCollected(),l.getEnable(),l.getUid()); } private void build(Long messagesId, String messagesType, String messagesTitle, Date messagesTime, Integer messagesCollectnum, Integer messagesCommentnum, Integer messagesTranspondnum, Integer messagesAgreenum, Integer messagesReadnum, - String uname,String avatar,List content,boolean agreed,boolean collected) { + String uname,String avatar,List content,boolean agreed,boolean collected,String enable,Long uid) { this.messagesId = messagesId; this.messagesType = messagesType; this.messagesTitle = messagesTitle; @@ -120,8 +129,24 @@ public class LifeShareDetailWapper implements Serializable { this.content = content; this.agreed = agreed; this.collected = collected; + this.enable=enable; + this.uid = uid; + } + public String getEnable() { + return enable; } + public Long getUid() { + return uid; + } + + public void setUid(Long uid) { + this.uid = uid; + } + + public void setEnable(String enable) { + this.enable = enable; + } public boolean isAgreed() { return agreed; } diff --git a/saltice-sc-common/src/main/java/cn/ljobin/bibi/cache/CommentsAgreeCache.java b/saltice-sc-common/src/main/java/cn/ljobin/bibi/cache/CommentsAgreeCache.java new file mode 100644 index 0000000..525fd47 --- /dev/null +++ b/saltice-sc-common/src/main/java/cn/ljobin/bibi/cache/CommentsAgreeCache.java @@ -0,0 +1,17 @@ +package cn.ljobin.bibi.cache; + +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @program: IoT-social-circle + * @description: 评论点赞缓存 + * @author: Mr.Liu + * @create: 2020-07-19 18:11 + **/ +public class CommentsAgreeCache { + /** + * 缓存用户的评论点赞表 + */ + public static ConcurrentHashMap> cacheComets = new ConcurrentHashMap<>(); +} diff --git a/saltice-sc-common/src/main/java/cn/ljobin/bibi/constant/ArticleStatusEnum.java b/saltice-sc-common/src/main/java/cn/ljobin/bibi/constant/ArticleStatusEnum.java new file mode 100644 index 0000000..3c6a8c9 --- /dev/null +++ b/saltice-sc-common/src/main/java/cn/ljobin/bibi/constant/ArticleStatusEnum.java @@ -0,0 +1,29 @@ +package cn.ljobin.bibi.constant; + +/** + * @program: IoT-social-circle + * @description: 文章状态枚举 + * @author: Mr.Liu + * @create: 2020-07-19 09:38 + **/ +public enum ArticleStatusEnum { + NORMAL("1","正常"), + DISABLE("0","删除"), + NOHAVE("-1","不存在"), + EXCEPTION("2","异常"); + private String status; + private String type; + + ArticleStatusEnum(String status, String type) { + this.status = status; + this.type = type; + } + + public String getStatus() { + return status; + } + + public String getType() { + return type; + } +} diff --git a/saltice-sc-common/src/main/java/cn/ljobin/bibi/constant/RedisPrefix.java b/saltice-sc-common/src/main/java/cn/ljobin/bibi/constant/RedisPrefix.java index d587718..85099a8 100644 --- a/saltice-sc-common/src/main/java/cn/ljobin/bibi/constant/RedisPrefix.java +++ b/saltice-sc-common/src/main/java/cn/ljobin/bibi/constant/RedisPrefix.java @@ -13,6 +13,12 @@ import java.util.concurrent.atomic.AtomicLong; public class RedisPrefix { /**文章列表前缀**/ public static final String PREFIX = "articleType:"; + /**文章点赞前缀**/ + public static final String AGREE_PREFIX = "articleAgree:"; + /**文章评论点赞前缀**/ + public static final String COMMENT_Agree_PREFIX = "articleCommentAgree:"; + /**文章收藏前缀**/ + public static final String COLLECTION_PREFIX = "articleCollection:"; /** * 记录文章阅读数 * 放值从左边 diff --git a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/CollectionsDao.java b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/CollectionsDao.java index b011842..7550989 100644 --- a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/CollectionsDao.java +++ b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/CollectionsDao.java @@ -58,11 +58,12 @@ public interface CollectionsDao { int update(Collections collections); /** - * 通过主键删除数据 + * 删除数据 * - * @param collectionsId 主键 + * @param uid 用户id + * @param article 文章id * @return 影响行数 */ - int deleteById(Long collectionsId); + int deleteById(@Param("uid") Long uid,@Param("article") Long article); } \ No newline at end of file diff --git a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/LifeShareDao.java b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/LifeShareDao.java index 31cfa56..a15eb8b 100644 --- a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/LifeShareDao.java +++ b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/LifeShareDao.java @@ -73,12 +73,13 @@ public interface LifeShareDao { int updateBatch(List list); /** - * 通过主键删除数据 + * 通过文章id与发表用户删除数据 * - * @param messagesId 主键 + * @param articleId 主键 + * @param uid 主键 * @return 影响行数 */ - int deleteById(Long messagesId); + int deleteById(@Param("articleId") Long articleId,@Param("uid") Long uid); /** * 获取用户自己的文章列表 * @param offset 分页码 diff --git a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/mapping/CollectionsDao.xml b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/mapping/CollectionsDao.xml index 9ddf7b6..3374be9 100644 --- a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/mapping/CollectionsDao.xml +++ b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/mapping/CollectionsDao.xml @@ -94,7 +94,7 @@ - delete from collections where collections_id = #{collectionsId} + delete from collections where user_id = #{uid} and article_id = #{article} \ No newline at end of file diff --git a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/mapping/CommentsDao.xml b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/mapping/CommentsDao.xml index f563a88..a982e50 100644 --- a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/mapping/CommentsDao.xml +++ b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/mapping/CommentsDao.xml @@ -113,7 +113,14 @@ - when comments_id = #{key} then comments.agree_num+#{value} + when comments_id = #{key} and #{value} = 0 + then comments.agree_num + when comments_id = #{key} and #{value} < 0 and comments.agree_num + #{value} <= 0 + then 0 + when comments_id = #{key} and #{value} < 0 and comments.agree_num + #{value} > 0 + then comments.agree_num + #{value} + when comments_id = #{key} and #{value} > 0 + then comments.agree_num + #{value} diff --git a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/mapping/LifeShareDao.xml b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/mapping/LifeShareDao.xml index af80209..ec888a0 100644 --- a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/mapping/LifeShareDao.xml +++ b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/mapping/LifeShareDao.xml @@ -46,6 +46,8 @@ + + @@ -56,8 +58,8 @@ @@ -136,7 +138,7 @@ from life_share l left join article_type a on a. id = l.messages_type left join roses_system.sys_user su on su.USER_ID = l.uid - where l.uid = #{uid} + where l.uid = #{uid} and l.enable = '1' and l.messages_type = #{mtype} @@ -218,7 +220,14 @@ - when messages_id = #{item.messagesId} then life_share.messages_agreenum+#{item.messagesAgreenum} + when messages_id = #{item.messagesId} and #{item.messagesAgreenum} = 0 + then life_share.messages_agreenum + when messages_id = #{item.messagesId} and #{item.messagesAgreenum} < 0 and life_share.messages_agreenum + #{item.messagesAgreenum} <= 0 + then 0 + when messages_id = #{item.messagesId} and #{item.messagesAgreenum} < 0 and life_share.messages_agreenum + #{item.messagesAgreenum} > 0 + then life_share.messages_agreenum+ #{item.messagesAgreenum} + when messages_id = #{item.messagesId} and #{item.messagesAgreenum} > 0 + then life_share.messages_agreenum+ #{item.messagesAgreenum} when messages_id = #{item.messagesId} then life_share.messages_agreenum @@ -248,7 +257,14 @@ - when messages_id = #{item.messagesId} then life_share.messages_collectnum+#{item.messagesCollectnum} + when messages_id = #{item.messagesId} and #{item.messagesCollectnum} = 0 + then life_share.messages_collectnum + when messages_id = #{item.messagesId} and #{item.messagesCollectnum} < 0 and life_share.messages_collectnum + #{item.messagesCollectnum} <= 0 + then 0 + when messages_id = #{item.messagesId} and #{item.messagesCollectnum} < 0 and life_share.messages_collectnum + #{item.messagesCollectnum} > 0 + then life_share.messages_collectnum+ #{item.messagesCollectnum} + when messages_id = #{item.messagesId} and #{item.messagesCollectnum} > 0 + then life_share.messages_collectnum+ #{item.messagesCollectnum} when messages_id = #{item.messagesId} then life_share.messages_collectnum @@ -263,8 +279,8 @@ - - delete from life_share where messages_id = #{messagesId} - + + update life_share set enable = '0' where messages_id = #{articleId} and uid = #{uid} + \ No newline at end of file diff --git a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/CollectionsService.java b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/CollectionsService.java index 09d98e8..9d77192 100644 --- a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/CollectionsService.java +++ b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/CollectionsService.java @@ -48,9 +48,10 @@ public interface CollectionsService { /** * 通过主键删除数据 * - * @param collectionsId 主键 + * @param uid 用户id + * @param article 文章id * @return 是否成功 */ - boolean deleteById(Long collectionsId); + boolean deleteById(Long uid,Long article); } \ No newline at end of file diff --git a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/CommentsService.java b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/CommentsService.java index 5baa26e..291e9d1 100644 --- a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/CommentsService.java +++ b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/CommentsService.java @@ -24,9 +24,10 @@ public interface CommentsService { * 通过文章ID查询使用评论数据 * * @param articleId 主键 + * @param uid 用户主键,可以为空,空就是游客访问,不需要处理是否点赞 * @return 实例对象 */ - List queryByArticleId(Long articleId); + List queryByArticleId(Long articleId,Long uid); /** * 查询多条数据 * diff --git a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/Impl/CollectionsServiceImpl.java b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/Impl/CollectionsServiceImpl.java index c92aae8..e30857c 100644 --- a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/Impl/CollectionsServiceImpl.java +++ b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/Impl/CollectionsServiceImpl.java @@ -81,11 +81,12 @@ public class CollectionsServiceImpl implements CollectionsService { /** * 通过主键删除数据 * - * @param collectionsId 主键 + * @param uid 用户id + * @param article 文章id * @return 是否成功 */ @Override - public boolean deleteById(Long collectionsId) { - return this.collectionsDao.deleteById(collectionsId) > 0; + public boolean deleteById(Long uid,Long article) { + return this.collectionsDao.deleteById(uid,article) > 0; } } \ No newline at end of file diff --git a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/Impl/CommentsServiceImpl.java b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/Impl/CommentsServiceImpl.java index f565c7b..17e0d04 100644 --- a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/Impl/CommentsServiceImpl.java +++ b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/Impl/CommentsServiceImpl.java @@ -1,13 +1,18 @@ package cn.ljobin.bibi.service.Impl; +import cn.ljobin.bibi.cache.CommentsAgreeCache; +import cn.ljobin.bibi.constant.RedisPrefix; import cn.ljobin.bibi.domain.sc.Comments; import cn.ljobin.bibi.domain.wapper.CommentsWapper; import cn.ljobin.bibi.mapper.CommentsDao; import cn.ljobin.bibi.service.CommentsService; +import cn.stylefeng.roses.core.util.ToolUtil; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; /** @@ -20,6 +25,8 @@ import java.util.stream.Collectors; public class CommentsServiceImpl implements CommentsService { @Resource private CommentsDao commentsDao; + @Resource + private RedisTemplate redisTemplate; /** * 通过ID查询单条数据 @@ -36,31 +43,50 @@ public class CommentsServiceImpl implements CommentsService { * TODO 有点浪费空间,可以选择保存下来,必要时更新一些数据 * * @param articleId 主键 + * @param uid 用户主键,可以为空,空就是游客访问,不需要处理是否点赞 * @return 实例对象 */ @Override - public List queryByArticleId(Long articleId) { + public List queryByArticleId(Long articleId,Long uid) { + boolean tag = false; + Set o1 = null; + if(uid!=null){ + o1 = CommentsAgreeCache.cacheComets.get(uid); + if(ToolUtil.isEmpty(o1)) + o1 = redisTemplate.opsForSet().members(RedisPrefix.COMMENT_Agree_PREFIX+uid); + if(!ToolUtil.isEmpty(o1)){ + CommentsAgreeCache.cacheComets.put(uid,o1); + tag = true; + } + } //获取数据库原始数据 List data = this.commentsDao.queryByArticleId(articleId); + int len = data.size(); //用来保存 k-v ==> 被评论的id : 评论信息集合,因为一个评论会有多个评论回复 - HashMap> o = new HashMap<>(); + HashMap> o = new HashMap<>(len); //用来保存 k-v ==> 当前评论的id:当前评论信息 - HashMap o2 = new HashMap<>(); - // o 的一个引用 - HashMap> finalO1 = o; + HashMap o2 = new HashMap<>(len); //遍历从数据库获取的原始数据 , v是单独一个数据的引用 + boolean finalTag = tag; + Set finalO = o1; data.forEach(v->{ + if(finalTag){ + if(!ToolUtil.isEmpty(finalO) && finalO.contains(v.getCommentsId())){ + //更新当前用户是否点赞该评论 + v.setAgreed(true); + } + } //每一个评论都会保存至o2,方便后面根据评论自己的id查询到评论自己的信息 o2.put(v.getCommentsId(),v); //如果o中有这个key(v的上级评论id,就是被v的评论的评论id),就加入到key对应的集合中去 - if(finalO1.containsKey(v.getArticleCommentId())){ - finalO1.get(v.getArticleCommentId()).add(v); + if(o.containsKey(v.getArticleCommentId())){ + o.get(v.getArticleCommentId()).add(v); }else{ //没有这个key,就创建一个新的集合,并把当前评论加入到里面去 List list = new ArrayList<>(); list.add(v); //把这个集合作为value,被评论的id作为key,put到HashMap o中去 - finalO1.put(v.getArticleCommentId(),list); + o.put(v.getArticleCommentId(),list); } }); //遍历o ,因为o是hashMap, 索引下面的k,v分别对应key,value diff --git a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/Impl/LifeShareServiceImpl.java b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/Impl/LifeShareServiceImpl.java index 33890a0..2529d49 100644 --- a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/Impl/LifeShareServiceImpl.java +++ b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/Impl/LifeShareServiceImpl.java @@ -27,7 +27,6 @@ import java.util.List; */ @Service("lifeShareService") public class LifeShareServiceImpl implements LifeShareService { - public static final String PRFIX = "articleType:"; @Resource private LifeShareDao lifeShareDao; @Autowired @@ -103,12 +102,13 @@ public class LifeShareServiceImpl implements LifeShareService { /** * 通过主键删除数据 * - * @param messagesId 主键 + * @param articleId 主键 + * @param uid 主键 * @return 是否成功 */ @Override - public boolean deleteById(Long messagesId) { - return this.lifeShareDao.deleteById(messagesId) > 0; + public boolean deleteById(Long articleId,Long uid) { + return this.lifeShareDao.deleteById(articleId, uid) > 0; } /** * 获取用户自己的文章列表 diff --git a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/LifeShareService.java b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/LifeShareService.java index 7b9b2af..8500813 100644 --- a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/LifeShareService.java +++ b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/LifeShareService.java @@ -57,10 +57,11 @@ public interface LifeShareService { /** * 通过主键删除数据 * - * @param messagesId 主键 + * @param articleId 主键 + * @param uid 主键 * @return 是否成功 */ - boolean deleteById(Long messagesId); + boolean deleteById(Long articleId,Long uid); /** * 获取用户自己的文章列表 * @param tag 分页码 -- Gitee From 514574f4409460ae8133ba6e8beac2032f7111bc Mon Sep 17 00:00:00 2001 From: Ljolan <2018214546@qq.com> Date: Mon, 20 Jul 2020 21:05:14 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E6=9A=82=E6=97=B6=E9=80=9A=E8=BF=87redis?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B9=8B=E5=89=8D=E6=B2=A1=E6=9C=89=E6=8F=92?= =?UTF-8?q?=E5=85=A5=E6=96=87=E7=AB=A0=E7=82=B9=E8=B5=9E=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=80=8C=E5=AF=BC=E8=87=B4=E7=9A=84=E8=8E=B7=E5=8F=96=E6=96=87?= =?UTF-8?q?=E7=AB=A0=E6=98=AF=E5=90=A6=E7=82=B9=E8=B5=9E=E6=97=A0=E6=95=88?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ljobin/bibi/system/schedule/ScheduleArticle.java | 1 + .../ljobin/bibi/service/Impl/LifeShareServiceImpl.java | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/schedule/ScheduleArticle.java b/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/schedule/ScheduleArticle.java index 0817fc3..fc88ec6 100644 --- a/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/schedule/ScheduleArticle.java +++ b/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/schedule/ScheduleArticle.java @@ -237,6 +237,7 @@ public class ScheduleArticle { lifeShare.setMessagesTranspondnum(v.getTransport()); lifeShares.add(lifeShare); }); + //TODO 还要插入用户点赞文章数据到agree表中 int num = lifeShareDao.updateBatch(lifeShares); log.info("batch update read nums {}",num); //更新redis diff --git a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/Impl/LifeShareServiceImpl.java b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/Impl/LifeShareServiceImpl.java index 2529d49..53cfc42 100644 --- a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/Impl/LifeShareServiceImpl.java +++ b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/Impl/LifeShareServiceImpl.java @@ -42,7 +42,15 @@ public class LifeShareServiceImpl implements LifeShareService { */ @Override public LifeShareDetailWapper queryById(Long messagesId,Long uid) { - return new LifeShareDetailWapper(this.lifeShareDao.queryById(messagesId,uid)); + LifeShareDetailWapper detailWapper = new LifeShareDetailWapper(this.lifeShareDao.queryById(messagesId,uid)); + if(uid==null){ + return detailWapper; + } + Boolean agree = redisTemplate.opsForSet().isMember(RedisPrefix.AGREE_PREFIX+uid,messagesId); + if(agree!=null){ + detailWapper.setAgreed(agree); + } + return detailWapper; } /** -- Gitee From 517b1a512a3b657c78ebf8e13ae14c64d2b60ea5 Mon Sep 17 00:00:00 2001 From: Ljolan <2018214546@qq.com> Date: Wed, 22 Jul 2020 21:20:07 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86docker=E5=BF=AB?= =?UTF-8?q?=E9=80=9F=E9=83=A8=E7=BD=B2=EF=BC=8C=E8=A6=81=E7=9C=8B=E8=87=AA?= =?UTF-8?q?=E5=B7=B1=E5=8F=91=E5=B8=83=E7=9A=84=E5=8D=9A=E5=AE=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 +++++- saltice-sc-admin/pom.xml | 15 +++++++++++++++ .../src/main/resources/docker/Dockerfile | 5 +++++ 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 saltice-sc-admin/src/main/resources/docker/Dockerfile diff --git a/pom.xml b/pom.xml index 337c5d0..1ec6b60 100644 --- a/pom.xml +++ b/pom.xml @@ -31,6 +31,7 @@ 1.1.5 Greenwich.RELEASE 0.9.0.RELEASE + SaltIce.sc @@ -147,7 +148,10 @@ -Xdoclint:none - + + + + diff --git a/saltice-sc-admin/pom.xml b/saltice-sc-admin/pom.xml index 4b1b0bc..8822c1c 100644 --- a/saltice-sc-admin/pom.xml +++ b/saltice-sc-admin/pom.xml @@ -112,6 +112,21 @@ false + + com.spotify + docker-maven-plugin + 1.0.0 + + src/main/docker + + + / + ${project.build.directory} + ${project.build.finalName}.jar + + + + diff --git a/saltice-sc-admin/src/main/resources/docker/Dockerfile b/saltice-sc-admin/src/main/resources/docker/Dockerfile new file mode 100644 index 0000000..3a46db9 --- /dev/null +++ b/saltice-sc-admin/src/main/resources/docker/Dockerfile @@ -0,0 +1,5 @@ +FROM openjdk:8-jdk-alpine +ADD saltice-sc-admin-1.0-SNAPSHOT.jar saltice-sc-admin-1.0-SNAPSHOT.jar +MAINTAINER Liu yan bin +EXPOSE 5052 +ENTRYPOINT ["java","-Dfile.encoding=utf-8","-jar","/saltice-sc-admin-1.0-SNAPSHOT.jar"] -- Gitee From c3f67505609d8a408846da5bc8b898d558a2fdf0 Mon Sep 17 00:00:00 2001 From: Ljolan <2018214546@qq.com> Date: Thu, 23 Jul 2020 15:11:34 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=85=B3=E6=B3=A8?= =?UTF-8?q?=E3=80=81=E5=8F=96=E6=B6=88=E5=85=B3=E6=B3=A8=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E8=8E=B7=E5=8F=96=E5=85=B3=E6=B3=A8=E5=92=8C=E7=B2=89?= =?UTF-8?q?=E4=B8=9D=EF=BC=88=E4=B8=80=E8=B5=B7=E8=8E=B7=E5=8F=96=EF=BC=89?= =?UTF-8?q?=20=E6=B7=BB=E5=8A=A0=E5=8D=95=E7=8B=AC=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E5=85=B3=E6=B3=A8=E5=92=8C=E7=B2=89=E4=B8=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ljobin/bibi/system/initFunc/InitFunc.java | 37 ++++- .../system/provider/ScControProvider.java | 92 ++++++++++- .../cn/ljobin/bibi/api/ScControllerApi.java | 44 +++++ .../cn/ljobin/bibi/domain/sc/FocusOnT.java | 74 +++++++++ .../bibi/domain/wapper/FanFollowWrapper.java | 47 ++++++ .../cn/ljobin/bibi/constant/RedisPrefix.java | 2 + .../bibi/controller/FootprintController.java | 35 ---- .../cn/ljobin/bibi/mapper/FocusOnTDao.java | 86 ++++++++++ .../bibi/mapper/mapping/FocusOnTDao.xml | 153 ++++++++++++++++++ .../ljobin/bibi/service/FocusOnTService.java | 73 +++++++++ .../service/Impl/FocusOnTServiceImpl.java | 146 +++++++++++++++++ 11 files changed, 742 insertions(+), 47 deletions(-) create mode 100644 saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/sc/FocusOnT.java create mode 100644 saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/wapper/FanFollowWrapper.java delete mode 100644 saltice-sc-iot/src/main/java/cn/ljobin/bibi/controller/FootprintController.java create mode 100644 saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/FocusOnTDao.java create mode 100644 saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/mapping/FocusOnTDao.xml create mode 100644 saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/FocusOnTService.java create mode 100644 saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/Impl/FocusOnTServiceImpl.java diff --git a/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/initFunc/InitFunc.java b/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/initFunc/InitFunc.java index b60958c..2255a68 100644 --- a/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/initFunc/InitFunc.java +++ b/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/initFunc/InitFunc.java @@ -2,8 +2,10 @@ package cn.ljobin.bibi.system.initFunc; import cn.ljobin.bibi.constant.RedisPrefix; import cn.ljobin.bibi.domain.sc.ArticleType; +import cn.ljobin.bibi.domain.sc.FocusOnT; import cn.ljobin.bibi.domain.wapper.LifeShareWapper; import cn.ljobin.bibi.mapper.ArticleTypeDao; +import cn.ljobin.bibi.mapper.FocusOnTDao; import cn.ljobin.bibi.mapper.LifeShareDao; import cn.stylefeng.roses.core.util.ToolUtil; import com.alibaba.fastjson.JSON; @@ -11,13 +13,11 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.dao.DataAccessException; -import org.springframework.data.redis.core.RedisOperations; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.SessionCallback; +import org.springframework.data.redis.core.*; import org.springframework.stereotype.Component; import javax.annotation.Resource; -import java.util.List; +import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; @@ -36,7 +36,8 @@ public class InitFunc implements ApplicationRunner { private RedisTemplate redisTemplate; @Resource private ArticleTypeDao articleTypeDao; - + @Resource + private FocusOnTDao focusOnTDao; /** * 初始化文章列表 */ @@ -61,8 +62,34 @@ public class InitFunc implements ApplicationRunner { } } + /** + * 初始话关注列表 + */ + private void initFocusOn(){ + Set keys = redisTemplate.keys(RedisPrefix.FOCUS_ON_PREFIX + "*"); + if (keys != null) { + redisTemplate.delete(keys); + } + List focus = focusOnTDao.selectAll(); + Map> longListMap = new HashMap<>(); + for (FocusOnT f:focus) { + if(longListMap.containsKey(f.getNoticerId())){ + longListMap.get(f.getNoticerId()).add(f.getByFollowers()); + }else { + Set list = new HashSet<>(); + list.add(f.getByFollowers()); + longListMap.put(f.getNoticerId(),list); + } + } + longListMap.forEach((k,v)->{ + redisTemplate.delete(RedisPrefix.FOCUS_ON_PREFIX+k); + redisTemplate.opsForSet().add(RedisPrefix.FOCUS_ON_PREFIX+k,v.toArray(new Long[0])); + }); + log.info("init focus on data successful !"); + } @Override public void run(ApplicationArguments args) throws Exception { initArticle(); + initFocusOn(); } } diff --git a/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/provider/ScControProvider.java b/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/provider/ScControProvider.java index 696f6ed..7b4b9e4 100644 --- a/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/provider/ScControProvider.java +++ b/saltice-sc-admin/src/main/java/cn/ljobin/bibi/system/provider/ScControProvider.java @@ -43,7 +43,7 @@ import java.util.List; @Api("社交api") @RefreshScope /**下面参数校验对接口实现无效,只会抛出异常,推荐直接一个类,不要用实现某个接口**/ -//@Validated +/**@Validated*/ public class ScControProvider implements ScControllerApi { @Value("${spring.sc.articleListLimit}") private Integer limit; @@ -54,15 +54,11 @@ public class ScControProvider implements ScControllerApi { @Resource private RedisTemplate redisTemplate; @Autowired - private ArticleTypeService articleTypeService; - @Autowired - private MessagesTypeService messagesTypeService; - @Autowired private CollectionsService collectionsService; @Autowired - private CommentsService commentsService; - @Autowired private FootprintService footprintService; + @Autowired + private FocusOnTService focusOnTService; /** * 获取用户自己的文章列表 @@ -113,4 +109,86 @@ public class ScControProvider implements ScControllerApi { return SuccessResponseData.success(footprintService.queryAllByLimit(uid)); } + @Override + @ApiOperation("获得自己的关注与粉丝列表") + public ResponseData fenFollowers(HttpServletRequest request) { + Long uid = userUtils.getUid(request); + if(ToolUtil.isEmpty(uid)) + return SuccessResponseData.error(4500,"请检查是否登陆"); + return SuccessResponseData.success(focusOnTService.queryAllByUid(uid)); + } + + @Override + @ApiOperation("取消关注用户") + public ResponseData fenFollowersCancel(Long follwerId, HttpServletRequest request) { + if(ToolUtil.isEmpty(follwerId)) + return SuccessResponseData.error(450,"请求参数错误"); + Long uid = userUtils.getUid(request); + if(ToolUtil.isEmpty(uid)) + return SuccessResponseData.error(4500,"请检查是否登陆"); + if(focusOnTService.deleteById(uid,follwerId)){ + Long b = redisTemplate.opsForSet().remove(RedisPrefix.FOCUS_ON_PREFIX+uid,follwerId); + if(b==null){ + //删除redis失败则记录一下,方便后面补充到redis + log.error("insert redis focus on error==>>{},{}",uid,follwerId); + + } + return SuccessResponseData.success(); + } + return SuccessResponseData.error("取消关注失败"); + } + /** + * 单独查询用户自己的关注数据 + * + * @param request + * @return 对象列表 + */ + @Override + @ApiOperation("单独查询用户自己的关注数据") + public ResponseData selectFocusByUidAndLimit(int offset, HttpServletRequest request) { + Long uid = userUtils.getUid(request); + if(ToolUtil.isEmpty(uid)) + return SuccessResponseData.error(4500,"请检查是否登陆"); + return SuccessResponseData.success(focusOnTService.selectFocusByUidAndLimit(uid,offset)); + } + /** + * 单独查询用户自己的粉丝数据 + * + * @param request + * @return 对象列表 + */ + @Override + @ApiOperation("单独查询用户自己的粉丝数据") + public ResponseData selectFansByUidAndLimit(int offset, HttpServletRequest request) { + Long uid = userUtils.getUid(request); + if(ToolUtil.isEmpty(uid)) + return SuccessResponseData.error(4500,"请检查是否登陆"); + return SuccessResponseData.success(focusOnTService.selectFansByUidAndLimit(uid,offset)); + } + /** + * 关注用户 + * + * @param request + * @param follwerId 被关注用户id + * @return 实例对象 + */ + @Override + @ApiOperation("关注用户") + public ResponseData fenFollowersFocus(Long follwerId, HttpServletRequest request) { + if(ToolUtil.isEmpty(follwerId)) + return SuccessResponseData.error(450,"请求参数错误"); + Long uid = userUtils.getUid(request); + if(ToolUtil.isEmpty(uid)) + return SuccessResponseData.error(4500,"请检查是否登陆"); + if(focusOnTService.insertFocusOn(uid,follwerId)){ + Long b = redisTemplate.opsForSet().add(RedisPrefix.FOCUS_ON_PREFIX+uid,follwerId); + if(b==null){ + //插入redis失败则记录一下,方便后面补充到redis + log.error("insert redis focus on error==>>{},{}",uid,follwerId); + } + return SuccessResponseData.success(); + } + return SuccessResponseData.error("关注失败"); + } + } diff --git a/saltice-sc-api/src/main/java/cn/ljobin/bibi/api/ScControllerApi.java b/saltice-sc-api/src/main/java/cn/ljobin/bibi/api/ScControllerApi.java index 3ac2ab2..e64e82e 100644 --- a/saltice-sc-api/src/main/java/cn/ljobin/bibi/api/ScControllerApi.java +++ b/saltice-sc-api/src/main/java/cn/ljobin/bibi/api/ScControllerApi.java @@ -1,10 +1,12 @@ package cn.ljobin.bibi.api; +import cn.ljobin.bibi.domain.wapper.FanFollowWrapper; import cn.ljobin.bibi.domain.wapper.LifeSharePushModel; import cn.stylefeng.roses.core.reqres.response.ResponseData; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; +import java.util.List; /** * @program: IoT-Plat @@ -47,4 +49,46 @@ public interface ScControllerApi { */ @GetMapping("/footPrint") public ResponseData footPrint(HttpServletRequest request); + + /** + * 获得自己的关注与粉丝列表 + * @param request + * @return + */ + @GetMapping("/fenFollowers") + public ResponseData fenFollowers(HttpServletRequest request); + /** + * 关注用户 + * + * @param request + * @param follwerId 被关注用户id + * @return 实例对象 + */ + @GetMapping("/fenFollowersFocus/{follwerId}") + public ResponseData fenFollowersFocus(@PathVariable("follwerId") Long follwerId,HttpServletRequest request); + /** + * 取消关注用户 + * + * @param request + * @param follwerId 被关注用户id + * @return 实例对象 + */ + @GetMapping("/fenFollowersCancel/{follwerId}") + public ResponseData fenFollowersCancel(@PathVariable("follwerId") Long follwerId,HttpServletRequest request); + /** + * 单独查询用户自己的关注数据 + * + * @param request + * @return 对象列表 + */ + @GetMapping("/selectFocusByUidAndLimit/{offset}") + public ResponseData selectFocusByUidAndLimit(@PathVariable("offset") int offset,HttpServletRequest request); + /** + * 单独查询用户自己的粉丝数据 + * + * @param request + * @return 对象列表 + */ + @GetMapping("/selectFansByUidAndLimit/{offset}") + public ResponseData selectFansByUidAndLimit(@PathVariable("offset")int offset,HttpServletRequest request); } diff --git a/saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/sc/FocusOnT.java b/saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/sc/FocusOnT.java new file mode 100644 index 0000000..8c73202 --- /dev/null +++ b/saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/sc/FocusOnT.java @@ -0,0 +1,74 @@ +package cn.ljobin.bibi.domain.sc; + +import java.util.Date; +import java.io.Serializable; + +/** + * 关注表(FocusOnT)实体类 + * + * @author liuyanbin + * @since 2020-07-23 08:57:40 + */ +public class FocusOnT implements Serializable { + private static final long serialVersionUID = 475194601101328916L; + + private Long id; + /** + * 关注者id + */ + private Long noticerId; + /** + * 被关注者id + */ + private Long byFollowers; + /** + * 关注时间 + */ + private Date focusDate; + /** + * 是否有效 1-有效,0-无效 + */ + private String enable; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getNoticerId() { + return noticerId; + } + + public void setNoticerId(Long noticerId) { + this.noticerId = noticerId; + } + + public Long getByFollowers() { + return byFollowers; + } + + public void setByFollowers(Long byFollowers) { + this.byFollowers = byFollowers; + } + + public Date getFocusDate() { + return focusDate; + } + + public void setFocusDate(Date focusDate) { + this.focusDate = focusDate; + } + + public String getEnable() { + return enable; + } + + public void setEnable(String enable) { + this.enable = enable; + } + +} \ No newline at end of file diff --git a/saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/wapper/FanFollowWrapper.java b/saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/wapper/FanFollowWrapper.java new file mode 100644 index 0000000..8dd9016 --- /dev/null +++ b/saltice-sc-api/src/main/java/cn/ljobin/bibi/domain/wapper/FanFollowWrapper.java @@ -0,0 +1,47 @@ +package cn.ljobin.bibi.domain.wapper; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * @program: IoT-social-circle + * @description: 粉丝关注 包装 + * @author: Mr.Liu + * @create: 2020-07-23 08:55 + **/ +@Data +public class FanFollowWrapper implements Serializable { + private static final long serialVersionUID = 475194601101328916L; + + private Long id; + /** + * 被关注者id + */ + private String byFollowers; + /** + * 我的关注或者我的粉丝的头像 + */ + private String avatar; + /** + * 我的关注或者我的粉丝的名字 + */ + private String name; + /** + * 关注时间 + */ + private Date focusDate; + /** + * 是否是关注的,true为自己关注的,false为自己的粉丝 + */ + private boolean follower; + /** + * 如果这个是粉丝数据,这个标志表示是否也关注了他 + */ + private boolean fansFocus; + /** + * 关注的人与粉丝的简介 + */ + private String introduction; +} diff --git a/saltice-sc-common/src/main/java/cn/ljobin/bibi/constant/RedisPrefix.java b/saltice-sc-common/src/main/java/cn/ljobin/bibi/constant/RedisPrefix.java index 85099a8..8af60e7 100644 --- a/saltice-sc-common/src/main/java/cn/ljobin/bibi/constant/RedisPrefix.java +++ b/saltice-sc-common/src/main/java/cn/ljobin/bibi/constant/RedisPrefix.java @@ -19,6 +19,8 @@ public class RedisPrefix { public static final String COMMENT_Agree_PREFIX = "articleCommentAgree:"; /**文章收藏前缀**/ public static final String COLLECTION_PREFIX = "articleCollection:"; + /**关注列表前缀**/ + public static final String FOCUS_ON_PREFIX = "focusOn:"; /** * 记录文章阅读数 * 放值从左边 diff --git a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/controller/FootprintController.java b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/controller/FootprintController.java deleted file mode 100644 index 8b70ff7..0000000 --- a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/controller/FootprintController.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.ljobin.bibi.controller; - -import cn.ljobin.bibi.domain.sc.Footprint; -import cn.ljobin.bibi.service.FootprintService; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; - -/** - * 用户足迹表(Footprint)表控制层 - * - * @author makejava - * @since 2020-07-02 20:57:30 - */ -@RestController -@RequestMapping("footprint") -public class FootprintController { - /** - * 服务对象 - */ - @Resource - private FootprintService footprintService; - - /** - * 通过主键查询单条数据 - * - * @param id 主键 - * @return 单条数据 - */ - @GetMapping("selectOne") - public Footprint selectOne(Integer id) { - return this.footprintService.queryById(id); - } - -} \ No newline at end of file diff --git a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/FocusOnTDao.java b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/FocusOnTDao.java new file mode 100644 index 0000000..5c1ec84 --- /dev/null +++ b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/FocusOnTDao.java @@ -0,0 +1,86 @@ +package cn.ljobin.bibi.mapper; + +import cn.ljobin.bibi.domain.sc.FocusOnT; +import cn.ljobin.bibi.domain.wapper.FanFollowWrapper; +import org.apache.ibatis.annotations.Param; +import java.util.List; + +/** + * 关注表(FocusOnT)表数据库访问层 + * + * @author liuyanbin + * @since 2020-07-23 08:57:42 + */ +public interface FocusOnTDao { + + /** + * 通过ID查询单条数据 + * + * @param id 主键 + * @return 实例对象 + */ + FocusOnT queryById(Long id); + + /** + * 查询所以行数据,用与热加载数据 + * + * @return 对象列表 + */ + List selectAll(); + /** + * 查询用户自己的关注与粉丝数据 + * + * @param uid 用户id + * @param enable 是否有效 + * @param offset 查询起始位置 + * @param limit 查询条数 + * @return 对象列表 + */ + List queryAllByUid(@Param("uid") long uid, @Param("enable") String enable,@Param("offset") int offset, @Param("limit") int limit); + /** + * 单独查询用户自己的关注数据 + * + * @param uid 用户id + * @return 对象列表 + */ + List selectFocusByUidAndLimit(@Param("uid") long uid,@Param("offset") int offset,@Param("enable") String enable, @Param("limit") int limit); + /** + * 单独查询用户自己的粉丝数据 + * + * @param uid 用户id + * @return 对象列表 + */ + List selectFansByUidAndLimit(@Param("uid")long uid,@Param("offset") int offset,@Param("enable") String enable, @Param("limit") int limit); + /** + * 通过实体作为筛选条件查询 + * + * @param focusOnT 实例对象 + * @return 对象列表 + */ + List queryAll(FocusOnT focusOnT); + + /** + * 新增数据 关注用户 + * + * @param noticerId 操作者用户id + * @param follwerId 被关注用户id + * @return 影响行数 + */ + int insert(@Param("noticerId") long noticerId,@Param("follwerId")long follwerId); + + /** + * 修改数据 + * + * @param focusOnT 实例对象 + * @return 影响行数 + */ + int update(FocusOnT focusOnT); + + /** + * 通过主键删除数据 + * + * @return 影响行数 + */ + int deleteById(@Param("noticerId") long noticerId,@Param("follwerId")long follwerId); + +} \ No newline at end of file diff --git a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/mapping/FocusOnTDao.xml b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/mapping/FocusOnTDao.xml new file mode 100644 index 0000000..134b3c9 --- /dev/null +++ b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/mapper/mapping/FocusOnTDao.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into focus_on_t(noticer_id, by_followers) + values (#{noticerId}, #{follwerId}) + + + + + update focus_on_t + + + noticer_id = #{noticerId}, + + + by_followers = #{byFollowers}, + + + focus_date = #{focusDate}, + + + enable = #{enable}, + + + where id = #{id} + + + + + delete from focus_on_t where noticer_id = #{noticerId} and by_followers = #{follwerId} + + + \ No newline at end of file diff --git a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/FocusOnTService.java b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/FocusOnTService.java new file mode 100644 index 0000000..700d537 --- /dev/null +++ b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/FocusOnTService.java @@ -0,0 +1,73 @@ +package cn.ljobin.bibi.service; + +import cn.ljobin.bibi.domain.sc.FocusOnT; +import cn.ljobin.bibi.domain.wapper.FanFollowWrapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 关注表(FocusOnT)表服务接口 + * + * @author liuyanbin + * @since 2020-07-23 08:57:43 + */ +public interface FocusOnTService { + + /** + * 通过ID查询单条数据 + * + * @param id 主键 + * @return 实例对象 + */ + FocusOnT queryById(Long id); + + /** + * 查询用户自己的关注与粉丝数据 + * + * @param uid 用户id + * @return 对象列表 + */ + Map> queryAllByUid(long uid); + /** + * 单独查询用户自己的关注数据 + * + * @param uid 用户id + * @return 对象列表 + */ + List selectFocusByUidAndLimit(long uid,int offset); + /** + * 单独查询用户自己的粉丝数据 + * + * @param uid 用户id + * @return 对象列表 + */ + List selectFansByUidAndLimit(long uid,int offset); + /** + * 新增数据 关注用户 + * + * @param noticerId 操作者用户id + * @param follwerId 被关注用户id + * @return 实例对象 + */ + boolean insertFocusOn(long noticerId,long follwerId); + + /** + * 修改数据 + * + * @param focusOnT 实例对象 + * @return 实例对象 + */ + FocusOnT update(FocusOnT focusOnT); + + /** + * 通过用户id与被关注用户id删除数据 + * + * @param noticerId + * @param follwerId + * @return 是否成功 + */ + boolean deleteById(long noticerId,long follwerId); + +} \ No newline at end of file diff --git a/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/Impl/FocusOnTServiceImpl.java b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/Impl/FocusOnTServiceImpl.java new file mode 100644 index 0000000..1ce06a0 --- /dev/null +++ b/saltice-sc-iot/src/main/java/cn/ljobin/bibi/service/Impl/FocusOnTServiceImpl.java @@ -0,0 +1,146 @@ +package cn.ljobin.bibi.service.Impl; + +import cn.ljobin.bibi.constant.RedisPrefix; +import cn.ljobin.bibi.constant.Status; +import cn.ljobin.bibi.domain.sc.FocusOnT; +import cn.ljobin.bibi.domain.wapper.FanFollowWrapper; +import cn.ljobin.bibi.mapper.FocusOnTDao; +import cn.ljobin.bibi.service.FocusOnTService; +import cn.stylefeng.roses.core.util.ToolUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; + +/** + * 关注表(FocusOnT)表服务实现类 + * + * @author liuyanbin + * @since 2020-07-23 08:57:43 + */ +@Service("focusOnTService") +@RefreshScope +public class FocusOnTServiceImpl implements FocusOnTService { + @Resource + private FocusOnTDao focusOnTDao; + /** + * 限制每次粉丝获取数,第一次获取会x2的 + */ + @Value("${spring.sc.fansListLimit}") + private int fansListLimit; + /** + * 限制每次关注获取数,第一次获取会x2的 + */ + @Value("${spring.sc.focusOnListLimit}") + private int focusOnListLimit; + @Resource + private RedisTemplate redisTemplate; + /** + * 通过ID查询单条数据 + * + * @param id 主键 + * @return 实例对象 + */ + @Override + public FocusOnT queryById(Long id) { + return this.focusOnTDao.queryById(id); + } + + /** + * 查询用户自己的关注与粉丝数据 + * + * @param uid 用户id + * @return 对象列表 + */ + @Override + public Map> queryAllByUid(long uid) { + Map> map = new HashMap<>(); + map.put("fans",new ArrayList<>()); + map.put("focusOn",new ArrayList<>()); + Set focus = redisTemplate.opsForSet().members(RedisPrefix.FOCUS_ON_PREFIX+uid); + List fanFollowWrappers = this.focusOnTDao.queryAllByUid(uid, Status.isEnable,0,(focusOnListLimit<10?10:focusOnListLimit)*2); + for (FanFollowWrapper f: fanFollowWrappers) { + if(f.isFollower()){ + map.get("focusOn").add(f); + }else { + if(focus != null ? focus.contains(Long.parseLong(f.getByFollowers())) : false){ + f.setFansFocus(true); + } + map.get("fans").add(f); + } + } + return map; + } + /** + * 单独查询用户自己的关注数据 + * + * @param uid 用户id + * @return 对象列表 + */ + @Override + public List selectFocusByUidAndLimit(long uid, int offset) { + return this.focusOnTDao.selectFocusByUidAndLimit(uid,offset,Status.isEnable,focusOnListLimit); + } + /** + * 单独查询用户自己的粉丝数据 + * + * @param uid 用户id + * @return 对象列表 + */ + @Override + public List selectFansByUidAndLimit(long uid, int offset) { + //Set sets = redisTemplate.opsForZSet().range(RedisPrefix.FOCUS_ON_PREFIX+uid,0,-1); + List fanFollowWrappers = this.focusOnTDao.selectFansByUidAndLimit(uid, offset,Status.isEnable,fansListLimit); + Set sets = redisTemplate.opsForSet().members(RedisPrefix.FOCUS_ON_PREFIX+uid); + System.err.println(sets); + if(ToolUtil.isEmpty(sets)){ + return fanFollowWrappers; + } + fanFollowWrappers.forEach(v->{ + long l = Long.parseLong(v.getByFollowers()); + if(sets.contains(l)){ + System.err.println(l+"sssss"); + v.setFansFocus(true); + }else + System.err.println("ssssss"); + }); + return fanFollowWrappers; + } + + /** + * 新增数据 关注用户 + * + * @param noticerId 操作者用户id + * @param follwerId 被关注用户id + * @return 实例对象 + */ + @Override + public boolean insertFocusOn(long noticerId,long follwerId) { + return this.focusOnTDao.insert(noticerId,follwerId)>0; + } + + /** + * 修改数据 + * + * @param focusOnT 实例对象 + * @return 实例对象 + */ + @Override + public FocusOnT update(FocusOnT focusOnT) { + this.focusOnTDao.update(focusOnT); + return this.queryById(focusOnT.getId()); + } + + /** + * 通过主键删除数据 + * @return 是否成功 + */ + @Override + public boolean deleteById(long noticerId,long follwerId) { + return this.focusOnTDao.deleteById(noticerId, follwerId) > 0; + } +} \ No newline at end of file -- Gitee From e45e85fa7a1ace704848edcce5a7a708470c56e8 Mon Sep 17 00:00:00 2001 From: Ljolan <2018214546@qq.com> Date: Thu, 23 Jul 2020 15:12:53 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- saltice-sc-admin/src/main/resources/application.ymll | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/saltice-sc-admin/src/main/resources/application.ymll b/saltice-sc-admin/src/main/resources/application.ymll index 5022b8b..7eca89c 100644 --- a/saltice-sc-admin/src/main/resources/application.ymll +++ b/saltice-sc-admin/src/main/resources/application.ymll @@ -40,6 +40,7 @@ mybatis-plus: ## 特别是多模块的,一定要注意,使用classpath*: mapper-locations: classpath*:cn/ljobin/bibi/**/*.xml configuration: + ## 配置sql日志打印 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #刷新mapper,调试神器 refresh: true @@ -48,9 +49,17 @@ spring: ##每次获取的文章列表数目 articleListLimit : 10 ##查看收藏接口中 获取文章内容部分提取的长度 - infoLimit : 40 + infoLimit : 35 ##每次获取的收藏列表数目 collectionLimit : 10 + ##查看浏览记录接口中 获取浏览记录的长度 + footPrintLimit: 30 + ##只能获取最近多少天内的足迹 + footPrintLimitByDays: 30 + ## 限制每次粉丝获取数,第一次获取会x2的 + fansListLimit: 10 + ## 限制每次关注获取数,第一次获取会x2的 + focusOnListLimit: 10 kafka: producer: bootstrap-servers: 10.112.26.129:9092 -- Gitee