package front import ( "encoding/base64" "encoding/json" "fmt" "html/template" "jfw/config" "jfw/jylabutil" "jfw/jyutil" "jfw/public" "jfw/wx" "log" "math/rand" "net/url" "qfw/util" "qfw/util/elastic" "qfw/util/redis" "regexp" "strconv" "strings" "sync" "time" "ucbsutil/cassandra" "github.com/go-xweb/httpsession" "github.com/go-xweb/xweb" . "github.com/thinxer/go-word2vec" "gopkg.in/mgo.v2/bson" ) const ( pc_pageSize = 50 //招标搜索分页--每页显示数量 pc_maxPageNum = 10 //招标搜索分页--最大页数 wx_maxPageNum = 20 wx_pageSize = 50 bidSearch_field_1 = `"_id","title","publishtime","toptype","subtype","type","area","s_subscopeclass"` bidSearch_field = bidSearch_field_1 + `,"bidopentime","winner","buyer","bidamount","budget","projectname","projectcode","projectinfo"` bidSearch_sort = `{"publishtime":-1}` ) var M *Model var recomKWChan chan bool = make(chan bool, 1) var listlock = &sync.Mutex{} func init() { M, _ = Load("./zb.bin") } //剑鱼推送三级页点赞暂弃 改成剑鱼实验室点赞功能 func (m *Front) Praise() error { defer util.Catch() var flag = "F" var praiseflag = true thistype := m.GetString("type") uod := m.GetString("uod") util.Try(func() { pdata, _ := mongodb.FindOneByField("praise", `{"s_type":"`+thistype+`"}`, `{"s_no":1}`) if len(*pdata) != 0 { if uod == "U" { praiseflag = mongodb.Update("praise", `{"s_type":"`+thistype+`"}`, `{ "$inc" : { "s_no" : 1 }}`, false, false) } else { praiseflag = mongodb.Update("praise", `{"s_type":"`+thistype+`"}`, `{ "$inc" : { "s_no" : -1 }}`, false, false) } if praiseflag { flag = "T" } } }, func(e interface{}) { log.Println("剑鱼实验室点赞出错", e) }) m.ServeJson(map[string]interface{}{ "flag": flag, }) return nil } func (m *Front) Getpraise() error { defer util.Catch() thistype := m.GetString("type") praiseno := 125 switchstatus := 0 if m.Session().Get("userId") == nil { return m.Redirect("/swordfish/about") } util.Try(func() { data := make(map[string]interface{}) pdata, _ := mongodb.FindOneByField("praise", `{"s_type":"`+thistype+`"}`, `{"s_no":1}`) userid := m.Session().Get("userId") tmp, _ := mongodb.FindById("user", userid.(string), `{"i_smartset":1,"i_dataexport":1,"i_supersearch":1,"i_entsesearch":1,"i_followent":1,"i_smartsetiknow":1,"i_dataexportiknow":1,"i_supersearchiknow":1,"i_entsesearchiknow":1,"i_followentiknow":1}`) if thistype == "zndy" { data["s_name"] = "剑鱼实验室-智能订阅" switchstatus = util.IntAll((*tmp)["i_smartset"]) } else if thistype == "sjdc" { data["s_name"] = "剑鱼实验室-数据导出" switchstatus = util.IntAll((*tmp)["i_dataexport"]) } else if thistype == "cjss" { data["s_name"] = "剑鱼实验室-超级搜索" switchstatus = util.IntAll((*tmp)["i_supersearch"]) } else if thistype == "zbqy" { data["s_name"] = "剑鱼实验室-中标企业" switchstatus = util.IntAll((*tmp)["i_entsesearch"]) } else if thistype == "gzqy" { data["s_name"] = "剑鱼实验室-关注企业" switchstatus = util.IntAll((*tmp)["i_followent"]) } if len(*pdata) == 0 { data["s_type"] = thistype data["s_no"] = 125 data["l_date"] = time.Now().Unix() mongodb.Save("praise", data) } else { praiseno = util.IntAll((*pdata)["s_no"]) } }, func(e interface{}) { log.Println("剑鱼实验室取赞出错", e) }) m.ServeJson(map[string]interface{}{ "praiseno": praiseno, "switchstatus": switchstatus, }) return nil } //剑鱼pc首页 func (m *Front) NewSordfish() error { ispc, _ := m.GetInteger("ispc") var shareid = m.GetString("id") if len(shareid) == 0 { shareid = "10" //fmt.Sprintf("%s%d", config.Seoconfig["jysy"].(string)+fmt.Sprintf("%d", time.Now().UnixNano())[8:14], rand.Intn(9)) } else { redis.Del("other", "jypcindex") } m.T["logid"] = config.Seoconfig["jysy"].(string) m.T["shareid"] = se.EncodeString(shareid) regex, _ := regexp.Compile("(Android|Mobile)") if ispc == 0 && len(regex.FindAllString(m.Header("User-Agent"), -1)) > 0 { m.T["s_m_openid"] = util.ObjToString(m.GetSession("s_m_openid")) m.T["signature"] = wx.SignJSSDK(m.Site() + m.Url()) m.T["nickname"] = util.ObjToString(m.GetSession("s_nickname")) m.T["avatar"] = util.ObjToString(m.GetSession("s_avatar")) return m.Render("/pc/mobileindex.html", &m.T) } else { if ret := redis.Get("other", "jypcindex"); ret != nil { return m.SetBody([]byte(ret.(string))) } else { m.DisableHttpCache() lastBids := elastic.GetPage("bidding", "bidding", "{}", bidSearch_sort, bidSearch_field_1, 0, 18) if lastBids != nil && len(*lastBids) > 0 { public.BidListConvert("", lastBids) lbnHtml, olHtml := structureLastBidsHtml(lastBids) m.T["lbnHtml"] = lbnHtml m.T["olHtml"] = olHtml } content, _ := m.Render4Cache("/pc/index.html", &m.T) redis.Put("other", "jypcindex", string(content), 60*60*2) return m.SetBody(content) } } return m.Render("/pc/index.html", &m.T) } func structureLastBidsHtml(lastBidNews *[]map[string]interface{}) (string, string) { var tmp int = 0 var olCount int = 0 var lbnHtml string = "" var olHtml string = `` } return lbnHtml, olHtml } func detailLikeRpc(Interest []string, res *[]map[string]interface{}, flag bool) (mcontent map[string]interface{}) { //defer util.Catch() str := fmt.Sprintf("
根据您设置的关键词(%s),给您推送以下招标信息:
", strings.Join(Interest, ";")) //发送内容组合 i := 0 o_pushinfo := map[string]interface{}{} var details []string v := *res bmatch := false for _, k2 := range v { title := strings.Replace(k2["title"].(string), "\n", "", -1) province := util.ObjToString(k2["area"]) if province != "" && province != "A" { title = `[` + province + `]` + title } i++ str += "
" + fmt.Sprintf("%d", i) + "." + title + "
" o_pushinfo[strconv.Itoa(i)] = map[string]interface{}{ "publishtime": k2["publishtime"], "stype": k2["type"], "topstype": k2["toptype"], "substype": k2["subtype"], } if flag { highlight, _ := k2["highlight"].(map[string][]string) detail := "" if len(highlight["detail"]) > 0 { detail = highlight["detail"][0] } details = append(details, detail) } } mcontent = map[string]interface{}{} if len(o_pushinfo) > 0 { bmatch = true mcontent["o_pushinfo"] = o_pushinfo mcontent["s_content"] = str mcontent["s_words"] = Interest } mcontent["bmatch"] = bmatch if flag { mcontent["details"] = details } return } //跳转到pc查询剑鱼信息列表 func (m *Front) Searchinfolist(p string) error { defer util.Catch() return m.Redirect("/jylab/supsearch/index.html") var shareid = m.GetString("id") if len(shareid) == 0 { shareid = "10" //fmt.Sprintf("%s%d", config.Seoconfig["jysslby"].(string)+fmt.Sprintf("%d", time.Now().UnixNano())[8:14], rand.Intn(9)) } m.T["logid"] = config.Seoconfig["jysslby"].(string) m.T["shareid"] = se.EncodeString(shareid) keywords := m.GetString("keywords") searchvalue := public.FilteKey(m.GetString("searchvalue")) area := m.GetString("area") publishtime := m.GetString("publishtime") toptype := m.GetString("toptype") subtype := m.GetString("subtype") industry := m.GetString("industry") minprice := m.GetString("minprice") //最低价格 maxprice := m.GetString("maxprice") //最高价格 selectType := m.GetString("selectType") selectTypesess := m.GetSession("selectType") if selectTypesess != nil && selectTypesess != "" { selectType = selectTypesess.(string) } if selectType == "" { selectType = "all" } var status = 1 var count, totalPage int64 tabularflag := "" var list *[]map[string]interface{} pages := make([]interface{}, 0) if len(searchvalue) > 0 || len(industry) > 0 { count, totalPage, list = getBidSearchData(searchvalue, area, publishtime, subtype, industry, minprice, maxprice, 0, true, selectType, "") //} else if m.Method() == "POST" { //status = 2 //count, list = getLastNewsData(searchvalue, area, publishtime, subtype, industry, minprice, maxprice, "", 0, true, false) } else { status = 2 if redis.Get("other", "index_list") == nil { intns := make([]int, 0) for i := 0; i < 10; i++ { if len(intns) == 0 { intns = append(intns, rand.Intn(100)) } else { for { v := rand.Intn(intns[(i-1)] + 100) if v-intns[(i-1)] >= 30 { intns = append(intns, v) break } } } } for i := 0; i < 10; i++ { count, list = getLastNewsData(searchvalue, area, publishtime, subtype, industry, minprice, maxprice, tabularflag, intns[i], true, false) for k, v := range *list { v["k"] = (k + 1) + i*50 t := time.Unix(util.Int64All(v["publishtime"]), 0) v["timetemp"] = fmt.Sprint(util.Int64All(v["publishtime"])) v["_id"] = util.EncodeArticleId2ByCheck(v["_id"].(string)) v["time"] = util.TimeDiff(t) var stp = "" if v["subtype"] != nil { stp, _ = v["subtype"].(string) } else { stp = "" } if stp == "" && v["toptype"] != nil { stp, _ = v["toptype"].(string) } area, _ := v["area"].(string) v["href"] = util.CommonEncodeArticle("bdprivate", (util.GetRandom(22))) v["stypeadd"], v["areaadd"], _ = classify(stp, area, "") } pages = append(pages, list) } m.DisableHttpCache() redis.Put("other", "index_list", pages, 60*60*24*2) } } if status == 2 { //&& m.Method() == "GET" { pages := redis.Get("other", "index_list").([]interface{}) p := util.IntAll(p) if p <= 0 || p > 10 { p = 1 } if p-1 <= 0 { m.T["prev"] = 1 } else { m.T["prev"] = p - 1 } if p+1 >= 11 { m.T["next"] = 10 } else { m.T["next"] = p + 1 } m.T["cur"] = p m.T["list"] = pages[p-1] isopen, _ := m.GetInteger("isopen") m.T["isopen"] = isopen m.T["area"] = area m.T["publishtime"] = publishtime m.T["timeslot"] = m.GetString("timeslot") m.T["toptype"] = toptype m.T["subtype"] = subtype m.T["count"] = count m.T["totalPage"] = totalPage m.T["status"] = status m.T["keywords"] = keywords m.T["searchvalue"] = searchvalue m.T["selectType"] = selectType m.T["login"] = m.Session().Get("user") return m.Render("/pc/bidsearch_static.html", &m.T) } else { if list != nil { for _, v := range *list { v["_id"] = util.EncodeArticleId2ByCheck(v["_id"].(string)) stp, _ := v["subtype"].(string) if stp == "" { stp, _ = v["toptype"].(string) } area, _ := v["area"].(string) v["stypeadd"], v["areaadd"], _ = classify(stp, area, "") //正文匹配检索关键词 highlight, _ := v["highlight"].(map[string][]string) detail := "" for _, val := range highlight["detail"] { detail += public.ClearHtml.ReplaceAllString(val, "") } v["href"] = util.CommonEncodeArticle("bdprivate", (util.GetRandom(22))) v["detail"] = detail } } m.T["list"] = list isopen, _ := m.GetInteger("isopen") m.T["isopen"] = isopen m.T["area"] = area m.T["publishtime"] = publishtime m.T["timeslot"] = m.GetString("timeslot") m.T["toptype"] = toptype m.T["subtype"] = subtype m.T["count"] = count m.T["status"] = status m.T["keywords"] = keywords m.T["searchvalue"] = searchvalue m.T["selectType"] = selectType m.T["login"] = m.Session().Get("user") m.SetSession("paramkey", keywords) if publishtime == "lately-7" { m.SetSession("parampublishtime", "最近7天") } else if publishtime == "lately-30" { m.SetSession("parampublishtime", "最近30天") } else if publishtime == "thisyear" { m.SetSession("parampublishtime", "去年") } else { m.SetSession("parampublishtime", publishtime) } m.SetSession("paramarea", area) if subtype != "" { m.SetSession("paraminfotype", subtype) } else { m.SetSession("paraminfotype", toptype) } return m.Render("/pc/bidsearch.html", &m.T) } } //ajax分页请求 func (m *Front) PcAjaxReq() { tabularflag := m.GetString("tabularflag") if tabularflag == "Y" { //判断用户是否登录进行表格查询,否则返回基本数据 if m.GetSession("userId") != nil { //验证用户是否开启超级搜索进行表格查询,否则返回基本数据 if !jylabutil.IsAuthorized(m.GetSession("userId").(string), "i_supersearch") { tabularflag = "" } } else { tabularflag = "" } } reqType := m.GetString("reqType") //获取最新招标信息 if reqType == "lastBids" { //ls := elastic.GetPage(INDEX, TYPE, "{}", bidSearch_sort, bidSearch_field_1, 0, 18) //jyutil.BidListConvert("", ls) ls := Newbids("") if len(ls) >= 18 { ls = ls[:18] } m.ServeJson(map[string]interface{}{ "list": ls, }) return } else if reqType == "rewardText" { rewardText, _ := getRewardText() m.Write(rewardText) return } currentPage, _ := m.GetInteger("pageNumber") if currentPage > pc_maxPageNum { currentPage = pc_maxPageNum } start := (currentPage - 1) * pc_pageSize area := m.GetString("area") subtype := m.GetString("subtype") publishtime := m.GetString("publishtime") selectType := m.GetString("selectType") industry := strings.TrimSpace(m.GetString("industry")) minprice := m.GetString("minprice") //最低价格 maxprice := m.GetString("maxprice") //最高价格 m.SetSession("selectType", selectType) if selectType == "" { selectType = "all" } _, a_word, s_word := public.InterceptSearchKW(m.GetString("searchvalue"), selectType == "all", len(industry) == 0) var list *[]map[string]interface{} var secondList []map[string]interface{} var count, totalPage int64 status, _ := m.GetInteger("status") isLimit := 1 limitFlag := false secondFlag := "" secondKWS := "" pcAjaxFlag := "" if len(s_word) > 0 || len(industry) > 0 { if reqType == "filter" { if status == 1 { count, totalPage, list = getBidSearchData(s_word, area, publishtime, subtype, industry, minprice, maxprice, 0, true, selectType, tabularflag) } else if status == 2 { //count, list = getLastNewsData(searchvalue, area, publishtime, subtype, industry, minprice, maxprice, tabularflag, 0, true, true) } } else if reqType == "bidSearch" { //全文检索限制 if selectType == "all" { limitFlag = public.Lst.Flag isLimit = public.Lst.IsLimited(m.Request, m.ResponseWriter, m.Session()) if isLimit == 1 { //没有被限制 defer public.Lst.Limit() } } if isLimit == 1 { if limitFlag { if start == 0 { limit_count := public.Lst.TotalPage * pc_pageSize count, totalPage, list = getBidSearchData_new(s_word, area, publishtime, subtype, industry, minprice, maxprice, 0, limit_count, true, selectType, tabularflag) if totalPage > int64(public.Lst.TotalPage) { totalPage = int64(public.Lst.TotalPage) } if count > int64(limit_count) { count = int64(limit_count) } } } else { count, totalPage, list = getBidSearchData(s_word, area, publishtime, subtype, industry, minprice, maxprice, start, true, selectType, tabularflag) } listSize := 0 if list != nil { listSize = len(*list) } if len([]rune(s_word)) > 3 && int(count) < pc_pageSize && start == 0 { secondKWS = public.HttpEs(s_word, "ik_smart", config.Sysconfig["elasticsearch"].(string)) findfields := `"title"` qstr := getSearchQuery(secondKWS, industry, minprice, maxprice, findfields, getBidSearchQuery(area, publishtime, subtype)) secondLimit := 2*pc_pageSize - int(count) secRel := elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, bidSearch_field, 0, secondLimit, 0, false) if secRel != nil { public.BidListConvert(industry, secRel) } if list != nil { for _, v := range *list { for n, m := range *secRel { if util.ObjToString(v["_id"]) == util.ObjToString(m["_id"]) { *secRel = append((*secRel)[0:n], (*secRel)[n+1:]...) break } } } *list = append(*list, *secRel...) } else { list = secRel } if len(*secRel) > 0 { if secondKWS != "" { s_word += "+" + secondKWS } secondFlag = "T" pcAjaxFlag = "T" } } SaveUserSearchLog(m.Request, util.ObjToString(m.GetSession("userId")), -1, "pc", "超级搜索", map[string]interface{}{ "search_word": s_word, "search_area": area, "search_price": []string{minprice, maxprice}, "search_publishtime": publishtime, "search_type": subtype, "search_industry": industry, "pagenum": currentPage, "pagesize": listSize, }) } } else if reqType == "lastNews" { _, list = getLastNewsData(s_word, area, publishtime, subtype, industry, minprice, maxprice, tabularflag, start, false, true) } } if list != nil && len(*list) > 0 { for _, v := range *list { if v["_id"] != nil { v["_id"] = util.EncodeArticleId2ByCheck(v["_id"].(string)) } stp, ok := v["subtype"].(string) if ok && stp == "" { stp = v["toptype"].(string) } area, ok := v["area"].(string) indtry := util.ObjToString(v["industry"]) v["stypeadd"], v["areaadd"], v["indadd"] = classify(stp, area, indtry) //正文匹配检索关键词 highlight, _ := v["highlight"].(map[string][]string) detail := "" for _, val := range highlight["detail"] { detail += public.ClearHtml.ReplaceAllString(val, "") } v["detail"] = detail v["href"] = util.EncodeArticleId2ByCheck(util.GetRandom(20)) } if secondFlag != "" { if len(*list) > pc_pageSize { secondList = (*list)[pc_pageSize:] *list = (*list)[:pc_pageSize] totalPage = 2 } else { totalPage = 1 } } } m.ServeJson(map[string]interface{}{ "limitFlag": limitFlag, "status": isLimit, "list": list, "count": count, "totalPage": totalPage, "interceptWord": a_word, "searchvalue": s_word, "secondFlag": secondFlag, "secondList": secondList, "pcAjaxFlag": pcAjaxFlag, }) } /** **页面搜索 **/ func getBidSearchData(searchvalue, area, publishtime, subtype, industry, minprice, maxprice string, start int, isGetCount bool, selectType, tabularflag string) (count, totalPage int64, list *[]map[string]interface{}) { count, totalPage, list = getBidSearchData_new(searchvalue, area, publishtime, subtype, industry, minprice, maxprice, start, pc_pageSize, isGetCount, selectType, tabularflag) return } func getBidSearchData_new(searchvalue, area, publishtime, subtype, industry, minprice, maxprice string, start, pageSize int, isGetCount bool, selectType, tabularflag string) (count, totalPage int64, list *[]map[string]interface{}) { //selectType:全文搜索(all)、标题搜索(title) findfields := `"title"` if selectType == "all" { findfields = `"title","detail"` } qstr := getSearchQuery(searchvalue, industry, minprice, maxprice, findfields, getBidSearchQuery(area, publishtime, subtype)) if isGetCount && qstr != "" && start == 0 { count = elastic.Count(INDEX, TYPE, qstr) } if !isGetCount || count > 0 || start > 0 { var repl *[]map[string]interface{} if selectType == "all" { //全文搜索 if tabularflag == "Y" { repl = elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, bidSearch_field, start, pageSize, 115, true) } else { repl = elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, bidSearch_field_1, start, pageSize, 115, true) } } else { //标题搜索 if tabularflag == "Y" { repl = elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, bidSearch_field, start, pageSize, 0, false) } else { repl = elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, bidSearch_field_1, start, pageSize, 0, false) } } if repl != nil && *repl != nil && len(*repl) > 0 { public.BidListConvert(industry, repl) list = repl } } limitCount := int64(pc_pageSize * pc_maxPageNum) if count > limitCount { count = limitCount } totalPage = (count + int64(pc_pageSize) - 1) / int64(pc_pageSize) return } func getLastNewsData(searchvalue, area, publishtime, subtype, industry, minprice, maxprice, tabularflag string, start int, isGetCount bool, highlight bool) (count int64, list *[]map[string]interface{}) { //最新招标信息 findfields := `"title"` qstr := getSearchQuery(searchvalue, industry, minprice, maxprice, findfields, getBidSearchQuery(area, publishtime, subtype)) if isGetCount { count = elastic.Count(INDEX, TYPE, qstr) } if !isGetCount || count > 0 { if tabularflag == "Y" { repl := elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, bidSearch_field, start, pc_pageSize, 115, highlight) if repl != nil && *repl != nil && len(*repl) > 0 { public.BidListConvert(industry, repl) list = repl } } else { repl := elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, bidSearch_field_1, start, pc_pageSize, 115, highlight) if repl != nil && *repl != nil && len(*repl) > 0 { public.BidListConvert(industry, repl) list = repl } } } limitCount := int64(pc_pageSize * pc_maxPageNum) if count > limitCount { count = limitCount } return } func getBidSearchQuery(area, publishtime, subtype string) string { query := `` if area != "" { query += `{"terms":{"area":[` for k, v := range strings.Split(area, ",") { if k > 0 { query += `,` } query += `"` + v + `"` } query += `]}}` } if publishtime != "" { if len(query) > 0 { query += "," } starttime, endtime := "", "" now := time.Now() if publishtime == "lately-7" { //最近7天 starttime = fmt.Sprint(time.Date(now.Year(), now.Month(), now.Day()-7, 0, 0, 0, 0, time.Local).Unix()) } else if publishtime == "lately-30" { //最近30天 starttime = fmt.Sprint(time.Date(now.Year(), now.Month(), now.Day()-30, 0, 0, 0, 0, time.Local).Unix()) } else if publishtime == "thisyear" { //去年 starttime = fmt.Sprint(time.Date(now.Year()-1, 1, 1, 0, 0, 0, 0, time.Local).Unix()) endtime = fmt.Sprint(time.Date(now.Year(), 1, 1, 0, 0, 0, 0, time.Local).Unix()) } else { starttime = strings.Split(publishtime, "_")[0] endtime = strings.Split(publishtime, "_")[1] etTime := time.Now() if endtime != "" { et, _ := strconv.ParseInt(endtime, 0, 64) etTime = time.Unix(et, 0) } endtime = fmt.Sprint(time.Date(etTime.Year(), etTime.Month(), etTime.Day()+1, 0, 0, 0, 0, time.Local).Unix()) } query += `{"range":{"publishtime":{` if starttime != "" { query += `"gte":` + starttime } if starttime != "" && endtime != "" { query += `,` } if endtime != "" { query += `"lt":` + endtime } query += `}}}` } if subtype != "" { if len(query) > 0 { query += "," } query += `{"terms":{"subtype":[` for k, v := range strings.Split(subtype, ",") { if k > 0 { query += `,` } query += `"` + v + `"` } query += `]}}` } return query } func getLastNewsQuery(area, publishtime, subtype, industry string) string { query := `` if area != "" { query += `"area":{"$in":[` for k, v := range strings.Split(area, ",") { if k > 0 { query += `,` } query += `"` + v + `"` } query += `]}` } if publishtime != "" { if len(query) > 0 { query += "," } starttime, endtime := "", "" now := time.Now() if publishtime == "lately-7" { //最近7天 starttime = fmt.Sprint(time.Date(now.Year(), now.Month(), now.Day()-7, 0, 0, 0, 0, time.Local).Unix()) } else if publishtime == "lately-30" { //最近30天 starttime = fmt.Sprint(time.Date(now.Year(), now.Month(), now.Day()-30, 0, 0, 0, 0, time.Local).Unix()) } else if publishtime == "thisyear" { //去年 starttime = fmt.Sprint(time.Date(now.Year()-1, 1, 1, 0, 0, 0, 0, time.Local).Unix()) endtime = fmt.Sprint(time.Date(now.Year(), 1, 1, 0, 0, 0, 0, time.Local).Unix()) } else { starttime = strings.Split(publishtime, "_")[0] endtime = strings.Split(publishtime, "_")[1] et, _ := strconv.ParseInt(endtime, 0, 64) etTime := time.Unix(et, 0) endtime = fmt.Sprint(time.Date(etTime.Year(), etTime.Month(), etTime.Day()+1, 0, 0, 0, 0, time.Local).Unix()) } if starttime != "" && endtime != "" { query += `"$and":[{"publishtime":{"$gte":` + starttime + `}},{"publishtime":{"$lt":` + endtime + `}}]` } else if starttime != "" && endtime == "" { query += `"publishtime":{"$gte":` + starttime + `}` } else if starttime == "" && endtime != "" { query += `"publishtime":{"$lt":` + endtime + `}` } } if subtype != "" { if len(query) > 0 { query += "," } query += `"subtype":{"$in":[` for k, v := range strings.Split(subtype, ",") { if k > 0 { query += `,` } query += `"` + v + `"` } query += `]}` } // if industry != "" { if len(query) > 0 { query += "," } query += `"s_subscopeclass":{"$in":[` for k, v := range strings.Split(industry, ",") { if k > 0 { query += `,` } query += `"` + v + `"` } query += `]}` } query = `{` + query + `}` return query } //进入订阅页面 func (m *Front) Getpage() error { defer util.Catch() s_type := "" userid := util.ObjToString(m.GetSession("userId")) var msgset map[string]interface{} if userid != "" { one, _ := mongodb.FindById("user", userid, `{"o_jy":1}`) msg := (*one)["o_jy"] if msg != "" && msg != nil { msgset = msg.(map[string]interface{}) } s_type = "tender" } m.ServeJson(map[string]interface{}{ "msgset": msgset, "s_type": s_type, }) return nil } //搜索结果,ajax分页请求 func (m *Front) WxsearchlistPaging() { defer util.Catch() userid := m.GetSession("userId") var list *[]map[string]interface{} var secRel *[]map[string]interface{} pageNum, _ := m.GetInteger("pageNum") if userid != nil && pageNum <= wx_maxPageNum { open_supersearch := jylabutil.IsAuthorized(userid.(string), "i_supersearch") //历史记录和订阅查询 one, _ := mongodb.FindOneByField("user", bson.M{"_id": bson.ObjectIdHex(userid.(string))}, `{"o_jy":1}`) history := redis.GetStr("other", "s_"+userid.(string)) arrs := strings.Split(history, ",") searchvalue := strings.TrimSpace(m.GetString("searchvalue")) var b_word, a_word string isLimit := 1 limitFlag := false secondKWS := "" secondFlag := "" var secondList []map[string]interface{} if searchvalue != "" { selectType := m.GetString("selectType") subtype := m.GetString("subtype") scope := m.GetString("scope") publishtime := m.GetString("publishtime") industry := strings.TrimSpace(m.GetString("industry")) m.SetSession("industry", industry) minprice := m.GetString("minprice") maxprice := m.GetString("maxprice") //全文检索限制 if selectType == "all" { limitFlag = public.Lst.Flag isLimit = public.Lst.IsLimited(m.Request, m.ResponseWriter, m.Session()) if isLimit == 1 { //没有被限制 defer public.Lst.Limit() } } if isLimit == 1 { if limitFlag { if pageNum == 1 { if open_supersearch { list, b_word, a_word, _ = getWxsearchlistData_new(searchvalue, scope, publishtime, subtype, industry, minprice, maxprice, pageNum, public.Lst.TotalPage*wx_pageSize, selectType, bidSearch_field) } else { list, b_word, a_word, _ = getWxsearchlistData_new(searchvalue, scope, publishtime, subtype, "", "", "", pageNum, public.Lst.TotalPage*wx_pageSize, selectType, bidSearch_field) } } } else { if open_supersearch { list, b_word, a_word, _ = getWxsearchlistData(searchvalue, scope, publishtime, subtype, industry, minprice, maxprice, pageNum, selectType, bidSearch_field) } else { list, b_word, a_word, _ = getWxsearchlistData(searchvalue, scope, publishtime, subtype, "", "", "", pageNum, selectType, bidSearch_field) } } listSize := 0 if list != nil { listSize = len(*list) } if len([]rune(searchvalue)) > 3 && listSize < pc_pageSize && pageNum == 1 { secondKWS = public.HttpEs(searchvalue, "ik_smart", config.Sysconfig["elasticsearch"].(string)) findfields := `"title"` qstr := getSearchQuery(secondKWS, industry, minprice, maxprice, findfields, getBidSearchQuery(scope, publishtime, subtype)) // var secondCount int64 = 0 // if qstr != "" { // secondCount = elastic.Count(INDEX, TYPE, qstr) // } secondLimit := 2*pc_pageSize - listSize secRel = elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, bidSearch_field, 0, secondLimit, 0, false) if secRel != nil { public.BidListConvert(industry, secRel) for _, v := range *secRel { v["_id"] = util.EncodeArticleId2ByCheck(util.ObjToString(v["_id"])) } } if list != nil { for _, v := range *list { for n, m := range *secRel { if util.ObjToString(v["_id"]) == util.ObjToString(m["_id"]) { *secRel = append((*secRel)[0:n], (*secRel)[n+1:]...) break } } } *list = append(*list, *secRel...) } else { list = secRel } if len(*secRel) > 0 { if secondKWS != "" { b_word += " " + secondKWS } secondFlag = "T" if len(*list) > pc_pageSize && selectType == "title" { secondList = (*list)[pc_pageSize:] *list = (*list)[:pc_pageSize] } } } SaveUserSearchLog(m.Request, util.ObjToString(m.GetSession("userId")), -1, "wx", "超级搜索", map[string]interface{}{ "search_word": searchvalue, "search_area": scope, "search_price": []string{minprice, maxprice}, "search_publishtime": publishtime, "search_type": subtype, "search_industry": industry, "pagenum": pageNum, "pagesize": listSize, }) } //新增历史记录 if history == "" { arrs = make([]string, 0) } for k, v := range arrs { if v == strings.Trim(searchvalue, " ") { arrs = append(arrs[:k], arrs[k+1:]...) break } } arrs = append(arrs, searchvalue) if len(arrs) > 5 { arrs = arrs[1:6] } redis.Del("other", "s_"+userid.(string)) redis.Put("other", "s_"+userid.(string), strings.Join(arrs, ","), -1) } m.T["history"] = arrs if one != nil && len(*one) > 0 { o_jy, _ := (*one)["o_jy"].(map[string]interface{}) a_key, _ := o_jy["a_key"].([]interface{}) var keys []interface{} for _, v := range a_key { keyMap, _ := v.(map[string]interface{}) key, _ := keyMap["key"].([]interface{}) keys = append(keys, key) } m.T["msgset"] = keys } hasNextPage := list != nil && len(*list) == wx_pageSize && pageNum < wx_maxPageNum if limitFlag { hasNextPage = false } m.ServeJson(map[string]interface{}{ "limitFlag": limitFlag, "status": isLimit, "list": list, "hasNextPage": hasNextPage, "history": m.T["history"], "msgset": m.T["msgset"], "interceptWord": a_word, "keyWord": b_word, "secondFlag": secondFlag, "secondList": secondList, }) } } //微信端删除历史搜索 func (m *Front) DelWxHistorySearch() { defer util.Catch() //定义一个无用参数作为返回值 var rt string = "rt" userId := m.GetSession("userId") history := redis.GetStr("other", "s_"+userId.(string)) if len(history) > 0 || history != "" { redis.Del("other", "s_"+userId.(string)) } m.ServeJson(map[string]interface{}{ "rt": rt, }) } //微信端搜索 func getWxsearchlistData(keywords, scope, publishtime, subtype, industry, minprice, maxprice string, pageNum int, selectType, field string) (list *[]map[string]interface{}, b_word, a_word, s_word string) { return getWxsearchlistData_new(keywords, scope, publishtime, subtype, industry, minprice, maxprice, pageNum, wx_pageSize, selectType, field) } func getWxsearchlistData_new(keywords, scope, publishtime, subtype, industry, minprice, maxprice string, pageNum, pageSize int, selectType, field string) (list *[]map[string]interface{}, b_word, a_word, s_word string) { b_word, a_word, s_word = public.InterceptSearchKW(keywords, selectType == "all", len(industry) == 0) if len(b_word) == 0 { return list, b_word, a_word, s_word } findfields := `"title"` if selectType == "all" { findfields = `"title","detail"` } qstr := getSearchQuery(s_word, industry, minprice, maxprice, findfields, getBidSearchQuery(scope, publishtime, subtype)) if selectType == "all" { //全文搜索 list = elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, field, (pageNum-1)*pageSize, pageSize, 100, true) } else { //标题搜索 list = elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, field, (pageNum-1)*pageSize, pageSize, 100, false) } if list != nil { public.BidListConvert(industry, list) for _, v := range *list { v["_id"] = util.EncodeArticleId2ByCheck(util.ObjToString(v["_id"])) } } return list, b_word, a_word, s_word } //查看原文跳转 func (m *Front) VisitRedirect() { defer util.Catch() sid := m.GetString("id") // regex, _ := regexp.Compile("(Android|Mobile)") // if len(regex.FindAllString(m.Header("User-Agent"), -1)) <= 0 { // m.Redirect("/article/p/" + sid + ".html") // } surl := m.GetString("url") sds := m.GetString("keywords") m.T["keywords"] = sds shareopenid := m.GetString("openid") if shareopenid != "" { m.T["shareopenid"] = shareopenid } myopenid, _ := m.Session().Get("s_m_openid").(string) if myopenid == "" { myopenid = shareopenid m.T["openid"] = myopenid //"-1" } else { m.T["openid"] = se.EncodeString(myopenid) //"-1" } mynickname, _ := m.Session().Get("s_nickname").(string) myavatar, _ := m.Session().Get("s_avatar").(string) m.T["nickname"] = mynickname m.T["avatar"] = myavatar m.T["signature"] = wx.SignJSSDK(m.Site() + m.Url()) userId, _ := m.GetSession("userId").(string) var obj map[string]interface{} obj = wxvisitD(sid, userId, myopenid) if len(obj) > 0 { //获取打赏文案 m.T["rewardText"], m.T["advertText"] = getRewardText() m.T["obj"] = obj m.Render("/weixin/wxinfocontent.html", &m.T) return } if surl != "" { m.Redirect(surl) } } func wxvisitD(sid, userId, openId string) (objdata map[string]interface{}) { defer util.Catch() var obj map[string]interface{} if len(sid) > 5 { brobj, ok := mongodb.Find("bidding_rec", bson.M{"s_id": sid}, `{"l_recoverydate":-1}`, nil, false, 0, 1) if ok && (*brobj) != nil && len(*brobj) == 1 && (*brobj)[0] != nil { obj = (*brobj)[0] } else { aobj, ok := mongodb.FindById("bidding", sid, nil) if ok && (aobj == nil || *aobj == nil || len(*aobj) == 0) { aobj, ok = mongodb.FindById("bidding_back", sid, nil) } //aobj, ok := elastic.GetByIdField("bidding", "bidding", sid, ""), true obj = *aobj } if ok && obj != nil && len(obj) >= 3 { fwt := util.ObjToString(obj["subtype"]) ltfd := getLowestField(fwt) if ltfd != "" { obj["fwtsname"] = obj[ltfd] obj["fwtscode"] = ltfd } obj["_id"] = util.EncodeArticleId2ByCheck(sid) obj["url"] = obj["href"] pt := obj["publishtime"] obj["l_publishtime"] = pt obj["publishtime"] = util.FormatDateWithObj(&pt, util.Date_Full_Layout) //查询是否关注 obj["followFlag"] = false obj["hasSession"] = false var infoformat = obj["infoformat"] if infoformat != nil && infoformat != "" { obj["infoformat"] = util.IntAll(infoformat) } if userId != "" { pcode, _ := obj["projectcode"].(string) pname, _ := obj["projectname"].(string) titleTmp, _ := obj["title"].(string) titleTmp = public.ClearHtml.ReplaceAllString(titleTmp, "") obj["followFlag"], obj["followId"] = MFollow(userId, pname, pcode, titleTmp, openId) obj["hasSession"] = true } if strings.Trim(util.ObjToString(obj["detail"]), " ") == "" { obj["detail"] = "" } } } return obj } //获取权重最低的字段 func getLowestField(subtype string) string { fields := util.ObjToMap(config.Sysconfig["recoveryField"]) result := "" if subtype != "招标" { subtype = "其他" } var fieldsArr = util.ObjArrToMapArr((*fields)[subtype].([]interface{})) i := getWeightRandom(fieldsArr) for k, v := range fieldsArr { if k == i { result = util.ObjToString(v["field"]) } } return result } //根据权重随机获取数组的索引 func getWeightRandom(array []map[string]interface{}) int { var weightSum, stepWeightSum float64 for _, v := range array { weightSum += v["proportion"].(float64) } randVal := rand.New(rand.NewSource(time.Now().UnixNano())).Float64() for i := 0; i < len(array); i++ { stepWeightSum += array[i]["proportion"].(float64) if randVal <= stepWeightSum/weightSum { return i } } return 0 } func MFollow(userId, pname, pcode, title, openid string) (bool, string) { defer util.Catch() var followId string followFlag := false follows, ok := mongodb.Find("follow_project", `{"s_userid":"`+userId+`"}`, `{"_id":1,"s_projectname":1,"s_projectcode":1}`, nil, false, -1, -1) if ok && follows != nil && len(*follows) > 0 { for _, v := range *follows { pc, _ := v["s_projectcode"].(string) pn, _ := v["s_projectname"].(string) if (pc != "" && pc == pcode) || (pn != "" && pn == pname) { followFlag = true followId = util.EncodeArticleId2ByCheck(util.BsonIdToSId(v["_id"])) break } } } return followFlag, followId } //查看原文跳转 //增加查询备份库数据、增加关键词、描述逻辑处理 func (m *Front) PcVisitRedirect(sid string) { defer util.Catch() kds := m.GetString("kds") m.T["keywords"] = kds sid = strings.Split(sid, "_")[0] //sid = util.DecodeArticleId(sid)[0] var shareid = m.GetString("id") if len(shareid) == 0 { shareid = "10" //fmt.Sprintf("%s%d", config.Seoconfig["jysskzy"].(string)+fmt.Sprintf("%d", time.Now().UnixNano())[8:14], rand.Intn(9)) } m.T["logid"] = config.Seoconfig["jysskzy"].(string) m.T["shareid"] = se.EncodeString(shareid) if ret := redis.Get("other", "jypcdetail_"+sid+kds); ret != nil { m.SetBody([]byte(ret.(string))) return } else { m.DisableHttpCache() data := elastic.GetByIdField("bidding", "bidding", sid, `"href"`) if data == nil || len(*data) == 0 { m.Render("/_error.html") return } href, _ := (*data)["href"].(string) href = strings.Replace(href, "\n", "", -1) if href != "" && !strings.HasPrefix(href, "http") { href = "http://" + href } po, bo, wo, obj := pcVRT(sid, "") if obj != nil && len(obj) > 0 { if len(po) > 0 { m.T["projectOther"] = po } if len(bo) > 0 { m.T["buyerOther"] = bo } if len(wo) > 0 { m.T["winnerOther"] = wo } obj["url"] = href m.T["obj"] = obj content, _ := m.Render4Cache("/pc/biddetail.html", &m.T) redis.Put("other", "jypcdetail_"+sid+kds, string(content), 60*60*24) m.SetBody(content) return } if href != "" { m.Redirect(href) } } } //pc三级页跳转 //20170821增加查询字段s_subscopeclass func pcVRT(sid, industry string) (po, bo, wo []map[string]interface{}, objdata map[string]interface{}) { defer util.Catch() var projectOther, buyerOther, winnerOther []map[string]interface{} var obj map[string]interface{} if len(sid) > 5 { coll := "bidding" brobj, ok := mongodb.Find("bidding_rec", bson.M{"s_id": sid}, `{"l_recoverydate":-1}`, nil, false, 0, 1) if ok && (*brobj) != nil && len(*brobj) == 1 && (*brobj)[0] != nil { obj = (*brobj)[0] } else { aobj, ok := mongodb.FindById(coll, sid, nil) if ok && (aobj == nil || *aobj == nil || len(*aobj) == 0) { coll = "bidding_back" aobj, ok = mongodb.FindById(coll, sid, nil) } obj = *aobj } //obj, ok := elastic.GetByIdField("bidding", "bidding", sid, ""), true if ok && obj != nil && len(obj) > 0 { //DealInfo(obj, coll) //fwt := util.ObjToString(obj["fieldweights"]) //lwf := util.ObjToString(obj["lastwrongfield"]) //ltfd := getLowestField(fwt, lwf) //if ltfd != "" { // obj["fwtsname"] = obj[ltfd] // obj["fwtscode"] = ltfd //} obj["_id"] = util.EncodeArticleId2ByCheck(sid) var infoformat = obj["infoformat"] if infoformat != nil && infoformat != "" { obj["infoformat"] = util.IntAll(infoformat) } if strings.Trim(util.ObjToString(obj["detail"]), " ") == "" { obj["detail"] = "" } titleTmp := util.ObjToString(obj["title"]) obj["title"] = public.ClearHtml.ReplaceAllString(titleTmp, "") area := obj["area"].(string) finalType, _ := obj["subtype"].(string) if finalType == "" { finalType = util.ObjToString(obj["toptype"]) } if finalType == "" { finalType = util.ObjToString(obj["type"]) if finalType == "bid" { finalType = "中标" } else if finalType == "tender" { finalType = "招标" } else { finalType = "" } } if industry == "" { industry = util.ObjToString(obj["s_subscopeclass"]) if industry != "" { if strings.Contains(industry, "它") { industry = strings.Replace(industry, "它", "他", -1) } industry = strings.Split(industry, ",")[0] } } obj["stypeadd"], obj["areaadd"], obj["indadd"] = classify(finalType, area, industry) //增加处理信息逻辑 objdata = obj queryStr := "" commonQuery := func(mustquery string) *[]map[string]interface{} { return elastic.GetPage("bidding", "bidding", queryStr, bidSearch_sort, `"_id","title","publishtime","toptype","subtype","type","area","href","s_subscopeclass"`, 0, 11) } //同一个项目的其他招标信息 projectName, _ := obj["projectname"].(string) projectCode, _ := obj["projectcode"].(string) if projectName != "" || projectCode != "" { if projectName != "" && projectCode != "" { queryStr = `{"$or":[{"TERM_projectname":"` + projectName + `"},{"TERM_projectcode":"` + projectCode + `"}]}` } else if projectName != "" && projectCode == "" { queryStr = `{"TERM_projectname":"` + projectName + `"}` } else if projectName == "" && projectCode != "" { queryStr = `{"TERM_projectcode":"` + projectCode + `"}` } projectOther = bidDataConvert(sid, commonQuery(queryStr)) } //同一个业主最近的其他招标信息 buyer, _ := obj["buyer"].(string) //采购单位 if buyer != "" { queryStr = `{"TERM_buyer":"` + buyer + `"}` buyerOther = bidDataConvert(sid, commonQuery(queryStr)) } //同一中标人最近中标的其他信息 subtype, _ := obj["subtype"].(string) //信息类型 winner, _ := obj["winner"].(string) //中标人 if winner != "" && subtype == "中标" { queryStr = `{"TERM_s_winner":"` + winner + `"}` winnerOther = bidDataConvert(sid, commonQuery(queryStr)) } } } return projectOther, buyerOther, winnerOther, objdata } //数据转换 func bidDataConvert(id string, datas *[]map[string]interface{}) (array []map[string]interface{}) { if datas == nil || len(*datas) == 0 { return array } index := 0 public.BidListConvert("", datas) for _, v := range *datas { if len(array) >= 10 { break } _id, _ := v["_id"].(string) if _id == id { continue } v["_id"] = util.EncodeArticleId2ByCheck(_id) area, _ := v["area"].(string) if area == "A" { v["area"] = "" } tp, _ := v["subtype"].(string) if tp == "" { tp, _ = v["toptype"].(string) } if tp == "" { tp, _ = v["type"].(string) if tp == "bid" { tp = "中标" } else if tp == "tender" { tp = "招标" } else { tp = "" } } indtry := util.ObjToString(v["industry"]) v["stypeadd"], v["areaadd"], v["indadd"] = classify(tp, area, indtry) v["type"] = tp diff := "" publishtime, _ := v["publishtime"].(float64) if publishtime != 0 { diff = util.TimeDiff(time.Unix(util.Int64All(publishtime), 0)) v["pbtime"] = util.Int64All(publishtime) } v["publishtime"] = diff index++ v["index"] = index array = append(array, v) } return array } //剑鱼保存 func (m *Front) AjaxReq() error { defer util.Catch() reqType := m.GetString("reqType") var flag = "n" switch reqType { case "feedback": //意见反馈 data := make(map[string]interface{}) userId, ok := m.GetSession("userId").(string) if !ok || userId == "" { break } userInfo, ok := mongodb.FindById("user", userId, nil) if !ok { break } data["i_type"] = 8 data["s_fromName"] = m.GetString("fromName") value := m.GetString("value") if len([]rune(value)) > 200 { value = util.SubString(value, 0, 200) } data["s_remark"] = value s_nickname, _ := (*userInfo)["s_nickname"].(string) s_name, _ := (*userInfo)["s_name"].(string) s_phone, _ := (*userInfo)["s_phone"].(string) if s_name != "" { data["s_submitname"] = s_name } else if s_nickname != "" { data["s_submitname"] = s_nickname } else if s_phone != "" { data["s_submitname"] = s_phone } else { data["s_submitname"] = userId } data["s_submitid"] = userId data["s_title"] = m.GetString("title") data["i_status"] = 0 if s_nickname != "" { //昵称 data["s_username"] = s_nickname } else if s_name != "" { //s_name data["s_username"] = s_name } else if s_phone != "" { //s_name data["s_username"] = s_phone } else { //s_name data["s_username"] = userId } data["l_submitdate"] = time.Now().Unix() data["s_source"] = m.GetString("source") data["s_fkid"] = m.GetString("fkid") data["s_from"] = "wx" id := mongodb.Save("interaction", data) if len(id) > 0 { flag = "y" } break case "subscribe": //直接订阅 if userid := m.GetSession("userId"); userid != nil { r, _ := mongodb.FindById("user", userid.(string), `{"o_jy":1}`) o_jy, _ := (*r)["o_jy"].(map[string]interface{}) a_key, _ := o_jy["a_key"].([]interface{}) keysArray := processKeyword(m.GetString("keys")) if keysArray == nil { break } var isExists bool for _, v := range a_key { //count := 0 //for _, kay := range keysArray { keyMap, _ := v.(map[string]interface{}) key, _ := keyMap["key"].([]interface{}) kystr := "" for _, ky := range key { kystr = kystr + " " + ky.(string) } if strings.TrimSpace(m.GetString("keys")) == strings.TrimSpace(kystr) { isExists = true flag = "y" break } //} //if count == len(keysArray) { // isExists = true // flag = "y" // break //} } //如果不存在 if !isExists { if len(a_key) >= 10 { flag = "o" } else { if mongodb.UpdateById("user", userid, bson.M{ "$push": bson.M{"o_jy.a_key": bson.M{"key": keysArray}}, "$set": bson.M{"i_ts_guide": 1, "o_jy.l_modifydate": time.Now().Unix()}, }) { flag = "y" } } } } break } m.ServeJson(map[string]interface{}{ "flag": flag, }) return nil } const ( INDEX = "bidding" TYPE = "bidding" FINDF = `"title"` ) //预览结果 func (m *Front) WxpushView() error { defer util.Catch() userid := util.ObjToString(m.GetSession("userId")) openid := util.ObjToString(m.GetSession("s_m_openid")) if openid == "" || userid == "" { return m.Redirect("/swordfish/share/-1") } a_key, list := getWxPushViewData(userid, "", 1) public.BidListConvert("", list) m.T["firstPage"] = list m.T["hasNextPage"] = list != nil && len(*list) == wx_pageSize m.T["pageSize"] = wx_pageSize m.T["a_key"] = a_key mynickname, _ := m.Session().Get("s_nickname").(string) myavatar, _ := m.Session().Get("s_avatar").(string) m.T["nickname"] = mynickname m.T["avatar"] = myavatar m.T["signature"] = wx.SignJSSDK(m.Site() + m.Url()) m.T["openid"] = se.EncodeString(openid) return m.Render("/weixin/resultpreview.html", &m.T) } func (m *Front) WxpushViewPaging() { defer util.Catch() var list *[]map[string]interface{} pageNum, _ := m.GetInteger("pageNum") if userid := m.Session().Get("userId"); userid != nil && pageNum <= wx_maxPageNum { _, list = getWxPushViewData(userid.(string), "", pageNum) } public.BidListConvert("", list) m.ServeJson(map[string]interface{}{ "list": list, "hasNextPage": list != nil && len(*list) == wx_pageSize && pageNum < wx_maxPageNum, }) } func getWxPushViewData(userid, allquery string, pageNum int) (keys []interface{}, list *[]map[string]interface{}) { if userid == "" { return } tmp, ok := mongodb.FindById("user", userid, `{"_id":1,"o_jy":1,"i_smartset": 1}`) if !ok || tmp == nil || len(*tmp) == 0 { return } o_jy := (*tmp)["o_jy"].(map[string]interface{}) a_key, _ := o_jy["a_key"].([]interface{}) if len(a_key) == 0 { return } i_smartset := util.IntAll((*tmp)["i_smartset"]) findf := `"title"` if i_smartset == 1 { //开启智能订阅 findf = `"title","detail"` } for _, v := range a_key { keyMap, _ := v.(map[string]interface{}) key, _ := keyMap["key"].([]interface{}) keys = append(keys, key) } //field := `"_id","title","publishtime","toptype","subtype","type","area","href","areaval"` var allkeys []elastic.KeyConfig //用户配置 _bs, err := json.Marshal(a_key) if err == nil { json.Unmarshal(_bs, &allkeys) } list = elastic.GetResForJY(INDEX, TYPE, allkeys, allquery, findf, `{"publishtime":"desc"}`, bidSearch_field, (pageNum-1)*wx_pageSize, wx_pageSize) if list != nil { for _, v := range *list { v["_id"] = util.EncodeArticleId2ByCheck(util.ObjToString(v["_id"])) } } return } func (m *Front) Guide(sign string) error { defer util.Catch() if m.Session().Get("userId") == nil || m.Session().Get("s_m_openid") == nil { return m.Redirect("/swordfish/share/-1") } m.T["signature"] = wx.SignJSSDK(m.Site() + m.Url()) mynickname, _ := m.Session().Get("s_nickname").(string) myavatar, _ := m.Session().Get("s_avatar").(string) m.T["nickname"] = mynickname m.T["avatar"] = myavatar myopenid, _ := m.Session().Get("s_m_openid").(string) m.T["openid"] = se.EncodeString(myopenid) m.T["sign"] = sign if sign == "other" { userInfo, ok := mongodb.FindById("user", m.GetSession("userId").(string), `{"o_jy_msgset":1}`) if ok { m.T["msgset"] = (*userInfo)["o_jy_msgset"] } } if sign == "share" { return m.Render("/weixin/wxshareguide.html", &m.T) } else { return m.Render("/weixin/wxindex.html", &m.T) } } func (m *Front) Share(openids string) error { return m.Redirect("/swordfish/about") // defer util.Catch() var openid = "" var jy_code = "" if openids != "-1" { wxid_code := strings.Split(openids, "__") if len(wxid_code) > 0 { openid = wxid_code[0] jy_code = wxid_code[1] } } m.T["openid"] = openid m.T["jy_code"] = jy_code m.T["signature"] = wx.SignJSSDK(m.Site() + m.Url()) mynickname, _ := m.Session().Get("s_nickname").(string) myavatar, _ := m.Session().Get("s_avatar").(string) m.T["nickname"] = mynickname m.T["avatar"] = myavatar return m.Render("/weixin/wxshare.html", &m.T) } func (m *Front) WxpushAjaxReq() error { defer util.Catch() vsid := m.GetString("vsid") pdate := m.GetString("_id") // log.Println("vsid=", vsid) // log.Println("pdate=", pdate) if util.Int64All(pdate) > 0 { visit := map[string]interface{}{ "openid": m.Session().Get("userId"), "pdate": pdate, "vsid": vsid, "date": time.Now(), "vtime": time.Now().Unix(), } cassandra.Save("jy_pushvisit", visit) } /*else { index, _ := m.GetInteger("index") // log.Println("index", index) mongodb.Update("wxpush", `{"_id":"`+pdate+`"}`, map[string]interface{}{ "$addToSet": map[string]interface{}{"a_visitedindex": index}, "$set": map[string]interface{}{ "a_visitedtime." + fmt.Sprint(index): time.Now().Unix(), // "a_visitedindex": index, }, }, false, false) }*/ return nil } // func (m *Front) About() error { defer util.Catch() code := m.GetString("code") //渠道 // 点浏览器打开时保持在原页面 come := m.GetString("come") flag := m.GetString("flag") if !mobileReg.MatchString(m.UserAgent()) && flag == "" { return m.Redirect("/front/aboutus.html" + util.If(code != "", "?code="+code, "").(string)) } myopenid, _ := m.Session().Get("s_m_openid").(string) mynickname, _ := m.Session().Get("s_nickname").(string) myavatar, _ := m.Session().Get("s_avatar").(string) if myopenid == "" { if m.GetString("state") == "wx" { //微信跳回来的 code := m.GetString("code") if code != "" { openid := jyutil.Getopenid(code) userInfo, ok := mongodb.FindOneByField("user", map[string]interface{}{ "s_m_openid": openid, "i_appid": 2, }, `{"_id":-1,"s_nickname":1,"s_m_openid":1}`) if ok && userInfo != nil && len(*userInfo) > 0 { mynickname, _ = (*userInfo)["s_nickname"].(string) myopenid, _ = (*userInfo)["s_m_openid"].(string) } } } else { if public.CheckWxBrowser(m.Request) { //所有参数都不再使用,跳到微信验证用户 return m.Redirect(fmt.Sprintf(config.Wxoauth, url.QueryEscape(m.Site()+m.Url()), "wx"), 302) } } } param := m.GetString("param") var openid = "" var activecode = "" //分享后微信新用户打开落地页 if param != "-1" { wxid_code := strings.Split(param, "__") if len(wxid_code) > 0 { openid = wxid_code[0] } if len(wxid_code) > 1 { activecode = wxid_code[1] } } qrcodeType := m.GetString("qrcodeType") if qrcodeType != "" { activecode = qrcodeType } m.T["code"] = code m.T["source"] = m.GetString("source") //分享类型 app or 公众号 m.T["activecode"] = activecode m.T["nickname"] = mynickname m.T["avatar"] = myavatar if openid == "" && myopenid != "" { m.T["openid"] = se.EncodeString(myopenid) } else { m.T["openid"] = openid } m.T["signature"] = wx.SignJSSDK(m.Site() + m.Url()) m.T["flag"] = flag m.T["come"] = come if come == "1" && !public.CheckWxBrowser(m.Request) { return m.Redirect("https://www.jianyu360.com/jyapp/free/download/normal?source=weixinAutoRpl") } var open_infoid = "" if m.GetString("source") == "open_infocontent" { open_infoid = m.GetString("o") m.T["open_infoid"] = open_infoid m.T["code"] = "open00" + open_infoid return m.Render("/weixin/about.html") } else { if myopenid == "" { if public.CheckWxBrowser(m.Request) { if code == "" { m.T["code"] = "wx01" //新用户微信访问,统计app下载量 } return m.Render("/weixin/sharePage.html") } else { return m.Redirect("/active/appExt/sh001") } } else { if public.CheckWxBrowser(m.Request) { m.T["isWeixin"] = 1 } else { m.T["isWeixin"] = 0 } return m.Render("/weixin/about.html") } } } // func (m *Front) Shareabout(openids string) error { defer util.Catch() var openid = "" if openids != "-1" { wxid_code := strings.Split(openids, "__") if len(wxid_code) > 0 { openid = wxid_code[0] } } myopenid, _ := m.Session().Get("s_m_openid").(string) mynickname, _ := m.Session().Get("s_nickname").(string) myavatar, _ := m.Session().Get("s_avatar").(string) if openid == "" && myopenid != "" { m.T["openid"] = se.EncodeString(myopenid) } else { m.T["openid"] = openid } m.T["nickname"] = mynickname m.T["avatar"] = myavatar m.T["signature"] = wx.SignJSSDK(m.Site() + m.Url()) if public.CheckWxBrowser(m.Request) { m.T["isWeixin"] = 1 } else { m.T["isWeixin"] = 0 } return m.Render("/weixin/about.html") } // func (m *Front) Aboutsearch() error { myopenid, _ := m.Session().Get("s_m_openid").(string) m.T["openid"] = se.EncodeString(myopenid) mynickname, _ := m.Session().Get("s_nickname").(string) myavatar, _ := m.Session().Get("s_avatar").(string) m.T["nickname"] = mynickname m.T["avatar"] = myavatar m.T["signature"] = wx.SignJSSDK(m.Site() + m.Url()) m.Render("/weixin/aboutsearch.html", &m.T) return nil } //剑鱼微信查询保存网站 func (m *Front) AboutSR() error { defer util.Catch() var flag = "N" var sn = m.GetString("searchname") var tp = m.GetString("tp") if len(sn) > 0 { switch tp { case "S": //用户查询网站是否被收录 userId, ok := m.GetSession("userId").(string) if !ok || userId == "" { break } res, err := mongodb.FindOne("bidurlinfo", bson.M{"$or": []bson.M{bson.M{"s_name": sn}, bson.M{"s_url": sn}}}) if err { if len(*res) > 0 { flag = "T" } } break case "I": //用户提交数据 data := make(map[string]interface{}) userId, ok := m.GetSession("userId").(string) if !ok || userId == "" { break } userInfo, ok := mongodb.FindById("user", userId, nil) if !ok { break } data["i_type"] = 8 data["s_remark"] = sn if (*userInfo)["s_name"] != nil { data["s_submitname"] = (*userInfo)["s_name"].(string) } data["s_submitid"] = userId data["s_title"] = m.GetString("title") data["i_status"] = 0 if (*userInfo)["s_nickname"] != nil { //昵称 data["s_username"] = (*userInfo)["s_nickname"].(string) } else if (*userInfo)["s_name"] != nil { //s_name data["s_username"] = (*userInfo)["s_name"].(string) } data["l_submitdate"] = time.Now().Unix() data["s_source"] = m.GetString("source") data["s_from"] = "wx" id := mongodb.Save("interaction", data) if len(id) > 0 && len(sn) > 0 { flag = "T" } break } } m.ServeJson(map[string]interface{}{ "flag": flag, }) return nil } //手动删除30天无更新数据 func (m *Front) DelOL() error { defer util.Catch() var ids []bson.ObjectId var flag = "F" var arrid = strings.Split(m.GetString("arrid"), ",") if len(arrid) > 0 { for _, chid := range arrid { ids = append(ids, bson.ObjectIdHex(util.DecodeArticleId2ByCheck(chid)[0])) } } userId, ok := m.GetSession("userId").(string) if !ok || userId == "" || len(ids) < 1 { m.ServeJson(map[string]interface{}{ "flag": flag, }) return nil } if datas, ok := mongodb.Find("follow_project", bson.M{"_id": bson.M{"$in": ids}, "s_userid": m.GetSession("userId").(string)}, nil, nil, false, -1, -1); ok && datas != nil { for _, v := range *datas { go delRelRedis(v["s_userid"], v["a_relationinfo"]) delete(v, "_id") v["i_status"] = 2 mongodb.Save("follow_project_back", v) } } if mongodb.Del("follow_project", bson.M{"_id": bson.M{"$in": ids}, "s_userid": m.GetSession("userId").(string)}) { flag = "T" } m.ServeJson(map[string]interface{}{ "flag": flag, }) return nil } //获取我的反馈列表 func (f *Front) MyFeedbacks() error { userId, _ := f.GetSession("userId").(string) if userId == "" { return f.Render("/_error.html") } list, ok := mongodb.Find("interaction", bson.M{"s_submitid": userId}, `{"l_submitdate":-1}`, `{"s_remark":1,"l_submitdate":1,"s_opinion":1,"i_status":1}`, false, 0, 200) if !ok { return nil } if f.Method() == "GET" { f.T["list"] = list f.T["flag"] = true mynickname, _ := f.Session().Get("s_nickname").(string) myavatar, _ := f.Session().Get("s_avatar").(string) myopenid, _ := f.GetSession("s_m_openid").(string) f.T["nickname"] = mynickname f.T["avatar"] = myavatar f.T["signature"] = wx.SignJSSDK(f.Site() + f.Url()) f.T["openid"] = se.EncodeString(myopenid) _, f.T["advertText"] = getRewardText() f.T["advertImg"] = config.Sysconfig["advertImg"] f.T["advertName"] = config.Sysconfig["advertName"] f.T["advertUrl"] = config.Sysconfig["advertUrl"] return f.Render("/weixin/feedback.html") } f.ServeJson(map[string]interface{}{ "list": list, }) return nil } func (f *Front) GetRecomKWs() { recomKWChan <- true defer func() { <-recomKWChan }() value := f.GetString("value") count, _ := f.GetInteger("count") ves := strings.Split(value, " ") var pairs []map[string]interface{} for _, v := range ves { Pw, _ := M.MostSimilar(strings.Split(v, "+"), []string{}, count) for _, p := range Pw { sim := p.Sim word := p.Word if sim < float32(config.Sysconfig["recommendThreshold"].(float64)) { continue } if strings.HasSuffix(word, "路") || public.DealString(word) { continue } pairs = append(pairs, map[string]interface{}{ "sim": sim, "word": word, }) } } f.ServeJson(pairs) } //记录用户行为--推荐关键词 func (f *Front) BehaviorRecord() { flag := saveBehaviorRecord(f.Session(), bson.M{ "s_word": f.GetString("value"), "s_type": f.GetString("type"), "s_source": f.GetString("source"), }) f.ServeJson(bson.M{"flag": flag}) } //记录用户行为 func saveBehaviorRecord(sess *httpsession.Session, data bson.M) bool { userid, _ := sess.Get("userId").(string) //if openId == "" { // return false //} nickName, _ := sess.Get("s_nickname").(string) //data["s_openid"] = openId data["s_userid"] = userid data["s_nickname"] = nickName data["l_createtime"] = time.Now().Unix() return len(mongodb.Save("behavior", data)) > 0 } //取得剑鱼博客的信息列表 func (f *Front) Jyblog(param /*参数*/ string) error { querymap := map[string]string{} if len(param) == 0 { querymap = map[string]string{ "perPage": f.GetString("perPage"), "currentPage": f.GetString("currentPage"), "contentType": "jybk", "query": f.GetString("query"), } } else { //反转生成map paramstr := param[1:] bs, _ := base64.StdEncoding.DecodeString(paramstr) json.Unmarshal(bs, &querymap) } var shareid = f.GetString("id") if len(shareid) == 0 { shareid = fmt.Sprintf("%s%d", config.Seoconfig["jybky"].(string)+fmt.Sprintf("%d", time.Now().UnixNano())[8:14], rand.Intn(9)) } f.T["logid"] = config.Seoconfig["jybky"].(string) f.DisableHttpCache() shareid = se.EncodeString(shareid) data, pagination := searhWebContentblog(querymap) f.Render("/pc/jyblog.html", &xweb.T{"querymap": querymap, "data": data, "pagination": pagination, "shareid": shareid}) return nil } //实际的查询剑鱼博客 func searhWebContentblog(querymap map[string]string) (*[]map[string]interface{}, *[]interface{}) { perPage, _ := strconv.Atoi(querymap["perPage"]) currentPage, _ := strconv.Atoi(querymap["currentPage"]) //修复 if perPage == 0 { perPage = 5 } if currentPage < 1 { currentPage = 1 } contentType := querymap["contentType"] queryStr := querymap["query"] str := `` if queryStr != "" { str = `{ "match": { "s_title": { "query":"` + queryStr + `", "operator": "and" } } },{ "match": { "s_content": { "query":"` + queryStr + `" } } }` } var tempQuery = `{"query": { "bool": { "must":[{"term":{"s_contenttype":"` + contentType + `"}}], "should": [` + str + `], "minimum_should_match": 0 } }}` var query = tempQuery[:len(tempQuery)-1] + `,"highlight":{ "pre_tags":[""], "post_tags":[""], "fields":{ "s_title":{"force_source": true} ,"s_content":{"force_source": true} } },"_source":["s_title","s_date","s_contenttype","s_content","releasetime","s_description","praise","s_source","s_pic","s_pic1","l_createdate","s_code","_id","s_author"] ,"from":` + fmt.Sprintf("%v", ((currentPage-1)*perPage)) + `, "size":` + fmt.Sprintf("%v", perPage) + `,"sort":[{"releasetime":{"order":"desc"}}] }` total := elastic.Count("content", "content", tempQuery) //查询列表数据 client := elastic.GetEsConn() defer elastic.DestoryEsConn(client) if client == nil { return nil, nil } searchResult, err := client.Search().Index("content").Type("content").Source(query).Do() if err != nil { return nil, nil } var res []map[string]interface{} if searchResult.Hits != nil { resNum := len(searchResult.Hits.Hits) res = make([]map[string]interface{}, resNum) for i, hit := range searchResult.Hits.Hits { json.Unmarshal(*hit.Source, &res[i]) //查询结果数据加工处理 for k, v := range hit.Highlight { res[i][k] = v[0] } s_content, _ := res[i]["s_content"].(string) if len(s_content) > 500 { res[i]["s_content"] = "" } else { con, _ := regexp.Compile("^[^<]*?>") content := con.ReplaceAllString(s_content, "") con1, _ := regexp.Compile("<[^>]*$") res[i]["s_content"] = template.HTML(con1.ReplaceAllString(content, "")) } s_title, _ := res[i]["s_title"].(string) res[i]["s_title"] = template.HTML(s_title) tmpdate, _ := res[i]["l_createdate"] res[i]["l_createdate"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate.(float64)), 0)) tmpdate1, _ := res[i]["releasetime"] res[i]["releasetime"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate1.(float64)), 0)) res[i]["s_pic"] = config.Seoconfig["jyadd"].(string) + res[i]["s_pic"].(string) res[i]["s_pic1"] = config.Seoconfig["jyadd"].(string) + res[i]["s_pic1"].(string) res[i]["_id"] = se.EncodeString(res[i]["_id"].(string)) } } //生成分页 pagination := MakePagination(perPage, currentPage, int(total), querymap, "/jyblog/index_%s.html") return &res, &pagination } //计算分页,分页显示规则 func MakePagination(perPage, currentPage, total int, param map[string]string, urltpl string) []interface{} { var totalPages int //总页数 if total == 0 { totalPages = 1 } else { totalPages = (total - 1 + perPage) / perPage //总页数 } ret := make([]interface{}, 3) index := 0 prePage, nextPage := currentPage-1, currentPage+1 if prePage < 1 { prePage = 1 } if nextPage > totalPages { nextPage = totalPages } param["currentPage"] = strconv.Itoa(prePage) bs, _ := json.Marshal(param) paramstr := base64.StdEncoding.EncodeToString(bs) url := fmt.Sprintf(urltpl, paramstr) iscurrent := currentPage == 1 ret[index] = map[string]interface{}{"page": "< 上一页", "url": url, "iscurrent": iscurrent} index = index + 1 param["currentPage"] = strconv.Itoa(currentPage) bs, _ = json.Marshal(param) paramstr = base64.StdEncoding.EncodeToString(bs) url = fmt.Sprintf(urltpl, paramstr) iscurrent = currentPage == currentPage ret[index] = map[string]interface{}{"page": currentPage, "url": url, "iscurrent": iscurrent} index = index + 1 param["currentPage"] = strconv.Itoa(nextPage) bs, _ = json.Marshal(param) paramstr = base64.StdEncoding.EncodeToString(bs) url = fmt.Sprintf(urltpl, paramstr) iscurrent = currentPage == totalPages ret[index] = map[string]interface{}{"page": "下一页 >", "url": url, "iscurrent": iscurrent} return ret } //博客三级页 func (f *Front) Jybdetail(_id string) error { var shareid = f.GetString("id") if len(shareid) == 0 { shareid = "10" //fmt.Sprintf("%s%d", config.Seoconfig["jybky"].(string)+fmt.Sprintf("%d", time.Now().UnixNano())[8:14], rand.Intn(9)) } f.T["logid"] = config.Seoconfig["jybky"].(string) shareid = se.EncodeString(shareid) if ret := redis.Get("other", "jyblog_"+_id); ret != nil { var retlist *map[string]interface{} b, _ := json.Marshal(ret) json.Unmarshal(b, &retlist) (*retlist)["s_content"] = template.HTML((*retlist)["s_content"].(string)) (*retlist)["_id"] = (*retlist)["_id"].(string) f.T["data"] = retlist } else { id := se.DecodeString(_id) r := elastic.GetByIdField("content", "content", id, `"_id","s_title","l_createdate","s_pic","s_author","s_editorname","s_contenttype","praise","releasetime","s_subcontent","s_url","s_content","s_source","s_keywords","s_description","s_contenttype"`) if r != nil { tmpdate1, _ := (*r)["l_createdate"] (*r)["l_createdate"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate1.(float64)), 0)) tmpdate2, _ := (*r)["releasetime"] (*r)["releasetime"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate2.(float64)), 0)) (*r)["s_content"] = template.HTML((*r)["s_content"].(string)) (*r)["_id"] = se.EncodeString((*r)["_id"].(string)) (*r)["s_pic"] = (*r)["s_pic"].(string) } f.DisableHttpCache() redis.Put("other", "jyblog_"+_id, r, 2*60*60) f.T["data"] = r } f.T["shareid"] = shareid return f.Render("/pc/jyblogdetail.html", &f.T) } // func (f *Front) Blogpraise() error { defer util.Catch() id := se.DecodeString(f.GetString("id")) stype := f.GetString("type") flag := "F" var blogflag = true util.Try(func() { if id != "" { if stype == "up" { blogflag = mongodb.Update("content", `{"_id":"`+id+`"}`, `{ "$inc" : { "praise" : 1 }}`, false, false) } else if stype == "down" { blogflag = mongodb.Update("content", `{"_id":"`+id+`"}`, `{ "$inc" : { "praise" : -1 }}`, false, false) } if blogflag { flag = "T" r, _ := mongodb.FindById("content", id, "") elastic.UpdateNewDoc("content", "content", r) redis.Del("other", "jyblog_"+f.GetString("id")) } } }, func(e interface{}) { log.Println("文章点赞出错", e) }) f.ServeJson(map[string]interface{}{ "flag": flag, }) return nil } // func getRewardText() (string, string) { rewardText, _ := config.Sysconfig["rewardText"].([]interface{}) advertText, _ := config.Sysconfig["advertText"].([]interface{}) randVal := rand.New(rand.NewSource(time.Now().UnixNano())).Intn(len(rewardText)) if len(advertText) != 0 { advVal := rand.New(rand.NewSource(time.Now().UnixNano())).Intn(len(advertText)) return util.ObjToString(rewardText[randVal]), util.ObjToString(advertText[advVal]) } else { return util.ObjToString(rewardText[randVal]), "" } } // func searchresulthtml(list *[]map[string]interface{}) string { var listhtml = "" var j = 1 for i := 0; i < len(*list); i++ { listdata := (*list)[i] j = i + 1 listhtml += `
  • ` + strconv.Itoa(j) + `.` if listdata["title"] != "" { listhtml += `
    ` } area, _ := listdata["area"].(string) area = strings.TrimSpace(area) finalType, _ := listdata["subtype"].(string) if finalType == "" { finalType = util.ObjToString(listdata["toptype"]) } if finalType == "" { finalType = util.ObjToString(listdata["type"]) if finalType == "bid" { finalType = "中标" } else if finalType == "tender" { finalType = "招标" } else { finalType = "" } } industry := util.ObjToString(listdata["industry"]) stpadd, areaadd, indadd := classify(finalType, area, industry) if area != "" && area != "A" { listhtml += `` + area + `` } else { listhtml += `` } if finalType != "" { listhtml += `` + finalType + `` } else { listhtml += `` } //industry, _ := listdata["industry"].(string) if industry != "" { listhtml += `` + industry + `` } else { listhtml += `` } publishtime, _ := listdata["publishtime"].(float64) if publishtime != 0 { diff := util.TimeDiff(time.Unix(util.Int64All(publishtime), 0)) if diff != "" { listhtml += `` + diff + `` } } listhtml += `
  • ` } return listhtml } //标签查询 func (f *Front) SearchResult(at, name string) error { defer util.Catch() if at == "stype" && name == "NJ" { return f.Redirect("/jylab/supsearch/proposedProject.html") } var no = 5 var area = "" var stype = "" var industry = "" var startPage, currentPage, limitcount int limitcount = util.IntAll(config.Seoconfig["limitcount"]) var res = "" var seotitle = "" var seokeywords = "" var seodescription = "" if len(industrylist) > 0 { f.T["industrylist"], f.T["sortArray"] = industrylist, sortArray } else { f.T["industrylist"], f.T["sortArray"] = getindustrys() } var supstatus = "" if f.GetSession("userId") != nil { if jylabutil.IsAuthorized(f.GetSession("userId").(string), "i_supersearch") { supstatus = "T" } } f.T["supstatus"] = supstatus var shareid = f.GetString("id") if len(shareid) == 0 { shareid = "10" //fmt.Sprintf("%s%d", config.Seoconfig["jybqy"].(string)+fmt.Sprintf("%d", time.Now().UnixNano())[8:14], rand.Intn(9)) } f.T["logid"] = config.Seoconfig["jybqy"].(string) if at == "area" { areamp, _ := config.Seoconfig["area"].(map[string]interface{}) if areamp != nil { areamp1 := areamp[name].(map[string]interface{}) if areamp1 != nil { area = areamp1["NAME"].(string) seotitle = areamp1["TITLE"].(string) seokeywords = areamp1["KEYWORDS"].(string) seodescription = areamp1["DESCRIPTION"].(string) } } } else if at == "stype" { stypemp, _ := config.Seoconfig["stype"].(map[string]interface{}) if stypemp != nil { stypemp1 := stypemp[name].(map[string]interface{}) if stypemp1 != nil { stype = stypemp1["NAME"].(string) seotitle = stypemp1["TITLE"].(string) seokeywords = stypemp1["KEYWORDS"].(string) seodescription = stypemp1["DESCRIPTION"].(string) } } } else if at == "industry" { industrymp, _ := config.Seoconfig["industry"].(map[string]interface{}) if industrymp != nil { industrymp1 := industrymp[name].(map[string]interface{}) if industrymp1 != nil { industry = industrymp1["NAME"].(string) seotitle = industrymp1["TITLE"].(string) seokeywords = industrymp1["KEYWORDS"].(string) seodescription = industrymp1["DESCRIPTION"].(string) } } } f.T["seoarea"] = area f.T["seostype"] = stype f.T["seotitle"] = seotitle f.T["seokeywords"] = seokeywords f.T["seodption"] = seodescription if area == "全国" { return f.Redirect("/swordfish/searchinfolist.html") } if area != "" || stype != "" || industry != "" { list := redis.Get("other", "classify_"+name) query1 := `{"query": {"bool": {"must":[` if area != "" { query1 += `{"term":{"area":"` + area + `"}}` } else if stype != "" { query1 += `{"term":{"subtype":"` + stype + `"}}` } else if industry != "" { query1 += `{"term":{"industry":"` + industry + `"}}` } query1 += `],"should": [],"minimum_should_match": 0}}}` query := getLastNewsQuery(area, "", stype, industry) var datas *[]map[string]interface{} if list == nil { count := elastic.Count(INDEX, TYPE, query1) //log.Println("count:", count, "----", query) r := rand.New(rand.NewSource(time.Now().UnixNano())) currentPage = no startPage = r.Intn(currentPage * limitcount) count1 := util.IntAll(count) if count1 < startPage || startPage < 0 { startPage = 0 } datas = elastic.GetPage(INDEX, TYPE, query, bidSearch_sort, `"_id","title","publishtime","toptype","subtype","type","area","href","bidopentime","winner","buyer","bidamount","budget","s_subscopeclass","projectname"`, startPage, limitcount) //log.Println("datas:", *datas) if len(*datas) > 0 { for _, v := range *datas { v["_id"] = util.EncodeArticleId2ByCheck(util.ObjToString(v["_id"])) } } redis.Put("other", "classify_"+name, datas, 2*60*60) } else { b, _ := json.Marshal(list) json.Unmarshal(b, &datas) } public.BidListConvert(industry, datas) res = searchresulthtml(datas) f.T["res"] = res f.T["area"] = area f.T["stype"] = stype f.T["industry"] = industry f.T["classifyname"] = name f.SetSession("paramarea", area) f.SetSession("paraminfotype", stype) f.T["shareid"] = se.EncodeString(shareid) } // if userid := f.GetSession("userId"); userid != nil { f.T["portraitpower"] = jylabutil.IsAuthorized(userid.(string), "i_portraitpower") } return f.Render("/pc/classifylist.html", &f.T) } // func (f *Front) GetClassifyList() error { defer util.Catch() //判断用户是否开启超级搜索? classifyname := f.GetString("classifyname") data := redis.Get("other", "classify_"+classifyname) f.ServeJson(map[string]interface{}{ "data": data, }) return nil } // func classify(stp, area, industry string) (string, string, string) { var areas, _ = config.Seoconfig["area"].(map[string]interface{}) var stypes, _ = config.Seoconfig["stype"].(map[string]interface{}) var industrys, _ = config.Seoconfig["industry"].(map[string]interface{}) var tpadd = "" var areaadd = "" var induadd = "" if area != "" && area != "A" { for k, v := range areas { if area == v.(map[string]interface{})["NAME"] { areaadd = k } } } // if stp != "" { for k, v := range stypes { if stp == v.(map[string]interface{})["NAME"] { tpadd = k } } } // if industry != "" { for k, v := range industrys { if strings.Contains(util.ObjToString(v.(map[string]interface{})["NAME"]), industry) { induadd = k } } } return tpadd, areaadd, induadd } func (f *Front) HasPushHistory() { userid := util.ObjToString(f.GetSession("userId")) if userid == "" { return } user, openId := public.GetOldOpenid(userid) var o_jy map[string]interface{} if user != nil { o_jy, _ = (*user)["o_jy"].(map[string]interface{}) } haskey := false if o_jy != nil || len(o_jy) == 0 { a_key, _ := o_jy["a_key"].([]interface{}) for _, vi := range a_key { v, _ := vi.(map[string]interface{}) keys_a := v["key"].([]interface{}) if strings.TrimSpace(strings.Join(util.ObjArrToStringArr(keys_a), "")) != "" { haskey = true break } } } else { haskey = true } thistime, list := public.GetHistorypush(0, user, userid, openId) /*if haskey && (list == nil || len(*list) == 0) { list = &[]map[string]interface{}{} flag, data := makeHistoryDatas(util.BsonIdToSId((*user)["_id"]), openId, o_jy) if flag && data != nil { tmp := public.ChangeMapKeyForCass(data) if ats, ok := tmp["o_pushinfo"].(map[string]interface{}); ok { thistime = 0 tmp["count"] = len(ats) *list = append(*list, tmp) } } }*/ // var success bool if list != nil && len(*list) > 0 { success = true } // f.ServeJson(map[string]interface{}{ "haskey": haskey, "data": list, "thistime": thistime, "success": success, "isInTSguide": isInTSguide(userid), }) } //历史推送 func (f *Front) Historypush() error { myopenid := util.ObjToString(f.GetSession("s_m_openid")) userid := util.ObjToString(f.GetSession("userId")) // 打开推送 data, ok := mongodb.FindById("user", userid, nil) i_applystatus := (*data)["i_applystatus"] var o_jy map[string]interface{} if ok && data != nil && len(*data) > 0 { o_jy, _ = (*data)["o_jy"].(map[string]interface{}) a_key, _ := o_jy["a_key"] f.SetSession("a_key", a_key) } a_key := f.GetSession("a_key") // log.Println("a_key", a_key) /*************/ if myopenid == "" || userid == "" { return f.Redirect("/swordfish/share/-1") } f.T["forceShareFlag"] = public.CheckUserNeedForceShare(myopenid, public.ShareType_push) mynickname, _ := f.Session().Get("s_nickname").(string) myavatar, _ := f.Session().Get("s_avatar").(string) f.T["nickname"] = mynickname f.T["avatar"] = myavatar f.T["signature"] = wx.SignJSSDK(f.Site() + f.Url()) f.T["openid"] = se.EncodeString(myopenid) f.T["a_key"] = a_key f.T["i_applystatus"] = i_applystatus return f.Render("/weixin/historypush.html", &f.T) } func (f *Front) HistorypushPaging() error { lasttime, _ := f.GetInteger("lasttime") userid := util.ObjToString(f.GetSession("userId")) res := map[string]interface{}{} res["success"] = false if userid != "" && lasttime > 0 { user, openId := public.GetOldOpenid(userid) thisindex, list := public.GetHistorypush(lasttime, user, userid, openId) if list != nil && len(*list) > 0 { res["success"] = true res["data"] = &list res["thistime"] = thisindex } } f.ServeJson(&res) return nil } func getHistorypush_old(lasttime, infotime int64, userId, openId string, res []map[string]interface{}, count int, vsidList []string) (thistime int64, list *[]map[string]interface{}) { if lasttime < time.Now().Unix()-60*24*60*60 { //最多查询最近60天数据 return lasttime, &res } thistime = lasttime if res == nil { res = make([]map[string]interface{}, 0) } list = &res dateshort := util.FormatDateByInt64(&lasttime, util.Date_Short_Layout) pinfo := cassandra.Search("select * from jy_push where id=? and openid=? and date 0 { for _, info := range pinfo { tmp := public.ChangeMapKeyForCass(info) if ats, ok := tmp["o_pushinfo"].(map[string]interface{}); ok { thistime = util.Int64All(tmp["l_date"]) //获取已浏览记录 visited := cassandra.Search("select vsid from jy_pushvisit where openid=? and pdate=?", userId, thistime) if len(visited) > 0 { for _, v := range visited { vsidList = append(vsidList, (v["vsid"]).(string)) } log.Println(thistime, "vsidList:", vsidList) } tmp["a_visitedindex"] = vsidList count += len(ats) tmp["count"] = len(ats) res = append(res, tmp) list = &res if count >= wx_pageSize { return } } } } /*else { //日志迁移,过一段时间作废 tmps, ok := mongodb.Find("wxpush", &map[string]interface{}{ "s_m_openid": openid, "l_date": map[string]interface{}{ "$lt": lasttime, }, }, `{"l_date":-1}`, nil, false, 0, 1) if ok && (*tmps) != nil && len(*tmps) == 1 && (*tmps)[0] != nil { tmp := (*tmps)[0] at := tmp["o_pushinfo"] if at != nil { ats := at.(map[string]interface{}) thistime = tmp["l_date"].(int64) count += len(ats) tmp["count"] = len(ats) res = append(res, tmp) list = &res if count >= wx_pageSize { return } } } }*/ if count < wx_pageSize { t, _ := time.ParseInLocation(util.Date_Short_Layout, time.Unix(lasttime, 0).Format(util.Date_Short_Layout), time.Local) thistime = t.Unix() - 24*60*60 infotime = 24 * 60 * 60 } return getHistorypush_old(thistime, infotime, userId, openId, res, count, vsidList) } //电脑端招标订阅 func (m *Front) Subscribe() error { var shareid = m.GetString("id") if len(shareid) == 0 { shareid = "10" //fmt.Sprintf("%s%d", config.Seoconfig["jydyy"].(string)+fmt.Sprintf("%d", time.Now().UnixNano())[7:14], rand.Intn(9)) } m.T["logid"] = config.Seoconfig["jydyy"].(string) m.T["noshareid"] = shareid m.T["shareid"] = se.EncodeString(shareid) myopenid, _ := m.Session().Get("s_m_openid").(string) m.T["openid"] = se.EncodeString(myopenid) mynickname, _ := m.Session().Get("s_nickname").(string) myavatar, _ := m.Session().Get("s_avatar").(string) m.T["nickname"] = mynickname m.T["avatar"] = myavatar m.T["signature"] = wx.SignJSSDK(m.Site() + m.Url()) return m.Render("/pc/subscribe.html", &m.T) } //获取高级查询所需的参数 func getShouldQueryMap(findfield, searchvalue, industry string) []map[string]string { mps := []map[string]string{} for _, v := range strings.Split(industry, ",") { mp := map[string]string{} for _, v := range strings.Split(searchvalue, "+") { mp[v] = findfield } mp[v] = "s_subscopeclass" mps = append(mps, mp) } return mps } func getSearchQuery(keyword, industry, minprice, maxprice, findfields, mustquery string) (qstr string) { multi_match := `{"multi_match": {"query": "%s","type": "phrase", "fields": [%s]}}` //match_phrase := `{"match_phrase": {"s_subscopeclass": "%s"}}` query := `{"query":{"bool":{"must":[%s]}}}` query_bool_should := `{"bool":{"should":[%s],"minimum_should_match": 1}}` query_bools_must := `{"bool":{"must":[{"range":{"bidamount":{%s}}}],"must_not":[{"term":{"bidamount":0}},{"term":{"budget":0}}]}},{"bool":{"must":[{"term":{"bidamount":0}},{"range":{"budget":{%s}}}]}},{"bool":{"must":[{"term":{"budget":0}},{"range":{"bidamount":{%s}}}]}}` query_bool_must := `{"bool":{"must":[{"terms":{"s_subscopeclass":[%s]}}]}}` //rge := `{"range": {"bidamount": {%s}}},{"range": {"budget": {%s}}}` gte := `"gte": %s` lte := `"lte": %s` musts := []string{} if mustquery != "" { musts = append(musts, mustquery) } if keyword != "" { multi_match = fmt.Sprintf(multi_match, "%s", findfields) shoulds := []string{} for _, v := range strings.Split(keyword, "+") { shoulds = append(shoulds, fmt.Sprintf(multi_match, elastic.ReplaceYH(v))) } musts = append(musts, fmt.Sprintf(elastic.NgramMust, strings.Join(shoulds, ","))) } if industry != "" { industrys := strings.Split(industry, ",") musts = append(musts, fmt.Sprintf(query_bool_must, `"`+strings.Join(industrys, `","`)+`"`)) } if minprice != "" || maxprice != "" { sq := `` if minprice != "" { min, _ := strconv.ParseFloat(minprice, 64) minprice = fmt.Sprintf("%.0f", min*10000) if minprice == "0" { minprice = "" } } if maxprice != "" { max, _ := strconv.ParseFloat(maxprice, 64) maxprice = fmt.Sprintf("%.0f", max*10000) if maxprice == "0" { maxprice = "" } } if minprice != "" { sq += fmt.Sprintf(gte, minprice) } if minprice != "" && maxprice != "" { sq += `,` } if maxprice != "" { sq += fmt.Sprintf(lte, maxprice) } query_price := fmt.Sprintf(query_bool_should, fmt.Sprintf(query_bools_must, sq, sq, sq)) musts = append(musts, query_price) } qstr = fmt.Sprintf(query, strings.Join(musts, ",")) //log.Println("getSearchQuery:", qstr) return } // func wxPushViewDatas(index, itype string, keys []elastic.KeyConfig, allquery, findfields, SortQuery, fields string, start, limit int) *[]map[string]interface{} { query_all := `{"query":{"bool":{"must":[%s],"should":[%s],"minimum_should_match":1}}}` match_detail := `{"match":{"detail":{"query":"%s","operator": "and"}}}` minq := `{"multi_match": {"query": "%s","type": "phrase", "fields": [%s]}}` highlightStr := `%s: {"fragment_size": %d,"number_of_fragments": 1}` query_bool := `{"bool":{"must":[%s],"should":[%s],"must_not":[%s],"minimum_should_match":1}}` bool_must := `{"bool":{"must":[%s]}}` // searchDetail := strings.Contains(findfields, `"detail"`) if len(keys) > 0 { qstr := "" new_minq := fmt.Sprintf(minq, "%s", `"title"`) not_new_minq := fmt.Sprintf(minq, "%s", `"title"`) //排除词只查询标题 musts := []string{} for _, qs_words := range keys { mq := []string{} notmq := []string{} shoulds := []string{} keywords := []string{} boolmusts := []string{} for _, qs_word := range qs_words.Keys { qs_word = elastic.ReplaceYH(qs_word) keywords = append(keywords, qs_word) boolmusts = append(boolmusts, fmt.Sprintf(new_minq, qs_word)) } shoulds = append(shoulds, fmt.Sprintf(bool_must, strings.Join(boolmusts, ","))) if searchDetail { shoulds = append(shoulds, fmt.Sprintf(match_detail, strings.Join(keywords, " "))) } for _, qs_word := range qs_words.NotKeys { notmq = append(notmq, fmt.Sprintf(not_new_minq, elastic.ReplaceYH(qs_word))) if searchDetail { notmq = append(notmq, fmt.Sprintf(match_detail, elastic.ReplaceYH(qs_word))) } } if len(qs_words.Areas) > 0 { mq = append(mq, fmt.Sprintf(`{"terms":{"area":["%s"]}}`, strings.Join(qs_words.Areas, `","`))) } if len(qs_words.InfoTypes) > 0 { mq = append(mq, fmt.Sprintf(`{"terms":{"toptype":["%s"]}}`, strings.Join(qs_words.InfoTypes, `","`))) } musts = append(musts, fmt.Sprintf(query_bool, strings.Join(mq, ","), strings.Join(shoulds, ","), strings.Join(notmq, ","))) } qstr = fmt.Sprintf(query_all, "", strings.Join(musts, ",")) qstr = fmt.Sprintf(elastic.FilterQuery, allquery, qstr[1:]) ws := []string{} for _, w := range strings.Split(findfields, ",") { ws = append(ws, fmt.Sprintf(highlightStr, w, 1)) } qstr = qstr[:len(qstr)-1] + `,` + fmt.Sprintf(elastic.HL, strings.Join(ws, ",")) + `}` if len(fields) > 0 { qstr = qstr[:len(qstr)-1] + `,"_source":[` + fields + "]}" } if len(SortQuery) > 0 { qstr = qstr[:len(qstr)-1] + `,"sort":` + SortQuery + `}` } if start > -1 { qstr = qstr[:len(qstr)-1] + `,"from":` + strconv.Itoa(start) + `,"size":` + strconv.Itoa(limit) + "}" } //log.Println("jy-ngram-find", qstr) return elastic.Get(index, itype, qstr) } else { return nil } } //保存最近7天的数据到历史记录 func makeHistoryDatas(userid, openid string, o_jy map[string]interface{}) (bool, map[string]interface{}) { allquery := `{"range":{"publishtime":{"gt":%s}}}` allquery = fmt.Sprintf(allquery, fmt.Sprint(time.Now().AddDate(0, 0, -7).Unix())) //allquery := `` _, list := getWxPushViewData(userid, allquery, 1) if list == nil || len(*list) == 0 { return true, nil } var allkeysTemp []elastic.KeyConfig _bs, err := json.Marshal(o_jy["a_key"]) if err == nil { json.Unmarshal(_bs, &allkeysTemp) } keysTemp := []string{} //原始关键词 for _, vs := range allkeysTemp { keysTemp = append(keysTemp, strings.Join(vs.Keys, "+")) } o_pushinfo := map[string]map[string]interface{}{} publishTitle := map[string]bool{} str := fmt.Sprintf("
    根据您设置的关键词(%s),给您推送以下信息:
    ", strings.Join(keysTemp, ";")) i := 0 for _, v := range *list { title := strings.Replace(v["title"].(string), "\n", "", -1) area := util.ObjToString(v["area"]) if publishTitle[area+title] { log.Println("重复标题", title) continue } else { publishTitle[area+title] = true } infoid := util.ObjToString(v["_id"]) redis.PutCKV("push", "push_"+userid+"_"+infoid, 1) i++ industry := "" if v["s_subscopeclass"] != nil { k2sub := strings.Split(util.ObjToString(v["s_subscopeclass"]), ",") if len(k2sub) > 0 { industry = k2sub[0] if industry != "" { ss := strings.Split(industry, "_") if len(ss) > 1 { industry = ss[0] } } } } str += "
    " + fmt.Sprintf("%d", i) + "." + title + "
    " o_pushinfo[strconv.Itoa(i)] = map[string]interface{}{ "publishtime": v["publishtime"], "stype": util.ObjToString(v["type"]), "topstype": util.ObjToString(v["toptype"]), "substype": util.ObjToString(v["subtype"]), "subscopeclass": industry, "buyer": v["buyer"], "projectname": v["projectname"], "budget": v["budget"], "bidopentime": v["bidopentime"], "winner": v["winner"], "bidamount": v["bidamount"], } } md, _ := json.Marshal(o_pushinfo) wxpush := map[string]interface{}{ "id": time.Now().Format(util.Date_Short_Layout), "openid": openid, "date": time.Now().Unix(), "words": keysTemp, "uid": userid, "content": str, "pushinfo": string(md), } flag := cassandra.SaveCacheByTimeOut("jy_push", wxpush, 10) return flag, wxpush }