Browse Source

Merge branch 'dev2.10.9.2' of ssh://192.168.3.207:10022/qmx/jy into dev2.10.9.2

wangchuanjin 5 years ago
parent
commit
20b283a033
100 changed files with 2140 additions and 457 deletions
  1. 6 0
      src/jfw/front/dataExport.go
  2. 275 10
      src/jfw/front/structedData.go
  3. 4 0
      src/jfw/front/wx_dataExport.go
  4. 4 0
      src/jfw/modules/app/src/app/front/dataExport.go
  5. 9 4
      src/jfw/modules/app/src/app/front/login.go
  6. 1 0
      src/jfw/modules/app/src/app/front/me.go
  7. 250 7
      src/jfw/modules/app/src/app/front/structedData.go
  8. 2 1
      src/jfw/modules/app/src/seo.json
  9. 6 0
      src/jfw/modules/app/src/web/staticres/jyapp/js/common.js
  10. 2 1
      src/jfw/modules/app/src/web/staticres/jyapp/structuredata/css/base.css
  11. 49 46
      src/jfw/modules/app/src/web/staticres/jyapp/structuredata/css/marketing.css
  12. 133 60
      src/jfw/modules/app/src/web/staticres/jyapp/structuredata/css/write_infor.css
  13. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/structuredata/image/correct-icon-mobile.png
  14. 33 8
      src/jfw/modules/app/src/web/templates/structeddata/marketing.html
  15. 506 111
      src/jfw/modules/app/src/web/templates/structeddata/write_infor.html
  16. 3 3
      src/jfw/modules/app/src/web/templates/structeddata/write_result.html
  17. 1 1
      src/jfw/modules/app/src/web/templates/weixin/search/mainSearch.html
  18. 3 0
      src/jfw/modules/app/src/web/templates/weixin/wxinfocontent.html
  19. 31 0
      src/jfw/modules/subscribepay/src/service/dataExportPay_mobile.go
  20. 9 0
      src/jfw/modules/subscribepay/src/service/dataExportPay_pc.go
  21. 36 0
      src/jfw/modules/subscribepay/src/util/structed.go
  22. 5 5
      src/jfw/modules/weixin/src/config.json
  23. 9 0
      src/jfw/public/public.go
  24. 53 0
      src/jfw/public/structed.go
  25. 2 1
      src/seo.json
  26. 15 0
      src/web/staticres/css/dataService.css
  27. 2 2
      src/web/staticres/js/public-nav.js
  28. 0 162
      src/web/staticres/structuredata/css/write_infor.css
  29. BIN
      src/web/staticres/structuredata/file/【剑鱼标讯】结构化招标数据.xlsx
  30. 0 0
      src/web/staticres/structuredata/mobile/css/base.css
  31. 0 0
      src/web/staticres/structuredata/mobile/css/data_example.css
  32. 47 35
      src/web/staticres/structuredata/mobile/css/marketing.css
  33. 0 0
      src/web/staticres/structuredata/mobile/css/preview.css
  34. 0 0
      src/web/staticres/structuredata/mobile/css/weui.min.css
  35. 271 0
      src/web/staticres/structuredata/mobile/css/write_infor.css
  36. 0 0
      src/web/staticres/structuredata/mobile/css/write_result.css
  37. 0 0
      src/web/staticres/structuredata/mobile/iconfont/iconfont.css
  38. 0 0
      src/web/staticres/structuredata/mobile/iconfont/iconfont.eot
  39. 0 0
      src/web/staticres/structuredata/mobile/iconfont/iconfont.ttf
  40. 0 0
      src/web/staticres/structuredata/mobile/iconfont/iconfont.woff
  41. 0 0
      src/web/staticres/structuredata/mobile/iconfont/iconfont.woff2
  42. 0 0
      src/web/staticres/structuredata/mobile/image/01.png
  43. 0 0
      src/web/staticres/structuredata/mobile/image/02.png
  44. 0 0
      src/web/staticres/structuredata/mobile/image/03.png
  45. 0 0
      src/web/staticres/structuredata/mobile/image/04.png
  46. 0 0
      src/web/staticres/structuredata/mobile/image/Frame-1.png
  47. 0 0
      src/web/staticres/structuredata/mobile/image/Frame-2.png
  48. 0 0
      src/web/staticres/structuredata/mobile/image/Frame-3.png
  49. 0 0
      src/web/staticres/structuredata/mobile/image/Frame.png
  50. 0 0
      src/web/staticres/structuredata/mobile/image/T+2小时获取数据.png
  51. 0 0
      src/web/staticres/structuredata/mobile/image/advantage.png
  52. 0 0
      src/web/staticres/structuredata/mobile/image/api.png
  53. 0 0
      src/web/staticres/structuredata/mobile/image/banner.png
  54. 0 0
      src/web/staticres/structuredata/mobile/image/bg.png
  55. 0 0
      src/web/staticres/structuredata/mobile/image/bg_info.png
  56. 0 0
      src/web/staticres/structuredata/mobile/image/biaoti.png
  57. 0 0
      src/web/staticres/structuredata/mobile/image/choose.png
  58. 0 0
      src/web/staticres/structuredata/mobile/image/company.png
  59. BIN
      src/web/staticres/structuredata/mobile/image/correct-icon-mobile.png
  60. 0 0
      src/web/staticres/structuredata/mobile/image/dowhat.png
  61. 0 0
      src/web/staticres/structuredata/mobile/image/email.png
  62. BIN
      src/web/staticres/structuredata/mobile/image/emaillogo.png
  63. 0 0
      src/web/staticres/structuredata/mobile/image/jiegouhuahou.png
  64. 0 0
      src/web/staticres/structuredata/mobile/image/phone.png
  65. 0 0
      src/web/staticres/structuredata/mobile/image/preview.png
  66. 0 0
      src/web/staticres/structuredata/mobile/image/qiyejuzhen.png
  67. 0 0
      src/web/staticres/structuredata/mobile/image/sprite_icon.png
  68. 0 0
      src/web/staticres/structuredata/mobile/image/what.png
  69. 0 0
      src/web/staticres/structuredata/mobile/image/zhuangshiqiu.png
  70. 0 0
      src/web/staticres/structuredata/mobile/image/字段准确率达98.12%.png
  71. 0 0
      src/web/staticres/structuredata/mobile/image/数据全面有保障.png
  72. 0 0
      src/web/staticres/structuredata/mobile/image/获取方式多样化.png
  73. 0 0
      src/web/staticres/structuredata/mobile/image/金刚区/appxiazai.png
  74. 0 0
      src/web/staticres/structuredata/mobile/image/金刚区/jiegouhuashuju.png
  75. 0 0
      src/web/staticres/structuredata/mobile/image/金刚区/kecheng.png
  76. 0 0
      src/web/staticres/structuredata/mobile/image/金刚区/shangjiguanli.png
  77. 0 0
      src/web/staticres/structuredata/mobile/image/金刚区/shujubaogao.png
  78. 0 0
      src/web/staticres/structuredata/mobile/image/金刚区/shujudaochu.png
  79. 0 0
      src/web/staticres/structuredata/mobile/image/金刚区/zhongbiao.png
  80. 0 0
      src/web/staticres/structuredata/mobile/js/common.js
  81. 0 0
      src/web/staticres/structuredata/mobile/js/imageViewer.min.js
  82. 0 0
      src/web/staticres/structuredata/mobile/js/jquery.min.js
  83. 0 0
      src/web/staticres/structuredata/mobile/js/rem.js
  84. 0 0
      src/web/staticres/structuredata/mobile/js/weui.min.js
  85. 76 0
      src/web/staticres/structuredata/pc/css/reset_pc.css
  86. 22 0
      src/web/staticres/structuredata/pc/css/stucturedPc.css
  87. 275 0
      src/web/staticres/structuredata/pc/css/write_infor.css
  88. BIN
      src/web/staticres/structuredata/pc/image/01_arrow@2x.png
  89. BIN
      src/web/staticres/structuredata/pc/image/01_bg.png
  90. BIN
      src/web/staticres/structuredata/pc/image/01_text01@2x.png
  91. BIN
      src/web/staticres/structuredata/pc/image/02_icon01@2x.png
  92. BIN
      src/web/staticres/structuredata/pc/image/02_icon02@2x.png
  93. BIN
      src/web/staticres/structuredata/pc/image/02_image01.png
  94. BIN
      src/web/staticres/structuredata/pc/image/02_image02.png
  95. BIN
      src/web/staticres/structuredata/pc/image/02_image03.png
  96. BIN
      src/web/staticres/structuredata/pc/image/02_title@2x.png
  97. BIN
      src/web/staticres/structuredata/pc/image/03_image01@2x.png
  98. BIN
      src/web/staticres/structuredata/pc/image/03_image02@2x.png
  99. BIN
      src/web/staticres/structuredata/pc/image/03_image03@2x.png
  100. BIN
      src/web/staticres/structuredata/pc/image/03_image04@2x.png

+ 6 - 0
src/jfw/front/dataExport.go

