Переглянути джерело

add : 过滤敏感词功能

wuweihao 4 роки тому
батько
коміт
c395828730
27 змінених файлів з 619 додано та 87 видалено
  1. 32 21
      gis_admin/src/main/java/com/gis/admin/controller/IndexController.java
  2. 3 3
      gis_admin/src/main/java/com/gis/admin/entity/dto/LoginDto.java
  3. 14 13
      gis_admin/src/main/java/com/gis/admin/service/impl/SysResourceServiceImpl.java
  4. 34 0
      gis_admin/src/main/java/com/gis/admin/shiro/JwtAuthenticationException.java
  5. 210 0
      gis_admin/src/main/java/com/gis/admin/shiro/ShiroRealm.java
  6. 8 2
      gis_cms/src/main/java/com/gis/cms/controller/SensitiveController.java
  7. 4 4
      gis_cms/src/main/java/com/gis/cms/controller/WebManageController.java
  8. 13 1
      gis_cms/src/main/java/com/gis/cms/entity/vo/CommentVo.java
  9. 2 2
      gis_cms/src/main/java/com/gis/cms/mapper/QuestionUserMapper.java
  10. 5 0
      gis_cms/src/main/java/com/gis/cms/mapper/SensitiveMapper.java
  11. 1 1
      gis_cms/src/main/java/com/gis/cms/service/CommentService.java
  12. 1 1
      gis_cms/src/main/java/com/gis/cms/service/QuestionUserService.java
  13. 6 0
      gis_cms/src/main/java/com/gis/cms/service/SensitiveService.java
  14. 1 1
      gis_cms/src/main/java/com/gis/cms/service/impl/AuditLogServiceImpl.java
  15. 10 8
      gis_cms/src/main/java/com/gis/cms/service/impl/CommentServiceImpl.java
  16. 1 1
      gis_cms/src/main/java/com/gis/cms/service/impl/GoodsServiceImpl.java
  17. 1 1
      gis_cms/src/main/java/com/gis/cms/service/impl/MartyrServiceImpl.java
  18. 1 1
      gis_cms/src/main/java/com/gis/cms/service/impl/NewsServiceImpl.java
  19. 1 1
      gis_cms/src/main/java/com/gis/cms/service/impl/QuestionGroupServiceImpl.java
  20. 2 2
      gis_cms/src/main/java/com/gis/cms/service/impl/QuestionUserServiceImpl.java
  21. 51 11
      gis_cms/src/main/java/com/gis/cms/service/impl/SensitiveServiceImpl.java
  22. 26 3
      gis_cms/src/main/java/com/gis/cms/tree/CommentTreeUtil.java
  23. 6 1
      gis_common/pom.xml
  24. 4 0
      gis_common/src/main/java/com/gis/common/base/service/IBaseService.java
  25. 16 9
      gis_common/src/main/java/com/gis/common/base/service/impl/IBaseServiceImpl.java
  26. 78 0
      gis_common/src/main/java/com/gis/common/util/ConvertUtils.java
  27. 88 0
      gis_common/src/main/java/com/gis/common/util/RedisUtil.java

+ 32 - 21
gis_admin/src/main/java/com/gis/admin/controller/IndexController.java

@@ -5,6 +5,7 @@ import com.gis.common.base.service.LogService;
 import com.gis.common.constant.ConfigConstant;
 import com.gis.common.util.JwtUtil;
 import com.gis.common.util.PasswordUtils;
+import com.gis.common.util.RedisUtil;
 import com.gis.common.util.Result;
 import com.gis.admin.entity.po.SysUserEntity;
 import com.gis.admin.service.SysResourceService;
@@ -27,8 +28,7 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
 import java.time.LocalDateTime;
-import java.util.HashMap;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -37,7 +37,7 @@ import java.util.concurrent.TimeUnit;
 @Api(tags = "sys-登录")
 @RestController
 @Log4j2
