diff --git a/src/main/java/com/example/venue_reservation_service/VenueReservationServiceApplication.java b/src/main/java/com/example/venue_reservation_service/VenueReservationServiceApplication.java index 219e3d9..24db822 100644 --- a/src/main/java/com/example/venue_reservation_service/VenueReservationServiceApplication.java +++ b/src/main/java/com/example/venue_reservation_service/VenueReservationServiceApplication.java @@ -42,7 +42,6 @@ public class VenueReservationServiceApplication { MediaType.TEXT_HTML, MediaType.TEXT_PLAIN)); restTemplate.getMessageConverters().add(mappingJackson2HttpMessageConverter); - return restTemplate; } @@ -57,5 +56,4 @@ public class VenueReservationServiceApplication { mapper.configure(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); return mapper; } - } diff --git a/src/main/java/com/example/venue_reservation_service/config/CacheInitializer.java b/src/main/java/com/example/venue_reservation_service/config/CacheInitializer.java new file mode 100644 index 0000000..1f68683 --- /dev/null +++ b/src/main/java/com/example/venue_reservation_service/config/CacheInitializer.java @@ -0,0 +1,16 @@ +package com.example.venue_reservation_service.config; + +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class CacheInitializer { + + @PostConstruct // 在Bean初始化后执行[5](@ref) + public void init() { + log.info("敏感词库已加载到Redis"); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/venue_reservation_service/controller/SensitiveWordController.java b/src/main/java/com/example/venue_reservation_service/controller/SensitiveWordController.java index 96d9920..4520af9 100644 --- a/src/main/java/com/example/venue_reservation_service/controller/SensitiveWordController.java +++ b/src/main/java/com/example/venue_reservation_service/controller/SensitiveWordController.java @@ -1,7 +1,9 @@ package com.example.venue_reservation_service.controller; +import com.example.venue_reservation_service.domain.SensitiveWord; import com.example.venue_reservation_service.dto.PageDTO; import com.example.venue_reservation_service.dto.SensitiveWordDTO; +import com.example.venue_reservation_service.dto.WordDTO; import com.example.venue_reservation_service.service.SensitiveWordService; import com.example.venue_reservation_service.vo.Result; import io.swagger.annotations.Api; @@ -14,7 +16,7 @@ import org.springframework.web.bind.annotation.*; * 敏感词管理Controller */ @RestController -@RequestMapping("/sensitiveword") +@RequestMapping("/word") @CrossOrigin @Api("敏感词管理") @Slf4j @@ -28,10 +30,9 @@ public class SensitiveWordController { */ @ApiOperation("获取敏感词数据") @PostMapping("/query") - public Result query(@RequestBody PageDTO dto) { + public Result query(@RequestBody WordDTO dto) { return sensitiveWordService.getSensitiveWords(dto); } - /** * 添加敏感词 */ @@ -47,9 +48,8 @@ public class SensitiveWordController { */ @ApiOperation("修改敏感词") @PostMapping("/update") - public Result update(@RequestParam("id") Integer id, - @RequestBody SensitiveWordDTO dto) { - return sensitiveWordService.updateSensitiveWord(id, dto); + public Result update(@RequestBody SensitiveWord word) { + return sensitiveWordService.updateSensitiveWord(word); } /** @@ -62,5 +62,9 @@ public class SensitiveWordController { return sensitiveWordService.removeSensitiveWord(id); } - + @ApiOperation("启用/禁用敏感词") + @GetMapping("/set/{id}") + public Result set(@PathVariable("id") Integer id){ + return sensitiveWordService.set(id); + } } diff --git a/src/main/java/com/example/venue_reservation_service/controller/UserController.java b/src/main/java/com/example/venue_reservation_service/controller/UserController.java index 336a9cc..fb956fe 100644 --- a/src/main/java/com/example/venue_reservation_service/controller/UserController.java +++ b/src/main/java/com/example/venue_reservation_service/controller/UserController.java @@ -33,7 +33,7 @@ public class UserController { @ApiOperation("管理员登录") @PostMapping("/admin") - @Log(operationType = "POST", operationDesc = "场馆管理员登录,用户账号为#{#body.account}") +// @Log(operationType = "POST", operationDesc = "场馆管理员登录,用户账号为#{#body.account}") public Result adminLogin(@RequestBody AdminDTO dto){ return userService.adminLogin(dto); } diff --git a/src/main/java/com/example/venue_reservation_service/controller/WordController.java b/src/main/java/com/example/venue_reservation_service/controller/WordController.java deleted file mode 100644 index 8fb44cd..0000000 --- a/src/main/java/com/example/venue_reservation_service/controller/WordController.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.venue_reservation_service.controller; - - -import io.swagger.annotations.Api; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -@RestController -@RequestMapping("/word") -@CrossOrigin -@Api("敏感词管理") -public class WordController { -} diff --git a/src/main/java/com/example/venue_reservation_service/domain/SensitiveWord.java b/src/main/java/com/example/venue_reservation_service/domain/SensitiveWord.java index 5770f81..7b6d449 100644 --- a/src/main/java/com/example/venue_reservation_service/domain/SensitiveWord.java +++ b/src/main/java/com/example/venue_reservation_service/domain/SensitiveWord.java @@ -18,9 +18,9 @@ public class SensitiveWord { private String word; - private String level; + private Integer level; - private String status; + private Integer status; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") diff --git a/src/main/java/com/example/venue_reservation_service/domain/UserLike.java b/src/main/java/com/example/venue_reservation_service/domain/UserLike.java index 946b0da..065f71c 100644 --- a/src/main/java/com/example/venue_reservation_service/domain/UserLike.java +++ b/src/main/java/com/example/venue_reservation_service/domain/UserLike.java @@ -5,8 +5,12 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; +import java.time.LocalDateTime; import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; /** * 用户点赞关系表 @@ -34,52 +38,14 @@ public class UserLike implements Serializable { /** * 点赞时间 */ - private Date createTime; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** + * 逻辑删除 + */ @TableField(exist = false) private static final long serialVersionUID = 1L; - - @Override - public boolean equals(Object that) { - if (this == that) { - return true; - } - if (that == null) { - return false; - } - if (getClass() != that.getClass()) { - return false; - } - UserLike other = (UserLike) that; - return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) - && (this.getUserId() == null ? other.getUserId() == null : this.getUserId().equals(other.getUserId())) - && (this.getCommentId() == null ? other.getCommentId() == null : this.getCommentId().equals(other.getCommentId())) - && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime())); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); - result = prime * result + ((getUserId() == null) ? 0 : getUserId().hashCode()); - result = prime * result + ((getCommentId() == null) ? 0 : getCommentId().hashCode()); - result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode()); - return result; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append(getClass().getSimpleName()); - sb.append(" ["); - sb.append("Hash = ").append(hashCode()); - sb.append(", id=").append(id); - sb.append(", userId=").append(userId); - sb.append(", commentId=").append(commentId); - sb.append(", createTime=").append(createTime); - sb.append(", serialVersionUID=").append(serialVersionUID); - sb.append("]"); - return sb.toString(); - } } \ No newline at end of file diff --git a/src/main/java/com/example/venue_reservation_service/domain/Word.java b/src/main/java/com/example/venue_reservation_service/domain/Word.java deleted file mode 100644 index 256ee45..0000000 --- a/src/main/java/com/example/venue_reservation_service/domain/Word.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.example.venue_reservation_service.domain; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import java.io.Serializable; -import java.util.Date; -import lombok.Data; - -/** - * 敏感词库表 - * @TableName venue_word - */ -@TableName(value ="venue_word") -@Data -public class Word implements Serializable { - /** - * 敏感词ID - */ - @TableId(type = IdType.AUTO) - private Integer id; - - /** - * 敏感词内容 - */ - private String word; - - /** - * 敏感等级(1-普通,2-高危) - */ - private String level; - - /** - * 创建时间 - */ - private Date createTime; - - @TableField(exist = false) - private static final long serialVersionUID = 1L; - - @Override - public boolean equals(Object that) { - if (this == that) { - return true; - } - if (that == null) { - return false; - } - if (getClass() != that.getClass()) { - return false; - } - Word other = (Word) that; - return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) - && (this.getWord() == null ? other.getWord() == null : this.getWord().equals(other.getWord())) - && (this.getLevel() == null ? other.getLevel() == null : this.getLevel().equals(other.getLevel())) - && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime())); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); - result = prime * result + ((getWord() == null) ? 0 : getWord().hashCode()); - result = prime * result + ((getLevel() == null) ? 0 : getLevel().hashCode()); - result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode()); - return result; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append(getClass().getSimpleName()); - sb.append(" ["); - sb.append("Hash = ").append(hashCode()); - sb.append(", id=").append(id); - sb.append(", word=").append(word); - sb.append(", level=").append(level); - sb.append(", createTime=").append(createTime); - sb.append(", serialVersionUID=").append(serialVersionUID); - sb.append("]"); - return sb.toString(); - } -} \ No newline at end of file diff --git a/src/main/java/com/example/venue_reservation_service/dto/SensitiveWordDTO.java b/src/main/java/com/example/venue_reservation_service/dto/SensitiveWordDTO.java index d6979b0..201e7e4 100644 --- a/src/main/java/com/example/venue_reservation_service/dto/SensitiveWordDTO.java +++ b/src/main/java/com/example/venue_reservation_service/dto/SensitiveWordDTO.java @@ -8,7 +8,6 @@ public class SensitiveWordDTO { //敏感词 private String word; - //敏感词等级 - private String level; + private Integer level; } diff --git a/src/main/java/com/example/venue_reservation_service/dto/UserInfo.java b/src/main/java/com/example/venue_reservation_service/dto/UserInfo.java index 4e1f2cf..610338b 100644 --- a/src/main/java/com/example/venue_reservation_service/dto/UserInfo.java +++ b/src/main/java/com/example/venue_reservation_service/dto/UserInfo.java @@ -9,7 +9,7 @@ public class UserInfo { private String username; - private String phone; + private String userPhone; private String email; } diff --git a/src/main/java/com/example/venue_reservation_service/dto/WordDTO.java b/src/main/java/com/example/venue_reservation_service/dto/WordDTO.java new file mode 100644 index 0000000..7161780 --- /dev/null +++ b/src/main/java/com/example/venue_reservation_service/dto/WordDTO.java @@ -0,0 +1,10 @@ +package com.example.venue_reservation_service.dto; + +import lombok.Data; + +@Data +public class WordDTO extends PageDTO{ + + private Integer level; + +} diff --git a/src/main/java/com/example/venue_reservation_service/filter/SensitiveFilter.java b/src/main/java/com/example/venue_reservation_service/filter/SensitiveFilter.java new file mode 100644 index 0000000..50a4913 --- /dev/null +++ b/src/main/java/com/example/venue_reservation_service/filter/SensitiveFilter.java @@ -0,0 +1,74 @@ +package com.example.venue_reservation_service.filter; + +import java.util.List; + +public class SensitiveFilter { + private final TrieNode root = new TrieNode(); + private static final String REPLACEMENT = "***"; // 敏感词替换字符 + + // 构建字典树 + public void buildTrie(List sensitiveWords) { + for (String word : sensitiveWords) { + TrieNode currentNode = root; + // 逐个字符插入树中 + for (char c : word.toCharArray()) { + TrieNode child = currentNode.getChild(c); + if (child == null) { + child = new TrieNode(); + currentNode.addChild(c, child); + } + currentNode = child; + } + currentNode.setEnd(true); // 标记敏感词结尾 + } + } + + // 敏感词过滤主方法 + public String filter(String text) { + if (text == null || text.isEmpty()) return text; + + StringBuilder result = new StringBuilder(); + TrieNode currentNode = root; + int begin = 0; // 当前检测起始位置 + int position = 0; // 当前扫描位置 + + while (position < text.length()) { + char c = text.charAt(position); + + // 特殊字符处理(如空格、符号) + if (isSymbol(c)) { + if (currentNode == root) { + result.append(c); + begin++; + } + position++; + continue; + } + + // 移动到下一节点 + currentNode = currentNode.getChild(c); + + if (currentNode == null) { + // 未匹配到敏感词 + result.append(text.charAt(begin)); + position = ++begin; + currentNode = root; // 重置根节点 + } else if (currentNode.isEnd()) { + // 发现完整敏感词 → 替换 + result.append(REPLACEMENT); + begin = ++position; + currentNode = root; + } else { + // 部分匹配,继续扫描 + position++; + } + } + result.append(text.substring(begin)); // 添加剩余文本 + return result.toString(); + } + // 特殊字符检测(可根据需求扩展) + private boolean isSymbol(char c) { + // 过滤非字母数字字符(可自定义规则) + return !Character.isLetterOrDigit(c) && ((int) c < 0x2E80 || (int) c > 0x9FFF); + } +} diff --git a/src/main/java/com/example/venue_reservation_service/filter/TrieNode.java b/src/main/java/com/example/venue_reservation_service/filter/TrieNode.java new file mode 100644 index 0000000..bd73beb --- /dev/null +++ b/src/main/java/com/example/venue_reservation_service/filter/TrieNode.java @@ -0,0 +1,31 @@ +package com.example.venue_reservation_service.filter; + +import java.util.HashMap; +import java.util.Map; + +public class TrieNode { + // 存储子节点(字符 → 节点映射) + private final Map children = new HashMap<>(); + // 标记是否为敏感词终点 + private boolean isEnd = false; + + // 添加子节点 + public void addChild(char c, TrieNode node) { + children.put(c, node); + } + + // 获取子节点 + public TrieNode getChild(char c) { + return children.get(c); + } + + // 是否为敏感词结尾 + public boolean isEnd() { + return isEnd; + } + + // 设置终点标记 + public void setEnd(boolean end) { + isEnd = end; + } +} diff --git a/src/main/java/com/example/venue_reservation_service/mapper/SensitiveWordMapper.java b/src/main/java/com/example/venue_reservation_service/mapper/SensitiveWordMapper.java index 0dfc2dd..ce3704f 100644 --- a/src/main/java/com/example/venue_reservation_service/mapper/SensitiveWordMapper.java +++ b/src/main/java/com/example/venue_reservation_service/mapper/SensitiveWordMapper.java @@ -1,9 +1,9 @@ -package com.example.venue_reservation_service.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.example.venue_reservation_service.domain.SensitiveWord; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface SensitiveWordMapper extends BaseMapper { -} +package com.example.venue_reservation_service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.example.venue_reservation_service.domain.SensitiveWord; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SensitiveWordMapper extends BaseMapper { +} diff --git a/src/main/java/com/example/venue_reservation_service/mapper/WordMapper.java b/src/main/java/com/example/venue_reservation_service/mapper/WordMapper.java deleted file mode 100644 index 38528be..0000000 --- a/src/main/java/com/example/venue_reservation_service/mapper/WordMapper.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.example.venue_reservation_service.mapper; - -import com.example.venue_reservation_service.domain.Word; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** -* @author 31586 -* @description 针对表【venue_word(敏感词库表)】的数据库操作Mapper -* @createDate 2025-06-03 15:00:23 -* @Entity generator.domain.Word -*/ -public interface WordMapper extends BaseMapper { - -} - - - - diff --git a/src/main/java/com/example/venue_reservation_service/service/SensitiveWordService.java b/src/main/java/com/example/venue_reservation_service/service/SensitiveWordService.java index a21f17a..159858b 100644 --- a/src/main/java/com/example/venue_reservation_service/service/SensitiveWordService.java +++ b/src/main/java/com/example/venue_reservation_service/service/SensitiveWordService.java @@ -1,23 +1,24 @@ package com.example.venue_reservation_service.service; +import com.example.venue_reservation_service.domain.SensitiveWord; import com.example.venue_reservation_service.dto.PageDTO; import com.example.venue_reservation_service.dto.SensitiveWordDTO; +import com.example.venue_reservation_service.dto.WordDTO; import com.example.venue_reservation_service.vo.Result; public interface SensitiveWordService { // 获取敏感词数据 - Result getSensitiveWords(PageDTO dto); - + Result getSensitiveWords(WordDTO dto); // 添加敏感词 Result addSensitiveWord(SensitiveWordDTO dto); - // 更新敏感词 - - Result updateSensitiveWord(Integer id, SensitiveWordDTO dto); + Result updateSensitiveWord(SensitiveWord word); // 移除敏感词 Result removeSensitiveWord(Integer id); + + Result set(Integer id); } diff --git a/src/main/java/com/example/venue_reservation_service/service/WordService.java b/src/main/java/com/example/venue_reservation_service/service/WordService.java deleted file mode 100644 index 40713cc..0000000 --- a/src/main/java/com/example/venue_reservation_service/service/WordService.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.venue_reservation_service.service; - -import com.example.venue_reservation_service.domain.Word; -import com.baomidou.mybatisplus.extension.service.IService; - -/** -* @author 31586 -* @description 针对表【venue_word(敏感词库表)】的数据库操作Service -* @createDate 2025-06-03 15:00:23 -*/ -public interface WordService extends IService { - -} diff --git a/src/main/java/com/example/venue_reservation_service/service/impl/ReservationServiceImpl.java b/src/main/java/com/example/venue_reservation_service/service/impl/ReservationServiceImpl.java index a3d5138..8176f2e 100644 --- a/src/main/java/com/example/venue_reservation_service/service/impl/ReservationServiceImpl.java +++ b/src/main/java/com/example/venue_reservation_service/service/impl/ReservationServiceImpl.java @@ -126,20 +126,11 @@ public class ReservationServiceImpl extends ServiceImpl slots = slotMapper.selectList(Wrappers.lambdaQuery() .eq(Slot::getReservationDate, reservationDate) - .and(wrap -> { // 嵌套 OR 条件:( (slot_start < ? AND slot_end > ? ) OR ... ) - wrap.or(sub -> sub - .lt(Slot::getSlotStart, start) - .gt(Slot::getSlotEnd, start) - ) - .or(sub -> sub - .lt(Slot::getSlotStart, end) - .gt(Slot::getSlotEnd, end) - ) - .or(sub -> sub - .le(Slot::getSlotStart, start) - .ge(Slot::getSlotEnd, end) - ); - })); + .and(wrap -> wrap + .lt(Slot::getSlotStart, end) // 条件1:slot_start < end + .gt(Slot::getSlotEnd, start) // 条件2:slot_end > start + ) + ); for (Slot slot : slots) { List list = venueSlotService.list(Wrappers.lambdaQuery() .eq(VenueSlot::getVenueId, information.getId()) @@ -151,26 +142,16 @@ public class ReservationServiceImpl extends ServiceImpllambdaQuery() + long count = count(Wrappers.lambdaQuery() .eq(Reservation::getReservationDate, reservationDate) .eq(Reservation::getVenueId, dto.getVenueId()) - .in(Reservation::getAuditStatus,1, 2 ) - .and(wrap -> { // 嵌套 OR 条件:( (slot_start < ? AND slot_end > ? ) OR ... ) - wrap.or(sub -> sub - .lt(Reservation::getStartTime, start) - .gt(Reservation::getEndTime, start) - ) - .or(sub -> sub - .lt(Reservation::getStartTime, end) - .gt(Reservation::getEndTime, end) - ) - .or(sub -> sub - .le(Reservation::getStartTime, start) - .ge(Reservation::getEndTime, end) - ); - })) - .size(); - if (size>0) { + .in(Reservation::getAuditStatus, 1, 2) + .and(wrap -> wrap + .lt(Reservation::getStartTime, end) // 简化的重叠条件 + .gt(Reservation::getEndTime, start) + ) + ); + if (count>0) { // 存在其他订单数据,不可预约 return Result.fail().message("预约时间段内存在其他用户订单"); } @@ -216,6 +197,12 @@ public class ReservationServiceImpl extends ServiceImpl dealReservation(reservation.getId()), + reservationDate, + end + ); // 返回订单信息 return Result.ok(payment).message("预约成功"); diff --git a/src/main/java/com/example/venue_reservation_service/service/impl/SensitiveWordServiceImpl.java b/src/main/java/com/example/venue_reservation_service/service/impl/SensitiveWordServiceImpl.java index d56ad3f..8b195b9 100644 --- a/src/main/java/com/example/venue_reservation_service/service/impl/SensitiveWordServiceImpl.java +++ b/src/main/java/com/example/venue_reservation_service/service/impl/SensitiveWordServiceImpl.java @@ -1,20 +1,21 @@ package com.example.venue_reservation_service.service.impl; +import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.example.venue_reservation_service.domain.SensitiveWord; -import com.example.venue_reservation_service.dto.PageDTO; import com.example.venue_reservation_service.dto.SensitiveWordDTO; +import com.example.venue_reservation_service.dto.WordDTO; import com.example.venue_reservation_service.mapper.SensitiveWordMapper; import com.example.venue_reservation_service.service.SensitiveWordService; import com.example.venue_reservation_service.vo.QueryVO; import com.example.venue_reservation_service.vo.Result; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; -import org.springframework.util.StringUtils; import java.time.LocalDateTime; +import java.util.Optional; /** * 敏感词业务实现类 @@ -29,9 +30,15 @@ public class SensitiveWordServiceImpl extends ServiceImpl page = new Page<>(dto.getCurrent(), dto.getSize()); - page = page(page, null); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + Integer level = dto.getLevel(); + if(level != 0){ + wrapper.eq(SensitiveWord::getLevel, level); + } + wrapper.orderByDesc(SensitiveWord::getUpdateTime); + page = page(page, wrapper); QueryVO vo = new QueryVO<>(); vo.setList(page.getRecords()); vo.setTotal(page.getTotal()); @@ -42,39 +49,37 @@ public class SensitiveWordServiceImpl extends ServiceImpl().eq(SensitiveWord::getWord, word)) > 0) { return Result.fail().message("该敏感词已存在"); } - - SensitiveWord sensitiveWord = new SensitiveWord(); + SensitiveWord sensitiveWord = BeanUtil.copyProperties(dto, SensitiveWord.class); sensitiveWord.setWord(word); - sensitiveWord.setLevel(sensitiveWordDTO.getLevel()); - sensitiveWord.setStatus("0"); // 默认不启用 + sensitiveWord.setStatus(0); // 默认不启用 sensitiveWord.setCreateTime(LocalDateTime.now()); sensitiveWord.setUpdateTime(LocalDateTime.now()); save(sensitiveWord); - return Result.ok().message("添加成功"); } - /** * 修改敏感词信息 */ @Override - public Result updateSensitiveWord(Integer id, SensitiveWordDTO sensitiveWordDTO) { - SensitiveWord sensitiveWord = getById(id); - if (sensitiveWord == null) { - return Result.fail().message("未找到对应敏感词"); + public Result updateSensitiveWord(SensitiveWord word) { + if(Optional.ofNullable(word).isEmpty() || Optional.ofNullable(word.getId()).isEmpty()){ + return Result.fail().message("敏感词记录不存在"); } - - sensitiveWord.setWord(sensitiveWordDTO.getWord().trim()); - sensitiveWord.setLevel(sensitiveWordDTO.getLevel()); - - updateById(sensitiveWord); + SensitiveWord origin = getById(word.getId()); + if(!origin.getWord().equals(word.getWord())){ + // 修改了敏感词内容 + if (count(new LambdaQueryWrapper().eq(SensitiveWord::getWord, word.getWord())) > 0) { + return Result.fail().message("该敏感词已存在"); + } + } + updateById(word); return Result.ok().message("修改成功"); } @@ -83,15 +88,28 @@ public class SensitiveWordServiceImpl extends ServiceImpl().eq(SensitiveWord::getId, id)) > 0; + @Override + public Result set(Integer id) { + SensitiveWord word = getById(id); + if(Optional.ofNullable(word).isEmpty()){ + return Result.fail().message("未查询到相关敏感词信息"); + } + Integer status = word.getStatus(); + word.setStatus(status == 1 ? 0 : 1); + updateById(word); + return Result.ok().message("设置成功"); } + + } diff --git a/src/main/java/com/example/venue_reservation_service/service/impl/UserServiceImpl.java b/src/main/java/com/example/venue_reservation_service/service/impl/UserServiceImpl.java index c760071..3f72c3c 100644 --- a/src/main/java/com/example/venue_reservation_service/service/impl/UserServiceImpl.java +++ b/src/main/java/com/example/venue_reservation_service/service/impl/UserServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.lang.UUID; import cn.hutool.jwt.JWTUtil; import com.auth0.jwt.JWT; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -21,6 +22,7 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper; import jakarta.annotation.Resource; import org.apache.commons.io.FilenameUtils; import org.checkerframework.checker.units.qual.A; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; @@ -118,7 +120,7 @@ public class UserServiceImpl extends ServiceImpl public Result adminLogin(AdminDTO dto) { String account = dto.getAccount(); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(User::getUsername, account); + wrapper.eq(User::getAccount, account); User user = getOne(wrapper); if (getOne(wrapper) == null) { return Result.fail().message("管理员账号不存在"); @@ -165,7 +167,7 @@ public class UserServiceImpl extends ServiceImpl // TODO 校验手机号是否合法 // 1. 手机号未被他人使用 // 2. 符合国家标准 - user.setUserPhone(userInfo.getPhone()); + user.setUserPhone(userInfo.getUserPhone()); user.setEmail(userInfo.getEmail()); user.setUpdateTime(LocalDateTime.now()); updateById(user); diff --git a/src/main/java/com/example/venue_reservation_service/service/impl/WordServiceImpl.java b/src/main/java/com/example/venue_reservation_service/service/impl/WordServiceImpl.java deleted file mode 100644 index b3296b5..0000000 --- a/src/main/java/com/example/venue_reservation_service/service/impl/WordServiceImpl.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.example.venue_reservation_service.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.example.venue_reservation_service.domain.Word; -import com.example.venue_reservation_service.service.WordService; -import com.example.venue_reservation_service.mapper.WordMapper; -import org.springframework.stereotype.Service; - -/** -* @author 31586 -* @description 针对表【venue_word(敏感词库表)】的数据库操作Service实现 -* @createDate 2025-06-03 15:00:23 -*/ -@Service -public class WordServiceImpl extends ServiceImpl - implements WordService{ - -} - - - - diff --git a/src/main/java/com/example/venue_reservation_service/utils/ScheduleUtil.java b/src/main/java/com/example/venue_reservation_service/utils/ScheduleUtil.java index 1d7e12a..5e5d2e7 100644 --- a/src/main/java/com/example/venue_reservation_service/utils/ScheduleUtil.java +++ b/src/main/java/com/example/venue_reservation_service/utils/ScheduleUtil.java @@ -28,7 +28,6 @@ public class ScheduleUtil { System.out.println("指定的执行时间已过,任务不会被安排执行。"); return; } - taskScheduler.schedule(task, executionDateObj); } } diff --git a/src/main/resources/mapper/WordMapper.xml b/src/main/resources/mapper/WordMapper.xml index 81e4019..82793cd 100644 --- a/src/main/resources/mapper/WordMapper.xml +++ b/src/main/resources/mapper/WordMapper.xml @@ -2,17 +2,19 @@ - + - + + + - id,word,level, - create_time + id,word,level,status, + create_time,update_time diff --git a/src/test/java/com/example/venue_reservation_service/VenueReservationServiceApplicationTests.java b/src/test/java/com/example/venue_reservation_service/VenueReservationServiceApplicationTests.java index 9b62444..cdb54b7 100644 --- a/src/test/java/com/example/venue_reservation_service/VenueReservationServiceApplicationTests.java +++ b/src/test/java/com/example/venue_reservation_service/VenueReservationServiceApplicationTests.java @@ -3,6 +3,7 @@ package com.example.venue_reservation_service; import cn.hutool.core.lang.UUID; import com.example.venue_reservation_service.controller.UserController; import com.example.venue_reservation_service.dto.AdminDTO; +import com.example.venue_reservation_service.filter.SensitiveFilter; import com.example.venue_reservation_service.utils.MD5Util; import com.example.venue_reservation_service.vo.Result; import jakarta.annotation.Resource; @@ -28,6 +29,22 @@ class VenueReservationServiceApplicationTests { void contextLoads() throws Exception { } + public static void main(String[] args) { + // 1. 初始化敏感词库 + List sensitiveWords = Arrays.asList("赌博", "毒品", "色情"); + + // 2. 构建过滤器 + SensitiveFilter filter = new SensitiveFilter(); + filter.buildTrie(sensitiveWords); + + // 3. 测试文本过滤 + String input = "远离赌博,拒绝毒品,健康上网!"; + String output = filter.filter(input); + + System.out.println("原始文本: " + input); + System.out.println("过滤结果: " + output); + // 输出:远离***,拒绝***,健康上网! + } } \ No newline at end of file