@@ -510,6 +510,12 @@ func (d *DataExport) ToCreateOrderPage(_id string) error {
 	if userId == "" {
 		return errors.New("未登录")
 	}
+	//是否是从结构化数据推广页过来的
+	if d.GetString("from") == "structed" {
+		d.SetSession("Structed", true)
+	} else {
+		d.DelSession("Structed")
+	}
 	msgCount := public.GetDataExportSearchCountUseId(id)
 	if msgCount > public.ExConf.MsgMaxCount {
 		msgCount = public.ExConf.MsgMaxCount

+ 275 - 10
src/jfw/front/structedData.go

@@ -1,47 +1,241 @@
 package front
 
 import (
-	"github.com/go-xweb/xweb"
-	"gopkg.in/mgo.v2/bson"
+	"fmt"
+	"jfw/config"
 	"jfw/public"
+	"log"
 	"qfw/util"
+	"qfw/util/redis"
+	"strings"
 	"time"
+
+	"github.com/go-xweb/xweb"
+	"gopkg.in/mgo.v2/bson"
 )
 
 type StructedData struct {
 	*xweb.Action
-	index      xweb.Mapper `xweb:"/front/structed/index"`      //数据结构化首页
-	writeInfo  xweb.Mapper `xweb:"/front/structed/writeinfo"`  //信息填写
+	index      xweb.Mapper `xweb:"/front/structed/index"`     //数据结构化首页
+	writeInfo  xweb.Mapper `xweb:"/front/structed/writeinfo"` //信息填写
 	checkUser  xweb.Mapper `xweb:"/front/structed/checkuser"`
 	success    xweb.Mapper `xweb:"/front/structed/success"`    //信息填写成功
 	saveData   xweb.Mapper `xweb:"/front/structed/savedata"`   //数据结构化保存用户
 	getPreview xweb.Mapper `xweb:"/front/structed/getpreview"` //数据结构化预览
+	//dev2.10.10
+	pc_index       xweb.Mapper `xweb:"/front/structed/pc_index.html"`  //pc端结构化数据首页
+	pc_info        xweb.Mapper `xweb:"/front/structed/pc_info.html"`   //pc端结构化数据信息页面
+	freeSamples    xweb.Mapper `xweb:"/front/structed/freeSamples"`    //数据结构化保存免费样例数据
+	verifyCode     xweb.Mapper `xweb:"/front/structed/verifyCode"`     //数据结构化验证邮箱验证码
+	sendMailVerify xweb.Mapper `xweb:"/front/structed/sendMailVerify"` //数据结构化发送邮箱验证码
+	verifyEmail    xweb.Mapper `xweb:"/front/structed/verifyEmail"`    //数据结构化验证邮箱是否验证过
 }
 
 func init() {
 	xweb.AddAction(&StructedData{})
 }
 
+//验证邮箱的正确性
+func (t *StructedData) VerifyEmail() {
+	defer util.Catch()
+	msg := "请求方式有误"
+	status := false
+	if t.Method() == "POST" {
+		userId := util.ObjToString(t.GetSession("userId"))
+		email := t.GetString("email")
+		msg = "参数有误"
+		if email != "" {
+			msg = "未登录"
+			if userId != "" {
+				emails := public.Mysql.FindOne("dataexport_order", map[string]interface{}{
+					"user_mail":    email,
+					"user_id":      userId,
+					"product_type": "历史数据",
+				}, "user_mail", "")
+				//是否是绑定邮箱或者是数据导出邮箱  验证过的邮箱
+				if (emails != nil && util.ObjToString((*emails)["user_mail"]) != "") || (t.GetSession("s_myemail") != nil && email == t.GetSession("s_myemail").(string)) || (t.GetSession("SMVerifySucess") != nil && t.GetSession("SMVerifySucess").(bool) && email == t.GetSession("DataSMVerifyEmail")) {
+					status = true
+					msg = "此邮箱已被验证"
+					t.SetSession("SMVerifySucess", true)
+				} else {
+					msg = "未被验证"
+				}
+			}
+		}
+	}
+
+	t.ServeJson(map[string]interface{}{
+		"msg":    msg,
+		"status": status,
+	})
+}
+
+//验证 验证码的正确性
+func (t *StructedData) VerifyCode() {
+	defer util.Catch()
+	msg := "请求方式有误"
+	status := false
+	if t.Method() == "POST" {
+		userId := util.ObjToString(t.GetSession("userId"))
+		msg = "未登录"
+		if userId != "" {
+			s_email := t.GetString("s_email")       //邮箱
+			verifyCode := t.GetString("verifyCode") //验证码
+			VerifyEmail := util.ObjToString(t.GetSession("DataSMVerifyEmail"))
+			if verifyCode != "" && s_email != "" && VerifyEmail != "" {
+				if s_email == VerifyEmail {
+					msg = "验证码正确"
+					status = true
+					SMVerifySucess := t.GetSession("SMVerifySucess")
+					//需验证邮箱
+					if SMVerifySucess != nil && !SMVerifySucess.(bool) {
+						//验证码
+						verifyStr := t.GetSession("DataSMVerify")
+						//是否超时
+						lastSendDEVerify := util.Int64All(t.GetSession("CreatSMVerifyTime"))
+						timeSpaceing := lastSendDEVerify - time.Now().Unix() + 60*5
+						if lastSendDEVerify == 0 || timeSpaceing < 0 {
+							msg = "验证码超时"
+							status = false
+						} else if verifyStr != verifyCode {
+							msg = "验证码有误"
+							status = false
+						} else {
+							t.SetSession("SMVerifySucess", true)
+						}
+					}
+				} else {
+					msg = "验证码有误"
+					status = false
+				}
+			}
+		}
+	}
+	t.ServeJson(map[string]interface{}{
+		"msg":    msg,
+		"status": status,
+	})
+}
+
+//保存免费样例数据
+func (t *StructedData) FreeSamples() error {
+	defer util.Catch()
+	msg := "请求方式有误"
+	status := false
+	if t.Method() == "POST" {
+		userId := util.ObjToString(t.GetSession("userId"))
+		if userId != "" {
+			name := t.GetString("name")                      //联系人
+			phone_num := t.GetString("phone_num")            //手机号
+			s_email := t.GetString("s_email")                //邮箱
+			SMVerifySucess := t.GetSession("SMVerifySucess") //邮箱是否验证成功
+			if name != "" && phone_num != "" && s_email != "" && SMVerifySucess != nil && SMVerifySucess.(bool) {
+				count := public.Mysql.Count("structed_data", map[string]interface{}{
+					"name":  name,
+					"phone": phone_num,
+					"email": s_email,
+					"type":  1,
+				})
+				if count >= 1 {
+					msg = "用户信息已存在"
+					status = true
+				} else {
+					stu := public.Mysql.Insert("structed_data", map[string]interface{}{
+						"name":        name,
+						"phone":       phone_num,
+						"email":       s_email,
+						"submit_time": time.Now().Unix(),
+						"status":      0,
+						"type":        1, //用户来源,0:联系客服,1:免费样例,2:自选购买
+					})
+					if stu == 0 {
+						msg = "数据库操作异常"
+						status = false
+					} else {
+						//保存成功后 删除验证成功记录 和 发送验证码时间
+						t.DelSession("SMVerifySucess")
+						t.DelSession("CreatSMVerifyTime")
+						t.DelSession("DataSMVerifyEmail")
+						msg = "保存成功"
+						status = true
+						go public.SendStructedDataByEmail(s_email, config.GmailAuth)
+					}
+				}
+			} else {
+				msg = "缺少参数"
+				status = false
+			}
+		}
+	}
+	t.ServeJson(map[string]interface{}{
+		"msg":    msg,
+		"status": status,
+	})
+	return nil
+}
+
+//必须登录
+func (t *StructedData) Pc_info() error {
+	defer util.Catch()
+	userId := util.ObjToString(t.GetSession("userId"))
+	if userId != "" {
+		//删除验证成功记录 和 发送验证码时间 邮箱
+		t.DelSession("SMVerifySucess")
+		t.DelSession("CreatSMVerifyTime")
+		t.DelSession("DataSMVerifyEmail")
+		nums, ok := public.MQFW.FindOne("user", bson.M{"_id": bson.ObjectIdHex(userId)})
+		if !ok {
+			return t.Redirect("/front/aboutus.html")
+		}
+		if _, ok := (*nums)["s_phone"]; ok {
+			t.T["phone_num"] = (*nums)["s_phone"].(string)
+		}
+		if _, ok := (*nums)["s_myemail"]; ok {
+			t.T["s_myemail"] = (*nums)["s_myemail"].(string)
+			//验证是否是绑定的邮箱
+			t.SetSession("s_myemail", (*nums)["s_myemail"].(string))
+			t.SetSession("DataSMVerifyEmail", (*nums)["s_myemail"].(string))
+			t.SetSession("SMVerifySucess", true)
+		}
+		return t.Render("/structuredata/pc/info.html", &t.T)
+	} else {
+		return t.Redirect("/front/aboutus.html")
+	}
+}
+
+//可以不登录
+func (t *StructedData) Pc_index() error {
+	t.T["source"] = "wx_sy_dh_4"
+	return t.Render("/structuredata/pc/index.html", &t.T)
+}
 func (t *StructedData) Index() error {
 	t.T["source"] = "wx_sy_dh_4"
-	return t.Render("/structuredata/marketing.html", &t.T)
+	return t.Render("/structuredata/mobile/marketing_wx.html", &t.T)
 }
 
 //信息填写
 func (t *StructedData) WriteInfo() error {
-	return t.Render("/structuredata/write_info.html")
+	return t.Render("/structuredata/mobile/write_info.html")
 }
 
 //结构化数据预览
 func (t *StructedData) GetPreview() error {
-	return t.Render("/structuredata/preview.html")
+	return t.Render("/structuredata/mobile/preview.html")
 }
 func (t *StructedData) Success() error {
-	return t.Render("/structuredata/write_result.html")
+	//删除验证成功记录 和 发送验证码时间 邮箱
+	t.DelSession("SMVerifySucess")
+	t.DelSession("CreatSMVerifyTime")
+	t.DelSession("DataSMVerifyEmail")
+	return t.Render("/structuredata/mobile/write_result.html")
 }
 func (t *StructedData) CheckUser() error {
 	userId := util.ObjToString(t.GetSession("userId"))
 	if userId != "" {
+		//删除验证成功记录 和 发送验证码时间 邮箱
+		t.DelSession("SMVerifySucess")
+		t.DelSession("CreatSMVerifyTime")
+		t.DelSession("DataSMVerifyEmail")
 		nums, ok := public.MQFW.FindOne("user", bson.M{"_id": bson.ObjectIdHex(userId)})
 		if !ok {
 			return t.Redirect("/swordfish/about?source=open_infocontent&o=-130")
@@ -49,7 +243,14 @@ func (t *StructedData) CheckUser() error {
 		if _, ok := (*nums)["s_phone"]; ok {
 			t.T["phone_num"] = (*nums)["s_phone"].(string)
 		}
-		return t.Render("/structuredata/write_infor.html", &t.T)
+		if _, ok := (*nums)["s_myemail"]; ok {
+			t.T["s_myemail"] = (*nums)["s_myemail"].(string)
+			//验证是否是绑定的邮箱
+			t.SetSession("s_myemail", (*nums)["s_myemail"].(string))
+			t.SetSession("DataSMVerifyEmail", (*nums)["s_myemail"].(string))
+			t.SetSession("SMVerifySucess", true)
+		}
+		return t.Render("/structuredata/mobile/write_infor_wx.html", &t.T)
 	} else {
 		return t.Redirect("/swordfish/about?source=open_infocontent&o=-130")
 	}
@@ -59,10 +260,11 @@ func (t *StructedData) CheckUser() error {
 func (t *StructedData) SaveData() {
 	name := t.GetString("name")
 	phone_num := t.GetString("phone_num")
-	if name != "" && phone_num != "" {
+	if name != "" && phone_num != "" && isPhone(phone_num) {
 		count := public.Mysql.Count("structed_data", map[string]interface{}{
 			"name":  name,
 			"phone": phone_num,
+			"type":  0,
 		})
 		if count >= 1 {
 			t.ServeJson(map[string]interface{}{
@@ -78,6 +280,7 @@ func (t *StructedData) SaveData() {
 				"phone":       phone_num,
 				"submit_time": time.Now().Unix(),
 				"status":      0,
+				"type":        0, //用户来源,0:联系客服,1:免费样例,2:自选购买
 			})
 			if stu == 0 {
 				t.ServeJson(map[string]interface{}{
@@ -100,3 +303,65 @@ func (t *StructedData) SaveData() {
 	}
 }
 
+//发送邮件
+func (t *StructedData) SendMailVerify() {
+	defer util.Catch()
+	if t.Method() == "POST" {
+		userId := util.ObjToString(t.GetSession("userId"))
+		if userId != "" {
+			email := t.GetString("email")
+			if isEmail(email) {
+				lastSendDEVerify := util.Int64All(t.GetSession("CreatSMVerifyTime"))
+				timeSpaceing := lastSendDEVerify - time.Now().Unix() + 60*5
+				incurKey := fmt.Sprintf("SendSMEmail_%s_%d", t.GetSession("userId"), time.Now().Day())
+				if lastSendDEVerify == 0 || timeSpaceing < 0 {
+					//每日限制10次
+					times := util.IntAll(redis.Get("other", incurKey))
+					if times < 10 {
+						if times == 0 {
+							redis.Put("other", incurKey, 1, 24*60*60)
+						} else {
+							redis.Incr("other", incurKey)
+						}
+						//生成随机数
+						verifyStr := strings.ToUpper(util.GetComplexRandom(6, 3, 3))
+						t.SetSession("SMVerifySucess", false)
+						t.SetSession("DataSMVerify", verifyStr)
+						t.SetSession("CreatSMVerifyTime", time.Now().Unix())
+						t.SetSession("DataSMVerifyEmail", email)
+						log.Println("====================", verifyStr, "====================", t.GetSession("CreatSMVerifyTime"), "====================")
+						//发送邮箱验证码
+						go public.SendMailIdentCode(email, verifyStr, config.GmailAuth)
+						t.T["success"] = true
+						t.T["errCode"] = 5
+						t.T["errMsg"] = "已发送邮箱验证码"
+					} else {
+						t.T["success"] = false
+						t.T["errCode"] = 3
+						t.T["time"] = timeSpaceing
+						t.T["errMsg"] = "验证码发送次数已达到今日上限"
+					}
+
+				} else {
+					t.T["success"] = false
+					t.T["errCode"] = 2
+					t.T["time"] = timeSpaceing
+					t.T["errMsg"] = "已发送,5分钟后再尝试"
+				}
+			} else {
+				t.T["success"] = false
+				t.T["errCode"] = 1
+				t.T["errMsg"] = "邮箱格式不正确"
+			}
+		} else {
+			t.T["success"] = false
+			t.T["errCode"] = 7
+			t.T["errMsg"] = "未登录"
+		}
+	} else {
+		t.T["success"] = false
+		t.T["errCode"] = 6
+		t.T["errMsg"] = "请求方式有误"
+	}
+	t.ServeJson(&t.T)
+}

+ 4 - 0
src/jfw/front/wx_dataExport.go

@@ -73,6 +73,10 @@ func (w *WxDataExport) ToSieve() error {
 
 		w.T["orderDetail"] = orderDetail
 	}
+	//是否是从结构化数据推广页过来的
+	if w.GetString("from") == "structed" {
+		w.SetSession("Structed", true)
+	}
 	//分享
 	w.T["signature"] = wx.SignJSSDK(w.Site() + w.Url())
 	myopenid, _ := w.Session().Get("s_m_openid").(string)

+ 4 - 0
src/jfw/modules/app/src/app/front/dataExport.go

@@ -81,6 +81,10 @@ func (w *WxDataExport) ToSieve() error {
 		}
 		w.T["orderDetail"] = orderDetail
 	}
+	//是否是从结构化数据推广页过来的
+	if w.GetString("from") == "structed" {
+		w.SetSession("Structed", true)
+	}
 	if myUserId == "" {
 		return errors.New("未登录")
 	}

+ 9 - 4
src/jfw/modules/app/src/app/front/login.go

@@ -720,11 +720,16 @@ func (l *Login) AfterPageLoadToCheck() {
 		updateflag = false
 		userid, _ := l.GetSession("userId").(string)
 		if userid != "" {
-			channel, _ := mongodb.FindOne("jyapp_channel", `{"s_userid":"`+userid+`"}`)
-			gray_str := redis.GetStr("session", "grayusers_"+userid)
-			if channel != nil && qutil.ObjToString((*channel)["s_channel"]) == gray_str {
-				updateflag = true
+			gray_str, err := redis.Exists("session", "grayusers_"+userid)
+			if err == nil {
+				updateflag = gray_str
 			}
+			//不再验证下载渠道(因为渠道更新不及时,导致灰色发布人数有差异)
+			// channel, _ := mongodb.FindOne("jyapp_channel", `{"s_userid":"`+userid+`"}`)
+			// gray_str := redis.GetStr("session", "grayusers_"+userid)
+			// if channel != nil && qutil.ObjToString((*channel)["s_channel"]) == gray_str {
+			// 	updateflag = true
+			// }
 		}
 	}
 	l.ServeJson(map[string]interface{}{

+ 1 - 0
src/jfw/modules/app/src/app/front/me.go

@@ -205,6 +205,7 @@ func (l *Me) CheckUpdate() error {
 		updata["userflag"] = false
 		u, s := analySign("", usertoken)
 		if s == 1 {
+			//不再验证下载渠道(因为渠道更新不及时,导致灰色发布人数有差异)
 			gray_str, err := redis.Exists("session", "grayusers_"+u.UserId)
 			if err == nil {
 				updata["userflag"] = gray_str

+ 250 - 7
src/jfw/modules/app/src/app/front/structedData.go

@@ -1,18 +1,31 @@
 package front
 
 import (
-	"github.com/go-xweb/xweb"
+	"fmt"
+	"jfw/config"
 	"jfw/public"
+	"log"
+	"qfw/util"
+	"qfw/util/redis"
+	"strings"
 	"time"
+
+	"github.com/go-xweb/xweb"
+	"gopkg.in/mgo.v2/bson"
 )
 
 type StructedData struct {
 	*xweb.Action
-	index     xweb.Mapper `xweb:"/jyapp/structed/index"`     //数据结构化首页
-	writeInfo xweb.Mapper `xweb:"/jyapp/structed/writeinfo"` //信息填写
-	saveData  xweb.Mapper `xweb:"/jyapp/structed/savedata"`
-	success   xweb.Mapper `xweb:"/jyapp/structed/success"` //信息填写成功
-	getPreview  xweb.Mapper `xweb:"/jyapp/structed/getpreview"`  //数据结构化预览
+	index      xweb.Mapper `xweb:"/jyapp/structed/index"`     //数据结构化首页
+	writeInfo  xweb.Mapper `xweb:"/jyapp/structed/writeinfo"` //信息填写
+	saveData   xweb.Mapper `xweb:"/jyapp/structed/savedata"`
+	success    xweb.Mapper `xweb:"/jyapp/structed/success"`    //信息填写成功
+	getPreview xweb.Mapper `xweb:"/jyapp/structed/getpreview"` //数据结构化预览
+	//dev2.10.10
+	freeSamples    xweb.Mapper `xweb:"/jyapp/structed/freeSamples"`    //数据结构化保存免费样例数据
+	verifyCode     xweb.Mapper `xweb:"/jyapp/structed/verifyCode"`     //数据结构化验证邮箱验证码
+	sendMailVerify xweb.Mapper `xweb:"/jyapp/structed/sendMailVerify"` //数据结构化发送邮箱验证码
+	verifyEmail    xweb.Mapper `xweb:"/jyapp/structed/verifyEmail"`    //数据结构化验证邮箱是否验证过
 
 }
 
@@ -20,6 +33,208 @@ func init() {
 	xweb.AddAction(&StructedData{})
 }
 
+//验证邮箱的正确性
+func (t *StructedData) VerifyEmail() {
+	defer util.Catch()
+	msg := "请求方式有误"
+	status := false
+	if t.Method() == "POST" {
+		userId := util.ObjToString(t.GetSession("userId"))
+		email := t.GetString("email")
+		msg = "参数有误"
+		if email != "" {
+			msg = "未登录"
+			if userId != "" {
+				emails := public.Mysql.FindOne("dataexport_order", map[string]interface{}{
+					"user_mail":    email,
+					"user_id":      userId,
+					"product_type": "历史数据",
+				}, "user_mail", "")
+				//是否是绑定邮箱或者是数据导出邮箱  已验证过的邮箱
+				if (emails != nil && util.ObjToString((*emails)["user_mail"]) != "") || (t.GetSession("s_myemail") != nil && email == t.GetSession("s_myemail").(string)) || (t.GetSession("SMVerifySucess") != nil && t.GetSession("SMVerifySucess").(bool) && email == t.GetSession("DataSMVerifyEmail")) {
+					status = true
+					msg = "此邮箱已被验证"
+					t.SetSession("SMVerifySucess", true)
+				} else {
+					msg = "未被验证"
+				}
+			}
+		}
+	}
+
+	t.ServeJson(map[string]interface{}{
+		"msg":    msg,
+		"status": status,
+	})
+}
+
+//验证 验证码的正确性
+func (t *StructedData) VerifyCode() {
+	defer util.Catch()
+	msg := "请求方式有误"
+	status := false
+	if t.Method() == "POST" {
+		userId := util.ObjToString(t.GetSession("userId"))
+		msg = "未登录"
+		if userId != "" {
+			s_email := t.GetString("s_email")       //邮箱
+			verifyCode := t.GetString("verifyCode") //验证码
+			VerifyEmail := util.ObjToString(t.GetSession("DataSMVerifyEmail"))
+			if verifyCode != "" && s_email != "" && VerifyEmail != "" {
+				if s_email == VerifyEmail {
+					msg = "验证码正确"
+					status = true
+					SMVerifySucess := t.GetSession("SMVerifySucess")
+					//需验证邮箱
+					if SMVerifySucess != nil && !SMVerifySucess.(bool) {
+						//验证码
+						verifyStr := t.GetSession("DataSMVerify")
+						//是否超时
+						lastSendDEVerify := util.Int64All(t.GetSession("CreatSMVerifyTime"))
+						timeSpaceing := lastSendDEVerify - time.Now().Unix() + 60*5
+						if lastSendDEVerify == 0 || timeSpaceing < 0 {
+							msg = "验证码超时"
+							status = false
+						} else if verifyStr != verifyCode {
+							msg = "验证码有误"
+							status = false
+						} else {
+							t.SetSession("SMVerifySucess", true)
+						}
+					}
+				} else {
+					msg = "邮箱有误"
+					status = false
+				}
+			}
+		}
+	}
+	t.ServeJson(map[string]interface{}{
+		"msg":    msg,
+		"status": status,
+	})
+}
+
+//保存免费样例数据
+func (t *StructedData) FreeSamples() error {
+	defer util.Catch()
+	msg := "请求方式有误"
+	status := false
+	if t.Method() == "POST" {
+		userId := util.ObjToString(t.GetSession("userId"))
+		if userId != "" {
+			name := t.GetString("name")                      //联系人
+			phone_num := t.GetString("phone_num")            //手机号
+			s_email := t.GetString("s_email")                //邮箱
+			SMVerifySucess := t.GetSession("SMVerifySucess") //邮箱是否验证成功
+			if name != "" && phone_num != "" && s_email != "" && SMVerifySucess != nil && SMVerifySucess.(bool) {
+				count := public.Mysql.Count("structed_data", map[string]interface{}{
+					"name":  name,
+					"phone": phone_num,
+					"email": s_email,
+					"type":  1,
+				})
+				if count >= 1 {
+					msg = "用户信息已存在"
+					status = true
+				} else {
+					stu := public.Mysql.Insert("structed_data", map[string]interface{}{
+						"name":        name,
+						"phone":       phone_num,
+						"email":       s_email,
+						"submit_time": time.Now().Unix(),
+						"status":      0,
+						"type":        1, //用户来源,0:联系客服,1:免费样例,2:自选购买
+					})
+					if stu == 0 {
+						msg = "数据库操作异常"
+						status = false
+					} else {
+						//删除验证成功记录 和 发送验证码时间 邮箱
+						t.DelSession("SMVerifySucess")
+						t.DelSession("CreatSMVerifyTime")
+						t.DelSession("DataSMVerifyEmail")
+						msg = "保存成功"
+						status = true
+						go public.SendStructedDataByEmail(s_email, config.GmailAuth)
+					}
+				}
+			} else {
+				msg = "缺少参数"
+				status = false
+			}
+		}
+	}
+	t.ServeJson(map[string]interface{}{
+		"msg":    msg,
+		"status": status,
+	})
+	return nil
+}
+
+//发送邮件
+func (t *StructedData) SendMailVerify() {
+	defer util.Catch()
+	if t.Method() == "POST" {
+		userId := util.ObjToString(t.GetSession("userId"))
+		if userId != "" {
+			email := t.GetString("email")
+			if isEmail(email) {
+				lastSendDEVerify := util.Int64All(t.GetSession("CreatSMVerifyTime"))
+				timeSpaceing := lastSendDEVerify - time.Now().Unix() + 60*5
+				incurKey := fmt.Sprintf("SendSMEmail_%s_%d", t.GetSession("userId"), time.Now().Day())
+				if lastSendDEVerify == 0 || timeSpaceing < 0 {
+					//每日限制10次
+					times := util.IntAll(redis.Get("other", incurKey))
+					if times < 10 {
+						if times == 0 {
+							redis.Put("other", incurKey, 1, 24*60*60)
+						} else {
+							redis.Incr("other", incurKey)
+						}
+						//生成随机数
+						verifyStr := strings.ToUpper(util.GetComplexRandom(6, 3, 3))
+						t.SetSession("SMVerifySucess", false)
+						t.SetSession("DataSMVerify", verifyStr)
+						t.SetSession("CreatSMVerifyTime", time.Now().Unix())
+						t.SetSession("DataSMVerifyEmail", email)
+						log.Println("====================", verifyStr, "====================", t.GetSession("CreatSMVerifyTime"), "====================")
+						//发送邮箱验证码
+						go public.SendMailIdentCode(email, verifyStr, config.GmailAuth)
+						t.T["success"] = true
+						t.T["errCode"] = 5
+						t.T["errMsg"] = "已发送邮箱验证码"
+					} else {
+						t.T["success"] = false
+						t.T["errCode"] = 3
+						t.T["time"] = timeSpaceing
+						t.T["errMsg"] = "验证码发送次数已达到今日上限"
+					}
+
+				} else {
+					t.T["success"] = false
+					t.T["errCode"] = 2
+					t.T["time"] = timeSpaceing
+					t.T["errMsg"] = "已发送,5分钟后再尝试"
+				}
+			} else {
+				t.T["success"] = false
+				t.T["errCode"] = 1
+				t.T["errMsg"] = "邮箱格式不正确"
+			}
+		} else {
+			t.T["success"] = false
+			t.T["errCode"] = 7
+			t.T["errMsg"] = "未登录"
+		}
+	} else {
+		t.T["success"] = false
+		t.T["errCode"] = 6
+		t.T["errMsg"] = "请求方式有误"
+	}
+	t.ServeJson(&t.T)
+}
+
 func (t *StructedData) Index() error {
 	t.T["source"] = "app_sy_dh_5"
 	return t.Render("/structeddata/marketing.html", &t.T)
@@ -27,10 +242,36 @@ func (t *StructedData) Index() error {
 
 //信息填写
 func (t *StructedData) WriteInfo() error {
-	return t.Render("/structeddata/write_infor.html")
+	userId := util.ObjToString(t.GetSession("userId"))
+	if userId != "" {
+		//删除验证成功记录 和 发送验证码时间 邮箱
+		t.DelSession("SMVerifySucess")
+		t.DelSession("CreatSMVerifyTime")
+		t.DelSession("DataSMVerifyEmail")
+		nums, ok := public.MQFW.FindOne("user", bson.M{"_id": bson.ObjectIdHex(userId)})
+		if !ok {
+			return t.Redirect("/jyapp/free/swordfish/about", 302)
+		}
+		if _, ok := (*nums)["s_phone"]; ok {
+			t.T["phone_num"] = (*nums)["s_phone"].(string)
+		}
+		if _, ok := (*nums)["s_myemail"]; ok {
+			t.T["s_myemail"] = (*nums)["s_myemail"].(string)
+			//验证是否是绑定的邮箱
+			t.SetSession("DataSMVerifyEmail", (*nums)["s_myemail"].(string))
+			t.SetSession("SMVerifySucess", true)
+		}
+		return t.Render("/structeddata/write_infor.html", &t.T)
+	} else {
+		return t.Redirect("/jyapp/free/swordfish/about", 302)
+	}
 }
 
 func (t *StructedData) Success() error {
+	//删除验证成功记录 和 发送验证码时间 邮箱
+	t.DelSession("SMVerifySucess")
+	t.DelSession("CreatSMVerifyTime")
+	t.DelSession("DataSMVerifyEmail")
 	return t.Render("/structeddata/write_result.html")
 }
 
@@ -46,6 +287,7 @@ func (t *StructedData) SaveData() {
 		count := public.Mysql.Count("structed_data", map[string]interface{}{
 			"name":  name,
 			"phone": phone_num,
+			"type":  0,
 		})
 		if count >= 1 {
 			t.ServeJson(map[string]interface{}{
@@ -61,6 +303,7 @@ func (t *StructedData) SaveData() {
 				"phone":       phone_num,
 				"submit_time": time.Now().Unix(),
 				"status":      0,
+				"type":        0, //用户来源,0:联系客服,1:免费样例,2:自选购买
 			})
 			if stu == 0 {
 				t.ServeJson(map[string]interface{}{

+ 2 - 1
src/jfw/modules/app/src/seo.json

@@ -96,5 +96,6 @@
 			    }
 			]
 		}
-	}
+	},
+	"structedUploadA":"/structuredata/file/【剑鱼标讯】结构化招标数据.xlsx"
 }

+ 6 - 0
src/jfw/modules/app/src/web/staticres/jyapp/js/common.js

@@ -303,6 +303,12 @@ var JyObjMessage = new Object();
 $(function(){
 	if (mySysIsIos()){
 		window.JyObj = {
+			//拨打电话
+			callPhone:function(phone){
+			    JyObjMessage["phone"]=phone;
+			    window.webkit.messageHandlers.callPhone.postMessage(JyObjMessage);
+				JyObj.clearMessage();
+			},
 			//抖音or快手其他应用appName:应用名称;appLink:应用链接
 			openOtherAppLinks:function(appName,appLink){
 				JyObjMessage["appName"]=appName;

+ 2 - 1
src/jfw/modules/app/src/web/staticres/jyapp/structuredata/css/base.css

@@ -123,7 +123,8 @@ em,i{
   .jy-app-header .fanhui {
     width: 0.48rem;
     height: 0.48rem;
-    font-size: 0.36rem;
+/*    font-size: 0.36rem;*/
+font-size:19.5px;
   }
   
   .jy-app-header .subreport_title {

+ 49 - 46
src/jfw/modules/app/src/web/staticres/jyapp/structuredata/css/marketing.css

@@ -5,7 +5,7 @@ html {
 }
 
 body {
-  background: #2F96F4;
+  background: #2f96f4;
 }
 
 #app {
@@ -14,24 +14,7 @@ body {
   display: flex;
   flex-direction: column;
   position: relative;
-}
-
-.jy-app-header.header-transparent {
-  position: absolute;
-  width: 100%;
-  background: transparent;
-  z-index: 999;
-}
-
-.jy-app-header.header-transparent .subreport_title {
-  font-size: 0;
-}
-
-.jy-app-header.header-transparent .fanhui {
-  width: 0.96rem;
-  height: 0.96rem;
-  font-size: 0.36rem;
-  color: #fff;
+  background: #fff;
 }
 
 #app .j-main {
@@ -39,6 +22,8 @@ body {
   height: 100%;
   flex: 1;
   overflow: auto;
+  margin-top: -80px;
+  background: #2f96f4;
 }
 
 #app .j-main .structured_top {
@@ -137,7 +122,7 @@ body {
   width: 100%;
   height: 0.36rem;
   font-size: 0.24rem;
-  color: #C0C4CC;
+  color: #c0c4cc;
   line-height: 0.36rem;
 }
 
@@ -173,7 +158,7 @@ body {
   background: rgba(47, 150, 244, 0.04);
   font-size: 0.3rem;
   font-weight: bold;
-  color: #2F96F4;
+  color: #2f96f4;
 }
 
 #app .j-main .str_what .str_content .data_mode .data_mode_content {
@@ -223,7 +208,7 @@ body {
   border-radius: 8px 24px 0px 0px;
   background: rgba(47, 150, 244, 0.04);
   font-size: 0.3rem;
-  color: #2F96F4;
+  color: #2f96f4;
   font-weight: bold;
 }
 
@@ -241,7 +226,7 @@ body {
   height: 2.88rem;
   font-size: 0.24rem;
   line-height: .36rem;
-  color: #5F5E64;
+  color: #5f5e64;
 }
 
 #app .j-main .str_what .str_content .message .message_page .click_view {
@@ -251,11 +236,11 @@ body {
   width: 2.6rem;
   height: 0.6rem;
   border-radius: .32rem;
-  border: 1px solid #2F96F4;
+  border: 1px solid #2f96f4;
   box-sizing: border-box;
   margin-top: 0.4rem;
   font-size: 0.26rem;
-  color: #2F96F4;
+  color: #2f96f4;
 }
 
 #app .j-main .advantage {
@@ -458,7 +443,7 @@ body {
   height: auto;
   padding-left: .72rem;
   font-size: .24rem;
-  color: #5F5E64;
+  color: #5f5e64;
 }
 
 #app .j-main .company {
@@ -517,35 +502,23 @@ body {
 
 #app .j-button-group {
   display: flex;
-  flex-direction: column;
-  justify-content: space-between;
   align-items: center;
+  justify-content: space-between;
   width: 100%;
-  height: 1.96rem;
+  height: 1.34rem;
   padding: 0.16rem 0.32rem 0.16rem;
   background-color: #fff;
 }
 
-#app .j-button-group .j-button-confirm,
 #app .j-button-group .j-button-cancel {
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  width: 100%;
-  font-size: 0.32rem;
-  text-align: center;
-  border-radius: 0.16rem;
-}
-
-#app .j-button-group .j-button-cancel {
-  height: .64rem;
-  background: #fff;
-  color: #5F5E64;
+  height: .8rem;
+  background: #EDEFF2;
+  color: #171826;
 }
 
 #app .j-button-group .j-button-cancel .phone_num {
   font-size: .28rem;
-  color: #5F5E64;
+  color: #5f5e64;
 }
 
 #app .j-button-group .j-button-cancel .phone_icon {
@@ -558,9 +531,39 @@ body {
 }
 
 #app .j-button-group .j-button-confirm {
-  height: .92rem;
-  background: #2ABED1;
+  height: .8rem;
+  background: #2abed1;
+  color: #fff;
+}
+
+.jy-app-header.header-transparent {
+  position: absolute;
+  width: 100%;
+  background: transparent;
+  z-index: 999;
+}
+
+.jy-app-header.header-transparent .subreport_title {
+  font-size: 0;
+}
+
+.jy-app-header.header-transparent .fanhui {
+  width: 0.96rem;
+  height: 0.96rem;
+/*  font-size: 0.36rem;*/
   color: #fff;
+font-size:19.5px;
+}
+
+#app .j-button-group .j-button-confirm,
+#app .j-button-group .j-button-cancel {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 48%;
+  font-size: 0.32rem;
+  text-align: center;
+  border-radius: 0.16rem;
 }
 
 @keyframes ballRotate {

+ 133 - 60
src/jfw/modules/app/src/web/staticres/jyapp/structuredata/css/write_infor.css

@@ -3,55 +3,79 @@ body, html {
   height: 100%;
 }
 
-input::-webkit-input-placeholder, textarea::-webkit-input-placeholder {
+input::-webkit-input-placeholder{
   color: #C0C4CC;
   font-size: .32rem;
-  line-height: .48rem;
+}
+
+.weui-toast {
+  min-height: 2.6em;
+  line-height: 2.6em;
+  top: 6rem;
+}
+
+.weui-toast .weui-toast__content {
+  margin: 0;
+}
+
+.weui-icon_toast {
+  display: none;
+}
+
+.toast-lang .weui-toast {
+  width: auto;
+  padding: 0 .5rem;
+  left: 38%;
 }
 
 #writeInfo {
   width: 100%;
   height: 100%;
-  display: flex;
-  flex-direction: column;
 }
 
-.j-header.jy-app-header {
-  height: 21.33333vw;
-  padding: 10.66667vw 3.2vw 0 3.2vw;
-  -webkit-box-sizing: border-box;
-  box-sizing: border-box;
+#writeInfo .weui-navbar {
+  height: .96rem;
+}
+
+#writeInfo .weui-navbar .weui-navbar__item {
+  font-size: .28rem;
+  color: #5F5E64;
+  padding: .24rem 0;
+}
+
+#writeInfo .weui-navbar .weui-navbar__item.weui-bar__item_on {
+  color: #2ABED1;
+}
+
+#writeInfo .weui-navbar .weui-navbar__item.weui-bar__item_on, #writeInfo .weui-navbar .weui-navbar__item:active {
   background: #fff;
-  font-family: Avenir,Helvetica,Arial,sans-serif;
 }
 
-.j-header {
-  position: relative;
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -ms-flexbox;
+#writeInfo .weui-navbar .weui-navbar__item.weui-bar__item_on .showline, #writeInfo .weui-navbar .weui-navbar__item:active .showline {
+  margin-top: .16rem;
+  width: 100%;
+  height: .03rem;
   display: flex;
-  -webkit-box-align: center;
-  -webkit-align-items: center;
-  -ms-flex-align: center;
-  align-items: center;
-  -webkit-box-pack: justify;
-  -webkit-justify-content: space-between;
-  -ms-flex-pack: justify;
-  justify-content: space-between;
-  font-size: 4.53333vw;
-  min-height: 5.33333vw;
-  background-color: #fff;
-  z-index: 2;
+  justify-content: center;
+}
+
+#writeInfo .weui-navbar .weui-navbar__item.weui-bar__item_on .showline span, #writeInfo .weui-navbar .weui-navbar__item:active .showline span {
+  width: .48rem;
+  height: .03rem;
+  background: linear-gradient(270.45deg, #25BEEE 0.03%, #2ABED1 74.46%);
+  border-radius: 1px;
 }
 
-#writeInfo .infoMain {
+#writeInfo .weui-navbar .weui-navbar__item:after {
+  border-right: 0;
+}
+
+#writeInfo .infoMain, #writeInfo .purchase {
   width: 100%;
   height: 100%;
-  flex: 1;
 }
 
-#writeInfo .infoMain .info_tip {
+#writeInfo .infoMain .info_tip, #writeInfo .purchase .info_tip {
   overflow: hidden;
   width: 100%;
   height: 3.6rem;
@@ -59,44 +83,44 @@ input::-webkit-input-placeholder, textarea::-webkit-input-placeholder {
   background-size: 100% 100%;
 }
 
-#writeInfo .infoMain .info_tip .tip_text {
-  margin-top: 1.04rem;
+#writeInfo .infoMain .info_tip .tip_text, #writeInfo .purchase .info_tip .tip_text {
+  margin-top: .64rem;
   padding: 0 .32rem;
   width: 100%;
   height: .48rem;
-  font-size: .32rem;
+  font-size: .28rem;
   color: #fff;
 }
 
-#writeInfo .infoMain .write_input {
+#writeInfo .infoMain .write_input, #writeInfo .purchase .write_input {
   width: 100%;
   padding: 0 .24rem;
   margin-top: -1.04rem;
 }
 
-#writeInfo .infoMain .write_input .write_con {
+#writeInfo .infoMain .write_input .write_con, #writeInfo .purchase .write_input .write_con {
   width: 100%;
   background: #fff;
   border-radius: 8px;
   margin-top: .08rem;
   overflow: hidden;
+  padding: 0 0 0 .32rem;
 }
 
-#writeInfo .infoMain .write_input .write_con .write_name {
+#writeInfo .infoMain .write_input .write_con .write_name, #writeInfo .purchase .write_input .write_con .write_name {
   width: 100%;
-  padding: 0 .32rem;
   margin-top: .08rem;
 }
 
-#writeInfo .infoMain .write_input .write_con .write_name .write_name_ipt {
+#writeInfo .infoMain .write_input .write_con .write_name .write_name_ipt, #writeInfo .purchase .write_input .write_con .write_name .write_name_ipt {
   width: 100%;
   height: 1.08rem;
   display: flex;
   align-items: center;
-  box-shadow: inset 0px -0.5px 0px rgba(0, 0, 0, 0.05), inset 16px 0px 0px #FFFFFF;
+  line-height: 1.08rem;
 }
 
-#writeInfo .infoMain .write_input .write_con .write_name .write_name_ipt .label_name {
+#writeInfo .infoMain .write_input .write_con .write_name .write_name_ipt .label_name, #writeInfo .purchase .write_input .write_con .write_name .write_name_ipt .label_name {
   display: flex;
   align-items: center;
   width: 1.6rem;
@@ -106,32 +130,29 @@ input::-webkit-input-placeholder, textarea::-webkit-input-placeholder {
   color: #5F5E64;
 }
 
-#writeInfo .infoMain .write_input .write_con .write_name .write_name_ipt .ipt_name {
+#writeInfo .infoMain .write_input .write_con .write_name .write_name_ipt .ipt_name, #writeInfo .purchase .write_input .write_con .write_name .write_name_ipt .ipt_name {
   height: .48rem;
   display: flex;
   align-items: center;
-  padding-top: .08rem;
   font-size: .32rem;
-  color: #171826;
 }
 
-#writeInfo .infoMain .write_input .write_con .write_phone {
+#writeInfo .infoMain .write_input .write_con .write_phone, #writeInfo .infoMain .write_input .write_con .write_name, #writeInfo .infoMain .write_input .write_con .write_email, #writeInfo .infoMain .write_input .write_con .email_code, #writeInfo .purchase .write_input .write_con .write_phone, #writeInfo .purchase .write_input .write_con .write_email, #writeInfo .purchase .write_input .write_con .email_code {
   width: 100%;
   display: flex;
   flex-direction: column;
+  box-shadow: inset 0px -0.5px 0px rgba(0, 0, 0, 0.05), inset 16px 0px 0px #FFFFFF;
 }
 
-#writeInfo .infoMain .write_input .write_con .write_phone .write_phone_ipt {
+#writeInfo .infoMain .write_input .write_con .write_phone .write_phone_ipt, #writeInfo .infoMain .write_input .write_con .write_name .write_phone_ipt, #writeInfo .infoMain .write_input .write_con .write_email .write_phone_ipt, #writeInfo .infoMain .write_input .write_con .email_code .write_phone_ipt, #writeInfo .purchase .write_input .write_con .write_phone .write_phone_ipt, #writeInfo .purchase .write_input .write_con .write_email .write_phone_ipt, #writeInfo .purchase .write_input .write_con .email_code .write_phone_ipt {
   width: 100%;
   height: 1.08rem;
   display: flex;
   align-items: center;
-  padding: 0 .32rem;
-  font-size: .32rem;
-  color: #171826;
 }
 
-#writeInfo .infoMain .write_input .write_con .write_phone .write_phone_ipt .label_phone {
+#writeInfo .infoMain .write_input .write_con .write_phone .write_phone_ipt .label_phone, 
+#writeInfo .infoMain .write_input .write_con .write_name .write_phone_ipt .label_phone, #writeInfo .infoMain .write_input .write_con .write_email .write_phone_ipt .label_phone, #writeInfo .infoMain .write_input .write_con .email_code .write_phone_ipt .label_phone, #writeInfo .purchase .write_input .write_con .write_phone .write_phone_ipt .label_phone, #writeInfo .purchase .write_input .write_con .write_email .write_phone_ipt .label_phone, #writeInfo .purchase .write_input .write_con .email_code .write_phone_ipt .label_phone {
   display: flex;
   align-items: center;
   width: 1.6rem;
@@ -141,43 +162,91 @@ input::-webkit-input-placeholder, textarea::-webkit-input-placeholder {
   color: #5F5E64;
 }
 
-#writeInfo .infoMain .write_input .write_con .write_phone .write_phone_ipt .ipt_phone {
+#writeInfo .infoMain .write_input .write_con .write_phone .write_phone_ipt .ipt_phone,
+#writeInfo .infoMain .write_input .write_con .write_name .write_phone_ipt .ipt_name,  #writeInfo .infoMain .write_input .write_con .write_phone .write_phone_ipt .ipt_email, #writeInfo .infoMain .write_input .write_con .write_phone .write_phone_ipt .ipt_code, #writeInfo .infoMain .write_input .write_con .write_email .write_phone_ipt .ipt_phone, #writeInfo .infoMain .write_input .write_con .write_email .write_phone_ipt .ipt_email, #writeInfo .infoMain .write_input .write_con .write_email .write_phone_ipt .ipt_code, #writeInfo .infoMain .write_input .write_con .email_code .write_phone_ipt .ipt_phone, #writeInfo .infoMain .write_input .write_con .email_code .write_phone_ipt .ipt_email, #writeInfo .infoMain .write_input .write_con .email_code .write_phone_ipt .ipt_code, #writeInfo .purchase .write_input .write_con .write_phone .write_phone_ipt .ipt_phone, #writeInfo .purchase .write_input .write_con .write_phone .write_phone_ipt .ipt_email, #writeInfo .purchase .write_input .write_con .write_phone .write_phone_ipt .ipt_code, #writeInfo .purchase .write_input .write_con .write_email .write_phone_ipt .ipt_phone, #writeInfo .purchase .write_input .write_con .write_email .write_phone_ipt .ipt_email, #writeInfo .purchase .write_input .write_con .write_email .write_phone_ipt .ipt_code, #writeInfo .purchase .write_input .write_con .email_code .write_phone_ipt .ipt_phone, #writeInfo .purchase .write_input .write_con .email_code .write_phone_ipt .ipt_email, #writeInfo .purchase .write_input .write_con .email_code .write_phone_ipt .ipt_code {
   height: .48rem;
   display: flex;
   align-items: center;
-  padding-top: .08rem;
   font-size: .32rem;
-  color: #171826;
+  line-height: .48rem;
+}
+
+#writeInfo .infoMain .write_input .write_con .write_email .write_phone_ipt .ipt_email{
+  width: 4.2rem;
+}
+
+#writeInfo .infoMain .write_input .write_con .write_email .write_phone_ipt .correct-icon{
+  background: url('../image/correct-icon-mobile.png') no-repeat;
+  background-size: .48rem .48rem;
+  width: .48rem;
+  height: .48rem;
+  display: none;
+}
+
+#writeInfo .infoMain .write_input .write_con .write_phone .write_phone_ipt .ipt_code, #writeInfo .infoMain .write_input .write_con .write_email .write_phone_ipt .ipt_code, #writeInfo .infoMain .write_input .write_con .email_code .write_phone_ipt .ipt_code, #writeInfo .purchase .write_input .write_con .write_phone .write_phone_ipt .ipt_code, #writeInfo .purchase .write_input .write_con .write_email .write_phone_ipt .ipt_code, #writeInfo .purchase .write_input .write_con .email_code .write_phone_ipt .ipt_code {
+  width: 3.5rem;
+}
+
+#writeInfo .infoMain .write_input .write_con .write_phone .write_phone_ipt .ipt_email:disabled, #writeInfo .infoMain .write_input .write_con .write_email .write_phone_ipt .ipt_email:disabled, #writeInfo .infoMain .write_input .write_con .email_code .write_phone_ipt .ipt_email:disabled, #writeInfo .purchase .write_input .write_con .write_phone .write_phone_ipt .ipt_email:disabled, #writeInfo .purchase .write_input .write_con .write_email .write_phone_ipt .ipt_email:disabled, #writeInfo .purchase .write_input .write_con .email_code .write_phone_ipt .ipt_email:disabled {
+  background: #fff;
 }
 
-#writeInfo .infoMain .write_input .write_con .write_phone .phone_tips {
-  margin-bottom: .26rem;
+#writeInfo .infoMain .write_input .write_con .write_phone .phone_tips, #writeInfo .infoMain .write_input .write_con .write_phone .kf_phone_tips, #writeInfo .infoMain .write_input .write_con .write_name .name_tips, #writeInfo .infoMain .write_input .write_con .write_name .kf_name_tips, #writeInfo .infoMain .write_input .write_con .write_phone .email_tips, #writeInfo .infoMain .write_input .write_con .write_email .phone_tips, #writeInfo .infoMain .write_input .write_con .write_email .email_tips, #writeInfo .infoMain .write_input .write_con .email_code .phone_tips, #writeInfo .infoMain .write_input .write_con .email_code .email_tips, #writeInfo .purchase .write_input .write_con .write_phone .phone_tips, #writeInfo .purchase .write_input .write_con .write_phone .email_tips, #writeInfo .purchase .write_input .write_con .write_email .phone_tips, #writeInfo .purchase .write_input .write_con .write_email .email_tips, #writeInfo .purchase .write_input .write_con .email_code .phone_tips, #writeInfo .purchase .write_input .write_con .email_code .email_tips {
+  margin-bottom: .24rem;
   display: flex;
   width: 100%;
   height: .36rem;
-  padding: 0 .32rem;
 }
 
-#writeInfo .infoMain .write_input .write_con .write_phone .phone_tips .label_tips {
+#writeInfo .infoMain .write_input .write_con .write_phone .phone_tips .label_tips,
+#writeInfo .infoMain .write_input .write_con .write_phone .kf_phone_tips .label_tips,
+#writeInfo .infoMain .write_input .write_con .write_name .name_tips .label_tips,
+#writeInfo .infoMain .write_input .write_con .write_name .kf_name_tips .label_tips, #writeInfo .infoMain .write_input .write_con .write_phone .email_tips .label_tips, #writeInfo .infoMain .write_input .write_con .write_email .phone_tips .label_tips, #writeInfo .infoMain .write_input .write_con .write_email .email_tips .label_tips, #writeInfo .infoMain .write_input .write_con .email_code .phone_tips .label_tips, #writeInfo .infoMain .write_input .write_con .email_code .email_tips .label_tips, #writeInfo .purchase .write_input .write_con .write_phone .phone_tips .label_tips, #writeInfo .purchase .write_input .write_con .write_phone .email_tips .label_tips, #writeInfo .purchase .write_input .write_con .write_email .phone_tips .label_tips, #writeInfo .purchase .write_input .write_con .write_email .email_tips .label_tips, #writeInfo .purchase .write_input .write_con .email_code .phone_tips .label_tips, #writeInfo .purchase .write_input .write_con .email_code .email_tips .label_tips {
   display: flex;
   width: 1.6rem;
   height: .48rem;
 }
 
-#writeInfo .infoMain .write_input .write_con .write_phone .phone_tips .phone_rule {
+#writeInfo .infoMain .write_input .write_con .write_phone .phone_tips .phone_rule, 
+#writeInfo .infoMain .write_input .write_con .write_phone .kf_phone_tips .phone_rule, 
+#writeInfo .infoMain .write_input .write_con .write_name .name_tips .phone_rule, 
+#writeInfo .infoMain .write_input .write_con .write_name .kf_name_tips .phone_rule, #writeInfo .infoMain .write_input .write_con .write_phone .email_tips .phone_rule, #writeInfo .infoMain .write_input .write_con .write_email .phone_tips .phone_rule, #writeInfo .infoMain .write_input .write_con .write_email .email_tips .phone_rule, #writeInfo .infoMain .write_input .write_con .email_code .phone_tips .phone_rule, #writeInfo .infoMain .write_input .write_con .email_code .email_tips .phone_rule, #writeInfo .purchase .write_input .write_con .write_phone .phone_tips .phone_rule, #writeInfo .purchase .write_input .write_con .write_phone .email_tips .phone_rule, #writeInfo .purchase .write_input .write_con .write_email .phone_tips .phone_rule, #writeInfo .purchase .write_input .write_con .write_email .email_tips .phone_rule, #writeInfo .purchase .write_input .write_con .email_code .phone_tips .phone_rule, #writeInfo .purchase .write_input .write_con .email_code .email_tips .phone_rule {
   height: 100%;
   font-size: .24rem;
   color: #FB483D;
 }
 
-#writeInfo .infoMain .run_button {
+#writeInfo .infoMain .write_input .write_con .email_code .write_phone_ipt .label_phone, 
+#writeInfo .purchase .write_input .write_con .email_code .write_phone_ipt .label_phone {
+  font-size: .28rem;
+}
+
+#writeInfo .infoMain .write_input .write_con .email_code .write_phone_ipt .sendEmail, #writeInfo .purchase .write_input .write_con .email_code .write_phone_ipt .sendEmail {
+  font-size: .28rem;
+  color: #9B9CA3;
+}
+
+#writeInfo .infoMain .write_input .write_con .email_code .write_phone_ipt .timedown, #writeInfo .purchase .write_input .write_con .email_code .write_phone_ipt .timedown {
+  display: none;
+  font-size: .28rem;
+  text-align: center;
+  color: #C0C4CC;
+}
+
+#writeInfo .infoMain .option_purchase, #writeInfo .purchase .option_purchase {
+  padding: .64rem .64rem .36rem;
+  font-size: .28rem;
+  color: #171826;
+}
+
+#writeInfo .infoMain .run_button, #writeInfo .infoMain .free_button, #writeInfo .infoMain .run_now_button, #writeInfo .purchase .run_button, #writeInfo .purchase .free_button, #writeInfo .purchase .run_now_button {
   margin-top: .6rem;
   width: 100%;
   height: .92rem;
   padding: 0 .32rem;
 }
 
