chore: 重写初始提交(清空历史,整理后全量提交)
This commit is contained in:
@@ -0,0 +1,163 @@
|
||||
|
||||
<style>
|
||||
.doc-editor-wrap { border: 1px solid #e6e6e6; }
|
||||
.doc-form-side { background: #f8f9fb; padding: 15px; border: 1px solid #eee; border-radius: 4px; }
|
||||
.doc-form-side .layui-form-label { width: 82px; padding: 9px 6px; }
|
||||
.doc-form-side .layui-input-block { margin-left: 96px; }
|
||||
</style>
|
||||
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">
|
||||
<span>新增文档 —— {$project.title} / {$version.title}</span>
|
||||
<a class="layui-btn layui-btn-sm layui-btn-primary" style="float:right;"
|
||||
href="/docs/backend/doc?project_id={$project.id}&version_id={$version.id}">返回列表</a>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<form class="layui-form" id="docForm">
|
||||
<input type="hidden" name="project_id" value="{$project.id}">
|
||||
<input type="hidden" name="version_id" value="{$version.id}">
|
||||
<input type="hidden" name="editor_type" value="1">
|
||||
|
||||
<div class="layui-row layui-col-space15">
|
||||
<div class="layui-col-md9">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block" style="margin-left:0;">
|
||||
<input type="text" name="title" required lay-verify="required" placeholder="请输入文档标题"
|
||||
autocomplete="off" class="layui-input" style="height:42px;font-size:16px;">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item" id="editorBox">
|
||||
<div class="doc-editor-wrap">
|
||||
<script id="docContent" name="content" type="text/plain"></script>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-col-md3">
|
||||
<div class="doc-form-side">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">父级</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="pid">
|
||||
<option value="0">顶级文档</option>
|
||||
{volist name="parentOptions" id="opt"}
|
||||
<option value="{$opt.id}" {if condition="$item.pid eq $opt.id"}selected{/if}>{$opt.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">标识</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="name" placeholder="留空自动生成" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">排序</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="sort" value="0" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">纯目录</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" name="is_dir" value="1" lay-skin="switch" lay-text="是|否" lay-filter="isDirSwitch">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">显示</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" name="status" value="1" checked lay-skin="switch" lay-text="显示|隐藏">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">SEO标题</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="seo_title" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">关键词</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="seo_keywords" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">描述</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="seo_desc" class="layui-textarea" style="min-height:70px;"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item" style="margin-bottom:0;">
|
||||
<button class="layui-btn layui-btn-fluid" lay-submit lay-filter="docSubmit">保存文档</button>
|
||||
</div>
|
||||
<div class="docs-tip" style="margin-top:8px;">
|
||||
开启「纯目录」后该节点仅用于分组,不保存正文
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/assets/library/ueditor/ueditor.config.js"></script>
|
||||
<script src="/assets/library/ueditor/ueditor.all.js"></script>
|
||||
<script>
|
||||
var docEditor = UE.getEditor('docContent', {
|
||||
serverUrl: '/docs/backend/ueditor',
|
||||
initialFrameHeight: 520,
|
||||
autoHeightEnabled: false,
|
||||
elementPathEnabled: false,
|
||||
catchRemoteImageEnable: true,
|
||||
// 文档站需要保留代码块结构,关闭 div 转 p
|
||||
allowDivTransToP: false,
|
||||
toolbars: [[
|
||||
'undo', 'redo', '|', 'bold', 'italic', 'underline', 'strikethrough', 'removeformat', '|',
|
||||
'paragraph', 'fontsize', '|', 'forecolor', 'backcolor', '|',
|
||||
'insertorderedlist', 'insertunorderedlist', 'blockquote', '|',
|
||||
'justifyleft', 'justifycenter', 'justifyright', '|',
|
||||
'link', 'unlink', 'anchor', '|',
|
||||
'simpleupload', 'insertimage', 'attachment', 'insertvideo', '|',
|
||||
'inserttable', 'deletetable', 'insertrow', 'deleterow', 'insertcol', 'deletecol', 'mergecells', '|',
|
||||
'horizontal', 'insertcode', 'pasteplain', '|',
|
||||
'searchreplace', 'preview', 'fullscreen', 'source'
|
||||
]]
|
||||
});
|
||||
|
||||
layui.use(['form', 'layer', 'jquery'], function () {
|
||||
var form = layui.form;
|
||||
var layer = layui.layer;
|
||||
var $ = layui.$;
|
||||
|
||||
// 纯目录节点不需要正文编辑器
|
||||
form.on('switch(isDirSwitch)', function (data) {
|
||||
$('#editorBox').toggle(!data.elem.checked);
|
||||
});
|
||||
|
||||
form.on('submit(docSubmit)', function (data) {
|
||||
var post = $.extend({}, data.field);
|
||||
post.status = data.field.status ? 1 : 0;
|
||||
post.is_dir = data.field.is_dir ? 1 : 0;
|
||||
post.content = post.is_dir === 1 ? '' : docEditor.getContent();
|
||||
|
||||
var loading = layer.load(1);
|
||||
$.post('/docs/backend/doc/save', post, function (res) {
|
||||
layer.close(loading);
|
||||
if (res.code === 0) {
|
||||
layer.msg(res.message, { icon: 1 }, function () {
|
||||
location.href = '/docs/backend/doc/edit/' + res.data.id;
|
||||
});
|
||||
} else {
|
||||
layer.msg(res.message || '保存失败', { icon: 2 });
|
||||
}
|
||||
}, 'json').fail(function () {
|
||||
layer.close(loading);
|
||||
layer.msg('请求失败,请重试', { icon: 2 });
|
||||
});
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,162 @@
|
||||
|
||||
<style>
|
||||
.doc-editor-wrap { border: 1px solid #e6e6e6; }
|
||||
.doc-form-side { background: #f8f9fb; padding: 15px; border: 1px solid #eee; border-radius: 4px; }
|
||||
.doc-form-side .layui-form-label { width: 82px; padding: 9px 6px; }
|
||||
.doc-form-side .layui-input-block { margin-left: 96px; }
|
||||
</style>
|
||||
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">
|
||||
<span>编辑文档:{$item.title}</span>
|
||||
<div class="layui-inline" style="float:right;">
|
||||
{if condition="$project && $item['is_dir'] neq 1"}
|
||||
<a class="layui-btn layui-btn-sm layui-btn-primary" href="/docs/{$project.name}/{$item.name}" target="_blank">预览</a>
|
||||
{/if}
|
||||
<a class="layui-btn layui-btn-sm layui-btn-primary"
|
||||
href="/docs/backend/doc?project_id={$item.project_id}&version_id={$item.version_id}">返回列表</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<form class="layui-form" id="docForm">
|
||||
<input type="hidden" name="project_id" value="{$item.project_id}">
|
||||
<input type="hidden" name="version_id" value="{$item.version_id}">
|
||||
<input type="hidden" name="editor_type" value="{$item.editor_type}">
|
||||
|
||||
<div class="layui-row layui-col-space15">
|
||||
<div class="layui-col-md9">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block" style="margin-left:0;">
|
||||
<input type="text" name="title" value="{$item.title}" required lay-verify="required"
|
||||
autocomplete="off" class="layui-input" style="height:42px;font-size:16px;">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item" id="editorBox" {if condition="$item.is_dir eq 1"}style="display:none;"{/if}>
|
||||
<div class="doc-editor-wrap">
|
||||
<script id="docContent" name="content" type="text/plain">{$item.content|raw}</script>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-col-md3">
|
||||
<div class="doc-form-side">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">父级</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="pid">
|
||||
<option value="0">顶级文档</option>
|
||||
{volist name="parentOptions" id="opt"}
|
||||
<option value="{$opt.id}" {if condition="$item.pid eq $opt.id"}selected{/if}>{$opt.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">标识</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="name" value="{$item.name}" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">排序</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="sort" value="{$item.sort}" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">纯目录</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" name="is_dir" value="1" {if condition="$item.is_dir eq 1"}checked{/if}
|
||||
lay-skin="switch" lay-text="是|否" lay-filter="isDirSwitch">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">显示</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" name="status" value="1" {if condition="$item.status eq 1"}checked{/if}
|
||||
lay-skin="switch" lay-text="显示|隐藏">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">SEO标题</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="seo_title" value="{$item.seo_title}" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">关键词</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="seo_keywords" value="{$item.seo_keywords}" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">描述</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="seo_desc" class="layui-textarea" style="min-height:70px;">{$item.seo_desc}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item" style="margin-bottom:0;">
|
||||
<button class="layui-btn layui-btn-fluid" lay-submit lay-filter="docSubmit">保存文档</button>
|
||||
</div>
|
||||
<div class="docs-tip" style="margin-top:8px;">
|
||||
阅读量 {$item.views} 次
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/assets/library/ueditor/ueditor.config.js"></script>
|
||||
<script src="/assets/library/ueditor/ueditor.all.js"></script>
|
||||
<script>
|
||||
var docEditor = UE.getEditor('docContent', {
|
||||
serverUrl: '/docs/backend/ueditor',
|
||||
initialFrameHeight: 520,
|
||||
autoHeightEnabled: false,
|
||||
elementPathEnabled: false,
|
||||
catchRemoteImageEnable: true,
|
||||
allowDivTransToP: false,
|
||||
toolbars: [[
|
||||
'undo', 'redo', '|', 'bold', 'italic', 'underline', 'strikethrough', 'removeformat', '|',
|
||||
'paragraph', 'fontsize', '|', 'forecolor', 'backcolor', '|',
|
||||
'insertorderedlist', 'insertunorderedlist', 'blockquote', '|',
|
||||
'justifyleft', 'justifycenter', 'justifyright', '|',
|
||||
'link', 'unlink', 'anchor', '|',
|
||||
'simpleupload', 'insertimage', 'attachment', 'insertvideo', '|',
|
||||
'inserttable', 'deletetable', 'insertrow', 'deleterow', 'insertcol', 'deletecol', 'mergecells', '|',
|
||||
'horizontal', 'insertcode', 'pasteplain', '|',
|
||||
'searchreplace', 'preview', 'fullscreen', 'source'
|
||||
]]
|
||||
});
|
||||
|
||||
layui.use(['form', 'layer', 'jquery'], function () {
|
||||
var form = layui.form;
|
||||
var layer = layui.layer;
|
||||
var $ = layui.$;
|
||||
|
||||
form.on('switch(isDirSwitch)', function (data) {
|
||||
$('#editorBox').toggle(!data.elem.checked);
|
||||
});
|
||||
|
||||
form.on('submit(docSubmit)', function (data) {
|
||||
var post = $.extend({}, data.field);
|
||||
post.status = data.field.status ? 1 : 0;
|
||||
post.is_dir = data.field.is_dir ? 1 : 0;
|
||||
post.content = post.is_dir === 1 ? '' : docEditor.getContent();
|
||||
|
||||
var loading = layer.load(1);
|
||||
$.post('/docs/backend/doc/update/{$item.id}', post, function (res) {
|
||||
layer.close(loading);
|
||||
layer.msg(res.message || (res.code === 0 ? '保存成功' : '保存失败'), { icon: res.code === 0 ? 1 : 2 });
|
||||
}, 'json').fail(function () {
|
||||
layer.close(loading);
|
||||
layer.msg('请求失败,请重试', { icon: 2 });
|
||||
});
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,207 @@
|
||||
|
||||
<style>
|
||||
.import-drop { border: 2px dashed #d2d6de; border-radius: 6px; padding: 40px 20px; text-align: center; background: #fafbfc; cursor: pointer; }
|
||||
.import-drop:hover { border-color: #1e9fff; background: #f4f9ff; }
|
||||
.import-drop .layui-icon { font-size: 44px; color: #c2c6cc; display: block; margin-bottom: 10px; }
|
||||
.import-file { margin-top: 12px; color: #1e9fff; }
|
||||
.import-help { background: #f8f9fb; border: 1px solid #eee; border-radius: 4px; padding: 15px; }
|
||||
.import-help h3 { font-size: 14px; margin-bottom: 8px; }
|
||||
.import-help ul { padding-left: 18px; color: #666; line-height: 2; font-size: 13px; }
|
||||
</style>
|
||||
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">
|
||||
<span>导入文档</span>
|
||||
{if condition="$project"}
|
||||
<a class="layui-btn layui-btn-sm layui-btn-primary" style="float:right;"
|
||||
href="/docs/backend/doc?project_id={$project.id}&version_id={$version.id}">返回列表</a>
|
||||
{/if}
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
{if condition="empty($projects)"}
|
||||
<div class="docs-empty">
|
||||
还没有文档项目,请先 <a href="/docs/backend/project/add" class="layui-btn layui-btn-sm">创建项目</a>
|
||||
</div>
|
||||
{else/}
|
||||
<div class="layui-row layui-col-space15">
|
||||
<div class="layui-col-md8">
|
||||
<form class="layui-form" id="importForm">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">目标项目</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="project_id" lay-filter="projectPick">
|
||||
{volist name="projects" id="p"}
|
||||
<option value="{$p.id}" {if condition="$project && $project.id eq $p.id"}selected{/if}>{$p.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">目标版本</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="version_id">
|
||||
{volist name="versions" id="v"}
|
||||
<option value="{$v.id}" {if condition="$version && $version.id eq $v.id"}selected{/if}>{$v.title}({$v.name})</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">父级文档</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="pid">
|
||||
<option value="0">顶级文档</option>
|
||||
{volist name="parentOptions" id="opt"}
|
||||
<option value="{$opt.id}">{$opt.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">文档标题</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="title" placeholder="留空则自动从文件内容提取" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">文档标识</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="name" placeholder="留空自动生成,重名会自动加后缀" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">排序</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="sort" value="0" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">选择文件</label>
|
||||
<div class="layui-input-block">
|
||||
<div class="import-drop" id="dropZone">
|
||||
<i class="layui-icon layui-icon-upload-drag"></i>
|
||||
<div>点击选择文件,或将文件拖拽到此处</div>
|
||||
<div class="docs-tip" style="margin-top:6px;">支持 docx / md / html / txt,单个文件不超过 20MB</div>
|
||||
<div class="import-file" id="fileName"></div>
|
||||
</div>
|
||||
<input type="file" id="fileInput" accept=".docx,.md,.markdown,.html,.htm,.txt" style="display:none;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button type="button" class="layui-btn" id="btnImport">开始导入</button>
|
||||
{if condition="$project"}
|
||||
<a class="layui-btn layui-btn-primary" href="/docs/backend/doc?project_id={$project.id}">取消</a>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="layui-col-md4">
|
||||
<div class="import-help">
|
||||
<h3>导入说明</h3>
|
||||
<ul>
|
||||
<li><b>Word(.docx)</b>:自动识别标题层级与段落
|
||||
{if condition="$hasPhpWord"}
|
||||
<span class="layui-badge layui-bg-green">已装 PhpWord,解析更完整</span>
|
||||
{else/}
|
||||
<span class="layui-badge layui-bg-orange">当前使用内置解析</span>
|
||||
{/if}
|
||||
</li>
|
||||
<li><b>Markdown(.md)</b>:支持标题、代码块、列表、表格、引用、链接与图片</li>
|
||||
<li><b>HTML</b>:自动提取 body 内容并清洗脚本</li>
|
||||
<li><b>纯文本</b>:按行转换为段落</li>
|
||||
</ul>
|
||||
|
||||
<h3 style="margin-top:14px;">提升 Word 解析效果</h3>
|
||||
<ul>
|
||||
<li>执行 <code>composer require phpoffice/phpword</code> 后可完整还原表格与样式</li>
|
||||
<li>Word 中的图片建议先上传到编辑器,或导入后在编辑页粘贴</li>
|
||||
</ul>
|
||||
|
||||
<h3 style="margin-top:14px;">另一种方式</h3>
|
||||
<ul>
|
||||
<li>直接在编辑器中从 Word 复制粘贴,外链图片会自动抓取并保存到本地</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
layui.use(['form', 'layer', 'jquery'], function () {
|
||||
var form = layui.form;
|
||||
var layer = layui.layer;
|
||||
var $ = layui.$;
|
||||
|
||||
// 切换项目需要重载版本与父级下拉
|
||||
form.on('select(projectPick)', function (data) {
|
||||
location.href = '/docs/backend/doc/import?project_id=' + data.value;
|
||||
});
|
||||
|
||||
var $input = $('#fileInput');
|
||||
var $zone = $('#dropZone');
|
||||
|
||||
$zone.on('click', function () { $input.trigger('click'); });
|
||||
|
||||
$input.on('change', function () {
|
||||
var file = this.files && this.files[0];
|
||||
$('#fileName').text(file ? '已选择:' + file.name : '');
|
||||
});
|
||||
|
||||
// 拖拽上传
|
||||
$zone.on('dragover', function (e) { e.preventDefault(); e.stopPropagation(); });
|
||||
$zone.on('drop', function (e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
var files = e.originalEvent.dataTransfer.files;
|
||||
if (files && files.length) {
|
||||
$input[0].files = files;
|
||||
$('#fileName').text('已选择:' + files[0].name);
|
||||
}
|
||||
});
|
||||
|
||||
$('#btnImport').on('click', function () {
|
||||
var file = $input[0].files && $input[0].files[0];
|
||||
if (!file) {
|
||||
layer.msg('请先选择要导入的文件', { icon: 0 });
|
||||
return;
|
||||
}
|
||||
|
||||
var fd = new FormData();
|
||||
fd.append('file', file);
|
||||
$('#importForm').find('select, input[type=text], input[type=number]').each(function () {
|
||||
fd.append(this.name, this.value);
|
||||
});
|
||||
|
||||
var loading = layer.load(1);
|
||||
$.ajax({
|
||||
url: '/docs/backend/doc/import',
|
||||
type: 'POST',
|
||||
data: fd,
|
||||
processData: false,
|
||||
contentType: false,
|
||||
dataType: 'json',
|
||||
success: function (res) {
|
||||
layer.close(loading);
|
||||
if (res.code === 0) {
|
||||
layer.msg(res.message, { icon: 1 }, function () {
|
||||
location.href = '/docs/backend/doc/edit/' + res.data.id;
|
||||
});
|
||||
} else {
|
||||
layer.msg(res.message || '导入失败', { icon: 2 });
|
||||
}
|
||||
},
|
||||
error: function () {
|
||||
layer.close(loading);
|
||||
layer.msg('请求失败,请检查文件大小与服务器配置', { icon: 2 });
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,207 @@
|
||||
|
||||
<style>
|
||||
.doc-tree { list-style: none; margin: 0; padding: 0; }
|
||||
.doc-tree ul { list-style: none; margin: 0; padding-left: 22px; }
|
||||
.doc-tree li { line-height: 34px; }
|
||||
.doc-node { display: flex; align-items: center; padding: 0 8px; border-radius: 3px; }
|
||||
.doc-node:hover { background: #f2f5fa; }
|
||||
.doc-node .doc-name { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
||||
.doc-node .doc-name i { margin-right: 6px; color: #999; }
|
||||
.doc-node .doc-ops { flex-shrink: 0; visibility: hidden; }
|
||||
.doc-node:hover .doc-ops { visibility: visible; }
|
||||
.doc-node .layui-btn-xs { margin-left: 4px; }
|
||||
.doc-badge { margin-left: 6px; }
|
||||
.doc-sortbox { width: 54px; height: 26px; line-height: 26px; padding: 0 4px; margin-right: 8px; border: 1px solid #e6e6e6; border-radius: 3px; text-align: center; }
|
||||
</style>
|
||||
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">
|
||||
<span>文档管理</span>
|
||||
<div class="layui-inline" style="float:right;">
|
||||
{if condition="$project"}
|
||||
<a class="layui-btn layui-btn-sm" href="/docs/backend/doc/add?project_id={$project.id}&version_id={$version.id}">新增文档</a>
|
||||
<a class="layui-btn layui-btn-sm layui-btn-normal" href="/docs/backend/doc/import?project_id={$project.id}&version_id={$version.id}">导入文档</a>
|
||||
<button class="layui-btn layui-btn-sm layui-btn-primary" id="btnSaveSort">保存排序</button>
|
||||
<button class="layui-btn layui-btn-sm layui-btn-primary" id="btnRebuild">重建索引</button>
|
||||
<a class="layui-btn layui-btn-sm layui-btn-primary" href="/docs/{$project.name}" target="_blank">预览</a>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
{if condition="empty($projects)"}
|
||||
<div class="docs-empty">
|
||||
还没有文档项目,请先 <a href="/docs/backend/project/add" class="layui-btn layui-btn-sm">创建项目</a>
|
||||
</div>
|
||||
{else/}
|
||||
<form class="layui-form docs-scope-bar">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label" style="width:70px;">项目</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name="project_id" lay-filter="projectPick">
|
||||
{volist name="projects" id="p"}
|
||||
<option value="{$p.id}" {if condition="$project && $project.id eq $p.id"}selected{/if}>{$p.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label" style="width:70px;">版本</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name="version_id" lay-filter="versionPick">
|
||||
{volist name="versions" id="v"}
|
||||
<option value="{$v.id}" {if condition="$version && $version.id eq $v.id"}selected{/if}>{$v.title}({$v.name})</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<span class="docs-tip">修改左侧排序框数值后点击「保存排序」生效;序号越小越靠前</span>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
{if condition="empty($tree)"}
|
||||
<div class="docs-empty">
|
||||
当前版本下还没有文档,点击右上角「新增文档」或「导入文档」开始创建
|
||||
</div>
|
||||
{else/}
|
||||
<ul class="doc-tree" id="docTree">
|
||||
{php}
|
||||
/**
|
||||
* 递归渲染文档目录树
|
||||
* 模板引擎不支持递归 include,这里用函数递归输出
|
||||
*/
|
||||
if (!function_exists('docs_render_tree')) {
|
||||
function docs_render_tree(array $nodes)
|
||||
{
|
||||
foreach ($nodes as $node) {
|
||||
$id = (int) $node['id'];
|
||||
$pid = (int) $node['pid'];
|
||||
$sort = (int) $node['sort'];
|
||||
$isDir = (int) $node['is_dir'] === 1;
|
||||
$title = htmlspecialchars((string) $node['title'], ENT_QUOTES, 'UTF-8');
|
||||
$name = htmlspecialchars((string) $node['name'], ENT_QUOTES, 'UTF-8');
|
||||
|
||||
echo '<li>';
|
||||
echo '<div class="doc-node" data-id="' . $id . '" data-pid="' . $pid . '">';
|
||||
echo '<input type="number" class="doc-sortbox" value="' . $sort . '" title="排序值">';
|
||||
echo '<span class="doc-name">';
|
||||
echo '<i class="layui-icon ' . ($isDir ? 'layui-icon-folder' : 'layui-icon-file') . '"></i>';
|
||||
echo $title . ' <code style="color:#bbb;font-size:12px;">' . $name . '</code>';
|
||||
if ($isDir) {
|
||||
echo '<span class="layui-badge layui-bg-gray doc-badge">目录</span>';
|
||||
}
|
||||
if ((int) $node['status'] !== 1) {
|
||||
echo '<span class="layui-badge layui-bg-orange doc-badge">隐藏</span>';
|
||||
}
|
||||
echo '</span>';
|
||||
echo '<span class="doc-ops">';
|
||||
echo '<a class="layui-btn layui-btn-xs" href="/docs/backend/doc/edit/' . $id . '">编辑</a>';
|
||||
echo '<a class="layui-btn layui-btn-xs layui-btn-normal" href="/docs/backend/doc/add?project_id='
|
||||
. (int) $node['project_id'] . '&version_id=' . (int) $node['version_id']
|
||||
. '&pid=' . $id . '">加子级</a>';
|
||||
echo '<a class="layui-btn layui-btn-xs layui-btn-danger doc-del" href="javascript:;" data-id="'
|
||||
. $id . '" data-title="' . $title . '">删除</a>';
|
||||
echo '</span>';
|
||||
echo '</div>';
|
||||
|
||||
if (!empty($node['children'])) {
|
||||
echo '<ul>';
|
||||
docs_render_tree($node['children']);
|
||||
echo '</ul>';
|
||||
}
|
||||
echo '</li>';
|
||||
}
|
||||
}
|
||||
}
|
||||
docs_render_tree($tree);
|
||||
{/php}
|
||||
</ul>
|
||||
{/if}
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
layui.use(['form', 'layer', 'jquery'], function () {
|
||||
var form = layui.form;
|
||||
var layer = layui.layer;
|
||||
var $ = layui.$;
|
||||
|
||||
var projectId = {if condition="$project"}{$project.id}{else/}0{/if};
|
||||
var versionId = {if condition="$version"}{$version.id}{else/}0{/if};
|
||||
|
||||
// 切换项目时版本需要重新加载,因此直接整页跳转
|
||||
form.on('select(projectPick)', function (data) {
|
||||
location.href = '/docs/backend/doc?project_id=' + data.value;
|
||||
});
|
||||
|
||||
form.on('select(versionPick)', function (data) {
|
||||
location.href = '/docs/backend/doc?project_id=' + projectId + '&version_id=' + data.value;
|
||||
});
|
||||
|
||||
// 删除文档
|
||||
$('#docTree').on('click', '.doc-del', function () {
|
||||
var id = $(this).data('id');
|
||||
var title = $(this).data('title');
|
||||
layer.confirm('删除「' + title + '」将同时删除其所有下级文档,确定继续?', {
|
||||
icon: 3, title: '确认删除'
|
||||
}, function (index) {
|
||||
layer.close(index);
|
||||
$.post('/docs/backend/doc/delete/' + id, {}, function (res) {
|
||||
if (res.code === 0) {
|
||||
layer.msg(res.message, { icon: 1 }, function () { location.reload(); });
|
||||
} else {
|
||||
layer.msg(res.message || '删除失败', { icon: 2 });
|
||||
}
|
||||
}, 'json').fail(function () {
|
||||
layer.msg('请求失败,请重试', { icon: 2 });
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// 保存排序:收集所有节点的 id / pid / sort
|
||||
$('#btnSaveSort').on('click', function () {
|
||||
var nodes = [];
|
||||
$('#docTree .doc-node').each(function () {
|
||||
var $node = $(this);
|
||||
nodes.push({
|
||||
id: parseInt($node.data('id'), 10),
|
||||
pid: parseInt($node.data('pid'), 10),
|
||||
sort: parseInt($node.find('.doc-sortbox').val(), 10) || 0
|
||||
});
|
||||
});
|
||||
|
||||
if (!nodes.length) {
|
||||
layer.msg('没有可排序的文档', { icon: 0 });
|
||||
return;
|
||||
}
|
||||
|
||||
var loading = layer.load(1);
|
||||
$.post('/docs/backend/doc/sort', { nodes: JSON.stringify(nodes) }, function (res) {
|
||||
layer.close(loading);
|
||||
if (res.code === 0) {
|
||||
layer.msg(res.message, { icon: 1 }, function () { location.reload(); });
|
||||
} else {
|
||||
layer.msg(res.message || '保存失败', { icon: 2 });
|
||||
}
|
||||
}, 'json').fail(function () {
|
||||
layer.close(loading);
|
||||
layer.msg('请求失败,请重试', { icon: 2 });
|
||||
});
|
||||
});
|
||||
|
||||
// 重建搜索索引
|
||||
$('#btnRebuild').on('click', function () {
|
||||
var loading = layer.load(1);
|
||||
$.post('/docs/backend/doc/rebuild-index', { project_id: projectId }, function (res) {
|
||||
layer.close(loading);
|
||||
layer.msg(res.message || '完成', { icon: res.code === 0 ? 1 : 2 });
|
||||
}, 'json').fail(function () {
|
||||
layer.close(loading);
|
||||
layer.msg('请求失败,请重试', { icon: 2 });
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,91 @@
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">
|
||||
<span>新增文档项目</span>
|
||||
<a class="layui-btn layui-btn-sm layui-btn-primary" style="float:right;" href="/docs/backend/project">返回列表</a>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<form class="layui-form" lay-filter="projectForm" style="max-width:760px;">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">项目标识</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="name" required lay-verify="required" placeholder="英文标识,用于 URL,如 framework" autocomplete="off" class="layui-input">
|
||||
<div class="docs-tip">前台访问地址为 /docs/项目标识,仅支持字母开头的字母数字与下划线中划线</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">项目名称</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="title" required lay-verify="required" placeholder="显示名称,如 框架开发文档" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">项目简介</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="intro" placeholder="一句话介绍该文档项目" class="layui-textarea"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">项目图标</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="logo" placeholder="图标地址,可留空" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">归属插件</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="addon">
|
||||
<option value="">框架自身(不归属插件)</option>
|
||||
{volist name="addonList" id="addon"}
|
||||
<option value="{$addon.name}">{$addon.title}({$addon.name})</option>
|
||||
{/volist}
|
||||
</select>
|
||||
<div class="docs-tip">选择后可在插件详情页关联展示该文档</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">排序</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="sort" value="0" placeholder="数值越小越靠前" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">状态</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" name="status" value="1" checked lay-skin="switch" lay-text="启用|禁用">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn" lay-submit lay-filter="projectSubmit">保存</button>
|
||||
<a class="layui-btn layui-btn-primary" href="/docs/backend/project">取消</a>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
layui.use(['form', 'layer', 'jquery'], function () {
|
||||
var form = layui.form;
|
||||
var layer = layui.layer;
|
||||
var $ = layui.$;
|
||||
|
||||
form.on('submit(projectSubmit)', function (data) {
|
||||
var post = $.extend({}, data.field);
|
||||
post.status = data.field.status ? 1 : 0;
|
||||
|
||||
$.post('/docs/backend/project/save', post, function (res) {
|
||||
if (res.code === 0) {
|
||||
layer.msg(res.message, { icon: 1 }, function () {
|
||||
location.href = '/docs/backend/project';
|
||||
});
|
||||
} else {
|
||||
layer.msg(res.message || '保存失败', { icon: 2 });
|
||||
}
|
||||
}, 'json').fail(function () {
|
||||
layer.msg('请求失败,请重试', { icon: 2 });
|
||||
});
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,102 @@
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">
|
||||
<span>编辑文档项目:{$item.title}</span>
|
||||
<div class="layui-inline" style="float:right;">
|
||||
<a class="layui-btn layui-btn-sm layui-btn-normal" href="/docs/backend/doc?project_id={$item.id}">管理文档</a>
|
||||
<a class="layui-btn layui-btn-sm layui-btn-primary" href="/docs/backend/project">返回列表</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<form class="layui-form" lay-filter="projectForm" style="max-width:760px;">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">项目标识</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="name" value="{$item.name}" required lay-verify="required" autocomplete="off" class="layui-input">
|
||||
<div class="docs-tip">修改标识会导致原有前台链接失效,请谨慎操作</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">项目名称</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="title" value="{$item.title}" required lay-verify="required" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">项目简介</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="intro" class="layui-textarea">{$item.intro}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">项目图标</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="logo" value="{$item.logo}" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">归属插件</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="addon">
|
||||
<option value="">框架自身(不归属插件)</option>
|
||||
{volist name="addonList" id="addon"}
|
||||
<option value="{$addon.name}" {if condition="$item.addon eq $addon.name"}selected{/if}>{$addon.title}({$addon.name})</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">默认版本</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="default_version">
|
||||
<option value="">自动(取默认版本)</option>
|
||||
{volist name="versionList" id="ver"}
|
||||
<option value="{$ver.name}" {if condition="$item.default_version eq $ver.name"}selected{/if}>{$ver.title}({$ver.name})</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">排序</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="sort" value="{$item.sort}" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">状态</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" name="status" value="1" {if condition="$item.status eq 1"}checked{/if} lay-skin="switch" lay-text="启用|禁用">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn" lay-submit lay-filter="projectSubmit">保存</button>
|
||||
<a class="layui-btn layui-btn-primary" href="/docs/backend/project">取消</a>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
layui.use(['form', 'layer', 'jquery'], function () {
|
||||
var form = layui.form;
|
||||
var layer = layui.layer;
|
||||
var $ = layui.$;
|
||||
|
||||
form.on('submit(projectSubmit)', function (data) {
|
||||
var post = $.extend({}, data.field);
|
||||
post.status = data.field.status ? 1 : 0;
|
||||
|
||||
$.post('/docs/backend/project/update/{$item.id}', post, function (res) {
|
||||
if (res.code === 0) {
|
||||
layer.msg(res.message, { icon: 1 });
|
||||
} else {
|
||||
layer.msg(res.message || '保存失败', { icon: 2 });
|
||||
}
|
||||
}, 'json').fail(function () {
|
||||
layer.msg('请求失败,请重试', { icon: 2 });
|
||||
});
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,88 @@
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">
|
||||
<span>文档项目</span>
|
||||
<div class="layui-inline" style="float:right;">
|
||||
<a class="layui-btn layui-btn-sm" href="/docs/backend/project/add">新增项目</a>
|
||||
<a class="layui-btn layui-btn-sm layui-btn-primary" href="/docs" target="_blank">查看前台</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<form class="layui-form docs-scope-bar" method="get" action="/docs/backend/project">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<input type="text" name="keyword" value="{$keyword|default=''}" placeholder="按项目名称或标识搜索" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<button class="layui-btn" type="submit">搜索</button>
|
||||
<a class="layui-btn layui-btn-primary" href="/docs/backend/project">重置</a>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<table class="layui-table">
|
||||
<colgroup>
|
||||
<col width="70"><col width="150"><col><col width="130"><col width="90"><col width="90"><col width="80"><col width="90"><col width="200">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th><th>标识</th><th>项目名称</th><th>归属插件</th>
|
||||
<th>版本数</th><th>文档数</th><th>排序</th><th>状态</th><th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{volist name="list" id="item" empty="<tr><td colspan='9' class='docs-empty'>暂无文档项目,点击右上角新增</td></tr>"}
|
||||
<tr>
|
||||
<td>{$item.id}</td>
|
||||
<td><code>{$item.name}</code></td>
|
||||
<td>
|
||||
{$item.title}
|
||||
{if condition="$item.intro neq ''"}<div class="docs-tip">{$item.intro}</div>{/if}
|
||||
</td>
|
||||
<td>{if condition="$item.addon neq ''"}{$item.addon}{else/}<span class="docs-tip">框架自身</span>{/if}</td>
|
||||
<td>{$item.version_count}</td>
|
||||
<td>{$item.doc_count}</td>
|
||||
<td>{$item.sort}</td>
|
||||
<td>
|
||||
{if condition="$item.status eq 1"}
|
||||
<span class="layui-badge layui-bg-blue">启用</span>
|
||||
{else/}
|
||||
<span class="layui-badge layui-bg-gray">禁用</span>
|
||||
{/if}
|
||||
</td>
|
||||
<td>
|
||||
<a class="layui-btn layui-btn-xs" href="/docs/backend/project/edit/{$item.id}">编辑</a>
|
||||
<a class="layui-btn layui-btn-xs layui-btn-normal" href="/docs/backend/doc?project_id={$item.id}">管理文档</a>
|
||||
<a class="layui-btn layui-btn-xs layui-btn-danger docs-del" href="javascript:;" data-id="{$item.id}" data-title="{$item.title}">删除</a>
|
||||
</td>
|
||||
</tr>
|
||||
{/volist}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
layui.use(['layer', 'jquery'], function () {
|
||||
var layer = layui.layer;
|
||||
var $ = layui.$;
|
||||
|
||||
$('.docs-del').on('click', function () {
|
||||
var id = $(this).data('id');
|
||||
var title = $(this).data('title');
|
||||
layer.confirm('删除项目「' + title + '」将同时删除其下所有版本与文档,确定继续?', {
|
||||
icon: 3, title: '确认删除'
|
||||
}, function (index) {
|
||||
layer.close(index);
|
||||
$.post('/docs/backend/project/delete/' + id, {}, function (res) {
|
||||
if (res.code === 0) {
|
||||
layer.msg(res.message, { icon: 1 }, function () { location.reload(); });
|
||||
} else {
|
||||
layer.msg(res.message || '删除失败', { icon: 2 });
|
||||
}
|
||||
}, 'json').fail(function () {
|
||||
layer.msg('请求失败,请重试', { icon: 2 });
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,91 @@
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">
|
||||
<span>新增版本</span>
|
||||
<a class="layui-btn layui-btn-sm layui-btn-primary" style="float:right;" href="/docs/backend/version?project_id={$projectId}">返回列表</a>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<form class="layui-form" style="max-width:760px;">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">所属项目</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="project_id" required lay-verify="required">
|
||||
{volist name="projects" id="p"}
|
||||
<option value="{$p.id}" {if condition="$projectId eq $p.id"}selected{/if}>{$p.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">版本标识</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="name" required lay-verify="required" placeholder="如 v1 / v2.0" autocomplete="off" class="layui-input">
|
||||
<div class="docs-tip">非默认版本的访问地址为 /docs/项目标识/版本标识/文档标识</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">版本名称</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="title" required lay-verify="required" placeholder="如 1.0 稳定版" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">版本说明</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="intro" class="layui-textarea"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">排序</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="sort" value="0" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">设为默认</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" name="is_default" value="1" lay-skin="switch" lay-text="是|否">
|
||||
<div class="docs-tip">默认版本的文档使用短地址访问,同一项目只能有一个默认版本</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">状态</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" name="status" value="1" checked lay-skin="switch" lay-text="启用|禁用">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn" lay-submit lay-filter="versionSubmit">保存</button>
|
||||
<a class="layui-btn layui-btn-primary" href="/docs/backend/version?project_id={$projectId}">取消</a>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
layui.use(['form', 'layer', 'jquery'], function () {
|
||||
var form = layui.form;
|
||||
var layer = layui.layer;
|
||||
var $ = layui.$;
|
||||
|
||||
form.on('submit(versionSubmit)', function (data) {
|
||||
var post = $.extend({}, data.field);
|
||||
post.status = data.field.status ? 1 : 0;
|
||||
post.is_default = data.field.is_default ? 1 : 0;
|
||||
|
||||
$.post('/docs/backend/version/save', post, function (res) {
|
||||
if (res.code === 0) {
|
||||
layer.msg(res.message, { icon: 1 }, function () {
|
||||
location.href = '/docs/backend/version?project_id=' + post.project_id;
|
||||
});
|
||||
} else {
|
||||
layer.msg(res.message || '保存失败', { icon: 2 });
|
||||
}
|
||||
}, 'json').fail(function () {
|
||||
layer.msg('请求失败,请重试', { icon: 2 });
|
||||
});
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,87 @@
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">
|
||||
<span>编辑版本:{$item.title}</span>
|
||||
<a class="layui-btn layui-btn-sm layui-btn-primary" style="float:right;" href="/docs/backend/version?project_id={$item.project_id}">返回列表</a>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<form class="layui-form" style="max-width:760px;">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">所属项目</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="project_id" required lay-verify="required">
|
||||
{volist name="projects" id="p"}
|
||||
<option value="{$p.id}" {if condition="$item.project_id eq $p.id"}selected{/if}>{$p.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">版本标识</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="name" value="{$item.name}" required lay-verify="required" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">版本名称</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="text" name="title" value="{$item.title}" required lay-verify="required" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">版本说明</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="intro" class="layui-textarea">{$item.intro}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">排序</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="number" name="sort" value="{$item.sort}" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">设为默认</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" name="is_default" value="1" {if condition="$item.is_default eq 1"}checked{/if} lay-skin="switch" lay-text="是|否">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">状态</label>
|
||||
<div class="layui-input-block">
|
||||
<input type="checkbox" name="status" value="1" {if condition="$item.status eq 1"}checked{/if} lay-skin="switch" lay-text="启用|禁用">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn" lay-submit lay-filter="versionSubmit">保存</button>
|
||||
<a class="layui-btn layui-btn-primary" href="/docs/backend/version?project_id={$item.project_id}">取消</a>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
layui.use(['form', 'layer', 'jquery'], function () {
|
||||
var form = layui.form;
|
||||
var layer = layui.layer;
|
||||
var $ = layui.$;
|
||||
|
||||
form.on('submit(versionSubmit)', function (data) {
|
||||
var post = $.extend({}, data.field);
|
||||
post.status = data.field.status ? 1 : 0;
|
||||
post.is_default = data.field.is_default ? 1 : 0;
|
||||
|
||||
$.post('/docs/backend/version/update/{$item.id}', post, function (res) {
|
||||
if (res.code === 0) {
|
||||
layer.msg(res.message, { icon: 1 });
|
||||
} else {
|
||||
layer.msg(res.message || '保存失败', { icon: 2 });
|
||||
}
|
||||
}, 'json').fail(function () {
|
||||
layer.msg('请求失败,请重试', { icon: 2 });
|
||||
});
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,98 @@
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">
|
||||
<span>版本管理</span>
|
||||
<a class="layui-btn layui-btn-sm" style="float:right;" href="/docs/backend/version/add?project_id={$projectId}">新增版本</a>
|
||||
</div>
|
||||
<div class="layui-card-body">
|
||||
<form class="layui-form docs-scope-bar" method="get" action="/docs/backend/version">
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-inline">
|
||||
<label class="layui-form-label" style="width:70px;">所属项目</label>
|
||||
<div class="layui-input-inline">
|
||||
<select name="project_id" lay-filter="projectPick">
|
||||
{volist name="projects" id="p"}
|
||||
<option value="{$p.id}" {if condition="$projectId eq $p.id"}selected{/if}>{$p.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<table class="layui-table">
|
||||
<colgroup>
|
||||
<col width="70"><col width="140"><col><col width="90"><col width="90"><col width="80"><col width="90"><col width="150">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th><th>版本标识</th><th>版本名称</th><th>默认</th>
|
||||
<th>文档数</th><th>排序</th><th>状态</th><th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{volist name="list" id="item" empty="<tr><td colspan='8' class='docs-empty'>该项目暂无版本</td></tr>"}
|
||||
<tr>
|
||||
<td>{$item.id}</td>
|
||||
<td><code>{$item.name}</code></td>
|
||||
<td>
|
||||
{$item.title}
|
||||
{if condition="$item.intro neq ''"}<div class="docs-tip">{$item.intro}</div>{/if}
|
||||
</td>
|
||||
<td>
|
||||
{if condition="$item.is_default eq 1"}
|
||||
<span class="layui-badge layui-bg-orange">默认</span>
|
||||
{else/}
|
||||
<span class="docs-tip">-</span>
|
||||
{/if}
|
||||
</td>
|
||||
<td>{$item.doc_count}</td>
|
||||
<td>{$item.sort}</td>
|
||||
<td>
|
||||
{if condition="$item.status eq 1"}
|
||||
<span class="layui-badge layui-bg-blue">启用</span>
|
||||
{else/}
|
||||
<span class="layui-badge layui-bg-gray">禁用</span>
|
||||
{/if}
|
||||
</td>
|
||||
<td>
|
||||
<a class="layui-btn layui-btn-xs" href="/docs/backend/version/edit/{$item.id}">编辑</a>
|
||||
<a class="layui-btn layui-btn-xs layui-btn-normal" href="/docs/backend/doc?project_id={$projectId}&version_id={$item.id}">管理文档</a>
|
||||
<a class="layui-btn layui-btn-xs layui-btn-danger docs-del" href="javascript:;" data-id="{$item.id}" data-title="{$item.title}">删除</a>
|
||||
</td>
|
||||
</tr>
|
||||
{/volist}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
layui.use(['form', 'layer', 'jquery'], function () {
|
||||
var form = layui.form;
|
||||
var layer = layui.layer;
|
||||
var $ = layui.$;
|
||||
|
||||
form.on('select(projectPick)', function (data) {
|
||||
location.href = '/docs/backend/version?project_id=' + data.value;
|
||||
});
|
||||
|
||||
$('.docs-del').on('click', function () {
|
||||
var id = $(this).data('id');
|
||||
var title = $(this).data('title');
|
||||
layer.confirm('删除版本「' + title + '」将同时删除其下所有文档,确定继续?', {
|
||||
icon: 3, title: '确认删除'
|
||||
}, function (index) {
|
||||
layer.close(index);
|
||||
$.post('/docs/backend/version/delete/' + id, {}, function (res) {
|
||||
if (res.code === 0) {
|
||||
layer.msg(res.message, { icon: 1 }, function () { location.reload(); });
|
||||
} else {
|
||||
layer.msg(res.message || '删除失败', { icon: 2 });
|
||||
}
|
||||
}, 'json').fail(function () {
|
||||
layer.msg('请求失败,请重试', { icon: 2 });
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
Reference in New Issue
Block a user