Browse Source

代码初始化导入

chenw 6 years ago
parent
commit
48d3f812b4
60 changed files with 2567 additions and 0 deletions
  1. 35 0
      base-servers/account/account-api/pom.xml
  2. 21 0
      base-servers/account/account-api/src/main/java/com/usoftchina/smartschool/account/api/AccountApi.java
  3. 16 0
      base-servers/account/account-dto/pom.xml
  4. 58 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/smartschool/account/dto/AccountDTO.java
  5. 59 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/smartschool/account/dto/AccountRegDTO.java
  6. 72 0
      base-servers/account/account-server/pom.xml
  7. 6 0
      base-servers/account/account-server/src/main/docker/Dockerfile
  8. 22 0
      base-servers/account/account-server/src/main/java/com/usoftchina/smartschool/account/AccountApplication.java
  9. 95 0
      base-servers/account/account-server/src/main/java/com/usoftchina/smartschool/account/controller/AccountController.java
  10. 51 0
      base-servers/account/account-server/src/main/java/com/usoftchina/smartschool/account/mapper/AccountMapper.java
  11. 15 0
      base-servers/account/account-server/src/main/java/com/usoftchina/smartschool/account/mapper/AccountRoleMapper.java
  12. 54 0
      base-servers/account/account-server/src/main/java/com/usoftchina/smartschool/account/po/Account.java
  13. 59 0
      base-servers/account/account-server/src/main/java/com/usoftchina/smartschool/account/service/AccountService.java
  14. 67 0
      base-servers/account/account-server/src/main/java/com/usoftchina/smartschool/account/service/impl/AccountServiceImpl.java
  15. 91 0
      base-servers/account/account-server/src/main/resources/application.yml
  16. 52 0
      base-servers/account/account-server/src/main/resources/mapper/AccountMapper.xml
  17. 17 0
      base-servers/account/account-server/src/main/resources/mapper/AccountRoleMapper.xml
  18. 6 0
      base-servers/account/pom.xml
  19. 17 0
      base-servers/auth/auth-api/pom.xml
  20. 60 0
      base-servers/auth/auth-dto/pom.xml
  21. 46 0
      base-servers/auth/auth-dto/src/main/java/com/usoftchina/smartschool/auth/dto/AuthDTO.java
  22. 45 0
      base-servers/auth/auth-dto/src/main/java/com/usoftchina/smartschool/auth/dto/TokenDTO.java
  23. 102 0
      base-servers/auth/auth-dto/src/main/java/com/usoftchina/smartschool/auth/jwt/JwtHelper.java
  24. 56 0
      base-servers/auth/auth-dto/src/main/java/com/usoftchina/smartschool/auth/jwt/JwtInfo.java
  25. 65 0
      base-servers/auth/auth-dto/src/main/java/com/usoftchina/smartschool/auth/jwt/JwtToken.java
  26. 77 0
      base-servers/auth/auth-server/pom.xml
  27. 6 0
      base-servers/auth/auth-server/src/main/docker/Dockerfile
  28. 19 0
      base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/AuthApplication.java
  29. 65 0
      base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/controller/AuthController.java
  30. 47 0
      base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/dto/AuthorizeLogDTO.java
  31. 37 0
      base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/mapper/AuthorizeLogMapper.java
  32. 117 0
      base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/po/AuthorizeLog.java
  33. 117 0
      base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/po/VirtualAuthorizeLog.java
  34. 68 0
      base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/service/AuthorizeCountService.java
  35. 36 0
      base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/service/AuthorizeLogService.java
  36. 48 0
      base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/service/impl/AuthorizeLogServiceImpl.java
  37. 88 0
      base-servers/auth/auth-server/src/main/resources/application.yml
  38. BIN
      base-servers/auth/auth-server/src/main/resources/auth/pri.key
  39. BIN
      base-servers/auth/auth-server/src/main/resources/auth/pub.key
  40. 22 0
      base-servers/auth/pom.xml
  41. 1 0
      base-servers/pom.xml
  42. 6 0
      base-servers/sms/pom.xml
  43. 51 0
      base-servers/sms/sms-api/pom.xml
  44. 18 0
      base-servers/sms/sms-api/src/main/java/com/usoftchina/smartschool/sms/api/SmsApi.java
  45. 85 0
      base-servers/sms/sms-api/src/main/java/com/usoftchina/smartschool/sms/cache/SmsCache.java
  46. 17 0
      base-servers/sms/sms-dto/pom.xml
  47. 55 0
      base-servers/sms/sms-dto/src/main/java/com/usoftchina/smartschool/sms/dto/SmsDTO.java
  48. 104 0
      base-servers/sms/sms-server/pom.xml
  49. 6 0
      base-servers/sms/sms-server/src/main/docker/Dockerfile
  50. 19 0
      base-servers/sms/sms-server/src/main/java/com/usoftchina/smartschool/sms/SmsApplication.java
  51. 45 0
      base-servers/sms/sms-server/src/main/java/com/usoftchina/smartschool/sms/config/SmsConfig.java
  52. 37 0
      base-servers/sms/sms-server/src/main/java/com/usoftchina/smartschool/sms/controller/SmsController.java
  53. 17 0
      base-servers/sms/sms-server/src/main/java/com/usoftchina/smartschool/sms/service/SmsService.java
  54. 47 0
      base-servers/sms/sms-server/src/main/java/com/usoftchina/smartschool/sms/service/impl/SmsServiceImpl.java
  55. 68 0
      base-servers/sms/sms-server/src/main/resources/application.yml
  56. BIN
      base-servers/sms/sms-server/src/main/resources/auth/pub.key
  57. 12 0
      base-servers/sms/sms-server/src/main/resources/config/application-docker-dev.yml
  58. 23 0
      base-servers/sms/sms-server/src/main/resources/config/application-docker-prod.yml
  59. 12 0
      base-servers/sms/sms-server/src/main/resources/config/application-docker-test.yml
  60. 10 0
      base-servers/sms/sms-server/src/main/resources/config/application-docker.yml

+ 35 - 0
base-servers/account/account-api/pom.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>account</artifactId>
+    <groupId>com.usoftchina.smartschool</groupId>
+    <version>1.0.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.usoftchina.smartschool</groupId>
+  <artifactId>account-api</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.springframework.cloud</groupId>
+      <artifactId>spring-cloud-starter-openfeign</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.usoftchina.smartschool</groupId>
+      <artifactId>account-dto</artifactId>
+      <version>1.0.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>com.usoftchina.smartschool</groupId>
+      <artifactId>core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-data-redis</artifactId>
+    </dependency>
+  </dependencies>
+</project>

+ 21 - 0
base-servers/account/account-api/src/main/java/com/usoftchina/smartschool/account/api/AccountApi.java

@@ -0,0 +1,21 @@
+package com.usoftchina.smartschool.account.api;
+
+import com.usoftchina.smartschool.account.dto.AccountDTO;
+import com.usoftchina.smartschool.base.Result;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * @Author chenwei
+ * @Date 2019/01/22
+ */
+@FeignClient(name = "account-server")
+public interface AccountApi {
+
+    @GetMapping(value = "/account/read", params = "mobile")
+    Result<AccountDTO> findByMobile(@RequestParam("mobile") String mobile);
+
+    @GetMapping(value = "/pwd/check")
+    Result<AccountDTO> checkPwd(@RequestParam(value = "username") String username, @RequestParam(value = "password") String password);
+}

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

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>account</artifactId>
+    <groupId>com.usoftchina.smartschool</groupId>
+    <version>1.0.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.usoftchina.smartschool</groupId>
+  <artifactId>account-dto</artifactId>
+
+
+</project>

+ 58 - 0
base-servers/account/account-dto/src/main/java/com/usoftchina/smartschool/account/dto/AccountDTO.java

@@ -0,0 +1,58 @@
+package com.usoftchina.smartschool.account.dto;
+
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Author chenwei
+ * @Date 2019/01/22
+ */
+public class AccountDTO implements Serializable {
+
+    private Long id;
+    private String user_phone;
+    private String user_code;
+    private String salt;
+    private List<RoleDTO> roleMaps;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getUser_phone() {
+        return user_phone;
+    }
+
+    public void setUser_phone(String user_phone) {
+        this.user_phone = user_phone;
+    }
+
+    public String getUser_code() {
+        return user_code;
+    }
+
+    public void setUser_code(String user_code) {
+        this.user_code = user_code;
+    }
+
+    public String getSalt() {
+        return salt;
+    }
+
+    public void setSalt(String salt) {
+        this.salt = salt;
+    }
+
+    public List<RoleDTO> getRoleMaps() {
+        return roleMaps;
+    }
+
+    public void setRoleMaps(List<RoleDTO> roleMaps) {
+        this.roleMaps = roleMaps;
+    }
+}

+ 59 - 0
base-servers/account/account-dto/src/main/java/com/usoftchina/smartschool/account/dto/AccountRegDTO.java

