Files
AILab/f10/src/main/resources/templates/traceability.ftl
T
2026-04-14 10:10:52 +08:00

203 lines
7.4 KiB
Plaintext

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>${page.batchName} - 溯源信息</title>
<link rel="stylesheet" href="/static/traceability.css" />
</head>
<body>
<div class="page-shell">
<#if page.coverImage?has_content>
<section class="cover-panel">
<div class="cover-card">
<img src="${page.coverImage}" alt="${page.batchName}" />
</div>
</section>
</#if>
<section class="hero">
<div class="hero__content">
<h1>${page.batchName}</h1>
<p>${page.summary}</p>
<div class="hero__stats">
<div class="stat-card">
<span>批次编码</span>
<strong>${page.code}</strong>
</div>
<div class="stat-card">
<span>产品名称</span>
<strong>${page.productName}</strong>
</div>
<div class="stat-card">
<span>累计访问</span>
<strong>${page.scanCount}</strong>
</div>
</div>
</div>
<div class="hero__aside">
<div class="summary-card">
<span>发布时间</span>
<strong>${page.publishedAt}</strong>
</div>
<#if page.tagsText != "暂无标签">
<div class="summary-card">
<span>标签</span>
<strong>${page.tagsText}</strong>
</div>
</#if>
</div>
</section>
<section class="panel tabs-panel">
<div class="tabs-nav" role="tablist" aria-label="溯源页面内容切换">
<button class="tab-btn active" data-tab-target="timeline-panel" type="button">溯源链</button>
<button class="tab-btn" data-tab-target="public-panel" type="button">公开资料</button>
<button class="tab-btn" data-tab-target="feedback-panel" type="button">反馈投诉</button>
</div>
<div id="timeline-panel" class="tab-panel active">
<#if page.businessSections?size gt 0>
<div class="timeline">
<#list page.businessSections as section>
<article class="timeline-item">
<div class="timeline-item__rail">
<span class="dot"></span>
<span class="line"></span>
</div>
<div class="timeline-item__body">
<div class="timeline-item__head">
<div>
<h3>${section.name}</h3>
<p>${section.description}</p>
</div>
</div>
<div class="kv-grid">
<#list section.entries as entry>
<div class="kv-card">
<span>${entry.label}</span>
<#if entry.type == "image" && entry.value?has_content && entry.value != "未填写">
<img class="kv-image" src="${entry.value}" alt="${entry.label}" />
<#else>
<strong<#if entry.bold || entry.color?has_content> style="<#if entry.bold>font-weight:700;</#if><#if entry.color?has_content>color:${entry.color};</#if>"</#if>>${entry.value}</strong>
</#if>
</div>
</#list>
</div>
</div>
</article>
</#list>
</div>
<#else>
<div class="empty-state">当前批次还没有可展示的业务流程节点。</div>
</#if>
</div>
<div id="public-panel" class="tab-panel">
<#if page.publicSections?size gt 0>
<div class="public-grid">
<#list page.publicSections as section>
<article class="info-card">
<div class="info-card__head">
<h3>${section.name}</h3>
</div>
<p class="info-card__desc">${section.description}</p>
<div class="kv-grid">
<#list section.entries as entry>
<div class="kv-card">
<span>${entry.label}</span>
<#if entry.type == "image" && entry.value?has_content && entry.value != "未填写">
<img class="kv-image" src="${entry.value}" alt="${entry.label}" />
<#else>
<strong<#if entry.bold || entry.color?has_content> style="<#if entry.bold>font-weight:700;</#if><#if entry.color?has_content>color:${entry.color};</#if>"</#if>>${entry.value}</strong>
</#if>
</div>
</#list>
</div>
</article>
</#list>
</div>
<#else>
<div class="empty-state">当前批次还没有可展示的公开资料。</div>
</#if>
</div>
<div id="feedback-panel" class="tab-panel">
<div class="panel__head">
<div>
<h2>反馈投诉</h2>
<p>如发现信息异常、商品质量问题,或有建议,可直接提交。</p>
</div>
</div>
<#if feedbackMessage?has_content>
<div class="notice">${feedbackMessage}</div>
</#if>
<form class="feedback-form" method="post" action="/feedback">
<input type="hidden" name="batchCode" value="${page.code}" />
<div class="form-grid">
<label class="form-item">
<span>反馈类型</span>
<select name="type">
<option value="complaint">投诉</option>
<option value="suggestion">建议</option>
<option value="consult">咨询</option>
</select>
</label>
<label class="form-item">
<span>满意度</span>
<select name="rating">
<option value="5">5 分</option>
<option value="4">4 分</option>
<option value="3">3 分</option>
<option value="2">2 分</option>
<option value="1">1 分</option>
</select>
</label>
<label class="form-item">
<span>联系方式</span>
<input name="contact" placeholder="手机号 / 邮箱 / 微信" />
</label>
</div>
<label class="form-item form-item--full">
<span>反馈内容</span>
<textarea name="content" placeholder="请填写你要反馈的问题或建议" required></textarea>
</label>
<button type="submit" class="submit-btn">提交反馈</button>
</form>
</div>
</section>
<footer class="page-footer">
技术支持:四川主干信息技术有限公司 BBITCN Co.,Ltd
</footer>
</div>
<script>
const tabButtons = document.querySelectorAll('.tab-btn');
const tabPanels = document.querySelectorAll('.tab-panel');
tabButtons.forEach((button) => {
button.addEventListener('click', () => {
const targetId = button.dataset.tabTarget;
tabButtons.forEach((item) => item.classList.remove('active'));
tabPanels.forEach((panel) => panel.classList.remove('active'));
button.classList.add('active');
document.getElementById(targetId)?.classList.add('active');
});
});
if (window.location.search.includes('result=')) {
const nextUrl = window.location.pathname + window.location.hash;
window.history.replaceState({}, '', nextUrl);
}
</script>
</body>
</html>