Jianghan 5 年之前
父節點
當前提交
6816395dc0

二進制
src/doc/关键词导入模版.xlsx


二進制
src/doc/剑鱼维护—数据批量修改模板.xlsx


+ 12 - 1
src/front/front.go

@@ -35,6 +35,7 @@ type Front struct {
 	personalMenu   xweb.Mapper `xweb:"/front/personalMenu"`
 	//role
 	roleManager    xweb.Mapper `xweb:"/front/role"`             //角色权限管理
+	roleNew		   xweb.Mapper `xweb:"/front/role/save"`		   //新增角色
 	roleEdit       xweb.Mapper `xweb:"/front/role/edit/(.*)"`   //角色权限查看
 	roleFirst      xweb.Mapper `xweb:"/front/role/first"`       //一级权限的查看
 	roleSecond     xweb.Mapper `xweb:"/front/role/second"`      //二级权限的查看
@@ -105,6 +106,14 @@ func (f *Front) UpdatePwd() {
 
 func (f *Front) User() {
 	defer qu.Catch()
+	role, _ := Mgo.Find("role", nil, nil, nil, false, -1, -1)
+	roleMap := make(map[string]string)
+	for _, v := range *role{
+		level := qu.ObjToString(v["level"])
+		if level != "" {
+			roleMap[level] = qu.ObjToString(v["name"])
+		}
+	}
 	if f.Method() == "POST" {
 		query := bson.M{
 			"s_role": bson.M{
@@ -114,12 +123,14 @@ func (f *Front) User() {
 		data, _ := Mgo.Find("user", query, `{"_id":1}`, nil, false, -1, -1)
 		for _, d := range *data {
 			d["s_pwd"] = qu.SE.DecodeString(qu.ObjToString(d["s_pwd"]))
+			d["role_name"] = roleMap[qu.ObjToString(d["s_role"])]
 		}
 		f.ServeJson(map[string]interface{}{
 			"data": data,
 		})
 	} else {
-		f.Render("com/user.html")
+		f.T["role"] = roleMap
+		f.Render("com/user.html", &f.T)
 	}
 }
 

+ 40 - 1
src/front/role.go

@@ -11,7 +11,46 @@ import (
 
 func (f *Front) RoleManager() {
 	defer qu.Catch()
-	f.Render("com/role.html")
+	if f.Method() == "POST" {
+		data, _ := Mgo.Find("role", nil, nil, nil, false, -1, -1);
+		f.ServeJson(map[string]interface{}{
+			"data": data,
+		})
+	}else {
+		f.Render("com/role.html")
+	}
+}
+
+func (f *Front) RoleNew() {
+	defer qu.Catch()
+	if f.Method() == "POST" {
+		name := f.GetString("role_name")
+		level := f.GetString("role_level")
+		_id := f.GetString("_id")
+		if _id != "" {
+			set := bson.M{
+				"$set": bson.M{
+					"name": name,
+					"level": level,
+				},
+			}
+			bol := Mgo.UpdateById("role", qu.StringTOBsonId(_id), set)
+			if bol {
+				f.ServeJson(map[string]interface{}{
+					"rep": true,
+				})
+			}
+		}else {
+			_id := Mgo.Save("role", bson.M{"name": name, "level": level})
+			if _id != "" {
+				f.ServeJson(map[string]interface{}{
+					"rep": true,
+				})
+			}
+		}
+	}else {
+		f.Render("com/role.html")
+	}
 }
 
 func (f *Front) RoleEdit(role string) {

+ 26 - 0
src/service/repair_pro_service.go

@@ -0,0 +1,26 @@
+package service
+
+import (
+	qu "qfw/util"
+	. "util"
+)
+
+func (jy *RepairRule) RepairPro() {
+	defer qu.Catch()
+	if jy.Method() == "POST" {
+		start, _ := jy.GetInteger("start")
+		limit, _ := jy.GetInteger("length")
+		draw, _ := jy.GetInteger("draw")
+
+		data, _ := Mgo.Find(JyProRecord, nil, `{"i_modifytime": -1}`, nil, false, start, limit)
+		count := Mgo.Count(JyProRecord, nil)
+		jy.ServeJson(map[string]interface{}{
+			"draw":            draw,
+			"data":            data,
+			"recordsFiltered": count,
+			"recordsTotal":    count,
+		})
+	} else {
+		jy.Render("repair/jy_pro_repair.html")
+	}
+}

+ 27 - 25
src/service/repair_rule.go → src/service/repair_service.go

@@ -26,24 +26,26 @@ var (
 
 type RepairRule struct {
 	*xweb.Action
-	repairList    xweb.Mapper `xweb:"/service/jianyu/repair"`
-	searchID      xweb.Mapper `xweb:"/service/jianyu/searchID"`
-	searchJyurl   xweb.Mapper `xweb:"/service/jianyu/searchJyurl"`
-	repairEdit    xweb.Mapper `xweb:"/service/jianyu/edit"`
-	repairDelete  xweb.Mapper `xweb:"/service/jianyu/delete"`
-	repairSave    xweb.Mapper `xweb:"/service/jianyu/save"`
-	repairCreate  xweb.Mapper `xweb:"/service/jianyu/create"`
-	repairNewSave xweb.Mapper `xweb:"/service/jianyu/newSave"`
-
-	repairBulk	  xweb.Mapper `xweb:"/service/jianyu/bulk_repair"`
-	repairImport  xweb.Mapper `xweb:"/service/jianyu/importData"`
-	repairModify  xweb.Mapper `xweb:"/service/jianyu/modifySave"`
-	repairRecord  xweb.Mapper `xweb:"/service/jianyu/modifyRecord"`
+	repairList    xweb.Mapper `xweb:"/service/jy/repair"`
+	searchID      xweb.Mapper `xweb:"/service/jy/searchID"`
+	searchJyurl   xweb.Mapper `xweb:"/service/jy/searchJyurl"`
+	repairEdit    xweb.Mapper `xweb:"/service/jy/edit"`
+	repairDelete  xweb.Mapper `xweb:"/service/jy/delete"`
+	repairSave    xweb.Mapper `xweb:"/service/jy/save"`
+	repairCreate  xweb.Mapper `xweb:"/service/jy/create"`
+	repairNewSave xweb.Mapper `xweb:"/service/jy/newSave"`
+
+	repairBulk	  xweb.Mapper `xweb:"/service/jy/bulk_repair"`
+	repairImport  xweb.Mapper `xweb:"/service/jy/importData"`
+	repairModify  xweb.Mapper `xweb:"/service/jy/modifySave"`
+	repairRecord  xweb.Mapper `xweb:"/service/jy/modifyRecord"`
+
+	repairPro	  xweb.Mapper `xweb:"/service/jy/pro/repair"`
 }
 
 func (jy *RepairRule) RepairList() {
 	defer qu.Catch()
-	jy.Render("repair/jianyu_repair.html")
+	jy.Render("repair/jy_repair.html")
 }
 
 //新增数据
@@ -58,7 +60,7 @@ func (jy *RepairRule) RepairCreate() {
 		"toptype":    "",
 		"subtype":    "",
 		"area":       ""}
-	jy.Render("repair/jianyu_create.html", &jy.T)
+	jy.Render("repair/jy_create.html", &jy.T)
 }
 
 //新增数据
@@ -169,7 +171,7 @@ func (jy *RepairRule) RepairEdit() {
 	jy.T["data"] = *data
 	jy.T["coll"] = coll
 
-	jy.Render("repair/jianyu_edit.html", &jy.T)
+	jy.Render("repair/jy_edit.html", &jy.T)
 }
 
 //删除
@@ -266,13 +268,11 @@ func (jy *RepairRule) RepairSave() {
 			pt := int64(0)
 			(*updata)["publishtime"] = pt
 		}
-
 		if val, ok := (*updata)["infoformat"]; ok {
 			(*updata)["infoformat"] = qu.IntAll(val)
 		} else {
 			(*updata)["infoformat"] = 1
 		}
-
 		(*updata)["extracttype"] = 0
 
 		query := bson.M{
@@ -294,9 +294,7 @@ func (jy *RepairRule) RepairSave() {
 				"$set": *updata,
 			}
 		}
-		for v, k := range *updata{
-			qu.Debug(v, k)
-		}
+		FormatNumber(*updata)
 		rep := JYMgo.Update(coll, query, set, true, false)
 		qu.Debug("mgo id:" + id + "------", rep)
 		if !rep {
@@ -450,7 +448,7 @@ func detailClear(detail string) string {
 
 func (jy *RepairRule) RepairBulk()  {
 	defer qu.Catch()
-	jy.Render("repair/jianyu_bulk.html")
+	jy.Render("repair/jy_bulk.html")
 }
 
 func (jy *RepairRule) RepairRecord() {
@@ -464,8 +462,8 @@ func (jy *RepairRule) RepairRecord() {
 		query := bson.M{}
 		if search != "" {
 			query["$or"] = []interface{}{
-				bson.M{"s_customer": bson.M{"$regex": search}},
-				bson.M{"s_tagname": bson.M{"$regex": search}},
+				//bson.M{"s_customer": bson.M{"$regex": search}},
+				//bson.M{"s_tagname": bson.M{"$regex": search}},
 			}
 		}
 
@@ -478,7 +476,7 @@ func (jy *RepairRule) RepairRecord() {
 			"recordsTotal":    count,
 		})
 	} else {
-		jy.Render("repair/jianyu_bulk.html")
+		jy.Render("repair/jy_bulk.html")
 	}
 }
 
@@ -560,6 +558,10 @@ func ModifyData(tmp map[string]interface{}, user map[string]interface{}) (err ma
 		if strings.EqualFold(strings.ToUpper(qu.ObjToString(v)), "DEL") {
 			del_data[k] = ""
 			delete(new_data, k)
+		}else if k == "budget" || k == "bidamount" {
+			new_data[k] = qu.Float64All(v)
+		}else if k == "publishtime" || k == "bidopentime" || k == "signaturedate" {
+			new_data[k] = qu.Int64All(v)
 		}else {
 			new_data[k] = v
 		}

+ 15 - 3
src/util/config.go

@@ -12,6 +12,7 @@ var (
 	Mgo             *mongodb.MongodbSim
 	JYMgo			*mongodb.MongodbSim
 	MgoEn           *mongodb.MongodbSim
+	JyProMgo		*mongodb.MongodbSim
 	EsIndex, EsType string
 	MgoEnC          string
 	Subday          float64
@@ -19,6 +20,8 @@ var (
 	JyCollNameOne   string
 	JyCollNameTwo   string
 	JyRecord		string
+	JyMgoColl		string
+	JyProRecord		string
 	RedisJYName		string
 	RedisDelKey1	string
 	RedisDelKey2	string
@@ -49,8 +52,6 @@ func InitMgoPool() {
 	Mgo.InitPool()
 }
 
-
-
 func initMgoEn() {
 	MgoEn = &mongodb.MongodbSim{
 		MongodbAddr: qu.ObjToString(Sysconfig["mgodben"]),
@@ -70,8 +71,19 @@ func initJYMgo()  {
 	}
 	JyCollNameOne = qu.ObjToString(jymgo["jycollname1"])
 	JyCollNameTwo = qu.ObjToString(jymgo["jycollname2"])
-	JyRecord = "jymodifylog"
+	JyRecord = qu.ObjToString(Sysconfig["jy_info_back"])
+	JyProRecord = qu.ObjToString(Sysconfig["jy_pro_back"])
 	JYMgo.InitPool()
+
+	//项目
+	jypro := *qu.ObjToMap(Sysconfig["jy_pro"])
+	JyProMgo = &mongodb.MongodbSim{
+		MongodbAddr: qu.ObjToString(jypro["mgodb"]),
+		Size: 		 qu.IntAll(jypro["dbsize"]),
+		DbName: 	 qu.ObjToString(jypro["dbname"]),
+	}
+	JyMgoColl = qu.ObjToString(jypro["coll"])
+	JyProMgo.InitPool()
 }
 
 func initJYRedis()  {

+ 1 - 3
src/util/parsxlsx.go

@@ -368,9 +368,7 @@ func ParsJyData(filebyte []byte) ([]map[string]interface{}, error) {
 			if i == 0 {
 				keyName = append(keyName, vv.Value)
 			}else {
-				if strings.EqualFold(strings.ToUpper(vv.Value), "DEL") {
-					data[keyName[ii]] = vv.Value
-				}else if vv.Value != "" {
+				if vv.Value != "" {
 					data[keyName[ii]] = vv.Value
 				}
 			}

+ 15 - 0
src/util/util.go

@@ -1,7 +1,10 @@
 package util
 
 import (
+	"github.com/shopspring/decimal"
 	"net/http"
+	qu "qfw/util"
+	"reflect"
 	"strconv"
 )
 
@@ -43,3 +46,15 @@ func deleteSlice(arr []string, v string) []string {
 	}
 	return arr
 }
+
+/**
+ *	前端科学计数法处理
+ */
+func FormatNumber(tmp map[string]interface{}) {
+	for k, v := range tmp{
+		if reflect.TypeOf(v).Name() == reflect.Float64.String() {
+			num, _ := decimal.NewFromString(strconv.FormatFloat(qu.Float64All(v), 'e', -1, 64))
+			tmp[k], _ = num.Float64()
+		}
+	}
+}

+ 107 - 19
src/web/templates/com/role.html

@@ -7,39 +7,26 @@
 <!-- Content Wrapper. Contains page content -->
 <div class="content-wrapper">
     <section class="content-header">
+        <h1>
+            <small><a onclick="addRole()" class="btn btn-primary opr">新增角色</a></small>
+        </h1>
         <ol class="breadcrumb">
             <li><a href="/front/role"><i class="fa fa-dashboard"></i> 角色管理</a></li>
         </ol>
     </section>
     <!-- Main content -->
     <section class="content">
-        <br>
         <div class="row">
             <div class="col-xs-12">
                 <div class="box">
                     <div class="box-body">
                         <table id="dataTable" class="table table-bordered table-hover">
-
                             <thead>
                             <tr>
                                 <th>角色名称</th>
                                 <th>编辑</th>
                             </tr>
                             </thead>
-                            <tbody>
-                                <tr>
-                                    <td>系统管理员</td>
-                                    <td><a class="btn btn-sm btn-success" href="/front/role/edit/0">编辑</a></td>
-                                </tr>
-                                <tr>
-                                    <td>管理员</td>
-                                    <td><a class="btn btn-sm btn-success" href="/front/role/edit/1">编辑</a></td>
-                                </tr>
-                                <tr>
-                                    <td>开发员</td>
-                                    <td><a class="btn btn-sm btn-success" href="/front/role/edit/2">编辑</a></td>
-                                </tr>
-                            </tbody>
                         </table>
                     </div>
                     <!-- /.box-body -->
@@ -49,10 +36,111 @@
         </div>
     </section>
 </div>
+
+<div class="modal fade" id="modal-new-role" tabindex="-1" role="dialog" aria-hidden="true">
+    <div class="modal-dialog">
+        <div class="modal-content">
+            <div class="modal-header">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+                    <div class="edit-form">
+                        <div class="edit-info">
+                            <span class="glyphicon glyphicon-ok-sign" aria-hidden="true"></span>
+                            <span>新增角色</span>
+                        </div>
+                        <form class="form-horizontal text-center">
+                            <div class="form-group">
+                                <label class="col-sm-3 control-label"><span style="color:red;">* </span>角色名称</label>
+                                <div class="col-sm-5">
+                                    <input type="text" required class="form-control" placeholder="名称" id="role_name"/></div>
+                            </div>
+                            <div class="form-group">
+                                <label class="col-sm-3 control-label"><span style="color:red;">* </span>角色等级</label>
+                                <div class="col-sm-5">
+                                    <input type="text" required class="form-control" style="max-width: 100%" placeholder="2/3/4" id="role_level"/></div>
+                            </div>
+                        </form>
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <input type="button" onclick="saveRole()" class="btn btn-primary saveBtn" value="保存">
+                    <input type="button" onclick="cancelModel()" class="btn btn-default" style="margin-left: 24px"
+                           value="取消">
+                </div>
+            </div>
+        </div>
+    </div><!-- /.modal -->
+</div>
+<!-- footer -->
+{{include "com/footer.html"}}
 <script>
     menuActive("role")
+    var _id = ""
+
+    ttable = $('#dataTable').DataTable({
+        "paging"      : true,
+        "lengthChange": false,
+        "searching"   : false,
+        "ordering"    : false,
+        "info"        : true,
+        "autoWidth"   : false,
+        "ajax": {
+            "url": "/front/role",
+            "type": "post",
+            "data": {}
+        },
+        "language": {
+            "url": "/dist/js/dataTables.chinese.lang"
+        },
+        "columns": [
+            { "data": "name"},
+            { "data": "level", render: function(val, a, row){
+                if (val == "0") {
+                    return "<a class='btn btn-sm btn-danger disabled'>编辑</a> &nbsp;" +
+                        "<a class='btn btn-sm btn-success' href='/front/role/edit/"+val+"'>角色菜单</a>"
+                }else {
+                    return "<a class='btn btn-sm btn-danger' onclick='editRole(\""+row['_id']+"\",\""+row['name']+"\",\""+row['level']+"\")'>编辑</a> &nbsp;" +
+                        "<a class='btn btn-sm btn-success' href='/front/role/edit/"+val+"'>角色菜单</a>"
+                }
+            }}
+        ]
+    });
+
+    function addRole() {
+        _id = ""
+        $('#role_name').val("")
+        $('#role_level').val("")
+        $('#modal-new-role').modal("show");
+    }
+    function cancelModel() {
+        $('#modal-new-role').modal("hide");
+    }
+    function saveRole() {
+        var name = $('#role_name').val();
+        var levle = $('#role_level').val();
+        if (name == "" || levle == "") {
+            alert("请填写必填项")
+            return
+        }
+        $.ajax({
+            url:"/front/role/save",
+            type:"post",
+            data:{"role_name": name, "role_level": levle, "_id": _id},
+            success:function(r){
+                if(r.rep){
+                    $("#modal-new-role").modal("hide");
+                    ttable.ajax.reload();
+                }else{
+                    alert("保存失败");
+                }
+            }
+        })
+    }
+    function editRole(id, name, level) {
+        _id = id
+        $('#role_name').val(name)
+        $('#role_level').val(level)
+        $('#modal-new-role').modal("show");
+    }
 </script>
-<!-- /.modal -->
 
-<!-- footer -->
-{{include "com/footer.html"}}

+ 189 - 186
src/web/templates/com/user.html

@@ -6,200 +6,203 @@
 
 <!-- Content Wrapper. Contains page content -->
 <div class="content-wrapper">
-	<section class="content-header">
-		<h1>
-			<small><button type="button" class="btn btn-primary" data-toggle="modal" onclick="add()">新增用户</button></small>
-		</h1>
-		<ol class="breadcrumb">
-		  <li><a href="/front/user"><i class="fa fa-dashboard"></i> 人员管理</a></li>
-		</ol>
+    <section class="content-header">
+        <h1>
+            <small>
+                <button type="button" class="btn btn-primary" data-toggle="modal" onclick="add()">新增用户</button>
+            </small>
+        </h1>
+        <ol class="breadcrumb">
+            <li><a href="/front/user"><i class="fa fa-dashboard"></i> 人员管理</a></li>
+        </ol>
+    </section>
+    <!-- Main content -->
+    <section class="content">
+        <div class="row">
+            <div class="col-xs-12">
+                <div class="box">
+                    <div class="box-body">
+                        <table id="dataTable" class="table table-bordered table-hover">
+                            <thead>
+                            <tr>
+                                <th>编号</th>
+                                <th>账号</th>
+                                <th>姓名</th>
+                                <th>角色</th>
+                                <th>操作</th>
+                            </tr>
+                            </thead>
+                        </table>
+                    </div>
+                    <!-- /.box-body -->
+                </div>
+                <!-- /.box -->
+            </div>
+        </div>
     </section>
-  <!-- Main content -->
-  <section class="content">
-      <div class="row">
-	      <div class="col-xs-12">
-	        <div class="box">
-		        <div class="box-body">
-		            <table id="dataTable" class="table table-bordered table-hover">
-		              <thead>
-		              <tr>
-		                <th>编号</th>
-						<th>账号</th>
-						<th>姓名</th>
-						<th>角色</th>
-						<th>操作</th>
-		              </tr>
-		              </thead>
-		            </table>
-		        </div>
-	          <!-- /.box-body -->
-	        </div>
-        <!-- /.box -->
-		</div>
-	</div>
-  </section>
 </div>
-  
+
 <div class="modal fade" id="modal-info">
-  	<div class="modal-dialog">
-	    <form id="userform" class="form-horizontal" role="form">
-		<div class="modal-content">
-		    <div class="modal-header">
-		        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-		          <span aria-hidden="true">&times;</span></button>
-		        <h4 class="modal-title">用户信息</h4>
-		    </div>
-		    <div class="modal-body">
-		     	<div class="form-group">
-				    <label for="code" class="col-sm-2 control-label">账号:</label>
-				    <div class="col-sm-10">
-				      <input id="email" name="email" type="email" class="form-control" placeholder="请输入账号">
-				    </div>
-				</div>
-				<div class="form-group">
-				    <label for="code" class="col-sm-2 control-label">密码:</label>
-				    <div class="col-sm-10">
-				      <input id="pwd" name="pwd" type="password" class="form-control" placeholder="请输入密码">
-				    </div>
-				</div>
-				<div class="form-group">
-				    <label for="site" class="col-sm-2 control-label">姓名:</label>
-				    <div class="col-sm-10">
-				      <input id="name"  name="name" type="text" class="form-control" placeholder="请输入姓名">
-				    </div>
-				</div>
-				<div class="form-group">
-				    <label for="modify" class="col-sm-2 control-label">角色:</label>
-				    <div class="col-sm-10">
-				     	<select id="role" name="role" class="form-control">
-							<option value="2">开发员</option>
-							<option value="1">管理员</option>
-					  		<option value="0">系统管理员</option>
-						</select>
-				    </div>
-				</div>	
-		    </div>
-		    <div class="modal-footer">
-		        <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
-				<button type="button" class="btn btn-primary" onclick="save()">保存</button>
-	    	</div>
-		</div>
-	    <!-- /.modal-content -->
-	    </form>
-  	</div>
-  <!-- /.modal-dialog -->
+    <div class="modal-dialog">
+        <form id="userform" class="form-horizontal" role="form">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">&times;</span></button>
+                    <h4 class="modal-title">用户信息</h4>
+                </div>
+                <div class="modal-body">
+                    <div class="form-group">
+                        <label for="code" class="col-sm-2 control-label">账号:</label>
+                        <div class="col-sm-10">
+                            <input id="email" name="email" type="email" class="form-control" placeholder="请输入账号">
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label for="code" class="col-sm-2 control-label">密码:</label>
+                        <div class="col-sm-10">
+                            <input id="pwd" name="pwd" type="password" class="form-control" placeholder="请输入密码">
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label for="site" class="col-sm-2 control-label">姓名:</label>
+                        <div class="col-sm-10">
+                            <input id="name" name="name" type="text" class="form-control" placeholder="请输入姓名">
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label for="modify" class="col-sm-2 control-label">角色:</label>
+                        <div class="col-sm-10">
+                            <select id="role_select" class="form-control"></select>
+                        </div>
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
+                    <button type="button" class="btn btn-primary" onclick="save()">保存</button>
+                </div>
+            </div>
+            <!-- /.modal-content -->
+        </form>
+    </div>
+    <!-- /.modal-dialog -->
 </div>
 <!-- /.modal -->
-	
+
 <!-- footer -->
 {{include "com/footer.html"}}
 
 <script>
-menuActive("user");
-var _id=""; 
-$(function () {
-	ttable=$('#dataTable').DataTable({
-		"paging"      : true,
-		"lengthChange": false,
-		"searching"   : true,
-		"ordering"    : true,
-		"info"        : true,
-		"autoWidth"   : false,
-		"ajax": {
-			"url": "/front/user",
-			"type": "post",
-			"data":{}
-		 },
-		"language": {
-            "url": "/dist/js/dataTables.chinese.lang"
-        },
-		"columns": [
-            { "data": "_id",render:function(val,a,row){
-				return row._id
-			}},
-			{ "data": "s_email"},
-			{ "data": "s_name"},
-			{ "data": "s_role",render:function(val,a,row){
-				role=""
-				if(val==2){
-					role="开发员"
-				}else if(val==1){
-					role="管理员"
-				}else if(val==0){
-                    role="系统管理员"
+    menuActive("user");
+
+    var role = {{.T.role}}
+    var _id = "";
+    for (const roleKey in role) {
+        console.log(role)
+        var provOpt = document.createElement('option');
+        provOpt.innerText = role[roleKey];
+        provOpt.value = roleKey;
+        $('#role_select')[0].appendChild(provOpt);
+    }
+    $(function () {
+        ttable = $('#dataTable').DataTable({
+            "paging": true,
+            "lengthChange": false,
+            "searching": false,
+            "ordering": false,
+            "info": true,
+            "autoWidth": false,
+            "ajax": {
+                "url": "/front/user",
+                "type": "post",
+                "data": {}
+            },
+            "language": {
+                "url": "/dist/js/dataTables.chinese.lang"
+            },
+            "columns": [
+                {
+                    "data": "_id", render: function (val, a, row) {
+                        return row._id
+                    }
+                },
+                {"data": "s_email"},
+                {"data": "s_name"},
+                {"data": "role_name"},
+                {
+                    "data": "_id", render: function (val, a, row) {
+                        return "<a href='#' onclick='edit(\"" + row['_id'] + "\",\"" + row['s_email'] + "\",\"" + row['s_name'] + "\",\"" + row['s_role'] + "\",\"" + row['s_pwd'] + "\")'><i class='fa fa-fw fa-edit text-yellow'></i></a> &nbsp;" +
+                            "<a href='#' onclick='del(\"" + val + "\")'><i class='fa fa-fw fa-trash text-red'></i></a>"
+                    }
+                }
+            ]
+        });
+    })
+
+    function save() {
+        role = $("select[id=role_select]").val();
+        email = $("#email").val();
+        s_name = $("#name").val();
+        pwd = $("#pwd").val();
+        if (email == "" || name == "" || role == "" || pwd == "") {
+            alert("表单填写不完整!")
+            return false;
+        }
+        $.ajax({
+            url: "/front/user/save",
+            type: "post",
+            data: {"role": role, "_id": _id, "email": email, "name": s_name, "pwd": pwd},
+            success: function (r) {
+                if (r.rep) {
+                    $("#modal-info").modal("hide");
+                    ttable.ajax.reload();
+                } else {
+                    alert("保存失败");
                 }
-				return role
-			}},
-			{ "data":"_id",render:function(val,a,row){
-				return  "<a href='#' onclick='edit(\""+row['_id']+"\",\""+row['s_email']+"\",\""+row['s_name']+"\",\""+row['s_role']+"\",\""+row['s_pwd']+"\")'><i class='fa fa-fw fa-edit text-yellow'></i></a> &nbsp;"+
-						"<a href='#' onclick='del(\""+val+"\")'><i class='fa fa-fw fa-trash text-red'></i></a>"
-			}}
-       	]
-	});
-	//ttable.on('init.dt', function () {});
-})
-function save(){
-	role=$("select[id=role]").val();
-	email=$("#email").val();
-	name=$("#name").val();
-	pwd=$("#pwd").val();
-	if(email==""||name==""||role==""||pwd==""){
-		alert("表单填写不完整!")
-		return false;
-	}
-	$.ajax({
-		url:"/front/user/save",
-		type:"post",
-		data:{"role":role,"_id":_id,"email":email,"name":name,"pwd":pwd},
-		success:function(r){
-			if(r.rep){
-				$("#modal-info").modal("hide");
-				ttable.ajax.reload();
-			}else{
-				alert("保存失败");
-			}
-		}
-	})
-}
-function edit(id,email,name,role,pwd){
-	_id=id;
-	$("#modal-info #email").val(email);
-	$("#modal-info #name").val(name);
-	$("#modal-info #role").val(role);
-	$("#modal-info #pwd").val(pwd);
-	$("#modal-info #email").attr("disabled",true);
-	$("#modal-info #name").attr("disabled",true);
-	$("#modal-info #pwd").attr("disabled",true);
-	$("#modal-info").modal("show");
-}
-function del(_id){
-	showConfirm("确定删除?", function() {
-		$.ajax({
-			url:"/front/user/del",
-			type:"post",
-			data:{"_id":_id},
-			success:function(r){
-				if(r.rep){				
-					ttable.ajax.reload();
-				}else{
-					showTip("删除失败", 1000, function() {});
-				}
-			}
-		})
-	});
-}
-function add(){
-  //com.maskShow("测试")
-  //com.maskHide()
-    
-	_id="";
-	$("#modal-info #email").val("");
-	$("#modal-info #name").val("");
-	$("#modal-info #pwd").val("");
-	$("#modal-info #role").val("2");
-	$("#modal-info #email").removeAttr("disabled",true);
-	$("#modal-info #name").removeAttr("disabled",true);
-	$("#modal-info #pwd").removeAttr("disabled",true);
-	$("#modal-info").modal("show");
-}
+            }
+        })
+    }
+
+    function edit(id, email, s_name, s_role, pwd) {
+        _id = id;
+        $("#modal-info #email").val(email);
+        $("#modal-info #name").val(s_name);
+        $("#modal-info #role").val(role);
+        $("#modal-info #pwd").val(pwd);
+        $("#modal-info #email").attr("disabled", true);
+        $("#modal-info #name").attr("disabled", true);
+        $("#modal-info #pwd").attr("disabled", true);
+        $("#modal-info #role").val(s_role);
+        $("#modal-info").modal("show");
+    }
+
+    function del(_id) {
+        showConfirm("确定删除?", function () {
+            $.ajax({
+                url: "/front/user/del",
+                type: "post",
+                data: {"_id": _id},
+                success: function (r) {
+                    if (r.rep) {
+                        ttable.ajax.reload();
+                    } else {
+                        showTip("删除失败", 1000, function () {
+                        });
+                    }
+                }
+            })
+        });
+    }
+
+    function add() {
+        _id = "";
+        $("#modal-info #email").val("");
+        $("#modal-info #name").val("");
+        $("#modal-info #pwd").val("");
+        $("#modal-info #role").val("2");
+        $("#modal-info #email").removeAttr("disabled", true);
+        $("#modal-info #name").removeAttr("disabled", true);
+        $("#modal-info #pwd").removeAttr("disabled", true);
+        $("#modal-info").modal("show");
+    }
 </script>

+ 1 - 1
src/web/templates/login.html

@@ -93,7 +93,7 @@ function login(){
 		data:{"email":email,"pwd":pwd},
 		success:function(r){
 			if(r.checked){
-				window.location.href="/service/rule/list"
+				window.location.href="/front/index"
 			}else{
 				alert("fail");
 			}

+ 0 - 4
src/web/templates/private/common_rule_create.html

@@ -956,15 +956,11 @@
             var start = $('#starttime').find("input").val();
             start = new Date(start).getTime() / 1000;
             dataMap["i_starttime"] = start;
-        }else {
-            delete dataMap["i_starttime"]
         }
         if ($('#endtime').find("input").val() != "") {
             var end = $('#endtime').find("input").val();
             end = new Date(end).getTime() / 1000;
             dataMap["i_endtime"] = end;
-        }else {
-            delete dataMap["i_endtime"]
         }
         var budget = "";
         if ($('#s_budget_min').val() != "") {

+ 0 - 4
src/web/templates/private/common_rule_edit.html

@@ -1094,15 +1094,11 @@
             var start = $('#starttime').find("input").val();
             start = new Date(start).getTime() / 1000;
             dataMap["i_starttime"] = start;
-        }else {
-            delete dataMap["i_starttime"]
         }
         if ($('#endtime').find("input").val() != "") {
             var end = $('#endtime').find("input").val();
             end = new Date(end).getTime() / 1000;
             dataMap["i_endtime"] = end;
-        }else {
-            delete dataMap["i_endtime"]
         }
         var budget = "";
         if ($('#s_budget_min').val() != "") {

+ 1 - 5
src/web/templates/private/rule_create.html

@@ -406,7 +406,7 @@
     var keyTableChecked = false;        //关键词表格数据是否有选中
     var keyTableAllChecked = true;      //表单数据是否被全选中
     var selectIndex = [];               //选中的编号
-    var setValue = 0;                   // 4: 关键词匹配方式,6:附加词匹配方式,8:排除词匹配方式,9:采购单位,10:公告行业, 2:全局采购单位行业, 3:全局公告行业
+    var setValue = 0;                   // 4: 关键词匹配方式,6:附加词匹配方式,8:排除词匹配方式,9:采购单位,10:公告行业, 2:全局采购单位行业, 3:全局公告行业, 13:全局清理词
     var o_rules = [];                    //关键词列表
 
     var s_dataid = "";                  //预览链接加密串
@@ -1050,15 +1050,11 @@
             var start = $('#starttime').find("input").val();
             start = new Date(start).getTime() / 1000;
             dataMap["i_starttime"] = start;
-        }else {
-            delete dataMap["i_starttime"]
         }
         if ($('#endtime').find("input").val() != "") {
             var end = $('#endtime').find("input").val();
             end = new Date(end).getTime() / 1000;
             dataMap["i_endtime"] = end;
-        }else {
-            delete dataMap["i_endtime"]
         }
         var budget = "";
         if ($('#s_budget_min').val() != "") {

+ 0 - 0
src/web/templates/repair/jianyu_bulk.html → src/web/templates/repair/jy_bulk.html


+ 0 - 0
src/web/templates/repair/jianyu_create.html → src/web/templates/repair/jy_create.html


+ 1 - 1
src/web/templates/repair/jianyu_edit.html → src/web/templates/repair/jy_edit.html

@@ -99,7 +99,6 @@
 
         var curData = document.getElementById('jsonTextarea').value;
         var data = JSON.parse(curData)
-
         // 处理特殊字段
         if (checkAddDict(data)) {
             let msg = "title,site,spidercode\nhref,channel,toptype\nsubtype,area\n非空必填信息,请补充完善信息"
@@ -138,6 +137,7 @@
                 if (data[editDataKey] != edit_data[editDataKey]) {
                     modifyinfo[editDataKey] = true
                     updata[editDataKey] = data[editDataKey]
+
                 }
             }
         }

+ 132 - 0
src/web/templates/repair/jy_pro_repair.html

@@ -0,0 +1,132 @@
+{{include "com/inc.html"}}
+<!-- Main Header -->
+{{include "com/header.html"}}
+<!-- Left side column. 权限菜单 -->
+{{include "com/menu.html"}}
+
+<div class="content-wrapper">
+    <section class="content-header">
+        <h1>剑鱼项目数据维护
+            <small>
+                <button class="btn btn-instagram btn-sm" onclick="modifySingle()"><i class="fa fa-fw fa-edit fa-lg"></i>单条修改</button>
+                <button class="btn btn-success btn-sm" onclick="importData()"><i class="fa fa-fw fa-cloud-upload fa-lg"></i>导入批量修改的数据</button>
+                <form style="display:none" id='uploadform' method='post'>
+                    <input type='file' name='xlsx' id='file'/>
+                </form>
+            </small>
+        </h1>
+        <ol class="breadcrumb">
+            <li><a href="#"><i class="fa fa-dashboard"></i> 首页</a></li>
+            <li><a href="/service/jianyu/repair"> 剑鱼项目维护</a></li>
+        </ol>
+
+        <br/>
+    </section>
+    <!-- Main content -->
+    <section class="content">
+        <div class="row">
+            <div class="col-xs-12">
+                <div class="box">
+                    <div class="box-body">
+                        <table id="dataTable" class="table table-bordered table-hover">
+                            <thead>
+                            <tr>
+                                <th>编号</th>
+                                <th>标题</th>
+                                <th>正文链接</th>
+                                <th>源表</th>
+                                <th>发布时间</th>
+                                <th>操作</th>
+                            </tr>
+                            </thead>
+                        </table>
+                    </div>
+                    <!-- /.box-body -->
+                </div>
+                <!-- /.box -->
+            </div>
+        </div>
+    </section>
+</div>
+
+{{include "com/dialog.html"}}
+{{include "com/footer.html"}}
+<script>
+    menuActive("/jianyu/repair");
+    $(document).ready(function () {
+        ttable = $('#dataTable').DataTable({
+            "paging": false,
+            "lengthChange": false,
+            "searching": false,
+            "ordering": false,
+            "info": false,
+            "autoWidth": false,
+            "serverSide": false,
+            "language": {
+                "url": "/dist/js/dataTables.chinese.lang"
+            },
+            "fnDrawCallback": function () {
+                $("ul.pagination").prepend("&nbsp;&nbsp;&nbsp;转到第 <input type='text' id='changePage'   style='width:20px;'> 页    <a type='text' href='javascript:void(0);' id='dataTable-btn' style='text-align:center'>GO</a>");
+                $('#dataTable-btn').click(function (e) {
+                    var redirectpage = 0
+                    if ($("#changePage").val() && $("#changePage").val() > 0) {
+                        var redirectpage = $("#changePage").val() - 1;
+                    }
+                    ttable.page(redirectpage).draw(false);
+                });
+                this.api().column(0).nodes().each(function(cell, i) {
+                    cell.innerHTML = i + 1;
+                });
+            },
+            "columns": [
+                {"data": null,width:"8%"},
+                {"data": "title", width: "40%"},
+                {"data": function (row) {
+                        if (row.href) {
+                            var str = "链接地址"
+                            tmp = '<a class="" target="_blank" href=' + row.href + '>' + str + '</a>';
+                            return tmp
+                        } else {
+                            return ""
+                        }
+                    }},
+                {"data": curColl, render: function (val){
+                        return curColl
+                    }},
+                {"data": "publishtime",width:"15%", render: function (val) {
+                        var dt = new Date()
+                        dt.setTime(parseInt(val) * 1000);
+                        return dt.format("yyyy-MM-dd")
+                    }},
+                {"data": "_id", width:"15%",render: function (val, a, row, pos) {
+                        tmp = '<div>' +
+                            '<a class="btn btn-sm btn-primary" href="/service/jianyu/edit?id='+val+'&coll='+curColl+'">编辑</a>'+
+                            '&nbsp'+'&nbsp'+//href="/service/jianyu/edit?id='+val+'
+                            '<a class="btn btn-sm btn-danger" onclick="del_repair(\''+val+'\',\''+curColl+'\')">删除</a>'+
+                            '</div>';
+                        return tmp
+                    }}
+            ]
+        });
+    });
+
+    function idSearch() {
+        var search_name = $('#idSea').val()
+        $.ajax({
+            url:"/service/jianyu/searchID",
+            type:"post",
+            data:{"_id": search_name},
+            success:function(r){
+                if (r.rep) {
+                    curColl = r.orgColl
+                    $('#dataTable').dataTable().fnClearTable();
+                    $('#dataTable').dataTable().fnAddData(r.data);
+                }else {
+                    showTip(r.msg)
+                }
+            }
+        })
+    }
+
+
+</script>

+ 0 - 0
src/web/templates/repair/jianyu_repair.html → src/web/templates/repair/jy_repair.html


+ 11 - 4
tagservice/src/config.json

@@ -12,14 +12,21 @@
 		"tagname": 1,
 		"_id": 1
 	},
+	"log_off": true,
 	"mgohistory": {
 		"tagmgo": "192.168.3.207:27092",
-		"tagdb": "mxs",
-		"tagcoll": "test1",
+		"tagdb": "datatag_data",
+		"tagcoll": "hislog",
 		"tagsize": 20,
 		"tasktype": "bidtag",
-		"sid": "5e69ec2650b5ea296ede1582",
-		"eid": "5ed8526fbd8bc0191a46792f"
+		"sid": "5eec9b3a52c1d9fbf82b7475",
+		"eid": "5eef40b5801f744d045f164a"
+	},
+	"mgolog": {
+		"mgo": "192.168.3.207:27092",
+		"name": "datatag",
+		"coll": "tags_log",
+		"size": 20
 	},
 	"eshistory": {
 		"addr": "http://192.168.3.11:9800",

+ 105 - 69
tagservice/src/historytask.go

@@ -18,12 +18,19 @@ var (
 	//mgo
 	MgoH      *mongo.MongodbSim
 	MgoRulesH []*PRule
+	TagsRules []*KeywordRule
 	DbnameH   string
 	CollH     string
 	MgoSId    string
 	MgoEId    string
-	//es
+	//mgo log
+	logOff  bool
+	mgoLog  *mongo.MongodbSim
+	mgoName string
+	mgoColl string
+	mgoSize int
 
+	//es
 	EsH            *elastic.Elastic
 	EsRulesH       []*PRule
 	Index          string
@@ -35,6 +42,12 @@ var (
 	data_channel   chan bool
 )
 
+//原始标签关键词规则
+type KeywordRule struct {
+	Id             string
+	OList          []map[string]interface{}
+}
+
 //初始化mgo信息
 func InitMgoInfo() {
 	if mgohistory, ok := Sysconfig["mgohistory"].(map[string]interface{}); ok && mgohistory != nil {
@@ -51,11 +64,25 @@ func InitMgoInfo() {
 		MgoSId = qu.ObjToString(mgohistory["sid"])
 		MgoSId = qu.ObjToString(mgohistory["eid"])
 		//初始化Rules
-		MgoRulesH = InitRules(qu.ObjToString(mgohistory["tasktype"]))
+		MgoRulesH, TagsRules = InitRules(qu.ObjToString(mgohistory["tasktype"]))
 		// for i, r := range MgoRulesH {
 		// 	qu.Debug(i, r.TagName, r.KW.KeyReg, len(r.KW.KeyReg), r.KW.MatchType, len(r.KW.MatchType), r.KW.KeyWordMap, "---", r.AW.KeyReg, len(r.AW.KeyReg), r.AW.MatchType, len(r.AW.MatchType), r.AW.AddWordMap)
 		// }
 	}
+	//mgo log
+	logOff = Sysconfig["log_off"].(bool)
+	if logOff {
+		if mgolog, ok := Sysconfig["mgolog"].(map[string]interface{}); ok && mgolog != nil {
+			mgoName = qu.ObjToString(mgolog["name"])
+			mgoColl = qu.ObjToString(mgolog["coll"])
+			mgoLog = &mongo.MongodbSim{
+				MongodbAddr: qu.ObjToString(mgolog["mgo"]),
+				Size:        qu.IntAllDef(mgolog["size"], 20),
+				DbName:      mgoName,
+			}
+			MgoH.InitPool()
+		}
+	}
 }
 
 //初始化es信息
@@ -74,7 +101,7 @@ func InitEsInfo() {
 		EsSId = qu.ObjToString(eshistory["sid"])
 		EsEId = qu.ObjToString(eshistory["eid"])
 		//初始化Rules
-		EsRulesH = InitRules(qu.ObjToString(eshistory["tasktype"]))
+		EsRulesH, _ = InitRules(qu.ObjToString(eshistory["tasktype"]))
 		// for i, r := range EsRulesH {
 		// 	qu.Debug(i, r.TagName, r.KW.KeyReg, len(r.KW.KeyReg), r.KW.MatchType, len(r.KW.MatchType), r.KW.KeyWordMap, "---", r.AW.KeyReg, len(r.AW.KeyReg), r.AW.MatchType, len(r.AW.MatchType), r.AW.AddWordMap)
 		// }
@@ -113,6 +140,7 @@ func MgoHistoryData() {
 	lock := &sync.Mutex{}
 	c := make(chan bool, 10)
 	update := [][]map[string]interface{}{}
+	updataLog := []map[string]interface{}{}
 	//遍历
 	index := 0
 	n := int64(0)
@@ -129,70 +157,74 @@ func MgoHistoryData() {
 			}()
 			tmpTagNameMap := map[string][]string{} //记录标签
 			tmpPreTagMap := map[string][]string{}  //记录父标签
-			GetTags(MgoRulesH, tmp, tmpTagNameMap, tmpPreTagMap)
-			// for _, ru := range MgoRulesH {
-			// 	//全局排除词
-			// 	IsMatchGNotKey := RegMatch(tmp, ru.GNW.MatchType, ru.GNW.KeyReg, ru.GNW.NotWordMap)
-			// 	if IsMatchGNotKey { //全局排除词匹配成功
-			// 		continue
-			// 	} else {
-			// 		//全局附加词
-			// 		IsMatchGAddKey := RegMatch(tmp, ru.GAW.MatchType, ru.GAW.KeyReg, ru.GAW.MatchWordMap)
-			// 		if !IsMatchGAddKey && len(ru.GAW.MatchType) != 0 { //全局附加词没有匹配成功
-			// 			continue
-			// 		}
-			// 	}
-			// L:
-			// 	for _, r := range ru.Rule {
-			// 		//
-			// 		IsMatchNotKey := RegMatch(tmp, r.NW.MatchType, r.NW.KeyReg, r.NW.NotWordMap)
-			// 		if IsMatchNotKey { //排除词匹配成功,过滤当前rule
-			// 			continue
-			// 		}
-			// 		//关键词匹配
-			// 		for _, kwm := range r.KW.MatchType {
-			// 			if text := qu.ObjToString(tmp[kwm]); text != "" {
-			// 				text = ProcessData(text)
-			// 				for i, kw_reg := range r.KW.KeyReg {
-			// 					IsContinue := false
-			// 					if kw_indexArr := kw_reg.FindAllStringIndex(text, -1); len(kw_indexArr) > 0 { //关键词匹配成功
-			// 						if r.KW.KeyWordMap[i] && CheckLetter(text, kw_reg, kw_indexArr) { //kw_reg有字母,判断是否是包含关系(AAAIBBB or AI)
-			// 							IsContinue = true
-			// 						} else if !r.KW.KeyWordMap[i] {
-			// 							IsContinue = true
-			// 						}
-			// 					}
-			// 					if IsContinue { //关键词匹配成功,匹配附加词
-			// 						if len(r.AW.KeyReg) == 0 { //无附加词
-			// 							//tmpTagNameMap[r.TagName] = true
-			// 							RecordData(ru, tmpTagNameMap, tmpPreTagMap)
-			// 							break L
-			// 						} else {
-			// 							for _, awm := range r.AW.MatchType {
-			// 								if text := qu.ObjToString(tmp[awm]); text != "" {
-			// 									text = ProcessData(text)
-			// 									for j, aw_reg := range r.AW.KeyReg {
-			// 										if aw_indexArr := aw_reg.FindAllStringIndex(text, -1); len(aw_indexArr) > 0 { //关键词匹配成功
-			// 											if r.AW.AddWordMap[j] && CheckLetter(text, aw_reg, aw_indexArr) { //aw_reg有字母,判断是否是包含关系(AAAIBBB or AI)
-			// 												//tmpTagNameMap[r.TagName] = true //附加词匹配成功
-			// 												RecordData(ru, tmpTagNameMap, tmpPreTagMap)
-			// 												break L
-			// 											} else if !r.AW.AddWordMap[j] {
-			// 												//tmpTagNameMap[r.TagName] = true //附加词匹配成功
-			// 												RecordData(ru, tmpTagNameMap, tmpPreTagMap)
-			// 												break L
-			// 											}
-			// 										}
-			// 									}
-			// 								}
-			// 							}
-			// 						}
-			// 					}
-			// 				}
-			// 			}
-			// 		}
-			// 	}
-			// }
+			addMapLog := map[string]interface{}{}  //日志信息
+			if logOff {
+				GetTagsAndLog(MgoRulesH, tmp, tmpTagNameMap, tmpPreTagMap, addMapLog)
+			} else {
+				GetTags(MgoRulesH, tmp, tmpTagNameMap, tmpPreTagMap)
+			}
+			//for _, ru := range MgoRulesH {
+			//	//全局排除词
+			//	IsMatchGNotKey := RegMatch(tmp, ru.GNW.MatchType, ru.GNW.KeyReg, ru.GNW.NotWordMap)
+			//	if IsMatchGNotKey { //全局排除词匹配成功
+			//		continue
+			//	} else {
+			//		//全局附加词
+			//		IsMatchGAddKey := RegMatch(tmp, ru.GAW.MatchType, ru.GAW.KeyReg, ru.GAW.MatchWordMap)
+			//		if !IsMatchGAddKey && len(ru.GAW.MatchType) != 0 { //全局附加词没有匹配成功
+			//			continue
+			//		}
+			//	}
+			//L:
+			//	for _, r := range ru.Rule {
+			//		IsMatchNotKey := RegMatch(tmp, r.NW.MatchType, r.NW.KeyReg, r.NW.NotWordMap)
+			//		if IsMatchNotKey { //排除词匹配成功,过滤当前rule
+			//			continue
+			//		}
+			//		//关键词匹配
+			//		for _, kwm := range r.KW.MatchType {
+			//			if text := qu.ObjToString(tmp[kwm]); text != "" {
+			//				text = ProcessData(text)
+			//				for i, kw_reg := range r.KW.KeyReg {
+			//					IsContinue := false
+			//					if kw_indexArr := kw_reg.FindAllStringIndex(text, -1); len(kw_indexArr) > 0 { //关键词匹配成功
+			//						if r.KW.KeyWordMap[i] && CheckLetter(text, kw_reg, kw_indexArr) { //kw_reg有字母,判断是否是包含关系(AAAIBBB or AI)
+			//							IsContinue = true
+			//						} else if !r.KW.KeyWordMap[i] {
+			//							IsContinue = true
+			//						}
+			//					}
+			//					if IsContinue { //关键词匹配成功,匹配附加词
+			//						if len(r.AW.KeyReg) == 0 { //无附加词
+			//							//tmpTagNameMap[r.TagName] = true
+			//							RecordData(ru, tmpTagNameMap, tmpPreTagMap)
+			//							break L
+			//						} else {
+			//							for _, awm := range r.AW.MatchType {
+			//								if text := qu.ObjToString(tmp[awm]); text != "" {
+			//									text = ProcessData(text)
+			//									for j, aw_reg := range r.AW.KeyReg {
+			//										if aw_indexArr := aw_reg.FindAllStringIndex(text, -1); len(aw_indexArr) > 0 { //关键词匹配成功
+			//											if r.AW.AddWordMap[j] && CheckLetter(text, aw_reg, aw_indexArr) { //aw_reg有字母,判断是否是包含关系(AAAIBBB or AI)
+			//												//tmpTagNameMap[r.TagName] = true //附加词匹配成功
+			//												RecordData(ru, tmpTagNameMap, tmpPreTagMap)
+			//												break L
+			//											} else if !r.AW.AddWordMap[j] {
+			//												//tmpTagNameMap[r.TagName] = true //附加词匹配成功
+			//												RecordData(ru, tmpTagNameMap, tmpPreTagMap)
+			//												break L
+			//											}
+			//										}
+			//									}
+			//								}
+			//							}
+			//						}
+			//					}
+			//				}
+			//			}
+			//		}
+			//	}
+			//}
 			addMap := map[string]interface{}{}
 			if len(tmpTagNameMap) > 0 { //有新标签或者历史标签
 				atomic.AddInt64(&n, +1) //n++ 计数
@@ -209,6 +241,7 @@ func MgoHistoryData() {
 				set["$set"] = addMap
 				idAndSet = append(idAndSet, _id) //第一个为查询条件
 				idAndSet = append(idAndSet, set) //第二个为更新内容
+				addMap["dataId"] = tmp["_id"]
 				update = append(update, idAndSet)
 			}
 			// if len(clearMap) > 0 {
@@ -216,7 +249,8 @@ func MgoHistoryData() {
 			// }
 			if len(update) > 500 {
 				MgoH.UpdateBulk(CollH, update...)
-				update = [][]map[string]interface{}{} //更新后把数据置空
+				mgoLog.SaveBulk(mgoColl, updataLog...) //mgo日志
+				update = [][]map[string]interface{}{}  //更新后把数据置空
 			}
 			lock.Unlock()
 		}(tmp)
@@ -226,7 +260,9 @@ func MgoHistoryData() {
 	lock.Lock()
 	if len(update) > 0 {
 		MgoH.UpdateBulk(CollH, update...)
+		MgoH.SaveBulk(mgoColl, updataLog...)
 		update = [][]map[string]interface{}{} //更新后把数据置空
+		updataLog = []map[string]interface{}{}
 	}
 	lock.Unlock()
 	log.Println("Update Count:", n)
@@ -431,4 +467,4 @@ func UpdateEsHistory() {
 			}
 		}
 	}
-}
+}

+ 83 - 2
tagservice/src/newtask.go

@@ -516,7 +516,7 @@ func (t *Task) InitTask(taskid string) {
 	//t.MgoUpdataCache = make(chan []map[string]interface{}, 500)
 	t.SP = make(chan bool, 5)
 	t.DataChan = make(chan bool, 10)
-	t.PRules = InitRules(qu.ObjToString((*data)["s_tasktype"])) //rules
+	t.PRules, _ = InitRules(qu.ObjToString((*data)["s_tasktype"])) //rules
 	t.AllTagField = AllTagField
 	t.AllPreField = AllPreField
 	// for j, ru := range t.PRules {
@@ -535,7 +535,7 @@ func (t *Task) InitTask(taskid string) {
 }
 
 //初始化Rules
-func InitRules(tasktype string) (rules []*PRule) {
+func InitRules(tasktype string) (rules []*PRule, keyRules []*KeywordRule) {
 	defer qu.Catch()
 	query := map[string]interface{}{
 		"i_isuse":    1, //启用状态
@@ -552,6 +552,9 @@ func InitRules(tasktype string) (rules []*PRule) {
 		preTagField := qu.ObjToString(l["s_pretagfield"]) //父标签属性值
 		preTagName := qu.ObjToString(l["s_pretagname"])   //父标签名称
 		pr := &PRule{}
+		kr := &KeywordRule{}
+		kr.Id = qu.ObjToString(l["_id"])
+		kr.OList = []map[string]interface{}{}
 		pr.TagField = tagField
 		pr.TagName = tagname
 		pr.PreField = preTagField
@@ -657,6 +660,7 @@ func InitRules(tasktype string) (rules []*PRule) {
 		pr.GAW = gaw
 		for _, o := range o_list {
 			o_map := o.(map[string]interface{})
+			kr.OList = append(kr.OList, o_map)
 			//排除词匹配方式
 			nkm := qu.ObjToString(o_map["s_notkeymatch"])
 			nkmArr := []string{}
@@ -827,6 +831,7 @@ func InitRules(tasktype string) (rules []*PRule) {
 
 		}
 		rules = append(rules, pr)
+		keyRules = append(keyRules, kr)
 	}
 	return
 }
@@ -902,6 +907,82 @@ func GetTags(prules []*PRule, tmp map[string]interface{}, tmpTagNameMap, tmpPreT
 	}
 }
 
+//mgo打标签+日志log
+func GetTagsAndLog(prules []*PRule, tmp map[string]interface{}, tmpTagNameMap, tmpPreTagMap map[string][]string, logMap map[string]interface{}) {
+	logMap["dataid"] = qu.ObjToString(tmp["_id"])
+	for i, ru := range prules {
+		logMap["tagid"] = qu.ObjToString(TagsRules[i].Id)
+		//全局排除词
+		IsMatchGNotKey := RegMatch(tmp, ru.GNW.MatchType, ru.GNW.KeyReg, ru.GNW.NotWordMap)
+		if IsMatchGNotKey { //全局排除词匹配成功
+			continue
+		} else {
+			//全局附加词
+			IsMatchGAddKey := RegMatch(tmp, ru.GAW.MatchType, ru.GAW.KeyReg, ru.GAW.MatchWordMap)
+			if !IsMatchGAddKey && len(ru.GAW.MatchType) != 0 { //全局附加词没有匹配成功
+				continue
+			}
+		}
+
+		//
+		mapArr := []map[string]interface{}{}
+		for ii, r := range ru.Rule {
+			keyRule := TagsRules[i].OList[ii]
+			//排除词
+			IsMatchNotKey := RegMatch(tmp, r.NW.MatchType, r.NW.KeyReg, r.NW.NotWordMap)
+			if IsMatchNotKey { //排除词匹配成功
+				continue
+			}
+			//L:
+			//关键词匹配
+			for _, kwm := range r.KW.MatchType {
+				if text := qu.ObjToString(tmp[kwm]); text != "" {
+					text = ProcessData(text)
+					for i, kw_reg := range r.KW.KeyReg {
+						IsContinue := false
+						if kw_indexArr := kw_reg.FindAllStringIndex(text, -1); len(kw_indexArr) > 0 { //关键词匹配成功
+							if r.KW.KeyWordMap[i] && CheckLetter(text, kw_reg, kw_indexArr) { //kw_reg有字母,判断是否是包含关系(AAAIBBB or AI)
+								IsContinue = true
+							} else if !r.KW.KeyWordMap[i] {
+								IsContinue = true
+							}
+						}
+						if IsContinue { //关键词匹配成功,匹配附加词
+							if len(r.AW.KeyReg) == 0 { //无附加词
+								//tmpTagNameMap[r.TagName] = true
+								RecordData(ru, tmpTagNameMap, tmpPreTagMap)
+								keyRule["isMatch"] = true
+							} else {
+								for _, awm := range r.AW.MatchType {
+									if text := qu.ObjToString(tmp[awm]); text != "" {
+										text = ProcessData(text)
+										for j, aw_reg := range r.AW.KeyReg {
+											if aw_indexArr := aw_reg.FindAllStringIndex(text, -1); len(aw_indexArr) > 0 { //关键词匹配成功
+												if r.AW.AddWordMap[j] && CheckLetter(text, aw_reg, aw_indexArr) { //aw_reg有字母,判断是否是包含关系(AAAIBBB or AI)
+													//tmpTagNameMap[r.TagName] = true //附加词匹配成功
+													RecordData(ru, tmpTagNameMap, tmpPreTagMap)
+													keyRule["isMatch"] = true
+												} else if !r.AW.AddWordMap[j] {
+													//tmpTagNameMap[r.TagName] = true //附加词匹配成功
+													RecordData(ru, tmpTagNameMap, tmpPreTagMap)
+													keyRule["isMatch"] = true
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+			mapArr = append(mapArr, keyRule)
+		}
+
+		logMap["o_list"] = mapArr
+	}
+}
+
 //匹配
 func RegMatch(tmp map[string]interface{}, matchType []string, matchReg [][]*regexp.Regexp, matchMap []map[int]bool) bool {
 	defer qu.Catch()