Browse Source

分支合并

lianbingjie 4 years ago
parent
commit
80d4ba7492
6 changed files with 270 additions and 10 deletions
  1. 79 6
      src/config.json
  2. 1 0
      src/main.go
  3. 106 4
      src/service/action/info.go
  4. 24 0
      src/service/config/config.go
  5. 60 0
      src/service/util/mail.go
  6. BIN
      src/src.exe

+ 79 - 6
src/config.json

@@ -2,12 +2,12 @@
 	"webport": "8881",
 	"mongodb": {
 		"main": {
-			"address": "127.0.0.1:17080",
+			"address": "127.0.0.1:27080",
 	 		"size": 5,
 	 		"dbName": "qfw"
 		},
 		"log": {
-			"address": "127.0.0.1:17090",
+			"address": "127.0.0.1:27090",
 	 		"size": 5,
 	 		"dbName": "qfw",
 			"userName": "admin",
@@ -119,6 +119,34 @@
 			"enabled":true,
 			"force":false
 		},
+		"structedDataFlow":{
+			"passive":false,
+			"enabled":true,
+			"force":false,
+			"checkCode":true,
+			"ismail":true
+		},
+		"structedAPI":{
+			"passive":false,
+			"enabled":true,
+			"force":false,
+			"checkCode":true,
+			"ismail":true
+		},
+		"structedDailyLimit":{
+			"passive":false,
+			"enabled":true,
+			"force":false,
+			"checkCode":true,
+			"ismail":true
+		},
+		"structedData":{
+			"passive":false,
+			"enabled":true,
+			"force":false,
+			"checkCode":true,
+			"ismail":true
+		},
 		"ent_portrait_winnerNewMsg":{
 			"passive":false,
 			"enabled":true,
@@ -168,10 +196,55 @@
 	      	"passive":false,
 	      	"enabled":true,
 	      	"force":true
-	    }
-
+	    },
+		"jy-wxsearch-home-top":{
+			"passive":false,
+			"enabled":true,
+			"force":false
+		},
+		"jy-wxcontent-bottom":{
+			"passive":false,
+			"enabled":true,
+			"force":false
+		},
+		"jy-wxpush-middle":{
+			"passive":false,
+			"enabled":true,
+			"force":false
+		},
+		"jy-appsearch-home-top":{
+			"passive":false,
+			"enabled":true,
+			"force":false
+		},
+		"jyapp-wxcontent-bottom":{
+			"passive":false,
+			"enabled":true,
+			"force":false
+		},
+		"jyapp-wxpush-middle":{
+			"passive":false,
+			"enabled":true,
+			"force":false
+		}
     },
     "bindPhoneLimitDay":3,
     "probability":30,
-    "maxBaseNum":1000
-}
+    "maxBaseNum":1000,
+    "mail": [
+        {
+            "addr": "smtp.exmail.qq.com",
+            "port": 465,
+            "pwd": "ue9Rg9Sf4CVtdm5a",
+            "user": "public03@topnet.net.cn"
+        },
+        {
+            "addr": "smtp.exmail.qq.com",
+            "port": 465,
+            "pwd": "ue9Rg9Sf4CVtdm5a",
+            "user": "public03@topnet.net.cn"
+        }
+    ],
+    "webdomain": "https://web2-jytest.jydev.jianyu360.com",
+    "structedUploadA": "/structuredata/file/【剑鱼标讯】结构化招标数据.xlsx"
+}

+ 1 - 0
src/main.go

@@ -6,6 +6,7 @@ import (
 	_ "service/action"
 	"service/config"
 	_ "service/filter"
+	_ "service/util"
 
 	"github.com/go-xweb/xweb"
 )

+ 106 - 4
src/service/action/info.go