@@ -0,0 +1,59 @@
+package com.usoftchina.smartschool.account.dto;
+
+import java.io.Serializable;
+
+/**
+ * @Description 账户注册
+ * @Author chenwei
+ * @Date 2019/01/22
+ */
+public class AccountRegDTO implements Serializable {
+    /**
+     * 手机号(用户名)
+     */
+    private String user_phone;
+    /**
+     * 密码
+     */
+    private String user_pass;
+    /**
+     * 编号
+     */
+    private String user_code;
+    /**
+     * 角色ID
+     */
+    private Long roleId;
+
+    public String getUser_phone() {
+        return user_phone;
+    }
+
+    public void setUser_phone(String user_phone) {
+        this.user_phone = user_phone;
+    }
+
+    public String getUser_pass() {
+        return user_pass;
+    }
+
+    public void setUser_pass(String user_pass) {
+        this.user_pass = user_pass;
+    }
+
+    public String getUser_code() {
+        return user_code;
+    }
+
+    public void setUser_code(String user_code) {
+        this.user_code = user_code;
+    }
+
+    public Long getRoleId() {
+        return roleId;
+    }
+
+    public void setRoleId(Long roleId) {
+        this.roleId = roleId;
+    }
+}

+ 72 - 0
base-servers/account/account-server/pom.xml

@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>account</artifactId>
+    <groupId>com.usoftchina.smartschool</groupId>
+    <version>1.0.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.usoftchina.smartschool</groupId>
+  <artifactId>account-server</artifactId>
+
+  <dependencies>
+    <dependency>
+      <groupId>com.usoftchina.smartschool</groupId>
+      <artifactId>server-starter</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.usoftchina.smartschool</groupId>
+      <artifactId>file-api</artifactId>
+    </dependency>
+    <!-- db -->
+    <dependency>
+      <groupId>mysql</groupId>
+      <artifactId>mysql-connector-java</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.mybatis.spring.boot</groupId>
+      <artifactId>mybatis-spring-boot-starter</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.github.pagehelper</groupId>
+      <artifactId>pagehelper-spring-boot-starter</artifactId>
+    </dependency>
+    <!-- sleuth -->
+    <dependency>
+      <groupId>org.springframework.cloud</groupId>
+      <artifactId>spring-cloud-starter-zipkin</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.amqp</groupId>
+      <artifactId>spring-rabbit</artifactId>
+    </dependency>
+    <!-- test -->
+    <dependency>
+      <groupId>com.usoftchina.saas</groupId>
+      <artifactId>test-starter</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.usoftchina.smartschool</groupId>
+      <artifactId>account-dto</artifactId>
+      <version>1.0.0-SNAPSHOT</version>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>com.spotify</groupId>
+        <artifactId>docker-maven-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>

+ 6 - 0
base-servers/account/account-server/src/main/docker/Dockerfile

@@ -0,0 +1,6 @@
+FROM frolvlad/alpine-oraclejdk8:slim
+VOLUME /tmp
+ADD account-server-1.0.0-SNAPSHOT.jar app.jar
+RUN sh -c 'touch /app.jar'
+ENV JAVA_OPTS=""
+ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

+ 22 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/smartschool/account/AccountApplication.java

@@ -0,0 +1,22 @@
+package com.usoftchina.smartschool.account;
+
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+/**
+ * @author yingp
+ * @date 2018/10/2
+ */
+@SpringBootApplication
+@EnableEurekaClient
+@EnableTransactionManagement
+@MapperScan(basePackages = "com.usoftchina.smartschool.account.mapper")
+public class AccountApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(AccountApplication.class, args);
+    }
+}

+ 95 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/smartschool/account/controller/AccountController.java

@@ -0,0 +1,95 @@
+package com.usoftchina.smartschool.account.controller;
+
+import com.usoftchina.smartschool.account.dto.AccountDTO;
+import com.usoftchina.smartschool.account.dto.AccountRegDTO;
+import com.usoftchina.smartschool.account.po.Account;
+import com.usoftchina.smartschool.account.service.AccountService;
+import com.usoftchina.smartschool.base.Result;
+import com.usoftchina.smartschool.context.BaseContextHolder;
+import com.usoftchina.smartschool.exception.BizException;
+import com.usoftchina.smartschool.exception.ExceptionCode;
+import com.usoftchina.smartschool.utils.BeanMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @Author chenwei
+ * @Date 2019/01/22
+ */
+@RestController
+@RequestMapping("/account")
+public class AccountController {
+
+    @Autowired
+    private AccountService accountService;
+
+    /**
+     * 注册
+     * @param accountRegDTO
+     * @return
+     */
+    @PostMapping("/register")
+    public Result register(@RequestBody AccountRegDTO accountRegDTO){
+        //校验用户是否已存在
+        AccountDTO accountDTO = accountService.findByMobile(accountRegDTO.getUser_phone());
+        if (accountDTO != null) {
+            return Result.error(ExceptionCode.USER_NAME_EXIST);
+        }
+        Account account = BeanMapper.map(accountRegDTO, Account.class);
+        account.setSalt(accountDTO.getUser_phone());
+        account.setUser_pass(accountService.getEncryptedPassword(accountRegDTO.getUser_pass(), account.getSalt()));
+        //保存账户
+        accountService.save(account);
+        //绑定角色
+        accountService.bindRole(account.getId(), accountRegDTO.getRoleId());
+
+        return Result.success();
+    }
+
+    /**
+     * 通过手机号查找账户信息
+     * @param mobile
+     * @return
+     */
+    @GetMapping(value = "/read", params = "mobile")
+    public Result<AccountDTO> findByMobile(@RequestParam("mobile") String mobile){
+        AccountDTO accountDTO = accountService.findByMobile(mobile);
+        return Result.success(accountDTO);
+    }
+
+    /**
+     * 校验用户名密码
+     * @param username
+     * @param password
+     * @return
+     */
+    @GetMapping(value = "/pwd/check")
+    public Result<AccountDTO> checkPwd(@RequestParam(value = "username") String username, @RequestParam(value = "password") String password){
+        AccountDTO accountDTO = accountService.findByMobile(username);
+        if (null == accountDTO){
+            return Result.error(ExceptionCode.USER_NOT_EXIST);
+        }
+        boolean checked = accountService.checkPwd(username, password);
+        if (!checked){
+            return Result.error(ExceptionCode.USER_PWD_ERROR);
+        }
+        return Result.success(accountService.findByMobile(username));
+    }
+
+    /**
+     * 重置密码
+     * @param password
+     * @return
+     */
+    @PostMapping("/password/reset")
+    public Result resetPassword(@RequestParam("password") String password){
+        Account account = accountService.findByPrimaryKey(BaseContextHolder.getUserId());
+        if (null == account) {
+            return Result.error(ExceptionCode.USER_NOT_EXIST);
+        }
+        account.setUser_pass(accountService.getEncryptedPassword(password, account.getSalt()));
+        accountService.updateByPrimaryKeySelective(account);
+        return Result.success();
+    }
+
+}

+ 51 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/smartschool/account/mapper/AccountMapper.java

@@ -0,0 +1,51 @@
+package com.usoftchina.smartschool.account.mapper;
+
+import com.usoftchina.smartschool.account.po.Account;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @Author chenwei
+ * @Date 2019/01/22
+ */
+public interface AccountMapper {
+
+    /**
+     * 保存非空数据
+     * @param account
+     * @return
+     */
+    int insertSelective(Account account);
+
+    /**
+     * 按主键更新
+     *
+     * @param account
+     * @return
+     */
+    int updateByPrimaryKey(Account account);
+
+    /**
+     * 按主键更新非空字段
+     *
+     * @param account
+     * @return
+     */
+    int updateByPrimaryKeySelective(Account account);
+
+    /**
+     * 按ID查找
+     *
+     * @param id
+     * @return
+     */
+    Account selectByPrimaryKey(@Param("id") Long id);
+
+    /**
+     * 按手机号查找
+     *
+     * @param mobile
+     * @return
+     */
+    Account selectByMobile(@Param("mobile") String mobile);
+
+}

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

@@ -0,0 +1,15 @@
+package com.usoftchina.smartschool.account.mapper;
+
+import com.usoftchina.smartschool.account.dto.RoleDTO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface AccountRoleMapper {
+
+    List<RoleDTO> selectByAccountId(@Param("id") Long id);
+
+    void bindRole(@Param("accountId") Long accountId, @Param("roleId") Long roleId);
+
+    void unbindRole(@Param("accountId") Long accountId, @Param("roleId") Long roleId);
+}

+ 54 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/smartschool/account/po/Account.java

@@ -0,0 +1,54 @@
+package com.usoftchina.smartschool.account.po;
+
+/**
+ * @Author chenwei
+ * @Date 2019/01/22
+ */
+public class Account {
+
+    private Long id;
+    private String user_phone;
+    private String user_pass;
+    private String user_code;
+    private String salt;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getUser_phone() {
+        return user_phone;
+    }
+
+    public void setUser_phone(String user_phone) {
+        this.user_phone = user_phone;
+    }
+
+    public String getUser_pass() {
+        return user_pass;
+    }
+
+    public void setUser_pass(String user_pass) {
+        this.user_pass = user_pass;
+    }
+
+    public String getUser_code() {
+        return user_code;
+    }
+
+    public void setUser_code(String user_code) {
+        this.user_code = user_code;
+    }
+
+    public String getSalt() {
+        return salt;
+    }
+
+    public void setSalt(String salt) {
+        this.salt = salt;
+    }
+}

+ 59 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/smartschool/account/service/AccountService.java

