77 lines
4.1 KiB
HTML
77 lines
4.1 KiB
HTML
<!DOCTYPE html>
|
||
<html xmlns:th="http://www.thymeleaf.org" lang="zh-CN">
|
||
<head th:replace="~{${themeBase} + '/fragments/head' :: head}"></head>
|
||
<body th:classappend="${themeParams['decoration'] == 'plain'} ? 'decor-plain'">
|
||
<header th:replace="~{${themeBase} + '/fragments/header' :: header}"></header>
|
||
|
||
<main class="list-main" th:classappend="${sideNav != null} ? 'has-sidenav'">
|
||
<!-- 左侧栏目导航(docs/11):模块有二级子栏目时展示"模块名 + 全部兄弟" -->
|
||
<aside class="side-nav" th:if="${sideNav != null}" aria-label="栏目导航">
|
||
<div class="side-nav-head" th:text="${sideNav.top.name}">模块名</div>
|
||
<ul class="side-nav-list">
|
||
<li class="side-nav-item" th:each="item : ${sideNav.items}"
|
||
th:classappend="${item.id == sideNav.activeId} ? 'active'">
|
||
<a th:if="${item.type == 3}" th:href="${item.linkUrl}" target="_blank" rel="noopener"
|
||
th:text="${item.name}">子栏目</a>
|
||
<a th:unless="${item.type == 3}" th:href="${url.category(item.id)}" th:text="${item.name}">子栏目</a>
|
||
</li>
|
||
</ul>
|
||
</aside>
|
||
<div class="list-body">
|
||
<nav class="breadcrumb" th:if="${searchMode != true}">
|
||
<a th:href="${url.home()}">首页</a>
|
||
<th:block th:each="node, st : ${categoryPath}">
|
||
<a th:if="${!st.last}" class="crumb-parent" th:href="${url.category(node.id)}"
|
||
th:text="${node.name}">父栏目</a>
|
||
<span th:if="${st.last}" th:text="${node.name}">栏目</span>
|
||
</th:block>
|
||
</nav>
|
||
<nav class="breadcrumb" th:if="${searchMode == true}">
|
||
<a th:href="${url.home()}">首页</a>
|
||
<span>搜索结果</span>
|
||
</nav>
|
||
|
||
<h1 class="page-title" th:if="${searchMode != true}" th:text="${category.name}">栏目名</h1>
|
||
<h1 class="page-title" th:if="${searchMode == true}" th:text="'搜索:' + ${q}">搜索词</h1>
|
||
|
||
<ul class="article-list" th:classappend="${themeParams['listLayout'] == 'list'} ? 'is-list'">
|
||
<li th:each="item : ${listData.items}">
|
||
<a class="item-card" th:href="${url.article(item.id)}">
|
||
<!-- 封面(契约 §3.3 listData.items[].coverImage;上传图走 url.upload) -->
|
||
<span class="item-cover" th:if="${item.coverImage != null and !#strings.isEmpty(item.coverImage)}">
|
||
<img th:src="${url.upload(item.coverImage)}" th:alt="${item.title}" loading="lazy">
|
||
</span>
|
||
<span class="item-body">
|
||
<span class="item-title" th:text="${item.title}">文章标题</span>
|
||
<span class="item-summary" th:if="${!#strings.isEmpty(item.summary)}" th:text="${item.summary}">摘要</span>
|
||
<span class="item-meta">
|
||
<time th:if="${item.publishTime != null}"
|
||
th:text="${#temporals.format(item.publishTime, 'yyyy-MM-dd')}">2026-01-01</time>
|
||
<span class="top-badge" th:if="${item.topmost == 1}">置顶</span>
|
||
</span>
|
||
</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
<p class="empty" th:if="${#lists.isEmpty(listData.items)}">暂无内容</p>
|
||
|
||
<!-- 分页(列表页/搜索页共用) -->
|
||
<nav class="pagination" th:if="${listData.totalPages > 1}"
|
||
th:with="cur=${listData.page}, total=${listData.totalPages}">
|
||
<a th:if="${cur > 1}"
|
||
th:href="${searchMode == true} ? ${url.search(q, cur - 1)} : ${url.category(listData.categoryId) + '?page=' + (cur - 1)}">上一页</a>
|
||
<a th:each="p : ${#numbers.sequence(1, total)}"
|
||
th:classappend="${p == cur} ? 'active'"
|
||
th:href="${searchMode == true} ? ${url.search(q, p)} : ${url.category(listData.categoryId) + '?page=' + p}"
|
||
th:text="${p}">1</a>
|
||
<a th:if="${cur < total}"
|
||
th:href="${searchMode == true} ? ${url.search(q, cur + 1)} : ${url.category(listData.categoryId) + '?page=' + (cur + 1)}">下一页</a>
|
||
</nav>
|
||
</div>
|
||
</main>
|
||
|
||
<footer th:replace="~{${themeBase} + '/fragments/footer' :: footer}"></footer>
|
||
<script th:src="${url.asset('js/main.js')}"></script>
|
||
</body>
|
||
</html>
|