-#writeInfo .infoMain .run_button .write_run {
+#writeInfo .infoMain .run_button .write_run, #writeInfo .infoMain .run_button .write_free, #writeInfo .infoMain .run_button .write_run_now, #writeInfo .infoMain .free_button .write_run, #writeInfo .infoMain .free_button .write_free, #writeInfo .infoMain .free_button .write_run_now, #writeInfo .infoMain .run_now_button .write_run, #writeInfo .infoMain .run_now_button .write_free, #writeInfo .infoMain .run_now_button .write_run_now, #writeInfo .purchase .run_button .write_run, #writeInfo .purchase .run_button .write_free, #writeInfo .purchase .run_button .write_run_now, #writeInfo .purchase .free_button .write_run, #writeInfo .purchase .free_button .write_free, #writeInfo .purchase .free_button .write_run_now, #writeInfo .purchase .run_now_button .write_run, #writeInfo .purchase .run_now_button .write_free, #writeInfo .purchase .run_now_button .write_run_now {
   display: flex;
   align-items: center;
   justify-content: center;
@@ -189,8 +258,12 @@ input::-webkit-input-placeholder, textarea::-webkit-input-placeholder {
   font-size: .36rem;
 }
 
-#writeInfo .infoMain .run_button .write_run:disabled {
+#writeInfo .infoMain .run_button .write_run:disabled, #writeInfo .infoMain .run_button .write_free:disabled, #writeInfo .infoMain .free_button .write_run:disabled, #writeInfo .infoMain .free_button .write_free:disabled, #writeInfo .infoMain .run_now_button .write_run:disabled, #writeInfo .infoMain .run_now_button .write_free:disabled, #writeInfo .purchase .run_button .write_run:disabled, #writeInfo .purchase .run_button .write_free:disabled, #writeInfo .purchase .free_button .write_run:disabled, #writeInfo .purchase .free_button .write_free:disabled, #writeInfo .purchase .run_now_button .write_run:disabled, #writeInfo .purchase .run_now_button .write_free:disabled {
   background: #87DFEA;
   color: #FFFFFF;
   opacity: 0.65;
 }
