Browse Source

调整资源接口

yingp 7 years ago
parent
commit
290bc20763
65 changed files with 1900 additions and 132 deletions
  1. 4 0
      base-servers/account/account-dto/pom.xml
  2. 48 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/constant/ResourceClassify.java
  3. 26 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/constant/RoleType.java
  4. 100 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/ResourceDTO.java
  5. 169 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/ResourceGroupDTO.java
  6. 49 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/ResourceModuleDTO.java
  7. 0 10
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/ResourcesDTO.java
  8. 75 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/RoleDTO.java
  9. 57 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/RoleSaveDTO.java
  10. 67 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/RoleUpdateDTO.java
  11. 57 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/UrlResourceDTO.java
  12. 5 5
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/AccountController.java
  13. 47 5
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/CompanyController.java
  14. 0 8
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/ResourceController.java
  15. 56 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/ResourcesController.java
  16. 115 1
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/RoleController.java
  17. 12 2
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/AccountCompanyMapper.java
  18. 7 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/AccountRoleMapper.java
  19. 33 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/CompanyAppMapper.java
  20. 10 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/CompanyMapper.java
  21. 21 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/ResourceGroupMapper.java
  22. 29 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/ResourceMapper.java
  23. 20 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/ResourceModuleMapper.java
  24. 0 11
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/ResourcesMapper.java
  25. 10 1
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/RoleResourceMapper.java
  26. 31 36
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/Resource.java
  27. 40 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/ResourceGroup.java
  28. 40 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/ResourceModule.java
  29. 13 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/Role.java
  30. 24 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/CompanyService.java
  31. 29 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/ResourceService.java
  32. 28 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/RoleService.java
  33. 2 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/AccountServiceImpl.java
  34. 27 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/CompanyServiceImpl.java
  35. 104 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/ResourceServiceImpl.java
  36. 58 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/RoleServiceImpl.java
  37. 17 2
      base-servers/account/account-server/src/main/resources/application.yml
  38. 3 0
      base-servers/account/account-server/src/main/resources/mapper/AccountCompanyMapper.xml
  39. 3 0
      base-servers/account/account-server/src/main/resources/mapper/AccountRoleMapper.xml
  40. 13 0
      base-servers/account/account-server/src/main/resources/mapper/CompanyAppMapper.xml
  41. 7 4
      base-servers/account/account-server/src/main/resources/mapper/CompanyMapper.xml
  42. 15 0
      base-servers/account/account-server/src/main/resources/mapper/ResourceGroupMapper.xml
  43. 24 0
      base-servers/account/account-server/src/main/resources/mapper/ResourceMapper.xml
  44. 15 0
      base-servers/account/account-server/src/main/resources/mapper/ResourceModuleMapper.xml
  45. 0 4
      base-servers/account/account-server/src/main/resources/mapper/ResourcesMapper.xml
  46. 98 1
      base-servers/account/account-server/src/main/resources/mapper/RoleMapper.xml
  47. 3 0
      base-servers/account/account-server/src/main/resources/mapper/RoleResourceMapper.xml
  48. 1 2
      base-servers/account/account-server/src/test/java/com/usoftchina/saas/account/controller/AccountControllerTest.java
  49. 32 5
      base-servers/account/account-server/src/test/java/com/usoftchina/saas/account/controller/CompanyControllerTest.java
  50. 33 0
      base-servers/account/account-server/src/test/java/com/usoftchina/saas/account/controller/ResourcesControllerTest.java
  51. 47 0
      base-servers/account/account-server/src/test/java/com/usoftchina/saas/account/service/ResourceServiceTest.java
  52. 1 0
      base-servers/auth/auth-client/src/main/java/com/usoftchina/saas/auth/client/interceptor/AuthRestInterceptor.java
  53. 2 0
      base-servers/auth/auth-common/src/main/java/com/usoftchina/saas/auth/common/jwt/JwtHelper.java
  54. 11 1
      base-servers/auth/auth-common/src/main/java/com/usoftchina/saas/auth/common/jwt/JwtInfo.java
  55. 1 1
      base-servers/auth/auth-server/src/main/java/com/usoftchina/saas/auth/controller/AuthController.java
  56. 4 0
      framework/core/src/main/java/com/usoftchina/saas/constant/CommonConstants.java
  57. 9 0
      framework/core/src/main/java/com/usoftchina/saas/context/BaseContextHolder.java
  58. 1 0
      framework/core/src/main/java/com/usoftchina/saas/exception/ExceptionCode.java
  59. 13 11
      framework/core/src/main/java/com/usoftchina/saas/utils/CollectionUtils.java
  60. 1 1
      framework/core/src/main/java/com/usoftchina/saas/utils/ObjectUtils.java
  61. 1 1
      framework/core/src/main/java/com/usoftchina/saas/utils/StringUtils.java
  62. 4 4
      framework/test-starter/src/main/java/com.usoftchina.saas.test/BaseControllerTest.java
  63. 10 0
      framework/test-starter/src/main/java/com.usoftchina.saas.test/TestConstant.java
  64. 1 0
      framework/test-starter/src/main/java/com.usoftchina.saas.test/TestContextListener.java
  65. 117 16
      script/mysql/init/account.sql

+ 4 - 0
base-servers/account/account-dto/pom.xml

@@ -18,6 +18,10 @@
             <artifactId>springfox-swagger2</artifactId>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>commons-dto</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 48 - 0
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/constant/ResourceClassify.java

@@ -0,0 +1,48 @@
+package com.usoftchina.saas.account.constant;
+
+/**
+ * @author yingp
+ * @date 2018/10/26
+ */
+public enum ResourceClassify {
+    /**
+     * 查询
+     */
+    QUERY,
+    /**
+     * 新增
+     */
+    ADD,
+    /**
+     * 保存
+     */
+    UPDATE,
+    /**
+     * 删除
+     */
+    DELETE,
+    /**
+     * (批量)审批
+     */
+    AUDIT,
+    /**
+     * (批量)反审批
+     */
+    UNAUDIT,
+    /**
+     * 导入
+     */
+    IMPORT,
+    /**
+     * 导出
+     */
+    EXPORT,
+    /**
+     * 打印
+     */
+    PRINT,
+    /**
+     * 其它
+     */
+    OTHER
+}

+ 26 - 0
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/constant/RoleType.java

@@ -0,0 +1,26 @@
+package com.usoftchina.saas.account.constant;
+
+/**
+ * @author yingp
+ * @date 2018/10/23
+ */
+public enum RoleType {
+    /**
+     * 管理角色
+     */
+    ADMIN(0),
+    /**
+     * 普通角色
+     */
+    NORMAL(1);
+
+    private final int type;
+
+    RoleType(int type) {
+        this.type = type;
+    }
+
+    public int getType() {
+        return type;
+    }
+}

+ 100 - 0
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/ResourceDTO.java

@@ -0,0 +1,100 @@
+package com.usoftchina.saas.account.dto;
+
+import java.io.Serializable;
+
+/**
+ * 用于资源权限分配
+ *
+ * @author yingp
+ * @date 2018/10/10
+ */
+public class ResourceDTO implements Serializable {
+    private Long id;
+    /**
+     * 名称
+     */
+    private String name;
+    /**
+     * 资源类型
+     * MENU - 菜单
+     * DIR - 目录
+     * BUTTON - 按钮
+     * URI - 页面上的url
+     * API - api
+     */
+    private String type;
+    /**
+     * url
+     */
+    private String url;
+
+    /**
+     * 资源请求方式 POST/GET/PUT/DELETE
+     */
+    private String method;
+    /**
+     * 资源分组
+     * @see com.usoftchina.saas.account.constant.ResourceClassify
+     */
+    private String classify;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getMethod() {
+        return method;
+    }
+
+    public void setMethod(String method) {
+        this.method = method;
+    }
+
+    public String getClassify() {
+        return classify;
+    }
+
+    public void setClassify(String classify) {
+        this.classify = classify;
+    }
+
+    @Override
+    public String toString() {
+        return "ResourceDTO{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                ", type='" + type + '\'' +
+                ", url='" + url + '\'' +
+                ", method='" + method + '\'' +
+                ", classify='" + classify + '\'' +
+                '}';
+    }
+}

+ 169 - 0
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/ResourceGroupDTO.java

@@ -0,0 +1,169 @@
+package com.usoftchina.saas.account.dto;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 用于资源权限分配
+ *
+ * @author yingp
+ * @date 2018/10/26
+ */
+public class ResourceGroupDTO implements Serializable{
+    private Long id;
+    private String name;
+    /**
+     * 查询
+     */
+    private List<ResourceDTO> queries;
+    /**
+     * 新增
+     */
+    private List<ResourceDTO> adds;
+    /**
+     * 修改
+     */
+    private List<ResourceDTO> updates;
+    /**
+     * 删除
+     */
+    private List<ResourceDTO> deletes;
+    /**
+     * 审核
+     */
+    private List<ResourceDTO> audits;
+    /**
+     * 反审核
+     */
+    private List<ResourceDTO> unAudits;
+    /**
+     * 打印
+     */
+    private List<ResourceDTO> prints;
+    /**
+     * 导出
+     */
+    private List<ResourceDTO> exports;
+    /**
+     * 导入
+     */
+    private List<ResourceDTO> imports;
+    /**
+     * 其它
+     */
+    private List<ResourceDTO> others;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public List<ResourceDTO> getQueries() {
+        return queries;
+    }
+
+    public void setQueries(List<ResourceDTO> queries) {
+        this.queries = queries;
+    }
+
+    public List<ResourceDTO> getAdds() {
+        return adds;
+    }
+
+    public void setAdds(List<ResourceDTO> adds) {
+        this.adds = adds;
+    }
+
+    public List<ResourceDTO> getUpdates() {
+        return updates;
+    }
+
+    public void setUpdates(List<ResourceDTO> updates) {
+        this.updates = updates;
+    }
+
+    public List<ResourceDTO> getDeletes() {
+        return deletes;
+    }
+
+    public void setDeletes(List<ResourceDTO> deletes) {
+        this.deletes = deletes;
+    }
+
+    public List<ResourceDTO> getAudits() {
+        return audits;
+    }
+
+    public void setAudits(List<ResourceDTO> audits) {
+        this.audits = audits;
+    }
+
+    public List<ResourceDTO> getUnAudits() {
+        return unAudits;
+    }
+
+    public void setUnAudits(List<ResourceDTO> unAudits) {
+        this.unAudits = unAudits;
+    }
+
+    public List<ResourceDTO> getPrints() {
+        return prints;
+    }
+
+    public void setPrints(List<ResourceDTO> prints) {
+        this.prints = prints;
+    }
+
+    public List<ResourceDTO> getExports() {
+        return exports;
+    }
+
+    public void setExports(List<ResourceDTO> exports) {
+        this.exports = exports;
+    }
+
+    public List<ResourceDTO> getImports() {
+        return imports;
+    }
+
+    public void setImports(List<ResourceDTO> imports) {
+        this.imports = imports;
+    }
+
+    public List<ResourceDTO> getOthers() {
+        return others;
+    }
+
+    public void setOthers(List<ResourceDTO> others) {
+        this.others = others;
+    }
+
+    @Override
+    public String toString() {
+        return "ResourceGroupDTO{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                ", queries=" + queries +
+                ", adds=" + adds +
+                ", updates=" + updates +
+                ", deletes=" + deletes +
+                ", audits=" + audits +
+                ", unAudits=" + unAudits +
+                ", prints=" + prints +
+                ", exports=" + exports +
+                ", imports=" + imports +
+                ", others=" + others +
+                '}';
+    }
+}

