liuxiaolu 6 年之前
父节点
当前提交
be41ab2c2f

+ 253 - 0
src/jfw/front/pchelper.go

@@ -0,0 +1,253 @@
+package front
+
+import (
+	"github.com/go-xweb/xweb"
+	"qfw/util"
+	"strings"
+	"time"
+	"log"
+	"github.com/go-xweb/httpsession"
+	"jfw/jyutil"
+	"net/url"
+	"fmt"
+)
+
+type Login struct {
+	*xweb.Action
+	login             xweb.Mapper `xweb:"/jypc/login"`            //pc助手登录
+	getSubscribeToken xweb.Mapper `xweb:"/jypc/getST"`            //获取订阅记录token
+	pcPushView        xweb.Mapper `xweb:"/jypc/pcPushView"`       //订阅记录列表
+	pcPushViewPaging  xweb.Mapper `xweb:"/jypc/pcPushViewPaging"` //订阅记录列表-分页
+}
+
+func init() {
+	xweb.AddAction(&Login{})
+}
+
+func (l *Login) Login() error {
+	defer util.Catch()
+	//登录页面
+	if l.Method() == "GET" {
+		return l.Render("/pcHelper/login.html", nil)
+	}
+	reToken := ""
+	status := func() int {
+		reqType := l.GetString("reqType")
+		mac := l.GetString("mac")
+		if reqType == "phoneLogin" {
+			phone := l.GetString("phone")
+			password := l.GetString("password")
+			if strings.TrimSpace(phone) == "" || strings.TrimSpace(password) == "" {
+				return -1
+			}
+			query := map[string]interface{}{
+				"i_appid":    2,
+				"s_m_openid": phone,
+				"i_type":     1, //app用户(手机号注册用户)??
+				"s_password": util.GetMd5String(password),
+			}
+			user, ok := mongodb.FindOne("user", query)
+			//登录成功
+			if ok && user != nil && len(*user) > 0 {
+				reToken = getUToken(mac, phone)
+				return 1
+			}
+			return -1 //用户名或密码不正确
+		} else if reqType == "sendIdentCode" {
+			phone := jyutil.CheckSendMsg(l.GetString("token"))
+			//手机号验证不通过
+
+			if phone == "" {
+				return -2
+			} else if !phoneReg.MatchString(phone) {
+				return -1
+			} else if SendIdentCode(phone, l.Session()) {
+				return 1
+			}
+			return 0
+		} else if reqType == "identCodeLogin" {
+			phone, _ := l.GetSession("identCodeKey").(string)
+			if phone == "" || l.GetSession("identCodeValue") == nil || l.GetString("identCode") != l.GetSession("identCodeValue") { //验证码不正确
+				return -1
+			} else {
+				query := map[string]interface{}{
+					"i_appid":    2,
+					"s_m_openid": phone,
+					"i_type":     1,
+				}
+				user, ok := mongodb.FindOne("user", query)
+				if ok {
+					deleteIdentSession_(l.Session())
+					//用户不存在
+					if user == nil || len(*user) == 0 {
+						return -4 //用户不存在
+					} else {
+						reToken = getUToken(mac, phone)
+						return 1
+					}
+				}
+			}
+		}
+		return 0
+	}()
+
+	result := map[string]interface{}{
+		"status": status,
+		"openid": util.ObjToString(l.GetSession("s_m_openid")),
+	}
+	if status == 1 {
+		result["token"] = reToken
+	}
+	l.ServeJson(result)
+	return nil
+}
+
+//发送验证码
+func SendIdentCode(phone string, session *httpsession.Session) bool {
+	lastSentTime, _ := session.Get("identCodeTime").(int64)
+	//60秒之内不允许重复发
+	if lastSentTime > 0 && time.Now().Unix()-lastSentTime <= 60 {
+		return false
+	}
+	s_ranNum := util.GetRandom(6) //生成随机数
+	session.Set("identCodeValue", s_ranNum)
+	session.Set("identCodeKey", phone)
+	session.Set("identCodeTime", time.Now().Unix())
+	//发送短信
+	param := make(map[string]string)
+	param["code"] = s_ranNum
+	log.Println("验证码", phone, s_ranNum)
+	jyutil.SendSMS("2175916", phone, param)
+	return true
+}
+
+//删除短信验证码有关的session
+func deleteIdentSession_(session *httpsession.Session) {
+	session.Del("identCodeValue")
+	session.Del("identCodeKey")
+	session.Del("identCodeTime")
+}
+
+func (l *Login) GetSubscribeToken() error {
+	mac := l.GetString("mac")
+	token := l.GetString("token")
+	phone, deMac := decryptUToken(token)
+	reToken := ""
+	if phone != "" && mac == deMac {
+		reToken = getSToken(token)
+	} else {
+		reToken = ""
+	}
+	result := map[string]interface{}{
+		"token": reToken,
+	}
+	l.ServeJson(result)
+	return nil
+}
+
+func (l *Login) PcPushView() error {
+	defer util.Catch()
+	lasttime, _ := l.GetInt("lasttime")
+	if lasttime == 0 {
+		lasttime = 1
+	}
+	lasttime_ := lasttime
+	//myopenid, _ := l.GetSession("s_m_openid").(string)
+	myopenid := l.GetString("openid")     //"oilZj0ZXGqqOfirMHt8MRT3b4U-M"
+	fmt.Println("pppppppppppppppp",lasttime,myopenid)
+	res := map[string]interface{}{}
+	res["success"] = false
+	if myopenid != "" && lasttime > 0 {
+		if lasttime == 1 {
+			lasttime = time.Now().Local().Unix()
+		}
+		thistime, list := getHistorypush(lasttime, 0, myopenid, nil, 0)
+		if list != nil && len(*list) > 0 {
+			fmt.Println("=====================",list)
+			l.T["success"] = true
+			l.T["data"] = &list
+			l.T["thistime"] = thistime
+
+			res["success"] = true
+			res["data"] = &list
+			res["thistime"] = thistime
+		}
+	}
+	if lasttime_ == 1 {
+		return l.Render("/pcHelper/pushView.html", &l.T)
+	}else {
+		l.ServeJson(&res)
+		return nil
+	}
+}
+
+func (l *Login) PcPushViewPaging() error {
+	defer util.Catch()
+	lasttime, _ := l.GetInt("lasttime")
+	myopenid, _ := l.GetSession("s_m_openid").(string)
+	res := map[string]interface{}{}
+	res["success"] = false
+	if myopenid != "" && lasttime > 0 {
+		if lasttime == 1 {
+			lasttime = time.Now().Local().Unix()
+		}
+		thistime, list := getHistorypush(lasttime, 0, myopenid, nil, 0)
+		if list != nil && len(*list) > 0 {
+			res["success"] = true
+			res["data"] = &list
+			res["thistime"] = thistime
+		}
+	}
+	l.ServeJson(&res)
+	return nil
+}
+
+//订阅记录token
+func getSToken(token string) string {
+	return se.EncodeString(token)
+}
+
+//登录成功后的token
+func getUToken(params ...string) string {
+	if params != nil {
+		mac := params[0]
+		phone := params[1]
+		now := time.Now()
+		date := util.FormatDate(&now, util.Date_Full_Layout)
+		mxE := util.GetMd5String(mac + "&" + phone + "&" + date)
+		v, err := jyutil.AC.Encrypt(mac + "_" + phone + "_" + date + "_" + mxE)
+		if err != nil {
+			log.Println("Encrypt error", err)
+			return ""
+		}
+		return v
+	}
+	return ""
+}
+
+func decryptUToken(token string) (string, string) {
+	if token == "" {
+		return "", ""
+	}
+	log.Println("UToken解析前token", token)
+	token, e := url.QueryUnescape(token)
+	if e != nil {
+		log.Println("UToken QueryUnescape error", e)
+	}
+	v, err := jyutil.AC.Decrypt(token)
+	if err != nil {
+		log.Println("UToken Decrypt error", err)
+		return "", ""
+	}
+	log.Println("UToken解析后token", v)
+	vs := strings.Split(v, "_")
+	if len(vs) != 4 {
+		log.Println("UToken error", vs)
+		return "", ""
+	}
+	if vs[3] != util.GetMd5String(fmt.Sprintf("%s&%s&%s", vs[0], vs[1], vs[2])) {
+		log.Println("UToken mx error", vs)
+		return "", ""
+	}
+	return vs[0], vs[1]
+}

