> list(@PathVariable String type);
+}
diff --git a/pigx-common/pigx-common-sensitive/src/main/java/com/pig4cloud/pigx/common/sensitive/util/SensitiveWordsProperties.java b/pigx-common/pigx-common-sensitive/src/main/java/com/pig4cloud/pigx/common/sensitive/util/SensitiveWordsProperties.java
new file mode 100644
index 000000000..fe71341ed
--- /dev/null
+++ b/pigx-common/pigx-common-sensitive/src/main/java/com/pig4cloud/pigx/common/sensitive/util/SensitiveWordsProperties.java
@@ -0,0 +1,88 @@
+package com.pig4cloud.pigx.common.sensitive.util;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * 敏感词配置类
+ *
+ * @author lengleng
+ * @date 2024/3/26
+ *
+ */
+@Data
+@ConfigurationProperties(SensitiveWordsProperties.PREFIX)
+public class SensitiveWordsProperties {
+
+ public static final String PREFIX = "pigx.sensitive.word";
+
+ /**
+ * The sensitive words to detect.
+ */
+ private String mask = "*";
+
+ /**
+ * Whether the sensitive words detection is enabled.
+ */
+ private boolean enabled = true;
+
+ /**
+ * Whether to ignore case when detecting sensitive words.
+ */
+ private boolean ignoreCase = true;
+
+ /**
+ * Whether to ignore width (full-width and half-width characters) when detecting
+ * sensitive words.
+ */
+ private boolean ignoreWidth = true;
+
+ /**
+ * Whether to ignore number style (Arabic numerals, Roman numerals, etc.) when
+ * detecting sensitive words.
+ */
+ private boolean ignoreNumStyle = true;
+
+ /**
+ * Whether to ignore Chinese style (simplified and traditional) when detecting
+ * sensitive words.
+ */
+ private boolean ignoreChineseStyle = true;
+
+ /**
+ * Whether to ignore English style (US and UK spelling) when detecting sensitive
+ * words.
+ */
+ private boolean ignoreEnglishStyle = true;
+
+ /**
+ * Whether to ignore repeated words when detecting sensitive words.
+ */
+ private boolean ignoreRepeat = true;
+
+ /**
+ * Whether to enable number check when detecting sensitive words.
+ */
+ private boolean enableNumCheck = true;
+
+ /**
+ * Whether to enable email check when detecting sensitive words.
+ */
+ private boolean enableEmailCheck = true;
+
+ /**
+ * Whether to enable URL check when detecting sensitive words.
+ */
+ private boolean enableUrlCheck = true;
+
+ /**
+ * The length of numbers to check when detecting sensitive words.
+ */
+ private int numCheckLen = 8;
+
+ /**
+ * The error message to return when sensitive words are detected.
+ */
+ private String errorMsg = "您的输入包含敏感词,请重新输入";
+
+}
diff --git a/pigx-common/pigx-common-sensitive/src/main/java/com/pig4cloud/pigx/common/sensitive/word/SensitiveWordCustomizer.java b/pigx-common/pigx-common-sensitive/src/main/java/com/pig4cloud/pigx/common/sensitive/word/SensitiveWordCustomizer.java
new file mode 100644
index 000000000..54dd162c6
--- /dev/null
+++ b/pigx-common/pigx-common-sensitive/src/main/java/com/pig4cloud/pigx/common/sensitive/word/SensitiveWordCustomizer.java
@@ -0,0 +1,44 @@
+package com.pig4cloud.pigx.common.sensitive.word;
+
+import com.github.houbb.sensitive.word.api.IWordAllow;
+import com.github.houbb.sensitive.word.api.IWordDeny;
+import com.pig4cloud.pigx.common.core.constant.enums.YesNoEnum;
+import com.pig4cloud.pigx.common.core.util.RetOps;
+import com.pig4cloud.pigx.common.sensitive.util.RemoteSensitiveService;
+import lombok.RequiredArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author lengleng
+ * @date 2024/7/6
+ *
+ * 敏感词定制
+ */
+@RequiredArgsConstructor
+public class SensitiveWordCustomizer implements IWordAllow, IWordDeny {
+
+ private final RemoteSensitiveService remoteSensitiveService;
+
+ /**
+ * 白名单列表
+ *
+ * @return List
+ */
+ @Override
+ public List allow() {
+ return RetOps.of(remoteSensitiveService.list(YesNoEnum.YES.getCode())).getData().orElseGet(ArrayList::new);
+ }
+
+ /**
+ * 黑名单列表
+ *
+ * @return List
+ */
+ @Override
+ public List deny() {
+ return RetOps.of(remoteSensitiveService.list(YesNoEnum.NO.getCode())).getData().orElseGet(ArrayList::new);
+
+ }
+}
diff --git a/pigx-common/pigx-common-sensitive/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports b/pigx-common/pigx-common-sensitive/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports
new file mode 100644
index 000000000..0d7c25b46
--- /dev/null
+++ b/pigx-common/pigx-common-sensitive/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports
@@ -0,0 +1 @@
+com.pig4cloud.pigx.common.sensitive.util.RemoteSensitiveService
diff --git a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysSensitiveWordEntity.java b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysSensitiveWordEntity.java
new file mode 100644
index 000000000..d1834ffac
--- /dev/null
+++ b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysSensitiveWordEntity.java
@@ -0,0 +1,91 @@
+package com.pig4cloud.pigx.admin.api.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import com.pig4cloud.pigx.common.core.util.TenantTable;
+import java.time.LocalDateTime;
+
+/**
+ * 敏感词
+ *
+ * @author pig
+ * @date 2024-07-06 15:54:43
+ */
+@Data
+@TenantTable
+@TableName("sys_sensitive_word")
+@EqualsAndHashCode(callSuper = true)
+@Schema(description = "敏感词")
+public class SysSensitiveWordEntity extends Model {
+
+
+ /**
+ * 主键
+ */
+ @TableId(type = IdType.ASSIGN_ID)
+ @Schema(description="主键")
+ private Long sensitiveId;
+
+ /**
+ * 敏感词
+ */
+ @Schema(description="敏感词")
+ private String sensitiveWord;
+
+ /**
+ * 类型
+ */
+ @Schema(description="类型")
+ private String sensitiveType;
+
+ /**
+ * 备注
+ */
+ @Schema(description="备注")
+ private String remark;
+
+ /**
+ * 创建人
+ */
+ @TableField(fill = FieldFill.INSERT)
+ @Schema(description="创建人")
+ private String createBy;
+
+ /**
+ * 创建时间
+ */
+ @TableField(fill = FieldFill.INSERT)
+ @Schema(description="创建时间")
+ private LocalDateTime createTime;
+
+ /**
+ * 修改人
+ */
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ @Schema(description="修改人")
+ private String updateBy;
+
+ /**
+ * 修改时间
+ */
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ @Schema(description="修改时间")
+ private LocalDateTime updateTime;
+
+ /**
+ * 删除标记
+ */
+ @TableLogic
+ @TableField(fill = FieldFill.INSERT)
+ @Schema(description="删除标记")
+ private String delFlag;
+
+ /**
+ * 租户ID
+ */
+ @Schema(description="租户ID")
+ private Long tenantId;
+}
diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysSensitiveWordController.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysSensitiveWordController.java
new file mode 100644
index 000000000..679cc1294
--- /dev/null
+++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysSensitiveWordController.java
@@ -0,0 +1,172 @@
+package com.pig4cloud.pigx.admin.controller;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.pig4cloud.pigx.admin.api.entity.SysSensitiveWordEntity;
+import com.pig4cloud.pigx.admin.service.SysSensitiveWordService;
+import com.pig4cloud.pigx.common.core.constant.CacheConstants;
+import com.pig4cloud.pigx.common.core.util.R;
+import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel;
+import com.pig4cloud.pigx.common.log.annotation.SysLog;
+import com.pig4cloud.pigx.common.security.annotation.Inner;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.springdoc.core.annotations.ParameterObject;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.http.HttpHeaders;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 敏感词
+ *
+ * @author pig
+ * @date 2024-07-06 15:54:43
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/sysSensitiveWord")
+@Tag(description = "sysSensitiveWord", name = "敏感词管理")
+@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
+public class SysSensitiveWordController {
+
+ private final SysSensitiveWordService sysSensitiveWordService;
+
+ private final RedisTemplate redisTemplate;
+
+ /**
+ * 分页查询
+ *
+ * @param page 分页对象
+ * @param sysSensitiveWord 敏感词
+ * @return
+ */
+ @Operation(summary = "分页查询", description = "分页查询")
+ @GetMapping("/page")
+ @PreAuthorize("@pms.hasPermission('admin_sysSensitiveWord_view')")
+ public R getSysSensitiveWordPage(@ParameterObject Page page, @ParameterObject SysSensitiveWordEntity sysSensitiveWord) {
+ LambdaQueryWrapper wrapper = Wrappers.lambdaQuery();
+ wrapper.like(StrUtil.isNotBlank(sysSensitiveWord.getSensitiveWord())
+ , SysSensitiveWordEntity::getSensitiveWord, sysSensitiveWord.getSensitiveWord());
+ wrapper.eq(StrUtil.isNotBlank(sysSensitiveWord.getSensitiveType())
+ , SysSensitiveWordEntity::getSensitiveType, sysSensitiveWord.getSensitiveType());
+ return R.ok(sysSensitiveWordService.page(page, wrapper));
+ }
+
+ @Inner
+ @Operation(summary = "查询所有敏感词", description = "查询所有敏感词")
+ @GetMapping("/remote/list/{type}")
+ public R list(@PathVariable String type) {
+ return R.ok(sysSensitiveWordService.list(Wrappers.lambdaQuery()
+ .eq(SysSensitiveWordEntity::getSensitiveType, type)).stream().map(SysSensitiveWordEntity::getSensitiveWord).collect(Collectors.toList()));
+ }
+
+ /**
+ * 通过id查询敏感词
+ *
+ * @return R
+ */
+ @Operation(summary = "通过id查询", description = "通过id查询")
+ @GetMapping("/details")
+ @PreAuthorize("@pms.hasPermission('admin_sysSensitiveWord_view')")
+ public R getById(@ParameterObject SysSensitiveWordEntity sysSensitiveWord) {
+ return R.ok(sysSensitiveWordService.getOne(Wrappers.lambdaQuery(sysSensitiveWord), false));
+ }
+
+ /**
+ * 新增敏感词
+ *
+ * @param sysSensitiveWord 敏感词
+ * @return R
+ */
+ @Operation(summary = "新增敏感词", description = "新增敏感词")
+ @SysLog("新增敏感词")
+ @PostMapping
+ @PreAuthorize("@pms.hasPermission('admin_sysSensitiveWord_add')")
+ public R save(@RequestBody SysSensitiveWordEntity sysSensitiveWord) {
+ return R.ok(sysSensitiveWordService.saveSensitive(sysSensitiveWord));
+ }
+
+ /**
+ * 修改敏感词
+ *
+ * @param sysSensitiveWord 敏感词
+ * @return R
+ */
+ @Operation(summary = "修改敏感词", description = "修改敏感词")
+ @SysLog("修改敏感词")
+ @PutMapping
+ @PreAuthorize("@pms.hasPermission('admin_sysSensitiveWord_edit')")
+ public R updateById(@RequestBody SysSensitiveWordEntity sysSensitiveWord) {
+ sysSensitiveWordService.updateById(sysSensitiveWord);
+ redisTemplate.convertAndSend(CacheConstants.SENSITIVE_REDIS_RELOAD_TOPIC, "刷新敏感词缓存");
+ return R.ok();
+ }
+
+ /**
+ * 查询敏感词
+ *
+ * @param sysSensitiveWord 敏感词
+ * @return R
+ */
+ @Operation(summary = "查询敏感词", description = "查询敏感词")
+ @SysLog("查询敏感词")
+ @PostMapping("/match")
+ @PreAuthorize("@pms.hasPermission('admin_sysSensitiveWord_del')")
+ public R match(@RequestBody SysSensitiveWordEntity sysSensitiveWord) {
+ return R.ok(sysSensitiveWordService.matchSensitiveWord(sysSensitiveWord));
+ }
+
+ /**
+ * 通过id删除敏感词
+ *
+ * @param ids sensitiveId列表
+ * @return R
+ */
+ @Operation(summary = "通过id删除敏感词", description = "通过id删除敏感词")
+ @SysLog("通过id删除敏感词")
+ @DeleteMapping
+ @PreAuthorize("@pms.hasPermission('admin_sysSensitiveWord_del')")
+ public R removeById(@RequestBody Long[] ids) {
+ sysSensitiveWordService.removeBatchByIds(CollUtil.toList(ids));
+ redisTemplate.convertAndSend(CacheConstants.SENSITIVE_REDIS_RELOAD_TOPIC, "刷新敏感词缓存");
+ return R.ok();
+ }
+
+
+ /**
+ * 导出excel 表格
+ *
+ * @param sysSensitiveWord 查询条件
+ * @param ids 导出指定ID
+ * @return excel 文件流
+ */
+ @ResponseExcel
+ @GetMapping("/export")
+ @PreAuthorize("@pms.hasPermission('admin_sysSensitiveWord_export')")
+ public List export(SysSensitiveWordEntity sysSensitiveWord, Long[] ids) {
+ return sysSensitiveWordService.list(Wrappers.lambdaQuery(sysSensitiveWord).in(ArrayUtil.isNotEmpty(ids), SysSensitiveWordEntity::getSensitiveId, ids));
+ }
+
+ /**
+ * 刷新敏感词缓存
+ *
+ * @return R
+ */
+ @Operation(summary = "刷新敏感词缓存", description = "刷新敏感词缓存")
+ @GetMapping("/refresh")
+ @PreAuthorize("@pms.hasPermission('admin_sysSensitiveWord_del')")
+ public R refresh() {
+ redisTemplate.convertAndSend(CacheConstants.SENSITIVE_REDIS_RELOAD_TOPIC, "刷新敏感词缓存");
+ return R.ok();
+ }
+}
diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysSensitiveWordMapper.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysSensitiveWordMapper.java
new file mode 100644
index 000000000..d479b6e49
--- /dev/null
+++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysSensitiveWordMapper.java
@@ -0,0 +1,11 @@
+package com.pig4cloud.pigx.admin.mapper;
+
+import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper;
+import com.pig4cloud.pigx.admin.api.entity.SysSensitiveWordEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface SysSensitiveWordMapper extends PigxBaseMapper {
+
+
+}
diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysSensitiveWordService.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysSensitiveWordService.java
new file mode 100644
index 000000000..b2c64af93
--- /dev/null
+++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysSensitiveWordService.java
@@ -0,0 +1,23 @@
+package com.pig4cloud.pigx.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.pig4cloud.pigx.admin.api.entity.SysSensitiveWordEntity;
+
+import java.util.List;
+
+public interface SysSensitiveWordService extends IService {
+
+ /**
+ * 查询敏感词
+ * @param sysSensitiveWord 敏感词
+ * @return 敏感词列表
+ */
+ List matchSensitiveWord(SysSensitiveWordEntity sysSensitiveWord);
+
+ /**
+ * 保存敏感词
+ * @param sysSensitiveWord
+ * @return
+ */
+ Boolean saveSensitive(SysSensitiveWordEntity sysSensitiveWord);
+}
diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysSensitiveWordServiceImpl.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysSensitiveWordServiceImpl.java
new file mode 100644
index 000000000..f8e5d6e05
--- /dev/null
+++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysSensitiveWordServiceImpl.java
@@ -0,0 +1,65 @@
+package com.pig4cloud.pigx.admin.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.houbb.sensitive.word.bs.SensitiveWordBs;
+import com.pig4cloud.pigx.admin.api.entity.SysSensitiveWordEntity;
+import com.pig4cloud.pigx.admin.mapper.SysSensitiveWordMapper;
+import com.pig4cloud.pigx.admin.service.SysSensitiveWordService;
+import com.pig4cloud.pigx.common.core.constant.CacheConstants;
+import lombok.RequiredArgsConstructor;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 敏感词
+ *
+ * @author pig
+ * @date 2024-07-06 15:54:43
+ */
+@Service
+@RequiredArgsConstructor
+public class SysSensitiveWordServiceImpl extends ServiceImpl implements SysSensitiveWordService {
+
+ private final RedisTemplate redisTemplate;
+
+ /**
+ * 查询敏感词
+ *
+ * @param sysSensitiveWord 敏感词
+ * @return 敏感词列表
+ */
+ @Override
+ public List matchSensitiveWord(SysSensitiveWordEntity sysSensitiveWord) {
+ SensitiveWordBs sensitiveWordBs = SpringUtil.getBean(SensitiveWordBs.class);
+ return sensitiveWordBs.findAll(sysSensitiveWord.getSensitiveWord());
+ }
+
+ /**
+ * 保存敏感词
+ *
+ * @param sysSensitiveWord 敏感词
+ * @return success/false
+ */
+ @Override
+ public Boolean saveSensitive(SysSensitiveWordEntity sysSensitiveWord) {
+ List wordEntityList = baseMapper.selectList(Wrappers.lambdaQuery().
+ eq(SysSensitiveWordEntity::getSensitiveWord, sysSensitiveWord.getSensitiveWord()));
+
+ if (CollUtil.isEmpty(wordEntityList)) {
+ save(sysSensitiveWord);
+ } else {
+ wordEntityList.forEach(wordEntity -> {
+ wordEntity.setSensitiveType(sysSensitiveWord.getSensitiveType());
+ updateById(wordEntity);
+ });
+ }
+
+ redisTemplate.convertAndSend(CacheConstants.SENSITIVE_REDIS_RELOAD_TOPIC, "刷新敏感词缓存");
+ return Boolean.TRUE;
+ }
+}
diff --git a/pigx-upms/pigx-upms-biz/src/main/resources/file/qa.xlsx b/pigx-upms/pigx-upms-biz/src/main/resources/file/qa.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..0d2627edf08fed9b953073530c0c6c917d88d723
GIT binary patch
literal 10415
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
literal 0
HcmV?d00001
diff --git a/pigx-upms/pigx-upms-biz/src/main/resources/mapper/SysSensitiveWordMapper.xml b/pigx-upms/pigx-upms-biz/src/main/resources/mapper/SysSensitiveWordMapper.xml
new file mode 100644
index 000000000..d325f8383
--- /dev/null
+++ b/pigx-upms/pigx-upms-biz/src/main/resources/mapper/SysSensitiveWordMapper.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+