|
@@ -0,0 +1,462 @@
|
|
|
+{{include "com/inc.html"}}
|
|
|
+<!-- Main Header -->
|
|
|
+{{include "com/header.html"}}
|
|
|
+<!-- Left side column. 权限菜单 -->
|
|
|
+{{include "com/menu.html"}}
|
|
|
+{{include "com/modal.html"}}
|
|
|
+<div class="content-wrapper">
|
|
|
+ <section class="content-header">
|
|
|
+ <h1>新建标签规则
|
|
|
+ <small>
|
|
|
+ <button class="btn btn-primary btn-sm" onclick="importRule()"><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/rule/list">标签规则列表</a></li>
|
|
|
+ <li><a href="#">新建标签规则</a></li>
|
|
|
+ </ol>
|
|
|
+ </section>
|
|
|
+ <!-- Main content -->
|
|
|
+ <section class="content">
|
|
|
+ <div class="tab-content">
|
|
|
+ <div class="nav-tabs-custom">
|
|
|
+ <ul class="nav nav-tabs edit-step">
|
|
|
+ <li class="active" data-mode="guide"><a href="#tab_1" data-toggle="tab" aria-expanded="true">通用规则</a></li>
|
|
|
+ <li data-mode="guide" class=""><a href="#tab_2" data-toggle="tab" aria-expanded="false">关键词规则</a></li>
|
|
|
+ <button class="btn btn-primary btn-sm" style="float: right;margin-top: 7px;margin-right: 10px" onclick="saveTag()"><i class="fa fa-fw fa-file-text fa-lg"></i>保存规则标签</button>
|
|
|
+ </ul>
|
|
|
+ <div class="tab-content">
|
|
|
+ <div class="tab-pane active" id="tab_1">
|
|
|
+ <form class="form-horizontal">
|
|
|
+ <div class="box box-primary">
|
|
|
+ <div class="box-header with-border">
|
|
|
+ <i class="fa fa-tag"></i>
|
|
|
+ <h3 class="box-title">通用规则</h3>
|
|
|
+ </div>
|
|
|
+ <div class="box-body">
|
|
|
+ <div class="form-group">
|
|
|
+ <label class="col-sm-2 control-label"><span style="color:red;">* </span>标签规则名称</label>
|
|
|
+ <div class="col-sm-3">
|
|
|
+ <input type="text" class="form-control" id="tagname" placeholder="标签规则名称" required
|
|
|
+ value="{{.T.data.s_tagname}}">
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="form-group">
|
|
|
+ <label class="col-sm-2 control-label"><span style="color:red;">* </span>属性值</label>
|
|
|
+ <div class="col-sm-3">
|
|
|
+ <select class="form-control selectpicker" id="fieldSelect">
|
|
|
+ <option selected:disabled style="diaplay:none" value="0">请选择</option>
|
|
|
+ </select>
|
|
|
+ </div>
|
|
|
+ <script>
|
|
|
+ $('#fieldSelect').on('changed.bs.select', function () {
|
|
|
+ const tmp = "pre_" + $(this).val();
|
|
|
+ $('#pretagfield').val(tmp)
|
|
|
+ })
|
|
|
+ </script>
|
|
|
+ </div>
|
|
|
+ <div class="form-group">
|
|
|
+ <label class="col-sm-2 control-label"><span style="color:red;">* </span>任务类型</label>
|
|
|
+ <div class="col-sm-3">
|
|
|
+ <select class="form-control selectpicker" id="taskSelect">
|
|
|
+ <option selected:disabled style="diaplay:none" value="0">请选择</option>
|
|
|
+ </select>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="form-group">
|
|
|
+ <label class="col-sm-2 control-label">父标签名称</label>
|
|
|
+ <div class="col-sm-3">
|
|
|
+ <input type="text" class="form-control" id="pretagname" placeholder="父标签名称"
|
|
|
+ value="{{.T.data.s_pretagname}}">
|
|
|
+ </div>
|
|
|
+ <label class="col-sm-2 control-label">父标签属性值</label>
|
|
|
+ <div class="col-sm-3">
|
|
|
+ <input type="text" class="form-control" disabled id="pretagfield" placeholder="父标签属性值"
|
|
|
+ value="{{.T.data.s_pretagfield}}">
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div id="es_div" class="form-group">
|
|
|
+ <label class="col-sm-2 control-label">查询条件</label>
|
|
|
+ <div class="col-sm-8">
|
|
|
+ <textarea class="form-control" id="query" style="max-width: 100%"></textarea>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </form>
|
|
|
+ </div>
|
|
|
+ <div class="tab-pane" id="tab_2">
|
|
|
+ <div class="box box-primary">
|
|
|
+ <div class="box-header with-border">
|
|
|
+ <i class="fa fa-bookmark"></i>
|
|
|
+ <h3 class="box-title">关键词规则</h3>
|
|
|
+ <div style="float: right">
|
|
|
+ <a class="btn btn-default btn-sm" onclick="selectKeyMatch(4)">关键词匹配方式</a>
|
|
|
+ <a class="btn btn-default btn-sm" onclick="selectKeyMatch(6)">附加词匹配方式</a>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <table id="keywords" class="table table-bordered">
|
|
|
+ <thead>
|
|
|
+ <div style="margin: 10px 10px 0px;">
|
|
|
+ <a class="btn btn-twitter" onclick="add_Rule()">新增</a>
|
|
|
+ <a class="btn btn-twitter" onclick="modify_Rule()">修改</a>
|
|
|
+ <a class="btn btn-twitter" onclick="del_Rule()">删除</a>
|
|
|
+ </div>
|
|
|
+ <tr>
|
|
|
+ <th>编号</th>
|
|
|
+ <th><input type="checkbox" onclick="allSelect(this)" id="allCheckbox"></th>
|
|
|
+ <th>关键词</th>
|
|
|
+ <th>匹配方式</th>
|
|
|
+ <th>附加词</th>
|
|
|
+ <th>匹配方式</th>
|
|
|
+ </tr>
|
|
|
+ </thead>
|
|
|
+ </table>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </section>
|
|
|
+</div>
|
|
|
+
|
|
|
+{{include "com/dialog.html"}}
|
|
|
+{{include "com/footer.html"}}
|
|
|
+<script>
|
|
|
+ menuActive("/tag_rule/list");
|
|
|
+ var dataMap = {{.T.data}};
|
|
|
+ var TagFieldMap = {{.T.tagFieldMap}}
|
|
|
+ var TaskTypeMap = {{.T.taskTypeMap}}
|
|
|
+ var matchTypeMap = {{.T.matchTypeMap}};
|
|
|
+
|
|
|
+ var keyTableChecked = false; //关键词表格数据是否有选中
|
|
|
+ var keyTableAllChecked = true; //表单数据是否被全选中
|
|
|
+
|
|
|
+ var setValue = 0; // 4: 关键词匹配方式,6:附加词匹配方式
|
|
|
+ var selectIndex = []; //选中的编号
|
|
|
+ var o_list = [];
|
|
|
+ var matchCode = []; //匹配方式code
|
|
|
+ var matchName = []; //匹配名字
|
|
|
+
|
|
|
+ $(document).ready(function () {
|
|
|
+ $('#query').val(dataMap.s_query);
|
|
|
+ for (var i in TagFieldMap) {
|
|
|
+ var provOpt = document.createElement('option');
|
|
|
+ provOpt.innerText = TagFieldMap[i].name;
|
|
|
+ provOpt.value = TagFieldMap[i].code;
|
|
|
+ if (dataMap.s_tagfield == TagFieldMap[i].code) {
|
|
|
+ provOpt.selected = true
|
|
|
+ }
|
|
|
+ $("#fieldSelect")[0].appendChild(provOpt);
|
|
|
+ }
|
|
|
+ for (var i in TaskTypeMap) {
|
|
|
+ var provOpt = document.createElement('option');
|
|
|
+ provOpt.innerText = TaskTypeMap[i].name;
|
|
|
+ provOpt.value = TaskTypeMap[i].code;
|
|
|
+ if (dataMap.s_tasktype == TaskTypeMap[i].code) {
|
|
|
+ provOpt.selected = true
|
|
|
+ }
|
|
|
+ $("#taskSelect")[0].appendChild(provOpt);
|
|
|
+ }
|
|
|
+ var btnMatchHtml1 = "";
|
|
|
+ var btnMatchHtml2 = "";
|
|
|
+ for (var i in matchTypeMap) {
|
|
|
+ if (i < 5) {
|
|
|
+ btnMatchHtml1 += `<input type="button" class="btn btn-default col-md-pull-2" style="margin-left: 10px;margin-top: 10px" onclick="clickMatchBtn(this)"
|
|
|
+ code="${matchTypeMap[i]["code"]}" value="${matchTypeMap[i]["name"]}">`;
|
|
|
+ }else {
|
|
|
+ btnMatchHtml2 += `<input type="button" class="btn btn-default col-md-pull-2" style="margin-left: 10px;margin-top: 10px" onclick="clickMatchBtn2(this)"
|
|
|
+ code="${matchTypeMap[i]["code"]}" value="${matchTypeMap[i]["name"]}">`;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ $("#btnGroupMatch").append(btnMatchHtml1);
|
|
|
+ $("#btnGroupMatch2").append(btnMatchHtml2);
|
|
|
+ $('#keywords').DataTable({
|
|
|
+ "paging": false,
|
|
|
+ "lengthChange": false,
|
|
|
+ "searching": false,
|
|
|
+ "ordering": false,
|
|
|
+ "info": true,
|
|
|
+ "autoWidth": false,
|
|
|
+ "language": {
|
|
|
+ "url": "/dist/js/dataTables.chinese.lang"
|
|
|
+ },
|
|
|
+ "fnDrawCallback": function () {
|
|
|
+ this.api().column(0).nodes().each(function (cell, i) {
|
|
|
+ cell.innerHTML = i + 1;
|
|
|
+ });
|
|
|
+ },
|
|
|
+ "columns": [
|
|
|
+ {"data": null, width: "1%"},
|
|
|
+ {"data": "", width: "1%", render: function() {
|
|
|
+ return `<input type="checkbox" name="ckb-keyid" onclick="singleSelect(this)" style="text-align: center">`
|
|
|
+ }},
|
|
|
+ {"data": "s_matchkey", width: "10%"},
|
|
|
+ {"data": function (row) {
|
|
|
+ var str = row.s_keymatch;
|
|
|
+ if (str && str != "") {
|
|
|
+ var s = "";
|
|
|
+ for (var i in matchTypeMap) {
|
|
|
+ if (str.indexOf(matchTypeMap[i]["code"]) != -1) {
|
|
|
+ if (s == "") {
|
|
|
+ s = matchTypeMap[i]["name"]
|
|
|
+ } else {
|
|
|
+ s = s + "," + matchTypeMap[i]["name"]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return s
|
|
|
+ }
|
|
|
+ return ""
|
|
|
+ }, width: "5%"},
|
|
|
+ {"data": "s_addkey", width: "10%"},
|
|
|
+ {"data": function (row) {
|
|
|
+ var str = row.s_addkeymatch;
|
|
|
+ if (str && str != "") {
|
|
|
+ var s = "";
|
|
|
+ for (var i in matchTypeMap) {
|
|
|
+ if (str.indexOf(matchTypeMap[i]["code"]) != -1) {
|
|
|
+ if (s == "") {
|
|
|
+ s = matchTypeMap[i]["name"]
|
|
|
+ } else {
|
|
|
+ s = s + "," + matchTypeMap[i]["name"]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return s
|
|
|
+ }
|
|
|
+ return ""
|
|
|
+ }, width: "5%"},
|
|
|
+ ],
|
|
|
+ "columnDefs": [{
|
|
|
+ "targets": [2],
|
|
|
+ "render": function (data, type, full, meta) {
|
|
|
+ if (data && data.length > 44) {
|
|
|
+ return "<a title='" + data + "' href='#' style='text-decoration: none;'>" + data.trim().substr(0, 44) + "..." + "</a>";
|
|
|
+ }else if (data == undefined) {
|
|
|
+ return ""
|
|
|
+ }else {
|
|
|
+ return data
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {
|
|
|
+ "targets": [4],
|
|
|
+ "render": function (data, type, full, meta) {
|
|
|
+ if (data && data.length > 44) {
|
|
|
+ return "<a title='" + data + "' href='#' style='text-decoration: none;'>" + data.trim().substr(0, 44) + "..." + "</a>";
|
|
|
+ }else if (data == undefined) {
|
|
|
+ return ""
|
|
|
+ }else {
|
|
|
+ return data
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }]
|
|
|
+ });
|
|
|
+ })
|
|
|
+ function cancelModel() {
|
|
|
+ $('#modal-select-match').modal("hide");
|
|
|
+ $('#btnGroupMatch').find("input").each(function () {
|
|
|
+ $(this).removeClass("active-btn-match");
|
|
|
+ });
|
|
|
+ $('#btnGroupMatch2').find("input").each(function () {
|
|
|
+ $(this).removeClass("active-btn-match");
|
|
|
+ });
|
|
|
+ }
|
|
|
+ function importRule() {
|
|
|
+ $("#file").click();
|
|
|
+ }
|
|
|
+ $(function() {
|
|
|
+ $("#uploadform").find("input").change(function () {
|
|
|
+ var val = $(this).val() ? $(this).val() : "";
|
|
|
+ if (val.indexOf(".xlsx") < 0) {
|
|
|
+ showMsg("文件格式非法", function () {
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ var myform = new FormData();
|
|
|
+ myform.append('xlsx', $("#file")[0].files[0]);
|
|
|
+ $.ajax({
|
|
|
+ url: "/service/tag_rule/import",
|
|
|
+ type: 'POST',
|
|
|
+ data: myform,
|
|
|
+ async: false,
|
|
|
+ contentType: false,//不要设置Content-Type请求头
|
|
|
+ processData: false,// 使数据不做处理
|
|
|
+ success: function (r) {
|
|
|
+ if (r.rep) {
|
|
|
+ o_list = r.rdata["o_rules"]
|
|
|
+ $('#keywords').dataTable().fnClearTable();
|
|
|
+ $('#keywords').dataTable().fnAddData(o_list);
|
|
|
+ showTip("导入成功",1000);
|
|
|
+ } else {
|
|
|
+ showTip("导入失败",1000);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ })
|
|
|
+ });
|
|
|
+ function allSelect(obj) {
|
|
|
+ if ($(obj).is(':checked')) {
|
|
|
+ keyTableChecked = true;
|
|
|
+ keyTableAllChecked = true;
|
|
|
+ $('input[name="ckb-keyid"]').each(function () {
|
|
|
+ this.checked = true;
|
|
|
+ selectIndex.push($(this).parents("tr").index() + 1);
|
|
|
+ })
|
|
|
+ }else {
|
|
|
+ selectIndex.length = 0;
|
|
|
+ keyTableChecked = false;
|
|
|
+ keyTableAllChecked = false;
|
|
|
+ $('input[name="ckb-keyid"]').each(function () {
|
|
|
+ this.checked = false;
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ function singleSelect(obj) {
|
|
|
+ var tag = true;
|
|
|
+ selectIndex.length = 0;
|
|
|
+ $('input[name="ckb-keyid"]').each(function () {
|
|
|
+ if (this.checked) {
|
|
|
+ keyTableChecked = true;
|
|
|
+ selectIndex.push($(this).parents("tr").index() + 1);
|
|
|
+ }else {
|
|
|
+ tag = false
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if (tag) {
|
|
|
+ keyTableAllChecked = true;
|
|
|
+ $('#allCheckbox').prop("checked", true);
|
|
|
+ }else {
|
|
|
+ keyTableAllChecked = false;
|
|
|
+ $('#allCheckbox').prop("checked", false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ function saveTag() {
|
|
|
+ dataMap.s_tagname = $('#tagname').val()
|
|
|
+ dataMap.s_tagfield = $('#fieldSelect').val()
|
|
|
+ dataMap.s_tasktype = $('#taskSelect').val()
|
|
|
+ dataMap.s_query = $('#query').val()
|
|
|
+ if (dataMap.s_tagname == "" || dataMap.s_tagfield == "" || dataMap.s_tasktype == "") {
|
|
|
+ alert("请填写必须字段!")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if (o_list.length > 0) {
|
|
|
+ for (const i in o_list) {
|
|
|
+ if (o_list[i].s_matchkey && !o_list[i].s_keymatch) {
|
|
|
+ showMsg("保存失败,关键词规则中有关键词未对应匹配方式!")
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (o_list[i].s_addkey && !o_list[i].s_addkeymatch) {
|
|
|
+ showMsg("保存失败,关键词规则中有附加词未对应匹配方式!")
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ dataMap["o_list"] = JSON.stringify(o_list);
|
|
|
+ $.ajax({
|
|
|
+ url: "/service/tag_rule/save",
|
|
|
+ type: 'POST',
|
|
|
+ data: dataMap,
|
|
|
+ success: function (r) {
|
|
|
+ if (r.rep && r.id) {
|
|
|
+ dataMap["id"]= r.id;
|
|
|
+ showTip("保存成功", 1000);
|
|
|
+ } else {
|
|
|
+ showTip("保存失败", 1000);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ function selectKeyMatch(val) {
|
|
|
+ setValue = val
|
|
|
+ if (selectIndex.length > 0 && keyTableChecked) {
|
|
|
+ matchCode.length = 0;
|
|
|
+ matchName.length = 0;
|
|
|
+ $('#modal-select-match').modal("show");
|
|
|
+ }else {
|
|
|
+ alert("请选中关键词")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //匹配方式按钮点击事件
|
|
|
+ function clickMatchBtn(obj) {
|
|
|
+ if ($(obj).hasClass("active-btn-match")) {
|
|
|
+ $(obj).removeClass("active-btn-match")
|
|
|
+ matchCode.splice($.inArray($(obj).attr("code"), matchCode), 1);
|
|
|
+ matchName.splice($.inArray($(obj).val(), matchName), 1)
|
|
|
+ } else {
|
|
|
+ $(obj).addClass("active-btn-match");
|
|
|
+ matchCode.push($(obj).attr("code"));
|
|
|
+ matchName.push($(obj).val())
|
|
|
+ }
|
|
|
+
|
|
|
+ $('#btnGroupMatch2 .btn-default').each(function () {
|
|
|
+ $(this).removeClass("active-btn-match");
|
|
|
+ });
|
|
|
+ }
|
|
|
+ function clickMatchBtn2(obj) {
|
|
|
+ matchCode.length = 0;
|
|
|
+ matchName.length = 0;
|
|
|
+ if ($(obj).hasClass("active-btn-match")) {
|
|
|
+ $(obj).removeClass("active-btn-match")
|
|
|
+ matchCode.splice($.inArray($(obj).attr("code"), matchCode), 1);
|
|
|
+ matchName.splice($.inArray($(obj).val(), matchName), 1)
|
|
|
+ } else {
|
|
|
+ $(obj).addClass("active-btn-match");
|
|
|
+ matchCode.push($(obj).attr("code"));
|
|
|
+ matchName.push($(obj).val())
|
|
|
+ $('#btnGroupMatch2 .btn-default').each(function () {
|
|
|
+ if (this != obj) {
|
|
|
+ $(this).removeClass("active-btn-match");
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ $('#btnGroupMatch .btn-default').each(function () {
|
|
|
+ $(this).removeClass("active-btn-match");
|
|
|
+ });
|
|
|
+ }
|
|
|
+ //匹配方式保存
|
|
|
+ function saveMatch() {
|
|
|
+ $('#btnGroupMatch').find("input").each(function () {
|
|
|
+ $(this).removeClass("active-btn-match");
|
|
|
+ });
|
|
|
+ $('#btnGroupMatch2').find("input").each(function () {
|
|
|
+ $(this).removeClass("active-btn-match");
|
|
|
+ });
|
|
|
+ var matchNameStr = "";
|
|
|
+ var codeStr = "";
|
|
|
+ for (var i in matchName) {
|
|
|
+ if (matchNameStr == "") {
|
|
|
+ matchNameStr = matchName[i];
|
|
|
+ }else {
|
|
|
+ matchNameStr += "," + matchName[i]
|
|
|
+ }
|
|
|
+ if (codeStr == "") {
|
|
|
+ codeStr = matchCode[i]
|
|
|
+ }else {
|
|
|
+ codeStr = codeStr + "," + matchCode[i]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (var i in selectIndex) {
|
|
|
+ var j = selectIndex[i] - 1;
|
|
|
+ if (setValue == 4) {
|
|
|
+ if ($("#keywords tbody tr:nth-child("+selectIndex[i]+") td:nth-child(3)").text() != "") {
|
|
|
+ $("#keywords tbody tr:nth-child("+selectIndex[i]+") td:nth-child("+setValue+")").html(matchNameStr);
|
|
|
+ o_list[j]["s_keymatch"] = codeStr;
|
|
|
+ }
|
|
|
+ }else if (setValue == 6) {
|
|
|
+ if ($("#keywords tbody tr:nth-child("+selectIndex[i]+") td:nth-child(5)").text() != "") {
|
|
|
+ $("#keywords tbody tr:nth-child("+selectIndex[i]+") td:nth-child("+setValue+")").html(matchNameStr);
|
|
|
+ o_list[j]["s_addkeymatch"] = codeStr;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ $('#modal-select-match').modal("hide");
|
|
|
+ matchName.length = 0;
|
|
|
+ matchCode.length = 0;
|
|
|
+ }
|
|
|
+</script>
|