front.go 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095
  1. package front
  2. import (
  3. "fmt"
  4. "jfw/config"
  5. "jfw/filter"
  6. "jfw/jyutil"
  7. "jfw/qrmanager"
  8. "jfw/tools"
  9. "jfw/wx"
  10. "log"
  11. //"math/rand"
  12. "qfw/util"
  13. "qfw/util/elastic"
  14. "qfw/util/redis"
  15. "strings"
  16. "sync"
  17. "time"
  18. "github.com/go-xweb/httpsession"
  19. "golang.org/x/net/websocket"
  20. "github.com/go-xweb/xweb"
  21. "gopkg.in/mgo.v2/bson"
  22. )
  23. type userPool struct {
  24. lock sync.Mutex
  25. openIds []string
  26. user map[string]*map[string]interface{}
  27. }
  28. type Front struct {
  29. *xweb.Action
  30. ajaxPolling xweb.Mapper `xweb:"/front/ajaxPolling"` //登录轮询
  31. getLoginNum xweb.Mapper `xweb:"/front/getLoginNum/(.*)"` //
  32. login xweb.Mapper `xweb:"/front/login/(.*)"` //登录
  33. hasSign xweb.Mapper `xweb:"/front/hasSign"` //是否登录
  34. signOut xweb.Mapper `xweb:"/front/signOut"` //注销
  35. sess xweb.Mapper `xweb:"/front/sess/(.*)"` //微信跳转session登录
  36. viewdemo xweb.Mapper `xweb:"/front/viewdemo"` //微信跳转session登录
  37. getpage xweb.Mapper `xweb:"/swordfish/getpage"`
  38. wxsearch xweb.Mapper `xweb:"/swordfish/search"` //剑鱼微信查询
  39. wxsearchlist xweb.Mapper `xweb:"/swordfish/searchlist"` //剑鱼微信查询结果展示
  40. wxsearchlistPaging xweb.Mapper `xweb:"/swordfish/searchlist/paging"` //剑鱼微信查询结果展示--分页
  41. delWxHistorySearch xweb.Mapper `xweb:"/swordfish/delWxHistorySearch"` //剑鱼微信删除历史搜索
  42. visitRedirect xweb.Mapper `xweb:"/visit/redirect"` //剑鱼跳转访问请求,后续统计
  43. //iknow xweb.Mapper `xweb:"/visit/iknow"` //剑鱼跳转访问请求,后续统计
  44. ajaxReq xweb.Mapper `xweb:"/member/swordfish/ajaxReq"`
  45. wxpushView xweb.Mapper `xweb:"/wxpush/wxpushview"` //推送结果预览
  46. wxpushViewPaging xweb.Mapper `xweb:"/wxpush/wxpushview/paging"` //推送结果预览--分页
  47. guide xweb.Mapper `xweb:"/swordfish/guide/(.*)"`
  48. share xweb.Mapper `xweb:"/swordfish/share/([^.]*)"`
  49. wxprotocol xweb.Mapper `xweb:"/swordfish/wxprotocol"` //微信剑鱼协议
  50. delc xweb.Mapper `xweb:"/delcache/(.+)"` //删除模板缓存
  51. wxpushListInfo xweb.Mapper `xweb:"/wxpush/bidinfo/(.*)"` //推送列表
  52. feedback xweb.Mapper `xweb:"/swordfish/feedback"` //意见反馈
  53. wxpushAjaxReq xweb.Mapper `xweb:"/wxpush/bid/ajaxReq"`
  54. newSordfish xweb.Mapper `xweb:"/"` //剑鱼pc首页
  55. searchinfolist xweb.Mapper `xweb:"/swordfish/searchinfolist(.*).html"` //剑鱼pc查询
  56. about xweb.Mapper `xweb:"/swordfish/about"`
  57. shareabout xweb.Mapper `xweb:"/swordfish/shareabout/([^.]*)"`
  58. getIndexData xweb.Mapper `xweb:"/front/index.*"`
  59. urlrecord xweb.Mapper `xweb:"/front/urlrecord.*"`
  60. isrecord xweb.Mapper `xweb:"/front/isrecord/(.*)"`
  61. praise xweb.Mapper `xweb:"/swordfish/praise"`
  62. getpraise xweb.Mapper `xweb:"/swordfish/getpraise"`
  63. aboutsearch xweb.Mapper `xweb:"/swordfish/aboutsearch"`
  64. aboutSR xweb.Mapper `xweb:"/swordfish/aboutsearchresult"`
  65. delOL xweb.Mapper `xweb:"/swordfish/delovertimelist"` //手动删除30天无更新数据
  66. pcAjaxReq xweb.Mapper `xweb:"/front/pcAjaxReq"`
  67. //pcVisitRedirect xweb.Mapper `xweb:"/pcdetail/(.*).html"` //pc剑鱼跳转访问请求,后续统计
  68. //aiknow xweb.Mapper `xweb:"/about/iknow"`
  69. myFeedbacks xweb.Mapper `xweb:"/swordfish/myFeedbacks"`
  70. wxkeywords xweb.Mapper `xweb:"/swordfish/wxkeywords"`
  71. wxscope xweb.Mapper `xweb:"/swordfish/wxscope"`
  72. wxerr xweb.Mapper `xweb:"/mob/err"`
  73. getRecomKWs xweb.Mapper `xweb:"/member/getRecomKWs"` //获取推荐关键词
  74. behaviorRecord xweb.Mapper `xweb:"/member/behaviorRecord"` //记录用户点击的关键词
  75. tSGuide xweb.Mapper `xweb:"/front/tenderSubscribe/guide"` //引导页
  76. transfer xweb.Mapper `xweb:"/front/transfer"` //原文链接中转
  77. lifirst xweb.Mapper `xweb:"/front/lifirst"` //第一次访问
  78. jyblog xweb.Mapper `xweb:"/jyblog/index([^.]*).html"` //剑鱼博客
  79. jybdetail xweb.Mapper `xweb:"/jyblog/([^.]*).html"` //剑鱼博客三级页
  80. blogpraise xweb.Mapper `xweb:"/jyblog/blogpraise"` //剑鱼博客三级页点赞
  81. searchResult xweb.Mapper `xweb:"/list/(\\w+)/(\\w+).html"` //剑鱼分类 地区结果列表
  82. encrypt xweb.Mapper `xweb:"/share/encrypt"` //分享三级页加密
  83. // onekey xweb.Mapper `xweb:"/swordfish/onekey"` //一键报告
  84. historypush xweb.Mapper `xweb:"/swordfish/historypush"` //历时推送记录
  85. historypushPaging xweb.Mapper `xweb:"/swordfish/historypush/paging"` //历时推送记录--分页
  86. aboutus xweb.Mapper `xweb:"/front/aboutus.html"` //关于我们
  87. busicooperation xweb.Mapper `xweb:"/front/busicooperation.html"` //商务合作
  88. //bidsearchforent xweb.Mapper `xweb:"/front/bidsearchforent.html"` //中标企业搜索
  89. /********************wxkeyset:v1.8**************************/
  90. wxrssset xweb.Mapper `xweb:"/swordfish/page"`
  91. wxKeysetAjaxReq xweb.Mapper `xweb:"/wxkeyset/ajaxReq"` //订阅词ajax请求
  92. wxKeyset xweb.Mapper `xweb:"/wxkeyset/keyset/(\\w+)"` //订阅词设置
  93. subscribe xweb.Mapper `xweb:"/front/subscribe.html"` //电脑版剑鱼设置
  94. gethotkey xweb.Mapper `xweb:"/front/gethotkey"` //获取热词
  95. rediskw xweb.Mapper `xweb:"/front/rediskw"` //pc订阅词存redis
  96. notin xweb.Mapper `xweb:"/notin/page"` //未登录用户访问三级页中转页
  97. topics xweb.Mapper `xweb:"/promotional/topics.html"` //SEM推广
  98. mobtopics xweb.Mapper `xweb:"/promotional/mobtopics.html"` //移动端专题推广
  99. saveuserlogs xweb.Mapper `xweb:"/front/saveuserlogs"` //保存用户关注日志
  100. followinfo xweb.Mapper `xweb:"/front/followinfo"` //redis用户关注日志
  101. /********************dev:2.0**************************/
  102. getClassifyList xweb.Mapper `xweb:"/front/getClassifyList"` //得到标签页表格数据
  103. advservices xweb.Mapper `xweb:"/front/advservices.html"` //广告服务
  104. extension xweb.Mapper `xweb:"/extension/(.*).html"` //推广页面
  105. //getQR xweb.Mapper `xweb:"/front/getQR"` //取二维码
  106. }
  107. var sewx util.SimpleEncrypt //微信的加密方法
  108. var mongodb = tools.MQFW
  109. var urlMap map[string]interface{}
  110. //var userPoolSize = 1000
  111. //var up userPool
  112. var se = util.SE //移到tools中
  113. var payCallBackChan chan bool = make(chan bool, 1)
  114. func init() {
  115. sewx = util.SimpleEncrypt{Key: "topnet"}
  116. xweb.AddAction(&Front{})
  117. xweb.AddAction(&Short{})
  118. urlMap = config.Sysconfig["redirect"].(map[string]interface{})
  119. //userPoolSize = util.IntAllDef(config.Sysconfig["userPoolSize"], userPoolSize)
  120. //up.user = make(map[string]*map[string]interface{})
  121. }
  122. //轮询查登录状态
  123. func (f *Front) AjaxPolling() {
  124. reqType, _ := f.GetInteger("reqType")
  125. if reqType == 1 {
  126. shareIds := f.GetString("shareIds")
  127. shareidlist := strings.Split(shareIds, "___")
  128. if shareIds != "" && len(shareidlist) > 1 {
  129. shareidnum := shareidlist[0]
  130. shareidkop := shareidlist[1]
  131. PutWsByCode(se.DecodeString(shareidnum), nil, f.Session())
  132. PutWsByCode(se.DecodeString(shareidkop), nil, f.Session())
  133. f.ServeJson(map[string]string{})
  134. }
  135. } else if reqType == 2 {
  136. userInfo, _ := f.GetSession("rpcBackUserInfo").(map[string]interface{})
  137. f.ServeJson(userInfo)
  138. } else if reqType == 3 {
  139. reply := ""
  140. userId := se.DecodeString(f.GetString("userId"))
  141. qrToLab_ok, _ := redis.Exists("other", "qrToLab_"+userId)
  142. if qrToLab_ok {
  143. redis.Del("other", "qrToLab_"+userId)
  144. reply = "qrToLab_ok"
  145. }
  146. qrToLab_open_ok, _ := redis.Exists("other", "qrToLab_open_"+userId)
  147. if qrToLab_open_ok {
  148. redis.Del("other", "qrToLab_open_"+userId)
  149. reply = "qrToLab_open_ok"
  150. }
  151. if qrToLab_ok && qrToLab_open_ok {
  152. reply = "qrToLab_ok_open_ok"
  153. }
  154. f.ServeJson(map[string]string{"result": reply})
  155. }
  156. }
  157. //广告服务
  158. func (f *Front) Advservices() error {
  159. var shareid = f.GetString("id")
  160. if len(shareid) == 0 {
  161. shareid = "10" //fmt.Sprintf("%s%d", config.Seoconfig["jyggfwy"].(string)+fmt.Sprintf("%d", time.Now().UnixNano())[7:14], rand.Intn(9))
  162. }
  163. f.T["logid"] = config.Seoconfig["jyggfwy"].(string)
  164. f.T["shareid"] = se.EncodeString(shareid)
  165. return f.Render("/pc/advservices.html", &f.T)
  166. }
  167. //移动端专题推广
  168. func (f *Front) Mobtopics() error {
  169. return f.Render("/active/mobtopics.html")
  170. }
  171. //移动端专题推广
  172. func (f *Front) Extension(page string) error {
  173. //今日头条和百度推广用的同一个页面,如以后有变动,需拆分成两个。
  174. if page != "tengxun" {
  175. page = "baidu"
  176. }
  177. return f.Render("/active/ext-" + page + ".html")
  178. }
  179. //SEM推广
  180. func (f *Front) Topics() error {
  181. var shareid = f.GetString("id")
  182. if len(shareid) == 0 {
  183. shareid = "10" //fmt.Sprintf("%s%d", config.Seoconfig["jySEMtgy"].(string)+fmt.Sprintf("%d", time.Now().UnixNano())[7:14], rand.Intn(9))
  184. }
  185. f.T["logid"] = config.Seoconfig["jySEMtgy"].(string)
  186. f.T["shareid"] = se.EncodeString(shareid)
  187. f.DisableHttpCache()
  188. lastBids := elastic.GetPage("bidding", "bidding", "{}", `{"publishtime":-1}`, `"_id","title","publishtime","toptype","subtype","type","area","href"`, 0, 18)
  189. if lastBids != nil && len(*lastBids) > 0 {
  190. lbnHtml, olHtml := structureLastBidsHtml(lastBids)
  191. f.T["lbnHtml"] = lbnHtml
  192. f.T["olHtml"] = olHtml
  193. }
  194. return f.Render("/active/topics.html", &f.T)
  195. }
  196. //
  197. func (f *Front) Notin() error {
  198. ref := f.GetSession("referer")
  199. if ref != nil && ref != "" {
  200. f.T["ref"] = ref.(string)
  201. }
  202. var shareid = f.GetString("id")
  203. if len(shareid) == 0 {
  204. shareid = "10" //fmt.Sprintf("%s%d", config.Seoconfig["jysskzy"].(string)+fmt.Sprintf("%d", time.Now().UnixNano())[7:14], rand.Intn(9))
  205. }
  206. f.T["logid"] = config.Seoconfig["jysskzy"].(string)
  207. f.T["shareid"] = se.EncodeString(shareid)
  208. return f.Render("/pc/notin.html", &f.T)
  209. }
  210. //原实验室socket
  211. func QrToLab(ws *websocket.Conn) {
  212. var receive, userId string
  213. var qrToLab_ok, qrToLab_open_ok bool
  214. //接收消息
  215. go func() {
  216. for {
  217. err := websocket.Message.Receive(ws, &receive)
  218. if err != nil {
  219. receive = "close"
  220. //log.Println("websocket接收失败!", err)
  221. return
  222. }
  223. if receive == "close" {
  224. return
  225. } else if receive != "close" { //接收到userid
  226. userId = se.DecodeString(receive)
  227. }
  228. }
  229. }()
  230. //发送消息
  231. for {
  232. time.Sleep(2 * time.Second)
  233. if receive == "close" { //接收到关闭信息
  234. ws.Close()
  235. return
  236. } else if userId == "" {
  237. continue
  238. }
  239. var reply string
  240. //是否进入实验室
  241. if !qrToLab_ok {
  242. qrToLab_ok, _ = redis.Exists("other", "qrToLab_"+userId)
  243. if qrToLab_ok {
  244. reply = "qrToLab_ok"
  245. }
  246. }
  247. //是否打开开关
  248. if !qrToLab_open_ok {
  249. qrToLab_open_ok, _ = redis.Exists("other", "qrToLab_open_"+userId)
  250. if qrToLab_open_ok {
  251. reply = "qrToLab_open_ok"
  252. }
  253. }
  254. if reply == "" {
  255. continue
  256. }
  257. if err := websocket.Message.Send(ws, reply); err != nil {
  258. redis.Del("other", "qrToLab_"+userId)
  259. redis.Del("other", "qrToLab_open_"+userId)
  260. //log.Println("websocket发送失败!", err)
  261. ws.Close()
  262. return
  263. }
  264. if reply == "qrToLab_ok" {
  265. redis.Del("other", "qrToLab_"+userId)
  266. } else if reply == "qrToLab_open_ok" {
  267. redis.Del("other", "qrToLab_open_"+userId)
  268. }
  269. if qrToLab_ok && qrToLab_open_ok {
  270. ws.Close()
  271. return
  272. }
  273. }
  274. }
  275. //原登录关注socket
  276. func ServeWs(ws *websocket.Conn) {
  277. var err error
  278. var shareid = ""
  279. var openid = ""
  280. var allShareid string
  281. //接收消息
  282. go func() {
  283. for {
  284. if err = websocket.Message.Receive(ws, &allShareid); err != nil {
  285. log.Println("websocket接受失败或结束!")
  286. allShareid = "error"
  287. ws.Close()
  288. return
  289. }
  290. if allShareid == "" {
  291. continue
  292. }
  293. }
  294. }()
  295. for {
  296. if allShareid == "" {
  297. continue
  298. }
  299. if allShareid == "error" {
  300. return
  301. }
  302. shareidlist := strings.Split(allShareid, "___")
  303. if allShareid != "" && len(shareidlist) > 1 {
  304. shareidnum := strings.Split(allShareid, "___")[0]
  305. shareidkop := strings.Split(allShareid, "___")[1]
  306. //log.Println(se.DecodeString(shareidnum) + "----" + se.DecodeString(shareidkop))
  307. shareid = shareidnum
  308. openid = redis.GetStr("sso", "p_usershare_"+se.DecodeString(shareidnum))
  309. if openid == "" {
  310. openid = redis.GetStr("sso", "p_usershare_"+se.DecodeString(shareidkop))
  311. shareid = shareidkop
  312. }
  313. if openid == "" {
  314. shareid = ""
  315. }
  316. }
  317. if shareid == "" {
  318. continue
  319. }
  320. //log.Println("22222shareid:", shareid)
  321. if err = websocket.Message.Send(ws, shareid); err != nil {
  322. log.Println("websocket发送失败或结束!")
  323. ws.Close()
  324. return
  325. }
  326. if shareid != "" {
  327. ws.Close()
  328. return
  329. }
  330. }
  331. }
  332. //
  333. func (f *Front) Followinfo() error {
  334. var pid = f.GetString("pid")
  335. var kid = f.GetString("kid")
  336. var oid = f.GetString("oid")
  337. oldData := redis.Get("sso", "p_userdata_"+se.DecodeString(oid))
  338. var Rurl = util.ObjToString(f.GetSession("RURL"))
  339. var Rref = f.GetString("rref")
  340. rheader := f.Request.Header
  341. rhdua := "" //UA
  342. if len(rheader["User-Agent"]) > 0 {
  343. rhdua = rheader["User-Agent"][0]
  344. }
  345. userData := make(map[string]interface{})
  346. userData["Ros"] = filter.GetOS(rhdua)
  347. userData["Rip"] = filter.GetIp(f.Request)
  348. userData["Rbrowse"] = filter.GetBrowse(rhdua)
  349. if f.GetSession("RReferer") == nil || util.ObjToString(f.GetSession("RReferer")) == "" {
  350. if Rref == "" {
  351. f.SetSession("RReferer", Rurl)
  352. } else {
  353. f.SetSession("RReferer", Rref)
  354. }
  355. }
  356. userData["RURL"] = Rurl
  357. modulelist := config.Seoconfig["module"].(map[string]interface{})
  358. for k, v := range modulelist {
  359. if strings.Contains(Rurl, k) {
  360. f.SetSession("RModule", v)
  361. }
  362. }
  363. if f.GetSession("RModule") == nil || util.ObjToString(f.GetSession("RModule")) == "" {
  364. f.SetSession("RModule", "首页")
  365. }
  366. //活动页模块
  367. if len(Rurl) > 1 && strings.Contains(Rurl, "id=") {
  368. activeCode := strings.Split(Rurl, "id=")[1]
  369. //首先查看是否从百度等搜索引擎过来的referer
  370. sourcelist := config.Seoconfig["source"].(map[string]interface{})
  371. for k, v := range sourcelist {
  372. if strings.Contains(activeCode, k) {
  373. if f.GetSession("RSource") == nil {
  374. f.SetSession("RSource", v)
  375. f.SetSession("RModule", activeCode+"活动页")
  376. f.SetSession("RActiveCode", activeCode)
  377. }
  378. }
  379. }
  380. }
  381. userData["RModule"] = f.GetSession("RModule")
  382. userData["RActiveCode"] = f.GetSession("RActiveCode")
  383. userData["RReferer"] = f.GetSession("RReferer")
  384. if f.GetSession("RSource") == nil || util.ObjToString(f.GetSession("RSource")) == "" {
  385. //首先查看是否从百度等搜索引擎过来的referer
  386. refererlist := config.Seoconfig["referer"].(map[string]interface{})
  387. for k, v := range refererlist {
  388. if strings.Contains(Rref, k) {
  389. if f.GetSession("RSource") == nil {
  390. f.SetSession("RSource", v)
  391. }
  392. }
  393. }
  394. if f.GetSession("RSource") == nil || util.ObjToString(f.GetSession("RSource")) == "" {
  395. f.SetSession("RSource", "剑鱼网站")
  396. }
  397. }
  398. userData["RSource"] = f.GetSession("RSource")
  399. userData["Rparamkey"] = f.GetSession("paramkey")
  400. userData["Rparampublishtime"] = f.GetSession("parampublishtime")
  401. userData["Rparamarea"] = f.GetSession("paramarea")
  402. userData["Rparaminfotype"] = f.GetSession("paraminfotype")
  403. userData["Rprojectname"] = f.GetSession("projectname")
  404. if oldData != nil {
  405. redis.Put("sso", "p_userdata_"+se.DecodeString(pid), oldData, 13*60)
  406. redis.Put("sso", "p_userdata_"+se.DecodeString(kid), oldData, 13*60)
  407. } else {
  408. redis.Put("sso", "p_userdata_"+se.DecodeString(pid), userData, 13*60)
  409. redis.Put("sso", "p_userdata_"+se.DecodeString(kid), userData, 13*60)
  410. }
  411. f.ServeJson(map[string]string{
  412. "result": "ok",
  413. })
  414. return nil
  415. }
  416. //
  417. func (f *Front) Saveuserlogs() error {
  418. defer util.Catch()
  419. shareid := f.GetString("shareid")
  420. openid := redis.GetStr("sso", "p_userlogs_"+se.DecodeString(shareid))
  421. //forid := ""
  422. //if shareid != "" {
  423. // forid = se.DecodeString(shareid)[:2]
  424. //}
  425. s_paramkey := ""
  426. s_parampublishtime := ""
  427. s_paramarea := ""
  428. s_paraminfotype := ""
  429. s_paramprojectname := ""
  430. s_paramkey = util.ObjToString(f.GetSession("paramkey"))
  431. s_parampublishtime = util.ObjToString(f.GetSession("parampublishtime"))
  432. s_paramarea = util.ObjToString(f.GetSession("paramarea"))
  433. s_paraminfotype = util.ObjToString(f.GetSession("paraminfotype"))
  434. s_paramprojectname = util.ObjToString(f.GetSession("projectname"))
  435. logdata := &UserLog{}
  436. //log.Println("保存新用户日志:", openid)
  437. if len(openid) > 0 && openid != "" {
  438. logdata.s_openid = openid
  439. logdata.s_shareid = se.DecodeString(shareid)
  440. logdata.s_nickname = util.ObjToString(f.GetSession("nickname"))
  441. logdata.s_url = util.ObjToString(f.GetSession("RURL"))
  442. logdata.s_model = util.ObjToString(f.GetSession("RModule"))
  443. logdata.s_activecode = util.ObjToString(f.GetSession("RActiveCode"))
  444. logdata.s_referrer = util.ObjToString(f.GetSession("RReferer"))
  445. logdata.s_usersource = util.ObjToString(f.GetSession("RSource"))
  446. logdata.i_action = 1
  447. logdata.s_paramkey = s_paramkey
  448. logdata.s_parampublishtime = s_parampublishtime
  449. logdata.s_paramarea = s_paramarea
  450. logdata.s_paraminfotype = s_paraminfotype
  451. logdata.s_paramprojectname = s_paramprojectname
  452. logdata.s_os = util.ObjToString(f.GetSession("Ros"))
  453. logdata.s_ip = util.ObjToString(f.GetSession("Rip"))
  454. logdata.s_browse = util.ObjToString(f.GetSession("Rbrowse"))
  455. //SaveUserLogs(logdata)
  456. }
  457. f.ServeJson(map[string]string{
  458. "result": "ok",
  459. })
  460. return nil
  461. }
  462. //
  463. func (f *Front) Login(key string) error {
  464. shareid := se.DecodeString(key)
  465. openid := redis.GetStr("sso", "p_usershare_"+shareid)
  466. if openid != "" {
  467. f.SetSession("openid", openid)
  468. redisheadimg := redis.Get("other", "newUser-"+openid)
  469. if redisheadimg == nil {
  470. redisheadimg = ""
  471. }
  472. user, _ := mongodb.FindOneByField("user", `{"s_m_openid":"`+openid+`"}`, `{"s_nickname":1,"s_headimage":1,"s_m_openid":1}`)
  473. if user != nil && len(*user) > 0 {
  474. f.ServeJson(map[string]string{
  475. "result": "ok",
  476. "s_nickname": fmt.Sprint((*user)["s_nickname"]),
  477. "s_headimage": fmt.Sprint((*user)["s_headimage"]),
  478. "redisheadimg": fmt.Sprint(redisheadimg),
  479. "encryptId": se.EncodeString(util.BsonIdToSId((*user)["_id"])),
  480. })
  481. (*user)["shareid"] = shareid
  482. nick := fmt.Sprint((*user)["s_nickname"])
  483. f.SetSession("nickname", nick)
  484. f.SetSession("s_nickname", nick)
  485. f.SetSession("s_m_openid", fmt.Sprint((*user)["s_m_openid"]))
  486. f.SetSession("user", *user)
  487. } else {
  488. f.ServeJson(map[string]string{
  489. "result": "fail",
  490. })
  491. }
  492. } else {
  493. f.ServeJson(map[string]string{
  494. "result": "fail",
  495. })
  496. }
  497. return nil
  498. }
  499. //用户是否登录
  500. func (f *Front) HasSign() error {
  501. tmp := f.Session().Get("user")
  502. openid := f.GetSession("s_m_openid")
  503. //log.Println(tmp, "___:", openid)
  504. if openid == nil {
  505. openid = ""
  506. }
  507. redisheadimg := redis.Get("other", "newUser-"+openid.(string))
  508. if redisheadimg == nil {
  509. redisheadimg = ""
  510. }
  511. if user, ok := tmp.(map[string]interface{}); ok {
  512. f.Session().Set("user", user)
  513. f.ServeJson(map[string]string{
  514. "result": "ok",
  515. "s_nickname": fmt.Sprint(user["s_nickname"]),
  516. "s_headimage": fmt.Sprint(user["s_headimage"]),
  517. "redisheadimg": fmt.Sprint(redisheadimg),
  518. "encryptId": se.EncodeString(util.BsonIdToSId(user["_id"])),
  519. })
  520. }
  521. return nil
  522. }
  523. //用户注销
  524. func (f *Front) SignOut() error {
  525. f.DelSession("rpcBackUserInfo")
  526. f.DelSession("user")
  527. f.DelSession("s_nickname")
  528. f.DelSession("openid")
  529. f.DelSession("s_m_openid")
  530. f.ServeJson("ok")
  531. //sess := f.GetSession("user")
  532. //if user, ok := sess.(map[string]interface{}); ok {
  533. //shareid := fmt.Sprint(user["shareid"])
  534. // redis.Del("sso", "p_usershare_"+shareid)
  535. // //重新生成二维码,
  536. // id, _ := strconv.Atoi(shareid)
  537. // tools.GetShareQR(uint32(id))
  538. //
  539. // expires := time.Now().Add(-2 * time.Hour)
  540. // log.Println("exp:", expires)
  541. // cookie := &http.Cookie{
  542. // Name: "userid_secure",
  543. // Value: "",
  544. // Path: "/",
  545. // HttpOnly: true,
  546. // MaxAge: 0,
  547. // Expires: expires,
  548. // }
  549. // log.Println("cookie:", cookie)
  550. // f.SetCookie(cookie)
  551. //}
  552. return nil
  553. }
  554. //微信公众号获取数字
  555. func (f *Front) GetLoginNum(prestr string) error {
  556. var oid = f.GetString("oid")
  557. var Rref = f.GetString("rref")
  558. f.SetSession("Rref", Rref)
  559. shareid, shareidot := qrmanager.QrCodeManager.GetQRCode(oid, prestr, f.Session(), f.Request)
  560. //log.Println("登录获取shareid:", shareid)
  561. f.ServeJson(map[string]string{
  562. "num": se.EncodeString(shareid),
  563. "numot": se.EncodeString(shareidot),
  564. })
  565. return nil
  566. }
  567. //
  568. func (m *Front) Lifirst() {
  569. defer util.Catch()
  570. myopenid, _ := m.Session().Get("s_m_openid").(string)
  571. if m.GetSession("shfirst") == "F" && myopenid != "" {
  572. mongodb.Update("user", bson.M{"s_m_openid": myopenid}, bson.M{"$set": bson.M{"s_shfirst": "N"}}, false, false)
  573. }
  574. }
  575. //一键报告
  576. func (m *Front) Onekey() error {
  577. defer util.Catch()
  578. fkid := util.DecodeArticleId2ByCheck(m.GetString("fkid"))[0]
  579. //onekeyid := redis.Get("other", "onekey_"+fkid)
  580. flag := "N"
  581. data := make(map[string]interface{})
  582. //if onekeyid == nil {
  583. if fkid != "" {
  584. //intdata, _ := mongodb.FindOne("interaction", `{"s_fkid":"`+fkid+`","i_type":7}`)
  585. //if len(*intdata) == 0 {
  586. userId, _ := m.GetSession("userId").(string)
  587. if userId != "" {
  588. userInfo, _ := mongodb.FindById("user", userId, nil)
  589. if (*userInfo)["s_nickname"] != nil { //昵称
  590. data["s_username"] = (*userInfo)["s_nickname"].(string)
  591. } else if (*userInfo)["s_name"] != nil { //s_name
  592. data["s_username"] = (*userInfo)["s_name"].(string)
  593. }
  594. if (*userInfo)["s_name"] != nil {
  595. data["s_submitname"] = (*userInfo)["s_name"].(string)
  596. }
  597. data["s_submitid"] = userId
  598. }
  599. data["i_type"] = 7
  600. value := m.GetString("value")
  601. value = strings.Replace(value, "'", "&qpos;", 1)
  602. if len([]rune(value)) > 200 {
  603. value = util.SubString(value, 0, 200)
  604. }
  605. data["s_remark"] = "剑鱼-一键报告排版问题\n" + value
  606. data["s_mop"] = m.GetString("mop") //来源:移动端or电脑端
  607. data["s_title"] = m.GetString("title")
  608. data["i_status"] = 0
  609. data["l_submitdate"] = time.Now().Unix()
  610. data["s_source"] = m.GetString("source")
  611. data["s_primaryhref"] = m.GetString("primaryhref")
  612. data["s_fkid"] = fkid
  613. id := mongodb.Save("interaction", data)
  614. if len(id) > 0 {
  615. flag = "Y"
  616. }
  617. //} else if (*intdata)["i_status"] == 1 {
  618. // set := make(map[string]interface{})
  619. // set["i_status"] = 0
  620. // set["s_opinion"] = ""
  621. // set["s_auditname"] = ""
  622. // set["s_editorname"] = ""
  623. // set["l_submitdate"] = time.Now().Unix()
  624. // id := mongodb.Update("interaction", `{"s_fkid":"`+fkid+`","i_type":7}`, &map[string]interface{}{"$set": set}, false, false)
  625. // if id {
  626. // flag = "Y"
  627. // }
  628. //}
  629. redis.Put("other", "onekey_"+fkid, fkid, 10*60)
  630. }
  631. //}
  632. m.ServeJson(map[string]interface{}{
  633. "flag": flag,
  634. })
  635. return nil
  636. }
  637. //
  638. func (m *Front) Encrypt() error {
  639. defer util.Catch()
  640. id := m.GetString("id")
  641. s_openid := m.GetSession("s_m_openid")
  642. flag := "F"
  643. var sid_openid string
  644. util.Try(func() {
  645. if id != "" && s_openid != nil {
  646. id = util.DecodeArticleId2ByCheck(id)[0]
  647. sid_openid = util.EncodeArticleId2ByCheck(id, s_openid.(string))
  648. flag = "T"
  649. }
  650. }, func(e interface{}) {
  651. log.Println("分享短地址加密出错", e)
  652. })
  653. m.ServeJson(map[string]interface{}{
  654. "flag": flag,
  655. "sid_openid": sid_openid,
  656. })
  657. return nil
  658. }
  659. //
  660. func (m *Front) Wxkeywords() error {
  661. myopenid, _ := m.Session().Get("s_m_openid").(string)
  662. m.T["openid"] = se.EncodeString(myopenid)
  663. mynickname, _ := m.Session().Get("s_nickname").(string)
  664. myavatar, _ := m.Session().Get("s_avatar").(string)
  665. m.T["nickname"] = mynickname
  666. m.T["avatar"] = myavatar
  667. m.T["signature"] = wx.SignJSSDK(m.Site() + m.Url())
  668. return m.Render("/weixin/wxkeywords.html", &m.T)
  669. }
  670. //
  671. func (m *Front) Wxerr() error {
  672. return m.Render("/_err.html")
  673. }
  674. //
  675. func (m *Front) Wxscope() error {
  676. myopenid, _ := m.Session().Get("s_m_openid").(string)
  677. m.T["openid"] = se.EncodeString(myopenid)
  678. mynickname, _ := m.Session().Get("s_nickname").(string)
  679. myavatar, _ := m.Session().Get("s_avatar").(string)
  680. m.T["nickname"] = mynickname
  681. m.T["avatar"] = myavatar
  682. m.T["signature"] = wx.SignJSSDK(m.Site() + m.Url())
  683. return m.Render("/weixin/wxscope.html", &m.T)
  684. }
  685. //查找用户并创建session
  686. func FindUserAndCreateSess(openid string, sess *httpsession.Session) (ok bool) {
  687. _person, ok := tools.MQFW.FindOne("user", bson.M{"s_m_openid": openid})
  688. if ok && *_person != nil && len(*_person) > 0 {
  689. person := *_person
  690. //加入session
  691. // if person["i_know"] != nil {
  692. // sess.Set("iknow", person["i_know"])
  693. // }
  694. if person["i_shareknow"] != nil {
  695. sess.Set("shareknow", person["i_shareknow"])
  696. }
  697. sess.Set("userId", (person["_id"].(bson.ObjectId)).Hex())
  698. sess.Set("s_m_openid", person["s_m_openid"])
  699. sess.Set("openid", person["s_m_openid"])
  700. sess.Set("s_nickname", person["s_nickname"])
  701. sess.Set("s_avatar", person["s_avatar"])
  702. go updateUserPushStatus(openid)
  703. }
  704. return
  705. }
  706. //微信跳转创建session
  707. func (m *Front) Sess(ostr string) error {
  708. defer util.Catch()
  709. strs := strings.Split(ostr, "__")
  710. str := strings.Split(sewx.DecodeString(strs[0]), ",")
  711. if len(str) == 4 {
  712. openid := str[0]
  713. ok := FindUserAndCreateSess(openid, m.Session())
  714. if ok {
  715. actionurl := util.ObjToString(urlMap[str[3]])
  716. if actionurl != "" {
  717. if len(strs) > 1 {
  718. if strings.Contains(actionurl, "followent/newInfo") {
  719. actionurl = fmt.Sprintf(actionurl, (strs[1] + "___" + strs[2]))
  720. } else {
  721. //支持多个参数%s..
  722. actionurl = fmt.Sprintf(actionurl, func(tmps []string) []interface{} {
  723. res := make([]interface{}, len(tmps))
  724. for k, v := range tmps {
  725. res[k] = v
  726. }
  727. return res
  728. }(strs[1:])...)
  729. }
  730. }
  731. m.Redirect(actionurl)
  732. } else {
  733. if !ok {
  734. log.Println("数据库连接超时!", openid)
  735. } else {
  736. log.Println("解析结果:", str, ",actionurl为空")
  737. }
  738. m.Render("_error.html")
  739. }
  740. } else {
  741. go tools.SaveAbnormal(openid)
  742. log.Println("没有找到该用户:", openid)
  743. m.Render("_error.html")
  744. }
  745. } else {
  746. log.Println("解析出错,解析结果:", str)
  747. m.Render("_error.html")
  748. }
  749. return nil
  750. }
  751. //修改用户推送的状态,i_ispush
  752. //当用户有操作的时候,认为是可以收到推送的,修改i_ispush为1
  753. func updateUserPushStatus(openid string) {
  754. set := bson.M{"$set": bson.M{"i_ispush": 1}}
  755. mongodb.Update("user", bson.M{"s_m_openid": openid}, set, false, true)
  756. mongodb.Update("follow_project", bson.M{"s_openid": openid}, set, false, true)
  757. mongodb.Update("jylab_followent", bson.M{"s_openid": openid}, set, false, true)
  758. }
  759. //删除模板缓存
  760. func (d *Front) Delc(url string) {
  761. defer util.Catch()
  762. d.App.TemplateMgr.CacheDelete(strings.Replace(url, "GG", "/", 1))
  763. d.WriteBytes([]byte("ok,清除路径:" + url))
  764. }
  765. func (m *Front) Viewdemo() {
  766. m.Redirect("/swordfish/guide/-1")
  767. }
  768. //剑鱼用户协议
  769. func (m *Front) Wxprotocol() error {
  770. return m.Render("/weixin/wxprotocol.html")
  771. }
  772. //此方法已经不用
  773. //func (m *Front) Iknow() {
  774. // defer util.Catch()
  775. // if m.GetSession("userId") != nil {
  776. // mongodb.Update("user", bson.M{"_id": bson.ObjectIdHex(m.GetSession("userId").(string))}, `{"$set":{"i_know":1}}`, false, false)
  777. // m.SetSession("iknow", 1)
  778. // m.Write("1")
  779. // } else {
  780. // m.Write("0")
  781. // }
  782. //}
  783. //此方法已经不用
  784. //func (m *Front) Aiknow() {
  785. // defer util.Catch()
  786. // if m.GetSession("userId") != nil {
  787. // mongodb.Update("user", bson.M{"_id": bson.ObjectIdHex(m.GetSession("userId").(string))}, `{"$set":{"i_shareknow":1}}`, false, false)
  788. // m.SetSession("shareknow", 1)
  789. // m.Write("1")
  790. // } else {
  791. // m.Write("0")
  792. // }
  793. //}
  794. //推送列表
  795. func (m *Front) WxpushListInfo(_id string) error {
  796. defer util.Catch()
  797. if m.Session().Get("s_m_openid") == nil {
  798. return m.Redirect("/swordfish/share/-1")
  799. }
  800. tmp, ok := mongodb.FindById("wxpush", _id, nil)
  801. if ok {
  802. (*tmp)["bmatch"] = true
  803. m.T["data"] = &tmp
  804. } else {
  805. (*tmp)["bmatch"] = false
  806. m.T["data"] = &tmp
  807. }
  808. m.T["_id"] = _id
  809. m.T["signature"] = wx.SignJSSDK(m.Site() + m.Url())
  810. myopenid, _ := m.Session().Get("s_m_openid").(string)
  811. m.T["openid"] = se.EncodeString(myopenid)
  812. mynickname, _ := m.Session().Get("s_nickname").(string)
  813. myavatar, _ := m.Session().Get("s_avatar").(string)
  814. m.T["nickname"] = mynickname
  815. m.T["avatar"] = myavatar
  816. return m.Render("/weixin/wxpush.html", &m.T)
  817. }
  818. func (m *Front) Feedback() error {
  819. defer util.Catch()
  820. myopenid, _ := m.Session().Get("s_m_openid").(string)
  821. m.T["openid"] = se.EncodeString(myopenid)
  822. m.T["signature"] = wx.SignJSSDK(m.Site() + m.Url())
  823. userId, _ := m.GetSession("userId").(string)
  824. list, _ := 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)
  825. m.T["list"] = list
  826. fkid := m.GetString("fkid")
  827. if fkid != "" {
  828. fkid = util.DecodeArticleId2ByCheck(fkid)[0]
  829. }
  830. fromName := m.GetString("fromName")
  831. if fromName != "" {
  832. if fromName == "zndy" {
  833. fromName = "剑鱼实验室-智能订阅"
  834. } else if fromName == "sjdc" {
  835. fromName = "剑鱼实验室-数据导出"
  836. } else if fromName == "cjss" {
  837. fromName = "剑鱼实验室-超级搜索"
  838. } else if fromName == "zbqy" {
  839. fromName = "剑鱼实验室-中标企业"
  840. } else if fromName == "gzqy" {
  841. fromName = "剑鱼实验室-关注企业"
  842. }
  843. }
  844. util.ReadConfig(&config.Sysconfig)
  845. _, m.T["advertText"] = getRewardText()
  846. m.T["advertImg"] = config.Sysconfig["advertImg"]
  847. m.T["advertName"] = config.Sysconfig["advertName"]
  848. m.T["advertUrl"] = config.Sysconfig["advertUrl"]
  849. m.T["fkid"] = fkid
  850. m.T["fromName"] = fromName
  851. return m.Render("/weixin/feedback.html", &m.T)
  852. }
  853. func (m *Front) GetIndexData() {
  854. defer util.Catch()
  855. redis_obj := redis.Get("other", "sw_index")
  856. var one map[string]interface{}
  857. if redis_obj != nil {
  858. one = redis_obj.(map[string]interface{})
  859. log.Println("newpage from the cache...")
  860. } else {
  861. rs, err := mongodb.Find("swordfish_index", nil, `{"_id":-1}`, nil, false, 0, 1)
  862. if err {
  863. one = (*rs)[0]
  864. one["i_site"] = util.IntAll(one["i_entsite"]) + util.IntAll(one["i_govsite"])
  865. avg := util.IntAll(one["i_bidmonth"])/21 + util.IntAll(one["i_bidmonth"])%21
  866. one["i_avg"] = avg
  867. one["i_my"] = util.IntAll(one["i_entsite"]) * 35 / 100
  868. one["i_hy"] = util.IntAll(one["i_entsite"]) * 15 / 100
  869. one["i_zb"] = util.IntAll(one["i_entsite"]) - util.IntAll(one["i_my"]) - util.IntAll(one["i_hy"])
  870. redis.Put("other", "sw_index", one, 60*60*2)
  871. } else {
  872. m.ServeJson("n")
  873. }
  874. }
  875. userid := m.GetSession("userId")
  876. if userid != nil {
  877. sess := mongodb.GetMgoConn()
  878. defer mongodb.DestoryMongoConn(sess)
  879. var res bson.M
  880. sess.DB("qfw").C("wxpush").Pipe([]bson.M{bson.M{"$match": bson.M{"s_uid": userid}},
  881. bson.M{"$group": bson.M{"_id": "sum", "totalAmount": bson.M{"$sum": "$i_size"}}}}).One(&res)
  882. one["i_me"] = util.IntAll(res["totalAmount"])
  883. }
  884. m.ServeJson(one)
  885. }
  886. func (m *Front) Urlrecord() {
  887. m.Render("/weixin/urlrecord.html")
  888. }
  889. func (m *Front) Isrecord(name string) {
  890. defer util.Catch()
  891. querystr := `{"$or":[{"s_name":"%s"},{"s_url":"%s"}]}`
  892. if name != "" {
  893. rs, _ := mongodb.Find("bidurlinfo", fmt.Sprintf(querystr, name, name), nil, nil, false, -1, -1)
  894. if len(*rs) == 0 {
  895. m.Write("f")
  896. } else {
  897. m.Write("y")
  898. }
  899. } else {
  900. m.Write("n")
  901. }
  902. }
  903. //招标订阅向导
  904. func (f *Front) TSGuide() error {
  905. defer util.Catch()
  906. s_openId := f.GetSession("s_m_openid")
  907. if s_openId == nil {
  908. return f.Redirect("/swordfish/share/-1")
  909. }
  910. openId, _ := s_openId.(string)
  911. if f.Method() == "GET" {
  912. if !isInTSguide(openId) {
  913. return f.Redirect("/wxkeyset/keyset/index")
  914. }
  915. f.T["signature"] = wx.SignJSSDK(f.Site() + f.Url())
  916. return f.Render("/weixin/wxtsguide.html")
  917. } else {
  918. reqType := f.GetString("reqType")
  919. result := make(bson.M)
  920. if reqType == "save" {
  921. var keyMaps []map[string]interface{}
  922. keyWord := f.GetSlice("keyWord")
  923. for _, v := range keyWord {
  924. vs := processKeyword(v)
  925. if vs == nil {
  926. continue
  927. }
  928. keyMaps = append(keyMaps, map[string]interface{}{
  929. "key": vs,
  930. })
  931. if len(keyMaps) >= 10 {
  932. break
  933. }
  934. }
  935. saveData := bson.M{
  936. "o_jy.a_key": keyMaps,
  937. "o_jy.l_modifydate": time.Now().Unix(),
  938. "i_ts_guide": 2,
  939. }
  940. result["flag"] = mongodb.Update("user", bson.M{"s_m_openid": openId}, bson.M{"$set": saveData}, false, false)
  941. } else if reqType == "over" {
  942. mongodb.Update("user", bson.M{"s_m_openid": openId}, bson.M{"$set": bson.M{"i_ts_guide": 1}}, false, false)
  943. } else if reqType == "preview" {
  944. result["data"] = elastic.GetByNgram(INDEX, TYPE, strings.Split(f.GetString("key"), " "), "", FINDF, `{"publishtime":-1}`, `"_id","title","publishtime","toptype","subtype","type","area","href","areaval"`, 0, 10)
  945. }
  946. f.ServeJson(result)
  947. }
  948. return nil
  949. }
  950. func isInTSguide(openId string) bool {
  951. if openId == "" {
  952. return false
  953. }
  954. data, ok := mongodb.FindOneByField("user", bson.M{"s_m_openid": openId}, `{"o_jy":1,"i_ts_guide":1}`)
  955. if ok {
  956. o_jy, _ := (*data)["o_jy"].(map[string]interface{})
  957. i_ts_guide := util.IntAll((*data)["i_ts_guide"])
  958. if i_ts_guide == 2 || (i_ts_guide == 0 && len(o_jy) == 0) {
  959. return true
  960. }
  961. }
  962. return false
  963. }
  964. //查看原文中转
  965. func (f *Front) Transfer() error {
  966. return f.Redirect(f.GetString("url"))
  967. }
  968. //关于我们
  969. func (f *Front) Aboutus() error {
  970. if ret := redis.Get("other", "aboutus"); ret != nil {
  971. return f.SetBody([]byte(ret.(string)))
  972. } else {
  973. var shareid = f.GetString("id")
  974. if len(shareid) == 0 {
  975. shareid = "10" //fmt.Sprintf("%s%d", config.Seoconfig["jygywmy"].(string)+fmt.Sprintf("%d", time.Now().UnixNano())[7:14], rand.Intn(9))
  976. }
  977. f.T["logid"] = config.Seoconfig["jygywmy"].(string)
  978. f.T["shareid"] = se.EncodeString(shareid)
  979. content, _ := f.Render4Cache("/pc/aboutus.html", &f.T)
  980. redis.Put("other", "aboutus", string(content), -1)
  981. return f.SetBody(content)
  982. }
  983. }
  984. //商务合作
  985. func (f *Front) Busicooperation() error {
  986. var shareid = f.GetString("id")
  987. if len(shareid) == 0 {
  988. shareid = "10" //fmt.Sprintf("%s%d", config.Seoconfig["jyswhzy"].(string)+fmt.Sprintf("%d", time.Now().UnixNano())[7:14], rand.Intn(9))
  989. }
  990. f.T["logid"] = config.Seoconfig["jyswhzy"].(string)
  991. f.T["shareid"] = se.EncodeString(shareid)
  992. content, _ := f.Render4Cache("/pc/businesscooperation.html", &f.T)
  993. return f.SetBody(content)
  994. }
  995. func (f *Front) Gethotkey() error {
  996. keys := []interface{}{}
  997. tmp := redis.Get("sso", "jy_hotkeys")
  998. if tmp != nil {
  999. keys = tmp.([]interface{})
  1000. } else {
  1001. list, _ := mongodb.Find("user", `{"o_jy.a_key":{$exists:true}}`, nil, `{"o_jy":1}`, false, -1, -1)
  1002. keymap := map[string]int{}
  1003. for _, user := range *list {
  1004. if o_jy, ok := user["o_jy"].(map[string]interface{}); ok {
  1005. a_key, _ := o_jy["a_key"].([]interface{})
  1006. for _, v := range a_key {
  1007. if tmp, ok := v.(map[string]interface{}); ok {
  1008. keys := tmp["key"].([]interface{})
  1009. for _, val := range keys {
  1010. keymap[fmt.Sprint(val)] += 1
  1011. }
  1012. }
  1013. }
  1014. }
  1015. }
  1016. keylist := []*jyutil.ObjectMap{}
  1017. for k, v := range keymap {
  1018. obj := &jyutil.ObjectMap{}
  1019. obj.Key = k
  1020. obj.Num = v
  1021. keylist = append(keylist, obj)
  1022. }
  1023. keylist = jyutil.SortMap(keylist)
  1024. for k, v := range keylist {
  1025. if k < 6 {
  1026. keys = append(keys, v.Key)
  1027. } else {
  1028. break
  1029. }
  1030. }
  1031. redis.Put("sso", "jy_hotkeys", keys, 7*24*60*60)
  1032. }
  1033. f.ServeJson(keys)
  1034. return nil
  1035. }
  1036. //redis存储用户搜索关键词 企业 项目信息
  1037. func (f *Front) Rediskw() error {
  1038. skw := f.GetString("skw")
  1039. num := f.GetString("num")
  1040. if skw != "" && num != "" {
  1041. num = se.DecodeString(num)
  1042. redis.Put("sso", "pc_subscribe_"+num, skw, 15*60)
  1043. }
  1044. return nil
  1045. }