+
+#writeInfo .purchase {
+  background: #fff;
+}

BIN
src/jfw/modules/app/src/web/staticres/jyapp/structuredata/image/correct-icon-mobile.png


+ 33 - 8
src/jfw/modules/app/src/web/templates/structeddata/marketing.html

@@ -11,20 +11,37 @@
 	<meta http-equiv="X-UA-Compatible" content="ie=edge">
 	<meta http-equiv="X-UA-Compatible" content="ie=edge">
 	<title>结构化招标数据</title>
-	<script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/js/rem.js?v={{Msg "seo" "version"}}"></script>
+	<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/layout.css" />
+  <link href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/font.css?v={{Msg "seo" "version"}}" rel="stylesheet">
 	<link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/css/base.css?v={{Msg "seo" "version"}}">
 	<link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/css/weui.min.css?v={{Msg "seo" "version"}}">
 	<link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/iconfont/iconfont.css?v={{Msg "seo" "version"}}">
-	<link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/css/marketing.css?v={{Msg "seo" "version"}}">
+	<link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/css/marketing.css?v={{Msg "seo" "version"}}1">
+  <style>
+    .app-layout-header{
+      border-bottom: 0px!important;
+    }
+    .header-transparent>.app-back{
+      color:#fff !important;
+    }
+    .jy-app-header .subreport_title{
+      font-size:17px;
+    }
+  </style>
 </head>
 
 <body>
+<div class="app-layout-header jy-app-header header-transparent">
+	<span class="app-back jyapp-icon jyapp-icon-zuojiantou"></span>
+  <span class="subreport_title">结构化招标数据</span>
+</div>
+<div class="app-layout-content-b">
 	<div id="app">
 		<!-- 头部 -->
-		<header class="jy-app-header header-transparent">
+<!--		<header class="jy-app-header header-transparent">
 			<div class="iconfont icon-fanhui fanhui"></div>
 			<div class="subreport_title">结构化招标数据</div>
-		</header>
+		</header>-->
 		<div class="j-main">
 			<div class="structured_top">
 				<div class="str_title">
@@ -187,17 +204,19 @@
 			</div>
 		</div>
 		<div class="j-button-group">
-			<a href="javascript:;" class="j-button-cancel" id="j_cancel">
-				<!-- <span class="phone_icon"></span> -->
-				<span class="phone_num">咨询热线:400-108-6670</span>
+			<a onclick="tel('400-108-6670')" class="j-button-cancel" id="j_cancel">
+				<span class="phone_icon"></span>
+				<span>立即咨询</span>
 			</a>
-			<button class="j-button-confirm" id="j_confirm" onclick="learn_more()">了解详情</button>
+			<button class="j-button-confirm" id="j_confirm" onclick="learn_more()">深入了解</button>
 		</div>
 	</div>
+</div>
 </body>
 <script src="/jyapp/structuredata/js/jquery.min.js"></script>
 <script src="/jyapp/structuredata/js/weui.min.js"></script>
 <script src="/jyapp/structuredata/js/imageViewer.min.js"></script>
+{{include "/common/js.html"}}
 <script>
 	// 监听页面滚动
 	var addEvent = (function(){
@@ -275,5 +294,11 @@
 			});
 		});
 	}
+  //拨打电话
+  function tel(phone){
+    JyObj.callPhone(phone);
+  }
 </script>
+<!--百度统计end-->
+{{include "/common/baiducc.html"}}
 </html>

+ 506 - 111
src/jfw/modules/app/src/web/templates/structeddata/write_infor.html

@@ -9,147 +9,542 @@
         <meta http-equiv="X-UA-Compatible" content="ie=edge">
         <meta http-equiv="X-UA-Compatible" content="ie=edge">
         <title>结构化招标数据</title>
+        <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/layout.css" />
+        <link href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/font.css?v={{Msg "seo" "version"}}" rel="stylesheet">
         <script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/js/rem.js?v={{Msg "seo" "version"}}"></script>
         <link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/css/base.css?v={{Msg "seo" "version"}}">
+        <link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/css/weui.min.css?v={{Msg "seo" "version"}}">
         <link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/iconfont/iconfont.css?v={{Msg "seo" "version"}}">
-        <link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/css/write_infor.css?v={{Msg "seo" "version"}}">
+        <link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/css/write_infor.css?v={{Msg "seo" "version"}}5">
+        <style>
+          .jy-app-header .subreport_title{
+            font-size:17px;
+          }
+        </style>
     </head>
 <body>
+<div class="app-layout-header jy-app-header">
+	<span class="app-back jyapp-icon jyapp-icon-zuojiantou"></span>
+  <span class="subreport_title">深入了解</span>
+</div>
+<div class="app-layout-content-b">
     <div id="writeInfo">
-        <div class="j-header jy-app-header">
-            <i class="header-left iconfont icon-fanhui" style="font-size: 0.36rem" onclick="fanhui()"></i>
+<!--        <div class="j-header jy-app-header">
+            <i class="header-left iconfont icon-fanhui" style="font-size:19.5px;" onclick="fanhui()"></i>
             <span class="header-title">结构化招标数据</span>
             <span class="header-right"></span>
-        </div>
-        <div class="infoMain">
-            <div class="info_tip">
-                <p class="tip_text">
-                    请完善信息,我们会尽快和您联系。
-                </p>
+        </div>-->
+        <div class="weui-tab" id="tab">
+            <div class="weui-navbar">
+                <div class="weui-navbar__item">免费样例
+                    <div class="showline">
+                        <span></span>
+                    </div>
+                </div>
+                <div class="weui-navbar__item">联系客服
+                    <div class="showline">
+                        <span></span>
+                    </div>
+                </div>
+                <div class="weui-navbar__item">自选购买
+                    <div class="showline">
+                        <span></span>
+                    </div>
+                </div>
             </div>
-            <div class="write_input">
-                <div class="write_con">
-                    <div class="write_name">
-                        <div class="write_name_ipt">
-                            <span class="label_name">姓名</span>
-                            <input class="ipt_name" type="text" placeholder="输入姓名">
-                        </div>
+            <div class="weui-tab__panel">
+                <div class="weui-tab__content infoMain mf">
+                    <div class="info_tip">
+                        <p class="tip_text">
+                            请正确填写以下信息,我们将以邮件的形式免费发送一份结构化招标数据至您填写的邮箱内,请注意查收。
+                        </p>
                     </div>