+ 52 - 0
src/jfw/jyutil/jyutil.go

@@ -12,6 +12,7 @@ import (
 	. "qfw/util/sms"
 	"strings"
 	"time"
+	"net/url"
 )
 
 //计数器
@@ -26,6 +27,11 @@ var ActivityEndCode, ActivityStartCode int64
 
 var jy_activeset map[string]interface{}
 
+var AC = &util.AES_CBC{
+	Key: "mGlAgnIBB8bx2nch",
+	Iv:  "1389461544135476",
+}
+
 func init() {
 	jy_activeset = config.Sysconfig["jy_activeset"].(map[string]interface{})
 }
@@ -155,3 +161,49 @@ func SendSMS(tplcode /*模板代码*/, mobile /*手机号码*/ string, param map
 	text := strings.Join(tmp, "&")
 	SendSms(mobile, tplcode, text)
 }
+
+//发短信,验证token
+func CheckSendMsg(token string) string {
+	if token == "" {
+		return ""
+	}
+	log.Println("短信解析前token", token)
+	key := fmt.Sprintf("smstoken_%s", token)
+	ok, e := redis.Exists("other", key)
+	if e != nil {
+		log.Println("redis中token error", e)
+		return ""
+	}
+	if ok {
+		log.Println("redis中token已存在", token)
+		return ""
+	}
+	token, e = url.QueryUnescape(token)
+	if e != nil {
+		log.Println("短信token QueryUnescape error", e)
+	}
+	v, err := AC.Decrypt(token)
+	if err != nil {
+		log.Println("短信token Decrypt error", err)
+		return ""
+	}
+	log.Println("短信解析后token", v)
+	vs := strings.Split(v, "_")
+	if len(vs) != 3 {
+		log.Println("短信token error", vs)
+		return ""
+	}
+	now := time.Now()
+	if !strings.HasPrefix(vs[1], util.FormatDate(&now, util.Date_yyyyMMdd)) {
+		log.Println("短信token date错误", vs)
+		return ""
+	}
+	if vs[2] != util.GetMd5String(fmt.Sprintf("%s&%s", vs[0], vs[1])) {
+		log.Println("短信token sing错误", vs)
+		return ""
+	}
+	if vs[0] != "" {
+		redis.Put("other", key, 1, 86400)
+	}
+	return vs[0]
+}

