Ver código fonte

Merge branch 'master' of http://116.63.33.55/git/read_opc

FinalYu 2 anos atrás
pai
commit
db49f22311
35 arquivos alterados com 1683 adições e 452 exclusões
  1. 26 0
      chuanyi_server/pom.xml
  2. 1 0
      chuanyi_server/src/main/java/com/judong/chuanyiserver/ChuanyiServerApplication.java
  3. 13 0
      chuanyi_server/src/main/java/com/judong/chuanyiserver/annotation/AdminPermissions.java
  4. 88 0
      chuanyi_server/src/main/java/com/judong/chuanyiserver/annotation/AdminPermissionsAspect.java
  5. 13 0
      chuanyi_server/src/main/java/com/judong/chuanyiserver/annotation/PermissionControl.java
  6. 108 0
      chuanyi_server/src/main/java/com/judong/chuanyiserver/annotation/PermissionControlAspect.java
  7. 25 0
      chuanyi_server/src/main/java/com/judong/chuanyiserver/config/InterceptorConfig.java
  8. 30 0
      chuanyi_server/src/main/java/com/judong/chuanyiserver/config/Interceptors.java
  9. 0 25
      chuanyi_server/src/main/java/com/judong/chuanyiserver/config/JwtInterceptors.java
  10. 26 10
      chuanyi_server/src/main/java/com/judong/chuanyiserver/config/OpcServerDaPoolFactory.java
  11. 16 18
      chuanyi_server/src/main/java/com/judong/chuanyiserver/controller/ConnectController.java
  12. 3 6
      chuanyi_server/src/main/java/com/judong/chuanyiserver/controller/ServerInController.java
  13. 188 21
      chuanyi_server/src/main/java/com/judong/chuanyiserver/controller/UserController.java
  14. 49 3
      chuanyi_server/src/main/java/com/judong/chuanyiserver/dao/UserDao.java
  15. 5 5
      chuanyi_server/src/main/java/com/judong/chuanyiserver/entity/Permission.java
  16. 3 0
      chuanyi_server/src/main/java/com/judong/chuanyiserver/entity/Role.java
  17. 9 8
      chuanyi_server/src/main/java/com/judong/chuanyiserver/enums/ResultEnum.java
  18. 39 0
      chuanyi_server/src/main/java/com/judong/chuanyiserver/exception/CustomException.java
  19. 11 2
      chuanyi_server/src/main/java/com/judong/chuanyiserver/exception/GlobalExceptionHandler.java
  20. 6 11
      chuanyi_server/src/main/java/com/judong/chuanyiserver/service/ConnectService.java
  21. 1 3
      chuanyi_server/src/main/java/com/judong/chuanyiserver/service/ServerInService.java
  22. 30 5
      chuanyi_server/src/main/java/com/judong/chuanyiserver/service/UserService.java
  23. 20 113
      chuanyi_server/src/main/java/com/judong/chuanyiserver/service/impl/ConnectServiceImpl.java
  24. 3 13
      chuanyi_server/src/main/java/com/judong/chuanyiserver/service/impl/ServerInServiceImpl.java
  25. 200 82
      chuanyi_server/src/main/java/com/judong/chuanyiserver/service/impl/UserServiceImpl.java
  26. 3 2
      chuanyi_server/src/main/java/com/judong/chuanyiserver/util/ConstantStr.java
  27. 96 0
      chuanyi_server/src/main/java/com/judong/chuanyiserver/util/KeyStoreLoader.java
  28. 131 1
      chuanyi_server/src/main/java/com/judong/chuanyiserver/util/OpcServerDaUtil.java
  29. 0 89
      chuanyi_server/src/main/java/com/judong/chuanyiserver/util/OpcServerPoolUtil.java
  30. 202 0
      chuanyi_server/src/main/java/com/judong/chuanyiserver/util/OpcServerUaUtil.java
  31. 72 20
      chuanyi_server/src/main/java/com/judong/chuanyiserver/util/Test.java
  32. 68 9
      chuanyi_server/src/main/java/com/judong/chuanyiserver/util/UserUtil.java
  33. 33 0
      chuanyi_server/src/main/resources/application-prod.yml
  34. 33 0
      chuanyi_server/src/main/resources/application-test.yml
  35. 132 6
      chuanyi_server/src/main/resources/mapper/UserDao.xml

+ 26 - 0
chuanyi_server/pom.xml

@@ -23,6 +23,10 @@
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-redis</artifactId>
         </dependency>
         <dependency>
@@ -87,6 +91,7 @@
             <artifactId>bdparsii</artifactId>
             <version>1.0.0</version>
         </dependency>
+        <!--opcDa读取依赖-->
         <!--utgard -->
         <dependency>
             <groupId>org.openscada.external</groupId>
@@ -138,6 +143,27 @@
             <groupId>ch.qos.logback</groupId>
             <artifactId>logback-classic</artifactId>
         </dependency>
+        <!--opcDa读取依赖-->
+
+        <!--opcUa读取依赖-->
+        <!--Milo客户端的依赖-->
+        <dependency>
+            <groupId>org.eclipse.milo</groupId>
+            <artifactId>sdk-client</artifactId>
+            <version>0.6.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcpkix-jdk15on</artifactId>
+            <version>1.65</version>
+        </dependency>
+        <!--Milo服务端的依赖-->
+        <dependency>
+            <groupId>org.eclipse.milo</groupId>
+            <artifactId>sdk-server</artifactId>
+            <version>0.6.3</version>
+        </dependency>
+        <!--opcUa读取依赖-->
     </dependencies>
 
     <build>

+ 1 - 0
chuanyi_server/src/main/java/com/judong/chuanyiserver/ChuanyiServerApplication.java

@@ -4,6 +4,7 @@ import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 @SpringBootApplication
 @EnableScheduling

+ 13 - 0
chuanyi_server/src/main/java/com/judong/chuanyiserver/annotation/AdminPermissions.java

@@ -0,0 +1,13 @@
+package com.judong.chuanyiserver.annotation;
+
+/**
+ * 加入此注解后,表明,需要管理员权限才能调动此接口
+ */
+
+import java.lang.annotation.*;
+
+@Documented
+@Retention(RetentionPolicy.RUNTIME)//用来修饰自定义注解的生命力。SOURCE,则它将被限定在Java源文件中。CLASS,则它将被编译到Class文件中。RUNTIME,在运行期的加载阶段被加载到Class对象中
+@Target(ElementType.METHOD)//使用范围,表明使用在(方法)METHOD上面
+public @interface AdminPermissions {
+}

+ 88 - 0
chuanyi_server/src/main/java/com/judong/chuanyiserver/annotation/AdminPermissionsAspect.java