@@ -3,10 +3,13 @@ package action
 import (
 	. "api"
 	"encoding/json"
+	"fmt"
+	"log"
 	qu "qfw/util"
+	"qfw/util/jy"
 	"regexp"
 	. "service/config"
-
+	. "service/util"
 	"time"
 
 	"github.com/go-xweb/xweb"
@@ -17,6 +20,8 @@ type Info struct {
 	collectInfo     xweb.Mapper `xweb:"/collectInfo"`     //收集信息
 	echoInfo        xweb.Mapper `xweb:"/echoInfo"`        //回显信息
 	retainedCapital xweb.Mapper `xweb:"/retainedCapital"` //是否需要留资
+	sendMsg         xweb.Mapper `xweb:"/sendMsg"`         //发送验证码
+	checkCode       xweb.Mapper `xweb:"/checkCode"`       //验证验证码
 }
 
 var phoneReg = regexp.MustCompile("^[1][0-9][0-9]{9}$")
@@ -42,9 +47,31 @@ func (i *Info) CollectInfo() {
 		if infoMap["name"] == nil || infoMap["phone"] == nil || infoMap["source"] == nil {
 			return Result{Data: nil, Error_msg: Error_msg_1002}
 		}
+		//|| infoMap["agree"] == nil
 		//验证
-		phone := qu.ObjToString(infoMap["phone"]) //手机号
-		mail := qu.ObjToString(infoMap["mail"])   //邮箱
+		phone := qu.ObjToString(infoMap["phone"])   //手机号
+		mail := qu.ObjToString(infoMap["mail"])     //邮箱
+		source := qu.ObjToString(infoMap["source"]) //来源
+		//手机号验证码验证
+		if Sysconfig.Source[source].CheckCode {
+			code := qu.ObjToString(infoMap["code"]) //手机号验证码
+			var checkCodeBool = false
+			//非绑定手机号需要验证
+			log.Println(phone, "-------", i.Session().Get("sales_MyPhone"))
+			if i.Session().Get("sales_MyPhone") != nil && phone == i.Session().Get("sales_MyPhone").(string) {
+				checkCodeBool = true
+			}
+			//验证短信验证码
+			if !checkCodeBool && i.Session().Get("sales_phoneNum") != nil && i.Session().Get("sales_MsgCode") != nil {
+				if phone == i.Session().Get("sales_phoneNum").(string) && code == i.Session().Get("sales_MsgCode").(string) {
+					checkCodeBool = true
+				}
+			}
+			if !checkCodeBool {
+				return Result{Error_code: -1, Error_msg: "手机号验证码错误", Data: false}
+			}
+		}
+		log.Println("++++++++++++++++++++111233333+++++++++++++++++++++++++++", Sysconfig.Source[source].CheckCode)
 		infoMap["createtime"] = time.Now().Unix()
 		//获取用户id
 		userid, _ := i.GetSession("userId").(string)
@@ -64,6 +91,12 @@ func (i *Info) CollectInfo() {
 			"$set": infoMap,
 		}, true, false) {
 			Whether.AfterRetainedCapital(userid)
+			go i.ClearCheckCodeSess() //清除手机验证码缓存
+			//是否发送样例数据到邮件
+			log.Println("ismail:", Sysconfig.Source[source].Ismail)
+			if Sysconfig.Source[source].Ismail {
+				go SendStructedDataByEmail(mail, GmailAuth)
+			}
 			return Result{Error_code: 1, Error_msg: "", Data: true}
 		}
 		return Result{Error_code: -1, Error_msg: "保存失败", Data: false}
@@ -78,7 +111,11 @@ func (i *Info) EchoInfo() {
 		data := map[string]interface{}{}
 		if userinfo, ok := MQFW.FindById("user", userid, `{"s_phone":1,"s_m_phone":1,"s_myemail":1,"s_company":1,"o_jy":1,"o_vipjy":1}`); userinfo != nil && ok && len(*userinfo) > 0 {
 			s_phone := qu.ObjToString((*userinfo)["s_phone"])
-			data["phone"] = qu.If(s_phone == "", qu.ObjToString((*userinfo)["s_m_phone"]), s_phone)
+			phone := qu.If(s_phone == "", qu.ObjToString((*userinfo)["s_m_phone"]), s_phone)
+			if phone != "" {
+				i.SetSession("sales_MyPhone", phone)
+			}
+			data["phone"] = phone
 			mail := qu.ObjToString((*userinfo)["s_myemail"])
 			//获取邮箱 1.超级订阅邮箱、订阅邮箱、数据导出填写邮箱
 			if mail == "" {
@@ -109,7 +146,11 @@ func (i *Info) EchoInfo() {
 			delete((*rdata)[0], "createtime")
 			delete((*rdata)[0], "client")
 			data = (*rdata)[0]
+			if data["phone"] != nil && qu.ObjToString(data["phone"]) != "" {
+				i.SetSession("sales_MyPhone", qu.ObjToString(data["phone"]))
+			}
 		}
+		log.Println("--11111---", i.Session().Get("sales_MyPhone"))
 		if len(data) > 0 {
 			return Result{Error_code: 1, Error_msg: "", Data: data}
 		}
@@ -134,3 +175,64 @@ func (i *Info) RetainedCapital() {
 		"fource":          Sysconfig.Source[source] != nil && Sysconfig.Source[source].Force,
 	}})
 }
+
+//发送验证码
+func (i *Info) SendMsg() error {
+	defer qu.Catch()
+	userid := qu.ObjToString(i.GetSession("userId"))
+	var returnMap = map[string]interface{}{}
+	returnMap["success"] = false
+	if userid != "" {
+		session := i.Session()
+		phoneNum := i.GetString("phoneNum")
+		lastSendMsgTime := qu.Int64All(session.Get("sales_lastSendMsgTime"))
+		//当前时间-上次发送时间>60s
+		if time.Now().Unix()-lastSendMsgTime > 60 {
+			if phoneReg.MatchString(phoneNum) {
+				returnMap["success"] = true
+				//生成随机验证码
+				MsgCode := qu.GetRandom(6)
+				session.Set("sales_MsgCode", MsgCode)
+				session.Set("sales_phoneNum", phoneNum)
+				session.Set("sales_lastSendMsgTime", time.Now().Unix())
+				param := make(map[string]string)
+				param["code"] = MsgCode
+				go func() {
+					jy.SendSMS("2828060", phoneNum, param)
+				}()
+				fmt.Println("手机号码", phoneNum, "验证码", MsgCode)
+			} else {
+				returnMap["msg"] = "phoneErr"
+			}
+		} else {
+			returnMap["msg"] = "sended"
+			returnMap["second"] = 60 - (time.Now().Unix() - lastSendMsgTime)
+		}
+	} else {
+		returnMap["msg"] = "outTime"
+	}
+	i.ServeJson(Result{Data: returnMap})
+	return nil
+}
+
+//手机验证码验证
+func (i *Info) CheckCode() error {
+	defer qu.Catch()
+	var returnMap = map[string]interface{}{}
+	returnMap["flag"] = false
+	code := i.GetString("code")
+	phoneNum := i.GetString("phoneNum")
+	if (i.Session().Get("sales_MyPhone") != nil && phoneNum == i.Session().Get("sales_MyPhone").(string)) || (phoneNum == i.Session().Get("sales_phoneNum").(string) && code == i.Session().Get("sales_MsgCode").(string)) {
+		returnMap["flag"] = true
+	}
+	i.ServeJson(Result{Data: returnMap})
+	return nil
+}
+
+//清除手机验证码信息
+func (i *Info) ClearCheckCodeSess() {
+	i.DelSession("sales_MyPhone")
+	i.DelSession("sales_phoneNum")
+	i.DelSession("sales_MsgCode")
+	i.DelSession("sales_lastSendMsgTime")
+}

+ 24 - 0
src/service/config/config.go

@@ -4,6 +4,7 @@ import (
 	"log"
 	mg "mongodb"
 	"qfw/util"
+	"qfw/util/mail"
 	"qfw/util/mysql"
 	"qfw/util/redis"
 )
@@ -27,6 +28,14 @@ type config struct {
 	Probability       float64
 	Frequency         string
 	MaxBaseNum        int
+	Mail              []struct {
+		Addr string
+		Port int
+		Pwd  string
+		User string
+	}
+	Webdomain       string
+	StructedUploadA string
 }
 
 type Attribute struct {
@@ -36,6 +45,8 @@ type Attribute struct {
 	Frequency string
 	Once      bool
 	Exclude   []string
+	CheckCode bool
+	Ismail    bool
 }
 
 type mgoConf struct {
@@ -64,6 +75,7 @@ var (
 	Mysql     *mysql.Mysql
 	MQFW      mg.MongodbSim
 	Mgo_Log   mg.MongodbSim
+	GmailAuth []*mail.GmailAuth
 )
 
 func init() {
@@ -108,5 +120,17 @@ func init() {
 			}
 			Mysql.Init()
 		}
+		//
+		if len(Sysconfig.Mail) > 0 {
+			for _, v := range Sysconfig.Mail {
+				mail := &mail.GmailAuth{
+					SmtpHost: v.Addr,
+					SmtpPort: v.Port,
+					User:     v.User,
+					Pwd:      v.Pwd,
+				}
+				GmailAuth = append(GmailAuth, mail)
+			}
+		}
 	}
 }

+ 60 - 0
src/service/util/mail.go

@@ -0,0 +1,60 @@
+package util
+
+import (
+	"fmt"
+	"log"
+	"qfw/util/mail"
+	"regexp"
+	. "service/config"
+	"time"
+)
+
+func SendStructedDataByEmail(email string, auth []*mail.GmailAuth) bool {
+	var uploadAddress = Sysconfig.Webdomain + Sysconfig.StructedUploadA
+	var imagesAddress = Sysconfig.Webdomain + "/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
+}
+
+//
+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)
+}

BIN
src/src.exe