Compare commits

...

2 Commits

Author SHA1 Message Date
LiuZhengYu 368377f949 Merge branch 'master' of https://git.ciy.cn/LiuZhengYu/ciyon_ai 2026-04-24 21:01:49 +08:00
LiuZhengYu 1085744981 feat: 新增关键词管理页面
- web/admin/www/keyword.html:调整布局
- web/admin/www/keyword.php:调整布局
- web/admin/www/keywordManage.html:添加生成预览
- web/admin/www/keywordManage.php:添加生成预览逻辑
- zciyphp/comm.php:修改succjson方法
2026-04-24 20:56:56 +08:00
5 changed files with 910 additions and 189 deletions

View File

@ -17,9 +17,9 @@
<div class="sinps"></div> <div class="sinps"></div>
<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="GenerateKeywords()">交叉生成</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>
<a data-lang class="btn def" onclick="pagehelp()">帮助</a> <a data-lang class="btn def" onclick="pagehelp()">帮助</a>
@ -80,7 +80,7 @@
</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 class="imp">所属栏目</label> <label class="imp">所属栏目</label>
<ciy-select com="batch_cateid" style="width:200px;"></ciy-select> <ciy-select com="batch_cateid" style="width:200px;"></ciy-select>
@ -92,37 +92,39 @@
电脑 电脑
耳机"></textarea> 耳机"></textarea>
</div> </div>
</div> </div> -->
<!-- 交叉生成关键词功能 --> <!-- 交叉生成关键词功能 -->
<div id="generateKeywords" style="display:none;"> <!-- <div id="generateKeywords" style="display:none;">
<div style="margin-bottom:10px;"> <div style="margin-bottom:10px;">
<label class="imp">所属栏目</label> <label class="imp">所属栏目</label>
<ciy-select com="cross_cateid" style="width:200px;"></ciy-select> <ciy-select com="cross_cateid" style="width:200px;"></ciy-select>
</div> </div> -->
<div style="margin-bottom:10px;"> <!-- 三列容器 Flex 同行显示 -->
<!-- <div style="display:flex;gap:10px;">
<div style="flex:1;">
<label class="imp">核心词</label><br> <label class="imp">核心词</label><br>
<textarea name="cross_dim1" style="width:100%;height:120px;padding:10px;" placeholder="一行一个,例如: <textarea name="cross_dim1" style="width:100%;height:180px;padding:10px;" placeholder="一行一个
手机 手机
电脑 电脑
耳机"></textarea> 平板"></textarea>
</div> </div>
<div style="margin-bottom:10px;"> <div style="flex:1;">
<label class="imp">修饰词</label><br> <label class="imp">修饰词</label><br>
<textarea name="cross_dim2" style="width:100%;height:120px;padding:10px;" placeholder="一行一个,例如: <textarea name="cross_dim2" style="width:100%;height:180px;padding:10px;" placeholder="一行一个
新款 新款
特价 特价
防水 防水"></textarea>
无线"></textarea>
</div> </div>
<div style="margin-bottom:10px;"> <div style="flex:1;">
<label>扩展词</label><br> <label>扩展词</label><br>
<textarea name="cross_dim3" style="width:100%;height:80px;padding:10px;" placeholder="一行一个,例如: <textarea name="cross_dim3" style="width:100%;height:180px;padding:10px;" placeholder="一行一个
包邮 包邮
官方正品 官方正品
2025款"></textarea> 2025款"></textarea>
</div> </div>
</div> </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>
@ -216,66 +218,66 @@
} }
// 批量添加 // 批量添加
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; } // if (!cateid) { ciyfn.toast('请选择所属栏目'); return; }
if (!names) { ciyfn.toast('请输入关键词'); return; } // if (!names) { ciyfn.toast('请输入关键词'); return; }
ciyfn.callfunc('BatchAdd', { cateid, names }, function (json) { // ciyfn.callfunc('BatchAdd', { cateid, names }, function (json) {
table.cachecount = -1; // table.cachecount = -1;
table.callpage(); // table.callpage();
opn.close(); // opn.close();
ciyfn.toast('批量添加成功'); // ciyfn.toast('批量添加成功');
}); // });
}, // },
btns: ["批量添加", "*关闭"], // btns: ["批量添加", "*关闭"],
}); // });
} // }
function GenerateKeywords() { // function GenerateKeywords() {
ciyfn.alert({ // ciyfn.alert({
title: '交叉生成关键词', // title: '交叉生成关键词',
width: 'pc', // width: 'pc',
content: document.getElementById("generateKeywords").innerHTML, // content: document.getElementById("generateKeywords").innerHTML,
fn_showed: function (doc, dom) { // fn_showed: function (doc, dom) {
ciycmp({ dom: $5('[com=cross_cateid]', dom), value: 0, range: table.json.www_list_cate }); // ciycmp({ dom: $5('[com=cross_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=cross_cateid]' , opn.dom).val(); // let cateid = $5('[com=cross_cateid]' , opn.dom).val();
let cross_dim1 = $5('[name=cross_dim1]' , 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_dim2 = $5('[name=cross_dim2]' , opn.dom).val();//修饰词
let cross_dim3 = $5('[name=cross_dim3]',opn.dom).val();//扩展词 // let cross_dim3 = $5('[name=cross_dim3]',opn.dom).val();//扩展词
// console.log(cross_dim1); // // console.log(cross_dim1);
if(!cateid) {ciyfn.toast('请选择所属栏目'); return;} // if(!cateid) {ciyfn.toast('请选择所属栏目'); return;}
if (!cross_dim1) { ciyfn.toast('请填写核心词'); return; } // if (!cross_dim1) { ciyfn.toast('请填写核心词'); return; }
if (!cross_dim2) { ciyfn.toast('请填写修饰词'); return; } // if (!cross_dim2) { ciyfn.toast('请填写修饰词'); return; }
ciyfn.callfunc('GenerateKeywords', { // ciyfn.callfunc('GenerateKeywords', {
cateid : cateid, // cateid : cateid,
dim1 : cross_dim1, // dim1 : cross_dim1,
dim2 : cross_dim2, // dim2 : cross_dim2,
dim3 : cross_dim3 // dim3 : cross_dim3
}, function (json) { // }, function (json) {
table.cachecount = -1; // table.cachecount = -1;
table.callpage(); // table.callpage();
opn.close(); // opn.close();
ciyfn.toast(json.msg); // ciyfn.toast(json.msg);
}); // });
}, // },
btns: ["生成", "*关闭"], // btns: ["生成", "*关闭"],
}); // });
} // }
// } // }
</script> </script>
</body> </body>

View File

@ -391,142 +391,143 @@ class keyword
return succjson(); return succjson();
} }
// 后端批量导入接口 // // 后端批量导入接口
public static function json_BatchAdd() // public static function json_BatchAdd()
{ // {
global $db; // global $db;
$rsuser = verifyfast(); // $rsuser = verifyfast();
$post = new \ciy\post(); // $post = new \ciy\post();
$font_cateid = $post->getint('cateid'); // $font_cateid = $post->getint('cateid');
$font_names = trim($post->get('names')); // $font_names = trim($post->get('names'));
$Array_name = explode("\n", $font_names); // $Array_name = explode("\n", $font_names);
try { // try {
$db->begin(); // $db->begin();
foreach ($Array_name as $name) { // foreach ($Array_name as $name) {
$name = trim($name); // $name = trim($name);
if ($name === '') continue; // if ($name === '') continue;
$csql = new \ciy\sql('www_keyword'); // $csql = new \ciy\sql('www_keyword');
$csql->where('name', $name); // $csql->where('name', $name);
$isExist = $db->get1($csql); // $isExist = $db->get1($csql);
if ($isExist === '') { // if ($isExist === '') {
$insertData = [ // $insertData = [
'cateid' => $font_cateid, // 'cateid' => $font_cateid,
'name' => $name, // 'name' => $name,
'usetime' => 0, // 'usetime' => 0,
'addtimes' => tostamp() // 'addtimes' => tostamp()
]; // ];
$csql_insert = new \ciy\sql('www_keyword'); // $csql_insert = new \ciy\sql('www_keyword');
$db->insert($csql_insert, $insertData); // $db->insert($csql_insert, $insertData);
} // }
} // }
$db->commit(); // $db->commit();
return succjson('批量添加成功'); // return succjson('批量添加成功');
// return succjson([ // // return succjson([
// 'data'=> $font_names, // // 'data'=> $font_names,
// 'cateid'=>$font_cateid // // 'cateid'=>$font_cateid
// ]); // // ]);
} catch (\Exception $ex) { // } catch (\Exception $ex) {
$db->rollback(); // $db->rollback();
return errjson('错误:'.$ex->getMessage()); // return errjson('错误:'.$ex->getMessage());
} // }
} // }
// 交叉生成关键词 // 交叉生成关键词
public static function json_GenerateKeywords() // public static function json_GenerateKeywords()
{ // {
global $db; // global $db;
$rsuser = verifyfast(); // $rsuser = verifyfast();
$post = new \ciy\post(); // $post = new \ciy\post();
// 获取前端传参 // // 获取前端传参
$cateid = $post->getint('cateid'); // $cateid = $post->getint('cateid');
$dim1 = trim($post->get('dim1')); // $dim1 = trim($post->get('dim1'));
$dim2 = trim($post->get('dim2')); // $dim2 = trim($post->get('dim2'));
$dim3 = trim($post->get('dim3')); // $dim3 = trim($post->get('dim3'));
if ($cateid == 0) { // if ($cateid == 0) {
return errjson('请选择所属栏目'); // return errjson('请选择所属栏目');
} // }
if (empty($dim1) || empty($dim2)) { // if (empty($dim1) || empty($dim2)) {
return errjson('核心词 和 修饰词 不能为空'); // return errjson('核心词 和 修饰词 不能为空');
} // }
// 转为数组 // 转为数组
$toArray = function ($text) { // $toArray = function ($text) {
$arr = explode("\n", $text); // $arr = explode("\n", $text);
$arr = array_map('trim', $arr); // $arr = array_map('trim', $arr);
$arr = array_filter($arr); // $arr = array_filter($arr);
return array_unique($arr); // return array_unique($arr);
}; // };
$arr1 = $toArray($dim1); // $arr1 = $toArray($dim1);
$arr2 = $toArray($dim2); // $arr2 = $toArray($dim2);
$arr3 = $toArray($dim3); // $arr3 = $toArray($dim3);
$keywords = []; // $keywords = [];
if (!empty($arr3)) { // if (!empty($arr3)) {
foreach ($arr2 as $a) { // foreach ($arr2 as $a) {
foreach ($arr1 as $b) { // foreach ($arr1 as $b) {
foreach ($arr3 as $c) { // foreach ($arr3 as $c) {
$kw = $a . $b . $c; // $kw = $a . $b . $c;
$keywords[$kw] = true; // $keywords[$kw] = true;
} // }
} // }
} // }
} else { // } else {
foreach ($arr2 as $a) { // foreach ($arr2 as $a) {
foreach ($arr1 as $b) { // foreach ($arr1 as $b) {
$kw = $a . $b; // $kw = $a . $b;
$keywords[$kw] = true; // $keywords[$kw] = true;
} // }
} // }
} // }
$finalList = array_keys($keywords); // $finalList = array_keys($keywords);
$total = count($finalList); // $total = count($finalList);
$added = 0; // $added = 0;
if ($total == 0) { // if ($total == 0) {
return errjson('未生成有效关键词'); // return errjson('未生成有效关键词');
} // }
try { // try {
$db->begin(); // $db->begin();
foreach ($finalList as $name) {
$csql = new \ciy\sql('www_keyword');
$csql->where('name', $name);
$csql->column = 'id';
$exists = $db->get1($csql); // foreach ($finalList as $name) {
// $csql = new \ciy\sql('www_keyword');
// $csql->where('name', $name);
// $csql->column = 'id';
if ($exists) { // $exists = $db->get1($csql);
continue;
}
$insert = [ // if ($exists) {
'cateid' => $cateid, // continue;
'name' => $name, // }
'usetime' => 0,
'addtimes' => tostamp()
];
$db->insert(new \ciy\sql('www_keyword'), $insert);
$added++;
}
$db->commit(); // $insert = [
return succjson("生成成功:共 {$total} 条,新增 {$added}"); // 'cateid' => $cateid,
// 'name' => $name,
// 'usetime' => 0,
// 'addtimes' => tostamp()
// ];
// $db->insert(new \ciy\sql('www_keyword'), $insert);
// $added++;
// }
} catch (\Exception $e) { // $db->commit();
$db->rollback(); // return succjson("生成成功:共 {$total} 条,新增 {$added} 条");
return errjson("错误:" . $e->getMessage());
} // } catch (\Exception $e) {
} // $db->rollback();
// return errjson("错误:" . $e->getMessage());
// }
// }
} }

