瀏覽代碼

后台应用管理页面数据获取和展示

huxz 8 年之前
父節點
當前提交
39472e2c4e
共有 29 個文件被更改,包括 1378 次插入170 次删除
  1. 8 0
      pom.xml
  2. 17 6
      sso-common/pom.xml
  3. 245 0
      sso-common/src/main/java/com/uas/sso/entity/UserAccount.java
  4. 5 0
      sso-manage-console/src/main/java/com/uas/sso/sso/backend/api/AppManagerController.java
  5. 5 0
      sso-server/pom.xml
  6. 20 0
      sso-server/src/main/java/com/uas/sso/controller/AppManageController.java
  7. 119 122
      sso-server/src/main/java/com/uas/sso/controller/BaseController.java
  8. 250 0
      sso-server/src/main/java/com/uas/sso/controller/LoginController.java
  9. 7 12
      sso-server/src/main/java/com/uas/sso/controller/PersonalRegisterController.java
  10. 20 19
      sso-server/src/main/java/com/uas/sso/controller/UserspaceRegisterController.java
  11. 12 0
      sso-server/src/main/java/com/uas/sso/core/Const.java
  12. 45 0
      sso-server/src/main/java/com/uas/sso/core/Step.java
  13. 15 0
      sso-server/src/main/java/com/uas/sso/dao/AppDao.java
  14. 73 0
      sso-server/src/main/java/com/uas/sso/dao/UserAccountDao.java
  15. 9 0
      sso-server/src/main/java/com/uas/sso/dao/UserDao.java
  16. 16 0
      sso-server/src/main/java/com/uas/sso/dao/UserspaceDao.java
  17. 44 0
      sso-server/src/main/java/com/uas/sso/logging/LoggerManager.java
  18. 2 1
      sso-server/src/main/java/com/uas/sso/logging/RegisterBufferedLogger.java
  19. 2 1
      sso-server/src/main/java/com/uas/sso/logging/UserBufferedLogger.java
  20. 36 0
      sso-server/src/main/java/com/uas/sso/service/AppService.java
  21. 21 0
      sso-server/src/main/java/com/uas/sso/service/UserService.java
  22. 12 1
      sso-server/src/main/java/com/uas/sso/service/UserspaceService.java
  23. 37 0
      sso-server/src/main/java/com/uas/sso/service/impl/AppServiceImpl.java
  24. 71 0
      sso-server/src/main/java/com/uas/sso/service/impl/UserAccountService.java
  25. 51 0
      sso-server/src/main/java/com/uas/sso/service/impl/UserAccountServiceImpl.java
  26. 48 7
      sso-server/src/main/java/com/uas/sso/service/impl/UserServiceImpl.java
  27. 85 1
      sso-server/src/main/java/com/uas/sso/service/impl/UserspaceServiceImpl.java
  28. 34 0
      sso-server/src/main/java/com/uas/sso/util/AccountTypeUtils.java
  29. 69 0
      sso-server/src/main/java/com/uas/sso/util/ChineseUtils.java

+ 8 - 0
pom.xml

@@ -30,6 +30,8 @@
         <zookeeper.version>3.4.6</zookeeper.version>
         <zkclient.version>0.1</zkclient.version>
         <dfs.version>0.0.2</dfs.version>
+
+        <pinyin.version>2.5.1</pinyin.version>
     </properties>
 
     <dependencyManagement>
@@ -90,6 +92,12 @@
                 <artifactId>dfs-api</artifactId>
                 <version>${dfs.version}</version>
             </dependency>