@@ -0,0 +1,88 @@
+package com.judong.chuanyiserver.annotation;
+
+import com.judong.chuanyiserver.dao.UserDao;
+import com.judong.chuanyiserver.entity.User;
+import com.judong.chuanyiserver.enums.ResultEnum;
+import com.judong.chuanyiserver.exception.CustomException;
+import com.judong.chuanyiserver.util.Blank;
+import com.judong.chuanyiserver.util.ConstantStr;
+import com.judong.chuanyiserver.util.RedisUtil;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+@Component
+@Aspect
+public class AdminPermissionsAspect {
+
+    @Autowired
+    private UserDao userDao;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Resource
+    private HttpServletRequest request;
+
+    /**
+     * 定义切点 @Pointcut
+     * 在注解的位置切入代码
+     */
+    @Pointcut("execution(* com.judong.chuanyiserver..*.*(..))")
+    public void adminPermissions() {
+    }
+
+    /**
+     * 环绕通知
+     */
+    @Around(value = "adminPermissions() && @annotation(AdminPermissions)")
+    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
+        Object[] args = joinPoint.getArgs();
+        if (args != null && args.length > 0) {
+            for (Object arg : args) {
+                if (arg instanceof HttpServletRequest) {
+                    request = (HttpServletRequest) arg;
+                    break;
+                }
+            }
+        }
+        if (Blank.isEmpty(request)) {
+            throw new CustomException(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
+        }
+        String userId = (String) redisUtil.get(request.getHeader("token"));
+        if (Blank.isEmpty(userId)) {
+            throw new CustomException(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
+        }
+        User user = userDao.getUserById(userId);
+        if (Blank.isEmpty(user)) {
+            throw new CustomException(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
+        }
+        List<Integer> roleIdList = userDao.getRoleIdListByUserId(user.getUserId());
+        if (Blank.isEmpty(roleIdList)) {
+            throw new CustomException(ResultEnum.NO_OPERATION_AUTHORITY.getRespCode(), ResultEnum.NO_OPERATION_AUTHORITY.getRespMsg());
+        }
+        for (Integer roleId : roleIdList) {
+            if (roleId == ConstantStr.ROLE_ADMIN) {
+                return joinPoint.proceed();
+            }
+        }
+        throw new CustomException(ResultEnum.NO_OPERATION_AUTHORITY.getRespCode(), ResultEnum.NO_OPERATION_AUTHORITY.getRespMsg());
+    }
+
+    @Before(value = "adminPermissions() && @annotation(AdminPermissions)")
+    public void before(JoinPoint joinPoint) {
+        // 请求参数
+//        System.out.println("Before");
+    }
+
+    @After(value = "adminPermissions() && @annotation(AdminPermissions)")
+    public void after() {
+//        System.out.println("After");
+    }
+}

+ 13 - 0
chuanyi_server/src/main/java/com/judong/chuanyiserver/annotation/PermissionControl.java

@@ -0,0 +1,13 @@
+package com.judong.chuanyiserver.annotation;
+
+
+import java.lang.annotation.*;
+
+/**
+ * 加入此注解后,表明,需要管理员权限才能调动此接口
+ */
+@Documented
+@Retention(RetentionPolicy.RUNTIME)//用来修饰自定义注解的生命力。SOURCE,则它将被限定在Java源文件中。CLASS,则它将被编译到Class文件中。RUNTIME,在运行期的加载阶段被加载到Class对象中
+@Target(ElementType.METHOD)//使用范围,表明使用在(方法)METHOD上面
+public @interface PermissionControl {
+}

+ 108 - 0
chuanyi_server/src/main/java/com/judong/chuanyiserver/annotation/PermissionControlAspect.java

@@ -0,0 +1,108 @@
+package com.judong.chuanyiserver.annotation;
+
+import com.judong.chuanyiserver.dao.UserDao;
+import com.judong.chuanyiserver.entity.Permission;
+import com.judong.chuanyiserver.entity.User;
+import com.judong.chuanyiserver.enums.ResultEnum;
+import com.judong.chuanyiserver.exception.CustomException;
+import com.judong.chuanyiserver.util.Blank;
+import com.judong.chuanyiserver.util.ConstantStr;
+import com.judong.chuanyiserver.util.RedisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.Signature;
+import org.aspectj.lang.annotation.*;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Component
+@Aspect
+@Slf4j
+public class PermissionControlAspect {
+
+    @Autowired
+    private UserDao userDao;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Resource
+    private HttpServletRequest request;
+
+    /**
+     * 定义切点 @Pointcut
+     * 在注解的位置切入代码
+     */
+    @Pointcut("execution(* com.judong.chuanyiserver..*.*(..))")
+    public void permissionControl() {
+    }
+
+    /**
+     * 环绕通知
+     */
+    @Around(value = "permissionControl() && @annotation(PermissionControl)")
+    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
+        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        request = attributes.getRequest();
+        if (Blank.isEmpty(request)) {
+            throw new CustomException(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
+        }
+        String userId = (String) redisUtil.get(request.getHeader("token"));
+        if (Blank.isEmpty(userId)) {
+            throw new CustomException(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
+        }
+        User user = userDao.getUserById(userId);
+        if (Blank.isEmpty(user)) {
+            throw new CustomException(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
+        }
+        List<Integer> roleIdList = userDao.getRoleIdListByUserId(user.getUserId());
+        if (Blank.isEmpty(roleIdList)) {
+            throw new CustomException(ResultEnum.NO_OPERATION_AUTHORITY.getRespCode(), ResultEnum.NO_OPERATION_AUTHORITY.getRespMsg());
+        }
+        List<Permission> permissionList=userDao.getPermissionByRoleList(roleIdList);
+        if (Blank.isEmpty(permissionList)){
+            throw new CustomException(ResultEnum.NO_OPERATION_AUTHORITY.getRespCode(), ResultEnum.NO_OPERATION_AUTHORITY.getRespMsg());
+        }
+        for (Permission permission : permissionList) {
+            if(permission.getPermissionUrl().equals(request.getRequestURI())){
+                // 获取签名
+                Signature signature = joinPoint.getSignature();
+                // 获取切入的包名
+                String declaringTypeName = signature.getDeclaringTypeName();
+                // 获取即将执行的方法名
+                String funcName = signature.getName();
+                Map<String, Object> params = new HashMap<>();
+                String[] keys = ((MethodSignature) signature).getParameterNames();
+                Object[] args = joinPoint.getArgs();
+                for (int i = 0; i < keys.length; i++) {
+                    params.put(keys[i], args[i]);
+                }
+                log.info("即将执行{}包下的方法,方法名为: {}", declaringTypeName, funcName);
+                log.info("请求的参数有: {}", params.toString());
+                return joinPoint.proceed();
+            }
+        }
+        throw new CustomException(ResultEnum.NO_OPERATION_AUTHORITY.getRespCode(), ResultEnum.NO_OPERATION_AUTHORITY.getRespMsg());
+    }
+
+    @Before(value = "permissionControl() && @annotation(PermissionControl)")
+    public void before(JoinPoint joinPoint) {
+        // 请求参数
+//        System.out.println("Before");
+    }
+
+    @After(value = "permissionControl() && @annotation(PermissionControl)")
+    public void after() {
+//        System.out.println("After");
+    }
+}

+ 25 - 0
chuanyi_server/src/main/java/com/judong/chuanyiserver/config/InterceptorConfig.java

@@ -0,0 +1,25 @@
+package com.judong.chuanyiserver.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * 拦截器配置
+ */
+@Configuration
+public class InterceptorConfig implements WebMvcConfigurer {
+
+    //注册自己的拦截器,并设置拦截的请求路径
+    //addPathPatterns为拦截此请求路径的请求
+    //excludePathPatterns为不拦截此路径的请求
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(new Interceptors())
+                .addPathPatterns("/**")
+                .excludePathPatterns("/user/frontUserLogin")
+                .excludePathPatterns("/user/backUserLogin")
+                .excludePathPatterns("/connect/testConnect")
+        ;
+    }
+}

+ 30 - 0
chuanyi_server/src/main/java/com/judong/chuanyiserver/config/Interceptors.java

@@ -0,0 +1,30 @@
+package com.judong.chuanyiserver.config;
+
+import com.judong.chuanyiserver.enums.ResultEnum;
+import com.judong.chuanyiserver.exception.CustomException;
+import com.judong.chuanyiserver.util.Blank;
+import com.judong.chuanyiserver.util.TokenUtil;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * 拦截器配置
+ */
+public class Interceptors implements HandlerInterceptor {
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
+        String token = request.getHeader("token");
+        String requestURI = request.getRequestURI();
+        if (Blank.isEmpty(token)) {
+            throw new CustomException(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
+        }
+//        boolean verify = TokenUtil.verify(token);
+//        if (!verify) {
+//            throw new CustomException(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
+//        }
+//        return verify;
+        return true;
+    }
+}

+ 0 - 25
chuanyi_server/src/main/java/com/judong/chuanyiserver/config/JwtInterceptors.java

@@ -1,25 +0,0 @@
-package com.judong.chuanyiserver.config;
-
-import com.judong.chuanyiserver.util.Blank;
-import com.judong.chuanyiserver.util.TokenUtil;
-import org.springframework.web.servlet.HandlerInterceptor;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-public class JwtInterceptors implements HandlerInterceptor {
-    @Override
-    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
-        String token = request.getHeader("token");
-        String requestURI = request.getRequestURI();
-        if (Blank.isEmpty(token)) {
-            response.sendError(403);
-            return false;
-        }
-        boolean verify = TokenUtil.verify(token);
-        if (!verify) {
-            response.sendError(403);
-        }
-        return verify;
-    }
-}

+ 26 - 10
chuanyi_server/src/main/java/com/judong/chuanyiserver/config/OpcServerPoolFactory.java → chuanyi_server/src/main/java/com/judong/chuanyiserver/config/OpcServerDaPoolFactory.java

@@ -1,6 +1,8 @@
 package com.judong.chuanyiserver.config;
 
 import com.alibaba.fastjson.JSONObject;
+import com.judong.chuanyiserver.enums.ResultEnum;
+import com.judong.chuanyiserver.exception.CustomException;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.pool2.BaseKeyedPooledObjectFactory;
 import org.apache.commons.pool2.PooledObject;
@@ -17,7 +19,7 @@ import java.util.concurrent.Executors;
  * OPCserver工厂类
  */
 @Slf4j
-public class OpcServerPoolFactory {
+public class OpcServerDaPoolFactory {
 
     /**
      * 对象池
@@ -89,9 +91,10 @@ public class OpcServerPoolFactory {
 
     /**
      * 获取池中闲置状态的实例数
+     *
      * @return
      */
-    public static Integer getNumIdle(){
+    public static Integer getNumIdle() {
         if (pool == null) {
             return 0;
         }
@@ -100,9 +103,10 @@ public class OpcServerPoolFactory {
 
     /**
      * 获取池中在用实例的实例数
+     *
      * @return
      */
-    public static Integer getNumActive(){
+    public static Integer getNumActive() {
         if (pool == null) {
             return 0;
         }
@@ -128,13 +132,13 @@ public class OpcServerPoolFactory {
      */
     public synchronized static void init() {
         if (pool != null) return;
-        pool = new GenericKeyedObjectPool<String, Server>(new MyOpcServerPooledFactory(), config);
+        pool = new GenericKeyedObjectPool<String, Server>(new MyOpcServerDaPooledFactory(), config);
     }
 
     /**
      * 对象工厂
      */
-    static class MyOpcServerPooledFactory extends BaseKeyedPooledObjectFactory<String, Server> {
+    static class MyOpcServerDaPooledFactory extends BaseKeyedPooledObjectFactory<String, Server> {
         /**
          * 创建对象
          *
@@ -142,18 +146,31 @@ public class OpcServerPoolFactory {
          * @return
          * @throws Exception
          */
-        public Server create(String key) throws Exception {
+        public Server create(String key) {
             JSONObject jsonObject = (JSONObject) JSONObject.parse(key);
             final ConnectionInformation ci = new ConnectionInformation();
             ci.setHost((String) jsonObject.get("ip")); // 安装opc电脑IP
             ci.setDomain(""); // 域,为空就行
             ci.setUser((String) jsonObject.get("user")); // 电脑上自己建好的用户名
             ci.setPassword((String) jsonObject.get("password")); // 用户名的密码
-            ci.setClsid("7BC0CC8E-482C-47CA-ABDC-0FE7F9C6E729"); // KEPServer的注册表ID,可以在“组件服务”里看到
+            // 使用MatrikonOPC Server的配置
+//            ci.setClsid("F8582CF2-88FB-11D0-B850-00C0F0104305"); // MatrikonOPC的注册表ID,可以在“组件服务”里看到
+            // 使用Stoner Simulation Server的配置
+//             ci.setClsid("83BFA400-BC06-11d4-AEC4-00902760973D"); // MatrikonOPC的注册表ID,可以在“组件服务”里看到
+            // 使用KepOPC Server的配置
+//            ci.setClsid("7BC0CC8E-482C-47CA-ABDC-0FE7F9C6E729"); // KEPServer的注册表ID,可以在“组件服务”里看到
+            // 使用King OPC Server的配置
+            ci.setClsid("20667E7E-A3EF-422F-AEDD-890D23746358"); // KEPServer的注册表ID,可以在“组件服务”里看到
             Server server = new Server(ci, Executors.newSingleThreadScheduledExecutor());
             log.info("声明一个对象完成:" + server);
-            server.connect();
-            return server;
+            try {
+                server.connect();
+                return server;
+            } catch (Exception e) {
+//                throw new CustomException(ResultEnum.SERVER_ERROR.getRespCode(), "连接不可用");
+                server.dispose();
+                throw new CustomException(ResultEnum.SERVER_ERROR.getRespCode(), e.getMessage());
+            }
         }
 
         /**
@@ -206,7 +223,6 @@ public class OpcServerPoolFactory {
         /**
          * 激活一个对象或者说启动对象的某些操作
          *
-         *
          * @param key
          * @param p
          * @throws Exception

+ 16 - 18
chuanyi_server/src/main/java/com/judong/chuanyiserver/controller/ConnectController.java

@@ -1,5 +1,6 @@
 package com.judong.chuanyiserver.controller;
 
+import com.judong.chuanyiserver.annotation.PermissionControl;
 import com.judong.chuanyiserver.entity.ServerInformation;
 import com.judong.chuanyiserver.enums.ResultEnum;
 import com.judong.chuanyiserver.service.ConnectService;
@@ -17,7 +18,6 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import javax.servlet.http.HttpServletRequest;
 import java.net.UnknownHostException;
 
 @RestController
@@ -48,33 +48,32 @@ public class ConnectController {
     /**
      * 保存用户提交的连接信息
      *
-     * @param request
      * @param serverInformation
      * @return
      */
     @PostMapping("/saveConnect")
-    public Result saveConnect(HttpServletRequest request, ServerInformation serverInformation) {
+//    @PermissionControl
+    public Result saveConnect(ServerInformation serverInformation) {
         if (Blank.isEmpty(serverInformation.getIpAddress()) || Blank.isEmpty(serverInformation.getIpUserName()) || Blank.isEmpty(serverInformation.getIpPassword()) || Blank.isEmpty(serverInformation.getAgreementType())) {
             return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
         }
-        return connectService.saveConnect(request, serverInformation);
+        return connectService.saveConnect(serverInformation);
     }
 
     /**
      * 查询用户保存的连接信息
      *
-     * @param request
      * @return
      */
     @GetMapping("/selectAllConnect")
-    public Result selectAllConnect(HttpServletRequest request) {
-        return connectService.selectAllConnect(request);
+    public Result selectAllConnect() {
+        return connectService.selectAllConnect();
     }
 
     /**
      * 通过服务器ip打开连接
      *
-     * @param serverInformationId
+     * @param id
      * @return
      * @throws AlreadyConnectedException
      * @throws JIException
@@ -84,11 +83,11 @@ public class ConnectController {
      * @throws AddFailedException
      */
     @GetMapping("/openConnect")
-    public Result openConnect(int serverInformationId) throws AlreadyConnectedException, JIException, UnknownHostException, NotConnectedException, DuplicateGroupException, AddFailedException {
-        if (Blank.isEmpty(serverInformationId)) {
+    public Result openConnect(int id) throws Exception {
+        if (Blank.isEmpty(id)) {
             return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
         }
-        return connectService.openConnect(serverInformationId);
+        return connectService.openConnect(id);
     }
 
     /**
@@ -105,7 +104,7 @@ public class ConnectController {
      * @throws DuplicateGroupException
      */
     @GetMapping("/readItemValue")
-    public Result readItemValue(int id, String itemName) throws JIException, AddFailedException, NotConnectedException, AlreadyConnectedException, UnknownHostException, DuplicateGroupException {
+    public Result readItemValue(int id, String itemName) throws Exception {
         if (Blank.isEmpty(id) || Blank.isEmpty(itemName)) {
             return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
         }
@@ -115,29 +114,28 @@ public class ConnectController {
     /**
      * 编辑连接
      *
-     * @param request
      * @param serverInformation
      * @return
      */
     @PostMapping("/editConnect")
-    public Result editConnect(HttpServletRequest request, ServerInformation serverInformation) {
+    public Result editConnect(ServerInformation serverInformation) {
         if (Blank.isEmpty(serverInformation.getIpAddress()) || Blank.isEmpty(serverInformation.getIpUserName()) || Blank.isEmpty(serverInformation.getIpPassword()) || Blank.isEmpty(serverInformation.getAgreementType())) {
             return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
         }
-        return connectService.editConnect(request, serverInformation);
+        return connectService.editConnect(serverInformation);
     }
 
     /**
      * 通过id删除保存的连接信息
-     * @param request
+     *
      * @param id
      * @return
      */
     @PostMapping("/deleteConnect")
-    public Result deleteConnect(HttpServletRequest request, int id) {
+    public Result deleteConnect(int id) {
         if (Blank.isEmpty(id)) {
             return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
         }
-        return connectService.deleteConnect(request, id);
+        return connectService.deleteConnect(id);
     }
 }

+ 3 - 6
chuanyi_server/src/main/java/com/judong/chuanyiserver/controller/ServerInController.java

@@ -7,9 +7,6 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 @RestController
 @RequestMapping("serverIn")
 public class ServerInController {
@@ -19,11 +16,11 @@ public class ServerInController {
 
     /**
      * 获取当前登录人配置保存的服务信息
-     * @param request
+     *
      * @return
      */
     @GetMapping("/selectServerByUser")
-    public Result selectServerByUser(HttpServletRequest request){
-        return serverInService.selectServerByUser(request);
+    public Result selectServerByUser() {
+        return serverInService.selectServerByUser();
     }
 }

+ 188 - 21
chuanyi_server/src/main/java/com/judong/chuanyiserver/controller/UserController.java

@@ -1,17 +1,17 @@
 package com.judong.chuanyiserver.controller;
 
+import com.judong.chuanyiserver.annotation.PermissionControl;
+import com.judong.chuanyiserver.annotation.PermissionControl;
+import com.judong.chuanyiserver.entity.Permission;
+import com.judong.chuanyiserver.entity.Role;
 import com.judong.chuanyiserver.entity.User;
 import com.judong.chuanyiserver.enums.ResultEnum;
 import com.judong.chuanyiserver.service.UserService;
 import com.judong.chuanyiserver.util.Blank;
 import com.judong.chuanyiserver.util.Result;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
-import java.util.List;
-
 @RestController
 @RequestMapping("user")
 public class UserController {
@@ -29,7 +29,7 @@ public class UserController {
      */
     @PostMapping("/frontUserLogin")
     public Result frontUserLogin(String userName, String password) {
-        if (StringUtils.isEmpty(userName) || StringUtils.isEmpty(password)) {
+        if (Blank.isEmpty(userName) || Blank.isEmpty(password)) {
             return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
         }
         return userService.frontUserLogin(userName, password);
@@ -44,7 +44,7 @@ public class UserController {
      */
     @PostMapping("/backUserLogin")
     public Result backUserLogin(String userName, String password) {
-        if (StringUtils.isEmpty(userName) || StringUtils.isEmpty(password)) {
+        if (Blank.isEmpty(userName) || Blank.isEmpty(password)) {
             return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
         }
         return userService.backUserLogin(userName, password);
@@ -53,12 +53,11 @@ public class UserController {
     /**
      * 用户退出登录
      *
-     * @param request
      * @return
      */
     @PostMapping("/userLoginOut")
-    public Result userLoginOut(HttpServletRequest request) {
-        return userService.userLoginOut(request);
+    public Result userLoginOut() {
+        return userService.userLoginOut();
     }
 
     /**
@@ -69,42 +68,72 @@ public class UserController {
      * @return
      */
     @PostMapping("/addUser")
+    @PermissionControl
     public Result addUser(String userName, String password) {
-        if (StringUtils.isEmpty(userName) || StringUtils.isEmpty(password)) {
+        if (Blank.isEmpty(userName) || Blank.isEmpty(password)) {
             return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
         }
         return userService.addUser(userName, password);
     }
 
     /**
+     * 修改用户信息
+     *
+     * @param user
+     * @return
+     */
+    @PermissionControl
+    @PostMapping("/updateUser")
+    public Result updateUser(User user) {
+        if (Blank.isEmpty(user)) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
+        }
+        return userService.updateUser(user);
+    }
+
+    /**
      * 管理员分页查询所有用户信息
      *
-     * @param request
      * @param page
      * @param limit
      * @return
      */
     @GetMapping("/getUserPage")
-    public Result getUserPage(HttpServletRequest request, int page, int limit) {
+    @PermissionControl
+    public Result getUserPage(int page, int limit) {
         if (Blank.isEmpty(page) || Blank.isEmpty(limit) || page < 1 || limit < 1) {
             return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
         }
-        return userService.getUserPage(request, page, limit);
+        return userService.getUserPage(page, limit);
     }
 
     /**
      * 管理员可以查看任何用户的信息,不是管理员只能查看自己的信息
      *
-     * @param request
      * @param userId
      * @return
      */
     @GetMapping("/getUserById")
-    public Result getUserById(HttpServletRequest request, String userId) {
+    public Result getUserById(String userId) {
         if (Blank.isEmpty(userId)) {
             return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
         }
-        return userService.getUserById(request, userId);
+        return userService.getUserById(userId);
+    }
+
+    /**
+     * 逻辑删除用户,锁定用户,解除用户锁定。只有管理员才能操作
+     *
+     * @param userId
+     * @return
+     */
+    @PostMapping("/updateUserStateById")
+    @PermissionControl
+    public Result updateUserStateById(String userId, Integer userState) {
+        if (Blank.isEmpty(userId) || Blank.isEmpty(userState)) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
+        }
+        return userService.updateUserStateById(userId, userState);
     }
 
     /**
@@ -114,25 +143,163 @@ public class UserController {
      * @return
      */
     @PostMapping("/addRole")
+    @PermissionControl
     public Result addRole(String roleName) {
-        if (StringUtils.isEmpty(roleName)) {
+        if (Blank.isEmpty(roleName)) {
             return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
         }
         return userService.addRole(roleName);
     }
 
     /**
+     * 修改角色信息
+     *
+     * @param role
+     * @return
+     */
+    @PostMapping("/updateRole")
+    @PermissionControl
+    public Result updateRole(Role role) {
+        if (Blank.isEmpty(role)) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
+        }
+        return userService.updateRole(role);
+    }
+
+    /**
      * 分配角色
      *
-     * @param request
      * @param user
      * @return
      */
     @PostMapping("/assignRole")
-    public Result assignRole(HttpServletRequest request, @RequestBody User user) {
-        if (StringUtils.isEmpty(user) || StringUtils.isEmpty(user.getUserId()) || StringUtils.isEmpty(user.getRoleList())) {
+    @PermissionControl
+    public Result assignRole(@RequestBody User user) {
+        if (Blank.isEmpty(user) || Blank.isEmpty(user.getUserId()) || Blank.isEmpty(user.getRoleList())) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
+        }
+        return userService.assignRole(user.getUserId(), user.getRoleList());
+    }
+
+    /**
+     * 分页查询所有的角色信息
+     *
+     * @param page
+     * @param limit
+     * @return
+     */
+    @GetMapping("/getRoleListByPage")
+    @PermissionControl
+    public Result getRoleListByPage(Integer page, Integer limit) {
+        if (Blank.isEmpty(page) || Blank.isEmpty(limit) || page < 1 || limit < 1) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
+        }
+        return userService.getRoleListByPage(page, limit);
+    }
+
+    /**
+     * 通过角色id查看角色信息
+     *
+     * @param id
+     * @return
+     */
+    @GetMapping("/getRoleById")
+    @PermissionControl
+    public Result getRoleById(Integer id) {
+        if (Blank.isEmpty(id)) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
+        }
+        return userService.getRoleById(id);
+    }
+
+    /**
+     * 新增权限资源
+     *
+     * @param permission
+     * @return
+     */
+    @PostMapping("/addPermission")
+    @PermissionControl
+    public Result addPermission(Permission permission) {
+        if (Blank.isEmpty(permission)) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
+        }
+        return userService.addPermission(permission);
+    }
+
+    /**
+     * 修改权限
+     *
+     * @param permission
+     * @return
+     */
+    @PostMapping("/updatePermission")
+    @PermissionControl
+    public Result updatePermission(Permission permission) {
+        if (Blank.isEmpty(permission)) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
+        }
+        return userService.updatePermission(permission);
+    }
+
+    /**
+     * 通过id查询权限
+     *
+     * @param id
+     * @return
+     */
+    @GetMapping("/getPermissionById")
+    @PermissionControl
+    public Result getPermissionById(Integer id) {
+        if (Blank.isEmpty(id)) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
+        }
+        return userService.getPermissionById(id);
+    }
+
+    /**
+     * 分页查询权限
+     *
+     * @param page
+     * @param limit
+     * @return
+     */
+    @GetMapping("/getPermissionListByPage")
+    @PermissionControl
+    public Result getPermissionListByPage(Integer page, Integer limit) {
+        if (Blank.isEmpty(page) || Blank.isEmpty(limit) || page < 1 || limit < 1) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
+        }
+        return userService.getPermissionListByPage(page, limit);
+    }
+
+    /**
+     * 删除权限
+     *
+     * @param id
+     * @return
+     */
+    @PostMapping("/deletePermissionById")
+    @PermissionControl
+    public Result deletePermissionById(Integer id) {
+        if (Blank.isEmpty(id)) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
+        }
+        return userService.deletePermissionById(id);
+    }
+
+    /**
+     * 给角色分配权限
+     *
+     * @param role
+     * @return
+     */
+    @PostMapping("/assignPermission")
+    @PermissionControl
+    public Result assignPermission(@RequestBody Role role) {
+        if (Blank.isEmpty(role) || Blank.isEmpty(role.getId()) || Blank.isEmpty(role.getPermissionList())) {
             return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
         }
-        return userService.assignRole(request, user.getUserId(), user.getRoleList());
+        return userService.assignPermission(role.getId(), role.getPermissionList());
     }
 }

+ 49 - 3
chuanyi_server/src/main/java/com/judong/chuanyiserver/dao/UserDao.java

@@ -1,6 +1,6 @@
 package com.judong.chuanyiserver.dao;
 
-import com.judong.chuanyiserver.entity.Resource;
+import com.judong.chuanyiserver.entity.Permission;
 import com.judong.chuanyiserver.entity.Role;
 import com.judong.chuanyiserver.entity.User;
 import org.springframework.stereotype.Repository;
@@ -30,11 +30,11 @@ public interface UserDao {
 
     List<Integer> getNoShareOldRoleList(String userId, List<Role> roleList);
 
-    Integer deleteUserRole(String userId, List<Integer> roleList);
+    Integer deleteUserRole(String userId, List<Integer> roleIdList);
 
     Integer addRoleList(String userId, List<Role> roleList);
 
-    List<Resource> getResourceByRoleList(List<Integer> roleList);
+    List<Permission> getPermissionByRoleList(List<Integer> roleList);
 
     List<Role> getRoleListByUserId(String userId);
 
@@ -43,4 +43,50 @@ public interface UserDao {
     List<User> getUserPage(Long startNum, Long limitNum);
 
     Integer deleteUserRoleByUserId(String userId);
+
+    Integer updateUserState(String userId, Integer userState);
+
+    Integer updateLoginState(String userId);
+
+    Integer updateUser(User user);
+
+    Integer updateRole(Role role);
+
+    Long getRoleCount();
+
+    List<Role> getRoleListByPage(Long startNum, Long limitNum);
+
+    Role getRoleById(Integer id);
+
+    Permission getPermissionByUrl(String permissionUrl);
+
+    Integer addPermission(Permission permission);
+
+    User getUserByNameNoId(String userId, String userName);
+
+    Role getRoleByNoIdName(int id, String roleName);
+
+    Permission getPermissionByNoIdUrl(int id, String permissionUrl);
+
+    Integer updatePermission(Permission permission);
+
+    Permission getPermissionById(Integer id);
+
+    Long getPermissionCount();
+
+    List<Permission> getPermissionListByPage(Long startNum, Long limitNum);
+
+    Integer deletePermissionById(Integer id);
+
+    Integer deleteRolePermissionById(Integer id);
+
+    List<Permission> getSharePermissionList(int roleId, List<Permission> permissionList);
+
+    Integer deleteRolePermissionByRoleId(int roleId);
+
+    List<Integer> getNoShareOldPermissionList(int roleId, List<Permission> permissionList);
+
+    Integer deleteRolePermission(int roleId, List<Integer> permissionIdList);
+
+    Integer addPermissionList(int roleId, List<Permission> permissionList);
 }

+ 5 - 5
chuanyi_server/src/main/java/com/judong/chuanyiserver/entity/Resource.java → chuanyi_server/src/main/java/com/judong/chuanyiserver/entity/Permission.java

@@ -4,7 +4,7 @@ import lombok.Data;
 
 import java.io.Serializable;
 @Data
-public class Resource implements Serializable {
+public class Permission implements Serializable {
 
     private static final long serialVersionUID = -96536212774977561L;
 
@@ -13,11 +13,11 @@ public class Resource implements Serializable {
      */
     private int id ;
     /**
-     * 资源路径
+     * 权限路径
      */
-    private String resourceUrl;
+    private String permissionUrl;
     /**
-     * 资源名称
+     * 权限名称
      */
-    private String resourceName;
+    private String permissionName;
 }

+ 3 - 0
chuanyi_server/src/main/java/com/judong/chuanyiserver/entity/Role.java

@@ -3,6 +3,7 @@ package com.judong.chuanyiserver.entity;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.util.List;
 
 @Data
 public class Role implements Serializable {
@@ -16,4 +17,6 @@ public class Role implements Serializable {
      * 角色名称
      */
     private String roleName;
+
+    private List<Permission> permissionList;
 }

+ 9 - 8
chuanyi_server/src/main/java/com/judong/chuanyiserver/enums/ResultEnum.java

@@ -2,16 +2,17 @@ package com.judong.chuanyiserver.enums;
 
 public enum ResultEnum {
 
-    SUCCESS(200,"成功"),
+    SUCCESS(200, "成功"),
 
-    REQUEST_WRONGPARAMS(400,"参数错误"),
-    UNAUTHORIZED(401,"未通过token验证"),
-    NO_OPERATION_AUTHORITY(402,"无操作权限"),
-    NOT_FOUND(404,"不存在"),
-    REQUEST_TIME_OUT(408,"请求超时"),
+    REQUEST_WRONGPARAMS(400, "参数错误"),
+    UNAUTHORIZED(401, "未通过token验证"),
+    NO_OPERATION_AUTHORITY(402, "无操作权限"),
+    NOT_FOUND(404, "不存在"),
+    LOGIN_EXPIRED(405, "登录信息过期,请重新登录"),
+    REQUEST_TIME_OUT(408, "请求超时"),
 
-    SERVER_ERROR(500,"服务器出现异常"),
-    UNKNOWN_ERROR(502,"未知错误");
+    SERVER_ERROR(500, "服务器出现异常"),
+    UNKNOWN_ERROR(502, "未知错误");
 
 
     private Integer respCode;

+ 39 - 0
chuanyi_server/src/main/java/com/judong/chuanyiserver/exception/CustomException.java

@@ -0,0 +1,39 @@
+package com.judong.chuanyiserver.exception;
+
+import com.judong.chuanyiserver.enums.ResultEnum;
+import lombok.Data;
+
+@Data
+public class CustomException extends RuntimeException {
+    private Integer code;
+
+    /**
+     * 通过状态码和错误消息创建异常对象
+     *
+     * @param message
+     * @param code
+     */
+    public CustomException(Integer code, String message) {
+        super(message);
+        this.code = code;
+    }
+
+    /**
+     * 接收枚举类型对象
+     *
+     * @param resultEnum
+     */
+    public CustomException(ResultEnum resultEnum) {
+        super(resultEnum.getRespMsg());
+        this.code = resultEnum.getRespCode();
+    }
+
+    @Override
+    public String toString() {
+        return "CustomException{" +
+                "code=" + code +
+                ", message=" + this.getMessage() +
+                '}';
+    }
+
+}

+ 11 - 2
chuanyi_server/src/main/java/com/judong/chuanyiserver/exception/GlobalExceptionHandler.java

@@ -6,6 +6,7 @@ import org.springframework.web.bind.annotation.ControllerAdvice;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.ResponseBody;
 
+@ResponseBody
 @ControllerAdvice
 public class GlobalExceptionHandler {
 
@@ -13,9 +14,17 @@ public class GlobalExceptionHandler {
      * 系统异常处理
      */
     @ExceptionHandler
-    @ResponseBody
     public Result error(Exception e) {
         e.printStackTrace();
-        return Result.no(ResultEnum.SERVER_ERROR.getRespCode(),ResultEnum.SERVER_ERROR.getRespMsg());
+        return Result.no(ResultEnum.SERVER_ERROR.getRespCode(), ResultEnum.SERVER_ERROR.getRespMsg());
+    }
+
+    /**
+     * 自定义异常处理
+     */
+    @ExceptionHandler(value = CustomException.class)
+    public Result hadndle(CustomException e) {
+        e.printStackTrace();
+        return Result.no(e.getCode(), e.getMessage());
     }
 }

+ 6 - 11
chuanyi_server/src/main/java/com/judong/chuanyiserver/service/ConnectService.java

@@ -1,30 +1,25 @@
 package com.judong.chuanyiserver.service;
 
-import cn.hutool.http.HttpRequest;
 import com.judong.chuanyiserver.entity.ServerInformation;
 import com.judong.chuanyiserver.util.Result;
 import org.jinterop.dcom.common.JIException;
 import org.openscada.opc.lib.common.AlreadyConnectedException;
-import org.openscada.opc.lib.common.NotConnectedException;
-import org.openscada.opc.lib.da.AddFailedException;
-import org.openscada.opc.lib.da.DuplicateGroupException;
 
-import javax.servlet.http.HttpServletRequest;
 import java.net.UnknownHostException;
 
 public interface ConnectService {
 
-    Result saveConnect(HttpServletRequest request, ServerInformation serverInformation);
+    Result saveConnect(ServerInformation serverInformation);
 
-    Result openConnect(int serverInformationId) throws AlreadyConnectedException, JIException, UnknownHostException, NotConnectedException, DuplicateGroupException, AddFailedException;
+    Result openConnect(int id) throws Exception;
 
-    Result readItemValue(int id, String itemName) throws AlreadyConnectedException, JIException, UnknownHostException, NotConnectedException, DuplicateGroupException, AddFailedException;
+    Result readItemValue(int id, String itemName) throws Exception;
 
     Result testConnect(ServerInformation serverInformation) throws AlreadyConnectedException, JIException, UnknownHostException;
 
-    Result selectAllConnect(HttpServletRequest request);
+    Result selectAllConnect();
 
-    Result editConnect(HttpServletRequest request, ServerInformation serverInformation);
+    Result editConnect( ServerInformation serverInformation);
 
-    Result deleteConnect(HttpServletRequest request, int id);
+    Result deleteConnect( int id);
 }

+ 1 - 3
chuanyi_server/src/main/java/com/judong/chuanyiserver/service/ServerInService.java

@@ -2,8 +2,6 @@ package com.judong.chuanyiserver.service;
 
 import com.judong.chuanyiserver.util.Result;
 
-import javax.servlet.http.HttpServletRequest;
-
 public interface ServerInService {
-    Result selectServerByUser(HttpServletRequest request);
+    Result selectServerByUser();
 }

+ 30 - 5
chuanyi_server/src/main/java/com/judong/chuanyiserver/service/UserService.java

@@ -1,9 +1,10 @@
 package com.judong.chuanyiserver.service;
 
+import com.judong.chuanyiserver.entity.Permission;
 import com.judong.chuanyiserver.entity.Role;
+import com.judong.chuanyiserver.entity.User;
 import com.judong.chuanyiserver.util.Result;
 
-import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 
 public interface UserService {
@@ -19,6 +20,7 @@ public interface UserService {
 
     /**
      * 后台管理系统登录
+     *
      * @param userName
      * @param password
      * @return
@@ -36,17 +38,40 @@ public interface UserService {
 
     /**
      * 新增角色
+     *
      * @param roleName
      * @return
      */
     Result addRole(String roleName);
 
 
-    Result assignRole(HttpServletRequest request,String userId, List<Role> roleList);
+    Result assignRole(String userId, List<Role> roleList);
+
+    Result userLoginOut();
+
+    Result getUserPage(int page, int limit);
+
+    Result getUserById(String userId);
+
+    Result updateUserStateById(String userId, Integer userState);
+
+    Result updateUser(User user);
+
+    Result updateRole(Role role);
+
+    Result getRoleListByPage(Integer page, Integer limit);
+
+    Result getRoleById(Integer id);
+
+    Result addPermission(Permission permission);
+
+    Result updatePermission(Permission permission);
+
+    Result getPermissionById(Integer id);
 
-    Result userLoginOut(HttpServletRequest request);
+    Result getPermissionListByPage(Integer page, Integer limit);
 
-    Result getUserPage(HttpServletRequest request, int page, int limit);
+    Result deletePermissionById(Integer id);
 
-    Result getUserById(HttpServletRequest request, String userId);
+    Result assignPermission(int roleId, List<Permission> permissionList);
 }

+ 20 - 113
chuanyi_server/src/main/java/com/judong/chuanyiserver/service/impl/ConnectServiceImpl.java

@@ -1,7 +1,5 @@
 package com.judong.chuanyiserver.service.impl;
 
-import cn.hutool.http.HttpRequest;
-import com.alibaba.fastjson.JSONObject;
 import com.judong.chuanyiserver.dao.ConnectDao;
 import com.judong.chuanyiserver.entity.ServerInformation;
 import com.judong.chuanyiserver.enums.ResultEnum;
@@ -12,18 +10,12 @@ import org.jinterop.dcom.common.JIException;
 import org.openscada.opc.dcom.da.OPCSERVERSTATE;
 import org.openscada.opc.lib.common.AlreadyConnectedException;
 import org.openscada.opc.lib.common.ConnectionInformation;
-import org.openscada.opc.lib.common.NotConnectedException;
-import org.openscada.opc.lib.da.*;
-import org.openscada.opc.lib.da.browser.Branch;
-import org.openscada.opc.lib.da.browser.Leaf;
-import org.openscada.opc.lib.da.browser.TreeBrowser;
+import org.openscada.opc.lib.da.Server;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.servlet.http.HttpServletRequest;
 import java.net.UnknownHostException;
-import java.util.*;
 import java.util.concurrent.Executors;
 
 @Service
@@ -69,15 +61,8 @@ public class ConnectServiceImpl implements ConnectService {
     }
 
     @Override
-    public synchronized Result saveConnect(HttpServletRequest request, ServerInformation serverInformation) {
-        String token = request.getHeader("token");
-        if (Blank.isEmpty(token)) {
-            return Result.no(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
-        }
-        String userId = userUtil.getCurrentUserId(token);
-        if (Blank.isEmpty(userId)){
-            return Result.no(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
-        }
+    public synchronized Result saveConnect(ServerInformation serverInformation) {
+        String userId = userUtil.getCurrentUserId();
         serverInformation.setUserId(userId);
         ServerInformation si = connectDao.getServerInformation(userId, serverInformation.getIpAddress());
         if (Blank.isNotEmpty(si)) {
@@ -90,28 +75,13 @@ public class ConnectServiceImpl implements ConnectService {
     }
 
     @Override
-    public Result selectAllConnect(HttpServletRequest request) {
-        String token = request.getHeader("token");
-        if (Blank.isEmpty(token)) {
-            return Result.no(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
-        }
-        String userId=userUtil.getCurrentUserId(token);
-        if(Blank.isEmpty(userId)){
-            return Result.no(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
-        }
-        return Result.ok(connectDao.selectAllConnect(userId));
+    public Result selectAllConnect() {
+        return Result.ok(connectDao.selectAllConnect(userUtil.getCurrentUserId()));
     }
 
     @Override
-    public synchronized Result editConnect(HttpServletRequest request, ServerInformation serverInformation) {
-        String token = request.getHeader("token");
-        if (Blank.isEmpty(token)) {
-            return Result.no(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
-        }
-        String userId = userUtil.getCurrentUserId(token);
-        if (Blank.isEmpty(userId)){
-            return Result.no(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
-        }
+    public synchronized Result editConnect(ServerInformation serverInformation) {
+        String userId = userUtil.getCurrentUserId();
         ServerInformation si = connectDao.getServerInformationEdit(serverInformation.getId(), userId, serverInformation.getIpAddress());
         if (Blank.isNotEmpty(si)) {
             return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "该用户下此ip已被使保存,请更换其他ip");
@@ -123,15 +93,8 @@ public class ConnectServiceImpl implements ConnectService {
     }
 
     @Override
-    public Result deleteConnect(HttpServletRequest request, int id) {
-        String token = request.getHeader("token");
-        if (Blank.isEmpty(token)) {
-            return Result.no(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
-        }
-        String userId=userUtil.getCurrentUserId(token);
-        if (Blank.isEmpty(userId)){
-            return Result.no(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
-        }
+    public Result deleteConnect(int id) {
+        String userId = userUtil.getCurrentUserId();
         if (connectDao.deleteConnect(id, userId) <= 0) {
             return Result.no(ResultEnum.SERVER_ERROR.getRespCode(), "删除连接失败");
         }
@@ -139,83 +102,27 @@ public class ConnectServiceImpl implements ConnectService {
     }
 
     @Override
-    public Result openConnect(int serverInformationId) throws AlreadyConnectedException, JIException, UnknownHostException, NotConnectedException, DuplicateGroupException, AddFailedException {
-        ServerInformation serverInformation = connectDao.getServerInformationById(serverInformationId);
+    public Result openConnect(int id) throws Exception {
+        ServerInformation serverInformation = connectDao.getServerInformationById(id);
+        if (Blank.isEmpty(serverInformation)) {
+            return Result.no(ResultEnum.NOT_FOUND.getRespCode(), ResultEnum.NOT_FOUND.getRespMsg());
+        }
         //如果协议类型为OPCDA
         if (serverInformation.getAgreementType() == ConstantStr.OPC_DA) {
-            ConnectionInformation ci = new ConnectionInformation();
-
-            ci.setHost(serverInformation.getIpAddress()); // 安装opc电脑IP
-            ci.setDomain(""); // 域,为空就行
-            ci.setUser(serverInformation.getIpUserName()); // 电脑上自己建好的用户名
-            ci.setPassword(serverInformation.getIpPassword()); // 用户名的密码
-            ci.setClsid("7BC0CC8E-482C-47CA-ABDC-0FE7F9C6E729"); // KEPServer的注册表ID,可以在“组件服务”里看到
-            // ci.setProgId("");
-
-            Server server = new Server(ci, Executors.newSingleThreadScheduledExecutor());
-            server.connect();
-            Item item = null;
-            if (null == server.getServerState()) {
-                return Result.no(ResultEnum.NOT_FOUND.getRespCode(), "连接失败");
-            }
-            if (OPCSERVERSTATE.OPC_STATUS_RUNNING == server.getServerState().getServerState()) {
-                JSONObject jsonObject = new JSONObject();
-                //获取服务器下所有ITEM列表,平面展示
-//                Collection<String> items = server.getFlatBrowser().browse();
-
-                //获取服务器下所有ITEM列表,树形展示
-//                TreeBrowser treeBrowser = server.getTreeBrowser();
-//                Branch browse = treeBrowser.browse();
-//                Collection<Branch> branches = browse.getBranches();
-//                for (Branch branch : branches) {
-//                    Collection<Leaf> leaves = branch.getLeaves();
-//                }
-                List<JSONObject> jsonObjectList = OpcDataUtil.generOpcDaTree(server);
-
-//                Group group = server.addGroup();
-//                Iterator<String> iterator = items.iterator();
-//                while (iterator.hasNext()) {
-//                    item = group.addItem(iterator.next());
-//                    log.info("读取出来的值为:" + OpcDataUtil.getVal(item.read(true).getValue()));
-//                }
-                jsonObject.put("tree", OpcDataUtil.generOpcDaTree(server));
-                return Result.ok(jsonObject);
-            }
+            return OpcServerDaUtil.opcDaReadItemTree(serverInformation);
         }
         return Result.no(ResultEnum.SERVER_ERROR.getRespCode(), ResultEnum.SERVER_ERROR.getRespMsg());
     }
 
     @Override
-    public Result readItemValue(int id, String itemName) throws AlreadyConnectedException, JIException, UnknownHostException, NotConnectedException, DuplicateGroupException, AddFailedException {
+    public Result readItemValue(int id, String itemName) throws Exception {
         ServerInformation serverInformation = connectDao.getServerInformationById(id);
+        if (Blank.isEmpty(serverInformation)) {
+            return Result.no(ResultEnum.NOT_FOUND.getRespCode(), ResultEnum.NOT_FOUND.getRespMsg());
+        }
         //如果协议类型为OPCDA
         if (serverInformation.getAgreementType() == ConstantStr.OPC_DA) {
-            ConnectionInformation ci = new ConnectionInformation();
-
-            ci.setHost(serverInformation.getIpAddress()); // 安装opc电脑IP
-            ci.setDomain(""); // 域,为空就行
-            ci.setUser(serverInformation.getIpUserName()); // 电脑上自己建好的用户名
-            ci.setPassword(serverInformation.getIpPassword()); // 用户名的密码
-            ci.setClsid("7BC0CC8E-482C-47CA-ABDC-0FE7F9C6E729"); // KEPServer的注册表ID,可以在“组件服务”里看到
-            // ci.setProgId("");
-
-            Server server = new Server(ci, Executors.newSingleThreadScheduledExecutor());
-            server.connect();
-            if (null == server.getServerState()) {
-                return Result.no(ResultEnum.NOT_FOUND.getRespCode(), "连接失败");
-            }
-            if (OPCSERVERSTATE.OPC_STATUS_RUNNING == server.getServerState().getServerState()) {
-                Map<String, Object> map = new HashMap<>();
-                //获取服务器下所有ITEM列表,平面展示
-                Group group = server.addGroup();
-                Item item = group.addItem(itemName);
-                Map<String, Object> val = OpcDataUtil.getVal(item.read(true).getValue());
-                log.info("读取出来的Java类型为:" + val.get("javaType"));
-                log.info("读取出来的值为:" + val);
-                map.put("javaType", val.get("javaType"));
-                map.put("value", val);
-                return Result.ok(map);
-            }
+            return OpcServerDaUtil.opcDaReadItemValue(serverInformation, itemName);
         }
         return Result.no(ResultEnum.NOT_FOUND.getRespCode(), ResultEnum.NOT_FOUND.getRespMsg());
     }

+ 3 - 13
chuanyi_server/src/main/java/com/judong/chuanyiserver/service/impl/ServerInServiceImpl.java

@@ -1,17 +1,13 @@
 package com.judong.chuanyiserver.service.impl;
 
 import com.judong.chuanyiserver.dao.ServerInDao;
-import com.judong.chuanyiserver.enums.ResultEnum;
 import com.judong.chuanyiserver.service.ServerInService;
-import com.judong.chuanyiserver.util.Blank;
 import com.judong.chuanyiserver.util.Result;
 import com.judong.chuanyiserver.util.UserUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.servlet.http.HttpServletRequest;
-
 @Service
 @Transactional
 public class ServerInServiceImpl implements ServerInService {
@@ -23,14 +19,8 @@ public class ServerInServiceImpl implements ServerInService {
     private UserUtil userUtil;
 
     @Override
-    public Result selectServerByUser(HttpServletRequest request) {
-        String token = request.getHeader("token");
-        if (Blank.isEmpty(token)) {
-            return Result.no(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
-        }
-        if (Blank.isEmpty(userUtil.getCurrentUserId(token))) {
-            return Result.no(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
-        }
-        return Result.ok(serverInDao.selectServerByUser(userUtil.getCurrentUserId(token)));
+    public Result selectServerByUser() {
+        String userId = userUtil.getCurrentUserId();
+        return Result.ok(serverInDao.selectServerByUser(userId));
     }
 }

+ 200 - 82
chuanyi_server/src/main/java/com/judong/chuanyiserver/service/impl/UserServiceImpl.java

@@ -1,9 +1,8 @@
 package com.judong.chuanyiserver.service.impl;
 
-import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.judong.chuanyiserver.dao.UserDao;
-import com.judong.chuanyiserver.entity.Resource;
+import com.judong.chuanyiserver.entity.Permission;
 import com.judong.chuanyiserver.entity.Role;
 import com.judong.chuanyiserver.entity.User;
 import com.judong.chuanyiserver.enums.ResultEnum;
@@ -13,7 +12,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.servlet.http.HttpServletRequest;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
@@ -47,12 +45,16 @@ public class UserServiceImpl implements UserService {
         JSONObject json = new JSONObject();
         List<Integer> roleIdList = userDao.getRoleIdListByUserId(user.getUserId());
         json.put("roleIdList", roleIdList);
-        List<Resource> resourceList = userDao.getResourceByRoleList(roleIdList);
-        json.put("resourceList", resourceList);
+        List<Permission> permissionList = userDao.getPermissionByRoleList(roleIdList);
+        json.put("permissionList", permissionList);
         //生成token
         String token = TokenUtil.token(userName, ConstantStr.HALF_HOUR);
         json.put("token", token);
         redisUtil.set(token, user.getUserId(), ConstantStr.HALF_HOUR);
+        //更新用户登录状态
+        if (userDao.updateLoginState(user.getUserId()) <= 0) {
+            return Result.no(ResultEnum.SERVER_ERROR.getRespCode(), "更新登录状态失败");
+        }
         return Result.ok(json);
     }
 
@@ -77,8 +79,8 @@ public class UserServiceImpl implements UserService {
             if (roleId == ConstantStr.ROLE_ADMIN) {
                 JSONObject json = new JSONObject();
                 json.put("roleIdList", roleIdList);
-                List<Resource> resourceList = userDao.getResourceByRoleList(roleIdList);
-                json.put("resourceList", resourceList);
+                List<Permission> permissionList = userDao.getPermissionByRoleList(roleIdList);
+                json.put("permissionList", permissionList);
                 //生成token
                 String token = TokenUtil.token(userName, ConstantStr.HALF_HOUR);
                 json.put("token", token);
@@ -121,8 +123,7 @@ public class UserServiceImpl implements UserService {
      */
     @Override
     public synchronized Result addRole(String roleName) {
-        Role role = userDao.getRoleByName(roleName);
-        if (Blank.isNotEmpty(role)) {
+        if (Blank.isNotEmpty(userDao.getRoleByName(roleName))) {
             return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "该角色名已被使用,请更换其他角色名");
         }
         if (userDao.addRole(roleName) <= 0) {
@@ -132,94 +133,61 @@ public class UserServiceImpl implements UserService {
     }
 
     @Override
-    public synchronized Result assignRole(HttpServletRequest request,String userId, List<Role> roleList) {
-        String token = request.getHeader("token");
-        if (Blank.isEmpty(token)) {
-            return Result.no(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
-        }
-        String tokenUserId = userUtil.getCurrentUserId(token);
-        if (Blank.isEmpty(tokenUserId)) {
-            return Result.no(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
-        }
-        List<Integer> roleIdList = userDao.getRoleIdListByUserId(tokenUserId);
-        for (Integer roleId : roleIdList) {
-            if (roleId == ConstantStr.ROLE_ADMIN) {
-                //查询出拥有新旧角色集合拥有的公共角色
-                List<Role> shareRoleList = userDao.getShareRoleList(userId, roleList);
-                //增加新增的角色信息
-                List<Role> newRoleList = new ArrayList<>();
-                if (Blank.isEmpty(shareRoleList)) {
-                    newRoleList = roleList;
-                    //删除原来的久角色
-                    userDao.deleteUserRoleByUserId(userId);
-                } else {
-                    for (int i = 0; i < roleList.size(); i++) {
-                        Boolean flage = false;
-                        for (int j = 0; j < shareRoleList.size(); j++) {
-                            if (roleList.get(i).getId() == shareRoleList.get(j).getId()) {
-                                flage = true;
-                                break;
-                            }
-                        }
-                        if (!flage) {
-                            newRoleList.add(roleList.get(i));
-                        }
-                    }
-                    //删除不在公共角色的旧角色Id
-                    List<Integer> oldRoleList = userDao.getNoShareOldRoleList(userId, shareRoleList);
-                    if(Blank.isNotEmpty(oldRoleList)){
-                        userDao.deleteUserRole(userId, oldRoleList);
+    public synchronized Result assignRole(String userId, List<Role> roleList) {
+        //查询出拥有新旧角色集合拥有的公共角色
+        List<Role> shareRoleList = userDao.getShareRoleList(userId, roleList);
+        //增加新增的角色信息
+        List<Role> newRoleList = new ArrayList<>();
+        if (Blank.isEmpty(shareRoleList)) {
+            newRoleList = roleList;
+            //删除原来的角色
+            userDao.deleteUserRoleByUserId(userId);
+        } else {
+            for (int i = 0; i < roleList.size(); i++) {
+                Boolean flage = false;
+                for (int j = 0; j < shareRoleList.size(); j++) {
+                    if (roleList.get(i).getId() == shareRoleList.get(j).getId()) {
+                        flage = true;
+                        break;
                     }
                 }
-                userDao.addRoleList(userId, newRoleList);
-                return Result.ok("分配角色成功");
+                if (!flage) {
+                    newRoleList.add(roleList.get(i));
+                }
+            }
+            //删除不在公共角色的旧角色Id
+            List<Integer> oldRoleIdList = userDao.getNoShareOldRoleList(userId, shareRoleList);
+            if (Blank.isNotEmpty(oldRoleIdList)) {
+                userDao.deleteUserRole(userId, oldRoleIdList);
             }
         }
-        return Result.no(ResultEnum.NO_OPERATION_AUTHORITY.getRespCode(), ResultEnum.NO_OPERATION_AUTHORITY.getRespMsg());
+        if (Blank.isNotEmpty(newRoleList)) {
+            userDao.addRoleList(userId, newRoleList);
+        }
+        return Result.ok("分配角色成功");
     }
 
     @Override
-    public Result userLoginOut(HttpServletRequest request) {
-        String token = request.getHeader("token");
+    public Result userLoginOut() {
+        String token = userUtil.getToken();
         redisUtil.del(token);
         return Result.ok(true);
     }
 
     @Override
-    public Result getUserPage(HttpServletRequest request, int page, int limit) {
-        String token = request.getHeader("token");
-        if (Blank.isEmpty(token)) {
-            return Result.no(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
-        }
-        String userId = userUtil.getCurrentUserId(token);
-        if (Blank.isEmpty(userId)) {
-            return Result.no(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
-        }
-        List<Integer> roleIdList = userDao.getRoleIdListByUserId(userId);
-        for (Integer roleId : roleIdList) {
-            if (roleId == ConstantStr.ROLE_ADMIN) {
-                JSONObject jsonObject = new JSONObject();
-                Long count = userDao.getUserCount();
-                Long startNum = Long.valueOf((page - 1) * limit);
-                List<User> userList = userDao.getUserPage(startNum, Long.valueOf(limit));
-                jsonObject.put("count", count);
-                jsonObject.put("userList", userList);
-                return Result.ok(jsonObject);
-            }
-        }
-        return Result.no(ResultEnum.NO_OPERATION_AUTHORITY.getRespCode(), ResultEnum.NO_OPERATION_AUTHORITY.getRespMsg());
+    public Result getUserPage(int page, int limit) {
+        JSONObject jsonObject = new JSONObject();
+        Long count = userDao.getUserCount();
+        Long startNum = Long.valueOf((page - 1) * limit);
+        List<User> userList = userDao.getUserPage(startNum, Long.valueOf(limit));
+        jsonObject.put("count", count);
+        jsonObject.put("userList", userList);
+        return Result.ok(jsonObject);
     }
 
     @Override
-    public Result getUserById(HttpServletRequest request, String userId) {
-        String token = request.getHeader("token");
-        if (Blank.isEmpty(token)) {
-            return Result.no(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
-        }
-        String tokenUserId = userUtil.getCurrentUserId(token);
-        if (Blank.isEmpty(tokenUserId)) {
-            return Result.no(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
-        }
+    public Result getUserById(String userId) {
+        String tokenUserId = userUtil.getCurrentUserId();
         List<Integer> roleIdList = userDao.getRoleIdListByUserId(tokenUserId);
         for (Integer roleId : roleIdList) {
             if (roleId == ConstantStr.ROLE_ADMIN) {
@@ -231,4 +199,154 @@ public class UserServiceImpl implements UserService {
         }
         return Result.no(ResultEnum.NO_OPERATION_AUTHORITY.getRespCode(), ResultEnum.NO_OPERATION_AUTHORITY.getRespMsg());
     }
+
+    @Override
+    public Result updateUserStateById(String userId, Integer userState) {
+        if (userState != ConstantStr.NORMAL_USE && userState != ConstantStr.LOCK_USER && userState != ConstantStr.TOMBSTONE) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "用户状态参数只能为0,1,2");
+        }
+        String msg = "";
+        if (userState == ConstantStr.NORMAL_USE) {
+            msg = "用户变更为正常用户";
+        } else if (userState == ConstantStr.LOCK_USER) {
+            msg = "锁定用户";
+        } else if (userState == ConstantStr.TOMBSTONE) {
+            msg = "删除用户";
+        }
+        if (userDao.updateUserState(userId, userState) <= 0) {
+            return Result.no(ResultEnum.SERVER_ERROR.getRespCode(), msg + "失败");
+        }
+        return Result.ok(msg + "成功");
+    }
+
+    @Override
+    public synchronized Result updateUser(User user) {
+        if (Blank.isEmpty(user.getUserId()) || Blank.isEmpty(user.getUserName()) || Blank.isEmpty(user.getPassword())) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "用户Id不能为空,用户名不能为空,密码不能为空");
+        }
+        if (Blank.isNotEmpty(userDao.getUserByNameNoId(user.getUserId(), user.getUserName()))) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "该用户名已被使用,请更换其他用户名");
+        }
+        user.setPassword(EncryptUtils.StrToMD5(user.getPassword()));
+        if (userDao.updateUser(user) <= 0) {
+            return Result.no(ResultEnum.SERVER_ERROR.getRespCode(), "修改用户失败");
+        }
+        return Result.ok("修改用户成功");
+    }
+
+    @Override
+    public synchronized Result updateRole(Role role) {
+        if (Blank.isEmpty(role.getId()) || Blank.isEmpty(role.getRoleName())) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "角色Id和角色名称不能为空");
+        }
+        if (Blank.isNotEmpty(userDao.getRoleByNoIdName(role.getId(), role.getRoleName()))) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "已存在该角色名,请更换角色名称");
+        }
+        if (userDao.updateRole(role) <= 0) {
+            return Result.no(ResultEnum.SERVER_ERROR.getRespCode(), "修改角色失败");
+        }
+        return Result.ok("修改角色成功");
+    }
+
+    @Override
+    public Result getRoleListByPage(Integer page, Integer limit) {
+        JSONObject jsonObject = new JSONObject();
+        Long count = userDao.getRoleCount();
+        Long startNum = Long.valueOf((page - 1) * limit);
+        List<Role> roleList = userDao.getRoleListByPage(startNum, Long.valueOf(limit));
+        jsonObject.put("count", count);
+        jsonObject.put("roleList", roleList);
+        return Result.ok(jsonObject);
+    }
+
+    @Override
+    public Result getRoleById(Integer id) {
+        return Result.ok(userDao.getRoleById(id));
+    }
+
+    @Override
+    public synchronized Result addPermission(Permission permission) {
+        if (Blank.isEmpty(permission.getPermissionUrl()) || Blank.isEmpty(permission.getPermissionName())) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "权限路径和名称不能为空");
+        }
+        if (Blank.isNotEmpty(userDao.getPermissionByUrl(permission.getPermissionUrl()))) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "该路径已分配权限,请更换其他路径");
+        }
+        if (userDao.addPermission(permission) <= 0) {
+            return Result.no(ResultEnum.SERVER_ERROR.getRespCode(), "新增权限失败");
+        }
+        return Result.ok("新增资源权限成功");
+    }
+
+    @Override
+    public synchronized Result updatePermission(Permission permission) {
+        if (Blank.isEmpty(permission.getId()) || Blank.isEmpty(permission.getPermissionUrl()) || Blank.isEmpty(permission.getPermissionName())) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "权限id,路径,名称不能为空");
+        }
+        if (Blank.isNotEmpty(userDao.getPermissionByNoIdUrl(permission.getId(), permission.getPermissionUrl()))) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "已存在该权限路径,请更换权限路径");
+        }
+        if (userDao.updatePermission(permission) <= 0) {
+            return Result.no(ResultEnum.SERVER_ERROR.getRespCode(), "修改权限失败");
+        }
+        return Result.ok("修改权限成功");
+    }
+
+    @Override
+    public Result getPermissionById(Integer id) {
+        return Result.ok(userDao.getPermissionById(id));
+    }
+
+    @Override
+    public Result getPermissionListByPage(Integer page, Integer limit) {
+        JSONObject jsonObject = new JSONObject();
+        Long count = userDao.getPermissionCount();
+        Long startNum = Long.valueOf((page - 1) * limit);
+        List<Permission> permissionList = userDao.getPermissionListByPage(startNum, Long.valueOf(limit));
+        jsonObject.put("count", count);
+        jsonObject.put("permissionList", permissionList);
+        return Result.ok(jsonObject);
+    }
+
+    @Override
+    public Result deletePermissionById(Integer id) {
+        if (userDao.deletePermissionById(id) <= 0) {
+            return Result.no(ResultEnum.SERVER_ERROR.getRespCode(), "删除权限失败");
+        }
+        userDao.deleteRolePermissionById(id);
+        return Result.ok("删除权限成功");
+    }
+
+    @Override
+    public Result assignPermission(int roleId, List<Permission> permissionList) {
+        List<Permission> sharePermissionList = userDao.getSharePermissionList(roleId, permissionList);
+        List<Permission> newPermissionList = new ArrayList<>();
+        if (Blank.isEmpty(sharePermissionList)) {
+            newPermissionList = permissionList;
+            //删除原来的角色
+            userDao.deleteRolePermissionByRoleId(roleId);
+        } else {
+            for (int i = 0; i < permissionList.size(); i++) {
+                Boolean flage = false;
+                for (int j = 0; j < sharePermissionList.size(); j++) {
+                    if (permissionList.get(i).getId() == sharePermissionList.get(j).getId()) {
+                        flage = true;
+                        break;
+                    }
+                }
+                if (!flage) {
+                    newPermissionList.add(permissionList.get(i));
+                }
+            }
+            //删除不在公共角色的旧角色Id
+            List<Integer> oldPermissionIdList = userDao.getNoShareOldPermissionList(roleId, sharePermissionList);
+            if (Blank.isNotEmpty(oldPermissionIdList)) {
+                userDao.deleteRolePermission(roleId, oldPermissionIdList);
+            }
+        }
+        if (Blank.isNotEmpty(newPermissionList)) {
+            userDao.addPermissionList(roleId, newPermissionList);
+        }
+        return Result.ok("分配权限成功");
+    }
 }

+ 3 - 2
chuanyi_server/src/main/java/com/judong/chuanyiserver/util/ConstantStr.java

@@ -19,11 +19,12 @@ public class ConstantStr {
     public static final long HALF_HOUR = 60 * 30;
     public static final long ONE_HOUR = 60 * 60;
 
-    //用户状态
+    //用户状态,0正常,1锁定,2已逻辑删除
     public static final int NORMAL_USE = 0;
     public static final int LOCK_USER = 1;
+    public static final int TOMBSTONE = 2;
 
-    //OPC协议类型
+    //OPC协议类型;0DA,1UA
     public static final int OPC_DA = 0;
     public static final int OPC_UA = 1;
 

+ 96 - 0
chuanyi_server/src/main/java/com/judong/chuanyiserver/util/KeyStoreLoader.java

@@ -0,0 +1,96 @@
+package com.judong.chuanyiserver.util;
+
+import org.eclipse.milo.opcua.sdk.server.util.HostnameUtil;
+import org.eclipse.milo.opcua.stack.core.util.SelfSignedCertificateBuilder;
+import org.eclipse.milo.opcua.stack.core.util.SelfSignedCertificateGenerator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.security.*;
+import java.security.cert.X509Certificate;
+import java.util.regex.Pattern;
+
+public class KeyStoreLoader {
+
+    private final Logger logger = LoggerFactory.getLogger(getClass());
+    private static final Pattern IP_ADDR_PATTERN = Pattern.compile(
+            "^(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])$");
+    // 证书别名
+    private static final String CLIENT_ALIAS = "client-ai";
+    // 获取私钥的密码
+    private static final char[] PASSWORD = "password".toCharArray();
+    // 证书对象
+    private X509Certificate clientCertificate;
+    // 密钥对对象
+    private KeyPair clientKeyPair;
+    KeyStoreLoader load(Path baseDir) throws Exception {
+        // 创建一个使用`PKCS12`加密标准的KeyStore。KeyStore在后面将作为读取和生成证书的对象。
+        KeyStore keyStore = KeyStore.getInstance("PKCS12");
+        // PKCS12的加密标准的文件后缀是.pfx,其中包含了公钥和私钥。
+        // 而其他如.der等的格式只包含公钥,私钥在另外的文件中。
+        Path serverKeyStore = baseDir.resolve("example-client.pfx");
+        logger.info("Loading KeyStore at {}", serverKeyStore);
+        // 如果文件不存在则创建.pfx证书文件。
+        if (!Files.exists(serverKeyStore)) {
+            keyStore.load(null, PASSWORD);
+            // 用2048位的RAS算法。`SelfSignedCertificateGenerator`为Milo库的对象。
+            KeyPair keyPair = SelfSignedCertificateGenerator.generateRsaKeyPair(2048);
+            // `SelfSignedCertificateBuilder`也是Milo库的对象,用来生成证书。
+            // 中间所设置的证书属性可以自行修改。
+            SelfSignedCertificateBuilder builder = new SelfSignedCertificateBuilder(keyPair)
+                    .setCommonName("Eclipse Milo Example Client")
+                    .setOrganization("digitalpetri")
+                    .setOrganizationalUnit("dev")
+                    .setLocalityName("Folsom")
+                    .setStateName("CA")
+                    .setCountryCode("US")
+                    .setApplicationUri("urn:eclipse:milo:examples:client")
+                    .addDnsName("localhost")
+                    .addIpAddress("127.0.0.1");
+            // Get as many hostnames and IP addresses as we can listed in the certificate.
+            for (String hostname : HostnameUtil.getHostnames("0.0.0.0")) {
+                if (IP_ADDR_PATTERN.matcher(hostname).matches()) {
+                    builder.addIpAddress(hostname);
+                } else {
+                    builder.addDnsName(hostname);
+                }
+            }
+            // 创建证书
+            X509Certificate certificate = builder.build();
+            // 设置对应私钥的别名,密码,证书链
+            keyStore.setKeyEntry(CLIENT_ALIAS, keyPair.getPrivate(), PASSWORD, new X509Certificate[]{certificate});
+            try (OutputStream out = Files.newOutputStream(serverKeyStore)) {
+                // 保存证书到输出流
+                keyStore.store(out, PASSWORD);
+            }
+        } else {
+            try (InputStream in = Files.newInputStream(serverKeyStore)) {
+                // 如果文件存在则读取
+                keyStore.load(in, PASSWORD);
+            }
+        }
+        // 用密码获取对应别名的私钥。
+        Key serverPrivateKey = keyStore.getKey(CLIENT_ALIAS, PASSWORD);
+        if (serverPrivateKey instanceof PrivateKey) {
+            // 获取对应别名的证书对象。
+            clientCertificate = (X509Certificate) keyStore.getCertificate(CLIENT_ALIAS);
+            // 获取公钥
+            PublicKey serverPublicKey = clientCertificate.getPublicKey();
+            // 创建Keypair对象。
+            clientKeyPair = new KeyPair(serverPublicKey, (PrivateKey) serverPrivateKey);
+        }
+        return this;
+    }
+    // 返回证书
+    X509Certificate getClientCertificate() {
+        return clientCertificate;
+    }
+    // 返回密钥对
+    KeyPair getClientKeyPair() {
+        return clientKeyPair;
+    }
+}

+ 131 - 1
chuanyi_server/src/main/java/com/judong/chuanyiserver/util/OpcDataUtil.java → chuanyi_server/src/main/java/com/judong/chuanyiserver/util/OpcServerDaUtil.java

@@ -1,8 +1,15 @@
 package com.judong.chuanyiserver.util;
 
 import com.alibaba.fastjson.JSONObject;
+import com.judong.chuanyiserver.config.OpcServerDaPoolFactory;
+import com.judong.chuanyiserver.entity.ServerInformation;
+import com.judong.chuanyiserver.enums.ResultEnum;
+import org.apache.commons.pool2.impl.GenericKeyedObjectPool;
 import org.jinterop.dcom.common.JIException;
 import org.jinterop.dcom.core.JIVariant;
+import org.openscada.opc.dcom.da.OPCSERVERSTATE;
+import org.openscada.opc.lib.da.Group;
+import org.openscada.opc.lib.da.Item;
 import org.openscada.opc.lib.da.Server;
 import org.openscada.opc.lib.da.browser.Branch;
 import org.openscada.opc.lib.da.browser.Leaf;
@@ -11,7 +18,130 @@ import org.openscada.opc.lib.da.browser.TreeBrowser;
 import java.net.UnknownHostException;
 import java.util.*;
 
-public class OpcDataUtil {
+/**
+ * OPCDa协议工具类
+ */
+public class OpcServerDaUtil {
+
+    /**
+     * 通过ip,user,password生成对应的连接池键
+     *
+     * @param ip
+     * @param user
+     * @param password
+     * @return
+     */
+    public static String generateOpcPoolKey(String ip, String user, String password) {
+        StringBuffer buffer = new StringBuffer("");
+        buffer.append("{\"ip\":\"");
+        buffer.append(ip + "\",\"user\":\"");
+        buffer.append(user + "\",\"password\":\"");
+        buffer.append(password + "\"}");
+        return buffer.toString();
+    }
+
+    /**
+     * 判断传入的键是否符合OPCserver池对象规则
+     *
+     * @param key
+     * @return
+     */
+    public static Boolean validationKey(String key) {
+        if (Blank.isEmpty(key)) {
+            return false;
+        }
+        JSONObject jsonObject = (JSONObject) JSONObject.parse(key);
+        String ip = (String) jsonObject.get("ip");
+        String user = (String) jsonObject.get("user");
+        String password = (String) jsonObject.get("password");
+        if (Blank.isEmpty(ip) || Blank.isEmpty(user) || Blank.isEmpty(password)) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * 通过键获取OPCserver
+     * 如果没有这个对象,则会创建这个对象
+     *
+     * @param key
+     * @return
+     * @throws Exception
+     */
+    public static Server getServer(String key) throws Exception {
+        return OpcServerDaPoolFactory.getServer(key);
+    }
+
+    /**
+     * 返回Server给连接池
+     */
+    public static void returnServer(String key, Server server) throws Exception {
+        OpcServerDaPoolFactory.returnServer(key, server);
+    }
+
+    /**
+     * 查看连接池中所有的连接
+     *
+     * @return
+     */
+    public static GenericKeyedObjectPool<String, Server> getPool() throws Exception {
+        GenericKeyedObjectPool<String, Server> pool = OpcServerDaPoolFactory.getPool();
+//        System.out.println(pool.);
+        return OpcServerDaPoolFactory.getPool();
+    }
+
+    /**
+     * 通过服务器信息读取服务器树item
+     *
+     * @param serverInformation
+     * @return
+     * @throws Exception
+     */
+    public static Result opcDaReadItemTree(ServerInformation serverInformation) throws Exception {
+        String opcServerDaPoolKey = OpcServerDaUtil.generateOpcPoolKey(serverInformation.getIpAddress(), serverInformation.getIpUserName(), serverInformation.getIpPassword());
+        if (OpcServerDaUtil.validationKey(opcServerDaPoolKey)) {
+            Server server = OpcServerDaUtil.getServer(opcServerDaPoolKey);
+            if (null == server.getServerState()) {
+                return Result.no(ResultEnum.NOT_FOUND.getRespCode(), "连接失败");
+            }
+            if (OPCSERVERSTATE.OPC_STATUS_RUNNING == server.getServerState().getServerState()) {
+                JSONObject jsonObject = new JSONObject();
+                jsonObject.put("tree", OpcServerDaUtil.generOpcDaTree(server));
+                OpcServerDaUtil.returnServer(opcServerDaPoolKey, server);
+                return Result.ok(jsonObject);
+            }
+        }
+        return Result.no(ResultEnum.SERVER_ERROR.getRespCode(), ResultEnum.SERVER_ERROR.getRespMsg());
+    }
+
+    /**
+     * 通过服务器信息和标签名称读取响应的数据
+     *
+     * @param serverInformation
+     * @param itemName
+     * @return
+     * @throws Exception
+     */
+    public static Result opcDaReadItemValue(ServerInformation serverInformation, String itemName) throws Exception {
+        String opcServerDaPoolKey = OpcServerDaUtil.generateOpcPoolKey(serverInformation.getIpAddress(), serverInformation.getIpUserName(), serverInformation.getIpPassword());
+        if (OpcServerDaUtil.validationKey(opcServerDaPoolKey)) {
+            Server server = OpcServerDaUtil.getServer(opcServerDaPoolKey);
+            if (null == server.getServerState()) {
+                return Result.no(ResultEnum.NOT_FOUND.getRespCode(), "连接失败");
+            }
+            if (OPCSERVERSTATE.OPC_STATUS_RUNNING == server.getServerState().getServerState()) {
+                JSONObject jsonObject = new JSONObject();
+                Group group = server.addGroup();
+                Item item = group.addItem(itemName);
+                Map<String, Object> value = getVal(item.read(true).getValue());
+                jsonObject.put("javaType", value.get("javaType"));
+                jsonObject.put("value", value);
+                OpcServerDaUtil.returnServer(opcServerDaPoolKey, server);
+                return Result.ok(jsonObject);
+            }
+        }
+        return Result.no(ResultEnum.SERVER_ERROR.getRespCode(), ResultEnum.SERVER_ERROR.getRespMsg());
+    }
 
     /**
      * 获取OPCDA服务器的tree

+ 0 - 89
chuanyi_server/src/main/java/com/judong/chuanyiserver/util/OpcServerPoolUtil.java

@@ -1,89 +0,0 @@
-package com.judong.chuanyiserver.util;
-
-import com.alibaba.fastjson.JSONObject;
-import com.judong.chuanyiserver.config.OpcServerPoolFactory;
-import org.apache.commons.pool2.impl.GenericKeyedObjectPool;
-import org.openscada.opc.lib.da.Server;
-import org.springframework.util.StringUtils;
-
-public class OpcServerPoolUtil {
-
-    /**
-     * 通过ip,user,password生成对应的连接池键
-     *
-     * @param ip
-     * @param user
-     * @param password
-     * @return
-     */
-    public static String generateOpcPoolKey(String ip, String user, String password) {
-        StringBuffer buffer = new StringBuffer("");
-        buffer.append("{\"ip\":\"");
-        buffer.append(ip + "\",\"user\":\"");
-        buffer.append(user + "\",\"password\":\"");
-        buffer.append(password + "\"}");
-        return buffer.toString();
-    }
-
-    /**
-     * 判断传入的键是否符合OPCserver池对象规则
-     *
-     * @param key
-     * @return
-     */
-    public static Boolean validationKey(String key) {
-        if (StringUtils.isEmpty(key)) {
-            return false;
-        }
-        JSONObject jsonObject = (JSONObject) JSONObject.parse(key);
-        String ip = (String) jsonObject.get("ip");
-        String user = (String) jsonObject.get("user");
-        String password = (String) jsonObject.get("password");
-        if (StringUtils.isEmpty(ip) || StringUtils.isEmpty(user) || StringUtils.isEmpty(password)) {
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * 通过键创建对象,并添加的对象池中
-     *
-     * @param key
-     * @throws Exception
-     */
-    public static void addServer(String key) throws Exception {
-        if (OpcServerPoolFactory.getPool() == null) {
-            OpcServerPoolFactory.init();
-        }
-        OpcServerPoolFactory.addServer(key);
-    }
-
-    /**
-     * 通过键获取OPCserver
-     * 如果没有这个对象,则会创建这个对象
-     *
-     * @param key
-     * @return
-     * @throws Exception
-     */
-    public static Server getServer(String key) throws Exception {
-        return OpcServerPoolFactory.getServer(key);
-    }
-
-    /**
-     * 返回Server给连接池
-     */
-    public static void getServer(String key, Server server) throws Exception {
-        OpcServerPoolFactory.returnServer(key, server);
-    }
-
-    /**
-     * 查看连接池中所有的连接
-     * @return
-     */
-    public static GenericKeyedObjectPool<String, Server> getPool() throws Exception {
-        GenericKeyedObjectPool<String, Server> pool = OpcServerPoolFactory.getPool();
-//        System.out.println(pool.);
-        return OpcServerPoolFactory.getPool();
-    }
-}

+ 202 - 0
chuanyi_server/src/main/java/com/judong/chuanyiserver/util/OpcServerUaUtil.java

@@ -0,0 +1,202 @@
+package com.judong.chuanyiserver.util;
+
+import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
+import org.eclipse.milo.opcua.sdk.client.api.identity.AnonymousProvider;
+import org.eclipse.milo.opcua.sdk.client.nodes.UaNode;
+import org.eclipse.milo.opcua.sdk.client.subscriptions.ManagedDataItem;
+import org.eclipse.milo.opcua.sdk.client.subscriptions.ManagedSubscription;
+import org.eclipse.milo.opcua.stack.core.AttributeId;
+import org.eclipse.milo.opcua.stack.core.Identifiers;
+import org.eclipse.milo.opcua.stack.core.security.SecurityPolicy;
+import org.eclipse.milo.opcua.stack.core.types.builtin.*;
+import org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.UInteger;
+import org.eclipse.milo.opcua.stack.core.types.enumerated.MonitoringMode;
+import org.eclipse.milo.opcua.stack.core.types.enumerated.TimestampsToReturn;
+import org.eclipse.milo.opcua.stack.core.types.structured.MonitoredItemCreateRequest;
+import org.eclipse.milo.opcua.stack.core.types.structured.MonitoringParameters;
+import org.eclipse.milo.opcua.stack.core.types.structured.ReadValueId;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.CountDownLatch;
+
+public class OpcServerUaUtil {
+    /**
+     * 创建OPC UA客户端
+     *
+     * @return
+     */
+    public OpcUaClient createClient() throws Exception {
+        //opc ua服务端地址
+        String endPointUrl = "opc.tcp://192.168.0.138:37800";
+        Path securityTempDir = Paths.get(System.getProperty("java.io.tmpdir"), "security");
+        Files.createDirectories(securityTempDir);
+        if (!Files.exists(securityTempDir)) {
+            throw new Exception("unable to create security dir: " + securityTempDir);
+        }
+        return OpcUaClient.create(endPointUrl,
+                endpoints ->
+                        endpoints.stream()
+                                .filter(e -> e.getSecurityPolicyUri().equals(SecurityPolicy.None.getUri()))
+                                .findFirst(),
+                configBuilder ->
+                        configBuilder
+                                .setApplicationName(LocalizedText.english("eclipse milo opc-ua client"))
+                                .setApplicationUri("urn:eclipse:milo:examples:client")
+                                //访问方式(new AnonymousProvider()表示使用匿名方式访问,也可以通过new UsernameProvider(userName, password)方式访问。)
+                                .setIdentityProvider(new AnonymousProvider())
+                                .setRequestTimeout(UInteger.valueOf(5000))
+                                .build()
+        );
+    }
+
+    /**
+     * 遍历树形节点
+     *
+     * @param client OPC UA客户端
+     * @param uaNode 节点
+     * @throws Exception
+     */
+    private static void browseNode(OpcUaClient client, UaNode uaNode) throws Exception {
+        List<? extends UaNode> nodes;
+        if (uaNode == null) {
+            nodes = client.getAddressSpace().browseNodes(Identifiers.ObjectsFolder);
+        } else {
+            nodes = client.getAddressSpace().browseNodes(uaNode);
+        }
+        for (UaNode nd : nodes) {
+            //排除系统行性节点,这些系统性节点名称一般都是以"_"开头
+            if (Objects.requireNonNull(nd.getBrowseName().getName()).contains("_")) {
+                continue;
+            }
+            System.out.println("Node= " + nd.getBrowseName().getName());
+            browseNode(client, nd);
+        }
+    }
+
+    /**
+     * 读取节点数据
+     *
+     * @param client OPC UA客户端
+     * @throws Exception
+     */
+    private static void readNode(OpcUaClient client) throws Exception {
+        int namespaceIndex = 2;
+        String identifier = "TD-01.SB-01.AG-01";
+        //节点
+        NodeId nodeId = new NodeId(namespaceIndex, identifier);
+        //读取节点数据
+        DataValue value = client.readValue(0.0, TimestampsToReturn.Neither, nodeId).get();
+        //标识符
+        identifier = String.valueOf(nodeId.getIdentifier());
+        System.out.println(identifier + ": " + String.valueOf(value.getValue().getValue()));
+    }
+
+    /**
+     * 写入节点数据
+     *
+     * @param client
+     * @throws Exception
+     */
+    private static void writeNodeValue(OpcUaClient client) throws Exception {
+        //节点
+        NodeId nodeId = new NodeId(2, "TD-01.SB-01.AG-01");
+        short i = 3;
+        //创建数据对象,此处的数据对象一定要定义类型,不然会出现类型错误,导致无法写入
+        DataValue nowValue = new DataValue(new Variant(i), null, null);
+        //写入节点数据
+        StatusCode statusCode = client.writeValue(nodeId, nowValue).join();
+        System.out.println("结果:" + statusCode.isGood());
+    }
+
+    /**
+     * 订阅(单个)
+     *
+     * @param client
+     * @throws Exception
+     */
+    private static void subscribe(OpcUaClient client) throws Exception {
+        //创建发布间隔1000ms的订阅对象
+        client
+                .getSubscriptionManager()
+                .createSubscription(1000.0)
+                .thenAccept(t -> {
+                    //节点
+                    NodeId nodeId = new NodeId(2, "TD-01.SB-01.AG-01");
+                    ReadValueId readValueId = new ReadValueId(nodeId, AttributeId.Value.uid(), null, null);
+                    //创建监控的参数
+                    MonitoringParameters parameters = new MonitoringParameters(UInteger.valueOf(1), 1000.0, null, UInteger.valueOf(10), true);
+//                    MonitoringParameters parameters = new MonitoringParameters(UInteger.valueOf(atomic.getAndIncrement()), 1000.0, null, UInteger.valueOf(10), true);
+                    //创建监控项请求
+                    //该请求最后用于创建订阅。
+                    MonitoredItemCreateRequest request = new MonitoredItemCreateRequest(readValueId, MonitoringMode.Reporting, parameters);
+                    List<MonitoredItemCreateRequest> requests = new ArrayList<>();
+                    requests.add(request);
+                    //创建监控项,并且注册变量值改变时候的回调函数。
+                    t.createMonitoredItems(
+                            TimestampsToReturn.Both,
+                            requests,
+                            (item, id) -> item.setValueConsumer((it, val) -> {
+                                System.out.println("nodeid :" + it.getReadValueId().getNodeId());
+                                System.out.println("value :" + val.getValue().getValue());
+                            })
+                    );
+                }).get();
+
+        //持续订阅
+        Thread.sleep(Long.MAX_VALUE);
+    }
+
+    /**
+     * 批量订阅
+     *
+     * @param client
+     * @throws Exception
+     */
+    private static void managedSubscriptionEvent(OpcUaClient client) throws Exception {
+        final CountDownLatch eventLatch = new CountDownLatch(1);
+
+        //处理订阅业务
+        handlerNode(client);
+
+        //持续监听
+        eventLatch.await();
+    }
+
+    /**
+     * 处理订阅业务
+     *
+     * @param client OPC UA客户端
+     */
+    private static void handlerNode(OpcUaClient client) {
+        try {
+            //创建订阅
+            ManagedSubscription subscription = ManagedSubscription.create(client);
+
+            //你所需要订阅的key
+            List<String> key = new ArrayList<>();
+            key.add("TD-01.SB-01.AG-01");
+            key.add("TD-01.SB-01.AG-02");
+
+            List<NodeId> nodeIdList = new ArrayList<>();
+            for (String s : key) {
+                nodeIdList.add(new NodeId(2, s));
+            }
+
+            //监听
+            List<ManagedDataItem> dataItemList = subscription.createDataItems(nodeIdList);
+            for (ManagedDataItem managedDataItem : dataItemList) {
+                managedDataItem.addDataValueListener((t) -> {
+                    System.out.println(managedDataItem.getNodeId().getIdentifier().toString() + ":" + t.getValue().getValue().toString());
+                });
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+}

+ 72 - 20
chuanyi_server/src/main/java/com/judong/chuanyiserver/util/Test.java

@@ -1,30 +1,82 @@
 package com.judong.chuanyiserver.util;
 
-import com.judong.chuanyiserver.config.OpcServerPoolFactory;
-import org.openscada.opc.lib.da.Server;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
+import org.eclipse.milo.opcua.sdk.client.api.config.OpcUaClientConfig;
+import org.eclipse.milo.opcua.sdk.client.api.identity.AnonymousProvider;
+import org.eclipse.milo.opcua.sdk.client.api.identity.UsernameProvider;
+import org.eclipse.milo.opcua.sdk.client.nodes.UaNode;
+import org.eclipse.milo.opcua.sdk.client.subscriptions.ManagedDataItem;
+import org.eclipse.milo.opcua.sdk.client.subscriptions.ManagedSubscription;
+import org.eclipse.milo.opcua.stack.core.AttributeId;
+import org.eclipse.milo.opcua.stack.core.Identifiers;
+import org.eclipse.milo.opcua.stack.core.security.SecurityPolicy;
+import org.eclipse.milo.opcua.stack.core.types.builtin.*;
+import org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.UInteger;
+import org.eclipse.milo.opcua.stack.core.types.enumerated.MonitoringMode;
+import org.eclipse.milo.opcua.stack.core.types.enumerated.TimestampsToReturn;
+import org.eclipse.milo.opcua.stack.core.types.structured.EndpointDescription;
+import org.eclipse.milo.opcua.stack.core.types.structured.MonitoredItemCreateRequest;
+import org.eclipse.milo.opcua.stack.core.types.structured.MonitoringParameters;
+import org.eclipse.milo.opcua.stack.core.types.structured.ReadValueId;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import static org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.Unsigned.uint;
 
 public class Test {
 
-    @Autowired
-    private static RedisUtil redisUtil;
+    private final CompletableFuture<OpcUaClient> future = new CompletableFuture<>();
+    private static Logger logger = LoggerFactory.getLogger(Test.class);
+    private final static String endPointUrl = "opc.tcp://192.168.0.138:37800";
+    private static AtomicInteger atomic = new AtomicInteger(1);
 
     public static void main(String[] args) throws Exception {
-        redisUtil.set("testId",1);
-        System.out.println(redisUtil.get("testId"));
-//        String ip = "110";
-//        String user = "张三";
-//        String password = "123456";
-        String ip = "192.168.0.2";
-        String user = "Administrator";
-        String password = "jd123456";
-        String key = OpcServerPoolUtil.generateOpcPoolKey(ip, user, password);
-        System.out.println("生成的key:" + key);
-        System.out.println("是否符合连接池key要求:" + OpcServerPoolUtil.validationKey(key));
-//        System.out.println("现在连接池中的连接:" + OpcServerPoolUtil.getPool());
-        OpcServerPoolUtil.addServer(key);
-        System.out.println("现在连接池中的连接:" + OpcServerPoolUtil.getPool());
-        Server server=null;
+//        OpcUaClient opcUaClient = createClient();
+
+        //开启连接
+//        opcUaClient.connect().get();
     }
 
+    /**
+     * 创建OPC UA的服务连接对象
+     */
+//    private static OpcUaClient createClient() throws Exception {
+//        Path securityTempDir = Paths.get(System.getProperty("java.io.tmpdir"), "security");
+//        Files.createDirectories(securityTempDir);
+//        if (!Files.exists(securityTempDir)) {
+//            throw new Exception("不能够创建安全路径: " + securityTempDir);
+//        }
+//        KeyStoreLoader loader = new KeyStoreLoader().load(securityTempDir);
+//        // 获取OPC UA的服务器端节点
+//        EndpointDescription[] endpoints =
+//                UaTcpStackClient.getEndpoints(endPointUrl).get();
+//        EndpointDescription endpoint = Arrays.stream(endpoints)
+//                .filter(e -> e.getEndpointUrl().equals(endPointUrl))
+//                .findFirst().orElseThrow(() -> new Exception("没有节点返回"));
+//        // 设置OPC UA的配置信息
+//        OpcUaClientConfig config =
+//                OpcUaClientConfig.builder()
+//                        .setApplicationName(LocalizedText.english("OPC UA SCREEN"))
+//                        .setApplicationUri("urn:DATA-TRANSFER:OPC UA SCREEN")
+//                        .setCertificate(loader.getClientCertificate())
+//                        .setKeyPair(loader.getClientKeyPair())
+//                        .setEndpoint(endpoint)
+//                        .setIdentityProvider(new UsernameProvider("Administrator", "123456"))
+//                        .setRequestTimeout(uint(5000))
+//                        .build();
+//        // 创建OPC UA客户端
+//        return new OpcUaClient(config);
+//    }
+
 }

+ 68 - 9
chuanyi_server/src/main/java/com/judong/chuanyiserver/util/UserUtil.java

@@ -2,8 +2,15 @@ package com.judong.chuanyiserver.util;
 
 import com.judong.chuanyiserver.dao.UserDao;
 import com.judong.chuanyiserver.entity.User;
+import com.judong.chuanyiserver.enums.ResultEnum;
+import com.judong.chuanyiserver.exception.CustomException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 
 @Component
 public class UserUtil {
@@ -15,30 +22,82 @@ public class UserUtil {
     private UserDao userDao;
 
     /**
-     * 通过token获取当前登录人信息
+     * 获取请求中的token
+     *
+     * @return
+     */
+    public String getToken() {
+        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        HttpServletRequest request = attributes.getRequest();
+        String token = request.getHeader("token");
+        if (Blank.isEmpty(token)) {
+            throw new CustomException(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
+        }
+        return token;
+    }
+
+    /**
+     * 获取当前登录人信息
      *
-     * @param token
      * @return
      */
-    public User getCurrentUser(String token) {
+    public User getCurrentUser() {
+        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        HttpServletRequest request = attributes.getRequest();
+        String token = request.getHeader("token");
+        if (Blank.isEmpty(token)) {
+            throw new CustomException(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
+        }
         String userId = (String) redisUtil.get(token);
         if (Blank.isEmpty(userId)) {
-            return null;
+            throw new CustomException(ResultEnum.LOGIN_EXPIRED.getRespCode(), ResultEnum.LOGIN_EXPIRED.getRespMsg());
+        }
+        User user = userDao.getUserById(userId);
+        if (Blank.isEmpty(user)) {
+            throw new CustomException(ResultEnum.LOGIN_EXPIRED.getRespCode(), "未获取到此用户信息");
         }
-        return userDao.getUserById(userId);
+        return user;
     }
 
     /**
-     * 通过token获取当前登录人Id
+     * 获取当前登录人Id
      *
-     * @param token
      * @return
      */
-    public String getCurrentUserId(String token){
+    public String getCurrentUserId() {
+        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        HttpServletRequest request = attributes.getRequest();
+        String token = request.getHeader("token");
+        if (Blank.isEmpty(token)) {
+            throw new CustomException(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
+        }
         String userId = (String) redisUtil.get(token);
         if (Blank.isEmpty(userId)) {
-            return null;
+            throw new CustomException(ResultEnum.LOGIN_EXPIRED.getRespCode(), ResultEnum.LOGIN_EXPIRED.getRespMsg());
         }
         return userId;
     }
+
+    /**
+     * 获取请求的用户是否有管理员权限
+     */
+    public boolean haveAdminRights() {
+        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        HttpServletRequest request = attributes.getRequest();
+        String token = request.getHeader("token");
+        if (Blank.isEmpty(token)) {
+            throw new CustomException(ResultEnum.UNAUTHORIZED.getRespCode(), ResultEnum.UNAUTHORIZED.getRespMsg());
+        }
+        String userId = (String) redisUtil.get(token);
+        if (Blank.isEmpty(userId)) {
+            throw new CustomException(ResultEnum.LOGIN_EXPIRED.getRespCode(), ResultEnum.LOGIN_EXPIRED.getRespMsg());
+        }
+        List<Integer> roleIdList = userDao.getRoleIdListByUserId(userId);
+        for (Integer roleId : roleIdList) {
+            if (roleId == ConstantStr.ROLE_ADMIN) {
+                return true;
+            }
+        }
+        throw new CustomException(ResultEnum.NO_OPERATION_AUTHORITY.getRespCode(), ResultEnum.NO_OPERATION_AUTHORITY.getRespMsg());
+    }
 }

+ 33 - 0
chuanyi_server/src/main/resources/application-prod.yml

@@ -0,0 +1,33 @@
+server:
+  port: 8081
+file:
+  path: F:/upload/chuanyi/
+
+spring:
+  servlet:
+    multipart:
+      max-file-size: 100MB
+      max-request-size: 500MB
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    #    本地
+    url: jdbc:mysql://192.168.0.40:3306/chuanyi?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=GMT%2B8
+    username: root
+    password: root
+  resources:
+    static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${file.path},file:${file.location}
+  redis:
+    database: 1
+    host: 192.168.0.40
+    port: 6379
+    #    password: 123456
+    jedis:
+      pool:
+        max-active: 50
+        max-idle: 20
+        min-idle: 5
+    #        max-wait: 5
+mybatis:
+  configuration:
+    #开启sql日志文件
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

+ 33 - 0
chuanyi_server/src/main/resources/application-test.yml

@@ -0,0 +1,33 @@
+server:
+  port: 8081
+file:
+  path: F:/upload/chuanyi/
+
+spring:
+  servlet:
+    multipart:
+      max-file-size: 100MB
+      max-request-size: 500MB
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    #    本地
+    url: jdbc:mysql://192.168.0.40:3306/chuanyi?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=GMT%2B8
+    username: root
+    password: root
+  resources:
+    static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${file.path},file:${file.location}
+  redis:
+    database: 1
+    host: 192.168.0.40
+    port: 6379
+    #    password: 123456
+    jedis:
+      pool:
+        max-active: 50
+        max-idle: 20
+        min-idle: 5
+    #        max-wait: 5
+mybatis:
+  configuration:
+    #开启sql日志文件
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

+ 132 - 6
chuanyi_server/src/main/resources/mapper/UserDao.xml

@@ -56,6 +56,16 @@
             (#{userId},#{role.id})
         </foreach>
     </insert>
+    <insert id="addPermission">
+        INSERT INTO permission (permission_url, permission_name)
+            VALUE (#{permissionUrl}, #{permissionName})
+    </insert>
+    <insert id="addPermissionList">
+        INSERT INTO role_permission (role_id, permission_id) VALUES
+        <foreach collection="permissionList" item="permission" index="index" separator=",">
+            (#{roleId},#{permission.id})
+        </foreach>
+    </insert>
 
     <select id="getRoleByName" resultType="com.judong.chuanyiserver.entity.Role">
         SELECT id,
@@ -75,14 +85,13 @@
         <foreach collection="roleList" item="role" index="index" open="(" close=")" separator=",">
             #{role.id}
         </foreach>)
-
     </select>
 
     <delete id="deleteUserRole">
         delete from user_role where user_id=#{userId}
         AND role_id in (
-        <foreach collection="roleList" item="role" index="index" separator=",">
-            #{role}
+        <foreach collection="roleIdList" item="roleId" index="index" separator=",">
+            #{roleId}
         </foreach>)
     </delete>
     <delete id="deleteUserRoleByUserId">
@@ -90,11 +99,33 @@
         from user_role
         where user_id = #{userId}
     </delete>
+    <delete id="deletePermissionById">
+        delete
+        from permission
+        where id = #{id}
+    </delete>
+    <delete id="deleteRolePermissionById">
+        delete
+        from role_permission
+        where permission_id = #{id}
+    </delete>
+    <delete id="deleteRolePermissionByRoleId">
+        delete
+        from role_permission
+        where role_id = #{roleId}
+    </delete>
+    <delete id="deleteRolePermission">
+        delete from role_permission where role_id=#{roleId}
+        AND permission_id in (
+        <foreach collection="permissionIdList" item="permissionId" index="index" separator=",">
+            #{permissionId}
+        </foreach>)
+    </delete>
 
-    <select id="getResourceByRoleList" resultType="com.judong.chuanyiserver.entity.Resource">
-        SELECT id, resource_url, resource_name FROM resource
+    <select id="getPermissionByRoleList" resultType="com.judong.chuanyiserver.entity.Permission">
+        SELECT id, permission_url, permission_name FROM permission
         WHERE id in (
-        SELECT resource_id FROM role_resource WHERE
+        SELECT permission_id FROM role_permission WHERE
         role_id in (
         <foreach collection="roleList" item="role" index="index" separator=",">
             #{role}
@@ -126,4 +157,99 @@
         </foreach>
         )
     </select>
+    <select id="getRoleCount" resultType="java.lang.Long">
+        select count(*)
+        from role
+    </select>
+    <select id="getRoleListByPage" resultType="com.judong.chuanyiserver.entity.Role">
+        select id, role_name
+        from role
+        limit #{startNum},#{limitNum}
+    </select>
+    <select id="getRoleById" resultType="com.judong.chuanyiserver.entity.Role">
+        select id, role_name
+        from role
+        where id = #{id}
+    </select>
+    <select id="getPermissionByUrl" resultType="com.judong.chuanyiserver.entity.Permission">
+        select id, permission_url, permission_name
+        from permission
+        where permission_url = #{permissionUrl}
+    </select>
+    <select id="getUserByNameNoId" resultType="com.judong.chuanyiserver.entity.User">
+        select user_id, user_name, password, create_date, last_login_time, state
+        from user
+        where user_id != #{userId}
+          and user_name = #{userName}
+    </select>
+    <select id="getRoleByNoIdName" resultType="com.judong.chuanyiserver.entity.Role">
+        select id, role_name
+        from role
+        where id != #{id}
+          and role_name = #{roleName}
+    </select>
+    <select id="getPermissionByNoIdUrl" resultType="com.judong.chuanyiserver.entity.Permission">
+        select id, permission_url, permission_name
+        from permission
+        where id != #{id}
+          and permission_url = #{permissionUrl}
+    </select>
+    <select id="getPermissionById" resultType="com.judong.chuanyiserver.entity.Permission">
+        select id, permission_url, permission_name
+        from permission
+        where id = #{id}
+    </select>
+    <select id="getPermissionCount" resultType="java.lang.Long">
+        select count(*)
+        from permission
+    </select>
+    <select id="getPermissionListByPage" resultType="com.judong.chuanyiserver.entity.Permission">
+        select id, permission_url, permission_name
+        from permission
+        limit #{startNum},#{limitNum}
+    </select>
+    <select id="getSharePermissionList" resultType="com.judong.chuanyiserver.entity.Permission">
+        select id, permission_url, permission_name
+        from permission where id in
+        ( SELECT permission_id FROM role_permission where role_id=#{roleId} and permission_id in
+        <foreach collection="permissionList" item="permission" index="index" open="(" close=")" separator=",">
+            #{permission.id}
+        </foreach>)
+    </select>
+    <select id="getNoShareOldPermissionList" resultType="java.lang.Integer">
+        SELECT permission_id FROM role_permission WHERE role_id=#{roleId} AND permission_id NOT IN
+        (
+        <foreach collection="permissionList" item="permission" index="index" separator=",">
+            #{permission.id}
+        </foreach>
+        )
+    </select>
+
+    <update id="updateUserState">
+        update user
+        set state=#{userState}
+        where user_id = #{userId}
+    </update>
+    <update id="updateLoginState">
+        update user
+        set last_login_time=now()
+        where user_id = #{userId}
+    </update>
+    <update id="updateUser">
+        update user
+        set user_name=#{userName},
+            password=#{password}
+        where user_id = #{userId}
+    </update>
+    <update id="updateRole">
+        update role
+        set role_name=#{roleName}
+        where id = #{id}
+    </update>
+    <update id="updatePermission">
+        update permission
+        set permission_url=#{permissionUrl},
+            permission_name=#{permissionName}
+        where id = #{id}
+    </update>
 </mapper>