+ 49 - 0
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/ResourceModuleDTO.java

@@ -0,0 +1,49 @@
+package com.usoftchina.saas.account.dto;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 用于资源权限分配
+ *
+ * @author yingp
+ * @date 2018/10/26
+ */
+public class ResourceModuleDTO implements Serializable{
+    private Long id;
+    private String name;
+    private List<ResourceGroupDTO> groups;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public List<ResourceGroupDTO> getGroups() {
+        return groups;
+    }
+
+    public void setGroups(List<ResourceGroupDTO> groups) {
+        this.groups = groups;
+    }
+
+    @Override
+    public String toString() {
+        return "ResourceModuleDTO{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                ", groups=" + groups +
+                '}';
+    }
+}

+ 0 - 10
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/ResourcesDTO.java

@@ -1,10 +0,0 @@
-package com.usoftchina.saas.account.dto;
-
-import java.io.Serializable;
-
-/**
- * @author yingp
- * @date 2018/10/10
- */
-public class ResourcesDTO implements Serializable{
-}

+ 75 - 0
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/RoleDTO.java

@@ -0,0 +1,75 @@
+package com.usoftchina.saas.account.dto;
+
+import com.usoftchina.saas.base.dto.CommonBaseDTO;
+
+import java.io.Serializable;
+
+/**
+ * @author yingp
+ * @date 2018/10/24
+ */
+public class RoleDTO extends CommonBaseDTO implements Serializable{
+    /**
+     * 公司
+     */
+    private Long companyId;
+    /**
+     * 角色编码
+     */
+    private String code;
+    /**
+     * 角色名称
+     */
+    private String name;
+    /**
+     * 描述
+     */
+    private String description;
+
+    public Long getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Long companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @Override
+    public String toString() {
+        return "RoleDTO{" +
+                "companyId=" + companyId +
+                ", code='" + code + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", id=" + id +
+                ", createTime=" + createTime +
+                ", creatorName='" + creatorName + '\'' +
+                ", updateTime=" + updateTime +
+                ", updaterName='" + updaterName + '\'' +
+                '}';
+    }
+}

+ 57 - 0
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/RoleSaveDTO.java

@@ -0,0 +1,57 @@
+package com.usoftchina.saas.account.dto;
+
+import java.io.Serializable;
+
+/**
+ * 角色新增 数据传输对象
+ *
+ * @author yingp
+ * @date 2018/10/24
+ */
+public class RoleSaveDTO implements Serializable {
+    /**
+     * 编号
+     */
+    private String code;
+    /**
+     * 名称
+     */
+    private String name;
+    /**
+     * 描述
+     */
+    private String description;
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @Override
+    public String toString() {
+        return "RoleSaveDTO{" +
+                "code='" + code + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                '}';
+    }
+}

+ 67 - 0
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/RoleUpdateDTO.java

@@ -0,0 +1,67 @@
+package com.usoftchina.saas.account.dto;
+
+import java.io.Serializable;
+
+/**
+ * 角色修改 数据传输对象
+ *
+ * @author yingp
+ * @date 2018/10/24
+ */
+public class RoleUpdateDTO implements Serializable {
+    private Long id;
+    /**
+     * 编号
+     */
+    private String code;
+    /**
+     * 名称
+     */
+    private String name;
+    /**
+     * 描述
+     */
+    private String description;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @Override
+    public String toString() {
+        return "RoleSaveDTO{" +
+                "id=" + id +
+                ", code='" + code + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                '}';
+    }
+}

+ 57 - 0
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/UrlResourceDTO.java

@@ -0,0 +1,57 @@
+package com.usoftchina.saas.account.dto;
+
+import java.io.Serializable;
+
+/**
+ * 用于url拦截判断的属性
+ *
+ * @author yingp
+ * @date 2018/10/26
+ */
+public class UrlResourceDTO implements Serializable{
+    /**
+     * 名称
+     */
+    private String name;
+    /**
+     * url
+     */
+    private String url;
+    /**
+     * 资源请求方式 POST/GET/PUT/DELETE
+     */
+    private String method;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getMethod() {
+        return method;
+    }
+
+    public void setMethod(String method) {
+        this.method = method;
+    }
+
+    @Override
+    public String toString() {
+        return "UrlResourceDTO{" +
+                "name='" + name + '\'' +
+                ", url='" + url + '\'' +
+                ", method='" + method + '\'' +
+                '}';
+    }
+}

+ 5 - 5
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/AccountController.java