@@ -0,0 +1,59 @@
+package com.usoftchina.smartschool.account.service;
+
+import com.usoftchina.smartschool.account.dto.AccountDTO;
+import com.usoftchina.smartschool.account.po.Account;
+
+public interface AccountService {
+
+    /**
+     * 注册
+     * @return
+     */
+    AccountDTO save(Account account);
+
+    /**
+     * 通过手机号查找用户
+     * @param mobile
+     * @return
+     */
+    AccountDTO findByMobile(String mobile);
+
+    /**
+     * 通过主键查找用户
+     * @param id
+     * @return
+     */
+    Account findByPrimaryKey(Long id);
+
+    /**
+     * 密码加密
+     * @param password
+     * @param salt
+     * @return
+     */
+    String getEncryptedPassword(String password, String salt);
+
+    /**
+     * 根据主键更新
+     * @param account
+     * @return
+     */
+    boolean updateByPrimaryKeySelective(Account account);
+
+    /**
+     * 账户绑定角色
+     * @param accountId
+     * @param roleId
+     */
+    void bindRole(Long accountId, Long roleId);
+
+    /**
+     * 校验密码
+     *
+     * @param username
+     * @param plainPassword
+     * @return
+     */
+    boolean checkPwd(String username, String plainPassword);
+
+}

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

@@ -0,0 +1,67 @@
+package com.usoftchina.smartschool.account.service.impl;
+
+import com.usoftchina.smartschool.account.dto.AccountDTO;
+import com.usoftchina.smartschool.account.dto.RoleDTO;
+import com.usoftchina.smartschool.account.mapper.AccountMapper;
+import com.usoftchina.smartschool.account.mapper.AccountRoleMapper;
+import com.usoftchina.smartschool.account.po.Account;
+import com.usoftchina.smartschool.account.service.AccountService;
+import com.usoftchina.smartschool.utils.BeanMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.DigestUtils;
+
+import java.util.List;
+
+/**
+ * @Author chenwei
+ * @Date 2019/01/22
+ */
+@Service
+public class AccountServiceImpl implements AccountService {
+
+    @Autowired
+    private AccountMapper accountMapper;
+    @Autowired
+    private AccountRoleMapper accountRoleMapper;
+
+    @Override
+    public AccountDTO save(Account account) {
+        return null;
+    }
+
+    @Override
+    public AccountDTO findByMobile(String mobile) {
+        Account account = accountMapper.selectByMobile(mobile);
+        AccountDTO accountDTO = BeanMapper.map(account, AccountDTO.class);
+        List<RoleDTO> roleDTOList = accountRoleMapper.selectByAccountId(account.getId());
+        accountDTO.setRoleMaps(roleDTOList);
+        return accountDTO;
+    }
+
+    @Override
+    public Account findByPrimaryKey(Long id) {
+        return accountMapper.selectByPrimaryKey(id);
+    }
+
+    @Override
+    public String getEncryptedPassword(String password, String salt) {
+        return DigestUtils.md5DigestAsHex(String.format("%s{%s}", password, salt).getBytes());
+    }
+
+    @Override
+    public boolean updateByPrimaryKeySelective(Account account) {
+        return accountMapper.updateByPrimaryKeySelective(account) > 0;
+    }
+
+    @Override
+    public void bindRole(Long accountId, Long roleId) {
+        accountRoleMapper.bindRole(accountId, roleId);
+    }
+
+    @Override
+    public boolean checkPwd(String username, String plainPassword) {
+        Account account = accountMapper.selectByMobile(username);
+        return getEncryptedPassword(plainPassword, account.getSalt()).equals(account.getUser_pass());
+    }
+}

+ 91 - 0
base-servers/account/account-server/src/main/resources/application.yml

@@ -0,0 +1,91 @@
+spring:
+  application:
+    name: account-server
+  security:
+    user:
+      name: admin
+      password: select111***
+  datasource:
+    driver-class-name: com.mysql.jdbc.Driver
+    url: jdbc:mysql://10.10.100.166:3306/school?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
+    username: root
+    password: select111***
+    hikari:
+      minimum-idle: 5
+      maximum-pool-size: 50
+      idle-timeout: 30000
+      max-lifetime: 1800000
+      connection-timeout: 30000
+  messages:
+    basename: i18n/messages
+    encoding: UTF-8
+  rabbitmq:
+    host: 10.10.100.166
+    port: 3306
+    virtual-host: school
+    username: root
+    password: select111***
+  zipkin:
+    sender:
+      type: rabbit
+    locator:
+      discovery:
+        enabled: true
+  sleuth:
+    sampler:
+      probability: 1.0
+  redis:
+    host: 10.1.81.62
+    port: 6379
+  profiles:
+    active: dev
+eureka:
+  instance:
+    leaseRenewalIntervalInSeconds: 10
+    health-check-url-path: /actuator/health
+    status-page-url-path: /actuator/info
+    metadata-map:
+      user.name: ${spring.security.user.name}
+      user.password: ${spring.security.user.password}
+  client:
+    registryFetchIntervalSeconds: 5
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:9500/eureka/
+management:
+  endpoints:
+    web:
+      exposure:
+        include: "*"
+  endpoint:
+    health:
+      show-details: always
+server:
+  port: 9700
+  tomcat:
+    uri-encoding: UTF-8
+info:
+  name: '@project.artifactId@'
+  description: '@project.description@'
+  version: '@project.version@'
+  spring-boot-version: '@spring.boot.version@'
+  spring-cloud-version: '@spring.cloud.version@'
+mybatis:
+  type-aliases-package: com.usoftchina.smartschool.account.po
+  mapper-locations: classpath:mapper/*.xml
+auth:
+  public-key: auth/pub.key
+ribbon:
+  ReadTimeout: 10000
+  ConnectTimeout: 10000
+feign:
+  hystrix:
+    enabled: true
+hystrix:
+    command:
+        default:
+            execution:
+              timeout:
+                enabled: true
+              isolation:
+                    thread:
+                        timeoutInMilliseconds: 4000

+ 52 - 0
base-servers/account/account-server/src/main/resources/mapper/AccountMapper.xml

@@ -0,0 +1,52 @@
+<?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.smartschool.account.mapper.AccountMapper">
+  <select id="selectByPrimaryKey" resultType="com.usoftchina.smartschool.account.po.Account">
+    SELECT * FROM SYS_USER WHERE USER_ID = #{id}
+  </select>
+  <select id="selectByMobile" resultType="com.usoftchina.smartschool.account.dto.AccountDTO">
+    select users.user_id id, users.user_phone, users.user_code
+    from sys_user users
+    where user_phone = #{mobile};
+  </select>
+  <insert id="insertSelective" parameterType="com.usoftchina.smartschool.account.po.Account">
+    <selectKey resultType="java.lang.Long" keyProperty="id">
+      SELECT LAST_INSERT_ID() AS ID
+    </selectKey>
+    insert into sys_user
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="user_phone != null">
+        user_phone,
+      </if>
+      <if test="user_pass != null">
+        user_pass,
+      </if>
+      <if test="user_code != null">
+        user_code,
+      </if>
+      <if test="salt != null">
+        salt,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="user_phone != null">
+        #{user_phone,jdbcType=VARCHAR},
+      </if>
+      <if test="user_pass != null">
+        #{user_pass,jdbcType=VARCHAR},
+      </if>
+      <if test="user_code != null">
+        #{user_code,jdbcType=VARCHAR},
+      </if>
+      <if test="salt != null">
+        #{salt,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <update id="updateByPrimaryKey">
+
+  </update>
+  <update id="updateByPrimaryKeySelective">
+
+  </update>
+</mapper>

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

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.usoftchina.smartschool.account.mapper.AccountRoleMapper">
+  <select id="selectByAccountId" parameterType="int" resultType="com.usoftchina.smartschool.account.dto.RoleDTO">
+    select sys_role.role_id,sys_role.role_name,sys_role.role_sign,sys_role.create_date,sys_role.role_remarks,sys_teacher.school_id
+    from sys_user_role
+    left join sys_teacher on sys_teacher.user_id = sys_user_role.user_id
+    left join sys_role on sys_role.role_id = sys_user_role.role_id
+    where sys_user_role.user_id = #{id}
+  </select>
+  <insert id="bindRole">
+    insert into sys_user_role(user_id, role_id) values(#{accountId}, #{roleId})
+  </insert>
+  <delete id="unbindRole">
+    delete from sys_user_role where user_id = #{accountId} and role_id = #{roleId}
+  </delete>
+</mapper>

+ 6 - 0
base-servers/account/pom.xml

@@ -10,6 +10,12 @@
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>account</artifactId>
+  <packaging>pom</packaging>
+  <modules>
+    <module>account-server</module>
+    <module>account-api</module>
+    <module>account-dto</module>
+  </modules>
 
 
 </project>

+ 17 - 0
base-servers/auth/auth-api/pom.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>auth</artifactId>
+    <groupId>com.usoftchina.smartschool</groupId>
+    <version>1.0.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.usoftchina.smartschool</groupId>
+  <artifactId>auth-api</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+
+
+</project>

+ 60 - 0
base-servers/auth/auth-dto/pom.xml

@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>auth</artifactId>
+    <groupId>com.usoftchina.smartschool</groupId>
+    <version>1.0.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.usoftchina.smartschool</groupId>
+  <artifactId>auth-dto</artifactId>
+  <properties>
+    <jjwt.version>0.7.0</jjwt.version>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>com.usoftchina.smartschool</groupId>
+      <artifactId>account-dto</artifactId>
+      <version>1.0.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>io.jsonwebtoken</groupId>
+      <artifactId>jjwt</artifactId>
+      <version>${jjwt.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.cloud</groupId>
+      <artifactId>spring-cloud-netflix-core</artifactId>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.usoftchina.smartschool</groupId>
+      <artifactId>core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>joda-time</groupId>
+      <artifactId>joda-time</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.cloud</groupId>
+      <artifactId>spring-cloud-starter-bus-amqp</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>javax.servlet-api</artifactId>
+      <scope>compile</scope>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+
+</project>

+ 46 - 0
base-servers/auth/auth-dto/src/main/java/com/usoftchina/smartschool/auth/dto/AuthDTO.java

@@ -0,0 +1,46 @@
+package com.usoftchina.smartschool.auth.dto;
+
+import com.usoftchina.smartschool.account.dto.AccountDTO;
+
+import java.io.Serializable;
+
+/**
+ * @Author chenwei
+ * @Date 2019/01/22
+ */
+public class AuthDTO implements Serializable {
+
+    private TokenDTO token;
+    private AccountDTO account;
+
+    public TokenDTO getToken() {
+        return token;
+    }
+
+    public void setToken(TokenDTO token) {
+        this.token = token;
+    }
+
+    public AccountDTO getAccount() {
+        return account;
+    }
+
+    public void setAccount(AccountDTO account) {
+        this.account = account;
+    }
+    public AuthDTO() {
+    }
+
+    public AuthDTO(TokenDTO token, AccountDTO account) {
+        this.token = token;
+        this.account = account;
+    }
+
+    @Override
+    public String toString() {
+        return "AuthDTO{" +
+                "token=" + token +
+                ", account=" + account +
+                '}';
+    }
+}

