|                                                                                                                                                                                                                                                                                                                                 | 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397 | <!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
		<title>发布文档</title>
		<link rel="stylesheet" href="/static/web/css/font-awesome.min.css">
		<link rel="stylesheet" href="/static/web/css/bootstrap.min.css">
		<link rel="stylesheet" href="/static/web/css/admin.css">
		<link rel="stylesheet" href="/static/web/css/daterangepicker.css">
		<link rel="stylesheet" href="/static/web/css/cropper.min.css">
		<script>const cfg_uplitpic_cut = '<?php echo $cfg_uplitpic_cut;?>';</script>
		<script src="/static/web/js/jquery.min.js"></script>
		<script src="/static/web/js/bootstrap.min.js"></script>
		<script src="/static/web/js/webajax.js"></script>
		<script src="/static/web/js/moment.min.js"></script>
		<script src="/static/web/js/daterangepicker.js"></script>
		<script src="/static/web/js/cropper.min.js"></script>
		<script src="/static/web/js/admin.main.js"></script>
	</head>
	<body>
		<div class="container-fluid">
			<ol class="breadcrumb">
				<li class="breadcrumb-item"><a href="index_body.php">后台面板</a></li>
				<li class="breadcrumb-item"><a href="catalog_do.php?cid=<?php echo $cid?>&channelid=<?php echo $channelid?>&dopost=listArchives">文档列表</a></li>
				<li class="breadcrumb-item active">发布文档</li>
			</ol>
			<div class="card shadow-sm">
				<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>
				<div class="card-body">
					<form name="form1" action="article_add.php" method="post" enctype="multipart/form-data">
						<input type="hidden" name="channelid" value="<?php echo $channelid?>">
						<input type="hidden" name="dopost" value="save">
						<div class="table-responsive">
							<table class="table table-borderless">
								<tbody>
									<tr>
										<td width="160">文档标题</td>
										<td width="650"><input type="text" name="title" id="title" value="<?php echo $title;?>" class="admin-input-lg" required></td>
										<td width="160">简略标题</td>
										<td><input type="text" name="shorttitle" id="shorttitle" class="admin-input-sm"></td>
									</tr>
									<tr>
										<td>自定义属性</td>
										<td colspan="3">
											<?php
											$dsql->SetQuery("SELECT * FROM `#@__arcatt` ORDER BY sortid ASC");
											$dsql->Execute();
											while($trow = $dsql->GetObject())
											{
												if ($trow->att=='j')
													echo "<label><input type='checkbox' name='flags[]' id='flags{$trow->att}' value='{$trow->att}' onclick='ShowUrlTr()'> {$trow->attname}[{$trow->att}]</label> ";
												else
													echo "<label><input type='checkbox' name='flags[]' id='flags{$trow->att}' value='{$trow->att}'> {$trow->attname}[{$trow->att}]</label> ";
											}
											?>
										</td>
									</tr>
									<tr id="redirecturltr" style="display:none">
										<td>跳转网址</td>
										<td colspan="3"><input type="text" name="redirecturl" id="redirecturl" class="admin-input-lg"></td>
									</tr>
									<tr>
										<td>标签</td>
										<td><input type="text" name="tags" id="tags" onChange="$Obj('keywords').value=this.value;" class="admin-input-lg">(英文逗号隔开,如:DedeBIZ,得德)</td>
										<td>权重</td>
										<td><input type="text" name="weight" id="weight" value="<?php echo $maxWright['cc'];?>" class="admin-input-sm">(越小越靠前)</td>
									</tr>
									<tr id="pictable">
										<td>缩略图</td>
										<td colspan="3">
											<input type="text" name="picname" id="picname" class="admin-input-lg">
											<label><input type="checkbox" name="ddisremote" value="1" id="ddisremote"> 远程图片</label>
											<span class="btn btn-success btn-sm opt-button">上传<input type="file" name="files[]" id="iptAddImages"></span>
											<button type="button" onclick="SelectImage('form1.picname','');" class="btn btn-success btn-sm">选择</button>
											<button type="button" id="btnClearAll" class="btn btn-success btn-sm">清空</button>
											<img src="/static/web/img/thumbnail.jpg" id="litPic" class="thumbnail-md ml-3">
										</td>
									</tr>
									<tr>
										<td>来源</td>
										<td>
											<input type="text" name="source" id="source" value="<?php echo $source;?>" class="admin-input-sm">
											<button type="button" name="selsource" id="selsource" class="btn btn-success btn-sm">选择</button>
										</td>
										<td>编辑</td>
										<td>
											<input type="text" name="writer" id="writer" value="<?php echo $writer;?>" class="admin-input-sm">
											<button type="button" name="selwriter" id="selwriter" class="btn btn-success btn-sm">选择</button>
										</td>
									</tr>
									<tr>
										<td>发布栏目</td>
										<td>
											<span id="typeidct">
												<?php
												$typeOptions = GetOptionList($cid,$cuserLogin->getUserChannel(),$channelid);
												echo "<select name='typeid' id='typeid' class='admin-input-sm'>";
												echo "<option value='0'>请选择文档栏目</option>";
												echo $typeOptions;
												echo "</select>";
												?>
											</span>
											<a href="javascript:ShowCatMap(event,this,<?php echo $channelid;?>,'typeid');" class="btn btn-success btn-sm">选择</a>
											<?php if ($cfg_need_typeid2=='Y') {echo "<a href='javascript:AddTypeid2();' class='btn btn-success btn-sm'>副栏目</a>";}?>
										</td>
										<td>金币</td>
										<td><input type="text" name="money" id="money" value="0" class="admin-input-sm"></td>
									</tr>
									<tr id="typeid2tr" style="display:none">
										<td>副栏目</td>
										<td colspan="3">
											<span id="typeid2ct"></span>
											<input type="text" name="typeid2" id="typeid2" class="admin-input-sm">
											<a href="javascript:ShowCatMap(event,this,<?php echo $channelid;?>,'typeid2');" class="btn btn-success btn-sm">选择</a>
										</td>
									</tr>
									<tr>
										<td>关键词</td>
										<td colspan="3">
											<input type="text" name="keywords" id="keywords" value="<?php echo $keywords;?>" class="admin-input-lg">
											<label><input type="checkbox" name="autokey" onclick="ShowHide('keywords');" id="autokey" value="1" <?php if ($cfg_arc_autokeyword=='Y') echo 'checked';?>> 自动获取</label>
											<button type="button" onclick="SelectKeywords('form1.keywords');" class="btn btn-success btn-sm">选择</button>
										</td>
									</tr>
									<tr>
										<td>描述</td>
										<td colspan="3"><textarea name="description" id="description" class="admin-textarea-sm"><?php echo $description;?></textarea></td>
									</tr>
									<tr>
										<td>附加选项</td>
										<td colspan="3">
											<label><input type="checkbox" name="remote" id="remote" value="1" <?php if ($cfg_rm_remote=='Y') echo 'checked';?>> 下载远程图片和资源</label>
											<label><input type="checkbox" name="dellink" id="dellink" value="1" <?php if ($cfg_arc_dellink=='Y') echo 'checked';?>> 删除非站内链接</label>
											<a href="javascript:OpenMyWin('article_allowurl_edit.php');">[配置]</a>
											<label><input type="checkbox" name="autolitpic" id="autolitpic" value="1" <?php if ($cfg_arc_autopic=='Y') echo 'checked';?>> 提取第一个图片为缩略图</label>
										</td>
									</tr>
									<tr>
										<td>分页方式</td>
										<td colspan="3">
											<label><input type="radio" name="sptype" value="hand" <?php if ($cfg_arcautosp=='N') echo 'checked'?>> 手动</label>
											<label><input type="radio" name="sptype" value="auto" <?php if ($cfg_arcautosp=='Y') echo 'checked'?>> 自动</label>
											<label>大小:<input name="spsize" type="text" id="spsize" value="<?php echo $cfg_arcautosp_size?>" class="admin-input-sm"> K(分页符为:#p#分页标题#e#)</label>
										</td>
									</tr>
									<?php PrintAutoFieldsAdd($cInfos['fieldset'],'autofield'); ?>
									<tr>
										<td colspan="4"><?php GetEditor('body',$body,350);?></td>
									</tr>
									<tr>
										<td>评论选项</td>
										<td>
											<label><input type="radio" name="notpost" value="0" <?php if ($cfg_feedback_forbid=='N') echo 'checked';?>> 允许评论</label>
											<label><input type="radio" name="notpost" value="1" <?php if ($cfg_feedback_forbid=='Y') echo 'checked';?>> 禁止评论</label>
										</td>
										<td>发布选项</td>
										<td>
											<label><input type="radio" name="ishtml" value="1" checked> 静态浏览</label>
											<label><input type="radio" name="ishtml" value="0"> 动态浏览</label>
										</td>
									</tr>
									<tr>
										<td>文档排序</td>
										<td>
											<select name="sortup" id="sortup" class="admin-input-sm">
												<option value="0" selected>默认排序</option>
												<option value="7">置顶一周</option>
												<option value="30">置顶一个月</option>
												<option value="90">置顶三个月</option>
												<option value="180">置顶半年</option>
												<option value="360">置顶一年</option>
											</select>
										</td>
										<td>标题颜色</td>
										<td>
											<input type="text" name="color" id="color" class="admin-input-sm">
											<button type="button" name="modcolor" id="modcolor" class="btn btn-success btn-sm" onclick="ShowColor(event, this)">选择</button>
										</td>
									</tr>
									<tr>
										<td>浏览权限</td>
										<td>
											<select name="arcrank" id="arcrank" class="admin-input-sm">
												<?php
												$urank = $cuserLogin->getUserRank();
												$dsql->SetQuery("SELECT * FROM `#@__arcrank` where adminrank<='$urank' ORDER BY `rank` ASC");
												$dsql->Execute();
												while($row = $dsql->GetObject())
												{
													$selected = $row->rank == 0 ? ' selected' : '';
													echo "<option value='".$row->rank."'{$selected}>".$row->membername."</option>";
												}
												?>
											</select>
											<span>(暂不支持静态)</span>
										</td>
										<td>文件名称</td>
										<td><input type="text" name="filename" id="filename" class="admin-input-sm">(不包括文件扩展名)</td>
										<td><?php echo "<input type='hidden' name='templet'>";?></td>
									</tr>
									<tr>
										<td>发布时间</td>
										<td>
											<?php
											$nowtime = GetDateTimeMk(time());
											echo "<input type='text' name='pubdate' value='$nowtime' id='pubdate' class='datepicker admin-input-sm'>";
											?>
										</td>
										<td>浏览次数</td>
										<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>
									</tr>
									<tr>
										<td align="center" colspan="4">
											<button type="submit" class="btn btn-success btn-sm">保存</button>
											<button type="reset" class="btn btn-outline-success btn-sm">重置</button>
										</td>
									</tr>
								</tbody>
							</table>
						</div>
					</form>
				</div>
			</div>
		</div>
		<div id="mdlAI" class="modal fade" tabindex="-1" aria-hidden="true">
			<div class="modal-dialog modal-xl">
				<div class="modal-content">
					<div class="modal-header">
						<h5 class="modal-title">小德AI助手:发布文档</h5>
						<button type="button" class="update-close" data-dismiss="modal" aria-label="Close"><i class="fa fa-times"></i></button>
					</div>
					<div class="modal-body">
						<form>
							<div class="form-group">
								<textarea id="prompt" class="form-control" style="height:160px" placeholder="请输入生成文档要求,例如:我需要写一篇介绍穆云智能科技公司的文章"></textarea>
							</div>
							<div class="form-group">
								<label for="modelid" class="form-label">选择模型</label>
								<select id="modelid" class="form-control">
									<?php
									$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");
									$dsql->Execute();
									while ($row = $dsql->GetObject()) {
									?>
										<option value="<?php echo $row->id;?>" <?php echo $row->isdefault==1?' selected' : '';?>><?php echo $row->model;?> <?php echo $row->aititle;?></option>
									<?php
									}
									?>
								</select>
							</div>
						</form>
					</div>
					<div class="modal-footer">
						<button id="btnAIAction" class="btn btn-success btn-sm">确定</button>
					</div>
				</div>
			</div>
		</div>
		<script>InitPage();</script>
		<script>
			let eventSource; //保存EventSource实例
			let modelid = 0;
			function showAI() {
				$("#mdlAI").modal('show');
			}
			$("#btnAIAction").click(async function() {
				let prompt = document.getElementById("prompt").value;
				let modelid = document.getElementById("modelid").value;
				let req = await fetch(`api.php?action=get_ai_server&pname=article_add&modelid=${modelid}&prompt=${prompt}`);
				let resp = await req.json();
				if (resp.code !== 0) {
					ShowMsg("获取服务器地址失败");
					return
				}
				let eventSource = new EventSource(resp.data);
				//新增状态跟踪变量
				let currentKey = null;
				let tagBuffer = "";
				let isClosingTag = false;
				$("#mdlAI").modal('hide');
				$("#btnAI").attr("disabled", "disabled");
				prompt = "";
				let lastChar = "";
				let bodyHtml = "";
				let typeid = "";
				eventSource.onmessage = (event) => {
					const chars = event.data.split('');
					chars.forEach(char => {
						if (lastChar === '\\' && char === 'r') {
							char = '<br>';  //替换为br标签
							lastChar = "";  //清空追踪字符
						} else {
							lastChar = char;  //记录当前字符
						}
						if (char === '\\') {
							return; //如果是反斜杠,跳过处理
						}
						if (currentKey) {
							if (char === '{') {
								isClosingTag = true;
								tagBuffer = '{';
								return;
							}
							if (isClosingTag) {
								tagBuffer += char;
								if (tagBuffer === `{/${currentKey}}`) {
									if (currentKey == "body") {
										CKEDITOR.instances["body"].setReadOnly(false);
										bodyHtml = "";
									} else if (currentKey == "typeid") {
										const input = document.querySelector(`[name="${currentKey}"]`);
										if (input) {
											$(input).val(typeid);
											$(input).prop("disabled", false).removeClass("disabled"); //恢复输入状态
										}
									} else {
										const input = document.querySelector(`[name="${currentKey}"]`);
										if (input) $(input).prop("disabled", false).removeClass("disabled"); //恢复输入状态
									}
									currentKey = null;
									isClosingTag = false;
									tagBuffer = "";
									return;
								}
								if (!`{/${currentKey}}`.startsWith(tagBuffer)) {
									if (currentKey == "body") {
										bodyHtml += tagBuffer;
										CKEDITOR.instances["body"].setData(bodyHtml)
									} else if (currentKey == "typeid") {
										typeid += tagBuffer;
									} else {
										const input = document.querySelector(`[name="${currentKey}"]`);
										if (input) input.value += tagBuffer;
									}
									isClosingTag = false;
									tagBuffer = "";
								}
							} else {
								if (currentKey == "body") {
									//CKEDITOR.instances["body"].insertHtml(char);
									bodyHtml += char;
									CKEDITOR.instances["body"].setData(bodyHtml)
								} else if (currentKey == "typeid") {
									typeid += char;
								} else {
									const input = document.querySelector(`[name="${currentKey}"]`);
									if (input) {
										input.value += char;
										input.scrollTop = input.scrollHeight; //滚动到底部
									}
								}
							}
						} else {
							if (char === '{') {
								tagBuffer = '{';
							} else if (tagBuffer.startsWith('{')) {
								tagBuffer += char;
								if (char === '}') {
									const match = tagBuffer.match(/{([^>]+)}/);
									if (match) {
										currentKey = match[1];
										if (currentKey == "body") {
											CKEDITOR.instances["body"].setReadOnly(true);
										} else {
											const input = document.querySelector(`[name="${currentKey}"]`);
											if (input) {
												$(input).prop("disabled", true).addClass("disabled"); //仅禁用当前输入框
												input.value = "";
											}
										}
									}
									tagBuffer = "";
								}
							}
						}
					});
				};
				eventSource.onerror = (error) => {
					if (error.target.readyState === EventSource.CONNECTING) {
						ShowMsg("连接失败,请确保您已开启并正确配置了DedeBIZ小德AI助手。 <a class='text-success' href='https://www.dedebiz.com/ai?from=dedebiz' target='_blank'>如何配置?</a>");
					} else if (typeof error.data!=="undefined" && error.data !== "" && error.target.readyState !== EventSource.CLOSED) {
						ShowMsg(error.data);
					}
					$("#btnAI").prop("disabled", false);
					eventSource.close();
				};
				//监听特定事件close
				eventSource.addEventListener('close', (event) => {
					console.log('SSE connection closed:', event.data);
					$("#btnAI").prop("disabled", false);
					eventSource.close(); //关闭连接
				});
			});
		</script>
	</body>
</html>
 |