Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
S
safe-campus-bbs
Project overview
Project overview
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
万成波
safe-campus-bbs
Commits
3499093c
Commit
3499093c
authored
Sep 05, 2025
by
万成波
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
敏感词过滤
parent
0ea260dc
Changes
29
Hide whitespace changes
Inline
Side-by-side
Showing
29 changed files
with
305 additions
and
71 deletions
+305
-71
safe-campus-admin/src/test/java/com/tangguo/ApplicationTest.java
...mpus-admin/src/test/java/com/tangguo/ApplicationTest.java
+2
-2
safe-campus-common/src/main/java/com/tangguo/common/constant/ActiveMQConstant.java
...in/java/com/tangguo/common/constant/ActiveMQConstant.java
+12
-2
safe-campus-common/src/main/java/com/tangguo/common/domain/PointsDetail.java
...src/main/java/com/tangguo/common/domain/PointsDetail.java
+2
-2
safe-campus-common/src/main/java/com/tangguo/common/utils/SensitiveWordUtils.java
...ain/java/com/tangguo/common/utils/SensitiveWordUtils.java
+151
-0
safe-campus-moment/src/main/java/com/tangguo/common/constant/TopicConstant.java
.../main/java/com/tangguo/common/constant/TopicConstant.java
+1
-1
safe-campus-moment/src/main/java/com/tangguo/common/enums/CommentStatus.java
...src/main/java/com/tangguo/common/enums/CommentStatus.java
+1
-1
safe-campus-moment/src/main/java/com/tangguo/common/enums/EnableStatus.java
.../src/main/java/com/tangguo/common/enums/EnableStatus.java
+1
-1
safe-campus-moment/src/main/java/com/tangguo/common/enums/LikeStatus.java
...nt/src/main/java/com/tangguo/common/enums/LikeStatus.java
+1
-1
safe-campus-moment/src/main/java/com/tangguo/common/enums/MomentType.java
...nt/src/main/java/com/tangguo/common/enums/MomentType.java
+1
-1
safe-campus-moment/src/main/java/com/tangguo/common/enums/TopicTopStatus.java
...rc/main/java/com/tangguo/common/enums/TopicTopStatus.java
+1
-1
safe-campus-moment/src/main/java/com/tangguo/common/enums/VoteOptionType.java
...rc/main/java/com/tangguo/common/enums/VoteOptionType.java
+1
-1
safe-campus-moment/src/main/java/com/tangguo/common/jobs/RefreshTopicRankingJob.java
.../java/com/tangguo/common/jobs/RefreshTopicRankingJob.java
+1
-1
safe-campus-moment/src/main/java/com/tangguo/common/listener/UserOperateListener.java
...java/com/tangguo/common/listener/UserOperateListener.java
+31
-0
safe-campus-moment/src/main/java/com/tangguo/controller/mobile/MBbsTopicController.java
...va/com/tangguo/controller/mobile/MBbsTopicController.java
+2
-0
safe-campus-moment/src/main/java/com/tangguo/controller/pc/BbsSensitiveWordController.java
...com/tangguo/controller/pc/BbsSensitiveWordController.java
+2
-2
safe-campus-moment/src/main/java/com/tangguo/domain/DataImportResult.java
...nt/src/main/java/com/tangguo/domain/DataImportResult.java
+1
-1
safe-campus-moment/src/main/java/com/tangguo/domain/OperateDetail.java
...oment/src/main/java/com/tangguo/domain/OperateDetail.java
+16
-0
safe-campus-moment/src/main/java/com/tangguo/domain/bo/CreateTopicBO.java
...nt/src/main/java/com/tangguo/domain/bo/CreateTopicBO.java
+5
-0
safe-campus-moment/src/main/java/com/tangguo/service/IBbsMomentVoteService.java
.../main/java/com/tangguo/service/IBbsMomentVoteService.java
+0
-1
safe-campus-moment/src/main/java/com/tangguo/service/IBbsSensitiveWordService.java
...in/java/com/tangguo/service/IBbsSensitiveWordService.java
+3
-3
safe-campus-moment/src/main/java/com/tangguo/service/impl/BbsMomentCommentServiceImpl.java
...com/tangguo/service/impl/BbsMomentCommentServiceImpl.java
+1
-1
safe-campus-moment/src/main/java/com/tangguo/service/impl/BbsMomentServiceImpl.java
...n/java/com/tangguo/service/impl/BbsMomentServiceImpl.java
+28
-12
safe-campus-moment/src/main/java/com/tangguo/service/impl/BbsMomentVoteOptionServiceImpl.java
.../tangguo/service/impl/BbsMomentVoteOptionServiceImpl.java
+1
-2
safe-campus-moment/src/main/java/com/tangguo/service/impl/BbsSensitiveWordServiceImpl.java
...com/tangguo/service/impl/BbsSensitiveWordServiceImpl.java
+9
-13
safe-campus-moment/src/main/java/com/tangguo/service/impl/BbsTopicServiceImpl.java
...in/java/com/tangguo/service/impl/BbsTopicServiceImpl.java
+14
-5
safe-campus-points/src/main/java/com/tangguo/listener/PointsListener.java
...ts/src/main/java/com/tangguo/listener/PointsListener.java
+5
-5
safe-campus-points/src/main/java/com/tangguo/service/IBbsUserPointsService.java
.../main/java/com/tangguo/service/IBbsUserPointsService.java
+3
-3
safe-campus-points/src/main/java/com/tangguo/service/impl/BbsUserPointsExchangeServiceImpl.java
...angguo/service/impl/BbsUserPointsExchangeServiceImpl.java
+2
-2
safe-campus-points/src/main/java/com/tangguo/service/impl/BbsUserPointsServiceImpl.java
...va/com/tangguo/service/impl/BbsUserPointsServiceImpl.java
+7
-7
No files found.
safe-campus-admin/src/test/java/com/tangguo/ApplicationTest.java
View file @
3499093c
package
com
.
tangguo
;
import
com.tangguo.common.constant.ActiveMQConstant
;
import
com.tangguo.common.domain.PointsDetail
Info
;
import
com.tangguo.common.domain.PointsDetail
;
import
org.junit.jupiter.api.Test
;
import
org.springframework.boot.test.context.SpringBootTest
;
import
org.springframework.jms.core.JmsTemplate
;
...
...
@@ -23,7 +23,7 @@ public class ApplicationTest {
@Test
public
void
test
()
{
PointsDetail
Info
detail
=
new
PointsDetailInfo
();
PointsDetail
detail
=
new
PointsDetail
();
detail
.
setUserName
(
"TanXiaoIng"
);
detail
.
setDetailPoints
(
10
);
detail
.
setDetailName
(
"外部系统"
);
...
...
safe-campus-common/src/main/java/com/tangguo/common/constant/ActiveMQConstant.java
View file @
3499093c
...
...
@@ -19,12 +19,22 @@ public interface ActiveMQConstant{
/**
* 增加用户积分队列名
*/
String
INCR_USER_POINTS_QUEUE
=
"
points.user
.incr"
;
String
INCR_USER_POINTS_QUEUE
=
"
user.points
.incr"
;
/**
* 扣减用户积分队列名
*/
String
DECR_USER_POINTS_QUEUE
=
"points.user.decr"
;
String
DECR_USER_POINTS_QUEUE
=
"user.points.decr"
;
}
interface
Operate
{
/**
* 增加用户积分队列名
*/
String
USER_OPERATE
=
"user.operate"
;
}
...
...
safe-campus-common/src/main/java/com/tangguo/common/domain/PointsDetail
Info
.java
→
safe-campus-common/src/main/java/com/tangguo/common/domain/PointsDetail.java
View file @
3499093c
...
...
@@ -5,13 +5,13 @@ import lombok.Data;
import
java.io.Serializable
;
/**
* 积分明细
DTO
* 积分明细
*
* @author 谈笑
* @createTime 2025-08-29 17:23:29 星期五
*/
@Data
public
class
PointsDetail
Info
implements
Serializable
{
public
class
PointsDetail
implements
Serializable
{
private
static
final
long
serialVersionUID
=
8057307839793769207L
;
...
...
safe-campus-common/src/main/java/com/tangguo/common/utils/SensitiveWordUtils.java
0 → 100644
View file @
3499093c
package
com
.
tangguo
.
common
.
utils
;
import
cn.hutool.core.collection.CollUtil
;
import
cn.hutool.core.date.DateUtil
;
import
cn.hutool.core.date.TimeInterval
;
import
cn.hutool.core.util.StrUtil
;
import
cn.hutool.dfa.FoundWord
;
import
cn.hutool.dfa.WordTree
;
import
lombok.extern.slf4j.Slf4j
;
import
java.util.Collection
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.stream.Collectors
;
@Slf4j
public
class
SensitiveWordUtils
{
private
static
final
WordTree
SENSITIVE_TREE
=
new
WordTree
();
/**
* 添加敏感词
*
* @param word 敏感词
*/
public
static
void
addWords
(
String
word
)
{
if
(
StrUtil
.
isNotBlank
(
word
))
{
SENSITIVE_TREE
.
addWords
(
word
);
log
.
info
(
"=> 敏感词工具添加敏感:{}"
,
word
);
}
}
/**
* 添加敏感词
*
* @param words 敏感词
*/
public
static
void
addWords
(
Collection
<
String
>
words
)
{
if
(
CollUtil
.
isNotEmpty
(
words
))
{
List
<
String
>
filterWords
=
words
.
stream
().
filter
(
StrUtil:
:
isNotBlank
).
collect
(
Collectors
.
toList
());
SENSITIVE_TREE
.
addWords
(
filterWords
);
log
.
info
(
"=> 敏感词工具添加敏感数量:{}"
,
words
.
size
());
}
}
/**
* 清空敏感词
*/
public
static
void
clearWords
()
{
SENSITIVE_TREE
.
clear
();
log
.
info
(
"=> 敏感词工具清空敏感词"
);
}
/**
* 重新加载敏感词
*
* @param words 敏感词
*/
public
static
void
reloadWords
(
Collection
<
String
>
words
)
{
SENSITIVE_TREE
.
clear
();
if
(
CollUtil
.
isNotEmpty
(
words
))
{
List
<
String
>
filterWords
=
words
.
stream
().
filter
(
StrUtil:
:
isNotBlank
).
collect
(
Collectors
.
toList
());
SENSITIVE_TREE
.
addWords
(
filterWords
);
log
.
info
(
"=> 敏感词工具重新加载敏感数量:{}"
,
words
.
size
());
}
}
/**
* 查找敏感词,返回找到的第一个敏感词
*
* @param text 文本
* @return 敏感词
* @since 5.5.3
*/
public
static
FoundWord
getFoundFirstSensitive
(
String
text
)
{
return
SENSITIVE_TREE
.
matchWord
(
text
);
}
/**
* 查找敏感词,返回找到的所有敏感词
*
* @param text 文本
* @return 敏感词
*/
public
static
List
<
FoundWord
>
getFoundAllSensitive
(
String
text
)
{
return
SENSITIVE_TREE
.
matchAllWords
(
text
);
}
/**
* 查找敏感词,返回找到的所有敏感词
*
* @param text 文本
* @param isDensityMatch 是否使用密集匹配原则
* @param isGreedMatch 是否使用贪婪匹配(最长匹配)原则
* @return 敏感词
*/
public
static
List
<
FoundWord
>
getFoundAllSensitive
(
String
text
,
boolean
isDensityMatch
,
boolean
isGreedMatch
)
{
return
SENSITIVE_TREE
.
matchAllWords
(
text
,
-
1
,
isDensityMatch
,
isGreedMatch
);
}
/**
* 处理过滤文本中的敏感词,默认替换成*
*
* @param text 文本
* @param isGreedMatch 贪婪匹配(最长匹配)原则:假如关键字a,ab,最长匹配将匹配[a, ab]
* @return 敏感词过滤处理后的文本
*/
public
static
String
sensitiveFilter
(
String
text
,
boolean
isGreedMatch
)
{
if
(
StrUtil
.
isEmpty
(
text
))
{
return
text
;
}
TimeInterval
timer
=
DateUtil
.
timer
();
//敏感词过滤场景下,不需要密集匹配
List
<
FoundWord
>
foundWordList
=
getFoundAllSensitive
(
text
,
false
,
isGreedMatch
);
if
(
CollUtil
.
isEmpty
(
foundWordList
))
{
return
text
;
}
Map
<
Integer
,
FoundWord
>
foundWordMap
=
new
HashMap
<>(
foundWordList
.
size
());
foundWordList
.
forEach
(
foundWord
->
foundWordMap
.
put
(
foundWord
.
getStartIndex
(),
foundWord
));
int
length
=
text
.
length
();
StringBuilder
textStringBuilder
=
new
StringBuilder
();
for
(
int
i
=
0
;
i
<
length
;
i
++)
{
FoundWord
fw
=
foundWordMap
.
get
(
i
);
if
(
fw
!=
null
)
{
int
fwl
=
fw
.
getFoundWord
().
length
();
StringBuilder
sb
=
new
StringBuilder
(
fwl
);
for
(
int
m
=
0
;
m
<
fwl
;
m
++)
{
sb
.
append
(
"*"
);
}
textStringBuilder
.
append
(
sb
);
i
=
fw
.
getEndIndex
();
}
else
{
textStringBuilder
.
append
(
text
.
charAt
(
i
));
}
}
log
.
info
(
"过滤敏感词, 耗时: {} ms"
,
timer
.
intervalMs
());
return
textStringBuilder
.
toString
();
}
}
safe-campus-moment/src/main/java/com/tangguo/constant/TopicConstant.java
→
safe-campus-moment/src/main/java/com/tangguo/co
mmon/co
nstant/TopicConstant.java
View file @
3499093c
package
com
.
tangguo
.
constant
;
package
com
.
tangguo
.
co
mmon
.
co
nstant
;
/**
* 主题常量
...
...
safe-campus-moment/src/main/java/com/tangguo/enums/CommentStatus.java
→
safe-campus-moment/src/main/java/com/tangguo/
common/
enums/CommentStatus.java
View file @
3499093c
package
com
.
tangguo
.
enums
;
package
com
.
tangguo
.
common
.
enums
;
import
lombok.AllArgsConstructor
;
import
lombok.Getter
;
...
...
safe-campus-moment/src/main/java/com/tangguo/enums/EnableStatus.java
→
safe-campus-moment/src/main/java/com/tangguo/
common/
enums/EnableStatus.java
View file @
3499093c
package
com
.
tangguo
.
enums
;
package
com
.
tangguo
.
common
.
enums
;
import
lombok.AllArgsConstructor
;
import
lombok.Getter
;
...
...
safe-campus-moment/src/main/java/com/tangguo/enums/LikeStatus.java
→
safe-campus-moment/src/main/java/com/tangguo/
common/
enums/LikeStatus.java
View file @
3499093c
package
com
.
tangguo
.
enums
;
package
com
.
tangguo
.
common
.
enums
;
import
lombok.AllArgsConstructor
;
import
lombok.Getter
;
...
...
safe-campus-moment/src/main/java/com/tangguo/enums/MomentType.java
→
safe-campus-moment/src/main/java/com/tangguo/
common/
enums/MomentType.java
View file @
3499093c
package
com
.
tangguo
.
enums
;
package
com
.
tangguo
.
common
.
enums
;
import
lombok.AllArgsConstructor
;
import
lombok.Getter
;
...
...
safe-campus-moment/src/main/java/com/tangguo/enums/TopicTopStatus.java
→
safe-campus-moment/src/main/java/com/tangguo/
common/
enums/TopicTopStatus.java
View file @
3499093c
package
com
.
tangguo
.
enums
;
package
com
.
tangguo
.
common
.
enums
;
import
lombok.AllArgsConstructor
;
import
lombok.Getter
;
...
...
safe-campus-moment/src/main/java/com/tangguo/enums/VoteOptionType.java
→
safe-campus-moment/src/main/java/com/tangguo/
common/
enums/VoteOptionType.java
View file @
3499093c
package
com
.
tangguo
.
enums
;
package
com
.
tangguo
.
common
.
enums
;
import
lombok.AllArgsConstructor
;
import
lombok.Getter
;
...
...
safe-campus-moment/src/main/java/com/tangguo/jobs/RefreshTopicRankingJob.java
→
safe-campus-moment/src/main/java/com/tangguo/
common/
jobs/RefreshTopicRankingJob.java
View file @
3499093c
package
com
.
tangguo
.
jobs
;
package
com
.
tangguo
.
common
.
jobs
;
import
com.tangguo.service.IBbsTopicService
;
import
lombok.extern.slf4j.Slf4j
;
...
...
safe-campus-moment/src/main/java/com/tangguo/common/listener/UserOperateListener.java
0 → 100644
View file @
3499093c
package
com
.
tangguo
.
common
.
listener
;
import
com.tangguo.common.constant.ActiveMQConstant
;
import
com.tangguo.domain.OperateDetail
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.jms.annotation.JmsListener
;
import
org.springframework.stereotype.Component
;
import
javax.jms.Message
;
/**
* 用户操作事件监听器
*
* @author 谈笑
* @createTime 2025-09-01 16:03:08 星期一
*/
@Slf4j
@Component
public
class
UserOperateListener
{
/**
* 增加用户积分消息
*
* @param detail 积分明细
*/
@JmsListener
(
destination
=
ActiveMQConstant
.
Operate
.
USER_OPERATE
,
containerFactory
=
ActiveMQConstant
.
QUEUE_CONTAINER_BEAN
)
public
void
operateListener
(
OperateDetail
detail
,
Message
message
)
{
}
}
safe-campus-moment/src/main/java/com/tangguo/controller/mobile/MBbsTopicController.java
View file @
3499093c
...
...
@@ -3,6 +3,7 @@ package com.tangguo.controller.mobile;
import
com.tangguo.common.core.domain.AjaxResult
;
import
com.tangguo.common.mauth.MobileAuth
;
import
com.tangguo.common.utils.PageUtils
;
import
com.tangguo.common.utils.ValidateOperations
;
import
com.tangguo.domain.bo.CreateTopicBO
;
import
com.tangguo.domain.vo.BbsMomentListVO
;
import
com.tangguo.domain.vo.BbsTopicListVO
;
...
...
@@ -50,6 +51,7 @@ public class MBbsTopicController {
@MobileAuth
@PostMapping
(
"/create"
)
public
AjaxResult
createTopic
(
@RequestBody
CreateTopicBO
bo
)
{
ValidateOperations
.
generalValidate
(
bo
);
BbsTopicListVO
topic
=
this
.
topicService
.
createTopic
(
bo
);
return
AjaxResult
.
success
(
topic
);
}
...
...
safe-campus-moment/src/main/java/com/tangguo/controller/pc/BbsSensitiveWordController.java
View file @
3499093c
...
...
@@ -6,7 +6,7 @@ import com.tangguo.common.core.domain.AjaxResult;
import
com.tangguo.common.core.page.TableDataInfo
;
import
com.tangguo.common.enums.BusinessType
;
import
com.tangguo.domain.BbsSensitiveWord
;
import
com.tangguo.domain.
result.
DataImportResult
;
import
com.tangguo.domain.DataImportResult
;
import
com.tangguo.service.IBbsSensitiveWordService
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
...
...
@@ -116,7 +116,7 @@ public class BbsSensitiveWordController extends BaseController {
@Log
(
title
=
"敏感词库"
,
businessType
=
BusinessType
.
UPDATE
)
@PutMapping
(
"/refresh"
)
public
AjaxResult
refresh
()
{
this
.
bbsSensitiveWordService
.
re
fresh
CacheWords
();
this
.
bbsSensitiveWordService
.
re
load
CacheWords
();
return
AjaxResult
.
success
();
}
...
...
safe-campus-moment/src/main/java/com/tangguo/domain/
result/
DataImportResult.java
→
safe-campus-moment/src/main/java/com/tangguo/domain/DataImportResult.java
View file @
3499093c
package
com
.
tangguo
.
domain
.
result
;
package
com
.
tangguo
.
domain
;
import
lombok.Data
;
...
...
safe-campus-moment/src/main/java/com/tangguo/domain/OperateDetail.java
0 → 100644
View file @
3499093c
package
com
.
tangguo
.
domain
;
import
lombok.Data
;
/**
* 操作明细
*
* @author 谈笑
* @createTime 2025-09-04 22:33:53 星期四
*/
@Data
public
class
OperateDetail
{
}
safe-campus-moment/src/main/java/com/tangguo/domain/bo/CreateTopicBO.java
View file @
3499093c
package
com
.
tangguo
.
domain
.
bo
;
import
lombok.Data
;
import
org.hibernate.validator.constraints.Length
;
import
javax.validation.constraints.NotBlank
;
/**
*
...
...
@@ -14,6 +17,8 @@ public class CreateTopicBO {
/**
* 话题名称
*/
@NotBlank
(
message
=
"话题名称不能为空"
)
@Length
(
min
=
1
,
max
=
50
,
message
=
"话题长度字符错误"
)
private
String
name
;
}
safe-campus-moment/src/main/java/com/tangguo/service/IBbsMomentVoteService.java
View file @
3499093c
...
...
@@ -2,7 +2,6 @@ package com.tangguo.service;
import
com.baomidou.mybatisplus.extension.service.IService
;
import
com.tangguo.domain.BbsMomentVote
;
import
com.tangguo.domain.vo.BbsVoteOptionVO
;
import
com.tangguo.domain.vo.BbsVoteVO
;
import
java.util.List
;
...
...
safe-campus-moment/src/main/java/com/tangguo/service/IBbsSensitiveWordService.java
View file @
3499093c
...
...
@@ -2,7 +2,7 @@ package com.tangguo.service;
import
com.baomidou.mybatisplus.extension.service.IService
;
import
com.tangguo.domain.BbsSensitiveWord
;
import
com.tangguo.domain.
result.
DataImportResult
;
import
com.tangguo.domain.DataImportResult
;
import
org.springframework.web.multipart.MultipartFile
;
import
java.util.List
;
...
...
@@ -25,9 +25,9 @@ public interface IBbsSensitiveWordService extends IService<BbsSensitiveWord> {
/**
*
刷新
缓存敏感词
*
重新加载
缓存敏感词
*/
void
re
fresh
CacheWords
();
void
re
load
CacheWords
();
/**
...
...
safe-campus-moment/src/main/java/com/tangguo/service/impl/BbsMomentCommentServiceImpl.java
View file @
3499093c
...
...
@@ -2,10 +2,10 @@ package com.tangguo.service.impl;
import
cn.hutool.core.collection.CollUtil
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.tangguo.common.enums.CommentStatus
;
import
com.tangguo.common.exception.ServiceException
;
import
com.tangguo.domain.BbsMomentComment
;
import
com.tangguo.domain.vo.BbsCommentDetailVO
;
import
com.tangguo.enums.CommentStatus
;
import
com.tangguo.mapper.BbsMomentCommentMapper
;
import
com.tangguo.service.IBbsMomentCommentService
;
import
org.springframework.stereotype.Service
;
...
...
safe-campus-moment/src/main/java/com/tangguo/service/impl/BbsMomentServiceImpl.java
View file @
3499093c
...
...
@@ -2,10 +2,13 @@ package com.tangguo.service.impl;
import
cn.hutool.core.collection.CollUtil
;
import
cn.hutool.core.util.StrUtil
;
import
cn.hutool.dfa.FoundWord
;
import
com.baomidou.mybatisplus.core.toolkit.Wrappers
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.tangguo.common.enums.*
;
import
com.tangguo.common.exception.ServiceException
;
import
com.tangguo.common.mauth.MobileTokenHelper
;
import
com.tangguo.common.utils.SensitiveWordUtils
;
import
com.tangguo.domain.BbsMoment
;
import
com.tangguo.domain.BbsMomentAttachment
;
import
com.tangguo.domain.BbsMomentComment
;
...
...
@@ -15,10 +18,10 @@ import com.tangguo.domain.bo.CreateMomentBO;
import
com.tangguo.domain.bo.LikeMomentBO
;
import
com.tangguo.domain.bo.VoteMomentBO
;
import
com.tangguo.domain.vo.*
;
import
com.tangguo.enums.*
;
import
com.tangguo.mapper.BbsMomentMapper
;
import
com.tangguo.service.*
;
import
lombok.extern.slf4j.Slf4j
;
import
org.checkerframework.checker.units.qual.C
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.util.StopWatch
;
...
...
@@ -182,7 +185,6 @@ public class BbsMomentServiceImpl extends ServiceImpl<BbsMomentMapper, BbsMoment
if
(
Objects
.
isNull
(
dbMoment
))
{
throw
new
ServiceException
(
"删除失败,未查询到当前动态数据。"
);
}
this
.
removeById
(
dbMoment
.
getId
());
}
...
...
@@ -343,26 +345,40 @@ public class BbsMomentServiceImpl extends ServiceImpl<BbsMomentMapper, BbsMoment
// 动态附件
BbsMoment
newMoment
=
new
BbsMoment
();
List
<
CreateMomentBO
.
Attachment
>
attachments
=
bo
.
getAttachments
();
String
linkUrl
=
bo
.
getLinkUrl
();
if
(
MomentType
.
TEXT
==
momentType
)
{
if
(
StrUtil
.
isBlank
(
bo
.
getContent
()))
{
throw
new
ServiceException
(
"发布失败,动态内容不能为空。"
);
String
content
=
bo
.
getContent
();
// 动态类型
if
(
MomentType
.
TEXT
==
momentType
||
MomentType
.
IMAGE
==
momentType
||
MomentType
.
VIDEO
==
momentType
)
{
if
(
MomentType
.
TEXT
==
momentType
)
{
if
(
StrUtil
.
isBlank
(
content
))
{
throw
new
ServiceException
(
"发布失败,动态内容不能为空。"
);
}
}
}
else
if
(
MomentType
.
IMAGE
==
momentType
||
MomentType
.
VIDEO
==
momentType
)
{
if
(
CollUtil
.
isEmpty
(
attachments
))
{
throw
new
ServiceException
(
"发布失败,动态附件不能为空。"
);
if
(
MomentType
.
IMAGE
==
momentType
||
MomentType
.
VIDEO
==
momentType
)
{
if
(
CollUtil
.
isEmpty
(
attachments
))
{
throw
new
ServiceException
(
"发布失败,动态附件不能为空。"
);
}
}
if
(
StrUtil
.
isNotBlank
(
content
))
{
FoundWord
fw
=
SensitiveWordUtils
.
getFoundFirstSensitive
(
content
);
if
(
Objects
.
nonNull
(
fw
))
{
String
msg
=
String
.
format
(
"发布失败,当前动态内容存在敏感词【%s】。"
,
fw
.
getFoundWord
());
throw
new
ServiceException
(
msg
);
}
else
{
newMoment
.
setContent
(
content
);
}
}
}
else
if
(
MomentType
.
URL
==
momentType
)
{
String
linkUrl
=
bo
.
getLinkUrl
();
if
(
StrUtil
.
isBlank
(
linkUrl
))
{
throw
new
ServiceException
(
"发布失败,动态链接不能为空。"
);
}
else
{
newMoment
.
setLinkUrl
(
linkUrl
);
}
}
newMoment
.
setType
(
momentType
.
name
());
newMoment
.
setContent
(
bo
.
getContent
());
newMoment
.
setLinkUrl
(
linkUrl
);
newMoment
.
setIsEnableComment
(
bo
.
getIsEnableComment
());
newMoment
.
setIsEnableFeaturedComment
(
bo
.
getIsEnableFeaturedComment
());
...
...
safe-campus-moment/src/main/java/com/tangguo/service/impl/BbsMomentVoteOptionServiceImpl.java
View file @
3499093c
...
...
@@ -3,11 +3,11 @@ package com.tangguo.service.impl;
import
cn.hutool.core.collection.CollUtil
;
import
com.baomidou.mybatisplus.core.toolkit.Wrappers
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.tangguo.common.enums.VoteOptionType
;
import
com.tangguo.domain.BbsMoment
;
import
com.tangguo.domain.BbsMomentVoteOption
;
import
com.tangguo.domain.bo.CreateMomentBO
;
import
com.tangguo.domain.vo.BbsVoteOptionVO
;
import
com.tangguo.enums.VoteOptionType
;
import
com.tangguo.mapper.BbsMomentVoteOptionMapper
;
import
com.tangguo.service.IBbsMomentVoteOptionService
;
import
org.springframework.stereotype.Service
;
...
...
@@ -15,7 +15,6 @@ import org.springframework.transaction.annotation.Transactional;
import
javax.annotation.Resource
;
import
java.util.ArrayList
;
import
java.util.Collections
;
import
java.util.List
;
/**
...
...
safe-campus-moment/src/main/java/com/tangguo/service/impl/BbsSensitiveWordServiceImpl.java
View file @
3499093c
...
...
@@ -7,9 +7,10 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.tangguo.common.core.redis.RedisCache
;
import
com.tangguo.common.exception.ServiceException
;
import
com.tangguo.common.utils.SensitiveWordUtils
;
import
com.tangguo.common.utils.StringUtils
;
import
com.tangguo.domain.BbsSensitiveWord
;
import
com.tangguo.domain.
result.
DataImportResult
;
import
com.tangguo.domain.DataImportResult
;
import
com.tangguo.mapper.BbsSensitiveWordMapper
;
import
com.tangguo.service.IBbsSensitiveWordService
;
import
lombok.extern.slf4j.Slf4j
;
...
...
@@ -44,7 +45,7 @@ public class BbsSensitiveWordServiceImpl extends ServiceImpl<BbsSensitiveWordMap
@PostConstruct
private
void
initCacheWords
()
{
Set
<
String
>
dbWords
=
this
.
getDbWords
();
this
.
redisCache
.
setCacheSet
(
WORD_CACHE_KEY
,
new
HashSet
<>(
dbWords
)
);
SensitiveWordUtils
.
addWords
(
dbWords
);
log
.
info
(
"=> 数据库敏感词已缓存,敏感词数量:{}"
,
dbWords
.
size
());
}
...
...
@@ -64,15 +65,12 @@ public class BbsSensitiveWordServiceImpl extends ServiceImpl<BbsSensitiveWordMap
/**
*
刷新
缓存敏感词
*
重新加载
缓存敏感词
*/
@Override
public
void
refreshCacheWords
()
{
this
.
redisCache
.
deleteObject
(
WORD_CACHE_KEY
);
log
.
info
(
"=> 缓存敏感词已清空"
);
public
void
reloadCacheWords
()
{
Set
<
String
>
dbWords
=
this
.
getDbWords
();
this
.
redisCache
.
setCacheSet
(
WORD_CACHE_KEY
,
new
HashSet
<>(
dbWords
));
log
.
info
(
"=> 缓存敏感词已刷新,敏感词数量:{}"
,
dbWords
.
size
());
SensitiveWordUtils
.
reloadWords
(
dbWords
);
}
...
...
@@ -110,7 +108,7 @@ public class BbsSensitiveWordServiceImpl extends ServiceImpl<BbsSensitiveWordMap
addWord
.
setSort
(
word
.
getSort
());
addWord
.
setEnableStatus
(
1
);
this
.
save
(
addWord
);
this
.
redisCache
.
setAddValues
(
WORD_CACHE_KEY
,
w
ord
.
getName
());
SensitiveWordUtils
.
addWords
(
addW
ord
.
getName
());
}
...
...
@@ -140,9 +138,7 @@ public class BbsSensitiveWordServiceImpl extends ServiceImpl<BbsSensitiveWordMap
updWord
.
setName
(
word
.
getName
());
updWord
.
setSort
(
word
.
getSort
());
this
.
updateById
(
updWord
);
this
.
redisCache
.
setDeleteValues
(
WORD_CACHE_KEY
,
dbWord
.
getName
());
this
.
redisCache
.
setAddValues
(
WORD_CACHE_KEY
,
word
.
getName
());
this
.
reloadCacheWords
();
}
...
...
@@ -156,7 +152,7 @@ public class BbsSensitiveWordServiceImpl extends ServiceImpl<BbsSensitiveWordMap
BbsSensitiveWord
dbWord
=
this
.
getById
(
wordId
);
if
(
Objects
.
nonNull
(
dbWord
))
{
this
.
removeById
(
wordId
);
this
.
re
disCache
.
setDeleteValues
(
WORD_CACHE_KEY
,
dbWord
.
getName
()
);
this
.
re
loadCacheWords
(
);
}
}
...
...
safe-campus-moment/src/main/java/com/tangguo/service/impl/BbsTopicServiceImpl.java
View file @
3499093c
package
com
.
tangguo
.
service
.
impl
;
import
cn.hutool.core.collection.CollUtil
;
import
cn.hutool.dfa.FoundWord
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper
;
import
com.baomidou.mybatisplus.core.toolkit.Wrappers
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.tangguo.common.constant.TopicConstant
;
import
com.tangguo.common.core.redis.RedisCache
;
import
com.tangguo.common.enums.TopicTopStatus
;
import
com.tangguo.common.exception.ServiceException
;
import
com.tangguo.common.mauth.MobileTokenHelper
;
import
com.tangguo.common.utils.SensitiveWordUtils
;
import
com.tangguo.common.utils.StringUtils
;
import
com.tangguo.constant.TopicConstant
;
import
com.tangguo.domain.BbsTopic
;
import
com.tangguo.domain.bo.CreateTopicBO
;
import
com.tangguo.domain.vo.BbsMomentListVO
;
import
com.tangguo.domain.vo.BbsTopicListVO
;
import
com.tangguo.enums.TopicTopStatus
;
import
com.tangguo.mapper.BbsTopicMapper
;
import
com.tangguo.service.IBbsTopicService
;
import
org.springframework.stereotype.Service
;
...
...
@@ -207,18 +209,25 @@ public class BbsTopicServiceImpl extends ServiceImpl<BbsTopicMapper, BbsTopic> i
*/
@Override
public
BbsTopicListVO
createTopic
(
CreateTopicBO
bo
)
{
synchronized
(
bo
.
getName
().
intern
())
{
String
topicName
=
bo
.
getName
();
synchronized
(
topicName
.
intern
())
{
long
nameCount
=
this
.
count
(
Wrappers
.
lambdaQuery
(
BbsTopic
.
class
).
eq
(
BbsTopic:
:
getName
,
bo
.
getName
()
)
Wrappers
.
lambdaQuery
(
BbsTopic
.
class
).
eq
(
BbsTopic:
:
getName
,
topicName
)
);
if
(
nameCount
>
0
)
{
throw
new
ServiceException
(
"创建失败,当前话题名称已存在。"
);
}
FoundWord
fw
=
SensitiveWordUtils
.
getFoundFirstSensitive
(
topicName
);
if
(
Objects
.
nonNull
(
fw
))
{
String
msg
=
String
.
format
(
"创建失败,当前话题名称存在敏感词【%s】。"
,
fw
.
getFoundWord
());
throw
new
ServiceException
(
msg
);
}
BbsTopic
newTopic
=
new
BbsTopic
();
newTopic
.
setCreateBy
(
MobileTokenHelper
.
getUserName
());
newTopic
.
setSource
(
"移动端用户"
);
newTopic
.
setName
(
bo
.
getName
()
);
newTopic
.
setName
(
topicName
);
this
.
save
(
newTopic
);
BbsTopicListVO
topicVO
=
new
BbsTopicListVO
();
...
...
safe-campus-points/src/main/java/com/tangguo/listener/
User
PointsListener.java
→
safe-campus-points/src/main/java/com/tangguo/listener/PointsListener.java
View file @
3499093c
package
com
.
tangguo
.
listener
;
import
com.tangguo.common.constant.ActiveMQConstant
;
import
com.tangguo.common.domain.PointsDetail
Info
;
import
com.tangguo.common.domain.PointsDetail
;
import
com.tangguo.service.IBbsUserPointsService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.jms.annotation.JmsListener
;
...
...
@@ -11,14 +11,14 @@ import javax.annotation.Resource;
import
javax.jms.Message
;
/**
* 用户积分
增加扣减消息时间
监听器
* 用户积分
事件
监听器
*
* @author 谈笑
* @createTime 2025-09-01 16:03:08 星期一
*/
@Slf4j
@Component
public
class
User
PointsListener
{
public
class
PointsListener
{
@Resource
private
IBbsUserPointsService
userPointsService
;
...
...
@@ -30,7 +30,7 @@ public class UserPointsListener {
* @param detail 积分明细
*/
@JmsListener
(
destination
=
ActiveMQConstant
.
Points
.
INCR_USER_POINTS_QUEUE
,
containerFactory
=
ActiveMQConstant
.
QUEUE_CONTAINER_BEAN
)
public
void
incrUserPointsListener
(
PointsDetail
Info
detail
,
Message
message
)
{
public
void
incrUserPointsListener
(
PointsDetail
detail
,
Message
message
)
{
try
{
log
.
info
(
"=> 开始处理增加用户积分消息:{}"
,
detail
);
this
.
userPointsService
.
incrUserPoints
(
detail
);
...
...
@@ -47,7 +47,7 @@ public class UserPointsListener {
* @param detail 积分明细
*/
@JmsListener
(
destination
=
ActiveMQConstant
.
Points
.
DECR_USER_POINTS_QUEUE
,
containerFactory
=
ActiveMQConstant
.
QUEUE_CONTAINER_BEAN
)
public
void
decrUserPointsListener
(
PointsDetail
Info
detail
,
Message
message
)
{
public
void
decrUserPointsListener
(
PointsDetail
detail
,
Message
message
)
{
try
{
log
.
info
(
"=> 扣减用户积分消息:{}"
,
detail
);
this
.
userPointsService
.
decrUserPoints
(
detail
);
...
...
safe-campus-points/src/main/java/com/tangguo/service/IBbsUserPointsService.java
View file @
3499093c
package
com
.
tangguo
.
service
;
import
com.baomidou.mybatisplus.extension.service.IService
;
import
com.tangguo.common.domain.PointsDetail
Info
;
import
com.tangguo.common.domain.PointsDetail
;
import
com.tangguo.domain.BbsUserPoints
;
import
java.util.List
;
...
...
@@ -53,7 +53,7 @@ public interface IBbsUserPointsService extends IService<BbsUserPoints> {
*
* @param detail 积分明细
*/
void
incrUserPoints
(
PointsDetail
Info
detail
);
void
incrUserPoints
(
PointsDetail
detail
);
/**
...
...
@@ -61,6 +61,6 @@ public interface IBbsUserPointsService extends IService<BbsUserPoints> {
*
* @param detail 积分明细
*/
void
decrUserPoints
(
PointsDetail
Info
detail
);
void
decrUserPoints
(
PointsDetail
detail
);
}
safe-campus-points/src/main/java/com/tangguo/service/impl/BbsUserPointsExchangeServiceImpl.java
View file @
3499093c
package
com
.
tangguo
.
service
.
impl
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.tangguo.common.domain.PointsDetail
Info
;
import
com.tangguo.common.domain.PointsDetail
;
import
com.tangguo.common.exception.ServiceException
;
import
com.tangguo.domain.BbsPointsGoods
;
import
com.tangguo.domain.BbsUserPoints
;
...
...
@@ -85,7 +85,7 @@ public class BbsUserPointsExchangeServiceImpl extends ServiceImpl<BbsUserPointsE
this
.
pointsGoodsService
.
incrGoodsSales
(
goodsId
,
1
);
// 扣减用户积分
PointsDetail
Info
detail
=
new
PointsDetailInfo
();
PointsDetail
detail
=
new
PointsDetail
();
detail
.
setUserName
(
userName
);
detail
.
setDetailPoints
(
exchangePoints
);
detail
.
setDetailName
(
dbGoods
.
getName
());
...
...
safe-campus-points/src/main/java/com/tangguo/service/impl/BbsUserPointsServiceImpl.java
View file @
3499093c
package
com
.
tangguo
.
service
.
impl
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.tangguo.common.domain.PointsDetail
Info
;
import
com.tangguo.common.domain.PointsDetail
;
import
com.tangguo.common.domain.QwmhUserInfo
;
import
com.tangguo.common.exception.ServiceException
;
import
com.tangguo.common.utils.SecurityUtils
;
...
...
@@ -96,7 +96,7 @@ public class BbsUserPointsServiceImpl extends ServiceImpl<BbsUserPointsMapper, B
@Override
public
void
addUserPoints
(
BbsUserPoints
points
)
{
String
userName
=
points
.
getUserName
();
PointsDetail
Info
detail
=
new
PointsDetailInfo
();
PointsDetail
detail
=
new
PointsDetail
();
detail
.
setUserName
(
userName
);
detail
.
setDetailPoints
(
points
.
getIncrOrDecrPoints
());
detail
.
setDetailName
(
"后台手动增加"
);
...
...
@@ -114,7 +114,7 @@ public class BbsUserPointsServiceImpl extends ServiceImpl<BbsUserPointsMapper, B
@Override
public
void
deleteUserPoints
(
BbsUserPoints
points
)
{
String
userName
=
points
.
getUserName
();
PointsDetail
Info
detail
=
new
PointsDetailInfo
();
PointsDetail
detail
=
new
PointsDetail
();
detail
.
setUserName
(
userName
);
detail
.
setDetailPoints
(
points
.
getIncrOrDecrPoints
());
detail
.
setDetailName
(
"后台手动扣减"
);
...
...
@@ -129,7 +129,7 @@ public class BbsUserPointsServiceImpl extends ServiceImpl<BbsUserPointsMapper, B
* @param detail 积分明细
*/
@Override
public
void
incrUserPoints
(
PointsDetail
Info
detail
)
{
public
void
incrUserPoints
(
PointsDetail
detail
)
{
synchronized
(
detail
.
getUserName
().
intern
())
{
this
.
pointsServiceImpl
.
privIncrUserPoints
(
detail
);
}
...
...
@@ -142,7 +142,7 @@ public class BbsUserPointsServiceImpl extends ServiceImpl<BbsUserPointsMapper, B
* @param detail 积分明细
*/
@Override
public
void
decrUserPoints
(
PointsDetail
Info
detail
)
{
public
void
decrUserPoints
(
PointsDetail
detail
)
{
synchronized
(
detail
.
getUserName
().
intern
())
{
this
.
pointsServiceImpl
.
privDecrUserPoints
(
detail
);
}
...
...
@@ -155,7 +155,7 @@ public class BbsUserPointsServiceImpl extends ServiceImpl<BbsUserPointsMapper, B
* @param detail 积分明细
*/
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
privIncrUserPoints
(
PointsDetail
Info
detail
)
{
public
void
privIncrUserPoints
(
PointsDetail
detail
)
{
int
points
=
detail
.
getDetailPoints
();
if
(
points
<
1
)
{
throw
new
ServiceException
(
"增加用户积分失败,增加的积分分值不能小于0。"
);
...
...
@@ -198,7 +198,7 @@ public class BbsUserPointsServiceImpl extends ServiceImpl<BbsUserPointsMapper, B
* @param detail 积分明细
*/
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
privDecrUserPoints
(
PointsDetail
Info
detail
)
{
public
void
privDecrUserPoints
(
PointsDetail
detail
)
{
int
points
=
detail
.
getDetailPoints
();
if
(
points
<
1
)
{
throw
new
ServiceException
(
"扣减用户积分失败,扣减的积分分值不能小于0。"
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment