浏览代码

合并dev代码

wangmh 7 年之前
父节点
当前提交
4311ea59bc
共有 30 个文件被更改,包括 316 次插入297 次删除
  1. 4 0
      sso-manage-console/build.gradle
  2. 34 0
      sso-manage-console/src/main/java/com/uas/sso/sso/backend/CacheConfiguration.java
  3. 3 1
      sso-manage-console/src/main/java/com/uas/sso/sso/backend/api/AppealBackendController.java
  4. 3 1
      sso-manage-console/src/main/java/com/uas/sso/sso/backend/api/UserManageController.java
  5. 2 1
      sso-manage-console/src/main/java/com/uas/sso/sso/backend/api/UserSpaceManageController.java
  6. 2 3
      sso-manage-console/src/main/java/com/uas/sso/sso/backend/service/impl/UserBackendServiceImpl.java
  7. 1 1
      sso-manage-console/src/main/java/com/uas/sso/sso/backend/service/impl/UserSpaceServiceImpl.java
  8. 11 0
      sso-manage-console/src/main/resources/application.yml
  9. 3 0
      sso-server/build.gradle
  10. 34 0
      sso-server/src/main/java/com/uas/sso/CacheConfiguration.java
  11. 36 53
      sso-server/src/main/java/com/uas/sso/controller/AppealController.java
  12. 26 63
      sso-server/src/main/java/com/uas/sso/controller/LoginController.java
  13. 2 0
      sso-server/src/main/java/com/uas/sso/controller/PersonalRegisterController.java
  14. 9 1
      sso-server/src/main/java/com/uas/sso/controller/UpdateUserController.java
  15. 2 0
      sso-server/src/main/java/com/uas/sso/controller/UserspaceRegisterController.java
  16. 6 1
      sso-server/src/main/java/com/uas/sso/controller/YunCenterController.java
  17. 10 9
      sso-server/src/main/java/com/uas/sso/entity/PartnershipRecord.java
  18. 9 35
      sso-server/src/main/java/com/uas/sso/entity/User.java
  19. 8 3
      sso-server/src/main/java/com/uas/sso/entity/Userspace.java
  20. 4 3
      sso-server/src/main/java/com/uas/sso/service/AppealService.java
  21. 0 29
      sso-server/src/main/java/com/uas/sso/service/UserAccountService.java
  22. 18 0
      sso-server/src/main/java/com/uas/sso/service/UserRecordService.java
  23. 46 20
      sso-server/src/main/java/com/uas/sso/service/impl/AppealServiceImpl.java
  24. 5 4
      sso-server/src/main/java/com/uas/sso/service/impl/PartnershipServiceImpl.java
  25. 1 1
      sso-server/src/main/java/com/uas/sso/service/impl/PersonalAccountServiceImpl.java
  26. 1 39
      sso-server/src/main/java/com/uas/sso/service/impl/UserAccountServiceImpl.java
  27. 20 0
      sso-server/src/main/java/com/uas/sso/service/impl/UserRecordServiceImpl.java
  28. 5 5
      sso-server/src/main/java/com/uas/sso/service/impl/UserServiceImpl.java
  29. 11 1
      sso-server/src/main/resources/application.yml
  30. 0 23
      sso-server/src/main/resources/spring/spring-ehcache.xml

+ 4 - 0
sso-manage-console/build.gradle

@@ -34,6 +34,10 @@ dependencies {
   compile('commons-codec:commons-codec:1.11')
   compile("mysql:mysql-connector-java:5.1.41")
   compile("com.alibaba:druid:1.1.6")
+  compile("net.sf.ehcache:ehcache:2.10.3")
+  compile("org.hibernate:hibernate-ehcache") {
+    exclude(group: 'net.sf.ehcache', module: 'ehcache-core')
+  }
 
   testCompile('org.springframework.boot:spring-boot-starter-test')
 }

+ 34 - 0
sso-manage-console/src/main/java/com/uas/sso/sso/backend/CacheConfiguration.java

@@ -0,0 +1,34 @@
+package com.uas.sso.sso.backend;
+
+import org.springframework.beans.factory.annotation.Configurable;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.cache.ehcache.EhCacheCacheManager;
+import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.core.io.ClassPathResource;
+
+/**
+ * @author wangmh
+ * @create 2018-07-05 20:04
+ * @desc
+ **/
+@Configurable
+@EnableCaching
+public class CacheConfiguration {
+
+    @Bean
+    public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {
+        EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean();
+        ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource(
+                "spring/ehcache.xml"));
+        ehCacheManagerFactoryBean.setShared(true);
+        return ehCacheManagerFactoryBean;
+    }
+
+    @Bean
+    public EhCacheCacheManager cacheManager() {
+        EhCacheCacheManager cacheManager = new EhCacheCacheManager();
+        cacheManager.setCacheManager(ehCacheManagerFactoryBean().getObject());
+        return cacheManager;
+    }
+}

+ 3 - 1
sso-manage-console/src/main/java/com/uas/sso/sso/backend/api/AppealBackendController.java

