Selaa lähdekoodia

更换了api 工具
权限时返回全部给前端,用authority判断是否有使用权限

wuweihao 5 vuotta sitten
vanhempi
commit
122a678004
35 muutettua tiedostoa jossa 713 lisäystä ja 256 poistoa
  1. 5 0
      README.md
  2. 17 10
      pom.xml
  3. 13 0
      xiaoan-application/pom.xml
  4. 2 1
      xiaoan-application/src/main/java/com/xiaoan/XiaoanApplication.java
  5. 1 1
      xiaoan-application/src/main/resources/application.properties
  6. 39 25
      xiaoan-common/pom.xml
  7. 2 2
      xiaoan-common/src/main/java/com/xiaoan/common/config/Swagger2.java
  8. 0 1
      xiaoan-common/src/main/java/com/xiaoan/common/config/WebMvcConfig.java
  9. 3 0
      xiaoan-common/src/main/java/com/xiaoan/common/constant/MsgCode.java
  10. 38 0
      xiaoan-common/src/main/java/com/xiaoan/common/util/RegexpUtils.java
  11. 13 2
      xiaoan-dao/src/main/java/com/xiaoan/dao/backend/ResourceRepository.java
  12. 2 2
      xiaoan-dao/src/main/java/com/xiaoan/dao/backend/RoleRepository.java
  13. 2 19
      xiaoan-dao/src/main/java/com/xiaoan/dao/backend/provider/SceneProvider.java
  14. 3 0
      xiaoan-domain/src/main/java/com/xiaoan/domain/backend/ResourceEntity.java
  15. 1 1
      xiaoan-domain/src/main/java/com/xiaoan/domain/backend/UserEntity.java
  16. 6 3
      xiaoan-domain/src/main/java/com/xiaoan/domain/dto/request/UserRequest.java
  17. 2 3
      xiaoan-domain/src/main/java/com/xiaoan/domain/dto/response/IssueResponse.java
  18. 3 7
      xiaoan-domain/src/main/java/com/xiaoan/domain/dto/response/LogResponse.java
  19. 2 6
      xiaoan-domain/src/main/java/com/xiaoan/domain/dto/response/ResourceResponse.java
  20. 2 4
      xiaoan-domain/src/main/java/com/xiaoan/domain/dto/response/SceneResponse.java
  21. 2 6
      xiaoan-domain/src/main/java/com/xiaoan/domain/dto/response/UserResponse.java
  22. 5 1
      xiaoan-service/src/main/java/com/xiaoan/service/backend/ResourceService.java
  23. 1 1
      xiaoan-service/src/main/java/com/xiaoan/service/backend/RoleService.java
  24. 23 0
      xiaoan-service/src/main/java/com/xiaoan/service/backend/dto/ResourcePermissions.java
  25. 6 105
      xiaoan-service/src/main/java/com/xiaoan/service/backend/dto/ResourceTree.java
  26. 56 1
      xiaoan-service/src/main/java/com/xiaoan/service/backend/impl/ResourceServiceImpl.java
  27. 2 2
      xiaoan-service/src/main/java/com/xiaoan/service/backend/impl/RoleServiceImpl.java
  28. 1 9
      xiaoan-service/src/main/java/com/xiaoan/service/backend/impl/SceneServiceImpl.java
  29. 120 0
      xiaoan-service/src/main/java/com/xiaoan/service/backend/util/ResourcePermissionTreeUtil.java
  30. 2 0
      xiaoan-service/src/main/java/com/xiaoan/service/backend/util/ResourceTreeUtil.java
  31. 77 4
      xiaoan-web/src/main/java/com/xiaoan/web/backend/IndexController.java
  32. 0 31
      xiaoan-web/src/main/java/com/xiaoan/web/backend/SceneController.java
  33. 17 5
      xiaoan-web/src/main/java/com/xiaoan/web/backend/TestController.java
  34. 20 4
      xiaoan-web/src/main/java/com/xiaoan/web/backend/UserController.java
  35. 225 0
      xiaoan-web/src/main/java/com/xiaoan/web/shiro/JwtUtil2.java

+ 5 - 0
README.md

@@ -13,5 +13,10 @@
     角色-资源直接在数据库配好
     直接在数据库,把角色跟资源配置好就可以了
     添加用户时,直接授权角色就可以
+    
+    
+## 本地tomcat访问路径
+消安前端
+http://localhost:8085/xiaoan-web/#/login
 
 

+ 17 - 10
pom.xml

@@ -152,16 +152,23 @@
                 <version>${lang3.version}</version>
             </dependency>
 