+ 45 - 0
base-servers/auth/auth-dto/src/main/java/com/usoftchina/smartschool/auth/dto/TokenDTO.java

@@ -0,0 +1,45 @@
+package com.usoftchina.smartschool.auth.dto;
+
+/**
+ * @Author chenwei
+ * @Date 2019/01/22
+ */
+public class TokenDTO {
+
+    /**
+     * token
+     */
+    private String token;
+    /**
+     * 有效时间:单位:秒
+     */
+    private Integer expire;
+    /**
+     * 产生时间
+     */
+    private Long timestamp;
+
+    public String getToken() {
+        return token;
+    }
+
+    public void setToken(String token) {
+        this.token = token;
+    }
+
+    public Integer getExpire() {
+        return expire;
+    }
+
+    public void setExpire(Integer expire) {
+        this.expire = expire;
+    }
+
+    public Long getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(Long timestamp) {
+        this.timestamp = timestamp;
+    }
+}

+ 102 - 0
base-servers/auth/auth-dto/src/main/java/com/usoftchina/smartschool/auth/jwt/JwtHelper.java

@@ -0,0 +1,102 @@
+package com.usoftchina.smartschool.auth.jwt;
+
+import com.usoftchina.smartschool.exception.BizException;
+import com.usoftchina.smartschool.exception.ExceptionCode;
+import com.usoftchina.smartschool.utils.ObjectUtils;
+import com.usoftchina.smartschool.utils.RsaUtils;
+import io.jsonwebtoken.*;
+import org.joda.time.DateTime;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.security.NoSuchAlgorithmException;
+import java.security.spec.InvalidKeySpecException;
+
+/**
+ * @author yingp
+ * @date 2018/10/2
+ */
+public class JwtHelper {
+
+    private static final Logger log = LoggerFactory.getLogger(JwtHelper.class);
+
+    /**
+     * 密钥加密token
+     *
+     * @param jwtInfo    jwt 帐号信息
+     * @param priKeyPath 私钥地址
+     * @param expire     过期时间
+     * @return
+     * @throws Exception
+     */
+    public static JwtToken generateToken(JwtInfo jwtInfo, String priKeyPath, int expire) throws BizException {
+        try {
+            String compactJws =
+                    // 返回的字符串便是我们的jwt串了
+                    Jwts.builder()
+                            // 设置主题
+                            .setSubject(jwtInfo.getUserName())
+                            .claim("appId", jwtInfo.getAppId())
+                            .claim("userId", jwtInfo.getUserId())
+                            .claim("userName", jwtInfo.getUserName())
+                            .setExpiration(DateTime.now().plusSeconds(expire).toDate())
+                            // 设置算法(必须)
+                            .signWith(SignatureAlgorithm.RS256, RsaUtils.getPrivateKey(priKeyPath))
+                            // 这个是全部设置完成后拼成jwt串的方法
+                            .compact();
+            return new JwtToken(compactJws, expire);
+        } catch (IOException | NoSuchAlgorithmException | InvalidKeySpecException e) {
+            log.error(e.getMessage());
+            throw new BizException(ExceptionCode.JWT_GEN_TOKEN_FAIL.getCode(), ExceptionCode.JWT_GEN_TOKEN_FAIL.getMessage());
+        }
+    }
+
+    /**
+     * 公钥解析token
+     *
+     * @param token
+     * @param pubKeyPath 公钥路径
+     * @return
+     * @throws Exception
+     */
+    private static Jws<Claims> parserToken(String token, String pubKeyPath) throws BizException {
+        try {
+            return Jwts.parser().setSigningKey(RsaUtils.getPublicKey(pubKeyPath)).parseClaimsJws(token);
+        } catch (ExpiredJwtException ex) {
+            log.error("ExpiredJwtException:", ex);
+            //过期
+            throw new BizException(ExceptionCode.JWT_TOKEN_EXPIRED.getCode(), ExceptionCode.JWT_TOKEN_EXPIRED.getMessage());
+        } catch (SignatureException ex) {
+            log.error("SignatureException:", ex);
+            //签名错误
+            throw new BizException(ExceptionCode.JWT_SIGNATURE.getCode(), ExceptionCode.JWT_SIGNATURE.getMessage());
+        } catch (IllegalArgumentException ex) {
+            log.error("IllegalArgumentException:", ex);
+            //token 为空
+            throw new BizException(ExceptionCode.JWT_ILLEGAL_ARGUMENT.getCode(), ExceptionCode.JWT_ILLEGAL_ARGUMENT.getMessage());
+        } catch (Exception e) {
+            log.error("message:", e);
+            throw new BizException(ExceptionCode.JWT_PARSER_TOKEN_FAIL.getCode(), ExceptionCode.JWT_PARSER_TOKEN_FAIL.getMessage());
+        }
+    }
+
+    /**
+     * 获取token中的用户信息
+     *
+     * @param token      token
+     * @param pubKeyPath 公钥路径
+     * @return
+     * @throws Exception
+     */
+    public static JwtInfo getInfoFromToken(String token, String pubKeyPath) throws BizException {
+        Jws<Claims> claimsJws = parserToken(token, pubKeyPath);
+        Claims body = claimsJws.getBody();
+        return new JwtInfo(
+                ObjectUtils.getStringValue(body.get("appId")),
+                ObjectUtils.getLongValue(body.get("school_id")),
+                ObjectUtils.getLongValue(body.get("userId")),
+                ObjectUtils.getStringValue(body.get("userName"))
+        );
+    }
+}

+ 56 - 0
base-servers/auth/auth-dto/src/main/java/com/usoftchina/smartschool/auth/jwt/JwtInfo.java

