Browse Source

修改gateway

yingp 7 years ago
parent
commit
8f9879382a
38 changed files with 850 additions and 113 deletions
  1. 24 11
      README.md
  2. 33 7
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/AccountDTO.java
  3. 3 3
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/AccountRegDTO.java
  4. 111 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/AuthedAccountDTO.java
  5. 48 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/CompanyBaseDTO.java
  6. 6 9
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/CompanyDTO.java
  7. 10 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/ResourcesDTO.java
  8. 67 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/RoleBaseDTO.java
  9. 70 1
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/AccountController.java
  10. 0 20
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/CompanyController.java
  11. 27 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/AccountCompanyMapper.java
  12. 17 2
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/AccountMapper.java
  13. 18 3
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/AccountRoleMapper.java
  14. 12 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/CompanyMapper.java
  15. 47 3
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/Account.java
  16. 30 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/AccountCompany.java
  17. 1 3
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/AccountRole.java
  18. 7 7
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/Company.java
  19. 41 3
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/AccountService.java
  20. 11 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/CompanyService.java
  21. 42 5
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/AccountServiceImpl.java
  22. 7 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/CompanyServiceImpl.java
  23. 44 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/vo/CompanyBaseVO.java
  24. 11 6
      base-servers/account/account-server/src/main/resources/application.yml
  25. 4 0
      base-servers/account/account-server/src/main/resources/config/application-docker.yml
  26. 10 0
      base-servers/account/account-server/src/main/resources/mapper/AccountCompanyMapper.xml
  27. 6 0
      base-servers/account/account-server/src/main/resources/mapper/AccountRoleMapper.xml
  28. 13 5
      base-servers/account/account-server/src/main/resources/mapper/CompanyMapper.xml
  29. 1 0
      base-servers/account/account-server/src/main/resources/mapper/RoleMapper.xml
  30. 2 0
      base-servers/gateway-server/src/main/java/com/usoftchina/saas/gateway/GatewayApplication.java
  31. 3 5
      base-servers/gateway-server/src/main/java/com/usoftchina/saas/gateway/config/AuthConfig.java
  32. 18 0
      base-servers/gateway-server/src/main/java/com/usoftchina/saas/gateway/config/SecurityConfig.java
  33. 2 5
      base-servers/gateway-server/src/main/java/com/usoftchina/saas/gateway/config/ZuulConfig.java
  34. 39 6
      base-servers/gateway-server/src/main/resources/application.yml
  35. 4 0
      base-servers/gateway-server/src/main/resources/config/application-docker.yml
  36. 24 0
      framework/core/src/main/java/com/usoftchina/saas/utils/BeanMapper.java
  37. 37 0
      framework/core/src/main/java/com/usoftchina/saas/utils/ListUtils.java
  38. 0 9
      script/mysql/init/ui.sql

+ 24 - 11
README.md

