ソースを参照

Merge branch 'develop' of 192.168.3.17:zhanghongbo/qfw into develop

renzheng 9 年 前
コミット
bf6a4847b9
39 ファイル変更284 行追加779 行削除
  1. 9 1
      core/src/qfw/manage/auditing.go
  2. 1 1
      core/src/qfw/manage/feedback.go
  3. 2 1
      core/src/qfw/member/yellowpage.go
  4. 8 0
      core/src/qfw/searchmarket/marketservice.go
  5. 8 7
      core/src/qfw/yellowpage/yellowpagemanager.go
  6. 1 1
      core/src/timetask.json
  7. 4 1
      core/src/web/staticres/css/entcommunity.css
  8. BIN
      core/src/web/staticres/images/entcommunity/relation.png
  9. BIN
      core/src/web/staticres/images/mrpic.png
  10. 71 23
      core/src/web/staticres/js/chart.js
  11. 1 1
      core/src/web/staticres/js/marketlist.js
  12. 33 5
      core/src/web/staticres/js/qfw.js
  13. 1 0
      core/src/web/templates/manage/feedbackcontent.html
  14. 54 10
      core/src/web/templates/manage/tj.html
  15. 1 1
      core/src/web/templates/manage/web_newexpresslist.html
  16. 2 5
      core/src/web/templates/member/editenterprise.html
  17. 0 2
      core/src/web/templates/member/showenterprise.html
  18. 7 8
      core/src/web/templates/search/entcommunity.html
  19. 4 8
      core/src/web/templates/search/enterpriseList.html
  20. 4 53
      core/src/web/templates/service/detail.html
  21. 14 26
      core/src/web/templates/service/list.html
  22. 6 6
      core/src/web/templates/yellowpage/enterpriseinfo.html
  23. 0 34
      messageframe/src/util/client.go
  24. 0 23
      messageframe/src/util/event.go
  25. 0 18
      messageframe/src/util/event_test.go
  26. 0 19
      messageframe/src/util/key.go
  27. 0 132
      messageframe/src/util/protocol.go
  28. 0 32
      messageframe/src/util/server.go
  29. 0 21
      messageframe/src/客户端/main.go
  30. 0 26
      messageframe/src/客户端/processbusinessmsg.go
  31. 0 36
      messageframe/src/客户端/processmsg.go
  32. 0 155
      messageframe/src/服务端/main.go
  33. 0 50
      messageframe/src/爬虫监控/main.go
  34. 0 19
      messageframe/src/爬虫监控/processbusinessmsg.go
  35. 0 36
      messageframe/src/爬虫监控/processmsg.go
  36. 9 7
      weixin/src/endless/endless.go
  37. 3 1
      weixin/src/main.go
  38. 12 1
      weixin/src/qfw/weixin/rpc/rpc.go
  39. 29 9
      weixin/src/qfw/weixin/voicehandler.go

+ 9 - 1
core/src/qfw/manage/auditing.go

@@ -57,10 +57,19 @@ type SystemManage struct {
 	count xweb.Mapper `xweb:"/manage/count"`
 	//获取统计列表信息
 	countlist xweb.Mapper `xweb:"/manage/countlist"`
+	//获取剑鱼用户详细统计
+	countfish xweb.Mapper `xweb:"/manage/countfish"`
 	//获取统计列表信息
 	countlistpage xweb.Mapper `xweb:"/manage/countlistpage"`
 }
 
