feat: icon fix

This commit is contained in:
tim
2025-07-06 20:56:00 +08:00
parent 8c79b095c7
commit e86449eebe
2 changed files with 45 additions and 15 deletions

View File

@@ -57,14 +57,14 @@
<div class="article-item-description main-item">{{ sanitizeDescription(article.description) }}</div> <div class="article-item-description main-item">{{ sanitizeDescription(article.description) }}</div>
<div class="article-info-container main-item"> <div class="article-info-container main-item">
<div class="article-info-item"> <div class="article-info-item">
<i class="fas fa-user"></i> <img class="article-info-item-img" :src="article.category.smallIcon" alt="category">
<div class="article-info-item-text">{{ article.category }}</div> <div class="article-info-item-text">{{ article.category.name }}</div>
</div> </div>
<div class="article-tags-container"> <div class="article-tags-container">
<div class="article-tag-item" v-for="tag in article.tags" :key="tag"> <div class="article-info-item" v-for="tag in article.tags" :key="tag">
<i class="fas fa-tag"></i> <img class="article-info-item-img" :src="tag.smallIcon" alt="tag">
<div class="article-tag-item-text">{{ tag }}</div> <div class="article-info-item-text">{{ tag.name }}</div>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -1,18 +1,21 @@
<template> <template>
<div class="post-page-container"> <div class="post-page-container">
<div class="post-page-main-container" ref="mainContainer" @scroll="onScroll"> <div v-if="isWaitingFetchingPost" class="loading-container">
<l-hatch size="28" stroke="4" speed="3.5" color="var(--primary-color)"></l-hatch>
</div>
<div v-else class="post-page-main-container" ref="mainContainer" @scroll="onScroll">
<div class="article-title-container"> <div class="article-title-container">
<div class="article-title">{{ title }}</div> <div class="article-title">{{ title }}</div>
<div class="article-info-container"> <div class="article-info-container">
<div class="article-info-item"> <div class="article-info-item">
<i class="fas fa-user"></i> <img class="article-info-item-img" :src="category.smallIcon" alt="category">
<div class="article-info-item-text">开发调优</div> <div class="article-info-item-text">{{ category.name }}</div>
</div> </div>
<div class="article-tags-container"> <div class="article-tags-container">
<div class="article-tag-item" v-for="tag in tags" :key="tag"> <div class="article-info-item" v-for="tag in tags" :key="tag">
<i class="fas fa-tag"></i> <img class="article-info-item-img" :src="tag.smallIcon" alt="tag">
<div class="article-tag-item-text">{{ tag }}</div> <div class="article-info-item-text">{{ tag.name }}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -71,13 +74,15 @@
<div class="post-page-scroller-container"> <div class="post-page-scroller-container">
<div class="scroller"> <div class="scroller">
<div class="scroller-time">{{ postTime }}</div> <div v-if="isWaitingFetchingPost" class="scroller-time">loading...</div>
<div v-else class="scroller-time">{{ postTime }}</div>
<div class="scroller-middle"> <div class="scroller-middle">
<input type="range" class="scroller-range" :max="totalPosts" :min="1" v-model.number="currentIndex" <input type="range" class="scroller-range" :max="totalPosts" :min="1" v-model.number="currentIndex"
@input="onSliderInput" /> @input="onSliderInput" />
<div class="scroller-index">{{ currentIndex }}/{{ totalPosts }}</div> <div class="scroller-index">{{ currentIndex }}/{{ totalPosts }}</div>
</div> </div>
<div class="scroller-time">{{ lastReplyTime }}</div> <div v-if="isWaitingFetchingPost" class="scroller-time">loading...</div>
<div v-else class="scroller-time">{{ lastReplyTime }}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -91,6 +96,8 @@ import CommentEditor from '../components/CommentEditor.vue'
import { renderMarkdown } from '../utils/markdown' import { renderMarkdown } from '../utils/markdown'
import { API_BASE_URL, toast } from '../main' import { API_BASE_URL, toast } from '../main'
import { getToken } from '../utils/auth' import { getToken } from '../utils/auth'
import { hatch } from 'ldrs'
hatch.register()
export default { export default {
name: 'PostPageView', name: 'PostPageView',
@@ -101,8 +108,10 @@ export default {
const title = ref('') const title = ref('')
const postContent = ref('') const postContent = ref('')
const category = ref('')
const tags = ref([]) const tags = ref([])
const comments = ref([]) const comments = ref([])
const isWaitingFetchingPost = ref(false);
const postTime = ref('') const postTime = ref('')
const postItems = ref([]) const postItems = ref([])
const mainContainer = ref(null) const mainContainer = ref(null)
@@ -119,11 +128,14 @@ export default {
const fetchPost = async () => { const fetchPost = async () => {
try { try {
isWaitingFetchingPost.value = true;
const res = await fetch(`${API_BASE_URL}/api/posts/${postId}`) const res = await fetch(`${API_BASE_URL}/api/posts/${postId}`)
isWaitingFetchingPost.value = false;
if (!res.ok) return if (!res.ok) return
const data = await res.json() const data = await res.json()
postContent.value = data.content postContent.value = data.content
title.value = data.title title.value = data.title
category.value = data.category
tags.value = data.tags || [] tags.value = data.tags || []
comments.value = (data.comments || []).map(mapComment) comments.value = (data.comments || []).map(mapComment)
postTime.value = new Date(data.createdAt).toLocaleDateString('zh-CN', { month: 'numeric', day: 'numeric' }) postTime.value = new Date(data.createdAt).toLocaleDateString('zh-CN', { month: 'numeric', day: 'numeric' })
@@ -201,6 +213,7 @@ export default {
return { return {
postContent, postContent,
title, title,
category,
tags, tags,
comments, comments,
postTime, postTime,
@@ -213,7 +226,8 @@ export default {
onSliderInput, onSliderInput,
onScroll: updateCurrentIndex, onScroll: updateCurrentIndex,
copyPostLink, copyPostLink,
renderMarkdown renderMarkdown,
isWaitingFetchingPost
} }
} }
} }
@@ -225,6 +239,14 @@ export default {
height: calc(100vh - var(--header-height)); height: calc(100vh - var(--header-height));
} }
.loading-container {
display: flex;
justify-content: center;
align-items: center;
height: 200px;
width: 85%;
}
.post-page-main-container { .post-page-main-container {
overflow-y: auto; overflow-y: auto;
scrollbar-width: none; scrollbar-width: none;
@@ -334,11 +356,19 @@ export default {
gap: 10px; gap: 10px;
} }
.article-tag-item { .article-info-item {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
gap: 5px; gap: 5px;
align-items: center; align-items: center;
font-size: 14px;
padding: 2px 4px;
background-color: #f0f0f0;
}
.article-info-item-img {
width: 16px;
height: 16px;
} }
.info-content-container { .info-content-container {