-                    <div class="write_phone">
-                        <div class="write_phone_ipt">
-                            <span class="label_phone">手机号</span>
-                            <input class="ipt_phone" type="text" placeholder="输入手机号" value="{{.T.phone_num}}">
+                    <div class="write_input">
+                        <div class="write_con">
+                            <div class="write_name">
+                                <div class="write_name_ipt">
+                                    <span class="label_name">联系人</span>
+                                    <input class="ipt_name" type="text" placeholder="输入联系人姓名">
+                                </div>
+                                <div class="name_tips" style="display: none;">
+                                    <span class="label_tips"></span>
+                                    <p class="phone_rule">
+                                        请输入正确联系人
+                                    </p>
+                                </div>
+                            </div>
+                            <div class="write_phone">
+                                <div class="write_phone_ipt">
+                                    <span class="label_phone">手机号</span>
+                                    <input class="ipt_phone" type="text" maxlength="11" placeholder="输入手机号" value="{{.T.phone_num}}">
+                                </div>
+                                <div class="phone_tips" style="display: none;">
+                                    <span class="label_tips"></span>
+                                    <p class="phone_rule">
+                                        手机号格式错误
+                                    </p>
+                                </div>
+                            </div>
+                            <div class="write_email">
+                                <div class="write_phone_ipt">
+                                    <span class="label_phone">邮箱地址</span>
+                                    <input class="ipt_email" type="text" placeholder="输入邮箱地址" value="{{.T.s_myemail}}">
+                                    <span class="correct-icon"></span>
+                                </div>
+                                <div class="email_tips" style="display: none;">
+                                    <span class="label_tips"></span>
+                                    <p class="phone_rule">
+                                        邮箱格式错误
+                                    </p>
+                                </div>
+                            </div>
+                            <div class="email_code">
+                                <div class="write_phone_ipt">
+                                    <span class="label_phone">邮箱验证码</span>
+                                    <input class="ipt_code" type="text" placeholder="输入邮箱验证码">
+                                    <span class="sendEmail" id="sendEmail">发送验证码</span>
+                                    <span class="timedown"></span>
+                                </div>
+                                <!-- <div class="phone_tips" style="display: none;">
+                                    <span class="label_tips"></span>
+                                    <p class="phone_rule">
+                                        验证码错误
+                                    </p>
+                                </div> -->
+                            </div>
                         </div>
-                        <div class="phone_tips" style="display: none;">
-                            <span class="label_tips"></span>
-                            <p class="phone_rule">
-                                手机号格式错误
-                            </p>
+                    </div>
+                    <div class="free_button" id="free_button">
+                        <button class="write_free" id="write_free" disabled>确定</button>
+                    </div>
+                </div>
+                <div class="weui-tab__content infoMain kf">
+                    <div class="info_tip">
+                        <p class="tip_text">
+                            请正确填写手机号,客服人员将会在3个工作日内与您联系,针对结构化招标数据进行详细讲解。
+                        </p>
+                    </div>
+                    <div class="write_input">
+                        <div class="write_con">
+                            <div class="write_name">
+                                <div class="write_name_ipt">
+                                    <span class="label_name">联系人</span>
+                                    <input class="ipt_name" type="text" placeholder="输入联系人姓名">
+                                </div>
+                                <div class="kf_name_tips" style="display: none;">
+                                    <span class="label_tips"></span>
+                                    <p class="phone_rule">
+                                        请输入正确联系人
+                                    </p>
+                                </div>
+                            </div>
+                            <div class="write_phone">
+                                <div class="write_phone_ipt">
+                                    <span class="label_phone">手机号</span>
+                                    <input class="ipt_phone" type="text" maxlength="11" placeholder="输入手机号" value="{{.T.phone_num}}">
+                                </div>
+                                <div class="kf_phone_tips" style="display: none;">
+                                    <span class="label_tips"></span>
+                                    <p class="phone_rule">
+                                        手机号格式错误
+                                    </p>
+                                </div>
+                            </div>
+                            
                         </div>
                     </div>
-
+                    <div class="run_button" id="run_button">
+                        <button class="write_run" id="write_run" disabled>确定</button>
+                    </div>
+                </div>
+                <div class="weui-tab__content purchase">
+                    <div class="option_purchase">
+                        您可通过剑鱼标讯所提供的全国招投标数据的自助导出功能,根据自身企业,自定义设定关键词、发布时间、地区或行业等筛选条件,以“高级字段包”为选择,少量购买,用于核对数据的精准性。
+                    </div>
+                    <div class="run_now_button" id="run_now_button">
+                        <button class="write_run_now" id="write_run_now">立即前往</button>
+                    </div>
                 </div>
-            </div>
-            <div class="run_button" id="run_button">
-                <button class="write_run" id="write_run" disabled>立即提交</button>
             </div>
         </div>
     </div>
+</div>
 </body>
 <script src="/jyapp/structuredata/js/jquery.min.js"></script>
+<script src="/jyapp/structuredata/js/weui.min.js"></script>
+{{include "/common/js.html"}}
 <script>
-    (function() {
-        var issubmit = ["false","false"]
-        console.log($('.ipt_name').val())
-        console.log($('.ipt_phone').val())
-        var $iptphone = $('.ipt_phone').val()
-        var $iptname = $('.ipt_phone').val()
-        if($iptname != ''){
-            issubmit[0] = 'true'
-        }else{
-            issubmit[0] = 'false'
-        }
-        if($iptphone != ''){
-            issubmit[1] = 'true'
+var issubmit = ["false","false"]
+var isfreesubmit = ["false","false","false","false"]
+
+$(function(){
+  if ({{.T.s_myemail}}!=""&&{{.T.s_myemail}}!=null){
+      $('.email_code').slideUp();
+      isfreesubmit[2] = 'true';
+      isfreesubmit[3] = 'true';
+      $('.mf .ipt_email').val({{.T.s_myemail}})
+      $('.correct-icon').show()
+      freesubmit();
+  }else{
+    $('.mf .ipt_email').val('')
+  }
+
+  //   每次进页面都要清空之前的信息
+  $('.mf .ipt_name').val('')
+  $('.mf .ipt_phone').val('')
+  $('.mf .ipt_code').val('')
+  $('.kf .ipt_name').val('')
+  $('.kf .ipt_phone').val('')
+
+  $(".write_run_now").on("click",function(){
+    window.location.href="/jyapp/front/dataExport/toSieve?from=structed"
+  })
+  // tabbar
+  weui.tab('#tab',{
+      defaultIndex: 0,
+      onChange: function(index){
+          //console.log(index);
+      }
+  });
+  // 姓名输入事件
+  $('.mf .ipt_name').on('blur', function() {
+      var namerule =  isname(this.value)
+      var myreg=/^\s*$/g;
+      if(namerule){
+        $('.name_tips').hide()
+          isfreesubmit[0] = 'true'
+      }else{
+        if(myreg.test(this.value)){
+            $('.name_tips').hide()
+            isfreesubmit[0] = 'false'
         }else{
-            issubmit[1] = 'false'
-        }
-        // 验证手机号格式
-        function isPoneAvailable($poneInput) {
-            var myreg=/^[1][3,4,5,7,8][0-9]{9}$/;
-            if (!myreg.test($poneInput)) {
-                return false;
-            } else {
-                return true;
-            }
+            $('.name_tips').css('display','flex')
+            isfreesubmit[0] = 'false'
         }
-        // 姓名不能为空
-        function isname($nameInput) {
-            var myreg=/^\s*$/g;
-            var status = /^[\u4e00-\u9fa5]{2,}$/
-            console.log(!myreg.test($nameInput))
-            console.log(status.test($nameInput))
-            if (!myreg.test($nameInput) == true && status.test($nameInput) == true) {
-                return false;
-            } else {
-                return true;
-            }
+      }
+      freesubmit()
+  })
+  
+  // 手机号输入事件
+  $('.mf .ipt_phone').on('blur', function() {
+      var phonerule = isPoneAvailable(this.value)
+      var myreg=/^\s*$/g;
+      if(phonerule){
+          $('.phone_tips').hide()
+          isfreesubmit[1] = 'true'
+      }else{
+        if(myreg.test(this.value)){
+            $('.phone_tips').hide()
+            isfreesubmit[1] = 'false'
+        } else {
+            $('.phone_tips').css('display','flex')
+            isfreesubmit[1] = 'false'
         }
+      }
+      freesubmit()
+  })
 
-        $('.ipt_name').on('input', function() {
-            var namerule =  isname(this.value)
-            if(namerule){
-                issubmit[0] = "false"
-            }else{
-                issubmit[0] = "true"
-            }
-            console.log(issubmit)
-            submit()
-        })
-
-
-        $('.ipt_phone').on('input', function() {
-            var phonerule = isPoneAvailable(this.value)
-            if(phonerule){
-                $('.phone_tips').css('display','none')
-                issubmit[1] = "true"
-            }else{
-                $('.phone_tips').css('display','flex')
-                issubmit[1] = "false"
-            }
-            submit()
-        })
-        submit()
-        // 立即提交
-        $('.run_button').on('click', function() {
-            var sub_name = $('.ipt_name').val()
-            var sub_phone = $('.ipt_phone').val()
+  // 邮箱输入事件
+  $('.mf .ipt_email').on('input', function() {
+      var emailrule = isAvailableEmail(this.value)
+      if(emailrule){
+          if (this.value=={{.T.s_myemail}}){
+            $('.correct-icon').show()
+            $('.email_code').slideUp()
+            isfreesubmit[3] = 'true'
+          }else{
             $.ajax({
-                url:'/jyapp/structed/savedata',
-                type:'POST',
-                data:{
-                    name:sub_name,
-                    phone_num:sub_phone
-                },
-                success:function(res) {
-                    if(res.data.status == true){
-                        window.location.href = "/jyapp/structed/success"
-                    }
-                }
+              url:'/jyapp/structed/verifyEmail',
+              type:'POST',
+              data:{
+                  email:this.value,
+              },
+              success:function(res) {
+                  if(res.status == true) {
+                      isfreesubmit[3] = 'true'
+                      $('.email_code').slideUp();
+                      $('.correct-icon').show()
+                  }else{
+                      $('.email_code').slideDown()
+                      isfreesubmit[3] = 'false'
+                      $('.correct-icon').hide()
+                  }
+                  freesubmit()
+              },
+              error:function(err) {
+                  console.log(err)
+    
+              } 
             })
-        })
-
-        function submit() {
-            if(issubmit.includes('false')) {
-                $('.write_run').attr('disabled',true)
-            } else {
-                $('.write_run').attr('disabled',false)
-            }
+          }
+          $('.email_tips').hide()
+          isfreesubmit[2] = 'true'
+      }else{
+        $('.correct-icon').hide()
+        var myreg=/^\s*$/g;
+        if(myreg.test(this.value)){
+          $('.email_tips').hide()
+        } else {
+          $('.email_tips').css('display','flex')
+          isfreesubmit[2] = 'false'
+          $('.email_code').slideUp()
         }
-    })()
+      }
+      freesubmit()
+  })
+
+  // 邮箱验证码输入事件
+  $('.mf .ipt_code').on('input',function() {
+      // console.log($(this).val().length)
+      var codeLen = $(this).val()
+      var iptEmail = $('.ipt_email').val()
+      if(codeLen.length == 6){
+          $.ajax({
+              url:'/jyapp/structed/verifyCode',
+              type:'POST',
+              data:{
+                  s_email:iptEmail,
+                  verifyCode:codeLen
+              },
+              success:function(res) {
+                  if(res.status == true) {
+                      isfreesubmit[3] = 'true'
+                      $('.ipt_email').attr('disabled','disabled')
+                      $('.email_code').slideUp()
+                      $('.correct-icon').show()
+                  }else{
+                      $('.correct-icon').hide()
+                      $('.weui-icon_toast').hide()
+                      isfreesubmit[3] = 'false'
+                      weui.toast('验证码错误', 1500);
+                  }
+                  freesubmit()
+              },
+              error:function(err) {
+                  console.log(err)
+
+              } 
+          })
+      }
+  })
+
+  // 免费样例--确定
+  $('.free_button').on('click', function() {
+      var iptname = $('.mf .ipt_name').val()
+      var iptphone = $('.mf .ipt_phone').val()
+      var iptemail = $('.mf .ipt_email').val()
+      $.ajax({
+          url:'/jyapp/structed/freeSamples',
+          type:'POST',
+          data:{
+              name:iptname,
+              phone_num:iptphone,
+              s_email:iptemail
+          },
+          success:function(res){
+              if(res.status == true) {
+                window.location.replace("/jyapp/structed/success")
+              }else{
+                //   weui.toast('保存失败', 1500);
+              }
+          },
+          error:function(err){
+            //   weui.toast('保存失败', 1500);
+          }
+      })
+  })
+
+  // 姓名输入事件
+  $('.kf .ipt_name').on('blur', function() {
+      var namerule =  isname(this.value)
+      var myreg=/^\s*$/g;
+      if(namerule){
+        $('.kf_name_tips').hide()
+          issubmit[0] = "true"
+      }else{
+        if(myreg.test(this.value)){
+            $('.kf_name_tips').hide()
+            issubmit[0] = "false"
+        }else{
+            $('.kf_name_tips').css('display','flex')
+            issubmit[0] = "false"
+        }
+      }
+      submit()
+  })
+  
+  // 手机号输入事件
+  $('.kf .ipt_phone').on('blur', function() {
+      var phonerule = isPoneAvailable(this.value)
+      var myreg=/^\s*$/g;
+      if(phonerule){
+          $('.kf_phone_tips').hide()
+          issubmit[1] = "true"
+      }else{
+        if(myreg.test(this.value)){
+            $('.kf_phone_tips').hide()
+            issubmit[1] = "false"
+        } else {
+            $('.kf_phone_tips').css('display','flex')
+            issubmit[1] = "false"
+        } 
+      }
+      submit()
+  })
+  // 立即提交
+  $('.run_button').on('click', function() {
+      var sub_name = $('.kf .ipt_name').val()
+      var sub_phone = $('.kf .ipt_phone').val()
+      $.ajax({
+          url:'/jyapp/structed/savedata',
+          type:'POST',
+          data:{
+              name:sub_name,
+              phone_num:sub_phone
+          },
+          success:function(res) {
+              if(res.error_code == 0){
+                window.location.replace("/jyapp/structed/success")
+              }else{
+                // weui.toast(res.data["msg"], {
+                //     duration: 1500
+                // });
+              }
+          }
+      })
+  })
+  // 点击发送验证码
+  $('.sendEmail').on('click', function() {
+      // 先判断邮箱格式
+      var iptemail = $('.ipt_email').val()
+      var emailrule = isAvailableEmail(iptemail)
+      if(emailrule){
+          $('.email_tips').hide()
+        //   $('.timedown').show()
+          $.ajax({
+              url:'/jyapp/structed/sendMailVerify',
+              type:'POST',
+              data:{
+                  email:iptemail
+              },
+              success:function(res){
+                  isfreesubmit[3] = 'false';
+                //   res.errCode = 5
+                  if(res.errCode == 1){
+                    //   weui.toast('邮箱格式不正确', {
+                    //       duration: 1500,
+                    //       className: 'toast-lang',
+                    //   });
+                    $('.correct-icon').hide()
+                  }else if(res.errCode == 2) {
+                    //   weui.toast('已发送,5分钟后再尝试', {
+                    //       duration: 1500,
+                    //       className: 'toast-lang'
+                    //   });
+                    countdown()
+                    $('.correct-icon').hide()
+                  }else if(res.errCode == 3) {
+                    //   weui.toast('验证码发送次数已达今日上限', {
+                    //       duration: 1500,
+                    //       className: 'toast-lang',
+                    //   });
+                    countdown()
+                    $('.correct-icon').hide()
+                  }else if(res.errCode == 4) {
+                    $('.email_code').slideUp();
+                    isfreesubmit[3] = 'true';
+                    freesubmit();
+                    $('.correct-icon').show()
+                  }else if(res.errCode == 5) {
+                    countdown()
+                  }else{
+                      $('.sendEmail').hide()
+                  }
+                  
+              }
+          })
+      }else{
+          $('.email_tips').show()
+      }
+      
+  })
+})
+
+// 倒计时
+function countdown() {
+    $('.sendEmail').hide()
+    setTimeout(() => {
+        $('.timedown').show()
+    }, 100);
+    var time=300;
+    setTime=setInterval(function(){
+        if(time<=0){
+            $('.timedown').hide()
+            $('.sendEmail').show()
+            time=299
+            clearInterval(setTime);
+            return;
+        }
+        time--;
+        $(".timedown").text(time+'s');
+    },1000);
+}
+
+
+// 验证手机号格式
+function isPoneAvailable($poneInput) {
+    var myreg=/^[1][3,4,5,7,8][0-9]{9}$/;
+    if (!myreg.test($poneInput)) {
+        return false;
+    } else {
+        return true;
+    }
+}
+// 联系人必须是两个汉字以上
+function isname($nameInput) {
+    // var myreg=/^\s*$/g;
+    var tworeg = /^[\u4E00-\u9FA5]{2,}$/;
+    if (!tworeg.test($nameInput)) {
+        return false;
+    } else {
+        return true;
+    }
+}
+
+
+// 验证邮箱格式
+function isAvailableEmail($emailInput) {
+    var myreg = /^([A-Za-z0-9_\-\.\u4e00-\u9fa5])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,8})$/;
+    if(!myreg.test($emailInput)) {
+        return false;
+    } else {
+        return true;
+    }
+}
+
+// 判断提交按钮是否可以点击
+function submit() {
+    if(issubmit.includes('false')) {
+        $('.write_run').attr('disabled',true)
+    } else {
+        $('.write_run').attr('disabled',false)
+    }
+}
+
+// 判断免费样例的按钮是否可以点击
+function freesubmit() {
+    if(isfreesubmit.includes('false')) {
+        $('.write_free').attr('disabled',true)
+    } else {
+        $('.write_free').attr('disabled',false)
+    }
+}
+
     // 返回
     function fanhui() {
         history.go(-1)
     }
 </script>
+<!--百度统计end-->
+{{include "/common/baiducc.html"}}
 </html>

+ 3 - 3
src/jfw/modules/app/src/web/templates/structeddata/write_result.html

@@ -8,7 +8,7 @@
         <meta name="apple-mobile-web-app-status-bar-style" content="black">
         <meta http-equiv="X-UA-Compatible" content="ie=edge">
         <meta http-equiv="X-UA-Compatible" content="ie=edge">
-        <title>结构化招标数据</title>
+        <title>深入了解</title>
         <script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/js/rem.js?v={{Msg "seo" "version"}}"></script>
         <link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/css/base.css?v={{Msg "seo" "version"}}">
         <link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/iconfont/iconfont.css?v={{Msg "seo" "version"}}">
@@ -18,7 +18,7 @@
     <div id="writeresult">
         <div class="j-header jy-app-header">
             <i class="header-left iconfont icon-fanhui" style="font-size:0.36rem" onclick="fanhui()"></i>
-            <span class="header-title">结构化招标数据</span>
+            <span class="header-title">深入了解</span>
             <span class="header-right"></span>
         </div>
         <div class="result_view">
@@ -40,7 +40,7 @@
 <script>
    function back_to_index(){
     //    window.location.href = "/jyapp/jylab/mainSearch"
-       history.go(-3)
+       history.go(-1)
    }
 
    function fanhui() {

+ 1 - 1
src/jfw/modules/app/src/web/templates/weixin/search/mainSearch.html

@@ -430,7 +430,7 @@
 								</li>
 								<li>
 									<div id="dqbtn" style="width:7em;position:relative;float:left;" data-value="拟建">拟建项目</div>
-									<div class="jy_sprite_main sprite_q-mark q-mark" style="float:left;"></div>
+									<div class="jy_sprite_main sprite_q-mark q-mark" style=""></div>
 <!--									<img style="float:left;" class="q-mark" src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/wx/q-mark.png?v={{Msg "seo" "version"}}"/>-->
 									<button class="btn hidden" style="clear:both;">拟建</button>
 								</li>

+ 3 - 0
src/jfw/modules/app/src/web/templates/weixin/wxinfocontent.html

@@ -724,6 +724,9 @@ ul {
 .adv_tosieve{
   display: inline-block;
 }
+.content img{
+  width:100%;
+}
 </style>
 </head>
 <body>

+ 31 - 0
src/jfw/modules/subscribepay/src/service/dataExportPay_mobile.go

@@ -249,6 +249,22 @@ func (p *DataExportPayMobile) CreateOrder() {
 		})
 		if orderid == 0 {
 			return "", "", fmt.Sprintf("数据插入出错"), false
+		} else {
+			//保存结构化数据信息 记录
+			go func() {
+				if p.GetSession("Structed") != nil && p.GetSession("Structed").(bool) {
+					//姓名  手机号  邮箱
+					nickname, _ := p.GetSession("s_nickname").(string)
+					user_mail, _ := p.GetSession("DataExportVerifyEmail_val").(string)
+					user_phone, _ := p.GetSession("DataExportVerifyPhone").(string)
+					if user_phone == "" {
+						user_phone, _ = p.GetSession("DataExportVerifyPhone_val").(string)
+					}
+					util.StructedDataByExportData(nickname, user_mail, user_phone)
+					//清除存储标识
+					p.DelSession("Structed")
+				}
+			}()
 		}
 		return payStr, code, "", true
 	}()
@@ -504,6 +520,21 @@ func (p *DataExportPayMobile) WxSacnPay_CreateOrder() {
 				result["code"] = ordercode
 				result["token"] = entity.GetWaitPayToken(orderid, order_money, ordercode, pay_way, userId)
 				result["res"] = res
+				//保存结构化数据信息 记录
+				go func() {
+					if p.GetSession("Structed") != nil && p.GetSession("Structed").(bool) {
+						//姓名  手机号  邮箱
+						nickname, _ := p.GetSession("s_nickname").(string)
+						user_mail, _ := p.GetSession("DataExportVerifyEmail_val").(string)
+						user_phone, _ := p.GetSession("DataExportVerifyPhone").(string)
+						if user_phone == "" {
+							user_phone, _ = p.GetSession("DataExportVerifyPhone_val").(string)
+						}
+						util.StructedDataByExportData(nickname, user_mail, user_phone)
+						//清除存储标识
+						p.DelSession("Structed")
+					}
+				}()
 			}
 		} else {
 			log.Println("生成微信预支付交易单失败", ret)

+ 9 - 0
src/jfw/modules/subscribepay/src/service/dataExportPay_pc.go

@@ -373,6 +373,15 @@ func (p *DataExportPayPC) SacnPay_CreateOrder() {
 			}
 		}
 	}