+ 4 - 0
src/jfw/modules/pc/server/src/config.json

@@ -0,0 +1,4 @@
+{
+  "port":":8082",
+  "redisAddr":"other=192.168.3.18:2379"
+}

+ 36 - 0
src/jfw/modules/pc/server/src/config/config.go

@@ -0,0 +1,36 @@
+package config
+
+import (
+	"os"
+	"log"
+	"io/ioutil"
+	"encoding/json"
+)
+
+type Config struct {
+	Port      string `json:"port"`
+	RedisAddr string `json:"redisAddr"`
+}
+
+var SysConfig Config
+
+func init() {
+	ReadSysConfig()
+}
+
+func ReadSysConfig() {
+	file, err := os.Open("./config.json")
+	if err != nil {
+		log.Println("read config file error......", err.Error())
+	}
+	defer file.Close()
+	bs, err := ioutil.ReadAll(file)
+	if err != nil {
+		log.Println("read config file error......", err.Error())
+	}
+	err = json.Unmarshal(bs, &SysConfig)
+	if err != nil {
+		log.Println("read config file error......", err.Error())
+	}
+	log.Println("read config file success......", string(bs))
+}

+ 71 - 0
src/jfw/modules/pc/server/src/main.go

@@ -0,0 +1,71 @@
+package main
+
+import (
+	"encoding/json"
+	"flag"
+	"log"
+	"net/http"
+	"github.com/gorilla/websocket"
+	"push"
+	_ "config"
+	"qfw/util/redis"
+	"config"
+)
+
+var (
+	addr  = flag.String("addr", config.SysConfig.Port, "websocket/rpc监听地址")
+	//certfile = flag.String("cert", "./cert.crt", "证书")
+	//keyfile  = flag.String("key", "./key.pem", "秘钥")
+)
+
+func init() {
+	redis.InitRedisBySize(config.SysConfig.RedisAddr, 100, 30, 300)
+}
+
+var upgrader = websocket.Upgrader{
+	CheckOrigin: func(r *http.Request) bool {
+		return true
+	},
+}
+
+func echo(w http.ResponseWriter, r *http.Request) {
+	c, err := upgrader.Upgrade(w, r, nil)
+	if err != nil {
+		log.Println("upgrade:", err)
+		return
+	}
+
+	code := ""
+	defer func() {
+		c.Close()
+		push.Remove(code)
+	}()
+
+	for {
+		_, message, err := c.ReadMessage()
+		if err != nil {
+			log.Println("read:", err)
+			break
+		}
+		log.Printf("recv: %s", message)
+		msg := new(push.Msg)
+		json.Unmarshal(message, msg)
+		//Param 需解密
+		if msg.Param != "" {
+			if msg.Act == "join"{
+				log.Println(msg.Param, "加入")
+				push.Add(msg.Param, c)
+				code = msg.Param
+			}
+		}
+	}
+}
+
+func main() {
+	flag.Parse()
+	log.SetFlags(0)
+	http.HandleFunc("/ws", echo)
+	push.StartRpcServe()
+	log.Fatal(http.ListenAndServe(*addr, nil))
+	//log.Fatal(http.ListenAndServeTLS(*wsaddr, *certfile, *keyfile, nil))
+}

