Browse Source

Merge branch 'orderByLoginTime-1207' into dev-mysql

yangc 8 years ago
parent
commit
ef703f5ff9

+ 21 - 0
src/main/java/com/uas/platform/b2c/common/account/controller/AuthenticationController.java

@@ -1,7 +1,9 @@
 package com.uas.platform.b2c.common.account.controller;
 
+import com.uas.platform.b2c.common.account.dao.UserLoginTimeDao;
 import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.common.account.model.UserInfo;
+import com.uas.platform.b2c.common.account.model.UserLoginTime;
 import com.uas.platform.b2c.common.account.model.UserQuestion;
 import com.uas.platform.b2c.common.account.service.UserQuestionService;
 import com.uas.platform.b2c.common.account.service.UserService;
@@ -10,6 +12,7 @@ import java.util.List;
 import net.sf.ehcache.CacheManager;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
@@ -27,6 +30,9 @@ public class AuthenticationController {
 	@Autowired
 	private UserQuestionService userQuestionService;
 
+	@Autowired
+	private UserLoginTimeDao userLoginTimeDao;
+
 	@RequestMapping(method = RequestMethod.GET, headers = "Accept=application/json")
 	@ResponseBody
 	@ResponseStatus(value = HttpStatus.OK)
@@ -75,6 +81,21 @@ public class AuthenticationController {
 	@ResponseBody
 	public void switchEnterprise(@PathVariable("enUU") long enUU) {
 		User user = SystemSession.getUser();
+		//保存登录时间
+		List<UserLoginTime> userLoginTimeList = userLoginTimeDao.findByUserUUAndEnUU(user.getUserUU(),user.getEnterprise().getUu());
+		UserLoginTime userLoginTime;
+		if (!CollectionUtils.isEmpty(userLoginTimeList)){
+			userLoginTime = userLoginTimeList.get(0);
+		}else {
+			userLoginTime = new UserLoginTime();
+			userLoginTime.setUserUU(user.getUserUU());
+			userLoginTime.setEnUU(user.getEnterprise().getUu());
+		}
+		userLoginTime.setLoginTime(System.currentTimeMillis());
+		try {
+			userLoginTimeDao.save(userLoginTime);
+		}catch (Exception e){}
+
 		if ( enUU == 0L){
 			user.setEnterprise(null);
 		}else {

+ 21 - 0
src/main/java/com/uas/platform/b2c/common/account/controller/SecurityController.java

@@ -2,9 +2,11 @@ package com.uas.platform.b2c.common.account.controller;
 
 import com.alibaba.fastjson.JSON;
 import com.uas.account.entity.UserView;
+import com.uas.platform.b2c.common.account.dao.UserLoginTimeDao;
 import com.uas.platform.b2c.common.account.model.Enterprise;
 import com.uas.platform.b2c.common.account.model.SigninLog;
 import com.uas.platform.b2c.common.account.model.User;
+import com.uas.platform.b2c.common.account.model.UserLoginTime;
 import com.uas.platform.b2c.common.account.service.SigninLogService;
 import com.uas.platform.b2c.common.account.service.UserService;
 import com.uas.platform.b2c.core.support.SystemSession;
@@ -24,12 +26,14 @@ import org.springframework.mobile.device.LiteDeviceResolver;
 import org.springframework.mobile.device.site.SitePreference;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 import java.io.IOException;
+import java.util.List;
 
 /**
  * 处理登录和登录跳转
@@ -45,6 +49,9 @@ public class SecurityController {
 	private UserService userService;
 	@Autowired
 	private SigninLogService signinLogService;
+	@Autowired
+	private UserLoginTimeDao userLoginTimeDao;
+
 	private final DeviceResolver deviceResolver = new LiteDeviceResolver();
 
 	/**
@@ -281,6 +288,20 @@ public class SecurityController {
 						// 企业资料在所有系统公认的唯一标识,这里使用商业登记证号
 						if (tokenUser.getSpaceUID().equals(enterprise.getEnBussinessCode())) {
 							authedUser.setEnterprise(enterprise);
+							//保存登录时间
+							List<UserLoginTime> userLoginTimeList = userLoginTimeDao.findByUserUUAndEnUU(authedUser.getUserUU(),enterprise.getUu());
+							UserLoginTime userLoginTime;
+							if (!CollectionUtils.isEmpty(userLoginTimeList)){
+								userLoginTime = userLoginTimeList.get(0);
+							}else {
+								userLoginTime = new UserLoginTime();
+								userLoginTime.setUserUU(authedUser.getUserUU());
+								userLoginTime.setEnUU(enterprise.getUu());
+							}
+							userLoginTime.setLoginTime(System.currentTimeMillis());
+							try {
+								userLoginTimeDao.save(userLoginTime);
+							}catch (Exception e){}
 							break;
 						}
 					}

+ 15 - 0
src/main/java/com/uas/platform/b2c/common/account/dao/UserLoginTimeDao.java

@@ -0,0 +1,15 @@
+package com.uas.platform.b2c.common.account.dao;
+
+
+import com.uas.platform.b2c.common.account.model.UserLoginTime;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface UserLoginTimeDao extends JpaSpecificationExecutor<UserLoginTime>, JpaRepository<UserLoginTime, Long> {
+
+    List<UserLoginTime> findByUserUUAndEnUU (Long userUU, Long enUU);
+}

+ 3 - 3
src/main/java/com/uas/platform/b2c/common/account/model/UsageLog.java

@@ -197,7 +197,7 @@ public class UsageLog extends BufferedLogable implements Serializable {
 		if(user != null && user.getUserTel()!=null){
 			return user.getUserTel().substring(0,user.getUserTel().length()-(user.getUserTel().substring(3)).length())+"****"+user.getUserTel().substring(7);
 		}
-		return user.getUserTel();
+		return null;
 	}
 
 	public String getUserEmail() {
@@ -209,14 +209,14 @@ public class UsageLog extends BufferedLogable implements Serializable {
 			else
 				return org.apache.commons.lang.StringUtils.rightPad(org.apache.commons.lang.StringUtils.left(email, 1), index, "*").concat(org.apache.commons.lang.StringUtils.mid(email, index, org.apache.commons.lang.StringUtils.length(email)));
 		}
-		return user.getUserEmail();
+		return null;
 	}
 
 	public String getUserName() {
 		if(user.getUserName()!=null){
 			return user.getUserName().substring(0,1)+"**";
 		}
-		return user.getUserName();
+		return null;
 	}
 
 	public UsageLog() {

+ 19 - 4
src/main/java/com/uas/platform/b2c/common/account/model/User.java

@@ -2,7 +2,9 @@ package com.uas.platform.b2c.common.account.model;
 
 import com.alibaba.fastjson.annotation.JSONField;
 import com.uas.platform.core.model.Constant;
-import java.util.Date;
+
+import java.util.*;
+
 import org.codehaus.jackson.annotate.JsonIgnore;
 import org.hibernate.annotations.Cache;
 import org.hibernate.annotations.CacheConcurrencyStrategy;
@@ -13,9 +15,6 @@ import org.springframework.util.CollectionUtils;
 import javax.persistence.*;
 import javax.validation.constraints.NotNull;
 import java.io.Serializable;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
 
 /**
  * 用户信息
@@ -128,6 +127,14 @@ public class User implements Serializable {
 	@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
 	private Set<Enterprise> enterprises;
 
+	/**
+	 * 所属公司的最后登陆时间
+	 */
+	@JoinColumn(name = "user_uu")
+	@OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
+	@OrderBy("login_time")
+	private Set<UserLoginTime> userLoginTimeSet;
+
 	/**
 	 * 所属当前登录公司
 	 */
@@ -426,6 +433,14 @@ public class User implements Serializable {
 		this.ip = ip;
 	}
 
+	public Set<UserLoginTime> getUserLoginTimeSet() {
+		return userLoginTimeSet;
+	}
+
+	public void setUserLoginTimeSet(Set<UserLoginTime> userLoginTimeSet) {
+		this.userLoginTimeSet = userLoginTimeSet;
+	}
+
 	/**
 	 * 获取用户所属企业UU号
 	 *

+ 100 - 15
src/main/java/com/uas/platform/b2c/common/account/model/UserInfo.java

@@ -5,10 +5,7 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 import org.springframework.util.CollectionUtils;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * 用户简单信息,前台程序使用
@@ -37,20 +34,34 @@ public class UserInfo {
 		}
 		if (!CollectionUtils.isEmpty(user.getEnterprises())) {
 			Enterprise current = user.getEnterprise();
-			List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
+			List<SimpleEnterpriseInfo> list = new ArrayList<SimpleEnterpriseInfo>();
 			for (Enterprise enterprise : user.getEnterprises()) {
-				Map<String, Object> map = new HashMap<String, Object>();
-				map.put("enName", enterprise.getEnName());
-				map.put("uu", enterprise.getUu());
-				map.put("isVendor",enterprise.getEnMallVendorStatus());
+				SimpleEnterpriseInfo simpleEnterpriseInfo= new SimpleEnterpriseInfo();
+				simpleEnterpriseInfo.setEnName(enterprise.getEnName());
+				simpleEnterpriseInfo.setUu(enterprise.getUu());
+				simpleEnterpriseInfo.setIsVendor(enterprise.getEnMallVendorStatus());
 				if(enterprise.getEnSaasStatus() != null && enterprise.getEnSaasStatus() == Status.ENABLED.value()) {
-					map.put("enSaasUrl", enterprise.getEnSaasUrl());
+					simpleEnterpriseInfo.setEnSaasUrl(enterprise.getEnSaasUrl());
 				}
 				if (enterprise.equals(current)){
-					map.put("current", true);
+					simpleEnterpriseInfo.setCurrent(true);
 				}
-				list.add(map);
+				for (UserLoginTime userLoginTime : user.getUserLoginTimeSet()){
+					if (userLoginTime.getEnUU().equals(enterprise.getUu())){
+						simpleEnterpriseInfo.setLastLoginTime(userLoginTime.getLoginTime());
+					}
+				}
+				list.add(simpleEnterpriseInfo);
 			}
+
+			Collections.sort(list,new Comparator(){
+				@Override
+				public int compare(Object o1, Object o2) {
+					SimpleEnterpriseInfo s1 = (SimpleEnterpriseInfo) o1;
+					SimpleEnterpriseInfo s2 = (SimpleEnterpriseInfo)o2;
+					return s1.getLastLoginTime().compareTo(s2.getLastLoginTime());
+				}
+			});
 			this.enterprises = list;
 		}
 		this.havePayPwd = user.getUserPay()==null || user.getUserPay().equals("") ?false:true;
@@ -111,7 +122,7 @@ public class UserInfo {
 
 	private Short idEnable;
 
-	private List<Map<String, Object>> enterprises;
+	private List<SimpleEnterpriseInfo> enterprises;
 
 	private boolean havePayPwd;
 
@@ -121,6 +132,8 @@ public class UserInfo {
 
 	private Long lastLoginTime;
 
+	private Set<UserLoginTime> userLoginTimeSet;
+
 	public Long getLastLoginTime() {
 		return lastLoginTime;
 	}
@@ -217,11 +230,19 @@ public class UserInfo {
 		this.role = role;
 	}
 
-	public List<Map<String, Object>> getEnterprises() {
+	public Set<UserLoginTime> getUserLoginTimeSet() {
+		return userLoginTimeSet;
+	}
+
+	public void setUserLoginTimeSet(Set<UserLoginTime> userLoginTimeSet) {
+		this.userLoginTimeSet = userLoginTimeSet;
+	}
+
+	public List<SimpleEnterpriseInfo> getEnterprises() {
 		return enterprises;
 	}
 
-	public void setEnterprises(List<Map<String, Object>> enterprises) {
+	public void setEnterprises(List<SimpleEnterpriseInfo> enterprises) {
 		this.enterprises = enterprises;
 	}
 
@@ -234,3 +255,67 @@ public class UserInfo {
 	}
 
 }
+
+/**
+ * 返回给前端的简单企业信息数据
+ */
+class SimpleEnterpriseInfo{
+	String enName;
+	Long uu;
+	Short isVendor;
+	String enSaasUrl;
+	boolean current;
+	Long lastLoginTime;
+
+	public SimpleEnterpriseInfo(){
+		this.setLastLoginTime(0L);
+	}
+
+	public String getEnName() {
+		return enName;
+	}
+
+	public void setEnName(String enName) {
+		this.enName = enName;
+	}
+
+	public Long getUu() {
+		return uu;
+	}
+
+	public void setUu(Long uu) {
+		this.uu = uu;
+	}
+
+	public Short getIsVendor() {
+		return isVendor;
+	}
+
+	public void setIsVendor(Short isVendor) {
+		this.isVendor = isVendor;
+	}
+
+	public String getEnSaasUrl() {
+		return enSaasUrl;
+	}
+
+	public void setEnSaasUrl(String enSaasUrl) {
+		this.enSaasUrl = enSaasUrl;
+	}
+
+	public boolean isCurrent() {
+		return current;
+	}
+
+	public void setCurrent(boolean current) {
+		this.current = current;
+	}
+
+	public Long getLastLoginTime() {
+		return lastLoginTime;
+	}
+
+	public void setLastLoginTime(Long lastLoginTime) {
+		this.lastLoginTime = lastLoginTime;
+	}
+}

+ 89 - 0
src/main/java/com/uas/platform/b2c/common/account/model/UserLoginTime.java

@@ -0,0 +1,89 @@
+package com.uas.platform.b2c.common.account.model;
+
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+@Entity
+@Table(name = "sec$userslogintime")
+public class UserLoginTime implements Serializable{
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+    /**
+     * ID
+     */
+    @Id
+    @GeneratedValue
+    @Column(name = "id")
+    private Long id;
+
+    /**
+     * uu号
+     */
+    @Column(name = "user_uu")
+    private Long userUU;
+
+    /**
+     * enuu
+     */
+    @Column(name = "enuu")
+    private Long enUU;
+
+    /**
+     * 信息
+     */
+    @OneToOne(cascade = { CascadeType.REFRESH }, fetch = FetchType.EAGER)
+    @JoinColumn(name = "enuu", insertable = false, updatable = false)
+    private Enterprise enterprise;
+
+    /**
+     * 登陆时间
+     */
+    @Column(name = "login_time")
+    private Long loginTime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getUserUU() {
+        return userUU;
+    }
+
+    public void setUserUU(Long userUU) {
+        this.userUU = userUU;
+    }
+
+    public Long getEnUU() {
+        return enUU;
+    }
+
+    public void setEnUU(Long enUU) {
+        this.enUU = enUU;
+    }
+
+    public Long getLoginTime() {
+        return loginTime;
+    }
+
+    public void setLoginTime(Long loginTime) {
+        this.loginTime = loginTime;
+    }
+
+    public Enterprise getEnterprise() {
+        return enterprise;
+    }
+
+    public void setEnterprise(Enterprise enterprise) {
+        this.enterprise = enterprise;
+    }
+}

+ 52 - 13
src/main/webapp/resources/view/common/site-nav.html

@@ -45,9 +45,12 @@
     }
 
     #site-nav .dropdown .dropdown-menu {
+        top: 36px;
+        left: 0;
+        min-width: 100%;
         display: none;
         margin: 0;
-        padding: 1em;
+        padding: 0 6px 13px;
         border-radius: 0;
         background: #ffffff;
         border: 1px solid #999999;
@@ -59,12 +62,47 @@
         box-shadow: none;
         text-align: left;
     }
-    #site-nav .dropdown .dropdown-menu a{
-        color: #1162a4;
+    #site-nav .dropdown .dropdown-menu ::-webkit-scrollbar {
+        background: #f6f6f6;
+        width: .5rem;
+        height: .5rem;
+    }
+
+    #site-nav .dropdown .dropdown-menu ::-webkit-scrollbar-thumb {
+        border-radius: 0;
+    }
+
+    #site-nav .dropdown .dropdown-menu >ul{
+        max-height: 300px;
+        overflow-y: auto;
+    }
+    #site-nav .dropdown .dropdown-menu >ul >li {
+        padding: 0 12px;
+        line-height: 30px;
+    }
+    #site-nav .dropdown .dropdown-menu .switch-enterprise-title {
+        background: #eee;
+        padding: 0 12px;
+        line-height: 30px;
+        font-size: 12px;
+    }
+    #site-nav .dropdown .dropdown-menu >ul >li.switch-enterprises {
+        background: #f6f6f6;
+    }
+    #site-nav .dropdown .dropdown-menu >ul >li.switch-enterprises a {
+        color: #333;
+        max-width: 300px;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+    }
+    #site-nav .dropdown .dropdown-menu >ul >li.switch-enterprises a:hover {
+        color: #5078cb;
+        text-decoration: none;
     }
     #site-nav .dropdown:hover .dropdown-toggle {
