学习天机02

1.注入bean的写法

构造函数的注入

2.回答和评论

在做这个功能的时候需要理解一些概念,张三提出问题就是提问者,李四去回答张三的问题,李四就是回答者,王五去回答李四的评论,王五就是评论者。

在提供的`InteractionReply`类中:

- `questionId`: 互动问题问题id,指的是原始问题的ID,比如张三提出的问题的ID。
- `answerId`: 回复的上级回答id,这个字段用来指向直接上一级的回答或评论的ID。在你给的场景中,如果王五是在评论李四的回答,那么`answerId`将会是李四回答的ID。
- `userId`: 回答者id,指的是进行回答或评论操作的用户的ID。在你的例子中,如果李四是回答问题的人,那么在李四的回答记录中,`userId`就是李四的ID;如果王五是在对李四的回答进行评论,那么在王五的评论记录中,`userId`就是王五的ID。
- `targetUserId`: 回复的目标用户id,这个字段可能用来指示这个回答或评论是针对哪个用户的。例如,如果王五是在回复李四的回答,那么`targetUserId`可能就是李四的用户ID。
- `targetReplyId`: 回复的目标回复id,这个字段可以用来指示这个回答或评论是直接针对哪个回答或评论的。在你的场景中,如果王五是在评论李四的回答,`targetReplyId`可能就是李四回答的`id`。

因此,根据你的场景,**上一级的回答者id** (`answerId`) **是指李四的回答的ID**。这个字段用于建立回答和评论之间的层级关系,让系统知道每个回答或评论是针对哪个问题或上一级回答/评论的。

新增页面原型:

业务流程:

前端传参

新增和分页查询的接口代码

