feat(phone-image): 對齊持久化+防抖自動保存

- saveImages新增mergedConfig合併pageAlignments
- 新增debouncedSaveConfig(): 300ms防抖自動保存
- 對齊change handler調用refreshDomPage+debouncedSaveConfig
- 重置按鈕逐頁刷新DOM+防抖保存
- HTML新增phone-image:save-config事件監聽器
- currentConfig初始化正確同步pageAlignments
This commit is contained in:
augushong
2026-05-19 00:30:29 +08:00
parent 63459832a5
commit 94039d026e
2 changed files with 71 additions and 12 deletions

View File

@@ -1723,13 +1723,18 @@ var PhoneImageEngine = (function () {
}
// 第三步:发送到后端
// 合并保存配置确保pageAlignments来自引擎内部config
var mergedConfig = $.extend({}, saveConfig || config, {
pageAlignments: config.pageAlignments || {}
});
$.ajax({
url: '/index.php/admin/post/savePostOutput',
type: 'POST',
data: JSON.stringify({
post_id: postId,
output_type: 'phone_image',
config: saveConfig || config,
config: mergedConfig,
content_html: postData.content_html,
pages: pagesData,
long_image: longImageData
@@ -1838,6 +1843,21 @@ var PhoneImageEngine = (function () {
config.pageAlignments[pageNum] = align;
}
// ===== 对齐防抖保存 =====
var _saveConfigTimer = null;
/**
* 防抖保存config对齐变更时使用
* 避免频繁触发保存请求300ms内多次调用只执行最后一次
*/
function debouncedSaveConfig() {
if (_saveConfigTimer) clearTimeout(_saveConfigTimer);
_saveConfigTimer = setTimeout(function () {
// 触发自定义事件由phone_image.html中的监听器处理实际保存
$(document).trigger('phone-image:save-config');
}, 300);
}
// ===== 长图base64生成不触发下载 =====
/**
@@ -1977,9 +1997,11 @@ var PhoneImageEngine = (function () {
// ===== 对齐下拉事件委托兼容JPEG预览和DOM预览两种模式 =====
$(document).on('change', '.thumb-alignment-select', function () {
var $select = $(this);
var pageIndex = parseInt($select.attr('data-page-index'), 10);
var pageNum = parseInt($select.attr('data-page-num'), 10);
var align = $select.val();
// 更新引擎内部config
setPageAlignment(pageNum, align);
var $thumbItem = $select.closest('.preview-thumb-item');
@@ -1988,18 +2010,22 @@ var PhoneImageEngine = (function () {
var $phonePage = $thumbItem.find('.dom-page-container .phone-image-page');
if ($phonePage.length) {
$phonePage.removeClass('valign-top valign-center valign-bottom').addClass('valign-' + align);
return;
// 额外刷新确保对齐一致
refreshDomPage(pageIndex);
} else {
// JPEG预览模式更新 img 的 align-self
var $thumbImg = $thumbItem.find('.preview-thumb-img');
if (align === 'center') {
$thumbImg.css({ 'align-self': 'center' });
} else if (align === 'bottom') {
$thumbImg.css({ 'align-self': 'flex-end' });
} else {
$thumbImg.css({ 'align-self': 'flex-start' });
}
}
// JPEG预览模式更新 img 的 align-self
var $thumbImg = $thumbItem.find('.preview-thumb-img');
if (align === 'center') {
$thumbImg.css({ 'align-self': 'center' });
} else if (align === 'bottom') {
$thumbImg.css({ 'align-self': 'flex-end' });
} else {
$thumbImg.css({ 'align-self': 'flex-start' });
}
// 防抖自动保存config
debouncedSaveConfig();
});
// ===== 公开API =====
@@ -2015,6 +2041,7 @@ var PhoneImageEngine = (function () {
renderDomPages: renderDomPages,
renderDomPageThumbnails: renderDomPageThumbnails,
refreshDomPage: refreshDomPage,
debouncedSaveConfig: debouncedSaveConfig,
logPanel: PhoneImageLogPanel,
getContentHtml: function () {
if (window.phoneImageEditor) {