|
@@ -0,0 +1,299 @@
|
|
|
|
|
+/*
|
|
|
|
|
+ * Copyright [2022] [https://www.xiaonuo.vip]
|
|
|
|
|
+ *
|
|
|
|
|
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
|
|
|
|
|
+ *
|
|
|
|
|
+ * 1.请不要删除和修改根目录下的LICENSE文件。
|
|
|
|
|
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
|
|
|
|
|
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
|
|
|
|
|
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
|
|
|
|
|
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
|
|
|
|
|
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
|
|
|
|
|
+ */
|
|
|
|
|
+package vip.xiaonuo.forum.modular.postinfo.service.impl;
|
|
|
|
|
+
|
|
|
|
|
+import cn.hutool.core.bean.BeanUtil;
|
|
|
|
|
+import cn.hutool.core.collection.CollStreamUtil;
|
|
|
|
|
+import cn.hutool.core.util.IdUtil;
|
|
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
|
|
+import cn.hutool.json.JSONObject;
|
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
|
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
|
|
+import org.springframework.context.annotation.Lazy;
|
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
+import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser;
|
|
|
|
|
+import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
|
|
|
|
|
+import vip.xiaonuo.common.enums.CommonSortOrderEnum;
|
|
|
|
|
+import vip.xiaonuo.common.exception.CommonException;
|
|
|
|
|
+import vip.xiaonuo.common.page.CommonPageRequest;
|
|
|
|
|
+import vip.xiaonuo.common.pojo.CommonResult;
|
|
|
|
|
+import vip.xiaonuo.forum.modular.contentcorrection.entity.ForumContentCorrection;
|
|
|
|
|
+import vip.xiaonuo.forum.modular.contentcorrection.mapper.ForumContentCorrectionMapper;
|
|
|
|
|
+import vip.xiaonuo.forum.modular.postinfo.entity.ForumPostInfo;
|
|
|
|
|
+import vip.xiaonuo.forum.modular.postinfo.entity.ForumPostInfoVo;
|
|
|
|
|
+import vip.xiaonuo.forum.modular.postinfo.mapper.ForumPostInfoMapper;
|
|
|
|
|
+import vip.xiaonuo.forum.modular.postinfo.param.ForumPostInfoAddParam;
|
|
|
|
|
+import vip.xiaonuo.forum.modular.postinfo.param.ForumPostInfoEditParam;
|
|
|
|
|
+import vip.xiaonuo.forum.modular.postinfo.param.ForumPostInfoIdParam;
|
|
|
|
|
+import vip.xiaonuo.forum.modular.postinfo.param.ForumPostInfoPageParam;
|
|
|
|
|
+import vip.xiaonuo.forum.modular.postinfo.service.ForumPostInfoService;
|
|
|
|
|
+import vip.xiaonuo.forum.modular.postreply.entity.ForumPostReply;
|
|
|
|
|
+import vip.xiaonuo.forum.modular.postreply.param.ForumPostReplyPageParam;
|
|
|
|
|
+import vip.xiaonuo.forum.modular.postreply.service.ForumPostReplyService;
|
|
|
|
|
+import vip.xiaonuo.forum.modular.posttype.entity.ForumPostType;
|
|
|
|
|
+import vip.xiaonuo.forum.modular.posttype.mapper.ForumPostTypeMapper;
|
|
|
|
|
+import vip.xiaonuo.forum.modular.sensitivity.entity.ForumSensitivity;
|
|
|
|
|
+import vip.xiaonuo.forum.modular.sensitivity.mapper.ForumSensitivityMapper;
|
|
|
|
|
+import vip.xiaonuo.forum.modular.sensitivityrecord.entity.ForumSensitivityRecord;
|
|
|
|
|
+import vip.xiaonuo.forum.modular.sensitivityrecord.mapper.ForumSensitivityRecordMapper;
|
|
|
|
|
+import vip.xiaonuo.forum.modular.supportenv.entity.ForumSupportEnv;
|
|
|
|
|
+import vip.xiaonuo.forum.modular.supportenv.mapper.ForumSupportEnvMapper;
|
|
|
|
|
+import vip.xiaonuo.sys.api.SysUserApi;
|
|
|
|
|
+
|
|
|
|
|
+import javax.annotation.Resource;
|
|
|
|
|
+import java.util.List;
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * 帖子信息表Service接口实现类
|
|
|
|
|
+ *
|
|
|
|
|
+ * @author 金吉龙
|
|
|
|
|
+ * @date 2025/07/16 08:46
|
|
|
|
|
+ **/
|
|
|
|
|
+@Service
|
|
|
|
|
+public class ForumPostInfoServiceImpl extends ServiceImpl<ForumPostInfoMapper, ForumPostInfo> implements ForumPostInfoService {
|
|
|
|
|
+
|
|
|
|
|
+ @Resource
|
|
|
|
|
+ private ForumSensitivityMapper forumSensitivityMapper;
|
|
|
|
|
+
|
|
|
|
|
+ @Resource
|
|
|
|
|
+ private ForumSensitivityRecordMapper forumSensitivityRecordMapper;
|
|
|
|
|
+
|
|
|
|
|
+ @Resource
|
|
|
|
|
+ private ForumSupportEnvMapper forumSupportEnvMapper;
|
|
|
|
|
+
|
|
|
|
|
+ @Resource
|
|
|
|
|
+ private ForumContentCorrectionMapper forumContentCorrectionMapper;
|
|
|
|
|
+
|
|
|
|
|
+ @Resource
|
|
|
|
|
+ private SysUserApi sysUserApi;
|
|
|
|
|
+
|
|
|
|
|
+ @Resource
|
|
|
|
|
+ private ForumPostTypeMapper forumPostTypeMapper;
|
|
|
|
|
+
|
|
|
|
|
+ @Resource
|
|
|
|
|
+ @Lazy
|
|
|
|
|
+ private ForumPostReplyService forumPostReplyService;
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public Page<ForumPostInfo> page(ForumPostInfoPageParam forumPostInfoPageParam) {
|
|
|
|
|
+ QueryWrapper<ForumPostInfo> queryWrapper = new QueryWrapper<>();
|
|
|
|
|
+ // 帖子标题
|
|
|
|
|
+ if (StringUtils.isNotBlank(forumPostInfoPageParam.getPostTitle())) {
|
|
|
|
|
+ queryWrapper.lambda().like(ForumPostInfo::getPostTitle, forumPostInfoPageParam.getPostTitle());
|
|
|
|
|
+ }
|
|
|
|
|
+ // 帖子分类
|
|
|
|
|
+ if (StringUtils.isNotBlank(forumPostInfoPageParam.getTypeId())) {
|
|
|
|
|
+ queryWrapper.lambda().eq(ForumPostInfo::getTypeId, forumPostInfoPageParam.getTypeId());
|
|
|
|
|
+ }
|
|
|
|
|
+ // 帖子类型 0普通帖子 1技术支持 2内容纠错
|
|
|
|
|
+ if (forumPostInfoPageParam.getPostType() != null) {
|
|
|
|
|
+ queryWrapper.lambda().eq(ForumPostInfo::getPostType, forumPostInfoPageParam.getPostType());
|
|
|
|
|
+ }
|
|
|
|
|
+ // 根据标识排序
|
|
|
|
|
+ // 排序字段 0回复 1浏览 2活动
|
|
|
|
|
+ if (forumPostInfoPageParam.getSortField() != null) {
|
|
|
|
|
+ if (forumPostInfoPageParam.getSortField() == 0) {
|
|
|
|
|
+ queryWrapper.lambda().orderByDesc(ForumPostInfo::getReplyCount);
|
|
|
|
|
+ } else if (forumPostInfoPageParam.getSortField() == 1) {
|
|
|
|
|
+ queryWrapper.lambda().orderByDesc(ForumPostInfo::getViewCount);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ queryWrapper.lambda().orderByDesc(ForumPostInfo::getLastReplyTime);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // 排序方式 0最新 1热门
|
|
|
|
|
+ if (forumPostInfoPageParam.getSortOrder() == 0) {
|
|
|
|
|
+ queryWrapper.lambda().orderByDesc(ForumPostInfo::getCreateTime);
|
|
|
|
|
+ } else if (forumPostInfoPageParam.getSortOrder() == 1) {
|
|
|
|
|
+ queryWrapper.lambda().orderByDesc(ForumPostInfo::getViewCount);
|
|
|
|
|
+ }
|
|
|
|
|
+ Page<ForumPostInfo> page = this.page(CommonPageRequest.defaultPage(), queryWrapper);
|
|
|
|
|
+ if (page.getRecords().size() > 0) {
|
|
|
|
|
+ for (ForumPostInfo forumPostInfo : page.getRecords()) {
|
|
|
|
|
+ // 关联帖子分类名称
|
|
|
|
|
+ ForumPostType forumPostType = forumPostTypeMapper.selectById(forumPostInfo.getTypeId());
|
|
|
|
|
+ if (ObjectUtil.isNotNull(forumPostType)) {
|
|
|
|
|
+ forumPostInfo.setTypeName(forumPostType.getTypeName());
|
|
|
|
|
+ }
|
|
|
|
|
+ // 关联发帖用户的信息
|
|
|
|
|
+ JSONObject user = sysUserApi.getUserByIdWithoutException(forumPostInfo.getUserId());
|
|
|
|
|
+ if (user != null) {
|
|
|
|
|
+ forumPostInfo.setUserNickName(user.getStr("name"));
|
|
|
|
|
+ forumPostInfo.setUserAvatar(user.getStr("avatar"));
|
|
|
|
|
+ }
|
|
|
|
|
+ // 关联最后发帖用户的信息
|
|
|
|
|
+ JSONObject lastReplyUser = sysUserApi.getUserByIdWithoutException(forumPostInfo.getLastReplyUserId());
|
|
|
|
|
+ if (lastReplyUser != null) {
|
|
|
|
|
+ forumPostInfo.setLastReplyUserNickName(lastReplyUser.getStr("name"));
|
|
|
|
|
+ forumPostInfo.setLastReplyUserAvatar(lastReplyUser.getStr("avatar"));
|
|
|
|
|
+ }
|
|
|
|
|
+ // 校验帖子是否为自己的
|
|
|
|
|
+ if (forumPostInfo.getUserId().equals(StpLoginUserUtil.getLoginUser().getId())) {
|
|
|
|
|
+ forumPostInfo.setIsSelf(1);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ forumPostInfo.setIsSelf(0);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return page;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public CommonResult<String> add(ForumPostInfoAddParam forumPostInfoAddParam) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ String uuid = IdUtil.fastSimpleUUID();
|
|
|
|
|
+ ForumPostInfo forumPostInfo = BeanUtil.toBean(forumPostInfoAddParam, ForumPostInfo.class);
|
|
|
|
|
+ forumPostInfo.setPostId(uuid);
|
|
|
|
|
+ // 设置用户
|
|
|
|
|
+ SaBaseLoginUser loginUser = StpLoginUserUtil.getLoginUser();
|
|
|
|
|
+ forumPostInfo.setUserId(loginUser.getId());
|
|
|
|
|
+ // 过滤敏感词
|
|
|
|
|
+ filterSensitiveWords(forumPostInfoAddParam, loginUser, uuid);
|
|
|
|
|
+ // 存储基础表
|
|
|
|
|
+ this.save(forumPostInfo);
|
|
|
|
|
+ // 区分出是普通帖子、还是技术支持帖子、内容纠错帖子 0普通帖子 1技术支持 2内容纠错
|
|
|
|
|
+ if (forumPostInfo.getPostType() == 0) {
|
|
|
|
|
+ // 普通帖子直接存储
|
|
|
|
|
+ // 普通帖子暂时不做其他处理
|
|
|
|
|
+ } else if (forumPostInfo.getPostType() == 1) {
|
|
|
|
|
+ // 技术支持帖子,需要额外存储浏览器信息
|
|
|
|
|
+ ForumSupportEnv forumSupportEnv = BeanUtil.toBean(forumPostInfoAddParam.getForumSupportEnvParam(), ForumSupportEnv.class);
|
|
|
|
|
+ forumSupportEnv.setPostId(uuid);
|
|
|
|
|
+ forumSupportEnvMapper.insert(forumSupportEnv);
|
|
|
|
|
+ } else if (forumPostInfo.getPostType() == 2) {
|
|
|
|
|
+ // 内容纠错帖子,需要额外存储纠错内容信息,比如课程章节、作业题、考试题
|
|
|
|
|
+ ForumContentCorrection forumContentCorrection = BeanUtil.toBean(forumPostInfoAddParam.getContentCorrectionParam(), ForumContentCorrection.class);
|
|
|
|
|
+ forumContentCorrection.setPostId(uuid);
|
|
|
|
|
+ forumContentCorrectionMapper.insert(forumContentCorrection);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return CommonResult.error("帖子类型不正确");
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ return CommonResult.error(e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ return CommonResult.ok();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 过滤发帖中的敏感词
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param forumPostInfoAddParam 帖子信息编辑参数
|
|
|
|
|
+ */
|
|
|
|
|
+ public void filterSensitiveWords(ForumPostInfoAddParam forumPostInfoAddParam, SaBaseLoginUser loginUser, String uuid) {
|
|
|
|
|
+ List<ForumSensitivity> forumSensitivities = forumSensitivityMapper.selectList(new QueryWrapper<>());
|
|
|
|
|
+ if (forumSensitivities.size() > 0) {
|
|
|
|
|
+ // 过滤敏感词
|
|
|
|
|
+ for (ForumSensitivity forumSensitivity : forumSensitivities) {
|
|
|
|
|
+ // 过滤逻辑
|
|
|
|
|
+ if (forumPostInfoAddParam.getPostContent().contains(forumSensitivity.getSensitivityWord())) {
|
|
|
|
|
+ // 替换句子中敏感词为*号
|
|
|
|
|
+ forumPostInfoAddParam.setPostContent(forumPostInfoAddParam.getPostContent().replace(forumSensitivity.getSensitivityWord(), "******"));
|
|
|
|
|
+ }
|
|
|
|
|
+ // 记录敏感词命中情况
|
|
|
|
|
+ ForumSensitivityRecord forumSensitivityRecord = new ForumSensitivityRecord();
|
|
|
|
|
+ forumSensitivityRecord.setSensitivityWord(forumSensitivity.getSensitivityWord()); // 敏感词
|
|
|
|
|
+ forumSensitivityRecord.setUserId(loginUser.getId()); // 用户id
|
|
|
|
|
+ forumSensitivityRecord.setRecordType(0); // 发帖子类型
|
|
|
|
|
+ forumSensitivityRecord.setPostId(uuid); // 帖子id
|
|
|
|
|
+ forumSensitivityRecordMapper.insert(forumSensitivityRecord);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void edit(ForumPostInfoEditParam forumPostInfoEditParam) {
|
|
|
|
|
+ ForumPostInfo forumPostInfo = this.queryEntity(forumPostInfoEditParam.getPostId());
|
|
|
|
|
+ BeanUtil.copyProperties(forumPostInfoEditParam, forumPostInfo);
|
|
|
|
|
+ this.updateById(forumPostInfo);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void delete(List<ForumPostInfoIdParam> forumPostInfoIdParamList) {
|
|
|
|
|
+ // 执行删除
|
|
|
|
|
+ this.removeByIds(CollStreamUtil.toList(forumPostInfoIdParamList, ForumPostInfoIdParam::getPostId));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public ForumPostInfoVo detail(ForumPostInfoIdParam forumPostInfoIdParam) {
|
|
|
|
|
+ // 查询和转换帖子基础信息
|
|
|
|
|
+ ForumPostInfo forumPostInfo = this.queryEntity(forumPostInfoIdParam.getPostId());
|
|
|
|
|
+ ForumPostInfoVo forumPostInfoVo = BeanUtil.toBean(forumPostInfo, ForumPostInfoVo.class);
|
|
|
|
|
+ // 关联分类名称
|
|
|
|
|
+ ForumPostType forumPostType = forumPostTypeMapper.selectById(forumPostInfoVo.getTypeId());
|
|
|
|
|
+ if (ObjectUtil.isNotNull(forumPostType)) {
|
|
|
|
|
+ forumPostInfoVo.setTypeName(forumPostType.getTypeName());
|
|
|
|
|
+ }
|
|
|
|
|
+ // 关联发帖用户的信息
|
|
|
|
|
+ JSONObject user = sysUserApi.getUserByIdWithoutException(forumPostInfo.getUserId());
|
|
|
|
|
+ if (user != null) {
|
|
|
|
|
+ forumPostInfoVo.setUserNickName(user.getStr("name"));
|
|
|
|
|
+ forumPostInfoVo.setUserAvatar(user.getStr("avatar"));
|
|
|
|
|
+ }
|
|
|
|
|
+ // 关联最后发帖用户的信息
|
|
|
|
|
+ JSONObject lastReplyUser = sysUserApi.getUserByIdWithoutException(forumPostInfo.getLastReplyUserId());
|
|
|
|
|
+ if (lastReplyUser != null) {
|
|
|
|
|
+ forumPostInfoVo.setLastReplyUserNickName(lastReplyUser.getStr("name"));
|
|
|
|
|
+ forumPostInfoVo.setLastReplyUserAvatar(lastReplyUser.getStr("avatar"));
|
|
|
|
|
+ }
|
|
|
|
|
+ // 校验此条帖子是否为自己的
|
|
|
|
|
+ if (forumPostInfo.getUserId().equals(StpLoginUserUtil.getLoginUser().getId())) {
|
|
|
|
|
+ forumPostInfoVo.setIsSelf(1);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ forumPostInfoVo.setIsSelf(0);
|
|
|
|
|
+ }
|
|
|
|
|
+ // 查询详情的同时,给帖子增加浏览量和热度
|
|
|
|
|
+ forumPostInfo.setViewCount(forumPostInfo.getViewCount() + 1);
|
|
|
|
|
+ this.updateById(forumPostInfo);
|
|
|
|
|
+ // 查询帖子回复信息
|
|
|
|
|
+ ForumPostReplyPageParam forumPostReplyPageParam = new ForumPostReplyPageParam();
|
|
|
|
|
+ forumPostReplyPageParam.setCurrent(forumPostInfoIdParam.getCurrent());
|
|
|
|
|
+ forumPostReplyPageParam.setSize(forumPostInfoIdParam.getSize());
|
|
|
|
|
+ forumPostReplyPageParam.setPostId(forumPostInfoVo.getPostId());
|
|
|
|
|
+ Page<ForumPostReply> page = forumPostReplyService.page(forumPostReplyPageParam);
|
|
|
|
|
+ forumPostInfoVo.setReplyList(page);
|
|
|
|
|
+ // 如果是技术支持或内容纠错,需要关联对应的
|
|
|
|
|
+ if (forumPostInfoVo.getPostType() == 1) {
|
|
|
|
|
+ QueryWrapper<ForumSupportEnv> queryWrapper = new QueryWrapper<>();
|
|
|
|
|
+ queryWrapper.lambda().eq(ForumSupportEnv::getPostId, forumPostInfoVo.getPostId());
|
|
|
|
|
+ ForumSupportEnv forumSupportEnv = forumSupportEnvMapper.selectOne(queryWrapper);
|
|
|
|
|
+ if (forumSupportEnv != null) {
|
|
|
|
|
+ forumPostInfoVo.setForumSupportEnv(forumSupportEnv);
|
|
|
|
|
+ }
|
|
|
|
|
+ } else if (forumPostInfoVo.getPostType() == 2) {
|
|
|
|
|
+ QueryWrapper<ForumContentCorrection> queryWrapper = new QueryWrapper<>();
|
|
|
|
|
+ queryWrapper.lambda().eq(ForumContentCorrection::getPostId, forumPostInfoVo.getPostId());
|
|
|
|
|
+ ForumContentCorrection forumContentCorrection = forumContentCorrectionMapper.selectOne(queryWrapper);
|
|
|
|
|
+ if (forumContentCorrection != null) {
|
|
|
|
|
+ forumPostInfoVo.setForumContentCorrection(forumContentCorrection);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return forumPostInfoVo;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public ForumPostInfo queryEntity(String id) {
|
|
|
|
|
+ ForumPostInfo forumPostInfo = this.getById(id);
|
|
|
|
|
+ if(ObjectUtil.isEmpty(forumPostInfo)) {
|
|
|
|
|
+ throw new CommonException("帖子信息表不存在,id值为:{}", id);
|
|
|
|
|
+ }
|
|
|
|
|
+ return forumPostInfo;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+}
|