Compare commits

...

2 Commits

2 changed files with 234 additions and 103 deletions

View File

@ -18,7 +18,7 @@
<div class="sbtns"> <div class="sbtns">
<button data-lang class="btn" type="submit">查询</button> <button data-lang class="btn" type="submit">查询</button>
<a data-lang class="btn" onclick="ManyKeyWordAdd()">批量添加</a> <a data-lang class="btn" onclick="ManyKeyWordAdd()">批量添加</a>
<a data-lang class="btn" onclick="">交叉生成</a> <a data-lang class="btn" onclick="GenerateKeywords()">交叉生成</a>
<a data-lang class="btn" onclick="">AI联想</a> <a data-lang class="btn" onclick="">AI联想</a>
<a data-lang class="btn" onclick="multiin()">导入</a> <a data-lang class="btn" onclick="multiin()">导入</a>
<a data-lang class="btn" onclick="exportxls()">导出</a> <a data-lang class="btn" onclick="exportxls()">导出</a>
@ -40,11 +40,11 @@
</div> </div>
</div> </div>
</div> </div>
<div id="alert_pagehelp" style="display:none;"> <div id="alert_pagehelp" style="display:none;">
<b>标题</b> <b>标题</b>
<div style="margin:0 0 1em 1em"> <div style="margin:0 0 1em 1em">
第一行 第一行<br />第二行
<br />第二行
</div> </div>
<b>标题</b> <b>标题</b>
<ol style="margin:0 0 1em -1em"> <ol style="margin:0 0 1em -1em">
@ -53,11 +53,10 @@
<li>第三行</li> <li>第三行</li>
</ol> </ol>
</div> </div>
<div id="alert_multiin" style="display:none;"> <div id="alert_multiin" style="display:none;">
<div style="display:flex;"> <div style="display:flex;">
<div> <div><ciy-upload com="file" /></div>
<ciy-upload com="file" />
</div>
<div style="margin-left:0.3em;"> <div style="margin-left:0.3em;">
<a data-lang class="btn btn-sm def" href="/ud/inpl/www_keyword.xlsx" target="_blank">下载导入模板</a><br /> <a data-lang class="btn btn-sm def" href="/ud/inpl/www_keyword.xlsx" target="_blank">下载导入模板</a><br />
<div data-lang>每次导入建议不超过1000条</div> <div data-lang>每次导入建议不超过1000条</div>
@ -71,75 +70,96 @@
<div class="char4 row"> <div class="char4 row">
<div class="ciy-form col-24 col-sm-24"> <div class="ciy-form col-24 col-sm-24">
<label data-lang class="imp">所属栏目</label> <label data-lang class="imp">所属栏目</label>
<div> <div><ciy-select com="cateid" /></div>
<ciy-select com="cateid" />
</div>
</div> </div>
<div class="ciy-form col-24 col-sm-24"> <div class="ciy-form col-24 col-sm-24">
<label data-lang class="imp">关键词</label> <label data-lang class="imp">关键词</label>
<div> <div><input type="text" name="name" style="width:100%;" /></div>
<input type="text" name="name" style="width:100%;" />
</div>
</div> </div>
</div> </div>
</div> </div>
<!-- 新建_批量添加 --> <!-- 批量添加 -->
<div id="alert_batchAdd" style="display:none;"> <div id="alert_batchAdd" style="display:none;">
<div style="margin-bottom:10px;"> <div style="margin-bottom:10px;">
<label data-lang class="imp">所属栏目</label> <label class="imp">所属栏目</label>
<ciy-select com="batch_cateid" id="batch_cateid" style="width:200px;"></ciy-select> <ciy-select com="batch_cateid" style="width:200px;"></ciy-select>
</div> </div>
<div style="margin-bottom:10px;"> <div style="margin-bottom:10px;">
<label data-lang class="imp">关键词</label><br> <label class="imp">关键词</label><br>
<textarea name="batch_names" style="width:100%;height:280px;padding:10px;" placeholder="请一行输入一个关键词,例如: <textarea name="batch_names" style="width:100%;height:280px;padding:10px;" placeholder="请一行输入一个关键词,例如:
手机 手机
电脑 电脑
耳机 耳机"></textarea>
"></textarea> </div>
</div> </div>
</div>
<!-- 交叉生成关键词功能 -->
<div id="generateKeywords" style="display:none;">
<div style="margin-bottom:10px;">
<label class="imp">所属栏目</label>
<ciy-select com="cross_cateid" style="width:200px;"></ciy-select>
</div>
<div style="margin-bottom:10px;">
<label class="imp">核心词</label><br>
<textarea name="cross_dim1" style="width:100%;height:120px;padding:10px;" placeholder="一行一个,例如:
手机
电脑
耳机"></textarea>
</div>
<div style="margin-bottom:10px;">
<label class="imp">修饰词</label><br>
<textarea name="cross_dim2" style="width:100%;height:120px;padding:10px;" placeholder="一行一个,例如:
新款
特价
防水
无线"></textarea>
</div>
<div style="margin-bottom:10px;">
<label>扩展词</label><br>
<textarea name="cross_dim3" style="width:100%;height:80px;padding:10px;" placeholder="一行一个,例如:
包邮
官方正品
2025款"></textarea>
</div>
<div style="color:#666;">
生成规则维度1 × 维度2 × 维度3自动去重、过滤空行
</div>
</div>
<script type="text/javascript" src="/jscss/ciy.js"></script> <script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="/jscss/ciycmp.js"></script> <script type="text/javascript" src="/jscss/ciycmp.js"></script>
<script type="text/javascript" src="/jscss/ciytable.js"></script> <script type="text/javascript" src="/jscss/ciytable.js"></script>
<script type="text/javascript" src="../common.js"></script> <script type="text/javascript" src="../common.js"></script>
<script type="text/javascript"> <script type="text/javascript">
'use strict'; 'use strict';
var table; var table;
var Glob = {}; var Glob = {};
ciyfn.pageload(function () { ciyfn.pageload(function () {
table = new ciyclass.table({ table = new ciyclass.table({
dom: '.table' dom: '.table',
, url: 'list' url: 'list',
, pagecount: 10 pagecount: 10,
, chkbox: true chkbox: true,
, fn_beforedata: function (json) { fn_beforedata: function (json) {
ciyfn.fillsearch({ ciyfn.fillsearch({ searchdom: '.search', data: json });
searchdom: '.search'
, data: json
});
return json; return json;
} },
, fn_tdcontent: function (key, datashow, field, data) { fn_tdcontent: function (key, datashow, field, data) {
if (key == '_btn') { if (key == '_btn') {
var html = ''; return `<a data-lang class="btn" onclick="menubtn(this, 'edit')">修改</a>`;
html += `<a data-lang class="btn" onclick="menubtn(this, 'edit')">修改</a>`;
return html;
} }
} },
, fn_done: function (json) { fn_done: function (json) {}
// table.mergecol('auditstatus');
// table.mergefix('总计', 'center', 6, 0, 8, 1);
// table.footertotal();
}
}); });
table.callpage(1); table.callpage(1);
}); });
function menubtn(dom, btn) { function menubtn(dom, btn) {
var id = $5(dom).parent('tr').attr('data-id'); var id = $5(dom).parent('tr').attr('data-id');
if (btn == 'edit') { if (btn == 'edit') edit(id);
edit(id);
}
} }
function getdata(id, act, cb) { function getdata(id, act, cb) {
@ -149,18 +169,16 @@
function edit(id) { function edit(id) {
getdata(id, 'edit', function (jsndat) { getdata(id, 'edit', function (jsndat) {
ciyfn.alert({ ciyfn.alert({
title: '修改' title: '修改',
, width: 'pc' width: 'pc',
, content: document.getElementById("alert_edit").innerHTML content: document.getElementById("alert_edit").innerHTML,
//, noparent:true fn_showed: function (doc, dom) {
, fn_showed: function (doc, dom) {
var dat = jsndat.data; var dat = jsndat.data;
ciycmp({ dom: $5('[com=cateid]', dom), value: dat.cateid, range: table.json.www_list_cate }); ciycmp({ dom: $5('[com=cateid]', dom), value: dat.cateid, range: table.json.www_list_cate });
$5('[name=name]', dom).val(dat.name); $5('[name=name]', dom).val(dat.name);
} },
, cb: function (opn) { cb: function (opn) {
if (opn.btn == "关闭") if (opn.btn == "关闭") return opn.close();
return opn.close();
opn.inputs.id = id; opn.inputs.id = id;
if (ciyfn.throttle(opn.dombtn)) return; if (ciyfn.throttle(opn.dombtn)) return;
ciyfn.callfunc('update', opn.inputs, function (json) { ciyfn.callfunc('update', opn.inputs, function (json) {
@ -173,6 +191,7 @@
}); });
}); });
} }
function multiin() { function multiin() {
ciyfn.table_multiin('importxls', document.getElementById("alert_multiin").innerHTML, function (json) { ciyfn.table_multiin('importxls', document.getElementById("alert_multiin").innerHTML, function (json) {
ciyfn.toast('导入成功'); ciyfn.toast('导入成功');
@ -184,62 +203,82 @@
function exportxls() { function exportxls() {
ciyfn.table_exportxls('exportxls', table, function (json) { ciyfn.table_exportxls('exportxls', table, function (json) {
ciyfn.alert({ ciyfn.alert({
content: '<div style="text-align:center;"><span data-lang>导出数据已生成</span><br/><br/><a data-lang class="btn lg" href="' + json.url + '" target="_blank">下载数据</a></div>' content: '<div style="text-align:center;"><span data-lang>导出数据已生成</span><br/><br/><a data-lang class="btn lg" href="' + json.url + '" target="_blank">下载数据</a></div>',
, btns: null btns: null
}); });
}); });
} }
function pagehelp() { function pagehelp() {
ciyfn.alert({ ciyfn.alert({
title: '页面帮助' title: '页面帮助',
, width: 'pc' width: 'pc',
, content: document.getElementById("alert_pagehelp").innerHTML content: document.getElementById("alert_pagehelp").innerHTML
}); });
} }
// 批量添加 // 批量添加
function ManyKeyWordAdd(){ function ManyKeyWordAdd() {
ciyfn.alert({ ciyfn.alert({
title: '批量添加关键词' title: '批量添加关键词',
, width: 'pc' width: 'pc',
, content: document.getElementById("alert_batchAdd").innerHTML content: document.getElementById("alert_batchAdd").innerHTML,
, fn_showed: function (doc, dom) { fn_showed: function (doc, dom) {
ciycmp({ dom: $5('[com=batch_cateid]', dom), value: 0, range: table.json.www_list_cate }); ciycmp({ dom: $5('[com=batch_cateid]', dom), value: 0, range: table.json.www_list_cate });
} },
, cb: function (opn){ cb: function (opn) {
if (opn.btn == "关闭") return opn.close(); if (opn.btn == "关闭") return opn.close();
let cateid = $5('[com=batch_cateid]', opn.dom).val();
let cateid = $5('[com=batch_cateid]', opn.dom).val(); let names = $5('[name=batch_names]', opn.dom).val();
let names = $5('[name=batch_names]', opn.dom).val(); if (!cateid) { ciyfn.toast('请选择所属栏目'); return; }
console.log("我是cateid"+cateid); if (!names) { ciyfn.toast('请输入关键词'); return; }
console.log("我是names"+names); ciyfn.callfunc('BatchAdd', { cateid, names }, function (json) {
table.cachecount = -1;
table.callpage();
if (!cateid) { opn.close();
ciyfn.toast('请选择所属栏目'); ciyfn.toast('批量添加成功');
return; });
} },
if (!names) { btns: ["批量添加", "*关闭"],
ciyfn.toast('请输入关键词');
return;
}
ciyfn.callfunc('BatchAdd', {
cateid: cateid,
names: names
}, function (json) {
table.cachecount = -1;
table.callpage();
// console.log("php:"+json.data);
// console.log("php:"+json.cateid);
opn.close();
ciyfn.toast('批量添加成功');
}); });
}, }
btns: ["批量添加", "*关闭"],
}); function GenerateKeywords() {
} ciyfn.alert({
title: '交叉生成关键词',
width: 'pc',
content: document.getElementById("generateKeywords").innerHTML,
fn_showed: function (doc, dom) {
ciycmp({ dom: $5('[com=cross_cateid]', dom), value: 0, range: table.json.www_list_cate });
},
cb: function (opn) {
if (opn.btn == "关闭") return opn.close();
let cateid = $5('[com=cross_cateid]' , opn.dom).val();
let cross_dim1 = $5('[name=cross_dim1]' , opn.dom).val();//核心词
let cross_dim2 = $5('[name=cross_dim2]' , opn.dom).val();//修饰词
let cross_dim3 = $5('[name=cross_dim3]',opn.dom).val();//扩展词
// console.log(cross_dim1);
if(!cateid) {ciyfn.toast('请选择所属栏目'); return;}
if (!cross_dim1) { ciyfn.toast('请填写核心词'); return; }
if (!cross_dim2) { ciyfn.toast('请填写修饰词'); return; }
ciyfn.callfunc('GenerateKeywords', {
cateid : cateid,
dim1 : cross_dim1,
dim2 : cross_dim2,
dim3 : cross_dim3
}, function (json) {
table.cachecount = -1;
table.callpage();
opn.close();
ciyfn.toast(json.msg);
});
},
btns: ["生成", "*关闭"],
});
}
// }
</script> </script>
</body> </body>
</html> </html>

View File

@ -160,7 +160,7 @@ class keyword
{ {
global $db; global $db;
$rsuser = verifyfast(); $rsuser = verifyfast();
//if (nopower($db, $rsuser['id'], 'p e')) //if (nopower($db, $rsuser['id'], 'p e'))a
// return errjson('您未被授权操作'); // return errjson('您未被授权操作');
$post = new \ciy\post(); $post = new \ciy\post();
list($where, $csql) = self::setwhere($db, $post, $rsuser); list($where, $csql) = self::setwhere($db, $post, $rsuser);
@ -436,4 +436,96 @@ public static function json_BatchAdd()
return errjson('错误:'.$ex->getMessage()); return errjson('错误:'.$ex->getMessage());
} }
} }
// 交叉生成关键词
public static function json_GenerateKeywords()
{
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
// 获取前端传参
$cateid = $post->getint('cateid');
$dim1 = trim($post->get('dim1'));
$dim2 = trim($post->get('dim2'));
$dim3 = trim($post->get('dim3'));
if ($cateid == 0) {
return errjson('请选择所属栏目');
}
if (empty($dim1) || empty($dim2)) {
return errjson('核心词 和 修饰词 不能为空');
}
// 转为数组
$toArray = function ($text) {
$arr = explode("\n", $text);
$arr = array_map('trim', $arr);
$arr = array_filter($arr);
return array_unique($arr);
};
$arr1 = $toArray($dim1);
$arr2 = $toArray($dim2);
$arr3 = $toArray($dim3);
$keywords = [];
if (!empty($arr3)) {
foreach ($arr2 as $a) {
foreach ($arr1 as $b) {
foreach ($arr3 as $c) {
$kw = $a . $b . $c;
$keywords[$kw] = true;
}
}
}
} else {
foreach ($arr2 as $a) {
foreach ($arr1 as $b) {
$kw = $a . $b;
$keywords[$kw] = true;
}
}
}
$finalList = array_keys($keywords);
$total = count($finalList);
$added = 0;
if ($total == 0) {
return errjson('未生成有效关键词');
}
try {
$db->begin();
foreach ($finalList as $name) {
$csql = new \ciy\sql('www_keyword');
$csql->where('name', $name);
$csql->column = 'id';
$exists = $db->get1($csql);
if ($exists) {
continue;
}
$insert = [
'cateid' => $cateid,
'name' => $name,
'usetime' => 0,
'addtimes' => tostamp()
];
$db->insert(new \ciy\sql('www_keyword'), $insert);
$added++;
}
$db->commit();
return succjson("生成成功:共 {$total} 条,新增 {$added}");
} catch (\Exception $e) {
$db->rollback();
return errjson("错误:" . $e->getMessage());
}
}
} }