523096025 1 gadu atpakaļ
revīzija
74f5998082
100 mainītis faili ar 5675 papildinājumiem un 0 dzēšanām
  1. 33 0
      .gitignore
  2. 33 0
      gateway/.gitignore
  3. 85 0
      gateway/pom.xml
  4. 14 0
      gateway/src/main/java/com/huimv/gateway/GatewayApplication.java
  5. 60 0
      gateway/src/main/java/com/huimv/gateway/config/CorsConfig.java
  6. 54 0
      gateway/src/main/java/com/huimv/gateway/filter/TokenFilter.java
  7. 56 0
      gateway/src/main/resources/application-dev.yml
  8. 2 0
      gateway/src/main/resources/application.properties
  9. 23 0
      gateway/src/main/resources/bootstrap.yml
  10. 107 0
      huimv-eartag2-admin/pom.xml
  11. 43 0
      huimv-eartag2-admin/proguard.cfg
  12. 25 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/HuimvEartag2AdminApplication.java
  13. 26 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/config/MybatisPlusConfig.java
  14. 44 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/config/RedisConfig.java
  15. 20 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/controller/AppEncryptedController.java
  16. 103 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/controller/AuthorizeController.java
  17. 11 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/controller/EncryptionExample.java
  18. 263 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/controller/LoginController.java
  19. 121 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/controller/MacAddressExample.java
  20. 46 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/controller/MenuController.java
  21. 22 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/controller/SendMacAddressToServer.java
  22. 164 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/controller/SysAccountMultilevelController.java
  23. 60 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/controller/SysGroupController.java
  24. 102 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/controller/SysOrgController.java
  25. 47 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/controller/SysUserController.java
  26. 61 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/controller/YourApplication.java
  27. 39 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/AccountGroup.java
  28. 40 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/AppEncrypted.java
  29. 54 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/BaseFarm.java
  30. 41 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/Group.java
  31. 40 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/GroupMenu.java
  32. 57 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/Menu.java
  33. 44 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/Sheet1.java
  34. 56 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/SysAccountMultilevel.java
  35. 104 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/SysOrg.java
  36. 51 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/User.java
  37. 110 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/dto/MenuDto.java
  38. 17 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/dto/SysAccountMultilevelDto.java
  39. 33 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/dto/UserAccountDto.java
  40. 32 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/dto/UserAndAccountGroup.java
  41. 20 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/mapper/AccountGroupMapper.java
  42. 16 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/mapper/AppEncryptedMapper.java
  43. 16 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/mapper/BaseFarmMapper.java
  44. 18 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/mapper/GroupMapper.java
  45. 21 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/mapper/GroupMenuMapper.java
  46. 24 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/mapper/MenuMapper.java
  47. 16 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/mapper/Sheet1Mapper.java
  48. 19 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/mapper/SysAccountMultilevelMapper.java
  49. 39 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/mapper/SysOrgMapper.java
  50. 25 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/mapper/UserMapper.java
  51. 20 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/BaseFarmService.java
  52. 16 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/IAccountGroupService.java
  53. 16 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/IAppEncryptedService.java
  54. 29 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/IAuthorizeService.java
  55. 16 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/IGroupMenuService.java
  56. 28 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/IGroupService.java
  57. 12 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/ILoginService.java
  58. 35 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/IMenuService.java
  59. 16 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/ISheet1Service.java
  60. 40 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/ISysAccountMultilevelService.java
  61. 28 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/IUserService.java
  62. 37 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/SysOrgService.java
  63. 19 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/impl/AccountGroupServiceImpl.java
  64. 20 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/impl/AppEncryptedServiceImpl.java
  65. 254 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/impl/AuthorizeServiceImpl.java
  66. 24 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/impl/BaseFarmServiceImpl.java
  67. 20 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/impl/GroupMenuServiceImpl.java
  68. 92 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/impl/GroupServiceImpl.java
  69. 43 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/impl/LoginServiceImpl.java
  70. 157 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/impl/MenuServiceImpl.java
  71. 20 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/impl/Sheet1ServiceImpl.java
  72. 216 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/impl/SysAccountMultilevelServiceImpl.java
  73. 223 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/impl/SysOrgServiceImpl.java
  74. 187 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/impl/UserServiceImpl.java
  75. 110 0
      huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/session/AccessToken.java
  76. 106 0
      huimv-eartag2-admin/src/main/resources/application-dev.yml
  77. 78 0
      huimv-eartag2-admin/src/main/resources/application-prod.yml
  78. 108 0
      huimv-eartag2-admin/src/main/resources/application-prod2.yml
  79. 110 0
      huimv-eartag2-admin/src/main/resources/application-prod3.yml
  80. 9 0
      huimv-eartag2-admin/src/main/resources/application.properties
  81. 23 0
      huimv-eartag2-admin/src/main/resources/bootstrap.yml
  82. 9 0
      huimv-eartag2-admin/src/main/resources/com/huimv/eartag2/admin/mapper/AccountGroupMapper.xml
  83. 11 0
      huimv-eartag2-admin/src/main/resources/com/huimv/eartag2/admin/mapper/AppEncryptedMapper.xml
  84. 10 0
      huimv-eartag2-admin/src/main/resources/com/huimv/eartag2/admin/mapper/GroupMenuMapper.xml
  85. 24 0
      huimv-eartag2-admin/src/main/resources/com/huimv/eartag2/admin/mapper/MenuMapper.xml
  86. 20 0
      huimv-eartag2-admin/src/main/resources/com/huimv/eartag2/admin/mapper/UserMapper.xml
  87. 17 0
      huimv-eartag2-admin/src/main/resources/mapper/Sheet1Mapper.xml
  88. 166 0
      huimv-eartag2-api/pom.xml
  89. 43 0
      huimv-eartag2-api/proguard.cfg
  90. 37 0
      huimv-eartag2-api/src/main/java/com/huimv/eartag2/api/HuimvApiApplication.java
  91. 87 0
      huimv-eartag2-api/src/main/java/com/huimv/eartag2/api/config/DbJob.java
  92. 146 0
      huimv-eartag2-api/src/main/java/com/huimv/eartag2/api/config/DbUtil.java
  93. 44 0
      huimv-eartag2-api/src/main/java/com/huimv/eartag2/api/config/MybatisPlusConfig.java
  94. 61 0
      huimv-eartag2-api/src/main/java/com/huimv/eartag2/api/config/WebSocket.java
  95. 19 0
      huimv-eartag2-api/src/main/java/com/huimv/eartag2/api/config/WebSocketConfig.java
  96. 66 0
      huimv-eartag2-api/src/main/java/com/huimv/eartag2/api/controller/BaseFarmController.java
  97. 67 0
      huimv-eartag2-api/src/main/java/com/huimv/eartag2/api/controller/BaseFarmerController.java
  98. 158 0
      huimv-eartag2-api/src/main/java/com/huimv/eartag2/api/controller/BasePigpenController.java
  99. 21 0
      huimv-eartag2-api/src/main/java/com/huimv/eartag2/api/controller/BaseStageController.java
  100. 0 0
      huimv-eartag2-api/src/main/java/com/huimv/eartag2/api/controller/BizBaseStageController.java

+ 33 - 0
.gitignore

@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/

+ 33 - 0
gateway/.gitignore

@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/

+ 85 - 0
gateway/pom.xml

@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.4.1</version>
+<!--        <version>2.3.4.RELEASE</version>-->
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>com.huimv</groupId>
+    <artifactId>gateway</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>gateway</name>
+    <description>Demo project for Spring Boot</description>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <spring-cloud.version>2020.0.0</spring-cloud.version>
+    </properties>
+    <dependencies>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-gateway</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-bootstrap</artifactId>
+            <version>3.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
+        </dependency>
+        <!--nacos -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+            <version>2.2.6.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+            <version>2.2.6.RELEASE</version>
+        </dependency>
+
+        <!--       限流-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
+            <!--如果父项目中限定了版本的话,这里不需要再具体制定-->
+            <version>2.1.3.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
+            <version>2.2.1.RELEASE</version>
+        </dependency>
+
+    </dependencies>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>${spring-cloud.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <finalName>huimv-eartag2-gateway-0.0.1-SNAPSHOT</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 14 - 0
gateway/src/main/java/com/huimv/gateway/GatewayApplication.java

@@ -0,0 +1,14 @@
+package com.huimv.gateway;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+
+@SpringBootApplication
+public class GatewayApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(GatewayApplication.class, args);
+    }
+
+}

+ 60 - 0
gateway/src/main/java/com/huimv/gateway/config/CorsConfig.java

@@ -0,0 +1,60 @@
+package com.huimv.gateway.config;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.biosafety.uface.controller
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create : 2020-12-25
+ **/
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.reactive.CorsWebFilter;
+import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
+import org.springframework.web.util.pattern.PathPatternParser;
+
+
+/**listCost
+ * 跨域配置
+ * @author chengwenbing
+ */
+@Configuration
+public class CorsConfig {
+//    @Bean
+//    public WebFilter corsFilter() {
+//        return (ServerWebExchange ctx, WebFilterChain chain) -> {
+//            ServerHttpRequest request = ctx.getRequest();
+//            if (CorsUtils.isCorsRequest(request)) {
+//                ServerHttpResponse response = ctx.getResponse();
+//                HttpHeaders headers = response.getHeaders();
+//                headers.set(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, request.getHeaders().getOrigin());
+//                headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "X-Token,Authorization,x-requested-with,Content-Type");
+//                headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "PUT,POST, GET, OPTIONS, DELETE");
+//                headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
+//                headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "*");
+//                headers.add(HttpHeaders.ACCESS_CONTROL_MAX_AGE, "3600");
+//                if (request.getMethod() == HttpMethod.OPTIONS) {
+//                    response.setStatusCode(HttpStatus.OK);
+//                    return Mono.empty();
+//                }
+//            }
+//            return chain.filter(ctx);
+//        };
+//    }
+@Bean
+public CorsWebFilter corsFilter() {
+
+
+    CorsConfiguration config = new CorsConfiguration();
+    config.addAllowedMethod("*");
+    config.addAllowedOrigin("*");
+    config.addAllowedHeader("*");
+    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
+    source.registerCorsConfiguration("/**", config);
+    return new CorsWebFilter(source);
+}
+
+}

+ 54 - 0
gateway/src/main/java/com/huimv/gateway/filter/TokenFilter.java

@@ -0,0 +1,54 @@
+package com.huimv.gateway.filter;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.core.Ordered;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.biosafety.uface.controller
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create : 2020-12-25
+ **/
+// 注释该注解,过滤器就时效
+//@Component
+public class TokenFilter implements GlobalFilter, Ordered {
+    Logger logger = LoggerFactory.getLogger(TokenFilter.class);
+
+    @Override
+    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+        logger.info("========> 开始进行转发前过滤工作 ========>");
+        ServerHttpRequest request = exchange.getRequest();
+        logger.info("Path:"+request.getPath().value());
+        logger.info("HostName:"+request.getLocalAddress().getHostName());
+        logger.info("Port:"+request.getLocalAddress().getPort());
+        logger.info("Address:"+request.getLocalAddress().getAddress());
+        logger.info("QueryParams:"+request.getQueryParams().toString());
+        logger.info("URI:"+request.getURI().toString());
+        logger.info("<======== 转发前结束过滤工作 <========");
+//
+//        logger.info("StatusCode:"+exchange.getResponse().getStatusCode().toString());
+
+        // --过滤token--
+//        String token = exchange.getRequest().getQueryParams().getFirst("token");
+//        if (token == null || token.isEmpty()) {
+//            logger.info("StatusCode:"+exchange.getResponse().getStatusCode().toString());
+//            logger.info("token is empty...");
+//            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
+//            return exchange.getResponse().setComplete();
+//        }
+        return chain.filter(exchange);
+    }
+
+    @Override
+    public int getOrder() {
+        return 1;
+    }
+}

+ 56 - 0
gateway/src/main/resources/application-dev.yml

@@ -0,0 +1,56 @@
+server:
+  port: 8016
+
+spring:
+  application:
+    name: gateway
+  cloud:
+    nacos:
+      discovery:
+        server-addr: 47.98.40.154:8848
+        ephemeral: false
+      config:
+        server-addr: 47.98.40.154:8848   # Nacos 配置服务地址
+        namespace: public    # Nacos 命名空间
+        group: DEFAULT_GROUP          # Nacos 配置组
+
+    gateway:
+      enabled: true
+      routes:
+        - id: admin
+          uri: http://127.0.0.1:8098
+          predicates:
+            - Path=/admin/**
+          filters:
+            - StripPrefix=1
+
+        - id: manage2
+          uri: http://127.0.0.1:8099
+          predicates:
+            - Path=/manage2/**
+          filters:
+            - StripPrefix=1
+
+        - id: register2
+          uri: http://127.0.0.1:9090
+          predicates:
+            - Path=/register2/**
+          filters:
+            - StripPrefix=1
+
+        - id: manage
+          uri: http://127.0.0.1:8096
+          predicates:
+            - Path=/manage/**
+          filters:
+            - StripPrefix=1
+        - id: api
+          uri: http://127.0.0.1:8093
+          predicates:
+            - Path=/api/**
+          filters:
+            - StripPrefix=1
+logging:
+  level:
+    org.springframework.cloud.gateway: debug  # Gateway调试模式
+    com.alibaba.nacos.client.*: WARN

+ 2 - 0
gateway/src/main/resources/application.properties

@@ -0,0 +1,2 @@
+#spring.profiles.active=dev
+#spring.cloud.bootstrap.enabled=true

+ 23 - 0
gateway/src/main/resources/bootstrap.yml

@@ -0,0 +1,23 @@
+spring:
+  application:
+    name: gateway
+  profiles:
+    active: dev
+  cloud:
+    nacos:
+      config:
+        # 配置中心的地址
+        server-addr: 127.0.0.1:8848
+        #        server-addr: 127.0.0.1:8848
+        # 配置文件prefix
+        prefix: ${spring.application.name}
+        # 配置文件的格式
+        file-extension: yaml
+        # 配置文件的环境
+        group: DEFAULT_GROUP
+        # 命名空间
+        namespace: public
+        username: nacos
+        password: nacos
+server:
+  port: 8090

+ 107 - 0
huimv-eartag2-admin/pom.xml

@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>huimv-eartag-new</artifactId>
+        <groupId>com.huimv</groupId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>huimv-eartag2-admin</artifactId>
+    <dependencies>
+        <!-- eartag2-common -->
+        <dependency>
+            <groupId>com.huimv</groupId>
+            <artifactId>huimv-eartag2-common</artifactId>
+            <version>0.0.2-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+<!--        <dependency>-->
+<!--            <groupId>cn.dustlight.captcha</groupId>-->
+<!--            <artifactId>redis-store</artifactId>-->
+<!--            <version>0.0.6</version>-->
+<!--        </dependency>-->
+
+        <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.dustlight.captcha</groupId>
+            <artifactId>captcha-core</artifactId>
+            <version>0.0.6</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.7.11</version>
+        </dependency>
+
+
+    </dependencies>
+    <build>
+        <plugins>
+            <!--  -->
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+            <!--  -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <version>2.6</version>
+            </plugin>
+
+            <!--  代码混淆proguard maven插件  -->
+            <plugin>
+                <groupId>com.github.wvengen</groupId>
+                <artifactId>proguard-maven-plugin</artifactId>
+                <version>2.6.0</version>
+                <executions>
+                    <!--   package时执行proguard   -->
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>proguard</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <putLibraryJarsInTempDir>true</putLibraryJarsInTempDir>
+                    <!--  输入的jar包  -->
+                    <injar>${project.build.finalName}.jar</injar>
+                    <!--  输出的jar包  -->
+                    <outjar>${project.build.finalName}.jar</outjar>
+                    <!--  是否进行混淆,默认为true  -->
+                    <obfuscate>true</obfuscate>
+                    <!--  配置文件,通常为proguard.cfg,主要对options选项进行配置,所有的options选项都可以进行配置  -->
+                    <proguardInclude>../huimv-eartag2-eartag/proguard.cfg</proguardInclude>
+                    <!--  额外的jar,项目编译所需的jar  -->
+                    <libs>
+                        <lib>${java.home}/lib/rt.jar</lib>
+                        <!--<lib>${java.home}/lib/jce.jar</lib>-->
+                        <lib>${java.home}/lib/jsse.jar</lib>
+                    </libs>
+                    <!--  对输入jar进行过滤,如对META-INFO文件不处理  -->
+                    <inLibsFilter>!META-INF/**,!META-INF/versions/**</inLibsFilter>
+                    <!--  输出路径配置,必须包含injar标签中填写的jar  -->
+                    <outputDirectory>${project.build.directory}</outputDirectory>
+                    <!--  上面使用了conf配置文件,options无需配置  -->
+                    <!--<options></options>-->
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 43 - 0
huimv-eartag2-admin/proguard.cfg

@@ -0,0 +1,43 @@
+## 指定 java 版本
+-target 1.8
+# 关闭对代码进行优化压缩,开启会删除从未使用的类或者类成员变量等
+-dontshrink
+# 列出未使用的代码,可打印到标准输出或写入指定文件
+#-printusage
+# 关闭字节码级别的优化,如果不开启则设置如下配置,默认开启。
+-dontoptimize
+# 关闭预检,预检主要针对JavaME,Java6以后都不用预检
+-dontpreverify
+# 不生成大小写混写的类名
+-dontusemixedcaseclassnames
+# 对类成员的命名混淆采取唯一策略
+-useuniqueclassmembernames
+# 混淆类名之后,对使用Class.forName('className')之类的地方进行相应替代
+-adaptclassstrings
+#对异常、注解信息予以保留
+-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
+# 此选项将保存接口中的所有原始名称(不混淆)-->
+-keepnames interface ** { *; }
+# 此选项将保存所有软件包中的所有原始接口文件(不进行混淆)
+#-keep interface * extends * { *; }
+#保留参数名,因为控制器,或者Mybatis等接口的参数如果混淆会导致无法接受参数,xml文件找不到参数
+-keepparameternames
+# 保留枚举成员及方法
+-keepclassmembers enum * { *; }
+# 不混淆所有类,保存原始定义的注释-
+-keepclassmembers class * {
+    @org.springframework.context.annotation.Bean *;
+    @org.springframework.beans.factory.annotation.Autowired *;
+    @org.springframework.beans.factory.annotation.Value *;
+    @org.springframework.stereotype.Service *;
+    @org.springframework.stereotype.Component *;
+}
+
+#忽略warn消息
+-ignorewarnings
+#忽略note消息
+#-dontnote
+#打印配置信息
+#-printconfiguration
+# 排除混淆 指定的类名且类中的方法也不混淆
+-keep class com.huimv.eartag2.admin.HuimvEartag2Application{<methods>;}

+ 25 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/HuimvEartag2AdminApplication.java

@@ -0,0 +1,25 @@
+package com.huimv.eartag2.admin;
+
+import com.huimv.eartag2.common.config.InterceptorConfig;
+import io.netty.channel.ChannelHandler;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Import;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.biosafety.uface.controller
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create : 2020-12-25
+ **/
+@Import(InterceptorConfig.class)
+@SpringBootApplication
+@MapperScan("com.huimv.eartag2.admin.mapper")
+public class HuimvEartag2AdminApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(HuimvEartag2AdminApplication.class, args);
+    }
+}

+ 26 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/config/MybatisPlusConfig.java

@@ -0,0 +1,26 @@
+package com.huimv.eartag2.admin.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class MybatisPlusConfig {
+
+    /**
+     * 分页插件
+     */
+//    @Bean
+//    public PaginationInterceptor paginationInterceptor() {
+//        return new PaginationInterceptor();
+//    }
+
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
+        return interceptor;
+    }
+}

+ 44 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/config/RedisConfig.java

