修复:根据图片字段选择前台列表布局

This commit is contained in:
王鹏
2026-07-15 14:44:02 +08:00
parent 79dea897bc
commit 8247c86862
8 changed files with 92 additions and 53 deletions

View File

@@ -208,6 +208,8 @@ public class PageThemeDefinitionServiceImpl implements IPageThemeDefinitionServi
Map<String, Object> layoutPolicy = parseObject(
StringUtils.defaultIfEmpty(theme.getLayoutPolicyJson(), "{}"), "布局策略");
layoutPolicy.remove("frontend.list");
layoutPolicy.remove("frontend.current_user_list");
for (Map.Entry<String, Object> entry : layoutPolicy.entrySet())
{
String[] parts = entry.getKey().split("\\.", 2);

View File

@@ -275,29 +275,23 @@ public class PageCompositionService
}
if ("current_user_list".equals(pageType))
{
boolean useCard = imageCount > 0 || browsingScene || listCount <= 6;
boolean useCard = imageCount > 0;
decision.canvas = useCard ? "frontend-current-user-card-v1" : "frontend-current-user-list-v1";
decision.addReason(useCard ? "个人记录适合卡片式浏览" : "个人记录字段较多,保留表格效率");
decision.confidence = 0.84D;
decision.addReason(useCard ? "检测到图片字段,个人记录采用卡片列表" : "未检测到图片字段,个人记录采用标准列表");
decision.confidence = 0.98D;
return decision;
}
if (categoryField && queryCount >= 2)
{
decision.canvas = "frontend-list-split-v1";
decision.addReason("分类字段和筛选条件明显,采用分栏列表");
decision.confidence = 0.88D;
}
else if (imageCount > 0 && (browsingScene || listCount <= 8))
if (imageCount > 0)
{
decision.canvas = "frontend-list-card-v1";
decision.addReason("记录包含图片且偏浏览场景,采用卡片列表");
decision.confidence = 0.91D;
decision.addReason("检测到图片字段,前台采用卡片列表");
decision.confidence = 0.98D;
}
else
{
decision.canvas = "frontend-list-v1";
decision.addReason("数据维护和检索特征更强,采用标准表");
decision.confidence = 0.72D;
decision.addReason("未检测到图片字段,前台采用标准");
decision.confidence = 0.98D;
}
return decision;
}

View File

@@ -504,8 +504,15 @@ public class PageStylePresetRegistry
public String preferredLayout(String scope, String pageType)
{
String normalizedScope = StringUtils.defaultIfEmpty(scope, "frontend");
String normalizedPageType = StringUtils.defaultIfEmpty(pageType, "list");
if ("frontend".equalsIgnoreCase(normalizedScope)
&& ("list".equals(normalizedPageType) || "current_user_list".equals(normalizedPageType)))
{
return "";
}
return StringUtils.defaultString(layoutPolicy.get(
StringUtils.defaultIfEmpty(scope, "frontend") + "." + StringUtils.defaultIfEmpty(pageType, "list")));
normalizedScope + "." + normalizedPageType));
}
public String shellValue(String name, String fallback)

View File

@@ -60,6 +60,20 @@ public class PageThemeDefinitionServiceImplTest
assertFalse(theme.getShellJson().contains("\"navigation\""));
}
@Test
public void insertRemovesFrontendListLayoutOverrides()
{
PageThemeDefinition theme = customTheme();
theme.setLayoutPolicyJson("{\"frontend.list\":\"frontend-list-card-v1\","
+ "\"frontend.current_user_list\":\"frontend-current-user-card-v1\"}");
when(mapper.selectPageThemeByCode("ocean-blue")).thenReturn(null);
service.insertPageTheme(theme);
assertFalse(theme.getLayoutPolicyJson().contains("frontend.list"));
assertFalse(theme.getLayoutPolicyJson().contains("frontend.current_user_list"));
}
@Test
public void insertRejectsInvalidTokenJson()
{

View File

@@ -24,7 +24,7 @@ public class PageCompositionServiceStylePresetTest
private final PageCompositionService service = new PageCompositionService();
@Test
public void cardPortalPresetKeepsAutomaticallySelectedFrontendCanvas()
public void visualPresetDoesNotForceCardLayoutWithoutImage()
{
FrontProjectPageDesign design = design("frontend", "list");
@@ -33,7 +33,7 @@ public class PageCompositionServiceStylePresetTest
column("status", "status", "1", "1", "1")), null, null, true, "card_portal");
Map<String, Object> layout = readLayout(design);
assertEquals("frontend-list-card-v1", layout.get("canvas"));
assertEquals("frontend-list-v1", layout.get("canvas"));
assertEquals("card_portal", layout.get("stylePreset"));
assertTrue(((Map<?, ?>) layout.get("styleTokens")).containsKey("primary"));
Map<?, ?> composition = (Map<?, ?>) layout.get("composition");
@@ -41,6 +41,22 @@ public class PageCompositionServiceStylePresetTest
assertTrue(String.valueOf(composition.get("reasons")).contains("card_portal"));
}
@Test
public void visualPresetDoesNotForceStandardLayoutWithImage()
{
FrontProjectPageDesign design = design("frontend", "list");
FrontProjectColumn cover = column("cover_url", "coverUrl", "0", "1", "1");
cover.setHtmlType("imageUpload");
service.compose(design, table(), Arrays.asList(
column("title", "title", "1", "1", "1"), cover),
null, null, true, "minimal-white");
Map<String, Object> layout = readLayout(design);
assertEquals("frontend-list-card-v1", layout.get("canvas"));
assertEquals("minimal-white", layout.get("stylePreset"));
}
@Test
public void dataDensePresetKeepsAutomaticallySelectedAdminCanvas()
{
@@ -109,7 +125,25 @@ public class PageCompositionServiceStylePresetTest
Map<String, Object> layout = readLayout(design);
assertEquals("current_user_list", design.getPageType());
assertEquals("frontend-current-user-card-v1", layout.get("canvas"));
assertEquals("frontend-current-user-list-v1", layout.get("canvas"));
}
@Test
public void myReaderListUsesCardsWhenItHasAnImage()
{
FrontProjectPageDesign design = design("frontend", "list");
design.setPageCode("my_borrows_page");
design.setPageName("My Borrows");
design.setRoutePath("/my/borrows");
FrontProjectColumn cover = column("book_cover", "bookCover", "0", "1", "0");
cover.setHtmlType("imageUpload");
service.compose(design, table(), Arrays.asList(
column("reader_id", "readerId", "0", "1", "0"), cover),
null, null, true, "classic-admin");
assertEquals("current_user_list", design.getPageType());
assertEquals("frontend-current-user-card-v1", readLayout(design).get("canvas"));
}
@Test
@@ -122,10 +156,10 @@ public class PageCompositionServiceStylePresetTest
"modern-blue", PageLayoutTemplateRegistry.STABLE_RANDOM, Long.valueOf(42L));
Map<String, Object> layout = readLayout(design);
assertTrue(!"frontend-list-card-v1".equals(layout.get("canvas")));
assertTrue(!"frontend-list-v1".equals(layout.get("canvas")));
Map<?, ?> composition = (Map<?, ?>) layout.get("composition");
assertEquals(PageLayoutTemplateRegistry.STABLE_RANDOM, composition.get("variantMode"));
assertEquals("frontend-list-card-v1", composition.get("recommendedCanvas"));
assertEquals("frontend-list-v1", composition.get("recommendedCanvas"));
assertEquals(layout.get("canvas"), composition.get("selectedCanvas"));
assertEquals(42L, ((Number) composition.get("variantSeed")).longValue());