+	//保存结构化数据信息 记录
+	go func(r map[string]interface{}) {
+		if r["status"] == "y" && p.GetSession("Structed") != nil && p.GetSession("Structed").(bool) {
+			//姓名  手机号  邮箱
+			util.StructedDataByExportData(nickname, user_mail, user_phone)
+			//清除存储标识
+			p.DelSession("Structed")
+		}
+	}(result)
 	p.ServeJson(result)
 }
 

+ 36 - 0
src/jfw/modules/subscribepay/src/util/structed.go

@@ -0,0 +1,36 @@
+package util
+
+import (
+	"fmt"
+	"time"
+)
+
+func StructedDataByExportData(nickname, user_mail, user_phone string) {
+	if user_mail != "" && user_phone != "" {
+		count := Mysql.Count("structed_data", map[string]interface{}{
+			"name":  nickname,
+			"phone": user_phone,
+			"email": user_mail,
+			"type":  2,
+		})
+		if count >= 1 {
+			fmt.Println("用户信息已存在")
+		} else {
+			stu := Mysql.Insert("structed_data", map[string]interface{}{
+				"name":        nickname,
+				"phone":       user_phone,
+				"email":       user_mail,
+				"submit_time": time.Now().Unix(),
+				"status":      0,
+				"type":        2, //用户来源,0:联系客服,1:免费样例,2:自选购买
+			})
+			if stu == 0 {
+				fmt.Println("数据库操作异常")
+			} else {
+				fmt.Println("保存成功")
+			}
+		}
+	} else {
+		fmt.Println(nickname, "---", user_mail, "---", user_phone)
+	}
+}

+ 5 - 5
src/jfw/modules/weixin/src/config.json

@@ -8,11 +8,11 @@
     "weixinrpcport": "8083",
     "webrpcport": "127.0.0.1:8084",
     "jyop_webrpcport": "127.0.0.1:8012",
-    "webdomain": "http://web-jydev-wcj.jianyu360.cn",
-    "appid": "wx76e1309b01a7b17e",
-    "apptoken": "top2020top2020",
-    "appsecret": "dd00e71cb2370432d9de848b674eb8e7",
-    "proxysess": "http://web-jydev-wcj.jianyu360.cn/front/sess/%s",
+    "webdomain": "http://web-jydev-tsz.jianyu360.cn",
+    "appid": "wxfa161ce88ab7584e",
+    "apptoken": "top2015top2015",
+    "appsecret": "4776638e01eda5f44780dc2abfebb236",
+    "proxysess": "http://web-jydev-tsz.jianyu360.cn/front/sess/%s",
     "followCompany": 10,
     "welcomemsg": "用剑鱼标讯,所有功能完全免费,\n和传统的会员制说再见!\n\n<a href='%s'>点击这里</a>设置关键词,或直接回复“订阅 关键词”,如“订阅 教学设备”,您将随时随地接收招标信息!\n\n剑鱼标讯,让投标无限可能!",
     "tpl_subscribe_push_id": "IY_RWWzMlwDK6hcd6RAzTec6qre8n5r8PNOOUM_hgk0",

+ 9 - 0
src/jfw/public/public.go

@@ -325,3 +325,12 @@ func SaveUserSearchLog(request *http.Request, userid string, count int64, platfo
 		Mgo_Log.Save("jy_search_log", data)
 	}()
 }
+func isPhone(value string) bool {
+	var phonePattern = regexp.MustCompile("^[1][3-9][0-9]{9}$")
+	return phonePattern.MatchString(value)
+}
+
+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)
+}

+ 53 - 0
src/jfw/public/structed.go

@@ -0,0 +1,53 @@
+package public
+
+import (
+	"fmt"
+	"jfw/config"
+	"log"
+	"qfw/util/mail"
+	"time"
+)
+
+func SendStructedDataByEmail(email string, auth []*mail.GmailAuth) bool {
+	var uploadAddress = config.Sysconfig["webdomain"].(string) + config.Seoconfig["structedUploadA"].(string)
+	var imagesAddress = config.Sysconfig["webdomain"].(string) + "/structuredata/mobile/image/emaillogo.png"
+	var feedbackAddress = "mailto:bd@topnet.net.cn"
+
+	if isEmail(email) {
+		html := fmt.Sprintf(`<div style="width:100%%;display: flex;justify-content: center;">
+		<div class="Email" id="Email" style="max-width:100%%;min-height: 540px;display: flex;flex-direction: column;align-items: center;">
+        <div class="emailmain" style="border: 1px solid #ccc;max-width:100%%;height: 319px;border-top: 8px solid #2CB7CA;border-radius: 8px;background: #fff;margin: 0 auto; margin-top: 107px;padding: 0px 40px 20px;">
+            <div class="emailmain_top" style="height: 88px;max-width:100%%;border-bottom: 1px solid #F7F7F7;display: flex;justify-content: center;align-items: center;">
+                <img src="%s" alt="" style="width: 120px;height: 32px;">
+            </div>
+            <div class="emailmain_bottom" style="display: flex;flex-direction: column;align-items: center;">
+                <p class="emailmain_text" style="margin-top: 32px;width: 100%%;min-height: 72px;font-size: 16px;line-height: 24px;color: #1D1D1D;">
+                    尊敬的剑鱼标讯用户:<br> 您好,感谢您使用剑鱼标讯的结构化招标数据产品,免费样例已发送到您的邮箱,请查收!如有问题,可拨打<span style="color: #0987FF;cursor: pointer;">400-108-6670</span>,客服人员将诚挚为您服务。
+                </p>
+                <div class="download" style="margin-top: 32px; max-width:100%%; height: 30px;display: flex;justify-content: center;align-items: center;">
+                    <a href="%s" class="download_btn" style="width: 116px;height: 30px;display: flex;text-decoration: none;justify-content: center;align-items: center;font-size: 14px;line-height: 24px;color: #fff;background: #2CB7CA;border-radius: 4px;">下载免费样例 </a>
+                </div>
+            </div>
+        </div>
+        <p class="havapro" style="font-size: 14px;height: 24px;color: #686868;margin-top: 32px;">
+            如有问题请<a href="%s" class="click_here"  id="click_here" style="color: #0987FF;cursor: pointer;">点击此处</a>,进行意见反馈
+        </p>
+    </div></div>`, imagesAddress, uploadAddress, feedbackAddress)
+
+		for k, v := range auth {
+			if mail.GSendMail("剑鱼标讯", email, "", "", "【剑鱼标讯】结构化招标数据", html, "", "", v) {
+				log.Println(email, fmt.Sprintf("使用%s发送邮件成功", v.User))
+				return true
+			}
+			if k < len(auth)-1 {
+				log.Println(email, fmt.Sprintf("使用%s发送邮件失败!3s后使用其他邮箱尝试", v.User))
+			} else {
+				log.Println(email, fmt.Sprintf("使用%s发送邮件失败!", v.User))
+			}
+			time.Sleep(time.Second * 3)
+		}
+	} else {
+		log.Println(fmt.Sprintf("%s 邮件格式有误", email))
+	}
+	return false
+}

+ 2 - 1
src/seo.json

@@ -478,5 +478,6 @@
         "downloadUrl_win": "http://w2blmjy.qmx.top/res/JianYu for Windows.exe",
         "downloadUrl_mac": "http://w2blmjy.qmx.top/res/JianYu for Mac.dmg"
     },
-	"orderCountdown":"72h"
+	"orderCountdown":"72h",
+	"structedUploadA":"/structuredata/file/【剑鱼标讯】结构化招标数据.xlsx"
 }

+ 15 - 0
src/web/staticres/css/dataService.css

@@ -362,3 +362,18 @@
 	left: 110px;
 	top: 175px;
 }
+/*v2.10.10*/
+.dataCustom .dataC{
+	margin-left: 30px;
+    margin-top: 15px;
+}
+.dataCustom .dataC p{
+	    width: 323px;
+    height: 154px;
+    font-size: 16px;
+    font-family: "Microsoft YaHei",sans-serif;
+    font-weight: 400;
+    line-height: 24px;
+    color: rgba(102, 102, 102, 1);
+    opacity: 1;
+}

+ 2 - 2
src/web/staticres/js/public-nav.js

@@ -9,7 +9,7 @@ $(function () {
 		    $thisWidth = $(this).width(),
 		    //当前宽度
 		$thisIndex = $(this).index();
-		if((typeof(myPageNavIsNormal)!="undefined"&&myPageNavIsNormal==true)||$href.indexOf("supsearch")>-1||$href.indexOf("bidsearchforent")>-1||$href.indexOf("promotional/topics")>-1||$href.indexOf("list")>-1||$href.indexOf("article/content")>-1||$href.indexOf("article/bdprivate")>-1||$href.indexOf("article/mailprivate")>-1||$href.indexOf("article/bdcontent")>-1||$href.indexOf("/jypc/toPushView")>-1||$href.indexOf("/jyblog")>-1||$href.indexOf("/dataExport")>-1||$href.indexOf("/front/dataService.html")>-1||$href.indexOf("/front/course")>-1||$href.indexOf("/front/dataexport")>-1||$href.indexOf("/orderPay")>-1){
+		if((typeof(myPageNavIsNormal)!="undefined"&&myPageNavIsNormal==true)||$href.indexOf("supsearch")>-1||$href.indexOf("bidsearchforent")>-1||$href.indexOf("promotional/topics")>-1||$href.indexOf("list")>-1||$href.indexOf("article/content")>-1||$href.indexOf("article/bdprivate")>-1||$href.indexOf("article/mailprivate")>-1||$href.indexOf("article/bdcontent")>-1||$href.indexOf("/jypc/toPushView")>-1||$href.indexOf("/jyblog")>-1||$href.indexOf("/dataExport")>-1||$href.indexOf("/front/dataService.html")>-1||$href.indexOf("/front/course")>-1||$href.indexOf("/front/dataexport")>-1||$href.indexOf("/orderPay")>-1||$href.indexOf("structed/")>-1){
             $navLi.find("a:not(.link)").css({"color":"#252627"});
 		}else{
 			$navLi.find("a:not(.link)").css({"color":"#fff"});
@@ -54,7 +54,7 @@ function seclectNavLi(el, $index) {
 	var $slider = $(".public-nav .jynav .slider");
 	/*获取当前这个元素的css*/
 	var $thisCss = el.eq($index).width();
-	if((typeof(myPageNavIsNormal)!="undefined"&&myPageNavIsNormal==true)||$href.indexOf("supsearch")>-1||$href.indexOf("bidsearchforent")>-1||$href.indexOf("promotional/topics")>-1||$href.indexOf("list")>-1||$href.indexOf("article/content")>-1||$href.indexOf("article/bdprivate")>-1||$href.indexOf("article/mailprivate")>-1||$href.indexOf("article/bdcontent")>-1||$href.indexOf("/jyblog")>-1||$href.indexOf("/dataExport")>-1||$href.indexOf("/front/dataService.html")>-1||$href.indexOf("/front/course")>-1||$href.indexOf("/front/dataexport")>-1||$href.indexOf("/orderPay")>-1){
+	if((typeof(myPageNavIsNormal)!="undefined"&&myPageNavIsNormal==true)||$href.indexOf("supsearch")>-1||$href.indexOf("bidsearchforent")>-1||$href.indexOf("promotional/topics")>-1||$href.indexOf("list")>-1||$href.indexOf("article/content")>-1||$href.indexOf("article/bdprivate")>-1||$href.indexOf("article/mailprivate")>-1||$href.indexOf("article/bdcontent")>-1||$href.indexOf("/jyblog")>-1||$href.indexOf("/dataExport")>-1||$href.indexOf("/front/dataService.html")>-1||$href.indexOf("/front/course")>-1||$href.indexOf("/front/dataexport")>-1||$href.indexOf("/orderPay")>-1||$href.indexOf("structed/")>-1){
         el.find("a:not(.link)").css({"color":"#252627"});
 	}else{
 		el.find("a:not(.link)").css({"color":"#fff"});

+ 0 - 162
src/web/staticres/structuredata/css/write_infor.css

@@ -1,162 +0,0 @@
-body, html {
-  width: 100%;
-  height: 100%;
-}
-
-input::-webkit-input-placeholder, textarea::-webkit-input-placeholder {
-  color: #C0C4CC;
-  font-size: .32rem;
-  line-height: .48rem;
-}
-
-#writeInfo {
-  width: 100%;
-  height: 100%;
-}
-
-#writeInfo .infoMain {
-  width: 100%;
-  height: 100%;
-}
-
-#writeInfo .infoMain .info_tip {
-  overflow: hidden;
-  width: 100%;
-  height: 3.6rem;
-  background: url("../image/bg_info.png");
-  background-size: 100% 100%;
-}
-
-#writeInfo .infoMain .info_tip .tip_text {
-  margin-top: 1.04rem;
-  padding: 0 .32rem;
-  width: 100%;
-  height: .48rem;
-  font-size: .32rem;
-  color: #fff;
-}
-
-#writeInfo .infoMain .write_input {
-  width: 100%;
-  padding: 0 .24rem;
-  margin-top: -1.04rem;
-}
-
-#writeInfo .infoMain .write_input .write_con {
-  width: 100%;
-  background: #fff;
-  border-radius: 8px;
-  margin-top: .08rem;
-  overflow: hidden;
-}
-
-#writeInfo .infoMain .write_input .write_con .write_name {
-  width: 100%;
-  padding: 0 .32rem;
-  margin-top: .08rem;
-}
-
-#writeInfo .infoMain .write_input .write_con .write_name .write_name_ipt {
-  width: 100%;
-  height: 1.08rem;
-  display: flex;
-  align-items: center;
-  box-shadow: inset 0px -0.5px 0px rgba(0, 0, 0, 0.05), inset 16px 0px 0px #FFFFFF;
-}
-
-#writeInfo .infoMain .write_input .write_con .write_name .write_name_ipt .label_name {
-  display: flex;
-  align-items: center;
-  width: 1.6rem;
-  height: .48rem;
-  text-align: left;
-  font-size: .3rem;
-  color: #5F5E64;
-}
-
-#writeInfo .infoMain .write_input .write_con .write_name .write_name_ipt .ipt_name {
-  height: .48rem;
-  display: flex;
-  align-items: center;
-  padding-top: .08rem;
-  font-size: .32rem;
-  color: #171826;
-}
-
-#writeInfo .infoMain .write_input .write_con .write_phone {
-  width: 100%;
-  display: flex;
-  flex-direction: column;
-}
-
-#writeInfo .infoMain .write_input .write_con .write_phone .write_phone_ipt {
-  width: 100%;
-  height: 1.08rem;
-  display: flex;
-  align-items: center;
-  padding: 0 .32rem;
-}
-
-#writeInfo .infoMain .write_input .write_con .write_phone .write_phone_ipt .label_phone {
-  display: flex;
-  align-items: center;
-  width: 1.6rem;
-  height: .48rem;
-  text-align: left;
-  font-size: .3rem;
-  color: #5F5E64;
-}
-
-#writeInfo .infoMain .write_input .write_con .write_phone .write_phone_ipt .ipt_phone {
-  height: .48rem;
-  display: flex;
-  align-items: center;
-  padding-top: .08rem;
-  font-size: .32rem;
-  color: #171826;
-}
-
-#writeInfo .infoMain .write_input .write_con .write_phone .phone_tips {
-  margin-bottom: .26rem;
-  display: flex;
-  width: 100%;
-  height: .36rem;
-  padding: 0 .32rem;
-}
-
-#writeInfo .infoMain .write_input .write_con .write_phone .phone_tips .label_tips {
-  display: flex;
-  width: 1.6rem;
-  height: .48rem;
-}
-
-#writeInfo .infoMain .write_input .write_con .write_phone .phone_tips .phone_rule {
-  height: 100%;
-  font-size: .24rem;
-  color: #FB483D;
-}
-
-#writeInfo .infoMain .run_button {
-  margin-top: .6rem;
-  width: 100%;
-  height: .92rem;
-  padding: 0 .32rem;
-}
-
-#writeInfo .infoMain .run_button .write_run {
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  width: 100%;
-  height: 100%;
-  background: #2ABED1;
-  border-radius: .16rem;
-  color: #fff;
-  font-size: .36rem;
-}
-
-#writeInfo .infoMain .run_button .write_run:disabled {
-  background: #87DFEA;
-  color: #FFFFFF;
-  opacity: 0.65;
-}

