springboot中使用mongodb完成评论功能
pom文件中引入
<!-- mongodb --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
yml中配置连接
data:mongodb:uri: mongodb://admin:123456@127.0.0.1:27017/test?authSource=admin&authMechanism=SCRAM-SHA-1
评论表字段如下(根据自己的需求设计)
public class Comment {@Id@ApiModelProperty(value = "评论id***********数据类型:string")private String id;/*** 父级评论id*/@ApiModelProperty(value = "父级评论id***********数据类型:int")private String pid;/*** 用户id*/@ApiModelProperty(value = "用户id***********数据类型:int")private Integer customerId;/*** 用户姓名*/@ApiModelProperty(value = "用户姓名***********数据类型:string")private String customerName;/*** 用户头像*/@ApiModelProperty(value = "用户头像***********数据类型:string")private String customerAvatar;/*** 是否是会员:1:是;2:否*/@ApiModelProperty(value = "是否是会员:1:是;2:否***********数据类型:int")private Integer customerIsVip;/*** 评论内容*/@ApiModelProperty(value = "评论内容***********数据类型:string")private String content;/*** 评论图片*/@ApiModelProperty(value = "评论图片***********数据类型:string")private String image;/*** 业务类型 */@ApiModelProperty(value = "业务类型***********数据类型:int")private Integer busType;/*** 业务id*/@ApiModelProperty(value = "业务id***********数据类型:long")private Long busId;/*** 审核状态 1:待审核;2:审核通过;3:审核失败*/@ApiModelProperty(value = "审核状态 1:待审核;2:审核通过;3:审核失败***********数据类型:int")private Integer isShow;/*** 是否置顶 1:是;2:否*/@ApiModelProperty(value = "是否置顶 1:是;2:否***********数据类型:int")private Integer isTop;/*** 是否是作者 1:是;2:否*/@ApiModelProperty(value = "是否是作者 1:是;2:否***********数据类型:int")private Integer isAuthor;/*** 是否为精选评论 1:是;2:否*/@ApiModelProperty(value = "是否为精选评论 1:是;2:否***********数据类型:int")private Integer isFeatured;/*** 是否为首评 1:是;2:否*/@ApiModelProperty(value = "是否为首评 1:是;2:否***********数据类型:int")private Integer isFirst;/*** 被回复评论id*/@ApiModelProperty(value = "被回复评论id***********数据类型:int")private String replyId;/*** 被回复用户id*/@ApiModelProperty(value = "被回复用户id***********数据类型:int")private Integer replyCustomerId;/*** 是否是会员:1:是;2:否*/@ApiModelProperty(value = "是否是会员:1:是;2:否***********数据类型:int")private Integer replyCustomerIsVip;/*** 被回复用户姓名*/@ApiModelProperty(value = "被回复用户姓名***********数据类型:string")private String replyCustomerName;/*** 被回复用户头像*/@ApiModelProperty(value = "被回复用户头像***********数据类型:string")private String replyCustomerAvatar;/*** 点赞数量*/@ApiModelProperty(value = "点赞数量***********数据类型:int")private Integer likeCount;/*** 点赞状态 1:已赞;2:未赞*/@ApiModelProperty(value = "点赞状态 1:已赞;2:未赞***********数据类型:int")private Integer thumbUpStatus;/*** 是否是朋友 0:是;1:否*/@ApiModelProperty(value = "点赞状态 1:已赞;2:未赞***********数据类型:int")private Integer isFriend;/*** 发表时间*/@ApiModelProperty(value = "发表时间***********数据类型:date")@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date createTime;/*** 是否是首评 1:是;2:否*/@ApiModelProperty(value = "是否是首评 1:是;2:否***********数据类型:int")public Integer getIsFirst() {return isFirst;}/*** 是否是回复1级 1:是;2否*/@ApiModelProperty(value = "是否是回复1级 1:是;2否***********数据类型:int")public Integer isReplyOne;/*** 修改时间*/@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date updateTime;/*** 子评论*/@ApiModelProperty(value = "子评论***********数据类型:obj")private Page<AiComment> childrens;
创建CommentRespository并且继MongoRepository<Comment,String>
package com.mongo.respository;import com.mongo.domain.Comment;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.repository.MongoRepository;import java.util.List;public interface CommentRespository extends MongoRepository<Comment,String> {/*** 通过条件查询分页* @date 2024/10/12 18:05* @param busType 业务类型* @param busId 业务id* @param isShow 是否显示* @param pid 父id* @param pageable 分页* @return */Page<Comment> findByBusTypeAndBusIdAndIsShowAndPid(Integer busType, Long busId, Integer isShow, String pid, Pageable pageable);/*** 通过评论id查询* @date 2024/11/27 11:35* @param id 评论id* @param list 是否显示* @param pageable 分页* @return */Page<Comment> findByIdAndIsShowIn(String id, List<Integer> list, Pageable pageable);/*** 通过业务类型和业务id查询是否存在评论* @date 2024/11/18 10:44* @param busType 业务类型 * @param busId 业务id * @return*/List<Comment> findAiCommentByBusTypeAndAndBusId(Integer busType,Long busId);/*** 通过条件查询分页(如果有敏感的词自己可以查看)* @date 2024/11/21 18:23* @param busType 业务类型* @param busId 业务id* @param isShow 是否显示* @param pid 父id* @param busType2 业务类型* @param busId2 业务id* @param pid2 父id* @param customerId 用户id* @param list 审核状态* @param pageable 分页* @return*/Page<Comment> findByBusTypeAndBusIdAndIsShowAndPidOrBusTypeAndBusIdAndPidAndCustomerIdAndIsShowIn(Integer busType,Long busId,Integer isShow,String pid,Integer busType2,Long busId2,String pid2,Integer customerId,List<Integer> list,Pageable pageable);
}
此MongoRepository的好处是对于一些比较简单的查询可以直接按字段组装来查询
比如findByIdAndIsShowIn 就是通过业务id和展示的状态来查询 直接见明识意
还有一种查询方式针对比较麻烦的sql语句
在respository中定义
package com.mongo.respository;import com.mongo.domain.AiComment;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;import java.util.Date;
import java.util.List;public interface CommentRespository extends MongoRepository<Comment,String> {/*** 条件查询分页* @date 2024/11/10 11:42* @param customerId 评论人id* @param isShow 审核状态* @param isFeature 是否是精选* @param startDate 开始日期* @param endDate 结束日期* @param pageable 分页* @return*/List<Comment> findByParams(Integer customerId, Integer isShow, Integer isFeature, Date startDate, Date endDate, Pageable pageable);/*** 条件查询总数* @date 2024/11/10 11:42* @param customerId 评论人id* @param isShow 审核状态* @param isFeature 是否是精选* @param startDate 开始日期* @param endDate 结束日期* @return java.lang.Long*/Long countParams(Integer customerId, Integer isShow, Integer isFeature, Date startDate, Date endDate);
}
实现类继承此类
package com.mongo.respository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import com.mongo.domain.Comment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.repository.query.FluentQuery;
import org.springframework.stereotype.Repository;import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;@Repository
public class CommentRespositoryImpl implements CommentRespository{@Autowiredprivate MongoTemplate mongoTemplate;/*** 条件查询分页* @date 2024/11/10 11:42* @param customerId 评论人id* @param isShow 审核状态* @param isFeature 是否是精选* @param startDate 开始日期* @param endDate 结束日期* @param pageable 分页* @return*/@Overridepublic List<Comment> findByParams(Integer customerId, Integer isShow, Integer isFeature, Date startDate, Date endDate, Pageable pageable) {Criteria criteria = new Criteria();Query query = new Query();if (null != customerId) {criteria.and("customerId").is(customerId);}if (null != isShow) {criteria.and("isShow").is(isShow);}if (null != isFeature) {criteria.and("isFeatured").is(isFeature);}if (null != startDate && null != endDate) {criteria.and("createTime").gte(startDate).lte(endDate);} else if (startDate!= null) {criteria.and("createTime").gte(startDate);} else if (endDate!= null) {criteria.and("createTime").lte(endDate);}query.addCriteria(criteria);return mongoTemplate.find(query.with(pageable), Comment.class);}/*** 条件查询总数* @date 2024/11/10 11:42* @param customerId 评论人id* @param isShow 审核状态* @param isFeature 是否是精选* @param startDate 开始日期* @param endDate 结束日期* @return java.lang.Long*/@Overridepublic Long countParams(Integer customerId, Integer isShow, Integer isFeature, Date startDate, Date endDate) {List<Criteria> criteriaList = new ArrayList<>();if (null != customerId) {criteriaList.add(Criteria.where("customerId").is(customerId));}if (null != isShow) {criteriaList.add(Criteria.where("isShow").is(isShow));}if (null != isFeature) {criteriaList.add(Criteria.where("isFeatured").is(isFeature));}if (null != startDate && null != endDate) {criteriaList.add(Criteria.where("createTime").gte(startDate).lte(endDate));} else if (startDate!= null) {criteriaList.add(Criteria.where("createTime").gte(startDate));} else if (endDate!= null) {criteriaList.add(Criteria.where("createTime").lte(endDate));}if (criteriaList.isEmpty()) {List<Comment> comments = mongoTemplate.findAll(Comment.class);if (comments.isEmpty()) {return 0L;} else {return (long) comments.size();}} else {Query query = Query.query(Criteria.where("").andOperator(criteriaList.toArray(new Criteria[0])));List<AiComment> posts = mongoTemplate.find(query, Comment.class);if (posts.isEmpty()) {return 0L;} else {return (long) posts.size();}}}}
通过Criteria和Query结合来查询
最后评论效果

评论字段说明
isReplyOne 如果是1的情况下回复一级就不显示谁回复谁
如果是一级以下的子评论isReplyOne是2就显示 张三回复李四
查询sql说明
PageRequest pageRequest = PageRequest.of(pageNum - 1, pageSize, Sort.by(Sort.Order.asc("isTop"), Sort.Order.desc("createTime")));
Page<Comment> page;
if (0 == customerId) {page = aiCommentRespository.findByBusTypeAndBusIdAndIsShowAndPid(busType, busId, IsShowEnum.YES.getKey(), "0", pageRequest);
} else {page = aiCommentRespository.findByBusTypeAndBusIdAndIsShowAndPidOrBusTypeAndBusIdAndPidAndCustomerIdAndIsShowIn(busType, busId, IsShowEnum.CHECK_SUCCESS.getKey(), "0", busType, busId, "0", customerId, Arrays.asList(0, 1), pageRequest);
}
这里判断customerId为0是用户登陆与不登陆的情况下的操作
Arrays.asList(0, 1) 解释:因为评论可能涉及敏感信息,当用户自己评论了带有敏感的系统自动检测为敏感状态变为0(待审核状态),自己可以看到而别的用户不可以看到,所以isShow的查询条件为0,1。1为审核通过状态
findByBusTypeAndBusIdAndIsShowAndPidOrBusTypeAndBusIdAndPidAndCustomerIdAndIsShowIn
这条sql的解释:这是一条or语句
BusTypeAndBusIdAndIsShowAndPid 这是为了查询审核通过的评论
而or后面的语句是为了当本人评论了敏感的信息后可以让本人看到自己的评论而别人不可以看到
BusTypeAndBusIdAndPidAndCustomerIdAndIsShowIn
查询子评论 只需要要循环上面的评论 把pid换成主评论id即可
相关文章:
springboot中使用mongodb完成评论功能
pom文件中引入 <!-- mongodb --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> yml中配置连接 data:mongodb:uri: mongodb://admin:1234561…...
Dubbo的RPC泛化调用
目录 一、RPC泛化调用的应用场景 二、Dubbo RPC泛化调用的实现原理 三、Dubbo RPC泛化调用的实现步骤 四、示例代码 五、泛化调用怎么发现提供该接口的服务及服务的IP和端口? Dubbo的RPC泛化调用是一种在调用方没有服务方提供的API的情况下,对服务方…...
【k8s深入理解之 Scheme】全面理解 Scheme 的注册机制、内外部版本、自动转换函数、默认填充函数、Options等机制
参考 【k8s基础篇】k8s scheme3 之序列化_基于schema进行序列化-CSDN博客【k8s基础篇】k8s scheme4 之资源数据结构与资源注册_kubernetes 的scheam-CSDN博客常见问题答疑 【k8s深入理解之 Scheme 补充-1】理解 Scheme 中资源的注册以及 GVK 和 go 结构体的映射-CSDN博客【k8s深…...
接口性能优化宝典:解决性能瓶颈的策略与实践
目录 一、直面索引 (一)索引优化的常见场景 (二)如何检查索引的使用情况 (三)如何避免索引失效 (四)强制选择索引 二、提升 SQL 执行效率 (一)避免不必…...
雨晨 Windows Server 2025 数据中心 极简 26311.5000
文件: 雨晨 Windows Server 2025 数据中心 极简 26311.5000 install.esd 大小: 1740910278 字节 修改时间: 2024年11月29日, 星期五, 19:00:20 MD5: 5B946B9DED569E04917E804B25A0F736 SHA1: E78BB430B3E0397F6ACFEB821CF85EA7CFB5A00F CRC32: B3F76BD7 常规制作旨在测试YCDIS…...
关于IDE的相关知识之三【插件安装、配置及推荐的意义】
成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于ide插件安装、配置及推荐意义的相关内容…...
JSP+Servlet实现列表分页功能
分享一种最简单的JSPServlet实现分页的方式! 旧:无分页功能的查询列表功能,仅供参考! Servlet try {Connection conn null;PreparedStatement ps null;ResultSet rs null;List<Dept> arrayList null;conn DBUtil.get…...
操作系统存储器相关习题
1 为什么要配置层次式存储器? 设置多个存储器可以使存储器两端的硬件能并行工作; 采用多级存储系统特别是Cache技术,是减轻存储器带宽对系统性能影响的最佳结构方案; 在微处理机内部设置各种缓冲存储器,减轻对存储器存取的压力。…...
QUICK 调试camera-xml解析
本文主要介绍如何在QUICK QCS6490使能相机模组。QCS6490的相机基于CameraX的框架,只需通过配置XML文件,设置相机模组的相关参数,就可以点亮相机。本文主要介绍Camera Sensor Module XML和Camera Sensor XML配置的解析,这中间需要c…...
【linux】shell脚本编写基础
shell 脚本关键字: 1、变量定义:前后不能空格 输入: zhao"Joe" echo ${zhao} echo "I am ${zhao}" 输出: yuxin I am Joe2、echo 输出 输入: echo "123" 输出: 1233、readonly 定义变…...
STM32 外设简介
STM32 外设简介 STM32 是由意法半导体 (STMicroelectronics) 开发的一系列基于 ARM Cortex 内核的微控制器,广泛应用于嵌入式系统中。STM32 系列的一个重要特点是其丰富而强大的外设模块,支持多种接口和功能,能满足工业控制、物联网、消费电…...
Django-Vue3-Admin - 现代化的前后端分离权限管理系统
项目介绍 Django-Vue3-Admin是一个基于RBAC(Role-Based Access Control)模型的综合性基础开发平台,专注于权限控制,支持列级别的细粒度权限管理。该项目采用前后端分离架构,技术栈包括: 后端: Django Django REST …...
Cesium K-means自动聚合点的原理
Cesium K-means自动聚合点的原理 Cesium 是一个开源的 JavaScript 库,用于在 Web 环境中创建 3D 地球和地图应用。它能够处理地理空间数据,并允许开发者对大规模的地理数据进行可视化展示。在一些应用中,尤其是当处理大量地理坐标点时&#…...
Vue 项目中如何解决组件之间的循环依赖
前言 在大型 Vue 项目中,组件之间的关系可能会变得非常复杂,甚至会出现循环依赖的问题。循环依赖是指两个或多个模块互相依赖,形成一个闭环。这类问题会导致项目无法正常编译或运行,甚至可能引发意想不到的错误。本文将通过通俗易…...
交通流量预测:基于交通流量数据建立模型
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
Hot100 - 搜索二维矩阵II
Hot100 - 搜索二维矩阵II 最佳思路: 利用矩阵的特性,针对搜索操作可以从右上角或者左下角开始。通过判断当前位置的元素与目标值的关系,逐步缩小搜索范围,从而达到较高的效率。 从右上角开始:假设矩阵是升序排列的&a…...
uart_pl011.c驱动API的zephyr测试
API概述 本次测试针对uart的uart_poll_in和uart_poll_outAPI进行测试, uart_poll_in static int pl011_poll_in(const struct device *dev, unsigned char *c)这是一个轮询方式的接收函数: 功能:检查 UART 是否有新数据到达,如…...
RPA:电商订单处理自动化
哈喽,大家好,我是若木,最近闲暇时间较多,于是便跟着教程做了一个及RPA,谈到这个,可能很多人并不是很了解,但是实际上,这玩意却遍布文末生活的边边角角。话不多说,我直接上…...
小程序 - 个人简历
为了让招聘人员快速地认识自己,可以做一个“个人简历”微信小程序, 展示自己的个人信息。 下面将对“个人简历”微信小程序进行详细讲解。 目录 个人简历 创建图片目录 页面开发 index.wxml index.wxss 功能实现截图 总结 个人简历 创建图片目录…...
MySQL自启动失败(MySQL不能开机自启)解决方案_MySQL开机自启疑难杂症解决,适用Win11/Win10
问题描述(MySQL 开机自启失败) 本文解决方法,在 windows10 、 windows11 系统中均可使用。 win11 安装 MySQL 后,不能开机自启。 在服务中,手动启动服务后,可正常使用,一点异常都没有。 或者…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...
aardio 自动识别验证码输入
技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”,于是尝试整合图像识别与网页自动化技术,完成了这套模拟登录流程。核心思路是:截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...
C# WPF 左右布局实现学习笔记(1)
开发流程视频: https://www.youtube.com/watch?vCkHyDYeImjY&ab_channelC%23DesignPro Git源码: GitHub - CSharpDesignPro/Page-Navigation-using-MVVM: WPF - Page Navigation using MVVM 1. 新建工程 新建WPF应用(.NET Framework) 2.…...
el-amap-bezier-curve运用及线弧度设置
文章目录 简介示例线弧度属性主要弧度相关属性其他相关样式属性完整示例链接简介 el-amap-bezier-curve 是 Vue-Amap 组件库中的一个组件,用于在 高德地图 上绘制贝塞尔曲线。 基本用法属性path定义曲线的路径,可以是多个弧线段的组合。stroke-weight线条的宽度。stroke…...