View File

@ -0,0 +1,169 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<link href="/jscss/style.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" charset="utf-8" src="/jscss/theme.js"></script>
</head>
<body>
<div class="container">
<!-- 交叉生成区域 -->
<div style="border:1px solid #eee;padding:15px;border-radius:6px;margin:10px 0;">
<div style="margin-bottom:10px;">
<label class="imp">所属栏目</label>
<ciy-select id="cross_cateid_select" style="width:200px;"></ciy-select>
</div>
<div style="display:flex;gap:10px;">
<div style="flex:1;">
<label>前缀词(非必填)</label><br>
<textarea name="cross_dim1" style="width:100%;height:140px;padding:10px;" placeholder="一行一个&#10;2025款&#10;新款&#10;防水"></textarea>
</div>
<div style="flex:1;">
<label class="imp">核心词(必填)</label><br>
<textarea name="cross_dim2" style="width:100%;height:140px;padding:10px;" placeholder="一行一个&#10;手机&#10;电脑&#10;平板"></textarea>
</div>
<div style="flex:1;">
<label>扩展词(非必填)</label><br>
<textarea name="cross_dim3" style="width:100%;height:140px;padding:10px;" placeholder="一行一个&#10;包邮&#10;官方正品"></textarea>
</div>
</div>
<div style="margin-top:12px;text-align:right;margin-top:12px;">
<button class="btn lg" onclick="GenerateKeywords()">交叉生成预览</button>
<button class="btn lg" onclick="BatchAdd()" style="margin-left:8px;">批量添加</button>
<button class="btn lg" onclick="AIGenerateKeyWord()" style="margin-left:8px;">AI联想</button>
</div>
</div>
<!-- 可编辑预览区域 -->
<div id="editBox" style="display:none;border:1px solid #eee;padding:15px;border-radius:6px;margin:10px 0;">
<h4>预览生成关键词</h4>
<textarea id="editKeywordText" style="width:100px;width:100%;height:260px;padding:10px;margin:10px 0;resize:vertical;"></textarea>
<div style="text-align:right;">
<button class="btn lg" onclick="AIModify()">AI修改</button>
<button class="btn lg" onclick="saveEditKeywords()">确认保存入库</button>
</div>
</div>
<div class="table" style="display:none !important; height:0; overflow:hidden;">
<div class="loading">Loading...</div>
<div class="list"></div>
<div class="page"></div>
</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 = null;
var currentCateid = 0;
ciyfn.pageload(function () {
table = new ciyclass.table({
dom: '.table',
url: 'list',
fn_done: function (json) {
if (json && json.www_list_cate) {
ciycmp({
dom: document.getElementById('cross_cateid_select'),
value: 0,
range: json.www_list_cate
});
}
}
});
table.callpage(1);
});
// 生成预览
function GenerateKeywords() {
var cateid = $5('[id=cross_cateid_select]').val();
var dim1 = $5('[name=cross_dim1]').val().trim();
var dim2 = $5('[name=cross_dim2]').val().trim();
var dim3 = $5('[name=cross_dim3]').val().trim();
if (!cateid) {
ciyfn.toast('请选择所属栏目');
return;
}
if (!dim2) {
ciyfn.toast('请填写核心词');
return;
}
currentCateid = cateid;
ciyfn.callfunc('GenerateKeywords', {
cateid: cateid,
dim1: dim1,
dim2: dim2,
dim3: dim3
}, function (res) {
if (res.code === 1) {
// 数组转换行文本,给用户编辑
let str = res.list.join("\n");
$5('[id=editKeywordText]').val(str);
$5('[id=editBox]').show();
ciyfn.toast('已生成,可手动修改后保存');
} else {
ciyfn.toast(res.errmsg);
}
});
}
// 保存编辑后的关键词入库
function saveEditKeywords(){
let text = $5('[id=editKeywordText]').val().trim();
if(!text){
ciyfn.toast('没有需要保存的关键词');
return;
}
ciyfn.callfunc('ConfirmSaveKeywords',{
cateid:currentCateid,
text:text
},function(res){
if(res.code === 1){
ciyfn.toast(res.msg);
$5('[id=editBox]').hide();
$5('[id=editKeywordText]').val('');
}else{
ciyfn.toast(res.errmsg);
}
});
}
// 原有批量添加不变
function BatchAdd() {
var cateid = $5('[id=cross_cateid_select]').val();
var names = $5('[name=cross_dim2]').val().trim();
if (!cateid) {
ciyfn.toast('请选择所属栏目');
return;
}
if (!names) {
ciyfn.toast('请输入关键词');
return;
}
ciyfn.callfunc('BatchAdd', {
cateid: cateid,
names: names
}, function (res) {
if (res.code === 1) {
ciyfn.toast(res.msg);
} else {
ciyfn.toast(res.errmsg);
}
});
}
</script>
</body>
</html>