@@ -0,0 +1,56 @@
+package com.usoftchina.smartschool.auth.jwt;
+
+import java.io.Serializable;
+
+/**
+ * @author yingp
+ * @date 2018/10/2
+ */
+public class JwtInfo implements Serializable{
+    private String appId;
+    private Long school_id;
+    private Long userId;
+    private String userName;
+
+    public JwtInfo() {
+    }
+
+    public JwtInfo(String appId, Long school_id, Long userId, String userName) {
+        this.appId = appId;
+        this.school_id = school_id;
+        this.userId = userId;
+        this.userName = userName;
+    }
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
+
+    public Long getSchool_id() {
+        return school_id;
+    }
+
+    public void setSchool_id(Long school_id) {
+        this.school_id = school_id;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+}

+ 65 - 0
base-servers/auth/auth-dto/src/main/java/com/usoftchina/smartschool/auth/jwt/JwtToken.java

@@ -0,0 +1,65 @@
+package com.usoftchina.smartschool.auth.jwt;
+
+import java.io.Serializable;
+
+/**
+ * @author yingp
+ * @date 2018/10/2
+ */
+public class JwtToken implements Serializable {
+    /**
+     * token
+     */
+    private String token;
+    /**
+     * 有效时间:单位:秒
+     */
+    private Integer expire;
+
+    private Long timestamp;
+
+    public JwtToken(String token, Integer expire) {
+        this.token = token;
+        this.expire = expire;
+        this.timestamp = System.currentTimeMillis();
+    }
+
+    public JwtToken(String token, Integer expire, Long timestamp) {
+        this.token = token;
+        this.expire = expire;
+        this.timestamp = timestamp;
+    }
+
+    public String getToken() {
+        return token;
+    }
+
+    public void setToken(String token) {
+        this.token = token;
+    }
+
+    public Integer getExpire() {
+        return expire;
+    }
+
+    public void setExpire(Integer expire) {
+        this.expire = expire;
+    }
+
+    public Long getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(Long timestamp) {
+        this.timestamp = timestamp;
+    }
+
+    @Override
+    public String toString() {
+        return "JwtToken{" +
+                "token='" + token + '\'' +
+                ", expire=" + expire +
+                ", timestamp=" + timestamp +
+                '}';
+    }
+}

+ 77 - 0
base-servers/auth/auth-server/pom.xml

@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>auth</artifactId>
+    <groupId>com.usoftchina.smartschool</groupId>
+    <version>1.0.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.usoftchina.smartschool</groupId>
+  <artifactId>auth-server</artifactId>
+  <description>authentication server</description>
+
+  <dependencies>
+    <dependency>
+      <groupId>com.usoftchina.smartschool</groupId>
+      <artifactId>auth-dto</artifactId>
+      <version>1.0.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>com.usoftchina.smartschool</groupId>
+      <artifactId>server-starter</artifactId>
+    </dependency>
+    <!-- db -->
+    <dependency>
+      <groupId>mysql</groupId>
+      <artifactId>mysql-connector-java</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.mybatis.spring.boot</groupId>
+      <artifactId>mybatis-spring-boot-starter</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.github.pagehelper</groupId>
+      <artifactId>pagehelper-spring-boot-starter</artifactId>
+    </dependency>
+    <!-- api doc -->
+    <dependency>
+      <groupId>io.springfox</groupId>
+      <artifactId>springfox-swagger-ui</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>io.springfox</groupId>
+      <artifactId>springfox-swagger2</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.amqp</groupId>
+      <artifactId>spring-rabbit</artifactId>
+    </dependency>
+    <!-- test -->
+    <dependency>
+      <groupId>com.usoftchina.saas</groupId>
+      <artifactId>test-starter</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.usoftchina.smartschool</groupId>
+      <artifactId>account-api</artifactId>
+      <version>1.0.0-SNAPSHOT</version>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>com.spotify</groupId>
+        <artifactId>docker-maven-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>

+ 6 - 0
base-servers/auth/auth-server/src/main/docker/Dockerfile

@@ -0,0 +1,6 @@
+FROM frolvlad/alpine-oraclejdk8:slim
+VOLUME /tmp
+ADD auth-server-1.0.0-SNAPSHOT.jar app.jar
+RUN sh -c 'touch /app.jar'
+ENV JAVA_OPTS=""
+ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

+ 19 - 0
base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/AuthApplication.java

@@ -0,0 +1,19 @@
+package com.usoftchina.smartschool.auth;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
+
+/**
+ * @author yingp
+ * @date 2018/9/30
+ */
+@SpringBootApplication
+@EnableEurekaClient
+@MapperScan(basePackages = "com.usoftchina.smartschool.auth.mapper")
+public class AuthApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(AuthApplication.class, args);
+    }
+}

+ 65 - 0
base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/controller/AuthController.java

@@ -0,0 +1,65 @@
+package com.usoftchina.smartschool.auth.controller;
+
+import com.usoftchina.smartschool.account.api.AccountApi;
+import com.usoftchina.smartschool.account.dto.AccountDTO;
+import com.usoftchina.smartschool.auth.dto.AuthDTO;
+import com.usoftchina.smartschool.auth.dto.TokenDTO;
+import com.usoftchina.smartschool.auth.jwt.JwtHelper;
+import com.usoftchina.smartschool.auth.jwt.JwtInfo;
+import com.usoftchina.smartschool.auth.jwt.JwtToken;
+import com.usoftchina.smartschool.base.Result;
+import com.usoftchina.smartschool.utils.BeanMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @author yingp
+ * @date 2018/10/2
+ */
+@RestController
+public class AuthController {
+
+    @Value("${auth.public-key}")
+    private String publicKeyPath;
+
+    @Value("${auth.private-key}")
+    private String privateKeyPath;
+
+    @Value("${auth.header:Authorization}")
+    private String authHeader;
+
+    @Value("${auth.expire:18000}")
+    private int expire;
+
+    @Value("${auth.max-errors:5}")
+    private int maxErrors;
+
+    @Autowired
+    private AccountApi accountApi;
+
+    @PostMapping("/authorize")
+    public Result<AuthDTO> authorize(HttpServletRequest request, @RequestParam String username, @RequestParam String password){
+        Result<AccountDTO> result = accountApi.checkPwd(username, password);
+        if (result.isSuccess()){
+            AccountDTO accountDTO = result.getData();
+            Long school_id = accountDTO.getRoleMaps().stream().filter(roleDTO -> "教师".equals(roleDTO.getRole_name())).findFirst().get().getSchool_id();
+            JwtInfo jwtInfo = new JwtInfo("school", school_id, accountDTO.getId(), accountDTO.getUser_phone());
+            JwtToken jwtToken = JwtHelper.generateToken(jwtInfo, privateKeyPath, expire);
+            TokenDTO tokenDTO = BeanMapper.map(jwtToken, TokenDTO.class);
+            // 登录日志
+            /*authorizeLogService.save(AuthorizeLog.from(request)
+                    .setAccountId(accountDTO.getId())
+                    .setAppId(appId).build());*/
+            return Result.success(new AuthDTO(tokenDTO, accountDTO));
+        }else {
+            return Result.error(result.getCode(), result.getMessage());
+        }
+    }
+
+
+}

+ 47 - 0
base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/dto/AuthorizeLogDTO.java

@@ -0,0 +1,47 @@
+package com.usoftchina.smartschool.auth.dto;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author yingp
+ * @date 2018/11/7
+ */
+public class AuthorizeLogDTO implements Serializable{
+    private String clientIp;
+    private String userAgent;
+    private Date loginTime;
+
+    public String getClientIp() {
+        return clientIp;
+    }
+
+    public void setClientIp(String clientIp) {
+        this.clientIp = clientIp;
+    }
+
+    public String getUserAgent() {
+        return userAgent;
+    }
+
+    public void setUserAgent(String userAgent) {
+        this.userAgent = userAgent;
+    }
+
+    public Date getLoginTime() {
+        return loginTime;
+    }
+
+    public void setLoginTime(Date loginTime) {
+        this.loginTime = loginTime;
+    }
+
+    @Override
+    public String toString() {
+        return "AuthorizeLogDTO{" +
+                "clientIp='" + clientIp + '\'' +
+                ", userAgent='" + userAgent + '\'' +
+                ", loginTime=" + loginTime +
+                '}';
+    }
+}

+ 37 - 0
base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/mapper/AuthorizeLogMapper.java

@@ -0,0 +1,37 @@
+package com.usoftchina.smartschool.auth.mapper;
+
+import com.usoftchina.saas.auth.po.AuthorizeLog;
+import com.usoftchina.saas.auth.po.VirtualAuthorizeLog;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author yingp
+ * @date 2018/11/6
+ */
+public interface AuthorizeLogMapper {
+    /**
+     * 保存
+     *
+     * @param authorizeLog
+     * @return
+     */
+    int insert(AuthorizeLog authorizeLog);
+
+    /**
+     * 查找个人日志
+     *
+     * @param appId
+     * @param accountId
+     * @return
+     */
+    List<AuthorizeLog> selectByAppIdAndAccountId(@Param("appId") String appId, @Param("accountId") Long accountId);
+
+    /**
+     * 保存虚拟登陆的LOG
+     * @param virtualAuthorizeLog
+     * @return
+     */
+    int insertVirtual(VirtualAuthorizeLog virtualAuthorizeLog);
+}

+ 117 - 0
base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/po/AuthorizeLog.java

