Sfoglia il codice sorgente

改造用户体系和权限

459242451@qq.com 3 anni fa
parent
commit
1fc76907f9
22 ha cambiato i file con 573 aggiunte e 101 eliminazioni
  1. 28 6
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/zhdd/IncidentController.java
  2. 16 0
      ruoyi-common/src/main/java/com/ruoyi/common/annotation/Security.java
  3. 2 0
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java
  4. 4 0
      ruoyi-framework/pom.xml
  5. 6 0
      ruoyi-framework/src/main/java/com/ruoyi/framework/config/FeignConfig.java
  6. 4 0
      ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
  7. 152 0
      ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/SecurityInterceptor.java
  8. 53 42
      ruoyi-framework/src/main/java/com/ruoyi/framework/mybatisplus/CreateAndUpdateMetaObjectHandler.java
  9. 4 7
      ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java
  10. 62 28
      ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java
  11. 46 0
      ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserUtil.java
  12. 5 5
      ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml
  13. 4 4
      ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml
  14. 3 1
      ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
  15. 22 0
      ruoyi-zhdd/src/main/java/com/ruoyi/zhdd/domain/GatewayUserDetail.java
  16. 37 0
      ruoyi-zhdd/src/main/java/com/ruoyi/zhdd/domain/bo/BacklogMessagePushBo.java
  17. 2 3
      ruoyi-zhdd/src/main/java/com/ruoyi/zhdd/domain/bo/IncidentBo.java
  18. 26 0
      ruoyi-zhdd/src/main/java/com/ruoyi/zhdd/feign/FeignBacklogInfoService.java
  19. 26 0
      ruoyi-zhdd/src/main/java/com/ruoyi/zhdd/feign/FeignUserManageService.java
  20. 22 0
      ruoyi-zhdd/src/main/java/com/ruoyi/zhdd/feign/fallback/FeignBacklogInfoFallback.java
  21. 24 0
      ruoyi-zhdd/src/main/java/com/ruoyi/zhdd/feign/fallback/FeignUserManageFallback.java
  22. 25 5
      sql/20211209修改.sql

+ 28 - 6
ruoyi-admin/src/main/java/com/ruoyi/web/controller/zhdd/IncidentController.java

@@ -12,15 +12,22 @@ import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.annotation.Security;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.entity.SysDept;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.core.validate.AddGroup;
 import com.ruoyi.common.core.validate.EditGroup;
 import com.ruoyi.common.core.validate.QueryGroup;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.web.service.UserUtil;
+import com.ruoyi.system.service.ISysDeptService;
 import com.ruoyi.system.service.ISysDictDataService;
+import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.zhdd.domain.Incident;
 import com.ruoyi.zhdd.domain.IncidentProcess;
 import com.ruoyi.zhdd.domain.IncidentTaskCommand;