-        border: 1px solid #999999;
-        border-bottom: none;
+        border-left: 1px solid #999999;
+        border-right: 1px solid #999999;
         background: #ffffff;
         color: #333333;
         z-index:11;
@@ -139,7 +177,7 @@
         <li ng-if="!userInfo"><a ng-click="signinModal()" href="javascript:void(0)">登录</a></li>
         <li ng-if="!userInfo"><a ng-click="registerModal()" href="javascript:void(0)">注册</a></li>
         <!--<li ng-if="!userInfo"><a href="http://account.ubtob.com/sso/register?returnURL=http%253A%252F%252Fwww.usoftmall.com%252Flogin%252Fproxy&appId=mall">注册</a></li>-->
-        <li ng-if="userInfo" class="dropdown" ng-mouseleave="toggleSwitchFalse()">
+        <li ng-if="userInfo" class="dropdown">
             <a class="dropdown-toggle" href="javascript:void(0)">欢迎您,
                 <span ng-bind="userInfo.userName"></span>
                 <span> | </span>
@@ -148,25 +186,26 @@
                 <span style="float:right;margin-left: 8px;max-width: 190px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;display: inline-block;" ng-if="userInfo.enterprise" ng-bind="userInfo.enterprise.enName" ></span>
                 <span style="float:right;margin-left: 8px;max-width: 190px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;display: inline-block;" ng-if="!userInfo.enterprise" ng-bind="'个人账户'" ></span>
             </a>