@@ -58,17 +58,30 @@
 │  │
 ```
 
-# 数据库
+# 开发环境
 
-> 开发环境
+> 数据库
 
-| 数据库      | 地址   |  账号  |  密码  |  说明  |
-| --------   | :-----:  | :----:  | :----: | :------  |
-| saas_account | 192.168.253.12:3306 |  root  | select111*** |  账户中心  |
-| saas_auth | 192.168.253.12:3306 |  root  | select111*** |  鉴权系统  |
-| saas_biz | 192.168.253.12:3306 |  root  | select111*** |  业务系统  |
-| saas_ui | 192.168.253.12:3306 |  root  | select111*** |  UI配置  |
-| saas_zipkin | 192.168.253.12:3306 |  root  | select111*** |  服务监控  |
+| 数据库      | 类型   | 地址   |  账号  |  密码  |  说明  |
+| --------   | :-----: | :-----:  | :----:  | :----: | :------  |
+| saas_account | mysql | 192.168.253.12:3306 |  root  | select111*** |  账户中心  |
+| saas_auth | mysql | 192.168.253.12:3306 |  root  | select111*** |  鉴权系统  |
+| saas_biz | mysql | 192.168.253.12:3306 |  root  | select111*** |  业务系统  |
+| saas_ui | mongo | 192.168.253.12:27017 |    |  |  UI配置  |
+| saas_zipkin | mysql | 192.168.253.12:3306 |  root  | select111*** |  服务监控  |
+
+> 中间件
+
+| 类型 | 地址 | 账号 | 密码 | 说明 |
+| ---- | :----: | :----: | :----: | ---- |
+| rabbit | 192.168.0.176:5672 | guest | guest | 消息中间件 |
+
+
+> 服务器
+
+
+
+> 构建
+
+[jenkins](http://192.168.0.181:8080/job/saas) **账号** admin **密码** select123***
 
-# 构建:
-[jenkins](http://192.168.0.181:8080/job/saas) **账号** admin **密码** select123***

+ 33 - 7
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/AccountDTO.java

@@ -3,6 +3,8 @@ package com.usoftchina.saas.account.dto;
 import io.swagger.annotations.ApiModel;
 
 import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
 
 /**
  * @author yingp
@@ -19,7 +21,21 @@ public class AccountDTO implements Serializable {
      * 账号类型 0 - 管理员
      */
     private Integer type;
-    private long companyId;
+    /**
+     * 所有绑定的公司
+     */
+    private List<CompanyBaseDTO> companies;
+    /**
+     * 所绑定的角色(按绑定的公司ID分组成Map)
+     */
+    private Map<Long, List<RoleBaseDTO>> rolesMap;
+
+    /**
+     * 所拥有的资源
+     *
+     * @return
+     */
+
 
     public Long getId() {
         return id;
@@ -69,23 +85,33 @@ public class AccountDTO implements Serializable {
         this.type = type;
     }
 
-    public long getCompanyId() {
-        return companyId;
+    public List<CompanyBaseDTO> getCompanies() {
+        return companies;
+    }
+
+    public void setCompanies(List<CompanyBaseDTO> companies) {
+        this.companies = companies;
+    }
+
+    public Map<Long, List<RoleBaseDTO>> getRolesMap() {
+        return rolesMap;
     }
 
-    public void setCompanyId(long companyId) {
-        this.companyId = companyId;
+    public void setRolesMap(Map<Long, List<RoleBaseDTO>> rolesMap) {
+        this.rolesMap = rolesMap;
     }
 
     @Override
     public String toString() {
         return "AccountDTO{" +
-                "username='" + username + '\'' +
+                "id=" + id +
+                ", username='" + username + '\'' +
                 ", realname='" + realname + '\'' +
                 ", email='" + email + '\'' +
                 ", mobile='" + mobile + '\'' +
                 ", type=" + type +
-                ", companyId=" + companyId +
+                ", companies=" + companies +
+                ", rolesMap=" + rolesMap +
                 '}';
     }
 }

+ 3 - 3
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/AccountRegDTO.java

@@ -19,7 +19,7 @@ public class AccountRegDTO implements Serializable {
      * 账号类型 0 - 管理员
      */
     private Integer type;
-    private long companyId;
+    private Long companyId;
 
     public String getUsername() {
         return username;
@@ -69,11 +69,11 @@ public class AccountRegDTO implements Serializable {
         this.type = type;
     }
 
-    public long getCompanyId() {
+    public Long getCompanyId() {
         return companyId;
     }
 
-    public void setCompanyId(long companyId) {
+    public void setCompanyId(Long companyId) {
         this.companyId = companyId;
     }
 

+ 111 - 0
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/AuthedAccountDTO.java

@@ -0,0 +1,111 @@
+package com.usoftchina.saas.account.dto;
+
+import io.swagger.annotations.ApiModel;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 登录账户信息
+ *
+ * @author yingp
+ * @date 2018/10/10
+ */
+@ApiModel(value = "AuthedAccount", description = "账户信息")
+public class AuthedAccountDTO implements Serializable {
+    private Long id;
+    private String username;
+    private String realname;
+    private String email;
+    private String mobile;
+    /**
+     * 账号类型 0 - 管理员
+     */
+    private Integer type;
+    /**
+     * 当前登录的公司
+     */
+    private Long companyId;
+    /**
+     * 所有绑定的公司
+     */
+    private List<CompanyBaseDTO> companies;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getRealname() {
+        return realname;
+    }
+
+    public void setRealname(String realname) {
+        this.realname = realname;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getMobile() {
+        return mobile;
+    }
+
+    public void setMobile(String mobile) {
+        this.mobile = mobile;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Long getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Long companyId) {
+        this.companyId = companyId;
+    }
+
+    public List<CompanyBaseDTO> getCompanies() {
+        return companies;
+    }
+
+    public void setCompanies(List<CompanyBaseDTO> companies) {
+        this.companies = companies;
+    }
+
+    @Override
+    public String toString() {
+        return "AuthedAccountDTO{" +
+                "id=" + id +
+                ", username='" + username + '\'' +
+                ", realname='" + realname + '\'' +
+                ", email='" + email + '\'' +
+                ", mobile='" + mobile + '\'' +
+                ", type=" + type +
+                ", companyId=" + companyId +
+                ", companies=" + companies +
+                '}';
+    }
+}

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

@@ -0,0 +1,48 @@
+package com.usoftchina.saas.account.dto;
+
+import java.io.Serializable;
+
+/**
+ * 公司基础信息
+ *
+ * @author yingp
+ * @date 2018/10/10
+ */
+public class CompanyBaseDTO implements Serializable{
+    private Long id;
+    private String name;
+    private String logoUrl;
+
+    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 getLogoUrl() {
+        return logoUrl;
+    }
+
+    public void setLogoUrl(String logoUrl) {
+        this.logoUrl = logoUrl;
+    }
+
+    @Override
+    public String toString() {
+        return "CompanyBaseDTO{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                ", logoUrl='" + logoUrl + '\'' +
+                '}';
+    }
+}

+ 6 - 9
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/CompanyDTO.java

@@ -19,10 +19,7 @@ public class CompanyDTO implements Serializable{
      */
     private String businessCode;
     private String address;
-    /**
-     * 二级域名
-     */
-    private String domain;
+    private String logoUrl;
 
     public String getName() {
         return name;
@@ -48,12 +45,12 @@ public class CompanyDTO implements Serializable{
         this.address = address;
     }
 
-    public String getDomain() {
-        return domain;
+    public String getLogoUrl() {
+        return logoUrl;
     }
 
-    public void setDomain(String domain) {
-        this.domain = domain;
+    public void setLogoUrl(String logoUrl) {
+        this.logoUrl = logoUrl;
     }
 
     @Override
@@ -62,7 +59,7 @@ public class CompanyDTO implements Serializable{
                 "name='" + name + '\'' +
                 ", businessCode='" + businessCode + '\'' +
                 ", address='" + address + '\'' +
-                ", domain='" + domain + '\'' +
+                ", logoUrl='" + logoUrl + '\'' +
                 '}';
     }
 }

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

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

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

@@ -0,0 +1,67 @@
+package com.usoftchina.saas.account.dto;
+
+import java.io.Serializable;
+
+/**
+ * 角色基本信息
+ *
+ * @author yingp
+ * @date 2018/10/10
+ */
+public class RoleBaseDTO implements Serializable{
+    private Long id;
+    /**
+     * 公司
+     */
+    private Long companyId;
+    /**
+     * 角色编码
+     */
+    private String code;
+    /**
+     * 角色名称
+     */
+    private String name;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    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;
+    }
+
+    @Override
+    public String toString() {
+        return "RoleBaseDTO{" +
+                "id=" + id +
+                ", companyId=" + companyId +
+                ", code='" + code + '\'' +
+                ", name='" + name + '\'' +
+                '}';
+    }
+}

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

@@ -2,8 +2,11 @@ package com.usoftchina.saas.account.controller;
 
 import com.usoftchina.saas.account.dto.AccountDTO;
 import com.usoftchina.saas.account.dto.AccountRegDTO;
+import com.usoftchina.saas.account.dto.CompanyBaseDTO;
 import com.usoftchina.saas.account.po.Account;
 import com.usoftchina.saas.account.service.AccountService;
+import com.usoftchina.saas.account.service.CompanyService;
+import com.usoftchina.saas.account.vo.CompanyBaseVO;
 import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.exception.ExceptionCode;
 import com.usoftchina.saas.utils.BeanMapper;
@@ -11,6 +14,8 @@ import com.usoftchina.saas.utils.RegexpUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * @author yingp
  * @date 2018/10/2
@@ -22,6 +27,9 @@ public class AccountController {
     @Autowired
     private AccountService accountService;
 
+    @Autowired
+    private CompanyService companyService;
+
     /**
      * 注册
      *
@@ -71,7 +79,12 @@ public class AccountController {
             return Result.error(ExceptionCode.USER_PWD_ERROR);
         }
 
-        return Result.success();
+        AccountDTO accountDTO = BeanMapper.map(account, AccountDTO.class);
+        // 绑定的公司
+        List<CompanyBaseVO> companyBaseVOS = companyService.findBaseByAccountId(account.getId());
+        accountDTO.setCompanies(BeanMapper.mapList(companyBaseVOS, CompanyBaseDTO.class));
+
+        return Result.success(accountDTO);
     }
 
     private Account getAccountByUsername(String username) {
@@ -100,6 +113,62 @@ public class AccountController {
         }
 
         AccountDTO accountDTO = BeanMapper.map(account, AccountDTO.class);
+        // 绑定的公司
+        List<CompanyBaseVO> companyBaseVOS = companyService.findBaseByAccountId(account.getId());
+        accountDTO.setCompanies(BeanMapper.mapList(companyBaseVOS, CompanyBaseDTO.class));
+
         return Result.success(accountDTO);
     }
+
+    /**
+     * 个人账户绑定公司
+     *
+     * @param accountId
+     * @param companyId
+     * @return
+     */
+    @PostMapping("/bind/company")
+    public Result bindCompany(@RequestParam long accountId, @RequestParam long companyId) {
+        accountService.bindCompany(accountId, companyId);
+        return Result.success();
+    }
+
+    /**
+     * 解除个人账户绑定公司
+     *
+     * @param accountId
+     * @param companyId
+     * @return
+     */
+    @PostMapping("/unbind/company")
+    public Result unbindCompany(@RequestParam long accountId, @RequestParam long companyId) {
+        accountService.unbindCompany(accountId, companyId);
+        return Result.success();
+    }
+
+    /**
+     * 个人账户绑定角色
+     *
+     * @param accountId
+     * @param roleId
+     * @return
+     */
+    @PostMapping("/bind/role")
+    public Result bindRole(@RequestParam long accountId, @RequestParam long roleId) {
+        accountService.bindRole(accountId, roleId);
+        return Result.success();
+    }
+
+    /**
+     * 解除个人账户绑定角色
+     *
+     * @param accountId
+     * @param roleId
+     * @return
+     */
+    @PostMapping("/unbind/role")
+    public Result unbindRole(@RequestParam long accountId, @RequestParam long roleId) {
+        accountService.unbindRole(accountId, roleId);
+        return Result.success();
+    }
 }

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

@@ -37,10 +37,6 @@ public class CompanyController {
         if (null != company) {
             return Result.error(ExceptionCode.COMPANY_CODE_EXIST);
         }
-        company = companyService.findByDomain(companyDTO.getDomain());
-        if (null != company) {
-            return Result.error(ExceptionCode.COMPANY_DOMAIN_EXIST);
-        }
 
         company = BeanMapper.map(companyDTO, Company.class);
         companyService.save(company);
@@ -79,20 +75,4 @@ public class CompanyController {
         }
         return Result.error(ExceptionCode.COMPANY_NOT_EXIST);
     }
-
-    /**
-     * 按二级域名查找
-     *
-     * @param domain
-     * @return
-     */
-    @GetMapping(params = "domain")
-    public Result<CompanyDTO> getByDomain(@RequestParam String domain) {
-        Company company = companyService.findByDomain(domain);
-        if (null != company) {
-            CompanyDTO companyDTO = BeanMapper.map(company, CompanyDTO.class);
-            return Result.success(companyDTO);
-        }
-        return Result.error(ExceptionCode.COMPANY_NOT_EXIST);
-    }
 }

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

@@ -0,0 +1,27 @@
+package com.usoftchina.saas.account.mapper;
+
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @author yingp
+ * @date 2018/10/10
+ */
+public interface AccountCompanyMapper {
+
+    /**
+     * 新增
+     *
+     * @param accountId
+     * @param companyId
+     * @return
+     */
+    int insert(@Param("accountId") Long accountId, @Param("companyId") Long companyId);
+
+    /**
+     * 删除
+     *
+     * @param accountId
+     * @param companyId
+     */
+    void delete(@Param("accountId") Long accountId, @Param("companyId") Long companyId);
+}

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

@@ -1,14 +1,29 @@
 package com.usoftchina.saas.account.mapper;
 
 import com.usoftchina.saas.account.po.Account;
-import com.usoftchina.saas.base.mapper.CommonBaseMapper;
 import org.apache.ibatis.annotations.Param;
 
 /**
  * @author yingp
  * @date 2018/10/2
  */
-public interface AccountMapper extends CommonBaseMapper<Account> {
+public interface AccountMapper {
+    /**
+     * 新增
+     *
+     * @param account
+     * @return
+     */
+    int insert(Account account);
+
+    /**
+     * 保存非空数据
+     *
+     * @param account
+     * @return
+     */
+    int insertSelective(Account account);
+
     /**
      * 按用户名查找
      *

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

@@ -1,11 +1,26 @@
 package com.usoftchina.saas.account.mapper;
 
-import com.usoftchina.saas.account.po.AccountRole;
-import com.usoftchina.saas.base.mapper.CommonBaseMapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * @author yingp
  * @date 2018/10/2
  */
-public interface AccountRoleMapper extends CommonBaseMapper<AccountRole> {
+public interface AccountRoleMapper {
+    /**
+     * 新增
+     *
+     * @param accountId
+     * @param roleId
+     * @return
+     */
+    int insert(@Param("accountId") Long accountId, @Param("roleId") Long roleId);
+
+    /**
+     * 删除
+     *
+     * @param accountId
+     * @param roleId
+     */
+    void delete(@Param("accountId") Long accountId, @Param("roleId") Long roleId);
 }

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

@@ -1,8 +1,11 @@
 package com.usoftchina.saas.account.mapper;
 
 import com.usoftchina.saas.account.po.Company;
+import com.usoftchina.saas.account.vo.CompanyBaseVO;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * @author yingp
  * @date 2018/10/2
@@ -23,6 +26,7 @@ public interface CompanyMapper {
      * @return
      */
     int insertSelective(Company record);
+
     /**
      * 按名称查询
      *
@@ -46,4 +50,12 @@ public interface CompanyMapper {
      * @return
      */
     Company selectByDomain(@Param("domain") String domain);
+
+    /**
+     * 按个人账户ID查找全部绑定企业基础信息
+     *
+     * @param accountId
+     * @return
+     */
+    List<CompanyBaseVO> selectBaseByAccountId(@Param("accountId") Long accountId);
 }

+ 47 - 3
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/Account.java

@@ -1,8 +1,7 @@
 package com.usoftchina.saas.account.po;
 
-import com.usoftchina.saas.base.entity.CommonBaseEntity;
-
 import java.io.Serializable;
+import java.util.Date;
 
 /**
  * 账号
@@ -10,7 +9,8 @@ import java.io.Serializable;
  * @author yingp
  * @date 2018/10/2
  */
-public class Account extends CommonBaseEntity implements Serializable {
+public class Account implements Serializable {
+    private Long id;
     private String username;
     private String password;
     private String salt;
@@ -21,6 +21,10 @@ public class Account extends CommonBaseEntity implements Serializable {
      * 账号类型 0 - 管理员
      */
     private Integer type;
+    protected Date createTime;
+    protected long creatorId;
+    protected Date updateTime;
+    protected long updaterId;
 
     public String getUsername() {
         return username;
@@ -77,4 +81,44 @@ public class Account extends CommonBaseEntity implements Serializable {
     public void setType(Integer type) {
         this.type = type;
     }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public long getCreatorId() {
+        return creatorId;
+    }
+
+    public void setCreatorId(long creatorId) {
+        this.creatorId = creatorId;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public long getUpdaterId() {
+        return updaterId;
+    }
+
+    public void setUpdaterId(long updaterId) {
+        this.updaterId = updaterId;
+    }
 }

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

@@ -0,0 +1,30 @@
+package com.usoftchina.saas.account.po;
+
+import java.io.Serializable;
+
+/**
+ * 企业、个人 多对多关系
+ *
+ * @author yingp
+ * @date 2018/10/10
+ */
+public class AccountCompany implements Serializable {
+    private Long accountId;
+    private Long companyId;
+
+    public Long getAccountId() {
+        return accountId;
+    }
+
+    public void setAccountId(Long accountId) {
+        this.accountId = accountId;
+    }
+
+    public Long getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Long companyId) {
+        this.companyId = companyId;
+    }
+}

+ 1 - 3
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/AccountRole.java

@@ -1,7 +1,5 @@
 package com.usoftchina.saas.account.po;
 
-import com.usoftchina.saas.base.entity.CommonBaseEntity;
-
 import java.io.Serializable;
 
 /**
@@ -10,7 +8,7 @@ import java.io.Serializable;
  * @author yingp
  * @date 2018/10/2
  */
-public class AccountRole extends CommonBaseEntity implements Serializable {
+public class AccountRole implements Serializable {
     private long accountId;
     private long roleId;
 

+ 7 - 7
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/Company.java

@@ -10,7 +10,7 @@ import java.util.Date;
  * @date 2018/10/2
  */
 public class Company implements Serializable {
-    protected Long id;
+    private Long id;
     /**
      * 唯一名称
      */
@@ -21,9 +21,9 @@ public class Company implements Serializable {
     private String businessCode;
     private String address;
     /**
-     * 二级域名
+     * 企业logo
      */
-    private String domain;
+    private String logoUrl;
     protected Date createTime;
     protected long creatorId;
     protected Date updateTime;
@@ -53,12 +53,12 @@ public class Company implements Serializable {
         this.address = address;
     }
 
-    public String getDomain() {
-        return domain;
+    public String getLogoUrl() {
+        return logoUrl;
     }
 
-    public void setDomain(String domain) {
-        this.domain = domain;
+    public void setLogoUrl(String logoUrl) {
+        this.logoUrl = logoUrl;
     }
 
     public Long getId() {

+ 41 - 3
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/AccountService.java

@@ -1,14 +1,20 @@
 package com.usoftchina.saas.account.service;
 
-import com.usoftchina.saas.account.mapper.AccountMapper;
 import com.usoftchina.saas.account.po.Account;
-import com.usoftchina.saas.base.service.CommonBaseService;
 
 /**
  * @author yingp
  * @date 2018/10/2
  */
-public interface AccountService extends CommonBaseService<AccountMapper, Account> {
+public interface AccountService {
+    /**
+     * 保存
+     *
+     * @param account
+     * @return
+     */
+    boolean save(Account account);
+
     /**
      * 按用户名查找
      *
@@ -51,4 +57,36 @@ public interface AccountService extends CommonBaseService<AccountMapper, Account
      */
     String getEncryptedPassword(String plainPassword, String salt);
 
+    /**
+     * 绑定个人账号与公司
+     *
+     * @param accountId
+     * @param companyId
+     */
+    void bindCompany(Long accountId, Long companyId);
+
+    /**
+     * 解除个人账号与公司的绑定
+     *
+     * @param accountId
+     * @param companyId
+     */
+    void unbindCompany(Long accountId, Long companyId);
+
+    /**
+     * 绑定个人账号与角色
+     *
+     * @param accountId
+     * @param roleId
+     */
+    void bindRole(Long accountId, Long roleId);
+
+    /**
+     * 解除个人账号与角色的绑定
+     *
+     * @param accountId
+     * @param roleId
+     */
+    void unbindRole(Long accountId, Long roleId);
+
 }

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

@@ -1,6 +1,9 @@
 package com.usoftchina.saas.account.service;
 
 import com.usoftchina.saas.account.po.Company;
+import com.usoftchina.saas.account.vo.CompanyBaseVO;
+
+import java.util.List;
 
 /**
  * @author yingp
@@ -38,4 +41,12 @@ public interface CompanyService {
      * @return
      */
     Company findByDomain(String domain);
+
+    /**
+     * 按个人账户查找全部绑定企业
+     *
+     * @param accountId
+     * @return
+     */
+    List<CompanyBaseVO> findBaseByAccountId(Long accountId);
 }

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

@@ -1,9 +1,11 @@
 package com.usoftchina.saas.account.service.impl;
 
+import com.usoftchina.saas.account.mapper.AccountCompanyMapper;
 import com.usoftchina.saas.account.mapper.AccountMapper;
+import com.usoftchina.saas.account.mapper.AccountRoleMapper;
 import com.usoftchina.saas.account.po.Account;
 import com.usoftchina.saas.account.service.AccountService;
-import com.usoftchina.saas.base.service.CommonBaseServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.DigestUtils;
 
@@ -12,20 +14,35 @@ import org.springframework.util.DigestUtils;
  * @date 2018/10/2
  */
 @Service
-public class AccountServiceImpl extends CommonBaseServiceImpl<AccountMapper, Account> implements AccountService {
+public class AccountServiceImpl implements AccountService {
+
+    @Autowired
+    private AccountMapper accountMapper;
+
+    @Autowired
+    private AccountCompanyMapper accountCompanyMapper;
+
+    @Autowired
+    private AccountRoleMapper accountRoleMapper;
+
+    @Override
+    public boolean save(Account account) {
+        return accountMapper.insert(account) > 0;
+    }
+
     @Override
     public Account findByUsername(String username) {
-        return getMapper().selectByUsername(username);
+        return accountMapper.selectByUsername(username);
     }
 
     @Override
     public Account findByMobile(String mobile) {
-        return getMapper().selectByMobile(mobile);
+        return accountMapper.selectByMobile(mobile);
     }
 
     @Override
     public Account findByEmail(String email) {
-        return getMapper().selectByEmail(email);
+        return accountMapper.selectByEmail(email);
     }
 
     @Override
@@ -44,4 +61,24 @@ public class AccountServiceImpl extends CommonBaseServiceImpl<AccountMapper, Acc
     public String getEncryptedPassword(String plainPassword, String salt) {
         return DigestUtils.md5DigestAsHex(String.format("%s{%s}", plainPassword, salt).getBytes());
     }
+
+    @Override
+    public void bindCompany(Long accountId, Long companyId) {
+        accountCompanyMapper.insert(accountId, companyId);
+    }
+
+    @Override
+    public void unbindCompany(Long accountId, Long companyId) {
+        accountCompanyMapper.delete(accountId, companyId);
+    }
+
+    @Override
+    public void bindRole(Long accountId, Long roleId) {
+        accountRoleMapper.insert(accountId, roleId);
+    }
+
+    @Override
+    public void unbindRole(Long accountId, Long roleId) {
+        accountRoleMapper.delete(accountId, roleId);
+    }
 }

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

@@ -3,11 +3,13 @@ package com.usoftchina.saas.account.service.impl;
 import com.usoftchina.saas.account.mapper.CompanyMapper;
 import com.usoftchina.saas.account.po.Company;
 import com.usoftchina.saas.account.service.CompanyService;
+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 java.util.Date;
+import java.util.List;
 
 /**
  * @author yingp
@@ -44,4 +46,9 @@ public class CompanyServiceImpl implements CompanyService{
     public Company findByDomain(String domain) {
         return companyMapper.selectByDomain(domain);
     }
+
+    @Override
+    public List<CompanyBaseVO> findBaseByAccountId(Long accountId) {
+        return companyMapper.selectBaseByAccountId(accountId);
+    }
 }

+ 44 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/vo/CompanyBaseVO.java

@@ -0,0 +1,44 @@
+package com.usoftchina.saas.account.vo;
+
+/**
+ * @author yingp
+ * @date 2018/10/10
+ */
+public class CompanyBaseVO {
+    private Long id;
+    private String name;
+    private String logoUrl;
+
+    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 getLogoUrl() {
+        return logoUrl;
+    }
+
+    public void setLogoUrl(String logoUrl) {
+        this.logoUrl = logoUrl;
+    }
+
+    @Override
+    public String toString() {
+        return "CompanyBaseVO{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                ", logoUrl='" + logoUrl + '\'' +
+                '}';
+    }
+}

+ 11 - 6
base-servers/account/account-server/src/main/resources/application.yml

@@ -6,11 +6,16 @@ spring:
       name: admin
       password: select111***
   datasource:
+    driver-class-name: com.mysql.jdbc.Driver
+    url: jdbc:mysql://192.168.253.12:3306/saas_account?characterEncoding=utf-8&useSSL=false
+    username: root
+    password: select111***
     hikari:
-      driver-class-name: com.mysql.cj.jdbc.Driver
-      jdbc-url: jdbc:mysql://192.168.253.12:3306/saas_account?characterEncoding=utf-8&useSSL=false
-      username: root
-      password: select111***
+      minimum-idle: 5
+      maximum-pool-size: 50
+      idle-timeout: 30000
+      max-lifetime: 1800000
+      connection-timeout: 30000
   messages:
     basename: i18n/messages
 eureka:
@@ -24,7 +29,7 @@ eureka:
   client:
     registryFetchIntervalSeconds: 5
     serviceUrl:
-      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:8500/eureka/
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@192.168.0.181:8500/eureka/
 server:
   port: 8580
   tomcat:
@@ -36,5 +41,5 @@ info:
   spring-boot-version: '@spring.boot.version@'
   spring-cloud-version: '@spring.cloud.version@'
 mybatis:
-  type-aliases-package: com.usoftchina.saas.account.po
+  type-aliases-package: com.usoftchina.saas.account.po,com.usoftchina.saas.account.vo
   mapper-locations: classpath:mapper/*.xml

+ 4 - 0
base-servers/account/account-server/src/main/resources/config/application-docker.yml

@@ -0,0 +1,4 @@
+eureka:
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server:8500/eureka/

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

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.usoftchina.saas.account.mapper.AccountCompanyMapper">
+    <insert id="insert">
+        insert into ac_account_company(account_id,company_id) values (#{accountId}, #{companyId})
+    </insert>
+    <delete id="delete">
+        delete from ac_account_company where account_id=#{accountId} and companyId=#{companyId}
+    </delete>
+</mapper>

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

@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 <mapper namespace="com.usoftchina.saas.account.mapper.AccountRoleMapper">
+    <insert id="insert">
+        insert into ac_account_role(account_id,role_id) values (#{accountId}, #{roleId})
+    </insert>
+    <delete id="delete">
+        delete from ac_account_role where account_id=#{accountId} and role_id=#{roleId}
+    </delete>
 </mapper>

+ 13 - 5
base-servers/account/account-server/src/main/resources/mapper/CompanyMapper.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 <mapper namespace="com.usoftchina.saas.account.mapper.CompanyMapper">
-    <resultMap id="BaseResultMap" type="com.usoftchina.saas.account.po.Company">
+    <resultMap id="FullResultMap" type="com.usoftchina.saas.account.po.Company">
         <id column="id" jdbcType="BIGINT" property="id"/>
         <result column="name" jdbcType="VARCHAR" property="name"/>
         <result column="business_code" jdbcType="VARCHAR" property="businessCode"/>
@@ -12,6 +12,11 @@
         <result column="updater_id" jdbcType="BIGINT" property="updaterId"/>
         <result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
     </resultMap>
+    <resultMap id="BaseResultMap" type="com.usoftchina.saas.account.vo.CompanyBaseVO">
+        <id column="id" jdbcType="BIGINT" property="id"/>
+        <result column="name" jdbcType="VARCHAR" property="name"/>
+        <result column="logo_url" jdbcType="VARCHAR" property="logoUrl"/>
+    </resultMap>
     <sql id="baseColumns">
         id,name,business_code,address,domain,creator_id,create_time,updater_id,update_time
     </sql>
@@ -76,14 +81,17 @@
             </if>
         </trim>
     </insert>
-    <select id="selectByName" parameterType="java.lang.String" resultMap="BaseResultMap">
+    <select id="selectByName" parameterType="java.lang.String" resultMap="FullResultMap">
         select <include refid="baseColumns"/> from ac_company where name=#{name}
     </select>
-    <select id="selectByBusinessCode" parameterType="java.lang.String" resultMap="BaseResultMap">
+    <select id="selectByBusinessCode" parameterType="java.lang.String" resultMap="FullResultMap">
         select <include refid="baseColumns"/> from ac_company where business_code=#{businessCode}
     </select>
-    <select id="selectByDomain" parameterType="java.lang.String" resultMap="BaseResultMap">
+    <select id="selectByDomain" parameterType="java.lang.String" resultMap="FullResultMap">
         select <include refid="baseColumns"/> from ac_company where domain=#{domain}
     </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}
+    </select>
 </mapper>

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

@@ -1,4 +1,5 @@
 <?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">
+
 </mapper>

+ 2 - 0
base-servers/gateway-server/src/main/java/com/usoftchina/saas/gateway/GatewayApplication.java

@@ -4,6 +4,7 @@ import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
 import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
+import org.springframework.cloud.openfeign.EnableFeignClients;
 
 /**
  * @author yingp
@@ -12,6 +13,7 @@ import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
 @SpringBootApplication
 @EnableZuulProxy
 @EnableEurekaClient
+@EnableFeignClients(basePackages = "com.usoftchina.saas.auth.api")
 public class GatewayApplication {
     public static void main(String[] args) {
         SpringApplication.run(GatewayApplication.class, args);

+ 3 - 5
base-servers/gateway-server/src/main/java/com/usoftchina/saas/gateway/config/AuthConfig.java

@@ -1,6 +1,6 @@
 package com.usoftchina.saas.gateway.config;
 
-import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
 
 import java.util.List;
 
@@ -8,12 +8,10 @@ import java.util.List;
  * @author yingp
  * @date 2018/10/2
  */
+@ConfigurationProperties("auth")
 public class AuthConfig {
-    @Value("${auth.public-key}")
     private String publicKey;
-    @Value("${auth.header:Authorization}")
-    private String authHeader;
-    @Value("${auth.ignore}")
+    private String authHeader = "Authorization";
     private List<String> ignores;
 
     public String getPublicKey() {

+ 18 - 0
base-servers/gateway-server/src/main/java/com/usoftchina/saas/gateway/config/SecurityConfig.java

@@ -0,0 +1,18 @@
+package com.usoftchina.saas.gateway.config;
+
+import org.springframework.security.config.annotation.web.builders.WebSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+
+/**
+ * @author yingp
+ * @date 2018/10/10
+ */
+@EnableWebSecurity
+public class SecurityConfig extends WebSecurityConfigurerAdapter {
+
+    @Override
+    public void configure(WebSecurity web) throws Exception {
+        web.ignoring().antMatchers("/api/**");
+    }
+}

+ 2 - 5
base-servers/gateway-server/src/main/java/com/usoftchina/saas/gateway/config/ZuulConfig.java

@@ -1,5 +1,6 @@
 package com.usoftchina.saas.gateway.config;
 
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.web.cors.CorsConfiguration;
@@ -11,6 +12,7 @@ import org.springframework.web.filter.CorsFilter;
  * @date 2018/9/30
  */
 @Configuration
+@EnableConfigurationProperties(AuthConfig.class)
 public class ZuulConfig {
 
     @Bean
@@ -38,11 +40,6 @@ public class ZuulConfig {
         return new CorsFilter(source);
     }
 
-    @Bean
-    public AuthConfig authConfig() {
-        return new AuthConfig();
-    }
-
     @Bean
     public AccessFilter accessFilter() {
         return new AccessFilter();

+ 39 - 6
base-servers/gateway-server/src/main/resources/application.yml

@@ -1,14 +1,14 @@
 spring:
   application:
     name: gateway-server
-  security:
-    user:
-      name: admin
-      password: select111***
   servlet:
     multipart:
       max-file-size: 2000Mb
       max-request-size: 2500Mb
+  security:
+    user:
+      name: admin
+      password: select111***
   rabbitmq:
     host: 192.168.0.176
     port: 5672
@@ -36,7 +36,38 @@ eureka:
   client:
     registryFetchIntervalSeconds: 5
     serviceUrl:
-      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:8500/eureka/
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@192.168.0.181:8500/eureka/
+feign:
+  compression:
+    request:
+      enabled: true
+      mime-types: text/xml,application/xml,application/json
+      min-request-size: 2048
+    response:
+      enabled: true
+zuul:
+  ignored-services: "*"   # 忽略eureka上的所有服务
+  sensitive-headers:      # 一些比较敏感的请求头,不想通过zuul传递过去, 可以通过该属性进行设置
+  prefix: /api            # 公共的前缀
+  routes:  # 路由配置
+    ui:
+      path: /ui/**
+      serviceId: ui-server
+    account:
+      path: /account/**
+      serviceId: account-server
+    auth:
+      path: /auth/**
+      serviceId: auth-server
+    file:
+      path: /file/**
+      serviceId: file-server
+    mail:
+      path: /mail/**
+      serviceId: mail-server
+    sms:
+      path: /sms/**
+      serviceId: sms-server
 info:
   name: '@project.artifactId@'
   description: '@project.description@'
@@ -45,5 +76,7 @@ info:
   spring-cloud-version: '@spring.cloud.version@'
 auth:
   public-key: auth/pub.key
-  ignore:
+  ignores:
     - /api/auth
+    # 忽略全部
+    - /

+ 4 - 0
base-servers/gateway-server/src/main/resources/config/application-docker.yml

@@ -0,0 +1,4 @@
+eureka:
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server:8500/eureka/

+ 24 - 0
framework/core/src/main/java/com/usoftchina/saas/utils/BeanMapper.java

@@ -1,6 +1,11 @@
 package com.usoftchina.saas.utils;
 
 import org.springframework.beans.BeanUtils;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
 
 /**
  * @author yingp
@@ -26,4 +31,23 @@ public class BeanMapper {
             return null;
         }
     }
+
+    /**
+     * 集合对象属性复制
+     *
+     * @param source
+     * @param targetCls
+     * @param <T>
+     * @return
+     */
+    public static <T> List<T> mapList(Collection source, Class<T> targetCls) {
+        if (!CollectionUtils.isEmpty(source)) {
+            List<T> targets = new ArrayList<>(source.size());
+            source.forEach(s -> {
+                targets.add(map(s, targetCls));
+            });
+            return targets;
+        }
+        return null;
+    }
 }

+ 37 - 0
framework/core/src/main/java/com/usoftchina/saas/utils/ListUtils.java

@@ -0,0 +1,37 @@
+package com.usoftchina.saas.utils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+
+/**
+ * @author yingp
+ * @date 2018/10/10
+ */
+public class ListUtils {
+    /**
+     * 按指定方法,将list分组返回map
+     *
+     * @param sources
+     * @param keyGetter
+     * @param <K>
+     * @param <V>
+     * @return
+     */
+    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);
+            }
+        });
+        return map;
+    }
+}

+ 0 - 9
script/mysql/init/ui.sql

@@ -1,9 +0,0 @@
-CREATE DATABASE `saas_ui` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
-use `saas_ui`;
-
-create table `ui_component`(
-  id int unsigned primary key not null auto_increment,
-  parent_id varchar(100),
-  description varchar(500) not null,
-  config json not null
-);