feat(output_view): 导出页面重构 - 长图卡片化展示、缩略图增大、预览优化、纯图片页原图保存

- output_view.html: 长图改为固定高度卡片(70px),Blob URL查看,缩略图minmax(280px,1fr),
  竖图预览优先填充视口高度,下载功能完整保留
- phone-image.js: renderPureImageToCanvas()使用naturalWidth/naturalHeight保持原图分辨率,
  新增长图生成和保存功能
- Post.php: 新增outputView()方法提供导出页面渲染数据
- PhoneImage.php: 图片数据改为DB存储,新增saveLongImage()方法
- phone_image.html: 添加导出页面入口按钮
- 新增数据库迁移: post_output_file表添加image_data字段
This commit is contained in:
augushong
2026-05-14 23:22:19 +08:00
parent f60d1abff6
commit 10879a8037
6 changed files with 784 additions and 83 deletions

View File

@@ -138,18 +138,19 @@
<div class="page-header-right">
<button type="button" class="layui-btn layui-btn-sm layui-btn-primary" id="btn-settings"><i
class="layui-icon layui-icon-set"></i> 设置</button>
<button type="button" class="layui-btn layui-btn-sm layui-btn-warm" id="btn-render"><i
class="layui-icon layui-icon-refresh"></i> 生成</button>
<button type="button" class="layui-btn layui-btn-sm layui-btn-normal" id="btn-save"><i
class="layui-icon layui-icon-ok"></i> 保存</button>
<button type="button" class="layui-btn layui-btn-sm" id="btn-generate"><i
class="layui-icon layui-icon-picture"></i> 生成并保存</button>
<button type="button" class="layui-btn layui-btn-sm layui-btn-primary" id="btn-export-page"><i
class="layui-icon layui-icon-upload-circle"></i> 导出页面</button>
<div class="more-dropdown-wrapper" style="position:relative;display:inline-block;">
<button type="button" class="layui-btn layui-btn-sm layui-btn-primary" id="btn-more"><i
class="layui-icon layui-icon-more"></i></button>
<ul class="more-dropdown-menu" id="more-dropdown-menu" style="display:none;position:absolute;right:0;top:100%;margin-top:4px;background:#fff;border:1px solid #e8e8e8;border-radius:4px;box-shadow:0 2px 8px rgba(0,0,0,0.12);z-index:9999;min-width:130px;padding:4px 0;list-style:none;">
<li data-action="history" style="padding:8px 16px;cursor:pointer;font-size:13px;white-space:nowrap;">历史记录</li>
<li data-action="rerender" style="padding:8px 16px;cursor:pointer;font-size:13px;white-space:nowrap;">重新生成</li>
<li data-action="download" style="padding:8px 16px;cursor:pointer;font-size:13px;white-space:nowrap;">打包下载</li>
<li data-action="exportLong" style="padding:8px 16px;cursor:pointer;font-size:13px;white-space:nowrap;">导出长图</li>
</ul>
</div>
</div>
@@ -184,8 +185,9 @@
var form = layui.form;
var layer = layui.layer;
var lastOutputId = null;
var lastOutputId = <?php echo $lastOutputId ? (int) $lastOutputId : 'null'; ?>;
var downloadBaseUrl = '{:url("post/downloadPostOutputZip", ["id" => 0])}';
var outputViewUrl = '{:url("post/outputView", ["id" => 0])}';
var saveConfigUrl = '{:url("post/savePostOutputConfig")}';
var historyListUrl = '{:url("post/getOutputListJson", ["id" => $post->id])}';
var loadConfigUrl = '{:url("post/loadPostOutputConfig")}';
@@ -395,6 +397,21 @@
}, 300);
}
// ========== 生成按钮 ==========
$('#btn-render').click(function () {
doRender();
});
// ========== 导出页面按钮 ==========
$('#btn-export-page').click(function () {
if (!lastOutputId) {
layer.msg('请先生成并保存');
return;
}
var url = outputViewUrl.replace('id=0', 'id=' + lastOutputId);
window.open(url);
});
// ========== 更多下拉菜单纯JS实现 ==========
var $menu = $('#more-dropdown-menu');
$('#btn-more').on('click', function(e) {
@@ -408,15 +425,6 @@
case 'history':
$('#btn-history').trigger('click');
break;
case 'rerender':
doRender();
break;
case 'download':
$('#btn-download-hidden').trigger('click');
break;
case 'exportLong':
$('#btn-export-long-hidden').trigger('click');
break;
}
});
// 点击外部关闭
@@ -505,40 +513,10 @@
});
});
// ========== 打包下载(隐藏按钮,由更多菜单触发) ==========
var downloadBtn = $('<button type="button" id="btn-download-hidden" style="display:none;"></button>');
$('body').append(downloadBtn);
downloadBtn.on('click', function () {
if (!lastOutputId) {
layer.msg('请先生成并保存图片');
return;
}
var url = downloadBaseUrl.replace('/0/', '/' + lastOutputId + '/');
window.open(url);
});
// ========== 导出长图(隐藏按钮,由更多菜单触发) ==========
var exportLongBtn = $('<button type="button" id="btn-export-long-hidden" style="display:none;"></button>');
$('body').append(exportLongBtn);
exportLongBtn.on('click', function () {
PhoneImageEngine.exportLongImage().then(function () {
layer.msg('长图已导出');
}).catch(function (err) {
layer.msg('导出失败: ' + err);
});
});
// ========== 历史记录(隐藏按钮,由更多菜单和设置旁入口触发) ==========
var historyBtn = $('<button type="button" id="btn-history" style="display:none;"></button>');
$('body').append(historyBtn);
// 重新生成(隐藏按钮,由更多菜单触发)
var rerenderBtn = $('<button type="button" id="btn-rerender" style="display:none;"></button>');
$('body').append(rerenderBtn);
rerenderBtn.on('click', function () {
doRender();
});
historyBtn.on('click', function () {
var loadIdx = layer.load();
$.get(historyListUrl, function (res) {