@@ -0,0 +1,117 @@
+package com.usoftchina.smartschool.auth.po;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author yingp
+ * @date 2018/11/6
+ */
+public class AuthorizeLog implements Serializable{
+    private Long id;
+    private Long accountId;
+    private String clientIp;
+    private String userAgent;
+    private Date loginTime;
+    private String appId;
+
+    public AuthorizeLog() {
+    }
+
+    public AuthorizeLog(Long accountId, String clientIp, String userAgent, String appId) {
+        this.accountId = accountId;
+        this.clientIp = clientIp;
+        this.userAgent = userAgent;
+        this.loginTime = new Date();
+        this.appId = appId;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getAccountId() {
+        return accountId;
+    }
+
+    public void setAccountId(Long accountId) {
+        this.accountId = accountId;
+    }
+
+    public String getClientIp() {
+        return clientIp;
+    }
+
+    public void setClientIp(String clientIp) {
+        this.clientIp = clientIp;
+    }
+
+    public String getUserAgent() {
+        return userAgent;
+    }
+
+    public void setUserAgent(String userAgent) {
+        this.userAgent = userAgent;
+    }
+
+    public Date getLoginTime() {
+        return loginTime;
+    }
+
+    public void setLoginTime(Date loginTime) {
+        this.loginTime = loginTime;
+    }
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
+
+    public static Builder from(HttpServletRequest request) {
+        return new Builder(request);
+    }
+
+    public static class Builder {
+        private Long accountId;
+        private String clientIp;
+        private String userAgent;
+        private String appId;
+
+        public Builder(HttpServletRequest request) {
+            this.clientIp = request.getRemoteAddr();
+            this.userAgent = request.getHeader("User-Agent");
+        }
+
+        public Builder setAccountId(Long accountId) {
+            this.accountId = accountId;
+            return this;
+        }
+
+        public Builder setClientIp(String clientIp) {
+            this.clientIp = clientIp;
+            return this;
+        }
+
+        public Builder setUserAgent(String userAgent) {
+            this.userAgent = userAgent;
+            return this;
+        }
+
+        public Builder setAppId(String appId) {
+            this.appId = appId;
+            return this;
+        }
+
+        public AuthorizeLog build() {
+            return new AuthorizeLog(accountId, clientIp, userAgent, appId);
+        }
+    }
+}

+ 117 - 0
base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/po/VirtualAuthorizeLog.java

@@ -0,0 +1,117 @@
+package com.usoftchina.smartschool.auth.po;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author chenw
+ * @date 2018/11/26
+ */
+public class VirtualAuthorizeLog implements Serializable{
+    private Long id;
+    private Long mobile;
+    private String clientIp;
+    private String userAgent;
+    private Date loginTime;
+    private String appId;
+
+    public VirtualAuthorizeLog() {
+    }
+
+    public VirtualAuthorizeLog(Long mobile, String clientIp, String userAgent, String appId) {
+        this.mobile = mobile;
+        this.clientIp = clientIp;
+        this.userAgent = userAgent;
+        this.loginTime = new Date();
+        this.appId = appId;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getMobile() {
+        return mobile;
+    }
+
+    public void setMobile(Long mobile) {
+        this.mobile = mobile;
+    }
+
+    public String getClientIp() {
+        return clientIp;
+    }
+
+    public void setClientIp(String clientIp) {
+        this.clientIp = clientIp;
+    }
+
+    public String getUserAgent() {
+        return userAgent;
+    }
+
+    public void setUserAgent(String userAgent) {
+        this.userAgent = userAgent;
+    }
+
+    public Date getLoginTime() {
+        return loginTime;
+    }
+
+    public void setLoginTime(Date loginTime) {
+        this.loginTime = loginTime;
+    }
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
+
+    public static Builder from(HttpServletRequest request) {
+        return new Builder(request);
+    }
+
+    public static class Builder {
+        private Long mobile;
+        private String clientIp;
+        private String userAgent;
+        private String appId;
+
+        public Builder(HttpServletRequest request) {
+            this.clientIp = request.getRemoteAddr();
+            this.userAgent = request.getHeader("User-Agent");
+        }
+
+        public Builder setMobile(Long mobile) {
+            this.mobile = mobile;
+            return this;
+        }
+
+        public Builder setClientIp(String clientIp) {
+            this.clientIp = clientIp;
+            return this;
+        }
+
+        public Builder setUserAgent(String userAgent) {
+            this.userAgent = userAgent;
+            return this;
+        }
+
+        public Builder setAppId(String appId) {
+            this.appId = appId;
+            return this;
+        }
+
+        public VirtualAuthorizeLog build() {
+            return new VirtualAuthorizeLog(mobile, clientIp, userAgent, appId);
+        }
+    }
+}

+ 68 - 0
base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/service/AuthorizeCountService.java

@@ -0,0 +1,68 @@
+package com.usoftchina.smartschool.auth.service;
+
+import com.usoftchina.saas.cache.CacheKeyHelper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Service;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 登录失败记录
+ *
+ * @author yingp
+ * @date 2018/11/6
+ */
+@Service
+public class AuthorizeCountService {
+
+    @Autowired
+    private StringRedisTemplate redisTemplate;
+
+    @Value("${auth.max-errors:5}")
+    private int maxErrors;
+
+    /**
+     * 账户锁定时间
+     */
+    @Value("${auth.error-lock-time:30}")
+    private int lockTime;
+
+    /**
+     * 记录一次
+     *
+     * @param username
+     * @return
+     */
+    public Long increaseAndGet(String username) {
+        String key = generateKey(username);
+        Long value = redisTemplate.opsForValue().increment(key, 1);
+        redisTemplate.expire(key, lockTime, TimeUnit.MINUTES);
+        return value;
+    }
+
+    private String generateKey(String username) {
+        return CacheKeyHelper.generatePrivateKey("auth", "authorize", username);
+    }
+
+    /**
+     * 清零
+     *
+     * @param username
+     */
+    public void clear(String username) {
+        redisTemplate.delete(generateKey(username));
+    }
+
+    /**
+     * 账户是否冻结
+     *
+     * @param username
+     * @return
+     */
+    public boolean isFrozen(String username) {
+        Object value = redisTemplate.opsForValue().get(generateKey(username));
+        return null != value && Integer.parseInt(value.toString()) > maxErrors;
+    }
+}

+ 36 - 0
base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/service/AuthorizeLogService.java

@@ -0,0 +1,36 @@
+package com.usoftchina.smartschool.auth.service;
+
+import com.github.pagehelper.PageInfo;
+import com.usoftchina.saas.auth.dto.AuthorizeLogDTO;
+import com.usoftchina.saas.auth.po.AuthorizeLog;
+import com.usoftchina.saas.auth.po.VirtualAuthorizeLog;
+import com.usoftchina.saas.page.PageRequest;
+
+/**
+ * @author yingp
+ * @date 2018/11/6
+ */
+public interface AuthorizeLogService {
+    /**
+     * 保存
+     *
+     * @param authorizeLog
+     * @return
+     */
+    boolean save(AuthorizeLog authorizeLog);
+
+    /**
+     * 分页查询
+     *
+     * @param page
+     * @return
+     */
+    PageInfo<AuthorizeLogDTO> findByPage(PageRequest page);
+
+    /**
+     * 保存虚拟账户登录LOG
+     * @param virtualAuthorizeLog
+     * @return
+     */
+    boolean saveVirtual(VirtualAuthorizeLog virtualAuthorizeLog);
+}

+ 48 - 0
base-servers/auth/auth-server/src/main/java/com/usoftchina/smartschool/auth/service/impl/AuthorizeLogServiceImpl.java

@@ -0,0 +1,48 @@
+package com.usoftchina.smartschool.auth.service.impl;
+
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.usoftchina.saas.auth.dto.AuthorizeLogDTO;
+import com.usoftchina.saas.auth.mapper.AuthorizeLogMapper;
+import com.usoftchina.saas.auth.po.AuthorizeLog;
+import com.usoftchina.saas.auth.po.VirtualAuthorizeLog;
+import com.usoftchina.saas.auth.service.AuthorizeLogService;
+import com.usoftchina.saas.context.BaseContextHolder;
+import com.usoftchina.saas.page.PageRequest;
+import com.usoftchina.saas.utils.BeanMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author yingp
+ * @date 2018/11/6
+ */
+@Service
+public class AuthorizeLogServiceImpl implements AuthorizeLogService{
+
+    @Autowired
+    private AuthorizeLogMapper authorizeLogMapper;
+
+    @Override
+    @Async
+    public boolean save(AuthorizeLog authorizeLog) {
+        return authorizeLogMapper.insert(authorizeLog) > 0;
+    }
+
+    @Override
+    public PageInfo<AuthorizeLogDTO> findByPage(PageRequest page) {
+        PageHelper.startPage(page.getNumber(), page.getSize());
+        List<AuthorizeLog> logs = authorizeLogMapper.selectByAppIdAndAccountId(
+                BaseContextHolder.getAppId(), BaseContextHolder.getCompanyId()
+        );
+        return new PageInfo<>(BeanMapper.mapList(logs, AuthorizeLogDTO.class));
+    }
+
+    @Override
+    public boolean saveVirtual(VirtualAuthorizeLog virtualAuthorizeLog) {
+        return authorizeLogMapper.insertVirtual(virtualAuthorizeLog) > 0;
+    }
+}

+ 88 - 0
base-servers/auth/auth-server/src/main/resources/application.yml

@@ -0,0 +1,88 @@
+spring:
+  profiles:
+    active: dev
+  application:
+    name: auth-server
+  security:
+    user:
+      name: admin
+      password: select111***
+  datasource:
+    driver-class-name: com.mysql.jdbc.Driver
+    url: jdbc:mysql://10.10.100.166:3306/school?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
+    username: root
+    password: select111***
+    hikari:
+      minimum-idle: 5
+      maximum-pool-size: 50
+      idle-timeout: 30000
+      max-lifetime: 1800000
+      connection-timeout: 30000
+  messages:
+    basename: i18n/messages
+    encoding: UTF-8
+  rabbitmq:
+    host: 10.10.100.166
+    port: 3306
+    virtual-host: school
+    username: root
+    password: select111***
+  zipkin:
+    sender:
+      type: rabbit
+    locator:
+      discovery:
+        enabled: true
+  sleuth:
+    sampler:
+      probability: 1.0
+  redis:
+    host: 10.1.81.62
+    port: 6379
+  jackson:
+    date-format: yyyy-MM-dd HH:mm:ss
+    time-zone: GMT+8
+eureka:
+  instance:
+    leaseRenewalIntervalInSeconds: 10
+    health-check-url-path: /actuator/health
+    status-page-url-path: /actuator/info
+    prefer-ip-address: true
+    metadata-map:
+      user.name: ${spring.security.user.name}
+      user.password: ${spring.security.user.password}
+  client:
+    registryFetchIntervalSeconds: 5
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:8500/eureka/
+server:
+  port: 9720
+  tomcat:
+    uri-encoding: UTF-8
+management:
+  endpoints:
+    web:
+      exposure:
+        include: "*"
+  endpoint:
+    health:
+      show-details: always
+    shutdown:
+      enabled: true
+    restart:
+      enabled: true
+info:
+  name: '@project.artifactId@'
+  description: '@project.description@'
+  version: '@project.version@'
+  spring-boot-version: '@spring.boot.version@'
+  spring-cloud-version: '@spring.cloud.version@'
+mybatis:
+  type-aliases-package: com.usoftchina.saas.auth.po
+  mapper-locations: classpath:mapper/*.xml
+auth:
+  private-key: auth/pri.key
+  public-key: auth/pub.key
+ribbon:
+  ReadTimeout: 5000
+  ConnectTimeout: 5000

BIN
base-servers/auth/auth-server/src/main/resources/auth/pri.key


BIN
base-servers/auth/auth-server/src/main/resources/auth/pub.key


+ 22 - 0
base-servers/auth/pom.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>base-servers</artifactId>
+    <groupId>com.usoftchina.smartschool</groupId>
+    <version>1.0.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.usoftchina.smartschool</groupId>
+  <artifactId>auth</artifactId>
+  <packaging>pom</packaging>
+  <modules>
+    <module>auth-api</module>
+    <module>auth-dto</module>
+    <module>auth-server</module>
+  </modules>
+
+
+</project>

+ 1 - 0
base-servers/pom.xml

@@ -17,6 +17,7 @@
         <module>sms</module>
         <module>account</module>
         <module>file</module>
+      <module>auth</module>
     </modules>
 
 

+ 6 - 0
base-servers/sms/pom.xml

@@ -10,6 +10,12 @@
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>sms</artifactId>
+  <packaging>pom</packaging>
+  <modules>
+    <module>sms-server</module>
+    <module>sms-api</module>
+    <module>sms-dto</module>
+  </modules>
 
 
 </project>

+ 51 - 0
base-servers/sms/sms-api/pom.xml

@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>sms</artifactId>
+    <groupId>com.usoftchina.smartschool</groupId>
+    <version>1.0.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.usoftchina.smartschool</groupId>
+  <artifactId>sms-api</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  <description>sms service api</description>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.springframework.cloud</groupId>
+      <artifactId>spring-cloud-starter-openfeign</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.cloud</groupId>
+      <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.usoftchina.smartschool</groupId>
+      <artifactId>sms-dto</artifactId>
+      <version>1.0.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>com.usoftchina.smartschool</groupId>
+      <artifactId>core</artifactId>
+      <version>1.0.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>io.github.openfeign.form</groupId>
+      <artifactId>feign-form</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>io.github.openfeign.form</groupId>
+      <artifactId>feign-form-spring</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-data-redis</artifactId>
+    </dependency>
+  </dependencies>
+
+
+</project>

+ 18 - 0
base-servers/sms/sms-api/src/main/java/com/usoftchina/smartschool/sms/api/SmsApi.java

@@ -0,0 +1,18 @@
+package com.usoftchina.smartschool.sms.api;
+
+import com.usoftchina.smartschool.base.Result;
+import com.usoftchina.smartschool.sms.dto.SmsDTO;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+@FeignClient(name = "sms-server")
+public interface SmsApi {
+
+    /**
+     * 注册成功发送手机短信
+     * @param smsDTO
+     */
+    @PostMapping(value = "/msg/send")
+    Result sendMsg(@RequestBody SmsDTO smsDTO);
+}

+ 85 - 0
base-servers/sms/sms-api/src/main/java/com/usoftchina/smartschool/sms/cache/SmsCache.java

@@ -0,0 +1,85 @@
+package com.usoftchina.smartschool.sms.cache;
+
+import com.usoftchina.smartschool.cache.BaseRedisCache;
+import com.usoftchina.smartschool.context.SpringContextHolder;
+import com.usoftchina.smartschool.utils.StringUtils;
+import org.springframework.data.redis.core.BoundValueOperations;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
+
+/**
+ * @Description 短信验证码
+ * @Author chenwei
+ * @Date 2018/12/19
+ */
+public class SmsCache<K, V> extends BaseRedisCache<String, String> {
+
+    private String mobile;
+
+    private static final RedisTemplate<String, String> REDIS_TEMPLATE = SpringContextHolder.getBean("redisTemplate", RedisTemplate.class);
+
+    private SmsCache() {
+        super(() -> REDIS_TEMPLATE);
+    }
+
+    public static SmsCache of(String mobile){
+        SmsCache cache = new SmsCache();
+        cache.mobile = mobile;
+        return cache;
+    }
+
+    @Override
+    protected String key() {
+        return generatePublicKey("sms", this.mobile);
+    }
+    protected BoundValueOperations<String, String> getBoundValueOperations() {
+        RedisTemplate<String, String> redisTemplate = super.getRedisTemplate();
+        redisTemplate.setValueSerializer(new StringRedisSerializer());
+        redisTemplate.setKeySerializer(new StringRedisSerializer());
+        return redisTemplate.boundValueOps(key());
+    }
+
+    @Override
+    public Optional<String> getCache() {
+        String value = this.getBoundValueOperations().get();
+        if (!StringUtils.isEmpty(value)){
+            return Optional.of(value);
+        }
+        return Optional.empty();
+    }
+
+    @Override
+    protected Supplier<String> getSupplier() {
+        return null;
+    }
+
+    @Override
+    public void set(String value) {
+        this.getBoundValueOperations().set(value);
+    }
+
+    @Override
+    public void set(String value, int seconds) {
+        this.getBoundValueOperations().set(value, seconds, TimeUnit.SECONDS);
+    }
+
+    /**
+     * 根据缓存中的key 清除
+     */
+    @Override
+    public void clear() {
+        super.clear();
+    }
+
+    /**
+     * 根据缓存中的key 清除
+     */
+    public void del(String key){
+        this.getRedisTemplate().delete(key);
+    }
+
+}

+ 17 - 0
base-servers/sms/sms-dto/pom.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>sms</artifactId>
+    <groupId>com.usoftchina.smartschool</groupId>
+    <version>1.0.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.usoftchina.smartschool</groupId>
+  <artifactId>sms-dto</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+
+
+</project>

+ 55 - 0
base-servers/sms/sms-dto/src/main/java/com/usoftchina/smartschool/sms/dto/SmsDTO.java

@@ -0,0 +1,55 @@
+package com.usoftchina.smartschool.sms.dto;
+
+import java.io.Serializable;
+
+public class SmsDTO implements Serializable {
+
+    /**
+     * 手机号
+     */
+    private String mobile;
+    /**
+     * 短信签名
+     */
+    private String signName;
+    /**
+     * 短信模板
+     */
+    private String templateCode;
+    /**
+     * 参数,用于替换模板中的变量 格式:{“name":"admin","tel":"18888888888"}
+     */
+    private String templateParam;
+
+    public String getMobile() {
+        return mobile;
+    }
+
+    public void setMobile(String mobile) {
+        this.mobile = mobile;
+    }
+
+    public String getSignName() {
+        return signName;
+    }
+
+    public void setSignName(String signName) {
+        this.signName = signName;
+    }
+
+    public String getTemplateCode() {
+        return templateCode;
+    }
+
+    public void setTemplateCode(String templateCode) {
+        this.templateCode = templateCode;
+    }
+
+    public String getTemplateParam() {
+        return templateParam;
+    }
+
+    public void setTemplateParam(String templateParam) {
+        this.templateParam = templateParam;
+    }
+}

+ 104 - 0
base-servers/sms/sms-server/pom.xml

@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>sms</artifactId>
+    <groupId>com.usoftchina.smartschool</groupId>
+    <version>1.0.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.usoftchina.smartschool</groupId>
+  <artifactId>sms-server</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+
+  <dependencies>
+    <dependency>
+      <groupId>com.usoftchina.smartschool</groupId>
+      <artifactId>server-starter</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.usoftchina.smartschool</groupId>
+      <artifactId>core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.usoftchina.smartschool</groupId>
+      <artifactId>sms-dto</artifactId>
+      <version>1.0.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>com.usoftchina.smartschool</groupId>
+      <artifactId>sms-api</artifactId>
+      <version>1.0.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+      <exclusions>
+        <exclusion>
+          <groupId>org.hibernate</groupId>
+          <artifactId>hibernate-validator</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.tomcat.embed</groupId>
+          <artifactId>tomcat-embed-websocket</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.cloud</groupId>
+      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.amqp</groupId>
+      <artifactId>spring-rabbit</artifactId>
+    </dependency>
+    <!-- api doc -->
+    <dependency>
+      <groupId>io.springfox</groupId>
+      <artifactId>springfox-swagger-ui</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>io.springfox</groupId>
+      <artifactId>springfox-swagger2</artifactId>
+    </dependency>
+    <!-- aliyun sms SDK -->
+    <dependency>
+      <groupId>com.aliyun</groupId>
+      <artifactId>aliyun-java-sdk-core</artifactId>
+      <version>4.0.6</version>
+    </dependency>
+    <dependency>
+      <groupId>com.aliyun</groupId>
+      <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
+      <version>1.1.0</version>
+    </dependency>
+    <!-- Test -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-test</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>com.spotify</groupId>
+        <artifactId>docker-maven-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>

+ 6 - 0
base-servers/sms/sms-server/src/main/docker/Dockerfile

@@ -0,0 +1,6 @@
+FROM frolvlad/alpine-oraclejdk8:slim
+VOLUME /tmp
+ADD sms-server-1.0.0-SNAPSHOT.jar app.jar
+RUN sh -c 'touch /app.jar'
+ENV JAVA_OPTS=""
+ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

+ 19 - 0
base-servers/sms/sms-server/src/main/java/com/usoftchina/smartschool/sms/SmsApplication.java

@@ -0,0 +1,19 @@
+package com.usoftchina.smartschool.sms;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+
+/**
+ * @author yingp
+ * @date 2018/10/10
+ */
+@SpringBootApplication
+@EnableFeignClients("com.usoftchina.smartschool.sms.api")
+@EnableEurekaClient
+public class SmsApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(SmsApplication.class, args);
+    }
+}