@@ -110,7 +110,7 @@ public class AccountController {
      * @param username
      * @return
      */
-    @GetMapping
+    @GetMapping("/read")
     public Result<AccountDTO> getAccount(@RequestParam(value = "username") String username) {
         Account account = getAccountByUsername(username);
         if (null == account) {
@@ -204,12 +204,12 @@ public class AccountController {
     /**
      * 账户删除
      *
-     * @param accountId
+     * @param id
      * @return
      */
-    @PostMapping("/delete")
-    public Result deleteAccount(@RequestParam long accountId) {
-        accountService.removeByPrimaryKey(accountId);
+    @PostMapping("/delete/{id}")
+    public Result deleteAccount(@PathVariable Long id) {
+        accountService.removeByPrimaryKey(id);
         return Result.success();
     }
 }

+ 47 - 5
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/CompanyController.java

@@ -5,6 +5,7 @@ import com.usoftchina.saas.account.dto.CompanyRegDTO;
 import com.usoftchina.saas.account.po.Company;
 import com.usoftchina.saas.account.service.CompanyService;
 import com.usoftchina.saas.base.Result;
+import com.usoftchina.saas.context.BaseContextHolder;
 import com.usoftchina.saas.exception.ExceptionCode;
 import com.usoftchina.saas.utils.BeanMapper;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -51,7 +52,7 @@ public class CompanyController {
      * @param name
      * @return
      */
-    @GetMapping(params = "name")
+    @GetMapping(path = "/read", params = "name")
     public Result<CompanyDTO> getByName(@RequestParam String name) {
         Company company = companyService.findByName(name);
         if (null != company) {
@@ -67,7 +68,7 @@ public class CompanyController {
      * @param businessCode
      * @return
      */
-    @GetMapping(params = "businessCode")
+    @GetMapping(path = "/read", params = "businessCode")
     public Result<CompanyDTO> getByBusinessCode(@RequestParam String businessCode) {
         Company company = companyService.findByBusinessCode(businessCode);
         if (null != company) {
@@ -77,15 +78,56 @@ public class CompanyController {
         return Result.error(ExceptionCode.COMPANY_NOT_EXIST);
     }
 
+    /**
+     * 当前登录的公司的信息
+     *
+     * @return
+     */
+    @GetMapping(path = "/read/current")
+    public Result<CompanyDTO> getCurrentCompany() {
+        Company company = companyService.findByPrimaryKey(BaseContextHolder.getCompanyId());
+        if (null != company) {
+            CompanyDTO companyDTO = BeanMapper.map(company, CompanyDTO.class);
+            return Result.success(companyDTO);
+        }
+        return Result.error(ExceptionCode.COMPANY_NOT_EXIST);
+    }
+
     /**
      * 删除
      *
+     * @param id
+     * @return
+     */
+    @PostMapping("/delete/{id}")
+    public Result delete(@PathVariable Long id) {
+        companyService.removeByPrimaryKey(id);
+        return Result.success();
+    }
+
+    /**
+     * 公司绑定应用
+     *
+     * @param companyId
+     * @param appId
+     * @return
+     */
+    @PostMapping("/bind/app")
+    public Result bindApp(@RequestParam long companyId, @RequestParam String appId) {
+        companyService.bindApp(companyId, appId);
+        return Result.success();
+    }
+
+    /**
+     * 公司解除绑定应用
+     *
      * @param companyId
+     * @param appId
      * @return
      */
-    @PostMapping("/delete")
-    public Result delete(@RequestParam Long companyId) {
-        companyService.removeByPrimaryKey(companyId);
+    @PostMapping("/unbind/app")
+    public Result unbindApp(@RequestParam long companyId, @RequestParam String appId) {
+        companyService.unbindApp(companyId, appId);
         return Result.success();
     }
 }

+ 0 - 8
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/ResourceController.java

@@ -1,8 +0,0 @@
-package com.usoftchina.saas.account.controller;
-
-/**
- * @author yingp
- * @date 2018/10/2
- */
-public class ResourceController {
-}

+ 56 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/ResourcesController.java

@@ -0,0 +1,56 @@
+package com.usoftchina.saas.account.controller;
+
+import com.usoftchina.saas.account.dto.ResourceModuleDTO;
+import com.usoftchina.saas.account.dto.UrlResourceDTO;
+import com.usoftchina.saas.account.service.ResourceService;
+import com.usoftchina.saas.base.Result;
+import com.usoftchina.saas.context.BaseContextHolder;
+import com.usoftchina.saas.utils.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @author yingp
+ * @date 2018/10/2
+ */
+@RestController
+@RequestMapping("/resource")
+public class ResourcesController {
+
+    @Autowired
+    private ResourceService resourcesService;
+
+    /**
+     * 查找应用分模块的全部资源
+     *
+     * @return
+     */
+    @GetMapping("/module/list")
+    public Result<List<ResourceModuleDTO>> getModulesByAppId(String appId) {
+        if (StringUtils.isEmpty(appId)) {
+            // 查找当前登录应用的全部资源
+            appId = BaseContextHolder.getAppId();
+        }
+        return Result.success(resourcesService.findModulesByAppId(appId));
+    }
+
+    /**
+     * 查找应用的全部url资源
+     *
+     * @param appId
+     * @return
+     */
+    @GetMapping("/url/list")
+    public Result<List<UrlResourceDTO>> getUrlResourcesByAppId(String appId) {
+        if (StringUtils.isEmpty(appId)) {
+            // 查找当前登录应用的全部资源
+            appId = BaseContextHolder.getAppId();
+        }
+        return Result.success(resourcesService.findUrlResourcesByAppId(appId));
+    }
+
+}

+ 115 - 1
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/RoleController.java

@@ -1,8 +1,122 @@
 package com.usoftchina.saas.account.controller;
 
+import com.usoftchina.saas.account.dto.RoleDTO;
+import com.usoftchina.saas.account.dto.RoleSaveDTO;
+import com.usoftchina.saas.account.dto.RoleUpdateDTO;
+import com.usoftchina.saas.account.po.Role;
+import com.usoftchina.saas.account.service.RoleService;
+import com.usoftchina.saas.base.Result;
+import com.usoftchina.saas.commons.dto.DocBaseDTO;
+import com.usoftchina.saas.context.BaseContextHolder;
+import com.usoftchina.saas.exception.ExceptionCode;
+import com.usoftchina.saas.utils.BeanMapper;
+import com.usoftchina.saas.utils.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
 /**
  * @author yingp
  * @date 2018/10/2
  */
+@RestController
+@RequestMapping("/role")
 public class RoleController {
-}
+
+    @Autowired
+    private RoleService roleService;
+
+    /**
+     * 保存
+     *
+     * @param roleSaveDTO
+     * @return
+     */
+    @PostMapping("/save")
+    public Result<DocBaseDTO> save(@RequestBody RoleSaveDTO roleSaveDTO) {
+        Role role = BeanMapper.map(roleSaveDTO, Role.class);
+        roleService.save(role);
+        return Result.success(BeanMapper.map(role, DocBaseDTO.class));
+    }
+
+    /**
+     * 修改
+     *
+     * @param roleUpdateDTO
+     * @return
+     */
+    @PostMapping("/update")
+    public Result update(@RequestBody RoleUpdateDTO roleUpdateDTO) {
+        Role role = BeanMapper.map(roleUpdateDTO, Role.class);
+        roleService.updateByPrimaryKey(role);
+        return Result.success();
+    }
+
+    /**
+     * 删除
+     *
+     * @param id
+     * @return
+     */
+    @PostMapping("/delete/{id}")
+    public Result delete(@PathVariable Long id) {
+        roleService.removeByPrimaryKey(id);
+        return Result.success();
+    }
+
+    /**
+     * 查找
+     *
+     * @param id
+     * @return
+     */
+    @GetMapping("/read/{id}")
+    public Result<RoleDTO> get(@PathVariable Long id) {
+        Role role = roleService.findByPrimaryKey(id);
+        if (null == role) {
+            return Result.error(ExceptionCode.ROLE_NOT_EXIST);
+        }
+        return Result.success(BeanMapper.map(role, RoleDTO.class));
+    }
+
+    /**
+     * 查找当前登录公司的全部角色
+     *
+     * @return
+     */
+    @GetMapping("/list")
+    public Result<List<RoleDTO>> getByCompany() {
+        List<Role> roles = roleService.findByCompanyId(BaseContextHolder.getCompanyId());
+        if (CollectionUtils.isEmpty(roles)) {
+            return Result.success();
+        }
+        return Result.success(BeanMapper.mapList(roles, RoleDTO.class));
+    }
+
+    /**
+     * 角色绑定资源
+     *
+     * @param roleId
+     * @param resourceId
+     * @return
+     */
+    @PostMapping("/bind/resource")
+    public Result bindResource(@RequestParam long roleId, @RequestParam long resourceId) {
+        roleService.bindResource(roleId, resourceId);
+        return Result.success();
+    }
+
+    /**
+     * 角色解除绑定资源
+     *
+     * @param roleId
+     * @param resourceId
+     * @return
+     */
+    @PostMapping("/unbind/resource")
+    public Result unbindResource(@RequestParam long roleId, @RequestParam long resourceId) {
+        roleService.unbindResource(roleId, resourceId);
+        return Result.success();
+    }
+}

+ 12 - 2
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/AccountCompanyMapper.java

@@ -22,13 +22,23 @@ public interface AccountCompanyMapper {
      *
      * @param accountId
      * @param companyId
+     * @return
      */
-    void delete(@Param("accountId") Long accountId, @Param("companyId") Long companyId);
+    int delete(@Param("accountId") Long accountId, @Param("companyId") Long companyId);
 
     /**
      * 按账户删除
      *
      * @param accountId
+     * @return
+     */
+    int deleteByAccountId(@Param("accountId") Long accountId);
+
+    /**
+     * 按公司删除
+     *
+     * @param companyId
+     * @return
      */
-    void deleteByAccountId(@Param("accountId") Long accountId);
+    int deleteByCompanyId(@Param("companyId") Long companyId);
 }

+ 7 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/AccountRoleMapper.java

@@ -30,4 +30,11 @@ public interface AccountRoleMapper {
      * @param accountId
      */
     void deleteByAccountId(@Param("accountId") Long accountId);
+
+    /**
+     * 按角色删除
+     *
+     * @param roleId
+     */
+    void deleteByRoleId(@Param("roleId") Long roleId);
 }

+ 33 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/CompanyAppMapper.java

@@ -0,0 +1,33 @@
+package com.usoftchina.saas.account.mapper;
+
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @author yingp
+ * @date 2018/10/24
+ */
+public interface CompanyAppMapper {
+    /**
+     * 新增
+     *
+     * @param companyId
+     * @param appId
+     * @return
+     */
+    int insert(@Param("companyId") Long companyId, @Param("appId") String appId);
+
+    /**
+     * 删除
+     *
+     * @param companyId
+     * @param appId
+     */
+    void delete(@Param("companyId") Long companyId, @Param("appId") String appId);
+    /**
+     * 按公司删除
+     *
+     * @param companyId
+     * @return
+     */
+    int deleteByCompanyId(@Param("companyId") Long companyId);
+}

+ 10 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/CompanyMapper.java

@@ -27,6 +27,14 @@ public interface CompanyMapper {
      */
     int insertSelective(Company record);
 
+    /**
+     * 按主键查询
+     *
+     * @param id
+     * @return
+     */
+    Company selectByPrimaryKey(@Param("id") Long id);
+
     /**
      * 按名称查询
      *
@@ -58,4 +66,6 @@ public interface CompanyMapper {
      * @return
      */
     int deleteByPrimaryKey(@Param("id") Long id);
+
+
 }

+ 21 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/ResourceGroupMapper.java

@@ -0,0 +1,21 @@
+package com.usoftchina.saas.account.mapper;
+
+import com.usoftchina.saas.account.po.ResourceGroup;
+import com.usoftchina.saas.account.po.ResourceModule;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author yingp
+ * @date 2018/10/26
+ */
+public interface ResourceGroupMapper {
+    /**
+     * 按资源模块查找
+     *
+     * @param moduleId
+     * @return
+     */
+    List<ResourceGroup> selectByModuleId(@Param("moduleId") Long moduleId);
+}

+ 29 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/ResourceMapper.java

@@ -0,0 +1,29 @@
+package com.usoftchina.saas.account.mapper;
+
+import com.usoftchina.saas.account.po.Resource;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author yingp
+ * @date 2018/10/2
+ */
+public interface ResourceMapper {
+
+    /**
+     * 按资源组查找
+     *
+     * @param groupId
+     * @return
+     */
+    List<Resource> selectByGroupId(@Param("groupId") Long groupId);
+
+    /**
+     * 按应用查找
+     *
+     * @param appId
+     * @return
+     */
+    List<Resource> selectByAppId(@Param("appId") String appId);
+}

+ 20 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/ResourceModuleMapper.java

@@ -0,0 +1,20 @@
+package com.usoftchina.saas.account.mapper;
+
+import com.usoftchina.saas.account.po.ResourceModule;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author yingp
+ * @date 2018/10/26
+ */
+public interface ResourceModuleMapper {
+    /**
+     * 按应用查找
+     *
+     * @param appId
+     * @return
+     */
+    List<ResourceModule> selectByAppId(@Param("appId") String appId);
+}

+ 0 - 11
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/ResourcesMapper.java

@@ -1,11 +0,0 @@
-package com.usoftchina.saas.account.mapper;
-
-import com.usoftchina.saas.account.po.Resources;
-import com.usoftchina.saas.base.mapper.CommonBaseMapper;
-
-/**
- * @author yingp
- * @date 2018/10/2
- */
-public interface ResourcesMapper extends CommonBaseMapper<Resources> {
-}

+ 10 - 1
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/RoleResourceMapper.java

@@ -21,6 +21,15 @@ public interface RoleResourceMapper {
      *
      * @param roleId
      * @param resourceId
+     * @return
+     */
+    int delete(@Param("roleId") Long roleId, @Param("resourceId") Long resourceId);
+
+    /**
+     * 按角色删除
+     *
+     * @param roleId
+     * @return
      */
-    void delete(@Param("roleId") Long roleId, @Param("resourceId") Long resourceId);
+    int deleteByRoleId(@Param("roleId") Long roleId);
 }

+ 31 - 36
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/Resources.java → base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/Resource.java

@@ -1,7 +1,5 @@
 package com.usoftchina.saas.account.po;
 
-import com.usoftchina.saas.base.entity.CommonBaseEntity;
-
 import java.io.Serializable;
 
 /**
@@ -10,15 +8,12 @@ import java.io.Serializable;
  * @author yingp
  * @date 2018/10/2
  */
-public class Resources extends CommonBaseEntity implements Serializable {
+public class Resource implements Serializable {
+    private Long id;
     /**
-     * 编号
+     * 资源组
      */
-    private String code;
-    /**
-     * 名称
-     */
-    private String name;
+    private Long groupId;
     /**
      * 资源类型
      * MENU - 菜单
@@ -28,6 +23,11 @@ public class Resources extends CommonBaseEntity implements Serializable {
      * API - api
      */
     private String type;
+    /**
+     * 资源分类
+     * @see com.usoftchina.saas.account.constant.ResourceClassify
+     */
+    private String classify;
     /**
      * url
      */
@@ -39,29 +39,16 @@ public class Resources extends CommonBaseEntity implements Serializable {
     private String method;
 
     /**
-     * 排序
-     */
-    private Integer orderNum;
-
-    /**
-     * 描述
+     * 名称
      */
-    private String description;
-
-    public String getCode() {
-        return code;
-    }
-
-    public void setCode(String code) {
-        this.code = code;
-    }
+    private String name;
 
-    public String getName() {
-        return name;
+    public Long getId() {
+        return id;
     }
 
-    public void setName(String name) {
-        this.name = name;
+    public void setId(Long id) {
+        this.id = id;
     }
 
     public String getType() {
@@ -72,6 +59,14 @@ public class Resources extends CommonBaseEntity implements Serializable {
         this.type = type;
     }
 
+    public String getClassify() {
+        return classify;
+    }
+
+    public void setClassify(String classify) {
+        this.classify = classify;
+    }
+
     public String getUrl() {
         return url;
     }
@@ -88,19 +83,19 @@ public class Resources extends CommonBaseEntity implements Serializable {
         this.method = method;
     }
 
-    public Integer getOrderNum() {
-        return orderNum;
+    public String getName() {
+        return name;
     }
 
-    public void setOrderNum(Integer orderNum) {
-        this.orderNum = orderNum;
+    public void setName(String name) {
+        this.name = name;
     }
 
-    public String getDescription() {
-        return description;
+    public Long getGroupId() {
+        return groupId;
     }
 
-    public void setDescription(String description) {
-        this.description = description;
+    public void setGroupId(Long groupId) {
+        this.groupId = groupId;
     }
 }

+ 40 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/ResourceGroup.java

@@ -0,0 +1,40 @@
+package com.usoftchina.saas.account.po;
+
+import java.io.Serializable;
+
+/**
+ * 资源组
+ * 可以按单据分组
+ *
+ * @author yingp
+ * @date 2018/10/25
+ */
+public class ResourceGroup implements Serializable {
+    private Long id;
+    private Long moduleId;
+    private String name;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getModuleId() {
+        return moduleId;
+    }
+
+    public void setModuleId(Long moduleId) {
+        this.moduleId = moduleId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}

+ 40 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/ResourceModule.java

@@ -0,0 +1,40 @@
+package com.usoftchina.saas.account.po;
+
+import java.io.Serializable;
+
+/**
+ * 资源模块
+ * 按采购、销售、资金...分模块
+ *
+ * @author yingp
+ * @date 2018/10/25
+ */
+public class ResourceModule implements Serializable {
+    private Long id;
+    private String appId;
+    private String name;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}

+ 13 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/Role.java

@@ -24,6 +24,11 @@ public class Role extends CommonBaseEntity implements Serializable {
      */
     private String description;
 
+    /**
+     * 角色类型:0 - 管理员角色, 1 - 普通角色
+     */
+    private Integer type;
+
     public String getCode() {
         return code;
     }
@@ -47,4 +52,12 @@ public class Role extends CommonBaseEntity implements Serializable {
     public void setDescription(String description) {
         this.description = description;
     }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
 }

+ 24 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/CompanyService.java

@@ -34,6 +34,14 @@ public interface CompanyService {
      */
     Company findByBusinessCode(String businessCode);
 
+    /**
+     * 按ID查找
+     *
+     * @param id
+     * @return
+     */
+    Company findByPrimaryKey(Long id);
+
     /**
      * 按个人账户查找全部绑定企业
      *
@@ -49,4 +57,20 @@ public interface CompanyService {
      * @return
      */
     boolean removeByPrimaryKey(Long id);
+
+    /**
+     * 公司绑定应用
+     *
+     * @param companyId
+     * @param appId
+     */
+    void bindApp(long companyId, String appId);
+
+    /**
+     * 公司解除绑定应用
+     *
+     * @param companyId
+     * @param appId
+     */
+    void unbindApp(long companyId, String appId);
 }

+ 29 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/ResourceService.java

@@ -0,0 +1,29 @@
+package com.usoftchina.saas.account.service;
+
+import com.usoftchina.saas.account.dto.ResourceModuleDTO;
+import com.usoftchina.saas.account.dto.UrlResourceDTO;
+import com.usoftchina.saas.account.po.Resource;
+
+import java.util.List;
+
+/**
+ * @author yingp
+ * @date 2018/10/24
+ */
+public interface ResourceService {
+    /**
+     * 按应用查找资源模块,以及模块下的资源分组 + 资源
+     *
+     * @param appId
+     * @return
+     */
+    List<ResourceModuleDTO> findModulesByAppId(String appId);
+
+    /**
+     * 按应用查找资源的url属性
+     *
+     * @param appId
+     * @return
+     */
+    List<UrlResourceDTO> findUrlResourcesByAppId(String appId);
+}

+ 28 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/RoleService.java

@@ -0,0 +1,28 @@
+package com.usoftchina.saas.account.service;
+
+import com.usoftchina.saas.account.mapper.RoleMapper;
+import com.usoftchina.saas.account.po.Role;
+import com.usoftchina.saas.base.service.CommonBaseService;
+
+/**
+ * @author yingp
+ * @date 2018/10/24
+ */
+public interface RoleService extends CommonBaseService<RoleMapper, Role>{
+
+    /**
+     * 角色绑定资源
+     *
+     * @param roleId
+     * @param resourceId
+     */
+    void bindResource(long roleId, long resourceId);
+
+    /**
+     * 角色解除绑定资源
+     *
+     * @param roleId
+     * @param resourceId
+     */
+    void unbindResource(long roleId, long resourceId);
+}

+ 2 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/AccountServiceImpl.java

@@ -7,6 +7,7 @@ import com.usoftchina.saas.account.po.Account;
 import com.usoftchina.saas.account.service.AccountService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.DigestUtils;
 
 /**
@@ -82,6 +83,7 @@ public class AccountServiceImpl implements AccountService {
         accountRoleMapper.delete(accountId, roleId);
     }
 
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public boolean removeByPrimaryKey(Long id) {
         accountRoleMapper.deleteByAccountId(id);

+ 27 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/CompanyServiceImpl.java

@@ -1,5 +1,7 @@
 package com.usoftchina.saas.account.service.impl;
 
+import com.usoftchina.saas.account.mapper.AccountCompanyMapper;
+import com.usoftchina.saas.account.mapper.CompanyAppMapper;
 import com.usoftchina.saas.account.mapper.CompanyMapper;
 import com.usoftchina.saas.account.po.Company;
 import com.usoftchina.saas.account.service.CompanyService;
@@ -7,6 +9,7 @@ import com.usoftchina.saas.account.vo.CompanyBaseVO;
 import com.usoftchina.saas.context.BaseContextHolder;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.Date;
 import java.util.List;
@@ -21,6 +24,12 @@ public class CompanyServiceImpl implements CompanyService{
     @Autowired
     private CompanyMapper companyMapper;
 
+    @Autowired
+    private AccountCompanyMapper accountCompanyMapper;
+
+    @Autowired
+    private CompanyAppMapper companyAppMapper;
+
     @Override
     public boolean save(Company company) {
         Date nowDate = new Date();
@@ -42,13 +51,31 @@ public class CompanyServiceImpl implements CompanyService{
         return companyMapper.selectByBusinessCode(businessCode);
     }
 
+    @Override
+    public Company findByPrimaryKey(Long id) {
+        return companyMapper.selectByPrimaryKey(id);
+    }
+
     @Override
     public List<CompanyBaseVO> findBaseByAccountId(Long accountId) {
         return companyMapper.selectBaseByAccountId(accountId);
     }
 
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public boolean removeByPrimaryKey(Long id) {
+        accountCompanyMapper.deleteByCompanyId(id);
+        companyAppMapper.deleteByCompanyId(id);
         return companyMapper.deleteByPrimaryKey(id) > 0;
     }
+
+    @Override
+    public void bindApp(long companyId, String appId) {
+        companyAppMapper.insert(companyId, appId);
+    }
+
+    @Override
+    public void unbindApp(long companyId, String appId) {
+        companyAppMapper.delete(companyId, appId);
+    }
 }

+ 104 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/ResourceServiceImpl.java

@@ -0,0 +1,104 @@
+package com.usoftchina.saas.account.service.impl;
+
+import com.usoftchina.saas.account.constant.ResourceClassify;
+import com.usoftchina.saas.account.dto.ResourceDTO;
+import com.usoftchina.saas.account.dto.ResourceGroupDTO;
+import com.usoftchina.saas.account.dto.ResourceModuleDTO;
+import com.usoftchina.saas.account.dto.UrlResourceDTO;
+import com.usoftchina.saas.account.mapper.ResourceGroupMapper;
+import com.usoftchina.saas.account.mapper.ResourceMapper;
+import com.usoftchina.saas.account.mapper.ResourceModuleMapper;
+import com.usoftchina.saas.account.po.Resource;
+import com.usoftchina.saas.account.po.ResourceGroup;
+import com.usoftchina.saas.account.po.ResourceModule;
+import com.usoftchina.saas.account.service.ResourceService;
+import com.usoftchina.saas.utils.BeanMapper;
+import com.usoftchina.saas.utils.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author yingp
+ * @date 2018/10/24
+ */
+@Service
+public class ResourceServiceImpl implements ResourceService {
+
+    @Autowired
+    private ResourceMapper resourceMapper;
+
+    @Autowired
+    private ResourceModuleMapper resourceModuleMapper;
+
+    @Autowired
+    private ResourceGroupMapper resourceGroupMapper;
+
+    @Override
+    public List<ResourceModuleDTO> findModulesByAppId(String appId) {
+        List<ResourceModule> modules = resourceModuleMapper.selectByAppId(appId);
+        if (!CollectionUtils.isEmpty(modules)) {
+            List<ResourceModuleDTO> moduleDTOS = BeanMapper.mapList(modules, ResourceModuleDTO.class);
+            moduleDTOS.parallelStream().forEach(moduleDTO -> {
+                moduleDTO.setGroups(findGroupsByModuleId(moduleDTO.getId()));
+            });
+            return moduleDTOS;
+        }
+        return null;
+    }
+
+    /**
+     * 模块下的资源分组
+     *
+     * @param moduleId
+     * @return
+     */
+    private List<ResourceGroupDTO> findGroupsByModuleId(Long moduleId) {
+        List<ResourceGroup> groups = resourceGroupMapper.selectByModuleId(moduleId);
+        if (!CollectionUtils.isEmpty(groups)) {
+            List<ResourceGroupDTO> groupDTOS = BeanMapper.mapList(groups, ResourceGroupDTO.class);
+            groupDTOS.parallelStream().forEach(groupDTO -> {
+                List<ResourceDTO> resources = findResourcesByGroupId(groupDTO.getId());
+                // 分类(分类后,方便快速设置)
+                Map<String, List<ResourceDTO>> map = CollectionUtils.groupBy(resources, ResourceDTO::getClassify);
+                groupDTO.setQueries(map.get(ResourceClassify.QUERY.name()));
+                groupDTO.setAdds(map.get(ResourceClassify.ADD.name()));
+                groupDTO.setUpdates(map.get(ResourceClassify.UPDATE.name()));
+                groupDTO.setDeletes(map.get(ResourceClassify.DELETE.name()));
+                groupDTO.setAudits(map.get(ResourceClassify.AUDIT.name()));
+                groupDTO.setUnAudits(map.get(ResourceClassify.UNAUDIT.name()));
+                groupDTO.setExports(map.get(ResourceClassify.EXPORT.name()));
+                groupDTO.setImports(map.get(ResourceClassify.IMPORT.name()));
+                groupDTO.setPrints(map.get(ResourceClassify.PRINT.name()));
+                groupDTO.setOthers(map.get(ResourceClassify.OTHER.name()));
+            });
+            return groupDTOS;
+        }
+        return null;
+    }
+
+    /**
+     * 资源组下的资源
+     *
+     * @param groupId
+     * @return
+     */
+    private List<ResourceDTO> findResourcesByGroupId(Long groupId) {
+        List<Resource> resources = resourceMapper.selectByGroupId(groupId);
+        if (!CollectionUtils.isEmpty(resources)) {
+            return BeanMapper.mapList(resources, ResourceDTO.class);
+        }
+        return null;
+    }
+
+    @Override
+    public List<UrlResourceDTO> findUrlResourcesByAppId(String appId) {
+        List<Resource> resources = resourceMapper.selectByAppId(appId);
+        if (!CollectionUtils.isEmpty(resources)) {
+            return BeanMapper.mapList(resources, UrlResourceDTO.class);
+        }
+        return null;
+    }
+}

+ 58 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/RoleServiceImpl.java

@@ -0,0 +1,58 @@
+package com.usoftchina.saas.account.service.impl;
+
+import com.usoftchina.saas.account.constant.RoleType;
+import com.usoftchina.saas.account.mapper.AccountRoleMapper;
+import com.usoftchina.saas.account.mapper.RoleMapper;
+import com.usoftchina.saas.account.mapper.RoleResourceMapper;
+import com.usoftchina.saas.account.po.Role;
+import com.usoftchina.saas.account.service.RoleService;
+import com.usoftchina.saas.base.service.CommonBaseServiceImpl;
+import com.usoftchina.saas.utils.StringUtils;
+import org.apache.commons.lang.RandomStringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @author yingp
+ * @date 2018/10/24
+ */
+@Service
+public class RoleServiceImpl extends CommonBaseServiceImpl<RoleMapper, Role> implements RoleService{
+
+    private static final String ROLE_CODE_PREFIX = "ROLE_";
+
+    @Autowired
+    private RoleResourceMapper roleResourceMapper;
+
+    @Autowired
+    private AccountRoleMapper accountRoleMapper;
+
+    @Override
+    public boolean save(Role role) {
+        if (StringUtils.isEmpty(role.getCode())) {
+            role.setCode(ROLE_CODE_PREFIX + RandomStringUtils.randomAlphabetic(8));
+        }
+        // 新增的都是普通角色
+        role.setType(RoleType.NORMAL.getType());
+        return super.save(role);
+    }
+
+    @Override
+    public void bindResource(long roleId, long resourceId) {
+        roleResourceMapper.insert(roleId, resourceId);
+    }
+
+    @Override
+    public void unbindResource(long roleId, long resourceId) {
+        roleResourceMapper.delete(roleId, resourceId);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean removeByPrimaryKey(Long id) {
+        accountRoleMapper.deleteByRoleId(id);
+        roleResourceMapper.deleteByRoleId(id);
+        return super.removeByPrimaryKey(id);
+    }
+}

+ 17 - 2
base-servers/account/account-server/src/main/resources/application.yml

@@ -7,8 +7,23 @@ spring:
     user:
       name: admin
       password: select111***
+  rabbitmq:
+    host: 192.168.0.176
+    port: 5672
+    virtual-host: dev
+    username: saas
+    password: select123***
+  zipkin:
+    sender:
+      type: rabbit
+    locator:
+      discovery:
+        enabled: true
+  sleuth:
+    sampler:
+      probability: 1.0
   datasource:
-    driver-class-name: com.mysql.jdbc.Driver
+    driver-class-name: com.mysql.cj.jdbc.Driver
     url: jdbc:mysql://192.168.253.12:3306/saas_account?characterEncoding=utf-8&useSSL=false
     username: root
     password: select111***
@@ -31,7 +46,7 @@ eureka:
   client:
     registryFetchIntervalSeconds: 5
     serviceUrl:
-      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@192.168.0.181:8500/eureka/
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@192.168.0.181:8510/eureka/
 server:
   port: 8580
   tomcat:

+ 3 - 0
base-servers/account/account-server/src/main/resources/mapper/AccountCompanyMapper.xml

@@ -10,4 +10,7 @@
     <delete id="deleteByAccountId" parameterType="java.lang.Long">
         delete from ac_account_company where account_id=#{accountId}
     </delete>
+    <delete id="deleteByCompanyId" parameterType="java.lang.Long">
+        delete from ac_account_company where company_id=#{companyId}
+    </delete>
 </mapper>

+ 3 - 0
base-servers/account/account-server/src/main/resources/mapper/AccountRoleMapper.xml

@@ -10,4 +10,7 @@
     <delete id="deleteByAccountId" parameterType="java.lang.Long">
         delete from ac_account_role where account_id=#{accountId}
     </delete>
+    <delete id="deleteByRoleId" parameterType="java.lang.Long">
+        delete from ac_account_role where role_id=#{roleId}
+    </delete>
 </mapper>

+ 13 - 0
base-servers/account/account-server/src/main/resources/mapper/CompanyAppMapper.xml

@@ -0,0 +1,13 @@
+<?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.usoftchina.saas.account.mapper.CompanyAppMapper">
+    <insert id="insert">
+        insert into ac_company_app(company_id,app_id) values (#{companyId,jdbcType=BIGINT}, #{appId,jdbcType=VARCHAR})
+    </insert>
+    <delete id="delete">
+        delete from ac_company_app where company_id=#{companyId,jdbcType=BIGINT} and app_id=#{appId,jdbcType=VARCHAR}
+    </delete>
+    <delete id="deleteByCompanyId" parameterType="java.lang.Long">
+        delete from ac_company_app where company_id=#{companyId}
+    </delete>
+</mapper>

+ 7 - 4
base-servers/account/account-server/src/main/resources/mapper/CompanyMapper.xml

@@ -80,17 +80,20 @@
             </if>
         </trim>
     </insert>
+    <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="FullResultMap">
+        select <include refid="baseColumns"/> from ac_company where id=#{id,jdbcType=BIGINT}
+    </select>
     <select id="selectByName" parameterType="java.lang.String" resultMap="FullResultMap">
-        select <include refid="baseColumns"/> from ac_company where name=#{name}
+        select <include refid="baseColumns"/> from ac_company where name=#{name,jdbcType=VARCHAR}
     </select>
     <select id="selectByBusinessCode" parameterType="java.lang.String" resultMap="FullResultMap">
-        select <include refid="baseColumns"/> from ac_company where business_code=#{businessCode}
+        select <include refid="baseColumns"/> from ac_company where business_code=#{businessCode,jdbcType=VARCHAR}
     </select>
     <select id="selectBaseByAccountId" parameterType="java.lang.Long" resultMap="BaseResultMap">
         select ac_company.id,ac_company.name,ac_company.logo_url from ac_account_company,ac_company
-        where ac_account_company.company_id=ac_company.id and ac_account_company.account_id=#{accountId}
+        where ac_account_company.company_id=ac_company.id and ac_account_company.account_id=#{accountId,jdbcType=BIGINT}
     </select>
     <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
-        delete from ac_company where id=#{id}
+        delete from ac_company where id=#{id,jdbcType=BIGINT}
     </delete>
 </mapper>

+ 15 - 0
base-servers/account/account-server/src/main/resources/mapper/ResourceGroupMapper.xml

@@ -0,0 +1,15 @@
+<?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.usoftchina.saas.account.mapper.ResourceGroupMapper">
+    <resultMap id="BaseResultMap" type="com.usoftchina.saas.account.po.ResourceGroup">
+        <id column="id" jdbcType="BIGINT" property="id"/>
+        <result column="name" jdbcType="VARCHAR" property="name"/>
+        <result column="module_id" jdbcType="BIGINT" property="moduleId"/>
+    </resultMap>
+    <sql id="baseColumns">
+        id,name,module_id
+    </sql>
+    <select id="selectByModuleId" parameterType="java.lang.Long" resultMap="BaseResultMap">
+        select <include refid="baseColumns"/> from ac_resource_group where module_id=#{moduleId,jdbcType=VARCHAR} order by id
+    </select>
+</mapper>

+ 24 - 0
base-servers/account/account-server/src/main/resources/mapper/ResourceMapper.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.usoftchina.saas.account.mapper.ResourceMapper">
+    <resultMap id="BaseResultMap" type="com.usoftchina.saas.account.po.Resource">
+        <id column="id" jdbcType="BIGINT" property="id"/>
+        <result column="name" jdbcType="VARCHAR" property="name"/>
+        <result column="group_id" jdbcType="BIGINT" property="groupId"/>
+        <result column="type" jdbcType="VARCHAR" property="type"/>
+        <result column="url" jdbcType="VARCHAR" property="url"/>
+        <result column="method" jdbcType="VARCHAR" property="method"/>
+        <result column="classify" jdbcType="VARCHAR" property="classify"/>
+    </resultMap>
+    <sql id="baseColumns">
+        ac_resource.id,ac_resource.name,ac_resource.group_id,ac_resource.type,ac_resource.url,ac_resource.method,ac_resource.classify
+    </sql>
+    <select id="selectByGroupId" parameterType="java.lang.Long" resultMap="BaseResultMap">
+        select <include refid="baseColumns"/> from ac_resource where group_id=#{groupId,jdbcType=BIGINT}
+    </select>
+    <select id="selectByAppId" parameterType="java.lang.String" resultMap="BaseResultMap">
+        select <include refid="baseColumns"/> from ac_resource,ac_resource_module,ac_resource_group where
+        ac_resource_module.id=ac_resource_group.module_id and ac_resource_group.id=ac_resource.group_id
+        and ac_resource_module.app_id=#{appId,jdbcType=VARCHAR}
+    </select>
+</mapper>

+ 15 - 0
base-servers/account/account-server/src/main/resources/mapper/ResourceModuleMapper.xml

@@ -0,0 +1,15 @@
+<?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.usoftchina.saas.account.mapper.ResourceModuleMapper">
+    <resultMap id="BaseResultMap" type="com.usoftchina.saas.account.po.ResourceModule">
+        <id column="id" jdbcType="BIGINT" property="id"/>
+        <result column="name" jdbcType="VARCHAR" property="name"/>
+        <result column="app_id" jdbcType="VARCHAR" property="appId"/>
+    </resultMap>
+    <sql id="baseColumns">
+        id,name,app_id
+    </sql>
+    <select id="selectByAppId" parameterType="java.lang.String" resultMap="BaseResultMap">
+        select <include refid="baseColumns"/> from ac_resource_module where app_id=#{appId,jdbcType=VARCHAR} order by id
+    </select>
+</mapper>

+ 0 - 4
base-servers/account/account-server/src/main/resources/mapper/ResourcesMapper.xml

@@ -1,4 +0,0 @@
-<?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.usoftchina.saas.account.mapper.ResourcesMapper">
-</mapper>

+ 98 - 1
base-servers/account/account-server/src/main/resources/mapper/RoleMapper.xml

@@ -1,5 +1,102 @@
 <?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.usoftchina.saas.account.mapper.RoleMapper">
-
+    <resultMap id="BaseResultMap" type="com.usoftchina.saas.account.po.Role">
+        <id column="id" jdbcType="BIGINT" property="id"/>
+        <result column="code" jdbcType="VARCHAR" property="code"/>
+        <result column="name" jdbcType="VARCHAR" property="name"/>
+        <result column="description" jdbcType="VARCHAR" property="description"/>
+        <result column="type" jdbcType="INTEGER" property="type"/>
+        <result column="company_id" jdbcType="BIGINT" property="companyId"/>
+        <result column="creator_id" jdbcType="BIGINT" property="creatorId"/>
+        <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
+        <result column="updater_id" jdbcType="BIGINT" property="updaterId"/>
+        <result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
+    </resultMap>
+    <sql id="baseColumns">
+        id,code,name,description,type,company_id,creator_id,create_time,updater_id,update_time
+    </sql>
+    <insert id="insert" parameterType="com.usoftchina.saas.account.po.Role"
+            useGeneratedKeys="true" keyProperty="id">
+        insert into ac_role(code,name,description,type,company_id,creator_id,create_time,updater_id,update_time)
+        values (#{code,jdbcType=VARCHAR},#{name,jdbcType=VARCHAR}, #{description,jdbcType=VARCHAR}, #{type,jdbcType=INTEGER}, #{companyId,jdbcType=BIGINT},
+        #{creatorId,jdbcType=BIGINT}, #{createTime,jdbcType=TIMESTAMP}, #{updaterId,jdbcType=BIGINT}, #{updateTime,jdbcType=TIMESTAMP})
+    </insert>
+    <insert id="insertSelective" parameterType="com.usoftchina.saas.account.po.Role"
+            useGeneratedKeys="true" keyProperty="id">
+        insert into ac_role
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="code != null">
+                code,
+            </if>
+            <if test="name != null">
+                name,
+            </if>
+            <if test="description != null">
+                description,
+            </if>
+            <if test="type != null">
+                type,
+            </if>
+            <if test="companyId != null">
+                company_id,
+            </if>
+            <if test="creatorId != null">
+                creator_id,
+            </if>
+            <if test="createTime != null">
+                create_time,
+            </if>
+            <if test="updaterId != null">
+                updater_id,
+            </if>
+            <if test="updateTime != null">
+                update_time,
+            </if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="code != null">
+                #{code,jdbcType=VARCHAR},
+            </if>
+            <if test="name != null">
+                #{name,jdbcType=VARCHAR},
+            </if>
+            <if test="description != null">
+                #{description,jdbcType=VARCHAR},
+            </if>
+            <if test="type != null">
+                #{type,jdbcType=INTEGER},
+            </if>
+            <if test="companyId != null">
+                #{companyId,jdbcType=BIGINT},
+            </if>
+            <if test="creatorId != null">
+                #{creatorId,jdbcType=BIGINT},
+            </if>
+            <if test="createTime != null">
+                #{createTime,jdbcType=TIMESTAMP},
+            </if>
+            <if test="updaterId != null">
+                #{updaterId,jdbcType=BIGINT},
+            </if>
+            <if test="updateTime != null">
+                #{updateTime,jdbcType=TIMESTAMP},
+            </if>
+        </trim>
+    </insert>
+    <update id="updateByPrimaryKey" parameterType="com.usoftchina.saas.account.po.Role">
+        update ac_role set code=#{code,jdbcType=VARCHAR},name=#{name,jdbcType=VARCHAR},
+        description=#{description,jdbcType=VARCHAR},type=#{type,jdbcType=INTEGER},company_id=#{companyId,jdbcType=BIGINT},
+        creator_id=#{creatorId,jdbcType=BIGINT},create_time=#{createTime,jdbcType=TIMESTAMP},
+        updater_id=#{updaterId,jdbcType=BIGINT},update_time=#{updateTime,jdbcType=TIMESTAMP} where id=#{id,jdbcType=BIGINT}
+    </update>
+    <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+        delete from ac_role where id=#{id,jdbcType=BIGINT}
+    </delete>
+    <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+        select <include refid="baseColumns"/> from ac_role where id=#{id,jdbcType=BIGINT}
+    </select>
+    <select id="selectByCompanyId" parameterType="java.lang.Long" resultMap="BaseResultMap">
+        select <include refid="baseColumns"/> from ac_role where company_id=#{companyId,jdbcType=BIGINT}
+    </select>
 </mapper>

+ 3 - 0
base-servers/account/account-server/src/main/resources/mapper/RoleResourceMapper.xml

@@ -7,4 +7,7 @@
     <delete id="delete">
         delete from ac_role_resource where role_id=#{roleId} and resource_id=#{resourceId}
     </delete>
+    <delete id="deleteByRoleId" parameterType="java.lang.Long">
+        delete from ac_role_resource where role_id=#{roleId}
+    </delete>
 </mapper>

+ 1 - 2
base-servers/account/account-server/src/test/java/com/usoftchina/saas/account/controller/AccountControllerTest.java

@@ -111,8 +111,7 @@ public class AccountControllerTest extends BaseControllerTest {
     @Test
     public void testI_deleteAccount() throws Exception {
         AccountDTO accountDTO = getAccountDTO();
-        mockMvc.perform(post("/account/delete")
-                .param("accountId", String.valueOf(accountDTO.getId())))
+        mockMvc.perform(post("/account/delete/{id}", accountDTO.getId()))
                 .andExpect(isSuccess());
     }
 }

+ 32 - 5
base-servers/account/account-server/src/test/java/com/usoftchina/saas/account/controller/CompanyControllerTest.java

@@ -3,6 +3,7 @@ package com.usoftchina.saas.account.controller;
 import com.usoftchina.saas.account.dto.CompanyDTO;
 import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.test.BaseControllerTest;
+import com.usoftchina.saas.test.TestConstant;
 import org.junit.Assert;
 import org.junit.FixMethodOrder;
 import org.junit.Test;
@@ -39,7 +40,7 @@ public class CompanyControllerTest extends BaseControllerTest {
     }
 
     private CompanyDTO getByName() throws Exception {
-        MvcResult mvcResult = mockMvc.perform(get("/company")
+        MvcResult mvcResult = mockMvc.perform(get("/company/read")
                 .param("name", name))
                 .andExpect(isSuccess())
                 .andReturn();
@@ -49,7 +50,7 @@ public class CompanyControllerTest extends BaseControllerTest {
     }
 
     private CompanyDTO getByBusinessCode() throws Exception {
-        MvcResult mvcResult = mockMvc.perform(get("/company")
+        MvcResult mvcResult = mockMvc.perform(get("/company/read")
                 .param("businessCode", businessCode))
                 .andExpect(isSuccess())
                 .andReturn();
@@ -65,10 +66,36 @@ public class CompanyControllerTest extends BaseControllerTest {
     }
 
     @Test
-    public void testD_delete() throws Exception {
+    public void testD_getCurrentCompany() throws Exception {
+        MvcResult mvcResult = mockMvc.perform(get("/company/read/current"))
+                .andExpect(isSuccess())
+                .andReturn();
+        Result<CompanyDTO> result = result(mvcResult, CompanyDTO.class);
+        System.out.println(result.getData());
+    }
+
+    @Test
+    public void testE_bindApp() throws Exception {
+        CompanyDTO companyDTO = getByName();
+        mockMvc.perform(post("/company/bind/app")
+                .param("companyId", String.valueOf(companyDTO.getId()))
+                .param("appId", TestConstant.DEFAULT_APP_ID))
+                .andExpect(isSuccess());
+    }
+
+    @Test
+    public void testF_unbindApp() throws Exception {
+        CompanyDTO companyDTO = getByName();
+        mockMvc.perform(post("/company/unbind/app")
+                .param("companyId", String.valueOf(companyDTO.getId()))
+                .param("appId", TestConstant.DEFAULT_APP_ID))
+                .andExpect(isSuccess());
+    }
+
+    @Test
+    public void testG_delete() throws Exception {
         CompanyDTO companyDTO = getByName();
-        mockMvc.perform(post("/company/delete")
-                .param("companyId", String.valueOf(companyDTO.getId())))
+        mockMvc.perform(post("/company/delete/{id}", companyDTO.getId()))
                 .andExpect(isSuccess());
     }
 

+ 33 - 0
base-servers/account/account-server/src/test/java/com/usoftchina/saas/account/controller/ResourcesControllerTest.java

@@ -0,0 +1,33 @@
+package com.usoftchina.saas.account.controller;
+
+import com.usoftchina.saas.test.BaseControllerTest;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.MethodSorters;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MvcResult;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class ResourcesControllerTest extends BaseControllerTest{
+
+    @Test
+    public void testA_getModulesByAppId() throws Exception {
+        MvcResult mvcResult = mockMvc.perform(get("/resource/module/list"))
+                .andExpect(isSuccess())
+                .andReturn();
+        System.out.println(mvcResult.getResponse().getContentAsString());
+    }
+
+    @Test
+    public void testB_getUrlResourcesByAppId() throws Exception {
+        MvcResult mvcResult = mockMvc.perform(get("/resource/url/list"))
+                .andExpect(isSuccess())
+                .andReturn();
+        System.out.println(mvcResult.getResponse().getContentAsString());
+    }
+
+}

+ 47 - 0
base-servers/account/account-server/src/test/java/com/usoftchina/saas/account/service/ResourceServiceTest.java

@@ -0,0 +1,47 @@
+package com.usoftchina.saas.account.service;
+
+import com.usoftchina.saas.account.dto.ResourceModuleDTO;
+import com.usoftchina.saas.account.dto.UrlResourceDTO;
+import com.usoftchina.saas.context.BaseContextHolder;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.MethodSorters;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.List;
+import java.util.stream.IntStream;
+
+import static org.junit.Assert.*;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class ResourceServiceTest {
+
+    @Autowired
+    private ResourceService resourceService;
+
+    @Test
+    public void testA_findModulesByAppId() throws Exception {
+        // 测试方法性能
+        IntStream.range(1, 21).forEach( i -> {
+            long time = System.currentTimeMillis();
+            List<ResourceModuleDTO> moduleDTOS = resourceService.findModulesByAppId(BaseContextHolder.getAppId());
+            System.out.println(String.format("----%s: %s, %s", i, moduleDTOS.size(), (System.currentTimeMillis() - time)));
+        });
+    }
+
+    @Test
+    public void testB_findUrlResourcesByAppId() throws Exception {
+        // 测试方法性能
+        IntStream.range(1, 21).forEach( i -> {
+            long time = System.currentTimeMillis();
+            List<UrlResourceDTO> resourceDTOS = resourceService.findUrlResourcesByAppId(BaseContextHolder.getAppId());
+            System.out.println(String.format("----%s: %s, %s", i, resourceDTOS.size(), (System.currentTimeMillis() - time)));
+        });
+    }
+
+}

+ 1 - 0
base-servers/auth/auth-client/src/main/java/com/usoftchina/saas/auth/client/interceptor/AuthRestInterceptor.java

@@ -38,6 +38,7 @@ public class AuthRestInterceptor extends HandlerInterceptorAdapter {
         }
         String token = request.getHeader(authConfig.getAuthHeader());
         JwtInfo infoFromToken = JwtHelper.getInfoFromToken(token, authConfig.getPublicKey());
+        BaseContextHolder.setAppId(infoFromToken.getAppId());
         BaseContextHolder.setUserId(infoFromToken.getUserId());
         BaseContextHolder.setCompanyId(infoFromToken.getCompanyId());
         BaseContextHolder.setToken(token);

+ 2 - 0
base-servers/auth/auth-common/src/main/java/com/usoftchina/saas/auth/common/jwt/JwtHelper.java

@@ -37,6 +37,7 @@ public class JwtHelper {
                     Jwts.builder()
                             // 设置主题
                             .setSubject(jwtInfo.getUserName())
+                            .claim("appId", jwtInfo.getAppId())
                             .claim("userId", jwtInfo.getUserId())
                             .claim("companyId", jwtInfo.getCompanyId())
                             .claim("userName", jwtInfo.getUserName())
@@ -93,6 +94,7 @@ public class JwtHelper {
         Jws<Claims> claimsJws = parserToken(token, pubKeyPath);
         Claims body = claimsJws.getBody();
         return new JwtInfo(
+                ObjectUtils.getStringValue(body.get("appId")),
                 ObjectUtils.getLongValue(body.get("userId")),
                 ObjectUtils.getLongValue(body.get("companyId")),
                 ObjectUtils.getStringValue(body.get("userName"))

+ 11 - 1
base-servers/auth/auth-common/src/main/java/com/usoftchina/saas/auth/common/jwt/JwtInfo.java

@@ -7,16 +7,26 @@ import java.io.Serializable;
  * @date 2018/10/2
  */
 public class JwtInfo implements Serializable{
+    private String appId;
     private Long companyId;
     private Long userId;
     private String userName;
 
-    public JwtInfo(Long companyId, Long userId, String userName) {
+    public JwtInfo(String appId, Long companyId, Long userId, String userName) {
+        this.appId = appId;
         this.companyId = companyId;
         this.userId = userId;
         this.userName = userName;
     }
 
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
+
     public Long getCompanyId() {
         return companyId;
     }

+ 1 - 1
base-servers/auth/auth-server/src/main/java/com/usoftchina/saas/auth/controller/AuthController.java

@@ -42,7 +42,7 @@ public class AuthController {
         if (result.isSuccess()) {
             AccountDTO accountDTO = result.getData();
             // TODO
-            JwtInfo info = new JwtInfo(null, accountDTO.getId(), accountDTO.getUsername());
+            JwtInfo info = new JwtInfo(null, null, accountDTO.getId(), accountDTO.getUsername());
             TokenVO tokenVO = JwtHelper.generateToken(info, privateKeyPath, expire);
             TokenDTO tokenDTO = BeanMapper.map(tokenVO, TokenDTO.class);
             return Result.success(tokenDTO);

+ 4 - 0
framework/core/src/main/java/com/usoftchina/saas/constant/CommonConstants.java

@@ -15,6 +15,10 @@ public class CommonConstants {
      * ThreadLocal中的登录用户Id key
      */
     public static final String CONTEXT_KEY_USER_ID = "currentUserId";
+    /***
+     * ThreadLocal中的登录应用Id key
+     */
+    public static final String CONTEXT_KEY_APP_ID = "currentAppId";
     /***
      * ThreadLocal中的登录用户Id key
      */

+ 9 - 0
framework/core/src/main/java/com/usoftchina/saas/context/BaseContextHolder.java

@@ -49,6 +49,15 @@ public class BaseContextHolder {
         set(CommonConstants.CONTEXT_KEY_COMPANY_ID, companyId);
     }
 
+    public static String getAppId() {
+        Object value = get(CommonConstants.CONTEXT_KEY_APP_ID);
+        return ObjectUtils.getStringValue(value);
+    }
+
+    public static void setAppId(String appId) {
+        set(CommonConstants.CONTEXT_KEY_APP_ID, appId);
+    }
+
     public static String getToken() {
         Object value = get(CommonConstants.CONTEXT_KEY_TOKEN);
         return ObjectUtils.getStringValue(value);

+ 1 - 0
framework/core/src/main/java/com/usoftchina/saas/exception/ExceptionCode.java

@@ -33,6 +33,7 @@ public enum ExceptionCode implements BaseExceptionCode {
     USER_PWD_NOT_EQUALS(53004, "密码与确认密码不一致"),
     USER_NOT_EXIST(53005, "用户不存在"),
     USER_NOT_ENABLE(53006, "用户禁止使用"),
+    ROLE_NOT_EXIST(53020, "角色不存在"),
 
     // 文件相关
     FOLDER_NULL(55000, "文件夹为空"),

+ 13 - 11
framework/core/src/main/java/com/usoftchina/saas/utils/ListUtils.java → framework/core/src/main/java/com/usoftchina/saas/utils/CollectionUtils.java

@@ -10,7 +10,7 @@ import java.util.function.Function;
  * @author yingp
  * @date 2018/10/10
  */
-public class ListUtils {
+public abstract class CollectionUtils extends org.springframework.util.CollectionUtils{
     /**
      * 按指定方法,将list分组返回map
      *
@@ -22,16 +22,18 @@ public class ListUtils {
      */
     public static <K, V> Map<K, List<V>> groupBy(List<V> sources, Function<V, K> keyGetter) {
         Map<K, List<V>> map = new HashMap<>(1);
-        sources.forEach(source -> {
-            K key = keyGetter.apply(source);
-            if (map.containsKey(key)) {
-                map.get(key).add(source);
-            } else {
-                List<V> childList = new ArrayList<>();
-                childList.add(source);
-                map.put(key, childList);
-            }
-        });
+        if (!isEmpty(sources)) {
+            sources.forEach(source -> {
+                K key = keyGetter.apply(source);
+                if (map.containsKey(key)) {
+                    map.get(key).add(source);
+                } else {
+                    List<V> childList = new ArrayList<>();
+                    childList.add(source);
+                    map.put(key, childList);
+                }
+            });
+        }
         return map;
     }
 }

+ 1 - 1
framework/core/src/main/java/com/usoftchina/saas/utils/ObjectUtils.java

@@ -4,7 +4,7 @@ package com.usoftchina.saas.utils;
  * @author yingp
  * @date 2018/10/2
  */
-public class ObjectUtils {
+public abstract class ObjectUtils extends org.springframework.util.ObjectUtils{
     public static String getStringValue(Object obj) {
         return null == obj ? "" : obj.toString();
     }

+ 1 - 1
framework/core/src/main/java/com/usoftchina/saas/utils/StringUtils.java

@@ -4,7 +4,7 @@ package com.usoftchina.saas.utils;
  * @author yingp
  * @date 2018/10/10
  */
-public class StringUtils {
+public abstract class StringUtils extends org.springframework.util.StringUtils{
     /**
      * 为空取值
      *

+ 4 - 4
framework/test-starter/src/main/java/com.usoftchina.saas.test/BaseControllerTest.java

@@ -41,8 +41,8 @@ public abstract class BaseControllerTest {
      * @param urlTemplate
      * @return
      */
-    public static MockHttpServletRequestBuilder get(String urlTemplate) {
-        return MockMvcRequestBuilders.get(urlTemplate);
+    public static MockHttpServletRequestBuilder get(String urlTemplate, Object... uriVars) {
+        return MockMvcRequestBuilders.get(urlTemplate, uriVars);
     }
 
     /**
@@ -51,8 +51,8 @@ public abstract class BaseControllerTest {
      * @param urlTemplate
      * @return
      */
-    public static MockHttpServletRequestBuilder post(String urlTemplate) {
-        return MockMvcRequestBuilders.post(urlTemplate);
+    public static MockHttpServletRequestBuilder post(String urlTemplate, Object... uriVars) {
+        return MockMvcRequestBuilders.post(urlTemplate, uriVars);
     }
 
     /**

+ 10 - 0
framework/test-starter/src/main/java/com.usoftchina.saas.test/TestConstant.java

@@ -13,4 +13,14 @@ public class TestConstant {
      * 默认账户ID
      */
     public static final long DEFAULT_ACCOUNT_ID = 1;
+    /**
+     * 默认应用ID
+     * <p>
+     * trade-app - 贸易云
+     * manufacture-app - 制造云
+     * solution-app - 方案云
+     * ...
+     * </p>
+     */
+    public static final String DEFAULT_APP_ID = "trade-app";
 }

+ 1 - 0
framework/test-starter/src/main/java/com.usoftchina.saas.test/TestContextListener.java

@@ -14,5 +14,6 @@ public class TestContextListener extends AbstractTestExecutionListener {
         // 设置测试环境默认用户
         BaseContextHolder.setCompanyId(TestConstant.DEFAULT_COMPANY_ID);
         BaseContextHolder.setUserId(TestConstant.DEFAULT_ACCOUNT_ID);
+        BaseContextHolder.setAppId(TestConstant.DEFAULT_APP_ID);
     }
 }

+ 117 - 16
script/mysql/init/account.sql

@@ -13,6 +13,12 @@ create table `ac_company` (
   update_time datetime
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='公司';
 
+create table `ac_company_app` (
+  company_id int unsigned not null,
+  app_id varchar(100) not null,
+  primary key(company_id, app_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='公司绑定应用';
+
 create table `ac_account` (
   id int unsigned primary key not null auto_increment,
   username varchar(100) not null comment '账号',
@@ -21,7 +27,7 @@ create table `ac_account` (
   realname varchar(100) comment '真实姓名',
   email varchar(100) comment '邮箱',
   mobile varchar(100) not null comment '手机号',
-  type int comment '账户类型 0, 1',
+  type int comment '账户类型 0 - 管理账户, 1 - 普通账户',
   enabled bool comment '是否启用',
   creator_id int unsigned,
   create_time datetime,
@@ -31,7 +37,8 @@ create table `ac_account` (
 
 create table `ac_account_company` (
   company_id int unsigned,
-  account_id int unsigned
+  account_id int unsigned,
+  primary key(company_id, account_id)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='账户绑定企业';
 
 create table `ac_role` (
@@ -39,6 +46,7 @@ create table `ac_role` (
   code varchar(100) not null comment '编号',
   name varchar(300) not null comment '名称',
   description varchar(1000) comment '描述',
+  type int comment '角色类型 0 - 管理角色, 1 - 普通角色',
   company_id int unsigned,
   creator_id int unsigned,
   create_time datetime,
@@ -48,40 +56,133 @@ create table `ac_role` (
 
 create table `ac_account_role` (
   account_id int unsigned,
-  role_id int unsigned
+  role_id int unsigned,
+  primary key(account_id, role_id)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='账户绑定角色';
 
+create table `ac_resource_module` (
+  id int unsigned primary key not null auto_increment,
+  app_id varchar(100) comment '应用',
+  name varchar(100) comment '名称'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='资源模块';
+
+create table `ac_resource_group` (
+  id int unsigned primary key not null auto_increment,
+  module_id int unsigned not null,
+  name varchar(100) comment '名称'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='资源分组';
+
 create table `ac_resource` (
   id int unsigned primary key not null auto_increment,
-  code varchar(100) not null comment '编号',
-  name varchar(300) not null comment '名称',
-  description varchar(1000) comment '描述',
+  group_id int unsigned not null,
+  name varchar(1000) comment '名称',
   type varchar(100) comment '类型 MENU,BUTTON,API',
   url varchar(300) comment 'URL',
   method varchar(10) comment 'Http Method: POST/GET/PUT/DELETE',
-  order_num int,
-  company_id int unsigned,
-  creator_id int unsigned,
-  create_time datetime,
-  updater_id int unsigned,
-  update_time datetime
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色';
+  classify varchar(30) comment '分组'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='资源';
 
 create table `ac_role_resource` (
   role_id int unsigned,
-  resource_id int unsigned
+  resource_id int unsigned,
+  primary key(role_id, resource_id)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色绑定资源';
 
+# 账号
 insert into ac_account(id,username,password,salt,realname,email,mobile,type,enabled,
                        creator_id,create_time,updater_id,update_time)
 values (1,'18888888888','3e8451e274a8ee847872194e584a4145','18888888888','Administrator',
           'admin@usoftchina.com', '18888888888', 0, 1, 1, now(), 1, now());
 
-insert into ac_company(name, business_code, address, logo_url, creator_id, create_time, updater_id, update_time)
-values ('测试账套', '000000000000000000','深圳市南山区粤海街道高新技术产业园科技南五路英唐大厦六楼',
+# 公司
+insert into ac_company(id, name, business_code, address, logo_url, creator_id, create_time, updater_id, update_time)
+values (1, '测试账套', '000000000000000000','深圳市南山区粤海街道高新技术产业园科技南五路英唐大厦六楼',
         'https://co-image.qichacha.com/CompanyImage/104eb3c232bbac93393a5e204d6a47d1.jpg?x-oss-process=style/qcc_cmp',
         1, now(), 1, now());
 
+insert into ac_company_app(company_id, app_id) values (1, 'trade-app');
 insert into ac_account_company(account_id, company_id) values (1, 1);
 
+# 角色
+insert into ac_role(id,code,name,description,type,company_id,creator_id,create_time,updater_id,update_time)
+    values (1, 'ROLE_ADMIN', '管理员', '公司管理人员,拥有所有权限', 0, 1, 1, now(), 1, now());
+insert into ac_role(id,code,name,description,type,company_id,creator_id,create_time,updater_id,update_time)
+values (2, 'ROLE_NORMAL', '普通用户', '公司普通用户', 0, 1, 1, now(), 1, now());
+insert into ac_account_role(account_id, role_id) values (1, 1);
+
+# 资源模块
+insert into ac_resource_module(id, app_id, name) values (1, 'trade-app', '采购');
+insert into ac_resource_module(id, app_id, name) values (2, 'trade-app', '销售');
+insert into ac_resource_module(id, app_id, name) values (3, 'trade-app', '库存');
+insert into ac_resource_module(id, app_id, name) values (4, 'trade-app', '资金');
+insert into ac_resource_module(id, app_id, name) values (5, 'trade-app', '资料');
+# 资源组
+insert into ac_resource_group(id, module_id, name) values (1, 1, '采购单');
+insert into ac_resource_group(id, module_id, name) values (2, 1, '采购验收单');
+insert into ac_resource_group(id, module_id, name) values (3, 1, '采购验退单');
+insert into ac_resource_group(id, module_id, name) values (4, 1, '采购询价单');
+insert into ac_resource_group(id, module_id, name) values (5, 1, '采购明细表');
+insert into ac_resource_group(id, module_id, name) values (6, 1, '采购付款一览表');
+insert into ac_resource_group(id, module_id, name) values (7, 2, '销售订单');
+insert into ac_resource_group(id, module_id, name) values (8, 2, '销售出货单');
+insert into ac_resource_group(id, module_id, name) values (9, 2, '销售退货单');
+insert into ac_resource_group(id, module_id, name) values (10, 2, '以销定购');
+insert into ac_resource_group(id, module_id, name) values (11, 2, '销售明细表');
+insert into ac_resource_group(id, module_id, name) values (12, 2, '销售收款一览表');
+insert into ac_resource_group(id, module_id, name) values (13, 2, '销售利润表');
+insert into ac_resource_group(id, module_id, name) values (14, 3, '调拨单');
+insert into ac_resource_group(id, module_id, name) values (15, 3, '制造单');
+insert into ac_resource_group(id, module_id, name) values (16, 3, '其它入库单');
+insert into ac_resource_group(id, module_id, name) values (17, 3, '其它出库单');
+insert into ac_resource_group(id, module_id, name) values (18, 3, '盘点单');
+insert into ac_resource_group(id, module_id, name) values (19, 3, '物料出入库明细表');
+insert into ac_resource_group(id, module_id, name) values (20, 3, '物料收发汇总表');
+insert into ac_resource_group(id, module_id, name) values (21, 3, '物料库存数量金额表');
+insert into ac_resource_group(id, module_id, name) values (22, 4, '付款单');
+insert into ac_resource_group(id, module_id, name) values (23, 4, '收款单');
+insert into ac_resource_group(id, module_id, name) values (24, 4, '核销单');
+insert into ac_resource_group(id, module_id, name) values (25, 4, '其它收支单');
+insert into ac_resource_group(id, module_id, name) values (26, 4, '资金转存');
+insert into ac_resource_group(id, module_id, name) values (27, 4, '供应商对账单');
+insert into ac_resource_group(id, module_id, name) values (28, 4, '应付账款明细表');
+insert into ac_resource_group(id, module_id, name) values (29, 4, '客户对账单');
+insert into ac_resource_group(id, module_id, name) values (30, 4, '应收款明细表');
+insert into ac_resource_group(id, module_id, name) values (31, 4, '资金账户余额表');
+insert into ac_resource_group(id, module_id, name) values (32, 5, '客户资料');
+insert into ac_resource_group(id, module_id, name) values (33, 5, '供应商管理');
+insert into ac_resource_group(id, module_id, name) values (34, 5, '商品管理');
+insert into ac_resource_group(id, module_id, name) values (35, 5, '仓库管理');
+insert into ac_resource_group(id, module_id, name) values (36, 5, '职员管理');
+insert into ac_resource_group(id, module_id, name) values (37, 5, '账户管理');
+insert into ac_resource_group(id, module_id, name) values (38, 5, '发货地址管理');
+insert into ac_resource_group(id, module_id, name) values (39, 5, '客户类别');
+insert into ac_resource_group(id, module_id, name) values (40, 5, '供应商类别');
+insert into ac_resource_group(id, module_id, name) values (41, 5, '商品类别');
+insert into ac_resource_group(id, module_id, name) values (42, 5, '支出类别');
+insert into ac_resource_group(id, module_id, name) values (43, 5, '收入类别');
+insert into ac_resource_group(id, module_id, name) values (44, 5, '物料品牌');
+insert into ac_resource_group(id, module_id, name) values (45, 5, '计量单位');
+insert into ac_resource_group(id, module_id, name) values (46, 5, '结算方式');
+insert into ac_resource_group(id, module_id, name) values (47, 5, '辅助属性');
+insert into ac_resource_group(id, module_id, name) values (48, 5, '客户物料编码');
+insert into ac_resource_group(id, module_id, name) values (49, 5, '单据编码规则');
+# 资源
+insert into ac_resource(id, name, group_id, type, url, method, classify) values
+  (1,'查询',1,'MENU','/api/purchase/purchase/list','GET','QUERY');
+insert into ac_resource(id, name, group_id, type, url, method, classify) values
+  (2,'新增',1,'MENU','/api/purchase/purchase/save','POST','ADD');
+insert into ac_resource(id, name, group_id, type, url, method, classify) values
+  (3,'修改',1,'BUTTON','/api/purchase/purchase/save','POST','UPDATE');
+insert into ac_resource(id, name, group_id, type, url, method, classify) values
+  (4,'审核',1,'BUTTON','/api/purchase/purchase/audit','POST','AUDIT');
+insert into ac_resource(id, name, group_id, type, url, method, classify) values
+  (5,'审核',1,'BUTTON','/api/purchase/purchase/batchAudit','POST','AUDIT');
+insert into ac_resource(id, name, group_id, type, url, method, classify) values
+  (6,'反审核',1,'BUTTON','/api/purchase/purchase/unAudit','POST','UNAUDIT');
+insert into ac_resource(id, name, group_id, type, url, method, classify) values
+  (7,'反审核',1,'BUTTON','/api/purchase/purchase/batchUnAudit','POST','UNAUDIT');
+insert into ac_resource(id, name, group_id, type, url, method, classify) values
+  (8,'删除',1,'BUTTON','/api/purchase/purchase/delete','GET','DELETE');
+insert into ac_resource(id, name, group_id, type, url, method, classify) values
+  (9,'打印',1,'BUTTON','/api/purchase/purchase/print','GET','PRINT');