@@ -12,6 +12,8 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.Optional;
+
 /**
  * Api interface implementations for managing appeal.
  *
@@ -39,7 +41,7 @@ public class AppealBackendController {
             @RequestParam(required = false) String keyword) {
 
         return new ResultBean<>(
-                appealService.showAppealsByPagination(page, type, fromApp, status, key, keyword));
+                appealService.showAppealsByPagination(page, type, fromApp, status, key, Optional.ofNullable(keyword).map(String::trim).orElse(null)));
     }
 
     @RequestMapping(method = RequestMethod.PUT, path = "/{appealId}/approveAppealRequest",

+ 3 - 1
sso-manage-console/src/main/java/com/uas/sso/sso/backend/api/UserManageController.java

@@ -8,6 +8,8 @@ import com.uas.sso.sso.backend.dto.UpdateUserInfo;
 import com.uas.sso.sso.backend.service.UserBackendService;
 import com.uas.sso.sso.backend.support.ResultBean;
 import java.util.List;
+import java.util.Optional;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Pageable;
 import org.springframework.http.MediaType;
@@ -45,7 +47,7 @@ public class UserManageController {
             @RequestParam(required = false) String keyword) {
         // Controller中的Pageable类型参数默认根据查询参数 page 和 size 注入并实例化
         return new ResultBean<>(
-                userBackendService.showUserByPagination(page, fromApp, mobileValidCode, identityValidCode, key, keyword));
+                userBackendService.showUserByPagination(page, fromApp, mobileValidCode, identityValidCode, key, Optional.ofNullable(keyword).map(String::trim).orElse(null)));
     }
 
     @RequestMapping(method = RequestMethod.GET, path = "//showEnUserByPagination",

+ 2 - 1
sso-manage-console/src/main/java/com/uas/sso/sso/backend/api/UserSpaceManageController.java

@@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
+import java.util.Optional;
 
 /**
  * Api interface implementations for managing user space.
@@ -41,7 +42,7 @@ public class UserSpaceManageController {
             @RequestParam(required = false) String key,
             @RequestParam(required = false) String keyword) {
 
-        return new ResultBean<>(spaceService.showSpaceByPagination(page, validCode, fromApp, key, keyword));
+        return new ResultBean<>(spaceService.showSpaceByPagination(page, validCode, fromApp, key, Optional.ofNullable(keyword).map(String::trim).orElse(null)));
     }
 
     @RequestMapping(method = RequestMethod.PUT, path = "//modifySpaceInfo",

+ 2 - 3
sso-manage-console/src/main/java/com/uas/sso/sso/backend/service/impl/UserBackendServiceImpl.java

@@ -263,9 +263,8 @@ public class UserBackendServiceImpl implements UserBackendService {
         user.setEmailValidCode((short) Status.NOT_APPLYING.getCode());
         user.setIdentityValidCode((short) Status.NOT_APPLYING.getCode());
         user.setPassword(InfoAsyncUtils.encryptePassword(Const.ENCRY_FORMAT, user.getPassword(), user.getSalt()));
-        user.setUserRecord(new UserRecord());
-        user.getUserRecord().setUser(user);
-        user.getUserRecord().setUserUU(user.getUserUU());
+        UserRecord userRecord = new UserRecord(user.getUserUU());
+        userRecordDao.save(userRecord);
         user.setFromApp("sso");
         userDao.save(user);
 

+ 1 - 1
sso-manage-console/src/main/java/com/uas/sso/sso/backend/service/impl/UserSpaceServiceImpl.java

@@ -136,7 +136,7 @@ public class UserSpaceServiceImpl implements UserSpaceService {
             }
         }
 
-        if (!spaceInfo.getBusinessCode().equals(userspace.getBusinessCode())) {
+        if (spaceInfo.getBusinessCode() != null && !spaceInfo.getBusinessCode().equals(userspace.getBusinessCode())) {
             Userspace oldSpace = userspaceDao.findByBusinessCode(spaceInfo.getBusinessCode());
             if (oldSpace != null) {
                 throw new ValidationFailedException(String.format("企业营业执照号'%s'已被注册,请确认 ", spaceInfo.getBusinessCode()));

+ 11 - 0
sso-manage-console/src/main/resources/application.yml

@@ -15,6 +15,17 @@ spring:
   jpa:
     database: mysql
     show-sql: false
+    properties:
+      javax:
+        persistence:
+          sharedCache:
+            mode: ENABLE_SELECTIVE
+      hibernate:
+        cache:
+          use_second_level_cache: true
+          use_query_cache: true
+          region:
+            factory_class: org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
   thymeleaf:
     mode: LEGACYHTML5
 # 避免自动建表更新账户中心的数据库结构

+ 3 - 0
sso-server/build.gradle

@@ -59,6 +59,9 @@ dependencies {
     compile("org.codehaus.jackson:jackson-core-asl:1.9.13")
     compile("org.codehaus.jackson:jackson-mapper-asl:1.9.13")
     compile("net.sf.ehcache:ehcache:2.10.3")
+    compile("org.hibernate:hibernate-ehcache") {
+      exclude(group: 'net.sf.ehcache', module: 'ehcache-core')
+    }
 
     testCompile("org.springframework.boot:spring-boot-starter-test")
 }

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

@@ -0,0 +1,34 @@
+package com.uas.sso;
+
+import org.springframework.beans.factory.annotation.Configurable;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.cache.ehcache.EhCacheCacheManager;
+import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.core.io.ClassPathResource;
+
+/**
+ * @author wangmh
+ * @create 2018-07-05 20:04
+ * @desc
+ **/
+@Configurable
+@EnableCaching
+public class CacheConfiguration {
+
+    @Bean
+    public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {
+        EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean();
+        ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource(
+                "spring/ehcache.xml"));
+        ehCacheManagerFactoryBean.setShared(true);
+        return ehCacheManagerFactoryBean;
+    }
+
+    @Bean
+    public EhCacheCacheManager cacheManager() {
+        EhCacheCacheManager cacheManager = new EhCacheCacheManager();
+        cacheManager.setCacheManager(ehCacheManagerFactoryBean().getObject());
+        return cacheManager;
+    }
+}

+ 36 - 53
sso-server/src/main/java/com/uas/sso/controller/AppealController.java

@@ -1,19 +1,16 @@
 package com.uas.sso.controller;
 
-import com.alibaba.fastjson.JSON;
-import com.uas.sso.SSOHelper;
-import com.uas.sso.SSOToken;
 import com.uas.sso.entity.*;
+import com.uas.sso.exception.VisibleError;
 import com.uas.sso.service.*;