@@ -0,0 +1,44 @@
+/*
+package com.huimv.eartag2.admin.config;
+
+import org.springframework.cache.annotation.CachingConfigurerSupport;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+*/
+/**
+ *  redis配置
+ * 集群版 Redis缓存配置类
+ *//*
+
+@Configuration
+@EnableCaching
+public class RedisConfig extends CachingConfigurerSupport
+{
+    @Bean
+    @SuppressWarnings(value = { "unchecked", "rawtypes" })
+    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory)
+    {
+        RedisTemplate<Object, Object> template = new RedisTemplate<>();
+        template.setConnectionFactory(connectionFactory);
+
+//        FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);
+
+        // 使用StringRedisSerializer来序列化和反序列化redis的key值
+        template.setKeySerializer(new StringRedisSerializer());
+//        template.setValueSerializer(serializer);
+
+        // Hash的key也采用StringRedisSerializer的序列化方式
+        template.setHashKeySerializer(new StringRedisSerializer());
+//        template.setHashValueSerializer(serializer);
+
+        template.afterPropertiesSet();
+        return template;
+    }
+}
+
+*/

+ 20 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/controller/AppEncryptedController.java

@@ -0,0 +1,20 @@
+package com.huimv.eartag2.admin.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2023-10-24
+ */
+@RestController
+@RequestMapping("/app-encrypted")
+public class AppEncryptedController {
+
+}

+ 103 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/controller/AuthorizeController.java

@@ -0,0 +1,103 @@
+package com.huimv.eartag2.admin.controller;
+
+
+
+import com.huimv.eartag2.admin.entity.Menu;
+import com.huimv.eartag2.admin.service.IAuthorizeService;
+import com.huimv.eartag2.admin.service.IMenuService;
+import com.huimv.eartag2.common.utils.Result;
+import com.huimv.eartag2.common.utils.ResultCode;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping(value = "/auth")
+public class AuthorizeController {
+
+    @Autowired
+    IAuthorizeService iAuthorizeService;
+    @Autowired
+    IMenuService iMenuService;
+
+    @PostMapping("/saveAccountGroup")
+    public Result saveAccountGroup(@RequestBody Map<String, String> map){
+        /*
+         * 保存账号关联权限组数据
+         */
+        String accountId = map.get("accountId");
+        String groupIds = map.get("groupIds");
+        return iAuthorizeService.saveAccountGroup(accountId,groupIds);
+    }
+
+    @PostMapping("/saveGroupMenu")
+    public Result saveGroupMenu(@RequestBody Map<String, String> map){
+        /*
+         * 保存权限组关联菜单数据
+         */
+        String groupId = map.get("groupId");
+        String menuIds = map.get("menuIds");
+        String isAll = map.get("isAll");
+        return iAuthorizeService.saveGroupMenu(groupId,menuIds,isAll);
+    }
+
+    @GetMapping("/getGroupByAccount")
+    public Result getGroupByAccount(@RequestParam(name = "accountId") String accountId){
+        /*
+         * 根据账号获取权限组
+         */
+        return iAuthorizeService.getGroupByAccount (accountId);
+    }
+
+    @GetMapping("/getMenuByGroup")
+    public Result getMenuByGroup(String groupId){
+        /*
+         * 根据权限组获取菜单
+         */
+        return iAuthorizeService.getMenuByGroup(groupId);
+    }
+
+    @GetMapping("/getMenuByGroup1")
+    public Result getMenuByGroup1(String groupId){
+        /*
+         * 根据权限组获取菜单
+         */
+        return iAuthorizeService.getMenuByGroup1(groupId);
+    }
+
+    @RequestMapping("/getMyMenu")
+    public Result getMyMenuAndButton(@RequestParam(name = "userId", required = true) String userId){
+        /*
+         * 获取用户的菜单数据
+         */
+        List<Menu> myMenu = iAuthorizeService.getMyMenuAll(userId);
+        List<Map> list = iMenuService.optimizeListUtil(0,myMenu);
+        return new Result(ResultCode.SUCCESS,list);
+    }
+//    //获取菜单-多级
+//    @RequestMapping("/getMyMenuMultilevel")
+//    public Result getMyMenuMultilevel(@RequestParam(name = "userId", required = true) String userId){
+//        return new Result(ResultCode.SUCCESS,iAuthorizeService.getMyMenuMultilevel(userId));
+//    }
+
+
+    @GetMapping("/getMyButton")
+    public Result getMyButton(@RequestParam(name = "userId", required = true) Integer userId){
+        /*
+         * 获取用户的菜单数据
+         */
+      List list = iAuthorizeService.getMyButton(userId);
+        return new Result(ResultCode.SUCCESS,list);
+    }
+
+
+    @GetMapping("/getAcountByGroup")
+    public Result getAccountByGroup(String groupId){
+        /*
+         * 根据权限组获取菜单
+         */
+        return iAuthorizeService.getAccountByGroup(groupId);
+    }
+}

+ 11 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/controller/EncryptionExample.java

@@ -0,0 +1,11 @@
+package com.huimv.eartag2.admin.controller;
+
+import javax.crypto.SecretKey;
+import java.util.Base64;
+
+public class EncryptionExample {
+    public static String encrypt(String input, SecretKey secretKey) throws Exception {
+        byte[] encryptedBytes = Base64.getEncoder().encode(input.getBytes());
+        return new String(encryptedBytes);
+    }
+}

+ 263 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/controller/LoginController.java

@@ -0,0 +1,263 @@
+package com.huimv.eartag2.admin.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.huimv.eartag2.admin.entity.AppEncrypted;
+import com.huimv.eartag2.admin.entity.Sheet1;
+import com.huimv.eartag2.admin.entity.SysOrg;
+import com.huimv.eartag2.admin.entity.dto.SysAccountMultilevelDto;
+import com.huimv.eartag2.admin.mapper.SysAccountMultilevelMapper;
+import com.huimv.eartag2.admin.mapper.SysOrgMapper;
+import com.huimv.eartag2.admin.service.*;
+import com.huimv.eartag2.common.common.exception.ExceptionEnum;
+import com.huimv.eartag2.common.common.exception.MiException;
+import com.huimv.eartag2.common.common.token.TokenSign;
+import com.huimv.eartag2.common.utils.Result;
+import com.huimv.eartag2.common.utils.ResultCode;
+import com.huimv.eartag2.common.common.utils.VerifyUtil;
+import com.huimv.eartag2.admin.entity.SysAccountMultilevel;
+import com.huimv.eartag2.admin.session.AccessToken;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+@RestController
+@RequestMapping(value = "/my")
+public class LoginController {
+
+
+    @Autowired
+    ILoginService iLoginService;
+
+    @Autowired
+    private StringRedisTemplate stringRedisTemplate;
+    @GetMapping("/test1")
+    public String testRedis() {
+        stringRedisTemplate.opsForValue().set("1", "2");
+        return stringRedisTemplate.opsForValue().get("testKey");
+    }
+
+    @RequestMapping("/logout")
+    public Result logout(@RequestParam(name = "accountName", required = true) String accountName, @RequestParam(name = "password", required = true) String password) {
+        return iLoginService.logout();
+    }
+
+
+    @Autowired
+    private RedisTemplate<String, String> redisTemplate;
+
+    @GetMapping("/send")
+    public void createImg(HttpServletRequest request, HttpServletResponse response)  {
+        try {
+            //设置响应类型,告诉浏览器输出的内容为图片
+            response.setContentType("image/jpeg");
+            //设置响应头信息,告诉浏览器不要缓存此内容
+            response.setHeader("Pragma", "No-cache");
+            response.setHeader("Cache-Control", "no-cache");
+            response.setDateHeader("Expire", 0);
+            VerifyUtil randomValidateCode = new VerifyUtil();
+            //输出验证码图片
+            String code = randomValidateCode.getRandcode(request, response);
+            System.out.println(code);
+            //将生成的随机验证码存放到redis中
+            String remoteHost = request.getRemoteHost();
+            redisTemplate.opsForValue().set(remoteHost,code,300, TimeUnit.SECONDS);
+        } catch (Exception e) {
+            System.out.println("获取验证码异常:"+e);
+            throw new MiException(ExceptionEnum.VERIFCATION_FAID);
+        }
+    }
+
+    //登录-多牧场
+    @PostMapping(value = "/loginMultilevel")
+    public Result loginMultilevel(HttpServletRequest req, @RequestBody Map<String, String> map)  {
+
+
+        String accountName = map.get("accountName");
+        String password = map.get("password");
+//        String code = map.get("code");
+
+        String remoteHost = req.getRemoteHost();
+
+//        String redisCode = redisTemplate.opsForValue().get(remoteHost);
+//        if (redisCode == null) {
+//            return  new Result(10005,"验证码过期,点击刷新",false);
+//        }
+//        if (!redisCode.equals(code.toUpperCase())) {
+//            return  new Result(10006,"验证码错误,登录失败",false);
+//        }
+        // 未对密码加密
+        Result result = iLoginService.loginMultilevel(accountName, password);
+        if(result.getCode() == 10000){
+
+            SysAccountMultilevel accountEntity = (SysAccountMultilevel) result.getData();
+            Integer id = accountEntity.getId();
+
+            AccessToken accessToken = new AccessToken();
+            accessToken.setCreated(new Date());
+            accessToken.setAccountName(accountName);
+            accessToken.setCode(result.getCode());
+            accessToken.setMessage(result.getMessage());
+            accessToken.setFarmId(accountEntity.getFarmIds());
+            String token = TokenSign.sign(accountName,id,accountEntity.getFarmIds(),accountEntity.getPids()+"");
+            accessToken.setToken(token);
+
+            accessToken.setId(id);
+            accessToken.setLoginIp(remoteHost);
+            accessToken.setType(accountEntity.getType());
+            return new Result(ResultCode.SUCCESS,accessToken);
+        }
+        return  result;
+    }
+
+    @Autowired
+    private SysOrgMapper sysOrgMapper;
+
+    @Autowired
+    private SysAccountMultilevelMapper accountMultilevelMapper;
+
+    @Autowired
+    private IAppEncryptedService appEncryptedService;
+
+
+    //所有组织
+    @GetMapping(value = "/getOrg")
+    public Result getOrg(@RequestParam(name = "sort") Integer sort)  {
+        List<SysOrg> list = sysOrgMapper.selectList(null);
+        ArrayList<SysOrg> newList = new ArrayList<>();
+        for (SysOrg sysOrg : list) {
+            String pids = sysOrg.getPids();
+            if (pids.split(",").length <= sort){
+                newList.add(sysOrg);
+            }
+        }
+
+        List<SysOrg>   collect = newList.stream()
+                .filter(o -> o.getParentId() == 0)
+                .peek(o -> o.setChildren(getChildrens(o, newList)))
+                .collect(Collectors.toList());
+        return new Result(ResultCode.SUCCESS,collect);
+    }
+
+
+    //注册牧场
+    @Transactional
+    @PostMapping(value = "/addFarm")
+    public Result addFarm(@RequestBody SysAccountMultilevelDto sysAccountMultilevel )  {
+        Long orgId = sysAccountMultilevel.getOrgId();
+        SysOrg sysOrg = sysOrgMapper.selectById(orgId);
+
+        SysOrg newSysOrg = new SysOrg();
+        newSysOrg.setName(sysAccountMultilevel.getFarmName());
+        newSysOrg.setPids(sysOrg.getPids()+","+sysOrg.getId());
+        newSysOrg.setParentId(sysOrg.getId());
+        newSysOrg.setAudit(1);
+        newSysOrg.setApplyTime(new Date());
+
+        sysOrgMapper.insert(newSysOrg);
+
+        int account = accountMultilevelMapper.selectCount(new QueryWrapper<SysAccountMultilevel>().eq("account", sysAccountMultilevel.getAccount()));
+        if (account > 0 ){
+            return new Result(10001,"该账号已经存在,请重新创建",false);
+        }
+
+        sysAccountMultilevel.setPids(sysOrg.getPids()+","+newSysOrg.getId());
+        sysAccountMultilevel.setOrgId(newSysOrg.getId());
+        sysAccountMultilevel.setType(sysOrg.getPids().split(",").length);
+        sysAccountMultilevel.setType(4);
+
+
+
+        accountMultilevelMapper.insert(sysAccountMultilevel);
+
+
+        return  new Result( 10000,"添加成功",true);
+    }
+
+
+
+
+    private List<SysOrg> getChildrens(SysOrg o, List<SysOrg> list) {
+
+        return list.stream()
+                .filter(m -> m.getParentId().equals( o.getId()))
+                .peek(m -> m.setChildren(getChildrens(m, list)))
+                .collect(Collectors.toList());
+    }
+
+    //测试-token
+    @PostMapping(value = "/getToken")
+    public String getToken(HttpServletRequest req)  {
+        String token =  TokenSign.sign("superadmin",1,null,"0");
+        return  token;
+    }
+    @GetMapping(value = "/getMac")
+    public Result getMac()  {
+        return  new Result(ResultCode.SUCCESS,appEncryptedService.getById(1));
+    }
+
+    @Autowired
+    ISheet1Service sheet1Service;
+
+
+    //请删除
+    @GetMapping("/test")
+    public void test( ) {
+
+        //省
+      /*  List<Sheet1> list = sheet1Service.list(new QueryWrapper<Sheet1>().groupBy("name_prov"));
+        for (Sheet1 sheet1 : list) {
+            SysOrg sysOrg = new SysOrg();
+            sysOrg.setParentId(0L);
+            sysOrg.setPids("0");
+            sysOrg.setName(sheet1.getNameProv());
+            sysOrgMapper.insert(sysOrg);
+
+        }*/
+        //市级
+       /* List<Sheet1> list = sheet1Service.list(new QueryWrapper<Sheet1>().groupBy("name_city"));
+        for (Sheet1 sheet1 : list) {
+            String nameCity = sheet1.getNameCity();
+            SysOrg sysOrg = new SysOrg();
+            sysOrg.setName(nameCity);
+
+
+            SysOrg name = sysOrgMapper.selectOne(new QueryWrapper<SysOrg>().eq("name", sheet1.getNameProv()));
+
+
+            sysOrg.setParentId(name.getId());
+            sysOrg.setPids(name.getPids()+","+name.getId());
+
+            sysOrgMapper.insert(sysOrg);
+
+        }*/
+
+        List<Sheet1> list = sheet1Service.list(new QueryWrapper<Sheet1>().groupBy("name_coun"));
+        for (Sheet1 sheet1 : list) {
+            String nameCity = sheet1.getNameCoun();
+            SysOrg sysOrg = new SysOrg();
+            sysOrg.setName(nameCity);
+
+
+            List<SysOrg> name1 = sysOrgMapper.selectList(new QueryWrapper<SysOrg>().eq("name", sheet1.getNameCity()));
+
+      SysOrg name = name1.get(0);
+
+            sysOrg.setParentId(name.getId());
+            sysOrg.setPids(name.getPids()+","+name.getId());
+
+            sysOrgMapper.insert(sysOrg);
+
+        }
+    }
+}

+ 121 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/controller/MacAddressExample.java