+func (s *SystemManage) Countfish() {
+	totalRows := Count("user", `{"o_msgset":{"$exists":true}}`)
+	currentPage, _ := s.GetInteger("currentPage")
+	start := (currentPage - 1) * 10
+	rs := *Find("user", `{"o_msgset":{"$exists":true}}`, nil, `{"s_nickname":1,"o_msgset":1}`, false, start, 10)
+	s.ServeJson(M{"currentPage": currentPage, "data": rs, "totalRows": totalRows})
+}
 func (s *SystemManage) Countlistpage() {
 	totalRows := Count("tj", nil)
 	currentPage, _ := s.GetInteger("currentPage")
@@ -78,7 +87,6 @@ func (s *SystemManage) Countlist() {
 	//第一条图标数据
 	t1, _ := time.ParseInLocation("2006-01-02 15:04:05", timebefore+" 00:00:00", time.Local)
 	t2, _ := time.ParseInLocation("2006-01-02 15:04:05", timeafter+" 23:59:59", time.Local)
-	log.Println(t1.Unix(), t2.Unix())
 	condition := M{"intime": M{"$gte": t1.Unix(), "$lte": t2.Unix()}}
 	fields := M{comparetype: 1, "intime": 1}
 	timers := *Find("tj", condition, `{"intime": 1}`, fields, false, -1, -1)

+ 1 - 1
core/src/qfw/manage/feedback.go

@@ -122,7 +122,7 @@ func (s *SystemManage) Updateback() error {
 		_id := s.GetString("id")
 		s_submitid := s.GetString("s_submitid")
 		opinion := s.GetString("s_opinion")
-		title := s.GetString("s_record")
+		title := s.GetString("s_remark")
 		if len(title) > 40 {
 			title = front.SubstrByByte(title, 40)
 		}

+ 2 - 1
core/src/qfw/member/yellowpage.go

@@ -231,6 +231,7 @@ func (yp *Yellowpage) Dosave() error {
 	flag := mongodb.Update(ESTYPE, "{'_id':'"+entid+"'}", &dataSet, false, false)
 	redis.Del("enterprise", "enterpriseInfo_"+entid)
 	redis.Del("enterprise", "enterpriseInfo_user_"+entid)
+	elastic.UpdateNewDoc("enterprise", "enterprise", mongodb.FindById("enterprise", entid, nil))
 	redis.DelByCodePattern("enterprise", "ipcity_*")
 	if !flag {
 		status = "n"
@@ -639,7 +640,7 @@ func (yp *Yellowpage) UpdateEntLogo() error {
 	//更新企业logo
 	entid := yp.GetSession("entid").(string)
 	bol := mongodb.Update("enterprise", "{'_id':'"+entid+"'}", map[string]interface{}{"$set": map[string]interface{}{"s_avatar": yp.GetString("url")}}, false, false)
-	redis.Del("enterprise", "enterpriseInfo_"+entid)
+	redis.Del("enterprise", "enterpriseInfo_"+entid, "newIndentEnts")
 	redis.DelByCodePattern("enterprise", "ipcity_*")
 	if bol {
 		elastic.UpdateEntDoc(entid)

+ 8 - 0
core/src/qfw/searchmarket/marketservice.go

@@ -225,6 +225,14 @@ func searhService(querymap map[string]string, n *Market) (*[]map[string]interfac
 			for k, v := range hit.Highlight {
 				res[i][k] = v[0]
 			}
+			if res[i]["s_enterpriseid"] != nil {
+				query := res[i]["s_enterpriseid"].(string)
+				rs := *elastic.GetById("enterprise", "enterprise", query)
+				if len(rs) > 0 {
+					res[i]["i_area"] = rs[0]["i_area"]
+				}
+			}
+
 			s_name, _ := res[i]["s_name"].(string)
 			if len(keyword) < 1 {
 				s_name = strings.Replace(s_name, "highlight", "", -1)

+ 8 - 7
core/src/qfw/yellowpage/yellowpagemanager.go

@@ -282,7 +282,6 @@ func (yp *Yellowpage) EnterpriseInfo(id string) error {
 						if relevantEnts != nil && len(*relevantEnts) > 0 {
 							for _, relevantEnt := range *relevantEnts {
 								relevantEnt["_id"] = util.BsonIdToSId(relevantEnt["_id"])
-								break
 							}
 							yp.T["relevantEnts"] = relevantEnts
 						}
@@ -560,18 +559,20 @@ func (yp *Yellowpage) GetDishonesty() error {
 	return nil
 }
 func getDishonesty(legcerNo string, currentPage int) map[string]interface{} {
-	var res map[string]interface{}
+	var limit int = 10
+	if strings.Trim(legcerNo, " ") == "" {
+		return map[string]interface{}{"list": []map[string]interface{}{}, "count": 0, "pageSize": limit}
+	}
 	if ret := redis.Get("enterprise", "dishonesty-"+legcerNo+"-"+fmt.Sprint(currentPage)); ret != nil {
-		res = ret.(map[string]interface{})
+		return ret.(map[string]interface{})
 	} else {
-		limit := 10
 		start := (currentPage - 1) * limit
 		count := Count("laolai", `{"s_cardnum":"`+legcerNo+`"}`)
 		r := Find("laolai", `{"s_cardnum":"`+legcerNo+`"}`, `{"l_date":-1}`, `{"l_date":1,"iname":1,"court_name":1,"case_code":1,"performance":1}`, false, start, limit)
-		res = map[string]interface{}{"list": r, "count": count, "pageSize": limit}
-		redis.Put("enterprise", "dishonesty-"+legcerNo+"-"+fmt.Sprint(currentPage), res, 7*24*60*60)
+		ret := map[string]interface{}{"list": r, "count": count, "pageSize": limit}
+		redis.Put("enterprise", "dishonesty-"+legcerNo+"-"+fmt.Sprint(currentPage), ret, 7*24*60*60)
+		return ret
 	}
-	return res
 }
 func (yp *Yellowpage) FindServiceByEntId() error {
 	if yp.Method() == "POST" {

+ 1 - 1
core/src/timetask.json

@@ -1 +1 @@
-{"comment":{"c_rate":720,"commentrate":900},"market":{"demand":{"attr":["i_hits","i_bids","i_status"],"timepoint":"2016-03-10 10:08:18"},"service":{"attr":["i_hits","i_sales","i_comments","i_score","i_appcounts"],"timepoint":"2016-03-10 10:08:18"}},"marketisstart":true,"marketrate":300}
+{"comment":{"c_rate":720,"commentrate":900},"market":{"demand":{"attr":["i_hits","i_bids","i_status"],"timepoint":"2016-03-16 08:54:17"},"service":{"attr":["i_hits","i_sales","i_comments","i_score","i_appcounts"],"timepoint":"2016-03-16 08:54:17"}},"marketisstart":true,"marketrate":300}

+ 4 - 1
core/src/web/staticres/css/entcommunity.css

@@ -97,7 +97,10 @@ a:focus, a:hover{
 }
 .entlist-page .entlist-hotsearchwords a{
 	display: inline-block;
-	margin: 10px;
+	margin: 10px 10px 0px 10px;
+	word-wrap: break-word;
+	word-break: break-all;
+	white-space: normal !important;
 }
 .b-scroll-list .b-adver-content{
 	padding: 0px 10px 10px 10px;

BIN
core/src/web/staticres/images/entcommunity/relation.png


BIN
core/src/web/staticres/images/mrpic.png


+ 71 - 23
core/src/web/staticres/js/chart.js

@@ -14,8 +14,40 @@ require(['echarts', 'echarts/chart/line', 'echarts/chart/bar'], // 按需加载
 );
 
 function setOptions(rs){
+		var check=$("#comparecheck");
 		var me=$("#"+$("#comparetype").val());
-		var legend =[$(me).text(),$(me).text()+"(对比)"];
+		var legend =[$(me).text()];
+		var xAxis = [];
+		var series= [];
+		var x1={
+	                   type : 'category',
+			      boundaryGap : false,
+			      splitLine:{show:false},
+	                   data :rs.xData
+            	    };
+		var x2={
+	                   type : 'category',
+			      boundaryGap : false,
+			      splitLine:{show:false},
+	                   data :rs.xData1
+            	};
+		var s1={
+				"name":legend[0],
+				"type":"line",
+				"data":rs.yData[0]			//此处为纵坐标值	
+				};
+		var s2={
+				"name":$(me).text()+"(对比)",
+				"type":"line",
+				"data":rs.yData[1]			//此处为纵坐标值	
+			};
+		xAxis.push(x1);
+		series.push(s1);
+		if(check.prop("checked")&& rs.xData1.length>0) {
+			xAxis.push(x2);
+			series.push(s2);
+			legend.push($(me).text()+"(对比)");
+		}
 		 option = {
 			tooltip : {
 			        trigger: 'axis'
@@ -32,28 +64,11 @@ function setOptions(rs){
 			legend: {
                         data:legend
                     },
-			xAxis : [ {
-	                   type : 'category',
-			      boundaryGap : false,
-			      splitLine:{show:false},
-	                   data :rs.xData
-            	    }, {
-	                   type : 'category',
-			      boundaryGap : false,
-			      splitLine:{show:false},
-	                   data :rs.xData1
-            	    }],
+			xAxis : xAxis,
 			yAxis:[{type : 'value'}],
-			series :  [ {
-				"name":legend[0],
-				"type":"line",
-				"data":rs.yData[0]			//此处为纵坐标值	
-				},{
-				"name":legend[1],
-				"type":"line",
-				"data":rs.yData[1]			//此处为纵坐标值	
-			}]
+			series : series
 		}
+	myChart.clear();
 	myChart.setOption(option);
 	myChart.restore();
 }
@@ -73,7 +88,18 @@ function loadData(me){
 		type:"json",
 		data:data,
 		success:function(rs){
-			setOptions(formartData(rs));
+			isformart=false;
+			for (i in rs){
+				if (rs[i].length>0){
+					isformart=true;
+					break;
+				}
+			}
+			if (isformart){
+				setOptions(formartData(rs));
+			}else{
+				alert("无数据");
+			}
 		}
 	})
 }
@@ -106,4 +132,26 @@ function getDate(tm){
     tm=tm*1000
     var tt=new Date(tm).toLocaleString().replace(/\//g, "-"); 
     return tt.substring(0,tt.indexOf(" ")); 
-} 
+} 
+function onCompareClick(me){
+		if ($(me).prop("checked")){
+			$("#compareframe").prev().show();
+			$("#compareframe").show(300);
+			$("#comparebtn").text("对比");
+		}else{
+			$("#compareframe").prev().hide();
+			$("#compareframe").hide(200);
+			$("#comparebtn").text("查看");
+		}
+}
+//初始化
+$(function(){
+	var d=new Date();//当前时间
+	var lastweek=new Date();
+	lastweek.setDate(lastweek.getDate()-7)
+	$("#timebefore").val(lastweek.Format("yyyy-MM-dd"))
+	$("#comparebefore").val(lastweek.Format("yyyy-MM-dd"))
+	$("#timeafter").val(d.Format("yyyy-MM-dd"))
+	$("#compareafter").val(d.Format("yyyy-MM-dd"))
+
+})

+ 1 - 1
core/src/web/staticres/js/marketlist.js

@@ -253,4 +253,4 @@ function setLocation(entsel, serviceloc) {
       }
     });
   }
-}
+}

+ 33 - 5
core/src/web/staticres/js/qfw.js

@@ -271,12 +271,16 @@ function makeImmediately(data,b){
 	if(data&&data.length>0&&!(typeof data == "string")){
 		for(var i=0;i<data.length;i++){
 			var ds=data[i].split("_")
-			//res+="<div onclick='iq(this)'>"+ds[0]+"</div>"
-			if($("#loginStatus").length == 1){
-				res+="<div onclick='window.open(\"/wx/enterprise/"+ds[1]+".html\")'>"+ds[0]+"</div>"
-			}else{
-				res+="<div onclick='window.open(\"/enterprise/"+ds[1]+".html\")'>"+ds[0]+"</div>"
+			//res+="<div onclick=''>"+ds[0]+"</div>"
+			var clickVal = "iq(this)";
+			if(!b){
+				if($("#loginStatus").length == 1){
+					clickVal = "window.open('/wx/enterprise/"+ds[1]+".html')";
+				}else{
+					clickVal = "window.open('/enterprise/"+ds[1]+".html')";
+				}
 			}
+			res+='<div onclick="'+clickVal+'">'+ds[0]+'</div>';
 		}
 		if(b){
 			res+=delLog
@@ -659,4 +663,28 @@ function pcShare(){
 			$("#pcShare-content").hide();
 		}
 	});
+}
+function getChineseLoc(code,obj,name){
+	if (!name){
+		name="";
+	}
+	if(!obj){
+		obj=$.cxSelect.defaults.url;
+	}
+	if(obj && obj.length>0){
+		var len=(obj[0].k+"").length;
+		if (code.length>=len){
+				for(var i=0;i<obj.length;i++){
+				if(obj[i].k==code.substr(0,len)){
+					name=name+obj[i].n;
+					if (obj[i].s){
+						return getChineseLoc(code,obj[i].s,name);
+					}else{
+						break;
+					}
+				}
+			}
+		}
+		return name;
+	}
 }

+ 1 - 0
core/src/web/templates/manage/feedbackcontent.html

@@ -42,6 +42,7 @@ background-color:#FFFFFF;
 		<form class="registerform form-horizontal" role="form" id="updateback" method="post">
 		<input name="s_submitid" id="s_submitid" class="form-control" value="{{.T.s_submitid}}" style="display:none;"/>
 		<input name="s_submitname" id="s_submitname" class="form-control"  value="{{.T.s_submitname}}" style="display:none;"/>
+		<input name="s_remark" id="s_remark" class="form-control" value="{{.T.s_remark}}" style="display:none;"/>
 		<div class="form-group">
         <label id="col-sm-2" class="col-sm-2 control-label" for="name">问题类型:</label>
 	    <div class="col-sm-2">

+ 54 - 10
core/src/web/templates/manage/tj.html

@@ -24,7 +24,7 @@
 				color:#ff5a5f;
 			}
 			.counttab{
-				width:210px;
+				width:310px;
 				height:34px;
 				margin:30px 0px 30px 18px;
 				background-color:#F8F8F8;
@@ -110,7 +110,7 @@
 						</tr>
 						<tr>
 							<td></td>
-							<td>剑鱼:<span class="number">{{.T.rs.sfish}}</span></td>
+							<td>剑鱼:<span class="number">{{.T.rs.sfish}}</span> &nbsp;&nbsp;<a  href="javascript:void(0);" onclick="controlShowOrHide(this)" value="用户订阅详细" data-set="countfish">用户订阅详细</a></td>
 							<td>订阅关键词:<span class="number">{{.T.msgcount}}</span>,<a href="javascript:void(0);" onclick="controlShowOrHide(this)" value="关键词汇总表" data-set="f-keytable">关键词汇总表</a></td>
 							<td></td>
 							<td></td>
@@ -118,6 +118,9 @@
 					</table>
 				</div>
 				{{end}}
+				<div id="countfish" class="countfish" style="margin:15px 0 0 18px;width:96.8%;display:none;">
+					asdfasdf
+				</div>
 				<div class="showtop f-keytable lm" style="margin-top:20px;display:none;">
 					<div style="text-align:right;margin-bottom:10px;color:#ff5a5f;">
 						招标订阅关键字
@@ -158,7 +161,8 @@
 				<div style="clear:both;">
 					<div class="counttab">
 						<a href="javascript:void(0);"  onclick="loadData(this)" id="n_total" class="counttabbtn" style="border-right:1px solid #E4E4E4;">新增人数</a>
-						<a href="javascript:void(0);"  onclick="loadData(this)" id="total" class="counttabbtn">累计人数</a>
+						<a href="javascript:void(0);"  onclick="loadData(this)" id="total" class="counttabbtn" style="border-right:1px solid #E4E4E4;">累计人数</a>
+						<a href="javascript:void(0);"  onclick="loadData(this)" id="sfish" class="counttabbtn">剑鱼用户</a>
 					</div>
 				</div>
 				<div class="count_chart">
@@ -169,22 +173,25 @@
 						      <label for="firstname" class="col-sm-1 control-label text-right">时间:</label>
 						      <div class="col-sm-3">
 						         <div class="form-control text-center" onclick="">
-								<input id="timebefore" type="text" onfocus="WdatePicker({maxDate:'#F{$dp.$D(\'timeafter\')||%y-%M-%d'})" readonly="readonly" style="border:none;width:40%;" value="2015-12-11" />
+								<input id="timebefore" type="text" onfocus="WdatePicker({maxDate:'#F{$dp.$D(\'timeafter\')||%y-%M-%d'})" readonly="readonly" style="border:none;width:40%;" value="" />
 								<span style="margin:0 5px 0px 5px;">至</span>
-								<input id="timeafter" type="text" onfocus="WdatePicker({minDate:'#F{$dp.$D(\'timebefore\')}',maxDate:'%y-%M-%d'})" readonly="readonly" style="border:none;width:40%;" value="2015-12-11" />
+								<input id="timeafter" type="text" onfocus="WdatePicker({minDate:'#F{$dp.$D(\'timebefore\')}',maxDate:'%y-%M-%d'})" readonly="readonly" style="border:none;width:40%;" value="" />
 							   </div>
 						      </div>
-							<label for="firstname" class="col-sm-1 control-label text-right">对比:</label>
-						      <div class="col-sm-3">
+							<label for="firstname" style="display:none;"  class="col-sm-1 control-label text-right">对比:</label>
+						      <div id="compareframe" style="display:none;" class="col-sm-3">
 						         <div class="form-control text-center" onclick="">
 								<input id="comparebefore" type="text" onfocus="WdatePicker({maxDate:'#F{$dp.$D(\'compareafter\')||%y-%M-%d'})" readonly="readonly" style="border:none;width:40%;" value="2015-12-11" />
 								<span style="margin:0 5px 0px 5px;">至</span>
 								<input id="compareafter" type="text" onfocus="WdatePicker({minDate:'#F{$dp.$D(\'comparebefore\')}',maxDate:'%y-%M-%d'})" readonly="readonly" style="border:none;width:40%;" value="2015-12-11" />
 							   </div>
-						      </div>
+								  </div>
+								<div class="col-sm-1">
+										<input type="checkbox" type="form-control" id="comparecheck" onclick=onCompareClick(this) />是否对比
+								</div> 		
 						</div>
-						<div class="col-sm-4 text-center">
-							 <a class="btn btn-success" style="width:115px;" id="comparebtn" onclick="loadData()">对比</a>
+						<div class="col-sm-3 text-center">
+							 <a class="btn btn-success" style="width:115px;" id="comparebtn" onclick="loadData()">查看</a>
 						</div>
 						</from>
 					
@@ -277,6 +284,43 @@
 					}
 				]	
 			});
+			
+				$("#countfish").datatable({
+				perPage: 10,
+				showPagination:true,
+				checkboxHeader:false,
+				idField:"id",
+				classname:"table_new table-hover",
+				url: '/manage/countfish',
+				columns: [
+					{
+						 title: "用户名",
+						field: "s_nickname"
+					},{
+						title:"招标订阅量",
+						field:"o_msgset",
+						callback:function(ct,cd,val,k,m){
+								if (cd){
+									if (cd.tender.a_key){
+										return  ""+cd.tender.a_key.length;
+									}	
+								}
+								return "0"
+						}
+					},{
+						title:"投标订阅量",
+						field:"o_msgset",
+						callback:function(ct,cd,val,k,m){
+								if (cd){
+									if (cd.bid.a_key){
+										return  ""+cd.bid.a_key.length;
+									}	
+								}
+								return "0"
+						}
+					}]
+			});
+			
 		});
 		function controlShowOrHide(me){
 			var me=$(me);

+ 1 - 1
core/src/web/templates/manage/web_newexpresslist.html

@@ -188,7 +188,7 @@ font-weight:normal;
 		<div style="margin:15px 0px 0px 3px;"><a target="_blank" href="/front/webcontent/{{index $v "_id"}}.html" style="font-weight: bold; font-size: 16px;">{{index $v "s_title"}}</a></div>
 		<div class="form-group" style="margin-top:10px;height: 90px;" >
         <div class="col-sm-3 control-label" for="name">
-		<img class="newListImg" style="width:150px;height:90px; padding:2px;" src="{{if (index $v "s_pic1")}}{{index $v "s_pic1"}}{{else}}{{index $v "s_pic"}}{{end}}"/>
+		<img class="newListImg" style="width:150px;height:90px; padding:2px;" src="{{if (index $v "s_pic1")}}{{index $v "s_pic1"}}{{else}}/images/services/default.png{{end}}"/>
 		</div>
 	    <div class="col-sm-9 control-label" for="name" id="newsdiv">
 		<div class="newsdiv1">{{if eq (index $v "s_content") ""}}{{index $v "s_description"}}{{else}}{{index $v "s_content"}}{{end}}</div>

+ 2 - 5
core/src/web/templates/member/editenterprise.html

@@ -205,10 +205,7 @@ var entType="企业"
 	
 	
 </div>
-</div>
-<!--右侧导航菜单-->
-{{include "/common/rightnavbtn.html"}}
-	
+</div>	
 {{include "/common/bottom.html"}}
 </body>
 
@@ -230,7 +227,7 @@ var option={
 			 	dataType: "text",
 			  	success: function(result){
 					if (result == "y"){
-						$("#logoArea").html("<img class='ent-LOGO' src='"+data.url+"'>");
+						$("#logoArea").html('<img class="ent-LOGO cursor-pointer" src="'+data.url+'" onclick="document.getElementById(\'upload\').click();">');
 					}else{
 						alert("上传LOGO失败,请重新上传。");
 					}

+ 0 - 2
core/src/web/templates/member/showenterprise.html

@@ -314,8 +314,6 @@ var entType="企业"
 </div>
 </div>
 <!--右侧导航菜单-->
-{{include "/common/rightnavbtn.html"}}
-<!--右侧导航菜单-->
 {{include "/common/bottom.html"}}
 
 

+ 7 - 8
core/src/web/templates/search/entcommunity.html

@@ -19,7 +19,7 @@
 				<span class="input-group-addon" id="search-btn"><span class="glyphicon sousuo"></span>查询</span>
 			</div>
 			<div class="b-com-fourth" id="hotsearchwords">
-				热搜词:{{$s:=(Ad "ent-hotsearchwords" 15)}}{{range $k,$v := $s}}<a>{{$v.s_remark}}</a>{{end}}
+				热搜词:{{$s:=(Ad "ent-hotsearchwords" 15)}}{{range $k,$v := $s}}<a href="/enterprise/{{$v.s_id}}.html">{{$v.s_remark}}</a>{{end}}
 			</div>
 		</div>
 		<div class="ent-index-recommend">
@@ -37,7 +37,7 @@
 			<div class="b-adver-content">
 				<ul>
 				{{range $k,$v := .T.newIndentEnts}}
-					<li{{if eq $k 0}} class="border-t-0"{{end}}>
+					<li class="cursor-pointer{{if eq $k 0}} border-t-0{{end}}" onclick="window.location.href='/enterprise/{{$v.s_enterpriseid}}.html'">
 						<div>
 							<img src="{{if $v.s_avatar}}{{$v.s_avatar}}{{else}}null{{end}}" onerror="this.src='/images/ent-logo.png'">
 							<a href="/enterprise/{{$v.s_enterpriseid}}.html">{{$v.s_enterprisename}}</a>
@@ -67,10 +67,6 @@ $(function(){
 		$("input[name='words']").val($("input[name='entIndexSearch']").val());
 		$("form#searchForm").submit();
 	});
-	$("#hotsearchwords a").click(function(){
-		$("input[name='words']").val($(this).text());
-		$("form#searchForm").submit();
-	});
 	var ents = {{Ad "ent-recommend" 48}};
 	if(typeof(ents) != "undefined" && ents != null && ents.length > 0){
 		var tmp = 0;
@@ -94,10 +90,13 @@ $(function(){
 				}
 			    html += '"><ul>';
 			}
-			html += '<li>'
+			html += '<a href="/enterprise/'+ents[i].s_id+'.html"><li>'
 						+'<img src="'+ents[i].s_pic+'" onerror="this.src=\'/images/ent-logo.png\'">'
 						+'<a href="/enterprise/'+ents[i].s_id+'.html">'+ents[i].s_remark+'</a>'
-					+'</li>';
+					+'</li></a>';
+			if(tmp == 4){
+				html += '<div class="clearfix"></div>';
+			}
 			if(tmp == 8 || i == ents.length-1){
 				tmp = 0;
 				html += '</ul><div class="clearfix"></div></div>';

+ 4 - 8
core/src/web/templates/search/enterpriseList.html

@@ -114,8 +114,8 @@
 												<span class="margin-l-15"><font class="b-disabled">法定代表人:</font><font  class="lineb " >{{index $v "LeRep"}}</font></span>
 											{{end}}
 										{{end}}
-										{{if index $v "RegCap"}}
-											{{if and (ne $v.RegCapEntType "9600") (ne $v.RegCapEntType "5810")}}
+										{{if and (index $v "RegCap") ($v.RegCapEntType)}}
+											{{if and (ne $v.RegCapEntType "9600") (ne $v.RegCapEntType "5810") (ne $v.RegCapEntType "4540") (ne $v.RegCapEntType "4533")}}
 												<span class="margin-l-15"><font class="b-disabled">注册资本:</font><font  class="lineb " ><script>var d1={{$v.RegCap}};d1=d1?d1:0; var lenD1=(d1+"").length ;if(lenD1>4&&(d1+"").indexOf(".")>-1&&(lenD1-(d1+"").indexOf("."))>4){document.write(d1.toFixed(4))}else{document.write(d1)}</script>万{{if $v.RegCapCurName}}{{$v.RegCapCurName}}{{else}}元{{end}}</font></span>
 											{{end}}
 										{{end}}
@@ -179,7 +179,7 @@
 			<div class="b-adver-content">
 				{{$s:=(Ad "ent-hotsearchwords" 15)}}
 				{{range $k,$v := $s}}
-					<a{{if $v.o_extend.fontsize}}{{if eq $v.o_extend.fontsize "large"}} style="font-size: 20px;"{{else if eq $v.o_extend.fontsize "larger"}} style="font-size: 20px;"{{end}}{{end}}>{{$v.s_remark}}</a>
+					<a{{if $v.o_extend.fontsize}}{{if eq $v.o_extend.fontsize "large"}} style="font-size: 20px;"{{else if eq $v.o_extend.fontsize "larger"}} style="font-size: 20px;"{{end}}{{end}} href="/enterprise/{{$v.s_id}}.html">{{$v.s_remark}}</a>
 				{{end}}
 			</div>
 		</div>
@@ -189,7 +189,7 @@
 				{{$s:=(Ad "ent-recommend" 15)}}
 				<ul>
 				{{range $k,$v := $s}}
-					<li{{if eq $k 0}} class="border-t-0"{{end}}>
+					<li class="cursor-pointer{{if eq $k 0}} border-t-0{{end}}" onclick="window.location.href='/enterprise/{{$v.s_id}}.html'">
 						<div>
 							<img src="{{if $v.s_pic}}{{$v.s_pic}}{{else}}null{{end}}" onerror="this.src='/images/ent-logo.png'">
 							<a href="/enterprise/{{$v.s_id}}.html">{{$v.s_remark}}</a>
@@ -214,10 +214,6 @@ var chf1= {{index .T.querymap "c_hfl"}};
 var czb= '{{index .T.querymap "c_zb"}}';
 var $chiancity= true,$listent=true;
 $(function(){
-	$(".entlist-hotsearchwords a").click(function(){
-		$("input[name='words']").val($(this).text());
-		$("form#searchForm").submit();
-	});
 	scrollUp("entlist-recommend");
 });
 </script>

+ 4 - 53
core/src/web/templates/service/detail.html

@@ -656,59 +656,10 @@ function comment(){
 			});
 		});
 		$(function(){
-			var all="{{.T.sinfo.s_opLocDistrict}}";
-			var i_province="";
-			var i_city="";
-			var i_area="";
-			if (all.length==6){
-				 i_area=all
-			}
-			 if(all.length<=6){
-				 i_city=all.substr(0,4)
-			}
-			 if(all.length<=6){
-				 i_province=all.substr(0,2)
-			}
-			var address=""
-			obj=$.cxSelect.defaults.url;
-			if(i_province!=""){
-				for (var i=0;i<obj.length;i++){
-						var temp1=obj[i];
-						if(temp1["k"]==i_province){
-							var temp1c=temp1["s"]
-							if (i_city=="0"){
-								$("#location").val(address);
-								address=temp1["n"]+address;
-								$("#de-address").text(address);
-								$("#cityname").val(temp1["n"]);
-							}
-							for(var j=0;j<temp1c.length;j++){
-								 var temp2=temp1c[j];
-								  if(temp2["k"]==i_city){
-										if(typeof(temp2["s"])=="undefined"){
-											$("#location").val(address);
-											address=temp1["n"]+temp2["n"]+address;
-											$("#de-address").text(address);
-											$("#cityname").val(temp1["n"]+temp2["n"]);
-										}else{
-											var temp2c=temp2["s"];
-											for(var k=0;k<temp2c.length;k++){
-													temp3=temp2c[k];
-													if(temp3["k"]=i_area){
-														$("#location").val(address);
-														
-														address=temp1["n"]+temp2["n"]+temp3["n"]+address;
-														$("#cityname").val(temp1["n"]+temp2["n"]+temp3["n"]);
-														$("#de-address").text(address);
-														break;
-												}
-											}
-										}
-									}
-							}
-						}
-				}
-			}
+			var all="{{.T.einfo.i_area}}";
+			var address="{{.T.einfo.s_address}}";
+			address=getChineseLoc(all)+" "+address;
+			$("#de-address").text(address);
 			if ($("#de-address").text()==""){
 				$(".glyphicon.dizhi.icon_gray.text-muted").remove();
 			}

+ 14 - 26
core/src/web/templates/service/list.html

@@ -158,7 +158,7 @@
 						</div></a>
 					{{end}}
 				</div>
-				<div class="col-sm-4 col-xs-8">		
+				<div class="col-sm-5 col-xs-8" style="padding-right:30px;">		
 				<div class="title" style="height:40px;" >
 					{{if eq "demand" $.T.querymap.c_searchtype}}
 						<a target="_blank" style="float: left;max-width: 230px;display: inline-block;word-break: break-all;" href="/market/demandview/{{$v._id}}.html">{{$v.s_name}}</a>
@@ -219,9 +219,9 @@
 					{{end}}
 				{{end}}
 				</div>
-					<div style="padding-top:10px;padding-bottom:10px;">
+					<div style="padding:10px 30px 10px 0">
 						<span class="d_service_span text-muted">{{if $v.s_enterprisename}}<a style="color:#aea79f;" href="/enterprise/{{$v.s_enterpriseid}}.html" target="_blank">{{$v.s_enterprisename}}</a>{{else}}{{$v.s_nickname}}{{end}}</span>
-						<span class="d_service_span text-muted f-code">{{$v.s_opLocDistrict}}</span>
+						<span class="d_service_span text-muted f-code" style="float:right;">{{$v.i_area}}</span>
 					</div>
 				</div>
 				{{if eq "demand" $.T.querymap.c_searchtype}}
@@ -243,10 +243,11 @@
 				<div class="col-sm-2 col-xs-4" style="margin-top: 5px;">
 					价格:{{if eq $v.f_price 0.0}}<span class="text-primary text-bold">面议</span>{{else}}<span class="text-primary text-bold">{{$v.f_price}}</span>元{{end}}
 				</div>
-				<div class="col-sm-4 col-xs-4 text-center hidden-xs" style="margin-top:5px;padding-right:0px;margin-left:30px;">
-					<div class="col-sm-8 " style="float:right;text-align:right;">
-						<div style="float:right;"><span class="d_col_span" style="font-size:14px;">成交量:<span style="color:#FF5A5F;font-weight:600;">{{if $v.i_sales}}{{$v.i_sales}}{{else}}0{{end}}</span></span></div>
-						<div style="float:right;" ><span class="d_col_span" style="font-size:14px;">评价数:<span style="color:#FF5A5F;font-weight:600;">{{if $v.i_comments}}{{$v.i_comments}}{{else}}0{{end}}</span></span>&nbsp;&nbsp;|&nbsp;&nbsp;</div>
+				<div class="hidden-xs" style="float:right ;margin-top:5px;padding-right:0px;margin-left:30px;">
+					<div style="float:right;text-align:right;">
+						<div style="float:left;"><span class="d_col_span" style="font-size:14px;">成交量:<span style="color:#FF5A5F;font-weight:600;">{{if $v.i_sales}}{{$v.i_sales}}{{else}}0{{end}}</span></span></div>
+						<div style="float:left">&nbsp;&nbsp;|&nbsp;&nbsp;</div>
+						<div style="float:left;" ><span class="d_col_span" style="font-size:14px;">评价数:<span style="color:#FF5A5F;font-weight:600;">{{if $v.i_comments}}{{$v.i_comments}}{{else}}0{{end}}</span></span></div>
 					</div>
 				</div>
 				{{else}}
@@ -349,27 +350,14 @@
 		});
 		$(".f-code").each(function(i,n){
 			var $n=$(n);
-			$n.text(getToponym($n.text()));
+			var code=$n.text();
+			if(code.length>2){
+				code=code.substr(0,2);
+			}
+			$n.text(getChineseLoc(code));
 		});
 	});
-	function getToponym(code,obj){
-		if (!obj){
-			 obj=$.cxSelect.defaults.url;
-		}
-		if (code.length<2){
-			return "";
-		}
-		for(var i=0;i<obj.length;i++){
-			var k=obj[i].k+"";
-			if(k==code.substr(0,k.length)){
-				if(k==code){
-					return obj[i].n
-				}else{
-					return getToponym(code,obj[i].s)
-				}
-			}
-		}
-	}
+	
 	$(function(){
 		$(".d-bg-blue").each(function(n,b){
 			var node=$(b).next();

+ 6 - 6
core/src/web/templates/yellowpage/enterpriseinfo.html

@@ -122,8 +122,8 @@
 		<li>关系网</li>
 		<li{{if not .T.res.staffinfo}} class="disabled"{{end}}>主要人员</li>
 		<li{{if not .T.res.alterInfo}} class="disabled"{{end}}>变更信息</li>
-		<li{{if eq .T.dishonesty.count 0}} class="disabled"{{end}}>失信信息</li>
-		<li class="{{if and (not .T.res.s_synopsis) (eq .T.service.count 0)}}disabled {{end}}border-r-0">{{if eq .T.res.s_action "01"}}企业{{else if eq .T.res.s_action "02"}}商家{{else if eq .T.res.s_action "03"}}机构{{else}}企业{{end}}黄页</li>
+		<li{{if not .T.dishonesty.count}} class="disabled"{{end}}>失信信息</li>
+		<li class="{{if and (not .T.service.count) (not .T.res.s_synopsis)}}disabled {{end}}border-r-0">{{if eq .T.res.s_action "01"}}企业{{else if eq .T.res.s_action "02"}}商家{{else if eq .T.res.s_action "03"}}机构{{else}}企业{{end}}黄页</li>
 	</ul>
 	<div class="ent-tab-content b-left">
 		<div>
@@ -184,8 +184,8 @@
 						<!--注册资本-->
 						<div class="entinfo-regcap">
 							<div>
-							{{if .T.res.RegCap}}
-								{{if and (ne .T.res.EntType "9600") (ne .T.res.EntType "5810")}}
+							{{if and .T.res.RegCap .T.res.EntType}}
+								{{if and (ne .T.res.EntType "9600") (ne .T.res.EntType "5810") (ne .T.res.EntType "4540") (ne .T.res.EntType "4533")}}
 									<span>注册资本</span>
 									<span><script>var d1={{.T.res.RegCap}};d1=d1?d1:0; var lenD1=(d1+"").length ;if(lenD1>4&&(d1+"").indexOf(".")>-1&&(lenD1-(d1+"").indexOf("."))>4){document.write(d1.toFixed(4))}else{document.write(d1)}</script>万{{if .T.res.RegCapCurName}}{{.T.res.RegCapCurName}}{{else}}元{{end}}</span>
 								{{else}}
@@ -424,10 +424,10 @@
 			<div class="b-adver-content">
 				<ul>
 				{{range $k,$v := .T.relevantEnts}}
-					<li{{if eq $k 0}} class="margin-0 border-t-0"{{end}}>
+					<li class="cursor-pointer{{if eq $k 0}} margin-0 border-t-0{{end}}" onclick="window.location.href='/enterprise/{{$v._id}}.html'">
 						<div>
 							<img src="{{if $v.s_avatar}}{{$v.s_avatar}}{{else}}null{{end}}" onerror="this.src='/images/ent-logo.png'">
-							<a href="/enterprise/{{$v._id}}.html">{{$v.EntName}}</a>
+							<script style="display: none;">var _id = {{$v._id}};document.write('<a href="/enterprise/'+_id+'.html">{{$v.EntName}}</a>');</script>
 						</div>
 					</li>
 				{{end}}

+ 0 - 34
messageframe/src/util/client.go

@@ -1,34 +0,0 @@
-//客户端封装
-package util
-
-import (
-	"fmt"
-	"net"
-	"os"
-)
-
-//出错检测
-func checkError(err error) {
-	if err != nil {
-		fmt.Fprintf(os.Stderr, "出错了: %s", err.Error())
-		os.Exit(1)
-	}
-}
-
-//
-func StartClient(parseEvent func([]byte), serveraddr string) (*Writer, net.Conn) {
-	tcpAddr, err := net.ResolveTCPAddr("tcp4", serveraddr)
-	checkError(err)
-
-	conn, err := net.DialTCP("tcp", nil, tcpAddr)
-	checkError(err)
-	//接受消息
-	messageQueue := make(chan RawData, 2000) //并发1000
-	go processMsg(messageQueue, parseEvent)
-	//从流中提取消息
-	go forwardMessage(conn, messageQueue)
-	//需要构造写缓冲区
-	w := NewWriter(conn, make(chan RawData, 20))
-	go w.processWrite()
-	return w, conn
-}

+ 0 - 23
messageframe/src/util/event.go

@@ -1,23 +0,0 @@
-package util
-
-//只有事件,发送类型
-const (
-	EVENT_RETURN_MACHINE_ID    = iota
-	EVENT_REQUEST_HEARTBEAT    //心跳
-	EVENT_RETURN_HEARTBEAT     //
-	EVENT_PUBLISH_MYSERVICES   //发布我的服务
-	EVENT_REQUEST_SPIDER_STATE //获取爬虫状态
-	EVENT_RECIVE_SPIDER_STATE  //接受爬虫状态
-	EVENT_RECIVE_CALLBACK      //调用返回,用于调用服务需要同步返回值
-
-	//------------------------
-	SERVICE_ECPS_SPIDER_HN //河南爬虫
-	SERVICE_ECPS_SPIDER_HB //河北爬虫
-
-	//-------发送方式----------------
-	SENDTO_TYPE_RAND_RECIVER = 0 //发送给任一服务接收者,默认是这种模式
-	SENDTO_TYPE_ALL          = 1 //发送给所有客户端
-	SENDTO_TYPE_ALL_RECIVER  = 2 //发送给所有指定服务接收者
-	SENDTO_TYPE_P2P          = 3 //发送给指定客户端
-
-)

+ 0 - 18
messageframe/src/util/event_test.go

@@ -1,18 +0,0 @@
-package util
-
-import (
-	"log"
-	"regexp"
-	"testing"
-)
-
-func TestEvent(t *testing.T) {
-	log.Println(SENDTO_TYPE_RAND_RECIVER, SENDTO_TYPE_P2P)
-}
-
-func TestReg(t *testing.T) {
-	reg, _ := regexp.Compile("<[^/]*</strong>")
-	msg := `<strong..sldfkjsdlf>238947askdlfjasldfj</strong>abcdefg`
-	ret := reg.ReplaceAllString(msg, "")
-	log.Println(ret)
-}

+ 0 - 19
messageframe/src/util/key.go

@@ -1,19 +0,0 @@
-package util
-
-import (
-	"math/rand"
-)
-
-const (
-	KEY = "abcdefghhijklmnopqrstuvwxyz0123456789ABCDEFJHIJKLMNOPQRSTUVWXYZ"
-)
-
-//
-func UUID(length int) string {
-	var ret string
-	for i := 0; i < length; i++ {
-		pos := rand.Intn(61)
-		ret += KEY[pos : pos+1]
-	}
-	return ret
-}

+ 0 - 132
messageframe/src/util/protocol.go

@@ -1,132 +0,0 @@
-package util
-
-//底层网络通信协议
-import (
-	"bufio"
-	"encoding/binary"
-	"encoding/json"
-	"fmt"
-	"io"
-	"net"
-)
-
-//自定义数据格式,Header(4字节)+Frame
-//
-type Reader struct {
-	conn   net.Conn
-	reader *bufio.Reader
-	buffer [4]byte
-}
-
-//
-type Writer struct {
-	conn       net.Conn
-	writeQueue chan RawData
-}
-
-//
-type RawData []byte //流数据
-
-//
-func NewReader(c net.Conn) *Reader {
-	return &Reader{
-		conn:   c,
-		reader: bufio.NewReader(c),
-	}
-}
-
-//
-func NewWriter(c net.Conn, wq chan RawData) *Writer {
-	return &Writer{
-		conn:       c,
-		writeQueue: wq,
-	}
-}
-
-//读取头部
-func (p *Reader) readHeader() (int32, error) {
-	buf := p.buffer[:4]
-	if _, err := io.ReadFull(p.reader, buf); err != nil {
-		return 0, err
-	}
-	size := int32(binary.BigEndian.Uint32(buf))
-	if size < 0 || size > 16384000 {
-		return 0, fmt.Errorf("Incorrect frame size (%d)", size)
-	}
-	return size, nil
-}
-
-//读取完整一帧数据,防止粘包
-func (p *Reader) readFrame(size int) ([]byte, error) {
-	var buf []byte
-	if size <= len(p.buffer) {
-		buf = p.buffer[0:size]
-	} else {
-		buf = make([]byte, size)
-	}
-	_, err := io.ReadFull(p.reader, buf)
-	return buf, err
-}
-
-//读取数据写入队列
-func forwardMessage(c net.Conn, queue chan<- RawData) {
-	defer c.Close()
-	logReader := NewReader(c)
-	for {
-		size, err := logReader.readHeader()
-		if err != nil {
-			break
-		}
-		data, err := logReader.readFrame(int(size))
-		if err != nil {
-			break
-		}
-		queue <- RawData(data)
-	}
-}
-
-//从队列中读取数据,定期处理
-func processMsg(q <-chan RawData, parseEvent func([]byte)) {
-	for {
-		select {
-		case msg := <-q:
-			parseEvent(msg)
-		}
-	}
-}
-
-//写数据
-func (w *Writer) Write(bs []byte) {
-	data := Enpacket(bs)
-	w.writeQueue <- RawData(data)
-}
-
-//写入的是对象,一般用map[string]interface{}
-func (w *Writer) WriteObj(obj interface{}) {
-	w.writeQueue <- RawData(EnpacketObj(obj))
-}
-
-//封包
-func Enpacket(bs []byte) []byte {
-	head := make([]byte, 4)
-	binary.BigEndian.PutUint32(head, uint32(len(bs)))
-	data := append(head)
-	data = append(data, bs...)
-	return data
-}
-
-//封包
-func EnpacketObj(obj interface{}) []byte {
-	bs, _ := json.Marshal(obj)
-	return Enpacket(bs)
-}
-
-//从缓冲区读取
-func (w *Writer) processWrite() {
-	for {
-		select {
-		case msg := <-w.writeQueue:
-			w.conn.Write(msg)
-		}
-	}
-}

+ 0 - 32
messageframe/src/util/server.go

@@ -1,32 +0,0 @@
-//服务端封装
-package util
-
-import (
-	"fmt"
-	"net"
-)
-
-//启动服务端
-func StartServer(parseEvent func([]byte),
-	processconnection func(conn net.Conn),
-	addr string) {
-	netListen, err := net.Listen("tcp", addr)
-	if err != nil {
-		fmt.Println(err.Error())
-	}
-	defer netListen.Close()
-	fmt.Println("等待连接,服务地址:", addr)
-	//接受消息
-	messageQueue := make(chan RawData, 2000) //并发1000
-	go processMsg(messageQueue, parseEvent)
-	for {
-		conn, err := netListen.Accept()
-		if err != nil {
-			continue
-		} else {
-			//告诉客户端ID,每次发消息都要携带自己ID
-			processconnection(conn)
-		}
-		go forwardMessage(conn, messageQueue)
-	}
-}

+ 0 - 21
messageframe/src/客户端/main.go

@@ -1,21 +0,0 @@
-package main
-
-import (
-	"net"
-	"time"
-	"util"
-)
-
-//
-var w *util.Writer //通常只使用writer,不要使用conn
-var conn net.Conn
-var my_id string //所有通信都要使用的
-var my_services []int = []int{util.SERVICE_ECPS_SPIDER_HN, util.EVENT_REQUEST_SPIDER_STATE}
-
-func main() {
-	w, conn = util.StartClient(func(data []byte) {
-		ProcessMsg(data)
-	}, "127.0.0.1:6060")
-	defer conn.Close()
-	time.Sleep(10 * time.Minute)
-}

+ 0 - 26
messageframe/src/客户端/processbusinessmsg.go

@@ -1,26 +0,0 @@
-package main
-
-import (
-	"log"
-	"util"
-)
-
-//业务消息处理
-func ProcessBusinessMsg(data map[string]interface{}) {
-	if v, ok := data["event"]; ok {
-		event := int(v.(float64))
-		switch event {
-		case util.EVENT_REQUEST_SPIDER_STATE: //回应,,请求爬虫状态
-			w.WriteObj(map[string]interface{}{
-				"myid":       my_id,
-				"event":      util.EVENT_RECIVE_SPIDER_STATE,
-				"sendtotype": util.SENDTO_TYPE_ALL_RECIVER,
-				"data":       "状态良好",
-			})
-		case util.SERVICE_ECPS_SPIDER_HN: //爬取河南工商公示数据
-			log.Println("爬河南公示数据")
-		default:
-			log.Println("服务器发过来的请求,我无法处理", data)
-		}
-	}
-}

+ 0 - 36
messageframe/src/客户端/processmsg.go

@@ -1,36 +0,0 @@
-package main
-
-import (
-	"encoding/json"
-	"log"
-	"time"
-	"util"
-)
-
-//通用事件处理(一般不要改这个文件)
-func ProcessMsg(msg []byte) {
-	tmp := map[string]interface{}{}
-	json.Unmarshal(msg, &tmp)
-	if v, ok := tmp["event"]; ok {
-		event := int(v.(float64))
-		switch event {
-		case util.EVENT_RETURN_MACHINE_ID: //服务端分配id,发布我能处理的时间
-			my_id = tmp["data"].(string)
-			w.WriteObj(map[string]interface{}{
-				"myid":  my_id,
-				"event": util.EVENT_PUBLISH_MYSERVICES,
-				"data":  my_services,
-			})
-			log.Println("服务器回应了机器ID")
-		case util.EVENT_REQUEST_HEARTBEAT: //请求的心跳,回应心跳请求
-			w.WriteObj(map[string]interface{}{
-				"myid":  my_id,
-				"event": util.EVENT_RETURN_HEARTBEAT,
-				"data":  time.Now().Unix(),
-			})
-			log.Println("对服务器回应了本机心跳")
-		default: //业务处理
-			ProcessBusinessMsg(tmp)
-		}
-	}
-}

+ 0 - 155
messageframe/src/服务端/main.go

@@ -1,155 +0,0 @@
-package main
-
-import (
-	"encoding/json"
-	"flag"
-	"log"
-	"math/rand"
-	"net"
-	"sync"
-	"time"
-	"util"
-)
-
-type Client struct {
-	conn      net.Conn
-	timestamp int64
-}
-
-var lock sync.Mutex
-
-//所有的请求
-var allclient map[string]*Client = make(map[string]*Client)
-
-//服务与提供者对应表
-var allservice map[int][]string = make(map[int][]string)
-
-//
-
-//心跳检测,每隔20秒检测一次
-func GC() {
-	now := time.Now().Unix()
-	for k, v := range allclient {
-		if now-v.timestamp > gcinterval*3 {
-			//3次GC未回应心跳
-			v.conn.Close()
-			removeClient(k)
-			continue
-		}
-		_, err := v.conn.Write(util.EnpacketObj(map[string]interface{}{
-			"event": util.EVENT_REQUEST_HEARTBEAT,
-		}))
-		if err != nil { //发心跳包出错
-			v.conn.Close()
-			removeClient(k)
-		}
-	}
-	time.AfterFunc(time.Duration(gcinterval)*time.Second, GC)
-}
-
-//删除服务节点
-func removeClient(myid string) {
-	lock.Lock()
-	delete(allclient, myid)
-	for k, v := range allservice {
-		for j, smid := range v {
-			if smid == myid {
-				allservice[k] = append(v[:j], v[j+1:]...)
-				break
-			}
-		}
-	}
-	lock.Unlock()
-	log.Println("删除节点", myid, allservice)
-}
-
-//处理客户端发过来的消息
-func processmsg(msg []byte) {
-	tmp := map[string]interface{}{}
-	json.Unmarshal(msg, &tmp)
-	my_id := tmp["myid"].(string)
-	if v, ok := tmp["event"]; ok {
-		event := int(v.(float64))
-		switch event {
-		//TODO 只写需要特殊处理的时间,其他都走default
-		case util.EVENT_RETURN_HEARTBEAT: //心跳回应包处理
-			allclient[my_id].timestamp = int64(tmp["data"].(float64))
-			log.Println("更新", my_id, "的心跳时间")
-		case util.EVENT_PUBLISH_MYSERVICES: //客户端发布了自己的服务
-			services := tmp["data"].([]interface{}) //一个客户端提供多个可处理的服务
-			for _, v := range services {
-				service := int(v.(float64))
-				allservice[service] = append(allservice[service], my_id)
-			}
-			log.Println("所有服务", allservice)
-		default: //处理业务事件
-			//识别发送类型
-			var sttype int
-			if sendtotype, ok := tmp["sendtotype"]; ok {
-				sttype = int(sendtotype.(float64))
-			} else {
-				sttype = util.SENDTO_TYPE_RAND_RECIVER
-			}
-			bs := util.Enpacket(msg)            //待发送数据
-			if sttype == util.SENDTO_TYPE_ALL { //发送给所有节点
-				for service_machine_id, v := range allclient { //发所有,不支持的不处理
-					if service_machine_id == my_id { //广播不用发给自己
-						continue
-					}
-					v.conn.Write(bs)
-				}
-			}
-			if v, ok := allservice[event]; ok {
-				switch sttype {
-				case util.SENDTO_TYPE_RAND_RECIVER: //随机选择一个节点提供服务,允许出错尝试3次
-					for i := 0; i < 3; i++ {
-						service_machine_id := v[rand.Intn(len(v))]
-						_, err := allclient[service_machine_id].conn.Write(bs)
-						if err == nil {
-							break
-						} else {
-							removeClient(service_machine_id)
-						}
-					}
-				case util.SENDTO_TYPE_ALL_RECIVER:
-					if v, ok := allservice[event]; ok {
-						for _, service_machine_id := range v {
-							if service_machine_id == my_id { //广播不用发给自己
-								continue
-							}
-							allclient[service_machine_id].conn.Write(bs)
-						}
-					}
-				case util.SENDTO_TYPE_P2P:
-					to := tmp["to"].(string)
-					if v2, ok2 := allclient[to]; ok2 {
-						v2.conn.Write(bs)
-					}
-				}
-
-			}
-		}
-	}
-}
-
-var port string
-var gcinterval int64
-
-//
-func main() {
-	flag.StringVar(&port, "p", "6060", "开放端口")
-	flag.Int64Var(&gcinterval, "g", 20, "GC间隔时间")
-	flag.Parse()
-	//心跳检测
-	go GC()
-	//启动服务
-	util.StartServer(func(data []byte) {
-		//接受消息处理
-		processmsg(data)
-	}, func(c net.Conn) { //连接后返回UUID
-		uuid := util.UUID(32)
-		c.Write(util.EnpacketObj(map[string]interface{}{"event": util.EVENT_RETURN_MACHINE_ID, "data": uuid}))
-		allclient[uuid] = &Client{conn: c, timestamp: time.Now().Unix()}
-	}, ":"+port)
-
-}

+ 0 - 50
messageframe/src/爬虫监控/main.go

@@ -1,50 +0,0 @@
-package main
-
-import (
-	"flag"
-	"log"
-	"net"
-	"time"
-	"util"
-)
-
-//
-var w *util.Writer //通常只使用writer,不要使用conn
-var conn net.Conn
-var my_id string                                              //所有通信都要使用的
-var my_services []int = []int{util.EVENT_RECIVE_SPIDER_STATE} //接受爬虫状态
-
-func GC() {
-	w.WriteObj(map[string]interface{}{
-		"myid":       my_id,
-		"event":      util.EVENT_REQUEST_SPIDER_STATE,
-		"sendtotype": util.SENDTO_TYPE_ALL_RECIVER,
-	})
-	time.AfterFunc(20*time.Second, GC) //20秒查一次爬虫状态
-}
-
-func main() {
-	var serveraddr string
-	var dogc bool
-	flag.StringVar(&serveraddr, "s", "127.0.0.1:6060", "服务端地址")
-	flag.BoolVar(&dogc, "g", false, "是否运行GC,主监控控制gc就可以了,其他点,可以制作查看")
-	flag.Parse()
-	log.Println(serveraddr, dogc)
-	w, conn = util.StartClient(func(data []byte) {
-		ProcessMsg(data)
-	}, serveraddr)
-	defer conn.Close()
-	time.Sleep(10 * time.Second) //等,回应machineid
-	if dogc {
-		go GC()
-	}
-	//模拟发100个河南爬虫任务
-	for i := 0; i < 100; i++ { //
-		w.WriteObj(map[string]interface{}{
-			"myid":  my_id,
-			"event": util.SERVICE_ECPS_SPIDER_HN,
-			"data":  "下载数据要携带的参数",
-		})
-	}
-	time.Sleep(10 * time.Minute)
-}

+ 0 - 19
messageframe/src/爬虫监控/processbusinessmsg.go

@@ -1,19 +0,0 @@
-package main
-
-import (
-	"log"
-	"util"
-)
-
-//业务消息处理
-func ProcessBusinessMsg(data map[string]interface{}) {
-	if v, ok := data["event"]; ok {
-		event := int(v.(float64))
-		switch event {
-		case util.EVENT_RECIVE_SPIDER_STATE: //收到爬虫状态
-			log.Println(data)
-		default:
-			log.Println("服务器发过来的请求,我无法处理", data)
-		}
-	}
-}

+ 0 - 36
messageframe/src/爬虫监控/processmsg.go

@@ -1,36 +0,0 @@
-package main
-
-import (
-	"encoding/json"
-	"log"
-	"time"
-	"util"
-)
-
-//通用时间处理
-func ProcessMsg(msg []byte) {
-	tmp := map[string]interface{}{}
-	json.Unmarshal(msg, &tmp)
-	if v, ok := tmp["event"]; ok {
-		event := int(v.(float64))
-		switch event {
-		case util.EVENT_RETURN_MACHINE_ID: //服务端分配id,发布我能处理的时间
-			my_id = tmp["data"].(string)
-			w.WriteObj(map[string]interface{}{
-				"myid":  my_id,
-				"event": util.EVENT_PUBLISH_MYSERVICES,
-				"data":  my_services,
-			})
-			log.Println("服务器回应了机器ID")
-		case util.EVENT_REQUEST_HEARTBEAT: //请求的心跳,回应心跳请求
-			w.WriteObj(map[string]interface{}{
-				"myid":  my_id,
-				"event": util.EVENT_RETURN_HEARTBEAT,
-				"data":  time.Now().Unix(),
-			})
-			log.Println("对服务器回应了本机心跳")
-		default:
-			ProcessBusinessMsg(tmp)
-		}
-	}
-}

+ 9 - 7
weixin/src/endless/endless.go

@@ -89,7 +89,7 @@ type endlessServer struct {
 NewServer returns an intialized endlessServer Object. Calling Serve on it will
 actually "start" the server.
 */
-func NewServer(addr string, handler http.Handler) (srv *endlessServer) {
+func NewServer(addr string, handler http.Handler, fn func()) (srv *endlessServer) {
 	runningServerReg.Lock()
 	defer runningServerReg.Unlock()
 	if !flag.Parsed() {
@@ -109,7 +109,9 @@ func NewServer(addr string, handler http.Handler) (srv *endlessServer) {
 		isChild: isChild,
 		SignalHooks: map[int]map[os.Signal][]func(){
 			PRE_SIGNAL: map[os.Signal][]func(){
-				syscall.SIGHUP:  []func(){},
+				syscall.SIGHUP: []func(){
+					fn,
+				},
 				syscall.SIGUSR1: []func(){},
 				syscall.SIGUSR2: []func(){},
 				syscall.SIGINT:  []func(){},
@@ -146,8 +148,8 @@ ListenAndServe listens on the TCP network address addr and then calls Serve
 with handler to handle requests on incoming connections. Handler is typically
 nil, in which case the DefaultServeMux is used.
 */
-func ListenAndServe(addr string, handler http.Handler) error {
-	server := NewServer(addr, handler)
+func ListenAndServe(addr string, handler http.Handler, fn func()) error {
+	server := NewServer(addr, handler, fn)
 	return server.ListenAndServe()
 }
 
@@ -158,8 +160,8 @@ private key for the server must be provided. If the certificate is signed by a
 certificate authority, the certFile should be the concatenation of the server's
 certificate followed by the CA's certificate.
 */
-func ListenAndServeTLS(addr string, certFile string, keyFile string, handler http.Handler) error {
-	server := NewServer(addr, handler)
+func ListenAndServeTLS(addr string, certFile string, keyFile string, handler http.Handler, destoryfn func()) error {
+	server := NewServer(addr, handler, destoryfn)
 	return server.ListenAndServeTLS(certFile, keyFile)
 }
 
@@ -418,7 +420,7 @@ func (srv *endlessServer) hammerTime(d time.Duration) {
 func (srv *endlessServer) fork() (err error) {
 	runningServerReg.Lock()
 	defer runningServerReg.Unlock()
-	
+
 	// only one server isntance should fork!
 	if runningServersForked {
 		return errors.New("Another process already forked. Ignoring this one.")

+ 3 - 1
weixin/src/main.go

@@ -38,5 +38,7 @@ func main() {
 	rpc.StartWeixinRpc(weixin.Mux)
 	//启动web服务
 	//http.ListenAndServe(":"+wf.SysConfig.Port, nil) // 启动接收微信数据服务器
-	endless.ListenAndServe(":"+wf.SysConfig.Port, nil)
+	endless.ListenAndServe(":"+wf.SysConfig.Port, nil, func() {
+		rpc.DestoryRpc()
+	})
 }

+ 12 - 1
weixin/src/qfw/weixin/rpc/rpc.go

@@ -200,15 +200,26 @@ func (wxrpc *WeiXinRpc) SendOffLineMsg(param *qrpc.NotifyMsg, ret *qrpc.RpcResul
 	return
 }
 
+var listen net.Listener
+
 func StartWeixinRpc(wx *weixin.Weixin) {
 	wrpc := &WeiXinRpc{wx: wx}
 	//在此可以注册多个Rpc服务接口
 	rpc.Register(wrpc)
 	rpc.HandleHTTP()
-	listen, err := net.Listen("tcp", ":"+wf.SysConfig.Rpcport)
+	var err error
+	listen, err = net.Listen("tcp", ":"+wf.SysConfig.Rpcport)
 	if err != nil {
 		log.Println(err.Error())
 	} else {
 		go http.Serve(listen, nil)
 	}
 }
+
+//
+func DestoryRpc() {
+	if listen != nil {
+		log.Println("close weixin rpc netlisten")
+		listen.Close()
+	}
+}

+ 29 - 9
weixin/src/qfw/weixin/voicehandler.go

@@ -13,7 +13,7 @@ type ItemMap map[string]string
 //语音消息智能处理,消息暂时放在内存中
 func MsgVoiceHandler(w ResponseWriter, r *Request) {
 	if len(r.Recognition) == 0 {
-		w.ReplyText("对不起,您说的我听不懂")
+		w.ReplyText("要使用语音查询企业功能,请说“搜索”和要查询的企业名称。")
 		return
 	}
 	tmp := clear_voice_reg.ReplaceAllString(r.Recognition, "")
@@ -26,14 +26,19 @@ func MsgVoiceHandler(w ResponseWriter, r *Request) {
 		} else if len(ret) == 0 {
 			w.ReplyText("查询 " + search + " 无结果")
 		} else {
+			yytitle := fmt.Sprintf("您搜索的是:" + search)
+			mrpic := "http://" + wf.SysConfig.Domain + "/images/mrpic.png"
 			arts := []Article{}
+			arts = append(arts, Article{Title: yytitle, PicUrl: mrpic})
 			for _, item := range ret {
-				url := fmt.Sprintf("http://%s/enterprise/%s.html", wf.SysConfig.Domain, item["_id"])
-				arts = append(arts, Article{Title: item["EntName"], Url: url})
+				url := fmt.Sprintf("http://%s/wx/enterprise/%s.html", wf.SysConfig.Domain, item["_id"])
+				arts = append(arts, Article{Title: item["EntName"], Url: url, PicUrl: "http://" + wf.SysConfig.Domain + item["s_avatar"]})
 			}
 			w.ReplyNews(arts)
 		}
-	}  
+	} else {
+		w.ReplyText("要使用语音查询企业功能,请说“搜索”和要查询的企业名称。")
+	}
 }
 
 //查询企业
@@ -55,7 +60,7 @@ func findEntprise(keyword string) (ret []ItemMap, err error) {
 		  },
 		  "from": 0,
 		  "size": 5,
-		  "_source":["_id","EntName","EntTypeName","OpLocDistrictName"]
+		  "_source":["_id","EntName","EntTypeName","OpLocDistrictName","s_avatar"]
 		}`
 	client := elastic.GetEsConn()
 	defer elastic.DestoryEsConn(client)
@@ -73,12 +78,27 @@ func findEntprise(keyword string) (ret []ItemMap, err error) {
 			var res map[string]interface{}
 			json.Unmarshal(*hit.Source, &res)
 			tmp := map[string]string{}
-			tmp["_id"] = res["_id"].(string)
-			tmp["EntName"] = res["EntName"].(string)
-			tmp["EntTypeName"] = res["EntTypeName"].(string)
-			tmp["OpLocDistrictName"] = res["OpLocDistrictName"].(string)
+			tmp["_id"] = sNull(res["_id"])
+			tmp["EntName"] = sNull(res["EntName"])
+			tmp["EntTypeName"] = sNull(res["EntTypeName"])
+			tmp["OpLocDistrictName"] = sNull(res["OpLocDistrictName"])
+			s_avatar := sNull(res["s_avatar"])
+			if s_avatar != "" {
+				tmp["s_avatar"] = s_avatar
+			} else {
+				tmp["s_avatar"] = "/images/ent-logo.png"
+			}
 			ret = append(ret, tmp)
 		}
 	}
 	return
 }
+
+//转移空字符
+func sNull(src interface{}) string {
+	if src == nil {
+		return ""
+	} else {
+		return src.(string)
+	}
+}