-import com.uas.sso.support.SystemSession;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.ui.ModelMap;
+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.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
-
 /**
  * @author wangmh
  * @create 2018-01-16 8:50
@@ -43,6 +40,9 @@ public class AppealController extends BaseController {
      */
     @RequestMapping(value = "/check/mobile", method = RequestMethod.GET)
     public ModelMap checkMobile(String mobile) {
+        if (StringUtils.isEmpty(mobile)) {
+            return error("手机号不能为空");
+        }
         String token = getMobileToken(mobile);
         ModelMap data = new ModelMap("token", token);
         data.put("code", request.getSession().getAttribute("code"));
@@ -82,55 +82,38 @@ public class AppealController extends BaseController {
      */
     @RequestMapping(value = "/resetPwd", method = RequestMethod.POST)
     public ModelMap resetPwd(Appeal appeal, @RequestParam String token, String code, String password, @RequestParam(defaultValue = "sso") String appId) {
-        // 获取申述人,将修改的账号作为申述人
-        User user = userService.findByMobile(appeal.getMobile());
-        if (user == null) {
-            return error("该手机号未注册");
-        }
-        Long submitterUU = user.getUserUU();
-
-        // 校验token
-        Token existToken = tokenService.findOne(token);
-        if (existToken == null || existToken.isExpired()) {
-            return error("验证码已过期,请重新获取");
-        }
-
-        // TODO 参数空检验
-
+        checkAppeal(appeal);
         // 校验验证码
         checkMobileCode(token, appeal.getMobile(), code);
-
-        // 保存申述信息
-        appeal.setSubmitterUU(submitterUU);
-        appeal.setFromApp(appId);
-        appealService.submitResetPwd(appeal, password);
+        appealService.submitResetPwd(appId, appeal, password);
         return success();
     }
 
-    @RequestMapping(value = "/changeAdmin", method = RequestMethod.POST)
-    public ModelMap changeAdmin(Appeal appeal, @RequestParam String token, String code, Userspace userspace, @RequestParam(defaultValue = "sso") String appId) {
-        // 校验token
-        Token existToken = tokenService.findOne(token);
-        if (existToken == null || existToken.isExpired()) {
-            return error("验证码已过期,请重新获取");
+    private void checkAppeal(Appeal appeal) {
+        if (StringUtils.isEmpty(appeal.getMobile())) {
+            throw new VisibleError("手机号不能为空");
         }
-
-        // 校验企业信息
-        Userspace checkSpace = userspaceService.findBySpaceName(userspace.getSpaceName());
-        if (checkSpace == null) {
-            return error("该企业未被注册,请确认");
+        if (StringUtils.isEmpty(appeal.getDescription())) {
+            throw new VisibleError("申述说明不能为空");
         }
+        if (StringUtils.isEmpty(appeal.getContactName())) {
+            throw new VisibleError("姓名不能为空");
+        }
+        if (StringUtils.isEmpty(appeal.getContactTel())) {
+            throw new VisibleError("联系电话不能为空");
+        }
+        if (StringUtils.isEmpty(appeal.getContactEmail())) {
+            throw new VisibleError("电子邮箱不能为空");
+        }
+    }
 
-        // TODO 参数空检验
-
+    @RequestMapping(value = "/changeAdmin", method = RequestMethod.POST)
+    public ModelMap changeAdmin(Appeal appeal, @RequestParam String token, String code, Userspace userspace, @RequestParam(defaultValue = "sso") String appId) {
+        checkAppeal(appeal);
         // 校验验证码
         checkMobileCode(token, appeal.getMobile(), code);
 
-        // 保存申述信息,把新管理员当作申请人
-        User submitter = userService.findByMobile(appeal.getMobile());
-        appeal.setSubmitterUU(submitter == null ? null : submitter.getUserUU());
-        appeal.setFromApp(appId);
-        appealService.submitChangeAdmin(appeal, userspace, checkSpace.getSpaceUU());
+        appealService.submitChangeAdmin(appId, appeal, userspace);
 
         // 发送短信和邮件通知审核人
         Setting mailReceiver = settingService.findOne("mailReceiverAfterRegister");
@@ -140,18 +123,18 @@ public class AppealController extends BaseController {
         return success();
     }
 
+    /**
+     * 认证账号申述
+     * @param appeal 申述信息
+     * @param token 验证码tokenId
+     * @param code 验证码
+     * @param password 密码
+     * @param appId 应用Id
+     * @return
+     */
     @RequestMapping(value = "/account", method = RequestMethod.POST)
     public ModelMap validAccount(Appeal appeal, String token, String code, String password, @RequestParam(defaultValue = "sso") String appId) {
-        // 校验用户是否登录
-        SSOToken ssoToken = SSOHelper.getToken(request);
-        if (ssoToken == null) {
-            return error("用户未登录");
-        }
-        UserAccount userAccount = JSON.parseObject(ssoToken.getData(), UserAccount.class);
-        if (userAccount == null) {
-            return error("用户未登录");
-        }
-
+        checkAppeal(appeal);
         // 校验token
         Token existToken = tokenService.findOne(token);
         if (existToken == null || existToken.isExpired()) {

+ 26 - 63
sso-server/src/main/java/com/uas/sso/controller/LoginController.java

@@ -66,6 +66,9 @@ public class LoginController extends BaseController {
     @Autowired
     private UserService userService;
 
+    @Autowired
+    private UserRecordService userRecordService;
+
     @Autowired
     private UserspaceService userspaceService;
 
@@ -125,11 +128,8 @@ public class LoginController extends BaseController {
         }
 
         // 校验账户密码输错次数
-        if (user.getUserRecord() == null) {
-            UserRecord userRecord = userService.save(new UserRecord(user.getUserUU()));
-            user.setUserRecord(userRecord);
-        }
-        int pwdErrorCount = user.getUserRecord() == null ? 0 : user.getUserRecord().getPwdErrorCount();
+        UserRecord userRecord = userRecordService.findOne(user.getUserUU());
+        int pwdErrorCount = userRecord == null ? 0 : userRecord.getPwdErrorCount();
         Object loginCaptcha = request.getSession().getAttribute(LOGIN_CAPTCHA);
         String checkCode = loginCaptcha == null ? "" : loginCaptcha.toString();
         if (pwdErrorCount >= PWD_ERROR_FIVE_TIME) {
@@ -146,7 +146,7 @@ public class LoginController extends BaseController {
         // 校验密码
         String encryPwd = userService.getEncryPassword(Const.ENCRY_FORMAT, password, user.getSalt());
         if (!encryPwd.equals(user.getPassword())) {
-            pwdErrorCount = inputErrorPwd(user.getUserRecord());
+            pwdErrorCount = inputErrorPwd(user.getUserUU());
             return error("您输入的账号或密码有误").addAttribute("errorCount", pwdErrorCount);
         }
 
@@ -360,11 +360,15 @@ public class LoginController extends BaseController {
     /**
      * 密码输错处理
      *
-     * @param userRecord 用户登录记录
-     * @return
+     * @param userUU 用户uu号
+     * @return 错误次数
      */
-    private int inputErrorPwd(UserRecord userRecord) {
+    private int inputErrorPwd(Long userUU) {
         // 密码输错次数+1
+        UserRecord userRecord = userRecordService.findOne(userUU);
+        if (userRecord == null) {
+            userRecord = new UserRecord(userUU);
+        }
         int pwdErrorCount = userRecord.getPwdErrorCount();
         userRecord.setPwdErrorCount(++pwdErrorCount);
         userService.save(userRecord);
@@ -373,59 +377,6 @@ public class LoginController extends BaseController {
         return pwdErrorCount;
     }
 
-    /**
-     * 根据用户名获得用户账号信息
-     *
-     * @param appId 应用
-     * @param username 用户名
-     * @return
-     */
-    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.findByUserUU(appId, Long.valueOf(username));
-        }
-
-        // 其余情况
-        return null;
-    }
-
-    /**
-     * 根据用户名和企业uu找到用户信息
-     *
-     * @param appId 应用
-     * @param username 用户名
-     * @param spaceUU 企业uu号
-     * @return
-     */
-    private UserAccount getUserAccountByUserName(String appId, String username, String spaceUU) {
-        String type = AccountTypeUtils.getAccountType(username);
-        if (AccountTypeUtils.MOBILE.equals(type)) {
-            // 手机号登录
-            return userAccountService.findOneByMobile(appId, username, Long.valueOf(spaceUU));
-        }
-        if (AccountTypeUtils.EMAIL.equals(type)) {
-            // 邮箱登录
-            return userAccountService.findOneByEmail(appId, username, Long.valueOf(spaceUU));
-        }
-        if (AccountTypeUtils.UU_NUMBER.equals(type)) {
-            // uu号登录
-            return userAccountService.findOneByUserUU(appId, Long.valueOf(username), Long.valueOf(spaceUU));
-        }
-
-        // 其余情况
-        return null;
-    }
-
     /**
      * 用户信息没问题,直接登录
      *
@@ -439,6 +390,8 @@ public class LoginController extends BaseController {
          * 设置登录 Cookie 最后一个参数 true 时添加 cookie 同时销毁当前 JSESSIONID
          * 创建信任的 JSESSIONID
          */
+        UserRecord userRecord = userRecordService.findOne(userAccount.getUserUU());
+        userAccount.setLastLoginTime(Optional.ofNullable(userRecord).map(UserRecord::getLastLoginTime).orElse(null));
         String baseUrl = (String) request.getSession().getAttribute("baseUrl");
         baseUrl = HttpUtil.decodeURL(baseUrl);
         SSOToken st = new SSOToken(request, userAccount.getMobile());
@@ -446,7 +399,7 @@ public class LoginController extends BaseController {
         SSOHelper.setSSOCookie(request, response, st, true);
 
         // 设置登录时间,并将密码输错次数设为0,为空则不设置
-        UserRecord userRecord = new UserRecord(userAccount.getUserUU());
+        userRecord = new UserRecord(userAccount.getUserUU());
         userRecord.setLastLoginTime(System.currentTimeMillis());
         userService.save(userRecord);
 
@@ -836,6 +789,16 @@ public class LoginController extends BaseController {
         return success(login(user.getUserUU(), appId, spaceUU, returnUrl));
     }
 
+    @GetMapping("/other")
+    public void login(String appId, Long userUU, Long spaceUU) {
+        UserAccount userAccount = spaceUU == null ? personalAccountService.findOneByUserUU(appId, userUU) : userAccountService.findOneByUserUU(appId, userUU, spaceUU);
+        loginByUser(userAccount, null, false);
+        try {
+            printJsonP("successCallback", "{success:'1'}");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
     /**
      * 碧合登录接口
      * @param appId 应用id(优软云应用id)

+ 2 - 0
sso-server/src/main/java/com/uas/sso/controller/PersonalRegisterController.java

@@ -113,6 +113,7 @@ public class PersonalRegisterController extends BaseController {
         App app = appService.findOne(appId);
         if ("mall".equals(appId)) {
             UserAccount userAccount = personalAccountService.findOneByUserUU(appId, user.getUserUU());
+            userAccount.setLastLoginTime(null);
             List<String> loginUrls = appService.findAllLoginUrl();
             ModelMap data = new ModelMap();
             data.addAttribute("data", userAccount)
@@ -125,6 +126,7 @@ public class PersonalRegisterController extends BaseController {
             return success(data);
         } else if ("city".equals(appId) || "city".equals(app.getUserControl())) {
             UserAccount userAccount = personalAccountService.findOneByUserUU(appId, user.getUserUU());
+            userAccount.setLastLoginTime(null);
             List<String> loginUrls = appService.findAllLoginUrl();
             ModelMap data = new ModelMap();
             data.addAttribute("data", userAccount)

+ 9 - 1
sso-server/src/main/java/com/uas/sso/controller/UpdateUserController.java

@@ -314,7 +314,13 @@ public class UpdateUserController extends BaseController {
         }
         Long userUU = (Long) existToken.getBind();
         User user = userService.findOne(userUU);
-        tokenService.delete(token);
+
+        if (!email.equals(user.getEmail())) {
+            List<User> users = userService.findByEmail(email);
+            if (!CollectionUtils.isEmpty(users)) {
+                return error("该邮箱已被注册");
+            }
+        }
 
         // 设置发送邮件信息
         Map<String, Object> tokenMap = new HashMap<>(2);
@@ -341,6 +347,8 @@ public class UpdateUserController extends BaseController {
                 mailService.send(mailTplId.getValue(), email, data);
             }
         }
+
+        tokenService.delete(token);
         return success();
     }
 

+ 2 - 0
sso-server/src/main/java/com/uas/sso/controller/UserspaceRegisterController.java

@@ -182,6 +182,7 @@ public class UserspaceRegisterController extends BaseController {
         App app = appService.findOne(appId);
         if ("mall".equals(appId)) {
             UserAccount userAccount = userAccountService.findOneByUserUU(appId, admin.getUserUU(), userspace.getSpaceUU());
+            userAccount.setLastLoginTime(null);
             List<String> loginUrls = appService.findAllLoginUrl();
             ModelMap data = new ModelMap();
             data.addAttribute("data", userAccount)
@@ -194,6 +195,7 @@ public class UserspaceRegisterController extends BaseController {
             return success(data);
         } else if ("city".equals(appId) || "city".equals(app.getUserControl())) {
             UserAccount userAccount = userAccountService.findOneByUserUU(appId, admin.getUserUU(), userspace.getSpaceUU());
+            userAccount.setLastLoginTime(null);
             List<String> loginUrls = appService.findAllLoginUrl();
             ModelMap data = new ModelMap();
             data.addAttribute("bgImage", "https://dfs.ubtob.com/group1/M00/88/AE/CgpkyFsPxC-ADHD8ACBM14PiAS8632.png")

+ 6 - 1
sso-server/src/main/java/com/uas/sso/controller/YunCenterController.java

@@ -2,6 +2,7 @@ package com.uas.sso.controller;
 
 import com.alibaba.fastjson.JSONObject;
 import com.uas.sso.core.Status;
+import com.uas.sso.entity.UserRecord;
 import com.uas.sso.service.*;
 import org.springframework.data.domain.Page;
 import com.uas.sso.core.Const;
@@ -30,6 +31,9 @@ public class YunCenterController extends BaseController {
     @Autowired
     private UserService userService;
 
+    @Autowired
+    private UserRecordService userRecordService;
+
     @Autowired
     private UserspaceService userspaceService;
 
@@ -53,9 +57,10 @@ public class YunCenterController extends BaseController {
         User user = userService.findOne(userAccount.getUserUU());
         user.setSalt(null);
         user.setPassword(null);
+        UserRecord userRecord = userRecordService.findOne(user.getUserUU());
         data.put("user", new ModelMap().addAllAttributes(JSONObject.parseObject(JSONObject.toJSONString(user)))
                 .addAttribute("hasQuestion", !CollectionUtils.isEmpty(user.getQuestions()))
-                .addAttribute("lastLoginTime", user.getUserRecord() == null ? null : user.getUserRecord().getLastLoginTime()));
+                .addAttribute("lastLoginTime", userRecord == null ? null : userRecord.getLastLoginTime()));
         if (userAccount.getSpaceUU() != null) {
             Userspace userspace = userspaceService.findOne(userAccount.getSpaceUU());
             data.put("userspace", userspace);

+ 10 - 9
sso-server/src/main/java/com/uas/sso/entity/PartnershipRecord.java

@@ -46,14 +46,14 @@ public class PartnershipRecord implements Serializable {
 	/**
 	 * 申请企业uu号
 	 */
-	@Column(name = "cust_space_uu", insertable = false, updatable = false)
+	@Column(name = "cust_space_uu")
 	private Long custSpaceUU;
 
 	/**
 	 * 申请企业
 	 */
 	@ManyToOne
-	@JoinColumn(name = "cust_space_uu")
+	@JoinColumn(name = "cust_space_uu", insertable = false, updatable = false)
 	private Userspace custSpace;
 
 	/**
@@ -102,14 +102,14 @@ public class PartnershipRecord implements Serializable {
 	/**
 	 * 客户的标识(如UU号等)
 	 */
-	@Column(name = "vend_space_uu", insertable = false, updatable = false)
+	@Column(name = "vend_space_uu")
 	private Long vendSpaceUU;
 
 	/**
 	 * 客户的标识(如UU号等)
 	 */
 	@ManyToOne
-	@JoinColumn(name = "vend_space_uu")
+	@JoinColumn(name = "vend_space_uu", insertable = false, updatable = false)
 	private Userspace vendSpace;
 
 	/**
@@ -127,31 +127,32 @@ public class PartnershipRecord implements Serializable {
 	/**
 	 * 审核人标志(uu号等)
 	 */
-	@JoinColumn(name = "vend_user_uu")
+	@Column(name = "vend_user_uu")
 	private Long vendUserCode;
 
 	/**
 	 * 审核人标志(uu号等)
 	 */
-	@JoinColumn(name = "vend_user_uu")
+	@ManyToOne
+	@JoinColumn(name = "vend_user_uu", insertable = false, updatable = false)
 	private User vendUser;
 
 	/**
 	 * 审核人姓名
 	 */
-	@JoinColumn(name = "vend_user_name")
+	@Column(name = "vend_user_name")
 	private String vendUserName;
 
 	/**
 	 * 审核人联系方式
 	 */
-	@JoinColumn(name = "vend_user_Tel")
+	@Column(name = "vend_user_Tel")
 	private String vendUserTel;
 
 	/**
 	 * 审核人邮箱
 	 */
-	@JoinColumn(name = "vend_user_email")
+	@Column(name = "vend_user_email")
 	private String vendUserEmail;
 
 	/**

+ 9 - 35
sso-server/src/main/java/com/uas/sso/entity/User.java

@@ -4,16 +4,19 @@ import com.alibaba.fastjson.annotation.JSONField;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.JsonInclude.Include;
 import java.io.Serializable;
-import java.sql.Time;
 import java.sql.Timestamp;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import javax.persistence.*;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.Table;
 
 import com.uas.sso.core.Const;
 import org.codehaus.jackson.annotate.JsonIgnore;
-import org.springframework.transaction.annotation.Transactional;
+import org.hibernate.annotations.*;
+import org.hibernate.annotations.Cache;
 
 /**
  * 用户信息
@@ -24,6 +27,8 @@ import org.springframework.transaction.annotation.Transactional;
 @Entity
 @Table(name = "sso$user")
 @JsonInclude(Include.NON_NULL)
+@Cacheable
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "UserCache")
 public class User implements Serializable {
 
     /**
@@ -212,13 +217,6 @@ public class User implements Serializable {
     @Column(name = "im_id")
     private String imId;
 
-    /**
-     * 用户登录记录
-     */
-    @com.fasterxml.jackson.annotation.JsonIgnore
-    @OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST}, mappedBy = "user")
-    private UserRecord userRecord;
-
     /**
      * 密保问题
      */
@@ -409,6 +407,8 @@ public class User implements Serializable {
         this.wxOpenid = wxOpenid;
     }
 
+    @JsonIgnore
+    @JSONField(deserialize = false)
     public String getWxUnionid() {
         return wxUnionid;
     }
@@ -489,16 +489,6 @@ public class User implements Serializable {
         this.imId = imId;
     }
 
-    @JsonIgnore
-    @JSONField(serialize = false)
-    public UserRecord getUserRecord() {
-        return userRecord;
-    }
-
-    public void setUserRecord(UserRecord userRecord) {
-        this.userRecord = userRecord;
-    }
-
     @JsonIgnore
     @JSONField(serialize = false)
     public List<UserQuestion> getQuestions() {
@@ -509,22 +499,6 @@ public class User implements Serializable {
         this.questions = questions;
     }
 
-    public Timestamp getLastLoginTime() {
-        if (userRecord != null && userRecord.getLastLoginTime() != null) {
-            return userRecord.getLastLoginTime();
-        } else {
-            return null;
-        }
-    }
-
-    public Integer getPwdErrorCount() {
-        if (userRecord != null) {
-            return userRecord.getPwdErrorCount();
-        } else {
-            return null;
-        }
-    }
-
     @JsonIgnore
     @JSONField(serialize = false)
     public Set<Userspace> getUserSpaces() {

+ 8 - 3
sso-server/src/main/java/com/uas/sso/entity/Userspace.java

@@ -4,10 +4,13 @@ import com.alibaba.fastjson.annotation.JSONField;
 import java.io.Serializable;
 import java.sql.Timestamp;
 import java.util.List;
+import java.util.Optional;
 import javax.persistence.*;
 
 import com.uas.sso.core.Const;
 import org.codehaus.jackson.annotate.JsonIgnore;
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
 
 /**
  * 企业实体
@@ -17,6 +20,8 @@ import org.codehaus.jackson.annotate.JsonIgnore;
  */
 @Entity
 @Table(name = "sso$userspace")
+@Cacheable
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "UserSpaceCache")
 public class Userspace implements Serializable {
 
     /**
@@ -276,7 +281,7 @@ public class Userspace implements Serializable {
     }
 
     public String getSpaceName() {
-        if (spaceName.contains(Const.REPEAT_SEPARATOR)) {
+        if (spaceName != null && spaceName.contains(Const.REPEAT_SEPARATOR)) {
             return spaceName.substring(0, spaceName.indexOf(Const.REPEAT_SEPARATOR));
         }
         return spaceName;
@@ -327,7 +332,7 @@ public class Userspace implements Serializable {
     }
 
     public String getBusinessCode() {
-        if (businessCode.contains(Const.REPEAT_SEPARATOR)) {
+        if (businessCode != null && businessCode.contains(Const.REPEAT_SEPARATOR)) {
             return businessCode.substring(0, businessCode.indexOf(Const.REPEAT_SEPARATOR));
         }
         return businessCode;
@@ -584,7 +589,7 @@ public class Userspace implements Serializable {
         userSpaceView.setSpaceUU(this.getSpaceUU());
         userSpaceView.setSpaceName(this.getSpaceName());
         userSpaceView.setCorporation(this.getCorporation());
-        userSpaceView.setRegisterDate(this.getRegisterDate().getTime());
+        userSpaceView.setRegisterDate(Optional.ofNullable(registerDate).map(Timestamp::getTime).orElse(null));
         userSpaceView.setAdmin(this.getAdmin().toView());
         userSpaceView.setAdminUU(this.getAdminUU());
         userSpaceView.setBusinessCode(this.getBusinessCode());

+ 4 - 3
sso-server/src/main/java/com/uas/sso/service/AppealService.java

@@ -12,18 +12,19 @@ public interface AppealService {
 
     /**
      * 提交重置密码申述
+     * @param appId
      * @param appeal 重置密码申述信息
      * @param password 密码
      */
-    void submitResetPwd(Appeal appeal, String password);
+    void submitResetPwd(String appId, Appeal appeal, String password);
 
     /**
      * 提交更换管理员申述
+     * @param appId 申述信息
      * @param appeal 申述信息
      * @param userspace 企业信息
-     * @param spaceUU 更换管理员的企业uu号
      */
-    void submitChangeAdmin(Appeal appeal, Userspace userspace, Long spaceUU);
+    void submitChangeAdmin(String appId, Appeal appeal, Userspace userspace);
 
     /**
      * 提交验证账号申述

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

@@ -18,26 +18,6 @@ public interface UserAccountService {
      */
     List<UserAccount> findAll();
 
-    /**
-     * 根据手机号查找用户账号
-     *
-     * @param appId 应用id
-     * @param mobile 手机号
-     * @param spaceUU 企业uu号
-     * @return
-     */
-    UserAccount findOneByMobile(String appId, String mobile, Long spaceUU);
-
-    /**
-     * 根据邮箱查找用户账号
-     *
-     * @param appId 应用id
-     * @param email 邮箱
-     * @param spaceUU 企业uu号
-     * @return
-     */
-    UserAccount findOneByEmail(String appId, String email, Long spaceUU);
-
     /**
      * 根据uu号查找用户账号
      *
@@ -57,15 +37,6 @@ public interface UserAccountService {
      */
     List<UserAccount> findByMobile(String appId, String mobile);
 
-    /**
-     * 根据邮箱和应用找到用户账号信息
-     *
-     * @param appId 应用id
-     * @param email 邮箱
-     * @return
-     */
-    List<UserAccount> findByEmail(String appId, String email);
-
     /**
      * 根据用户uu号和应用找到用户账号信息
      *

+ 18 - 0
sso-server/src/main/java/com/uas/sso/service/UserRecordService.java

@@ -1,5 +1,6 @@
 package com.uas.sso.service;
 
+import com.uas.sso.entity.UserRecord;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -11,5 +12,22 @@ import org.springframework.stereotype.Service;
 @Service
 public interface UserRecordService {
 
+    /**
+     * 清空所有用户密码错误次数
+     */
     void clearPwdErrorCount();
+
+    /**
+     * 根据用户uu号获取获取登录信息
+     * @param userUU 用户uu号
+     * @return
+     */
+    UserRecord findOne(Long userUU);
+
+    /**
+     * 保存用户登录记录
+     * @param userRecord 用户登录记录
+     * @return
+     */
+    UserRecord save(UserRecord userRecord);
 }

+ 46 - 20
sso-server/src/main/java/com/uas/sso/service/impl/AppealServiceImpl.java

@@ -1,10 +1,12 @@
 package com.uas.sso.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.uas.sso.AccountConfig;
 import com.uas.sso.core.Status;
 import com.uas.sso.dao.AppealDao;
 import com.uas.sso.entity.Appeal;
 import com.uas.sso.entity.User;
+import com.uas.sso.entity.UserAccount;
 import com.uas.sso.entity.Userspace;
 import com.uas.sso.exception.VisibleError;
 import com.uas.sso.service.AppealService;
@@ -16,6 +18,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.ui.ModelMap;
 
 import java.sql.Timestamp;
+import java.util.Optional;
 
 /**
  * @author wangmh
@@ -35,10 +38,22 @@ public class AppealServiceImpl implements AppealService {
     private UserService userService;
 
     @Override
-    public void submitResetPwd(Appeal appeal, String password) {
+    public void submitResetPwd(String appId, Appeal appeal, String password) {
+        // 获取用户信息
+        String mobile = Optional.ofNullable(appeal.getMobile())
+                .map(value -> "".equals(value) ? null : value)
+                .orElseThrow(() -> new NullPointerException("手机号不能为空"));
+        User user = Optional.ofNullable(mobile)
+                .map(value -> userService.findByMobile(value))
+                .orElseThrow(() -> new IllegalArgumentException("该手机号未注册"));
+        appId = Optional.ofNullable(appId)
+                .map(value -> "".equals(value) ? AccountConfig.ACCOUNT_CENTER : value)
+                .orElse(AccountConfig.ACCOUNT_CENTER);
+
         // 设置默认信息
         appeal.setSubmitDate(new Timestamp(System.currentTimeMillis()));
-        User user = userService.findOne(appeal.getSubmitterUU());
+        appeal.setSubmitterUU(user.getUserUU());
+        appeal.setFromApp(appId);
         ModelMap data = new ModelMap();
         data.put("password", password);
         data.put("oldMobile", user.getMobile());
@@ -56,26 +71,39 @@ public class AppealServiceImpl implements AppealService {
     }
 
     @Override
-    public void submitChangeAdmin(Appeal appeal, Userspace userspace, Long spaceUU) {
-        User newAdmin = userService.findByMobile(appeal.getMobile());
-        // 设置企业信息
-        userspace.setSpaceUU(spaceUU);
-        Userspace oldSpace = userspaceService.findOne(spaceUU);
+    public void submitChangeAdmin(String appId, Appeal appeal, Userspace userspace) {
+        String spaceName = Optional.ofNullable(userspace)
+                .map(value -> value.getSpaceName())
+                .orElseThrow(() -> new NullPointerException("企业名称不能为空"));
+        Userspace oldSpace = Optional.ofNullable(spaceName)
+                .map(value -> userspaceService.findBySpaceName(value))
+                .orElseThrow(() -> new IllegalArgumentException("该企业未被注册,请确认"));
+        User newAdmin = Optional.ofNullable(appeal)
+                .map(Appeal::getMobile)
+                .map(value -> userService.findByMobile(value))
+                .orElse(null);
+        appId = Optional.ofNullable(appId)
+                .map(value -> "".equals(value) ? AccountConfig.ACCOUNT_CENTER : value)
+                .orElse(AccountConfig.ACCOUNT_CENTER);
+        userspace.setSpaceUU(oldSpace.getSpaceUU());
         userspace.setAdmin(oldSpace.getAdmin());
 
         // 设置默认信息
         appeal.setSubmitDate(new Timestamp(System.currentTimeMillis()));
+        appeal.setFromApp(appId);
         ModelMap data = new ModelMap(userspace);
-        data.put("newAdminName", newAdmin == null ? appeal.getContactName() : newAdmin.getVipName());
-        data.put("newAdminMobile", newAdmin == null ? appeal.getMobile() : newAdmin.getMobile());
-        data.put("newAdminEmail", newAdmin == null ? appeal.getContactEmail() : newAdmin.getEmail());
+        data.put("newAdminName", Optional.ofNullable(newAdmin).map(User::getVipName).orElse(appeal.getContactName()));
+        data.put("newAdminMobile", Optional.ofNullable(newAdmin).map(User::getMobile).orElse(appeal.getMobile()));
+        data.put("newAdminEmail", Optional.ofNullable(newAdmin).map(User::getEmail).orElse(appeal.getContactEmail()));
         appeal.setSubmitInfo(JSON.toJSONString(data));
         appeal.setStatus((short) Status.TO_BE_CERTIFIED.getCode());
         appeal.setType(Appeal.Type.CHANGE_ADMIN.getDesc());
-        if (SystemSession.getUserAccount() != null) {
-            appeal.setSubmitterUU(SystemSession.getUserAccount().getUserUU());
-            appeal.setSubmitterName(SystemSession.getUserAccount().getVipName());
-        }
+
+        // 如何登录,提交人信息改成登录用户
+        Optional.ofNullable(SystemSession.getUserAccount()).ifPresent(value -> {
+            appeal.setSubmitterUU(value.getUserUU());
+            appeal.setSubmitterName(value.getVipName());
+        });
 
         // 保存申述信息
         appealDao.save(appeal);
@@ -85,11 +113,9 @@ public class AppealServiceImpl implements AppealService {
     @Override
     public void submitValidAccount(Appeal appeal, String password) {
         // 设置默认信息
-        if (SystemSession.getUserAccount() == null) {
-            throw new VisibleError("用户未登录");
-        }
+        UserAccount userAccount = Optional.ofNullable(SystemSession.getUserAccount()).orElseThrow(() -> new VisibleError("用户未登录"));
         appeal.setSubmitDate(new Timestamp(System.currentTimeMillis()));
-        User user = userService.findOne(SystemSession.getUserAccount().getUserUU());
+        User user = userService.findOne(userAccount.getUserUU());
         ModelMap data = new ModelMap();
         data.put("password", password);
         data.put("oldMobile", user.getMobile());
@@ -97,8 +123,8 @@ public class AppealServiceImpl implements AppealService {
         appeal.setSubmitInfo(JSON.toJSONString(data));
         appeal.setStatus((short) Status.TO_BE_CERTIFIED.getCode());
         appeal.setType(Appeal.Type.VALID_ACCOUNT.getDesc());
-        appeal.setSubmitterUU(SystemSession.getUserAccount().getUserUU());
-        appeal.setSubmitterName(SystemSession.getUserAccount().getVipName());
+        appeal.setSubmitterUU(userAccount.getUserUU());
+        appeal.setSubmitterName(userAccount.getVipName());
 
         // 保存申述信息
         appealDao.save(appeal);

+ 5 - 4
sso-server/src/main/java/com/uas/sso/service/impl/PartnershipServiceImpl.java

@@ -25,8 +25,7 @@ import javax.persistence.criteria.*;
 import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.List;
-
-import static com.google.common.base.Objects.equal;
+import java.util.Optional;
 
 @Service
 public class PartnershipServiceImpl implements PartnershipService {
@@ -336,7 +335,7 @@ public class PartnershipServiceImpl implements PartnershipService {
 			public Predicate toPredicate(Root<PartnershipRecord> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
 				// 添加排序
 				Predicate preStatusCode = cb.equal(root.get("statusCode").as(Short.class), statusCode);
-				query.orderBy(cb.desc(root.get("statusCode")));
+                query.orderBy(cb.desc(root.get("status").as(String.class)), cb.desc(root.get("operateDate").as(Long.class)));
 
 				// 营业执照号为空,则查询所有的
 				if (StringUtils.isEmpty(businessCode)) {
@@ -452,11 +451,12 @@ public class PartnershipServiceImpl implements PartnershipService {
 		}
 
 		// 未申请或拒绝状态,添加一条记录
-		PartnershipRecord newRecord = new PartnershipRecord(record.getAppId(), vendSpace, castSpace);
 		record.setStatusCode(Status.UNAUDIT.getCode());
 		record.setStatus(Status.UNAUDIT.getPhrase());
 		record.setRequestDate(new Timestamp(System.currentTimeMillis()));
 		record.setId(oldSendRecord == null ? oldReceiveRecord == null ? null : oldReceiveRecord.getId() : oldSendRecord.getId());
+        record.setCustSpaceUU(Optional.ofNullable(castSpace).map(Userspace::getSpaceUU).orElse(null));
+        record.setVendSpaceUU(Optional.ofNullable(vendSpace).map(Userspace::getSpaceUU).orElse(null));
 		partnershipRecordDao.save(record);
 		partnershipLog.info(record.getCustSpaceName() + "(" + record.getCustSpaceUU() + ")向" +
 				record.getVendSpaceName() + "(" + record.getVendSpaceUU() + ")发出了建立合作关系的申请");	}
@@ -515,6 +515,7 @@ public class PartnershipServiceImpl implements PartnershipService {
 		record.setStatusCode(Status.ENABLED.getCode());
 		partnershipRecordDao.save(record);
 		map.put("success", "审核成功");
+		map.put("data", record);
 		return map;
 	}
 

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

@@ -26,7 +26,7 @@ public class PersonalAccountServiceImpl implements PersonalAccountService {
      */
     private static final String JPQL= "select new com.uas.sso.entity.UserAccount(user.userUU, user.vipName, user.mobile, user.mobileArea, " +
             "user.mobileValidCode, user.password, user.salt, user.email, user.emailValidCode, " +
-            "user.identityValidCode, user.lock, app.uid, ur.lastLoginTime) from User user, App app left join user.userRecord ur where 1=1 ";
+            "user.identityValidCode, user.lock, app.uid, CURRENT_TIME()) from User user, App app where 1=1 ";
 
     @Override
     public List<UserAccount> findAll() {

+ 1 - 39
sso-server/src/main/java/com/uas/sso/service/impl/UserAccountServiceImpl.java

@@ -28,7 +28,7 @@ public class UserAccountServiceImpl implements UserAccountService {
     private static final String JPQL= "select new com.uas.sso.entity.UserAccount(user.userUU, user.vipName, user.mobile, user.mobileArea, " +
             "user.mobileValidCode, user.password, user.salt, user.email, user.emailValidCode, " +
             "user.identityValidCode, user.lock, us.spaceUU, us.spaceName, us.businessCode, " +
-            "us.domain, app.uid, ur.lastLoginTime) from User user inner join user.userSpaces us inner join us.apps app left join user.userRecord ur where 1=1 ";
+            "us.domain, app.uid, CURRENT_TIME()) from User user inner join user.userSpaces us inner join us.apps app where 1=1 ";
 
     @Override
     public List<UserAccount> findAll() {
@@ -38,32 +38,6 @@ public class UserAccountServiceImpl implements UserAccountService {
         return reports;
     }
 
-    @Override
-    public UserAccount findOneByMobile(String appId, String mobile, Long spaceUU) {
-        String sql = JPQL + " and app.uid = ?1 and user.mobile = ?2 and us.spaceUU = ?3";
-        //建立有类型的查询
-        TypedQuery<UserAccount> reportTypedQuery= entityManager.createQuery(sql, UserAccount.class);
-        //另外有详细查询条件的在jpql中留出参数位置来(?1 ?2 ?3....),然后在这设置
-        reportTypedQuery.setParameter(1, appId);
-        reportTypedQuery.setParameter(2, mobile);
-        reportTypedQuery.setParameter(3, spaceUU);
-        List<UserAccount> reports= reportTypedQuery.getResultList();
-        return CollectionUtils.isEmpty(reports) ? null : reports.get(0);
-    }
-
-    @Override
-    public UserAccount findOneByEmail(String appId, String email, Long spaceUU) {
-        String sql = JPQL + " and app.uid = ?1 and user.email = ?2 and us.spaceUU = ?3";
-        //建立有类型的查询
-        TypedQuery<UserAccount> reportTypedQuery= entityManager.createQuery(sql, UserAccount.class);
-        //另外有详细查询条件的在jpql中留出参数位置来(?1 ?2 ?3....),然后在这设置
-        reportTypedQuery.setParameter(1, appId);
-        reportTypedQuery.setParameter(2, email);
-        reportTypedQuery.setParameter(3, spaceUU);
-        List<UserAccount> reports= reportTypedQuery.getResultList();
-        return CollectionUtils.isEmpty(reports) ? null : reports.get(0);
-    }
-
     @Override
     public UserAccount findOneByUserUU(String appId, Long userUU, Long spaceUU) {
         String sql = JPQL + " and app.uid = ?1 and user.userUU = ?2 and us.spaceUU = ?3";
@@ -89,18 +63,6 @@ public class UserAccountServiceImpl implements UserAccountService {
         return reports;
     }
 
-    @Override
-    public List<UserAccount> findByEmail(String appId, String email) {
-        String sql = JPQL + " and app.uid = ?1 and user.email = ?2";
-        //建立有类型的查询
-        TypedQuery<UserAccount> reportTypedQuery= entityManager.createQuery(sql, UserAccount.class);
-        //另外有详细查询条件的在jpql中留出参数位置来(?1 ?2 ?3....),然后在这设置
-        reportTypedQuery.setParameter(1, appId);
-        reportTypedQuery.setParameter(2, email);
-        List<UserAccount> reports= reportTypedQuery.getResultList();
-        return reports;
-    }
-
     @Override
     public List<UserAccount> findByUserUU(String appId, Long userUU) {
         String sql = JPQL + " and app.uid = ?1 and user.userUU = ?2";

+ 20 - 0
sso-server/src/main/java/com/uas/sso/service/impl/UserRecordServiceImpl.java

@@ -1,6 +1,9 @@
 package com.uas.sso.service.impl;
 
+import com.uas.sso.dao.UserDao;
 import com.uas.sso.dao.UserRecordDao;
+import com.uas.sso.entity.User;
+import com.uas.sso.entity.UserRecord;
 import com.uas.sso.service.UserRecordService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -17,9 +20,26 @@ public class UserRecordServiceImpl implements UserRecordService {
     @Autowired
     private UserRecordDao userRecordDao;
 
+    @Autowired
+    private UserDao userDao;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void clearPwdErrorCount() {
         userRecordDao.clearPwdErrorCount();
     }
+
+    @Override
+    public UserRecord findOne(Long userUU) {
+        return userRecordDao.findOne(userUU);
+    }
+
+    @Override
+    public UserRecord save(UserRecord userRecord) {
+        User user = userDao.findOne(userRecord.getUserUU());
+        if (user == null) {
+            throw new IllegalArgumentException("该用户不存在");
+        }
+        return userRecordDao.save(userRecord);
+    }
 }

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

@@ -132,12 +132,11 @@ public class UserServiceImpl implements UserService {
         user.setEmailValidCode((short) Status.NOT_APPLYING.getCode());
         user.setIdentityValidCode((short) Status.NOT_APPLYING.getCode());
         user.setPassword(getEncryPassword(Const.ENCRY_FORMAT, user.getPassword(), user.getSalt()));
-        user.setUserRecord(new UserRecord());
-        user.getUserRecord().setUser(user);
-        user.getUserRecord().setUserUU(user.getUserUU());
         user.setFromApp(appId);
 
         user = userDao.save(user);
+        UserRecord userRecord = new UserRecord(user.getUserUU());
+        userRecordDao.save(userRecord);
         userLogger.info(user, Type.UPDATE_REGISTER.getValue());
 
         // 同步到各个应用
@@ -224,10 +223,11 @@ public class UserServiceImpl implements UserService {
         if (user == null) {
             throw new VisibleError("用户名不存在");
         }
-        if (user.getUserRecord() == null) {
+        UserRecord userRecord = userRecordDao.findOne(user.getUserUU());
+        if (userRecord == null) {
             return 0;
         }
-        return user.getUserRecord().getPwdErrorCount();
+        return userRecord.getPwdErrorCount();
     }
 
     @Override

+ 11 - 1
sso-server/src/main/resources/application.yml

@@ -7,15 +7,25 @@ spring:
   application:
     name: sso-server
   profiles:
-    active: prod
+    active: dev
   jpa:
     database: MYSQL
     show-sql: false
     properties:
+      javax:
+        persistence:
+          sharedCache:
+            mode: ENABLE_SELECTIVE
       hibernate:
         dialect: org.hibernate.dialect.MySQL5Dialect
         hbm2ddl:
           auto: update
+        generate_statistics: false
+        cache:
+          use_second_level_cache: true
+          use_query_cache: true
+          region:
+            factory_class: org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
 
   http:
     encoding:

+ 0 - 23
sso-server/src/main/resources/spring/spring-ehcache.xml

@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xmlns:cache="http://www.springframework.org/schema/cache"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans
-        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
-        http://www.springframework.org/schema/cache
-        http://www.springframework.org/schema/cache/spring-cache-3.2.xsd">
-
-    <description>ehcache缓存配置管理文件</description>
-
-    <!-- 启用缓存注解开关 -->
-    <cache:annotation-driven cache-manager="cacheManager"/>
-
-    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
-        <property name="cacheManager" ref="ehcache"/>
-    </bean>
-
-    <bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
-        <property name="configLocation" value="classpath:spring/ehcache.xml"/>
-    </bean>
-
-</beans>