Merge remote-tracking branch 'refs/remotes/origin/master' into dev

This commit is contained in:
sjm
2024-07-22 09:28:02 +08:00
50 changed files with 263 additions and 868 deletions

View File

@@ -34,7 +34,7 @@ public class WechatEnterpriseOauthHandler implements SchisandraOauthTypeHandler
@Override
public OauthType getHandlerType() {
return OauthType.WECHAT_ENTERPRISE;
return OauthType.WECHAT;
}
@Override

View File

@@ -53,7 +53,7 @@ public enum OauthType {
/**
* 开源中国
*/
OSCHINA("OSCHINA"),
OSCHINA("oschina"),
/**
* STACK_OVERFLOW
*/

View File

@@ -8,7 +8,7 @@
# 数据库连接信息
jdbc:
dbName: schisandra-cloud-storage
tableName: schisandra_share_message
tableName: schisandra_auth_address
url: jdbc:mysql://1.95.0.111:3306/
username: root
password: LDQ20020618xxx
@@ -22,9 +22,9 @@ params:
# 作者
author: landaiqing
# 模块
module: share
module: auth
# controller 通用前缀
api: /share/message/
api: /auth/address/
# 生成对象是否移除前缀
removePre: false
# 使用内置函数赋值给变量 FunctionUtils 中替换

View File

@@ -75,5 +75,10 @@
<artifactId>schisandra-cloud-storage-share-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.github.houbb</groupId>-->
<!-- <artifactId>sensitive-word</artifactId>-->
<!-- <version>0.18.0</version>-->
<!-- </dependency>-->
</dependencies>
</project>

View File

@@ -1,44 +0,0 @@
package com.schisandra.share.application.config;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import java.util.List;
/**
* @Classname GlobalConfig
* @BelongsProject: schisandra-cloud-storage
* @BelongsPackage: com.schisandra.auth.application.common
* @Author: schisandra
* @CreateTime: 2024-02-16 15:57
* @Description: MVC全局处理
* @Version: 1.0
*/
@Configuration
public class GlobalConfig extends WebMvcConfigurationSupport {
@Override
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
converters.add(mappingJackson2HttpMessageConverter());
}
private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(objectMapper);
return converter;
}
// @Override
// protected void addInterceptors(InterceptorRegistry registry) {
// registry.addInterceptor(new LoginInterceptor())
// .addPathPatterns("/**").excludePathPatterns("/oauth/**","/system/**","/auth/**","/ReactRotateCaptcha/**","/sms/sendByTemplate");
// }
}

View File

@@ -1,19 +0,0 @@
//package com.schisandra.share.application.config;
//
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//
//@Configuration
//public class SensitiveConfig {
//
// @Bean
// public WordContext wordContext(SensitiveWordsService service) {
// return new WordContext(true, service);
// }
//
// @Bean
// public WordFilter wordFilter(WordContext wordContext) {
// return new WordFilter(wordContext);
// }
//
//}

View File