@@ -95,6 +102,10 @@ public class IncidentController extends BaseController {
 
     private final IResourceDetailService resourceDetailService;
 
+    private final ISysUserService sysUserService;
+
+    private final ISysDeptService sysDeptService;
+
     @Value("${spring.profiles.active}")
     private String env;
 
@@ -104,6 +115,7 @@ public class IncidentController extends BaseController {
     @ApiOperation("查询事件基础列表")
 //    @PreAuthorize("@ss.hasPermi('zhdd:incident:list')")
     @GetMapping("/list")
+    @Security
     public TableDataInfo<IncidentVo> list(@Validated(QueryGroup.class) IncidentBo bo) {
         return iIncidentService.queryPageList(bo);
     }
@@ -126,6 +138,7 @@ public class IncidentController extends BaseController {
     @ApiOperation("获取事件基础详细信息")
 //    @PreAuthorize("@ss.hasPermi('zhdd:incident:query')")
     @GetMapping("/{id}")
+    @Security
     public AjaxResult<Map<String, Object>> getInfo(@NotNull(message = "主键不能为空")
                                                    @PathVariable("id") String id) {
         Map<String, Object> map = new HashMap<>();
@@ -134,6 +147,15 @@ public class IncidentController extends BaseController {
         if (incidentVo == null) {
             return AjaxResult.success(map);
         }
+        // 查询上报人、上报组织信息
+        SysUser sysUser = sysUserService.selectUserByUserName(incidentVo.getCreateBy());
+        if (sysUser != null) {
+            incidentVo.setCreateBy(sysUser.getNickName());
+        }
+        SysDept sysDept = sysDeptService.selectDeptById(incidentVo.getCreateDept());
+        if (sysDept != null) {
+            incidentVo.setCreateDept(sysDept.getDeptName());
+        }
         map.put("baseInfo", incidentVo);
         // 查询所属预案
         List<PlanVo> voOne = planService.listVo(Wrappers.<Plan>lambdaQuery().eq(Plan::getType, incidentVo.getType()).eq(Plan::getCreateDept, incidentVo.getCreateDept()));
@@ -172,12 +194,6 @@ public class IncidentController extends BaseController {
                                 }
                             }
                             // 循环完之后,去除最后一个顿号
-                            /*if (StrUtil.isNotBlank(unMessage)) {
-                                unMessage = StrUtil.removeSuffix(unMessage, "、");
-                            }
-                            if (StrUtil.isNotBlank(message)) {
-                                message = StrUtil.removeSuffix(message, "、");
-                            }*/
                             incidentProcess.setUserRead(message.toString());
                             incidentProcess.setUserUnRead(unMessage.toString());
                         }
@@ -199,9 +215,14 @@ public class IncidentController extends BaseController {
 //    @Log(title = "事件基础", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
+    @Security
     public AjaxResult<Void> add(@Validated(AddGroup.class) @RequestBody IncidentBo bo) {
         // 新增初始化为预警状态
         bo.setStatus(1);
+        LoginUser cacheLoginUser = UserUtil.getCacheLoginUser();
+        bo.setCreateBy(cacheLoginUser.getUsername());
+        bo.setCreateDept(cacheLoginUser.getUser().getOrgId());
+        bo.setExpr1(cacheLoginUser.getUser().getPhonenumber());
         return toAjax(iIncidentService.insertByBo(bo) ? 1 : 0);
     }
 
@@ -213,6 +234,7 @@ public class IncidentController extends BaseController {
 //    @Log(title = "事件基础", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
+    @Security
     public AjaxResult<Void> edit(@Validated(EditGroup.class) @RequestBody IncidentBo bo) {
         return toAjax(iIncidentService.updateByBo(bo) ? 1 : 0);
     }

+ 16 - 0
ruoyi-common/src/main/java/com/ruoyi/common/annotation/Security.java

@@ -0,0 +1,16 @@
+package com.ruoyi.common.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Inherited
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.METHOD, ElementType.TYPE})// 让该注解可以注解在方法和类上
+public @interface Security {
+    boolean dept() default true;
+
+    boolean role() default true;
+}

+ 2 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java

@@ -75,6 +75,8 @@ public class LoginUser implements UserDetails {
 
     private Boolean suQian = false;
 
+    private String userRole;
+
     /**
      * 用户信息
      */

+ 4 - 0
ruoyi-framework/pom.xml

@@ -66,6 +66,10 @@
             <groupId>com.ruoyi</groupId>
             <artifactId>ruoyi-system</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-zhdd</artifactId>
+        </dependency>
 
         <dependency>
             <groupId>com.alibaba.cloud</groupId>

+ 6 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/config/FeignConfig.java

@@ -1,5 +1,6 @@
 package com.ruoyi.framework.config;
 
+import cn.hutool.core.util.StrUtil;
 import com.ruoyi.framework.config.properties.TokenProperties;
 import feign.Contract;
 import feign.Feign;
@@ -48,10 +49,15 @@ public class FeignConfig {
                 log.info("Feign request: {}", request.getRequestURI());
                 // 将token信息放入header中
                 String token = request.getHeader(tokenProperties.getHeader());
+                String user = request.getHeader("user");
                 if (token == null || "".equals(token)) {
                     token = request.getParameter("token");
                 }
+                if (StrUtil.isBlank(user)) {
+                    user = request.getParameter("user");
+                }
                 requestTemplate.header(tokenProperties.getHeader(), token);
+                requestTemplate.header("user", user);
             }
         };
     }

+ 4 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java

@@ -1,6 +1,7 @@
 package com.ruoyi.framework.config;
 
 import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor;
+import com.ruoyi.framework.interceptor.SecurityInterceptor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
@@ -21,6 +22,8 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 public class ResourcesConfig implements WebMvcConfigurer {
     @Autowired
     private RepeatSubmitInterceptor repeatSubmitInterceptor;
+    @Autowired
+    private SecurityInterceptor securityInterceptor;
     @Value("${spring.profiles.active}")
     private String env;
 
@@ -34,6 +37,7 @@ public class ResourcesConfig implements WebMvcConfigurer {
     @Override
     public void addInterceptors(InterceptorRegistry registry) {
         registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**");
+        registry.addInterceptor(securityInterceptor).addPathPatterns("/**");
     }
 
     /**

+ 152 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/SecurityInterceptor.java

@@ -0,0 +1,152 @@
+package com.ruoyi.framework.interceptor;
+
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.useragent.UserAgent;
+import cn.hutool.http.useragent.UserAgentUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.ruoyi.common.annotation.Security;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.RedisUtils;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.ServletUtils;
+import com.ruoyi.common.utils.ip.AddressUtils;
+import com.ruoyi.framework.web.service.SysPermissionService;
+import com.ruoyi.system.service.ISysUserService;
+import com.ruoyi.zhdd.domain.GatewayUserDetail;
+import com.ruoyi.zhdd.feign.FeignUserManageService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.net.URLDecoder;
+import java.util.Date;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @Description: TODO
+ * @Author: huangcheng
+ * @Date: 2022/2/23
+ * @Version V1.0
+ */
+@Component
+@Slf4j
+public class SecurityInterceptor implements HandlerInterceptor {
+
+    @Autowired
+    private ISysUserService userService;
+    @Autowired
+    private SysPermissionService permissionService;
+    @Autowired
+    private FeignUserManageService feignUserManageService;
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        /**
+         * handler保存了本次请求的controller也就是接口方法的一些信息,如类,方法,参数等
+         * 如果是一次静态资源的请求则该handler不应该是HandlerMethod的实现类
+         * 判断是否是一个正常的接口,如果是则进行鉴权操作,不是则直接放行
+         */
+        if (handler instanceof HandlerMethod) {
+            HandlerMethod handlerMethod = (HandlerMethod) handler;// 把handler强转为HandlerMethod
+            // 从handlerMethod中获取本次请求的接口方法对象然后判断该方法上是否标有我们自定义的注解@Security
+            Security security = handlerMethod.getMethod().getAnnotation(Security.class);
+            if (null != security) {
+                // 对用户进行鉴权
+                String userStr = request.getHeader("user");
+                if (StrUtil.isBlank(userStr)) {
+                    throw new ServiceException("请重新登录系统!", 90000);
+                }
+                userStr = URLDecoder.decode(userStr, "UTF-8");
+                JSONObject userJsonObject = JSONUtil.parseObj(userStr);
+                String id = userJsonObject.getStr("id");
+                log.info("userJsonObject:{}", userJsonObject);
+                // 先从缓存中获取
+                String userKey = Constants.LOGIN_TOKEN_KEY + id;
+                LoginUser user = RedisUtils.getCacheObject(userKey);
+                if (user != null) {
+                    RedisUtils.expire(userKey, 120, TimeUnit.MINUTES);
+                    return true;
+                }
+                // 如果缓存中没有的话,则先查询我们的数据库是否存在,如果不存在则查询四维用户是否存在
+                SysUser sysUser = userService.selectUserById(id);
+                if (sysUser != null) {
+                    if (StrUtil.isBlank(sysUser.getDeptId())) {
+                        throw new ServiceException("请联系应急事件处置系统管理员分配组织", 90001);
+                    }
+                    // 查询当前用户角色
+                    SysUser userRole = new SysUser();
+                    userRole.setUserId(id);
+                    Set<String> roles = permissionService.getRolePermission(userRole);
+                    if (roles.isEmpty()) {
+                        throw new ServiceException("请联系应急事件处置系统管理员分配权限", 90002);
+                    }
+                    user = new LoginUser(sysUser.getUserId(), sysUser.getDeptId(), sysUser, permissionService.getMenuPermission(sysUser));
+                    user.setUserRole(roles.iterator().next());
+                    setUserAgent(user);
+                    user.setSuQian(true);
+                    RedisUtils.setCacheObject(userKey, user, 120, TimeUnit.MINUTES);
+                    return true;
+                }
+                // 查询四维用户
+                GatewayUserDetail gatewayUserDetail = feignUserManageService.userDetail(id);
+                log.info("四维用户详情:{}", gatewayUserDetail);
+                // 如果非空则新增到数据库
+                if (gatewayUserDetail.getCode() == 200 && gatewayUserDetail.getData() != null && StrUtil.isNotBlank(gatewayUserDetail.getData().getUserId())) {
+                    GatewayUserDetail.UserDetail data = gatewayUserDetail.getData();
+                    SysUser newUser = new SysUser();
+                    newUser.setUserId(data.getUserId());
+                    newUser.setUserName(data.getUserName());
+                    newUser.setNickName(data.getName());
+                    newUser.setUserType(Convert.toStr(data.getUserGroupId()));
+                    newUser.setPhonenumber(data.getMobile());
+                    newUser.setPassword(SecurityUtils.encryptPassword("tocc!suqian"));
+                    newUser.setStatus("0");
+                    newUser.setDelFlag("0");
+                    newUser.setUpdateBy("gateway");
+                    newUser.setUpdateTime(new Date());
+                    newUser.setCreateBy("gateway");
+                    newUser.setCreateTime(new Date());
+                    userService.insertUser(newUser);
+                    throw new ServiceException("请联系应急事件处置系统管理员分配组织及权限");
+                } else {
+                    throw new ServiceException("该用户不存在,请重新登录");
+                }
+            }
+            return true;
+        }
+        return true;
+    }
+
+    @Override
+    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
+        throws Exception {
+
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
+        throws Exception {
+
+    }
+
+    private void setUserAgent(LoginUser loginUser) {
+        UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent"));
+        String ip = ServletUtils.getClientIP();
+        loginUser.setIpaddr(ip);
+        loginUser.setLoginLocation(AddressUtils.getRealAddressByIP(ip));
+        loginUser.setBrowser(userAgent.getBrowser().getName());
+        loginUser.setOs(userAgent.getOs().getName());
+    }
+
+}

+ 53 - 42
ruoyi-framework/src/main/java/com/ruoyi/framework/mybatisplus/CreateAndUpdateMetaObjectHandler.java

@@ -4,7 +4,7 @@ import cn.hutool.http.HttpStatus;
 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
 import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.exception.ServiceException;
-import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.web.service.UserUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.reflection.MetaObject;
 
@@ -19,48 +19,59 @@ import java.util.Date;
 @Slf4j
 public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler {
 
-	@Override
-	public void insertFill(MetaObject metaObject) {
-		try {
-			//根据属性名字设置要填充的值
-			if (metaObject.hasGetter("createTime")) {
-				this.setFieldValByName("createTime", new Date(), metaObject);
-			}
-			if (metaObject.hasGetter("createBy")) {
-				this.setFieldValByName("createBy", getLoginUsername(), metaObject);
-			}
-		} catch (Exception e) {
-			throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);
-		}
-		updateFill(metaObject);
-	}
+    @Override
+    public void insertFill(MetaObject metaObject) {
+        try {
+            //根据属性名字设置要填充的值
+            if (metaObject.hasGetter("createTime")) {
+                this.setFieldValByName("createTime", new Date(), metaObject);
+            }
+            if (metaObject.hasGetter("createBy")) {
+                this.setFieldValByName("createBy", getLoginUsername(), metaObject);
+            }
+        } catch (Exception e) {
+            throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);
+        }
+        updateFill(metaObject);
+    }
 
-	@Override
-	public void updateFill(MetaObject metaObject) {
-		try {
-			if (metaObject.hasGetter("updateBy")) {
-				this.setFieldValByName("updateBy", getLoginUsername(), metaObject);
-			}
-			if (metaObject.hasGetter("updateTime")) {
-				this.setFieldValByName("updateTime", new Date(), metaObject);
-			}
-		} catch (Exception e) {
-			throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);
-		}
-	}
+    @Override
+    public void updateFill(MetaObject metaObject) {
+        try {
+            if (metaObject.hasGetter("updateBy")) {
+                this.setFieldValByName("updateBy", getLoginUsername(), metaObject);
+            }
+            if (metaObject.hasGetter("updateTime")) {
+                this.setFieldValByName("updateTime", new Date(), metaObject);
+            }
+        } catch (Exception e) {
+            throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);
+        }
+    }
 
-	/**
-	 * 获取登录用户名
-	 */
-	private String getLoginUsername() {
-		LoginUser loginUser;
-		try {
-			loginUser = SecurityUtils.getLoginUser();
-		} catch (Exception e) {
-			log.error("自动注入警告 => 用户未登录");
-			return null;
-		}
-		return loginUser.getUsername();
-	}
+    /**
+     * 获取登录用户名
+     */
+    private String getLoginUsername() {
+        LoginUser loginUser;
+        try {
+//			loginUser = SecurityUtils.getLoginUser();
+            loginUser = UserUtil.getCacheLoginUser();
+//            String userStr = ServletUtils.getRequest().getHeader("user");
+//            if (StrUtil.isBlank(userStr)) {
+//                throw new ServiceException("请重新登录系统!", 90000);
+//            }
+//            userStr = URLDecoder.decode(userStr, "UTF-8");
+//            JSONObject userJsonObject = JSONUtil.parseObj(userStr);
+//            String id = userJsonObject.getStr("id");
+//            // 先从缓存中获取
+//            String userKey = Constants.LOGIN_TOKEN_KEY + id;
+//            loginUser = RedisUtils.getCacheObject(userKey);
+        } catch (Exception e) {
+            log.error("自动注入警告 => 用户未登录");
+            return null;
+        }
+        return loginUser.getUsername();
+    }
 
 }

