完成交叉生成关键词功能

This commit is contained in:
LiuZhengYu 2026-04-22 16:08:01 +08:00
parent 239ffcc1fb
commit d5dc1bc7dd
2 changed files with 233 additions and 103 deletions

View File

@ -18,7 +18,7 @@
<div class="sbtns">
<button data-lang class="btn" type="submit">查询</button>
<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="multiin()">导入</a>
<a data-lang class="btn" onclick="exportxls()">导出</a>
@ -40,11 +40,11 @@
</div>
</div>
</div>
<div id="alert_pagehelp" style="display:none;">
<b>标题</b>
<div style="margin:0 0 1em 1em">
第一行
<br />第二行
第一行<br />第二行
</div>
<b>标题</b>
<ol style="margin:0 0 1em -1em">
@ -53,11 +53,10 @@
<li>第三行</li>
</ol>
</div>
<div id="alert_multiin" style="display:none;">
<div style="display:flex;">
<div>
<ciy-upload com="file" />
</div>
<div><ciy-upload com="file" /></div>
<div style="margin-left:0.3em;">
<a data-lang class="btn btn-sm def" href="/ud/inpl/www_keyword.xlsx" target="_blank">下载导入模板</a><br />
<div data-lang>每次导入建议不超过1000条</div>
@ -71,75 +70,96 @@
<div class="char4 row">
<div class="ciy-form col-24 col-sm-24">
<label data-lang class="imp">所属栏目</label>
<div>
<ciy-select com="cateid" />
</div>
<div><ciy-select com="cateid" /></div>
</div>
<div class="ciy-form col-24 col-sm-24">
<label data-lang class="imp">关键词</label>
<div>
<input type="text" name="name" style="width:100%;" />
</div>
<div><input type="text" name="name" style="width:100%;" /></div>
</div>
</div>
</div>
<!-- 新建_批量添加 -->
<!-- 批量添加 -->
<div id="alert_batchAdd" style="display:none;">
<div style="margin-bottom:10px;">
<label data-lang class="imp">所属栏目</label>
<ciy-select com="batch_cateid" id="batch_cateid" style="width:200px;"></ciy-select>
<label class="imp">所属栏目</label>
<ciy-select com="batch_cateid" style="width:200px;"></ciy-select>
</div>
<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>
耳机"></textarea>
</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/ciycmp.js"></script>
<script type="text/javascript" src="/jscss/ciytable.js"></script>
<script type="text/javascript" src="../common.js"></script>
<script type="text/javascript">
'use strict';
var table;
var Glob = {};
ciyfn.pageload(function () {
table = new ciyclass.table({
dom: '.table'
, url: 'list'
, pagecount: 10
, chkbox: true
, fn_beforedata: function (json) {
ciyfn.fillsearch({
searchdom: '.search'
, data: json
});
dom: '.table',
url: 'list',
pagecount: 10,
chkbox: true,
fn_beforedata: function (json) {
ciyfn.fillsearch({ searchdom: '.search', data: json });
return json;
}
, fn_tdcontent: function (key, datashow, field, data) {
},
fn_tdcontent: function (key, datashow, field, data) {
if (key == '_btn') {
var html = '';
html += `<a data-lang class="btn" onclick="menubtn(this, 'edit')">修改</a>`;
return html;
}
}
, fn_done: function (json) {
// table.mergecol('auditstatus');
// table.mergefix('总计', 'center', 6, 0, 8, 1);
// table.footertotal();
return `<a data-lang class="btn" onclick="menubtn(this, 'edit')">修改</a>`;
}
},
fn_done: function (json) {}
});
table.callpage(1);
});
function menubtn(dom, btn) {
var id = $5(dom).parent('tr').attr('data-id');
if (btn == 'edit') {
edit(id);
}
if (btn == 'edit') edit(id);
}
function getdata(id, act, cb) {
@ -149,18 +169,16 @@
function edit(id) {
getdata(id, 'edit', function (jsndat) {
ciyfn.alert({
title: '修改'
, width: 'pc'
, content: document.getElementById("alert_edit").innerHTML
//, noparent:true
, fn_showed: function (doc, dom) {
title: '修改',
width: 'pc',
content: document.getElementById("alert_edit").innerHTML,
fn_showed: function (doc, dom) {
var dat = jsndat.data;
ciycmp({ dom: $5('[com=cateid]', dom), value: dat.cateid, range: table.json.www_list_cate });
$5('[name=name]', dom).val(dat.name);
}
, cb: function (opn) {
if (opn.btn == "关闭")
return opn.close();
},
cb: function (opn) {
if (opn.btn == "关闭") return opn.close();
opn.inputs.id = id;
if (ciyfn.throttle(opn.dombtn)) return;
ciyfn.callfunc('update', opn.inputs, function (json) {
@ -173,6 +191,7 @@
});
});
}
function multiin() {
ciyfn.table_multiin('importxls', document.getElementById("alert_multiin").innerHTML, function (json) {
ciyfn.toast('导入成功');
@ -184,63 +203,82 @@
function exportxls() {
ciyfn.table_exportxls('exportxls', table, function (json) {
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>'
, btns: null
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
});
});
}
function pagehelp() {
ciyfn.alert({
title: '页面帮助'
, width: 'pc'
, content: document.getElementById("alert_pagehelp").innerHTML
title: '页面帮助',
width: 'pc',
content: document.getElementById("alert_pagehelp").innerHTML
});
}
// 批量添加
function ManyKeyWordAdd(){
function ManyKeyWordAdd() {
ciyfn.alert({
title: '批量添加关键词'
, width: 'pc'
, content: document.getElementById("alert_batchAdd").innerHTML
, fn_showed: function (doc, dom) {
title: '批量添加关键词',
width: 'pc',
content: document.getElementById("alert_batchAdd").innerHTML,
fn_showed: function (doc, dom) {
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();
let cateid = $5('[com=batch_cateid]', opn.dom).val();
let names = $5('[name=batch_names]', opn.dom).val();
console.log("我是cateid"+cateid);
console.log("我是names"+names);
if (!cateid) {
ciyfn.toast('请选择所属栏目');
return;
}
if (!names) {
ciyfn.toast('请输入关键词');
return;
}
ciyfn.callfunc('BatchAdd', {
cateid: cateid,
names: names
}, function (json) {
if (!cateid) { ciyfn.toast('请选择所属栏目'); return; }
if (!names) { ciyfn.toast('请输入关键词'); return; }
ciyfn.callfunc('BatchAdd', { cateid, names }, function (json) {
table.cachecount = -1;
table.callpage();
// console.log("php:"+json.data);
// console.log("php:"+json.cateid);
opn.close();
ciyfn.toast('批量添加成功');
});
},
btns: ["确认批量添加", "*关闭"],
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>
</body>
</html>

View File

@ -160,7 +160,7 @@ class keyword
{
global $db;
$rsuser = verifyfast();
//if (nopower($db, $rsuser['id'], 'p e'))
//if (nopower($db, $rsuser['id'], 'p e'))a
// return errjson('您未被授权操作');
$post = new \ciy\post();
list($where, $csql) = self::setwhere($db, $post, $rsuser);
@ -436,4 +436,96 @@ public static function json_BatchAdd()
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());
}
}
}