+ 76 - 0
src/jfw/modules/pc/server/src/push/client.go

@@ -0,0 +1,76 @@
+package push
+
+import (
+	"log"
+	"sync"
+	"github.com/gorilla/websocket"
+	"qfw/util/redis"
+)
+
+var mapping = make(map[string]*websocket.Conn)
+var lock = new(sync.RWMutex)
+
+var (
+	redisPool      = "other"
+	redisKeyPrefix = "pc_push_"
+	timeout        = 60 * 60 * 24 * 7
+)
+
+func Add(code string, con *websocket.Conn) {
+	lock.Lock()
+	//断开老连接
+	if v, ok := mapping[code]; ok {
+		v.Close()
+	}
+	mapping[code] = con
+	lock.Unlock()
+	//TODO 若redis有历史推送记录,则补推离线消息
+	redisKey := redisKeyPrefix + code
+	redisPcPush := redis.Get(redisPool, redisKey)
+	if redisPcPush != nil {
+		if ok := push(code, redisPcPush); ok {
+			redis.DelByCodePattern(redisPool, redisKey)
+		}
+	}
+}
+
+func Remove(code string) {
+	lock.Lock()
+	//断开老连接
+	if v, ok := mapping[code]; ok {
+		v.Close()
+		delete(mapping, code)
+	}
+	lock.Unlock()
+}
+
+func Write(code string, json interface{}) bool {
+	lock.RLock()
+	defer lock.RUnlock()
+	if v, ok := mapping[code]; ok {
+		err := v.WriteJSON(json)
+		if err != nil {
+			Remove(code)
+			return false
+		}
+	} else {
+		//TODO 存入redis,客户端下次上线自动提醒,7日有效期。
+		redis.Put(redisPool, redisKeyPrefix+code, json, timeout)
+		return false
+	}
+	return true
+}
+
+func write2AllClient(json interface{}) {
+	log.Println("mapping size:", len(mapping))
+	lock.RLock()
+	for k, v := range mapping {
+		log.Println("write 2 ", k, json)
+		err := v.WriteJSON(json)
+		if err != nil {
+			log.Println(err.Error())
+			Remove(k)
+		}
+	}
+	lock.RUnlock()
+}

+ 12 - 0
src/jfw/modules/pc/server/src/push/msg.go

@@ -0,0 +1,12 @@
+/**
+websocket消息
+*/
+package push
+
+type (
+	//加入
+	Msg struct {
+		Act   string `json:"act"`
+		Param string `json:"param"`
+	}
+)

+ 52 - 0
src/jfw/modules/pc/server/src/push/push.go

