国内流行的内容管理系统(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.

397 lines
17KB

  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. <link rel="stylesheet" href="/static/web/css/daterangepicker.css">
  11. <link rel="stylesheet" href="/static/web/css/cropper.min.css">
  12. <script>const cfg_uplitpic_cut = '<?php echo $cfg_uplitpic_cut;?>';</script>
  13. <script src="/static/web/js/jquery.min.js"></script>
  14. <script src="/static/web/js/bootstrap.min.js"></script>
  15. <script src="/static/web/js/webajax.js"></script>
  16. <script src="/static/web/js/moment.min.js"></script>
  17. <script src="/static/web/js/daterangepicker.js"></script>
  18. <script src="/static/web/js/cropper.min.js"></script>
  19. <script src="/static/web/js/admin.main.js"></script>
  20. </head>
  21. <body>
  22. <div class="container-fluid">
  23. <ol class="breadcrumb">
  24. <li class="breadcrumb-item"><a href="index_body.php">后台面板</a></li>
  25. <li class="breadcrumb-item"><a href="catalog_do.php?cid=<?php echo $cid?>&channelid=<?php echo $channelid?>&dopost=listArchives">文档列表</a></li>
  26. <li class="breadcrumb-item active">发布文档</li>
  27. </ol>
  28. <div class="card shadow-sm">
  29. <div class="card-header d-flex justify-content-between align-items-center"><span>发布文档</span><?php if ($cfg_ai_enabled == 'Y'){;?><button type="button" id="btnAI" onclick="showAI();" class="btn btn-success btn-sm">小德AI助手</button><?php };?></div>
  30. <div class="card-body">
  31. <form name="form1" action="article_add.php" method="post" enctype="multipart/form-data">
  32. <input type="hidden" name="channelid" value="<?php echo $channelid?>">
  33. <input type="hidden" name="dopost" value="save">
  34. <div class="table-responsive">
  35. <table class="table table-borderless">
  36. <tbody>
  37. <tr>
  38. <td width="160">文档标题</td>
  39. <td width="650"><input type="text" name="title" id="title" value="<?php echo $title;?>" class="admin-input-lg" required></td>
  40. <td width="160">简略标题</td>
  41. <td><input type="text" name="shorttitle" id="shorttitle" class="admin-input-sm"></td>
  42. </tr>
  43. <tr>
  44. <td>自定义属性</td>
  45. <td colspan="3">
  46. <?php
  47. $dsql->SetQuery("SELECT * FROM `#@__arcatt` ORDER BY sortid ASC");
  48. $dsql->Execute();
  49. while($trow = $dsql->GetObject())
  50. {
  51. if ($trow->att=='j')
  52. echo "<label><input type='checkbox' name='flags[]' id='flags{$trow->att}' value='{$trow->att}' onclick='ShowUrlTr()'> {$trow->attname}[{$trow->att}]</label> ";
  53. else
  54. echo "<label><input type='checkbox' name='flags[]' id='flags{$trow->att}' value='{$trow->att}'> {$trow->attname}[{$trow->att}]</label> ";
  55. }
  56. ?>
  57. </td>
  58. </tr>
  59. <tr id="redirecturltr" style="display:none">
  60. <td>跳转网址</td>
  61. <td colspan="3"><input type="text" name="redirecturl" id="redirecturl" class="admin-input-lg"></td>
  62. </tr>
  63. <tr>
  64. <td>标签</td>
  65. <td><input type="text" name="tags" id="tags" onChange="$Obj('keywords').value=this.value;" class="admin-input-lg">(英文逗号隔开,如:DedeBIZ,得德)</td>
  66. <td>权重</td>
  67. <td><input type="text" name="weight" id="weight" value="<?php echo $maxWright['cc'];?>" class="admin-input-sm">(越小越靠前)</td>
  68. </tr>
  69. <tr id="pictable">
  70. <td>缩略图</td>
  71. <td colspan="3">
  72. <input type="text" name="picname" id="picname" class="admin-input-lg">
  73. <label><input type="checkbox" name="ddisremote" value="1" id="ddisremote"> 远程图片</label>
  74. <span class="btn btn-success btn-sm opt-button">上传<input type="file" name="files[]" id="iptAddImages"></span>
  75. <button type="button" onclick="SelectImage('form1.picname','');" class="btn btn-success btn-sm">选择</button>
  76. <button type="button" id="btnClearAll" class="btn btn-success btn-sm">清空</button>
  77. <img src="/static/web/img/thumbnail.jpg" id="litPic" class="thumbnail-md ml-3">
  78. </td>
  79. </tr>
  80. <tr>
  81. <td>来源</td>
  82. <td>
  83. <input type="text" name="source" id="source" value="<?php echo $source;?>" class="admin-input-sm">
  84. <button type="button" name="selsource" id="selsource" class="btn btn-success btn-sm">选择</button>
  85. </td>
  86. <td>编辑</td>
  87. <td>
  88. <input type="text" name="writer" id="writer" value="<?php echo $writer;?>" class="admin-input-sm">
  89. <button type="button" name="selwriter" id="selwriter" class="btn btn-success btn-sm">选择</button>
  90. </td>
  91. </tr>
  92. <tr>
  93. <td>发布栏目</td>
  94. <td>
  95. <span id="typeidct">
  96. <?php
  97. $typeOptions = GetOptionList($cid,$cuserLogin->getUserChannel(),$channelid);
  98. echo "<select name='typeid' id='typeid' class='admin-input-sm'>";
  99. echo "<option value='0'>请选择文档栏目</option>";
  100. echo $typeOptions;
  101. echo "</select>";
  102. ?>
  103. </span>
  104. <a href="javascript:ShowCatMap(event,this,<?php echo $channelid;?>,'typeid');" class="btn btn-success btn-sm">选择</a>
  105. <?php if ($cfg_need_typeid2=='Y') {echo "<a href='javascript:AddTypeid2();' class='btn btn-success btn-sm'>副栏目</a>";}?>
  106. </td>
  107. <td>金币</td>
  108. <td><input type="text" name="money" id="money" value="0" class="admin-input-sm"></td>
  109. </tr>
  110. <tr id="typeid2tr" style="display:none">
  111. <td>副栏目</td>
  112. <td colspan="3">
  113. <span id="typeid2ct"></span>
  114. <input type="text" name="typeid2" id="typeid2" class="admin-input-sm">
  115. <a href="javascript:ShowCatMap(event,this,<?php echo $channelid;?>,'typeid2');" class="btn btn-success btn-sm">选择</a>
  116. </td>
  117. </tr>
  118. <tr>
  119. <td>关键词</td>
  120. <td colspan="3">
  121. <input type="text" name="keywords" id="keywords" value="<?php echo $keywords;?>" class="admin-input-lg">
  122. <label><input type="checkbox" name="autokey" id="autokey" value="1" <?php if ($cfg_arc_autokeyword=='Y') echo 'checked';?>> 自动获取</label>
  123. <button type="button" onclick="SelectKeywords('form1.keywords');" class="btn btn-success btn-sm">选择</button>
  124. </td>
  125. </tr>
  126. <tr>
  127. <td>描述</td>
  128. <td colspan="3"><textarea name="description" id="description" class="admin-textarea-sm"><?php echo $description;?></textarea></td>
  129. </tr>
  130. <tr>
  131. <td>附加选项</td>
  132. <td colspan="3">
  133. <label><input type="checkbox" name="remote" id="remote" value="1" <?php if ($cfg_rm_remote=='Y') echo 'checked';?>> 下载远程图片和资源</label>
  134. <label><input type="checkbox" name="dellink" id="dellink" value="1" <?php if ($cfg_arc_dellink=='Y') echo 'checked';?>> 删除非站内链接</label>
  135. <a href="javascript:OpenMyWin('article_allowurl_edit.php');">[配置]</a>
  136. <label><input type="checkbox" name="autolitpic" id="autolitpic" value="1" <?php if ($cfg_arc_autopic=='Y') echo 'checked';?>> 提取第一个图片为缩略图</label>
  137. </td>
  138. </tr>
  139. <tr>
  140. <td>分页方式</td>
  141. <td colspan="3">
  142. <label><input type="radio" name="sptype" value="hand" <?php if ($cfg_arcautosp=='N') echo 'checked'?>> 手动</label>
  143. <label><input type="radio" name="sptype" value="auto" <?php if ($cfg_arcautosp=='Y') echo 'checked'?>> 自动</label>
  144. <label>大小:<input name="spsize" type="text" id="spsize" value="<?php echo $cfg_arcautosp_size?>" class="admin-input-sm"> K(分页符为:#p#分页标题#e#)</label>
  145. </td>
  146. </tr>
  147. <?php PrintAutoFieldsAdd(stripslashes($cInfos['fieldset']),'autofield'); ?>
  148. <tr>
  149. <td colspan="4"><?php GetEditor('body',$body,350);?></td>
  150. </tr>
  151. <tr>
  152. <td>评论选项</td>
  153. <td>
  154. <label><input type="radio" name="notpost" value="0" <?php if ($cfg_feedback_forbid=='N') echo 'checked';?>> 允许评论</label>
  155. <label><input type="radio" name="notpost" value="1" <?php if ($cfg_feedback_forbid=='Y') echo 'checked';?>> 禁止评论</label>
  156. </td>
  157. <td>发布选项</td>
  158. <td>
  159. <label><input type="radio" name="ishtml" value="1" checked> 静态浏览</label>
  160. <label><input type="radio" name="ishtml" value="0"> 动态浏览</label>
  161. </td>
  162. </tr>
  163. <tr>
  164. <td>文档排序</td>
  165. <td>
  166. <select name="sortup" id="sortup" class="admin-input-sm">
  167. <option value="0" selected>默认排序</option>
  168. <option value="7">置顶一周</option>
  169. <option value="30">置顶一个月</option>
  170. <option value="90">置顶三个月</option>
  171. <option value="180">置顶半年</option>
  172. <option value="360">置顶一年</option>
  173. </select>
  174. </td>
  175. <td>标题颜色</td>
  176. <td>
  177. <input type="text" name="color" id="color" class="admin-input-sm">
  178. <button type="button" name="modcolor" id="modcolor" class="btn btn-success btn-sm" onclick="ShowColor(event, this)">选择</button>
  179. </td>
  180. </tr>
  181. <tr>
  182. <td>浏览权限</td>
  183. <td>
  184. <select name="arcrank" id="arcrank" class="admin-input-sm">
  185. <?php
  186. $urank = $cuserLogin->getUserRank();
  187. $dsql->SetQuery("SELECT * FROM `#@__arcrank` where adminrank<='$urank' ORDER BY `rank` ASC");
  188. $dsql->Execute();
  189. while($row = $dsql->GetObject())
  190. {
  191. $selected = $row->rank == 0 ? ' selected' : '';
  192. echo "<option value='".$row->rank."'{$selected}>".$row->membername."</option>";
  193. }
  194. ?>
  195. </select>
  196. <span>(暂不支持静态)</span>
  197. </td>
  198. <td>文件名称</td>
  199. <td><input type="text" name="filename" id="filename" class="admin-input-sm">(不包括文件扩展名)</td>
  200. <td><?php echo "<input type='hidden' name='templet'>";?></td>
  201. </tr>
  202. <tr>
  203. <td>发布时间</td>
  204. <td>
  205. <?php
  206. $nowtime = GetDateTimeMk(time());
  207. echo "<input type='text' name='pubdate' value='$nowtime' id='pubdate' class='datepicker admin-input-sm'>";
  208. ?>
  209. </td>
  210. <td>浏览次数</td>
  211. <td><input type="text" name="click" value="<?php echo ($cfg_arc_click=='-1' ? mt_rand(1000, 6000) : $cfg_arc_click);?>" class="admin-input-sm"></td>
  212. </tr>
  213. <tr>
  214. <td align="center" colspan="4">
  215. <button type="submit" class="btn btn-success btn-sm">保存</button>
  216. <button type="reset" class="btn btn-outline-success btn-sm">重置</button>
  217. </td>
  218. </tr>
  219. </tbody>
  220. </table>
  221. </div>
  222. </form>
  223. </div>
  224. </div>
  225. </div>
  226. <div id="mdlAI" class="modal fade" tabindex="-1" aria-hidden="true">
  227. <div class="modal-dialog modal-xl">
  228. <div class="modal-content">
  229. <div class="modal-header">
  230. <h5 class="modal-title">小德AI助手:发布文档</h5>
  231. <button type="button" class="update-close" data-dismiss="modal" aria-label="Close"><i class="fa fa-times"></i></button>
  232. </div>
  233. <div class="modal-body">
  234. <form>
  235. <div class="form-group">
  236. <textarea id="prompt" class="form-control" style="height:160px" placeholder="请输入生成文档要求,例如:我需要写一篇介绍穆云智能科技公司的文章"></textarea>
  237. </div>
  238. <div class="form-group">
  239. <label for="modelid" class="form-label">选择模型</label>
  240. <select id="modelid" class="form-control">
  241. <?php
  242. $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");
  243. $dsql->Execute();
  244. while ($row = $dsql->GetObject()) {
  245. ?>
  246. <option value="<?php echo $row->id;?>" <?php echo $row->isdefault==1?' selected' : '';?>><?php echo $row->model;?> <?php echo $row->aititle;?></option>
  247. <?php
  248. }
  249. ?>
  250. </select>
  251. </div>
  252. </form>
  253. </div>
  254. <div class="modal-footer">
  255. <button id="btnAIAction" class="btn btn-success btn-sm">确定</button>
  256. </div>
  257. </div>
  258. </div>
  259. </div>
  260. <script>InitPage();</script>
  261. <script>
  262. let eventSource; //保存EventSource实例
  263. let modelid = 0;
  264. function showAI() {
  265. $("#mdlAI").modal('show');
  266. }
  267. $("#btnAIAction").click(async function() {
  268. let prompt = document.getElementById("prompt").value;
  269. let modelid = document.getElementById("modelid").value;
  270. let req = await fetch(`api.php?action=get_ai_server&pname=article_add&modelid=${modelid}&prompt=${prompt}`);
  271. let resp = await req.json();
  272. if (resp.code !== 0) {
  273. ShowMsg("获取服务器地址失败");
  274. return
  275. }
  276. let eventSource = new EventSource(resp.data);
  277. //新增状态跟踪变量
  278. let currentKey = null;
  279. let tagBuffer = "";
  280. let isClosingTag = false;
  281. $("#mdlAI").modal('hide');
  282. $("#btnAI").attr("disabled", "disabled");
  283. prompt = "";
  284. let lastChar = "";
  285. let bodyHtml = "";
  286. let typeid = "";
  287. eventSource.onmessage = (event) => {
  288. const chars = event.data.split('');
  289. chars.forEach(char => {
  290. if (lastChar === '\\' && char === 'r') {
  291. char = '<br>'; //替换为br标签
  292. lastChar = ""; //清空追踪字符
  293. } else {
  294. lastChar = char; //记录当前字符
  295. }
  296. if (char === '\\') {
  297. return; //如果是反斜杠,跳过处理
  298. }
  299. if (currentKey) {
  300. if (char === '{') {
  301. isClosingTag = true;
  302. tagBuffer = '{';
  303. return;
  304. }
  305. if (isClosingTag) {
  306. tagBuffer += char;
  307. if (tagBuffer === `{/${currentKey}}`) {
  308. if (currentKey == "body") {
  309. CKEDITOR.instances["body"].setReadOnly(false);
  310. bodyHtml = "";
  311. } else if (currentKey == "typeid") {
  312. const input = document.querySelector(`[name="${currentKey}"]`);
  313. if (input) {
  314. $(input).val(typeid);
  315. $(input).prop("disabled", false).removeClass("disabled"); //恢复输入状态
  316. }
  317. } else {
  318. const input = document.querySelector(`[name="${currentKey}"]`);
  319. if (input) $(input).prop("disabled", false).removeClass("disabled"); //恢复输入状态
  320. }
  321. currentKey = null;
  322. isClosingTag = false;
  323. tagBuffer = "";
  324. return;
  325. }
  326. if (!`{/${currentKey}}`.startsWith(tagBuffer)) {
  327. if (currentKey == "body") {
  328. bodyHtml += tagBuffer;
  329. CKEDITOR.instances["body"].setData(bodyHtml)
  330. } else if (currentKey == "typeid") {
  331. typeid += tagBuffer;
  332. } else {
  333. const input = document.querySelector(`[name="${currentKey}"]`);
  334. if (input) input.value += tagBuffer;
  335. }
  336. isClosingTag = false;
  337. tagBuffer = "";
  338. }
  339. } else {
  340. if (currentKey == "body") {
  341. //CKEDITOR.instances["body"].insertHtml(char);
  342. bodyHtml += char;
  343. CKEDITOR.instances["body"].setData(bodyHtml)
  344. } else if (currentKey == "typeid") {
  345. typeid += char;
  346. } else {
  347. const input = document.querySelector(`[name="${currentKey}"]`);
  348. if (input) {
  349. input.value += char;
  350. input.scrollTop = input.scrollHeight; //滚动到底部
  351. }
  352. }
  353. }
  354. } else {
  355. if (char === '{') {
  356. tagBuffer = '{';
  357. } else if (tagBuffer.startsWith('{')) {
  358. tagBuffer += char;
  359. if (char === '}') {
  360. const match = tagBuffer.match(/{([^>]+)}/);
  361. if (match) {
  362. currentKey = match[1];
  363. if (currentKey == "body") {
  364. CKEDITOR.instances["body"].setReadOnly(true);
  365. } else {
  366. const input = document.querySelector(`[name="${currentKey}"]`);
  367. if (input) {
  368. $(input).prop("disabled", true).addClass("disabled"); //仅禁用当前输入框
  369. input.value = "";
  370. }
  371. }
  372. }
  373. tagBuffer = "";
  374. }
  375. }
  376. }
  377. });
  378. };
  379. eventSource.onerror = (error) => {
  380. if (error.target.readyState === EventSource.CONNECTING) {
  381. ShowMsg("连接失败,请确保您已开启并正确配置了DedeBIZ小德AI助手。 <a class='text-success' href='https://www.dedebiz.com/ai?from=dedebiz' target='_blank'>如何配置?</a>");
  382. } else if (typeof error.data!=="undefined" && error.data !== "" && error.target.readyState !== EventSource.CLOSED) {
  383. ShowMsg(error.data);
  384. }
  385. $("#btnAI").prop("disabled", false);
  386. eventSource.close();
  387. };
  388. //监听特定事件close
  389. eventSource.addEventListener('close', (event) => {
  390. console.log('SSE connection closed:', event.data);
  391. $("#btnAI").prop("disabled", false);
  392. eventSource.close(); //关闭连接
  393. });
  394. });
  395. </script>
  396. </body>
  397. </html>