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

@@ -379,6 +379,7 @@ class Post extends Common
View::assign('post', $model_post);
View::assign('layoutContentHtml', $layoutContentHtml);
View::assign('layoutConfig', $layoutConfig);
View::assign('lastOutputId', $postOutput ? $postOutput->id : 0);
return View::fetch();
}
@@ -431,6 +432,12 @@ class Post extends Common
$phoneImage->savePageImage($output->id, $index + 1, $pageData);
}
// 保存长图(如果有)
$longImage = $data['long_image'] ?? '';
if (!empty($longImage)) {
$phoneImage->saveLongImage($output->id, $longImage);
}
$phoneImage->completeOutput($output->id, count($pages));
return json(['code' => 0, 'msg' => '保存成功', 'data' => ['output_id' => $output->id]]);
@@ -580,6 +587,60 @@ class Post extends Common
}
}
/**
* 导出查看页面
*/
public function outputView($id)
{
$output = \app\model\PostOutput::find((int) $id);
if (empty($output)) {
$this->error('输出记录不存在');
}
$post = ModelPost::find($output->post_id);
if (empty($post)) {
$this->error('文章不存在');
}
$allFiles = \app\model\PostOutputFile::where('output_id', (int) $id)
->order('page', 'asc')
->select();
// 分离长图和分页
$longImage = null;
$pages = [];
foreach ($allFiles as $file) {
$item = [
'id' => $file->id,
'page' => $file->page,
'file_url' => $file->file_url,
'width' => $file->width,
'height' => $file->height,
'image_src' => '',
];
// 优先使用 image_data (data URI)
if (!empty($file->image_data)) {
$item['image_src'] = 'data:image/jpeg;base64,' . $file->image_data;
} elseif (!empty($file->file_url)) {
$item['image_src'] = $file->file_url;
}
if ($file->page == 0) {
$longImage = $item;
} else {
$pages[] = $item;
}
}
View::assign('output', $output);
View::assign('post', $post);
View::assign('longImage', $longImage);
View::assign('pages', $pages);
View::assign('downloadZipUrl', url('post/downloadPostOutputZip', ['id' => $id]));
return View::fetch('post/output_view');
}
/**
* 获取输出文件列表(AJAX)
*/
@@ -607,6 +668,7 @@ class Post extends Common
'file_size' => $file->file_size,
'width' => $file->width,
'height' => $file->height,
'image_data' => $file->image_data ?: null,
];
}