-            <!--swagger2核心包和swagger-ui界面包-->
-            <dependency>
-                <groupId>io.springfox</groupId>
-                <artifactId>springfox-swagger2</artifactId>
-                <version>${swagger2.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>io.springfox</groupId>
-                <artifactId>springfox-swagger-ui</artifactId>
-                <version>${swagger2.version}</version>
+            <!--&lt;!&ndash;swagger2核心包和swagger-ui界面包&ndash;&gt;-->
+            <!--<dependency>-->
+                <!--<groupId>io.springfox</groupId>-->
+                <!--<artifactId>springfox-swagger2</artifactId>-->
+                <!--<version>${swagger2.version}</version>-->
+            <!--</dependency>-->
+            <!--<dependency>-->
+                <!--<groupId>io.springfox</groupId>-->
+                <!--<artifactId>springfox-swagger-ui</artifactId>-->
+                <!--<version>${swagger2.version}</version>-->
+            <!--</dependency>-->
+
+            <!-- knife4j aip 包-->
+            <dependency>
+                <groupId>com.github.xiaoymin</groupId>
+                <artifactId>knife4j-spring-boot-starter</artifactId>
+                <version>2.0.2</version>
             </dependency>
 
             <!-- shiro -->

+ 13 - 0
xiaoan-application/pom.xml

@@ -39,8 +39,21 @@
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <!-- 指定该Main Class为全局的唯一入口 -->
+                    <mainClass>com.xiaoan.XiaoanApplication</mainClass>
+                    <fork>true</fork>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal><!--可以把依赖的包都打包到生成的Jar包中-->
+                        </goals>
+                    </execution>
+                </executions>
             </plugin>
         </plugins>
+        <finalName>xiaoan</finalName>
     </build>
 
 </project>

+ 2 - 1
xiaoan-application/src/main/java/com/xiaoan/XiaoanApplication.java

@@ -2,9 +2,10 @@ package com.xiaoan;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
 
 @SpringBootApplication
-public class XiaoanApplication {
+public class XiaoanApplication extends SpringBootServletInitializer {
 
     public static void main(String[] args) {
         SpringApplication.run(XiaoanApplication.class, args);

+ 1 - 1
xiaoan-application/src/main/resources/application.properties

@@ -15,7 +15,7 @@ pagehelper.reasonable=false
 pagehelper.support-methods-arguments=true
 
 #log
-#logging.path=G:/javaProject/xiaoan-master/xiaoan/log
+logging.path=E:/javaProject/log/xiaoan
 logging.config=classpath:logback-spring.xml
 logging.level.com.xiaoan=debug
 

+ 39 - 25
xiaoan-common/pom.xml

@@ -16,27 +16,40 @@
 
     <dependencies>
         <!--spring boot -->
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot</artifactId>
-            <version>2.0.6.RELEASE</version>
-        </dependency>
+        <!--<dependency>-->
+            <!--<groupId>org.springframework.boot</groupId>-->
+            <!--<artifactId>spring-boot</artifactId>-->
+            <!--<version>2.0.6.RELEASE</version>-->
+        <!--</dependency>-->
+        <!--<dependency>-->
+            <!--<groupId>org.springframework.boot</groupId>-->
+            <!--<artifactId>spring-boot-starter-web</artifactId>-->
+        <!--</dependency>-->
+        <!--<dependency>-->
+            <!--<groupId>org.springframework.boot</groupId>-->
+            <!--<artifactId>spring-boot-starter-jdbc</artifactId>-->
+            <!--<version>2.0.6.RELEASE</version>-->
+        <!--</dependency>-->
+
+        <!-- JPA -->
+        <!--<dependency>-->
+            <!--<groupId>org.springframework.boot</groupId>-->
+            <!--<artifactId>spring-boot-starter-data-jpa</artifactId>-->
+        <!--</dependency>-->
+
+
+        <!--springboot-->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
+
+        <!-- JPA -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-jdbc</artifactId>
-            <version>2.0.6.RELEASE</version>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
         </dependency>
 
-        <!-- JPA -->
-        <!--<dependency>-->
-            <!--<groupId>org.springframework.boot</groupId>-->
-            <!--<artifactId>spring-boot-starter-data-jpa</artifactId>-->
-        <!--</dependency>-->
-
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>
@@ -74,14 +87,20 @@
             <!--<artifactId>druid</artifactId>-->
         </dependency>
 
-        <!--swagger2核心包和swagger-ui界面包-->
-        <dependency>
-            <groupId>io.springfox</groupId>
-            <artifactId>springfox-swagger2</artifactId>
-        </dependency>
+        <!--&lt;!&ndash;swagger2核心包和swagger-ui界面包&ndash;&gt;-->
+        <!--<dependency>-->
+            <!--<groupId>io.springfox</groupId>-->
+            <!--<artifactId>springfox-swagger2</artifactId>-->
+        <!--</dependency>-->
+        <!--<dependency>-->
+            <!--<groupId>io.springfox</groupId>-->
+            <!--<artifactId>springfox-swagger-ui</artifactId>-->
+        <!--</dependency>-->
+
+        <!-- knife4j aip 包-->
         <dependency>
-            <groupId>io.springfox</groupId>
-            <artifactId>springfox-swagger-ui</artifactId>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-spring-boot-starter</artifactId>
         </dependency>
 
         <!-- 工具类 -->
@@ -120,11 +139,6 @@
             <version>2.0.2</version>
         </dependency>
 
-        <!--<dependency>-->
-            <!--<groupId>tk.mybatis</groupId>-->
-            <!--<artifactId>mapper</artifactId>-->
-            <!--<version>4.0.3</version>-->
-        <!--</dependency>-->
 
         <!--分页插件-->
         <dependency>

+ 2 - 2
xiaoan-common/src/main/java/com/xiaoan/common/config/Swagger2.java

@@ -48,8 +48,8 @@ public class Swagger2 {
 
     private ApiInfo apiInfo() {
         return new ApiInfoBuilder()
-                .title("xx项目 RESTful APIs")
-                .description("xx项目后台api接口文档")
+                .title("消安项目 RESTful APIs")
+                .description("消安项目后台api接口文档")
                 .version("1.0")
                 .build();
     }

+ 0 - 1
xiaoan-common/src/main/java/com/xiaoan/common/config/WebMvcConfig.java

@@ -1,6 +1,5 @@
 package com.xiaoan.common.config;
 
-import com.xiaoan.common.interceptor.AuthHeaderSettingFilter;
 import com.xiaoan.common.interceptor.CommonInterceptor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Configuration;

+ 3 - 0
xiaoan-common/src/main/java/com/xiaoan/common/constant/MsgCode.java

@@ -19,6 +19,9 @@ public class MsgCode {
     public static final int e_COMMON_3002 = 3002;
     public static final String msg_COMMON_3002 = "id不存在";
 
+    public static final int e_COMMON_3003 = 3003;
+    public static final String msg_COMMON_3003 = "不允许有中文字符";
+
     //40xx是用户管理模块的
     public static final int e_ADMIN_4001 = 4001;
     public static final String msg_ADMIN_4001 = "用户不存在";

+ 38 - 0
xiaoan-common/src/main/java/com/xiaoan/common/util/RegexpUtils.java

@@ -0,0 +1,38 @@
+package com.xiaoan.common.util;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Created by owen on 2020/3/19 0019 15:45
+ *
+ * 正则表达式
+ */
+public class RegexpUtils {
+
+    /** 只允许中文 */
+    static final String isChinese = "^[一-\u9fff]+$";
+
+    public static void main(String[] args) {
+        String param = "dfgdfgsdf345456546*&^%#$*&^%$1";
+
+    }
+
+    /** 是否包含中文字符 */
+    public static boolean isContainChinese(String param) {
+        if (StringUtils.isNotBlank(param)) {
+            Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
+            Matcher m = p.matcher(param);
+            return m.find();
+        }
+        return true;
+    }
+
+    /** 只允许中文字符 */
+    public static boolean isChinese(String param) {
+        return param.matches(isChinese);
+    }
+
+}

+ 13 - 2
xiaoan-dao/src/main/java/com/xiaoan/dao/backend/ResourceRepository.java

@@ -14,7 +14,18 @@ import java.util.List;
 @Component
 public interface ResourceRepository extends IBaseRepository<ResourceEntity, Long> {
 
-    @Select(value = "select * from tb_role_resource z left join tb_resource r ON z.resource_id = r.id where z.role_id= #{userId}")
-    List<ResourceEntity> findRoleResourceByRoleId(Long id);
+    @Select(value = "select * from tb_role_resource z left join tb_resource r ON z.resource_id = r.id where z.role_id= #{roleId}")
+    List<ResourceEntity> findRoleResourceByRoleId(Long roleId);
+
+
+    /**
+     * 根据用户id查询权限
+     */
+    @Select(value = "select b.id, b.name, b.parent_id, b.resource_type from " +
+            "((tb_user u left join tb_user_role ur on u.id = ur.user_id) " +
+            "left join tb_role r on r.id = ur.role_id) " +
+            "left join tb_role_resource a on r.id = a.role_id " +
+            "left join tb_resource b on b.id = a.resource_id WHERE u.id = #{userId}")
+    List<ResourceEntity> findResourceByUserId(Long userId);
 
 }

+ 2 - 2
xiaoan-dao/src/main/java/com/xiaoan/dao/backend/RoleRepository.java

@@ -29,6 +29,6 @@ public interface RoleRepository extends IBaseRepository<RoleEntity, Long> {
     @Select(value = "select resource_id from tb_role_resource where role_id= #{userId}")
     Set<BigInteger> findRoleResourceByRoleId(Long userId);
 
-    @Select(value = "select * from tb_role_resource z left join tb_resource r ON z.resource_id = r.id where z.role_id= #{userId}")
-    List<ResourceEntity> findDetailRoleResourceByRoleId(Long id);
+    @Select(value = "select * from tb_role_resource z left join tb_resource r ON z.resource_id = r.id where z.role_id= #{roleId}")
+    List<ResourceEntity> findDetailRoleResourceByRoleId(Long roleId);
 }

+ 2 - 19
xiaoan-dao/src/main/java/com/xiaoan/dao/backend/provider/SceneProvider.java

@@ -4,8 +4,6 @@ import com.xiaoan.domain.dto.request.SceneProRequest;
 import lombok.extern.log4j.Log4j2;
 import org.apache.commons.lang3.StringUtils;
 
-import java.util.Date;
-import java.util.List;
 
 /**
  * Created by Hb_zzZ on 2020/3/3.
@@ -25,26 +23,11 @@ public class  SceneProvider {
         }
         if(StringUtils.isNotEmpty(param.getSearchKey())){
             sql.append(" and ( a.scene_name like '%").append(param.getSearchKey()).append("%'");
+            sql.append("or b.sn_code like '%").append(param.getSearchKey()).append("%'");
             sql.append("or c.real_name like '%").append(param.getSearchKey()).append("%' )");
         }
 
-//        if(ids != null && ids.size() > 0){
-//            sql.append(" and c.id in(");
-//            for(int i = 0, len = ids.size(); i < len; i ++){
-//
-//                if(len == 1){
-//                    sql.append(ids.get(i));
-//                } else {
-//                    if (i == len-1 ) {
-//                        sql.append(ids.get(i));
-//                    } else {
-//                        sql.append(ids.get(i)).append(",");
-//                    }
-//                }
-//            }
-//            sql.append(" )");
-//        }
-//
+
         if(param.getStatus() != null){
             sql.append(" and a.status = ").append(param.getStatus());
         }

+ 3 - 0
xiaoan-domain/src/main/java/com/xiaoan/domain/backend/ResourceEntity.java

@@ -46,5 +46,8 @@ public class ResourceEntity extends BaseModel implements Serializable {
     @Column(name = "parent_id")
     private Long parentId;
 
+    /** 封装权限字段,不需要映射到数据库*/
+    private boolean authority;
+
 
 }

+ 1 - 1
xiaoan-domain/src/main/java/com/xiaoan/domain/backend/UserEntity.java

@@ -31,7 +31,7 @@ public class UserEntity extends BaseModel implements Serializable {
      */
     private String userNum;
 
-    @Column(length = 1)
+    @Column
     private int sex; // 0:男  1:女
 
 

+ 6 - 3
xiaoan-domain/src/main/java/com/xiaoan/domain/dto/request/UserRequest.java

@@ -2,8 +2,7 @@ package com.xiaoan.domain.dto.request;
 
 import lombok.Data;
 
-import javax.validation.constraints.Email;
-import javax.validation.constraints.NotNull;
+import javax.validation.constraints.*;
 
 /**
  * Created by owen on 2020/2/18 0018 17:09
@@ -13,7 +12,7 @@ public class UserRequest{
 
     private Long id;
 
-    @NotNull
+    @NotBlank
     private String userName;
 
     private String realName; // 真实姓名
@@ -21,6 +20,7 @@ public class UserRequest{
     /**
      * 用户代号
      */
+    @Pattern(regexp = "^[0-9]*$")
     @NotNull
     private String userNum;
 
@@ -34,6 +34,9 @@ public class UserRequest{
 
     private Long roleId; // 角色id
 
+//    @NotBlank(message = "phone不能为空字符串/null")
+    @Size(max = 11, message = "长度不能大于11位")
+    @Pattern(regexp = "^[0-9]*$")
     private String phone;
 
 }

+ 2 - 3
xiaoan-domain/src/main/java/com/xiaoan/domain/dto/response/IssueResponse.java

@@ -1,5 +1,6 @@
 package com.xiaoan.domain.dto.response;
 
+import com.xiaoan.common.model.BaseModel;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -9,9 +10,8 @@ import java.util.Date;
  * Created by Hb_zzZ on 2020/2/28.
  */
 @Data
-public class IssueResponse implements Serializable {
+public class IssueResponse extends BaseModel {
 
-    private Long id;
 
     /**
      * 操作者用户
@@ -23,7 +23,6 @@ public class IssueResponse implements Serializable {
      */
     private String realName;
 
-    private Date createTime;
 
     private String title;
 

+ 3 - 7
xiaoan-domain/src/main/java/com/xiaoan/domain/dto/response/LogResponse.java

@@ -1,5 +1,6 @@
 package com.xiaoan.domain.dto.response;
 
+import com.xiaoan.common.model.BaseModel;
 import lombok.Data;
 
 import javax.persistence.Column;
@@ -10,9 +11,8 @@ import java.util.Date;
  * Created by Hb_zzZ on 2020/2/28.
  */
 @Data
-public class LogResponse implements Serializable {
+public class LogResponse extends BaseModel {
 
-    private Long id;
 
     /**
      * 操作者用户
@@ -24,10 +24,7 @@ public class LogResponse implements Serializable {
      */
     private String realName;
 
-//    /**
-//     * 操作者用户
-//     */
-//    private Long userId;
+
 
     /**
      * 操作类型
@@ -39,5 +36,4 @@ public class LogResponse implements Serializable {
      */
     private String description;
 
-    private Date createTime;
 }

+ 2 - 6
xiaoan-domain/src/main/java/com/xiaoan/domain/dto/response/ResourceResponse.java

@@ -1,17 +1,16 @@
 package com.xiaoan.domain.dto.response;
 
+import com.xiaoan.common.model.BaseModel;
 import lombok.Data;
 
-import java.io.Serializable;
 import java.util.Date;
 
 /**
  * Created by owen on 2020/3/18.
  */
 @Data
-public class ResourceResponse implements Serializable {
+public class ResourceResponse extends BaseModel {
 
-    private Long id;
 
     private String roleKey;
 
@@ -29,9 +28,6 @@ public class ResourceResponse implements Serializable {
 
     private String phone;
 
-
-    private Date createTime;
-
     // 角色id
     private Long roleId;
 

+ 2 - 4
xiaoan-domain/src/main/java/com/xiaoan/domain/dto/response/SceneResponse.java

@@ -1,5 +1,6 @@
 package com.xiaoan.domain.dto.response;
 
+import com.xiaoan.common.model.BaseModel;
 import lombok.Data;
 
 import java.util.Date;
@@ -8,16 +9,13 @@ import java.util.Date;
  * Created by Hb_zzZ on 2020/3/3.
  */
 @Data
-public class SceneResponse {
+public class SceneResponse extends BaseModel {
 
-    private Long id;
 
     private String thumb;
 
     private String sceneName;
 
-    private Date createTime;
-
     private String snCode;
 
     private String realName;

+ 2 - 6
xiaoan-domain/src/main/java/com/xiaoan/domain/dto/response/UserResponse.java

@@ -1,17 +1,15 @@
 package com.xiaoan.domain.dto.response;
 
+import com.xiaoan.common.model.BaseModel;
 import lombok.Data;
 
-import java.io.Serializable;
-import java.util.Date;
 
 /**
  * Created by Hb_zzZ on 2020/2/28.
  */
 @Data
-public class UserResponse implements Serializable {
+public class UserResponse extends BaseModel {
 
-    private Long id;
 
     private String userName;
 
@@ -31,8 +29,6 @@ public class UserResponse implements Serializable {
 
     private String roleName;
 
-    private Date createTime;
-
     // 角色id
     private Long roleId;
 

+ 5 - 1
xiaoan-service/src/main/java/com/xiaoan/service/backend/ResourceService.java

@@ -3,6 +3,7 @@ package com.xiaoan.service.backend;
 import com.xiaoan.domain.backend.ResourceEntity;
 import com.xiaoan.domain.backend.UserEntity;
 import com.xiaoan.service.IBaseService;
+import com.xiaoan.service.backend.dto.ResourcePermissions;
 import com.xiaoan.service.backend.dto.ResourceTree;
 
 import java.util.List;
@@ -22,5 +23,8 @@ public interface ResourceService extends IBaseService<ResourceEntity, Long> {
 
     List<ResourceEntity> getResourcesByUserPermission(UserEntity userEntity);
 
-//    public boolean existsByResourceKey(String resourceKey) throws Exception;
+    List<ResourceEntity> findResourceByUserId(Long userId);
+
+    List<ResourceTree> getResourcesAllByUserPermission(UserEntity userEntity);
+
 }

+ 1 - 1
xiaoan-service/src/main/java/com/xiaoan/service/backend/RoleService.java

@@ -20,5 +20,5 @@ public interface RoleService extends IBaseService<RoleEntity, Long> {
 
     Set<BigInteger> findRoleResourceByRoleId(Long id);
 
-    List<ResourceEntity> findDetailRoleResourceByRoleId(Long id);
+    List<ResourceEntity> findDetailRoleResourceByRoleId(Long roleId);
 }

+ 23 - 0
xiaoan-service/src/main/java/com/xiaoan/service/backend/dto/ResourcePermissions.java

@@ -0,0 +1,23 @@
+package com.xiaoan.service.backend.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class ResourcePermissions {
+
+    private Long id;
+
+    /** 名称*/
+    private String name;
+
+    /** 权限*/
+    private boolean authority;
+
+    /** 子权限*/
+    private List<ResourcePermissions> items;
+
+    private Long parentId;
+
+}

+ 6 - 105
xiaoan-service/src/main/java/com/xiaoan/service/backend/dto/ResourceTree.java

@@ -32,119 +32,20 @@ public class ResourceTree {
     @JSONField(serialize = false)
     private String resourceKey;
 
+    @JSONField(serialize = false)
     private String resourceType;
 
     @JSONField(serialize = false)
     private String order = "1";
 
+    // 子菜单/或按钮
     private List<ResourceTree> children;
 
     @JSONField(serialize = false)
     private int level;
 
-//    public Long getId() {
-//        return id;
-//    }
-//
-//    public String getName() {
-//        return name;
-//    }
-//
-//    public List<ResourceTree> getChildren() {
-//        return children;
-//    }
-//
-//    public void setId(Long id) {
-//        this.id = id;
-//    }
-//
-//    public void setName(String name) {
-//        this.name = name;
-//    }
-//
-//    public void setChildren(List<ResourceTree> children) {
-//        this.children = children;
-//    }
-//
-//    public Long getParentId() {
-//        return parentId;
-//    }
-//
-//    public void setParentId(Long parentId) {
-//        this.parentId = parentId;
-//    }
-//
-//    public boolean isChecked() {
-//        return checked;
-//    }
-//
-//    public void setChecked(boolean checked) {
-//        this.checked = checked;
-//        this.spread = checked;
-//    }
-//
-//    public boolean isSpread() {
-//        return spread;
-//    }
-//
-//    public void setSpread(boolean spread) {
-//        this.spread = spread;
-//    }
-//
-//
-//    public String getIsHeader() {
-//        return isHeader;
-//    }
-//
-//    public void setIsHeader(String isHeader) {
-//        this.isHeader = isHeader;
-//    }
-//
-//    public String getUrl() {
-//        return url;
-//    }
-//
-//    public void setUrl(String url) {
-//        this.url = url;
-//    }
-//
-//    public String getIcon() {
-//        return icon;
-//    }
-//
-//    public void setIcon(String icon) {
-//        this.icon = icon;
-//    }
-//
-//    public String getOrder() {
-//        return order;
-//    }
-//
-//    public void setOrder(String order) {
-//        this.order = order;
-//    }
-//
-//    public int getLevel() {
-//        return level;
-//    }
-//
-//    public void setLevel(int level) {
-//        this.level = level;
-//    }
-//
-//    public String getResourceType() {
-//        return resourceType;
-//    }
-//
-//    public void setResourceType(String resourceType) {
-//        this.resourceType = resourceType;
-//    }
-//
-//    public String getResourceKey() {
-//        return resourceKey;
-//    }
-//
-//    public void setResourceKey(String resourceKey) {
-//        this.resourceKey = resourceKey;
-//    }
+    // 默认都没有权限
+    private boolean authority = false;
+
+
 }

+ 56 - 1
xiaoan-service/src/main/java/com/xiaoan/service/backend/impl/ResourceServiceImpl.java

@@ -8,7 +8,9 @@ import com.xiaoan.domain.backend.ResourceEntity;
 import com.xiaoan.domain.backend.UserEntity;
 import com.xiaoan.service.BaseServiceImpl;
 import com.xiaoan.service.backend.ResourceService;
+import com.xiaoan.service.backend.dto.ResourcePermissions;
 import com.xiaoan.service.backend.dto.ResourceTree;
+import com.xiaoan.service.backend.util.ResourcePermissionTreeUtil;
 import com.xiaoan.service.backend.util.ResourceTreeUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.Cacheable;
@@ -35,6 +37,8 @@ public class ResourceServiceImpl extends BaseServiceImpl<ResourceEntity, Long> i
     @Autowired
     private RoleRepository roleRepository;
 
+
+
     @Override
     public IBaseRepository<ResourceEntity, Long> getBaseMapper() {
         return this.resourceRepository;
@@ -92,7 +96,6 @@ public class ResourceServiceImpl extends BaseServiceImpl<ResourceEntity, Long> i
     }
 
     @Override
-//    @Cacheable(value = "resourcesCache")
     public List<ResourceTree> getTree() throws Exception {
         List<ResourceEntity> resourceEntities = resourceRepository.selectAll();
         ResourceTreeUtil tree = new ResourceTreeUtil(resourceEntities);
@@ -115,6 +118,9 @@ public class ResourceServiceImpl extends BaseServiceImpl<ResourceEntity, Long> i
             Set<BigInteger> resourceSet = roleRepository.findRoleResourceByRoleId(i.longValue());
             for (BigInteger j : resourceSet ) {
                 ResourceEntity resourceEntity = allResourceMapper.get(j.longValue());
+
+                // 有权限
+                resourceEntity.setAuthority(true);
                 resourcesUserPermission.add(resourceEntity);
             }
         }
@@ -122,6 +128,46 @@ public class ResourceServiceImpl extends BaseServiceImpl<ResourceEntity, Long> i
     }
 
 
+
+    /**
+     * 根据用户获取权限
+     *
+     * 会把所有权限都会列出来的,通过Authority判断是否有权限
+     */
+    @Override
+    public List<ResourceTree> getResourcesAllByUserPermission(UserEntity userEntity) {
+        // 资源Mapper
+        HashMap<Long, ResourceEntity> allResourceMapper = getAllResourceMapper();
+
+        // 设置用户权限
+        List<ResourceEntity> resourcePer = findResourceByUserId(userEntity.getId());
+        for (ResourceEntity i: resourcePer) {
+            Long id = i.getId();
+            ResourceEntity resourceEntity = allResourceMapper.get(id);
+            resourceEntity.setAuthority(true);
+            allResourceMapper.put(id, resourceEntity);
+        }
+
+        // 获取用户菜单
+        List<ResourceEntity> permission = new ArrayList<>();
+
+        for (Map.Entry<Long, ResourceEntity> entry : allResourceMapper.entrySet()) {
+            permission.add(entry.getValue());
+        }
+
+        ResourceTreeUtil tree = new ResourceTreeUtil(permission);
+        return tree.buildTree();
+
+    }
+
+
+
+    @Override
+    public List<ResourceEntity> findResourceByUserId(Long userId) {
+        return resourceRepository.findResourceByUserId(userId);
+    }
+
+
     /**
      * 获取资源映射作为缓存
      * @return
@@ -138,4 +184,13 @@ public class ResourceServiceImpl extends BaseServiceImpl<ResourceEntity, Long> i
     }
 
 
+
+
+
+
+
+
+
+
+
 }

+ 2 - 2
xiaoan-service/src/main/java/com/xiaoan/service/backend/impl/RoleServiceImpl.java

@@ -48,8 +48,8 @@ public class RoleServiceImpl extends BaseServiceImpl<RoleEntity, Long> implement
     }
 
     @Override
-    public List<ResourceEntity> findDetailRoleResourceByRoleId(Long id) {
-        return roleRepository.findDetailRoleResourceByRoleId(id);
+    public List<ResourceEntity> findDetailRoleResourceByRoleId(Long roleId) {
+        return roleRepository.findDetailRoleResourceByRoleId(roleId);
     }
 
 

+ 1 - 9
xiaoan-service/src/main/java/com/xiaoan/service/backend/impl/SceneServiceImpl.java

@@ -9,14 +9,10 @@ import com.xiaoan.domain.dto.response.SceneResponse;
 import com.xiaoan.service.BaseServiceImpl;
 import com.xiaoan.service.backend.SceneService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
-import java.util.Map;
 
 /**
  * Created by Hb_zzZ on 2020/3/2.
@@ -54,9 +50,5 @@ public class SceneServiceImpl extends BaseServiceImpl<SceneProEntity, Long> impl
         return sceneRepository.findBySceneNum(sceneNum);
     }
 
-//    @Override
-//    public List<SceneResponse> findAllBySearchKey(SceneProRequest param, List<Long> ids, Long userId) {
-//        PageHelper.startPage(param.getPageNum(), param.getPageSize());
-//        return sceneRepository.findAllBySearchKeyAndUserId(param, ids, userId);
-//    }
+
 }

+ 120 - 0
xiaoan-service/src/main/java/com/xiaoan/service/backend/util/ResourcePermissionTreeUtil.java

@@ -0,0 +1,120 @@
+package com.xiaoan.service.backend.util;
+
+import com.xiaoan.domain.backend.ResourceEntity;
+import com.xiaoan.service.backend.dto.ResourcePermissions;
+import com.xiaoan.service.backend.dto.ResourceTree;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class ResourcePermissionTreeUtil {
+
+    private List<ResourcePermissions> resultNodes = new ArrayList<>();//树形结构排序之后list内容
+
+//    private List<ResourceTree> nodes = new ArrayList<ResourceTree>();
+    private List<ResourcePermissions> nodes = new ArrayList<>();
+
+    private List<ResourcePermissions> parents = new ArrayList<>();
+
+    private List<ResourcePermissions> childs = new ArrayList<>();
+
+    /** 传入参数*/
+    public ResourcePermissionTreeUtil(List<ResourceEntity> nodesList) {//通过构造函数初始化
+
+        for (ResourceEntity n : nodesList) {
+            ResourcePermissions resourcePermissions = new ResourcePermissions();
+            resourcePermissions.setId(n.getId());
+            resourcePermissions.setName(n.getName());
+            if (n.getParentId() != null) {
+                resourcePermissions.setParentId(n.getParentId());
+            }
+            nodes.add(resourcePermissions);
+        }
+    }
+
+    public ResourcePermissionTreeUtil() {
+    }
+
+        public List<ResourcePermissions> buildTree() {
+        return nodes;
+    }
+
+    public void format  () {
+
+    }
+
+
+
+    /**
+     * 构建树形结构list
+     *
+     * @return 返回树形结构List列表
+     */
+//    public List<ResourcePermissions> buildTree() {
+//        for (ResourcePermissions node : nodes) {
+//            Long id = node.getId();
+//
+//
+//
+//
+//            if (id == null) {//通过循环一级节点 就可以通过递归获取二级以下节点
+//                resultNodes.add(node);//添加一级节点
+////                node.setLevel(1);
+//                build(node, node.getLevel());//递归获取二级、三级、。。。节点
+//            }
+//        }
+//        return resultNodes;
+//    }
+
+    /**
+     * 递归循环子节点
+     *
+     * @param node 当前节点
+     */
+//    private void build(ResourceTree node, int level) {
+//        List<ResourceTree> children = getChildren(node);
+//        if (!children.isEmpty()) {//如果存在子节点
+//            node.setChildren(children);
+////        	level++;
+//            for (ResourceTree child : children) {//将子节点遍历加入返回值中
+////        		child.setLevel(level);
+//                build(child, child.getLevel());
+//            }
+//        }
+//    }
+//
+//    /**
+//     * @param node
+//     * @return 返回
+//     */
+//    private List<ResourceTree> getChildren(ResourceTree node) {
+//        List<ResourceTree> children = new ArrayList<ResourceTree>();
+//        Long id = node.getId();
+//        for (ResourceTree child : nodes) {
+//            if (id.equals(child.getParentId())) {//如果id等于父id
+//                children.add(child);//将该节点加入循环列表中
+//            }
+//        }
+//        return children;
+//    }
+//
+//    public List<ResourceTree> buildTree(List<ResourceEntity> all, List<ResourceEntity> in) {
+//        for (ResourceEntity n : all) {
+//            ResourceTree treeGrid = new ResourceTree();
+//            treeGrid.setId(n.getId());
+//            treeGrid.setName(n.getName());
+//            for (ResourceEntity nin : in) {
+//                if (nin.getId().equals(n.getId())) {
+//                    treeGrid.setChecked(true);
+//                }
+//            }
+//            if (n.getParentId() != null) {
+//                treeGrid.setParentId(n.getParentId());
+//            }
+//            nodes.add(treeGrid);
+//        }
+//        return buildTree();
+//    }
+
+}

+ 2 - 0
xiaoan-service/src/main/java/com/xiaoan/service/backend/util/ResourceTreeUtil.java

@@ -22,6 +22,8 @@ public class ResourceTreeUtil {
             treeGrid.setUrl(n.getUrl());
             treeGrid.setResourceKey(n.getResourceKey());
             treeGrid.setResourceType(n.getResourceType());
+
+            treeGrid.setAuthority(n.isAuthority());
             if (n.getParentId() != null) {
                 treeGrid.setParentId(n.getParentId());
             }

+ 77 - 4
xiaoan-web/src/main/java/com/xiaoan/web/backend/IndexController.java

@@ -3,12 +3,14 @@ package com.xiaoan.web.backend;
 import com.xiaoan.common.constant.MsgCode;
 import com.xiaoan.common.util.PasswordUtils;
 import com.xiaoan.common.util.ResultJson;
+import com.xiaoan.domain.backend.ResourceEntity;
 import com.xiaoan.domain.backend.UserEntity;
 import com.xiaoan.domain.dto.request.LoginRequest;
 import com.xiaoan.domain.dto.request.UserRequest;
 import com.xiaoan.service.backend.ResourceService;
 import com.xiaoan.service.backend.RoleService;
 import com.xiaoan.service.backend.UserService;
+import com.xiaoan.service.backend.dto.ResourcePermissions;
 import com.xiaoan.service.backend.dto.ResourceTree;
 import com.xiaoan.web.shiro.JWTUtil;
 import com.xiaoan.web.shiro.JwtUtil2;
@@ -20,6 +22,7 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.*;
@@ -28,7 +31,7 @@ import java.util.concurrent.TimeUnit;
 /**
  * Created by owen on 2020/2/19 0019 15:53
  */
-@Api(tags = "IndexController", description = "后台登录管理")
+@Api(value = "IndexController",tags = "后台登录管理")
 @RestController
 //@RequestMapping("api/manage/user")
 @Transactional
@@ -51,7 +54,72 @@ public class IndexController {
     private RedisTemplate<String, String> redisTemplate;
 
 
-    @ApiOperation("查询用户信息")
+    @ApiIgnore
+    @ApiOperation("测试权限")
+    @PostMapping(value = "loginPre")
+    public ResultJson loginPre(@RequestBody LoginRequest param) throws Exception {
+        log.warn("run login , userName:{}, password:{}", param.getUserName(), param.getPassword());
+        // 1.获取用户
+        UserEntity userEntity = userService.findByUserName(param.getUserName());
+        if (userEntity == null){
+            return new ResultJson(MsgCode.e_ADMIN_4001, MsgCode.msg_ADMIN_4001);
+        }
+
+        // 验证密码
+        String decryptName = PasswordUtils.decrypt(userEntity.getPassword(), param.getPassword(), PasswordUtils.getStaticSalt());
+        if (!param.getUserName().equals(decryptName)) {
+            return new ResultJson(MsgCode.e_ADMIN_4002, MsgCode.msg_ADMIN_4002);
+        }
+
+        // 检查账号是否启用
+        if (userEntity.getStatus() != 0) {
+            return new ResultJson(MsgCode.e_ADMIN_4003, MsgCode.msg_ADMIN_4003);
+        }
+
+//        List<ResourcePermissions> ResourceList = resourceService.findList();
+        List<ResourceTree> resourcesTreeByUserPermission = resourceService.getResourcesAllByUserPermission(userEntity);
+
+
+
+
+        // 获取用户角色
+        List<String> roles = userService.findRoleByUserId(userEntity.getId());
+
+
+        // 创建新token
+        HashMap<String, Object> tokenMap = new HashMap<>();
+        tokenMap.put("userName", userEntity.getUserName());
+        tokenMap.put("id", userEntity.getId());
+        tokenMap.put("role", roles);
+
+
+        String token = JwtUtil2.createJWT(-1, tokenMap);
+//
+
+        HashMap<String, Object> result = new HashMap<>();
+        result.put("user", userEntity);
+//        result.put("token", token);
+        result.put("permission", resourcesTreeByUserPermission);
+        result.put("role", roles);
+//        result.put("ResourceList", resourcesTreeByUserPermission);
+
+
+        // 更新到 redis, 有效期24h, 旧token无效
+        redisTemplate.opsForValue().set(userEntity.getUserName(), token, Long.parseLong("23"), TimeUnit.HOURS);
+
+        // 更新登录次数
+        Integer loginCount = userEntity.getViewCount();
+        loginCount++;
+        userEntity.setViewCount(loginCount);
+        userEntity.setUpdateTime(new Date());
+
+        userService.update(userEntity);
+
+        return new ResultJson(MsgCode.SUCCESS_CODE, result);
+
+    }
+
+    @ApiOperation("登录")
     @PostMapping(value = "admin/login")
     public ResultJson login(@RequestBody LoginRequest param) throws Exception {
         log.warn("run login , userName:{}, password:{}", param.getUserName(), param.getPassword());
@@ -73,9 +141,10 @@ public class IndexController {
         }
 
         // 获取用户菜单
-        List<ResourceTree> resourcesByUserMenu = resourceService.getResourcesTreeByUserMenu(userEntity);
+//        List<ResourceTree> resourcesByUserMenu = resourceService.getResourcesTreeByUserMenu(userEntity);
 
-        List<ResourceTree> resourcesTreeByUserPermission = resourceService.getResourcesTreeByUserPermission(userEntity);
+//        List<ResourceTree> resourcesTreeByUserPermission = resourceService.getResourcesTreeByUserPermission(userEntity);
+        List<ResourceTree> resourcesTreeByUserPermission = resourceService.getResourcesAllByUserPermission(userEntity);
 
         // 获取用户角色
         List<String> roles = userService.findRoleByUserId(userEntity.getId());
@@ -115,6 +184,7 @@ public class IndexController {
 
     }
 
+    @ApiOperation("退出")
     @GetMapping("admin/logout")
     public ResultJson logout(HttpServletRequest request) {
 
@@ -130,4 +200,7 @@ public class IndexController {
         return new ResultJson(MsgCode.SUCCESS_CODE, MsgCode.msg_SUCCESS);
     }
 
+
+
+
 }

+ 0 - 31
xiaoan-web/src/main/java/com/xiaoan/web/backend/SceneController.java

@@ -1,33 +1,23 @@
 package com.xiaoan.web.backend;
 
-import cn.hutool.core.io.FileUtil;
-import cn.hutool.core.util.ZipUtil;
 import com.github.pagehelper.PageInfo;
 import com.xiaoan.common.constant.MsgCode;
-import com.xiaoan.common.util.FileUtils;
 import com.xiaoan.common.util.ResultJson;
-import com.xiaoan.domain.backend.SceneProEntity;
 import com.xiaoan.domain.dto.request.SceneProRequest;
 import com.xiaoan.domain.dto.response.SceneResponse;
-import com.xiaoan.domain.dto.response.UserResponse;
 import com.xiaoan.service.backend.SceneService;
-import com.xiaoan.service.backend.UserService;
 import com.xiaoan.web.aop.WebControllerLog;
 import com.xiaoan.web.shiro.JWTUtil;
 import com.xiaoan.web.shiro.JwtUtil2;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
-import tk.mybatis.mapper.entity.Condition;
 
-import java.math.BigInteger;
 import java.util.List;
-import java.util.Set;
 
 /**
  * Created by Hb_zzZ on 2020/3/2.
@@ -45,26 +35,6 @@ public class SceneController extends BaseController {
     @Autowired
     private SceneService sceneService;
 
-    @Autowired
-    private UserService userService;
-
-    /**
-     * 根据场景名称,拍摄人查询
-     * 需要分角色
-     */
-//    @WebControllerLog(description = "场景管理-场景搜索/列表")
-//    @ApiOperation("获取场景列表")
-//    @PostMapping("/findSceneList")
-//    public ResultJson findSceneList(@RequestBody SceneProRequest param){
-//        List<Long> ids = null;
-//        if(StringUtils.isNotEmpty(param.getSearchKey())){
-//            ids = userService.findUserIdByRealName(param.getSearchKey());
-//        }
-//
-//        PageInfo<SceneResponse> pageInfo = new PageInfo<SceneResponse>(sceneService.findAllBySearchKey(param, ids));
-//        return new ResultJson(MsgCode.SUCCESS_CODE, pageInfo);
-//    }
-
 
     /**
      * 根据场景名称,拍摄人查询
@@ -77,7 +47,6 @@ public class SceneController extends BaseController {
     public ResultJson list(@RequestBody SceneProRequest param){
 
         List<SceneResponse> list = null;
-//        List userRole = JWTUtil.getUserRole(getToken());
         List userRole = JwtUtil2.getUserRole(getToken());
         if (userRole.contains("admin")) {
             list = sceneService.findAllBySearchKey(param, null);

+ 17 - 5
xiaoan-web/src/main/java/com/xiaoan/web/backend/TestController.java

@@ -7,6 +7,7 @@ import com.xiaoan.dao.backend.LogRepository;
 import com.xiaoan.dao.backend.RoleRepository;
 import com.xiaoan.dao.backend.SceneRepository;
 import com.xiaoan.dao.backend.UserRepository;
+import com.xiaoan.domain.backend.ResourceEntity;
 import com.xiaoan.domain.backend.UserEntity;
 import com.xiaoan.domain.dto.request.SceneProRequest;
 import com.xiaoan.domain.dto.response.LogResponse;
@@ -26,7 +27,7 @@ import java.util.List;
 /**
  * Created by owen on 2020/2/18 0018 10:04
  */
-@Api(tags = "TestController", description = "测试")
+@Api(value = "TestController",tags = "测试")
 @RestController
 @RequestMapping("test")
 public class TestController {
@@ -54,6 +55,20 @@ public class TestController {
     @Autowired
     private RedisTemplate<String, String> redisTemplate;
 
+    @GetMapping
+    public String test(){
+        return new Date() + "";
+    }
+
+    @ApiOperation("根据用户id获取权限")
+    @GetMapping("findResourceByUserId/{userId}")
+    public ResultJson findResourceByUserId(@PathVariable Long userId){
+        List<ResourceEntity> resource = resourceService.findResourceByUserId(userId);
+
+        return new ResultJson(2000, resource);
+    }
+
+
     @ApiOperation("测试scene按日期查询")
     @PostMapping("scene/search/date")
     public ResultJson sceneSearch(@RequestBody PageDto page){
@@ -109,10 +124,7 @@ public class TestController {
         return new Date().toString();
     }
 
-    @GetMapping("test")
-    public String test(){
-        return new Date() + "";
-    }
+
 
     @GetMapping("te")
     public ResultJson te(){

+ 20 - 4
xiaoan-web/src/main/java/com/xiaoan/web/backend/UserController.java

@@ -1,9 +1,13 @@
 package com.xiaoan.web.backend;
 
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.StrUtil;
 import com.github.pagehelper.PageInfo;
 import com.xiaoan.common.constant.MsgCode;
+import com.xiaoan.common.exception.BaseRuntimeException;
 import com.xiaoan.common.model.PageDto;
 import com.xiaoan.common.util.PasswordUtils;
+import com.xiaoan.common.util.RegexpUtils;
 import com.xiaoan.common.util.ResultJson;
 import com.xiaoan.domain.dto.request.UserRequest;
 import com.xiaoan.domain.backend.UserEntity;
@@ -12,6 +16,8 @@ import com.xiaoan.service.backend.UserService;
 import com.xiaoan.web.aop.WebControllerLog;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import lombok.Data;
+import lombok.extern.log4j.Log4j2;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.authz.annotation.Logical;
 import org.apache.shiro.authz.annotation.RequiresRoles;
@@ -30,6 +36,7 @@ import java.util.*;
 /**
  * Created by owen on 2020/2/18 0018 12:17
  */
+@Log4j2
 @Api(tags = "UserController", description = "后台用户管理")
 @RestController
 @RequestMapping("api/manage/user")
@@ -48,12 +55,23 @@ public class UserController extends BaseController {
         return new ResultJson(MsgCode.SUCCESS_CODE, page);
     }
 
+    @WebControllerLog(description = "用户管理-新增或修改用户信息")
     @RequiresRoles(value = {"admin"}, logical = Logical.OR)
     @ApiOperation("新增或修改用户信息")
     @PostMapping("save")
     public ResultJson save(@Valid @RequestBody UserRequest param){
+
+        System.out.println(param.toString());
+
         int n = 0;
 
+        // 验证表单
+        if (RegexpUtils.isContainChinese(param.getUserName())) {
+            log.error("userName: 不能包含中文");
+            return new ResultJson(MsgCode.e_COMMON_3003, "用户名不能包含中文字符");
+//            throw new BaseRuntimeException(MsgCode.e_COMMON_3003, "用户名不能包含中文字符");
+        }
+
         UserEntity entity = null;
         if (param.getId() == null){
             entity = userService.findByUserName(param.getUserName());
@@ -190,11 +208,9 @@ public class UserController extends BaseController {
 
     public static void main(String[] args) {
 
-        String ids = "1,2,3";
-
-        String[] split = ids.split(",");
+        String ids = "1111111";
 
-        System.out.println(Arrays.toString(split));
+        System.out.println(RegexpUtils.isContainChinese(ids));
     }
 
 

+ 225 - 0
xiaoan-web/src/main/java/com/xiaoan/web/shiro/JwtUtil2.java

@@ -0,0 +1,225 @@
+package com.xiaoan.web.shiro;
+
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.exceptions.JWTDecodeException;
+import com.auth0.jwt.interfaces.Claim;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.JwtBuilder;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+
+import java.util.*;
+
+public class JwtUtil2 {
+
+    //生成签名的时候使用的秘钥secret
+    private static final String SECRET = "XX#$%()(#*!()!KL<><MQLMNQNQJQK&sdfkjsdrow32234545fdf>?N<:{LWPW";
+
+    /**
+     * 用户登录成功后生成Jwt
+     * 使用Hs256算法  私匙使用用户密码
+     *
+     * @param ttlMillis jwt过期时间
+     * @param userName  用户名
+     * @return
+     */
+    public static String createJWT(long ttlMillis, String userName) {
+        //指定签名的时候使用的签名算法,也就是header那部分,jjwt已经将这部分内容封装好了。
+        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
+
+        //生成JWT的时间
+        long nowMillis = System.currentTimeMillis();
+        Date now = new Date(nowMillis);
+
+        //创建payload的私有声明(根据特定的业务需要添加,如果要拿这个做验证,一般是需要和jwt的接收方提前沟通好验证方式的)
+        Map<String, Object> claims = new HashMap<String, Object>();
+        claims.put("userName", userName);
+
+        //下面就是在为payload添加各种标准声明和私有声明了
+        //这里其实就是new一个JwtBuilder,设置jwt的body
+        JwtBuilder builder = Jwts.builder()
+                //如果有私有声明,一定要先设置这个自己创建的私有的声明,这个是给builder的claim赋值,一旦写在标准的声明赋值之后,就是覆盖了那些标准的声明的
+                .setClaims(claims)
+                //设置jti(JWT ID):是JWT的唯一标识,根据业务需要,这个可以设置为一个不重复的值,主要用来作为一次性token,从而回避重放攻击。
+                .setId(UUID.randomUUID().toString())
+                //iat: jwt的签发时间
+                .setIssuedAt(now)
+                //代表这个JWT的主体,即它的所有人,这个是一个json格式的字符串,可以存放什么userid,roldid之类的,作为什么用户的唯一标志。
+                .setSubject(userName)
+                //设置签名使用的签名算法和签名使用的秘钥
+                .signWith(signatureAlgorithm, SECRET);
+
+        if (ttlMillis >= 0) {
+            long expMillis = nowMillis + ttlMillis;
+            Date exp = new Date(expMillis);
+            //设置过期时间
+            builder.setExpiration(exp);
+        }/*else{
+            //设置过期时间半小时
+            DateTime expDate = new DateTime().plusMinutes(30);
+            builder.setExpiration(expDate.toDate());
+        }*/
+        return builder.compact();
+    }
+
+
+    /**
+     * Token的解密
+     * @param token 加密后的token
+     * @return
+     */
+    public static Claims parseJWT(String token) {
+        //得到DefaultJwtParser
+        Claims claims = Jwts.parser()
+                //设置签名的秘钥
+                .setSigningKey(SECRET)
+                //设置需要解析的jwt
+                .parseClaimsJws(token).getBody();
+        return claims;
+    }
+
+
+    /**
+     * 校验token
+     * 在这里可以使用官方的校验,我这里校验的是token中携带的密码于数据库一致的话就校验通过
+     * @param token
+     * @param userName
+     * @return
+     */
+    public static Boolean isVerify(String token, String userName) {
+
+        //得到DefaultJwtParser
+        Claims claims = Jwts.parser()
+                //设置签名的秘钥
+                .setSigningKey(SECRET)
+                //设置需要解析的jwt
+                .parseClaimsJws(token).getBody();
+
+        if (claims.get("userName").equals(userName)) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 获得token中的信息无需secret解密也能获得
+     *
+     * @return token中包含的用户名
+     */
+    public static String getUsername(String token) {
+        try {
+            DecodedJWT jwt = JWT.decode(token);
+            return jwt.getClaim("userName").asString();
+        } catch (JWTDecodeException e) {
+            return null;
+        }
+    }
+
+
+
+    public static List getUserRole(String token) {
+//        try {
+            DecodedJWT jwt = JWT.decode(token);
+            Claim role = jwt.getClaim("role");
+            return role.as(List.class);
+//        } catch (JWTDecodeException e) {
+//            return null;
+//        }
+    }
+
+
+    public static String createJWT(long ttlMillis, Map<String, Object> paramMap) {
+        //指定签名的时候使用的签名算法,也就是header那部分,jjwt已经将这部分内容封装好了。
+        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
+
+        String userName = paramMap.get("userName").toString();
+
+        //生成JWT的时间
+        long nowMillis = System.currentTimeMillis();
+        Date now = new Date(nowMillis);
+
+        //创建payload的私有声明(根据特定的业务需要添加,如果要拿这个做验证,一般是需要和jwt的接收方提前沟通好验证方式的)
+        Map<String, Object> claims = new HashMap<String, Object>();
+        claims.put("userName", userName);
+        claims.put("id", paramMap.get("id"));
+        claims.put("role", paramMap.get("role"));
+
+        //下面就是在为payload添加各种标准声明和私有声明了
+        //这里其实就是new一个JwtBuilder,设置jwt的body
+        JwtBuilder builder = Jwts.builder()
+                //如果有私有声明,一定要先设置这个自己创建的私有的声明,这个是给builder的claim赋值,一旦写在标准的声明赋值之后,就是覆盖了那些标准的声明的
+                .setClaims(claims)
+                //设置jti(JWT ID):是JWT的唯一标识,根据业务需要,这个可以设置为一个不重复的值,主要用来作为一次性token,从而回避重放攻击。
+                .setId(UUID.randomUUID().toString())
+                //iat: jwt的签发时间
+                .setIssuedAt(now)
+                //代表这个JWT的主体,即它的所有人,这个是一个json格式的字符串,可以存放什么userid,roldid之类的,作为什么用户的唯一标志。
+                .setSubject(userName)
+                //设置签名使用的签名算法和签名使用的秘钥
+                .signWith(signatureAlgorithm, SECRET);
+
+        if (ttlMillis >= 0) {
+            long expMillis = nowMillis + ttlMillis;
+            Date exp = new Date(expMillis);
+            //设置过期时间
+            builder.setExpiration(exp);
+        }/*else{
+            //设置过期时间半小时
+            DateTime expDate = new DateTime().plusMinutes(30);
+            builder.setExpiration(expDate.toDate());
+        }*/
+        return builder.compact();
+    }
+
+    public static Long getUserId(String token) {
+        try {
+            DecodedJWT jwt = JWT.decode(token);
+            Claim id = jwt.getClaim("id");
+            return id.asLong();
+        } catch (JWTDecodeException e) {
+            return null;
+        }
+    }
+
+    public static void main(String[] args) {
+//        test3();
+//        test2();
+        long nowMillis = System.currentTimeMillis();
+        System.out.println(nowMillis);
+        Date exp = new Date(nowMillis);
+        System.out.println(exp);
+    }
+
+    public static void test2(){
+        String token = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsInJvbGUiOlsiYWRtaW4iLCJyb290Il0sImlkIjoxLCJ1c2VyTmFtZSI6ImFkbWluIiwiaWF0IjoxNTgzODA5MzkzLCJqdGkiOiJkNjZiZTFkYi00MTQ0LTQxMTYtYTNlNi01ZDBjNjhlNTI3ODAifQ.-4AdsVP2RwmPS2grtO4aC8ov9PwkilzaGdThGetBJok";
+        System.out.println(getUserRole(token));
+
+    }
+
+    public static void test3(){
+        HashMap<String, Object> map = new HashMap<>();
+
+        ArrayList<Object> list = new ArrayList<>();
+        list.add("admin");
+        list.add("root");
+
+        map.put("userName", "admin");
+        map.put("id", Long.valueOf("1"));
+        map.put("role", list);
+
+        String token = createJWT(-1, map);
+        System.out.println(token);
+
+        Boolean isVerify = isVerify(token, "admin");
+        System.out.println(isVerify);
+
+    }
+
+    private static void testList(){
+        ArrayList<Object> list = new ArrayList<>();
+        list.add("admin");
+        list.add("root");
+    }
+
+}