-            <div class="dropdown-menu" style="top: 36px; left: 0; min-width: 220px; width: 100%">
+            <div class="dropdown-menu">
                <!-- <p>欢迎您,<span ng-bind="userInfo.userName"></span>
                     <a href="javascript:void(0)" class="pull-right" ng-click="logout()">退出</a>
                 </p>-->
-                <p>
-                    <!--<i class="fa fa-map-marker"></i> <span ng-if="userInfo.enterprises" ng-bind="userInfo.enterprise.enName"></span><span ng-if="!userInfo.enterprises" ng-bind="userInfo.userName"></span><span ng-if="!userInfo.enterprises">(个人账户)</span>-->
+                <!--<p>
+                    &lt;!&ndash;<i class="fa fa-map-marker"></i> <span ng-if="userInfo.enterprises" ng-bind="userInfo.enterprise.enName"></span><span ng-if="!userInfo.enterprises" ng-bind="userInfo.userName"></span><span ng-if="!userInfo.enterprises">(个人账户)</span>&ndash;&gt;
                     <i class="fa fa-map-marker" style="position: relative;bottom: 2px;"></i>
                     <span ng-if="userInfo.enterprise" ng-bind="userInfo.enterprise.enName" class="member-text"></span>
                     <span ng-if="!userInfo.enterprise" ng-bind="' 个人账户'" class="member-text"></span>
                     <a href="javascript:void(0)" class="pull-right" ng-if="userInfo.enterprises" ng-click="toggleSwitch()" ng-bind="switching?'取消':'切换'">切换</a>
