适配日记簿
This commit is contained in:
@@ -5,17 +5,17 @@
|
||||
|
||||
<div class="posts_cat_nav">
|
||||
<ul id="cat_nav_items">
|
||||
<li><a th:data="|${path}?preview-theme=theme-pix|" class="active">全部<span></span></a>
|
||||
<li><a th:data="${path}" class="active">全部<span></span></a>
|
||||
</li>
|
||||
<li th:if="${theme.config.post.post_nav == 'category'}" th:each="categoryItem,iStat : ${categoryFinder.listAll()}">
|
||||
<a th:data="|${categoryItem.status.permalink}?preview-theme=theme-pix|"
|
||||
<a th:data="${categoryItem.status.permalink}"
|
||||
class="">[[${categoryItem.spec.displayName}]]<span></span></a>
|
||||
</li>
|
||||
<li th:if="${theme.config.post.post_nav == 'custom_category'}"
|
||||
th:each="category : ${theme.config.post.nav_category}">
|
||||
<th:block th:with="categoryItem = ${categoryFinder.getByName(category)}">
|
||||
<a th:if="${categoryItem!=null}"
|
||||
th:data="|${categoryItem.status.permalink}?preview-theme=theme-pix|"
|
||||
th:data="${categoryItem.status.permalink}"
|
||||
class="">[[${categoryItem.spec.displayName}]]<span></span>
|
||||
</a>
|
||||
</th:block>
|
||||
@@ -31,7 +31,7 @@
|
||||
<th:block th:if="${_posts.totalPages>1}">
|
||||
<div id="pagination">
|
||||
<div class="post-paging" th:if="${_posts.hasNext()}"
|
||||
th:with="_page = ${_posts.page+1},_path = ${path == '/archives' ? path+'?preview-theme=theme-pix&page='+_page : path +'page/'+_page+'?preview-theme=theme-pix' }">
|
||||
th:with="_page = ${_posts.page+1},_path = ${path == '/archives' ? path+'?page='+_page : path +'page/'+_page }">
|
||||
<a th:data="${_path}" th:text="${theme.config.base_set.site_page}"></a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,39 +1,39 @@
|
||||
<th:block th:fragment="home-moment(_moments,tags)">
|
||||
|
||||
<div class="blog_list">
|
||||
<div class="blog_list_inner" uk-height-viewport="offset-top: true">
|
||||
<div class="moment_cat_nav">
|
||||
<ul id="cat_nav_items">
|
||||
<li><a data="/moments?preview-theme=theme-pix" class="" th:classappend="${#lists.isEmpty(param.tag) ? 'active' : ''}"
|
||||
><span>全部</span></a>
|
||||
</li>
|
||||
<li th:each="tag,iStat : ${tags}">
|
||||
<a th:data="|/moments?preview-theme=theme-pix&tag=${tag.name}|" class=""
|
||||
th:classappend="${#lists.contains(param.tag, tag.name) ? 'active' : ''}"
|
||||
><span>[[${tag.name}]]</span></a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="post_item" class="moment_list">
|
||||
|
||||
<th:block th:replace="~{macro/tpl/content-moment :: content-moment(${_moments.items})}"></th:block>
|
||||
|
||||
<th:block th:if="${#lists.isEmpty(_moments.items)}">
|
||||
<th:block th:replace="~{macro/tpl/content-none}"/>
|
||||
</th:block>
|
||||
|
||||
</div>
|
||||
<th:block th:if="${_moments.totalPages>1}">
|
||||
<div id="t_pagination">
|
||||
<div class="post-paging" th:if="${_moments.hasNext()}"
|
||||
th:with="tag = ${not #lists.isEmpty(param.tag) ? '?tag='+param.tag : ''},_page = ${_moments.page+1}">
|
||||
<a th:data="${'/moments/page/'+_page+tag+'?preview-theme=theme-pix'}" th:text="${theme.config.base_set.site_page}"></a>
|
||||
</div>
|
||||
</div>
|
||||
</th:block>
|
||||
|
||||
<div id="comment_form_reset"></div>
|
||||
</div>
|
||||
</div>
|
||||
<th:block th:fragment="home-moment(_moments,tags)">
|
||||
|
||||
<div class="blog_list">
|
||||
<div class="blog_list_inner" uk-height-viewport="offset-top: true">
|
||||
<div class="moment_cat_nav">
|
||||
<ul id="cat_nav_items">
|
||||
<li><a data="/moments" class="" th:classappend="${#lists.isEmpty(param.tag) ? 'active' : ''}"
|
||||
><span>全部</span></a>
|
||||
</li>
|
||||
<li th:each="tag,iStat : ${tags}">
|
||||
<a th:data="|/moments?tag=${tag.name}|" class=""
|
||||
th:classappend="${#lists.contains(param.tag, tag.name) ? 'active' : ''}"
|
||||
><span>[[${tag.name}]]</span></a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="post_item" class="moment_list">
|
||||
|
||||
<th:block th:replace="~{macro/tpl/content-moment :: content-moment(${_moments.items})}"></th:block>
|
||||
|
||||
<th:block th:if="${#lists.isEmpty(_moments.items)}">
|
||||
<th:block th:replace="~{macro/tpl/content-none}"/>
|
||||
</th:block>
|
||||
|
||||
</div>
|
||||
<th:block th:if="${_moments.totalPages>1}">
|
||||
<div id="t_pagination">
|
||||
<div class="post-paging" th:if="${_moments.hasNext()}"
|
||||
th:with="tag = ${not #lists.isEmpty(param.tag) ? '?tag='+param.tag : ''},_page = ${_moments.page+1}">
|
||||
<a th:data="${'/moments/page/'+_page+tag}" th:text="${theme.config.base_set.site_page}"></a>
|
||||
</div>
|
||||
</div>
|
||||
</th:block>
|
||||
|
||||
<div id="comment_form_reset"></div>
|
||||
</div>
|
||||
</div>
|
||||
</th:block>
|
||||
@@ -1,52 +1,52 @@
|
||||
<div th:id="${'post-'+post.metadata.name}"
|
||||
class="loop_content p_item uk-animation-slide-bottom-small" th:classappend="${post.spec.pinned ? 'sticky' :''}">
|
||||
<div class="normal_item_inner">
|
||||
<div class="normal_card_content">
|
||||
<div class="feature round12">
|
||||
<a th:href="@{${post.status.permalink}}"
|
||||
th:with="cover_img=${#strings.contains(theme.config.post.post_banner,'http') ? ((#strings.contains(theme.config.post.post_banner,'?') ? theme.config.post.post_banner : theme.config.post.post_banner+'?')+','+post.spec.title): theme.config.post.post_banner}">
|
||||
<img class="round12 shadow lazy"
|
||||
th:with="_cover = ${#strings.isEmpty(post.spec.cover) ? cover_img : thumbnail.gen(post.spec.cover, 's')}"
|
||||
th:data-src="${_cover}" alt="">
|
||||
</a>
|
||||
</div>
|
||||
<div class="card_right">
|
||||
<div class="entry-content">
|
||||
<h2 class="entry-title"><a th:href="@{${post.status.permalink}}" rel="bookmark">[[${post.spec.title}]]</a></h2>
|
||||
<div class="entry_meta">
|
||||
<span class="nickname">@[[${post.owner.displayName}]]</span> - <time itemprop="datePublished"
|
||||
th:datetime="${#dates.format(post.spec.publishTime, 'yyyy-MM-dd HH:mm')}">
|
||||
<th:block th:replace="~{modules/widgets/time :: time(${post.spec.publishTime})}"></th:block></time>
|
||||
</div>
|
||||
<th:block th:if="${not #strings.isEmpty(post.status.excerpt)}">
|
||||
<p th:with="post_word_max = ${#conversions.convert(theme.config.post.post_word_max, 'java.lang.Integer') >= 0 ? theme.config.post.post_word_max : 100 },
|
||||
excerpt = ${#strings.length(post.status.excerpt) > #conversions.convert(post_word_max, 'java.lang.Integer') ? post_word_max : #strings.length(post.status.excerpt)}">
|
||||
[[${#strings.substring(post.status.excerpt,0,excerpt)+'...'}]]
|
||||
</p>
|
||||
</th:block>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="entry-footer">
|
||||
<div class="post_footer_meta">
|
||||
<div class="left">
|
||||
<span class="post_views"><i class="ri-eye-line"></i>[[${post.stats.visit}]]</span>
|
||||
<span class="comnum"><i class="ri-chat-4-line"></i><small>[[${post.stats.comment}]]</small></span>
|
||||
<a class="up_like " data-action="up" data-key="post" th:data-id="${post.metadata.name}">
|
||||
<i class="ri-heart-2-line"></i>
|
||||
<span>[[${post.stats.upvote}]]</span>
|
||||
</a>
|
||||
</div>
|
||||
<div class="right">
|
||||
<span th:if="${post.spec.pinned}" class="sticky_icon"><i class="ri-fire-line"></i> TOP</span>
|
||||
<th:block th:if="${not #lists.isEmpty(post.categories)}">
|
||||
<div class="normal_cat"># [[${post.categories[0].spec.displayName}]]</div>
|
||||
</th:block>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div th:id="${'post-'+post.metadata.name}"
|
||||
class="loop_content p_item uk-animation-slide-bottom-small" th:classappend="${post.spec.pinned ? 'sticky' :''}">
|
||||
<div class="normal_item_inner">
|
||||
<div class="normal_card_content">
|
||||
<div class="feature round12">
|
||||
<a th:href="@{${post.status.permalink}}"
|
||||
th:with="cover_img=${#strings.contains(theme.config.post.post_banner,'http') ? ((#strings.contains(theme.config.post.post_banner,'?') ? theme.config.post.post_banner : theme.config.post.post_banner+'?')+','+post.spec.title): theme.config.post.post_banner}">
|
||||
<img class="round12 shadow lazy"
|
||||
th:with="_cover = ${#strings.isEmpty(post.spec.cover) ? cover_img : thumbnail.gen(post.spec.cover, 's')}"
|
||||
th:data-src="${_cover}" alt="">
|
||||
</a>
|
||||
</div>
|
||||
<div class="card_right">
|
||||
<div class="entry-content">
|
||||
<h2 class="entry-title"><a th:href="@{${post.status.permalink}}" rel="bookmark">[[${post.spec.title}]]</a></h2>
|
||||
<div class="entry_meta">
|
||||
<span class="nickname">@[[${post.owner.displayName}]]</span> - <time itemprop="datePublished"
|
||||
th:datetime="${#dates.format(post.spec.publishTime, 'yyyy-MM-dd HH:mm')}">
|
||||
<th:block th:replace="~{modules/widgets/time :: time(${post.spec.publishTime})}"></th:block></time>
|
||||
</div>
|
||||
<th:block th:if="${not #strings.isEmpty(post.status.excerpt)}">
|
||||
<p th:with="post_word_max = ${#conversions.convert(theme.config.post.post_word_max, 'java.lang.Integer') >= 0 ? theme.config.post.post_word_max : 100 },
|
||||
excerpt = ${#strings.length(post.status.excerpt) > #conversions.convert(post_word_max, 'java.lang.Integer') ? post_word_max : #strings.length(post.status.excerpt)}">
|
||||
[[${#strings.substring(post.status.excerpt,0,excerpt)+'...'}]]
|
||||
</p>
|
||||
</th:block>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="entry-footer">
|
||||
<div class="post_footer_meta">
|
||||
<div class="left">
|
||||
<span class="post_views"><i class="ri-eye-line"></i>[[${post.stats.visit}]]</span>
|
||||
<span class="comnum"><i class="ri-chat-4-line"></i>[[${post.stats.comment}]]</span>
|
||||
<a class="up_like " data-action="up" data-key="post" th:data-id="${post.metadata.name}">
|
||||
<i class="ri-heart-2-line"></i>
|
||||
<span>[[${post.stats.upvote}]]</span>
|
||||
</a>
|
||||
</div>
|
||||
<div class="right">
|
||||
<span th:if="${post.spec.pinned}" class="sticky_icon"><i class="ri-fire-line"></i> TOP</span>
|
||||
<th:block th:if="${not #lists.isEmpty(post.categories)}">
|
||||
<div class="normal_cat"># [[${post.categories[0].spec.displayName}]]</div>
|
||||
</th:block>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,50 +1,50 @@
|
||||
<div class="uk-width-1-2@l uk-width-1-1@m">
|
||||
<div th:id="${'post-'+post.metadata.name}" class="loop_content p_item grid_item uk-animation-slide-bottom-small"
|
||||
th:classappend="${post.spec.pinned ? 'sticky' :''}">
|
||||
<div class="normal_item_inner">
|
||||
<div class="normal_grid_content">
|
||||
<div class="entry-content">
|
||||
<h2 class="entry-title"><a th:href="@{${post.status.permalink}}" rel="bookmark">[[${post.spec.title}]]</a></h2>
|
||||
<div class="entry_meta">
|
||||
<span class="nickname">@[[${post.owner.displayName}]]
|
||||
</span> - <time itemprop="datePublished" th:datetime="${#dates.format(post.spec.publishTime, 'yyyy-MM-dd HH:mm')}">
|
||||
<th:block th:replace="~{modules/widgets/time :: time(${post.spec.publishTime})}"></th:block>
|
||||
</time>
|
||||
</div>
|
||||
|
||||
<div class="feature round12">
|
||||
<a th:href="@{${post.status.permalink}}"
|
||||
th:with="cover_img=${#strings.contains(theme.config.post.post_banner,'http') ? ((#strings.contains(theme.config.post.post_banner,'?') ? theme.config.post.post_banner : theme.config.post.post_banner+'?')+','+post.spec.title): theme.config.post.post_banner}">
|
||||
<img class="round12 shadow lazy"
|
||||
th:with="_cover = ${#strings.isEmpty(post.spec.cover) ? cover_img : thumbnail.gen(post.spec.cover, 's')}"
|
||||
th:data-src="${_cover}" alt="">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="entry-footer">
|
||||
<div class="post_footer_meta">
|
||||
<div class="left">
|
||||
<span class="post_views"><i class="ri-eye-line"></i>
|
||||
[[${post.stats.visit}]]
|
||||
</span>
|
||||
<span class="comnum"><i class="ri-chat-4-line"></i>
|
||||
<small> [[${post.stats.comment}]] </small>
|
||||
</span>
|
||||
<a class="up_like " data-action="up" data-key="post" th:data-id="${post.metadata.name}">
|
||||
<i class="ri-heart-2-line"></i>
|
||||
<span>[[${post.stats.upvote}]]</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="right">
|
||||
<span th:if="${post.spec.pinned}" class="sticky_icon"><i class="ri-fire-line"></i> TOP</span>
|
||||
<th:block th:if="${not #lists.isEmpty(post.categories)}">
|
||||
<div class="normal_cat"># [[${post.categories[0].spec.displayName}]]</div>
|
||||
</th:block>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="uk-width-1-2@l uk-width-1-1@m">
|
||||
<div th:id="${'post-'+post.metadata.name}" class="loop_content p_item grid_item uk-animation-slide-bottom-small"
|
||||
th:classappend="${post.spec.pinned ? 'sticky' :''}">
|
||||
<div class="normal_item_inner">
|
||||
<div class="normal_grid_content">
|
||||
<div class="entry-content">
|
||||
<h2 class="entry-title"><a th:href="@{${post.status.permalink}}" rel="bookmark">[[${post.spec.title}]]</a></h2>
|
||||
<div class="entry_meta">
|
||||
<span class="nickname">@[[${post.owner.displayName}]]
|
||||
</span> - <time itemprop="datePublished" th:datetime="${#dates.format(post.spec.publishTime, 'yyyy-MM-dd HH:mm')}">
|
||||
<th:block th:replace="~{modules/widgets/time :: time(${post.spec.publishTime})}"></th:block>
|
||||
</time>
|
||||
</div>
|
||||
|
||||
<div class="feature round12">
|
||||
<a th:href="@{${post.status.permalink}}"
|
||||
th:with="cover_img=${#strings.contains(theme.config.post.post_banner,'http') ? ((#strings.contains(theme.config.post.post_banner,'?') ? theme.config.post.post_banner : theme.config.post.post_banner+'?')+','+post.spec.title): theme.config.post.post_banner}">
|
||||
<img class="round12 shadow lazy"
|
||||
th:with="_cover = ${#strings.isEmpty(post.spec.cover) ? cover_img : thumbnail.gen(post.spec.cover, 's')}"
|
||||
th:data-src="${_cover}" alt="">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="entry-footer">
|
||||
<div class="post_footer_meta">
|
||||
<div class="left">
|
||||
<span class="post_views"><i class="ri-eye-line"></i>
|
||||
[[${post.stats.visit}]]
|
||||
</span>
|
||||
<span class="comnum"><i class="ri-chat-4-line"></i>
|
||||
<small>[[${post.stats.comment}]]</small>
|
||||
</span>
|
||||
<a class="up_like " data-action="up" data-key="post" th:data-id="${post.metadata.name}">
|
||||
<i class="ri-heart-2-line"></i>
|
||||
<span>[[${post.stats.upvote}]]</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="right">
|
||||
<span th:if="${post.spec.pinned}" class="sticky_icon"><i class="ri-fire-line"></i> TOP</span>
|
||||
<th:block th:if="${not #lists.isEmpty(post.categories)}">
|
||||
<div class="normal_cat"># [[${post.categories[0].spec.displayName}]]</div>
|
||||
</th:block>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,103 +1,116 @@
|
||||
<th:block th:fragment="content-moment(moments)">
|
||||
|
||||
<div th:each="moment,iStat : ${moments}" th:id="${'post-'+moment.metadata.name}"
|
||||
class="loop_content p_item moment_item">
|
||||
<div class="p_item_inner">
|
||||
<div th:if="${roleName == 'super-role' || moment.owner.name == user.name}" class="post_control">
|
||||
<a class="post_control_btn"><i class="ri-menu-3-line"></i></a>
|
||||
<div class="post_control_box">
|
||||
<div class="post_control_list round8 shadow uk-animation-slide-bottom-small uk-animation-fast"
|
||||
th:pid="${moment.metadata.name}">
|
||||
<a class="control_edit_post control_type" uk-toggle="target: #create_post_box">编辑瞬间</a>
|
||||
<a class="control_delete_post control_type">删除瞬间</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="list_user_meta">
|
||||
<div class="avatar">
|
||||
<img th:src="@{${moment.owner.avatar}}">
|
||||
</div>
|
||||
<div class="name">
|
||||
[[${moment.owner.displayName}]]
|
||||
<time itemprop="datePublished"
|
||||
th:datetime="${#dates.format(moment.spec.releaseTime, 'yyyy-MM-dd HH:mm')}">
|
||||
<th:block th:replace="~{modules/widgets/time :: time(${moment.spec.releaseTime})}"></th:block>
|
||||
</time>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="blog_content">
|
||||
<div class="entry-content" th:with="content=${moment.spec.content}">
|
||||
<div class="p_title"></div>
|
||||
<div class="t_content" th:utext="${content.html}">
|
||||
<th:block th:utext="${content.html}"></th:block>
|
||||
</div>
|
||||
<th:block th:replace="~{'macro/tpl/moment-medium'}" />
|
||||
</div>
|
||||
<span class="ip_loca" th:if="${not #strings.isEmpty(moment.metadata.annotations.mylocal)}">
|
||||
<i class="ri-map-pin-2-line"></i>
|
||||
[[${moment.metadata.annotations.mylocal}]]
|
||||
</span>
|
||||
<div class="entry-footer">
|
||||
<div class="post_footer_meta">
|
||||
<div class="left">
|
||||
<a class="up_like " data-action="up" data-key="moment" th:data-id="${moment.metadata.name}">
|
||||
<i class="ri-heart-2-line"></i>
|
||||
<span th:text="${moment.stats.upvote}"></span>
|
||||
</a>
|
||||
<div class="pix_share_btn" th:with="_cover = ${not #strings.isEmpty(theme.config.moments.banner) ? theme.config.moments.banner : '/themes/theme-pix/assets/img/banner.jpg'}">
|
||||
<a class="pix_icon share_btn_icon cr_poster"
|
||||
th:poster-data="${moment.metadata.name}"
|
||||
th:banner = "${_cover}"
|
||||
th:uk-toggle="|target: #share_modal_${moment.metadata.name}|"
|
||||
uk-tooltip="title: 瞬间分享; pos: top;" tabindex="0" title=""
|
||||
aria-describedby="uk-tooltip-250" aria-expanded="false"><i
|
||||
class="ri-share-forward-box-line"></i></a>
|
||||
<div th:id="|share_modal_${moment.metadata.name}|" class="uk-flex-top poster_modal uk-modal"
|
||||
uk-modal>
|
||||
<div class="uk-modal-dialog uk-modal-body uk-margin-auto-vertical">
|
||||
<button class="uk-modal-close-outside uk-icon uk-close"
|
||||
type="button" uk-close></button>
|
||||
<div class="poster_box_ap"></div>
|
||||
<div class="post_share_box hide">
|
||||
<a th:onclick="handleShare('wb','[(${_cover})]','[(${site.title+'-瞬间'})]','[(${'/moments/'+moment.metadata.name})]')"
|
||||
uk-tooltip="title: 微博分享; pos: top;" target="_blank">
|
||||
<i class="ri-weibo-line"></i></a>
|
||||
<a th:onclick="handleShare('qzone','[(${_cover})]','[(${site.title+'-瞬间'})]','[(${'/moments/'+moment.metadata.name})]')"
|
||||
uk-tooltip="title: QQ分享; pos: top;" target="_blank">
|
||||
<i class="ri-chrome-line"></i>
|
||||
</a>
|
||||
<a th:onclick="handleShare('qq','[(${_cover})]','[(${site.title+'-瞬间'})]','[(${'/moments/'+moment.metadata.name})]')"
|
||||
uk-tooltip="title: QQ好友分享; pos: top;" target="_blank">
|
||||
<i class="ri-qq-line"></i>
|
||||
</a>
|
||||
<a th:onclick="handleShare('copy','','','[(${'/moments/'+moment.metadata.name})]')"
|
||||
uk-tooltip="title: 复制链接; pos: top;">
|
||||
<i class="ri-file-copy-line"></i>
|
||||
</a>
|
||||
<a class="poster_download" uk-tooltip="title: 下载海报; pos: top;">
|
||||
<i class="ri-download-line"></i></a>
|
||||
</div>
|
||||
<img id="twoCode" style="display: none;" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right" th:if="${(not theme.config.com.com_close) && haloCommentEnabled}">
|
||||
<span class="comnum show_comment" th:pid="${moment.metadata.name}"><i
|
||||
class="ri-message-3-line"></i>[[${moment.stats.totalComment}]]</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div th:if="${(not theme.config.com.com_close) && haloCommentEnabled}" th:id="${'halo-comment-'+moment.metadata.name}" class="topic_comments_wrap" style="display: none">
|
||||
<div class="topic_comments comments comments-area" data="moment">
|
||||
<div class="toi_comments_main halo-comment">
|
||||
<th:block th:replace="~{modules/widgets/halo-comment :: halo-comment(name=${moment.metadata.name},kind='Moment',group='moment.halo.run')}"></th:block>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<th:block th:fragment="content-moment(moments)">
|
||||
<div th:each="moment,iStat : ${moments}" th:id="${'post-'+moment.metadata.name}"
|
||||
class="loop_content p_item moment_item">
|
||||
<div class="p_item_inner">
|
||||
<!-- 帖子控制按钮(编辑/删除) -->
|
||||
<div th:if="${roleName == 'super-role' || moment.owner.name == user.name}" class="post_control">
|
||||
<a class="post_control_btn"><i class="ri-menu-3-line"></i></a>
|
||||
<div class="post_control_box">
|
||||
<div class="post_control_list round8 shadow uk-animation-slide-bottom-small uk-animation-fast"
|
||||
th:pid="${moment.metadata.name}">
|
||||
<a class="control_edit_post control_type" uk-toggle="target: #create_post_box">编辑瞬间</a>
|
||||
<a class="control_delete_post control_type">删除瞬间</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 用户信息(头像/名称/时间) -->
|
||||
<div class="list_user_meta">
|
||||
<div class="avatar">
|
||||
<img th:src="@{${moment.owner.avatar}}">
|
||||
</div>
|
||||
<div class="name">
|
||||
[[${moment.owner.displayName}]]
|
||||
<time itemprop="datePublished"
|
||||
th:datetime="${#dates.format(moment.spec.releaseTime, 'yyyy-MM-dd HH:mm')}">
|
||||
<th:block th:replace="~{modules/widgets/time :: time(${moment.spec.releaseTime})}"></th:block>
|
||||
</time>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 内容区域 -->
|
||||
<div class="blog_content">
|
||||
<div class="entry-content" th:with="content=${moment.spec.content}">
|
||||
<div class="p_title"></div>
|
||||
<!-- 内容容器(仅新增moment-collapse-container类) -->
|
||||
<div class="t_content moment-collapse-container" th:utext="${content.html}">
|
||||
<th:block th:utext="${content.html}"></th:block>
|
||||
</div>
|
||||
<th:block th:replace="~{'macro/tpl/moment-medium'}" />
|
||||
</div>
|
||||
<!-- IP地址显示 -->
|
||||
<span class="ip_loca" th:if="${not #strings.isEmpty(moment.metadata.annotations.mylocal)}">
|
||||
<i class="ri-map-pin-2-line"></i>
|
||||
[[${moment.metadata.annotations.mylocal}]]
|
||||
</span>
|
||||
<!-- 底部操作栏 -->
|
||||
<div class="entry-footer">
|
||||
<div class="post_footer_meta">
|
||||
<!-- 左侧(点赞/分享) -->
|
||||
<div class="left">
|
||||
<a class="up_like " data-action="up" data-key="moment" th:data-id="${moment.metadata.name}">
|
||||
<i class="ri-heart-2-line"></i>
|
||||
<span th:text="${moment.stats.upvote}"></span>
|
||||
</a>
|
||||
<div class="pix_share_btn"
|
||||
th:with="_cover = ${not #strings.isEmpty(theme.config.moments.banner) ? theme.config.moments.banner : '/themes/theme-pix/assets/img/banner.jpg'}">
|
||||
<a class="pix_icon share_btn_icon cr_poster" th:poster-data="${moment.metadata.name}"
|
||||
th:banner="${_cover}" th:uk-toggle="|target: #share_modal_${moment.metadata.name}|"
|
||||
uk-tooltip="title: 瞬间分享; pos: top;" tabindex="0" title=""
|
||||
aria-describedby="uk-tooltip-250" aria-expanded="false"><i
|
||||
class="ri-share-forward-box-line"></i></a>
|
||||
<div th:id="|share_modal_${moment.metadata.name}|"
|
||||
class="uk-flex-top poster_modal uk-modal" uk-modal>
|
||||
<div class="uk-modal-dialog uk-modal-body uk-margin-auto-vertical">
|
||||
<button class="uk-modal-close-outside uk-icon uk-close" type="button"
|
||||
uk-close></button>
|
||||
<div class="poster_box_ap"></div>
|
||||
<div class="post_share_box hide">
|
||||
<a th:onclick="handleShare('wb','[(${_cover})]','[(${site.title+'-瞬间'})]','[(${'/moments/'+moment.metadata.name})]')"
|
||||
uk-tooltip="title: 微博分享; pos: top;" target="_blank">
|
||||
<i class="ri-weibo-line"></i></a>
|
||||
<a th:onclick="handleShare('qzone','[(${_cover})]','[(${site.title+'-瞬间'})]','[(${'/moments/'+moment.metadata.name})]')"
|
||||
uk-tooltip="title: QQ分享; pos: top;" target="_blank">
|
||||
<i class="ri-chrome-line"></i>
|
||||
</a>
|
||||
<a th:onclick="handleShare('qq','[(${_cover})]','[(${site.title+'-瞬间'})]','[(${'/moments/'+moment.metadata.name})]')"
|
||||
uk-tooltip="title: QQ好友分享; pos: top;" target="_blank">
|
||||
<i class="ri-qq-line"></i>
|
||||
</a>
|
||||
<a th:onclick="handleShare('copy','','','[(${'/moments/'+moment.metadata.name})]')"
|
||||
uk-tooltip="title: 复制链接; pos: top;">
|
||||
<i class="ri-file-copy-line"></i>
|
||||
</a>
|
||||
<a class="poster_download" uk-tooltip="title: 下载海报; pos: top;">
|
||||
<i class="ri-download-line"></i></a>
|
||||
</div>
|
||||
<img id="twoCode" style="display: none;" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 右侧(评论数 + 新增标签显示) -->
|
||||
<div class="right" th:if="${(not theme.config.com.com_close) && haloCommentEnabled}">
|
||||
<!-- 新增:标签显示(样式与分类一致) -->
|
||||
<th:block th:if="${not #lists.isEmpty(moment.spec.tags)}">
|
||||
<div class="normal_cat"># [[${moment.spec.tags[0]}]]</div>
|
||||
</th:block>
|
||||
<span class="moment_tag_gap"></span>
|
||||
<span class="comnum show_comment" th:pid="${moment.metadata.name}"><i
|
||||
class="ri-message-3-line"></i>[[${moment.stats.totalComment}]]</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 评论区 -->
|
||||
<div th:if="${(not theme.config.com.com_close) && haloCommentEnabled}"
|
||||
th:id="${'halo-comment-'+moment.metadata.name}" class="topic_comments_wrap" style="display: none">
|
||||
<div class="topic_comments comments comments-area" data="moment">
|
||||
<div class="toi_comments_main halo-comment">
|
||||
<th:block
|
||||
th:replace="~{modules/widgets/halo-comment :: halo-comment(name=${moment.metadata.name},kind='Moment',group='moment.halo.run')}">
|
||||
</th:block>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</th:block>
|
||||
@@ -1,5 +1,5 @@
|
||||
<section class="no-results not-found">
|
||||
<div class="page-content no_resault">
|
||||
<img src="/themes/theme-pix/assets/img/nodata.png">
|
||||
</div>
|
||||
<section class="no-results not-found">
|
||||
<div class="page-content no_resault">
|
||||
<img src="/upload/nodata.png">
|
||||
</div>
|
||||
</section>
|
||||
@@ -1,54 +1,52 @@
|
||||
<div th:id="${'post-'+post.metadata.name}"
|
||||
class="loop_content p_item uk-animation-slide-bottom-small" th:classappend="${post.spec.pinned ? 'sticky' :''}">
|
||||
<div class="normal_item_inner">
|
||||
<div class="normal_content">
|
||||
<div class="entry-content">
|
||||
<h2 class="entry-title"><a th:href="@{${post.status.permalink}}" rel="bookmark">[[${post.spec.title}]]</a></h2>
|
||||
<div class="entry_meta">
|
||||
<span class="nickname">@[[${post.owner.displayName}]]
|
||||
</span> - <time itemprop="datePublished" th:datetime="${#dates.format(post.spec.publishTime, 'yyyy-MM-dd HH:mm')}">
|
||||
<th:block th:replace="~{modules/widgets/time :: time(${post.spec.publishTime})}"></th:block>
|
||||
</time>
|
||||
</div>
|
||||
<th:block th:if="${not #strings.isEmpty(post.status.excerpt)}">
|
||||
<p th:with="post_word_max = ${#conversions.convert(theme.config.post.post_word_max, 'java.lang.Integer') >= 0 ? theme.config.post.post_word_max : 100 },
|
||||
excerpt = ${#strings.length(post.status.excerpt) > #conversions.convert(post_word_max, 'java.lang.Integer') ? post_word_max : #strings.length(post.status.excerpt)}">
|
||||
[[${#strings.substring(post.status.excerpt,0,excerpt)+'...'}]]
|
||||
</p>
|
||||
</th:block>
|
||||
<div class="feature round12">
|
||||
<a th:href="@{${post.status.permalink}}"
|
||||
th:with="cover_img=${#strings.contains(theme.config.post.post_banner,'http') ? ((#strings.contains(theme.config.post.post_banner,'?') ? theme.config.post.post_banner : theme.config.post.post_banner+'?')+','+post.spec.title): theme.config.post.post_banner}">
|
||||
<img class="round12 shadow lazy"
|
||||
th:with="_cover = ${#strings.isEmpty(post.spec.cover) ? cover_img : thumbnail.gen(post.spec.cover, 'm')}"
|
||||
th:src="@{/assets/img/lazyload.png}"
|
||||
th:data-src="${_cover}" alt="">
|
||||
</a>
|
||||
</div>
|
||||
</div><!-- .entry-content -->
|
||||
<div class="entry-footer">
|
||||
<div class="post_footer_meta">
|
||||
<div class="left">
|
||||
<span class="post_views"><i class="ri-eye-line"></i>
|
||||
[[${post.stats.visit}]]
|
||||
</span>
|
||||
<span class="comnum"><i class="ri-chat-4-line"></i>
|
||||
<small> [[${post.stats.comment}]] </small>
|
||||
</span>
|
||||
<a class="up_like " data-key="post" data-action="up" th:data-id="${post.metadata.name}">
|
||||
<i class="ri-heart-2-line"></i>
|
||||
<span>[[${post.stats.upvote}]]</span>
|
||||
</a>
|
||||
</div>
|
||||
<div class="right">
|
||||
<span th:if="${post.spec.pinned}" class="sticky_icon"><i class="ri-fire-line"></i> TOP</span>
|
||||
<th:block th:if="${not #lists.isEmpty(post.categories)}">
|
||||
<div class="normal_cat"># [[${post.categories[0].spec.displayName}]]</div>
|
||||
</th:block>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- .entry-footer -->
|
||||
</div>
|
||||
</div>
|
||||
<div th:id="${'post-'+post.metadata.name}"
|
||||
class="loop_content p_item uk-animation-slide-bottom-small" th:classappend="${post.spec.pinned ? 'sticky' :''}">
|
||||
<div class="normal_item_inner">
|
||||
<div class="normal_card_content">
|
||||
<div class="feature round12">
|
||||
<a th:href="@{${post.status.permalink}}"
|
||||
th:with="cover_img=${#strings.contains(theme.config.post.post_banner,'http') ? ((#strings.contains(theme.config.post.post_banner,'?') ? theme.config.post.post_banner : theme.config.post.post_banner+'?')+','+post.spec.title): theme.config.post.post_banner}">
|
||||
<img class="round12 shadow lazy"
|
||||
th:with="_cover = ${#strings.isEmpty(post.spec.cover) ? cover_img : thumbnail.gen(post.spec.cover, 's')}"
|
||||
th:data-src="${_cover}" alt="">
|
||||
</a>
|
||||
</div>
|
||||
<div class="card_right">
|
||||
<div class="entry-content">
|
||||
<h2 class="entry-title"><a th:href="@{${post.status.permalink}}" rel="bookmark">[[${post.spec.title}]]</a></h2>
|
||||
<div class="entry_meta">
|
||||
<span class="nickname">@[[${post.owner.displayName}]]</span> - <time itemprop="datePublished"
|
||||
th:datetime="${#dates.format(post.spec.publishTime, 'yyyy-MM-dd HH:mm')}">
|
||||
<th:block th:replace="~{modules/widgets/time :: time(${post.spec.publishTime})}"></th:block></time>
|
||||
</div>
|
||||
<th:block th:if="${not #strings.isEmpty(post.status.excerpt)}">
|
||||
<p th:with="post_word_max = ${#conversions.convert(theme.config.post.post_word_max, 'java.lang.Integer') >= 0 ? theme.config.post.post_word_max : 100 },
|
||||
excerpt = ${#strings.length(post.status.excerpt) > #conversions.convert(post_word_max, 'java.lang.Integer') ? post_word_max : #strings.length(post.status.excerpt)}">
|
||||
[[${#strings.substring(post.status.excerpt,0,excerpt)+'...'}]]
|
||||
</p>
|
||||
</th:block>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="entry-footer">
|
||||
<div class="post_footer_meta">
|
||||
<div class="left">
|
||||
<span class="post_views"><i class="ri-eye-line"></i>[[${post.stats.visit}]]</span>
|
||||
<span class="comnum"><i class="ri-chat-4-line"></i><small>[[${post.stats.comment}]]</small></span>
|
||||
<a class="up_like " data-action="up" data-key="post" th:data-id="${post.metadata.name}">
|
||||
<i class="ri-heart-2-line"></i>
|
||||
<span>[[${post.stats.upvote}]]</span>
|
||||
</a>
|
||||
</div>
|
||||
<div class="right">
|
||||
<span th:if="${post.spec.pinned}" class="sticky_icon"><i class="ri-fire-line"></i> TOP</span>
|
||||
<th:block th:if="${not #lists.isEmpty(post.categories)}">
|
||||
<div class="normal_cat"># [[${post.categories[0].spec.displayName}]]</div>
|
||||
</th:block>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,43 +1,43 @@
|
||||
<div th:id="${'post-'+post.metadata.name}"
|
||||
class="loop_content p_item uk-animation-slide-bottom-small" th:classappend="${post.spec.pinned ? 'sticky' :''}">
|
||||
<div class="normal_item_inner">
|
||||
<div class="normal_card_content">
|
||||
<div class="card_right">
|
||||
<div class="entry-content">
|
||||
<h2 class="entry-title"><a th:href="@{${post.status.permalink}}" rel="bookmark">[[${post.spec.title}]]</a></h2>
|
||||
<div class="entry_meta">
|
||||
<span class="nickname">@[[${post.owner.displayName}]]</span> - <time itemprop="datePublished"
|
||||
th:datetime="${#dates.format(post.spec.publishTime, 'yyyy-MM-dd HH:mm')}">
|
||||
<th:block th:replace="~{modules/widgets/time :: time(${post.spec.publishTime})}"></th:block></time>
|
||||
</div>
|
||||
<th:block th:if="${not #strings.isEmpty(post.status.excerpt)}">
|
||||
<p style="display: block" th:with="post_word_max = ${#conversions.convert(theme.config.post.post_word_max, 'java.lang.Integer') >= 0 ? theme.config.post.post_word_max : 100 },
|
||||
excerpt = ${#strings.length(post.status.excerpt) > #conversions.convert(post_word_max, 'java.lang.Integer') ? post_word_max : #strings.length(post.status.excerpt)}">
|
||||
[[${#strings.substring(post.status.excerpt,0,excerpt)+'...'}]]
|
||||
</p>
|
||||
</th:block>
|
||||
</div>
|
||||
|
||||
<div class="entry-footer">
|
||||
<div class="post_footer_meta">
|
||||
<div class="left">
|
||||
<span class="post_views"><i class="ri-eye-line"></i>[[${post.stats.visit}]]</span>
|
||||
<span class="comnum"><i class="ri-chat-4-line"></i><small>[[${post.stats.comment}]]</small></span>
|
||||
<a class="up_like " data-action="up" data-key="post" th:data-id="${post.metadata.name}">
|
||||
<i class="ri-heart-2-line"></i>
|
||||
<span>[[${post.stats.upvote}]]</span>
|
||||
</a>
|
||||
</div>
|
||||
<div class="right">
|
||||
<span th:if="${post.spec.pinned}" class="sticky_icon"><i class="ri-fire-line"></i> TOP</span>
|
||||
<th:block th:if="${not #lists.isEmpty(post.categories)}">
|
||||
<div class="normal_cat"># [[${post.categories[0].spec.displayName}]]</div>
|
||||
</th:block>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div th:id="${'post-'+post.metadata.name}"
|
||||
class="loop_content p_item uk-animation-slide-bottom-small" th:classappend="${post.spec.pinned ? 'sticky' :''}">
|
||||
<div class="normal_item_inner">
|
||||
<div class="normal_card_content">
|
||||
<div class="card_right">
|
||||
<div class="entry-content">
|
||||
<h2 class="entry-title"><a th:href="@{${post.status.permalink}}" rel="bookmark">[[${post.spec.title}]]</a></h2>
|
||||
<div class="entry_meta">
|
||||
<span class="nickname">@[[${post.owner.displayName}]]</span> - <time itemprop="datePublished"
|
||||
th:datetime="${#dates.format(post.spec.publishTime, 'yyyy-MM-dd HH:mm')}">
|
||||
<th:block th:replace="~{modules/widgets/time :: time(${post.spec.publishTime})}"></th:block></time>
|
||||
</div>
|
||||
<th:block th:if="${not #strings.isEmpty(post.status.excerpt)}">
|
||||
<p style="display: block" th:with="post_word_max = ${#conversions.convert(theme.config.post.post_word_max, 'java.lang.Integer') >= 0 ? theme.config.post.post_word_max : 100 },
|
||||
excerpt = ${#strings.length(post.status.excerpt) > #conversions.convert(post_word_max, 'java.lang.Integer') ? post_word_max : #strings.length(post.status.excerpt)}">
|
||||
[[${#strings.substring(post.status.excerpt,0,excerpt)+'...'}]]
|
||||
</p>
|
||||
</th:block>
|
||||
</div>
|
||||
|
||||
<div class="entry-footer">
|
||||
<div class="post_footer_meta">
|
||||
<div class="left">
|
||||
<span class="post_views"><i class="ri-eye-line"></i>[[${post.stats.visit}]]</span>
|
||||
<span class="comnum"><i class="ri-chat-4-line"></i><small>[[${post.stats.comment}]]</small></span>
|
||||
<a class="up_like " data-action="up" data-key="post" th:data-id="${post.metadata.name}">
|
||||
<i class="ri-heart-2-line"></i>
|
||||
<span>[[${post.stats.upvote}]]</span>
|
||||
</a>
|
||||
</div>
|
||||
<div class="right">
|
||||
<span th:if="${post.spec.pinned}" class="sticky_icon"><i class="ri-fire-line"></i> TOP</span>
|
||||
<th:block th:if="${not #lists.isEmpty(post.categories)}">
|
||||
<div class="normal_cat"># [[${post.categories[0].spec.displayName}]]</div>
|
||||
</th:block>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,24 +1,18 @@
|
||||
<article th:id="${'post-'+singlePage.metadata.name}" th:fragment="content-page">
|
||||
<header class="entry-header">
|
||||
<div class="left">
|
||||
<i class="ri-focus-2-line"></i>
|
||||
<h1 class="entry-title" th:text="${singlePage.spec.title}"></h1>
|
||||
</div>
|
||||
<div class="right">
|
||||
<time itemprop="datePublished"
|
||||
th:datetime="${#dates.format(singlePage.spec.publishTime, 'yyyy-MM-dd HH:mm')}">
|
||||
[[${#dates.format(singlePage.spec.publishTime, 'yyyy年MM月dd日')}]]
|
||||
</time>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="entry-content single-content">
|
||||
<th:block th:utext="${singlePage.content.content}"></th:block>
|
||||
</div>
|
||||
|
||||
<div id="comments" th:if="${(not theme.config.com.com_close) && haloCommentEnabled}" class="comments comments-area" data="normal">
|
||||
<div class="halo-comment" >
|
||||
<th:block th:replace="~{modules/widgets/halo-comment :: halo-comment(name=${singlePage.metadata.name},kind='SinglePage',group='content.halo.run')}"></th:block>
|
||||
</div>
|
||||
</div>
|
||||
<article th:id="${'post-'+singlePage.metadata.name}" th:fragment="content-page">
|
||||
<header class="entry-header">
|
||||
<div class="left">
|
||||
<i class="ri-focus-2-line"></i>
|
||||
<h1 class="entry-title" th:text="${singlePage.spec.title}"></h1>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="entry-content single-content">
|
||||
<th:block th:utext="${singlePage.content.content}"></th:block>
|
||||
</div>
|
||||
|
||||
<div id="comments" th:if="${(not theme.config.com.com_close) && haloCommentEnabled}" class="comments comments-area" data="normal">
|
||||
<div class="halo-comment" >
|
||||
<th:block th:replace="~{modules/widgets/halo-comment :: halo-comment(name=${singlePage.metadata.name},kind='SinglePage',group='content.halo.run')}"></th:block>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
@@ -1,147 +1,147 @@
|
||||
<th:block th:fragment="content-single" th:with="mu_on = ${#annotations.get(post, 'mu_on')},plays_id = ${#annotations.get(post, 'plays_id')},
|
||||
cover_img=${#strings.contains(theme.config.post.post_banner,'http') ? ((#strings.contains(theme.config.post.post_banner,'?') ? theme.config.post.post_banner : theme.config.post.post_banner+'?')+','+post.spec.title): theme.config.post.post_banner}
|
||||
,_cover = ${not #strings.isEmpty(post.spec.cover) ? post.spec.cover : cover_img}">
|
||||
|
||||
<div class="blog_header">
|
||||
|
||||
<div th:if="${mu_on == 'true' && not #strings.isEmpty(plays_id)}" class="single_music_header">
|
||||
<div class="mu_img"><img class="round12 shadow lazy" src="/themes/theme-pix/assets/img/lazyload.png" th:data-src="${_cover}" ></div>
|
||||
<div class="right_info">
|
||||
<h2 class="entry-title" th:text="${post.spec.title}"></h2>
|
||||
<div class="header_meta">
|
||||
<span class="single_time">
|
||||
<i class="ri-time-line"></i>
|
||||
<time itemprop="datePublished" th:datetime="${#dates.format(post.spec.publishTime, 'yyyy-MM-dd HH:mm')}">
|
||||
<th:block th:replace="~{modules/widgets/time :: time(${post.spec.publishTime})}"></th:block>
|
||||
</time>
|
||||
</span>
|
||||
<span class="post_views"><i class="ri-eye-line"></i>[[${post.stats.visit}]]</span>
|
||||
<span class="edit_post" th:if="${roleName == 'super-role'}">
|
||||
<a th:href="${'/console/posts/editor?name='+post.metadata.name+'&returnToView=true'}"
|
||||
target="_self">
|
||||
<i class="ri-edit-line"></i>编辑</a>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="single-content_header">
|
||||
<span class="single_cat">
|
||||
<ul class="post-categories">
|
||||
<li th:each="category : ${post.categories}">
|
||||
<a th:href="@{${category.status.permalink}}" th:text="${category.spec.displayName}"
|
||||
th:title="${category.spec.displayName}" rel="category tag"></a>
|
||||
</li>
|
||||
</ul>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="mu_des"><th:block th:utext="${#annotations.get(post, 'mu_des')}"></th:block></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div th:unless="${mu_on == 'true' && not #strings.isEmpty(plays_id)}" class="post_header">
|
||||
<h2 class="entry-title" th:text="${post.spec.title}"></h2>
|
||||
<ul>
|
||||
<div class="header_meta">
|
||||
<span class="single_time">
|
||||
<i class="ri-time-line"></i>
|
||||
<time itemprop="datePublished"
|
||||
th:datetime="${#dates.format(post.spec.publishTime, 'yyyy-MM-dd HH:mm')}">
|
||||
<th:block th:replace="~{modules/widgets/time :: time(${post.spec.publishTime})}"></th:block>
|
||||
</time>
|
||||
</span>
|
||||
<span class="post_views"><i class="ri-eye-line"></i>[[${post.stats.visit}]]</span>
|
||||
<span class="edit_post" th:if="${roleName == 'super-role'}">
|
||||
<a th:href="${'/console/posts/editor?name='+post.metadata.name+'&returnToView=true'}"
|
||||
target="_self">
|
||||
<i class="ri-edit-line"></i>编辑</a>
|
||||
</span>
|
||||
</div>
|
||||
<div class="single-content_header">
|
||||
<span class="single_cat">
|
||||
<ul class="post-categories">
|
||||
<li th:each="category : ${post.categories}">
|
||||
<a th:href="@{${category.status.permalink}}" th:text="${category.spec.displayName}"
|
||||
th:title="${category.spec.displayName}" rel="category tag"></a>
|
||||
</li>
|
||||
</ul>
|
||||
</span>
|
||||
</div>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="single-inner">
|
||||
<th:block th:if="${mu_on == 'true' && not #strings.isEmpty(plays_id)}">
|
||||
<div th:if="${mu_on == 'true' && not #strings.isEmpty(plays_id)}" class="mu_l_title"><i class="ri-play-list-line"></i>歌曲列表</div>
|
||||
<div class="posts_mu_list" th:pid="${post.metadata.name}" th:plays_id="${plays_id}"
|
||||
th:mus_source="${#annotations.get(post, 'mus_source')}"
|
||||
th:mus_type="${#annotations.getOrDefault(post, 'mus_type', 'playlist')}"
|
||||
th:mu_on="${mu_on}"></div>
|
||||
</th:block>
|
||||
<div class="single-content" th:utext="${post.content.content}">
|
||||
</div>
|
||||
<div class="single-footer">
|
||||
<div class="single_footer_box">
|
||||
<a class="up_like " data-action="up" data-key="post" th:data-id="${post.metadata.name}">
|
||||
<i class="ri-heart-2-line"></i>
|
||||
<span>[[${post.stats.upvote}]]</span>
|
||||
</a>
|
||||
|
||||
<div class="pix_share_btn">
|
||||
<a class="pix_icon share_btn_icon cr_poster"
|
||||
th:poster-data="${post.metadata.name}"
|
||||
th:banner = "${_cover}"
|
||||
th:uk-toggle="${'target: #share_modal_'+post.metadata.name}"
|
||||
uk-tooltip="title: 文章分享; pos: top;">
|
||||
<i class="ri-share-line"></i>
|
||||
</a>
|
||||
<div th:id="${'share_modal_'+post.metadata.name}" class="uk-flex-top poster_modal"
|
||||
uk-modal>
|
||||
<div class="uk-modal-dialog uk-modal-body uk-margin-auto-vertical">
|
||||
<button class="uk-modal-close-outside" type="button" uk-close></button>
|
||||
<div class="poster_box_ap"></div>
|
||||
<div class="post_share_box hide">
|
||||
<a
|
||||
th:onclick="handleShare('wb','[(${_cover})]','[(${post.spec.title})]','[(${post.status.permalink})]')"
|
||||
uk-tooltip="title: 微博分享; pos: top;" target="_blank"><i
|
||||
class="ri-weibo-line"></i>
|
||||
</a>
|
||||
<a th:onclick="handleShare('qzone','[(${_cover})]','[(${post.spec.title})]','[(${post.status.permalink})]')"
|
||||
uk-tooltip="title: QQ分享; pos: top;" target="_blank">
|
||||
<i class="ri-chrome-line"></i>
|
||||
</a>
|
||||
<a
|
||||
th:onclick="handleShare('qq','[(${_cover})]','[(${post.spec.title})]','[(${post.status.permalink})]')"
|
||||
uk-tooltip="title: QQ好友分享; pos: top;" target="_blank">
|
||||
<i class="ri-qq-line"></i>
|
||||
</a>
|
||||
<a th:onclick="handleShare('copy','','','[(${post.status.permalink})]')"
|
||||
uk-tooltip="title: 复制链接; pos: top;">
|
||||
<i class="ri-file-copy-line"></i>
|
||||
</a>
|
||||
<a class="poster_download" uk-tooltip="title: 下载海报; pos: top;">
|
||||
<i class="ri-download-line"></i>
|
||||
</a>
|
||||
</div>
|
||||
<img id="twoCode" style="display: none;" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="pix_donate_btn" th:if="${theme.config.post.donate_on}">
|
||||
<a class="pix_icon donate_btn_icon" uk-toggle="target: #donate_modal" uk-tooltip="title: 打赏作者; pos: top;">
|
||||
<i class="ri-gift-2-line"></i>
|
||||
</a>
|
||||
<div id="donate_modal" class="uk-flex-top donate_modal" uk-modal>
|
||||
<div class="uk-modal-dialog uk-modal-body uk-margin-auto-vertical">
|
||||
<button class="uk-modal-close-outside" type="button" uk-close></button>
|
||||
<div class="donate_des" th:text="${theme.config.post.donate_des}"></div>
|
||||
<div class="donate_pic"><img th:src="${theme.config.post.donate_pic}"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<th:block th:fragment="content-single" th:with="mu_on = ${#annotations.get(post, 'mu_on')},plays_id = ${#annotations.get(post, 'plays_id')},
|
||||
cover_img=${#strings.contains(theme.config.post.post_banner,'http') ? ((#strings.contains(theme.config.post.post_banner,'?') ? theme.config.post.post_banner : theme.config.post.post_banner+'?')+','+post.spec.title): theme.config.post.post_banner}
|
||||
,_cover = ${not #strings.isEmpty(post.spec.cover) ? post.spec.cover : cover_img}">
|
||||
|
||||
<div class="blog_header">
|
||||
|
||||
<div th:if="${mu_on == 'true' && not #strings.isEmpty(plays_id)}" class="single_music_header">
|
||||
<div class="mu_img"><img class="round12 shadow lazy" src="/themes/theme-pix/assets/img/lazyload.png" th:data-src="${_cover}" ></div>
|
||||
<div class="right_info">
|
||||
<h2 class="entry-title" th:text="${post.spec.title}"></h2>
|
||||
<div class="header_meta">
|
||||
<span class="single_time">
|
||||
<i class="ri-time-line"></i>
|
||||
<time itemprop="datePublished" th:datetime="${#dates.format(post.spec.publishTime, 'yyyy-MM-dd HH:mm')}">
|
||||
<th:block th:replace="~{modules/widgets/time :: time(${post.spec.publishTime})}"></th:block>
|
||||
</time>
|
||||
</span>
|
||||
<span class="post_views"><i class="ri-eye-line"></i>[[${post.stats.visit}]]</span>
|
||||
<span class="edit_post" th:if="${roleName == 'super-role'}">
|
||||
<a th:href="${'/console/posts/editor?name='+post.metadata.name+'&returnToView=true'}"
|
||||
target="_self">
|
||||
<i class="ri-edit-line"></i>编辑</a>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="single-content_header">
|
||||
<span class="single_cat">
|
||||
<ul class="post-categories">
|
||||
<li th:each="category : ${post.categories}">
|
||||
<a th:href="@{${category.status.permalink}}" th:text="${category.spec.displayName}"
|
||||
th:title="${category.spec.displayName}" rel="category tag"></a>
|
||||
</li>
|
||||
</ul>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="mu_des"><th:block th:utext="${#annotations.get(post, 'mu_des')}"></th:block></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div th:unless="${mu_on == 'true' && not #strings.isEmpty(plays_id)}" class="post_header">
|
||||
<h2 class="entry-title" th:text="${post.spec.title}"></h2>
|
||||
<ul>
|
||||
<div class="header_meta">
|
||||
<span class="single_time">
|
||||
<i class="ri-time-line"></i>
|
||||
<time itemprop="datePublished"
|
||||
th:datetime="${#dates.format(post.spec.publishTime, 'yyyy-MM-dd HH:mm')}">
|
||||
<th:block th:replace="~{modules/widgets/time :: time(${post.spec.publishTime})}"></th:block>
|
||||
</time>
|
||||
</span>
|
||||
<span class="post_views"><i class="ri-eye-line"></i>[[${post.stats.visit}]]</span>
|
||||
<span class="edit_post" th:if="${roleName == 'super-role'}">
|
||||
<a th:href="${'/console/posts/editor?name='+post.metadata.name+'&returnToView=true'}"
|
||||
target="_self">
|
||||
<i class="ri-edit-line"></i>编辑</a>
|
||||
</span>
|
||||
</div>
|
||||
<div class="single-content_header">
|
||||
<span class="single_cat">
|
||||
<ul class="post-categories">
|
||||
<li th:each="category : ${post.categories}">
|
||||
<a th:href="@{${category.status.permalink}}" th:text="${category.spec.displayName}"
|
||||
th:title="${category.spec.displayName}" rel="category tag"></a>
|
||||
</li>
|
||||
</ul>
|
||||
</span>
|
||||
</div>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="single-inner">
|
||||
<th:block th:if="${mu_on == 'true' && not #strings.isEmpty(plays_id)}">
|
||||
<div th:if="${mu_on == 'true' && not #strings.isEmpty(plays_id)}" class="mu_l_title"><i class="ri-play-list-line"></i>歌曲列表</div>
|
||||
<div class="posts_mu_list" th:pid="${post.metadata.name}" th:plays_id="${plays_id}"
|
||||
th:mus_source="${#annotations.get(post, 'mus_source')}"
|
||||
th:mus_type="${#annotations.getOrDefault(post, 'mus_type', 'playlist')}"
|
||||
th:mu_on="${mu_on}"></div>
|
||||
</th:block>
|
||||
<div class="single-content" th:utext="${post.content.content}">
|
||||
</div>
|
||||
<div class="single-footer">
|
||||
<div class="single_footer_box">
|
||||
<a class="up_like " data-action="up" data-key="post" th:data-id="${post.metadata.name}">
|
||||
<i class="ri-heart-2-line"></i>
|
||||
<span>[[${post.stats.upvote}]]</span>
|
||||
</a>
|
||||
|
||||
<div class="pix_share_btn">
|
||||
<a class="pix_icon share_btn_icon cr_poster"
|
||||
th:poster-data="${post.metadata.name}"
|
||||
th:banner = "${_cover}"
|
||||
th:uk-toggle="${'target: #share_modal_'+post.metadata.name}"
|
||||
uk-tooltip="title: 文章分享; pos: top;">
|
||||
<i class="ri-share-line"></i>
|
||||
</a>
|
||||
<div th:id="${'share_modal_'+post.metadata.name}" class="uk-flex-top poster_modal"
|
||||
uk-modal>
|
||||
<div class="uk-modal-dialog uk-modal-body uk-margin-auto-vertical">
|
||||
<button class="uk-modal-close-outside" type="button" uk-close></button>
|
||||
<div class="poster_box_ap"></div>
|
||||
<div class="post_share_box hide">
|
||||
<a
|
||||
th:onclick="handleShare('wb','[(${_cover})]','[(${post.spec.title})]','[(${post.status.permalink})]')"
|
||||
uk-tooltip="title: 微博分享; pos: top;" target="_blank"><i
|
||||
class="ri-weibo-line"></i>
|
||||
</a>
|
||||
<a th:onclick="handleShare('qzone','[(${_cover})]','[(${post.spec.title})]','[(${post.status.permalink})]')"
|
||||
uk-tooltip="title: QQ分享; pos: top;" target="_blank">
|
||||
<i class="ri-chrome-line"></i>
|
||||
</a>
|
||||
<a
|
||||
th:onclick="handleShare('qq','[(${_cover})]','[(${post.spec.title})]','[(${post.status.permalink})]')"
|
||||
uk-tooltip="title: QQ好友分享; pos: top;" target="_blank">
|
||||
<i class="ri-qq-line"></i>
|
||||
</a>
|
||||
<a th:onclick="handleShare('copy','','','[(${post.status.permalink})]')"
|
||||
uk-tooltip="title: 复制链接; pos: top;">
|
||||
<i class="ri-file-copy-line"></i>
|
||||
</a>
|
||||
<a class="poster_download" uk-tooltip="title: 下载海报; pos: top;">
|
||||
<i class="ri-download-line"></i>
|
||||
</a>
|
||||
</div>
|
||||
<img id="twoCode" style="display: none;" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="pix_donate_btn" th:if="${theme.config.post.donate_on}">
|
||||
<a class="pix_icon donate_btn_icon" uk-toggle="target: #donate_modal" uk-tooltip="title: 打赏作者; pos: top;">
|
||||
<i class="ri-gift-2-line"></i>
|
||||
</a>
|
||||
<div id="donate_modal" class="uk-flex-top donate_modal" uk-modal>
|
||||
<div class="uk-modal-dialog uk-modal-body uk-margin-auto-vertical">
|
||||
<button class="uk-modal-close-outside" type="button" uk-close></button>
|
||||
<div class="donate_des" th:text="${theme.config.post.donate_des}"></div>
|
||||
<div class="donate_pic"><img th:src="${theme.config.post.donate_pic}"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</th:block>
|
||||
@@ -1,89 +1,99 @@
|
||||
<th:block th:if="${not #lists.isEmpty(content.medium)}">
|
||||
<div class="img_list" th:if="${#strings.contains(content.medium,'PHOTO')}">
|
||||
<div class="list_inner" th:num="${content.medium.size}">
|
||||
<span th:each="momentItem : ${content.medium}" th:if="${momentItem.type.name == 'PHOTO'}"
|
||||
class="fancybox mo_img" th:href="${momentItem.url}"
|
||||
th:data-fancybox="${'post-images-'+moment.metadata.name}">
|
||||
<img class="lazy" th:src="@{/assets/img/lazyload.png}" th:data-src="${momentItem.url}">
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="video_list" th:if="${#strings.contains(content.medium,'VIDEO')}">
|
||||
<div class="list_inner">
|
||||
<th:block th:each="momentItem : ${content.medium}">
|
||||
<div class="pix_local_player"
|
||||
th:if="${momentItem.type.name == 'VIDEO' && momentItem.originType != 'video/bili'}">
|
||||
<div class="video_play_btn">
|
||||
<a><i class="ri-play-mini-line"></i></a>
|
||||
</div>
|
||||
<video th:src="${momentItem.url}" id="pix_video_player" objectfit="cover" x5-video-player-type="h5"
|
||||
onplay="stopOtherMedia(this)"></video>
|
||||
</div>
|
||||
<div class="pix_bili_player"
|
||||
th:if="${momentItem.type.name == 'VIDEO' && momentItem.originType == 'video/bili'}">
|
||||
<iframe th:src="|//player.bilibili.com/player.html?bvid=${momentItem.url}&autoplay=0&page=1|"
|
||||
scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe>
|
||||
</div>
|
||||
</th:block>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="audio_list" th:if="${#strings.contains(content.medium,'AUDIO')}">
|
||||
<div class="list_inner">
|
||||
<th:block th:each="momentItem : ${content.medium}">
|
||||
<div class="pix_player loacl_audio" th:if="${momentItem.type.name == 'AUDIO' &&
|
||||
(momentItem.originType != 'audio/netease' && momentItem.originType != 'audio/tencent' &&
|
||||
momentItem.originType != 'audio/kugou' && momentItem.originType != 'audio/kuwo')}">
|
||||
<audio th:src="${momentItem.url}" controls></audio>
|
||||
</div>
|
||||
<div class="pix_player qt" th:if="${momentItem.type.name == 'AUDIO' &&
|
||||
(momentItem.originType == 'audio/netease' || momentItem.originType == 'audio/tencent' ||
|
||||
momentItem.originType == 'audio/kugou' || momentItem.originType == 'audio/kuwo')}"
|
||||
th:id="${momentItem.url}"
|
||||
th:type="${momentItem.originType}">
|
||||
</div>
|
||||
</th:block>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="card_list" th:if="${#strings.contains(content.medium,'POST')}">
|
||||
<div class="list_inner">
|
||||
<th:block th:each="momentItem : ${content.medium}">
|
||||
<th:block th:if="${momentItem.type.name == 'POST'}">
|
||||
<div class="moment_card_item loop_card_item" th:pid="${momentItem.url}"
|
||||
th:type="${momentItem.originType}">
|
||||
<th:block th:if="${momentItem.originType == 'post'}">
|
||||
<a th:with="post = ${postFinder.getByName(momentItem.url)}"
|
||||
th:href="@{${post.status.permalink}}" target="_blank">
|
||||
<div class="left"><img th:src="${post.spec.cover}"></div>
|
||||
<div class="right">
|
||||
<h4 th:text="${post.spec.title}"></h4>
|
||||
<div class="content">
|
||||
<th:block th:if="${!post.spec.excerpt.autoGenerate}"
|
||||
th:text="${post.spec.excerpt.raw}" />
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
</th:block>
|
||||
<th:block th:if="${momentItem.originType == 'page'}">
|
||||
<a th:with="page = ${singlePageFinder.getByName(momentItem.url)}"
|
||||
th:href="@{${page.status.permalink}}" target="_blank">
|
||||
<div class="left"><img th:src="${page.spec.cover}"></div>
|
||||
<div class="right">
|
||||
<h4 th:text="${page.spec.title}"></h4>
|
||||
<div class="content">
|
||||
<th:block th:if="${!page.spec.excerpt.autoGenerate}"
|
||||
th:text="${page.spec.excerpt.raw}" />
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
</th:block>
|
||||
|
||||
</div>
|
||||
</th:block>
|
||||
|
||||
</th:block>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<th:block th:if="${not #lists.isEmpty(content.medium)}">
|
||||
|
||||
<div class="img_list">
|
||||
<div class="list_inner" th:num="${content.medium.size}">
|
||||
<th:block th:each="momentItem : ${content.medium}">
|
||||
|
||||
<th:block th:with="isStrictVideo=${momentItem.type.name == 'VIDEO'},
|
||||
isVideoExt=${#strings.endsWith(#strings.toLowerCase(momentItem.url), '.mp4')
|
||||
|| #strings.endsWith(#strings.toLowerCase(momentItem.url), '.webm')
|
||||
|| #strings.endsWith(#strings.toLowerCase(momentItem.url), '.ogv')}">
|
||||
|
||||
<div class="pix_bili_player" th:if="${isStrictVideo && momentItem.originType == 'video/bili'}">
|
||||
<iframe th:src="|//player.bilibili.com/player.html?bvid=${momentItem.url}&autoplay=0&page=1|"
|
||||
scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe>
|
||||
</div>
|
||||
|
||||
<!-- 非 Bilibili 视频:使用 Fancybox 灯箱 -->
|
||||
<span th:if="${(isStrictVideo || isVideoExt) && momentItem.originType != 'video/bili'}"
|
||||
class="fancybox mo_img" th:href="${momentItem.url}"
|
||||
th:data-fancybox="${'post-images-' + moment.metadata.name}" th:data-type="video">
|
||||
<video th:src="${momentItem.url}" class="pix_video"
|
||||
style="width:100%; border-radius:8px;"></video>
|
||||
<div
|
||||
style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); pointer-events: none;">
|
||||
<i class="ri-play-circle-line"
|
||||
style="color: #41b87e; font-size: 40px; background-color: rgba(255, 255, 255, 0.8); border-radius: 50%;"></i>
|
||||
</div>
|
||||
</span>
|
||||
|
||||
<span th:if="${momentItem.type.name == 'PHOTO' && !isVideoExt}" class="fancybox mo_img"
|
||||
th:href="${momentItem.url}" th:data-fancybox="${'post-images-' + moment.metadata.name}">
|
||||
<img class="lazy" th:src="@{/assets/img/lazyload.png}" th:data-src="${momentItem.url}">
|
||||
</span>
|
||||
|
||||
</th:block>
|
||||
|
||||
</th:block>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="audio_list" th:if="${#strings.contains(content.medium,'AUDIO')}">
|
||||
<div class="list_inner">
|
||||
<th:block th:each="momentItem : ${content.medium}">
|
||||
<div class="pix_player loacl_audio" th:if="${momentItem.type.name == 'AUDIO' &&
|
||||
(momentItem.originType != 'audio/netease' && momentItem.originType != 'audio/tencent' &&
|
||||
momentItem.originType != 'audio/kugou' && momentItem.originType != 'audio/kuwo')}">
|
||||
<audio th:src="${momentItem.url}" controls></audio>
|
||||
</div>
|
||||
<div class="pix_player qt" th:if="${momentItem.type.name == 'AUDIO' &&
|
||||
(momentItem.originType == 'audio/netease' || momentItem.originType == 'audio/tencent' ||
|
||||
momentItem.originType == 'audio/kugou' || momentItem.originType == 'audio/kuwo')}"
|
||||
th:id="${momentItem.url}" th:type="${momentItem.originType}">
|
||||
</div>
|
||||
</th:block>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="card_list" th:if="${#strings.contains(content.medium,'POST')}">
|
||||
<div class="list_inner">
|
||||
<th:block th:each="momentItem : ${content.medium}">
|
||||
<th:block th:if="${momentItem.type.name == 'POST'}">
|
||||
<div class="moment_card_item loop_card_item" th:pid="${momentItem.url}"
|
||||
th:type="${momentItem.originType}">
|
||||
<th:block th:if="${momentItem.originType == 'post'}">
|
||||
<a th:with="post = ${postFinder.getByName(momentItem.url)}"
|
||||
th:href="@{${post.status.permalink}}">
|
||||
<div class="left"><img th:src="${post.spec.cover}"></div>
|
||||
<div class="right">
|
||||
<h4 th:text="${post.spec.title}"></h4>
|
||||
<div class="content">
|
||||
<th:block th:if="${!post.spec.excerpt.autoGenerate}"
|
||||
th:text="${post.spec.excerpt.raw}" />
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
</th:block>
|
||||
<th:block th:if="${momentItem.originType == 'page'}">
|
||||
<a th:with="page = ${singlePageFinder.getByName(momentItem.url)}"
|
||||
th:href="@{${page.status.permalink}}" target="_blank">
|
||||
<div class="left"><img th:src="${page.spec.cover}"></div>
|
||||
<div class="right">
|
||||
<h4 th:text="${page.spec.title}"></h4>
|
||||
<div class="content">
|
||||
<th:block th:if="${!page.spec.excerpt.autoGenerate}"
|
||||
th:text="${page.spec.excerpt.raw}" />
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
</th:block>
|
||||
|
||||
</div>
|
||||
</th:block>
|
||||
|
||||
</th:block>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</th:block>
|
||||
Reference in New Issue
Block a user