@RestController
@RequestMapping("/replies")
@RequiredArgsConstructor
@Api(tags = "互动问答相关接口 ")
public class InteractionReplyController {private final IInteractionReplyService replyService;@ApiOperation("新增回答或评论")@PostMappingpublic void saveReply(@RequestBody ReplyDTO replyDTO) {replyService.saveReply(replyDTO);}@ApiOperation("分页查询回答或评论")@GetMapping("page")public PageDTO<ReplyVO> queryReplyPage(ReplyPageQuery pageQuery){return replyService.queryReplyPage(pageQuery, false);}
}
 @Override@Transactionalpublic void saveReply(ReplyDTO replyDTO) {// 1.获取登录用户Long userId = UserContext.getUser();// 2.新增回答InteractionReply reply = BeanUtils.toBean(replyDTO, InteractionReply.class);reply.setUserId(userId);save(reply);// 3.累加评论数或者累加回答数// 3.1.判断当前回复的类型是否是回答boolean isAnswer = replyDTO.getAnswerId() == null;if (!isAnswer) {// 3.2.是评论,则需要更新上级回答的评论数量lambdaUpdate().setSql("reply_times = reply_times + 1").eq(InteractionReply::getId, replyDTO.getAnswerId()).update();}// 3.3.尝试更新问题表中的状态、 最近一次回答、回答数量questionService.lambdaUpdate().set(isAnswer, InteractionQuestion::getLatestAnswerId, reply.getAnswerId()).setSql(isAnswer, "answer_times = answer_times + 1").set(replyDTO.getIsStudent(), InteractionQuestion::getStatus, QuestionStatus.UN_CHECK.getValue()).eq(InteractionQuestion::getId, replyDTO.getQuestionId()).update();// 4.尝试累加积分if(replyDTO.getIsStudent()) {// 学生才需要累加积分mqHelper.send(MqConstants.Exchange.LEARNING_EXCHANGE,MqConstants.Key.WRITE_REPLY,5);}}@Overridepublic PageDTO<ReplyVO> queryReplyPage(ReplyPageQuery query, boolean forAdmin) {// 1.问题id和回答id至少要有一个,先做参数判断Long questionId = query.getQuestionId();Long answerId = query.getAnswerId();if (questionId == null && answerId == null) {throw new BadRequestException("问题或回答id不能都为空");}// 标记当前是查询问题下的回答boolean isQueryAnswer = questionId != null;// 2.分页查询replyPage<InteractionReply> page = lambdaQuery().eq(isQueryAnswer, InteractionReply::getQuestionId, questionId).eq(InteractionReply::getAnswerId, isQueryAnswer ? 0L : answerId).eq(!forAdmin, InteractionReply::getHidden, false).page(query.toMpPage( // 先根据点赞数排序,点赞数相同,再按照创建时间排序new OrderItem(DATA_FIELD_NAME_LIKED_TIME, false),new OrderItem(DATA_FIELD_NAME_CREATE_TIME, true)));List<InteractionReply> records = page.getRecords();if (CollUtils.isEmpty(records)) {return PageDTO.empty(page);}// 3.数据处理,需要查询:提问者信息、回复目标信息、当前用户是否点赞Set<Long> userIds = new HashSet<>();Set<Long> answerIds = new HashSet<>();Set<Long> targetReplyIds = new HashSet<>();// 3.1.获取提问者id 、回复的目标id、当前回答或评论id(统计点赞信息)for (InteractionReply r : records) {if(!r.getAnonymity() || forAdmin) {// 非匿名userIds.add(r.getUserId());}targetReplyIds.add(r.getTargetReplyId());answerIds.add(r.getId());}// 3.2.查询目标回复,如果目标回复不是匿名,则需要查询出目标回复的用户信息targetReplyIds.remove(0L);targetReplyIds.remove(null);if(targetReplyIds.size() > 0) {List<InteractionReply> targetReplies = listByIds(targetReplyIds);Set<Long> targetUserIds = targetReplies.stream().filter(Predicate.not(InteractionReply::getAnonymity).or(r -> forAdmin)).map(InteractionReply::getUserId).collect(Collectors.toSet());userIds.addAll(targetUserIds);}// 3.3.查询用户Map<Long, UserDTO> userMap = new HashMap<>(userIds.size());if(userIds.size() > 0) {List<UserDTO> users = userClient.queryUserByIds(userIds);userMap = users.stream().collect(Collectors.toMap(UserDTO::getId, u -> u));}// 3.4.查询用户点赞状态Set<Long> bizLiked = remarkClient.isBizLiked(answerIds);// 4.处理VOList<ReplyVO> list = new ArrayList<>(records.size());for (InteractionReply r : records) {// 4.1.拷贝基础属性ReplyVO v = BeanUtils.toBean(r, ReplyVO.class);list.add(v);// 4.2.回复人信息if(!r.getAnonymity() || forAdmin){UserDTO userDTO = userMap.get(r.getUserId());if (userDTO != null) {v.setUserIcon(userDTO.getIcon());v.setUserName(userDTO.getName());v.setUserType(userDTO.getType());}}// 4.3.如果存在评论的目标,则需要设置目标用户信息if(r.getTargetReplyId() != null){UserDTO targetUser = userMap.get(r.getTargetUserId());if (targetUser != null) {v.setTargetUserName(targetUser.getName());}}// 4.4.点赞状态v.setLiked(bizLiked.contains(r.getId()));}return new PageDTO<>(page.getTotal(), page.getPages(), list);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/684997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL免安装版安装教程

官网下载安装包 MySQL :: Download MySQL Community Server (Archived Versions) 选择mysql版本下载 安装配置MySQL 将下载完的Mysql安装包解压到指定目录 打开windos系统的cmd&#xff0c;以管理员身份运行 进入mysql文件夹中的bin目录 安装MySQL的服务mysqld --install 初…

幻兽帕鲁游戏联机的时候,显示“网络连接超时”怎么解决?

如果你在游戏联机的时候&#xff0c;显示“网络连接超时”&#xff0c;可以检查下&#xff1a; 1、前提是你已经按照教程部署成功 2、检查防火墙有没有忘记设置&#xff0c;协议是UDP&#xff08;只有TCP不行&#xff0c;一定要有UDP&#xff09;&#xff0c;端口是否填了8211&…

AI:128-基于机器学习的建筑物能源消耗预测

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

02 c++入门

目录 c关键字命名空间c输入&输出缺省参数函数重载引用内联函数auto关键字(c11)基于范围的for循环(c11)指针空值—nullptr(c11) 0. 本节知识点安排目的 c是在c的基础上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式等…

【论文精读】DINO

摘要 基于对ViT在监督学习领域的表现质疑&#xff0c;探究自监督方法下的ViT是否具有更好的特征提取能力&#xff0c;进而发现&#xff1a; 自监督ViT特征包含场景布局、对象边界。这些信息可以在最后一自注意力模块中直接访问。自监督ViT特征结合最近邻分类器(k-NN)分类头中表…

java-8组合式异步编程

11.1 Future 接口 Future接口在Java5中被引人&#xff0c;设计初衷是对将来某个时刻会发生的结果进行建模。它建模了一种异步计算&#xff0c;返回一个执行运算结果的引用&#xff0c;当运算结束后&#xff0c;这个引用被返回给调用方。在Future中触发那些潜在耗时的操作把调用…

【VSCode】使用笔记

目录 快捷键系列 相关插件 相关文档链接 快捷键系列 调出终端 ctrl 或者是ctrlJ 结束进程 ctrlc 注释 ctrlkc 取消注释 ctrlku 上下移动代码 alt方向键 多行光标ctrlalt方向键 快速跳过某个单词 ctrl方向键 相关插件 1.每次修改后&#xff0c;自动保存启动项目 相…

【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱6(附带项目源码)

效果演示 文章目录 效果演示系列目录前言存储加载物品信息源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中&#xff0c;我们将探索如何用unity制作一个3D背包、库存、制作、快…

黄金交易策略(Nerve Nnife.mql4):移动止盈的设计

完整EA&#xff1a;Nerve Knife.ex4黄金交易策略_黄金趋势ea-CSDN博客 相较mt4的止盈止损&#xff0c;在ea上实现移动止盈&#xff0c;可以尽最大可能去获得更高收益。移动止盈的大体逻辑是&#xff1a;到达止盈点就开始追踪止盈&#xff0c;直到在最高盈利点回撤指定点数即平…

内网渗透Searchall敏感凭证信息搜索工具

一、开发背景 在实战中进入内网的时候&#xff0c;大家需要搜集一些敏感信息例如账号&#xff0c;密码甚至浏览器的账号密码。searchall完美解决了这个问题。所以我就结合自身的经验写了一款搜索敏感信息的利用工具。它可以搜索敏感信息&#xff0c;更快为你获取到有价值的信息…

【机器学习】数据清洗之识别重复点

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步…

武器级工具包 Immunity Canvas 7.26安装使用体验

介绍&#xff1a; Immunity Canvas工具包有集成化、自动化、简单化的特点&#xff0c;大幅降低了攻击门槛。该工具是Immunity公司的一款商业级漏洞利用和渗透测试工具&#xff0c;包含了480多个以上的漏洞利用&#xff0c;该工具工具本来并不开源&#xff0c;但是在2021年Immu…

函数递归与迭代附n的阶乘+顺序打印一个整数的每一位数+求第n个斐波那契数

1. 什么是递归&#xff1f; 递归其实是一种解决问题的方法&#xff0c;在C语言中&#xff0c;递归就是函数自己调用自己。 下面是一个最简单的C语言递归代码&#xff1a; #include <stdio.h> int main() {printf("hehe\n");main();//main函数中⼜调⽤了main函数…

基于Java (spring-boot)的房屋租赁管理系统

一、项目介绍 基于Java (spring-boot)的房屋租赁管理系统功能&#xff1a;登录、管理员、租客、公告信息管理、房屋信息管理、用户信息管理、租金信息管理、故障信息管理、房屋出租信息详情、个人信息、修改密码、等等等。 适用人群&#xff1a;适合小白、大学生、毕业设计、课…

linux优化空间完全卸载mysql——centos7.9

文章目录 ⭐前言⭐linux命令使用&#x1f496; 基础命令&#x1f496; 内存优化&#x1f496; 完全删除mysql ⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享 linux优化空间&完全卸载mysql——centos7.9。 linux内存分配 在Linux中&#xff0c;内存分配是…

第7讲 SpringSecurity执行原理概述

SpringSecurity执行原理概述 spring security的简单原理&#xff1a; SpringSecurity有很多很多的拦截器&#xff0c;在执行流程里面主要有两个核心的拦截器 1&#xff0c;登陆验证拦截器AuthenticationProcessingFilter 2&#xff0c;资源管理拦截器AbstractSecurityInterc…

为什么电路要设计得这么复杂?

首先提出这个问题就很不容易啊&#xff0c;我们看两个精彩回答。 From 骄建&#xff1a; 假设我们回到第一个实用放大电路诞生之前&#xff1a; 某天你开始做一个CS单管放大器&#xff0c;电阻负载&#xff0c;可是有一大堆问题&#xff0c;电阻做的不准&#xff0c;温度对器…

AI:129-基于深度学习的极端天气事件预警

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

HTML5 Canvas与JavaScript携手绘制动态星空背景

目录 一、程序代码 二、代码原理 三、运行效果 一、程序代码 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>星空背景</title> </head> <body style"overflow-x:hidden;"><canvas …

wayland(xdg_wm_base) client 使用 dmabuf 最简实例

文章目录 前言一、zwp_linux_dmabuf_v1 协议二、wayland client 使用 zwp_linux_dmabuf_v1 协议传递dma-buf代码实例1. wayland_dmabuf.c 代码实例2. xdg-shell-protocol.c 和 xdg-shell-client-protocol.h3. linux-dmabuf-unstable-v1-client-protocol.h 和 linux-dmabuf-unst…