-                </p>
-                <ul class="unstyled" ng-show="switching" style="-webkit-padding-start: 0;">
-                    <li ng-repeat="en in userInfo.enterprises" ng-if="!en.current && userInfo.enterprises" style="line-height: 30px;">
+                </p>-->
+            <div ng-if="userInfo.enterprises && userInfo.enterprises.length > 0" class="switch-enterprise-title">您可切换至以下账户:</div>
+                <ul class="unstyled" style="-webkit-padding-start: 0;">
+                    <li ng-repeat="en in userInfo.enterprises" ng-if="!en.current && userInfo.enterprises" class="switch-enterprises">
                         <a href="javascript:void(0)"  ng-bind="en.enName" title="{{en.enName}}" ng-click="switchto(en.uu)"></a>
                     </li>
                     <!--<li ng-if="!userInfo.enterprises">
                         <a href="javascript:void(0)"><span ng-bind="userInfo.userName"></span><span>(个人账户)</span></a>
                     </li>-->
-                    <li style="line-height: 30px;">
+                    <li class="switch-enterprises">
                         <a href="javascript:void(0)" ng-click="switchto('0')" ng-if="userInfo.enterprise"><span ng-bind="userInfo.userName"></span><span>(个人账户)</span></a>
                     </li>
                 </ul>

+ 2 - 2
src/main/webapp/resources/view/usercenter/forstore/home_center.html

@@ -13,12 +13,12 @@
 <!--右侧主体部分-->
 <div class="user_home">
     <div class="user_right fr">
-        <div class="right_l" ng-controller="AuthenticationCtrl">
+        <div class="right_l">
             <div class="user_r_01">
                 <dl>
                     <dt><img src="static/img/user/images/user_photo.png" /></dt>
                     <dd>
-                       <span ng-cloak>{{userInfo.userName}} | <br/> <!--<em>账户余额:¥68899.99</em>--></span>
+                       <span ng-cloak ng-bind="userInfo.userName + '&nbsp;|'"><br/> <!--<em>账户余额:¥68899.99</em>--></span>
                         <span ng-cloak ng-bind="userInfo.enterprise.enName || '个人账户'"><br/> <!--<em>账户余额:¥68899.99</em>--></span>
                         <a ui-sref="account_manager" href="#/accountManager/">账户设置&nbsp;》</a>
                     </dd>

+ 1 - 1
src/main/webapp/resources/view/vendor/forstore/vendor_index.html

@@ -19,7 +19,7 @@
             <dl>
                 <dt><img src="static/img/vendor/images/user_photo.png" /></dt>
                 <dd>
-                    <span ng-bind="userInfo.userName">  | <br/><!--<em>账户余额:¥68899.99</em>--></span>
+                    <span ng-bind="userInfo.userName + '&nbsp;|'"><br/><!--<em>账户余额:¥68899.99</em>--></span>
                     <span ng-bind="vendor.enName || '个人账户'"><br/> <!--<em>账户余额:¥68899.99</em>--></span>
                     <a ui-sref="vendor_account_management" href="#/account/management/">账户设置&nbsp;》</a>
                     <!--<p><img src="static/img/vendor/images/sell_grade.png"/>专有服务:******</p>-->