wangchuanjin %!s(int64=7) %!d(string=hai) anos
pai
achega
38255b08b0

+ 38 - 0
src/jfw/front/front.go

@@ -31,6 +31,7 @@ type userPool struct {
 }
 type Front struct {
 	*xweb.Action
+	ajaxPolling        xweb.Mapper `xweb:"/front/ajaxPolling"`      //登录轮询
 	getLoginNum        xweb.Mapper `xweb:"/front/getLoginNum/(.*)"` //
 	login              xweb.Mapper `xweb:"/front/login/(.*)"`       //登录
 	hasSign            xweb.Mapper `xweb:"/front/hasSign"`          //是否登录
@@ -128,6 +129,42 @@ func init() {
 	//up.user = make(map[string]*map[string]interface{})
 }
 
+//轮询查登录状态
+func (f *Front) AjaxPolling() {
+	reqType, _ := f.GetInteger("reqType")
+	if reqType == 1 {
+		shareIds := f.GetString("shareIds")
+		shareidlist := strings.Split(shareIds, "___")
+		if shareIds != "" && len(shareidlist) > 1 {
+			shareidnum := shareidlist[0]
+			shareidkop := shareidlist[1]
+			PutWsByCode(se.DecodeString(shareidnum), nil, f.Session())
+			PutWsByCode(se.DecodeString(shareidkop), nil, f.Session())
+			f.ServeJson(map[string]string{})
+		}
+	} else if reqType == 2 {
+		userInfo, _ := f.GetSession("rpcBackUserInfo").(map[string]interface{})
+		f.ServeJson(userInfo)
+	} else if reqType == 3 {
+		reply := ""
+		userId := se.DecodeString(f.GetString("userId"))
+		qrToLab_ok, _ := redis.Exists("other", "qrToLab_"+userId)
+		if qrToLab_ok {
+			redis.Del("other", "qrToLab_"+userId)
+			reply = "qrToLab_ok"
+		}
+		qrToLab_open_ok, _ := redis.Exists("other", "qrToLab_open_"+userId)
+		if qrToLab_open_ok {
+			redis.Del("other", "qrToLab_open_"+userId)
+			reply = "qrToLab_open_ok"
+		}
+		if qrToLab_ok && qrToLab_open_ok {
+			reply = "qrToLab_ok_open_ok"
+		}
+		f.ServeJson(map[string]string{"result": reply})
+	}
+}
+
 //广告服务
 func (f *Front) Advservices() error {
 	var shareid = f.GetString("id")
@@ -508,6 +545,7 @@ func (f *Front) HasSign() error {
 
 //用户注销
 func (f *Front) SignOut() error {
+	f.DelSession("rpcBackUserInfo")
 	f.DelSession("user")
 	f.DelSession("s_nickname")
 	f.DelSession("openid")

+ 1 - 1
src/jfw/front/laboratory.go

@@ -148,7 +148,7 @@ func (l *Lab) QrToLab(t string) error {
 	if userId == nil {
 		return nil
 	}
-	redis.Put("other", "qrToLab_"+userId.(string), 1, 5*60)
+	redis.Put("other", "qrToLab_"+userId.(string), 1, 10*60)
 	l.SetSession("qrToLab", true)
 	if t != "" && t == "s" {
 		return l.Redirect("/jylab/laboratory/cjss")

+ 38 - 15
src/jfw/front/websocket.go

@@ -18,8 +18,9 @@ import (
 
 //socket对象放在内存中,待rpc回调使用
 type Wss struct {
-	Conn *websocket.Conn
-	Time int64
+	Conn    *websocket.Conn
+	session *httpsession.Session
+	Time    int64
 }
 type MapSocket struct {
 	Map  map[string]*Wss
@@ -52,12 +53,23 @@ func init() {
 }
 
 //根据代码和ws做映射
-func PutWsByCode(src string, ws *websocket.Conn) {
+func PutWsByCode(src string, ws *websocket.Conn, session *httpsession.Session) {
 	defer qutil.Catch()
 	n := HashVal(src) % MSPOOL
 	ms := MapSocketArr[n]
 	ms.Lock.Lock()
-	ms.Map[src] = &Wss{ws, time.Now().Unix()}
+	if ms.Map[src] == nil {
+		ms.Map[src] = &Wss{ws, session, time.Now().Unix()}
+	} else {
+		wss := ms.Map[src]
+		if ws != nil {
+			wss.Conn = ws
+		}
+		if session != nil {
+			wss.session = session
+		}
+		wss.Time = time.Now().Unix()
+	}
 	ms.Lock.Unlock()
 }
 
@@ -91,8 +103,19 @@ func GetWsByCode(param []string) bool {
 	ms.Lock.Lock()
 	wss := ms.Map[src]
 	ms.Lock.Unlock()
-	if wss != nil && wss.Conn != nil {
-		infoData := LoginInfo(src, openid, wss.Conn.Sess)
+	if wss != nil {
+		session := wss.session
+		if session == nil && wss.Conn != nil {
+			session = wss.Conn.Sess
+		}
+		if session == nil {
+			log.Println("error:rpc back has no session!")
+			return false
+		}
+		infoData := LoginInfo(src, openid, session)
+		if wss.Conn == nil {
+			return true
+		}
 		sendmessage, _ := json.Marshal(infoData)
 		if err := websocket.Message.Send(wss.Conn, string(sendmessage)); err != nil {
 			log.Println("socket send fail..", err)
@@ -103,7 +126,6 @@ func GetWsByCode(param []string) bool {
 		return true
 	} else {
 		return false
-
 	}
 }
 
@@ -134,6 +156,7 @@ func LoginInfo(shareid, openid string, Sess interface{}) (infoData map[string]in
 			sess.Set("s_nickname", nick)
 			sess.Set("s_m_openid", fmt.Sprint((*user)["s_m_openid"]))
 			sess.Set("user", *user)
+			sess.Set("rpcBackUserInfo", infoData)
 		}
 	}
 	return infoData
@@ -161,9 +184,8 @@ func ServeWss(conn *websocket.Conn) {
 			if shareIds != "" && len(shareidlist) > 1 {
 				shareidnum := shareidlist[0]
 				shareidkop := shareidlist[1]
-				PutWsByCode(se.DecodeString(shareidnum), conn)
-				PutWsByCode(se.DecodeString(shareidkop), conn)
-				websocket.Message.Send(conn, "ok")
+				PutWsByCode(se.DecodeString(shareidnum), conn, nil)
+				PutWsByCode(se.DecodeString(shareidkop), conn, nil)
 			}
 		}
 	}
@@ -182,12 +204,14 @@ func QrToLabWss(conn *websocket.Conn) {
 			err := websocket.Message.Receive(conn, &receive)
 			if err != nil {
 				receive = "close"
-				log.Println("websocket接收失败!", err)
+				//log.Println("websocket接收失败!", err)
 				return
 			}
-			if receive == "close" {
+			if receive == "close" { //关闭
 				return
-			} else if receive != "close" { //接收到userid
+			} else if receive == "HeartBeat" { //心跳监测
+				websocket.Message.Send(conn, "HeartBeat")
+			} else { //接收到userid
 				userId = se.DecodeString(receive)
 			}
 		}
@@ -219,8 +243,7 @@ func QrToLabWss(conn *websocket.Conn) {
 		if reply == "" {
 			continue
 		}
-		sendmessage, _ := json.Marshal(reply)
-		if err := websocket.Message.Send(conn, sendmessage); err != nil {
+		if err := websocket.Message.Send(conn, reply); err != nil {
 			redis.Del("other", "qrToLab_"+userId)
 			redis.Del("other", "qrToLab_open_"+userId)
 			//log.Println("websocket发送失败!", err)

+ 2 - 0
src/jfw/modules/weixin/src/wx/wx.go

@@ -287,6 +287,8 @@ func saveUser(u *UserInfo, source, pre string) (bool, string, string) {
 		_, err := strconv.Atoi(source)
 		if err == nil && pre == "" {
 			newUser["i_sourceid"], _ = strconv.Atoi(source)
+		} else if pre == "32" {
+			newUser["i_sourceid"], _ = strconv.Atoi(source + "00000000")
 		} else {
 			newUser["i_sourceid"], _ = strconv.Atoi("10000" + pre)
 		}

+ 91 - 11
src/web/staticres/js/jyWebScoket.js

@@ -1,6 +1,7 @@
+var qrToLabWSHC = new WebSocketHeartCheck("qrToLab");
 //webScoket封装
 var JyWebScoket = {
-	url: "ws"+("https:"==document.location.protocol?"s":"")+"://"+window.location.host,
+	url: "ws"+(!bIE9&&"https:"==document.location.protocol?"s":"")+"://"+window.location.host,
 	//pc端扫码进入实验室之后,自动关闭二维码,页面刷新
 	qrToLab: function() {
 		var thisClass = this;
@@ -15,6 +16,8 @@ var JyWebScoket = {
 			if(!$("#labImg").attr("src")){
 				$("#labImg").attr("src","/jylab/supsearch/qr/"+type);
 			}
+			//开始轮询
+			QrToLabPolling.start(thisClass,encryptId);
 			//打开scoket连接,监听扫码完成之后,页面刷新
 			thisClass.init(encryptId);
 		});
@@ -24,7 +27,11 @@ var JyWebScoket = {
 			}
 		});
 		//初始化scoket连接
+		this.sendmsg = "";
+		this.isOver = false;
 		this.init = function(msg){
+			var thisClass = this;
+			this.sendmsg = msg;
 			if(window.WebSocket == undefined) {
 				console.error("浏览器不支持webscoket!");
 				return
@@ -34,24 +41,53 @@ var JyWebScoket = {
 			    sock.onopen = function() {
 					//console.log("connection success!"+msg);
 					sock.send(msg);
+					//心跳检测重置
+        			qrToLabWSHC.reset().start(sock,false);
 			    }
+				sock.onerror = function(e){
+					//console.info("onerror");
+					thisClass.reconnect();
+				}
 			    sock.onclose = function(e) {
-			        //console.log("connection closed (" + e.code + ")");
+			        //console.info("onclose");
+					thisClass.reconnect();
 			    }
 			    sock.onmessage = function(e) {
-					var comemsg = e.data.substring(1,e.data.length-1)
-					if(comemsg == "qrToLab_ok"){
-						isCanClolse = false;
-						$("#labModal").modal("hide");
-					}else if(comemsg == "qrToLab_open_ok"){
-						$(".superSearch").remove();
-						this.close();
+					QrToLabPolling.isPostLoginPolling = false;
+					if(e.data=="HeartBeat"){//心跳检测
+						//如果获取到消息,心跳检测重置
+				        //拿到任何消息都说明当前连接是正常的
+				        qrToLabWSHC.reset().start(sock,false);
+						return;
 					}
+					thisClass.complete(e.data,true);
 			    }
 			}catch(e){
-				console.error("JyWebScoket"+e);
+				console.error("JyWebScoket "+e);
+				thisClass.reconnect();
 			}
 		}
+		this.complete = function(result,flag){
+			qrToLabWSHC.reset();
+			this.isOver = true;
+			if(result == "qrToLab_ok"){
+				if(flag){
+					QrToLabPolling.stop();
+				}
+				isCanClolse = false;
+				$("#labModal").modal("hide");
+				return
+			}else if(result == "qrToLab_open_ok"){
+				$(".superSearch").remove();
+				this.close();
+			}else if(result == "qrToLab_ok_open_ok"){
+				isCanClolse = false;
+				$("#labModal").modal("hide");
+				$(".superSearch").remove();
+				this.close();
+			}
+			QrToLabPolling.stop();
+		}
 		this.close = function(){
 			if(sock == null){
 				return;
@@ -61,8 +97,52 @@ var JyWebScoket = {
 				sock.close();
 				sock = null;
 			}catch(e){
-				console.error("JyWebScoket"+e);
+				console.error("JyWebScoket "+e);
 			}
 		}
+		this.reconnect = function() {
+			if(qrToLabWSHC.lockReconnect || this.isOver){
+				return;
+			}
+			QrToLabPolling.isPostLoginPolling = true;
+		    qrToLabWSHC.lockReconnect = true;
+		    //没连接上会一直重连,设置延迟避免请求过多
+			var thisClass = this;
+		    setTimeout(function () {
+		        thisClass.init(thisClass.sendmsg);
+				qrToLabWSHC.lockReconnect = false;
+		    }, 2000);
+		}
+	}
+}
+//轮询查询
+var QrToLabPolling = {
+	isPostLoginPolling: false,//是否发起轮询请求
+	loginPollingInterval: null,
+	start: function(obj,msg){
+		//防止重复调用
+		if(this.loginPollingInterval != null){
+			return;
+		}
+		//定时器,定时请求看是否扫码登录,返回用户信息,登录
+		this.loginPollingInterval = setInterval(function(){
+			//如果浏览器不支持webscoket,走ajax轮询方式
+			if(window.WebSocket == undefined) {
+				QrToLabPolling.isPostLoginPolling = true;
+			}
+			if(!QrToLabPolling.isPostLoginPolling){
+				return;
+			}
+			$.post("/front/ajaxPolling",{userId: msg,reqType:3},function(r){
+				if(r.result != ""){
+					obj.complete(r.result,false);
+				}
+			});
+		},3000);
+	},
+	stop: function(){
+		clearInterval(this.loginPollingInterval);
+		this.loginPollingInterval = null;
+		this.isPostLoginPolling = false;
 	}
 }

+ 136 - 76
src/web/staticres/js/login.js

@@ -23,9 +23,9 @@ var encryptId = null;
 var qr_type = "s";
 var unseatflag = false;//未登录情况下,用户点击超级搜索等开启按钮或者功能,根据此状态看是否弹出二维码
 var unseatzbqyflag = false;//未登录情况下,用户点击中标企业等开启按钮或者功能,根据此状态看是否弹出二维码
-var sendMsgIntervalObj = null;
+var sendMsgInterval = null;
 //心跳检测
-var WebSocketHeartCheck = function(){
+var WebSocketHeartCheck = function(scoketType){
 	this.lockReconnect = false;//避免重复连接
     this.timeout = 5000;//60秒
     this.timeoutObj = null;
@@ -35,80 +35,132 @@ var WebSocketHeartCheck = function(){
         clearTimeout(this.serverTimeoutObj);
         return this;
     }
-    this.start = function(){
-		if(loginflag){
+    this.start = function(w,f){
+		if(f){
 			return;
 		}
         var self = this;
         this.timeoutObj = setTimeout(function(){
             //这里发送一个心跳,后端收到后,返回一个心跳消息,
             //onmessage拿到返回的心跳就说明连接正常
-			if(ws.readyState==1){
-            	ws.send("HeartBeat");
+			if(w.readyState==1){
+            	w.send("HeartBeat");
 			}
             self.serverTimeoutObj = setTimeout(function(){//如果超过一定时间还没重置,说明后端主动断开了
-                ws.close();//如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
+				//用自己的超时,如果用w.colse()执行之后,大概要一分钟才会执行webscoket自己的close方法,时间太长
+				//进行ajax轮询
+				if(scoketType=="login"){
+					LoginPolling.isPostLoginPolling = true;
+				}else if(scoketType=="qrToLab"){
+					QrToLabPolling.isPostLoginPolling = true;
+				}
+                w.close();//如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
             }, self.timeout);
         }, this.timeout);
     }
 }
-var webSocketHeartCheck = new WebSocketHeartCheck();
+//轮询查询
+var LoginPolling = {
+	isPostLoginPolling: false,//是否发起轮询请求
+	loginPollingInterval: null,
+	initInterval: null,
+	init: function(){
+		//防止重复调用
+		if(this.initInterval != null){
+			return;
+		}
+		//先发一个消息,保存session
+		this.postShareid();
+		this.initInterval = setInterval(this.postShareid,3000);
+	},
+	postShareid: function(){
+		$.post("/front/ajaxPolling",{reqType: 1,shareIds: pageshareid+"___"+kopshareid},function(r){
+			clearInterval(LoginPolling.initInterval);
+			LoginPolling.initInterval = null;
+		});
+	},
+	start: function(){
+		//防止重复调用
+		if(this.loginPollingInterval != null){
+			return;
+		}
+		//定时器,定时请求看是否扫码登录,返回用户信息,登录
+		this.loginPollingInterval = setInterval(function(){
+			//如果浏览器不支持webscoket,走ajax轮询方式
+			if(window.WebSocket == undefined) {
+				LoginPolling.isPostLoginPolling = true;
+			}
+			if(!LoginPolling.isPostLoginPolling){
+				return;
+			}
+			$.post("/front/ajaxPolling",{reqType:2},function(r){
+				if(!jQuery.isEmptyObject(r)){
+					logic(r,mynum);
+				}
+			});
+		},5000);
+	},
+	stop: function(){
+		clearInterval(this.loginPollingInterval);
+		this.loginPollingInterval = null;
+		this.isPostLoginPolling = false;
+	}
+}
+var webSocketHeartCheck = new WebSocketHeartCheck("login");
 //创建websocket连接
-var createWebSocket = function(wsUrl){
+var createWebSocket = function(flag){
 	try{
 		ws = new WebSocket(wsUrl);//实例化websocket对象
-		initEventHandle();
+		initEventHandle(flag);
 	}catch(e){
-		reconnect(wsUrl)
+		reconnect();
 		console.log(e)
 	}
 }
 //
-var initEventHandle = function(){
+var initEventHandle = function(flag){
 	ws.onmessage = function(e){
+		//接收消息正常,就不再发ajax轮询
+		LoginPolling.isPostLoginPolling = false;
 		if(e.data==""){
 			return
-		}else if(e.data=="ok"){//重新发送shareid
-			clearInterval(sendMsgIntervalObj);
-			sendMsgIntervalObj = null;
-			return
 		}else if(e.data=="HeartBeat"){//心跳检测
 			//如果获取到消息,心跳检测重置
 	        //拿到任何消息都说明当前连接是正常的
-	        webSocketHeartCheck.reset().start();
+	        webSocketHeartCheck.reset().start(ws,loginflag);
 			return;
 		}
 		//用户登录
-		logic(e.data,mynum);
+		logic($.parseJSON(e.data),mynum);
 	}
 	ws.onerror = function(e){
 		//console.info("onerror");
-		reconnect(wsUrl);
+		reconnect();
 	}
-	ws.onclose = function () {
+	ws.onclose = function(e) {
 		//console.info("onclose");
-        reconnect(wsUrl);
+        reconnect();
     }
 	ws.onopen = function(e) {
+		if(flag){//重连之后发送shareid
+			SendMsg();
+		}
 		//心跳检测重置
-        webSocketHeartCheck.reset().start();
+        webSocketHeartCheck.reset().start(ws,loginflag);
 	}
 }
 //
-function reconnect(url) {
+function reconnect() {
 	if(webSocketHeartCheck.lockReconnect || loginflag){
 		return;
 	}
+	LoginPolling.isPostLoginPolling = true;
     webSocketHeartCheck.lockReconnect = true;
+	LoginPolling.init();
     //没连接上会一直重连,设置延迟避免请求过多
     setTimeout(function () {
-        createWebSocket(url);
+        createWebSocket(true);
 		webSocketHeartCheck.lockReconnect = false;
-		if(sendMsgIntervalObj == null){
-			sendMsgIntervalObj = setInterval(function(){
-				SendMsg();
-			},2000);
-		}
     }, 2000);
 }
 //websocket查看用户是否登录
@@ -122,15 +174,20 @@ var JYLogin = function(num){
 			jylgi = 0;
 		}
 	},1000)
+	LoginPolling.init();
 	SendMsg();
 }
 var SendMsg = function(){
 	//向后台发送websocket数据
 	if (window["WebSocket"]){
 		if(ws.readyState==1){
-			console.log("发送:"+pageshareid+"___"+kopshareid)
+			//console.log("发送:"+pageshareid+"___"+kopshareid)
 			ws.send(pageshareid+"___"+kopshareid);
+		}else{
+			LoginPolling.isPostLoginPolling = true;
 		}
+	}else{
+		LoginPolling.isPostLoginPolling = true;
 	}
 }
 //生成页面二维码,不同页面处理逻辑
@@ -242,8 +299,7 @@ var redisUserInfo = function(pid,kid){
 }
 
 //查询用户信息,响应页面登录信息
-var logic = function(infoData,num){
-	var data = $.parseJSON(infoData); 
+var logic = function(data,num){
 	if(data.result=="ok"){
 		//$(".QRLogin").hide();
 		$("#bidLogin").modal("hide")
@@ -251,6 +307,8 @@ var logic = function(infoData,num){
 		clearInterval(loginfg);
 		loginflag = true;
 		processpage(data.shareid,num);
+		//登录成功,停止轮询
+		LoginPolling.stop();
 		//登录成功,停止心跳监测
 		webSocketHeartCheck.reset();
 		if(ws.readyState==1){
@@ -484,7 +542,8 @@ var saveuserlogs = function(shareid){
 var signout = function(){
 	clearInterval(loginfg);
 	kzyflag = true;
-	createWebSocket(wsUrl);
+	LoginPolling.start();
+	createWebSocket(false);
 	getNewShareId(mynum);
 	loginflag = false;
 	unseatflag = false;
@@ -499,50 +558,51 @@ var signout = function(){
 
 //查看用户是否已经登录
 var haslogin = function(num,kyorpn,url){
-mynum = num;//页面logid
-keysorpname = kyorpn;//其他参数
-thurl = url;//列表也跳转快照页url
-$.post("/front/hasSign",function(data, location){
-	if(data){
-		loginflag = true;
-		encryptId = data.encryptId
-		if(data.s_nickname.length>6){
-			data.s_nickname = data.s_nickname.substring(0,6);
-			data.s_nickname = data.s_nickname + "...";
-		}
-		var hhtml = "<img class='imgShow' onmouseover='openStyle()' onmouseout='closeStyle()' "
-		if(data.redisheadimg!=""){
-			hhtml+="src='"+data.redisheadimg+"'"
-		}else{
-			hhtml+="src='"+data.s_headimage+"'"
-		}
-		hhtml+=" onerror='this.src=\"/images/defaultAvatar.png\"'>"
-			+"<div class='userInfo'>"
-				+"<div class='infoList' style='display:none'>"
-					+"<span class='one'></span>"
-					+"<span class='two'></span>"
-					+"<div class='usernameDiv'>"
-						+data.s_nickname
-					+"</div>"
-					+"<div class='exitDiv' onclick='signout()'>"
-						+"<img id='outImg' src='/images/userexit.png'/>"
-						+"<span>退出</span>"	
+	mynum = num;//页面logid
+	keysorpname = kyorpn;//其他参数
+	thurl = url;//列表也跳转快照页url
+	$.post("/front/hasSign",function(data, location){
+		if(data){
+			loginflag = true;
+			encryptId = data.encryptId
+			if(data.s_nickname.length>6){
+				data.s_nickname = data.s_nickname.substring(0,6);
+				data.s_nickname = data.s_nickname + "...";
+			}
+			var hhtml = "<img class='imgShow' onmouseover='openStyle()' onmouseout='closeStyle()' "
+			if(data.redisheadimg!=""){
+				hhtml+="src='"+data.redisheadimg+"'"
+			}else{
+				hhtml+="src='"+data.s_headimage+"'"
+			}
+			hhtml+=" onerror='this.src=\"/images/defaultAvatar.png\"'>"
+				+"<div class='userInfo'>"
+					+"<div class='infoList' style='display:none'>"
+						+"<span class='one'></span>"
+						+"<span class='two'></span>"
+						+"<div class='usernameDiv'>"
+							+data.s_nickname
+						+"</div>"
+						+"<div class='exitDiv' onclick='signout()'>"
+							+"<img id='outImg' src='/images/userexit.png'/>"
+							+"<span>退出</span>"	
+						+"</div>"
 					+"</div>"
-				+"</div>"
-			+"</div>"	
-		$("#login").html(hhtml);
-		infoListCss();
-		commonMouseEvent();
-		getNewShareId(num);
-		getlabstatus();
-		changeER();
-	}else{
-		$("#login").html("<button class='loginBtn' data-toggle='modal' data-target='#bidLogin' style='width:65px; height:30px; padding-left:18px;border-radius:4px; line-height:0px; color:#666666; border: solid 1px #000; border-color:#CCCCCC;' onmouseover='this.style.borderColor=\"#2cb7ca\"; this.style.color=\"#2cb7ca\";' onmouseout='this.style.borderColor=\"#CCCCCC\"; this.style.color=\"#666666\";'>登录</button>");
-		getNewShareId(num);
-		createWebSocket(wsUrl);
-		getlabstatus();
-		kzyflag = true;//未登录进入快照页面
-		changeER();
+				+"</div>"	
+			$("#login").html(hhtml);
+			infoListCss();
+			commonMouseEvent();
+			getNewShareId(num);
+			getlabstatus();
+			changeER();
+		}else{
+			$("#login").html("<button class='loginBtn' data-toggle='modal' data-target='#bidLogin' style='width:65px; height:30px; padding-left:18px;border-radius:4px; line-height:0px; color:#666666; border: solid 1px #000; border-color:#CCCCCC;' onmouseover='this.style.borderColor=\"#2cb7ca\"; this.style.color=\"#2cb7ca\";' onmouseout='this.style.borderColor=\"#CCCCCC\"; this.style.color=\"#666666\";'>登录</button>");
+			getNewShareId(num);
+			LoginPolling.start();
+			createWebSocket(false);
+			getlabstatus();
+			kzyflag = true;//未登录进入快照页面
+			changeER();
 		}
 	})
 }