+ 45 - 0
base-servers/sms/sms-server/src/main/java/com/usoftchina/smartschool/sms/config/SmsConfig.java

@@ -0,0 +1,45 @@
+package com.usoftchina.smartschool.sms.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@ConfigurationProperties("sms.config")
+public class SmsConfig {
+
+    private String product;
+    private String domain;
+
+    private String accessKeyId;
+    private String accessKeySecret;
+
+    public String getProduct() {
+        return product;
+    }
+
+    public void setProduct(String product) {
+        this.product = product;
+    }
+
+    public String getDomain() {
+        return domain;
+    }
+
+    public void setDomain(String domain) {
+        this.domain = domain;
+    }
+
+    public String getAccessKeyId() {
+        return accessKeyId;
+    }
+
+    public void setAccessKeyId(String accessKeyId) {
+        this.accessKeyId = accessKeyId;
+    }
+
+    public String getAccessKeySecret() {
+        return accessKeySecret;
+    }
+
+    public void setAccessKeySecret(String accessKeySecret) {
+        this.accessKeySecret = accessKeySecret;
+    }
+}

+ 37 - 0
base-servers/sms/sms-server/src/main/java/com/usoftchina/smartschool/sms/controller/SmsController.java

@@ -0,0 +1,37 @@
+package com.usoftchina.smartschool.sms.controller;
+
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
+import com.aliyuncs.exceptions.ClientException;
+import com.usoftchina.smartschool.base.Result;
+import com.usoftchina.smartschool.exception.BizException;
+import com.usoftchina.smartschool.sms.config.SmsConfig;
+import com.usoftchina.smartschool.sms.dto.SmsDTO;
+import com.usoftchina.smartschool.sms.service.SmsService;
+import com.usoftchina.smartschool.utils.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@EnableConfigurationProperties(SmsConfig.class)
+public class SmsController {
+
+    @Autowired
+    private SmsConfig smsConfig;
+    @Autowired
+    private SmsService smsService;
+
+    @PostMapping("/msg/send")
+    public Result sendRegisterMsg(@RequestBody SmsDTO smsDTO){
+        SendSmsResponse sendSmsResponse = null;
+        try {
+            sendSmsResponse = smsService.sendMessage(smsConfig, smsDTO);
+        } catch (ClientException e) {
+            return Result.error(new BizException(Integer.parseInt(e.getErrCode()), e.getMessage()));
+        }
+        return Result.success(ObjectUtils.isEmpty(sendSmsResponse) ? null : sendSmsResponse.getMessage());
+    }
+
+}