@@ -0,0 +1,121 @@
+package com.huimv.eartag2.admin.controller;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.util.ArrayList;
+import java.util.List;
+
+public class MacAddressExample {
+
+    public static String getMACAddress() {
+        List<String> commands = new ArrayList<>();
+        String os = System.getProperty("os.name").toLowerCase();
+
+        if (os.contains("win")) {
+            return getMacAddress();
+        }
+        try {
+            Process process = Runtime.getRuntime().exec("ifconfig -a");
+            try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
+                String line;
+                while ((line = reader.readLine()) != null) {
+                    if (line.contains("ether")) {
+                        int start = line.indexOf("ether") + 6;
+                        return line.substring(start, start + 17); // MAC地址的长度为17个字符
+                    }
+                }
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return "MAC Address not found or not accessible.";
+    }
+
+    public static String getMacAddress() {
+
+        try {
+            InetAddress localHost = InetAddress.getLocalHost();
+            NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);
+            byte[] macAddressBytes = networkInterface.getHardwareAddress();
+
+            if (macAddressBytes != null) {
+                StringBuilder macAddress = new StringBuilder();
+                for (byte b : macAddressBytes) {
+                    macAddress.append(String.format("%02X:", b));
+                }
+
+                if (macAddress.length() > 0) {
+                    macAddress.deleteCharAt(macAddress.length() - 1); // Remove the trailing ":"
+                }
+
+                return macAddress.toString();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static String getDiskId() {
+        try {
+            List<String> commands = new ArrayList<>();
+            String os = System.getProperty("os.name").toLowerCase();
+
+            if (os.contains("win")) {
+                // For Windows
+                commands.add("wmic");
+                commands.add("diskdrive");
+                commands.add("get");
+                commands.add("SerialNumber");
+            } else if (os.contains("nix") || os.contains("nux") || os.contains("mac")) {
+                // For Linux and macOS
+                commands.add("lsblk");
+                commands.add("-no");
+                commands.add("serial");
+                commands.add("/dev/sda");  // Change to the appropriate device name
+            } else {
+                System.out.println("Unsupported operating system");
+                return null;
+            }
+
+            ProcessBuilder processBuilder = new ProcessBuilder(commands);
+            Process process = processBuilder.start();
+            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
+
+            String line;
+            String dis="";
+            while ((line = reader.readLine()) != null) {
+                if(!"".equals(line)){
+                    dis = line;
+                }
+            }
+            return dis;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    public static String getMotherboardSerial() {
+        try {
+            Process process = Runtime.getRuntime().exec("sudo dmidecode -t 2");
+            try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
+                String line;
+                while ((line = reader.readLine()) != null) {
+                    if (line.contains("Serial Number")) {
+                        int start = line.indexOf("Serial Number") + 15;
+                        return line.substring(start).trim();
+                    }
+                }
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return "Motherboard Serial not available on this system.";
+    }
+
+
+}

+ 46 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/controller/MenuController.java

@@ -0,0 +1,46 @@
+package com.huimv.eartag2.admin.controller;
+
+import com.huimv.eartag2.common.common.token.TokenSign;
+import com.huimv.eartag2.common.utils.Result;
+import com.huimv.eartag2.admin.entity.Menu;
+import com.huimv.eartag2.admin.service.IMenuService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+
+@RestController
+@RequestMapping("/menu")
+public class MenuController {
+    @Autowired
+    private IMenuService menuService;
+
+    @PostMapping("/add")
+    public Result addMenu(@RequestBody Menu menu , HttpServletRequest request){
+        Integer userId = TokenSign.getMemberIdByJwtToken(request);
+
+        return menuService.addMenu(menu,userId);
+    }
+
+
+    @PostMapping("/edit")
+    public Result editMenu(@RequestBody Menu menu){
+        return menuService.editMenu(menu);
+    }
+
+
+    @RequestMapping("/remove")
+    public Result removeMenu(@RequestParam(name = "menuId") Integer menuId){
+        return menuService.removeMenu(menuId);
+    }
+
+    @PostMapping("/list")
+    public Result optimizeList() {
+        return menuService.optimizeList();
+    }
+
+    @PostMapping("/list1")
+    public Result list1() {
+        return menuService.list1();
+    }
+}

+ 22 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/controller/SendMacAddressToServer.java

@@ -0,0 +1,22 @@
+package com.huimv.eartag2.admin.controller;
+
+import org.springframework.web.client.RestTemplate;
+
+
+public class SendMacAddressToServer {
+
+    public static Integer  sendMacAddress(String combinedData,String encryptedDisk) {
+        //0成功  1验证失败  2服务器异常 3过期
+        try {
+            RestTemplate restTemplate = new RestTemplate();
+            String serverURL = "http://huimv.ifarmcloud.com/huimvAdmin/arrange-record/test";
+            serverURL +="?macAddress="+combinedData+"&"+"diskAddress="+encryptedDisk;
+           return restTemplate.getForObject(serverURL, Integer.class);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 2;
+
+        }
+    }
+}

+ 164 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/controller/SysAccountMultilevelController.java

@@ -0,0 +1,164 @@
+package com.huimv.eartag2.admin.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.huimv.eartag2.admin.entity.dto.SysAccountMultilevelDto;
+import com.huimv.eartag2.common.common.token.TokenSign;
+import com.huimv.eartag2.common.utils.Result;
+import com.huimv.eartag2.common.utils.ResultCode;
+import com.huimv.eartag2.admin.entity.AccountGroup;
+import com.huimv.eartag2.admin.entity.SysAccountMultilevel;
+import com.huimv.eartag2.admin.service.IAccountGroupService;
+import com.huimv.eartag2.admin.service.ISysAccountMultilevelService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-10-14
+ */
+@RestController
+@RequestMapping("/accountMultilevel")
+public class SysAccountMultilevelController {
+    @Autowired
+    private ISysAccountMultilevelService accountMultilevelService;
+
+    @Autowired
+    private IAccountGroupService accountGroupService;
+
+
+
+    @PostMapping("/list")
+    public Result list(@RequestBody Map map , HttpServletRequest request){
+        Integer userId = TokenSign.getMemberIdByJwtToken(request);
+        int pageNum = (Integer)map.get("pageNum");
+        int pageSize = (Integer)map.get("pageSize");
+        String searchStr = (String)map.get("searchStr");
+
+        return accountMultilevelService.findUserAccount(searchStr,pageNum,pageSize,userId);
+
+    }
+    //下层组织
+   /* @PostMapping("/listSubordinate")
+    public Result listSubordinate(@RequestBody Map map , HttpServletRequest request){
+
+
+        int pageNum = (Integer)map.get("pageNum");
+        int pageSize = (Integer)map.get("pageSize");
+        String searchStr = (String)map.get("searchStr");
+//        String orgId  = (String)map.get("orgId");
+//        if (StringUtils.isBlank(orgId)){
+        String  orgId = TokenSign.getOrgId(request);
+//        }
+
+        return accountMultilevelService.listSubordinate(searchStr,pageNum,pageSize,orgId);
+
+    }*/
+    @PostMapping("/listSubordinate")
+    public Result listSubordinate(@RequestBody Map map , HttpServletRequest request){
+
+
+        int pageNum = (Integer)map.get("pageNum");
+        int pageSize = (Integer)map.get("pageSize");
+        String searchStr = (String)map.get("searchStr");
+//        String orgId  = (String)map.get("orgId");
+//        if (StringUtils.isBlank(orgId)){
+        Integer  orgId = TokenSign.getMemberIdByJwtToken(request);
+//        }
+
+        return accountMultilevelService.listSubordinate(searchStr,pageNum,pageSize,orgId);
+
+    }
+
+    @PostMapping("/add")
+    public Result add(@RequestBody SysAccountMultilevel sysAccountMultilevel , HttpServletRequest request){
+
+        Integer userId = TokenSign.getMemberIdByJwtToken(request);
+        return accountMultilevelService.add(sysAccountMultilevel,userId);
+
+    }
+
+
+    @PostMapping("/update")
+    public Result update(@RequestBody SysAccountMultilevel sysAccountMultilevel , HttpServletRequest request){
+        Integer userId = TokenSign.getMemberIdByJwtToken(request);
+        sysAccountMultilevel.setId(userId);
+        accountMultilevelService.updateById(sysAccountMultilevel);
+
+        return new Result(10000,"修改成功",true);
+
+    }
+
+    @GetMapping("/remove")
+    public Result remove(@RequestParam(name ="userIds") List<Integer> userIds){
+
+        accountGroupService.remove(new QueryWrapper<AccountGroup>().in("account_id",userIds));
+        accountMultilevelService.removeByIds(userIds);
+
+        return new Result(10000,"删除成功",true);
+
+    }
+
+    @GetMapping("/setAccountStatus")
+    public Result setAccountStatus(@RequestParam(name = "ids") List<Integer> ids, @RequestParam(name = "status") Integer status){
+        /* 设置账号状态 */
+        return accountMultilevelService.setAccountStatus(ids,status);
+    }
+
+    @GetMapping("/findOne")
+    public Result findOne(HttpServletRequest request){
+        Integer id = TokenSign.getMemberIdByJwtToken(request);
+        return new Result(ResultCode.SUCCESS, accountMultilevelService.getById(id));
+    }
+
+
+    @GetMapping("/getLastFarmId")
+    public Result getLastFarmId(HttpServletRequest request){
+        Integer userId = TokenSign.getMemberIdByJwtToken(request);
+        return  accountMultilevelService.getLastFarmId(userId);
+    }
+
+    /**
+     * @description: 【查询】 根据账号查询所有牧场
+     * @author: 鱼余
+     * @param:
+     **/
+    @GetMapping("/listById")
+    public Result listById(HttpServletRequest request){
+        Integer userId = TokenSign.getMemberIdByJwtToken(request);
+        return accountMultilevelService.listById(userId);
+    }
+
+    /**
+     * @description: 【修改】 账号绑定牧场
+     * @author:
+     * @param: paramsMap
+     **/
+    @PostMapping("/boundFarm")
+    public Result boundFarm(@RequestBody Map<String,String> paramsMap){
+
+        return accountMultilevelService.boundFarm(paramsMap);
+    }
+
+    //修改下属密码
+    @PostMapping("/updatePassword")
+    public Result updatePassword(@RequestBody SysAccountMultilevel sysAccountMultilevel){
+
+        return new Result(ResultCode.SUCCESS,accountMultilevelService.updateById(sysAccountMultilevel));
+    }
+    //修改密码
+    @PostMapping("/updateUserPassword")
+    public Result updateUserPassword(@RequestBody Map<String,String> map ,HttpServletRequest request){
+        Integer userId = TokenSign.getMemberIdByJwtToken(request);
+        return    accountMultilevelService.updateUserPassword(map,userId);
+    }
+}

+ 60 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/controller/SysGroupController.java

@@ -0,0 +1,60 @@
+package com.huimv.eartag2.admin.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.huimv.eartag2.common.common.token.TokenSign;
+import com.huimv.eartag2.common.utils.Result;
+import com.huimv.eartag2.admin.entity.AccountGroup;
+import com.huimv.eartag2.admin.entity.Group;
+import com.huimv.eartag2.admin.service.IAccountGroupService;
+import com.huimv.eartag2.admin.service.IGroupService;
+import com.huimv.eartag2.admin.service.ISysAccountMultilevelService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+
+@RestController
+@RequestMapping("/group")
+public class SysGroupController {
+
+    @Autowired
+    private IGroupService groupService;
+
+    @Autowired
+    private IAccountGroupService accountGroupService;
+    @Autowired
+    private ISysAccountMultilevelService accountMultilevelService;
+
+    @PostMapping("/add")
+    public Result addGroup (@RequestBody Group group, HttpServletRequest request){
+        Integer userId = TokenSign.getMemberIdByJwtToken(request);
+        return groupService.addGroup(group,userId);
+    }
+
+
+    @PostMapping("/edit")
+    public Result updateGroup(@RequestBody Group group ){
+        return groupService.updateGroup( group);
+    }
+
+    @RequestMapping("/remove")
+    public Result removeGroup(@RequestParam("groupId") Integer groupId) {
+
+        accountGroupService.remove(new QueryWrapper<AccountGroup>().in("group_id",groupId));
+        return groupService.removeGroup(groupId);
+    }
+
+    @PostMapping("/list")
+    public IPage<Group> listGroup(@RequestBody Map map , HttpServletRequest request) {
+//        String orgId = TokenSign.getOrgId(request);
+        Integer userId = TokenSign.getMemberIdByJwtToken(request);
+
+        List<Integer> allChildId = accountMultilevelService.getAllChildId(userId+"");
+        allChildId.add(userId);
+        return groupService.listGroup(map,allChildId);
+    }
+}

+ 102 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/controller/SysOrgController.java

@@ -0,0 +1,102 @@
+
+package com.huimv.eartag2.admin.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.huimv.eartag2.admin.entity.SysOrg;
+import com.huimv.eartag2.admin.service.SysOrgService;
+import com.huimv.eartag2.common.common.token.TokenSign;
+import com.huimv.eartag2.common.utils.Result;
+import com.huimv.eartag2.common.utils.ResultCode;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+/**
+ * 系统组织机构控制器
+ *
+ * @author xuyuxiang
+ * @date 2020/3/20 19:47
+ */
+@RestController
+public class SysOrgController {
+
+    @Resource
+    private SysOrgService sysOrgService;
+
+    /**
+     * 查询系统机构
+     *
+     * @author xuyuxiang
+     * @date 2020/5/11 15:49
+     */
+    @PostMapping("/sysOrg/page")
+    public Result page(@RequestBody Map<String,String> map, HttpServletRequest request) {
+        Integer userId = TokenSign.getMemberIdByJwtToken(request);
+        return sysOrgService.page(map,userId);
+    }
+
+    @PostMapping("/sysOrg/page1")
+    public Result page1(@RequestBody Map<String,String> map, HttpServletRequest request) {
+        Integer userId = TokenSign.getMemberIdByJwtToken(request);
+        return sysOrgService.page1(map,userId);
+    }
+
+    /**
+     * 系统组织机构列表
+     *
+     * @author xuyuxiang
+     * @date 2020/3/26 10:20
+     */
+    @GetMapping("/sysOrg/list")
+    public Result list(HttpServletRequest request) {
+        return sysOrgService.list(request);
+    }
+
+    /**
+     * 添加系统组织机构
+     *
+     * @author xuyuxiang
+     * @date 2020/3/25 14:44
+     */
+    @PostMapping("/sysOrg/add")
+    public Result add(@RequestBody SysOrg sysOrgParam ) {
+        sysOrgService.add(sysOrgParam);
+        return new Result(ResultCode.SUCCESS);
+    }
+
+    @PostMapping("/sysOrg/update")
+    public Result update(@RequestBody SysOrg sysOrgParam ) {
+        sysOrgService.update(sysOrgParam);
+        return new Result(ResultCode.SUCCESS);
+    }
+    @PostMapping("/sysOrg/approval")
+    public Result approval(@RequestBody Map map,HttpServletRequest request ) {
+
+        sysOrgService.approval(map,request);
+        return new Result(ResultCode.SUCCESS);
+    }
+
+
+
+    @GetMapping("/sysOrg/remove")
+    public Result remove(String orgIds ) {
+        return  sysOrgService.remove(orgIds);
+
+    }
+
+    @GetMapping("/sysOrg/getFarm")
+    public Result getFarm(HttpServletRequest request ) {
+        String orgId = TokenSign.getOrgId(request);
+
+        return new Result(ResultCode.SUCCESS,sysOrgService.list(new QueryWrapper<SysOrg>().like("pids",orgId).eq("is_farm",1).eq("audit",0)));
+    }
+
+
+
+
+}

+ 47 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/controller/SysUserController.java

@@ -0,0 +1,47 @@
+package com.huimv.eartag2.admin.controller;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.huimv.eartag2.admin.service.IUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+@RestController
+@RequestMapping("/user")
+public class SysUserController {
+    @Autowired
+    private IUserService iUserService;
+
+//    @PostMapping("/add")
+//    public Result addUser(@RequestBody User user){
+//        return  iUserService.addUser(user);
+//    }
+//
+//    @PostMapping("/edit")
+//    public Result updateUser(@RequestBody User user){
+//        return iUserService.updateUser(user);
+//    }
+//
+//    @RequestMapping("/remove")
+//    public Result removeUser(@RequestParam("userIds") List<Integer> userIds) {
+//
+//        return iUserService.removeUser(userIds);
+//    }
+
+
+
+    @PostMapping("/list")
+    public JSONObject listUser(@RequestBody Map map) {
+        System.out.println();
+        int pageNum = (Integer)map.get("pageNum");
+        int pageSize = (Integer)map.get("pageSize");
+        String searchStr = (String)map.get("searchStr");
+        return iUserService.findUserAccount(searchStr,pageNum,pageSize);
+    }
+
+}

+ 61 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/controller/YourApplication.java

@@ -0,0 +1,61 @@
+package com.huimv.eartag2.admin.controller;
+
+import com.huimv.eartag2.admin.entity.AppEncrypted;
+import com.huimv.eartag2.admin.service.IAppEncryptedService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.crypto.KeyGenerator;
+import javax.crypto.SecretKey;
+
+@Component
+public class YourApplication {
+    @Autowired
+    private IAppEncryptedService appEncryptedService;
+
+//    @Scheduled(cron = "0 0 * * * ?")
+    private   void getMac() throws Exception {
+        String macAddress = MacAddressExample.getMACAddress();
+        String diskAddress = MacAddressExample.getDiskId();
+//        System.out.println("macAddress= "+macAddress);
+//        System.out.println("diskAddress= "+diskAddress);
+        if (macAddress != null) {
+            SecretKey secretKey = generateAESKey(); // 生成AES密钥
+            String encryptedMAC = EncryptionExample.encrypt(macAddress, secretKey);
+            String encryptedDisk = EncryptionExample.encrypt(diskAddress, secretKey);
+
+            // 将拼接并加密后的数据传输到服务器,可以使用HTTP POST等方法
+            Integer result =  SendMacAddressToServer.sendMacAddress(encryptedMAC+"@hm",encryptedDisk);
+            System.out.println(result);
+            if (1==result){
+//
+//                System.out.println("验证失败");
+                AppEncrypted appEncrypted = new AppEncrypted();
+                appEncrypted.setId(1);
+                appEncrypted.setAppEncrypted(result);
+                appEncryptedService.updateById(appEncrypted);
+                System.exit(0);
+            }else {
+                AppEncrypted appEncrypted = new AppEncrypted();
+                appEncrypted.setId(1);
+                appEncrypted.setAppEncrypted(result);
+                appEncryptedService.updateById(appEncrypted);
+            }
+
+
+        } else {
+            System.out.println("Unable to obtain MAC address. Stopping application.");
+            //暂时不停止
+//            System.exit(0);
+        }
+
+        // Rest of your application logic here
+    }
+    public static SecretKey generateAESKey() throws Exception {
+        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
+        keyGenerator.init(128); // 128-bit key size
+        return keyGenerator.generateKey();
+    }
+
+}

+ 39 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/AccountGroup.java

@@ -0,0 +1,39 @@
+package com.huimv.eartag2.admin.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("sys_account_group")
+public class AccountGroup extends Model {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+     private Integer id;
+
+    @TableLogic
+    private  byte isDeleted;
+
+    private Integer accountId;
+
+    private Integer groupId;
+
+
+}

+ 40 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/AppEncrypted.java

@@ -0,0 +1,40 @@
+package com.huimv.eartag2.admin.entity;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author author
+ * @since 2023-10-24
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("app_encrypted")
+public class AppEncrypted implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+     private Integer id;
+
+    @TableLogic
+    private  byte isDeleted;
+
+    /**
+     * 0成功  1验证失败  2服务器异常 3过期
+     */
+    private Integer appEncrypted;
+
+
+}

+ 54 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/BaseFarm.java

@@ -0,0 +1,54 @@
+package com.huimv.eartag2.admin.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author zn
+ * @since 2022-07-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class BaseFarm implements Serializable {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+     private Integer id;
+
+    @TableLogic
+    private  byte isDeleted;
+
+    private String farmCode;
+
+    private String farmName;
+
+    private String location;
+
+    private String leader;
+
+    private String phone;
+
+    private String remark;
+
+    private String areaCode;
+
+    private String code1;
+
+    private String code2;
+
+    private String ip;
+
+    private String port;
+
+
+}

+ 41 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/Group.java

@@ -0,0 +1,41 @@
+package com.huimv.eartag2.admin.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("sys_group")
+public class Group extends Model {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+     private Integer id;
+
+    @TableLogic
+    private  byte isDeleted;
+
+    private String groupName;
+
+    private String remark;
+
+    private Integer accountId;
+
+
+}

+ 40 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/GroupMenu.java

@@ -0,0 +1,40 @@
+package com.huimv.eartag2.admin.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("sys_group_menu")
+public class GroupMenu extends Model {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+     private Integer id;
+
+    @TableLogic
+    private  byte isDeleted;
+
+    private Integer groupId;
+
+    private Integer menuId;
+    private Integer isAll;
+
+
+}

+ 57 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/Menu.java

@@ -0,0 +1,57 @@
+package com.huimv.eartag2.admin.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("sys_menu")
+public class Menu extends Model {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+     private Integer id;
+
+    @TableLogic
+    private  byte isDeleted;
+
+    private String title;
+
+    private String url;
+
+    private String remark;
+
+    private Integer parentId;
+
+    private Integer sort;
+
+    //0 = 目录,   1 = 菜单  2=按钮
+    private Integer weight;
+
+    private String permission;
+
+    private Boolean ifShow;
+
+
+
+//    private List<Menu> children;
+
+
+
+}

+ 44 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/Sheet1.java

@@ -0,0 +1,44 @@
+package com.huimv.eartag2.admin.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author author
+ * @since 2022-05-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("Sheet1")
+public class Sheet1 implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private String nameProv;
+
+    private String codeProv;
+
+    private String nameCity;
+
+    private String codeCity;
+
+    private String nameCoun;
+
+    private String codeCoun;
+
+    private String nameTown;
+
+    private String codeTown;
+
+
+}

+ 56 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/SysAccountMultilevel.java

@@ -0,0 +1,56 @@
+package com.huimv.eartag2.admin.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-10-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+public class SysAccountMultilevel extends Model {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+     private Integer id;
+
+    @TableLogic
+    private  byte isDeleted;
+
+    private String account;
+
+    private String password;
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long orgId;
+
+    private String pids;
+    private Integer pid;
+
+    private Integer accountStatus;
+
+    private String farmIds;
+
+    private String color;
+
+    private Boolean mode;
+
+    private Integer lastFarmId;
+
+    private String userName;
+    private Integer type;
+
+}

+ 104 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/SysOrg.java

@@ -0,0 +1,104 @@
+/*
+Copyright [2020] [https://www.xiaonuo.vip]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+
+1.请不要删除和修改根目录下的LICENSE文件。
+2.请不要删除和修改Snowy源码头部的版权声明。
+3.请保留源码和相关描述文件的项目出处,作者声明等。
+4.分发源码时候,请注明软件出处 https://gitee.com/xiaonuobase/snowy
+5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/xiaonuobase/snowy
+6.若您的项目无法满足以上几点,可申请商业授权,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package com.huimv.eartag2.admin.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 系统组织机构表
+ *
+ * @author xuyuxiang
+ * @date 2020/3/11 11:20
+ */
+@Data
+@TableName("sys_org")
+public class SysOrg  {
+
+    /**
+     * 主键
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+
+    /**
+     * 父id
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long parentId;
+
+    /**
+     * 父ids
+     */
+    private String pids;
+
+    /**
+     * 名称
+     */
+    private String name;
+
+
+    /**
+     * 排序
+     */
+    private Integer sort;
+    private Integer audit;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    public List<SysOrg> children;
+
+    /**
+     * 申请时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date applyTime;
+    /**
+     * 审批时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date passTime;
+    /**
+     * 审批人id
+     */
+    private Integer approvalId;
+    /**
+     * 审批人
+     */
+    private String approvalName;
+    private Integer isFarm;
+
+
+}

+ 51 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/User.java

@@ -0,0 +1,51 @@
+package com.huimv.eartag2.admin.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("sys_user")
+public class User extends Model {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+     private Integer id;
+
+    @TableLogic
+    private  byte isDeleted;
+
+    private String userName;
+
+    private Integer male;
+
+    private String birthday;
+
+    private String mobile;
+
+    private String address;
+
+    private String job;
+
+    private String remark;
+
+    private String userId;
+
+
+}

+ 110 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/dto/MenuDto.java

@@ -0,0 +1,110 @@
+package com.huimv.eartag2.admin.entity.dto;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.huimv.eartag2.admin.entity.Menu;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+public class MenuDto extends Model {
+
+    private static final long serialVersionUID = 1L;
+
+     private Integer id;
+
+    @TableLogic
+    private  byte isDeleted;
+
+    private String menuName;
+
+    private String url;
+
+    private String remark;
+
+    private Integer parentId;
+
+    private Integer sort;
+
+    private List<Menu> children;
+
+    public MenuDto() {
+    }
+
+    public MenuDto(Integer id, String menuName, String url, String remark, Integer parentId, Integer sort, List<Menu> children) {
+        this.id = id;
+        this.menuName = menuName;
+        this.url = url;
+        this.remark = remark;
+        this.parentId = parentId;
+        this.sort = sort;
+        this.children = children;
+    }
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getMenuName() {
+        return menuName;
+    }
+
+    public void setMenuName(String menuName) {
+        this.menuName = menuName;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Integer getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Integer parentId) {
+        this.parentId = parentId;
+    }
+
+    public Integer getSort() {
+        return sort;
+    }
+
+    public void setSort(Integer sort) {
+        this.sort = sort;
+    }
+
+    public List<Menu> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<Menu> children) {
+        this.children = children;
+    }
+}

+ 17 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/dto/SysAccountMultilevelDto.java

@@ -0,0 +1,17 @@
+package com.huimv.eartag2.admin.entity.dto;
+
+import com.huimv.eartag2.admin.entity.SysAccountMultilevel;
+import lombok.Data;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.eartag2.admin.entity.dto
+ * @Description : TODO
+ * @Author : yuxuexuan
+ * @Create : 2022/5/19 0019 14:41
+ **/
+@Data
+public class SysAccountMultilevelDto extends SysAccountMultilevel {
+
+    String farmName;
+}

+ 33 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/dto/UserAccountDto.java

@@ -0,0 +1,33 @@
+package com.huimv.eartag2.admin.entity.dto;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import lombok.Data;
+
+@Data
+public class UserAccountDto {
+
+      private Integer id;
+
+    @TableLogic
+    private  byte isDeleted;
+
+     private String userName;
+
+     private Integer male;
+
+     private String birthday;
+
+     private String mobile;
+
+     private String address;
+
+     private String job;
+
+     private String remark;
+
+     private String userId;
+
+     private String accountName;
+
+     private Integer accountStatus;
+}

+ 32 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/entity/dto/UserAndAccountGroup.java

@@ -0,0 +1,32 @@
+package com.huimv.eartag2.admin.entity.dto;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import lombok.Data;
+
+@Data
+public class UserAndAccountGroup {
+    private String accountName;
+
+    private Integer accountStatus;
+
+     private Integer id;
+
+    @TableLogic
+    private  byte isDeleted;
+
+    private String userName;
+
+    private Integer male;
+
+    private String birthday;
+
+    private String mobile;
+
+    private String address;
+
+    private String job;
+
+    private String remark;
+
+    private Long userId;
+}

+ 20 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/mapper/AccountGroupMapper.java

@@ -0,0 +1,20 @@
+package com.huimv.eartag2.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.huimv.eartag2.admin.entity.AccountGroup;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Repository
+public interface AccountGroupMapper extends BaseMapper<AccountGroup> {
+
+    void removeAccountGroup(@Param("accountId") String accountId);
+}

+ 16 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/mapper/AppEncryptedMapper.java

@@ -0,0 +1,16 @@
+package com.huimv.eartag2.admin.mapper;
+
+import com.huimv.eartag2.admin.entity.AppEncrypted;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author author
+ * @since 2023-10-24
+ */
+public interface AppEncryptedMapper extends BaseMapper<AppEncrypted> {
+
+}

+ 16 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/mapper/BaseFarmMapper.java

@@ -0,0 +1,16 @@
+package com.huimv.eartag2.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.huimv.eartag2.admin.entity.BaseFarm;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author zn
+ * @since 2022-07-27
+ */
+public interface BaseFarmMapper extends BaseMapper<BaseFarm> {
+
+}

+ 18 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/mapper/GroupMapper.java

@@ -0,0 +1,18 @@
+package com.huimv.eartag2.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.huimv.eartag2.admin.entity.Group;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Repository
+public interface GroupMapper extends BaseMapper<Group> {
+
+}

+ 21 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/mapper/GroupMenuMapper.java

@@ -0,0 +1,21 @@
+package com.huimv.eartag2.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.huimv.eartag2.admin.entity.GroupMenu;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Repository
+public interface GroupMenuMapper extends BaseMapper<GroupMenu> {
+
+    void removeGroupMenu(@Param("groupId") String groupId);
+
+}

+ 24 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/mapper/MenuMapper.java

@@ -0,0 +1,24 @@
+package com.huimv.eartag2.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.huimv.eartag2.admin.entity.Menu;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Repository
+public interface MenuMapper extends BaseMapper<Menu> {
+
+    List<Menu> getMyMenu(@Param("accountName") String accountName);
+
+    List<String> getMyButton(@Param("userId") Integer userId);
+}

+ 16 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/mapper/Sheet1Mapper.java

@@ -0,0 +1,16 @@
+package com.huimv.eartag2.admin.mapper;
+
+import com.huimv.eartag2.admin.entity.Sheet1;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author author
+ * @since 2022-05-20
+ */
+public interface Sheet1Mapper extends BaseMapper<Sheet1> {
+
+}

+ 19 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/mapper/SysAccountMultilevelMapper.java

@@ -0,0 +1,19 @@
+package com.huimv.eartag2.admin.mapper;
+
+import com.baomidou.mybatisplus.annotation.SqlParser;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.huimv.eartag2.admin.entity.SysAccountMultilevel;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-10-14
+ */
+@Repository
+public interface SysAccountMultilevelMapper extends BaseMapper<SysAccountMultilevel> {
+
+}

+ 39 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/mapper/SysOrgMapper.java

@@ -0,0 +1,39 @@
+/*
+Copyright [2020] [https://www.xiaonuo.vip]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+
+1.请不要删除和修改根目录下的LICENSE文件。
+2.请不要删除和修改Snowy源码头部的版权声明。
+3.请保留源码和相关描述文件的项目出处,作者声明等。
+4.分发源码时候,请注明软件出处 https://gitee.com/xiaonuobase/snowy
+5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/xiaonuobase/snowy
+6.若您的项目无法满足以上几点,可申请商业授权,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package com.huimv.eartag2.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.huimv.eartag2.admin.entity.SysOrg;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 系统组织机构mapper接口
+ *
+ * @author xuyuxiang
+ * @date 2020/3/13 16:03
+ */
+@Repository
+public interface SysOrgMapper extends BaseMapper<SysOrg> {
+}

+ 25 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/mapper/UserMapper.java

@@ -0,0 +1,25 @@
+package com.huimv.eartag2.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.huimv.eartag2.admin.entity.User;
+import com.huimv.eartag2.admin.entity.dto.UserAccountDto;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Repository
+public interface UserMapper extends BaseMapper<User> {
+
+    List<UserAccountDto> findUserAndAccountByUserName(@Param("searchStr") String searchStr, @Param("start") int start, @Param("pageSize") int pageSize);
+
+    List<UserAccountDto> findUserAndAccount(@Param("start") int start, @Param("pageSize") int pageSize);
+}

+ 20 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/BaseFarmService.java

@@ -0,0 +1,20 @@
+package com.huimv.eartag2.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.huimv.eartag2.admin.entity.BaseFarm;
+import com.huimv.eartag2.common.utils.Result;
+
+import java.util.Map;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author zn
+ * @since 2022-07-27
+ */
+public interface BaseFarmService extends IService<BaseFarm> {
+
+
+}

+ 16 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/IAccountGroupService.java

@@ -0,0 +1,16 @@
+package com.huimv.eartag2.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.huimv.eartag2.admin.entity.AccountGroup;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+public interface IAccountGroupService extends IService<AccountGroup> {
+
+}

+ 16 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/IAppEncryptedService.java

@@ -0,0 +1,16 @@
+package com.huimv.eartag2.admin.service;
+
+import com.huimv.eartag2.admin.entity.AppEncrypted;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author author
+ * @since 2023-10-24
+ */
+public interface IAppEncryptedService extends IService<AppEncrypted> {
+
+}

+ 29 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/IAuthorizeService.java

@@ -0,0 +1,29 @@
+package com.huimv.eartag2.admin.service;
+
+
+import com.huimv.eartag2.common.utils.Result;
+
+import java.util.List;
+
+public interface IAuthorizeService {
+
+    Result saveAccountGroup(String accountId, String groupIds);
+
+    Result saveGroupMenu(String groupId, String menuIds,String isAll);
+
+
+    Result getMenuByGroup(String groupId);
+
+    Result getGroupByAccount(String accountId);
+
+    Result getAccountByGroup(String groupId);
+
+
+    List getMyMenuAll(String accountName);
+
+    List getMyButton(Integer userId);
+
+    List getMyMenuMultilevel(String userId);
+
+    Result getMenuByGroup1(String groupId);
+}

+ 16 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/IGroupMenuService.java

@@ -0,0 +1,16 @@
+package com.huimv.eartag2.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.huimv.eartag2.admin.entity.GroupMenu;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+public interface IGroupMenuService extends IService<GroupMenu> {
+
+}

+ 28 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/IGroupService.java

@@ -0,0 +1,28 @@
+package com.huimv.eartag2.admin.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.huimv.eartag2.common.utils.Result;
+import com.huimv.eartag2.admin.entity.Group;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+public interface IGroupService extends IService<Group> {
+
+    Result updateGroup(Group group);
+
+    Result removeGroup(Integer groupId);
+
+    IPage<Group> listGroup(Map map, List<Integer> allChildId);
+
+    Result addGroup(Group group, Integer userId);
+}

+ 12 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/ILoginService.java

@@ -0,0 +1,12 @@
+package com.huimv.eartag2.admin.service;
+
+
+import com.huimv.eartag2.common.utils.Result;
+
+public interface ILoginService {
+
+
+    Result logout();
+
+    Result loginMultilevel(String accountName, String password);
+}

+ 35 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/IMenuService.java

@@ -0,0 +1,35 @@
+package com.huimv.eartag2.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.huimv.eartag2.common.utils.Result;
+import com.huimv.eartag2.admin.entity.Menu;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+public interface IMenuService extends IService<Menu> {
+    Result addMenu(Menu menu, Integer userId);
+    //修改菜单
+    Result editMenu(Menu menu);
+    //删除菜单(批量)
+    Result removeMenu(Integer menuId);
+   /* //查询所有
+    List<Map> listMenu();
+    //菜单递归
+    List listMenuUtil(List<Menu> list);*/
+
+    //优化查询所有
+    Result optimizeList();
+    //优化菜单递归
+    List<Map> optimizeListUtil(int parentId, List<Menu> menuEntityList);
+
+    Result list1();
+}

+ 16 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/ISheet1Service.java

@@ -0,0 +1,16 @@
+package com.huimv.eartag2.admin.service;
+
+import com.huimv.eartag2.admin.entity.Sheet1;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author author
+ * @since 2022-05-20
+ */
+public interface ISheet1Service extends IService<Sheet1> {
+
+}

+ 40 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/ISysAccountMultilevelService.java

@@ -0,0 +1,40 @@
+package com.huimv.eartag2.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.huimv.eartag2.admin.entity.dto.SysAccountMultilevelDto;
+import com.huimv.eartag2.common.utils.Result;
+import com.huimv.eartag2.admin.entity.SysAccountMultilevel;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-10-14
+ */
+public interface ISysAccountMultilevelService extends IService<SysAccountMultilevel> {
+
+    Result findUserAccount(String searchStr, int pageNum, int pageSize, Integer userId);
+
+    Result add(SysAccountMultilevel sysAccountMultilevel, Integer userId);
+
+    Result setAccountStatus(List<Integer> ids, Integer status);
+
+    List<Integer> getAllChildId(String orgId);
+
+//    Result listSubordinate(String searchStr, int pageNum, int pageSize, String orgId);
+    Result listSubordinate(String searchStr, int pageNum, int pageSize, Integer orgId);
+
+    Result getLastFarmId(Integer userId);
+
+    Result listById(Integer userId);
+
+    Result boundFarm(Map<String, String> paramsMap);
+
+    Result updateUserPassword(Map<String,String> map,Integer userId);
+}

+ 28 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/IUserService.java

@@ -0,0 +1,28 @@
+package com.huimv.eartag2.admin.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.huimv.eartag2.admin.entity.User;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+public interface IUserService extends IService<User> {
+
+
+    JSONObject findUserAccount(String searchStr, int pageNum, int pageSize);
+
+
+//    List<UserAndAccountGroup> yxxList(String searchStr, int pageNum, int pageSize);
+//
+//    Result addUser(User user);
+//
+//    Result updateUser(User user);
+//
+//    Result removeUser(List<Integer> userIds);
+}

+ 37 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/SysOrgService.java

@@ -0,0 +1,37 @@
+
+package com.huimv.eartag2.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.huimv.eartag2.admin.entity.SysOrg;
+import com.huimv.eartag2.common.utils.Result;
+import org.apache.http.HttpRequest;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 系统组织机构service接口
+ *
+ * @author xuyuxiang
+ * @date 2020/3/13 16:02
+ */
+public interface SysOrgService extends IService<SysOrg> {
+
+
+   Result page(Map<String,String> map, Integer userId);
+
+
+    Result list(HttpServletRequest request);
+
+    void add(SysOrg sysOrg);
+
+
+    void update(SysOrg sysOrgParam);
+
+    void approval(Map map,HttpServletRequest request);
+
+    Result remove(String orgId);
+
+    Result page1(Map<String, String> map, Integer userId);
+}

+ 19 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/impl/AccountGroupServiceImpl.java

@@ -0,0 +1,19 @@
+package com.huimv.eartag2.admin.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.huimv.eartag2.admin.entity.AccountGroup;
+import com.huimv.eartag2.admin.mapper.AccountGroupMapper;
+import com.huimv.eartag2.admin.service.IAccountGroupService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09 */
+@Service
+public class AccountGroupServiceImpl extends ServiceImpl<AccountGroupMapper, AccountGroup> implements IAccountGroupService {
+
+}

+ 20 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/impl/AppEncryptedServiceImpl.java

@@ -0,0 +1,20 @@
+package com.huimv.eartag2.admin.service.impl;
+
+import com.huimv.eartag2.admin.entity.AppEncrypted;
+import com.huimv.eartag2.admin.mapper.AppEncryptedMapper;
+import com.huimv.eartag2.admin.service.IAppEncryptedService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author author
+ * @since 2023-10-24
+ */
+@Service
+public class AppEncryptedServiceImpl extends ServiceImpl<AppEncryptedMapper, AppEncrypted> implements IAppEncryptedService {
+
+}

+ 254 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/impl/AuthorizeServiceImpl.java

@@ -0,0 +1,254 @@
+package com.huimv.eartag2.admin.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.huimv.eartag2.admin.entity.AccountGroup;
+import com.huimv.eartag2.admin.entity.GroupMenu;
+import com.huimv.eartag2.admin.entity.Menu;
+import com.huimv.eartag2.admin.mapper.AccountGroupMapper;
+import com.huimv.eartag2.admin.mapper.GroupMenuMapper;
+import com.huimv.eartag2.admin.mapper.MenuMapper;
+import com.huimv.eartag2.admin.service.IAuthorizeService;
+import com.huimv.eartag2.admin.service.IGroupMenuService;
+import com.huimv.eartag2.common.utils.Result;
+import com.huimv.eartag2.common.utils.ResultCode;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class AuthorizeServiceImpl implements IAuthorizeService {
+
+    @Autowired
+    AccountGroupMapper accountGroupMapper;
+    @Autowired
+    GroupMenuMapper groupMenuMapper;
+
+    @Autowired
+    IGroupMenuService groupMenuService;
+    @Autowired
+    private MenuMapper menuMapper;
+    
+    @Override
+    @Transactional
+    public Result saveAccountGroup(String accountId, String groupIds) {
+        /**
+         * Step1:先删除原先的账号关联权限组数据;
+         * Step2:再添加新的账号关联权限组数据;
+         */
+//        if (accountId == null||"".equals(accountId)){
+
+//            accountGroupMapper.removeAccountGroup(accountId);
+//            return new Result(10001, "保存账号关联权限组成功", true);
+//        }else {
+            String[] groupIdArray = accountId.split(",");
+            accountGroupMapper.removeAccountGroup(accountId);
+//        for (int a = 0; a < groupIdArray.length; a++) {
+//            accountGroupMapper.removeAccountGroup(accountId,groupIdArray[a]);
+//        }
+            for (int a = 0; a < groupIdArray.length; a++) {
+                AccountGroup accountGroupEntity = new AccountGroup();
+                accountGroupEntity.setAccountId(Integer.parseInt(groupIdArray[a]));
+                accountGroupEntity.setGroupId(Integer.parseInt(groupIds));
+                accountGroupMapper.insert(accountGroupEntity);
+//            accountGroupMapper.insert(Integer.parseInt(accountId),Integer.parseInt(groupIdArray[a]));
+            }
+            return new Result(10001, "保存账号关联权限组成功", true);
+//        }
+
+
+    }
+
+    @Override
+    @Transactional
+    public Result saveGroupMenu(String groupId, String menuIds,String isAll) {
+        /**
+         * Step1:先删除原先的权限组关联菜单数据;
+         * Step2:再添加新的账号权限组关联菜单数据;
+         */
+        groupMenuMapper.removeGroupMenu(groupId);
+        if (StringUtils.isNotBlank(menuIds)){
+            String[] menuIdsArray = menuIds.split(",");
+            String[] split = isAll.split(",");
+
+            List<GroupMenu> list = new ArrayList();
+            for (int a = 0; a < menuIdsArray.length; a++) {
+                    GroupMenu groupMenu = new GroupMenu();
+                    groupMenu.setGroupId(Integer.parseInt(groupId));
+                    groupMenu.setMenuId(Integer.parseInt(menuIdsArray[a]));
+                list.add(groupMenu);
+            }
+            if (StringUtils.isNotBlank(isAll)){
+                for (GroupMenu groupMenu : list) {
+                    for (String s : split) {
+                        if (groupMenu.getMenuId()== Integer.parseInt(s)){
+                            groupMenu.setIsAll(1);
+                        }
+                    }
+                }
+            }
+            groupMenuService.saveBatch(list);
+        }
+
+
+        return new Result(10001, "保存权限组关联菜单成功", true);
+    }
+
+
+
+
+
+    @Override
+    public Result getMenuByGroup(String groupId) {
+        /* 根据权限组读取已关联菜单 */
+        QueryWrapper<GroupMenu> groupMenuQueryWrapper = new QueryWrapper<>();
+        groupMenuQueryWrapper.eq("group_id",groupId);
+
+        List<GroupMenu> groupMenuEntityList = groupMenuMapper.selectList(groupMenuQueryWrapper);
+        if (groupMenuEntityList.size() == 0) {
+            return new Result(10005, "当前权限组暂未关联任何菜单.", false);
+        }
+        /* 读取所有菜单 */
+        List<Menu> allMenuList = menuMapper.selectList(null);
+        if (allMenuList.size() == 0) {
+            return new Result(10007, "当前无任何菜单.", false);
+        }
+        List<GroupMenu> newList = new ArrayList();
+        StringBuilder idSb2 = new StringBuilder();
+
+        for (int a = 0; a < groupMenuEntityList.size(); a++) {
+            GroupMenu groupMenuEntity = groupMenuEntityList.get(a);
+            for (Menu menuEntity : allMenuList) {
+                if (menuEntity.getId().equals(groupMenuEntity.getMenuId())) {
+                    if (menuEntity.getParentId() == 0) {
+                        if (idSb2.length() > 0) {
+                            idSb2.append(",");
+                        }
+                        idSb2.append(groupMenuEntity.getMenuId());
+                        break;
+                    } else {
+                        boolean isChild = false;
+                        for (Menu menuEntity2 : allMenuList) {
+                            if (menuEntity2.getParentId().equals(groupMenuEntity.getMenuId())) {
+                                isChild = true;
+                                break;
+                            }
+                        }
+                        if (!isChild) {
+                            if (idSb2.length() > 0) {
+                                idSb2.append(",");
+                            }
+                            idSb2.append(groupMenuEntity.getMenuId());
+                        }
+                        break;
+                    }
+                }
+            }
+
+        }
+
+//        StringBuilder idSb = new StringBuilder();
+//        for (GroupMenu groupMenuEntity : groupMenuEntityList) {
+//            if (idSb.length() > 0) {
+//                idSb.append(",");
+//            }
+//            idSb.append(groupMenuEntity.getMenuId());
+//        }
+        return new Result(ResultCode.SUCCESS, idSb2.toString());
+    }
+
+    /**
+     * @param accountId
+     * @return
+     */
+    @Override
+    public Result getGroupByAccount(String accountId) {
+        /* 根据账号id读取已关联权限组 */
+        QueryWrapper<AccountGroup> accountGroupQueryWrapper = new QueryWrapper<>();
+        accountGroupQueryWrapper.eq("account_id",accountId);
+        List<AccountGroup> accountGroupEntityList = accountGroupMapper.selectList(accountGroupQueryWrapper);
+        if (accountGroupEntityList.size() == 0) {
+            return new Result(10006, "当前用户账号暂未关联任何权限组.", false);
+        }
+        StringBuilder idSb = new StringBuilder();
+        for (AccountGroup accountGroupEntity : accountGroupEntityList) {
+            if (idSb.length() > 0) {
+                idSb.append(",");
+            }
+            idSb.append(accountGroupEntity.getGroupId());
+        }
+        return new Result(ResultCode.SUCCESS, idSb.toString());
+    }
+
+    @Override
+    public Result getAccountByGroup(String groupId) {
+        /* 根据账号id读取已关联权限组 */
+
+        QueryWrapper<AccountGroup> accountGroupQueryWrapper = new QueryWrapper<>();
+        accountGroupQueryWrapper.eq("group_id",groupId);
+        List<AccountGroup> accountGroupEntityList = accountGroupMapper.selectList(accountGroupQueryWrapper);
+        if (accountGroupEntityList.size() == 0) {
+            return new Result(10006, "当前权限组暂未关联任何用户账号.", false);
+        }
+        StringBuilder idSb = new StringBuilder();
+        for (AccountGroup accountGroupEntity : accountGroupEntityList) {
+            if (idSb.length() > 0) {
+                idSb.append(",");
+            }
+            idSb.append(accountGroupEntity.getAccountId());
+        }
+        return new Result(ResultCode.SUCCESS, idSb.toString());
+    }
+
+    @Override
+    public List getMyMenuAll(String accountName) {
+        if ("1".equals(accountName)){
+            List<Menu> menus = menuMapper.selectList(new QueryWrapper<Menu>().orderByAsc("sort"));
+            return menus;
+        }
+        return menuMapper.getMyMenu(accountName);
+    }
+
+    @Override
+    public List<String> getMyButton(Integer userId) {
+        if (userId == 1){
+            List<Menu> menus = menuMapper.selectList(null);
+            List<String> list = new ArrayList<>();
+            for (Menu menu : menus) {
+                list.add(menu.getPermission());
+            }
+            return list;
+        }
+        return menuMapper.getMyButton(userId);
+    }
+
+    @Override
+    public List getMyMenuMultilevel(String userId) {
+        return null;
+    }
+
+    @Override
+    public Result getMenuByGroup1(String groupId) {
+        QueryWrapper<GroupMenu> groupMenuQueryWrapper = new QueryWrapper<>();
+        groupMenuQueryWrapper.eq("group_id",groupId);
+        groupMenuQueryWrapper.eq("is_all",0);
+        List<GroupMenu> groupMenuEntityList = groupMenuMapper.selectList(groupMenuQueryWrapper);
+        if (groupMenuEntityList.size() == 0) {
+            return new Result(10005, "当前权限组暂未关联任何菜单.", false);
+        }
+        StringBuilder stringBuffer = new StringBuilder();
+
+        for (GroupMenu groupMenu : groupMenuEntityList) {
+
+            stringBuffer.append(groupMenu.getMenuId());
+            stringBuffer.append(",");
+
+        }
+        stringBuffer.deleteCharAt(stringBuffer.length()-1);
+        return new Result(ResultCode.SUCCESS, stringBuffer.toString());
+    }
+
+}

+ 24 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/impl/BaseFarmServiceImpl.java

@@ -0,0 +1,24 @@
+package com.huimv.eartag2.admin.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.huimv.eartag2.admin.entity.BaseFarm;
+import com.huimv.eartag2.admin.mapper.BaseFarmMapper;
+import com.huimv.eartag2.admin.service.BaseFarmService;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author zn
+ * @since 2022-07-27
+ */
+@Service
+public class BaseFarmServiceImpl extends ServiceImpl<BaseFarmMapper, BaseFarm> implements BaseFarmService {
+
+
+
+
+}

+ 20 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/impl/GroupMenuServiceImpl.java

@@ -0,0 +1,20 @@
+package com.huimv.eartag2.admin.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.huimv.eartag2.admin.entity.GroupMenu;
+import com.huimv.eartag2.admin.mapper.GroupMenuMapper;
+import com.huimv.eartag2.admin.service.IGroupMenuService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Service
+public class GroupMenuServiceImpl extends ServiceImpl<GroupMenuMapper, GroupMenu> implements IGroupMenuService {
+
+}

+ 92 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/impl/GroupServiceImpl.java

@@ -0,0 +1,92 @@
+package com.huimv.eartag2.admin.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.huimv.eartag2.admin.entity.Group;
+import com.huimv.eartag2.admin.entity.GroupMenu;
+import com.huimv.eartag2.admin.mapper.GroupMapper;
+import com.huimv.eartag2.admin.mapper.GroupMenuMapper;
+import com.huimv.eartag2.admin.service.IGroupService;
+import com.huimv.eartag2.common.utils.Result;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Service
+public class GroupServiceImpl extends ServiceImpl<GroupMapper, Group> implements IGroupService {
+    @Autowired
+    private GroupMapper groupMapper;
+    @Autowired
+    private GroupMenuMapper groupMenuMapper;
+
+
+    @Override
+    public Result updateGroup(@RequestBody Group group) {
+        try {
+            groupMapper.updateById(group);
+            return new Result(10000,"修改成功",true);
+        }catch (Exception e){
+            return new Result(10001,"修改失败",false);
+        }
+    }
+
+    @Override
+    @Transactional
+    public Result removeGroup(Integer groupId) {
+        try {
+            Group group = this.groupMapper.selectById(groupId);
+            if (group == null) {
+                return new Result(10002,"请选择数据",false);
+            }
+            // 删除权限组
+            this.groupMapper.deleteById(groupId);
+            // 删除权限组关联菜单
+            QueryWrapper<GroupMenu> groupMenuQueryWrapper = new QueryWrapper<>();
+            groupMenuQueryWrapper.eq("group_id",groupId);
+            groupMenuMapper.delete(groupMenuQueryWrapper);
+            return new Result(10000,"删除成功",true);
+        }catch (Exception e){
+            return new Result(10001,"删除失败",false);
+        }
+    }
+
+    @Override
+    public  IPage<Group> listGroup(Map map, List<Integer> allChildId) {
+        Integer pageNum = (Integer)map.get("pageNum");
+        Integer pageSize = (Integer)map.get("pageSize");
+        String searchStr = (String)map.get("searchStr");
+        if (ObjectUtil.isNotEmpty(allChildId)) {
+
+            return this.page(new Page<>(pageNum, pageSize),new QueryWrapper<Group>().in("account_id",allChildId).orderByDesc("id").like(StringUtils.isNotBlank(searchStr),"group_name",searchStr));
+        }
+        return this.page(new Page<>(pageNum, pageSize),new QueryWrapper<Group>().eq("account_id",null).orderByDesc("id").like(StringUtils.isNotBlank(searchStr),"group_name",searchStr));
+
+    }
+
+    @Override
+    public Result addGroup(Group group, Integer userId) {
+        try {
+            group.setAccountId(userId);
+            groupMapper.insert(group);
+            return new Result(10000,"添加成功",true);
+        }catch (Exception e){
+            return new Result(10001,"添加失败",false);
+        }
+    }
+}

+ 43 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/impl/LoginServiceImpl.java

@@ -0,0 +1,43 @@
+package com.huimv.eartag2.admin.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.huimv.eartag2.common.utils.Result;
+
+import com.huimv.eartag2.admin.entity.SysAccountMultilevel;
+import com.huimv.eartag2.admin.mapper.SysAccountMultilevelMapper;
+import com.huimv.eartag2.admin.service.ILoginService;
+import com.huimv.eartag2.common.utils.ResultCode;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class LoginServiceImpl implements ILoginService {
+
+
+    @Override
+    public Result logout() {
+        return null;
+    }
+
+    @Autowired
+    private SysAccountMultilevelMapper accountMultilevelMapper;
+
+    @Override
+    public Result loginMultilevel(String accountName, String password) {
+
+        QueryWrapper<SysAccountMultilevel> wrapper = new QueryWrapper<>();
+        wrapper.eq("account",accountName).eq("password",password);
+        SysAccountMultilevel accountMultilevel = accountMultilevelMapper.selectOne(wrapper);
+
+        if (ObjectUtil.isEmpty(accountMultilevel)){
+            return new Result(10001, "账号不存在或密码错误.", false);
+        }
+
+
+        if (accountMultilevel.getAccountStatus() == 0){
+            return new Result(10002, "该服务器已暂停.", false);
+    }
+        return new Result(ResultCode.SUCCESS,accountMultilevel);
+    }
+}

+ 157 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/impl/MenuServiceImpl.java

@@ -0,0 +1,157 @@
+package com.huimv.eartag2.admin.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.huimv.eartag2.common.utils.Result;
+import com.huimv.eartag2.admin.entity.AccountGroup;
+import com.huimv.eartag2.admin.entity.GroupMenu;
+import com.huimv.eartag2.admin.entity.Menu;
+import com.huimv.eartag2.admin.mapper.AccountGroupMapper;
+import com.huimv.eartag2.admin.mapper.GroupMenuMapper;
+import com.huimv.eartag2.admin.mapper.MenuMapper;
+import com.huimv.eartag2.admin.service.IMenuService;
+import com.huimv.eartag2.common.utils.ResultCode;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Service
+public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IMenuService {
+    @Autowired
+    private MenuMapper menuMapper;
+
+    @Autowired
+    private AccountGroupMapper accountGroupMapper;
+
+    @Autowired
+    private GroupMenuMapper groupMenuMapper;
+
+    @Override
+    public Result addMenu(Menu menu, Integer userId) {
+
+        try {
+            if (menu == null){
+                return  new Result(10002,"参数错误",false);
+            }
+
+             menuMapper.insert(menu);
+            Integer id = menu.getId();
+            List<AccountGroup> accounts = accountGroupMapper.selectList(new QueryWrapper<AccountGroup>().eq("account_id", userId));
+            for (AccountGroup account : accounts) {
+                GroupMenu groupMenu = new GroupMenu();
+                groupMenu.setGroupId(account.getGroupId());
+                groupMenu.setMenuId(id);
+                groupMenuMapper.insert(groupMenu);
+            }
+
+            return new Result(10000,"添加成功",true);
+        }catch (Exception e){
+            return new Result(10001,"添加失败",false);
+        }
+    }
+
+    @Override
+    public Result editMenu(Menu menu) {
+        try {
+            if (menu.getId() == null){
+                return new Result(10002,"请选择要修改的菜单",false);
+            }
+            menuMapper.updateById(menu);
+            return new Result(10000,"修改成功",true);
+        }catch (Exception e){
+            return new Result(10001,"修改失败",false);
+        }
+
+    }
+
+    @Override
+    public Result removeMenu(Integer menuId) {
+        try {
+            QueryWrapper<Menu> menuQueryWrapper = new QueryWrapper<>();
+            menuQueryWrapper.eq("parent_id",menuId);
+            List<Menu> lists = menuMapper.selectList(menuQueryWrapper);
+            if (lists != null && lists.size()>0){
+                for (Menu menu : lists) {
+                    removeMenu(menu.getId());
+                    menuMapper.deleteById(menu);
+                }
+            }
+            menuMapper.deleteById(menuId);
+        }catch (Exception e){
+            return new Result(10001,"删除失败",false);
+        }
+        return new Result(10000,"删除成功",true);
+    }
+
+    //查询菜单,只查一次数据库
+    @Override
+    public Result optimizeList() {
+        QueryWrapper<Menu> menuQueryWrapper = new QueryWrapper<>();
+        menuQueryWrapper.orderByAsc("sort");
+
+        List<Menu> all = menuMapper.selectList(menuQueryWrapper);
+        List list = optimizeListUtil(0,all);
+        return new Result(ResultCode.SUCCESS,list);
+    }
+
+    @Override
+    public Result list1() {
+        QueryWrapper<Menu> menuQueryWrapper = new QueryWrapper<>();
+        menuQueryWrapper.orderByAsc("sort");
+        menuQueryWrapper.eq("weight",0);
+        List<Menu> all = menuMapper.selectList(menuQueryWrapper);
+        List list = optimizeListUtil(0,all);
+        return new Result(ResultCode.SUCCESS,list);
+    }
+
+    @Override
+    public List<Map> optimizeListUtil(int parentId, List<Menu> menuEntityList){
+        List<Map> list = new ArrayList<>();
+        for (Menu menuEntity : menuEntityList) {
+            if (menuEntity.getParentId() == parentId){
+                Map map = new HashMap();
+                map.put("id", menuEntity.getId());
+                map.put("title", menuEntity.getTitle());
+                map.put("parentId", menuEntity.getParentId());
+                map.put("url", menuEntity.getUrl());
+                map.put("sort", menuEntity.getSort());
+                map.put("value", menuEntity.getId());
+                map.put("pid", menuEntity.getParentId());
+                map.put("permission", menuEntity.getPermission());
+                map.put("weight", menuEntity.getWeight());
+                map.put("ifShow", menuEntity.getIfShow());
+                if (menuEntityIsChildren(menuEntity,menuEntityList) ){
+                    map.put("children",optimizeListUtil(menuEntity.getId(),menuEntityList));
+                }else {
+                    map.put("children",new ArrayList<>());
+                }
+                list.add(map);
+            }
+        }
+        return list;
+    }
+
+
+
+    //判断是否有children
+    private boolean menuEntityIsChildren(Menu menuEntity, List<Menu> menuEntityList) {
+        for (Menu Menu : menuEntityList) {
+            if (menuEntity.getId().equals(Menu.getParentId()) ){
+                return true;
+            }
+        }
+        return false;
+    }
+}

+ 20 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/impl/Sheet1ServiceImpl.java

@@ -0,0 +1,20 @@
+package com.huimv.eartag2.admin.service.impl;
+
+import com.huimv.eartag2.admin.entity.Sheet1;
+import com.huimv.eartag2.admin.mapper.Sheet1Mapper;
+import com.huimv.eartag2.admin.service.ISheet1Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author author
+ * @since 2022-05-20
+ */
+@Service
+public class Sheet1ServiceImpl extends ServiceImpl<Sheet1Mapper, Sheet1> implements ISheet1Service {
+
+}

+ 216 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/impl/SysAccountMultilevelServiceImpl.java

@@ -0,0 +1,216 @@
+package com.huimv.eartag2.admin.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.annotation.SqlParser;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.huimv.eartag2.admin.entity.BaseFarm;
+import com.huimv.eartag2.admin.entity.SysOrg;
+import com.huimv.eartag2.admin.entity.dto.SysAccountMultilevelDto;
+import com.huimv.eartag2.admin.mapper.BaseFarmMapper;
+import com.huimv.eartag2.admin.mapper.SysOrgMapper;
+import com.huimv.eartag2.common.common.token.TokenSign;
+import com.huimv.eartag2.common.utils.Result;
+import com.huimv.eartag2.admin.entity.SysAccountMultilevel;
+import com.huimv.eartag2.admin.mapper.SysAccountMultilevelMapper;
+import com.huimv.eartag2.admin.service.ISysAccountMultilevelService;
+import com.huimv.eartag2.common.utils.ResultCode;
+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.Map;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-10-14
+ */
+@Service
+public class SysAccountMultilevelServiceImpl extends ServiceImpl<SysAccountMultilevelMapper, SysAccountMultilevel> implements ISysAccountMultilevelService {
+
+    @Autowired
+    private SysAccountMultilevelMapper accountMultilevelMapper;
+
+
+    @Autowired
+    private SysOrgMapper sysOrgMapper;
+
+
+    @Override
+    public Result findUserAccount(String searchStr, int pageNum, int pageSize, Integer userId) {
+
+        QueryWrapper<SysAccountMultilevel> wrapper = new QueryWrapper<>();
+        wrapper.like("pids",userId).or().eq("id",userId);
+        IPage<SysAccountMultilevel> page = this.page(new Page<>(pageNum, pageSize), wrapper);
+        return new Result(ResultCode.SUCCESS,page);
+    }
+
+    @Override
+    public Result add(SysAccountMultilevel sysAccountMultilevel, Integer userId) {
+
+        int account = this.count(new QueryWrapper<SysAccountMultilevel>().eq("account", sysAccountMultilevel.getAccount()));
+//        SysOrg sysOrg = sysOrgMapper.selectById(sysAccountMultilevel.getOrgId());
+
+        if (account > 0 ){
+            return new Result(10001,"该账号已经存在,请重新创建",false);
+
+
+        }
+//        sysAccountMultilevel.setPids(sysOrg.getPids());
+
+        SysAccountMultilevel byId = this.getById(userId);
+        sysAccountMultilevel.setType(byId.getType()+1);
+
+
+//        sysAccountMultilevel.setOrgId(userId);
+        sysAccountMultilevel.setPids(userId+","+byId.getPids());
+        sysAccountMultilevel.setPid(+userId);
+        sysAccountMultilevel.setType(byId.getType());
+        accountMultilevelMapper.insert(sysAccountMultilevel);
+        return  new Result( 10000,"添加成功",true);
+    }
+
+
+
+
+
+    @Override
+    public Result setAccountStatus(List<Integer> ids, Integer status) {
+        try {
+            for (Integer id : ids) {
+                SysAccountMultilevel account= new SysAccountMultilevel();
+                account.setId(id);
+                account.setAccountStatus(status);
+                this.updateById(account);
+            }
+        }catch (Exception e){
+            return new Result(10001,"插入失败",false);
+        }
+        String message = "";
+        if(status == 1){
+            message = "你选择的账号已经启用。";
+        }else{
+            message = "你选择的账号已经暂停启用。";
+        }
+        return new Result(10000,message,true);
+    }
+
+    @Override
+    public List<Integer> getAllChildId(String orgId) {
+        List<SysAccountMultilevel> pids = this.list(new QueryWrapper<SysAccountMultilevel>().like("pids", orgId ));
+        List<Integer> list = new ArrayList<>();
+        for (SysAccountMultilevel pid : pids) {
+            list.add(pid.getId());
+        }
+        return list;
+    }
+
+//    @Override
+  /*  public Result listSubordinate(String searchStr, int pageNum, int pageSize, String orgId) {
+
+        QueryWrapper<SysAccountMultilevel> wrapper = new QueryWrapper<>();
+
+        if ( !"0".equals(orgId)){
+            List<SysOrg> sysOrgs = sysOrgMapper.selectList(new QueryWrapper<SysOrg>().like("pids", orgId));
+            List list = new ArrayList();
+            for (SysOrg sysOrg : sysOrgs) {
+                list.add(sysOrg.getId());
+            }
+            if (ObjectUtil.isNotEmpty(list)){
+                wrapper.in("org_id",list);
+            }else {
+                wrapper.eq("org_id",null);
+            }
+
+        }
+        wrapper.ne("id",1);
+        if (StringUtils.isNotBlank(searchStr)){
+            wrapper.like("user_name",searchStr).or().like("account",searchStr);
+        }
+
+        IPage<SysAccountMultilevel> page = this.page(new Page<>(pageNum, pageSize), wrapper);
+        return new Result(ResultCode.SUCCESS,page);
+    }*/
+    @Override
+    public Result listSubordinate(String searchStr, int pageNum, int pageSize, Integer orgId) {
+
+        QueryWrapper<SysAccountMultilevel> wrapper = new QueryWrapper<>();
+
+//        wrapper.ne("id",orgId);
+        wrapper.like("pids",orgId);
+        if (StringUtils.isNotBlank(searchStr)){
+            wrapper.like("user_name",searchStr).or().like("account",searchStr);
+        }
+
+        IPage<SysAccountMultilevel> page = this.page(new Page<>(pageNum, pageSize), wrapper);
+        return new Result(ResultCode.SUCCESS,page);
+    }
+    @Override
+    public Result getLastFarmId(Integer userId) {
+        SysAccountMultilevel sysAccountMultilevel = accountMultilevelMapper.selectById(userId);
+        Integer lastFarmId = sysAccountMultilevel.getLastFarmId();
+        String farmIds = sysAccountMultilevel.getFarmIds();
+        if (farmIds == null){
+            return new Result(10001,"该账号没有绑定牧场",true);
+        }
+        if (lastFarmId == null){
+            String[] split = farmIds.split(",");
+            String s = split[0];
+            sysAccountMultilevel.setLastFarmId(Integer.valueOf(s));
+            accountMultilevelMapper.updateById(sysAccountMultilevel);
+            return new Result(ResultCode.SUCCESS,s);
+        }
+        return new Result(ResultCode.SUCCESS,lastFarmId);
+    }
+    @Autowired
+    private BaseFarmMapper baseFarmMapper;
+
+    @Override
+    public Result listById(Integer userId) {
+        if (1 ==userId){
+            return new Result(ResultCode.SUCCESS,baseFarmMapper.selectList(null));
+        }
+        SysAccountMultilevel sysAccountMultilevel = accountMultilevelMapper.selectById(userId);
+        String[] farmIds = sysAccountMultilevel.getFarmIds().split(",");
+        return new Result(ResultCode.SUCCESS,baseFarmMapper.selectList(new QueryWrapper<BaseFarm>().in("farm_code",farmIds)));
+    }
+
+    @Override
+    public Result boundFarm(Map<String, String> paramsMap) {
+        String farmCodes = paramsMap.get("farmCodes");
+        String userId = paramsMap.get("userId");
+        SysAccountMultilevel sysAccountMultilevel = accountMultilevelMapper.selectById(userId);
+        sysAccountMultilevel.setFarmIds(farmCodes);
+        accountMultilevelMapper.updateById(sysAccountMultilevel);
+        return new Result(10000,"绑定成功",true);
+    }
+
+    @Override
+    public Result updateUserPassword(Map<String,String> map,Integer userId) {
+        String oldPassWord = map.get("oldPassWord");
+        String newPassWord = map.get("newPassWord");
+        SysAccountMultilevel accountMultilevel = accountMultilevelMapper.selectById(userId);
+        if (!accountMultilevel.getPassword().equals(oldPassWord)){
+            return new Result(10001,"密码错误",false);
+        }
+        accountMultilevel.setPassword(newPassWord);
+        accountMultilevelMapper.updateById(accountMultilevel);
+
+
+
+        return new Result(ResultCode.SUCCESS,"修改成功");
+
+    }
+
+
+}

+ 223 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/impl/SysOrgServiceImpl.java

@@ -0,0 +1,223 @@
+
+package com.huimv.eartag2.admin.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.huimv.eartag2.admin.entity.SysAccountMultilevel;
+import com.huimv.eartag2.admin.entity.SysOrg;
+import com.huimv.eartag2.admin.mapper.SysAccountMultilevelMapper;
+import com.huimv.eartag2.admin.mapper.SysOrgMapper;
+import com.huimv.eartag2.admin.service.SysOrgService;
+import com.huimv.eartag2.common.common.token.TokenSign;
+import com.huimv.eartag2.common.utils.Result;
+import com.huimv.eartag2.common.utils.ResultCode;
+import org.apache.commons.lang.StringUtils;
+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.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+
+@Service
+public class SysOrgServiceImpl extends ServiceImpl<SysOrgMapper, SysOrg> implements SysOrgService {
+
+    @Autowired
+    private SysAccountMultilevelMapper multilevelMapper ;
+
+    @Autowired
+    private SysAccountMultilevelMapper accountMultilevelMapper ;
+
+
+    @Override
+    public Result page(Map<String,String> map, Integer userId) {
+        String pageNum = map.get("pageNum");
+        String pageSize = map.get("pageSize");
+        String name = map.get("name");
+        String orgId = map.get("orgId");
+
+        if (StringUtils.isBlank(pageNum)){
+            pageNum ="1";
+        }
+        if (StringUtils.isBlank(pageSize)){
+            pageSize ="10";
+        }
+
+        QueryWrapper<SysOrg> wrapper = new QueryWrapper<>();
+        wrapper.like(StringUtils.isNotBlank(name),"name",name);
+        wrapper.eq("audit",0);
+        if (StringUtils.isBlank(orgId)){
+            if ( userId != 1){
+                SysAccountMultilevel sysAccountMultilevel = multilevelMapper.selectById(userId);
+                Long orgId1 = sysAccountMultilevel.getOrgId();
+                wrapper.like("pids",orgId1).or().eq("id",orgId1);
+            }
+        }else {
+            wrapper.like("pids",orgId).or().eq("id",orgId);
+        }
+
+
+
+        wrapper.orderByAsc("sort");
+        Page<SysOrg> page = this.page(new Page<>(Long.parseLong(pageNum), Long.parseLong(pageSize)), wrapper);
+
+
+        return new Result(ResultCode.SUCCESS,page);
+    }
+
+    @Override
+    public Result list(HttpServletRequest request) {
+        Integer userId = TokenSign.getMemberIdByJwtToken(request);
+        List<SysOrg> collect;
+        //管理员
+        if (userId == 1){
+            List<SysOrg> list = this.list( new QueryWrapper<SysOrg>().eq("audit",0));
+
+            collect = list.stream()
+                    .filter(o -> o.getParentId() == 0)
+                    .peek(o -> o.setChildren(getChildrens(o, list)))
+                    .collect(Collectors.toList());
+
+        }else {
+            SysAccountMultilevel sysAccountMultilevel = multilevelMapper.selectById(userId);
+            Long orgId = sysAccountMultilevel.getOrgId();
+            QueryWrapper<SysOrg> wrapper = new QueryWrapper<>();
+
+            wrapper.eq("audit",0).like("pids",orgId).or().eq("id",orgId);
+            List<SysOrg> list = this.list(wrapper);
+
+            collect = list.stream()
+                    .filter(o -> o.getId().equals( orgId))
+                    .peek(o -> o.setChildren(getChildrens(o, list)))
+                    .collect(Collectors.toList());
+
+
+        }
+
+        return new Result(ResultCode.SUCCESS,collect);
+    }
+
+    private List<SysOrg> getChildrens(SysOrg o, List<SysOrg> list) {
+
+        return list.stream()
+                .filter(m -> m.getParentId().equals( o.getId()))
+                .peek(m -> m.setChildren(getChildrens(m, list)))
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public void add(SysOrg sysOrg) {
+        Long pid = sysOrg.getParentId();
+        SysOrg byId = this.getById(pid);
+        if (ObjectUtil.isNotEmpty(byId)){
+            String   pids =   byId.getPids();
+            sysOrg.setPids(pids+","+pid);
+        }else {
+            sysOrg.setPids(pid+"");
+        }
+        this.save(sysOrg);
+    }
+
+    @Override
+    public void update(SysOrg sysOrg) {
+
+        Long pid = sysOrg.getParentId();
+        SysOrg byId = this.getById(pid);
+        if (ObjectUtil.isNotEmpty(byId)){
+            String   pids =   byId.getPids();
+            sysOrg.setPids(pids+","+pid);
+        }else {
+            sysOrg.setPids(pid+"");
+        }
+        this.updateById(sysOrg);
+    }
+
+    @Override
+    public void approval(Map map,HttpServletRequest request) {
+        Integer userId = TokenSign.getMemberIdByJwtToken(request);
+
+        String ids = (String)map.get("ids");
+        Integer audit = (Integer)map.get("audit");
+
+        String userName = accountMultilevelMapper.selectById(userId).getUserName();
+        Date date = new Date();
+
+        for (String s : ids.split(",")) {
+            SysOrg sysOrg = new SysOrg();
+            sysOrg.setId(Long.parseLong(s));
+            sysOrg.setAudit(audit);
+            sysOrg.setApprovalId(userId);
+            sysOrg.setApprovalName(userName);
+            sysOrg.setPassTime(date);
+            this.updateById(sysOrg);
+        }
+
+
+
+    }
+
+    @Override
+    @Transactional
+    public Result remove(String orgId) {
+        for (String s : orgId.split(",")) {
+            Integer countUser = multilevelMapper.selectCount(new QueryWrapper<SysAccountMultilevel>().eq("org_id", orgId));
+
+            if (countUser>0){
+                return new Result(10001,"删除失败,该组织已绑定账号",false);
+            }
+            //判断组织
+//            int pids = this.count(new QueryWrapper<SysOrg>().like("pids", orgId));
+//            if (pids >0 ){
+//                return new Result(10001,"删除失败,该组织有下属组织",false);
+//            }
+            this.removeById(s);
+
+        }
+
+        return new Result(10000,"删除成功",false);
+    }
+
+    @Override
+    public Result page1(Map<String, String> map, Integer userId) {
+        String pageNum = map.get("pageNum");
+        String pageSize = map.get("pageSize");
+        String name = map.get("name");
+        String orgId = map.get("orgId");
+        String audit = map.get("audit");
+
+        if (StringUtils.isBlank(pageNum)){
+            pageNum ="1";
+        }
+        if (StringUtils.isBlank(pageSize)){
+            pageSize ="10";
+        }
+
+        QueryWrapper<SysOrg> wrapper = new QueryWrapper<>();
+        wrapper.like(StringUtils.isNotBlank(name),"name",name);
+        wrapper.eq(StringUtils.isNotBlank(audit),"audit",audit);
+        if (StringUtils.isBlank(orgId)){
+            if ( userId != 1){
+                SysAccountMultilevel sysAccountMultilevel = multilevelMapper.selectById(userId);
+                wrapper.like("pids",sysAccountMultilevel.getOrgId());
+            }
+        }else {
+            wrapper.like("pids",orgId).or().eq("id",orgId);
+        }
+
+
+
+        wrapper.orderByAsc("sort");
+        Page<SysOrg> page = this.page(new Page<>(Long.parseLong(pageNum), Long.parseLong(pageSize)), wrapper);
+
+
+        return new Result(ResultCode.SUCCESS,page);
+    }
+
+
+}

+ 187 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/service/impl/UserServiceImpl.java

@@ -0,0 +1,187 @@
+package com.huimv.eartag2.admin.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.huimv.eartag2.admin.entity.User;
+import com.huimv.eartag2.admin.entity.dto.UserAccountDto;
+import com.huimv.eartag2.admin.mapper.UserMapper;
+import com.huimv.eartag2.admin.service.IUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Service
+public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
+    @Autowired
+    private UserMapper userMapper;
+
+    @Override
+    public JSONObject findUserAccount(String searchStr, int pageNum, int pageSize) {
+        int start = (pageNum-1)*pageSize;
+
+        if (StringUtils.isNotBlank(searchStr)) {
+            List<UserAccountDto> userAccountList = userMapper.findUserAndAccountByUserName(searchStr, start,pageSize);
+            QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
+            userQueryWrapper.eq("user_name",searchStr);
+            int total = userMapper.selectCount(userQueryWrapper);
+            JSONObject resultJo = new JSONObject();
+            resultJo.put("code",10001);
+            resultJo.put("totalElements",total);
+            resultJo.put("data",userAccountList);
+            return resultJo;
+        }
+        List<UserAccountDto> allUserAccountList = userMapper.findUserAndAccount(start,pageSize);
+        Integer total = userMapper.selectCount(null);
+        JSONObject resultJo = new JSONObject();
+        resultJo.put("code",10001);
+        resultJo.put("totalElements",total);
+        resultJo.put("data",allUserAccountList);
+        return resultJo;
+    }
+
+    /**
+     * 封装对象
+     */
+    private Object packageUserAccountRelatedObj(Object[] userAccountObj) {
+        JSONObject dataJo = new JSONObject();
+        dataJo.put("id",userAccountObj[0].toString());
+        dataJo.put("userName",userAccountObj[1].toString());
+        if(userAccountObj[2] == null){
+            dataJo.put("male","");
+        }else{
+            dataJo.put("male",userAccountObj[2].toString());
+        }
+        if(userAccountObj[3] == null){
+            dataJo.put("birthday","");
+        }else{
+            dataJo.put("birthday",userAccountObj[3].toString());
+        }
+        if(userAccountObj[4] == null){
+            dataJo.put("mobile","");
+        }else{
+            dataJo.put("mobile",userAccountObj[4].toString());
+        }
+        if(userAccountObj[5] == null){
+            dataJo.put("address","");
+        }else{
+            dataJo.put("address",userAccountObj[5].toString());
+        }
+        if(userAccountObj[6] == null){
+            dataJo.put("job","");
+        }else{
+            dataJo.put("job",userAccountObj[6].toString());
+        }
+        if(userAccountObj[7] == null){
+            dataJo.put("remark","");
+        }else{
+            dataJo.put("remark",userAccountObj[7].toString());
+        }
+        if(userAccountObj[8] == null)
+        {
+            dataJo.put("userId","");
+        }else{
+            dataJo.put("userId",userAccountObj[8].toString());
+        }
+        if(userAccountObj[9] == null){
+            dataJo.put("accountName","");
+        }else{
+            dataJo.put("accountName",userAccountObj[9].toString());
+        }
+        if(userAccountObj[10] == null)
+        {dataJo.put("accountStatus","");
+
+        }else{
+            dataJo.put("accountStatus", Integer.parseInt(userAccountObj[10].toString()));
+        }
+        return dataJo;
+    }
+//
+//    @Override
+//    public Result addUser(User user) {
+//        try {
+//            int count = 0;
+//            count = this.count(new QueryWrapper<User>().eq("user_name", user.getUserName()));
+//            if (count > 0){
+//                return new Result(10001,"该用户名已存在",false);
+//            }
+//
+//            count = this.count(new QueryWrapper<User>().eq("mobile", user.getMobile()));
+//            if (count > 0){
+//                return new Result(10001,"该手机号已注册",false);
+//            }
+//            SnowflakeSequence idWorker = new SnowflakeSequence();
+//            long userId = idWorker.nextId();
+//            // 添加用户信息
+//            user.setUserId(userId+"");
+//            userMapper.insert(user);
+//
+//            // 添加账号信息
+//            String mobile = user.getMobile();
+//            String userName = user.getUserName();
+//            Account Account = new Account();
+//            if (mobile != null && !"".equals(mobile) ){
+//                Account.setAccountName(mobile);
+//            }else if (userName != null && !"".equals(userName)){
+//                Account.setAccountName(userName);
+//            }
+//            Account.setAccountStatus(0);
+//            Account.setRemark("");
+//            Account.setPassword("123456");
+//            Account.setUserId(userId+"");
+//            Account.setMobile(mobile);
+//            accountMapper.insert(Account);
+//            return new Result(10000,"添加成功",true);
+//        }catch (Exception e){
+//            return new Result(10001,"添加失败",false);
+//        }
+//    }
+//
+//    @Override
+//    public Result updateUser(User user) {
+//            if (user == null) {
+//                return  new Result(ResultCode.FAIL);
+//            }
+//            User byId = this.getById(user);
+//            QueryWrapper<Account> accountQueryWrapper = new QueryWrapper<>();
+//            accountQueryWrapper.eq("user_id",byId.getUserId());
+//            Account account = accountMapper.selectOne(accountQueryWrapper);
+//            out.println(byId);
+//            out.println(account);
+//            account.setMobile(byId.getMobile());
+//            account.setAccountName(byId.getUserName());
+//            accountMapper.updateById(account);
+//
+//            userMapper.updateById(user);
+//            return new Result(10000,"修改成功",true);
+//    }
+//
+//    @Override
+//    public Result removeUser(List<Integer> userIds) {
+//        for (Integer userId : userIds) {
+//            try {
+//                User user = this.userMapper.selectById(userId);
+//                if (user == null) {
+//                    return new Result(10002,"请选择数据",false);
+//                }
+//                this.userMapper.deleteById(userId);
+//                // 删除账号
+//                this.accountMapper.deleteById(userId);
+//            }catch (Exception e){
+//                return new Result(10001,"删除失败",false);
+//            }
+//        }
+//        return new Result(10000,"删除成功",false);
+//    }
+
+}

+ 110 - 0
huimv-eartag2-admin/src/main/java/com/huimv/eartag2/admin/session/AccessToken.java

@@ -0,0 +1,110 @@
+package com.huimv.eartag2.admin.session;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+
+import java.util.Date;
+
+/**
+ * 登录的token信息
+ * @author guojian
+ */
+public class AccessToken {
+    private String token;
+    private String loginIp;
+    private Date created;
+    private String accountName;
+    private Integer code;
+     private Integer id;
+
+
+    private Integer type;
+    private String farmId;
+    private String message;
+
+    public AccessToken() {
+    }
+
+    public String getToken() {
+        return token;
+    }
+
+    public void setToken(String token) {
+        this.token = token;
+    }
+
+    public String getLoginIp() {
+        return loginIp;
+    }
+
+    public void setLoginIp(String loginIp) {
+        this.loginIp = loginIp;
+    }
+
+    public Date getCreated() {
+        return created;
+    }
+
+    public void setCreated(Date created) {
+        this.created = created;
+    }
+
+    public String getAccountName() {
+        return accountName;
+    }
+
+    public void setAccountName(String accountName) {
+        this.accountName = accountName;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getFarmId() {
+        return farmId;
+    }
+
+    public void setFarmId(String farmId) {
+        this.farmId = farmId;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public AccessToken(String token, String loginIp, Date created, String accountName, Integer code, Integer id, Integer type, String farmId, String message) {
+        this.token = token;
+        this.loginIp = loginIp;
+        this.created = created;
+        this.accountName = accountName;
+        this.code = code;
+        this.id = id;
+        this.type = type;
+        this.farmId = farmId;
+        this.message = message;
+    }
+}

+ 106 - 0
huimv-eartag2-admin/src/main/resources/application-dev.yml

@@ -0,0 +1,106 @@
+server:
+  port: 8098
+spring:
+  application:
+    name: huimv-eartag2-admin
+
+  datasource:
+    url: jdbc:mysql://115.238.57.190:3306/huimv-demo-eartag20?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+    username: root
+    password: hm123456
+    driver-class-name: com.mysql.cj.jdbc.Driver
+  jpa:
+    show-sql: false
+    database: mysql
+    hibernate:
+      ddl-auto: update
+    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
+    open-in-view: true
+
+  #配置rabbitMq 服务器
+#  rabbitmq:
+#    host: 10.0.0.4
+#    port: 5672
+#    username: huimv
+#    password: hm123456
+#    #虚拟host 可以不设置,使用server默认host
+#    virtual-host: /
+  rabbitmq:
+    host: 121.36.134.218
+    port: 5672
+    username: admin
+    password: admin
+    #虚拟host 可以不设置,使用server默认host
+    virtual-host: /
+    listener:
+      simple:
+        acknowledge-mode: none
+
+  #redis
+  redis:
+    database: 0
+    host: 121.36.134.218
+    port: 6379
+    password: hm123456
+    timeout: 5000ms
+    jedis:
+      pool:
+        max-active: 20
+        max-wait: -1
+        max-idle: 10
+        min-idle: 0
+
+  #redis
+#  redis:
+#    database: 0
+#    host: 192.168.1.68
+#    port: 6379
+#    password: hm123456
+#    timeout: 5000ms
+#    jedis:
+#      pool:
+#        max-active: 20
+#        max-wait: -1
+#        max-idle: 10
+#        min-idle: 0
+#    lettuce:
+#      pool:
+#        max-active: 3
+#        min-idle: 2
+#        max-idle: 3
+#        max-wait: 1
+#      shutdown-timeout: 100
+
+#  data:
+#    redis:
+#      repositories:
+#        enabled: false
+
+  #是否缓存空值
+#  cache:
+#    redis:
+#      cache-null-values: false
+    #server:
+#  port: 9110
+#spring:
+#  application:
+#    name: huimv-hy-autoGetData
+#
+#  datasource:
+##    url: jdbc:mysql://47.98.175.112:3306/huimv_ql_farm_haiyan?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+#    #    url: jdbc:mysql://36.22.189.214:3306/huimv_ql_farm?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+#        url: jdbc:mysql://115.238.57.190:3306/huimv_ql_farm?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+#    username: root
+#    password: hm123456
+#    driver-class-name: com.mysql.cj.jdbc.Driver
+#  jpa:
+#    properties:
+#      hibernate:
+#        enable_lazy_load_no_trans: true
+#    show-sql: false
+#    database: mysql
+#    hibernate:
+#      ddl-auto: update
+#    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
+#    open-in-view: true
+

+ 78 - 0
huimv-eartag2-admin/src/main/resources/application-prod.yml

@@ -0,0 +1,78 @@
+server:
+  port: 8098
+spring:
+  application:
+    name: huimv-eartag2-admin
+
+  datasource:
+    #url: jdbc:mysql://139.9.172.209:3309/huimv-demo-eartag20?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+    url: jdbc:mysql://115.238.57.190/huimv-demo-eartag-new?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+    username: root
+    password: hm123456
+    driver-class-name: com.mysql.cj.jdbc.Driver
+  jpa:
+    show-sql: false
+    database: mysql
+    hibernate:
+      ddl-auto: update
+    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
+    open-in-view: true
+
+  rabbitmq:
+    host: 121.36.134.218
+    #    host: 10.0.0.14
+    port: 5672
+    username: admin
+    password: admin
+    #虚拟host 可以不设置,使用server默认host
+    virtual-host: /
+    listener:
+      simple:
+        acknowledge-mode: none
+
+  #redis
+  redis:
+    cluster:
+      nodes:
+        - 122.112.224.199:6379
+        - 47.98.40.154:6379
+      max-redirects: 5
+      password: hm123456
+
+#  redis:
+#    database: 0
+#    host: 121.36.134.218
+#    #    host: 10.0.0.14
+#    port: 6379
+#    password: hm123456
+#    timeout: 5000ms
+#    jedis:
+#      pool:
+#        max-active: 20
+#        max-wait: -1
+#        max-idle: 10
+#        min-idle: 0
+  cloud:
+    nacos:
+      discovery:
+        server-addr: 47.98.40.154:8848
+        ephemeral: false
+      config:
+        server-addr: 47.98.40.154:8848   # Nacos 配置服务地址
+        namespace: public    # Nacos 命名空间
+        group: DEFAULT_GROUP          # Nacos 配置组
+
+
+mybatis-plus:
+  global-config:
+    db-config:
+      logic-delete-value: 1
+      logic-not-delete-value: 0
+  configuration:
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  # mapper.xml文件所存放的位置
+  mapper-locations: classpath*:com/huimv/eartag2/manage2/mapper/xml/*.xml  # 不加这一行出错:“org.apache.ibatis.binding.BindingException:  Invalid bound statement (not found)”
+
+
+
+

+ 108 - 0
huimv-eartag2-admin/src/main/resources/application-prod2.yml

@@ -0,0 +1,108 @@
+server:
+  port: 8098
+spring:
+  application:
+    name: huimv-eartag2-admin
+
+  datasource:
+    url: jdbc:mysql://10.0.0.77:3309/huimv-demo-eartag20?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+    username: eartag
+    password: eartag@2022
+    driver-class-name: com.mysql.cj.jdbc.Driver
+  jpa:
+    show-sql: false
+    database: mysql
+    hibernate:
+      ddl-auto: update
+    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
+    open-in-view: true
+
+  #配置rabbitMq 服务器
+#  rabbitmq:
+#    host: 10.0.0.4
+#    port: 5672
+#    username: huimv
+#    password: hm123456
+#    #虚拟host 可以不设置,使用server默认host
+#    virtual-host: /
+
+  rabbitmq:
+#    host: 121.36.134.218
+    host: 10.0.0.14
+    port: 5672
+    username: admin
+    password: admin
+    #虚拟host 可以不设置,使用server默认host
+    virtual-host: /
+    listener:
+      simple:
+        acknowledge-mode: none
+
+  #redis
+  redis:
+    database: 0
+    host: 121.36.134.218
+    port: 6379
+    password: hm123456
+    timeout: 5000ms
+    jedis:
+      pool:
+        max-active: 20
+        max-wait: -1
+        max-idle: 10
+        min-idle: 0
+
+  #redis
+#  redis:
+#    database: 0
+#    host: 192.168.1.68
+#    port: 6379
+#    password: hm123456
+#    timeout: 5000ms
+#    jedis:
+#      pool:
+#        max-active: 20
+#        max-wait: -1
+#        max-idle: 10
+#        min-idle: 0
+#    lettuce:
+#      pool:
+#        max-active: 3
+#        min-idle: 2
+#        max-idle: 3
+#        max-wait: 1
+#      shutdown-timeout: 100
+
+#  data:
+#    redis:
+#      repositories:
+#        enabled: false
+
+  #是否缓存空值
+#  cache:
+#    redis:
+#      cache-null-values: false
+    #server:
+#  port: 9110
+#spring:
+#  application:
+#    name: huimv-hy-autoGetData
+#
+#  datasource:
+##    url: jdbc:mysql://47.98.175.112:3306/huimv_ql_farm_haiyan?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+#    #    url: jdbc:mysql://36.22.189.214:3306/huimv_ql_farm?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+#        url: jdbc:mysql://115.238.57.190:3306/huimv_ql_farm?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+#    username: root
+#    password: hm123456
+#    driver-class-name: com.mysql.cj.jdbc.Driver
+#  jpa:
+#    properties:
+#      hibernate:
+#        enable_lazy_load_no_trans: true
+#    show-sql: false
+#    database: mysql
+#    hibernate:
+#      ddl-auto: update
+#    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
+#    open-in-view: true
+

+ 110 - 0
huimv-eartag2-admin/src/main/resources/application-prod3.yml

@@ -0,0 +1,110 @@
+server:
+  port: 8098
+spring:
+  application:
+    name: huimv-eartag2-admin
+
+  datasource:
+    url: jdbc:mysql://rm-bp1lz0c6l2tcmrp21xo.mysql.rds.aliyuncs.com/nhxm_earcon
+    username: root
+    password: NHxm213213
+    driver-class-name: com.mysql.cj.jdbc.Driver
+  jpa:
+    show-sql: false
+    database: mysql
+    hibernate:
+      ddl-auto: update
+    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
+    open-in-view: true
+
+  #配置rabbitMq 服务器
+#  rabbitmq:
+#    host: 10.0.0.4
+#    port: 5672
+#    username: huimv
+#    password: hm123456
+#    #虚拟host 可以不设置,使用server默认host
+#    virtual-host: /
+
+  rabbitmq:
+#    host: 121.36.134.218
+    host: 127.0.0.1
+    port: 5672
+    username: guest
+    password: guest
+    #虚拟host 可以不设置,使用server默认host
+    virtual-host: /
+    listener:
+      simple:
+        acknowledge-mode: none
+
+
+
+  #redis
+  redis:
+    database: 0
+    host: 121.36.134.218
+    port: 6379
+    password: hm123456
+    timeout: 5000ms
+    jedis:
+      pool:
+        max-active: 20
+        max-wait: -1
+        max-idle: 10
+        min-idle: 0
+
+  #redis
+#  redis:
+#    database: 0
+#    host: 192.168.1.68
+#    port: 6379
+#    password: hm123456
+#    timeout: 5000ms
+#    jedis:
+#      pool:
+#        max-active: 20
+#        max-wait: -1
+#        max-idle: 10
+#        min-idle: 0
+#    lettuce:
+#      pool:
+#        max-active: 3
+#        min-idle: 2
+#        max-idle: 3
+#        max-wait: 1
+#      shutdown-timeout: 100
+
+#  data:
+#    redis:
+#      repositories:
+#        enabled: false
+
+  #是否缓存空值
+#  cache:
+#    redis:
+#      cache-null-values: false
+    #server:
+#  port: 9110
+#spring:
+#  application:
+#    name: huimv-hy-autoGetData
+#
+#  datasource:
+##    url: jdbc:mysql://47.98.175.112:3306/huimv_ql_farm_haiyan?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+#    #    url: jdbc:mysql://36.22.189.214:3306/huimv_ql_farm?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+#        url: jdbc:mysql://115.238.57.190:3306/huimv_ql_farm?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+#    username: root
+#    password: hm123456
+#    driver-class-name: com.mysql.cj.jdbc.Driver
+#  jpa:
+#    properties:
+#      hibernate:
+#        enable_lazy_load_no_trans: true
+#    show-sql: false
+#    database: mysql
+#    hibernate:
+#      ddl-auto: update
+#    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
+#    open-in-view: true
+

+ 9 - 0
huimv-eartag2-admin/src/main/resources/application.properties

@@ -0,0 +1,9 @@
+##±¾µØÊý¾Ý¿â
+##spring.profiles.active=dev
+##Ô¶³ÌÊý¾Ý¿â
+#spring.profiles.active=prod
+##spring.profiles.active=prod2
+##spring.profiles.active=prod3
+#
+#device.register.prefix=device_register_
+#redis.expire.eartag_online_set=25

+ 23 - 0
huimv-eartag2-admin/src/main/resources/bootstrap.yml

@@ -0,0 +1,23 @@
+spring:
+  application:
+    name: huimv.eartag2.admin
+  profiles:
+    active: dev
+  cloud:
+    nacos:
+      config:
+        # 配置中心的地址
+        server-addr: 47.98.40.154:8848
+#        server-addr: 127.0.0.1:8848
+        # 配置文件prefix
+        prefix: ${spring.application.name}
+        # 配置文件的格式
+        file-extension: yaml
+        # 配置文件的环境
+        group: DEFAULT_GROUP
+        # 命名空间
+        namespace: public
+        username: nacos
+        password: nacos
+server:
+  port: 8090

+ 9 - 0
huimv-eartag2-admin/src/main/resources/com/huimv/eartag2/admin/mapper/AccountGroupMapper.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.huimv.eartag2.admin.mapper.AccountGroupMapper">
+
+
+    <delete id="removeAccountGroup">
+        DELETE FROM sys_account_group WHERE account_id=#{accountId}
+    </delete>
+</mapper>

+ 11 - 0
huimv-eartag2-admin/src/main/resources/com/huimv/eartag2/admin/mapper/AppEncryptedMapper.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.huimv.eartag2.admin.mapper.AppEncryptedMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.huimv.eartag2.admin.entity.AppEncrypted">
+        <id column="id" property="id" />
+        <result column="app_encrypted" property="appEncrypted" />
+    </resultMap>
+
+</mapper>

+ 10 - 0
huimv-eartag2-admin/src/main/resources/com/huimv/eartag2/admin/mapper/GroupMenuMapper.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.huimv.eartag2.admin.mapper.GroupMenuMapper">
+
+
+
+    <delete id="removeGroupMenu">
+        DELETE FROM sys_group_menu WHERE group_id=#{groupId}
+    </delete>
+</mapper>

+ 24 - 0
huimv-eartag2-admin/src/main/resources/com/huimv/eartag2/admin/mapper/MenuMapper.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.huimv.eartag2.admin.mapper.MenuMapper">
+
+
+    <select id="getMyMenu" resultType="com.huimv.eartag2.admin.entity.Menu">
+        SELECT * FROM sys_menu
+        WHERE id IN
+        (SELECT DISTINCT(menu_id) FROM sys_group_menu WHERE group_id IN
+        (SELECT group_id FROM sys_account_group WHERE
+        account_id=#{accountName} ))
+        ORDER BY sort ASC
+    </select>
+
+
+    <select id="getMyButton" resultType="string">
+        SELECT permission FROM sys_menu
+        WHERE id IN
+        (SELECT DISTINCT(menu_id) FROM sys_group_menu WHERE group_id IN
+        (SELECT group_id FROM sys_account_group WHERE
+        account_id=#{userId})) and weight =2
+        ORDER BY sort ASC
+    </select>
+</mapper>

+ 20 - 0
huimv-eartag2-admin/src/main/resources/com/huimv/eartag2/admin/mapper/UserMapper.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.huimv.eartag2.admin.mapper.UserMapper">
+    <select id="findUserAndAccountByUserName" resultType="com.huimv.eartag2.admin.entity.dto.UserAccountDto">
+        SELECT user.*,account.account_name,account.account_status
+        FROM sys_user user LEFT
+        JOIN sys_account account ON user.user_id=account.user_id
+        WHERE user.user_name=#{searchStr}  OR user.mobile=#{searchStr} order by id desc limit #{start},#{pageSize}
+
+    </select>
+    <select id="findUserAndAccount" resultType="com.huimv.eartag2.admin.entity.dto.UserAccountDto">
+        SELECT
+        user.*,account.account_name,account.account_status
+        FROM sys_user user
+        LEFT JOIN sys_account account
+         ON user.user_id=account.user_id order by id desc limit #{start},#{pageSize}
+    </select>
+
+
+</mapper>

+ 17 - 0
huimv-eartag2-admin/src/main/resources/mapper/Sheet1Mapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.huimv.eartag2.admin.mapper.Sheet1Mapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.huimv.eartag2.admin.entity.Sheet1">
+        <result column="name_prov" property="nameProv" />
+        <result column="code_prov" property="codeProv" />
+        <result column="name_city" property="nameCity" />
+        <result column="code_city" property="codeCity" />
+        <result column="name_coun" property="nameCoun" />
+        <result column="code_coun" property="codeCoun" />
+        <result column="name_town" property="nameTown" />
+        <result column="code_town" property="codeTown" />
+    </resultMap>
+
+</mapper>

+ 166 - 0
huimv-eartag2-api/pom.xml

@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>huimv-eartag-new</artifactId>
+        <groupId>com.huimv</groupId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>huimv-eartag2-api</artifactId>
+    <dependencies>
+        <!-- eartag2-common -->
+        <dependency>
+            <groupId>com.huimv</groupId>
+            <artifactId>huimv-eartag2-common</artifactId>
+            <version>0.0.2-SNAPSHOT</version>
+        </dependency>
+
+
+
+        <!-- 排除Tomcat容器 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <!-- 移除掉默认支持的 Tomcat -->
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-tomcat</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!-- 添加 Undertow 容器 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-undertow</artifactId>
+        </dependency>
+        <!--Mybatis-Plus生成器依赖-->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId>
+            <!--            <version>3.3.1.tmp</version>-->
+            <version>3.3.2</version>
+        </dependency>
+        <!--freemarker 模板引擎(没有用原生的模板引擎)-->
+        <dependency>
+            <groupId>org.freemarker</groupId>
+            <artifactId>freemarker</artifactId>
+            <version>2.3.31</version>
+        </dependency>
+        <!--mybits-plus-->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <!--            <version>3.4.2</version>-->
+            <version>3.4.3.4</version>
+        </dependency>
+        <!-- mybatis-plus-extension -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-extension</artifactId>
+            <version>3.5.2</version>
+        </dependency>
+        <!-- 连接池 -->
+        <dependency>
+            <!--自动配置-->
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>1.1.14</version>
+        </dependency>
+        <!-- velocity -->
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity-engine-core</artifactId>
+            <version>2.0</version>
+        </dependency>
+        <!-- freemarker -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-freemarker</artifactId>
+        </dependency>
+        <!-- junit -->
+        <dependency>
+            <groupId>org.junit.platform</groupId>
+            <artifactId>junit-platform-commons</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.5</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <!--  -->
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+            <!--  -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <version>2.6</version>
+            </plugin>
+
+
+            <!--  代码混淆proguard maven插件  -->
+            <plugin>
+                <groupId>com.github.wvengen</groupId>
+                <artifactId>proguard-maven-plugin</artifactId>
+                <version>2.6.0</version>
+                <executions>
+                    <!--   package时执行proguard   -->
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>proguard</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <putLibraryJarsInTempDir>true</putLibraryJarsInTempDir>
+                    <!--  输入的jar包  -->
+                    <injar>${project.build.finalName}.jar</injar>
+                    <!--  输出的jar包  -->
+                    <outjar>${project.build.finalName}.jar</outjar>
+                    <!--  是否进行混淆,默认为true  -->
+                    <obfuscate>true</obfuscate>
+                    <!--  配置文件,通常为proguard.cfg,主要对options选项进行配置,所有的options选项都可以进行配置  -->
+                    <proguardInclude>../huimv-eartag2-eartag/proguard.cfg</proguardInclude>
+                    <!--  额外的jar,项目编译所需的jar  -->
+                    <libs>
+                        <lib>${java.home}/lib/rt.jar</lib>
+                        <!--<lib>${java.home}/lib/jce.jar</lib>-->
+                        <lib>${java.home}/lib/jsse.jar</lib>
+                    </libs>
+                    <!--  对输入jar进行过滤,如对META-INFO文件不处理  -->
+                    <inLibsFilter>!META-INF/**,!META-INF/versions/**</inLibsFilter>
+                    <!--  输出路径配置,必须包含injar标签中填写的jar  -->
+                    <outputDirectory>${project.build.directory}</outputDirectory>
+                    <!--  上面使用了conf配置文件,options无需配置  -->
+                    <!--<options></options>-->
+                </configuration>
+            </plugin>
+        </plugins>
+        <resources>
+            <resource>
+                <directory>src/main/java</directory>
+                <includes>
+                    <include>**/*.xml</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+            </resource>
+        </resources>
+    </build>
+</project>

+ 43 - 0
huimv-eartag2-api/proguard.cfg

@@ -0,0 +1,43 @@
+## 指定 java 版本
+-target 1.8
+# 关闭对代码进行优化压缩,开启会删除从未使用的类或者类成员变量等
+-dontshrink
+# 列出未使用的代码,可打印到标准输出或写入指定文件
+#-printusage
+# 关闭字节码级别的优化,如果不开启则设置如下配置,默认开启。
+-dontoptimize
+# 关闭预检,预检主要针对JavaME,Java6以后都不用预检
+-dontpreverify
+# 不生成大小写混写的类名
+-dontusemixedcaseclassnames
+# 对类成员的命名混淆采取唯一策略
+-useuniqueclassmembernames
+# 混淆类名之后,对使用Class.forName('className')之类的地方进行相应替代
+-adaptclassstrings
+#对异常、注解信息予以保留
+-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
+# 此选项将保存接口中的所有原始名称(不混淆)-->
+-keepnames interface ** { *; }
+# 此选项将保存所有软件包中的所有原始接口文件(不进行混淆)
+#-keep interface * extends * { *; }
+#保留参数名,因为控制器,或者Mybatis等接口的参数如果混淆会导致无法接受参数,xml文件找不到参数
+-keepparameternames
+# 保留枚举成员及方法
+-keepclassmembers enum * { *; }
+# 不混淆所有类,保存原始定义的注释-
+-keepclassmembers class * {
+    @org.springframework.context.annotation.Bean *;
+    @org.springframework.beans.factory.annotation.Autowired *;
+    @org.springframework.beans.factory.annotation.Value *;
+    @org.springframework.stereotype.Service *;
+    @org.springframework.stereotype.Component *;
+}
+
+#忽略warn消息
+-ignorewarnings
+#忽略note消息
+#-dontnote
+#打印配置信息
+#-printconfiguration
+# 排除混淆 指定的类名且类中的方法也不混淆
+-keep class com.huimv.eartag2.api.HuimvApiApplication{<methods>;}

+ 37 - 0
huimv-eartag2-api/src/main/java/com/huimv/eartag2/api/HuimvApiApplication.java

@@ -0,0 +1,37 @@
+package com.huimv.eartag2.api;
+
+import com.huimv.eartag2.api.netty.EartagServer;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.biosafety.uface.controller
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create : 2020-12-25
+ **/
+@SpringBootApplication
+@EnableScheduling
+@MapperScan("com.huimv.eartag2.api.mapper")
+@EntityScan(value = "com.huimv.eartag2.common.dao.entity")
+@EnableJpaRepositories(basePackages = "com.huimv.eartag2.common.dao.repo")
+//@Import(InterceptorConfig.class)
+public class HuimvApiApplication {
+    public static void main(String[] args) throws InterruptedException {
+        ApplicationContext applicationContext =SpringApplication.run(HuimvApiApplication.class, args);
+        applicationContext.getBean(EartagServer.class).run();
+    }
+    @Bean
+    public static RestTemplate getRestTemplate(){
+        return new RestTemplate();
+    }
+}

+ 87 - 0
huimv-eartag2-api/src/main/java/com/huimv/eartag2/api/config/DbJob.java

@@ -0,0 +1,87 @@
+package com.huimv.eartag2.api.config;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.env.Environment;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+import java.io.IOException;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * 数据库定时备份任务
+ * 在backup文件夹中备份最近七日的数据库文件, 备份文件夹 与当前程序同一目录
+ */
+@Component
+@Slf4j
+public class DbJob {
+
+    private final Environment environment;
+
+    public DbJob(Environment environment) {
+        this.environment = environment;
+    }
+
+    /**
+     * 定时时间是每天凌晨5点。
+     */
+    @Scheduled(cron = "0 0 5 * * ?")
+    public void backup() throws IOException {
+        LocalDateTime now = LocalDateTime.now();
+        
+        log.info("*******************时间:【{}】, 系统开启定时任务数据库备份*******************", now);
+        
+		// 数据库配置信息
+        String user = environment.getProperty("spring.datasource.druid.username");
+
+        String password = environment.getProperty("spring.datasource.druid.password");
+
+        String url = environment.getProperty("spring.datasource.druid.url");
+
+        // 第三个 :号下标
+        int subStrIndex = url.indexOf(":", url.indexOf(":", url.indexOf(":") + 1) + 1);
+
+        // IP
+        String host = url.substring(url.indexOf("//") + 2, subStrIndex);
+
+        // 端口
+        String subStr2 = url.substring(subStrIndex);
+        String port = subStr2.substring(1, subStr2.indexOf("/"));
+
+        // 数据库名
+        String dataBaseName = subStr2.substring(subStr2.indexOf("/") + 1, subStr2.indexOf("?"));
+
+        // 环境
+        String os = System.getProperties().getProperty("os.name");
+
+        log.info("备份环境信息:【{}】, 用户名:【{}】,密码:【{}】, 地址:【{}】, 端口:【{}】,数据库:【{}】", os, url, password, host, port, dataBaseName);
+
+
+        LocalDate localDate = LocalDate.now();
+
+        String fileName = localDate + ".sql";
+
+        File file = new File("backup", fileName);
+
+        file.getParentFile().mkdirs();
+
+        file.createNewFile();
+
+        // 备份今天数据库
+        DbUtil.backup("10.0.0.77", "3309", user, password, dataBaseName, file);
+        //备份->对历史数据进行冷处理,减轻数据库压力
+        DbUtil.load(file,user,password,dataBaseName);
+        // 删除七天前数据库备份文件 LocalDate
+        LocalDate before = localDate.minusDays(7);
+        String fileBeforeName = before + ".sql";
+        File fileBefore = new File("backup", fileBeforeName);
+        if (fileBefore.exists()) {
+            fileBefore.delete();
+        }
+        log.info("*******************时间:【{}】, 系统结束定时任务数据库备份*******************", now);
+    }
+
+}
+

+ 146 - 0
huimv-eartag2-api/src/main/java/com/huimv/eartag2/api/config/DbUtil.java

@@ -0,0 +1,146 @@
+package com.huimv.eartag2.api.config;
+
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+
+
+public class DbUtil {
+    /**
+     * 导出sql文件
+     *
+     * @param host     ip地址
+     * @param port     端口
+     * @param userName 用户名
+     * @param password 密码
+     * @param dbName   数据库名
+     * @param file     文件对象
+     */
+    public static void backup(String host, String port, String userName, String password, String dbName, File file) {
+
+        String cmd = "mysqldump --single-transaction" + " -h" + host + " -P" + port + " -u" + userName + " -p" + password + " " + dbName + " > " + file.getPath();
+        String os = System.getProperties().getProperty("os.name");
+        if(os.contains("Windows")){
+            // Windows 需要加上 cmd /c
+            cmd = "cmd /c " + cmd;
+        }
+        System.out.printf("cmd命令为:%s%n", cmd);
+        try {
+            Process process = Runtime.getRuntime().exec(cmd);
+
+            if (process.waitFor() == 0) {
+                System.out.printf(" 数据库:%s 备份成功!%n", dbName);
+            } else {
+                System.out.printf(" 数据库:%s 备份失败!%n", dbName);
+            }
+        } catch (IOException | InterruptedException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 导入sql文件
+     *
+     * @param host         ip地址
+     * @param port         端口
+     * @param userName     用户名
+     * @param password     密码
+     * @param databaseName 数据库名
+     * @param file         文件对象
+     */
+    public static void reduction(String host, String port, String userName, String password, String databaseName, File file) throws Exception {
+        if (!file.exists()) {
+            System.out.printf("文件:%s 不存在,请检查%n", file.getPath());
+            return;
+        }
+        String filePath = file.getPath();
+        String cmd = "mysql -h" + host + " -P" + port + " -u" + userName + " -p" + password + " " + databaseName + " < " + filePath;
+        System.out.println("系统环境:" + System.getProperties().getProperty("os.name"));
+        String os = System.getProperties().getProperty("os.name");
+        if(os.contains("Windows")){
+            // Windows 需要加上 cmd /c
+            cmd = "cmd /c " + cmd;
+        }
+        System.out.printf("数据库还原命令:%s%n", cmd);
+
+
+        //拼接cmd命令
+        Process exec = Runtime.getRuntime().exec(cmd);
+        if (exec.waitFor() == 0) {
+            System.out.printf("数据库:%s 还原成功,还原的文件为:%s%n", databaseName, filePath);
+        } else {
+            System.out.println(databaseName + "数据库还原失败");
+            System.out.printf("数据库:%s 还原失败", databaseName);
+        }
+    }
+
+
+
+    /**
+     * 导入sql文件
+     *
+     * @param file     文件对象
+     * @param user     用户
+     * @param password 密码
+     * @param db       数据库
+     */
+    public static void load(File file, String user, String password, String db) {
+
+        //拼接cmd命令
+        try {
+            Runtime rt = Runtime.getRuntime();
+            String command = "mysql -u" + user + " -p" + password + " --default-character-set=utf8 " + db;
+            Process child = rt.exec(command);
+            OutputStream outputStream = child.getOutputStream();
+            BufferedReader bufferedReader = new BufferedReader(
+                    new InputStreamReader(Files.newInputStream(file.toPath()), StandardCharsets.UTF_8));
+            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8);
+            String str;
+            while ((str = bufferedReader.readLine()) != null) {
+                outputStreamWriter.write(str + "\r\n");
+            }
+            outputStreamWriter.flush();
+            outputStream.close();
+            bufferedReader.close();
+            outputStreamWriter.close();
+            System.out.println("数据库导入完成");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+/*
+    public static void main(String[] args) throws Exception {
+        File file = new File("C:\\Users\\hansonh\\Desktop\\jar", "backup.sql");
+
+
+        System.out.println("系统环境:" + System.getProperties().getProperty("os.name"));
+
+        String subStr = "jdbc:mysql://127.0.0.1:3306/pms?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&verifyServerCertificate=false&useSSL=false&rewriteBatchedStatements=true&zeroDateTimeBehavior=convertToNull";
+
+
+        // 第三个 :号下标
+        int subStrIndex = subStr.indexOf(":", subStr.indexOf(":", subStr.indexOf(":") + 1) + 1);
+        // IP
+        String host = subStr.substring(subStr.indexOf("//") + 2, subStrIndex);
+        System.out.println("IP:" + host);
+
+        // 端口
+        String subStr2 = subStr.substring(subStrIndex);
+        String port = subStr2.substring(1, subStr2.indexOf("/"));
+        System.out.println("端口:" + port);
+
+        // 数据库名
+        String dataBaseName = subStr2.substring(subStr2.indexOf("/") + 1, subStr2.indexOf("?"));
+
+        System.out.println("数据库名:" + dataBaseName);
+
+        // 备份数据库
+        DbUtil.backup( "127.0.0.1","3306", "dev1", "dev1", "pms", file);
+        // 恢复数据库
+//        DbUtil.reduction( "127.0.0.1","3306", "root", "123456", "pms", file);
+    }
+
+ */
+}

+ 44 - 0
huimv-eartag2-api/src/main/java/com/huimv/eartag2/api/config/MybatisPlusConfig.java

@@ -0,0 +1,44 @@
+package com.huimv.eartag2.api.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @Project : huimv.shiwan
+ * @Package : com.huimv.biosafety.uface.controller
+ * @Description : TODO
+ * @Version : 1.0
+ * @Author : ZhuoNing
+ * @Create : 2020-12-25
+ **/
+@Configuration
+public class MybatisPlusConfig {
+    /**
+     * 注册插件
+     */
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        // 添加分页插件
+        PaginationInnerInterceptor pageInterceptor = new PaginationInnerInterceptor();
+        // 设置请求的页面大于最大页后操作,true调回到首页,false继续请求。默认false
+        pageInterceptor.setOverflow(false);
+        // 单页分页条数限制,默认无限制
+        pageInterceptor.setMaxLimit(500L);
+        // 设置数据库类型
+        pageInterceptor.setDbType(DbType.MYSQL);
+
+        interceptor.addInnerInterceptor(pageInterceptor);
+        return interceptor;
+
+//        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+//        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
+//        return interceptor;
+
+
+    }
+}

+ 61 - 0
huimv-eartag2-api/src/main/java/com/huimv/eartag2/api/config/WebSocket.java

@@ -0,0 +1,61 @@
+package com.huimv.eartag2.api.config;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.websocket.OnClose;
+import javax.websocket.OnMessage;
+import javax.websocket.OnOpen;
+import javax.websocket.Session;
+import javax.websocket.server.ServerEndpoint;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+//注册成组件
+@Component
+//定义websocket服务器端,它的功能主要是将目前的类定义成一个websocket服务器端。注解的值将被用于监听用户连接的终端访问URL地址
+@ServerEndpoint("/websocket")
+//如果不想每次都写private  final Logger logger = LoggerFactory.getLogger(当前类名.class); 可以用注解@Slf4j;可以直接调用log.info
+@Slf4j
+public class WebSocket {
+ 
+    //实例一个session,这个session是websocket的session
+    private Session session;
+ 
+    //存放websocket的集合(本次demo不会用到,聊天室的demo会用到)
+    private static CopyOnWriteArraySet<WebSocket> webSocketSet = new CopyOnWriteArraySet<>();
+ 
+    //前端请求时一个websocket时
+    @OnOpen
+    public void onOpen(Session session) {
+        this.session = session;
+        webSocketSet.add(this);
+        log.info("【websocket消息】有新的连接, 总数:{}", webSocketSet.size());
+    }
+ 
+    //前端关闭时一个websocket时
+    @OnClose
+    public void onClose() {
+        webSocketSet.remove(this);
+        log.info("【websocket消息】连接断开, 总数:{}", webSocketSet.size());
+    }
+ 
+    //前端向后端发送消息
+    @OnMessage
+    public void onMessage(String message) {
+        log.info("【websocket消息】收到客户端发来的消息:{}", message);
+    }
+
+    //新增一个方法用于主动向客户端发送消息
+    public static void sendMessage(String message) {
+        for (WebSocket webSocket: webSocketSet) {
+            log.info("【websocket消息】广播消息, message={}", message);
+            try {
+                webSocket.session.getBasicRemote().sendText(message);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+
+}

+ 19 - 0
huimv-eartag2-api/src/main/java/com/huimv/eartag2/api/config/WebSocketConfig.java

@@ -0,0 +1,19 @@
+package com.huimv.eartag2.api.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+/**
+ * websocket
+ * 的配置信息
+ */
+@Configuration
+public class WebSocketConfig {
+
+    @Bean
+    public ServerEndpointExporter serverEndpointExporter() {
+
+        return new ServerEndpointExporter();
+    }
+}

+ 66 - 0
huimv-eartag2-api/src/main/java/com/huimv/eartag2/api/controller/BaseFarmController.java

@@ -0,0 +1,66 @@
+package com.huimv.eartag2.api.controller;
+
+
+import com.huimv.eartag2.api.service.BaseFarmService;
+import com.huimv.eartag2.common.utils.Result;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * <p>
+ *      牧场基础配置
+ * </p>
+ *
+ * @author zn
+ * @since 2022-07-27
+ */
+@RestController
+@RequestMapping("/base-farm")
+public class BaseFarmController {
+    @Resource
+    private BaseFarmService baseFarmService;
+
+    /**
+     * @description: 【增加】
+     * @author: 静静
+     * @param: maps
+     **/
+    @PostMapping("/add")
+    public Result addConfig(@RequestBody Map<String, String> maps){
+        return baseFarmService.add(maps);
+    }
+
+    /**
+     * @description: 【删除】
+     * @author: 静静
+     * @param: ids
+     **/
+    @PostMapping("/remove")
+    public Result removeConfig(@RequestBody String ids){
+        return baseFarmService.remove(ids);
+    }
+
+    /**
+     * @description: 【修改】
+     * @author: 静静
+     * @param: maps
+     **/
+    @PostMapping("/update")
+    public Result updateConfig(@RequestBody  Map<String, String> maps){
+        return baseFarmService.update(maps);
+    }
+    /**
+     * @description: 【查询】 分页查询配置表
+     * @author: 静静
+     * @param: paramsMap
+     **/
+    @PostMapping("/list")
+    public Result list(@RequestBody Map<String,String> paramsMap){
+        return baseFarmService.list(paramsMap);
+    }
+
+
+}
+

+ 67 - 0
huimv-eartag2-api/src/main/java/com/huimv/eartag2/api/controller/BaseFarmerController.java

@@ -0,0 +1,67 @@
+package com.huimv.eartag2.api.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.huimv.eartag2.api.service.BaseFarmerService;
+import com.huimv.eartag2.common.utils.Result;
+import com.huimv.eartag2.common.utils.ResultCode;
+import com.huimv.eartag2.api.pojo.BaseFarmer;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import java.text.ParseException;
+import java.util.Map;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author zn
+ * @since 2022-08-30
+ */
+@RestController
+@RequestMapping("/farmer")
+public class BaseFarmerController {
+
+    @Autowired
+    private BaseFarmerService baseFarmerService;
+    
+    @PostMapping("/add")
+    public Result add(@RequestBody Map<String, Object> paramsMap) throws ParseException {
+        return baseFarmerService.add(paramsMap);
+    }
+
+    @PostMapping("/edit")
+    public Result edit(@RequestBody Map<String, Object> paramsMap) throws ParseException {
+        return baseFarmerService.edit(paramsMap);
+    }
+
+    @PostMapping("/remove")
+    public Result remove(@RequestBody Map<String, Object> paramsMap) throws ParseException {
+        return baseFarmerService.remove(paramsMap);
+    }
+
+    @PostMapping("/list")
+    public Result listByFarmCode(@RequestBody Map<String, Object> paramsMap) throws ParseException {
+        return baseFarmerService.list(paramsMap);
+    }
+    @PostMapping("/listAll")
+    public Result listAll(@RequestBody Map<String, String> paramsMap) {
+        String farmCode = paramsMap.get("farmId");
+
+        return new Result(ResultCode.SUCCESS, baseFarmerService.list(new QueryWrapper<BaseFarmer>().eq(StringUtils.isNotBlank(farmCode),"farm_code",farmCode)));
+    }
+
+
+//    @PostMapping("/getLastAdoptByFarmCode")
+//    public Result getLastAdoptByFarmCode(@RequestBody Map<String, Object> paramsMap) throws ParseException {
+//        return baseFarmerService.getLastAdoptByFarmCode(paramsMap);
+//    }
+}
+

+ 158 - 0
huimv-eartag2-api/src/main/java/com/huimv/eartag2/api/controller/BasePigpenController.java

@@ -0,0 +1,158 @@
+package com.huimv.eartag2.api.controller;
+
+
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.huimv.eartag2.api.service.BasePigpenService;
+import com.huimv.eartag2.common.utils.Result;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author zn
+ * @since 2022-07-22
+ */
+@RestController
+@RequestMapping("/base-pigpen")
+public class BasePigpenController {
+    @Autowired
+    private BasePigpenService basePigpenService;
+
+    @RequestMapping(value = "/list",method = RequestMethod.POST)
+    public Result list(@RequestBody Map<String, Object> paramsMap) {
+        System.out.println("paramsMap>>"+paramsMap.toString());
+        String farmCode = "";
+        if (paramsMap.get("farmId") != null) {
+            farmCode = paramsMap.get("farmId")+"";
+        }
+        String stageCode = "";
+        if (paramsMap.get("stageCode") != null) {
+            stageCode = paramsMap.get("stageCode")+"";
+        }
+        String pigpenName = "";
+        if (paramsMap.get("pigpenName") != null) {
+            pigpenName = paramsMap.get("pigpenName")+"";
+        }
+        return basePigpenService.list(farmCode,pigpenName,stageCode);
+    }
+
+
+
+    // 添加栋舍
+    /**
+     * @Method      : addBuilding
+     * @Description :  farmCode,buildingName,buildingCode,sort --以上必填
+     * @Params      : [paramsMap]
+     * @Return      : com.huimv.eartag2.common.utils.Result
+     *
+     * @Author      : ZhuoNing
+     * @Date        : 2022/7/23
+     * @Time        : 15:16
+     */
+    @RequestMapping(value = "/addBuilding",method = RequestMethod.POST)
+    public Result addBuilding(@RequestBody Map<String, Object> paramsMap){
+        // 牧场名称
+        String farmCode = paramsMap.get("farmId")+"";
+        // 栋名称
+        String buildingName = paramsMap.get("buildingName")+"";
+
+        // 栋编码
+//        String buildingCode = paramsMap.get("buildingCode")+"";
+        String buildingCode = System.currentTimeMillis()+"" ;
+        // 阶段
+        String stageCode = paramsMap.get("stageCode")+"";
+        // 排序
+        String sort = paramsMap.get("sort")+"";
+        if(StringUtils.isBlank(sort)){
+            sort = "1";
+        }
+        // 类型
+        Integer type = 1;
+        //
+        return basePigpenService.addBuilding(farmCode,buildingName,buildingCode,stageCode,Integer.parseInt(sort),type);
+    }
+
+    @RequestMapping(value = "/editBuilding",method = RequestMethod.POST)
+    public Result editBuilding(@RequestBody Map<String, Object> paramsMap){
+        // id
+        String id = paramsMap.get("id")+"";
+        // 栋名称
+        String buildingName = paramsMap.get("buildingName")+"";
+        // 栋编码
+//        String buildingCode = paramsMap.get("buildingCode")+"";
+        // 阶段
+        String stageCode = paramsMap.get("stageCode")+"";
+        // 排序
+        String sort = paramsMap.get("sort")+"";
+        if(StringUtils.isBlank(sort)){
+            sort = "1";
+        }
+        // 类型
+        Integer type = 1;
+        //
+        return basePigpenService.editBuilding(id,buildingName,stageCode,Integer.parseInt(sort),type);
+    }
+
+    // 删除栋舍
+    @RequestMapping(value = "/remove",method = RequestMethod.POST)
+    public Result remove(@RequestBody String ids){
+        //
+        return basePigpenService.remove(ids);
+    }
+
+    // 添加单元
+    @RequestMapping(value = "/addUnit",method = RequestMethod.POST)
+    public Result addUnit(@RequestBody Map<String, Object> paramsMap){
+        // 牧场名称
+        String farmCode = paramsMap.get("farmId")+"";
+        // 栋
+        String parentId = paramsMap.get("parentId")+"";
+        // 单元
+//        String unitCode = paramsMap.get("unitCode")+"";
+        String unitCode = System.currentTimeMillis()+"" ;
+        // 单元
+        String unitName = paramsMap.get("unitName")+"";
+        // 阶段
+        String stageCode = paramsMap.get("stageCode")+"";
+        // 排序
+        String sort = paramsMap.get("sort")+"";
+        if(StringUtils.isBlank(sort)){
+            sort = "1";
+        }
+        // 类型
+        Integer type = 2;
+        //
+        return basePigpenService.addUnit(farmCode,parentId,unitName,unitCode,stageCode,Integer.parseInt(sort),type);
+    }
+
+    @RequestMapping(value = "/editUnit",method = RequestMethod.POST)
+    public Result editUnit(@RequestBody Map<String, Object> paramsMap){
+        // id
+        String id = paramsMap.get("id")+"";
+        // 栋
+        String parentId = paramsMap.get("parentId")+"";
+        // 单元
+//        String unitCode = paramsMap.get("unitCode")+"";
+        // 单元
+        String unitName = paramsMap.get("unitName")+"";
+        // 阶段
+        String stageCode = paramsMap.get("stageCode")+"";
+        // 排序
+        String sort = paramsMap.get("sort")+"";
+        if(StringUtils.isBlank(sort)){
+            sort = "1";
+        }
+        // 类型
+        Integer type = 2;
+        //
+        return basePigpenService.editUnit(id,parentId,unitName,stageCode,Integer.parseInt(sort),type);
+    }
+
+
+}
+

+ 21 - 0
huimv-eartag2-api/src/main/java/com/huimv/eartag2/api/controller/BaseStageController.java

@@ -0,0 +1,21 @@
+package com.huimv.eartag2.api.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author zn
+ * @since 2022-07-22
+ */
+@RestController
+@RequestMapping("/base-stage")
+public class BaseStageController {
+
+}
+

+ 0 - 0
huimv-eartag2-api/src/main/java/com/huimv/eartag2/api/controller/BizBaseStageController.java


Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels