{{template "header" .}} <div class="sub-title">- {{ .Title }} -</div> <style> /* 页面初始化 */ div#page { background: none; border: 0; padding: 0; } [data-theme=dark] #twikoo .tk-content, #twikoo .tk-content { padding: 0; background: transparent; } .talk_item, .tk-expand, .tk-comments-container>.tk-comment, .tk-submit:nth-child(1){ background: var(--card-bg); border: 1px solid #e0e3ed; box-shadow: 0 5px 10px rgb(189 189 189 / 10%); transition: all .3s ease-in-out; border-radius: 12px; } .talk_item:hover, .tk-comments-container>.tk-comment:hover, .tk-submit:nth-child(1):hover { border-color: var(--primary,#673ab7);; } .tk-submit { padding: 20px 10px 0; } .tk-comments-container>.tk-comment { padding: 15px; } /* 页面初始化结束 */ #talk{ margin-top: 1rem; } #talk .loading { /*vertical-align: middle;*/ display: flex; align-items: center; justify-content: center; flex-direction: column; margin: 0 auto; width: 100px; height: 100px; border-radius: 8px; background-color:var(--primary,#673ab7); } #talk .loading img { height: 60px; width: 60px; } .talk_item { display: flex; flex-direction: column; padding: 20px; margin-bottom: 15px; } .avatar { margin: 0 !important; width: 60px; height: 60px; border-radius: 10px; } .talk_bottom, .talk_meta { display: flex; align-items: center; width: 100%; line-height: 1.5; } .talk_bottom{ justify-content: space-between; } .info { display: flex; flex-direction: column; margin-left: 10px; } span.talk_nick { color: #6dbdc3; font-size: 1.2rem; } svg.is-badge.icon { width: 15px; margin-left: 5px; padding-top: 3px; } span.talk_date { opacity: .6; } .talk_content { line-height: 1.5; margin-top: 10px; } .zone_imgbox { display: flex; flex-wrap: wrap; --w: calc(25% - 8px); gap: 10px; margin-top: 5px; } .zone_imgbox a { display: block; border-radius: 12px; width: var(--w); aspect-ratio: 1/1; position: relative; } .zone_imgbox img { width: 100%; height: 100%; margin: 0 !important; object-fit: cover; } /* 底部 */ .talk_bottom { opacity: .9; } .talk_bottom .icon { color: var(--primary,#673ab7); float: right; transition: all .3s; } .talk_bottom .icon:hover { color: #49b1f5; } span.talk_tag{ font-size: 14px; } .talk_content>a { margin: 0 3px; color: #ff7d73 !important; } .talk_content>a:hover{ text-decoration: none !important; color: #ff5143 !important } /* 提醒 */ .limit { transition: all .3s ease-in-out; color: rgba(76, 73, 72, 0.6); } [data-theme=dark] .limit { color: rgba(255, 255, 255, 0.5); } .limit { display: none; text-align: center; margin-top: 20px; color: var(--primary,#673ab7); } @media screen and (max-width: 900px) { .zone_imgbox { --w: calc(33% - 5px); } #talk{ margin: 10px 3px 0 } #post-comment{ margin: 0 3px } } @media screen and (max-width: 768px) { .zone_imgbox { gap: 6px; } .zone_imgbox { --w: calc(50% - 3px); } span.talk_date { font-size: 14px; } } </style> <div id="talk"> <div class='loading'><img src="/public/img/loading.svg" alt="加载中..."> <a>加载中...</a> </div> </div> <div class="limit">- 只展示最近30条说说 -</div> <script> function Format(item) { let date = getTime(new Date(item.createdTs * 1000).toString()), content = item.content, imgs = content.match(/!\[.*\]\(.*?\)/g), musics = content.match(/{\s*music\s*(.*)\s*}/g), videos = content.match(/{\s*bilibili\s*(.*)\s*}/g); if (imgs) imgs = imgs.map(item => { return item.replace(/!\[.*\]\((.*?)\)/, '$1') }) if (item.resourceList.length) { if (!imgs) imgs = [] item.resourceList.forEach(t => { if (t.externalLink) imgs.push(t.externalLink) else imgs.push(`${url}/o/r/${t.id}/${t.publicId}/${t.filename}`) }) } content = content.replace(/#(.*?)\s/g, '').replace(/{.*}/g, '').replace(/\!\[(.*?)\]\((.*?)\)/g, '').replace(/```/g, '') let text = content.replace(/\[(.*?)\]\((.*?)\)/g, '[链接]').trim(); content = content.replace(/\[(.*?)\]\((.*?)\)/g, `<a href="$2">@$1</a>`); if (imgs) { content += `<div class="zone_imgbox">` imgs.forEach(e => content += `<a href="${e}" data-fancybox="gallery" class="fancybox" data-thumb="${e}"><img class="no-lazyload talk-img" src="${e}"></a>`) content += '</div>' } if (musics) musics.forEach(item => { content += `<meting-js auto="${item.replace(/{\s*music\s*(.*)\s*}/, '$1')}" theme="var(--leonus-main)" preload="metadata"></meting-js>` }) if (videos) videos.forEach(item => { content += `<div style="position: relative; padding: 30% 45%;margin-top: 10px;margin-bottom: 10px"><iframe style="position: absolute; width: 100%; height: 100%; left: 0; top: 0;" src="//player.bilibili.com/player.html?autoplay=0&bvid=${item.replace(/{\s*bilibili\s*(.*)\s*}/, '$1').replace(/.*video\/([^\/]*).*/, '$1')}" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe></div>` }) return {content, date, text} } function getTime(time) { var nol = function (h) { return h > 9 ? h : '0' + h } var now = new Date() var yesterday = new Date(now.getTime() - (1000 * 60 * 60 * 24)).toLocaleDateString() var twoDaysAgo = new Date(now.getTime() - 2 * (1000 * 60 * 60 * 24)).toLocaleDateString() let d = new Date(time), ls = [d.getFullYear(), nol(d.getMonth() + 1), nol(d.getDate()), nol(d.getHours()), nol(d.getMinutes()), nol(d.getSeconds())], day = d.toLocaleDateString() if (day === now.toLocaleDateString()) { return '今天 ' + ls[3] + ':' + ls[4] } else if (day === yesterday) { return '昨天 ' + ls[3] + ':' + ls[4] } else if (day === twoDaysAgo) { return '前天 ' + ls[3] + ':' + ls[4] } else { if (now.getFullYear() == ls[0]) return ls[1] + '月' + ls[2] + '日 ' + ls[3] + ':' + ls[4] else return ls[0] + '年' + ls[1] + '月' + ls[2] + '日 ' + ls[3] + ':' + ls[4] } } fetch('{{ .Data.url }}/api/v1/memo?creatorId={{ .Data.user }}&tag={{ .Data.tag }}&limit=30').then(res => res.json()).then(data => { let items = [], html = '' data.forEach(item => { items.push(Format(item)) }) if (items.length == 30) document.querySelector('.limit').style.display = 'block' items.forEach(item => { html += `<div class="talk_item"><div class="talk_meta"><img class="no-lightbox no-lazyload avatar" src="https://q1.qlogo.cn/g?b=qq&nk={{ .Data.qq }}&s=5"><div class="info"><span class="talk_nick">Leonus</span><span class="talk_date">${item.date}</span></div><a href="javascript:;" class="goComment" onclick="goComment('${item.text}')"><span class="icon"><i class="fa-solid fa-message fa-fw"></i></span></a></div><div class="talk_content">${item.content}</div></div>` }) document.getElementById('talk').innerHTML = html imgStatus.watch('.talk-img', () => { waterfall('#talk') }) }) </script> <script defer src="https://cdn.jsdelivr.net/gh/jkjoy/14e/js/waterfall.min.js"></script> <script defer src="https://cdn.jsdelivr.net/gh/jkjoy/14e/js/imgStatus.min.js"></script> {{template "footer" .}}