@@ -40,12 +40,12 @@ public class SchisandraShareCommentReplyController {
@Resource
RocketMQTemplate rocketMQTemplate;
@Resource
CaffeineUtil caffeineUtil;
private CaffeineUtil caffeineUtil;
@Resource
private SchisandraShareCommentReplyDomainService schisandraShareCommentReplyDomainService;
@Resource
RedisUtil redisUtil;
/**
* @description: 点赞
* @param: [schisandraUserLikesCommentDTO]
@@ -53,8 +53,8 @@ public class SchisandraShareCommentReplyController {
* @author zlg
* @date: 2024/7/20 14:39
*/
@GetMapping("addlike")
public void addLike(@RequestParam SchisandraUserLikesCommentDTO schisandraUserLikesCommentDTO) {
@PostMapping("addlike")
public void addLike(@RequestBody SchisandraUserLikesCommentDTO schisandraUserLikesCommentDTO) {
Preconditions.checkNotNull(schisandraUserLikesCommentDTO);
SchisandraUserLikesCommentBO schisandraUserLikesCommentBO = SchisandraUserLikesCommentDTOConverter.INSTANCE.convertDTOToBO(schisandraUserLikesCommentDTO);
schisandraUserLikesCommentBO.setLike(true);
@@ -72,8 +72,8 @@ public class SchisandraShareCommentReplyController {
);
}
@GetMapping("dellike")
public void delLike( @RequestParam SchisandraUserLikesCommentDTO schisandraUserLikesCommentDTO) {
@PostMapping("dellike")
public void delLike(@RequestBody SchisandraUserLikesCommentDTO schisandraUserLikesCommentDTO) {
Preconditions.checkNotNull(schisandraUserLikesCommentDTO);
SchisandraUserLikesCommentBO schisandraUserLikesCommentBO = SchisandraUserLikesCommentDTOConverter.INSTANCE.convertDTOToBO(schisandraUserLikesCommentDTO);
@@ -83,6 +83,7 @@ public class SchisandraShareCommentReplyController {
public void onSuccess(SendResult sendResult) {
System.out.println(sendResult);
}
@Override
public void onException(Throwable e) {
e.printStackTrace();
@@ -93,10 +94,9 @@ public class SchisandraShareCommentReplyController {
}
/**
* 返回点赞总数
*
* @param Id
* @return
*/
@@ -211,7 +211,10 @@ public class SchisandraShareCommentReplyController {
String message = gson.toJson(map);
rocketMQTemplate.asyncSend("CommentCounts-topic", message, new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {System.out.println(sendResult);}
public void onSuccess(SendResult sendResult) {
System.out.println(sendResult);
}
@Override
public void onException(Throwable e) {
e.printStackTrace();
@@ -249,6 +252,8 @@ public class SchisandraShareCommentReplyController {
Preconditions.checkNotNull(schisandraShareCommentReplyDTO.getDetailId(), "分享文章id不能为空");
Preconditions.checkNotNull(schisandraShareCommentReplyDTO.getUserId(), "发布人id不能为空");
SchisandraShareCommentReplyBO schisandraShareCommentReplyBO = SchisandraShareCommentReplyDTOConverter.INSTANCE.convertDTOToBO(schisandraShareCommentReplyDTO);
// String result = SensitiveWordHelper.replace(schisandraShareCommentReplyBO.getContent());
// schisandraShareCommentReplyBO.setContent(result);
caffeineUtil.caffeineBuild().invalidate("listcommenthot" + schisandraShareCommentReplyBO.getDetailId());
caffeineUtil.caffeineBuild().invalidate("listcomment" + schisandraShareCommentReplyBO.getDetailId());
return Result.ok(schisandraShareCommentReplyDomainService.addComment(schisandraShareCommentReplyBO));
@@ -305,23 +310,6 @@ public class SchisandraShareCommentReplyController {
if (log.isInfoEnabled()) {
log.info("SchisandraShareCommentReplyController.delete.dto:{}", JSON.toJSONString(schisandraShareCommentReplyDTO));
}
Preconditions.checkNotNull(schisandraShareCommentReplyDTO.getId(), "评论ID不能为空");
Preconditions.checkNotNull(schisandraShareCommentReplyDTO.getDetailId(), "分享文章id不能为空");
Preconditions.checkNotNull(schisandraShareCommentReplyDTO.getReplyType(), "回复类型 0评论 1回复不能为空");
Preconditions.checkNotNull(schisandraShareCommentReplyDTO.getToId(), "评论目标id不能为空");
Preconditions.checkNotNull(schisandraShareCommentReplyDTO.getToUser(), "评论人不能为空");
Preconditions.checkNotNull(schisandraShareCommentReplyDTO.getReplyId(), "回复目标id不能为空");
Preconditions.checkNotNull(schisandraShareCommentReplyDTO.getReplyUser(), "回复人不能为空");
Preconditions.checkNotNull(schisandraShareCommentReplyDTO.getReplayAuthor(), "回复人是否作者 1=是 0=否不能为空");
Preconditions.checkNotNull(schisandraShareCommentReplyDTO.getContent(), "内容不能为空");
Preconditions.checkNotNull(schisandraShareCommentReplyDTO.getPicUrls(), "图片内容不能为空");
Preconditions.checkNotNull(schisandraShareCommentReplyDTO.getLikes(), "点赞数不能为空");
Preconditions.checkNotNull(schisandraShareCommentReplyDTO.getExtJson(), "预留字段不能为空");
Preconditions.checkNotNull(schisandraShareCommentReplyDTO.getCreatedBy(), "创建人不能为空");
Preconditions.checkNotNull(schisandraShareCommentReplyDTO.getCreatedTime(), "创建时间不能为空");
Preconditions.checkNotNull(schisandraShareCommentReplyDTO.getUpdateBy(), "更新人不能为空");
Preconditions.checkNotNull(schisandraShareCommentReplyDTO.getUpdateTime(), "更新时间不能为空");
Preconditions.checkNotNull(schisandraShareCommentReplyDTO.getIsDeleted(), "不能为空");
SchisandraShareCommentReplyBO schisandraShareCommentReplyBO = SchisandraShareCommentReplyDTOConverter.INSTANCE.convertDTOToBO(schisandraShareCommentReplyDTO);
if (schisandraShareCommentReplyDomainService.delete(schisandraShareCommentReplyBO)) {
HashMap<String, Object> map = new HashMap<>();
@@ -331,7 +319,10 @@ public class SchisandraShareCommentReplyController {
String message = gson.toJson(map);
rocketMQTemplate.asyncSend("CommentCounts-topic", message, new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {System.out.println(sendResult);}
public void onSuccess(SendResult sendResult) {
System.out.println(sendResult);
}
@Override
public void onException(Throwable e) {
e.printStackTrace();

View File

@@ -56,8 +56,8 @@ public class SchisandraShareDetailController {
* @author zlg
* @date: 2024/7/20 14:38
*/
@GetMapping("addlike")
public void addLike(@RequestParam SchisandraUserLikesDetailDTO schisandraUserLikesDetailDTO) {
@PostMapping("addlike")
public void addLike(@RequestBody SchisandraUserLikesDetailDTO schisandraUserLikesDetailDTO) {
Preconditions.checkNotNull(schisandraUserLikesDetailDTO);
SchisandraUserLikesDetailBO schisandraUserLikesDetailBO = SchisandraUserLikesDetailDTOConverter.INSTANCE.convertDTOToBO(schisandraUserLikesDetailDTO);
schisandraUserLikesDetailBO.setLike(true);
@@ -75,8 +75,8 @@ public class SchisandraShareDetailController {
);
}
@GetMapping("dellike")
public void delLike(@RequestParam SchisandraUserLikesDetailDTO schisandraUserLikesDetailDTO) {
@PostMapping("dellike")
public void delLike(@RequestBody SchisandraUserLikesDetailDTO schisandraUserLikesDetailDTO) {
Preconditions.checkNotNull(schisandraUserLikesDetailDTO);
SchisandraUserLikesDetailBO schisandraUserLikesDetailBO = SchisandraUserLikesDetailDTOConverter.INSTANCE.convertDTOToBO(schisandraUserLikesDetailDTO);
schisandraUserLikesDetailBO.setLike(false);

View File

@@ -14,6 +14,7 @@ import java.util.Date;
@Data
public class SchisandraShareCircleDTO implements Serializable {
private static final long serialVersionUID = -6815237089909853606L;
/**
*
*/

View File

@@ -15,6 +15,7 @@ import java.util.Date;
@Data
public class SchisandraShareCommentReplyDTO implements Serializable {
private static final long serialVersionUID = -3214292939227938641L;
/**
* 评论ID
*/

View File

@@ -17,6 +17,7 @@ import java.util.List;
@Data
public class SchisandraShareDetailDTO implements Serializable {
private static final long serialVersionUID = -3002376009180941583L;
/**
*
*/

View File

@@ -14,6 +14,7 @@ import java.util.Date;
@Data
public class SchisandraShareDetailTagDTO implements Serializable {
private static final long serialVersionUID = -8303938595676425286L;
/**
*
*/

View File

@@ -14,6 +14,7 @@ import java.util.Date;
@Data
public class SchisandraShareMessageDTO implements Serializable {
private static final long serialVersionUID = 1908950625615230476L;
/**
* 主键
*/

View File

@@ -14,10 +14,11 @@ import java.util.Date;
@Data
public class SchisandraShareSensitiveWordsDTO implements Serializable {
private static final long serialVersionUID = 7725249957320038157L;
/**
*
*/
private String id;
private Long id;
/**
*

View File

@@ -15,6 +15,7 @@ import java.util.Date;
@Data
public class SchisandraShareTagsDTO implements Serializable {
private static final long serialVersionUID = -6740526444819241774L;
/**
*
*/

View File

@@ -15,6 +15,7 @@ import java.util.Date;
@Data
public class SchisandraShareUrlDTO implements Serializable {
private static final long serialVersionUID = 4823446869109431346L;
/**
*
*/

View File

@@ -14,6 +14,7 @@ import java.util.Date;
@Data
public class SchisandraShareUrlDetailDTO implements Serializable {
private static final long serialVersionUID = 8117565906135520349L;
/**
*
*/

View File

@@ -14,6 +14,7 @@ import java.util.Date;
@Data
public class SchisandraUserFavoritesDTO implements Serializable {
private static final long serialVersionUID = -2235627799609388040L;
/**
*
*/

View File

@@ -14,6 +14,7 @@ import java.util.Date;
@Data
public class SchisandraUserLikesCommentDTO implements Serializable {
private static final long serialVersionUID = 3309749734679647591L;
private Boolean like;
/**
*

View File

@@ -13,6 +13,7 @@ import java.util.Date;
*/
@Data
public class SchisandraUserLikesDetailDTO implements Serializable {
private static final long serialVersionUID = 7588859081028886708L;
private Boolean like;
/**

View File

@@ -1,14 +0,0 @@
package com.schisandra.share.application.sensitive;
/**
* 结束类型定义
*
* @date 11:37 2020/11/11
**/
public enum EndType {
/**
* 有下一个,结束
*/
HAS_NEXT, IS_END
}

View File

@@ -1,47 +0,0 @@
package com.schisandra.share.application.sensitive;
import java.util.List;
/**
* 敏感词标记
*
*/
public class FlagIndex {
/**
* 标记结果
*/
private boolean flag;
/**
* 是否黑名单词汇
*/
private boolean isWhiteWord;
/**
* 标记索引
*/
private List<Integer> index;
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public List<Integer> getIndex() {
return index;
}
public void setIndex(List<Integer> index) {
this.index = index;
}
public boolean isWhiteWord() {
return isWhiteWord;
}
public void setWhiteWord(boolean whiteWord) {
isWhiteWord = whiteWord;
}
}

View File

@@ -1,276 +0,0 @@
package com.schisandra.share.application.sensitive;
import com.alibaba.fastjson.JSON;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.util.CollectionUtil;
import com.schisandra.share.common.enums.IsDeletedFlagEnum;
import com.schisandra.share.infra.basic.dao.SchisandraShareSensitiveWordsDao;
import com.schisandra.share.infra.basic.entity.SchisandraShareSensitiveWords;
import com.schisandra.share.infra.basic.entity.table.SchisandraShareSensitiveWordsTableDef;
import com.schisandra.share.infra.basic.service.SchisandraShareSensitiveWordsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
* 词库上下文环境
* <p>
* 初始化敏感词库将敏感词加入到HashMap中构建DFA算法模型
*
* @author minghu.zhang
*/
@SuppressWarnings({"rawtypes", "unchecked"})
@Slf4j
public class WordContext {
/**
* 敏感词字典
*/
private final Map wordMap = new HashMap(1024);
/**
* 是否已初始化
*/
private boolean init;
private long addLastId;
@Resource
private SchisandraShareSensitiveWordsDao schisandraShareSensitiveWordsDao;
public WordContext(boolean autoLoad) {
clearDelData();
Set<String> black = new HashSet<>();
Set<String> white = new HashSet<>();
QueryWrapper query = new QueryWrapper();
query.where(SchisandraShareSensitiveWordsTableDef.SCHISANDRA_SHARE_SENSITIVE_WORDS.IS_DELETED.eq(IsDeletedFlagEnum.UN_DELETED.getCode()));
List<SchisandraShareSensitiveWords> list = schisandraShareSensitiveWordsDao.selectListByQuery(query);
for (SchisandraShareSensitiveWords words : list) {
if (words.getType() == 1) {
black.add(words.getWords());
} else {
white.add(words.getWords());
}
}
if (CollectionUtil.isNotEmpty(list)) {
this.addLastId = Long.parseLong(list.get(list.size() - 1).getId());
}
initKeyWord(black, white);
if (autoLoad) {
reloadWord();
}
}
private void clearDelData() {
QueryWrapper query = new QueryWrapper();
query.where(SchisandraShareSensitiveWordsTableDef.SCHISANDRA_SHARE_SENSITIVE_WORDS.IS_DELETED.eq(IsDeletedFlagEnum.DELETED.getCode()));
List<SchisandraShareSensitiveWords> list = schisandraShareSensitiveWordsDao.selectListByQuery(query);
schisandraShareSensitiveWordsDao.deleteBatchByIds(list.stream().map(SchisandraShareSensitiveWords::getId).collect(Collectors.toList()));
}
private void reloadWord() {
// 创建一个单线程的定时线程池
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
// 创建一个Runnable任务
Runnable task = () -> {
try {
addNewWords();
removeDelWords();
} catch (Exception e) {
log.error("Sensitive words task error", e);
}
};
// 定时执行任务初始延迟0之后每分钟执行一次
scheduler.scheduleAtFixedRate(task, 0, 1, TimeUnit.MINUTES);
}
private void removeDelWords() {
QueryWrapper query = new QueryWrapper();
query.where(SchisandraShareSensitiveWordsTableDef.SCHISANDRA_SHARE_SENSITIVE_WORDS.IS_DELETED.eq(IsDeletedFlagEnum.DELETED.getCode()));
List<SchisandraShareSensitiveWords> list = schisandraShareSensitiveWordsDao.selectListByQuery(query);
if (CollectionUtil.isNotEmpty(list)) {
log.info("removeDelWords {}", JSON.toJSON(list));
Set<String> black = new HashSet<>();
Set<String> white = new HashSet<>();
for (SchisandraShareSensitiveWords words : list) {
if (words.getType() == 1) {
black.add(words.getWords());
} else {
white.add(words.getWords());
}
}
removeWord(black, WordType.BLACK);
removeWord(white, WordType.WHITE);
}
}
private void addNewWords() {
QueryWrapper query = new QueryWrapper();
query.where(SchisandraShareSensitiveWordsTableDef.SCHISANDRA_SHARE_SENSITIVE_WORDS.ID.gt(addLastId).and(SchisandraShareSensitiveWordsTableDef.SCHISANDRA_SHARE_SENSITIVE_WORDS.IS_DELETED.eq(IsDeletedFlagEnum.UN_DELETED.getCode())));
List<SchisandraShareSensitiveWords> list = schisandraShareSensitiveWordsDao.selectListByQuery(query);
if (CollectionUtil.isNotEmpty(list)) {
log.info("addNewWords {}", JSON.toJSON(list));
this.addLastId = Long.parseLong(list.get(list.size() - 1).getId());
Set<String> black = new HashSet<>();
Set<String> white = new HashSet<>();
for (SchisandraShareSensitiveWords words : list) {
if (words.getType() == 1) {
black.add(words.getWords());
} else {
white.add(words.getWords());
}
}
addWord(black, WordType.BLACK);
addWord(white, WordType.WHITE);
}
}
/**
* 获取初始化的敏感词列表
*
* @return 敏感词列表
*/
public Map getWordMap() {
return wordMap;
}
/**
* 初始化
*/
private synchronized void initKeyWord(Set<String> black, Set<String> white) {
try {
if (!init) {
// 将敏感词库加入到HashMap中
addWord(black, WordType.BLACK);
// 将非敏感词库也加入到HashMap中
addWord(white, WordType.WHITE);
}
init = true;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 读取敏感词库将敏感词放入HashSet中构建一个DFA算法模型<br>
* 中 = { isEnd = 0 国 = {<br>
* isEnd = 1 人 = {isEnd = 0 民 = {isEnd = 1} } 男 = { isEnd = 0 人 = { isEnd = 1 }
* } } } 五 = { isEnd = 0 星 = { isEnd = 0 红 = { isEnd = 0 旗 = { isEnd = 1 } } } }
*/
public void addWord(Collection<String> wordList, WordType wordType) {
if (CollectionUtils.isEmpty(wordList)) {
return;
}
Map nowMap;
Map<String, String> newWorMap;
// 迭代keyWordSet
for (String key : wordList) {
nowMap = wordMap;
for (int i = 0; i < key.length(); i++) {
// 转换成char型
char keyChar = key.charAt(i);
// 获取
Object wordMap = nowMap.get(keyChar);
// 如果存在该key直接赋值
if (wordMap != null) {
nowMap = (Map) wordMap;
} else {
// 不存在则构建一个map同时将isEnd设置为0因为他不是最后一个
newWorMap = new HashMap<>(4);
// 不是最后一个
newWorMap.put("isEnd", String.valueOf(EndType.HAS_NEXT.ordinal()));
nowMap.put(keyChar, newWorMap);
nowMap = newWorMap;
}
if (i == key.length() - 1) {
// 最后一个
nowMap.put("isEnd", String.valueOf(EndType.IS_END.ordinal()));
nowMap.put("isWhiteWord", String.valueOf(wordType.ordinal()));
}
}
}
}
/**
* 在线删除敏感词
*
* @param wordList 敏感词列表
* @param wordType 黑名单 BLACk白名单WHITE
*/
public void removeWord(Collection<String> wordList, WordType wordType) {
if (CollectionUtils.isEmpty(wordList)) {
return;
}
Map nowMap;
for (String key : wordList) {
List<Map> cacheList = new ArrayList<>();
nowMap = wordMap;
for (int i = 0; i < key.length(); i++) {
char keyChar = key.charAt(i);
Object map = nowMap.get(keyChar);
if (map != null) {
nowMap = (Map) map;
cacheList.add(nowMap);
} else {
return;
}
if (i == key.length() - 1) {
char[] keys = key.toCharArray();
boolean cleanable = false;
char lastChar = 0;
for (int j = cacheList.size() - 1; j >= 0; j--) {
Map cacheMap = cacheList.get(j);
if (j == cacheList.size() - 1) {
if (String.valueOf(WordType.BLACK.ordinal()).equals(cacheMap.get("isWhiteWord"))) {
if (wordType == WordType.WHITE) {
return;
}
}
if (String.valueOf(WordType.WHITE.ordinal()).equals(cacheMap.get("isWhiteWord"))) {
if (wordType == WordType.BLACK) {
return;
}
}
cacheMap.remove("isWhiteWord");
cacheMap.remove("isEnd");
if (cacheMap.size() == 0) {
cleanable = true;
continue;
}
}
if (cleanable) {
Object isEnd = cacheMap.get("isEnd");
if (String.valueOf(EndType.IS_END.ordinal()).equals(isEnd)) {
cleanable = false;
}
cacheMap.remove(lastChar);
}
lastChar = keys[j];
}
if (cleanable) {
wordMap.remove(lastChar);
}
}
}
}
}
}

View File

@@ -1,224 +0,0 @@
package com.schisandra.share.application.sensitive;
import com.mybatisflex.core.util.CollectionUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* 敏感词过滤器
*
* @author minghu.zhang
*/
@SuppressWarnings("rawtypes")
public class WordFilter {
/**
* 敏感词表
*/
private final Map wordMap;
/**
* 构造函数
*/
public WordFilter(WordContext context) {
this.wordMap = context.getWordMap();
}
/**
* 替换敏感词
*
* @param text 输入文本
*/
public String replace(final String text) {
return replace(text, 0, '*');
}
/**
* 替换敏感词
*
* @param text 输入文本
* @param symbol 替换符号
*/
public String replace(final String text, final char symbol) {
return replace(text, 0, symbol);
}
/**
* 替换敏感词
*
* @param text 输入文本
* @param skip 文本距离
* @param symbol 替换符号
*/
public String replace(final String text, final int skip, final char symbol) {
char[] charset = text.toCharArray();
for (int i = 0; i < charset.length; i++) {
FlagIndex fi = getFlagIndex(charset, i, skip);
if (fi.isFlag()) {
if (!fi.isWhiteWord()) {
for (int j : fi.getIndex()) {
charset[j] = symbol;
}
} else {
i += fi.getIndex().size() - 1;
}
}
}
return new String(charset);
}
/**
* 是否包含敏感词
*
* @param text 输入文本
*/
public boolean include(final String text) {
return include(text, 0);
}
/**
* 是否包含敏感词
*
* @param text 输入文本
* @param skip 文本距离
*/
public boolean include(final String text, final int skip) {
boolean include = false;
char[] charset = text.toCharArray();
for (int i = 0; i < charset.length; i++) {
FlagIndex fi = getFlagIndex(charset, i, skip);
if (fi.isFlag()) {
if (fi.isWhiteWord()) {
i += fi.getIndex().size() - 1;
} else {
include = true;
break;
}
}
}
return include;
}
/**
* 获取敏感词数量
*
* @param text 输入文本
*/
public int wordCount(final String text) {
return wordCount(text, 0);
}
/**
* 获取敏感词数量
*
* @param text 输入文本
* @param skip 文本距离
*/
public int wordCount(final String text, final int skip) {
int count = 0;
char[] charset = text.toCharArray();
for (int i = 0; i < charset.length; i++) {
FlagIndex fi = getFlagIndex(charset, i, skip);
if (fi.isFlag()) {
if (fi.isWhiteWord()) {
i += fi.getIndex().size() - 1;
} else {
count++;
}
}
}
return count;
}
public void check(final String text) {
List<String> wordList = wordList(text);
if (CollectionUtil.isNotEmpty(wordList)) {
throw new IllegalArgumentException(String.format("内容包含敏感词 【%s】", String.join("", wordList)));
}
}
/**
* 获取敏感词列表
*
* @param text 输入文本
*/
public List<String> wordList(final String text) {
return wordList(text, 0);
}
/**
* 获取敏感词列表
*
* @param text 输入文本
* @param skip 文本距离
*/
public List<String> wordList(final String text, final int skip) {
List<String> wordList = new ArrayList<>();
char[] charset = text.toCharArray();
for (int i = 0; i < charset.length; i++) {
FlagIndex fi = getFlagIndex(charset, i, skip);
if (fi.isFlag()) {
if (fi.isWhiteWord()) {
i += fi.getIndex().size() - 1;
} else {
StringBuilder builder = new StringBuilder();
for (int j : fi.getIndex()) {
char word = text.charAt(j);
builder.append(word);
}
wordList.add(builder.toString());
}
}
}
return wordList;
}
/**
* 获取标记索引
*
* @param charset 输入文本
* @param begin 检测起始
* @param skip 文本距离
*/
private FlagIndex getFlagIndex(final char[] charset, final int begin, final int skip) {
FlagIndex fi = new FlagIndex();
Map current = wordMap;
boolean flag = false;
int count = 0;
List<Integer> index = new ArrayList<>();
for (int i = begin; i < charset.length; i++) {
char word = charset[i];
Map mapTree = (Map) current.get(word);
if (count > skip || (i == begin && Objects.isNull(mapTree))) {
break;
}
if (Objects.nonNull(mapTree)) {
current = mapTree;
count = 0;
index.add(i);
} else {
count++;
if (flag && count > skip) {
break;
}
}
if ("1".equals(current.get("isEnd"))) {
flag = true;
}
if ("1".equals(current.get("isWhiteWord"))) {
fi.setWhiteWord(true);
break;
}
}
fi.setFlag(flag);
fi.setIndex(index);
return fi;
}
}

View File

@@ -1,15 +0,0 @@
package com.schisandra.share.application.sensitive;
/**
* 词汇类型
*
* @author minghu.zhang
* @date 11:37 2020/11/11
**/
public enum WordType {
/**
* 黑名单/白名单
*/
BLACK, WHITE
}

View File

@@ -13,6 +13,7 @@ import java.util.Date;
@Data
public class SchisandraShareCircleBO implements Serializable {
private static final long serialVersionUID = -2438275436224488681L;
/**
*
*/

View File

@@ -13,6 +13,7 @@ import java.util.Date;
@Data
public class SchisandraShareCommentReplyBO implements Serializable {
private static final long serialVersionUID = 7396320253168071925L;
/**
* 评论ID
*/

View File

@@ -15,6 +15,7 @@ import java.util.List;
@Data
public class SchisandraShareDetailBO implements Serializable {
private static final long serialVersionUID = 3046543086777783698L;
/**
*
*/

View File

@@ -13,6 +13,7 @@ import java.util.Date;
@Data
public class SchisandraShareDetailTagBO implements Serializable {
private static final long serialVersionUID = 3859452433836725561L;
/**
*
*/

View File

@@ -13,6 +13,7 @@ import java.util.Date;
@Data
public class SchisandraShareMessageBO implements Serializable {
private static final long serialVersionUID = -2393313384087598602L;
/**
* 主键
*/

View File

@@ -13,10 +13,11 @@ import java.util.Date;
@Data
public class SchisandraShareSensitiveWordsBO implements Serializable {
private static final long serialVersionUID = -4194683657816043615L;
/**
*
*/
private String id;
private Long id;
/**
*

View File

@@ -13,6 +13,7 @@ import java.util.Date;
@Data
public class SchisandraShareTagsBO implements Serializable {
private static final long serialVersionUID = -3033095062989387977L;
/**
*
*/

View File

@@ -13,6 +13,7 @@ import java.util.Date;
@Data
public class SchisandraShareUrlBO implements Serializable {
private static final long serialVersionUID = 1041062258519707056L;
/**
*
*/

View File

@@ -13,6 +13,7 @@ import java.util.Date;
@Data
public class SchisandraShareUrlDetailBO implements Serializable {
private static final long serialVersionUID = -5026950135938851911L;
/**
*
*/

View File

@@ -13,6 +13,7 @@ import java.util.Date;
@Data
public class SchisandraUserFavoritesBO implements Serializable {
private static final long serialVersionUID = -8964499260886320865L;
/**
*
*/

View File

@@ -13,6 +13,7 @@ import java.util.Date;
@Data
public class SchisandraUserLikesCommentBO implements Serializable {
private static final long serialVersionUID = -7613406145156837697L;
private Boolean like;
/**

View File

@@ -13,6 +13,7 @@ import java.util.Date;
@Data
public class SchisandraUserLikesDetailBO implements Serializable {
private static final long serialVersionUID = 6858213092483046030L;
private Boolean like;
/**
*

View File

@@ -21,6 +21,7 @@ import java.util.Date;
@Table("schisandra_share_circle")
public class SchisandraShareCircle implements Serializable {
private static final long serialVersionUID = -3141577485929418943L;
/**
*
*/

View File

@@ -21,6 +21,7 @@ import java.util.Date;
@Table("schisandra_share_comment_reply")
public class SchisandraShareCommentReply implements Serializable {
private static final long serialVersionUID = -2667653332370397307L;
/**
* 评论ID
*/

View File

@@ -21,6 +21,7 @@ import java.util.Date;
@Table("schisandra_share_detail")
public class SchisandraShareDetail implements Serializable {
private static final long serialVersionUID = -835341590201804474L;
/**
*
*/

View File

@@ -20,6 +20,7 @@ import java.util.Date;
@Table("schisandra_share_detail_tag")
public class SchisandraShareDetailTag implements Serializable {
private static final long serialVersionUID = -5171975540389176702L;
/**
*
*/

View File

@@ -21,6 +21,7 @@ import java.util.Date;
@Table("schisandra_share_message")
public class SchisandraShareMessage implements Serializable {
private static final long serialVersionUID = -1459891032874418307L;
/**
* 主键
*/

View File

@@ -20,11 +20,12 @@ import java.util.Date;
@Table("schisandra_share_sensitive_words")
public class SchisandraShareSensitiveWords implements Serializable {
private static final long serialVersionUID = 1307657203088513435L;
/**
*
*/
@Id(keyType=KeyType.Generator, value= KeyGenerators.flexId)
private String id;
@Id(keyType = KeyType.Auto)
private Long id;
/**
*

View File

@@ -21,6 +21,7 @@ import java.util.Date;
@Table("schisandra_share_tags")
public class SchisandraShareTags implements Serializable {
private static final long serialVersionUID = 7161726685308038455L;
/**
*
*/

View File

@@ -21,6 +21,7 @@ import java.util.Date;
@Table("schisandra_share_url")
public class SchisandraShareUrl implements Serializable {
private static final long serialVersionUID = 2496949535444560839L;
/**
*
*/

View File

@@ -20,6 +20,7 @@ import java.util.Date;
@Table("schisandra_share_url_detail")
public class SchisandraShareUrlDetail implements Serializable {
private static final long serialVersionUID = -3349751063344560516L;
/**
*
*/

View File

@@ -21,6 +21,7 @@ import java.util.Date;
@Table("schisandra_user_favorites")
public class SchisandraUserFavorites implements Serializable {
private static final long serialVersionUID = 4499052437865046423L;
/**
*
*/

View File

@@ -4,6 +4,7 @@ import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import com.mybatisflex.core.keygen.KeyGenerators;
import lombok.Data;
import java.io.Serializable;
@@ -19,10 +20,11 @@ import java.util.Date;
@Table("schisandra_user_likes_comment")
public class SchisandraUserLikesComment implements Serializable {
private static final long serialVersionUID = -8536327597714874736L;
/**
*
*/
@Id(value = "id", keyType = KeyType.Auto)
@Id(keyType=KeyType.Generator, value= KeyGenerators.flexId)
private String id;
/**

View File

@@ -4,6 +4,7 @@ import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import com.mybatisflex.core.keygen.KeyGenerators;
import lombok.Data;
import java.io.Serializable;
@@ -19,10 +20,11 @@ import java.util.Date;
@Table("schisandra_user_likes_detail")
public class SchisandraUserLikesDetail implements Serializable {
private static final long serialVersionUID = 7754238683204111864L;
/**
*
*/
@Id(value = "id", keyType = KeyType.Auto)
@Id(keyType=KeyType.Generator, value= KeyGenerators.flexId)
private String id;
/**

View File

@@ -1,5 +1,5 @@
server:
port: 3010
port: 80
spring:
# redis配置
redis: