

{% extends "admin/common/base.html" %}
{% block title %}
新建文章-页面
{% endblock %}
{% block main_title %}
新建文章
{% endblock %}
{% block head %}
{% endblock %}
{% block content %}
选择分类
{% for category in category_list %}
{{ category.name }}
{% endfor %}
</select>
</div>
<div class="layui-col-md1 head_form">
<button type="button" class="layui-btn header_btn" lay-submit lay-filter="saveDraft">保存草稿</button>
</div>
<div class="layui-col-md1 head_form">
<button type="button" class="layui-btn layui-bg-blue header_btn" lay-on="publish">
发布文章
</button>
</div>
</div>
</form>
<div id="editor"></div>
<script type="text/html" id="post-template">
<form class="layui-form" style="margin: 16px;">
<div class="layui-form-item">
<label class="layui-form-label">标签(非必填): </label>
<div class="layui-input-block">
{% for tag in tag_list %}
<input type="checkbox" name="{{ tag.id }}" title="{{ tag.name }}">
{% endfor %}
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">封面选择: </label>
<div class="layui-input-block" id="img_list" style="max-height: 250px; overflow-y: auto; padding-right: 10px;"></div>
</div>
<div style="display: flex;justify-content: flex-end; padding:0 30px 30px 0">
<button type="button" lay-filter="publish" lay-submit class="layui-btn layui-bg-blue">发布文章</button>
</div>
</form>
</script>{% endblock %}
{% block script %}
<script src="{{ url_for('blog.static', filename='js/activate-power-mode.js') }}"></script>
<script>
POWERMODE.colorful = true; // ture 为启用礼花特效
POWERMODE.shake = false; // false 为禁用震动特效
document.body.addEventListener('input', POWERMODE);
</script>
<script>
var plugin = toastui.Editor.plugin;
var codeSyntaxHighlight = plugin.codeSyntaxHighlight;
var colorSyntax = plugin.colorSyntax;
const Editor = toastui.Editor;
const editor = new Editor({
el: document.querySelector('#editor'),
initialEditType: 'markdown', // 初始编辑类型,这里是 Markdown
previewStyle: 'vertical', // 预览样式,可以是 'tab', 'vertical'
height: '600px', // 编辑器高度
language: 'zh-CN', // 设置中文语言
plugins: [codeSyntaxHighlight, colorSyntax],
{#theme: 'dark',#}
hooks: { // 图片保存钩子
addImageBlobHook: (blob, callback) => {
{#console.log(blob) // 文件对象#}
uploadImage(blob, function (imageUrl) {
{#console.log(imageUrl)#}
callback(imageUrl); // 将路径传递给编辑器
}, function (error) {
console.error('图片上传失败:', error);
});
},
}
});
let $ = layui.$;
let img_list = [] // 图片列表, 存储了图片对象
function uploadImage(imageBlob, successCallback, errorCallback) {
let formData = new FormData();
formData.append('file', imageBlob);
formData.append('size', imageBlob.size.toString());
formData.append('name', imageBlob.name === 'image.png' ? imageBlob.lastModified + '.png' : imageBlob.name);
$.ajax({
url: '{{ url_for('admin.upload') }}',
type: 'POST',
data: formData,
processData: false,
contentType: false,
success: function (data) {
{#console.log(data)#}
if (data.url !== '') {
img_list.push(data)
successCallback(data.url); // 编辑器的回显
} else {
errorCallback('图片上传失败');
}
},
error: function () {
errorCallback('图片上传失败');
}
});
}
layui.use('form', () => {
let form = layui.form;
let layer = layui.layer;
let util = layui.util;
let $ = layui.$;
let cover = ''
util.on('lay-on', {
'publish': () => {
// 判断是否输入了文章标题
let title = form.val('filter-test-layer').title
if (title.trim() === '') {
layer.msg('请输入文章标题', {icon: 7, time: 1500, anim: 6});
return;
}
layer.open({
type: 1,
area: ['600px', ''],
resize: false,
shadeClose: true,
title: '发布文章',
offset: '100px',
content: $('#post-template').html(),
success: function (layero, index, that) {
// 弹出层渲染已上传的图片
const imageContainer = $('#img_list')
img_list.forEach((img, index) => {
const imgElement = $('<img alt="" src="">').attr('src', img.url).addClass('clickable-image')
imageContainer.append(imgElement)
// 重新计算弹窗盒子的高度
{#let box_height = Math.ceil(img_list.length / 3) * 100 + 250#}
{#console.log(Math.ceil(img_list.length / 3))#}
{#layero.css('height', `${box_height}px`)#}
// 重新计算弹窗盒子的高度(修改这部分)
// 限制最大图片展示高度为300px,超过则显示滚动条
let imageAreaHeight = Math.min(Math.ceil(img_list.length / 3) * 100, 250);
let box_height = imageAreaHeight + 250; // 250是其他元素的基础高度
layero.css('height', `${box_height}px`);
// 监听图片的点击事件
imgElement.click(() => {
imgElement.addClass('select_cover')
imgElement.siblings('img').removeClass('select_cover')
cover = img.url // 针对选择的图片, 做封面的设置
})
})
// 对弹层中的表单进行初始化渲染
form.render();
form.on('submit(publish)', function (data) {
let tags = data.field;
let category = form.val('filter-test-layer').category || "{{ category_list[0].id }}";
let html = editor.getHTML()
let markdown = editor.getMarkdown()
let form_data = {
title: title,
category: category,
tags: JSON.stringify(tags),
html: html,
markdown: markdown,
img_list: JSON.stringify(img_list),
cover: cover // 上传到接口添加了封面
}
$.post('{{ url_for('admin.post_add') }}', form_data, (res) => {
if (res === 'success') {
layer.close(1, () => {
layer.msg('保存成功', {icon: 1, time: 1500}, () => {
window.location.href = '{{ url_for('admin.post') }}';
});
});
}
}
)
return false; // 阻止默认 form 跳转
});
}
})
}
})
// 监听保存草稿按钮点击事件
form.on('submit(saveDraft)', (data) => {
console.log(data)
console.log('保存草稿')
return false; // 阻止表单跳转
})
// 监听发部文章按钮点击事件
form.on('submit(publish)', (data) => {
console.log(data)
let title = data.field.title
console.log(title)
let html = editor.getHTML()
let markdown = editor.getMarkdown()
console.log(html)
console.log('-'.repeat(100))
console.log(markdown)
console.log('发布文章');
return false; // 阻止表单跳转
});
})
</script>{% endblock %}