+ 17 - 0
base-servers/sms/sms-server/src/main/java/com/usoftchina/smartschool/sms/service/SmsService.java

@@ -0,0 +1,17 @@
+package com.usoftchina.smartschool.sms.service;
+
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
+import com.aliyuncs.exceptions.ClientException;
+import com.usoftchina.smartschool.sms.config.SmsConfig;
+import com.usoftchina.smartschool.sms.dto.SmsDTO;
+
+public interface SmsService {
+
+    /**
+     * 发送短信
+     * @param smsDTO
+     * @return
+     */
+    SendSmsResponse sendMessage(SmsConfig smsConfig, SmsDTO smsDTO) throws ClientException;
+
+}

+ 47 - 0
base-servers/sms/sms-server/src/main/java/com/usoftchina/smartschool/sms/service/impl/SmsServiceImpl.java

@@ -0,0 +1,47 @@
+package com.usoftchina.smartschool.sms.service.impl;
+
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.profile.DefaultProfile;
+import com.aliyuncs.profile.IClientProfile;
+import com.usoftchina.smartschool.sms.config.SmsConfig;
+import com.usoftchina.smartschool.sms.dto.SmsDTO;
+import com.usoftchina.smartschool.sms.service.SmsService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class SmsServiceImpl implements SmsService {
+
+    @Override
+    public SendSmsResponse sendMessage(SmsConfig smsConfig, SmsDTO smsDTO) throws ClientException {
+        //设置超时时间
+        System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
+        System.setProperty("sun.net.client.defaultReadTimeout", "10000");
+        //初始化acsClient,暂不支持region化
+        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", smsConfig.getAccessKeyId(), smsConfig.getAccessKeySecret());
+        DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", smsConfig.getProduct(), smsConfig.getDomain());
+        IAcsClient acsClient = new DefaultAcsClient(profile);
+        //组装请求对象
+        SendSmsRequest request = new SendSmsRequest();
+        //待发送手机号
+        request.setPhoneNumbers(smsDTO.getMobile());
+        //短信签名
+        request.setSignName(smsDTO.getSignName());
+        //短信模板
+        request.setTemplateCode(smsDTO.getTemplateCode());
+        //变量
+        request.setTemplateParam(smsDTO.getTemplateParam());
+        SendSmsResponse sendSmsResponse = null;
+        try {
+            sendSmsResponse = acsClient.getAcsResponse(request);
+        }catch (Exception e){
+            e.printStackTrace();
+            return null;
+        }
+        return sendSmsResponse;
+    }
+
+}

+ 68 - 0
base-servers/sms/sms-server/src/main/resources/application.yml

@@ -0,0 +1,68 @@
+spring:
+  profiles:
+    active: dev
+  application:
+    name: sms-server
+  security:
+    user:
+      name: admin
+      password: select111***
+  messages:
+    basename: i18n/messages
+  rabbitmq:
+    host: 10.10.100.166
+    port: 5672
+    virtual-host: school
+    username: school
+    password: select123***
+  redis:
+    host: 10.10.100.166
+    port: 6379
+  zipkin:
+    sender:
+      type: rabbit
+    locator:
+      discovery:
+        enabled: true
+  sleuth:
+    sampler:
+      probability: 1.0
+eureka:
+  instance:
+    leaseRenewalIntervalInSeconds: 10
+    health-check-url-path: /actuator/health
+    status-page-url-path: /actuator/info
+    prefer-ip-address: true
+    metadata-map:
+      user.name: ${spring.security.user.name}
+      user.password: ${spring.security.user.password}
+  client:
+    registryFetchIntervalSeconds: 5
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:9500/eureka/
+management:
+  endpoints:
+    web:
+      exposure:
+        include: "*"
+  endpoint:
+    health:
+      show-details: always
+server:
+  port: 9660
+  tomcat:
+    uri-encoding: UTF-8
+info:
+  name: '@project.artifactId@'
+  description: '@project.description@'
+  version: '@project.version@'
+  spring-boot-version: '@spring.boot.version@'
+  spring-cloud-version: '@spring.cloud.version@'
+auth:
+  public-key: auth/pub.key
+sms:
+  config:
+    product: Dysmsapi
+    domain: dysmsapi.aliyuncs.com
+    accessKeyId: LTAIf3jgw6hzVhw0
+    accessKeySecret: tvR2pvO3HtB7gay7EXFgg0SEp2rXon

BIN
base-servers/sms/sms-server/src/main/resources/auth/pub.key


+ 12 - 0
base-servers/sms/sms-server/src/main/resources/config/application-docker-dev.yml

@@ -0,0 +1,12 @@
+eureka:
+  instance:
+    hostname: saas-sms-server-dev
+    prefer-ip-address: false
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server-dev:8510/eureka/
+spring:
+  rabbitmq:
+    virtual-host: dev
+server:
+  port: 8680

+ 23 - 0
base-servers/sms/sms-server/src/main/resources/config/application-docker-prod.yml

@@ -0,0 +1,23 @@
+eureka:
+  instance:
+    hostname: saas-sms-server
+    prefer-ip-address: false
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server:8500/eureka/
+spring:
+  rabbitmq:
+    host: 10.10.100.103
+    port: 5672
+    virtual-host: docker
+    username: saas
+    password: select123***
+  datasource:
+    url: jdbc:mysql://10.10.100.18:3306/saas_biz?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
+    username: saas
+    password: select111***
+  redis:
+    host: 10.10.100.173
+    port: 6379
+logging:
+  destination: 10.10.100.160:5000

+ 12 - 0
base-servers/sms/sms-server/src/main/resources/config/application-docker-test.yml

@@ -0,0 +1,12 @@
+eureka:
+  instance:
+    hostname: saas-sms-server-test
+    prefer-ip-address: false
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server-test:8515/eureka/
+spring:
+  rabbitmq:
+    virtual-host: test
+server:
+  port: 8705

+ 10 - 0
base-servers/sms/sms-server/src/main/resources/config/application-docker.yml

@@ -0,0 +1,10 @@
+eureka:
+  instance:
+    hostname: saas-sms-server
+    prefer-ip-address: false
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server:8500/eureka/
+spring:
+  rabbitmq:
+    virtual-host: docker