+
+            <dependency>
+                <groupId>com.belerweb</groupId>
+                <artifactId>pinyin4j</artifactId>
+                <version>${pinyin.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 

+ 17 - 6
sso-common/pom.xml

@@ -22,18 +22,29 @@
             <artifactId>sso-core</artifactId>
             <version>0.0.1-SNAPSHOT</version>
         </dependency>
+
+        <!-- spring boot -->
         <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-beans</artifactId>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-context</artifactId>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.apache.tomcat.embed</groupId>
-            <artifactId>tomcat-embed-core</artifactId>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-tx</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>net.sf.flexjson</groupId>
             <artifactId>flexjson</artifactId>

+ 245 - 0
sso-common/src/main/java/com/uas/sso/entity/UserAccount.java

@@ -0,0 +1,245 @@
+package com.uas.sso.entity;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+/**
+ * 用户账号,包括个人账号
+ *
+ * @author wangmh
+ * @date 2018/1/6
+ */
+@Entity
+@Table(name = "v$user$account")
+public class UserAccount implements Serializable {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * uu号
+     */
+    @Id
+    @Column(name = "useruu")
+    private Long userUU;
+
+    /**
+     * 会员名
+     */
+    @Column(name = "vip_name", nullable = false)
+    private String vipName;
+
+    /**
+     * 手机号
+     */
+    @Column(name = "mobile", unique = true, nullable = false)
+    private String mobile;
+
+    /**
+     * 手机号所属区域(continent or Hongkong)
+     */
+    @Column(name = "mobile_area")
+    private String mobileArea;
+
+    /**
+     * 手机号认证状态
+     */
+    @Column(name = "mobile_valid_code")
+    private Short mobileValidCode;
+
+    /**
+     * 用户密码
+     */
+    @Column(name = "_password", nullable = false)
+    private String password;
+
+    /**
+     * 用户erp密码
+     */
+    @Column(name = "erp_password")
+    private String erpPassword;
+
+    /**
+     * 盐值
+     */
+    @Column(name = "salt")
+    private String salt;
+
+    /**
+     * 用户邮箱
+     */
+    @Column(name = "user_email")
+    private String email;
+
+    /**
+     * 用户邮箱认证状态
+     */
+    @Column(name = "email_valid_code")
+    private Short emailValidCode;
+
+    /**
+     * 账户是否冻结(1、冻结)
+     */
+    @Column(name = "_lock")
+    private Integer lock;
+
+    /**
+     * 企业uu号
+     */
+    @Column(name = "spaceuu")
+    private Long spaceUU;
+
+    /**
+     * 企业名称
+     */
+    @Column(name = "space_name", unique = true)
+    private String spaceName;
+
+    /**
+     * 营业执照号
+     */
+    @Column(name = "business_code")
+    private String businessCode;
+
+    /**
+     * 企业域名
+     */
+    @Column(name = "domain")
+    private String spaceDomain;
+
+    /**
+     * 应用唯一标志
+     */
+    @Column(name = "app_uid")
+    private String appId;
+
+    public Long getUserUU() {
+        return userUU;
+    }
+
+    public void setUserUU(Long userUU) {
+        this.userUU = userUU;
+    }
+
+    public String getVipName() {
+        return vipName;
+    }
+
+    public void setVipName(String vipName) {
+        this.vipName = vipName;
+    }
+
+    public String getMobile() {
+        return mobile;
+    }
+
+    public void setMobile(String mobile) {
+        this.mobile = mobile;
+    }
+
+    public String getMobileArea() {
+        return mobileArea;
+    }
+
+    public void setMobileArea(String mobileArea) {
+        this.mobileArea = mobileArea;
+    }
+
+    public Short getMobileValidCode() {
+        return mobileValidCode;
+    }
+
+    public void setMobileValidCode(Short mobileValidCode) {
+        this.mobileValidCode = mobileValidCode;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getErpPassword() {
+        return erpPassword;
+    }
+
+    public void setErpPassword(String erpPassword) {
+        this.erpPassword = erpPassword;
+    }
+
+    public String getSalt() {
+        return salt;
+    }
+
+    public void setSalt(String salt) {
+        this.salt = salt;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public Short getEmailValidCode() {
+        return emailValidCode;
+    }
+
+    public void setEmailValidCode(Short emailValidCode) {
+        this.emailValidCode = emailValidCode;
+    }
+
+    public Integer getLock() {
+        return lock;
+    }
+
+    public void setLock(Integer lock) {
+        this.lock = lock;
+    }
+
+    public Long getSpaceUU() {
+        return spaceUU;
+    }
+
+    public void setSpaceUU(Long spaceUU) {
+        this.spaceUU = spaceUU;
+    }
+
+    public String getSpaceName() {
+        return spaceName;
+    }
+
+    public void setSpaceName(String spaceName) {
+        this.spaceName = spaceName;
+    }
+
+    public String getBusinessCode() {
+        return businessCode;
+    }
+
+    public void setBusinessCode(String businessCode) {
+        this.businessCode = businessCode;
+    }
+
+    public String getSpaceDomain() {
+        return spaceDomain;
+    }
+
+    public void setSpaceDomain(String spaceDomain) {
+        this.spaceDomain = spaceDomain;
+    }
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
+}

+ 5 - 0
sso-manage-console/src/main/java/com/uas/sso/sso/backend/api/AppManagerController.java

@@ -0,0 +1,5 @@
+package com.uas.sso.sso.backend.api;
+
+public class AppManagerController {
+
+}

+ 5 - 0
sso-server/pom.xml

@@ -114,6 +114,11 @@
 			<groupId>com.uas.dfs</groupId>
 			<artifactId>dfs-api</artifactId>
 		</dependency>
+
+		<dependency>
+			<groupId>com.belerweb</groupId>
+			<artifactId>pinyin4j</artifactId>
+		</dependency>
 	</dependencies>
 
 	<build>

+ 20 - 0
sso-server/src/main/java/com/uas/sso/controller/AppManageController.java

@@ -0,0 +1,20 @@
+package com.uas.sso.controller;
+
+import com.uas.sso.entity.App;
+import org.springframework.stereotype.Controller;
+
+/**
+ * Created by uas on 2018/1/5.
+ */
+@Controller
+public class AppManageController extends BaseController {
+
+    /**
+     * 保存应用信息
+     *
+     * @param app
+     */
+    public void save(App app) {
+
+    }
+}

+ 119 - 122
sso-server/src/main/java/com/uas/sso/controller/BaseController.java

@@ -25,19 +25,18 @@ import java.io.PrintWriter;
 
 /**
  * controller基础类
- * 
- * @author yingp
  *
+ * @author yingp
  */
 public class BaseController {
 
-	protected static final String defultCharset = "UTF-8";
+    protected static final String defultCharset = "UTF-8";
 
-	@Autowired
-	protected HttpServletRequest request;
+    @Autowired
+    protected HttpServletRequest request;
 
-	@Autowired
-	protected HttpServletResponse response;
+    @Autowired
+    protected HttpServletResponse response;
 
     @Autowired
     protected TokenService tokenService;
@@ -48,79 +47,77 @@ public class BaseController {
     @Autowired
     protected SettingService settingService;
 
-	protected static boolean isSuccess(ModelMap map) {
-		return Boolean.TRUE.equals(map.get("success"));
-	}
-
-	protected static Object getContent(ModelMap map) {
-		return map.get("content");
-	}
-
-	protected static ModelMap success() {
-		return new ModelMap("success", true);
-	}
-
-	protected static ModelMap success(Object data) {
-		return new ModelMap("success", true).addAttribute("content", data);
-	}
-
-	protected static ModelMap error(String errMsg) {
-		return new ModelMap("error", true).addAttribute("errMsg", errMsg);
-	}
-
-	protected static ModelMap error(Object detail) {
-		return new ModelMap("error", true).addAttribute("errDetail", detail);
-	}
-
-	protected static ModelMap error(String errCode, String errMsg) {
-		return new ModelMap("error", true).addAttribute("errCode", errCode).addAttribute("errMsg", errMsg);
-	}
-
-	/**
-	 * 输出json格式
-	 * 
-	 * @param obj
-	 * @throws IOException
-	 */
-	protected void printJson(Object obj) throws IOException {
-		response.addHeader("Content-Type", "application/json; charset=" + defultCharset);
-		PrintWriter printWriter = response.getWriter();
-		printWriter.append(JSON.toJSONString(obj));
-		printWriter.flush();
-		printWriter.close();
-	}
-
-	/**
-	 * 响应Ajax请求
-	 * 
-	 * @param content
-	 *            响应内容
-	 * @throws IOException
-	 */
-	protected void printJsonP(String callback, Object content) throws IOException {
-		if (!content.getClass().isAssignableFrom(String.class)) {
-			content = JSON.toJSON(content);
-		}
-		response.setContentType("text/html;charset=" + defultCharset);
-		PrintWriter out = response.getWriter();
-		out.print(callback + "(" + content + ")");
-		out.flush();
-	}
-
-	/**
-	 * 输出流
-	 * 
-	 * @param fileName
-	 *            文件名
-	 * @param bytes
-	 * @throws IOException
-	 */
-	protected ResponseEntity<byte[]> outputStream(String fileName, byte[] bytes) {
-		HttpHeaders headers = new HttpHeaders();
-		headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
-		headers.setContentDispositionFormData("attachment", fileName);
-		return new ResponseEntity<byte[]>(bytes, headers, HttpStatus.CREATED);
-	}
+    protected static boolean isSuccess(ModelMap map) {
+        return Boolean.TRUE.equals(map.get("success"));
+    }
+
+    protected static Object getContent(ModelMap map) {
+        return map.get("content");
+    }
+
+    protected static ModelMap success() {
+        return new ModelMap("success", true);
+    }
+
+    protected static ModelMap success(Object data) {
+        return new ModelMap("success", true).addAttribute("content", data);
+    }
+
+    protected static ModelMap error(String errMsg) {
+        return new ModelMap("error", true).addAttribute("errMsg", errMsg);
+    }
+
+    protected static ModelMap error(Object detail) {
+        return new ModelMap("error", true).addAttribute("errDetail", detail);
+    }
+
+    protected static ModelMap error(String errCode, String errMsg) {
+        return new ModelMap("error", true).addAttribute("errCode", errCode).addAttribute("errMsg", errMsg);
+    }
+
+    /**
+     * 输出json格式
+     *
+     * @param obj
+     * @throws IOException
+     */
+    protected void printJson(Object obj) throws IOException {
+        response.addHeader("Content-Type", "application/json; charset=" + defultCharset);
+        PrintWriter printWriter = response.getWriter();
+        printWriter.append(JSON.toJSONString(obj));
+        printWriter.flush();
+        printWriter.close();
+    }
+
+    /**
+     * 响应Ajax请求
+     *
+     * @param content 响应内容
+     * @throws IOException
+     */
+    protected void printJsonP(String callback, Object content) throws IOException {
+        if (!content.getClass().isAssignableFrom(String.class)) {
+            content = JSON.toJSON(content);
+        }
+        response.setContentType("text/html;charset=" + defultCharset);
+        PrintWriter out = response.getWriter();
+        out.print(callback + "(" + content + ")");
+        out.flush();
+    }
+
+    /**
+     * 输出流
+     *
+     * @param fileName 文件名
+     * @param bytes
+     * @throws IOException
+     */
+    protected ResponseEntity<byte[]> outputStream(String fileName, byte[] bytes) {
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
+        headers.setContentDispositionFormData("attachment", fileName);
+        return new ResponseEntity<byte[]>(bytes, headers, HttpStatus.CREATED);
+    }
 
     /**
      * 校验密码强度
@@ -129,30 +126,30 @@ public class BaseController {
      * @return PasswordStrength枚举
      * @throws VisibleError 用户可见异常
      */
-	protected PasswordStrength checkPasswordLevel(String password) throws VisibleError {
-		String strongRegex = "^(?=.{8,20})(((?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]))|((?=.*[0-9])((?=.*[a-zA-Z]))(?=.*[^a-zA-Z0-9]))).*$";
-		String mediumRegex = "^(?=.{8,20})(((?=.*[0-9])(?=.*[a-z]))|((?=.*[0-9])(?=.*[A-Z]))).*$";
-		if (password == null) {
-			throw new VisibleError("密码不能为空");
-		}
-		if (password.matches(strongRegex)) {
-			return PasswordStrength.STRONG;
-		} else if (password.matches(mediumRegex)) {
-			return PasswordStrength.MEDIUM;
-		} else {
-			return PasswordStrength.WEAK;
-		}
-	}
+    protected PasswordStrength checkPasswordLevel(String password) throws VisibleError {
+        String strongRegex = "^(?=.{8,20})(((?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]))|((?=.*[0-9])((?=.*[a-zA-Z]))(?=.*[^a-zA-Z0-9]))).*$";
+        String mediumRegex = "^(?=.{8,20})(((?=.*[0-9])(?=.*[a-z]))|((?=.*[0-9])(?=.*[A-Z]))).*$";
+        if (password == null) {
+            throw new VisibleError("密码不能为空");
+        }
+        if (password.matches(strongRegex)) {
+            return PasswordStrength.STRONG;
+        } else if (password.matches(mediumRegex)) {
+            return PasswordStrength.MEDIUM;
+        } else {
+            return PasswordStrength.WEAK;
+        }
+    }
 
     /**
      * 获取手机号验证码
      *
      * @return tokenId
      */
-	protected String getMobileCode(String mobile) {
+    protected String getMobileCode(String mobile) {
         // 随机获得验证码
         String code = StringUtil.getRandomNumber(6);
-        Token token = new Token(code, 10*60);
+        Token token = new Token(code, 10 * 60);
 
         // 设置绑定手机,防止获取验证码之后修改手机号
         token.setMobile(mobile);
@@ -182,12 +179,12 @@ public class BaseController {
     /**
      * 校验手机号
      *
-     * @param token 验证码tokenID
+     * @param token  验证码tokenID
      * @param mobile 手机号
-     * @param code 验证码
+     * @param code   验证码
      * @return
      * @throws VisibleError 校验失败则抛异常
-     *          当参数异常,token过期或者token绑定的手机号不对时抛出此异常
+     *                      当参数异常,token过期或者token绑定的手机号不对时抛出此异常
      */
     protected void checkMobileCode(String token, String mobile, String code) {
         // 校验参数
@@ -209,27 +206,27 @@ public class BaseController {
         }
     }
 
-	/**
-	 * 校验手机号格式
-	 *
-	 * @param mobile 手机号
-	 * @param mobileArea 手机号所属区域
-	 */
-	protected void checkMobile(String mobile, String mobileArea) {
-		// 由于现在不考虑手机号所属区域,默认为中国大陆
-		mobileArea = mobileArea == null ? Const.CONTINENT : mobileArea;
-
-		// 校验手机号
-		if (Const.CONTINENT.equals(mobileArea)) {
-			if (!mobile.matches(Const.REGEXP_MOBILE_CONTINENT)) {
-				throw new VisibleError("请输入正确的手机号格式");
-			}
-		} else if (Const.HONGKONG.equals(mobileArea)) {
-			if (!mobile.matches(Const.REGEXP_MOBILE_HONGKONG)) {
-				throw new VisibleError("请输入正确的手机号格式");
-			}
-		} else {
-			throw new VisibleError("未找到所选地区");
-		}
-	}
+    /**
+     * 校验手机号格式
+     *
+     * @param mobile     手机号
+     * @param mobileArea 手机号所属区域
+     */
+    protected void checkMobile(String mobile, String mobileArea) {
+        // 由于现在不考虑手机号所属区域,默认为中国大陆
+        mobileArea = mobileArea == null ? Const.CONTINENT : mobileArea;
+
+        // 校验手机号
+        if (Const.CONTINENT.equals(mobileArea)) {
+            if (!mobile.matches(Const.REGEXP_MOBILE_CONTINENT)) {
+                throw new VisibleError("请输入正确的手机号格式");
+            }
+        } else if (Const.HONGKONG.equals(mobileArea)) {
+            if (!mobile.matches(Const.REGEXP_MOBILE_HONGKONG)) {
+                throw new VisibleError("请输入正确的手机号格式");
+            }
+        } else {
+            throw new VisibleError("未找到所选地区");
+        }
+    }
 }

+ 250 - 0
sso-server/src/main/java/com/uas/sso/controller/LoginController.java

@@ -0,0 +1,250 @@
+package com.uas.sso.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.uas.sso.SSOConfig;
+import com.uas.sso.SSOHelper;
+import com.uas.sso.SSOToken;
+import com.uas.sso.common.util.HttpUtil;
+import com.uas.sso.core.Const;
+import com.uas.sso.entity.App;
+import com.uas.sso.entity.UserAccount;
+import com.uas.sso.service.AppService;
+import com.uas.sso.service.UserService;
+import com.uas.sso.service.impl.UserAccountService;
+import com.uas.sso.util.AccountTypeUtils;
+import com.uas.sso.web.waf.request.WafRequestWrapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.ui.ModelMap;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.*;
+
+/**
+ * 登录controller
+ *
+ * @author wangmh
+ * @date 2018/1/5
+ */
+@RequestMapping("/sso/login")
+@RestController
+public class LoginController extends BaseController {
+
+    @Autowired
+    private AppService appService;
+
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private UserAccountService userAccountService;
+
+    @RequestMapping(method = RequestMethod.POST)
+    @ResponseBody
+    public ModelMap login() {
+        // 获取登录信息
+        WafRequestWrapper wr = new WafRequestWrapper(request);
+        String appId = wr.getParameter("appId");
+        String spaceUU = wr.getParameter("spaceUU");
+        String username = StringUtils.trimAllWhitespace(wr.getParameter("username"));
+        String password = wr.getParameter("password");
+        String returnUrl = wr.getParameter("returnUrl");
+        String baseUrl = wr.getParameter("baseUrl");
+
+        // 校验空参数
+        if (StringUtils.isEmpty(username)) {
+            return error("用户名不能为空");
+        }
+        if (StringUtils.isEmpty(password)) {
+            return error("密码不能为空");
+        }
+
+        // 设置baseUrl
+        if (!StringUtils.isEmpty(baseUrl)) {
+            request.getSession().setAttribute("baseUrl", baseUrl);
+        }
+
+        // 校验appId,appId为空的话默认为sso
+        appId = StringUtils.isEmpty(appId) ? "sso" : appId;
+        App app = appService.findOne(appId);
+        if (app == null) {
+            return error("应用id不存在");
+        }
+
+        // 登录
+        App controlApp = StringUtils.isEmpty(app.getUserControl()) ? app : appService.findOne(app.getUserControl());
+        boolean personalEnable = Const.YES == controlApp.getPersonalEnable();
+
+        if (StringUtils.isEmpty(spaceUU)) {
+            /*企业uu号为空,让用户选择企业*/
+            // 找到用户账号信息
+            List<UserAccount> userAccounts = getUserAccountByUserName(controlApp.getUid(), username);
+
+            // 应用不允许个人账号,并且账号未绑定企业
+            if (!personalEnable && CollectionUtils.isEmpty(userAccounts)) {
+                return error("用户名或密码错误");
+            }
+
+            // 应用允许个人账号,并且账号未绑定企业,或者只绑定了一个企业,直接登录
+            if (userAccounts.size() == 1) {
+                return loginByUser(userAccounts.get(0), password, returnUrl);
+            }
+
+            // 由于老账户存在多个账号绑定一个邮箱的情况,把密码不符合的企业去除
+            Iterator<UserAccount> iterator = userAccounts.iterator();
+            while (iterator.hasNext()) {
+                UserAccount userAccount = iterator.next();
+                String encryPwd = userService.getEncryPassword(Const.ENCRY_FORMAT, password, userAccount.getSalt());
+                if (!encryPwd.equals(userAccount.getPassword())) {
+                    iterator.remove();
+                }
+            }
+
+            // 返回企业id和名称
+            return success(getSpaceSelect(userAccounts, personalEnable));
+        } else if (spaceUU.equals(Const.SPACEUU_PERSONAL)) {
+            // 使用个人账号登录
+            UserAccount userAccount = getUserAccountByUserName(controlApp.getUid(), username, null);
+            return loginByUser(userAccount, password, returnUrl);
+        } else {
+            // 带企业登录
+            UserAccount userAccount = getUserAccountByUserName(controlApp.getUid(), username, spaceUU);
+            return loginByUser(userAccount, password, returnUrl);
+        }
+    }
+
+    private List<UserAccount> getUserAccountByUserName(String appId, String username) {
+        String type = AccountTypeUtils.getAccountType(username);
+        if (AccountTypeUtils.MOBILE.equals(type)) {
+            // 手机号登录
+            return userAccountService.findByMobile(appId, username);
+        }
+        if (AccountTypeUtils.EMAIL.equals(type)) {
+            // 邮箱登录
+            return userAccountService.findByEmail(appId, username);
+        }
+        if (AccountTypeUtils.UU_NUMBER.equals(type)) {
+            // uu号登录
+            return userAccountService.findOneByUserUU(appId, Long.valueOf(username));
+        }
+
+        // 其余情况
+        return null;
+    }
+
+    private UserAccount getUserAccountByUserName(String appId, String username, String spaceUU) {
+        String type = AccountTypeUtils.getAccountType(username);
+        if (AccountTypeUtils.MOBILE.equals(type)) {
+            // 手机号登录
+            return userAccountService.findOneByMobile(appId, username, spaceUU);
+        }
+        if (AccountTypeUtils.EMAIL.equals(type)) {
+            // 邮箱登录
+            return userAccountService.findOneByEmail(appId, username, spaceUU);
+        }
+        if (AccountTypeUtils.UU_NUMBER.equals(type)) {
+            // uu号登录
+            return userAccountService.findOneByUserUU(appId, Long.valueOf(username), spaceUU);
+        }
+
+        // 其余情况
+        return null;
+    }
+
+    private ModelMap loginByUser(UserAccount userAccount, String password, String returnUrl) {
+        if (StringUtils.isEmpty((userAccount.getPassword()))) {
+            // 使用错误码100来判断
+            return error("100", "未设置密码");
+        } else {
+            // 校验密码
+            String encryPwd = userService.getEncryPassword(Const.ENCRY_FORMAT, password, userAccount.getSalt());
+            if (!encryPwd.equals(userAccount.getPassword())) {
+                return error("您输入的账号或密码有误");
+            }
+
+            // 登录
+            /*
+             * 设置登录 Cookie 最后一个参数 true 时添加 cookie 同时销毁当前 JSESSIONID
+             * 创建信任的 JSESSIONID
+             */
+            SSOToken st = new SSOToken(request, userAccount.getMobile());
+            st.setData(JSON.toJSONString(userAccount));
+            SSOHelper.setSSOCookie(request, response, st, true);
+
+            // 通知各个应用用户已经登录
+            ModelMap data = new ModelMap();
+            data = addOtherAppRequestData(userAccount, data, request.getSession().getAttribute("baseUrl"), true);
+            data.put("returnUrl", HttpUtil.decodeURL(returnUrl));
+            return success(data);
+        }
+    }
+
+    private ModelMap addOtherAppRequestData(UserAccount userAccount, ModelMap data, Object loginUrl,
+                                            boolean isLoginAll) {
+        // 需要通知的应用数量
+        int count = 0;
+        List<App> apps = appService.findAll();
+        List<String> loginUrls = new ArrayList<>();
+        boolean hasLoginUrl = false;
+        if (isLoginAll) {
+            for (App app : apps) {
+                if (StringUtils.isEmpty(app.getLoginUrl())) {
+                    continue;
+                }
+                if (app.getLoginUrl().equals(loginUrl)) {
+                    hasLoginUrl = true;
+                }
+                loginUrls.add(app.getLoginUrl());
+                count++;
+            }
+        }
+
+        // 添加baseUrl
+        if (!hasLoginUrl && !StringUtils.isEmpty(loginUrl)) {
+            loginUrls.add(loginUrl.toString());
+            count++;
+        }
+
+        data.put("count", count);
+        data.put("loginUrls", loginUrls);
+
+        // 添加传递数据
+        JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(userAccount));
+        Integer maxage = (Integer) request.getAttribute(SSOConfig.SSO_COOKIE_MAXAGE);
+        jsonObject.put("maxage", maxage);
+        data.put("data", jsonObject);
+        return data;
+    }
+
+    /**
+     * 获取选择企业信息(id:企业uu号,name:名称)
+     *
+     * @param userAccounts 用户账户信息
+     * @param personalEnable 该应用是否允许个人账户
+     * @return
+     */
+    private ModelMap getSpaceSelect(List<UserAccount> userAccounts, boolean personalEnable) {
+        List<Map<String, Object>> spaces = new ArrayList<Map<String, Object>>();
+        Map<String, Object> space = null;
+        // 设置带企业账号
+        for (UserAccount userAccount : userAccounts) {
+            space = new HashMap<String, Object>(2);
+            space.put("id", userAccount.getSpaceUU());
+            space.put("name", userAccount.getSpaceName());
+        }
+
+        // 设置个人账号
+        if (personalEnable) {
+            space = new HashMap<String, Object>(2);
+            space.put("id", Const.SPACEUU_PERSONAL);
+            space.put("name", String.format("%s(个人)", userAccounts.get(0).getVipName()));
+        }
+        return new ModelMap("spaces", spaces);
+    }
+
+}

+ 7 - 12
sso-server/src/main/java/com/uas/sso/controller/PersonalRegisterController.java

@@ -1,17 +1,12 @@
 package com.uas.sso.controller;
 
-import com.uas.message.sms.service.SmsService;
-import com.uas.sso.core.Const;
+import com.uas.sso.core.Step;
 import com.uas.sso.core.Type;
 import com.uas.sso.core.PasswordStrength;
-import com.uas.sso.entity.Setting;
-import com.uas.sso.entity.Token;
 import com.uas.sso.entity.User;
+import com.uas.sso.logging.LoggerManager;
 import com.uas.sso.logging.RegisterBufferedLogger;
-import com.uas.sso.service.SettingService;
-import com.uas.sso.service.TokenService;
 import com.uas.sso.service.UserService;
-import com.uas.sso.util.StringUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
@@ -33,14 +28,14 @@ public class PersonalRegisterController extends BaseController {
     @Autowired
     private UserService userService;
 
-    private RegisterBufferedLogger registerLogger = new RegisterBufferedLogger();
+    private RegisterBufferedLogger registerLogger = LoggerManager.getLogger(RegisterBufferedLogger.class);
 
     /**
      * 注册个人信息
      *
-     * @param user 用户信息(需要会员名,手机号,手机号所属区域,密码)
+     * @param user  用户信息(需要会员名,手机号,手机号所属区域,密码)
      * @param appId 注册应用标志
-     * @param code 验证码
+     * @param code  验证码
      * @param token 验证码tokenId
      * @return 成功:success(),失败:error("错误码", "错误信息")
      */
@@ -78,7 +73,7 @@ public class PersonalRegisterController extends BaseController {
         // 注册并添加注册日志
         user.setFromApp(StringUtils.isEmpty(appId) ? "sso" : appId);
         userService.register(user);
-        registerLogger.info(Type.REGISTER_PERSONAL.getValue(), 1, "个人注册成功", user, user.getFromApp());
+        registerLogger.info(Type.REGISTER_PERSONAL.getValue(), Step.FIRST.getValue(), "个人注册成功", user, user.getFromApp());
 
         // 注册成功后删除验证码token
         tokenService.delete(token);
@@ -109,7 +104,7 @@ public class PersonalRegisterController extends BaseController {
     /**
      * 校验验证码
      *
-     * @param code 验证码
+     * @param code  验证码
      * @param token 验证码tokenId
      * @return 验证成功:success(),验证失败:error("错误信息")
      */

+ 20 - 19
sso-server/src/main/java/com/uas/sso/controller/UserspaceRegisterController.java

@@ -1,9 +1,11 @@
 package com.uas.sso.controller;
 
 import com.uas.sso.core.PasswordStrength;
+import com.uas.sso.core.Step;
 import com.uas.sso.core.Type;
 import com.uas.sso.entity.User;
 import com.uas.sso.entity.Userspace;
+import com.uas.sso.logging.LoggerManager;
 import com.uas.sso.logging.RegisterBufferedLogger;
 import com.uas.sso.service.UserService;
 import com.uas.sso.service.UserspaceService;
@@ -31,14 +33,14 @@ public class UserspaceRegisterController extends BaseController {
     @Autowired
     private UserspaceService userspaceService;
 
-    private RegisterBufferedLogger registerLogger = new RegisterBufferedLogger();
+    private RegisterBufferedLogger registerLogger = LoggerManager.getLogger(RegisterBufferedLogger.class);
 
     /**
      * 企业注册第一步,验证手机号
      *
      * @param mobile 手机号
-     * @param code 验证码
-     * @param token 验证码tokenId
+     * @param code   验证码
+     * @param token  验证码tokenId
      * @return
      */
     @RequestMapping(value = "/checkAdminTel", method = RequestMethod.POST)
@@ -62,7 +64,7 @@ public class UserspaceRegisterController extends BaseController {
         tokenService.delete(token);
 
         // 添加日志
-        registerLogger.info(Type.REGISTER_USERSPACE.getValue(), 1, "企业注册", mobile, appId);
+        registerLogger.info(Type.REGISTER_USERSPACE.getValue(), Step.FIRST.getValue(), "企业注册", mobile, appId);
 
         return success(data);
     }
@@ -75,7 +77,7 @@ public class UserspaceRegisterController extends BaseController {
      */
     @RequestMapping(method = RequestMethod.POST)
     @ResponseBody
-    public ModelMap register(Userspace userspace, User user) {
+    public ModelMap register(Userspace userspace, User user, String appId) {
         // 获取企业信息
         String spaceName = userspace.getSpaceName();
         String businessCode = userspace.getBusinessCode();
@@ -103,36 +105,35 @@ public class UserspaceRegisterController extends BaseController {
             if (StringUtils.isEmpty(password)) {
                 return error("请填写正确的密码");
             }
-        }
 
-        // 校验密码强度
-        PasswordStrength strength = checkPasswordLevel(password);
-        if (PasswordStrength.WEAK.getValue() == strength.getValue()) {
-            return error("密码须为8-20字符的英文、数字混合");
+            // 新用户要校验密码强度
+            PasswordStrength strength = checkPasswordLevel(password);
+            if (PasswordStrength.WEAK.getValue() == strength.getValue()) {
+                return error("密码须为8-20字符的英文、数字混合");
+            }
         }
 
         // 设置企业管理员信息
         if (admin == null) {
             // 新用户直接注册
             admin = new User();
+            admin.setMobile(mobile);
             admin.setVipName(adminName);
             admin.setPassword(password);
             admin.setEmail(adminEmail);
-            userService.register(admin);
         } else if (StringUtils.isEmpty(admin.getEmail())) {
             // 老用户校验密码
-            userService.checkPassword(admin.getUserUU(), admin.getPassword(), false);
+            userService.checkPassword(admin.getUserUU(), user.getPassword(), false);
 
             // 老用户邮箱为空的话设置邮箱
             admin.setEmail(adminEmail);
-            userService.save(admin);
         }
 
-        // 给企业设置企业管理员
-        userspace.setAdmin(admin);
-
         // 企业注册
-        userspaceService.register(userspace);
+        userspaceService.register(userspace, admin);
+
+        // 添加日志
+        registerLogger.info(Type.REGISTER_USERSPACE.getValue(), Step.SECOND.getValue(), "企业注册", userspace, appId);
 
         return success();
     }
@@ -140,7 +141,7 @@ public class UserspaceRegisterController extends BaseController {
     /**
      * 获取验证码
      *
-     * @param mobile 手机号
+     * @param mobile     手机号
      * @param mobileArea
      * @return success(tokenId)
      */
@@ -163,7 +164,7 @@ public class UserspaceRegisterController extends BaseController {
     /**
      * 校验验证码
      *
-     * @param code 验证码
+     * @param code  验证码
      * @param token 验证码tokenId
      * @return 验证成功:success()
      */

+ 12 - 0
sso-server/src/main/java/com/uas/sso/core/Const.java

@@ -8,6 +8,11 @@ package com.uas.sso.core;
  */
 public class Const {
 
+    /**
+     * 邮箱正则
+     */
+    public static final String REGEXP_EMAIL = "^[a-z0-9]+([._\\\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$";
+
     /**
      * 中国大陆手机号正则
      */
@@ -18,6 +23,11 @@ public class Const {
      */
     public static final String REGEXP_MOBILE_HONGKONG = "[0-9]{8}";
 
+    /**
+     * 用户uu号正则
+     */
+    public static String REGEXP_USERUU_NUMBER = "^[0-9]{10}$";
+
     /**
      * 中国大陆
      */
@@ -50,4 +60,6 @@ public class Const {
     public static final String SUCCESS = "success";
 
     public static final String ERROR = "error";
+
+    public static Long SPACEUU_PERSONAL = 1L;
 }

+ 45 - 0
sso-server/src/main/java/com/uas/sso/core/Step.java

@@ -0,0 +1,45 @@
+package com.uas.sso.core;
+
+/**
+ * 步数
+ *
+ * @author wangmh
+ * @date 2018/1/6
+ */
+public enum Step {
+
+    /**
+     * 1
+     */
+    FIRST(1),
+
+    /**
+     * 2
+     */
+    SECOND(2),
+
+    /**
+     * 3
+     */
+    THIRD(3),
+
+    /**
+     * 4
+     */
+    FOURTH(4),
+
+    /**
+     * 5
+     */
+    FIFTH(5);
+
+    private int value;
+
+    Step(int value) {
+        this.value = value;
+    }
+
+    public int getValue() {
+        return value;
+    }
+}

+ 15 - 0
sso-server/src/main/java/com/uas/sso/dao/AppDao.java

@@ -0,0 +1,15 @@
+package com.uas.sso.dao;
+
+import com.uas.sso.entity.App;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+/**
+ * 应用dao, 应用主键为uid
+ *
+ * @author wangmh
+ * @date 2018/1/5
+ */
+public interface AppDao extends JpaRepository<App, String>, JpaSpecificationExecutor<App> {
+
+}

+ 73 - 0
sso-server/src/main/java/com/uas/sso/dao/UserAccountDao.java

@@ -0,0 +1,73 @@
+package com.uas.sso.dao;
+
+import com.uas.sso.entity.UserAccount;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+import java.util.List;
+
+/**
+ * 用户账号dao
+ *
+ * @author wangmh
+ * @date 2018/1/8
+ */
+public interface UserAccountDao extends JpaRepository<UserAccount, Long>, JpaSpecificationExecutor<UserAccount> {
+
+    /**
+     * 根据手机号和企业uu号查找用户账号
+     *
+     * @param appId 登录的应用
+     * @param mobile 手机号
+     * @param spaceUU 企业uu号
+     * @return 用户账户信息
+     */
+    UserAccount findByAppIdAndMobileAndSpaceUU(String appId, String mobile, String spaceUU);
+
+    /**
+     * 根据邮箱和企业uu号查找用户账号
+     *
+     * @param appId 登录的应用
+     * @param email 邮箱
+     * @param spaceUU 企业uu号
+     * @return 用户账户信息
+     */
+    UserAccount findByAppIdAndEmailAndSpaceUU(String appId, String email, String spaceUU);
+
+    /**
+     * 根据用户uu号和企业uu号查找用户账号
+     *
+     * @param appId 登录的应用
+     * @param userUU 用户uu号
+     * @param spaceUU 企业uu号
+     * @return 用户账户信息
+     */
+    UserAccount findByAppIdAndUserUUAndSpaceUU(String appId, Long userUU, String spaceUU);
+
+    /**
+     * 根据手机号和查找用户账号(包括个人账号)
+     *
+     * @param appId 登录应用
+     * @param mobile 手机号
+     * @return 用户账户信息
+     */
+    List<UserAccount> findByAppIdAndMobile(String appId, String mobile);
+
+    /**
+     * 根据邮箱查找用户账号(包括个人账号)
+     *
+     * @param appId 登录应用
+     * @param email 邮箱
+     * @return 用户账户信息
+     */
+    List<UserAccount> findByAppIdAndEmail(String appId, String email);
+
+    /**
+     * 根据用户uu号查找用户账号(包括个人账号)
+     *
+     * @param appId 登录应用
+     * @param userUU 用户uu号
+     * @return 用户账户信息
+     */
+    List<UserAccount> findByAppIdAndUserUU(String appId, Long userUU);
+}

+ 9 - 0
sso-server/src/main/java/com/uas/sso/dao/UserDao.java

@@ -54,4 +54,13 @@ public interface UserDao extends JpaRepository<User, Long>, JpaSpecificationExec
      */
     @Query("select max(u.userUU) from User u")
     Long findMaxUU();
+
+    /**
+     * 根据邮箱查找用户信息
+     *
+     * @param email 邮箱
+     * @param emailValidCode 邮箱认证状态
+     * @return
+     */
+    List<User> findByEmailAndEmailValidCode(String email, Short emailValidCode);
 }

+ 16 - 0
sso-server/src/main/java/com/uas/sso/dao/UserspaceDao.java

@@ -3,6 +3,7 @@ package com.uas.sso.dao;
 import com.uas.sso.entity.Userspace;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
 
 /**
  * 企业信息dao,Userspace实体中spaceUU为主键
@@ -27,4 +28,19 @@ public interface UserspaceDao extends JpaRepository<Userspace, Long>, JpaSpecifi
      * @return
      */
     Userspace findByBusinessCode(String businessCode);
+
+    /**
+     * 找到企业最大的uu号
+     * @return 最大的uu号
+     */
+    @Query("select max(us.spaceUU) from Userspace us")
+    Long findMaxUU();
+
+    /**
+     * 根据域名查找企业
+     *
+     * @param domain 域名
+     * @return
+     */
+    Userspace findByDomain(String domain);
 }

+ 44 - 0
sso-server/src/main/java/com/uas/sso/logging/LoggerManager.java

@@ -0,0 +1,44 @@
+package com.uas.sso.logging;
+
+import com.uas.sso.entity.BaseLog;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 日志管理工具
+ *
+ * @author wangmh
+ * @date 2018/1/6
+ */
+public class LoggerManager {
+
+    /**
+     * logs集合,key为log class名,value为log实体
+     */
+    private static Map<String, Logger> logs = new HashMap<>();
+
+    public synchronized static <T extends Logger<S>, S extends BaseLog> T getLogger(Class<T> clazz) {
+        // 获取class名
+        String clsName = clazz.getName();
+
+        // 存在实体则返回
+        if (logs.containsKey(clsName)) {
+            return (T) logs.get(clsName);
+        }
+
+        // 不存在则实例化,并添加到map
+        try {
+            T t = clazz.newInstance();
+            logs.put(clsName, t);
+            return t;
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        }
+
+        // 其余情况返回空
+        return null;
+    }
+}

+ 2 - 1
sso-server/src/main/java/com/uas/sso/logging/RegisterBufferedLogger.java

@@ -9,13 +9,14 @@ import com.uas.sso.service.UserLogService;
 import com.uas.sso.util.ContextUtils;
 
 /**
+ * 注册日志
  *
  * @author wangmh
  * @date 2018/1/2
  */
 public class RegisterBufferedLogger extends Logger<RegisterLog> {
 
-    public RegisterBufferedLogger() {
+    RegisterBufferedLogger() {
         super(ContextUtils.getBean(RegisterLogService.class));
     }
 

+ 2 - 1
sso-server/src/main/java/com/uas/sso/logging/UserBufferedLogger.java

@@ -7,13 +7,14 @@ import com.uas.sso.service.UserLogService;
 import com.uas.sso.util.ContextUtils;
 
 /**
+ * 用户信息修改日志
  *
  * @author wangmh
  * @date 2018/1/2
  */
 public class UserBufferedLogger extends Logger<UserLog> {
 
-    public UserBufferedLogger() {
+    UserBufferedLogger() {
         super(ContextUtils.getBean(UserLogService.class));
     }
 

+ 36 - 0
sso-server/src/main/java/com/uas/sso/service/AppService.java

@@ -0,0 +1,36 @@
+package com.uas.sso.service;
+
+import com.uas.sso.entity.App;
+
+import java.util.List;
+
+/**
+ * app service
+ *
+ * @author wangmh
+ * @date 2018/1/5
+ */
+public interface AppService {
+
+    /**
+     * 保存 APP信息
+     *
+     * @param app 应用
+     * @return 保存后的app
+     */
+    App save(App app);
+
+    /**
+     * 根据主键查找应用
+     *
+     * @param uid 应用唯一标志
+     * @return 应用信息
+     */
+    App findOne(String uid);
+
+    /**
+     * 查询所有应用
+     * @return
+     */
+    List<App> findAll();
+}

+ 21 - 0
sso-server/src/main/java/com/uas/sso/service/UserService.java

@@ -1,6 +1,9 @@
 package com.uas.sso.service;
 
 import com.uas.sso.entity.User;
+import com.uas.sso.entity.UserAccount;
+
+import java.util.List;
 
 /**
  * 用户信息service
@@ -71,4 +74,22 @@ public interface UserService {
      * @param isEncry 密码是否加密
      */
     void checkPassword(Long userUU, String password, boolean isEncry);
+
+    /**
+     * 根据手机号校验优软云密码,不能校验erp的密码
+     *
+     * @param mobile 登录的手机号
+     * @param password 密码
+     * @param isEncry 密码是否加密
+     */
+    void checkPasswordByMobile(String mobile, String password, boolean isEncry);
+
+    /**
+     * 根据邮箱校验优软云密码,不能校验erp的密码
+     *
+     * @param email 登录邮箱
+     * @param password 密码
+     * @param isEncry 密码是否加密
+     */
+    void checkPasswordByEmail(String email, String password, boolean isEncry);
 }

+ 12 - 1
sso-server/src/main/java/com/uas/sso/service/UserspaceService.java

@@ -1,5 +1,6 @@
 package com.uas.sso.service;
 
+import com.uas.sso.entity.User;
 import com.uas.sso.entity.Userspace;
 
 /**
@@ -13,8 +14,9 @@ public interface UserspaceService {
     /**
      * 企业注册
      * @param userspace 企业信息
+     * @param admin 管理员信息
      */
-    void register(Userspace userspace);
+    void register(Userspace userspace, User admin);
 
     /**
      * 校验企业名称
@@ -27,4 +29,13 @@ public interface UserspaceService {
      * @param businessCode 企业营业执照号
      */
     void checkBusinessCode(String businessCode);
+
+    /**
+     * 查找企业详细信息
+     *
+     * @param domain
+     *            域名
+     * @return
+     */
+    Userspace findByDomain(String domain);
 }

+ 37 - 0
sso-server/src/main/java/com/uas/sso/service/impl/AppServiceImpl.java

@@ -0,0 +1,37 @@
+package com.uas.sso.service.impl;
+
+import com.uas.sso.dao.AppDao;
+import com.uas.sso.entity.App;
+import com.uas.sso.service.AppService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * app service实现
+ *
+ * @author wangmh
+ * @date 2018/1/5
+ */
+@Service
+public class AppServiceImpl implements AppService {
+
+    @Autowired
+    private AppDao appDao;
+
+    @Override
+    public App save(App app) {
+        return appDao.save(app);
+    }
+
+    @Override
+    public App findOne(String uid) {
+        return appDao.findOne(uid);
+    }
+
+    @Override
+    public List<App> findAll() {
+        return appDao.findAll();
+    }
+}

+ 71 - 0
sso-server/src/main/java/com/uas/sso/service/impl/UserAccountService.java

@@ -0,0 +1,71 @@
+package com.uas.sso.service.impl;
+
+import com.uas.sso.entity.UserAccount;
+
+import java.util.List;
+
+/**
+ * 用户账号service
+ *
+ * @author wangmh
+ * @date 2018/1/8
+ */
+public interface UserAccountService {
+
+    /**
+     * 根据手机号查找用户账号
+     *
+     * @param appId 应用id
+     * @param mobile 手机号
+     * @param spaceUU 企业uu号
+     * @return
+     */
+    UserAccount findOneByMobile(String appId, String mobile, String spaceUU);
+
+    /**
+     * 根据邮箱查找用户账号
+     *
+     * @param appId 应用id
+     * @param email 邮箱
+     * @param spaceUU 企业uu号
+     * @return
+     */
+    UserAccount findOneByEmail(String appId, String email, String spaceUU);
+
+    /**
+     * 根据uu号查找用户账号
+     *
+     * @param appId
+     * @param userUU
+     * @param spaceUU
+     * @return
+     */
+    UserAccount findOneByUserUU(String appId, Long userUU, String spaceUU);
+
+    /**
+     * 根据手机号和应用找到用户账号信息
+     *
+     * @param appId 应用id
+     * @param mobile 手机号
+     * @return
+     */
+    List<UserAccount> findByMobile(String appId, String mobile);
+
+    /**
+     * 根据邮箱和应用找到用户账号信息
+     *
+     * @param appId 应用id
+     * @param email 邮箱
+     * @return
+     */
+    List<UserAccount> findByEmail(String appId, String email);
+
+    /**
+     * 根据用户uu号和应用找到用户账号信息
+     *
+     * @param appId 应用id
+     * @param userUU 用户uu号
+     * @return
+     */
+    List<UserAccount> findOneByUserUU(String appId, Long userUU);
+}

+ 51 - 0
sso-server/src/main/java/com/uas/sso/service/impl/UserAccountServiceImpl.java

@@ -0,0 +1,51 @@
+package com.uas.sso.service.impl;
+
+import com.uas.sso.dao.UserAccountDao;
+import com.uas.sso.entity.UserAccount;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 用户账户service实现类
+ *
+ * @author wangmh
+ * @date 2018/1/8
+ */
+@Service
+public class UserAccountServiceImpl implements UserAccountService {
+
+    @Autowired
+    private UserAccountDao userAccountDao;
+
+    @Override
+    public UserAccount findOneByMobile(String appId, String mobile, String spaceUU) {
+        return userAccountDao.findByAppIdAndMobileAndSpaceUU(appId, mobile, spaceUU);
+    }
+
+    @Override
+    public UserAccount findOneByEmail(String appId, String email, String spaceUU) {
+        return userAccountDao.findByAppIdAndEmailAndSpaceUU(appId, email, spaceUU);
+    }
+
+    @Override
+    public UserAccount findOneByUserUU(String appId, Long userUU, String spaceUU) {
+        return userAccountDao.findByAppIdAndUserUUAndSpaceUU(appId, userUU, spaceUU);
+    }
+
+    @Override
+    public List<UserAccount> findByMobile(String appId, String mobile) {
+        return userAccountDao.findByAppIdAndMobile(appId, mobile);
+    }
+
+    @Override
+    public List<UserAccount> findByEmail(String appId, String email) {
+        return userAccountDao.findByAppIdAndEmail(appId, email);
+    }
+
+    @Override
+    public List<UserAccount> findOneByUserUU(String appId, Long userUU) {
+        return userAccountDao.findByAppIdAndUserUU(appId, userUU);
+    }
+}

+ 48 - 7
sso-server/src/main/java/com/uas/sso/service/impl/UserServiceImpl.java

@@ -7,15 +7,18 @@ import com.uas.sso.core.Type;
 import com.uas.sso.dao.UserDao;
 import com.uas.sso.entity.User;
 import com.uas.sso.exception.VisibleError;
+import com.uas.sso.logging.LoggerManager;
 import com.uas.sso.logging.UserBufferedLogger;
 import com.uas.sso.service.UserService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
 import com.uas.sso.exception.AccountException;
 
 import java.sql.Timestamp;
+import java.util.List;
 
 /**
  * 用户service实现类
@@ -29,7 +32,7 @@ public class UserServiceImpl implements UserService {
     @Autowired
     private UserDao userDao;
 
-    private UserBufferedLogger userLog = new UserBufferedLogger();
+    private UserBufferedLogger userLog = LoggerManager.getLogger(UserBufferedLogger.class);
 
     @Override
     public User findByMobile(String mobile, String mobileArea) {
@@ -67,9 +70,9 @@ public class UserServiceImpl implements UserService {
         Long uu = userDao.findMaxUU();
         user.setUserUU(uu == null ? 10000 : (uu + 1));
         user.setSalt(String.valueOf(user.getUserUU()));
-        user.setMobileIsValid((short) Status.AUTHENTICATED.getCode());
-        user.setEmailIsValid((short) Status.NOT_APPLYING.getCode());
-        user.setIdentityIsValid((short) Status.NOT_APPLYING.getCode());
+        user.setMobileValidCode((short) Status.AUTHENTICATED.getCode());
+        user.setEmailValidCode((short) Status.NOT_APPLYING.getCode());
+        user.setIdentityValidCode((short) Status.NOT_APPLYING.getCode());
         user.setPassword(getEncryPassword(Const.ENCRY_FORMAT, user.getPassword(), user.getSalt()));
 
         userDao.save(user);
@@ -104,9 +107,48 @@ public class UserServiceImpl implements UserService {
         // 根据用户uu号找到旧数据
         User oldUser = userDao.findByUserUU(userUU);
         if (oldUser == null) {
-            throw new VisibleError("该用户不存在");
+            throw new VisibleError("用户名或密码错误");
         }
 
+        // 校验密码
+        checkPassword(oldUser, password, isEncry);
+
+    }
+
+    @Override
+    public void checkPasswordByMobile(String mobile, String password, boolean isEncry) {
+        // 找到用户
+        User oldUser = userDao.findByMobile(mobile);
+        if (oldUser == null) {
+            throw new VisibleError("用户名或密码错误");
+        }
+
+        // 校验密码
+        checkPassword(oldUser, password, isEncry);
+    }
+
+    @Override
+    public void checkPasswordByEmail(String email, String password, boolean isEncry) {
+        // 找到用户
+        List<User> oldUsers = userDao.findByEmailAndEmailValidCode(email, (short) Status.AUTHENTICATED.getCode());
+        if (CollectionUtils.isEmpty(oldUsers)) {
+            throw new VisibleError("该邮箱未认证,请使用手机号登录");
+        }
+
+        // 校验密码
+        for (User oldUser : oldUsers) {
+            checkPassword(oldUser, password, isEncry);
+        }
+    }
+
+    /**
+     * 校验用户密码
+     *
+     * @param oldUser 用户信息
+     * @param password 需要校验的密码
+     * @param isEncry 需校验的密码是否被加密
+     */
+    private void checkPassword(User oldUser, String password, boolean isEncry) {
         // 密码未加密,转换成加密后的密码
         String encryPassword = password;
         if (!isEncry) {
@@ -114,9 +156,8 @@ public class UserServiceImpl implements UserService {
         }
 
         // 校验密码
-        if (!encryPassword.equals(password)) {
+        if (!encryPassword.equals(oldUser.getPassword())) {
             throw new VisibleError("密码不一致");
         }
-
     }
 }

+ 85 - 1
sso-server/src/main/java/com/uas/sso/service/impl/UserspaceServiceImpl.java

@@ -1,11 +1,19 @@
 package com.uas.sso.service.impl;
 
 import com.uas.sso.dao.UserspaceDao;
+import com.uas.sso.entity.User;
 import com.uas.sso.entity.Userspace;
 import com.uas.sso.exception.VisibleError;
+import com.uas.sso.service.UserService;
 import com.uas.sso.service.UserspaceService;
+import com.uas.sso.util.ChineseUtils;
+import com.uas.sso.util.StringUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 企业信息service层
@@ -19,18 +27,89 @@ public class UserspaceServiceImpl implements UserspaceService {
     @Autowired
     private UserspaceDao userspaceDao;
 
+    @Autowired
+    private UserService userService;
+
+    /**
+     * 企业初始uu号
+     */
+    public static final Long SPACE_INIT_UU = 10000000L;
+
     @Override
-    public void register(Userspace userspace) {
+    public void register(Userspace userspace, User admin) {
         // 校验企业名是否重复
         checkSpaceName(userspace.getSpaceName());
 
         // 校验营业执照号是否重复
         checkBusinessCode(userspace.getBusinessCode());
 
+        // 设置域名
+       if (StringUtils.isEmpty(userspace.getDomain())) {
+           generateDefaultDomain(userspace);
+       }
+
+        // 设置uu号
+        Long maxUU = userspaceDao.findMaxUU();
+        userspace.setSpaceUU(StringUtils.isEmpty(maxUU) ? SPACE_INIT_UU : (maxUU + 1));
+
+        // 设置管理员信息
+        User oldUser = userService.findByMobile(admin.getMobile());
+        if (oldUser == null) {
+            userService.register(admin);
+        } else {
+            userService.save(admin);
+        }
+
+        // 给企业设置管理员
+        userspace.setAdmin(admin);
+
+        // 将管理员设置在企业下
+        List<User> users = new ArrayList<>();
+        users.add(admin);
+        userspace.setUsers(users);
+
         // 注册企业
         userspaceDao.save(userspace);
     }
 
+    /**
+     * 生成默认域名
+     *
+     * @return
+     */
+    private String generateDefaultDomain(Userspace userspace) {
+        String domain = null;
+        Userspace oldOne = null;
+        /// 代码复制,以后可能用到这个
+//        if (!StringUtils.isEmpty(userspace.getUrl())) {
+//            Pattern p = Pattern.compile("http(s)*://(.+\\.)*(.+)\\..+", Pattern.CASE_INSENSITIVE);
+//            Matcher m = p.matcher(userspace.getUrl());
+//            if (m.find()) {
+//                domain = m.group(3);
+//                if ("1688".equals(domain) || "taobao".equals(domain) || "qq".equals(domain) || "baidu".equals(domain)) {
+//                    domain = m.group(2);
+//                }
+//            }
+//        }
+        if (domain == null) {
+            domain = StringUtil.substr(ChineseUtils.converterToFirstSpell(StringUtils.trimAllWhitespace(userspace.getSpaceName())), 0, 16);
+        } else {
+            oldOne = findByDomain(domain);
+            if (oldOne != null) {
+                domain = StringUtil.substr(ChineseUtils.converterToFirstSpell(StringUtils.trimAllWhitespace(userspace.getSpaceName())), 0, 16);
+            }
+        }
+        oldOne = findByDomain(domain);
+        if (oldOne != null) {
+            domain = StringUtil.substr(ChineseUtils.converterToSpell(StringUtils.trimAllWhitespace(userspace.getSpaceName())), 0, 16);
+            oldOne = findByDomain(domain);
+            if (oldOne != null) {
+                domain = null;
+            }
+        }
+        return domain;
+    }
+
     @Override
     public void checkSpaceName(String spaceName) {
         Userspace userspace = userspaceDao.findBySpaceName(spaceName);
@@ -46,4 +125,9 @@ public class UserspaceServiceImpl implements UserspaceService {
             throw new VisibleError("该企业营业执照已被注册,请确认");
         }
     }
+
+    @Override
+    public Userspace findByDomain(String domain) {
+        return userspaceDao.findByDomain(domain);
+    }
 }

+ 34 - 0
sso-server/src/main/java/com/uas/sso/util/AccountTypeUtils.java

@@ -0,0 +1,34 @@
+package com.uas.sso.util;
+
+import com.uas.sso.core.Const;
+
+/**
+ * 账户类型工具类
+ *
+ * @author wangmh
+ * @date 2018/1/8
+ */
+public class AccountTypeUtils {
+
+    public final static String MOBILE = "mobile";
+
+    public final static String EMAIL = "email";
+
+    public final static String UU_NUMBER = "uuNumber";
+
+    public static String getAccountType(String username) {
+        if (username.matches(Const.REGEXP_MOBILE_CONTINENT) || username.matches(Const.REGEXP_MOBILE_HONGKONG)) {
+            // 使用的是手机号
+            return MOBILE;
+        }
+        if (username.matches(Const.REGEXP_EMAIL)){
+            // 使用的是邮箱
+            return EMAIL;
+        }
+        if (username.matches(Const.REGEXP_USERUU_NUMBER)) {
+            return UU_NUMBER;
+        }
+        // 其余情况
+        return null;
+    }
+}

+ 69 - 0
sso-server/src/main/java/com/uas/sso/util/ChineseUtils.java

@@ -0,0 +1,69 @@
+package com.uas.sso.util;
+
+import net.sourceforge.pinyin4j.PinyinHelper;
+import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
+import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
+import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
+import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
+
+public class ChineseUtils {
+
+	/**
+	 * 汉字转换位汉语拼音首字母,英文字符不变
+	 * 
+	 * @param chinese
+	 *            汉字
+	 * @return 拼音
+	 */
+	public static String converterToFirstSpell(String chinese) {
+		String pinyinName = "";
+		char[] nameChar = chinese.toCharArray();
+		HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
+		defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
+		defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
+		for (int i = 0; i < nameChar.length; i++) {
+			if (nameChar[i] > 128) {
+				try {
+					pinyinName += PinyinHelper.toHanyuPinyinStringArray(nameChar[i], defaultFormat)[0].charAt(0);
+				} catch (BadHanyuPinyinOutputFormatCombination e) {
+					e.printStackTrace();
+				} catch (ArrayIndexOutOfBoundsException e) {
+					// 特殊符号
+				}
+			} else {
+				pinyinName += nameChar[i];
+			}
+		}
+		return pinyinName;
+	}
+
+	/**
+	 * 汉字转换位汉语拼音,英文字符不变
+	 * 
+	 * @param chinese
+	 *            汉字
+	 * @return 拼音
+	 */
+	public static String converterToSpell(String chinese) {
+		String pinyinName = "";
+		char[] nameChar = chinese.toCharArray();
+		HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
+		defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
+		defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
+		for (int i = 0; i < nameChar.length; i++) {
+			if (nameChar[i] > 128) {
+				try {
+					pinyinName += PinyinHelper.toHanyuPinyinStringArray(nameChar[i], defaultFormat)[0];
+				} catch (BadHanyuPinyinOutputFormatCombination e) {
+					e.printStackTrace();
+				} catch (ArrayIndexOutOfBoundsException e) {
+					// 特殊符号
+				}
+			} else {
+				pinyinName += nameChar[i];
+			}
+		}
+		return pinyinName;
+	}
+
+}