Ver Fonte

Merge branch 'dev2.5.1' of http://192.168.3.207:10080/qmx/jy into dev2.5.1

liuxiaolu há 6 anos atrás
pai
commit
117c1e1d6b

+ 19 - 5
src/config.json

@@ -19,7 +19,7 @@
     ],
     "cassandrasize": 5,
     "agreement": "http",
-    "webdomain": "http://webwcj.qmx.top",
+    "webdomain": "http://webky.qmx.top",
     "redirect": {
         "searchinfo": "/jylab/mainSearch",
         "rssset": "/swordfish/historypush",
@@ -194,11 +194,11 @@
     "advertName": "广告",
     "advertUrl": "/swordfish/about",
     "wxJianyu": {
-        "appid": "wx76e1309b01a7b17e",
-        "appsecret": "dd00e71cb2370432d9de848b674eb8e7",
+        "appid": "wx79f2cc873dbea989",
+        "appsecret": "fb3f77e9c6725811b5c39f6d58bd58a3",
         "pay": {
             "mchid": "1293231901",
-            "key": "top2015top2015",
+            "key": "top2016top2016",
             "attachmsg": "剑鱼打赏",
             "bodymsg": "剑鱼-招标信息打赏",
             "detailmsg": "招标推送信息[%s] 打赏%s元钱"
@@ -234,5 +234,19 @@
         "shareTimesUpperLimitR": 4000,
         "shareTimesUpperLimitIrr": 1000
     },
-	"cookiedomain": ".qmx.top"
+	"cookiedomain": ".qmx.top",
+	"exportData":{
+		"unitPrice_normal":1,
+		"unitPrice_senior":2,
+		"discount":0.8,
+		"orderMinPrice":100,
+		"msgMaxCount":20000
+	},
+	"mail":{
+        "addr": "smtp.exmail.qq.com",
+        "port": 465,
+        "pwd": "ue9Rg9Sf4CVtdm5a",
+        "user": "public03@topnet.net.cn"
+    }
+    
 }

+ 196 - 0
src/jfw/front/dataExport2.go

@@ -0,0 +1,196 @@
+package front
+
+import (
+	"encoding/json"
+	"errors"
+	"jfw/config"
+	"log"
+	"qfw/util"
+	"qfw/util/elastic"
+	qum "qfw/util/mail"
+	"regexp"
+	"strings"
+	"time"
+
+	"github.com/go-xweb/xweb"
+)
+
+var (
+	ExportTable   string = "export_search"
+	ExConf        ExportConfig
+	mailConfigMap map[string]interface{}
+)
+
+func init() {
+	xweb.AddAction(&DataExport2{})
+	//读取配置文件
+	byte_conf, err := json.Marshal(config.Sysconfig["exportData"])
+	if err != nil {
+		log.Panic(err)
+	}
+	err = json.Unmarshal(byte_conf, &ExConf)
+	if err != nil {
+		log.Panic(err)
+	}
+	mailConfigMap = config.Sysconfig["mail"].(map[string]interface{})
+}
+
+type ExportConfig struct {
+	UnitPrice_normal int64   `json:"unitPrice_normal"`
+	UnitPrice_senior int64   `json:"unitPrice_senior"`
+	Discount         float64 `json:"discount"`
+	OrderMinPrice    int64   `json:"orderMinPrice"`
+	MsgMaxCount      int64   `json:"msgMaxCount"`
+}
+
+type DataExport2 struct {
+	*xweb.Action
+	superSearchExport xweb.Mapper `xweb:"/front/dataExport/superSearchExport"`      //数据导出-超级搜索
+	toCreateOrderPage xweb.Mapper `xweb:"/front/dataExport/toCreateOrderPage/(.*)"` //数据导出-订单页面
+	sendMailVerify    xweb.Mapper `xweb:"/front/dataExport/sendMailVerify"`         //发送邮箱验证码
+	checkMailVerify   xweb.Mapper `xweb:"/front/dataExport/checkMailVerify"`        //验证邮箱验证码
+}
+
+func (de *DataExport2) SuperSearchExport() error {
+	openid := util.ObjToString(de.GetSession("s_m_openid"))
+	if openid == "" {
+		return errors.New("未登录")
+	}
+	//接收超级搜索页面参数
+	keywords := de.GetString("keywords")                    //搜索词
+	publishtime := de.GetString("publishtime")              //发布时间
+	area := de.GetString("area")                            //地区
+	subtype := de.GetString("subtype")                      //信息类型
+	minprice := de.GetString("minprice")                    //最低价格
+	maxprice := de.GetString("maxprice")                    //最高价格
+	industry := strings.TrimSpace(de.GetString("industry")) //选中的行业
+	selectType := de.GetString("selectType")                //标题 or 全文
+
+	log.Printf("keywords:%s \n publishtime:%s \n area:%s \n subtype:%s \n minprice:%s \n maxprice:%s \n industry:%s \n selectType:%s \n",
+		keywords, publishtime, area, subtype, minprice, maxprice, industry, selectType)
+
+	data := map[string]interface{}{
+		"keywords":    keywords,
+		"publishtime": publishtime,
+		"area":        area,
+		"subtype":     subtype,
+		"minprice":    minprice,
+		"maxprice":    maxprice,
+		"industry":    industry,
+		"selectType":  selectType,
+		"comeintime":  time.Now().Unix(),
+		"s_openid":    openid,
+	}
+	//存入数据库
+	_id := mongodb.Save(ExportTable, data)
+	log.Println("_id-------", _id)
+	//携带id跳转订单生成页面
+	de.Redirect("/front/dataExport/toCreateOrderPage/" + _id)
+	return nil
+}
+func (de *DataExport2) ToCreateOrderPage(_id string) error {
+	var (
+		query    *map[string]interface{}
+		ok       bool
+		msgCount int64
+		//查询字段
+		keywords    string
+		industry    string
+		minprice    string
+		maxprice    string
+		selectType  string
+		area        string
+		publishtime string
+		subtype     string
+	)
+	openid := util.ObjToString(de.GetSession("s_m_openid"))
+	if openid == "" {
+		return errors.New("未登录")
+	}
+	//query := make(map[string]interface{})
+	if query, ok = mongodb.FindById(ExportTable, _id, nil); !ok {
+		return errors.New("未找到搜索记录")
+	}
+	//查询参数
+	keywords = (*query)["keywords"].(string)
+	industry = (*query)["industry"].(string)
+	minprice = (*query)["minprice"].(string)
+	maxprice = (*query)["maxprice"].(string)
+	subtype = (*query)["subtype"].(string)
+	area = (*query)["area"].(string)
+	selectType = (*query)["selectType"].(string)
+	publishtime = (*query)["publishtime"].(string)
+
+	log.Printf("keywords:%s \n publishtime:%s \n area:%s \n subtype:%s \n minprice:%s \n maxprice:%s \n industry:%s \n selectType:%s \n",
+		keywords, publishtime, area, subtype, minprice, maxprice, industry, selectType)
+
+	if selectType != "" {
+		selectType = "\"" + selectType + "\""
+	}
+
+	qstr := getSearchQuery(keywords, industry, minprice, maxprice, selectType, getBidSearchQuery(area, publishtime, subtype))
+	msgCount = elastic.Count(INDEX, TYPE, qstr)
+
+	if msgCount > ExConf.MsgMaxCount {
+		msgCount = ExConf.MsgMaxCount
+	}
+
+	de.T["msgCount"] = msgCount
+	de.T["msgMaxCount"] = ExConf.MsgMaxCount
+	de.T["discount"] = ExConf.Discount
+	de.T["unitPrice_normal"] = ExConf.UnitPrice_normal
+	de.T["unitPrice_senior"] = ExConf.UnitPrice_senior
+	de.T["orderMinPrice"] = ExConf.OrderMinPrice
+
+	de.Render("/pc/createOrderPage.html", &de.T)
+	return nil
+}
+
+func (de *DataExport2) SendMailVerify() {
+	email := de.GetString("email")
+	if isEmail(email) {
+		lastSendDEVerify := util.Int64All(de.GetSession("CreatEVerifyTime"))
+		timeSpaceing := lastSendDEVerify - time.Now().Unix() + 60*5
+
+		log.Println("~~~~", lastSendDEVerify, timeSpaceing)
+		if lastSendDEVerify == 0 || timeSpaceing < 0 {
+			//生成随机数
+			verifyStr := strings.ToUpper(util.GetComplexRandom(6, 3, 3))
+			de.SetSession("DataExportVerify", verifyStr)
+			de.SetSession("CreatEVerifyTime", time.Now().Unix())
+			log.Println("====================", verifyStr, "====================")
+			//发送邮箱验证码
+			qum.SendMail(&qum.MailAuth{mailConfigMap["addr"].(string), mailConfigMap["port"].(int), mailConfigMap["user"].(string), mailConfigMap["pwd"].(string)}, &qum.Message{"剑鱼招标订阅邮箱校验", "剑鱼招标订阅", []string{email}, "您可以使用此验证码来验证您是该电子邮件地址的所有者。<font size=3>" + verifyStr + "</font>;如果这不是您本人所为,则可能是有人误输了您的电子邮件地址。请勿将此验证码泄露给他人,并且您目前无需执行任何其它操作。"})
+			de.T["success"] = true
+		} else {
+			de.T["success"] = false
+			de.T["errCode"] = 2
+			de.T["time"] = timeSpaceing
+			de.T["errMsg"] = "已发送,5分钟后再尝试"
+		}
+	} else {
+		de.T["success"] = false
+		de.T["errCode"] = 1
+		de.T["errMsg"] = "验证码校验失败"
+	}
+	de.ServeJson(&de.T)
+}
+
+func (de *DataExport2) CheckMailVerify() {
+	emailVerity := de.GetString("emailVerity")
+	DataExportVerify := de.GetSession("DataExportVerify")
+	verityResult := false
+	if emailVerity != "" && emailVerity == DataExportVerify {
+		verityResult = true
+		de.DelSession("DataExportVerify")
+		de.DelSession("CreatEVerifyTime")
+		de.SetSession("EMVerifySucess", true)
+	}
+	de.T["success"] = verityResult
+	de.ServeJson(&de.T)
+}
+
+func isEmail(value string) bool {
+	var emailPattern = regexp.MustCompile("^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$")
+	return emailPattern.MatchString(value)
+}

+ 4 - 3
src/web/staticres/dataExport/css/payment_order.css

@@ -34,9 +34,9 @@ body { background-color: #F5F5FB; }
 
 #pay .inner .infotitle span i { font-size: 20px; color: #2CB7CA; margin: 0 2px; }
 
-#pay .inner .infotitle em { font-size: 12px; color: #888888; margin-left: 20px; margin-right: 20px; }
+#pay .inner .infotitle em { font-size: 12px; color: #888888; margin-left: 20px; }
 
-#pay .inner .infotitle a { color: #2CB7CA; }
+#pay .inner .infotitle a { color: #2CB7CA; margin-left: 20px; cursor: pointer;}
 
 #pay .inner .infotitle a span { color: #2CB7CA; }
 
@@ -116,6 +116,7 @@ body { background-color: #F5F5FB; }
 
 #pay .inner .info .right .btn button:nth-of-type(1) { background-color: #fff; margin-right: 15px; border: 1px solid #ccc; }
 
-#pay .inner .info .right .btn button:nth-of-type(2) { background-color: #2CB7CA; color: #fff; }
+#pay .inner .info .right .btn button:nth-of-type(2) { color: #fff; }
 
+#pay .no-select{-webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none;}
 /*# sourceMappingURL=payment_order.css.map */

+ 3 - 1
src/web/staticres/js/biddingSearch.js

@@ -379,7 +379,9 @@ $(function() {
 					$("#bidLogin").modal("show");
 				}else{
 					//已登录跳转订单支付页面
-					
+					$("#zbSeatchT").attr("action","/front/dataExport/superSearchExport");
+					$("#zbSeatchT").removeAttr("onsubmit");
+					$("#zbSeatchT").submit();
 				}
 			}
 		})

+ 251 - 0
src/web/templates/pc/createOrderPage.html

@@ -0,0 +1,251 @@
+<!doctype html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport"
+          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
+    <meta http-equiv="X-UA-Compatible" content="ie=edge">
+    <link rel="stylesheet" href="//at.alicdn.com/t/font_624651_bjdvktmum68.css">
+    <link rel="stylesheet" href="/dataExport/css/reset_pc.css">
+    <link rel="stylesheet" href="/dataExport/css/payment_order.css">
+    <title>支付订单</title>
+</head>
+<body>
+<section id="pay" class="w">
+    <div class="progress">
+        <div class="l c3">
+            1.条件筛选
+        </div>
+        <div class="c b2">
+            2.订单支付
+        </div>
+        <div class="r a1">
+            3.数据导出
+        </div>
+    </div>
+    <div class="inner">
+        <div class="infotitle">
+            <span>当前搜索到<i class="msgCount"></i>条信息</span>
+            <em style="display:none">最大限额20,000条</em>
+            <a class="dataPreview"><span class="iconfont icon-yulan"></span>预览数据</a>
+        </div>
+        <div class="email">
+            <div class="title">导出邮箱地址</div>
+            <div class="input clearfix">
+                <input class="fl em email_input" type="text" placeholder="请输入邮箱地址,用于接收导出的数据">
+                <input class="fl test verity_input" type="text" maxlength="6" placeholder="请输入邮箱验证码">
+                <button class="fl sub sendEmail">获取验证码</button>
+                <div class="fl status clearfix">
+                    <i class="fl iconfont icon-zhengque succ email_check_ok" style="display:none"></i>
+                    <p class="err fl email_err_msg" style="display:none"><i class="iconfont icon-cuowu"></i>您输入的验证码不正确</p>
+                </div>
+            </div>
+        </div>
+        <div class="guige">
+            <div class="title">数据规格<i class="iconfont icon-bangzhu"></i></div>
+            <div class="inner clearfix switch-dataType">
+                <div class="bz no-select">
+                    <p>标准字段包</p>
+                    <p>
+                        <del>{{.T.unitPrice_normal}}元/条</del>&nbsp;<span>{{.T.unitPrice_normal_final}}元/条</span></p>
+                </div>
+                <div class="gj active no-select">
+                    <p><i class="iconfont icon-huangguan"></i>高级字段包</p>
+                    <p>
+                        <del>{{.T.unitPrice_senior}}元/条</del>&nbsp;<span>{{.T.unitPrice_senior_final}}元/条</span></p>
+                </div>
+            </div>
+        </div>
+        <div class="wxpay">
+            <div class="title">支付方式</i></div>
+            <div class="inner clearfix">
+                <div class="wx active no-select">
+                    <span>微信支付</span>
+                </div>
+            </div>
+        </div>
+        <div class="money ">
+            <div class="clearfix">
+                <p class="fr">应付总额:现价 <span class="pay_discount">¥2046</span></p>
+            </div>
+            <div class="clearfix">
+                <p class="fr">原价
+                    <del class="pay_before">¥2090</del>
+                </p>
+            </div>
+        </div>
+        <div class="info clearfix">
+            <div class="fl left">
+                <p>最低起售{{.T.orderMinPrice}}元</p>
+                <p>限额{{.T.msgMaxCount}}条,计价方式唯一</p>
+                <p class="unitPrice_normal_detail">标准字段包:原价1元/条,5折价0.5元/条计费</p>
+                <p class="unitPrice_senior_detail">高级字段包:原价2元/条,5折价1元/条计费</p>
+            </div>
+            <div class="fr right">
+                <p class="clearfix t fr">
+                    <span id="checkBoxjy" class="iconfont"></span>
+                    <i>已阅读并同意<a href="#">《剑鱼服务条款》</a></i>
+
+                </p>
+                <p class="btn">
+                    <button class="dataPreview">预览数据</button>
+                    <button class="toPay" disabled="disabled">确认支付</button>
+                </p>
+            </div>
+        </div>
+    </div>
+</section>
+
+<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
+<script>
+	var msgCount={{.T.msgCount}}
+	var msgMaxCount={{.T.msgMaxCount}}
+	var discount={{.T.discount}}
+	var unitPrice_normal={{.T.unitPrice_normal}}
+	var unitPrice_senior={{.T.unitPrice_senior}}
+	var orderMinPrice={{.T.orderMinPrice}}
+	
+	var finishEmailVerity=false;
+	var dataType=2;
+	$(function () {
+		//数据展示
+		var showCount=FormatNum(msgCount);
+		$(".msgCount").text(showCount);
+		$(".unitPrice_normal_detail").text("标准字段包:原价"+unitPrice_normal+"元/条,"+discount*10+"折价"+unitPrice_normal*discount+"元/条计费");
+		$(".unitPrice_senior_detail").text("高级字段包:原价"+unitPrice_senior+"元/条,"+discount*10+"折价"+unitPrice_senior*discount+"元/条计费");
+		ChangePayMoney();
+		
+		//邮箱验证
+		$(".sendEmail").on("click",function(){
+			var email=$(".email_input").val();
+			if(!/\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}/.test(email)){
+				showEmailErr("邮箱格式不正确");
+				return
+			}
+			showEmailErr("");
+			$.post("/front/dataExport/sendMailVerify",{"email":email},function(data){
+				console.log(data)
+				if(data.success){
+					//发送成功
+					sendemailTimer(60*5);
+					$(".sendEmail").attr("disabled","disabled");
+					$(".email_input").attr("disabled","disabled");
+				}else{
+					showEmailErr(data.errMsg)
+					if(data.errCode==2){
+						sendemailTimer(data.time);
+						$(".sendEmail").attr("disabled","disabled");
+						$(".email_input").attr("disabled","disabled");
+					}
+				}
+			},"json")
+		});
+		//校验验证码
+		$(".verity_input").bind("input propertychange",function(){
+			var verity=$(this).val()
+			if(verity.length==6){
+				$.post("/front/dataExport/checkMailVerify",{"emailVerity":verity},function(data){
+					if(data.success){
+						showEmailErr("");
+						finishEmailVerity=true;
+						$(".email_check_ok").css("display","");
+						$(".verity_input").attr("disabled","disabled");
+					}else{
+						showEmailErr("验证码错误");
+					}
+				})
+			}
+		})
+		
+		
+		
+		//是否显示最大条数
+		if(msgCount=msgMaxCount){
+			$(".infotitle em").text("最大限额"+showCount+"条");
+			$(".infotitle em").css("display","");
+		} 
+		
+		//点击阅读条款
+		$('#checkBoxjy').on('click', function () {
+			$(this).toggleClass('hideBf');
+			if($(this).attr("class").indexOf("hideBf")>-1){
+				$(".toPay").css("background-color","#2CB7CA")
+				$(".toPay").removeAttr("disabled");
+			}else{
+				$(".toPay").css("background-color","buttonface")
+				$(".toPay").attr("disabled","disabled");
+			}
+		})
+		
+		//类型切换
+		$(".switch-dataType div").on("click",function(){
+			$($(this).addClass("active").siblings()).removeClass("active")
+			if($(this).attr("class").indexOf("bz")>-1){
+				dataType=1;
+			}else if($(this).attr("class").indexOf("gj")>-1){
+				dataType=2;
+			}
+			ChangePayMoney();
+		})
+		//确认支付
+		$(".toPay").on("click",function(){
+			alert(111)
+		})
+		//数据浏览
+		$(".dataPreview").on("click",function(){window.open("http://baidu.com");})
+		
+	})
+	
+	function FormatNum(n){
+		if(n>=1000){
+			return Math.floor(n/1000)+","+("0000"+n%1000).slice(-3)
+		}
+		return n
+	}
+	
+	function ChangePayMoney(){
+		var shouldPay;beforePay=0;0;
+		if(dataType==1){
+			beforePay=unitPrice_normal*msgCount
+			shouldPay=beforePay*discount;	
+		}else if(dataType==2){
+			beforePay=unitPrice_senior*msgCount
+			shouldPay=beforePay*discount;	
+		}
+		shouldPay=shouldPay>orderMinPrice?shouldPay:orderMinPrice;
+		beforePay=beforePay>orderMinPrice?beforePay:orderMinPrice;
+		$(".pay_discount").text("¥"+shouldPay);
+		$(".pay_before").text("¥"+beforePay)
+	}
+	function showEmailErr(str){
+		if(!finishEmailVerity){
+			$(".email_check_ok").css("display","none");
+		}
+		
+		if(str!=""){
+			$(".email_err_msg").css("display","").html("<i class=\"iconfont icon-cuowu\"></i>"+str);
+		}else{
+			$(".email_err_msg").css("display","none")
+		}
+	}
+	function sendemailTimer(t){
+		$(".sendEmail").css("background","buttonface");
+		$(".sendEmail").text("再次尝试("+t+"s)")
+		r=setInterval(function(){
+			t--;
+			$(".sendEmail").text("再次尝试("+t+"s)")
+			console.log("sss")
+			if(t==0){
+				clearInterval(r)
+				$(".sendEmail").text("获取验证码").css("background","#2CB7CA");
+				if(!finishEmailVerity){
+					$(".sendEmail").removeAttr("disabled");
+					$(".email_input").removeAttr("disabled");
+				}
+				showEmailErr("");
+			}
+		},1000)
+	}
+</script>
+</body>
+</html>