@@ -0,0 +1,52 @@
+/**
+推送样例,RPC服务
+*/
+package push
+
+import (
+	"errors"
+	"net/rpc"
+)
+
+func push(code string, json interface{}) bool {
+	return Write(code, json)
+}
+
+//服务
+type (
+	Service string
+	PushRequest struct {
+		ClientCode string
+		Title      string
+		Body       string
+		Link       string
+		Icon       string
+	}
+	PushResponse struct {
+		Ok bool
+	}
+)
+
+
+func (s *Service) PushMsg(request *PushRequest, repl *PushResponse) error {
+	ok := push(request.ClientCode, request)
+	if ok {
+		repl.Ok = true
+		return nil
+	} else {
+		repl.Ok = false
+		//TODO 存入redis日志,客户端下次上线自动提醒,7日有效期。 。。
+		return errors.New("客户端不在线")
+	}
+}
+
+func StartRpcServe() {
+	rpc.Register(new(Service)) // 注册rpc服务
+	rpc.HandleHTTP()           // 采用http协议作为rpc载体
+
+	//lis, err := net.Listen("tcp", addr)
+	//if err != nil {
+	//	log.Fatalln("fatal error: ", err)
+	//}
+	//go http.Serve(lis, nil)
+}

+ 380 - 0
src/web/templates/pchelper/login.html

