refactor(组件): 重构链接处理并优化样式结构

- 将硬编码的详情页链接改为通过item.url统一管理
- 将评论区域的div改为可点击的a标签
- 调整图标容器的样式结构,增加定位和尺寸控制
- 修复标签过滤逻辑,避免空值导致的错误
This commit is contained in:
DESKTOP-RQ919RC\Pc
2025-11-06 19:19:59 +08:00
parent 3365e5ee0a
commit 5c199bb8fe
7 changed files with 33 additions and 14 deletions

View File

@@ -120,5 +120,5 @@ export const itemBottom = defineComponent({
like,
},
template: `<div class="comment flexacenter" v-if="item?.commentreviews && !Array.isArray(item?.commentreviews)"> <img class="icon" :src="item?.commentreviews?.avatar" /> <div class="text one-line-display">{{ item?.commentreviews?.content || "[图]" }}</div></div><template v-if="item.comment_list?.length != 0"> <div class="comment flexacenter" style="margin-bottom: 15px" v-for="(item, index) in item.comment_list" :key="index"> <img class="icon" :src="item.avatar" /> <div class="text one-line-display">{{ item.content || "[图]" }}</div> </div></template><div class="bottom flexacenter"> <div class="bottom-item like flexacenter" @click="likeClick()" v-if="item?.type != 'tenement'"> <img v-if="item.is_like" class="icon" src="/img/like-red-icon.png" /> <img v-else class="icon" src="/img/like-icon.png" /> <div class="text">{{ item.likes || "赞" }}</div> </div> <div class="bottom-item flexacenter" @click="collectClick()"> <img v-if="item.is_collect" class="icon" src="/img/collect-golden.svg" /> <img v-else class="icon" src="/img/collect-gray.png" /> <div class="text">{{ item.collections || "收藏" }}</div> </div> <a class="bottom-item flexacenter" v-if="item?.type != 'tenement'" :href="'/details/' + item.uniqid" target="_blank"> <img class="icon" src="/img/discuss-icon.png" /> <div class="text">{{ item.comments || "讨论" }}</div> </a> <a class="bottom-item flexacenter" v-if="item?.type != 'tenement'" :href="'/details/' + item.uniqid" target="_blank"> <img class="icon" src="/img/bi-copper-icon.png" /> <div class="text">{{ item.coins || "投币" }}</div> </a> <div class="bottom-item share flexacenter"> <img class="icon" src="/img/share-gray.png" /> <div class="text">转发</div> <div class="share-box flexcenter"> <div class="share-item flexcenter" @click="copyLinkClick()"> <img class="share-icon" src="/img/copy-black-icon.png" /> <div class="text">复制链接</div> </div> <!-- 鼠标移入 加载二维码 --> <div class="share-item wenxin flexcenter" @mouseenter="showQRcode"> <img class="share-icon" src="/img/weixin-icon.png" /> <div class="text">微信转发</div> <div v-if="QRcode" class="QRcode-box flexcenter"> <img class="QRcode" :src="QRcode" /> <div class="text">微信扫码</div> </div> </div> </div> </div></div><like v-if="isLikeGif"></like>`,
template: `<a class="comment flexacenter" v-if="item?.commentreviews && !Array.isArray(item?.commentreviews)" :href="item.url" target="_blank"> <img class="icon" :src="item?.commentreviews?.avatar" /> <div class="text one-line-display">{{ item?.commentreviews?.content || "[图]" }}</div></a><template v-if="item.comment_list?.length != 0"> <a class="comment flexacenter" style="margin-bottom: 15px" v-for="(item, index) in item.comment_list" :key="index" :href="item.url" target="_blank"> <img class="icon" :src="item.avatar" /> <div class="text one-line-display">{{ item.content || "[图]" }}</div> </a></template><div class="bottom flexacenter"> <div class="bottom-item like flexacenter" @click="likeClick()" v-if="item?.type != 'tenement'"> <img v-if="item.is_like" class="icon" src="/img/like-red-icon.png" /> <img v-else class="icon" src="/img/like-icon.png" /> <div class="text">{{ item.likes || "赞" }}</div> </div> <div class="bottom-item flexacenter" @click="collectClick()"> <img v-if="item.is_collect" class="icon" src="/img/collect-golden.svg" /> <img v-else class="icon" src="/img/collect-gray.png" /> <div class="text">{{ item.collections || "收藏" }}</div> </div> <a class="bottom-item flexacenter" v-if="item?.type != 'tenement'" :href="'/details/' + item.uniqid" target="_blank"> <img class="icon" src="/img/discuss-icon.png" /> <div class="text">{{ item.comments || "讨论" }}</div> </a> <a class="bottom-item flexacenter" v-if="item?.type != 'tenement'" :href="'/details/' + item.uniqid" target="_blank"> <img class="icon" src="/img/bi-copper-icon.png" /> <div class="text">{{ item.coins || "投币" }}</div> </a> <div class="bottom-item share flexacenter"> <img class="icon" src="/img/share-gray.png" /> <div class="text">转发</div> <div class="share-box flexcenter"> <div class="share-item flexcenter" @click="copyLinkClick()"> <img class="share-icon" src="/img/copy-black-icon.png" /> <div class="text">复制链接</div> </div> <!-- 鼠标移入 加载二维码 --> <div class="share-item wenxin flexcenter" @mouseenter="showQRcode"> <img class="share-icon" src="/img/weixin-icon.png" /> <div class="text">微信转发</div> <div v-if="QRcode" class="QRcode-box flexcenter"> <img class="QRcode" :src="QRcode" /> <div class="text">微信扫码</div> </div> </div> </div> </div></div><like v-if="isLikeGif"></like>`,
});