-public class IndexController {
+public class LoginController {
 
     @Autowired
     private LogService logService;
@@ -51,8 +51,8 @@ public class IndexController {
     @Autowired
     SysResourceService sysResourceService;
 
-    @Autowired
-    private RedisTemplate<String, String> redisTemplate;
+//    @Autowired
+//    private RedisTemplate<String, String> redisTemplate;
 
     @Autowired
     ConfigConstant configConstant;
@@ -60,6 +60,9 @@ public class IndexController {
     @Resource
     protected HttpServletRequest request;
 
+    @Autowired
+    RedisUtil redisUtil;
+
 
 
     // 目前是24h
@@ -69,6 +72,14 @@ public class IndexController {
     @PostMapping(value = "admin/login")
     public Result login(@Valid @RequestBody LoginDto param)  {
 
+        String from = param.getFrom();
+        String[] checkFrom = {"cms","web"};
+        List<String> fromList = Arrays.asList(checkFrom);
+        if (!fromList.contains(from)) {
+            log.error("from: {}", from);
+            return Result.failure("非法用户");
+        }
+
         // 1.获取用户
         SysUserEntity entity = userService.findByUserName(param.getUserName());
         if (entity == null){
@@ -76,15 +87,14 @@ public class IndexController {
             return Result.failure("用户不存在");
         }
 
-//        String from = param.getFrom();
-//        String role = entity.getRole();
-//        log.info("role: {}", role);
-
-//         if ("cms".equals(from) && "sys_visitor".equals(role)) {
-//                 log.error("游客不能登录管理后台");
-//                 return Result.failure("非法用户");
-//         }
+        Long userId = entity.getId();
+        Object role = getRole(userId);
+        log.info("role: {}", role);
 
+         if ("cms".equals(from) && ((Set) role).contains("sys_visitor")) {
+                 log.error("游客不能登录管理后台");
+                 return Result.failure("非法用户");
+         }
 
         // 验证密码,解密出来是明文密码,在跟输入密码比较
         boolean decryptName = PasswordUtils.decrypt(entity.getPassword(), param.getPassword(), PasswordUtils.getStaticSalt());
@@ -95,18 +105,16 @@ public class IndexController {
 
         // 检查账号是否启用
         if (entity.getIsDisable() != 0) {
-            log.error("账号已停用: {}", entity.getUserName());
-            return Result.failure("账号已停用");
+            log.error("账号已停用: {}", entity.getUserName());
+            return Result.failure("账号已停用");
         }
 
         // 创建新token
-        Long userId = entity.getId();
         HashMap<String, Object> tokenMap = new HashMap<>();
         tokenMap.put("userName", entity.getUserName());
         tokenMap.put("id", userId);
-        Object role = getRole(userId);
         tokenMap.put("role", role);
-        // 创建新token
+
         String token = JwtUtil.createJWT(TOKEN_EXPIRE, tokenMap);
 
 
@@ -121,8 +129,10 @@ public class IndexController {
         saveLog(userId);
 
 
-        // 更新到 redis, 有效期24h, 旧token无效, 做单用户登录
-        redisTemplate.opsForValue().set(configConstant.redisPrefix + token, token, Long.parseLong("23"), TimeUnit.HOURS);
+        // 更新到 redis, 有效期24h, 旧token无效, 做单用户登录 86400s-> 24H
+//        redisTemplate.opsForValue().set(configConstant.redisPrefix + token, token, Long.parseLong("23"), TimeUnit.HOURS);
+
+        redisUtil.set(configConstant.redisPrefix + token, token, 86400);
 
 
         return Result.success(result);
@@ -136,7 +146,8 @@ public class IndexController {
         if (StringUtils.isBlank(token)) {
             log.info("token is null");
         }
-        redisTemplate.delete(configConstant.redisPrefix + token);
+//        redisTemplate.delete(configConstant.redisPrefix + token);
+        redisUtil.del(configConstant.redisPrefix + token);
         return Result.success();
     }
 

+ 3 - 3
gis_admin/src/main/java/com/gis/admin/entity/dto/LoginDto.java

@@ -20,9 +20,9 @@ public class LoginDto {
     @ApiModelProperty(value = "密码", name = "password", required = true)
     private String password;
 
-//    @NotBlank(message = "from不能为空")
-//    @ApiModelProperty(value = "区分用户去向,cms:管理后台,web:展示页")
-//    private String from;
+    @NotBlank(message = "from不能为空")
+    @ApiModelProperty(value = "区分用户去向,cms:管理后台,web:展示页")
+    private String from;
 
 
 }

+ 14 - 13
gis_admin/src/main/java/com/gis/admin/service/impl/SysResourceServiceImpl.java

@@ -33,6 +33,8 @@ public class SysResourceServiceImpl extends IBaseServiceImpl<SysResourceEntity,
     @Autowired
     SysRoleService sysRoleService;
 
+    static String REDIS_RESOURCE = "resource";
+
 
     @Override
     public IBaseMapper<SysResourceEntity, Long> getBaseMapper() {
@@ -122,8 +124,8 @@ public class SysResourceServiceImpl extends IBaseServiceImpl<SysResourceEntity,
 
     @Override
     public Result refreshRedisResource() {
-        String resourceKey = configConstant.redisPrefix + "resource";
-        redisTemplate.delete(resourceKey);
+        String resourceKey = configConstant.redisPrefix + REDIS_RESOURCE;
+        redisUtil.del(resourceKey);
         return Result.success();
     }
 
@@ -133,20 +135,19 @@ public class SysResourceServiceImpl extends IBaseServiceImpl<SysResourceEntity,
      * 获取db所有资源, authority默认true
      * @return
      */
+
     private List<SysResourceEntity> findCacheAll(){
-        String resourceKey = configConstant.redisPrefix + "resource";
-        List<SysResourceEntity> resourceEntityAll = null;
-        String all = redisTemplate.opsForValue().get(resourceKey);
-        if (all != null) {
-            log.info("走缓存");
-            resourceEntityAll =  JSON.parseArray(all, SysResourceEntity.class);
-        } else {
+        String resourceKey = configConstant.redisPrefix + REDIS_RESOURCE;
+        List all = (List) redisUtil.get(resourceKey);
+
+        if (all == null) {
             log.info("从数据库获取");
-            resourceEntityAll = this.findAll();
-            // 直接存list.toString, 转list 时会异常, 存的时候处理一下
-            redisTemplate.opsForValue().set(resourceKey, JSON.toJSONString(resourceEntityAll), Long.parseLong("6"), TimeUnit.HOURS);
+            all = this.findAll();
+            // 21600-> 6h
+            redisUtil.set(resourceKey, all, 21600);
         }
-        return resourceEntityAll;
+        log.info("走缓存");
+        return all;
 
     }
 

+ 34 - 0
gis_admin/src/main/java/com/gis/admin/shiro/JwtAuthenticationException.java

@@ -0,0 +1,34 @@
+package com.gis.admin.shiro;
+
+import org.apache.shiro.ShiroException;
+
+public class JwtAuthenticationException extends ShiroException {
+
+    private static final long serialVersionUID = 2899335020273674736L;
+
+    private int code;
+
+    private String msg;
+
+    public JwtAuthenticationException(int code, String msg){
+        super(msg);
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+}

+ 210 - 0
gis_admin/src/main/java/com/gis/admin/shiro/ShiroRealm.java

@@ -0,0 +1,210 @@
+package com.gis.admin.shiro;
+
+import com.gis.common.constant.ConfigConstant;
+import com.gis.common.util.JwtUtil;
+import com.gis.admin.entity.po.SysUserEntity;
+import com.gis.admin.service.SysResourceService;
+import com.gis.admin.service.SysUserService;
+import com.gis.common.util.RedisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.AuthenticationInfo;
+import org.apache.shiro.authc.AuthenticationToken;
+import org.apache.shiro.authc.SimpleAuthenticationInfo;
+import org.apache.shiro.authz.AuthorizationInfo;
+import org.apache.shiro.authz.SimpleAuthorizationInfo;
+import org.apache.shiro.realm.AuthorizingRealm;
+import org.apache.shiro.subject.PrincipalCollection;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @Description: 用户登录鉴权和获取用户授权
+ * @Author: owen
+ * @Date: 2021-07-07
+ * @Version: 1.1
+ */
+@Component
+@Slf4j
+public class ShiroRealm extends AuthorizingRealm {
+//	@Lazy
+//    @Resource
+//    private CommonAPI commonAPI;
+
+//    @Lazy
+//    @Resource
+//    private RedisUtil redisUtil;
+
+    @Resource
+    HttpServletRequest request;
+
+    @Autowired
+    SysResourceService sysResourceService;
+
+    @Autowired
+    SysUserService sysUserService;
+
+//    @Autowired
+//    RedisTemplate<String, String> redisTemplate;
+
+    @Autowired
+    ConfigConstant configConstant;
+
+    @Autowired
+    RedisUtil redisUtil;
+
+
+    /**
+     * 必须重写此方法,不然Shiro会报错
+     */
+    @Override
+    public boolean supports(AuthenticationToken token) {
+        return token instanceof JwtToken;
+    }
+
+    /**
+     * 权限信息认证(包括角色以及权限)是用户访问controller的时候才进行验证(redis存储的此处权限信息)
+     * 触发检测用户权限时才会调用此方法,例如checkRole,checkPermission
+     *
+     * 只有当需要检测用户权限的时候才会调用此方法,例如checkRole,checkPermission之类的
+     *
+     * @param principals 身份信息
+     * @return AuthorizationInfo 权限信息
+     */
+    @Override
+    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
+        log.info("===============Shiro权限认证开始============ [ roles、permissions]==========");
+        Long userId = null;
+
+        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
+
+        String token = request.getHeader("token");
+        log.info("token: {}", token);
+        if (StringUtils.isNotBlank(token)){
+            List userRole = JwtUtil.getUserRole(token);
+            userId = JwtUtil.getUserId(token);
+            // list to set 添加角色sys_admin,sys
+            info.setRoles(new HashSet<>(userRole));
+        }
+
+
+        // 设置用户拥有的权限集合,比如“sys:role:add,sys:user:add”
+        Set<String> permissions = sysResourceService.getPermissionByUserId(userId);
+        info.addStringPermissions(permissions);
+        log.info("===============Shiro权限认证成功==============");
+        return info;
+    }
+
+    /**
+     * 默认使用此方法进行用户名正确与否验证,错误抛出异常即可。
+     *
+     * 用户信息认证是在用户进行登录的时候进行验证(不存redis)
+     * 也就是说验证用户输入的账号和密码是否正确,错误抛出异常
+     *
+     * @param auth 用户登录的账号密码信息
+     * @return 返回封装了用户信息的 AuthenticationInfo 实例
+     * @throws AuthenticationException
+     */
+    @Override
+    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken auth) throws AuthenticationException {
+        log.debug("===============Shiro身份认证开始============doGetAuthenticationInfo==========");
+        String token = (String) auth.getCredentials();
+        log.info("token: {}", token);
+        if (token == null) {
+            throw new JwtAuthenticationException(5001, "header token is null");
+        }
+        // 校验token有效性
+        SysUserEntity sysUserEntity = this.checkUserTokenIsEffect(token);
+        return new SimpleAuthenticationInfo(sysUserEntity, token, getName());
+    }
+
+    /**
+     * 校验token的有效性
+     *
+     * @param token
+     */
+    private SysUserEntity checkUserTokenIsEffect(String token) throws AuthenticationException {
+        // 解密获得username,用于和数据库进行对比
+        String username = JwtUtil.getUsername(token);
+        if (username == null) {
+            throw new JwtAuthenticationException(5001, "token invalid");
+        }
+
+//        String redisToken = redisTemplate.opsForValue().get(configConstant.redisPrefix + token);
+        String redisToken = (String)redisUtil.get(configConstant.redisPrefix + token);
+
+        if (!token.equals(redisToken)) {
+            log.error("redis token is null");
+            throw new JwtAuthenticationException(5001, "redis token is null");
+
+        }
+        // 查询用户信息
+        if (! JwtUtil.isVerify(token, username)) {
+            log.error("error token username or password");
+            throw new JwtAuthenticationException(5001, "token invalid");
+        }
+
+        SysUserEntity userEntity = sysUserService.findByUserName(username);
+        if (userEntity == null) {
+            log.error("error token userEntity");
+            throw new JwtAuthenticationException(5001, "User didn't existed!");
+        }
+
+        return userEntity;
+    }
+
+    /**
+     * JWTToken刷新生命周期 (实现: 用户在线操作不掉线功能)
+     * 1、登录成功后将用户的JWT生成的Token作为k、v存储到cache缓存里面(这时候k、v值一样),缓存有效期设置为Jwt有效时间的2倍
+     * 2、当该用户再次请求时,通过JWTFilter层层校验之后会进入到doGetAuthenticationInfo进行身份验证
+     * 3、当该用户这次请求jwt生成的token值已经超时,但该token对应cache中的k还是存在,则表示该用户一直在操作只是JWT的token失效了,程序会给token对应的k映射的v值重新生成JWTToken并覆盖v值,该缓存生命周期重新计算
+     * 4、当该用户这次请求jwt在生成的token值已经超时,并在cache中不存在对应的k,则表示该用户账户空闲超时,返回用户信息已失效,请重新登录。
+     * 注意: 前端请求Header中设置Authorization保持不变,校验有效性以缓存中的token为准。
+     *       用户过期时间 = Jwt有效时间 * 2。
+     *
+     * @param userName
+     * @param passWord
+     * @return
+     */
+//    public boolean jwtTokenRefresh(String token, String userName, String passWord) {
+//        String cacheToken = String.valueOf(redisUtil.get(CommonConstant.PREFIX_USER_TOKEN + token));
+//        if (oConvertUtils.isNotEmpty(cacheToken)) {
+//            // 校验token有效性
+//            if (!JwtUtil.verify(cacheToken, userName, passWord)) {
+//                String newAuthorization = JwtUtil.sign(userName, passWord);
+//                // 设置超时时间
+//                redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, newAuthorization);
+//                redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME *2 / 1000);
+//                log.debug("——————————用户在线操作,更新token保证不掉线—————————jwtTokenRefresh——————— "+ token);
+//            }
+//            //update-begin--Author:scott  Date:20191005  for:解决每次请求,都重写redis中 token缓存问题
+////			else {
+////				// 设置超时时间
+////				redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, cacheToken);
+////				redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME / 1000);
+////			}
+//            //update-end--Author:scott  Date:20191005   for:解决每次请求,都重写redis中 token缓存问题
+//            return true;
+//        }
+//        return false;
+//    }
+
+    /**
+     * 清除当前用户的权限认证缓存
+     *
+     * @param principals 权限信息
+     */
+    @Override
+    public void clearCache(PrincipalCollection principals) {
+        super.clearCache(principals);
+    }
+
+}

+ 8 - 2
gis_cms/src/main/java/com/gis/cms/controller/SensitiveController.java

@@ -9,6 +9,7 @@ import com.gis.cms.service.SensitiveService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.authz.annotation.RequiresRoles;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -26,8 +27,6 @@ public class SensitiveController  {
     @Autowired
     private SensitiveService entityService;
 
-
-
     @ApiOperation("列表")
     @PostMapping("list")
     public Result<SensitiveEntity> search(@Valid @RequestBody PageDto param) {
@@ -55,6 +54,13 @@ public class SensitiveController  {
         return entityService.detail(id);
     }
 
+    @WebControllerLog(description = "敏感词管理-删除缓存", addDb = true)
+    @ApiOperation(value = "删除缓存", notes = "更新敏感词表,需要刷新缓存")
+    @GetMapping("refresh")
+    public Result refreshRedis() {
+        return entityService.refreshRedis();
+    }
+
 
 
 }

+ 4 - 4
gis_cms/src/main/java/com/gis/cms/controller/WebManageController.java

@@ -81,9 +81,9 @@ public class WebManageController {
 
     @WebControllerLog(description = "门户网站-答题排名")
     @ApiOperation(value = "门户网站-答题排名", notes = "排名前十的")
-    @GetMapping("questionUser/ranking")
-    public Result questionUserRanking() {
-        return questionUserService.ranking();
+    @GetMapping("questionUser/ranking/{questionGroupId}")
+    public Result questionUserRanking(@PathVariable Long questionGroupId) {
+        return questionUserService.ranking(questionGroupId);
     }
 
 
@@ -98,7 +98,7 @@ public class WebManageController {
     @ApiOperation("门户网站-留言树列表")
     @PostMapping("comment/listTree")
     public Result<CommentVo> list(@RequestBody PageDateDto param) {
-        return commentService.listTree(param, 1);
+        return commentService.voListTree(param, 1);
     }
 
     @WebControllerLog(description = "门户网站-悼念列表")

+ 13 - 1
gis_cms/src/main/java/com/gis/cms/entity/vo/CommentVo.java

@@ -1,8 +1,12 @@
 package com.gis.cms.entity.vo;
 
 import com.gis.common.base.entity.po.BaseEntity;
+import com.gis.common.util.RedisUtil;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.Set;
 
 /**
  * Created by owen on 202/6/24.
@@ -11,6 +15,8 @@ import lombok.Data;
 @Data
 public class CommentVo extends BaseEntity {
 
+//    @Autowired
+//    RedisUtil redisUtil;
 
     @ApiModelProperty(value = "真实姓名")
     private String realName;
@@ -31,5 +37,11 @@ public class CommentVo extends BaseEntity {
     private Long parentId;
 
 
-
+//    public void setContent(String content) {
+//        Set<String> filterKey = (Set)redisUtil.get("army_xinjiang_token_filter");
+//        for (String s : filterKey) {
+//            content =  content.replaceAll(s, "**");
+//        }
+//        this.content = content;
+//    }
 }

+ 2 - 2
gis_cms/src/main/java/com/gis/cms/mapper/QuestionUserMapper.java

@@ -13,6 +13,6 @@ import java.util.List;
 @Mapper
 public interface QuestionUserMapper extends IBaseMapper<QuestionUserEntity, Long> {
 
-    @Select("select * from tb_question_user where is_delete=0 order by score desc limit 10")
-    List<QuestionUserEntity> ranking();
+    @Select("select * from tb_question_user where is_delete=0 AND question_group_id=#{questionGroupId} order by score desc limit 10")
+    List<QuestionUserEntity> ranking(Long questionGroupId);
 }

+ 5 - 0
gis_cms/src/main/java/com/gis/cms/mapper/SensitiveMapper.java

@@ -4,10 +4,15 @@ package com.gis.cms.mapper;
 import com.gis.common.base.mapper.IBaseMapper;
 import com.gis.cms.entity.po.SensitiveEntity;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
 import org.springframework.stereotype.Component;
 
+import java.util.Set;
+
 @Component
 @Mapper
 public interface SensitiveMapper extends IBaseMapper<SensitiveEntity, Long> {
 
+    @Select("SELECT DISTINCT name FROM tb_sensitive WHERE is_delete=0")
+    Set<String> getName();
 }

+ 1 - 1
gis_cms/src/main/java/com/gis/cms/service/CommentService.java

@@ -26,5 +26,5 @@ public interface CommentService extends IBaseService<CommentEntity, Long> {
 
     Result saveEntity(CommentDto param);
 
-    Result<CommentVo> listTree(PageDateDto param, Integer display);
+    Result<CommentVo> voListTree(PageDateDto param, Integer display);
 }

+ 1 - 1
gis_cms/src/main/java/com/gis/cms/service/QuestionUserService.java

@@ -15,7 +15,7 @@ import java.util.Map;
 public interface QuestionUserService extends IBaseService<QuestionUserEntity, Long> {
     Result<QuestionGroupEntity> submit(Long questionGroupId, Map<String, String> answers);
 
-    Result ranking();
+    Result ranking(Long questionGroupId);
 
 
 

+ 6 - 0
gis_cms/src/main/java/com/gis/cms/service/SensitiveService.java

@@ -7,6 +7,8 @@ import com.gis.common.base.service.IBaseService;
 import com.gis.common.base.entity.dto.PageDto;
 import com.gis.common.util.Result;
 
+import java.util.Set;
+
 
 /**
  * Created by owen on 2020/3/11 0011 16:14
@@ -22,4 +24,8 @@ public interface SensitiveService extends IBaseService<SensitiveEntity, Long> {
 
     Result<SensitiveEntity> search(PageDto param);
 
+    Set<String> getFilterKey();
+
+
+    Result refreshRedis();
 }

+ 1 - 1
gis_cms/src/main/java/com/gis/cms/service/impl/AuditLogServiceImpl.java

@@ -75,7 +75,7 @@ public class AuditLogServiceImpl extends IBaseServiceImpl<AuditLogEntity, Long>
         entity.setModuleId(moduleId);
         entity.setReason(reason);
         entity.setStatus(status);
-        entity.setAuditor(getTokenUserName(request));
+        entity.setAuditor(getTokenUserName());
         this.save(entity);
     }
 

+ 10 - 8
gis_cms/src/main/java/com/gis/cms/service/impl/CommentServiceImpl.java

@@ -5,6 +5,7 @@ import com.gis.cms.entity.po.CommentEntity;
 import com.gis.cms.entity.vo.CommentVo;
 import com.gis.cms.mapper.CommentMapper;
 import com.gis.cms.service.CommentService;
+import com.gis.cms.service.SensitiveService;
 import com.gis.cms.tree.CommentTreeUtil;
 import com.gis.cms.tree.vo.CommentTree;
 import com.gis.common.base.entity.dto.PageDateDto;
@@ -20,6 +21,7 @@ import tk.mybatis.mapper.entity.Condition;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.List;
+import java.util.Set;
 
 
 /**
@@ -31,6 +33,9 @@ public class CommentServiceImpl extends IBaseServiceImpl<CommentEntity, Long> im
     @Autowired
     private CommentMapper entityMapper;
 
+    @Autowired
+    private SensitiveService sensitiveService;
+
     @Override
     public IBaseMapper<CommentEntity, Long> getBaseMapper() {
         return this.entityMapper;
@@ -72,16 +77,13 @@ public class CommentServiceImpl extends IBaseServiceImpl<CommentEntity, Long> im
     }
 
     @Override
-    public Result<CommentVo> listTree(PageDateDto param, Integer display) {
+    public Result<CommentVo> voListTree(PageDateDto param, Integer display) {
         startPage(param);
-        Condition condition  =  new Condition(CommentEntity.class);
-        if (display != null){
-            condition.and().andEqualTo("display", display);
-        }
-        condition.orderBy("createTime").desc();
-        List<CommentEntity> all =  this.findAll(condition);
 
-        CommentTreeUtil commentTreeUtil = new CommentTreeUtil(all);
+        List<CommentVo> search = entityMapper.search(param, display);
+
+        Set<String> filterKey = sensitiveService.getFilterKey();
+        CommentTreeUtil commentTreeUtil = new CommentTreeUtil(search, filterKey);
         List<CommentTree> commentTrees = commentTreeUtil.buildTree();
 
         PageInfo<CommentTree> page = new PageInfo<>(commentTrees);

+ 1 - 1
gis_cms/src/main/java/com/gis/cms/service/impl/GoodsServiceImpl.java

@@ -74,7 +74,7 @@ public class GoodsServiceImpl extends IBaseServiceImpl<GoodsEntity, Long> implem
         if (id == null) {
             entity = new GoodsEntity();
             BeanUtils.copyProperties(param, entity);
-            entity.setUserName(getTokenUserName(request));
+            entity.setUserName(getTokenUserName());
             this.save(entity);
         } else {
             entity = this.findById(id);

+ 1 - 1
gis_cms/src/main/java/com/gis/cms/service/impl/MartyrServiceImpl.java

@@ -134,7 +134,7 @@ public class MartyrServiceImpl extends IBaseServiceImpl<MartyrEntity, Long> impl
         if (id == null) {
             entity = new MartyrEntity();
             BeanUtils.copyProperties(param, entity);
-            entity.setUserName(getTokenUserName(request));
+            entity.setUserName(getTokenUserName());
             this.save(entity);
         } else {
             entity = this.findById(id);

+ 1 - 1
gis_cms/src/main/java/com/gis/cms/service/impl/NewsServiceImpl.java

@@ -141,7 +141,7 @@ public class NewsServiceImpl extends IBaseServiceImpl<NewsEntity, Long> implemen
         if (id == null) {
             entity = new NewsEntity();
             BeanUtils.copyProperties(param, entity);
-            entity.setUserName(getTokenUserName(request));
+            entity.setUserName(getTokenUserName());
             this.save(entity);
         } else {
             entity = this.findById(id);

+ 1 - 1
gis_cms/src/main/java/com/gis/cms/service/impl/QuestionGroupServiceImpl.java

@@ -141,7 +141,7 @@ public class QuestionGroupServiceImpl extends IBaseServiceImpl<QuestionGroupEnti
             entity = new QuestionGroupEntity();
             entity.setDisplay(1);
             entity.setName(param.getContent());
-            entity.setUserName(getTokenUserName(request));
+            entity.setUserName(getTokenUserName());
             this.save(entity);
         } else {
             entity = this.findById(id);

+ 2 - 2
gis_cms/src/main/java/com/gis/cms/service/impl/QuestionUserServiceImpl.java

@@ -76,8 +76,8 @@ public class QuestionUserServiceImpl extends IBaseServiceImpl<QuestionUserEntity
     }
 
     @Override
-    public Result ranking() {
-        List<QuestionUserEntity> list = entityMapper.ranking();
+    public Result ranking(Long questionGroupId) {
+        List<QuestionUserEntity> list = entityMapper.ranking(questionGroupId);
         return Result.success(list);
     }
 

+ 51 - 11
gis_cms/src/main/java/com/gis/cms/service/impl/SensitiveServiceImpl.java

@@ -11,7 +11,9 @@ import com.gis.cms.service.AuditLogService;
 import com.gis.cms.service.FileService;
 import com.gis.cms.service.SensitiveService;
 import com.github.pagehelper.PageInfo;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.junit.Test;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -20,26 +22,22 @@ import tk.mybatis.mapper.entity.Condition;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
 
 
 /**
  * Created by owen on 2021/6/25 0011 16:16
  */
+@Slf4j
 @Service
 public class SensitiveServiceImpl extends IBaseServiceImpl<SensitiveEntity, Long> implements SensitiveService {
 
     @Autowired
     private SensitiveMapper entityMapper;
 
-
-    @Resource
-    public HttpServletRequest request;
-
-    @Autowired
-    FileService fileService;
-
-    @Autowired
-    AuditLogService auditLogService;
+    static String REDIS_FILTER = "filter";
 
     @Override
     public IBaseMapper<SensitiveEntity, Long> getBaseMapper() {
@@ -69,7 +67,7 @@ public class SensitiveServiceImpl extends IBaseServiceImpl<SensitiveEntity, Long
         if (id == null) {
             entity = new SensitiveEntity();
             BeanUtils.copyProperties(param, entity);
-            entity.setUserName(getTokenUserName(request));
+            entity.setUserName(getTokenUserName());
             this.save(entity);
         } else {
             entity = this.findById(id);
@@ -80,7 +78,7 @@ public class SensitiveServiceImpl extends IBaseServiceImpl<SensitiveEntity, Long
             entity.setUpdateTime(LocalDateTime.now());
             this.update(entity);
         }
-
+        redisUtil.del(getRedisFilterKey());
         return Result.success(entity);
     }
 
@@ -94,6 +92,7 @@ public class SensitiveServiceImpl extends IBaseServiceImpl<SensitiveEntity, Long
         entity.setIsDelete(1);
         entity.setUpdateTime(LocalDateTime.now());
         this.update(entity);
+        redisUtil.del(getRedisFilterKey());
         return  Result.success();
     }
 
@@ -106,7 +105,48 @@ public class SensitiveServiceImpl extends IBaseServiceImpl<SensitiveEntity, Long
         return  Result.success(entity);
     }
 
+    @Override
+    public Set<String> getFilterKey(){
+        String redisFilterKeyKey = getRedisFilterKey();
+        Set<String> filterKey = (Set)redisUtil.get(redisFilterKeyKey);
+        if (filterKey == null) {
+            log.info("走数据库");
+            filterKey = entityMapper.getName();
+            // 86400s-> 24H
+            redisUtil.set(redisFilterKeyKey, filterKey, 86400);
+        }
+        log.info("走缓存");
+        log.info("filterKey: {}", filterKey);
 
+        return filterKey;
+    }
 
+    @Override
+    public Result refreshRedis() {
+        redisUtil.del(getRedisFilterKey());
+        return Result.success();
+    }
+
+    private String getRedisFilterKey(){
+        return configConstant.redisPrefix+REDIS_FILTER;
+    }
+
+    @Test
+    public void test(){
+        String[] a = {"小米","小红"};
+        List<String> filterKey = Arrays.asList(a);
+        String msg = "我是小米, 很喜欢小红哈哈, 小米啊 , 小, 明, 小后果小红";
+        for (String s : filterKey) {
+            msg =  msg.replaceAll(s, "**");
+
+        }
+
+
+
+        for (String s : filterKey) {
+            msg =  msg.replaceAll(s, "**");
+        }
+        System.out.println(msg);
+    }
 
 }

+ 26 - 3
gis_cms/src/main/java/com/gis/cms/tree/CommentTreeUtil.java

@@ -1,11 +1,14 @@
 package com.gis.cms.tree;
 
-import com.gis.cms.entity.po.CommentEntity;
+import com.gis.cms.entity.vo.CommentVo;
 import com.gis.cms.tree.vo.CommentTree;
+import lombok.extern.slf4j.Slf4j;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
 
+@Slf4j
 public class CommentTreeUtil {
 
     private List<CommentTree> resultNodes = new ArrayList<CommentTree>();//树形结构排序之后list内容
@@ -13,11 +16,17 @@ public class CommentTreeUtil {
     private List<CommentTree> nodes = new ArrayList<CommentTree>();
     //传入list参数
 
-    public CommentTreeUtil(List<CommentEntity> nodesList) {//通过构造函数初始化
-        for (CommentEntity n : nodesList) {
+    //过滤敏感词
+
+    public CommentTreeUtil(List<CommentVo> nodesList, Set<String> filterKey) {//通过构造函数初始化
+
+        for (CommentVo n : nodesList) {
             CommentTree treeGrid = new CommentTree();
             treeGrid.setId(n.getId());
             treeGrid.setContent(n.getContent());
+            // 过滤敏感内容
+            treeGrid.setContent(getFilterMsg(filterKey, n.getContent()));
+
 
 //            treeGrid.setRealName(n.getRealName());
             treeGrid.setCreateTime(n.getCreateTime());
@@ -86,6 +95,20 @@ public class CommentTreeUtil {
         return children;
     }
 
+
+    /**
+     * 过滤敏感内容
+     * @param filterKey 敏感词集合
+     * @param content 过滤内容
+     * @return
+     */
+    private String getFilterMsg(Set<String> filterKey, String content){
+        for (String s : filterKey) {
+            content =  content.replaceAll(s, "**");
+        }
+        return content;
+    }
+
 //    public List<CommentTree> buildTree(List<SysResourceEntity> all, List<SysResourceEntity> in) {
 //        for (SysResourceEntity n : all) {
 //            CommentTree treeGrid = new CommentTree();

+ 6 - 1
gis_common/pom.xml

@@ -113,7 +113,12 @@
             <artifactId>jjwt</artifactId>
         </dependency>
 
-
+        <!-- 对象拷贝 -->
+        <dependency>
+            <groupId>cglib</groupId>
+            <artifactId>cglib</artifactId>
+            <version>3.2.5</version>
+        </dependency>
 
     </dependencies>
 

+ 4 - 0
gis_common/src/main/java/com/gis/common/base/service/IBaseService.java

@@ -1,5 +1,6 @@
 package com.gis.common.base.service;
 
+import com.gis.common.util.Result;
 import com.github.pagehelper.PageInfo;
 import tk.mybatis.mapper.entity.Condition;
 
@@ -44,4 +45,7 @@ public interface IBaseService<T, ID extends Serializable> {
 
     public abstract PageInfo<T> findAll(Condition condition, int pageNum, int pageSize, String orderBy);
 
+    public abstract Result redisDel(String key);
+
+
 }

+ 16 - 9
gis_common/src/main/java/com/gis/common/base/service/impl/IBaseServiceImpl.java

@@ -7,6 +7,8 @@ import com.gis.common.constant.ConfigConstant;
 import com.gis.common.base.mapper.IBaseMapper;
 import com.gis.common.util.FileUtils;
 import com.gis.common.util.JwtUtil;
+import com.gis.common.util.RedisUtil;
+import com.gis.common.util.Result;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import lombok.extern.slf4j.Slf4j;
@@ -37,12 +39,11 @@ public abstract class IBaseServiceImpl<T extends BaseEntity, ID extends Serializ
     @Autowired
     public FileUtils fileUtils;
 
-//    @Resource
     @Autowired
     public HttpServletRequest request;
 
     @Autowired
-    public RedisTemplate<String, String> redisTemplate;
+    public RedisUtil redisUtil;
 
 
     public abstract IBaseMapper<T, ID> getBaseMapper();
@@ -197,6 +198,12 @@ public abstract class IBaseServiceImpl<T extends BaseEntity, ID extends Serializ
     }
 
 
+    public Result redisDel(String key){
+        redisUtil.del(key);
+        return Result.success();
+    }
+
+
     /**
      * 设置请求分页数据
      */
@@ -214,24 +221,24 @@ public abstract class IBaseServiceImpl<T extends BaseEntity, ID extends Serializ
 
     /** 获取用户id*/
     public Long getTokenUserId(){
-        return JwtUtil.getUserId(getToken(request));
+        return JwtUtil.getUserId(getToken());
     }
 
     public List getTokenRole(){
-        return JwtUtil.getUserRole(getToken(request));
+        return JwtUtil.getUserRole(getToken());
     }
 
 
     /** 获取用户名称*/
-   public String getTokenUserName(HttpServletRequest request){
-        return JwtUtil.getUsername(getToken(request));
+   public String getTokenUserName(){
+        return JwtUtil.getUsername(getToken());
     }
 
 
     /** 获取header token */
-    public String getToken(HttpServletRequest request){
-        return request.getHeader("token");
-    }
+//    public String getToken(){
+//        return request.getHeader("token");
+//    }
 
     public String getToken(){
         return request.getHeader("token");

+ 78 - 0
gis_common/src/main/java/com/gis/common/util/ConvertUtils.java

@@ -0,0 +1,78 @@
+package com.gis.common.util;
+
+import net.sf.cglib.beans.BeanCopier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * @Description:(对象拷贝 - 性能比较好)   
+ * @author: ma wei long
+ * @date:   2020年6月17日 下午5:07:58
+ */
+public class ConvertUtils {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ConvertUtils.class);
+
+    public static <S, T> T convert(S source, Class<T> dest, Function<T, T> function) {
+        if (source == null) {
+            return null;
+        }
+        try {
+            T result = dest.newInstance();
+            final BeanCopier copier = BeanCopier.create(source.getClass(), dest, false);
+            copier.copy(source, result, null);
+            if (function != null) {
+                function.apply(result);
+            }
+            return result;
+        } catch (Exception e) {
+            LOGGER.error("convert error", e);
+        }
+        return null;
+    }
+
+    public static <S, T> T convert(S source, Class<T> dest) {
+        return convert(source, dest, null);
+    }
+
+    public static <S, T> T convert(S source, T dest) {
+        if (source == null || dest == null) {
+            return null;
+        }
+        T result = dest;
+        final BeanCopier copier = BeanCopier.create(source.getClass(), dest.getClass(), false);
+        copier.copy(source, result, null);
+        return result;
+    }
+
+    public static <S, T> List<T> convertList(List<S> source, Class<T> dest) {
+        return convertList(source, dest, null);
+    }
+
+    public static <S, T> List<T> convertList(List<S> source, Class<T> dest, ConvertCallback<S, T> callback) {
+        if (source == null) {
+            return null;
+        }
+        return source.stream().map(s -> {
+            T result = null;
+            try {
+                result = dest.newInstance();
+                convert(s, result);
+                if (callback != null) {
+                    callback.callback(s, result);
+                }
+            } catch (InstantiationException | IllegalAccessException e) {
+                LOGGER.error("convert error", e);
+            }
+            return result;
+        }).collect(Collectors.toList());
+    }
+
+    public interface ConvertCallback<S, D> {
+        void callback(S source, D dest);
+    }
+}

+ 88 - 0
gis_common/src/main/java/com/gis/common/util/RedisUtil.java

@@ -0,0 +1,88 @@
+package com.gis.common.util;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by owen on 2021/7/9 0009 14:32
+ */
+@Component
+public class RedisUtil {
+
+//    @Autowired
+    @Resource
+    private RedisTemplate<String, Object> redisTemplate;
+
+
+    /**
+     * 普通缓存放入并设置时间
+     *
+     * @param key   键
+     * @param value 值
+     * @param time  时间(秒) time要大于0 如果time小于等于0 将设置无限期
+     * @return true成功 false 失败
+     */
+    public boolean set(String key, Object value, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
+            } else {
+                set(key, value);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 普通缓存放入
+     *
+     * @param key   键
+     * @param value 值
+     * @return true成功 false失败
+     */
+    public boolean set(String key, Object value) {
+        try {
+            redisTemplate.opsForValue().set(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+
+    }
+
+    /**
+     * 删除缓存
+     *
+     * @param key 可以传一个值 或多个
+     */
+    @SuppressWarnings("unchecked")
+    public void del(String... key) {
+        if (key != null && key.length > 0) {
+            if (key.length == 1) {
+                redisTemplate.delete(key[0]);
+            } else {
+                redisTemplate.delete(CollectionUtils.arrayToList(key));
+            }
+        }
+    }
+
+
+    /**
+     * 普通缓存获取
+     *
+     * @param key 键
+     * @return 值
+     */
+    public Object get(String key) {
+        return key == null ? null : redisTemplate.opsForValue().get(key);
+    }
+}