国内流行的内容管理系统(CMS)多端全媒体解决方案 https://www.dedebiz.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

537 line
22KB

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
  6. <title>添加栏目</title>
  7. <link rel="stylesheet" href="/static/web/css/font-awesome.min.css">
  8. <link rel="stylesheet" href="/static/web/css/bootstrap.min.css">
  9. <link rel="stylesheet" href="/static/web/css/admin.css">
  10. <script src="/static/web/js/jquery.min.js"></script>
  11. <script src="/static/web/js/bootstrap.min.js"></script>
  12. <script src="/static/web/js/admin.main.js"></script>
  13. </head>
  14. <body>
  15. <div class="container-fluid">
  16. <ol class="breadcrumb">
  17. <li class="breadcrumb-item"><a href="index_body.php">后台面板</a></li>
  18. <li class="breadcrumb-item"><a href="catalog_main.php">网站栏目管理</a></li>
  19. <li class="breadcrumb-item active">添加栏目</li>
  20. </ol>
  21. <div class="card shadow-sm">
  22. <div class="card-header d-flex justify-content-between align-items-center">添加栏目<?php if($cfg_ai_enabled == 'Y'){;?><button type="button" id="btnAI" onclick="showAI();" class="btn btn-success btn-sm">小德AI助手</button><?php };?></div>
  23. <div class="card-body">
  24. <form name="form1" action="catalog_add.php" method="post">
  25. <input type="hidden" name="dopost" value="save">
  26. <input type="hidden" name="reid" id="reid" value="<?php echo $id;?>">
  27. <input type="hidden" name="topid" id="topid" value="<?php echo $topid;?>">
  28. <?php
  29. if ($id>0) {
  30. echo " <input type='hidden' name='moresite' value='{$myrow['moresite']}'>";
  31. echo " <input type='hidden' name='siteurl' value='{$myrow['siteurl']}'>";
  32. echo " <input type='hidden' name='sitepath' value='{$myrow['sitepath']}'>";
  33. }
  34. ?>
  35. <div class="table-responsive">
  36. <table class="table table-borderless">
  37. <tbody>
  38. <tr>
  39. <td width="10%">是否支持投稿</td>
  40. <td width="40%">
  41. <label><input type="radio" name="issend" value="1" <?php if ($issend==1) echo " checked ";?>> 支持</label>
  42. <label><input type="radio" name="issend" value="0" <?php if ($issend==0) echo " checked ";?>> 不支持</label>
  43. </td>
  44. <td width="10%">是否隐藏栏目</td>
  45. <td width="40%">
  46. <label><input type="radio" name="ishidden" value="0" checked> 显示</label>
  47. <label><input type="radio" name="ishidden" value="1"> 隐藏</label>
  48. </td>
  49. </tr>
  50. <tr>
  51. <td>文档模型</td>
  52. <td>
  53. <input type="hidden" value="{style}" name="dfstyle">
  54. <select name="channeltype" id="channeltype" onChange="ParTemplet(this);" class="admin-input-sm">
  55. <?php
  56. foreach($channelArray as $k=>$arr)
  57. {
  58. if ($k==$channelid) {
  59. $nid = $arr['nid'];
  60. echo " <option value='{$k}' selected>{$arr['typename']} {$arr['nid']}</option>";
  61. } else {
  62. echo " <option value='{$k}'>{$arr['typename']} {$arr['nid']}</option>";
  63. }
  64. }
  65. ?>
  66. </select>
  67. <div id="smclass" class="mt-2" style="<?php echo ($channelid<0 ? '' : 'display:none');?>">
  68. <select name="smalltype[]" multiple="yes" class="admin-input-lg">
  69. <?php
  70. $sql = "SELECT * FROM `#@__sys_enum` WHERE egroup LIKE 'infotype' ORDER BY disorder ASC,evalue ASC ";
  71. $dsql->Execute('s',$sql);
  72. while($arr = $dsql->GetArray('s'))
  73. {
  74. if ($arr['evalue']%500==0) {
  75. echo "<option value='{$arr['evalue']}'>{$arr['ename']}</option>";
  76. } else if (preg_match("#\.#", $arr['evalue'])) {
  77. echo "<option value='{$arr['evalue']}'>└── {$arr['ename']}</option>";
  78. } else {
  79. echo "<option value='{$arr['evalue']}'>└─ {$arr['ename']}</option>";
  80. }
  81. }
  82. ?>
  83. </select>
  84. <span>(请选栏目的信息联动类型支持多选)</span>
  85. </div>
  86. </td>
  87. <td>上级目录</td>
  88. <td>
  89. <?php
  90. $pardir = '{cmspath}'.$cfg_arcdir;
  91. if (!empty($typedir)) $pardir = $typedir.'/';
  92. $pardir = preg_replace("#\/{1,}#", '/', $pardir);
  93. echo $pardir;
  94. ?>
  95. <input type="hidden" name="nextdir" id="nextdir" value="<?php echo $pardir?>">
  96. </td>
  97. </tr>
  98. <tr>
  99. <td>中文名称</td>
  100. <td><input type="text" name="typename" class="admin-input-lg" required></td>
  101. <td>中文概述</td>
  102. <td><input type="text" name="cnoverview" class="admin-input-lg"></td>
  103. </tr>
  104. <tr>
  105. <td>英文名称</td>
  106. <td><input type="text" name="enname" class="admin-input-lg"></td>
  107. <td>英文概述</td>
  108. <td><input type="text" name="enoverview" class="admin-input-lg"></td>
  109. </tr>
  110. <tr>
  111. <td>栏目大图</td>
  112. <td>
  113. <input type="text" name="bigpic" class="admin-input-lg">
  114. <button type="button" class="btn btn-success btn-sm" onclick="SelectImage('form1.bigpic');">选择</button>
  115. </td>
  116. <td>栏目小图</td>
  117. <td>
  118. <input type="text" name="litimg" class="admin-input-lg">
  119. <button type="button" class="btn btn-success btn-sm" onclick="SelectImage('form1.litimg');">选择</button>
  120. </td>
  121. </tr>
  122. <tr>
  123. <td>排列顺序</td>
  124. <td><input type="text" name="sortrank" class="admin-input-sm">(由低到高)</td>
  125. <td>浏览权限</td>
  126. <td>
  127. <select name="corank" id="corank" class="admin-input-sm">
  128. <?php
  129. $dsql->SetQuery("SELECT * FROM `#@__arcrank` WHERE `rank` >= 0 ORDER BY `rank` ASC");
  130. $dsql->Execute('cc');
  131. while($row = $dsql->GetObject('cc')) {
  132. if ($corank==$row->rank) echo "<option value='".$row->rank."' selected>".$row->membername."</option>";
  133. else {
  134. if ($corank==0){
  135. echo "<option value='".$row->rank."'>".$row->membername."</option>";
  136. }
  137. }
  138. }
  139. ?>
  140. </select>
  141. <span>(暂不支持静态)</span>
  142. </td>
  143. </tr>
  144. <tr>
  145. <td>栏目生成目录</td>
  146. <td>
  147. <input type="text" name="typedir" id="typedir" class="admin-input-lg">
  148. <label for="upinyin"><input type="checkbox" name="upinyin" id="upinyin" value="1" onclick="CheckTypeDir();"> 拼音</label>
  149. </td>
  150. <td>目录相对位置</td>
  151. <td>
  152. <label><input type="radio" name="referpath" value="parent" checked> 上级目录</label>
  153. <?php if ($moresite==0) {?>
  154. <label><input type="radio" name="referpath" value="cmspath"> 系统根目录</label>
  155. <label><input type="radio" name="referpath" value="basepath"> 站点根目录</label>
  156. <?php }?>
  157. </td>
  158. </tr>
  159. <tr>
  160. <td>栏目列表选项</td>
  161. <td>
  162. <label><input type="radio" name="isdefault" value="1" checked> 静态浏览</label>
  163. <label><input type="radio" name="isdefault" value="-1"> 动态浏览</label>
  164. <label><input type="radio" name="isdefault" value="0"> 列表第一页浏览</label>
  165. </td>
  166. <td>默认页的名称</td>
  167. <td><input type="text" name="defaultname" value="index.html" class="admin-input-lg"></td>
  168. </tr>
  169. <tr>
  170. <td>栏目属性</td>
  171. <td>
  172. <label><input type="radio" name="ispart" value="0" checked> 列表栏目(允许发布)</label>
  173. <label><input type="radio" name="ispart" value="1"> 封面栏目(不允许发布)</label>
  174. <label><input type="radio" name="ispart" id="ispart2" value="2"> 外部栏目(栏目生成目录填写链接)</label>
  175. </td>
  176. <td>栏目交叉</td>
  177. <td>
  178. <label><input type="radio" name="cross" id="cross0" value="0" onclick="CheckCross();" checked> 不交叉</label>
  179. <label><input type="radio" name="cross" id="cross1" value="1" onclick="CheckCross();"> 自动获取同名栏目</label>
  180. <label><input type="radio" name="cross" id="cross2" value="2" onclick="CheckCross();"> 指定交叉栏目id(英文逗号隔开)</label>
  181. <a href="javascript:ShowHide('helpvarco');" class="btn btn-success btn-sm">说明</a>
  182. <div id="crossid" style="display:none"><textarea name="crossid" class="admin-textarea-sm"></textarea></div>
  183. <div id="helpvarco" class="alert alert-secondary my-2" style="display:none">交叉栏目该栏目与另一个非子栏目交叉的情况,相当于副栏目功能</div>
  184. </td>
  185. </tr>
  186. <?php if ($id==0) {?>
  187. <tr>
  188. <td>多站点支持</td>
  189. <td>
  190. <label><input type="radio" name="moresite" value="1"> 启用</label>
  191. <label><input type="radio" name="moresite" value="0" checked> 不启用</label>
  192. <span>(需要绑定二级域名,系统变量中开启支持多站点)</span>
  193. </td>
  194. <td>绑定域名</td>
  195. <td><input type="text" name="siteurl" id="siteurl" onChange="CheckPathSet();" class="admin-input-lg">(请输入绑定域名http开头)</td>
  196. </tr>
  197. <?php }?>
  198. <tr>
  199. <td>列表模板</td>
  200. <td>
  201. <input type="text" name="templist" value="{style}/list_<?php echo $nid?>.htm" class="admin-input-lg">
  202. <button type="button" class="btn btn-success btn-sm" onclick="SelectTemplets('form1.templist')">选择</button>
  203. </td>
  204. <td>封面模板</td>
  205. <td>
  206. <input type="text" name="tempindex" value="{style}/index_<?php echo $nid?>.htm" class="admin-input-lg">
  207. <button type="button" class="btn btn-success btn-sm" onclick="SelectTemplets('form1.tempindex')">选择</button>
  208. <a href="javascript:ShowHide('helpvar1');" class="btn btn-success btn-sm">说明</a>
  209. <div id="helpvar1" class="alert alert-secondary my-2" style="display:none">
  210. <p>{tid} 栏目id</p>
  211. <span>{cid} 栏目模型名字id</span>
  212. </div>
  213. </td>
  214. </tr>
  215. <tr>
  216. <td>文档模板</td>
  217. <td>
  218. <input type="text" name="temparticle" value="{style}/article_<?php echo $nid?>.htm" class="admin-input-lg">
  219. <button type="button" class="btn btn-success btn-sm" onclick="SelectTemplets('form1.temparticle')">选择</button>
  220. </td>
  221. <td>列表命名规则</td>
  222. <td>
  223. <input type="text" name="namerule2" id="namerule2" value="{typedir}/{tid}-{page}.html" class="admin-input-lg">
  224. <a href="javascript:ShowHide('helpvar2');" class="btn btn-success btn-sm">说明</a>
  225. <div id="helpvar2" class="alert alert-secondary my-2" style="display:none">
  226. <p>静态规则</p>
  227. <p>{tid} 栏目id</p>
  228. <p>{page} 栏目页码数</p>
  229. <p>伪静态规则(Nginx)</p>
  230. <p>rewrite ^/list/([0-9]+)$ /apps/list.php?tid=$1;</p>
  231. <p>rewrite ^/list/([0-9]+)-([0-9]+)$ /apps/list.php?tid=$1&pageno=$2;</p>
  232. </div>
  233. </td>
  234. </tr>
  235. <tr>
  236. <td>文档命名规则</td>
  237. <td>
  238. <input type="text" name="namerule" tid="namerule" value="<?php echo $cfg_df_namerule;?>" class="admin-input-lg">
  239. <a href="javascript:ShowHide('helpvar3');" class="btn btn-success btn-sm">说明</a>
  240. <div id="helpvar3" class="alert alert-secondary my-2" style="display:none">
  241. <p>静态规则</p>
  242. <p>{Y}{M}{D} 年月日</p>
  243. <p>{timestamp} INT类型的UNIX时间戳</p>
  244. <p>{aid} 文档id</p>
  245. <p>{pinyin} 拼音加文档id</p>
  246. <p>{py} 拼音部首加文档id</p>
  247. <p>{typedir} 栏目保存目录</p>
  248. <p>{cc} 日期加混编id后用转换为适合字母</p>
  249. <p>伪静态规则(Nginx)</p>
  250. <p>rewrite ^/article/([0-9]+).html$ /apps/view.php?aid=$1;</p>
  251. <p>rewrite ^/article/([0-9]+)-([0-9]+).html$ /apps/view.php?aid=$1&pageno=$2;</p>
  252. </div>
  253. </td>
  254. <td>SEO标题</td>
  255. <td><input type="text" name="seotitle" id="seotitle" class="admin-input-lg">(标签{dede:field.seotitle/}调用)</td>
  256. </tr>
  257. <tr>
  258. <td>关键词</td>
  259. <td>
  260. <textarea name="keywords" id="keywords" class="admin-textarea-sm"></textarea>
  261. <span>(标签{dede:field.keywords/}调用)</span>
  262. </td>
  263. <td>描述</td>
  264. <td>
  265. <textarea name="description" id="description" class="admin-textarea-sm"></textarea>
  266. <span>(标签{dede:field.description/}调用)</span>
  267. </td>
  268. </tr>
  269. <tr>
  270. <td>栏目文档</td>
  271. <td>(标签{dede:field.content/}调用)</td>
  272. <td>是否支持跨站调用</td>
  273. <td>
  274. <input type="text" name="apikey" id="apikey" class="admin-input-lg" placeholder="请输入跨站调用秘钥">
  275. <label><input type="radio" name="apienabled" value="1"> 支持</label>
  276. <label><input type="radio" name="apienabled" value="0" checked> 不支持</label>
  277. <a href="javascript:makeAPIKey();" class="btn btn-success btn-sm">更新</i></a>
  278. </td>
  279. </tr>
  280. <tr>
  281. <td colspan="4"><?php GetEditor("content","","400","Default","print","false");?></td>
  282. </tr>
  283. <tr>
  284. <td colspan="4" align="center">
  285. <button type="submit" class="btn btn-success btn-sm">保存</button>
  286. <a href="catalog_main.php" class="btn btn-outline-success btn-sm">返回</a>
  287. </td>
  288. </tr>
  289. </tbody>
  290. </table>
  291. </div>
  292. </form>
  293. </div>
  294. </div>
  295. </div>
  296. <div id="mdlAI" class="modal fade" tabindex="-1" aria-hidden="true">
  297. <div class="modal-dialog modal-xl">
  298. <div class="modal-content">
  299. <div class="modal-header">
  300. <h5 class="modal-title">小德AI助手:创建栏目</h5>
  301. <button type="button" class="update-close" data-dismiss="modal" aria-label="Close"><i class="fa fa-times"></i></button>
  302. </div>
  303. <div class="modal-body">
  304. <form>
  305. <div class="form-group">
  306. <textarea id="prompt" class="form-control" style="height:160px" placeholder="请输入创建栏目要求,例如:我需要创建一个介绍穆云智能科技公司的栏目"></textarea>
  307. </div>
  308. <div class="form-group">
  309. <label for="modelid" class="form-label">选择模型</label>
  310. <select id="modelid" class="form-control">
  311. <?php
  312. $dsql->SetQuery("SELECT AM.*,A.title as aititle FROM `#@__ai_model` AM LEFT JOIN `#@__ai` A ON A.id = AM.aiid ORDER BY AM.sortrank ASC,AM.id DESC");
  313. $dsql->Execute();
  314. while ($row = $dsql->GetObject()) {
  315. ?>
  316. <option value="<?php echo $row->id;?>" <?php echo $row->isdefault==1?' selected' : '';?>><?php echo $row->model;?> <?php echo $row->aititle;?></option>
  317. <?php
  318. }
  319. ?>
  320. </select>
  321. </div>
  322. </form>
  323. </div>
  324. <div class="modal-footer">
  325. <button id="btnAIAction" class="btn btn-success btn-sm">确定</button>
  326. </div>
  327. </div>
  328. </div>
  329. </div>
  330. <script>
  331. var channelArray = new Array();
  332. <?php
  333. $i = 0;
  334. foreach($channelArray as $k=> $arr)
  335. {
  336. echo "channelArray[$k] = \"{$arr['nid']}\";";
  337. }
  338. ?>
  339. function Nav() {
  340. if (window.navigator.userAgent.indexOf("MSIE") >= 1) return 'IE';
  341. else if (window.navigator.userAgent.indexOf("Firefox") >= 1) return 'FF';
  342. else return "OT";
  343. }
  344. function SelectTemplets(fname) {
  345. var pos = GetWinPos(800,600);
  346. window.open("./dialog/select_templets.php?f=" + fname, "poptempWin", "scrollbars=yes,resizable=yes,statebar=no,width=800,height=600,left=" + pos.left + ", top=" + pos.top);
  347. }
  348. function ShowHide(objname) {
  349. var obj = document.getElementById(objname);
  350. if (obj.style.display != "none")
  351. obj.style.display = "none";
  352. else {
  353. if (Nav() == 'IE') obj.style.display = "block";
  354. else obj.style.display = "block";
  355. }
  356. }
  357. function ShowObj(objname) {
  358. var obj = document.getElementById(objname);
  359. if (Nav() == 'IE') obj.style.display = "block";
  360. else obj.style.display = "block";
  361. }
  362. function HideObj(objname) {
  363. var obj = document.getElementById(objname);
  364. obj.style.display = "none";
  365. }
  366. function CheckTypeDir() {
  367. var upinyin = document.getElementById('upinyin');
  368. var tpobj = document.getElementById('typedir');
  369. if (upinyin.checked) tpobj.style.display = "none";
  370. else tpobj.style.display = "inline-block";
  371. }
  372. function ParTemplet(obj) {
  373. var sevvalue = channelArray[obj.value];
  374. var tobj = document.getElementById('smclass');
  375. var tempindex = document.getElementsByName('tempindex');
  376. var templist = document.getElementsByName('templist');
  377. var temparticle = document.getElementsByName('temparticle');
  378. var dfstyle = document.getElementsByName('dfstyle');
  379. var dfstyleValue = dfstyle[0].value;
  380. tempindex[0].value = dfstyleValue + "/index_" + sevvalue + ".htm";
  381. templist[0].value = dfstyleValue + "/list_" + sevvalue + ".htm";
  382. temparticle[0].value = dfstyleValue + "/article_" + sevvalue + ".htm";
  383. if (obj.value < 0) {
  384. if (Nav() == 'IE') tobj.style.display = "block";
  385. else tobj.style.display = "block";
  386. } else {
  387. tobj.style.display = "none";
  388. }
  389. }
  390. function CheckPathSet() {
  391. var surl = document.getElementById("siteurl");
  392. var sreid = document.getElementById("reid");
  393. var mysel = document.getElementById("truepath3");
  394. if (surl.value != '') {
  395. if (sreid.value == "0" || sreid.value == "") {
  396. mysel.checked = true;
  397. }
  398. }
  399. }
  400. function CheckCross() {
  401. var cross2 = document.getElementById('cross2');
  402. var crossid = document.getElementById('crossid');
  403. if (cross2.checked) crossid.style.display = 'block';
  404. else crossid.style.display = 'none';
  405. }
  406. function makeAPIKey(){
  407. var apikey = document.getElementById('apikey');
  408. jQuery.get("sys_info.php?dopost=make_encode", function(data) {
  409. jQuery("#apikey").val(data);
  410. });
  411. }
  412. let eventSource; //保存EventSource实例
  413. let modelid = 0;
  414. function showAI() {
  415. $("#mdlAI").modal('show');
  416. }
  417. $("#btnAIAction").click(async function() {
  418. let prompt = document.getElementById("prompt").value;
  419. let modelid = document.getElementById("modelid").value;
  420. let req = await fetch(`api.php?action=get_ai_server&pname=catalog_add&modelid=${modelid}&prompt=${prompt}`);
  421. let resp = await req.json();
  422. if (resp.code !== 0) {
  423. ShowMsg("获取服务器地址失败");
  424. return
  425. }
  426. let eventSource = new EventSource(resp.data);
  427. //新增状态跟踪变量
  428. let currentKey = null;
  429. let tagBuffer = "";
  430. let isClosingTag = false;
  431. $("#mdlAI").modal('hide');
  432. $("#btnAI").attr("disabled", "disabled");
  433. prompt = "";
  434. let bodyHtml = "";
  435. let lastChar = "";
  436. eventSource.onmessage = (event) => {
  437. const chars = event.data.split('');
  438. chars.forEach(char => {
  439. if (lastChar === '\\' && char === 'r') {
  440. char = '<br>'; //替换为br标签
  441. lastChar = ""; //清空追踪字符
  442. } else {
  443. lastChar = char; //记录当前字符
  444. }
  445. if (char === '\\') {
  446. return; //如果是反斜杠,跳过处理
  447. }
  448. if (currentKey) {
  449. if (char === '{') {
  450. isClosingTag = true;
  451. tagBuffer = '{';
  452. return;
  453. }
  454. if (isClosingTag) {
  455. tagBuffer += char;
  456. if (tagBuffer === `{/${currentKey}}`) {
  457. if (currentKey == "content") {
  458. CKEDITOR.instances["content"].setReadOnly(false);
  459. bodyHtml = "";
  460. } else {
  461. const input = document.querySelector(`[name="${currentKey}"]`);
  462. if (input) $(input).prop("disabled", false).removeClass("disabled"); //恢复输入状态
  463. }
  464. currentKey = null;
  465. isClosingTag = false;
  466. tagBuffer = "";
  467. return;
  468. }
  469. if (!`{/${currentKey}}`.startsWith(tagBuffer)) {
  470. if (currentKey == "content") {
  471. bodyHtml += tagBuffer;
  472. console.log(bodyHtml);
  473. CKEDITOR.instances["content"].setData(bodyHtml)
  474. } else {
  475. const input = document.querySelector(`[name="${currentKey}"]`);
  476. if (input) input.value += tagBuffer;
  477. }
  478. isClosingTag = false;
  479. tagBuffer = "";
  480. }
  481. } else {
  482. if (currentKey == "content") {
  483. bodyHtml += char;
  484. CKEDITOR.instances["content"].setData(bodyHtml)
  485. } else {
  486. const input = document.querySelector(`[name="${currentKey}"]`);
  487. if (input) {
  488. input.value += char;
  489. input.scrollTop = input.scrollHeight; //滚动到底部
  490. }
  491. }
  492. }
  493. } else {
  494. if (char === '{') {
  495. tagBuffer = '{';
  496. } else if (tagBuffer.startsWith('{')) {
  497. tagBuffer += char;
  498. if (char === '}') {
  499. const match = tagBuffer.match(/{([^>]+)}/);
  500. if (match) {
  501. currentKey = match[1];
  502. if (currentKey == "content") {
  503. CKEDITOR.instances["content"].setReadOnly(true);
  504. } else {
  505. const input = document.querySelector(`[name="${currentKey}"]`);
  506. if (input) {
  507. $(input).prop("disabled", true).addClass("disabled"); //仅禁用当前输入框
  508. input.value = "";
  509. }
  510. }
  511. }
  512. tagBuffer = "";
  513. }
  514. }
  515. }
  516. });
  517. };
  518. eventSource.onerror = (error) => {
  519. if (error.target.readyState === EventSource.CONNECTING) {
  520. ShowMsg("连接失败,请确保您已开启并正确配置了DedeBIZ小德AI助手。 <a class='text-success' href='https://www.dedebiz.com/ai?from=dedebiz' target='_blank'>如何配置?</a>");
  521. } else if (typeof error.data!=="undefined" && error.data !== "" && error.target.readyState !== EventSource.CLOSED) {
  522. ShowMsg(error.data);
  523. }
  524. $("#btnAI").prop("disabled", false);
  525. eventSource.close();
  526. };
  527. //监听特定事件close
  528. eventSource.addEventListener('close', (event) => {
  529. console.log('SSE connection closed:', event.data);
  530. $("#btnAI").prop("disabled", false);
  531. eventSource.close(); //关闭连接
  532. });
  533. });
  534. </script>
  535. </body>
  536. </html>