@@ -0,0 +1,380 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+	<meta charset="UTF-8" />
+	<meta name="viewport" content="width=device-width, initial-scale=1.0" />
+	<meta http-equiv="X-UA-Compatible" content="ie=edge" />
+	<link rel="stylesheet" type="text/css" href="/pcClient/me/css/reset.css?v={{Msg "seo" "version"}}" />
+	<link rel="stylesheet" type="text/css" href="/css/font.css?v={{Msg "seo" "version"}}"/>
+	<link rel="stylesheet" type="text/css" href="/pcClient/me/css/login.css?v={{Msg "seo" "version"}}"/>
+	<link rel="stylesheet" type="text/css" href="/pcClient/me/css/header.css?v={{Msg "seo" "version"}}"/>
+	<script src="/js/jquery.js?v={{Msg "seo" "version"}}" type="text/javascript" charset="utf-8"></script>
+	{{include "/common/js.html"}}
+	<title>登录ccc</title>
+</head>
+<body>
+	<div id="header">
+        <h2>剑鱼助手</h2>
+    </div>
+	<span class="header-tab">
+		<a class="header-tab-active">密码登录</a>
+		<a>验证码登录</a>
+		<i></i>
+	</span>
+	<div class="login">
+		<div class="pass">
+			<lable>手机号码</lable>
+			<input type="tel" name="" id="tel" class="tel"/>
+			<img class="closeQc" src="/pcClient/images/cancel.png"/>
+		</div>
+		<div class="onePass pass">
+			<lable>密码</lable>
+			<input type="password" id="pwd"/>
+			<img class="closeQc" src="/pcClient/images/cancel.png"/>
+			<span class="jyapp-icon jyapp-icon-biyan"></span>
+		</div>
+		<div class="pass code">
+			<lable>验证码</lable>
+			<input type="tel" id="identCode"/>
+			<img class="closeQc" src="/pcClient/images/cancel.png"/>
+			<span id="sendIdentCode">获取验证码</span>
+		</div>
+		<button type="button" id="btn" class="disabled btn" />登录</button>
+		{{/*<div class="forget">*/}}
+			{{/*<a href="javascript:void(0)">忘记密码?</a>*/}}
+			{{/*<a href="javascript:void(0)" class="register">立即注册</a>*/}}
+			{{/*<div class="clearfix"></div>*/}}
+		{{/*</div>*/}}
+		<!--微信登录start-->
+		<div class="wx">
+			<span>
+				<img src="/pcClient/images/wx.png">
+				<i>微信登录</i>
+			</span>
+		</div>
+		<!--微信登录end-->
+	</div>
+	<script type="text/javascript">
+		var backToIndex = false;
+		var wait = 60;
+		var dcsOne = false;
+		var bodyWidth = document.body.clientWidth;
+		var left_1 = (bodyWidth/2-24) / 2;
+		var left_2 = (bodyWidth/2-24) / 2 + bodyWidth / 2;
+		var isIos = mySysIsIos();
+		$(function(){
+			$(".forget>a").on("tap",function(){
+				if($(this).index() == 0){
+					window.location.href = "/jyapp/free/forgetPwd";
+				}else{
+					window.location.href = "/jyapp/free/register";
+				}
+			});
+			$(".header-tab>i").css("left",left_1);
+			$(".header-tab>a").on("tap",function(){
+				$(".header-tab>a").removeClass("header-tab-active");
+				$(this).addClass("header-tab-active");
+				if($(this).index() == 0){
+					$(".login .onePass").show();
+					$(".login .code").css("display","none");
+					$(".header-tab>i").css("left",left_1);
+				}else{
+					$(".login .onePass").hide();
+					$(".login .code").css("display","table");
+					$(".header-tab>i").css("left",left_2);
+				}
+				changeBtnStatus();
+			});
+
+			$("#sendIdentCode").on("tap",function() {
+				if(!dcsOne){
+					return
+				}
+				var phone = $.trim($("#tel").val());
+				if(!Verification.isPhone(phone)){
+					EasyAlert.show("手机号格式错误");
+					return
+				}
+				var thisClass = this;
+				$.post("/jypc/login",{reqType:"sendIdentCode",phone: phone,token: getCipherText(phone)},function(r){
+					if(r.status==-1){
+						EasyAlert.show("手机号格式错误");
+					}else{
+						time(thisClass);
+					}
+				});
+			});
+			var toutobj = {};
+			var tout = null;
+			var pwdisfocus = false;
+			$("#tel,#pwd,#identCode").bind('input propertychange', function() {
+				changeBtnStatus();
+			   	if($(this).val().length>0){
+			   	 	$(this).next().show();
+			   	}else{
+					$(this).next().hide();
+				}
+			}).focus(function() {
+				if(tout != null){
+					clearTimeout(tout);
+				}
+				if(toutobj[$(this).parent().index()] != undefined){
+					clearTimeout(toutobj[$(this).parent().index()]);
+				}
+				if(this.id == "pwd"){
+					pwdisfocus = true;
+				}
+				var thisClass = $(this);
+				if(isIos){
+					if(this.id == "tel"){
+						$("#pwd").prop("disabled",true);
+						setTimeout(function(){
+							$("#pwd").prop("disabled",false);
+						},100);
+					}
+				}
+				$(this).parent().addClass("input-blur input-blur-a");
+				changeBtnStatus();
+			   	if(thisClass.val().length>0){
+			   	 	thisClass.next().show();
+			   	}else{
+					thisClass.next().hide();
+				}
+			}).blur(function(){
+				var thisClass = $(this);
+				tout = setTimeout(function(){
+					if(thisClass.attr("id") == "pwd"){
+						pwdisfocus = false;
+					}
+				},100);
+				toutobj[thisClass.parent().index()] = setTimeout(function(){
+					thisClass.next().hide();
+				},100);
+				$(this).parent().removeClass("input-blur-a");
+				if($(this).val() == ""){
+					$(this).parents(".pass").removeClass("input-blur");
+				}
+				changeBtnStatus();
+			});
+			$(".closeQc").on("tap",function(){
+				$(this).prev().val("").focus();
+				$(this).hide();
+				if(localStorage&&$(this).prev().attr("id")=="tel"){
+					localStorage.removeItem("loginPhone");
+				}
+				changeBtnStatus();
+			});
+			//点击切换密码显示隐藏
+			$(".pass span.jyapp-icon").on(isIos?"tap":"click",function(){
+				if($(this).hasClass("jyapp-icon-zhengyan")){
+					$(this).parent().find("input").prop("type","password");
+					$(this).removeClass("jyapp-icon-zhengyan");
+					$(this).addClass("jyapp-icon-biyan");
+				}else{
+					$(this).parent().find("input").prop("type","text");
+					$(this).removeClass("jyapp-icon-biyan");
+					$(this).addClass("jyapp-icon-zhengyan");
+				}
+				if(pwdisfocus){
+					$("#pwd").focus();
+				}
+			});
+			//点击登录显示报错弹窗
+			$("#btn").on("tap",function(){
+				if($(this).hasClass("disabled")){
+					return
+				}
+				var phone = $.trim($("#tel").val());
+				if($(".header-tab>a.header-tab-active").index() == 0){
+					$.post("/jyapp/free/login",{reqType:"phoneLogin",phone:phone,password:$(".onePass input").val(),rid:JyObj.getPushRid()},function(r){
+						if(r.status==1){
+							if(localStorage){
+								localStorage.loginPhone = phone;
+							}
+							loginSuccess(r);
+						}else{
+							showTip("手机号或密码错误",1000);
+						}		
+					});
+				}else{
+					$.post("/jyapp/free/login",{reqType:"identCodeLogin",phone:phone,identCode:$("#identCode").val(),rid:JyObj.getPushRid()},function(r){
+						if(r.status==1){
+							if(localStorage){
+								localStorage.loginPhone = phone;
+							}
+							loginSuccess(r);
+						}else{
+							showTip("验证码错误",1000);
+						}		
+					});
+				}
+			})
+			$(".wx>span").on("tap",function(){
+				loginByWeixin();
+			});
+			if(localStorage&&typeof(localStorage.loginPhone)!="undefined"){
+				$("#tel").val(localStorage.loginPhone);
+			}
+			if($("#tel").val() != ""){
+				$("#tel").prev().addClass("none");
+				$("#tel").parent().addClass("input-blur");
+				setTimeout(function(){
+					$("#tel").prev().removeClass("none");
+				},500);
+			}
+		})
+		function changeBtnStatus(){
+			var password = $(".onePass input").val();
+			var phone = $.trim($("#tel").val());
+			if(phone.length >= 11){
+				dcsOne = true;
+				if(wait == 60){
+		     		$("#sendIdentCode").css("color","#2cb7ca");
+				}
+			}else{
+				dcsOne = false;
+	     		$("#sendIdentCode").css("color","#888888")
+			}
+			if($.trim(phone).length > 0 && Verification.isPhone(phone)){
+				if($(".header-tab>a.header-tab-active").index() == 0){
+					if($.trim(password).length > 0 && password.length >= 6){
+						$("#btn").removeClass("disabled");
+					}else{
+						$("#btn").addClass("disabled");
+					}
+				}else{
+					if($.trim($("#identCode").val()).length > 0){
+						$("#btn").removeClass("disabled");
+					}else{
+						$("#btn").addClass("disabled");
+					}
+				}
+			}else{
+				$("#btn").addClass("disabled");
+			}
+		}
+		function loginByWeixin(){
+			//var wxSign = "eyJjaXR5Ijoi6YOR5beeIiwiY291bnRyeSI6IuS4reWbvSIsImNyZWF0ZXRpbWUiOjE1MTk0MzY1NDIsImhlYWRpbWd1cmwiOiJodHRwOi8vdGhpcmR3eC5xbG9nby5jbi9tbW9wZW4vdmlfMzIvUTBqNFR3R1RmVElCMFlVMDliQmJIUUZWOHpDOXVWZDRnV3hEN1BoR3FpYzVVMVhNaGF0c2pORVNOOFN4TEZDcTFCSThNNHNXcktRRXpRdG03MzZSa09nLzEzMiIsIm5pY2tuYW1lIjoi6b6Z5aS0Iiwib3BlbmlkIjoib2NYZUEwdXk3VGRMeHhLRmttajhWTUo2Y3YwayIsInByb3ZpbmNlIjoi5rKz5Y2XIiwic2V4IjoxLCJzaWduIjoiMDlkMTdmZmM3YjQ5MDIyZjllNDJjNjNhM2I2YTcyYzciLCJ1bmlvbmlkIjoib1pRQ19zOGZvaW84LTRKenc0ajVfTFZZMzFxTSJ9";
+			//loginByWeixinCallBack(wxSign);
+			// JyObj.loginByWeixin();
+		}
+		//
+		function loginByWeixinCallBack(wxSign){
+			$.ajax({
+				url: "/jyapp/free/wxLogin",
+				type: "post",
+				data: {param:wxSign,rid:JyObj.getPushRid()},
+				dataType: "json",
+				success: function(r){
+					if(r.status == 1){
+						loginSuccess(r);
+					}else{
+						showTip("登录失败",2000);
+					}
+				},
+				error: function(){
+					showTip("登录超时",1000);
+				}
+			});
+		}
+		function loginByWeixinCallBack222(){
+			//var wxSign = "eyJjaXR5Ijoi6YOR5beeIiwiY291bnRyeSI6IuS4reWbvSIsImNyZWF0ZXRpbWUiOjE1MTczMDc2MDMsImhlYWRpbWd1cmwiOiJodHRwOi8vd3d3LmJhaWR1LmNvbSIsIm5pY2tuYW1lIjoi5YWs5a2Q546LIiwib3BlbmlkIjoibzgtMnB3SGoxc190djNublJ4ckg5Y0QybmdrayIsInByb3ZpbmNlIjoi5rKz5Y2XMSIsInNleCI6MSwic2lnbiI6Ijc3OGNiM2RhM2Y0Zjg4NWYzMzBjNjc0YmRjOTM1ODJlIiwidW5pb25pZCI6Im84LTJwd0hqMXNfdHYzbm5SeHJIOWNEMm5na2sifQ==";
+			var wxSign = "D00THAAVRlVFXBkKUlRUQQMHBwFGWUNXSVZdQFRbHQtSVEcbUWhUdEQFEwsjTHliRFswBAcIXBFVZAVXPyZITElWQFlVF05NQVlUTQUGV1RMDkgPVRAHVVIBEU1cTBYdVV4TD1YNEl5VEVcBVABFWhILBBcHVgkEElkRWlxCBVQAABBbRExJVkZJQVBWVUAT";
+			$.ajax({
+				url: "/jyapp/free/login",
+				type: "post",
+				data: {reqType:"signLogin",sign:wxSign},
+				dataType: "json",
+				success: function(r){
+					//有回调函数不跳转
+					if(callBack != null && typeof(callBack) != "undefined"){
+						callBack(r.userInfo);
+						return;
+					}
+					//自动登录后跳转
+					/*if(r.status != 1){//登录失败
+						url = "/jyapp/free/login";
+					}*/
+				},
+				error: function(){
+					//alert("服务器连接超时!");
+				}
+			});
+		}
+		function showTip(text,waitTime){
+			EasyAlert.show(text,undefined,waitTime);
+			var offsetTop = $(".forget").outerHeight()+$(".forget").offset().top;
+			if(offsetTop > 0){
+				offsetTop+=10;
+				$("#easyAlert").css({top: offsetTop+"px","margin-top": "0px"});
+			}
+		}
+		var kbTimeout = null;
+		function afterKeyboardShow(){
+			if(kbTimeout != null){
+				clearTimeout(kbTimeout);
+			}
+			$(".wx").hide();
+		}
+		function afterKeyboardHide(){
+			kbTimeout = setTimeout(function(){
+				$(".wx").show();
+			},300);
+		}
+		var kicked = {{.T.kicked}};
+		afterPageInit();
+		//JyObj初始化完成,回调
+		function afterPageInit(){
+			try{
+				if((isIos && JyObj.getVersion() <= "1.0.6") || (!isIos && JyObj.getVersion() <= "1.0.4")){
+					$(".header-tab").hide();
+				}
+				if(JyObj.getVersion() <= "1.0.1"){
+					if(getUrlParam("to") != "back"){
+						backToIndex = true;
+					}
+				}
+				//是否安装了微信
+				if(JyObj.isInstallWeixin()==0){
+					$(".wx").hide();
+				}
+			}catch(e){}
+			//
+			if(sessionStorage&&sessionStorage.alertKicked == "1"){
+				return;
+			}
+			if(getUrlParam("flag") != "kicked"){
+				return;
+			}
+			//清除签名,弹出提示
+			try{
+				var sign = JyObj.getUserToken();
+				if(sign == "" || sign == null || typeof(sign) == "undefined"){
+					return;
+				}
+				JyObj.removeUserToken();
+				JyObj.alert(kicked);
+				sessionStorage.alertKicked = "1";
+				//禁止后退
+				JyObj.prohibitBack();
+			}catch(e){}
+		}
+		function time(o) {
+			if(wait == 0) {
+				o.innerHTML="获取验证码"; 
+            	o.style.color = "#2cb7ca";
+				wait = 60;
+			} else {
+				o.style.color = "#888888";
+				o.style.fontSize = "14px";
+            	o.innerHTML=wait+"s后重新发送";
+				wait--;
+				setTimeout(function() {
+					time(o)
+				},
+				1000)
+			}
+		}
+	</script>
+</body>
+</html>

文件差异内容过多而无法显示
+ 148 - 0
src/web/templates/pchelper/pushView.html


部分文件因为文件数量过多而无法显示