BIN
src/web/staticres/structuredata/file/【剑鱼标讯】结构化招标数据.xlsx


+ 0 - 0
src/web/staticres/structuredata/css/base.css → src/web/staticres/structuredata/mobile/css/base.css


+ 0 - 0
src/web/staticres/structuredata/css/data_example.css → src/web/staticres/structuredata/mobile/css/data_example.css


+ 47 - 35
src/web/staticres/structuredata/css/marketing.css → src/web/staticres/structuredata/mobile/css/marketing.css

@@ -5,7 +5,7 @@ html {
 }
 
 body {
-  background: #2F96F4;
+  background: #2f96f4;
 }
 
 #app {
@@ -16,18 +16,6 @@ body {
   position: relative;
 }
 
-#app .jy-app-header {
-  position: absolute;
-  background: transparent;
-}
-
-#app .jy-app-header .fanhui {
-  width: 0.96rem;
-  height: 0.96rem;
-  font-size: 0.36rem;
-  color: #fff;
-}
-
 #app .j-main {
   width: 100%;
   height: 100%;
@@ -131,7 +119,7 @@ body {
   width: 100%;
   height: 0.36rem;
   font-size: 0.24rem;
-  color: #C0C4CC;
+  color: #c0c4cc;
   line-height: 0.36rem;
 }
 
@@ -167,7 +155,7 @@ body {
   background: rgba(47, 150, 244, 0.04);
   font-size: 0.3rem;
   font-weight: bold;
-  color: #2F96F4;
+  color: #2f96f4;
 }
 
 #app .j-main .str_what .str_content .data_mode .data_mode_content {
@@ -217,8 +205,8 @@ body {
   border-radius: 8px 24px 0px 0px;
   background: rgba(47, 150, 244, 0.04);
   font-size: 0.3rem;
+  color: #2f96f4;
   font-weight: bold;
-  color: #2F96F4;
 }
 
 #app .j-main .str_what .str_content .message .message_page {
@@ -235,7 +223,7 @@ body {
   height: 2.88rem;
   font-size: 0.24rem;
   line-height: .36rem;
-  color: #5F5E64;
+  color: #5f5e64;
 }
 
 #app .j-main .str_what .str_content .message .message_page .click_view {
@@ -245,11 +233,11 @@ body {
   width: 2.6rem;
   height: 0.6rem;
   border-radius: .32rem;
-  border: 1px solid #2F96F4;
+  border: 1px solid #2f96f4;
   box-sizing: border-box;
   margin-top: 0.4rem;
   font-size: 0.26rem;
-  color: #2F96F4;
+  color: #2f96f4;
 }
 
 #app .j-main .advantage {
@@ -452,7 +440,7 @@ body {
   height: auto;
   padding-left: .72rem;
   font-size: .24rem;
-  color: #5F5E64;
+  color: #5f5e64;
 }
 
 #app .j-main .company {
@@ -511,29 +499,23 @@ body {
 
 #app .j-button-group {
   display: flex;
-  justify-content: space-between;
   align-items: center;
+  justify-content: space-between;
   width: 100%;
-  height: 1.12rem;
+  height: 1.32rem;
   padding: 0.16rem 0.32rem 0.16rem;
   background-color: #fff;
 }
 
-#app .j-button-group .j-button-confirm,
 #app .j-button-group .j-button-cancel {
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  width: 48%;
-  height: 0.8rem;
-  font-size: 0.32rem;
-  text-align: center;
-  border-radius: 0.16rem;
+  height: .8rem;
+  background: #EDEFF2;
+  color: #171826;
 }
 
-#app .j-button-group .j-button-cancel {
-  background: #EDEFF2;
-  color: #5F5E64;
+#app .j-button-group .j-button-cancel .phone_num {
+  font-size: .28rem;
+  color: #5f5e64;
 }
 
 #app .j-button-group .j-button-cancel .phone_icon {
@@ -546,10 +528,40 @@ body {
 }
 
 #app .j-button-group .j-button-confirm {
-  background: #2ABED1;
+  height: .8rem;
+  background: #2abed1;
   color: #fff;
 }
 
+.jy-app-header.header-transparent {
+  position: absolute;
+  width: 100%;
+  background: transparent;
+  z-index: 999;
+}
+
+.jy-app-header.header-transparent .subreport_title {
+  font-size: 0;
+}
+
+.jy-app-header.header-transparent .fanhui {
+  width: 0.96rem;
+  height: 0.96rem;
+  font-size: 0.36rem;
+  color: #fff;
+}
+
+#app .j-button-group .j-button-confirm,
+#app .j-button-group .j-button-cancel {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 48%;
+  font-size: 0.32rem;
+  text-align: center;
+  border-radius: 0.16rem;
+}
+
 @keyframes ballRotate {
   0% {
     transform: rotate(0);

+ 0 - 0
src/web/staticres/structuredata/css/preview.css → src/web/staticres/structuredata/mobile/css/preview.css


+ 0 - 0
src/web/staticres/structuredata/css/weui.min.css → src/web/staticres/structuredata/mobile/css/weui.min.css


+ 271 - 0
src/web/staticres/structuredata/mobile/css/write_infor.css

@@ -0,0 +1,271 @@
+body, html {
+  width: 100%;
+  height: 100%;
+}
+
+input::-webkit-input-placeholder {
+  color: #C0C4CC;
+  font-size: .32rem;
+}
+
+.weui-toast {
+  min-height: 2.6em;
+  line-height: 2.6em;
+  top: 6rem;
+}
+
+.weui-toast .weui-toast__content {
+  margin: 0;
+}
+
+.weui-icon_toast {
+  display: none;
+}
+
+.toast-lang .weui-toast {
+  width: auto;
+  padding: 0 .5rem;
+  left: 38%;
+}
+
+#writeInfo {
+  width: 100%;
+  height: 100%;
+}
+
+#writeInfo .weui-navbar {
+  height: .96rem;
+}
+
+#writeInfo .weui-navbar .weui-navbar__item {
+  font-size: .28rem;
+  color: #5F5E64;
+  padding: .24rem 0;
+}
+
+#writeInfo .weui-navbar .weui-navbar__item.weui-bar__item_on {
+  color: #2ABED1;
+}
+
+#writeInfo .weui-navbar .weui-navbar__item.weui-bar__item_on, #writeInfo .weui-navbar .weui-navbar__item:active {
+  background: #fff;
+}
+
+#writeInfo .weui-navbar .weui-navbar__item.weui-bar__item_on .showline, #writeInfo .weui-navbar .weui-navbar__item:active .showline {
+  margin-top: .16rem;
+  width: 100%;
+  height: .03rem;
+  display: flex;
+  justify-content: center;
+}
+
+#writeInfo .weui-navbar .weui-navbar__item.weui-bar__item_on .showline span, #writeInfo .weui-navbar .weui-navbar__item:active .showline span {
+  width: .48rem;
+  height: .03rem;
+  background: linear-gradient(270.45deg, #25BEEE 0.03%, #2ABED1 74.46%);
+  border-radius: 1px;
+}
+
+#writeInfo .weui-navbar .weui-navbar__item:after {
+  border-right: 0;
+}
+
+#writeInfo .infoMain, #writeInfo .purchase {
+  width: 100%;
+  height: 100%;
+}
+
+#writeInfo .infoMain .info_tip, #writeInfo .purchase .info_tip {
+  overflow: hidden;
+  width: 100%;
+  height: 3.6rem;
+  background: url("../image/bg_info.png");
+  background-size: 100% 100%;
+}
+
+#writeInfo .infoMain .info_tip .tip_text, #writeInfo .purchase .info_tip .tip_text {
+  margin-top: .64rem;
+  padding: 0 .32rem;
+  width: 100%;
+  height: .48rem;
+  font-size: .28rem;
+  color: #fff;
+}
+
+#writeInfo .infoMain .write_input, #writeInfo .purchase .write_input {
+  width: 100%;
+  padding: 0 .24rem;
+  margin-top: -1.04rem;
+}
+
+#writeInfo .infoMain .write_input .write_con, #writeInfo .purchase .write_input .write_con {
+  width: 100%;
+  background: #fff;
+  border-radius: 8px;
+  margin-top: .08rem;
+  overflow: hidden;
+  padding: 0 0 0 .32rem;
+}
+
+#writeInfo .infoMain .write_input .write_con .write_name, #writeInfo .purchase .write_input .write_con .write_name {
+  width: 100%;
+  margin-top: .08rem;
+}
+
+#writeInfo .infoMain .write_input .write_con .write_name .write_name_ipt, #writeInfo .purchase .write_input .write_con .write_name .write_name_ipt {
+  width: 100%;
+  height: 1.08rem;
+  display: flex;
+  align-items: center;
+  line-height: 1.08rem;
+}
+
+#writeInfo .infoMain .write_input .write_con .write_name .write_name_ipt .label_name, #writeInfo .purchase .write_input .write_con .write_name .write_name_ipt .label_name {
+  display: flex;
+  align-items: center;
+  width: 1.6rem;
+  height: .48rem;
+  text-align: left;
+  font-size: .3rem;
+  color: #5F5E64;
+}
+
+#writeInfo .infoMain .write_input .write_con .write_name .write_name_ipt .ipt_name, #writeInfo .purchase .write_input .write_con .write_name .write_name_ipt .ipt_name {
+  height: .48rem;
+  display: flex;
+  align-items: center;
+  padding-top: .08rem;
+  font-size: .32rem;
+}
+
+#writeInfo .infoMain .write_input .write_con .write_phone, #writeInfo .infoMain .write_input .write_con .write_name, #writeInfo .infoMain .write_input .write_con .write_email, #writeInfo .infoMain .write_input .write_con .email_code, #writeInfo .purchase .write_input .write_con .write_phone, #writeInfo .purchase .write_input .write_con .write_email, #writeInfo .purchase .write_input .write_con .email_code {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  box-shadow: inset 0px -0.5px 0px rgba(0, 0, 0, 0.05), inset 16px 0px 0px #FFFFFF;
+}
+
+#writeInfo .infoMain .write_input .write_con .write_phone .write_phone_ipt, #writeInfo .infoMain .write_input .write_con .write_name .write_phone_ipt, #writeInfo .infoMain .write_input .write_con .write_email .write_phone_ipt, #writeInfo .infoMain .write_input .write_con .email_code .write_phone_ipt, #writeInfo .purchase .write_input .write_con .write_phone .write_phone_ipt, #writeInfo .purchase .write_input .write_con .write_email .write_phone_ipt, #writeInfo .purchase .write_input .write_con .email_code .write_phone_ipt {
+  width: 100%;
+  height: 1.08rem;
+  display: flex;
+  align-items: center;
+}
+
+#writeInfo .infoMain .write_input .write_con .write_phone .write_phone_ipt .label_phone, 
+#writeInfo .infoMain .write_input .write_con .write_name .write_phone_ipt .label_phone, #writeInfo .infoMain .write_input .write_con .write_email .write_phone_ipt .label_phone, #writeInfo .infoMain .write_input .write_con .email_code .write_phone_ipt .label_phone, #writeInfo .purchase .write_input .write_con .write_phone .write_phone_ipt .label_phone, #writeInfo .purchase .write_input .write_con .write_email .write_phone_ipt .label_phone, #writeInfo .purchase .write_input .write_con .email_code .write_phone_ipt .label_phone {
+  display: flex;
+  align-items: center;
+  width: 1.6rem;
+  height: .48rem;
+  text-align: left;
+  font-size: .3rem;
+  color: #5F5E64;
+}
+
+#writeInfo .infoMain .write_input .write_con .write_phone .write_phone_ipt .ipt_phone,
+#writeInfo .infoMain .write_input .write_con .write_name .write_phone_ipt .ipt_name,  #writeInfo .infoMain .write_input .write_con .write_phone .write_phone_ipt .ipt_email, #writeInfo .infoMain .write_input .write_con .write_phone .write_phone_ipt .ipt_code, #writeInfo .infoMain .write_input .write_con .write_email .write_phone_ipt .ipt_phone, #writeInfo .infoMain .write_input .write_con .write_email .write_phone_ipt .ipt_email, #writeInfo .infoMain .write_input .write_con .write_email .write_phone_ipt .ipt_code, #writeInfo .infoMain .write_input .write_con .email_code .write_phone_ipt .ipt_phone, #writeInfo .infoMain .write_input .write_con .email_code .write_phone_ipt .ipt_email, #writeInfo .infoMain .write_input .write_con .email_code .write_phone_ipt .ipt_code, #writeInfo .purchase .write_input .write_con .write_phone .write_phone_ipt .ipt_phone, #writeInfo .purchase .write_input .write_con .write_phone .write_phone_ipt .ipt_email, #writeInfo .purchase .write_input .write_con .write_phone .write_phone_ipt .ipt_code, #writeInfo .purchase .write_input .write_con .write_email .write_phone_ipt .ipt_phone, #writeInfo .purchase .write_input .write_con .write_email .write_phone_ipt .ipt_email, #writeInfo .purchase .write_input .write_con .write_email .write_phone_ipt .ipt_code, #writeInfo .purchase .write_input .write_con .email_code .write_phone_ipt .ipt_phone, #writeInfo .purchase .write_input .write_con .email_code .write_phone_ipt .ipt_email, #writeInfo .purchase .write_input .write_con .email_code .write_phone_ipt .ipt_code {
+  height: .48rem;
+  display: flex;
+  align-items: center;
+  font-size: .32rem;
+  line-height: .48rem;
+}
+
+#writeInfo .infoMain .write_input .write_con .write_email .write_phone_ipt .ipt_email{
+  width: 4.2rem;
+}
+
+#writeInfo .infoMain .write_input .write_con .write_email .write_phone_ipt .correct-icon{
+  background: url('../image/correct-icon-mobile.png') no-repeat;
+  background-size: .48rem .48rem;
+  width: .48rem;
+  height: .48rem;
+  /* margin-left: 0.6rem; */
+  display: none;
+}
+
+#writeInfo .infoMain .write_input .write_con .write_phone .write_phone_ipt .ipt_code, #writeInfo .infoMain .write_input .write_con .write_email .write_phone_ipt .ipt_code, #writeInfo .infoMain .write_input .write_con .email_code .write_phone_ipt .ipt_code, #writeInfo .purchase .write_input .write_con .write_phone .write_phone_ipt .ipt_code, #writeInfo .purchase .write_input .write_con .write_email .write_phone_ipt .ipt_code, #writeInfo .purchase .write_input .write_con .email_code .write_phone_ipt .ipt_code {
+  width: 3.5rem;
+}
+
+#writeInfo .infoMain .write_input .write_con .write_phone .write_phone_ipt .ipt_email:disabled, #writeInfo .infoMain .write_input .write_con .write_email .write_phone_ipt .ipt_email:disabled, #writeInfo .infoMain .write_input .write_con .email_code .write_phone_ipt .ipt_email:disabled, #writeInfo .purchase .write_input .write_con .write_phone .write_phone_ipt .ipt_email:disabled, #writeInfo .purchase .write_input .write_con .write_email .write_phone_ipt .ipt_email:disabled, #writeInfo .purchase .write_input .write_con .email_code .write_phone_ipt .ipt_email:disabled {
+  background: #fff;
+}
+
+#writeInfo .infoMain .write_input .write_con .write_phone .phone_tips, #writeInfo .infoMain .write_input .write_con .write_phone .kf_phone_tips, #writeInfo .infoMain .write_input .write_con .write_name .name_tips, #writeInfo .infoMain .write_input .write_con .write_name .kf_name_tips, #writeInfo .infoMain .write_input .write_con .write_phone .email_tips, #writeInfo .infoMain .write_input .write_con .write_email .phone_tips, #writeInfo .infoMain .write_input .write_con .write_email .email_tips, #writeInfo .infoMain .write_input .write_con .email_code .phone_tips, #writeInfo .infoMain .write_input .write_con .email_code .email_tips, #writeInfo .purchase .write_input .write_con .write_phone .phone_tips, #writeInfo .purchase .write_input .write_con .write_phone .email_tips, #writeInfo .purchase .write_input .write_con .write_email .phone_tips, #writeInfo .purchase .write_input .write_con .write_email .email_tips, #writeInfo .purchase .write_input .write_con .email_code .phone_tips, #writeInfo .purchase .write_input .write_con .email_code .email_tips {
+  margin-bottom: .24rem;
+  display: flex;
+  width: 100%;
+  height: .36rem;
+}
+
+#writeInfo .infoMain .write_input .write_con .write_phone .phone_tips .label_tips,
+#writeInfo .infoMain .write_input .write_con .write_phone .kf_phone_tips .label_tips,
+#writeInfo .infoMain .write_input .write_con .write_name .name_tips .label_tips,
+#writeInfo .infoMain .write_input .write_con .write_name .kf_name_tips .label_tips, #writeInfo .infoMain .write_input .write_con .write_phone .email_tips .label_tips, #writeInfo .infoMain .write_input .write_con .write_email .phone_tips .label_tips, #writeInfo .infoMain .write_input .write_con .write_email .email_tips .label_tips, #writeInfo .infoMain .write_input .write_con .email_code .phone_tips .label_tips, #writeInfo .infoMain .write_input .write_con .email_code .email_tips .label_tips, #writeInfo .purchase .write_input .write_con .write_phone .phone_tips .label_tips, #writeInfo .purchase .write_input .write_con .write_phone .email_tips .label_tips, #writeInfo .purchase .write_input .write_con .write_email .phone_tips .label_tips, #writeInfo .purchase .write_input .write_con .write_email .email_tips .label_tips, #writeInfo .purchase .write_input .write_con .email_code .phone_tips .label_tips, #writeInfo .purchase .write_input .write_con .email_code .email_tips .label_tips {
+  display: flex;
+  width: 1.6rem;
+  height: .48rem;
+}
+
+#writeInfo .infoMain .write_input .write_con .write_phone .phone_tips .phone_rule, 
+#writeInfo .infoMain .write_input .write_con .write_phone .kf_phone_tips .phone_rule, 
+#writeInfo .infoMain .write_input .write_con .write_name .name_tips .phone_rule, 
+#writeInfo .infoMain .write_input .write_con .write_name .kf_name_tips .phone_rule, #writeInfo .infoMain .write_input .write_con .write_phone .email_tips .phone_rule, #writeInfo .infoMain .write_input .write_con .write_email .phone_tips .phone_rule, #writeInfo .infoMain .write_input .write_con .write_email .email_tips .phone_rule, #writeInfo .infoMain .write_input .write_con .email_code .phone_tips .phone_rule, #writeInfo .infoMain .write_input .write_con .email_code .email_tips .phone_rule, #writeInfo .purchase .write_input .write_con .write_phone .phone_tips .phone_rule, #writeInfo .purchase .write_input .write_con .write_phone .email_tips .phone_rule, #writeInfo .purchase .write_input .write_con .write_email .phone_tips .phone_rule, #writeInfo .purchase .write_input .write_con .write_email .email_tips .phone_rule, #writeInfo .purchase .write_input .write_con .email_code .phone_tips .phone_rule, #writeInfo .purchase .write_input .write_con .email_code .email_tips .phone_rule {
+  height: 100%;
+  font-size: .24rem;
+  color: #FB483D;
+}
+
+#writeInfo .infoMain .write_input .write_con .email_code .write_phone_ipt .label_phone, 
+#writeInfo .purchase .write_input .write_con .email_code .write_phone_ipt .label_phone {
+  font-size: .28rem;
+}
+
+#writeInfo .infoMain .write_input .write_con .email_code .write_phone_ipt .sendEmail, #writeInfo .purchase .write_input .write_con .email_code .write_phone_ipt .sendEmail {
+  font-size: .28rem;
+  color: #9B9CA3;
+}
+
+#writeInfo .infoMain .write_input .write_con .email_code .write_phone_ipt .timedown, #writeInfo .purchase .write_input .write_con .email_code .write_phone_ipt .timedown {
+  display: none;
+  font-size: .28rem;
+  text-align: center;
+  color: #C0C4CC;
+}
+
+#writeInfo .infoMain .option_purchase, #writeInfo .purchase .option_purchase {
+  padding: .64rem .64rem .36rem;
+  font-size: .28rem;
+  color: #171826;
+}
+
+#writeInfo .infoMain .run_button, #writeInfo .infoMain .free_button, #writeInfo .infoMain .run_now_button, #writeInfo .purchase .run_button, #writeInfo .purchase .free_button, #writeInfo .purchase .run_now_button {
+  margin-top: .6rem;
+  width: 100%;
+  height: .92rem;
+  padding: 0 .32rem;
+}
+
+#writeInfo .infoMain .run_button .write_run, #writeInfo .infoMain .run_button .write_free, #writeInfo .infoMain .run_button .write_run_now, #writeInfo .infoMain .free_button .write_run, #writeInfo .infoMain .free_button .write_free, #writeInfo .infoMain .free_button .write_run_now, #writeInfo .infoMain .run_now_button .write_run, #writeInfo .infoMain .run_now_button .write_free, #writeInfo .infoMain .run_now_button .write_run_now, #writeInfo .purchase .run_button .write_run, #writeInfo .purchase .run_button .write_free, #writeInfo .purchase .run_button .write_run_now, #writeInfo .purchase .free_button .write_run, #writeInfo .purchase .free_button .write_free, #writeInfo .purchase .free_button .write_run_now, #writeInfo .purchase .run_now_button .write_run, #writeInfo .purchase .run_now_button .write_free, #writeInfo .purchase .run_now_button .write_run_now {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 100%;
+  height: 100%;
+  background: #2ABED1;
+  border-radius: .16rem;
+  color: #fff;
+  font-size: .36rem;
+}
+
+#writeInfo .infoMain .run_button .write_run:disabled, #writeInfo .infoMain .run_button .write_free:disabled, #writeInfo .infoMain .free_button .write_run:disabled, #writeInfo .infoMain .free_button .write_free:disabled, #writeInfo .infoMain .run_now_button .write_run:disabled, #writeInfo .infoMain .run_now_button .write_free:disabled, #writeInfo .purchase .run_button .write_run:disabled, #writeInfo .purchase .run_button .write_free:disabled, #writeInfo .purchase .free_button .write_run:disabled, #writeInfo .purchase .free_button .write_free:disabled, #writeInfo .purchase .run_now_button .write_run:disabled, #writeInfo .purchase .run_now_button .write_free:disabled {
+  background: #87DFEA;
+  color: #FFFFFF;
+  opacity: 0.65;
+}
+
+#writeInfo .purchase {
+  background: #fff;
+}

