From de679172ea6e58ca93f606f982397c01b83e4208 Mon Sep 17 00:00:00 2001 From: LiuZhengYu <2777920394@qq.com> Date: Mon, 27 Apr 2026 09:17:37 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=85=B3=E9=94=AE=E8=AF=8D?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=B8=83=E5=B1=80=EF=BC=8C=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?AI=E5=89=94=E9=99=A4=E5=92=8C=E8=81=94=E6=83=B3=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/admin/www/keywordManage.html | 101 ++++++++++-- web/admin/www/keywordManage.php | 257 ++++++++++++++++++++----------- 2 files changed, 256 insertions(+), 102 deletions(-) diff --git a/web/admin/www/keywordManage.html b/web/admin/www/keywordManage.html index 189b285..3f9eb09 100644 --- a/web/admin/www/keywordManage.html +++ b/web/admin/www/keywordManage.html @@ -33,20 +33,27 @@
- +
+
Loading...
@@ -120,26 +127,40 @@ // 保存编辑后的关键词入库 function saveEditKeywords(){ - let text = $5('[id=editKeywordText]').val().trim(); + let text = ''; + var aiBox = document.getElementById('AI_editBox'); + var editBox = document.getElementById('editBox'); + var currentCateid = $5('[id=cross_cateid_select]').val().trim(); + if(aiBox.style.display !== 'none'){ + text = document.getElementById('AI_editKeywordText').value.trim(); + console.log("AI:"+text); + + } else { + text = document.getElementById('editKeywordText').value.trim(); + console.log("normal:"+text); + } + if(!text){ ciyfn.toast('没有需要保存的关键词'); return; } ciyfn.callfunc('ConfirmSaveKeywords',{ - cateid:currentCateid, - text:text + cateid: currentCateid, + text: text },function(res){ if(res.code === 1){ ciyfn.toast(res.msg); - $5('[id=editBox]').hide(); - $5('[id=editKeywordText]').val(''); + editBox.style.display = 'none'; + aiBox.style.display = 'none'; + document.getElementById('editKeywordText').value = ''; + document.getElementById('AI_editKeywordText').value = ''; }else{ ciyfn.toast(res.errmsg); } }); } - // 原有批量添加不变 + //批量添加不变 function BatchAdd() { var cateid = $5('[id=cross_cateid_select]').val(); var names = $5('[name=cross_dim2]').val().trim(); @@ -164,6 +185,66 @@ } }); } - + + //AI相关功能 + function AIFunction(param) { + let text = ''; + if(param === '修改'){ + text = $5('[id=editKeywordText]').val().trim(); + if (!text) { + ciyfn.toast('请先生成关键词再使用AI修改'); + return; + } + ciyfn.toast('AI正在处理中...', 9999); + ciyfn.callfunc('AIFunction', { + content: text, + param: param + }, function (res) { + if (res.code === 1) { + $5('[id=editKeywordText]').val(res.data); + $5('[id=editBox]').show(); + $5('[id=AI_editBox]').hide(); + ciyfn.toast('AI ' + param + ' 完成'); + } else { + ciyfn.toast('AI ' + param + ' 失败:' + res.errmsg); + } + }); + }else{ + 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; + } + + ciyfn.toast('AI联想中...', 9999); + ciyfn.callfunc('AIFunction', { + cateid: cateid, + dim1: dim1, + dim2: dim2, + dim3: dim3, + param: param + }, function (res) { + if (res.code === 1) { + $5('[id=AI_editKeywordText]').val(res.data); + $5('[id=AI_editBox]').show(); + $5('[id=editBox]').hide(); + ciyfn.toast('AI ' + param + ' 完成'); + } else { + ciyfn.toast('AI ' + param + ' 失败:' + res.errmsg); + } + }); + + } + + } + \ No newline at end of file diff --git a/web/admin/www/keywordManage.php b/web/admin/www/keywordManage.php index fffa0bf..1b32d16 100644 --- a/web/admin/www/keywordManage.php +++ b/web/admin/www/keywordManage.php @@ -390,111 +390,111 @@ class keywordManage } // 后端批量导入接口 -public static function json_BatchAdd() -{ - global $db; - $rsuser = verifyfast(); - $post = new \ciy\post(); + public static function json_BatchAdd() + { + global $db; + $rsuser = verifyfast(); + $post = new \ciy\post(); - $font_cateid = $post->getint('cateid'); - $font_names = trim($post->get('names')); + $font_cateid = $post->getint('cateid'); + $font_names = trim($post->get('names')); - $Array_name = explode("\n", $font_names); + $Array_name = explode("\n", $font_names); - try { - $db->begin(); + try { + $db->begin(); - foreach ($Array_name as $name) { - $name = trim($name); - if ($name === '') continue; + 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); + $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() - ]; + 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; + $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()); } - }else{ - foreach ($arr2 as $b) { - $keywords[] = $b; - } } - $keywords = array_unique($keywords); - if (empty($keywords)) { - return errjson('未生成有效关键词'); + // 交叉生成关键词 + 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 + ]); } - // 返回数组给前端编辑 - return succjson([ - 'list' => $keywords - ]); -} - -// 确认后入库 -public static function json_ConfirmSaveKeywords() + // 确认后入库 + public static function json_ConfirmSaveKeywords() { global $db; $rsuser = verifyfast(); @@ -502,7 +502,7 @@ public static function json_ConfirmSaveKeywords() $cateid = $post->getint('cateid'); $text = trim($post->get('text')); - + clog($text); if (empty($cateid) || empty($text)) { return errjson('请填写相应的信息'); } @@ -536,4 +536,77 @@ public static function json_ConfirmSaveKeywords() return errjson($e->getMessage()); } } + + //AI相关功能 + public static function json_AIFunction() + { + global $db; + $rsuser = verifyfast(); + $post = new \ciy\post(); + + $function_type = trim($post->get('param')); + + // AI配置 + $aiConfig = [ + 'baseurl' => 'https://dashscope.aliyuncs.com/compatible-mode/v1', + 'aikey' => 'sk-0cd7b8c72ae04d049306e345f17c6790', + 'model' => 'qwen-turbo', + 'maxtoken' => 2000 + ]; + + try { + $openai = new \ciy\openai($aiConfig); + // 角色定位 + if ($function_type === '修改') { + $content = trim($post->get('content')); + if (empty($content)) { + return errjson('请先等待生成关键词后再操作'); + } + $system = '你是SEO关键词清洗优化助手,严格遵守: + 1. 核心词绝对不能修改、删除、替换; + 2. 只剔除不通顺、重复、无意义、垃圾关键词; + 3. 可优化前后修饰词,不改变核心; + 4. 输出严格一行一个,无解释、无符号、无序号; + 5. 只净化,不新增。'; + + $prompt = "请清洗优化以下关键词:\n{$content}"; + } else { + $cateid = trim($post->get('cateid')); + $dim1 = trim($post->get('dim1')); + $new_dim1 = empty($dim1) ? "自行补充,与核心词高度关联" : $dim1; + $dim2 = trim($post->get('dim2')); + + $core_words = explode("\n", $dim2); + $core_words = array_filter(array_map('trim', $core_words)); + $filter_str = implode('、', $core_words); + + $dim3 = trim($post->get('dim3')); + $new_dim3 = empty($dim3) ? "自行补充,与核心词高度关联" : $dim3;; + if (empty($cateid)) { + return errjson('请选择所属栏目'); + } + if(empty($dim2)){ + return errjson('请填写核心关键词'); + } + // AI 联想 + $system = '你是专业的SEO关键词生成助手,严格遵守: + 1. 核心词绝对不变; + 2. 根据核心词自动生成合理的前缀词+核心词+后缀词组合的关键词; + 3. 剔除不通顺、重复、无意义内容; + 4. 输出一行一个,无多余内容; + 5. 生成数量 7-12 个。'; + + $prompt = "前缀词: . {$new_dim1} . 核心词:.{$filter_str}.后缀词:.{$new_dim3} . 请根据提供的前缀词、核心词、后缀词生成生成优质关键词";} + $openai->newsystem($system); + $res = $openai->completion($prompt); + + if (is_array($res) && !empty($res['content'])) { + return succjson(['data' => trim($res['content'])]); + } else { + return errjson('AI处理失败:' . $res); + } + } catch (\Exception $e) { + return errjson('接口异常:' . $e->getMessage()); + } + } }