View File

@ -0,0 +1,539 @@
<?php
namespace web\admin\www;
class keywordManage
{
static function setwhere($db, $post, $rsuser)
{
$query = $post->get('query', array());
$csql = new \ciy\sql('www_keyword');
$val = objstr($query, 'cateid');
if (!empty($val)) {
$csqlt = new \ciy\sql('www_list_cate');
$csqlt->where('name like', $val);
$trow = $db->getone($csqlt);
if (is_array($trow)) {
$csql->where('cateid', $trow['id']);
$query['cateid'] = $trow['name'];
} else {
$csql->where('cateid=0');
}
} else
$csql->where('cateid', get('_cateid'));
$csql->where('name like', objstr($query, 'name'));
$csql->where('usetime like', objstr($query, 'usetime'));
$csql->wheredaterange('addtimes', objstr($query, 'addtimes'));
$order = objstr($query, 'order', 'id desc');
$csql->order($order);
$query['order'] = $order;
return [$query, $csql];
}
public static function json_list()
{
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
list($where, $csql) = self::setwhere($db, $post, $rsuser);
$pageno = $post->getint('pageno', 1);
$pagecount = $post->getint('pagecount', 10);
$csql->limit($pageno, $pagecount);
$mainrowcount = $post->getint('count');
$mrows = $db->get($csql, $mainrowcount);
if ($mrows === false)
return errjson($db->error);
$ret = array('searchwhere' => $where, 'pageno' => $pageno, 'pagecount' => $pagecount, 'count' => $mainrowcount, 'list' => $mrows);
if ($post->getbool('field')) {
$field = array();
$fshow = $db->getfield($field, 'www_keyword');
foreach ($field as $fr => $v) {
if (get('_' . $fr))
$field[$fr]['c'] = ',' . $field[$fr]['c'];
}
$fshow = fieldadd($fshow, $field, 0, '_btn', '操作');
$ret['field'] = $field;
$ret['fshow'] = $fshow;
}
if ($post->getbool('once')) {
$ret['once'] = true;
$input = array();
if (!get('_cateid'))
$input[] = array('type' => 'input', 'form' => 'cateid', 'name' => '所属栏目', 'prop' => ' style="width:8em;"');
$input[] = array('type' => 'input', 'form' => 'name', 'name' => '关键词', 'prop' => ' style="width:8em;"');
$input[] = array('type' => 'input', 'form' => 'usetime', 'name' => '使用次数', 'prop' => ' style="width:8em;"');
$input[] = array('type' => 'daterange', 'form' => 'addtimes', 'name' => '添加时间');
$ret['searchinput'] = $input;
$csql = (new \ciy\sql('www_list_cate'))->column('id,name');
$ret['www_list_cate'] = $db->get($csql);
}
return succjson($ret);
}
public static function json_update()
{
global $db;
$rsuser = verifyfast();
//if (nopower($db, $rsuser['id'], 'p u'))
// return errjson('您未被授权操作');
$post = new \ciy\post();
//$db->trace($post->get('_pf'), $rsuser);
$id = $post->getint('id');
$cateid = $post->getint('cateid');
$name = $post->get('name');
if ($cateid == 0)
return errjson('请填写所属栏目');
if (empty($name))
return errjson('请填写关键词');
$datarow = null;
if ($id > 0) {
$csql = new \ciy\sql('www_keyword');
$csql->where('id', $id);
$datarow = $db->getone($csql);
if (!is_array($datarow))
return errjson('数据不存在');
}
try {
$db->begin();
$updata = array();
$updata['cateid'] = $cateid;
$updata['name'] = $name;
$csql = new \ciy\sql('www_keyword'); //auto
if ($id > 0) {
$csql->where('id', $id);
if ($db->update($csql, $updata) === false)
throw new \Exception('更新失败:' . $db->error);
} else {
$updata['usetime'] = 0;
$updata['addtimes'] = tostamp();
if ($db->insert($csql, $updata) === false)
throw new \Exception('新增失败:' . $db->error);
$id = $db->insert_id();
}
$updata['id'] = $id;
//savelogdb($db, $rsuser['id'], 'www_keyword', $datarow, $updata);
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
return succjson($ret);
}
public static function json_del()
{
global $db;
$rsuser = verifyfast();
//if (nopower($db, $rsuser['id'], 'p d'))
// return errjson('您未被授权操作');
$post = new \ciy\post();
//$db->trace($post->get('_pf'), $rsuser);
$ids = $post->get('ids');
if (empty($ids))
return errjson('请选择至少一条');
$csql = new \ciy\sql('www_keyword');
$csql->where('id in', $ids);
$mrows = $db->get($csql);
$vids = array();
try {
$db->begin();
foreach ($mrows as $mrow) {
$delid = $mrow['id'];
//delcheck($db, $delid, 'tablexx', 'xxid', '管理员');
//delall($db, $delid, 'tablexx', 'xxid', '运动员'); //deltimeall
delme($db, $delid, 'www_keyword');
savelogdb($db, $rsuser['id'], 'www_keyword', $mrow, null);
$vids[] = $delid;
}
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;
return succjson($ret);
}
public static function json_exportxls()
{
global $db;
$rsuser = verifyfast();
//if (nopower($db, $rsuser['id'], 'p e'))a
// return errjson('您未被授权操作');
$post = new \ciy\post();
list($where, $csql) = self::setwhere($db, $post, $rsuser);
$mrows = $db->get($csql);
if (count($mrows) > 10000)
return errjson('将导出' . count($mrows) . '条不建议超过1万条请筛选缩小范围');
$fields = array();
$fields[] = array('style' => 'l', 'width' => 60, 'field' => 'id', 'name' => '行码');
$fields[] = array('style' => 'l', 'width' => 100, 'field' => 'cateid', 'name' => '所属栏目');
$fields[] = array('style' => 'l', 'width' => 150, 'field' => 'name', 'name' => '关键词');
$fields[] = array('style' => 'r', 'width' => 100, 'field' => 'usetime', 'name' => '使用次数');
$fields[] = array('style' => 'l', 'width' => 100, 'field' => 'addtimes', 'name' => '添加时间');
$code_cateid = $db->get((new \ciy\sql('www_list_cate'))->column('id,name'));
$datas = array();
foreach ($mrows as $mrow) {
$dat = array();
foreach ($fields as $field) {
$field = $field['field'];
$val = isset($mrow[$field]) ? $mrow[$field] : '';
if ($field == 'id')
$val = enid($val);
if ($field == 'cateid')
$val = ccode($code_cateid, $val);
if ($field == 'addtimes')
$val = ($val <= 0 ? '--' : date('Y-m-d H:i', $val));
$dat[] = $val;
}
$datas[] = $dat;
}
$param = array();
$param['field'] = $fields;
$param['data'] = $datas;
$param['sheetname'] = '数据报表';
$param['titleheight'] = '25'; //列头高度
$param['landscape'] = true; //横向打印
$param['fixtopage'] = true; //打印整个工作表
$param['toptitle'] = '关键词库数据报表';
$str = \ciy\excel::general_excel_xml($param);
$filename = '';
if (empty($filename))
$filename = date('Y-m-d_H-i-s') . rand(1000, 9999);
$filename .= '.xls';
file_put_contents(PATH_WEB . 'ud/tmp/' . $filename, $str);
return succjson(array('url' => '/ud/tmp/' . $filename));
}
public static function json_importxls_in()
{
global $db;
$rsuser = verifyfast();
//if (nopower($db, $rsuser['id'], 'p i'))
// return errjson('您未被授权操作');
$post = new \ciy\post();
$file = PATH_WEB . '/ud' . $post->get('file');
if (!file_exists($file))
return errjson('文件不存在');
require_once PATH_ROOT . '../libs/phpoffice/autoload.php';
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file);
$sheet = $spreadsheet->getActiveSheet();
$datas = $sheet->toArray('', true, true, false);
$datacnt = count($datas);
if ($datacnt < 2)
return errjson('数据为空');
$html = '';
$headsn = array();
$headsn[] = '行码.id';
$headsn[] = '所属栏目.cateid';
$headsn[] = '关键词.name';
$headsn[] = '使用次数.usetime';
$xlsidx = 1;
if (empty($datas[0][count($headsn) - 1]))
$xlsidx = 2;
$heads = array();
foreach ($headsn as $_head) {
$hd = explode('.', $_head);
if (count($hd) < 2)
continue;
$heads[] = array(
'idx' => array_search($hd[0], $datas[$xlsidx - 1]),
'fld' => $hd[1],
'name' => $hd[0]
);
}
$code_cateid = $db->get((new \ciy\sql('www_list_cate'))->column('id,name'));
$html .= '<div class="table" style="width: 100%;height: calc(100% - 2.2em);overflow: auto;">';
$html .= '<table><tbody><tr>';
$html .= '<th>#</th>';
foreach ($heads as $arr) {
$html .= '<th>' . $arr['name'] . '</th>';
}
$html .= '</tr>';
$cnt = 0;
$uniques = array();
$id = 0;
for ($rowidx = $xlsidx; $rowidx < $datacnt; $rowidx++) {
$bfull = false;
foreach ($datas[$rowidx] as $dat) {
if (empty($dat))
continue;
$bfull = true;
break;
}
if (!$bfull)
continue;
$lineidx = $rowidx - $xlsidx + 1;
$hrhtml = '';
$firsthtml = '<td><div>' . $lineidx . '</div></td>';
$bempty = true;
$unqs = array();
$csql = new \ciy\sql('www_keyword');
foreach ($heads as $arr) {
$name = $arr['name'];
$errmsg = ''; //数据有误,显示红色说明
$showdat = ''; //显示在表格中的数据
if ($arr['idx'] > -1)
$showdat = trim($datas[$rowidx][$arr['idx']]);
if ($showdat == '--')
$showdat = '';
$value = $showdat; //在表单中的数据(转换后)
$ext = ''; //扩展表单
if ($name == '行码') {
if (empty($showdat)) {
$value = 0;
$showdat = '<kbd>新增</kbd>';
} else {
$id = deid($showdat);
if ($id == 0)
$errmsg = $name . '解析错误';
else {
$csqlchk = new \ciy\sql('www_keyword');
$csqlchk->where('id', $id)->column('id');
$chkid = toint($db->get1($csqlchk));
if ($chkid != $id)
$errmsg = $name . '在数据库中不存在';
$value = $id;
}
}
} else if ($name == '所属栏目') {
if (empty($showdat)) {
$errmsg = $name . '为必填项';
} else {
$value = dcode($code_cateid, $showdat);
if ($value == -1)
$errmsg = $name . '文字与系统数据不匹配';
}
} else if ($name == '关键词') {
if (empty($showdat)) {
$errmsg = $name . '为必填项';
} else {
}
} else if ($name == '使用次数') {
if (empty($showdat)) {
$value = 0;
} else {
$showdat = str_replace(',', '', $showdat);
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = toint($showdat);
}
}
if (!empty($showdat))
$bempty = false;
if (empty($errmsg))
$hrhtml .= '<td><div>' . $showdat . '<input type="hidden" name="' . $arr['fld'] . '_' . $lineidx . '" value="' . $value . '"/>' . $ext . '</div></td>';
else
$hrhtml .= '<td style="background:#ffe8c5;" title="#' . $lineidx . ':' . $errmsg . '"><div>' . $showdat . '</div></td>';
}
if ($bempty)
continue;
if (count($unqs) > 0) {
$unq = implode('|', $unqs);
if (in_array($unq, $uniques))
$firsthtml = '<td style="background:#ffe8c5;" title="#' . $lineidx . ':该行与待导入数据有重复"><div data-lang>重复</div></td>';
else {
$uniques[] = $unq;
$csql->column('id');
$chkid = toint($db->get1($csql));
if ($chkid > 0 && (($id > 0 && $chkid != $id) || $id == 0))
$firsthtml = '<td style="background:#ffe8c5;" title="#' . $lineidx . ':该行与数据库数据有重复"><div data-lang>重复</div></td>';
}
}
$html .= '<tr>' . $firsthtml . $hrhtml . '</tr>';
$cnt++;
}
$html .= '</tbody></table></div>';
$html .= '<input type="hidden" name="total" value="' . $cnt . '"/>';
$html .= '<code>共' . $cnt . '条数据</code>';
return succjson(array('html' => $html, 'count' => $cnt));
}
public static function json_importxls_data()
{
global $db;
$rsuser = verifyfast();
//if (nopower($db, $rsuser['id'], 'p i'))
// return errjson('您未被授权操作');
$post = new \ciy\post();
//$db->trace($post->get('_pf'), $rsuser);
$total = $post->getint('total');
try {
$db->begin();
for ($i = 1; $i <= $total; $i++) {
$id = $post->getint('id_' . $i);
$updata = array();
$updata['cateid'] = $post->get('cateid_' . $i);
$updata['name'] = $post->get('name_' . $i);
$updata['usetime'] = $post->get('usetime_' . $i);
$csql = new \ciy\sql('www_keyword');
if ($id == 0) {
$updata['addtimes'] = tostamp();
if ($db->insert($csql, $updata) === false)
throw new \Exception('新增导入失败:' . $db->error);
} else {
$csql->where('id', $id);
if ($db->update($csql, $updata) === false)
throw new \Exception('更新导入失败:' . $db->error);
}
}
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();
}
// 后端批量导入接口
public static function json_BatchAdd()
{
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
$font_cateid = $post->getint('cateid');
$font_names = trim($post->get('names'));
$Array_name = explode("\n", $font_names);
try {
$db->begin();
foreach ($Array_name as $name) {
$name = trim($name);
if ($name === '') continue;
$csql = new \ciy\sql('www_keyword');
$csql->where('name', $name);
$isExist = $db->get1($csql);
if ($isExist === '') {
$insertData = [
'cateid' => $font_cateid,
'name' => $name,
'usetime' => 0,
'addtimes' => tostamp()
];
$csql_insert = new \ciy\sql('www_keyword');
$db->insert($csql_insert, $insertData);
}
}
$db->commit();
return succjson('批量添加成功');
// return succjson([
// 'data'=> $font_names,
// 'cateid'=>$font_cateid
// ]);
} catch (\Exception $ex) {
$db->rollback();
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($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) && !empty($arr1)) {
foreach ($arr1 as $a) {
foreach ($arr2 as $b) {
foreach ($arr3 as $c) {
$keywords[] = $a . $b . $c;
}
}
}
}else{
foreach ($arr2 as $b) {
$keywords[] = $b;
}
}
$keywords = array_unique($keywords);
if (empty($keywords)) {
return errjson('未生成有效关键词');
}
// 返回数组给前端编辑
return succjson([
'list' => $keywords
]);
}
// 确认后入库
public static function json_ConfirmSaveKeywords()
{
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
$cateid = $post->getint('cateid');
$text = trim($post->get('text'));
if (empty($cateid) || empty($text)) {
return errjson('请填写相应的信息');
}
$lines = explode("\n", $text);
$lines = array_map('trim', $lines);
$lines = array_filter($lines);
$lines = array_unique($lines);
$addNum = 0;
try {
$db->begin();
foreach ($lines as $name) {
$sql = new \ciy\sql('www_keyword');
$sql->where('name', $name);
if ($db->get1($sql)) continue;
$ins = [
'cateid' => $cateid,
'name' => $name,
'usetime' => 0,
'addtimes' => tostamp()
];
$db->insert(new \ciy\sql('www_keyword'), $ins);
$addNum++;
}
$db->commit();
return succjson(['msg' => "保存完成,新增 {$addNum}"]);
} catch (\Exception $e) {
$db->rollback();
return errjson($e->getMessage());
}
}
}

View File

@ -876,6 +876,16 @@ function succjson($ext = null) {
$ret['code'] = 1; $ret['code'] = 1;
return $ret; return $ret;
} }
function succjson_liu($ext = null) {
if (is_array($ext))
$ret = $ext;
else
$ret = array();
if(is_string($ext)) $ret['msg'] = $ext;
$ret['code'] = 1;
return $ret;
}
function memadd($key) { function memadd($key) {
} }
function randstr($num, $letter = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890') { function randstr($num, $letter = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890') {