+ 4 - 7
ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java

@@ -1,17 +1,16 @@
 package com.ruoyi.framework.security.handle;
 
-import com.ruoyi.common.utils.StringUtils;
 import cn.hutool.http.HttpStatus;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.utils.JsonUtils;
 import com.ruoyi.common.utils.ServletUtils;
+import com.ruoyi.common.utils.StringUtils;
 import org.springframework.security.core.AuthenticationException;
 import org.springframework.security.web.AuthenticationEntryPoint;
 import org.springframework.stereotype.Component;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
 import java.io.Serializable;
 
 /**
@@ -20,14 +19,12 @@ import java.io.Serializable;
  * @author ruoyi
  */
 @Component
-public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint, Serializable
-{
+public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint, Serializable {
     private static final long serialVersionUID = -8970718410437077606L;
 
     @Override
-    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e)
-            throws IOException
-    {
+    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) {
+        System.out.println("=======" + response.getStatus());
         int code = HttpStatus.HTTP_UNAUTHORIZED;
         String msg = StringUtils.format("请求访问:{},认证失败,无法访问系统资源", request.getRequestURI());
         ServletUtils.renderString(response, JsonUtils.toJsonString(AjaxResult.error(code, msg)));

+ 62 - 28
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java

@@ -1,21 +1,17 @@
 package com.ruoyi.framework.web.service;
 
-import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.IdUtil;
-import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.useragent.UserAgent;
 import cn.hutool.http.useragent.UserAgentUtil;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
 import com.ruoyi.common.constant.Constants;
-import com.ruoyi.common.core.domain.GatewayUser;
-import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.utils.RedisUtils;
 import com.ruoyi.common.utils.ServletUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.ip.AddressUtils;
 import com.ruoyi.framework.config.properties.TokenProperties;
+import com.ruoyi.system.service.ISysUserService;
+import com.ruoyi.zhdd.feign.FeignUserManageService;
 import io.jsonwebtoken.Claims;
 import io.jsonwebtoken.Jwts;
 import io.jsonwebtoken.SignatureAlgorithm;
@@ -25,7 +21,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import javax.servlet.http.HttpServletRequest;
-import java.net.URLDecoder;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
@@ -47,6 +42,12 @@ public class TokenService {
 
     @Autowired
     private TokenProperties tokenProperties;
+    @Autowired
+    private ISysUserService userService;
+    @Autowired
+    private SysPermissionService permissionService;
+    @Autowired
+    private FeignUserManageService feignUserManageService;
 
     /**
      * 获取用户身份信息
@@ -55,28 +56,48 @@ public class TokenService {
      */
     @SneakyThrows
     public LoginUser getLoginUser(HttpServletRequest request) {
-        // 获取请求携带的令牌
-        String token = getToken(request);
-        if (StringUtils.isNotEmpty(token)) {
-            try {
-                Claims claims = parseToken(token);
-                // 解析对应的权限以及用户信息
-                String uuid = (String) claims.get(Constants.LOGIN_USER_KEY);
-                String userKey = getTokenKey(uuid);
-                LoginUser user = RedisUtils.getCacheObject(userKey);
+        /*String userStr = request.getHeader("user");
+        if (StrUtil.isNotBlank(userStr)) {
+            userStr = URLDecoder.decode(userStr, "UTF-8");
+            JSONObject userJsonObject = JSONUtil.parseObj(userStr);
+            JSONObject principalObject = userJsonObject.getJSONObject("principal");
+            String id = userJsonObject.getStr("id");
+            log.info("userJsonObject:{}", userJsonObject);
+            log.info("principalObject:{}", principalObject);
+            // 先从缓存中获取
+            String userKey = getTokenKey(id);
+            LoginUser user = RedisUtils.getCacheObject(userKey);
+            if (user != null) {
+                return user;
+            }
+            // 如果缓存中没有的话,则先查询我们的数据库是否存在,如果不存在则查询四维用户是否存在
+            SysUser sysUser = userService.selectUserById(id);
+            if (sysUser != null) {
+                if (StrUtil.isBlank(sysUser.getDeptId())) {
+                    throw new ServiceException("请联系应急事件处置系统管理员分配组织", 90000);
+                }
+                // 查询当前用户角色
+                SysUser userRole = new SysUser();
+                userRole.setUserId(id);
+                Set<String> roles = permissionService.getRolePermission(userRole);
+                if (roles.isEmpty()) {
+                    throw new AuthenticationServiceException("请联系应急事件处置系统管理员分配权限");
+                }
+                user = new LoginUser(sysUser.getUserId(), sysUser.getDeptId(), sysUser, permissionService.getMenuPermission(sysUser));
+                user.setUserRole(roles.iterator().next());
+                setUserAgent(user);
+                user.setSuQian(true);
+                RedisUtils.setCacheObject(userKey, user, tokenProperties.getExpireTime(), TimeUnit.MINUTES);
                 return user;
-            } catch (Exception e) {
-
             }
-        } else {
-            // 获取网关传过来的用户信息
-            String userStr = request.getHeader("user");
-            if (StrUtil.isNotBlank(userStr)) {
-                userStr = URLDecoder.decode(userStr, "UTF-8");
-                JSONObject userJsonObject = JSONUtil.parseObj(userStr);
-                JSONObject principalObject = userJsonObject.getJSONObject("principal");
-                GatewayUser userDTO = new GatewayUser();
-                userDTO.setUserId(userJsonObject.getStr("id"));
+            // 查询四维用户
+            GatewayUserDetail gatewayUserDetail = feignUserManageService.userDetail(id);
+            log.info("四维用户详情:{}", gatewayUserDetail);
+            throw new AuthenticationServiceException("请联系应急事件处置系统管理员分配组织及权限");
+
+
+                *//*GatewayUser userDTO = new GatewayUser();
+                userDTO.setUserId(id);
                 userDTO.setUserGroupId(userJsonObject.getStr("user_group_id"));
                 if (principalObject != null) {
                     userDTO.setUsername(principalObject.getStr("userName"));
@@ -94,7 +115,20 @@ public class TokenService {
                 loginUser.setDeptId(userDTO.getOrgId());
                 loginUser.setUser(sysUser);
                 loginUser.setSuQian(true);
-                return loginUser;
+                return loginUser;*//*
+        }*/
+        // 获取请求携带的令牌
+        String token = getToken(request);
+        if (StringUtils.isNotEmpty(token)) {
+            try {
+                Claims claims = parseToken(token);
+                // 解析对应的权限以及用户信息
+                String uuid = (String) claims.get(Constants.LOGIN_USER_KEY);
+                String userKey = getTokenKey(uuid);
+                LoginUser user = RedisUtils.getCacheObject(userKey);
+                return user;
+            } catch (Exception e) {
+
             }
         }
         return null;

+ 46 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserUtil.java

@@ -0,0 +1,46 @@
+package com.ruoyi.framework.web.service;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.RedisUtils;
+import com.ruoyi.common.utils.ServletUtils;
+import lombok.SneakyThrows;
+
+import java.net.URLDecoder;
+
+/**
+ * @Description: TODO
+ * @Author: huangcheng
+ * @Date: 2022/2/24
+ * @Version V1.0
+ */
+public class UserUtil {
+
+    /**
+     * 从缓存中取用户信息
+     *
+     * @return
+     */
+    @SneakyThrows
+    public static LoginUser getCacheLoginUser() {
+        String userStr = ServletUtils.getRequest().getHeader("user");
+        if (StrUtil.isBlank(userStr)) {
+            throw new ServiceException("请重新登录系统!", 90000);
+        }
+        userStr = URLDecoder.decode(userStr, "UTF-8");
+        JSONObject userJsonObject = JSONUtil.parseObj(userStr);
+        String id = userJsonObject.getStr("id");
+        // 先从缓存中获取
+        String userKey = Constants.LOGIN_TOKEN_KEY + id;
+        LoginUser user = RedisUtils.getCacheObject(userKey);
+        if (ObjectUtil.isNull(user)) {
+            throw new ServiceException("登录失效,请重新登录-90004");
+        }
+        return user;
+    }
+}

+ 5 - 5
ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper
-        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.system.mapper.SysMenuMapper">
 
     <resultMap type="SysMenu" id="SysMenuResult">
@@ -71,7 +71,7 @@
     <select id="selectMenuListByUserId" parameterType="SysMenu" resultMap="SysMenuResult">
         select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.visible, m.status,
         coalesce(m.perms,'') as perms
-                        , m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
+        , m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
         from sys_menu m
         left join sys_role_menu rm on m.menu_id = rm.menu_id
         left join sys_user_role ur on rm.role_id = ur.role_id
@@ -89,7 +89,7 @@
         order by m.parent_id, m.order_num
     </select>
 
-    <select id="selectMenuTreeByUserId" parameterType="Long" resultMap="SysMenuResult">
+    <select id="selectMenuTreeByUserId" parameterType="string" resultMap="SysMenuResult">
         select distinct m.menu_id,
                         m.parent_id,
                         m.menu_name,
@@ -136,7 +136,7 @@
                  left join sys_user_role ur on rm.role_id = ur.role_id
     </select>
 
-    <select id="selectMenuPermsByUserId" parameterType="Long" resultType="String">
+    <select id="selectMenuPermsByUserId" parameterType="string" resultType="String">
         select distinct m.perms
         from sys_menu m
                  left join sys_role_menu rm on m.menu_id = rm.menu_id

+ 4 - 4
ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper
-        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.system.mapper.SysPostMapper">
 
     <resultMap type="SysPost" id="SysPostResult">
@@ -29,7 +29,7 @@
         from sys_post
     </sql>
 
-    <select id="selectPostListByUserId" parameterType="Long" resultType="Integer">
+    <select id="selectPostListByUserId" parameterType="string" resultType="Integer">
         select p.post_id
         from sys_post p
                  left join sys_user_post up on up.post_id = p.post_id
@@ -45,4 +45,4 @@
         where u.user_name = #{userName}
     </select>
 
-</mapper> 
+</mapper>

+ 3 - 1
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -24,6 +24,7 @@
         <result property="updateTime" column="update_time"/>
         <result property="remark" column="remark"/>
         <result property="otherId" column="other_id"/>
+        <result property="orgId" column="org_id"/>
         <association property="dept" column="dept_id" javaType="SysDept" resultMap="deptResult"/>
         <collection property="roles" javaType="java.util.List" resultMap="RoleResult"/>
     </resultMap>
@@ -75,6 +76,7 @@
                r.role_sort,
                r.data_scope,
                u.other_id,
+               u.org_id,
                r.status as role_status
         from sys_user u
                  left join sys_dept d on u.dept_id = d.dept_id
@@ -198,7 +200,7 @@
         where u.user_name = #{userName}
     </select>
 
-    <select id="selectUserById" parameterType="Long" resultMap="SysUserResult">
+    <select id="selectUserById" parameterType="string" resultMap="SysUserResult">
         <include refid="selectUserVo"/>
         where u.user_id = #{userId}
     </select>

+ 22 - 0
ruoyi-zhdd/src/main/java/com/ruoyi/zhdd/domain/GatewayUserDetail.java

@@ -0,0 +1,22 @@
+package com.ruoyi.zhdd.domain;
+
+import lombok.Data;
+
+@Data
+public class GatewayUserDetail {
+    private Integer code;
+    private String message;
+    private UserDetail data;
+
+    @Data
+    public static class UserDetail {
+        private String userId;
+        private String name;
+        private String userName;
+        private String roleId;
+        private String orgId;
+        private String idNumber;
+        private String mobile;
+        private int userGroupId;
+    }
+}

+ 37 - 0
ruoyi-zhdd/src/main/java/com/ruoyi/zhdd/domain/bo/BacklogMessagePushBo.java

@@ -0,0 +1,37 @@
+package com.ruoyi.zhdd.domain.bo;
+
+import cn.hutool.core.date.DateUtil;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Description: 待办消息请求体
+ * @Author: huangcheng
+ * @Date: 2022/1/12
+ * @Version V1.0
+ */
+@Data
+public class BacklogMessagePushBo {
+    private String uuid;
+    // 标题(必填)
+    private String title;
+    // 内容(必填)
+    private String text;
+    // 发送部门/人
+    private String department;
+    // 待办类型(华设固定给“3”)
+    private String type = "3";
+    // 备注 (访问详情页面预留的参数,例如activity)
+    private String note;
+    // 下发时间
+    private String createTime = DateUtil.now();
+    // 附件URL
+    private String accessory;
+    // ”状态”, 0:未办 1:已办(必填0)
+    private String status = "0";
+    // 跳转的详情页面地址
+    private String url;
+    // 发送的用户
+    private List<MessagePushUser> userId;
+}

+ 2 - 3
ruoyi-zhdd/src/main/java/com/ruoyi/zhdd/domain/bo/IncidentBo.java

@@ -8,7 +8,6 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
 import java.util.List;
 
 /**
@@ -33,14 +32,14 @@ public class IncidentBo extends BaseEntity {
      * 事件类型
      */
     @ApiModelProperty(value = "事件类型")
-    @NotNull(message = "type不能为空", groups = {AddGroup.class})
+//    @NotNull(message = "type不能为空", groups = {AddGroup.class})
     private Integer type;
 
     /**
      * 事件等级
      */
     @ApiModelProperty(value = "事件等级")
-    @NotNull(message = "level不能为空", groups = {AddGroup.class})
+//    @NotNull(message = "level不能为空", groups = {AddGroup.class})
     private Integer level;
 
     private List<Integer> levels;

+ 26 - 0
ruoyi-zhdd/src/main/java/com/ruoyi/zhdd/feign/FeignBacklogInfoService.java

@@ -0,0 +1,26 @@
+package com.ruoyi.zhdd.feign;
+
+import com.ruoyi.zhdd.domain.bo.BacklogMessagePushBo;
+import com.ruoyi.zhdd.feign.fallback.FeignNoticeInfoFallback;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * @Description: 联旺待办消息接口
+ * @Author: huangcheng
+ * @Date: 2022/1/12
+ * @Version V1.0
+ */
+@FeignClient(value = "backlog-info", fallback = FeignNoticeInfoFallback.class)
+public interface FeignBacklogInfoService {
+
+    /**
+     * 接待办事项推送口s
+     *
+     * @param backlogMessagePushBo
+     */
+    @PostMapping("/backlog")
+    void backlogMessagePush(@RequestBody BacklogMessagePushBo backlogMessagePushBo);
+
+}

+ 26 - 0
ruoyi-zhdd/src/main/java/com/ruoyi/zhdd/feign/FeignUserManageService.java

@@ -0,0 +1,26 @@
+package com.ruoyi.zhdd.feign;
+
+import com.ruoyi.zhdd.domain.GatewayUserDetail;
+import com.ruoyi.zhdd.feign.fallback.FeignUserManageFallback;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * @Description: 四维用户接口
+ * @Author: huangcheng
+ * @Date: 2022/1/12
+ * @Version V1.0
+ */
+@FeignClient(value = "tpbd-usermanager", fallback = FeignUserManageFallback.class)
+public interface FeignUserManageService {
+
+    /**
+     * 用户详情
+     *
+     * @param userId
+     */
+    @GetMapping("/user/detail")
+    GatewayUserDetail userDetail(@RequestParam(value = "userId") String userId);
+
+}

+ 22 - 0
ruoyi-zhdd/src/main/java/com/ruoyi/zhdd/feign/fallback/FeignBacklogInfoFallback.java

@@ -0,0 +1,22 @@
+package com.ruoyi.zhdd.feign.fallback;
+
+import com.ruoyi.zhdd.domain.bo.BacklogMessagePushBo;
+import com.ruoyi.zhdd.feign.FeignBacklogInfoService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: TODO
+ * @Author: huangcheng
+ * @Date: 2022/1/12
+ * @Version V1.0
+ */
+@Slf4j
+@Component
+public class FeignBacklogInfoFallback implements FeignBacklogInfoService {
+
+    @Override
+    public void backlogMessagePush(BacklogMessagePushBo backlogMessagePushBo) {
+        log.error("待办消息发送失败");
+    }
+}

+ 24 - 0
ruoyi-zhdd/src/main/java/com/ruoyi/zhdd/feign/fallback/FeignUserManageFallback.java

@@ -0,0 +1,24 @@
+package com.ruoyi.zhdd.feign.fallback;
+
+import com.ruoyi.zhdd.domain.GatewayUserDetail;
+import com.ruoyi.zhdd.feign.FeignUserManageService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: TODO
+ * @Author: huangcheng
+ * @Date: 2022/1/12
+ * @Version V1.0
+ */
+@Slf4j
+@Component
+public class FeignUserManageFallback implements FeignUserManageService {
+
+
+    @Override
+    public GatewayUserDetail userDetail(String userId) {
+        log.error("获取用户详情失败");
+        return null;
+    }
+}

+ 25 - 5
sql/20211209修改.sql

@@ -146,8 +146,6 @@ on column b_chemical_data.name is '中文名称';
 comment
 on column b_chemical_data.content is '内容';
 
--- 以上已同步
-
 alter table b_incident_process
     add incident_status smallint;
 
@@ -156,7 +154,6 @@ on column b_incident_process.incident_status is '时间处置过程当前状态'
 
 INSERT INTO public.sys_config (config_id, config_name, config_key, config_value, config_type, create_by, create_time, update_by, update_time, remark)
 VALUES (12, '大华组织id', 'dh.device.orgId', 'S4NbecfYB1DFLAIM9FFHQ8', 'N', 'admin', '2021-09-16 03:32:56', '', null, '用于获取设备树');
--- 以上已同步
 
 alter table b_resource_detail alter column num type numeric(8,3) using num::numeric(8,3);
 
@@ -166,14 +163,33 @@ alter table b_resource_detail
 comment
 on column b_resource_detail.available_num is '可用数量';
 
--- 以上已同步
-
 alter table b_resource
     add dept_id varchar(36);
 
 comment
 on column b_resource.dept_id is '部门id';
 
+
+alter table sys_dept
+    add flag int;
+
+comment
+on column sys_dept.flag is '0机构;1部门';
+
+alter table sys_dept drop column other_id;
+
+alter table sys_dept drop column code;
+
+alter table sys_dept drop column description;
+
+alter table sys_dept drop column dept_short_name;
+
+alter table sys_dept drop column org_id;
+
+alter table sys_role_menu alter column role_id type varchar(36) using role_id::varchar(36);
+
+alter table sys_role_menu alter column menu_id type varchar(36) using menu_id::varchar(36);
+
 -- 以上已同步
 
 
@@ -181,3 +197,7 @@ on column b_resource.dept_id is '部门id';
 
 
 
+
+
+
+