View File

@@ -1,12 +1,12 @@
<div class="comment flexacenter" v-if="item?.commentreviews && !Array.isArray(item?.commentreviews)">
<a class="comment flexacenter" v-if="item?.commentreviews && !Array.isArray(item?.commentreviews)" :href="item.url" target="_blank">
<img class="icon" :src="item?.commentreviews?.avatar" />
<div class="text one-line-display">{{ item?.commentreviews?.content || "[图]" }}</div>
</div>
</a>
<template v-if="item.comment_list?.length != 0">
<div class="comment flexacenter" style="margin-bottom: 15px" v-for="(item, index) in item.comment_list" :key="index">
<a class="comment flexacenter" style="margin-bottom: 15px" v-for="(item, index) in item.comment_list" :key="index" :href="item.url" target="_blank">
<img class="icon" :src="item.avatar" />
<div class="text one-line-display">{{ item.content || "[图]" }}</div>
</div>
</a>
</template>
<div class="bottom flexacenter">
<div class="bottom-item like flexacenter" @click="likeClick()" v-if="item?.type != 'tenement'">

View File

@@ -25,6 +25,9 @@ export const itemForum = defineComponent({
res.content = res?.content?.replace(/\[.*?\../g, "");
let item = ref({ ...res });
item.value['url'] = '/details/' + item.value.uniqid;
return { item };
},
@@ -33,5 +36,5 @@ export const itemForum = defineComponent({
itemHead,
},
template: `<div class="item-box item-forum"> <item-head :itemdata="item" :page="page"></item-head> <a v-if="item.title" class="title" :href="'/details/' + item.uniqid" target="_blank">{{ item.title }}</a> <a class="message two-line-display" :href="'/details/' + item.uniqid" target="_blank">{{ item.content }}</a> <item-bottom :itemdata="item" :page="page"></item-bottom></div>`,
template: `<div class="item-box item-forum"> <item-head :itemdata="item" :page="page"></item-head> <a v-if="item.title" class="title" :href="item.url" target="_blank">{{ item.title }}</a> <a class="message two-line-display" :href="item.url" target="_blank">{{ item.content }}</a> <item-bottom :itemdata="item" :page="page"></item-bottom></div>`,
});

View File

@@ -1,8 +1,8 @@
<div class="item-box item-forum">
<item-head :itemdata="item" :page="page"></item-head>
<a v-if="item.title" class="title" :href="'/details/' + item.uniqid" target="_blank">{{ item.title }}</a>
<a class="message two-line-display" :href="'/details/' + item.uniqid" target="_blank">{{ item.content }}</a>
<a v-if="item.title" class="title" :href="item.url" target="_blank">{{ item.title }}</a>
<a class="message two-line-display" :href="item.url" target="_blank">{{ item.content }}</a>
<item-bottom :itemdata="item" :page="page"></item-bottom>
</div>

View File

@@ -33,7 +33,9 @@ export const itemHead = defineComponent({
sectionn.value = item.value.sectionn || [];
const sectionNameSet = new Set(sectionn.value.map((item) => item.name));
tags.value = item.value?.tags?.filter((tagName) => !sectionNameSet.has(tagName)) || [];
console.log(item.value.tags, "tags");
tags.value = item.value?.tags || [];
tags.value = tags.value?.filter((tagName) => !sectionNameSet.has(tagName)) || [];
// const sectionSet = new Set(sectionn.value);
// tags.value = item.value.tags?.filter((tag) => !sectionSet.has(tag));
@@ -107,7 +109,6 @@ export const itemHead = defineComponent({
const parentItemBox = targetNode.parentElement;
if (parentItemBox?.classList.contains("item-box")) parentItemBox.style.display = "none";
})
.finally(() => {
cutShow();

View File

@@ -281,10 +281,17 @@
#appIndex .header-content-box .header-content-right .post-entrance .entrance-bottom .item:hover {
background-color: #e7e7e7;
}
#appIndex .header-content-box .header-content-right .post-entrance .entrance-bottom .item .icon {
#appIndex .header-content-box .header-content-right .post-entrance .entrance-bottom .item .icon-box {
position: relative;
width: 16px;
height: 16px;
margin-right: 6px;
margin-right: 8px;
}
#appIndex .header-content-box .header-content-right .post-entrance .entrance-bottom .item .icon-box .icon {
position: absolute;
width: 38px;
top: -8px;
left: -6px;
}
#appIndex .header-content-box .header-content-right .adv {
width: 240px;

View File

@@ -334,10 +334,18 @@
background-color: #e7e7e7;
}
.icon {
.icon-box {
position: relative;
width: 16px;
height: 16px;
margin-right: 6px;
margin-right: 8px;
.icon {
position: absolute;
width: 38px;
top: -8px;
left: -6px;
}
}
}
}