+ 0 - 0
src/web/staticres/structuredata/css/write_result.css → src/web/staticres/structuredata/mobile/css/write_result.css


+ 0 - 0
src/web/staticres/structuredata/iconfont/iconfont.css → src/web/staticres/structuredata/mobile/iconfont/iconfont.css


+ 0 - 0
src/web/staticres/structuredata/iconfont/iconfont.eot → src/web/staticres/structuredata/mobile/iconfont/iconfont.eot


+ 0 - 0
src/web/staticres/structuredata/iconfont/iconfont.ttf → src/web/staticres/structuredata/mobile/iconfont/iconfont.ttf


+ 0 - 0
src/web/staticres/structuredata/iconfont/iconfont.woff → src/web/staticres/structuredata/mobile/iconfont/iconfont.woff


+ 0 - 0
src/web/staticres/structuredata/iconfont/iconfont.woff2 → src/web/staticres/structuredata/mobile/iconfont/iconfont.woff2


+ 0 - 0
src/web/staticres/structuredata/image/01.png → src/web/staticres/structuredata/mobile/image/01.png


+ 0 - 0
src/web/staticres/structuredata/image/02.png → src/web/staticres/structuredata/mobile/image/02.png


+ 0 - 0
src/web/staticres/structuredata/image/03.png → src/web/staticres/structuredata/mobile/image/03.png


+ 0 - 0
src/web/staticres/structuredata/image/04.png → src/web/staticres/structuredata/mobile/image/04.png


+ 0 - 0
src/web/staticres/structuredata/image/Frame-1.png → src/web/staticres/structuredata/mobile/image/Frame-1.png


+ 0 - 0
src/web/staticres/structuredata/image/Frame-2.png → src/web/staticres/structuredata/mobile/image/Frame-2.png


+ 0 - 0
src/web/staticres/structuredata/image/Frame-3.png → src/web/staticres/structuredata/mobile/image/Frame-3.png


+ 0 - 0
src/web/staticres/structuredata/image/Frame.png → src/web/staticres/structuredata/mobile/image/Frame.png


+ 0 - 0
src/web/staticres/structuredata/image/T+2小时获取数据.png → src/web/staticres/structuredata/mobile/image/T+2小时获取数据.png


+ 0 - 0
src/web/staticres/structuredata/image/advantage.png → src/web/staticres/structuredata/mobile/image/advantage.png


+ 0 - 0
src/web/staticres/structuredata/image/api.png → src/web/staticres/structuredata/mobile/image/api.png


+ 0 - 0
src/web/staticres/structuredata/image/banner.png → src/web/staticres/structuredata/mobile/image/banner.png


+ 0 - 0
src/web/staticres/structuredata/image/bg.png → src/web/staticres/structuredata/mobile/image/bg.png


+ 0 - 0
src/web/staticres/structuredata/image/bg_info.png → src/web/staticres/structuredata/mobile/image/bg_info.png


+ 0 - 0
src/web/staticres/structuredata/image/biaoti.png → src/web/staticres/structuredata/mobile/image/biaoti.png


+ 0 - 0
src/web/staticres/structuredata/image/choose.png → src/web/staticres/structuredata/mobile/image/choose.png


+ 0 - 0
src/web/staticres/structuredata/image/company.png → src/web/staticres/structuredata/mobile/image/company.png


BIN
src/web/staticres/structuredata/mobile/image/correct-icon-mobile.png


+ 0 - 0
src/web/staticres/structuredata/image/dowhat.png → src/web/staticres/structuredata/mobile/image/dowhat.png


+ 0 - 0
src/web/staticres/structuredata/image/email.png → src/web/staticres/structuredata/mobile/image/email.png


BIN
src/web/staticres/structuredata/mobile/image/emaillogo.png


+ 0 - 0
src/web/staticres/structuredata/image/jiegouhuahou.png → src/web/staticres/structuredata/mobile/image/jiegouhuahou.png


+ 0 - 0
src/web/staticres/structuredata/image/phone.png → src/web/staticres/structuredata/mobile/image/phone.png


+ 0 - 0
src/web/staticres/structuredata/image/preview.png → src/web/staticres/structuredata/mobile/image/preview.png


+ 0 - 0
src/web/staticres/structuredata/image/qiyejuzhen.png → src/web/staticres/structuredata/mobile/image/qiyejuzhen.png


+ 0 - 0
src/web/staticres/structuredata/image/sprite_icon.png → src/web/staticres/structuredata/mobile/image/sprite_icon.png


+ 0 - 0
src/web/staticres/structuredata/image/what.png → src/web/staticres/structuredata/mobile/image/what.png


+ 0 - 0
src/web/staticres/structuredata/image/zhuangshiqiu.png → src/web/staticres/structuredata/mobile/image/zhuangshiqiu.png


+ 0 - 0
src/web/staticres/structuredata/image/字段准确率达98.12%.png → src/web/staticres/structuredata/mobile/image/字段准确率达98.12%.png


+ 0 - 0
src/web/staticres/structuredata/image/数据全面有保障.png → src/web/staticres/structuredata/mobile/image/数据全面有保障.png


+ 0 - 0
src/web/staticres/structuredata/image/获取方式多样化.png → src/web/staticres/structuredata/mobile/image/获取方式多样化.png


+ 0 - 0
src/web/staticres/structuredata/image/金刚区/appxiazai.png → src/web/staticres/structuredata/mobile/image/金刚区/appxiazai.png


+ 0 - 0
src/web/staticres/structuredata/image/金刚区/jiegouhuashuju.png → src/web/staticres/structuredata/mobile/image/金刚区/jiegouhuashuju.png


+ 0 - 0
src/web/staticres/structuredata/image/金刚区/kecheng.png → src/web/staticres/structuredata/mobile/image/金刚区/kecheng.png


+ 0 - 0
src/web/staticres/structuredata/image/金刚区/shangjiguanli.png → src/web/staticres/structuredata/mobile/image/金刚区/shangjiguanli.png


+ 0 - 0
src/web/staticres/structuredata/image/金刚区/shujubaogao.png → src/web/staticres/structuredata/mobile/image/金刚区/shujubaogao.png


+ 0 - 0
src/web/staticres/structuredata/image/金刚区/shujudaochu.png → src/web/staticres/structuredata/mobile/image/金刚区/shujudaochu.png


+ 0 - 0
src/web/staticres/structuredata/image/金刚区/zhongbiao.png → src/web/staticres/structuredata/mobile/image/金刚区/zhongbiao.png


+ 0 - 0
src/web/staticres/structuredata/js/common.js → src/web/staticres/structuredata/mobile/js/common.js


+ 0 - 0
src/web/staticres/structuredata/js/imageViewer.min.js → src/web/staticres/structuredata/mobile/js/imageViewer.min.js


+ 0 - 0
src/web/staticres/structuredata/js/jquery.min.js → src/web/staticres/structuredata/mobile/js/jquery.min.js


+ 0 - 0
src/web/staticres/structuredata/js/rem.js → src/web/staticres/structuredata/mobile/js/rem.js


+ 0 - 0
src/web/staticres/structuredata/js/weui.min.js → src/web/staticres/structuredata/mobile/js/weui.min.js


+ 76 - 0
src/web/staticres/structuredata/pc/css/reset_pc.css

@@ -0,0 +1,76 @@
+html, body, div, span, applet, object, iframe, 
+h1, h2, h3, h4, h5, h6, p, blockquote, pre, 
+a, abbr, acronym, address, big, cite, code, 
+del, dfn, em, font, img, ins, kbd, q, s, samp, 
+small, strike, strong, sub, sup, tt, var, 
+dl, dt, dd, ol, ul, li, 
+fieldset, form, label, legend, 
+table, caption, tbody, tfoot, thead, tr, th, td { 
+margin: 0; 
+padding: 0; 
+border: 0; 
+outline: 0; 
+font-weight: inherit; 
+font-style: inherit; 
+font-size: 100%; 
+font-family: inherit; 
+vertical-align: baseline; 
+-webkit-tap-highlight-color: transparent;
+} 
+:focus { 
+outline: 0; 
+} 
+body { 
+/*line-height: 1; */
+/*color: black; 
+background: white; */
+font-family: "Microsoft YaHei",sans-serif;
+font-size: 16px;
+-webkit-font-smoothing: antialiased;
+} 
+input{
+	font-family: "Microsoft YaHei",sans-serif;
+	-webkit-appearance: none;
+}
+ol, ul { 
+list-style: none; 
+} 
+button{ 
+	outline: none;border: none;
+	}
+table { 
+border-collapse: separate; 
+border-spacing: 0; 
+} 
+caption, th, td { 
+text-align: left; 
+font-weight: normal; 
+} 
+textarea { resize:none;-webkit-appearance: none; }
+img{border:0;}
+a{
+	text-decoration:none;
+	color: #000;
+	font-size: 14px;
+}
+/*selet 下拉三角改变*/
+/*select {border: none;border-radius: 0;appearance:none;-moz-appearance:none;-webkit-appearance:none;background:#ffffff url(../images/public-img/pub-Xsj.png) no-repeat 95% center;}*/
+/*清除ie的默认选择框样式清除,隐藏下拉箭头*/
+/*select::-ms-expand { display: none;}
+html{-webkit-text-size-adjust: none;}	*/	
+	
+/*a:link {color:#606060;} 
+a:visited {color:#606060;} 
+a:hover{color:#8cb91e;	text-decoration: underline;}
+a:active {color:#606060;}*/
+address,caption,cite,code,dfn,em,th,b,i {font-weight: normal;font-style: normal;}
+
+.clearfix:after {visibility: hidden; display: block; font-size: 0; content: " "; clear: both; height: 0; }
+.clearfix {*zoom:1; }
+.fl {float:left; }
+.fr {float: right; }
+.w {width: 1200px; margin: 0 auto;}
+/*去除下拉框*/
+/*input[type="search"]::-webkit-search-cancel-button{
+  display: none;
+}*/

File diff suppressed because it is too large
+ 22 - 0
src/web/staticres/structuredata/pc/css/stucturedPc.css


File diff suppressed because it is too large
+ 275 - 0
src/web/staticres/structuredata/pc/css/write_infor.css


BIN
src/web/staticres/structuredata/pc/image/01_arrow@2x.png


BIN
src/web/staticres/structuredata/pc/image/01_bg.png


BIN
src/web/staticres/structuredata/pc/image/01_text01@2x.png


BIN
src/web/staticres/structuredata/pc/image/02_icon01@2x.png


BIN
src/web/staticres/structuredata/pc/image/02_icon02@2x.png


BIN
src/web/staticres/structuredata/pc/image/02_image01.png


BIN
src/web/staticres/structuredata/pc/image/02_image02.png


BIN
src/web/staticres/structuredata/pc/image/02_image03.png


BIN
src/web/staticres/structuredata/pc/image/02_title@2x.png


BIN
src/web/staticres/structuredata/pc/image/03_image01@2x.png


BIN
src/web/staticres/structuredata/pc/image/03_image02@2x.png


BIN
src/web/staticres/structuredata/pc/image/03_image03@2x.png


BIN
src/web/staticres/structuredata/pc/image/03_image04@2x.png


Some files were not shown because too many files changed in this diff