PC-mj/pages/details/[id].vue

3188 lines
116 KiB
Vue
Raw Normal View History

2023-12-18 03:12:07 +00:00
<template>
<Head>
<Title>{{ `${seo["title"] || "面经"} - 寄托天下出国留学网` }}</Title>
<Meta name="keyword" :content="seo['keyword']" />
<Meta name="description" :content="seo['description']" />
</Head>
2024-01-03 07:28:16 +00:00
<!-- <div @click="router.push(`/index.html`)">1111</div> -->
<!-- <PageHeade></PageHeade> -->
<div>
2024-01-03 11:11:30 +00:00
<TopHead ref="topHeadRef"></TopHead>
2024-01-03 07:28:16 +00:00
<div class="content flexflex">
2024-01-03 10:31:15 +00:00
<div class="left" :style="{ height: contentRightHeight + 'px' }">
2024-01-10 11:04:17 +00:00
<div class="school-box flexcenter" :style="{ 'pointer-events': info['school']?.['url'] ? 'auto' : 'none' }">
2024-01-03 07:28:16 +00:00
<a class="school-box-icon" :href="info['school']?.['url']" target="_blank"><img class="school-icon" v-if="info['school']?.['image']" :src="info['school']?.['image']" /></a>
<a class="school-name" :href="info['school']?.['url']" target="_blank">{{ info["school"]?.["name"] }}</a>
<a class="school-en-name" :href="info['school']?.['url']" target="_blank">{{ info["school"]?.["enname"] }}</a>
</div>
2023-12-18 03:12:07 +00:00
2024-01-03 07:28:16 +00:00
<div class="mj-total flexacenter">
该校共有
<div class="value">{{ relatedcount }}</div>
个面经
</div>
2024-01-03 09:08:29 +00:00
<div class="mj-list" @scroll="handleListScroll">
2024-01-05 10:20:39 +00:00
<template v-for="(item, index) in relatedlist" :key="index">
<a v-if="item['type']" class="mj-item flexflex recommend" :href="item?.url" target="_blank">
<div class="mj-header flexacenter">
2024-01-10 07:31:42 +00:00
<div class="label flexacenter">
<div class="label-text flexcenter"></div>
2024-01-10 08:56:47 +00:00
<div class="label-title">{{ labelObj[item["type"] || "offer"] }}</div>
2024-01-10 07:31:42 +00:00
</div>
2024-01-05 10:20:39 +00:00
<h1>{{ item["title"] }}</h1>
</div>
2023-12-29 10:37:38 +00:00
2024-01-05 10:20:39 +00:00
<div class="info-list flexflex" v-if="item['type'] == 'offer'">
<div class="info-item flexacenter">
<div class="info-name">专业</div>
<div class="info-value flex1 ellipsis">{{ item["professional"] }}</div>
</div>
<div class="info-item flexacenter">
<div class="info-name">学位</div>
<div class="info-value flex1 ellipsis">{{ item["degree"] }}</div>
</div>
<div class="info-item flexacenter">
<div class="info-name">结果</div>
<div class="info-value flex1 ellipsis">{{ item["apply_results"] }}</div>
</div>
2023-12-29 10:37:38 +00:00
</div>
2024-01-05 10:20:39 +00:00
<div class="thread-text ellipsis flexflex" v-if="item['type'] == 'thread' || item['type'] == 'ask'">
<div class="ask-label" v-if="item['type'] == 'ask'">回答</div>
<div class="flex1 ellipsis">{{ item["message"] }}</div>
2024-01-03 07:28:16 +00:00
</div>
2024-01-05 10:20:39 +00:00
<div class="vote-list" v-if="item['type'] == 'vote'">
<div class="vote-item" v-for="(ite, i) in item['option'].slice(0, 2)" :key="i">{{ numberToEnclosed(i) }} &nbsp; {{ ite }}</div>
<div class="vote-item">{{ numberToEnclosed(3) }} &nbsp; </div>
2024-01-03 07:28:16 +00:00
</div>
2024-01-05 10:20:39 +00:00
</a>
<a v-else class="mj-item flexflex" :class="{ pitch: pitchIndex == index }" @click.stop.prevent="handleItem(item['uniqid'])" :href="`./details/${item['uniqid']}`">
<div class="mj-header flexacenter">
<img class="mj-avatar" :src="item['avatar']" />
<div class="user-name">{{ item["username"] || "匿名用户" }}</div>
<div class="time">{{ handleDate(item["releasetime"]) }}发布</div>
</div>
<div class="info-list flexflex">
<div class="info-item flexacenter" v-if="item['profession']">
<div class="info-name">专业</div>
<div class="info-value flex1 ellipsis">{{ item["profession"] }}</div>
</div>
<div class="info-item flexacenter" v-if="item['project']">
<div class="info-name">项目</div>
<div class="info-value flex1 ellipsis">{{ item["project"] }}</div>
</div>
<div class="info-item flexacenter" v-if="item['interviewtime']">
2024-01-09 07:11:03 +00:00
<div class="info-name">面试</div>
2024-01-05 10:20:39 +00:00
<div class="info-value flex1 ellipsis">{{ item["interviewtime"] }}</div>
</div>
</div>
</a>
</template>
2023-12-18 03:12:07 +00:00
</div>
</div>
2024-01-03 09:08:29 +00:00
<!-- <div class="right flex1" @scroll="handleCommentsScroll" v-loading="detailsLoading"> -->
2024-01-03 10:31:15 +00:00
<div class="right flex1" ref="contentRightRef" v-loading="detailsLoading">
2024-01-03 07:28:16 +00:00
<!-- <div class="right-loading"></div> -->
<div class="header">
2024-01-03 09:08:29 +00:00
<div class="titletitle">{{ info["subject"] }}</div>
2024-01-03 07:28:16 +00:00
<div class="mj-header flexacenter">
<div class="mj-header-left flexacenter">
<el-popover placement="bottom-start" :width="140" trigger="click" popper-class="avatar-box-popper" :show-arrow="false">
<template #reference>
<img class="mj-avatar" :src="info['avatar']" />
</template>
<div class="avatar-box flexflex" v-if="info['uin']">
<!-- <div class="avatar-box flexflex"> -->
<a class="avatar-item flexcenter" target="_blank" @click.prevent="sendMessage(info['uin'])">
<img class="avatar-icon" src="@/assets/img/send-messages-icon.png" />
发送信息
</a>
<a class="avatar-item flexcenter" target="_blank" @click.prevent="TAHomePage(info['uin'])">
<img class="avatar-icon" src="@/assets/img/homepage-icon.png" />
TA的主页
</a>
</div>
</el-popover>
<div class="user-name">{{ info["nickname"] || "匿名用户" }}</div>
<div class="time">{{ handleDate(info["releasetime"]) }}发布</div>
2023-12-18 03:12:07 +00:00
</div>
2024-01-05 10:20:39 +00:00
<a class="mj-header-right flexacenter" target="_blank" :href="info['threadurl']">
<img class="original-icon" src="@/assets/img/original-icon.png" />
论坛原帖
<!-- <img class="eye-icon" src="@/assets/img/eye-icon.svg" /> -->
<!-- {{ info["views"] }} -->
</a>
2023-12-18 03:12:07 +00:00
</div>
</div>
2024-01-03 07:28:16 +00:00
<div class="details-box">
2024-01-09 08:12:49 +00:00
<div class="details-item">
<div class="details-top">面试过程及内容</div>
<div class="details-list">
<div class="details-list-item flexacenter">
<div class="details-value describe" :class="{ 'unlock-unlock': !isdisplay }" v-if="info['message']">
<div v-html="info['message']"></div>
<div class="unlock-mask flexflex" style="width: 693px;">
<div class="">作者设置了浏览限制</div>
<div class="flexacenter">
2024-07-24 09:03:53 +00:00
<div class="emphasis" @click="loginJudgment()">回复/回应</div>
2024-01-09 08:12:49 +00:00
后即可查看完整内容
</div>
</div>
</div>
</div>
</div>
</div>
2024-01-03 07:28:16 +00:00
<div class="details-item">
<div class="details-top">申请信息</div>
<div class="details-list">
<div class="details-list-item flexacenter" v-if="info['school']">
<div class="details-name">学校</div>
<a class="details-value" target="_blank" :href="info['school']?.['url']">{{ info["school"]?.name }}</a>
</div>
<div class="details-list-item flexacenter" v-if="info['profession']">
<div class="details-name">专业</div>
<div class="details-value">{{ info["profession"] }}</div>
</div>
<div class="details-list-item flexacenter" v-if="info['project']">
<div class="details-name">项目</div>
<div class="details-value">{{ info["project"] }}</div>
</div>
2023-12-18 03:12:07 +00:00
</div>
</div>
2024-01-03 07:28:16 +00:00
<div class="details-item">
<div class="details-top">面试时间</div>
<div class="details-list">
<div class="details-list-item flexacenter">
<div class="details-name">日期</div>
<div class="details-value date" v-if="info['interviewtime']">{{ timestampToDate(info["interviewtime"]) }}</div>
</div>
</div>
</div>
2023-12-18 03:12:07 +00:00
</div>
2024-07-19 07:03:52 +00:00
<!-- 回应 -->
2024-07-24 08:17:06 +00:00
<div class="respond-area">
2024-07-19 07:03:52 +00:00
<div class="respond-title flexacenter">
回应
<div class="value">{{ ripostecount.total || 0 }}</div>
2024-07-24 08:17:06 +00:00
<div v-if="ripostecount.user > 0" class="respond-list-btn" @click="openPopList">
<span class="respond-list-btn-amount">{{ ripostecount.user }}</span
>人回应
<img class="respond-list-btn-icon" src="@/assets/img/arrowsRight.svg" />
</div>
2024-07-19 07:03:52 +00:00
</div>
<div v-if="ripostelist.length == 0" class="respond-no-box flexacenter">
<div class="respond-no flex1">
<div v-for="item in randomEmojis" :key="item" class="code" v-html="jointriposte(item)" @click="selectEomji(item)"></div>
</div>
<RespondAdd></RespondAdd>
</div>
<div v-else class="respond-box">
<div v-for="(item, index) in ripostelist" :key="item" class="respond-item flexacenter" :class="{ 'pitch': item.selected }" @click="selectListEomji(index)">
<div class="code flexacenter" v-html="jointriposte(item.item)"></div>
{{ item.num }}
</div>
<div v-if="ripostelist.length < 3" class="respond-select flexflex">
<div class="respond-select-box flex1 flexflex">
2024-07-24 08:17:06 +00:00
<template v-for="(item, index) in randomEmojis" :key="item">
<div v-if="index < 5" class="respond-select-item" v-html="jointriposte(item)" @click="selectEomji(item)"></div>
</template>
2024-07-19 07:03:52 +00:00
</div>
<RespondAdd></RespondAdd>
</div>
<RespondAdd v-else></RespondAdd>
</div>
</div>
2024-01-03 07:28:16 +00:00
<!-- 讨论 -->
2024-01-04 09:12:58 +00:00
<div class="comment-box" ref="commentBoxRef">
2024-01-03 07:28:16 +00:00
<div class="comment-title flexacenter">
讨论
<div class="value">{{ commentComments || "" }}</div>
</div>
2024-01-30 11:08:34 +00:00
<div class="post-comment flexacenter" ref="postInputRef" :class="{ 'post-comment-focus': postCommentFocusState }" @click="loginJudgment()">
<div class="post-comment-input">
<!-- <textarea class="post-input flex1" placeholder="说说你的想法或疑问…" v-model="commentInputTop" @blur="postCommentFocusBlur" @focus="postCommentFocusState = true"></textarea> -->
<el-input class="post-input flex1" type="textarea" :autosize="postCommentFocusState" :maxlength="500" show-word-limit placeholder="说说你的想法或疑问…" v-model="commentInputTop" @blur="postCommentFocusBlur" @focus="postCommentFocusState = true"></el-input>
</div>
2024-01-31 07:29:31 +00:00
<div class="post-ok flexcenter" @click="submitAnswerComments(commentInputTop)">发送</div>
2023-12-25 10:39:49 +00:00
</div>
2023-12-29 10:37:38 +00:00
2024-01-03 07:28:16 +00:00
<template v-if="isEmptyState">
<div class="empty-box">
<Empty hint="说说你的观点吧"></Empty>
</div>
</template>
<template v-else>
<div class="comment-list">
<div class="comment-item flexflex" v-for="(item, index) in commentList" :key="item.id">
2024-01-04 09:12:58 +00:00
<el-popover placement="bottom-start" :width="140" trigger="click" popper-class="avatar-box-popper" :show-arrow="false" v-model:visible="item['popoverState']">
2024-01-03 07:28:16 +00:00
<template #reference>
<img class="comment-avatar" :src="item['avatar']" />
</template>
<div class="avatar-box flexflex" v-if="item['uin']">
<a class="avatar-item flexcenter" target="_blank" @click.prevent="sendMessage(item['uin'])">
<img class="avatar-icon" src="@/assets/img/send-messages-icon.png" />
发送信息
</a>
<a class="avatar-item flexcenter" target="_blank" @click.prevent="TAHomePage(item['uin'])">
<img class="avatar-icon" src="@/assets/img/homepage-icon.png" />
TA的主页
</a>
2023-12-18 03:12:07 +00:00
</div>
2024-01-03 07:28:16 +00:00
</el-popover>
<div class="comment-content flex1">
<div class="comment-header flexacenter">
<div class="comment-header-left flexacenter">
2024-01-04 09:12:58 +00:00
<div class="comments-username" @click="openAvatarPopover(index)">{{ item["nickname"] }}</div>
2024-01-03 07:28:16 +00:00
<div class="comments-time">{{ handleDate(item["timestamp"]) }}</div>
<div class="comments-identity" v-if="item['isauthor']">作者</div>
2024-01-09 10:49:37 +00:00
<img class="comments-title" v-if="item['groupid'] == 14" src="@/assets/img/title.png" />
2023-12-25 10:39:49 +00:00
</div>
2024-01-03 07:28:16 +00:00
<div class="comment-header-right flexacenter">
<div class="menu-box flexacenter">
<img class="menu-icon" src="@/assets/img/menu-icon-gray.svg" />
<div class="report-box flexcenter" @click="report(item['token'])">举报</div>
</div>
2024-01-30 11:08:34 +00:00
<img class="comment-icon" title="回复" @click="!item['childState'] ? openAnswerCommentsChild(index) : closeAnswerCommentsChild()" src="@/assets/img/comment-icon-gray.svg" />
2024-01-03 07:28:16 +00:00
<div class="flexacenter like-box" @click="commentLike(index)">
<img class="like-icon" v-if="item['islike'] == 1" src="@/assets/img/like-icon-colours.png" />
<img class="like-icon" v-else src="@/assets/img/like-icon-gray.png" />
<div class="like-quantity">{{ item["likenum"] || 0 }}</div>
</div>
2023-12-25 10:39:49 +00:00
</div>
2023-12-18 03:12:07 +00:00
</div>
2024-01-30 11:08:34 +00:00
<div class="comment-text" @click="!item['childState'] ? openAnswerCommentsChild(index) : closeAnswerCommentsChild()" v-html="item['content']"></div>
2024-01-31 07:29:31 +00:00
<div class="comments-input-masking" @click="closeAnswerCommentsChild()" v-if="item['childState']"></div>
<div class="comments-input-box" :class="{ 'comments-input-box-show': item['childState'] }">
<div class="comments-input">
2024-01-30 11:08:34 +00:00
<el-input type="textarea" v-model="commentInput" placeholder="回复" :maxlength="500" show-word-limit></el-input>
<div class="operate-bottom flexacenter">
<div class="comments-btn comments-btn-cancel flexcenter" @click="closeAnswerCommentsChild()">取消</div>
<div class="comments-btn flexcenter" @click="submitAnswerComments(commentInput, index)">发送</div>
</div>
2024-01-03 07:28:16 +00:00
</div>
2023-12-25 10:39:49 +00:00
</div>
2024-01-03 07:28:16 +00:00
<!-- 子评论 -->
<div class="child-comments" v-if="item['child'].length > 0">
<div class="comment-item flexflex" v-for="(ite, i) in item['child']" :key="ite.id">
<!-- <img class="comment-avatar" :src="ite['avatar']" /> -->
2024-01-04 09:12:58 +00:00
<el-popover placement="bottom-start" :width="140" trigger="click" popper-class="avatar-box-popper" :show-arrow="false" v-model:visible="ite['popoverState']">
2024-01-03 07:28:16 +00:00
<template #reference>
<img class="comment-avatar" :src="ite['avatar']" />
</template>
2024-01-04 09:12:58 +00:00
<div class="avatar-box flexflex" v-if="ite['uin']">
<a class="avatar-item flexcenter" target="_blank" @click.prevent="sendMessage(ite['uin'])">
2024-01-03 07:28:16 +00:00
<img class="avatar-icon" src="@/assets/img/send-messages-icon.png" />
发送信息
</a>
<a class="avatar-item flexcenter" target="_blank" @click.prevent="TAHomePage(ite['uin'])">
<img class="avatar-icon" src="@/assets/img/homepage-icon.png" />
TA的主页
</a>
2023-12-18 03:12:07 +00:00
</div>
2024-01-03 07:28:16 +00:00
</el-popover>
<div class="comment-content flex1">
<div class="comment-header flexacenter">
<div class="comment-header-left flexacenter">
2024-01-04 09:12:58 +00:00
<div class="comments-username" @click="openAvatarPopover(index, i)">{{ ite["nickname"] }}</div>
2024-01-03 07:28:16 +00:00
<div class="comments-time">{{ handleDate(ite["timestamp"]) }}</div>
2024-01-09 10:49:37 +00:00
2024-01-03 07:28:16 +00:00
<div class="comments-identity" v-if="ite['isauthor']">作者</div>
2024-01-09 10:49:37 +00:00
<img class="comments-title" v-if="ite['groupid'] == 14" src="@/assets/img/title.png" />
2023-12-25 10:39:49 +00:00
</div>
2024-01-03 07:28:16 +00:00
<div class="comment-header-right flexacenter">
<div class="menu-box flexacenter">
<img class="menu-icon" src="@/assets/img/menu-icon-gray.svg" />
<div class="report-box flexcenter" @click="report(ite['token'])">举报</div>
</div>
2024-01-30 11:08:34 +00:00
<img class="comment-icon" title="回复" @click="!ite['childState'] ? openAnswerCommentsChild(index, i) : closeAnswerCommentsChild()" src="@/assets/img/comment-icon-gray.svg" />
2024-01-03 07:28:16 +00:00
<div class="flexacenter like-box" @click="commentLike(index, i)">
<img class="like-icon" v-if="ite['islike'] == 1" src="@/assets/img/like-icon-colours.png" />
<img class="like-icon" v-else src="@/assets/img/like-icon-gray.png" />
<div class="like-quantity">{{ ite["likenum"] || 0 }}</div>
</div>
2023-12-25 10:39:49 +00:00
</div>
2023-12-18 03:12:07 +00:00
</div>
2024-01-30 11:08:34 +00:00
<div class="comment-text" @click="!ite['childState'] ? openAnswerCommentsChild(index, i) : closeAnswerCommentsChild()">
2024-01-03 07:28:16 +00:00
<div class="comments-reply" v-if="ite?.reply?.nickname">@{{ ite?.reply?.nickname }}</div>
{{ ite["content"] }}
</div>
2024-01-31 07:29:31 +00:00
<!-- <div class="comments-input-box flexacenter" v-if="ite['childState']">
2024-01-03 07:28:16 +00:00
<div class="comments-input flexflex">
<textarea class="flex1" placeholder="回复" v-model="commentInput"></textarea>
<div class="comments-btn flexcenter" @click="submitAnswerComments(index, i)">发送</div>
</div>
2024-01-31 07:29:31 +00:00
</div> -->
<div class="comments-input-masking" @click="closeAnswerCommentsChild()" v-if="ite['childState']"></div>
<div class="comments-input-box" :class="{ 'comments-input-box-show': ite['childState'] }">
<div class="comments-input">
<el-input type="textarea" v-model="commentInput" placeholder="回复" :maxlength="500" show-word-limit></el-input>
<div class="operate-bottom flexacenter">
<div class="comments-btn comments-btn-cancel flexcenter" @click="closeAnswerCommentsChild()">取消</div>
<div class="comments-btn flexcenter" @click="submitAnswerComments(commentInput, index, i)">发送</div>
</div>
</div>
2023-12-25 10:39:49 +00:00
</div>
2023-12-18 03:12:07 +00:00
</div>
</div>
</div>
2024-01-03 07:28:16 +00:00
<!-- 还有几个 -->
<div class="comments-also flexacenter" v-if="item['childnum'] > item['child'].length" @click="alsoCommentsData(index)">
<div class="">还有{{ item["childnum"] - item["child"].length }}条回复</div>
<img class="also-icon" src="@/assets/img/arrow-circular-gray.png" />
</div>
2023-12-25 10:39:49 +00:00
</div>
2023-12-18 03:12:07 +00:00
</div>
</div>
2024-01-03 07:28:16 +00:00
<div class="comment-end" v-if="commentPage == 0 && commentList.length != 0">· End ·</div>
</template>
</div>
2023-12-18 03:12:07 +00:00
</div>
2024-01-31 07:29:31 +00:00
<div class="floor-area flexacenter" @click="closeAnswerCommentsChild()">
2024-01-03 07:28:16 +00:00
<div class="floor-content flexacenter">
2024-01-09 10:49:37 +00:00
<div class="floor-right flexacenter" @mouseenter="handleFloorRight(true)" @mouseleave="handleFloorRight(false)">
手机查看该面经
<img class="arrows-icon" src="@/assets/img/arrows-icon.png" />
<el-popover placement="bottom" width="160px" trigger="hover" v-model:visible="floorRightState" popper-style="padding: 24px;border-radius: 18px;">
<template #reference>
<div class="QR-code-ball flexcenter">
<img class="" src="@/assets/img/QR-code-icon.svg" />
</div>
</template>
<img class="examine-code" :src="qrcode" />
</el-popover>
</div>
2024-01-03 07:28:16 +00:00
<div class="floor-left flexacenter">
2024-01-05 10:20:39 +00:00
<div class="item flexacenter" v-if="isBrowser" style="cursor: auto;">
2024-01-09 10:49:37 +00:00
<img class="icon h8" src="@/assets/img/eye-icon-black.svg" />
2024-01-05 10:20:39 +00:00
{{ info["views"] }}
</div>
2024-07-24 08:19:47 +00:00
<div class="item flexacenter" @click="handleLike" v-if="false">
2024-07-22 03:38:51 +00:00
<img class="icon h16" v-if="islike == 1" src="@/assets/img/like-icon-colours.png" />
<img class="icon h16" v-else src="@/assets/img/like-icon.png" />
{{ info["likenum"] || "" }}
</div>
<div class="item flexacenter" v-else>
2024-07-19 07:03:52 +00:00
<img class="icon h16" src="@/assets/img/riposte-icon.png" />
{{ ripostecount.total || 0 }}
2024-01-03 07:28:16 +00:00
</div>
2024-01-09 10:49:37 +00:00
<div class="item flexacenter" @click="handleScrollComments()"><img class="icon h15" src="@/assets/img/comment-icon.png" />{{ commentComments }}</div>
2024-01-08 08:18:40 +00:00
<ClientOnly>
<div class="item flexacenter" @click="handleCollect()">
2024-01-09 10:49:37 +00:00
<img class="icon h16" v-if="iscollection == 1" src="@/assets/img/collect-icon-colours.svg" />
<img class="icon h16" v-else src="@/assets/img/collect-icon.png" />
2024-01-08 08:18:40 +00:00
{{ info["favnum"] || "收藏" }}
</div>
</ClientOnly>
2024-01-04 06:54:37 +00:00
<ClientOnly>
<el-popover placement="bottom" width="628px" trigger="click" popper-style="padding: 0;border-radius: 10px;" v-model:visible="transmitBoxState">
<template #reference>
2024-01-09 10:49:37 +00:00
<div class="item flexacenter" @click="handleShare"><img class="icon h15" src="@/assets/img/transmit-icon.png" />转发</div>
2024-01-04 06:54:37 +00:00
</template>
2024-01-03 07:28:16 +00:00
2024-01-04 06:54:37 +00:00
<div class="transmit-box flexflex">
<img class="cross-icon" @click="transmitBoxState = false" src="@/assets/img/cross-icon.png" />
<div class="transmit-left transmit-web">
<div class="transmit-title">转发网页版</div>
<div class="transmit-content">
<div class="transmit-headline">{{ info["subject"] }}</div>
<div class="transmit-url">{{ getFullUrl() }}</div>
</div>
<div class="transmit-web-btn flexcenter" @click="copyText(`${info['subject']} + ${getFullUrl()}`)">复制链接</div>
2024-01-03 07:28:16 +00:00
</div>
2024-01-04 06:54:37 +00:00
<div class="transmit-right transmit-mini">
<div class="transmit-title">转发小程序版</div>
<div class="transmit-content flexcenter">
<img class="transmit-mini-img" :src="qrcode" />
<div class="flexcenter">
<img class="give-sweep" src="@/assets/img/give-sweep.png" />
扫码转发该问答
</div>
2024-01-03 07:28:16 +00:00
</div>
2023-12-18 03:12:07 +00:00
</div>
</div>
2024-01-04 06:54:37 +00:00
</el-popover>
</ClientOnly>
2024-01-03 07:28:16 +00:00
</div>
2023-12-18 03:12:07 +00:00
2024-01-05 10:20:39 +00:00
<div class="floor-middle flexacenter coin-box">
2024-01-10 08:56:47 +00:00
<div class="coin-content flexacenter flex1" @click="openCoinRankList" :style="{ cursor: info.coins != 0 ? 'pointer' : '' }">
2024-01-05 10:20:39 +00:00
<img class="coin-icon" src="@/assets/img/coin-icon.png" />
<div class="coin-text flex1 flexacenter">
已获
<div class="coin-value">{{ info.coins }}</div>
个寄托币
</div>
</div>
<div class="coin-btn flexcenter" @click="openCoinOperation()">给TA投币</div>
</div>
2023-12-18 03:12:07 +00:00
</div>
</div>
</div>
2024-01-03 07:28:16 +00:00
<Report v-if="reportAlertShow" :reportToken="reportToken"></Report>
2023-12-18 03:12:07 +00:00
</div>
2024-01-05 10:20:39 +00:00
<!-- 投币操作 弹窗 -->
<div class="pop-masking flexcenter" v-if="isInsertCoinsOperationShow">
<div class="slit-pop-box" v-if="coinMybalance > 0" style="border-radius: 11px;">
<div class="slit-left" style="width: 50px;">
<img class="slit-left-icon" src="//app.gter.net/image/gter/offer/imgdetails/u620.png" style="margin-top: -8px;" />
</div>
<div class="slit-box">
<div class="slit-head" style="flex: 1; flex-direction: column; align-items: flex-start;">
<div class="slit-head-title flexflex" style="width: 100%; justify-content: space-between;">
<span>投币</span>
<div class="in-all">
你共有 <span>{{ coinMybalance }}</span> 寄托币
</div>
<!-- <a target="_blank" :href="coinConfig.strategy.url" style="font-weight: 100; font-size: 13px; text-decoration: underline;">{{ coinConfig.strategy.button }}</a> -->
</div>
</div>
<div class="coin-quantity flexacenter">
<div class="coin-quantity-item" :class="{ 'coin-pitch': coinAmount == item }" v-for="(item, index) in coinConfig.list" :key="index" @click="coinSelectAmountDispose(item)">
{{ item }} <span>{{ coinConfig.unit }}</span>
</div>
</div>
<el-input class="slit-input" v-model="coinAmount" placeholder="自定义投币金额" show-word-limit="false"> </el-input>
<div class="message-box">
<div class="message-hint">顺便说点什么</div>
<el-input class="slit-input" style="font-size: 15px;" v-model="coinMessage" placeholder="请输入" maxlength="500" show-word-limit> </el-input>
</div>
<div class="operation">
<div class="operation-item flexcenter" @click="isInsertCoinsOperationShow = !isInsertCoinsOperationShow">取消</div>
<div class="operation-item flexcenter greenBj" @click="postCoinSbmit()">确定</div>
</div>
</div>
</div>
<div class="no-jituobi-pop-box" v-else>
<img class="no-jituobi-close" @click="isInsertCoinsOperationShow = !isInsertCoinsOperationShow" src="@/assets/img/cross-icon.png" />
<div class="no-jituobi-head flexacenter">
<img class="bi-icon" src="//app.gter.net/image/gter/offer/imgdetails/u620.png" style="margin-right: 12px;" />
<span style="margin-top: 10px;">
{{ coinConfig?.strategy?.tips }}
</span>
</div>
<a :href="coinConfig?.strategy?.url" target="_blank">
<div class="strategy-btn greenBj flexcenter">{{ coinConfig?.strategy?.button }}<img class="strategy-icon" src="@/assets/img/strategy-icon.svg" /></div>
</a>
</div>
</div>
<!-- 投币 排行榜 -->
<RankingBox v-if="coinrankingState" :coinrankingList="coinrankingList"></RankingBox>
2024-07-24 08:17:06 +00:00
<div class="respond-pop-mask" v-if="respondPopListState">
<div class="respond-pop">
<div class="respond-pop-no" v-if="JSON.stringify(respondDetail) == '{}'">
<img class="respond-title-icon" @click="closePopList()" src="@/assets/img/cross-grey.png" />
<img src="@/assets/img/no-discussion.png" class="respond-pop-no-icon" />
<div class="respond-pop-no-text">- 暂无数据 -</div>
</div>
<template v-else>
<div class="respond-pop-title">
<span class="respond-pop-amount">{{ ripostecount.user }}</span
>人回应
<img class="respond-title-icon" @click="closePopList()" src="@/assets/img/cross-grey.png" />
</div>
<div class="respond-list">
<div class="respond-item" v-for="(item, index) in respondDetail" :key="index">
<div class="respond-code" :class="{ 'pitch': item.selected }" v-html="jointriposte(item.item)" @click="selectEomjiListPop(item.item)"></div>
<div class="respond-content flex1">
<div class="respond-total">{{ item.user.length }} 人作此回应</div>
<div class="user-item" v-for="(item, index) in item.user" :key="index" @click="TAHomePage(item['uin'])">
<img class="user-avatar" :src="item.avatar" />
{{ item.nickname || item.username }}
</div>
</div>
</div>
</div>
</template>
</div>
</div>
2023-12-18 03:12:07 +00:00
</template>
<script setup>
2023-12-25 10:39:49 +00:00
import { ElMessage } from "element-plus"
2023-12-18 03:12:07 +00:00
const route = useRoute()
2023-12-18 11:09:29 +00:00
let uniqid = route.params.id
2024-01-03 07:28:16 +00:00
let isNeedLogin = inject("isNeedLogin")
const goLogin = inject("goLogin")
2024-07-19 07:03:52 +00:00
useHead({ script: [{ src: "https://app.gter.net/bottom?tpl=header&menukey=mj" }, { src: "https://app.gter.net/bottom?tpl=footer,popupnotification", body: true }] })
2024-01-03 09:08:29 +00:00
2024-01-03 10:31:15 +00:00
let contentRightRef = ref(null)
let contentRightHeight = ref(null)
2023-12-18 03:12:07 +00:00
onMounted(() => {
2024-01-03 09:08:29 +00:00
window.addEventListener("scroll", handleScroll)
2023-12-18 11:09:29 +00:00
getDetails()
2024-01-03 09:08:29 +00:00
// openObserverBottom()
// 在元素挂载后执行回调函数
nextTick(() => {
// 创建 ResizeObserver 实例
const observer = new ResizeObserver(entries => {
for (const entry of entries) {
// 元素的高度变化
2024-01-03 10:31:15 +00:00
contentRightHeight.value = entry.contentRect.height
2024-01-03 09:08:29 +00:00
}
})
// 监听元素的变化
2024-01-03 10:31:15 +00:00
observer.observe(contentRightRef.value)
2024-01-03 09:08:29 +00:00
})
2023-12-18 03:12:07 +00:00
2024-01-03 10:31:15 +00:00
clearBottom()
})
2024-01-02 11:03:39 +00:00
let floorAreaState = ref(false) // 底部操作显示状态
2024-01-04 06:11:30 +00:00
watch(
() => route.path,
(newValue, oldValue) => {
// 在这里处理route.path的变化
if (typeof window !== "undefined" && route.path) {
if (window._hmt) window._hmt.push(["_trackPageview", route.fullPath])
if (window._czc) {
let location = window.location
let contentUrl = location.pathname + location.hash
let refererUrl = "/"
window._czc.push(["_trackPageview", contentUrl, refererUrl])
window._czc.push(["_setAutoPageview", false])
}
}
}
)
2024-01-02 11:03:39 +00:00
// 开启一个监听最底部是否在可视窗口内
const openObserverBottom = () => {
// 获取目标元素的引用
const target = document.querySelector("section.index-footer")
if (!target) {
openObserverBottom()
return
}
// 创建一个 Intersection Observer 实例
const observer = new IntersectionObserver(
(entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) floorAreaState.value = false
else floorAreaState.value = true
})
},
{
root: null,
threshold: 0.5,
}
)
// 开始观察目标元素
observer.observe(target)
}
2023-12-25 10:39:49 +00:00
2024-01-03 10:31:15 +00:00
// 清除底部的次数
let clearBottomCount = 0
// 清除 底部
const clearBottom = () => {
const indexFooter = document.querySelector("section.index-footer")
if (!indexFooter) {
clearBottomCount++
setTimeout(() => clearBottom(), 200)
return
}
if (clearBottomCount == 5) return
indexFooter.style.display = "none"
}
2023-12-25 10:39:49 +00:00
// 清空全部数据
const clearAllData = () => {
2024-01-02 11:03:39 +00:00
uniqid = route.params.id
2023-12-25 10:39:49 +00:00
info.value = {}
qrcode.value = ""
iscollection.value = 0
isdisplay.value = true
islike.value = 0
ismyself.value = 0
relatedlist.value = []
relatedcount.value = 0
pitchIndex.value = null
seo.value = {}
commentCount.value = 0
commentPage.value = 1
commentList.value = []
commentLoading = false
token = ""
}
2023-12-18 03:12:07 +00:00
let floorRightState = ref(false) // 右下角 的二维码显示状态
2024-01-08 10:58:46 +00:00
// 处理右下角 鼠标经过箭头 展示二维码
2023-12-18 03:12:07 +00:00
const handleFloorRight = value => {
floorRightState.value = value
}
// 转发弹窗 的 显示状态
let transmitBoxState = ref(false)
let info = ref({})
let qrcode = ref("") // 分享二维码
let iscollection = ref(0) // 是否收藏
let isdisplay = ref(true) // 是否隐藏
let islike = ref(0) // 是否点赞
let ismyself = ref(0) // 是否是作者
2023-12-29 10:37:38 +00:00
let detailsLoading = ref(false) // 详情加载中
2023-12-18 03:12:07 +00:00
2023-12-18 11:09:29 +00:00
const getDetails = () => {
2023-12-29 10:37:38 +00:00
if (detailsLoading.value) return
detailsLoading.value = true
2023-12-25 10:39:49 +00:00
detailsHttp({ uniqid }).then(res => {
2023-12-29 10:37:38 +00:00
if (res.code != 200) {
ElMessage.error(res.message)
2024-01-09 07:29:19 +00:00
setTimeout(() => goToURL("/index.html", false), 1000)
2023-12-29 10:37:38 +00:00
return
}
2023-12-18 11:09:29 +00:00
let data = res.data
token = data["token"]
info.value = data["info"]
seo.value = data.seo
2024-01-04 06:11:30 +00:00
iscollection.value = data.iscollection || 0
2023-12-18 11:09:29 +00:00
isdisplay.value = data.isdisplay
islike.value = data.islike
ismyself.value = data.ismyself
qrcode.value = data["share"]["qrcode"]
if (relatedlist.value.length == 0) getRelatedlistHttp()
else CalculateSelectedList()
2023-12-29 10:37:38 +00:00
2024-01-05 10:20:39 +00:00
if (JSON.stringify(coinConfig.value) == "{}") getCoinInfo()
2023-12-29 10:37:38 +00:00
detailsLoading.value = false
getCommentListHttp()
2024-07-19 07:03:52 +00:00
getRiposte()
2023-12-18 11:09:29 +00:00
})
}
// 计算选中的列表
const CalculateSelectedList = () => {
let targetRelatedlist = [...relatedlist.value]
targetRelatedlist.forEach((element, index) => {
if (element["uniqid"] == uniqid) pitchIndex.value = index
})
if (pitchIndex.value == null) {
targetRelatedlist.unshift({
avatar: info.value["avatar"],
interviewtime: timestampToDate(info.value["interviewtime"]),
profession: info.value["profession"],
project: info.value["project"],
releasetime: info.value["releasetime"],
subject: info.value["subject"],
uniqid: uniqid,
username: info.value["nickname"],
})
relatedlist.value = targetRelatedlist
pitchIndex.value = 0
}
}
2023-12-18 03:12:07 +00:00
// 左侧列表数据
let relatedlist = ref([])
let relatedcount = ref(0)
2024-01-02 11:03:39 +00:00
let relatedpage = ref(1)
let relatedloading = false
2023-12-18 03:12:07 +00:00
2023-12-18 11:09:29 +00:00
let pitchIndex = ref(null) // 列表选中 index
2023-12-18 03:12:07 +00:00
const getRelatedlistHttp = () => {
2024-01-09 07:29:19 +00:00
if (relatedloading || relatedpage.value == 0 || !token) return
2024-01-03 03:42:49 +00:00
2024-01-02 11:03:39 +00:00
relatedloading = true
2024-01-03 03:42:49 +00:00
relatedlistHttp({ token, page: relatedpage.value })
.then(res => {
if (res.code != 200) return
2023-12-18 03:12:07 +00:00
2024-01-03 03:42:49 +00:00
let data = res.data
2023-12-18 03:12:07 +00:00
2024-01-03 03:42:49 +00:00
relatedlist.value = relatedlist.value.concat(data.data)
relatedcount.value = data.count
2024-01-02 11:03:39 +00:00
2024-01-03 03:42:49 +00:00
if (relatedlist.value.length >= data["count"]) relatedpage.value = 0
else relatedpage.value++
2023-12-18 11:09:29 +00:00
2024-01-03 03:42:49 +00:00
CalculateSelectedList()
})
.finally(() => {
relatedloading = false
})
2023-12-18 03:12:07 +00:00
}
2023-12-18 11:09:29 +00:00
2023-12-18 03:12:07 +00:00
let seo = ref({})
let commentCount = ref(0)
2023-12-29 10:37:38 +00:00
let commentComments = ref(0) // 所有的评论数
2023-12-18 03:12:07 +00:00
let commentPage = ref(1)
let commentList = ref([])
let commentLoading = false
2023-12-18 11:09:29 +00:00
let token = ""
2023-12-25 10:39:49 +00:00
let isEmptyState = ref(false) // 评论是否为空
2023-12-18 03:12:07 +00:00
// 获取详情评论数据
const getCommentListHttp = () => {
2023-12-29 10:37:38 +00:00
if (commentPage.value == 0 || commentLoading || detailsLoading.value) return
2023-12-18 03:12:07 +00:00
commentLoading = true
2023-12-29 10:37:38 +00:00
2024-01-04 03:12:34 +00:00
if (commentPage.value != 1) getRelatedlistHttp()
2024-01-03 09:08:29 +00:00
2023-12-18 03:12:07 +00:00
detailsCommentListHttp({
2023-12-29 10:37:38 +00:00
page: commentPage.value,
childlimit: 1,
limit: 10,
2023-12-18 03:12:07 +00:00
token,
})
.then(res => {
if (res.code != 200) return
let data = res.data
commentCount.value = data["count"]
2023-12-25 10:39:49 +00:00
if (data["count"] == 0) isEmptyState.value = true
else isEmptyState.value = false
2023-12-18 03:12:07 +00:00
commentList.value = commentList.value.concat(data["data"])
2023-12-29 10:37:38 +00:00
commentComments.value = data["comments"]
2023-12-18 03:12:07 +00:00
if (commentList.value.length == data["count"]) commentPage.value = 0
else commentPage.value++
2024-01-10 08:56:47 +00:00
// https://bbs.gter.net/static/image/smiley/lxh/rose.gif
2023-12-18 03:12:07 +00:00
})
.finally(() => (commentLoading = false))
}
// 获取剩下的子评论
const alsoCommentsData = (index, ind) => {
2023-12-25 10:39:49 +00:00
let targetCommentItem = { ...commentList.value[index] }
2024-01-15 09:55:41 +00:00
// const token = targetCommentItem["token"]
2023-12-18 03:12:07 +00:00
const parentid = targetCommentItem["id"]
let page = targetCommentItem["childPage"] ?? 1
detailsChildCommentListHttp({
childlimit: 1,
limit: 10,
page,
parentid,
token,
}).then(res => {
if (res.code != 200) return
let data = res.data
2024-01-02 11:03:39 +00:00
let childData = targetCommentItem.child.concat(data.data)
2024-01-09 10:49:37 +00:00
// 检查当前对象在数组中的第一个索引是否与当前索引相等
2024-01-02 11:03:39 +00:00
const filteredData = childData.filter((obj, index, self) => {
return self.findIndex(item => item.id == obj.id) == index
})
targetCommentItem.child = filteredData
2023-12-18 03:12:07 +00:00
targetCommentItem["childnum"] = data.count
if (targetCommentItem.child.length == data["count"]) page = 0
else page++
2023-12-25 10:39:49 +00:00
2023-12-18 03:12:07 +00:00
targetCommentItem["childPage"] = page
commentList.value[index] = targetCommentItem
2023-12-29 10:37:38 +00:00
})
}
// 全部的启动到底部
const handleCommentsScroll = e => {
const el = e.target
if (el.scrollHeight - el.scrollTop >= el.clientHeight + 40) return
getCommentListHttp()
}
2023-12-18 03:12:07 +00:00
2023-12-29 10:37:38 +00:00
// 评论点赞
const commentLike = (index, i) => {
2024-01-09 07:53:19 +00:00
if (isNeedLogin.value) {
goLogin()
return
}
2023-12-29 10:37:38 +00:00
const targetCommentList = [...commentList.value]
let token = ""
if (i != null) token = targetCommentList[index]["child"][i].token
else token = targetCommentList[index].token
2023-12-18 03:12:07 +00:00
2023-12-29 10:37:38 +00:00
detailsLikeCommentHttp({ token }).then(res => {
if (res.code != 200) return
let data = res.data
2023-12-18 03:12:07 +00:00
2023-12-29 10:37:38 +00:00
if (i != null) {
targetCommentList[index]["child"][i].islike = data["status"]
targetCommentList[index]["child"][i].likenum = data["likenum"]
} else {
targetCommentList[index].islike = data["status"]
targetCommentList[index].likenum = data["likenum"]
}
2024-01-05 10:20:39 +00:00
ElMessage.success(res.message)
2023-12-18 03:12:07 +00:00
})
}
2024-01-02 11:03:39 +00:00
let scrollTopValue = ref(0)
2023-12-18 03:12:07 +00:00
// 监听滚动到底部
const handleScroll = () => {
2024-01-03 09:08:29 +00:00
// return
2023-12-18 03:12:07 +00:00
const scrollTop = document.documentElement.scrollTop || document.body.scrollTop
2024-01-02 11:03:39 +00:00
scrollTopValue.value = scrollTop
2024-01-03 09:08:29 +00:00
// return
2024-01-02 11:03:39 +00:00
2023-12-18 03:12:07 +00:00
const scrollHeight = document.documentElement.scrollHeight
const clientHeight = document.documentElement.clientHeight
// 列表下 滑动到底部 获取新数据
2024-01-04 06:54:37 +00:00
if (scrollTop + clientHeight >= scrollHeight - 40) {
getCommentListHttp()
// 整个页面滚动到底部时 判断左边是否有滚动条 没有则需要加载左边数据的下一页
const mjList = document.querySelector(".content .left .mj-list")
if (!(mjList.scrollHeight > mjList.clientHeight || mjList.scrollWidth > mjList.clientWidth)) getRelatedlistHttp()
}
2023-12-18 03:12:07 +00:00
}
// 打开 回答-评论 的子评论
const openAnswerCommentsChild = (index, i) => {
2024-01-09 07:53:19 +00:00
if (isNeedLogin.value) {
goLogin()
return
}
2023-12-18 03:12:07 +00:00
closeAnswerCommentsChild()
if (i == null) commentList.value[index]["childState"] = true
else commentList.value[index]["child"][i]["childState"] = true
}
// 关闭 回答-评论 的子评论
const closeAnswerCommentsChild = () => {
2024-01-31 07:29:31 +00:00
// commentInput.value = ""
2023-12-18 03:12:07 +00:00
commentList.value.forEach(ele => {
ele["childState"] = false
if (ele["child"] && ele["child"].length != 0) ele["child"].forEach(el => (el["childState"] = false))
})
}
// 讨论的输入框
let commentInputTop = ref("")
let commentInput = ref("")
// 提交回答-评论
2024-01-31 07:29:31 +00:00
const submitAnswerComments = (content, index, i) => {
2024-01-03 07:28:16 +00:00
if (isNeedLogin.value) {
goLogin()
return
}
2023-12-18 03:12:07 +00:00
const targetCommentList = [...commentList.value]
2024-01-31 07:29:31 +00:00
// let content = ""
2023-12-25 10:39:49 +00:00
let parentid = null
2023-12-18 03:12:07 +00:00
2024-01-31 07:29:31 +00:00
// if (index == null) content = commentInputTop.value
// else content = commentInput.value
2023-12-18 03:12:07 +00:00
2023-12-29 10:37:38 +00:00
if (i != null) parentid = targetCommentList[index]["child"][i]["id"]
else if (index != null) parentid = targetCommentList[index]["id"]
2023-12-18 03:12:07 +00:00
detailsSubmitommentListHttp({
content,
2023-12-29 10:37:38 +00:00
token,
parentid,
2023-12-18 03:12:07 +00:00
}).then(res => {
2024-01-03 07:28:16 +00:00
if (res.code != 200) {
ElMessage.error(res.message)
return
}
2023-12-18 03:12:07 +00:00
let data = res.data
2023-12-29 10:37:38 +00:00
isdisplay.value = true
2023-12-18 03:12:07 +00:00
if (i != null) {
let targetData = {
id: data["commentid"],
content,
isauthor: 1,
islike: 0,
likenum: 0,
reply: {
2023-12-25 10:39:49 +00:00
nickname: targetCommentList[index]["child"][i]["nickname"],
2023-12-18 03:12:07 +00:00
},
...data,
}
2023-12-25 10:39:49 +00:00
targetCommentList[index]["child"].unshift(targetData)
targetCommentList[index]["childnum"]++
2023-12-18 03:12:07 +00:00
} else {
let targetData = {
id: data["commentid"],
content,
isauthor: 1,
islike: 0,
likenum: 0,
...data,
child: [],
}
2023-12-29 10:37:38 +00:00
if (index != null) {
targetCommentList[index]["child"].unshift(targetData)
targetCommentList[index]["childnum"]++
} else {
targetCommentList.unshift(targetData)
commentCount.value++
}
2023-12-18 03:12:07 +00:00
}
2023-12-29 10:37:38 +00:00
commentComments.value++
2023-12-25 10:39:49 +00:00
commentList.value = targetCommentList
2023-12-29 10:37:38 +00:00
// 请求 输入框的数据
commentInputTop.value = ""
commentInput.value = ""
isEmptyState.value = false // 取消有可能的 没有评论
closeAnswerCommentsChild()
2023-12-25 10:39:49 +00:00
ElMessage({
message: res.message,
type: "success",
})
2024-07-19 07:03:52 +00:00
if (!isdisplay.value) isdisplay.value = true
2023-12-18 03:12:07 +00:00
})
}
// 处理时间戳数据
const timestampToDate = timestamp => {
const date = new Date(timestamp * 1000) // 如果你的时间戳是秒级的需要乘以1000
const year = date.getFullYear()
const month = (date.getMonth() + 1).toString().padStart(2, "0") // getMonth() 返回的月份是从0开始计数的
const day = date.getDate().toString().padStart(2, "0")
return `${year}-${month}-${day}`
}
2023-12-25 10:39:49 +00:00
onUnmounted(() => window.removeEventListener("scroll", handleScroll))
2023-12-18 03:12:07 +00:00
// 获取完整 url
const getFullUrl = () => {
if (typeof window === "undefined") return
return window.location.href
}
// 复制
let copyText = text => {
if (navigator.clipboard) {
copyText = () => {
navigator.clipboard.writeText(text)
ElMessage({
message: "复制成功",
type: "success",
})
}
} else {
copyText = () => {
var tempInput = document.createElement("input")
tempInput.value = text
document.body.appendChild(tempInput)
tempInput.select()
document.execCommand("copy")
document.body.removeChild(tempInput)
ElMessage({
message: "复制成功",
type: "success",
})
}
}
copyText()
}
// 点击点赞
const handleLike = () => {
2023-12-29 10:37:38 +00:00
if (islike.value) {
ElMessage.error("不可取消点赞")
return
}
2024-01-03 07:28:16 +00:00
if (isNeedLogin.value) {
goLogin()
return
}
2023-12-25 10:39:49 +00:00
operateLikeHttp({ token }).then(res => {
2023-12-18 03:12:07 +00:00
if (res.code != 200) return
let data = res.data
info.value["likenum"] = data["count"]
islike.value = data["status"]
2023-12-29 10:37:38 +00:00
isdisplay.value = true
2024-01-03 07:28:16 +00:00
ElMessage.success(res.message)
2023-12-18 03:12:07 +00:00
})
}
2023-12-18 11:09:29 +00:00
2024-01-03 11:11:30 +00:00
let topHeadRef = ref(null)
2023-12-18 11:09:29 +00:00
// 点击 收藏
const handleCollect = () => {
2024-01-03 07:28:16 +00:00
if (isNeedLogin.value) {
goLogin()
return
}
2024-01-03 11:11:30 +00:00
topHeadRef.value.count = {}
2023-12-25 10:39:49 +00:00
operateCollectHttp({ token }).then(res => {
2024-01-03 07:28:16 +00:00
if (res.code != 200) {
ElMessage.error(res["message"])
return
}
2023-12-18 11:09:29 +00:00
let data = res.data
info.value["favnum"] = data["count"]
iscollection.value = data["status"]
2023-12-25 10:39:49 +00:00
2024-01-03 07:28:16 +00:00
ElMessage.success(res["message"])
2023-12-18 11:09:29 +00:00
})
}
2023-12-25 10:39:49 +00:00
const router = useRouter()
2023-12-18 11:09:29 +00:00
// 处理点击列表
const handleItem = uni => {
2024-01-04 06:54:37 +00:00
if (uni == route?.params?.id) return
2024-01-02 11:03:39 +00:00
router.push(`/details/${uni}`)
2023-12-18 11:09:29 +00:00
uniqid = uni
2023-12-29 10:37:38 +00:00
// info.value = {}
info.value["message"] = ""
info.value["subject"] = ""
info.value["profession"] = ""
2023-12-25 10:39:49 +00:00
qrcode.value = ""
iscollection.value = 0
isdisplay.value = true
islike.value = 0
ismyself.value = 0
commentCount.value = 0
commentPage.value = 1
commentList.value = []
commentLoading = false
token = ""
// clearAllData()
nextTick(() => getDetails())
2023-12-29 10:37:38 +00:00
replaceState(uni)
2024-01-03 09:08:29 +00:00
window.scrollTo({
top: 0,
behavior: "smooth",
})
2023-12-25 10:39:49 +00:00
}
// 修改 url
const replaceState = uni => {
if (typeof window === "undefined") return
// 替换当前URL但不刷新页面
window.history.pushState({}, "", `${window.location.origin}/details/${uni}`)
2023-12-18 11:09:29 +00:00
}
2023-12-29 10:37:38 +00:00
let reportAlertShow = ref(false)
let reportToken = ref("")
// 点击打开举报
const report = token => {
2024-01-03 07:28:16 +00:00
if (isNeedLogin.value) {
goLogin()
return
}
2023-12-29 10:37:38 +00:00
reportToken.value = token
reportAlertShow.value = true
}
provide("reportAlertShow", reportAlertShow)
2024-01-02 11:03:39 +00:00
provide("clearAllData", clearAllData)
provide("getDetails", getDetails)
2023-12-29 10:37:38 +00:00
// seo的
if (process.server) {
try {
await detailsHttp({ uniqid }).then(res => {
if (res.code != 200) {
ElMessage.error(res.message)
return
}
let data = res.data
token = data["token"]
info.value = data["info"]
seo.value = data.seo
iscollection.value = data.iscollection
isdisplay.value = data.isdisplay
islike.value = data.islike
ismyself.value = data.ismyself
qrcode.value = data["share"]["qrcode"]
if (relatedlist.value.length == 0) getRelatedlistHttp()
else CalculateSelectedList()
detailsLoading.value = false
getCommentListHttp()
})
await relatedlistHttp({ token, page: 1 }).then(res => {
if (res.code != 200) return
let data = res.data
relatedlist.value = data.data
relatedcount.value = data.count
CalculateSelectedList()
})
} catch (error) {}
}
const isBrowser = computed(() => {
return process.client // 使用 process.client 判断是否在浏览器环境下
})
// 点击发送信息
const sendMessage = uin => {
2024-05-23 09:26:53 +00:00
if (uin && typeof messagePrivateItem == "function") {
messagePrivateItem({ uin: uin })
return
} else redirectToExternalWebsite(`https://bbs.gter.net/home.php?mod=space&showmsg=1&uid=${uin}`)
// redirectToExternalWebsite(`https://bbs.gter.net/home.php?mod=space&showmsg=1&uid=${uin}`)
2023-12-29 10:37:38 +00:00
}
// 点击ta的主页
const TAHomePage = uin => {
redirectToExternalWebsite(`https://bbs.gter.net/home.php?mod=space&uid=${uin}`)
}
// 跳转 url
const redirectToExternalWebsite = url => {
const link = document.createElement("a")
link.href = url
link.target = "_blank"
link.click()
}
2024-01-02 11:03:39 +00:00
// 全部的启动到底部
const handleListScroll = e => {
const el = e.target
if (el.scrollHeight - el.scrollTop >= el.clientHeight + 40) return
getRelatedlistHttp()
}
2024-01-04 09:12:58 +00:00
const commentBoxRef = ref(null)
// 点进滚动到评论
const handleScrollComments = () => {
const element = commentBoxRef.value
if (!element) return
window.scrollTo({
top: element.offsetTop - 85 || 0,
behavior: "smooth",
})
return
const rect = element.getBoundingClientRect()
let elementTop = 0
elementTop = rect.top - window.innerHeight / 2
if (rect.top > window.innerHeight) {
elementTop = rect.top - window.innerHeight / 2
window.scrollTo({
top: elementTop || 0,
behavior: "smooth",
})
} else {
elementTop = window.innerHeight / 2 + rect.top / 2
window.scrollTo({
top: elementTop || 0,
behavior: "smooth",
})
}
// window.scrollTo({
// top: elementTop,
// behavior: "smooth",
// })
}
// 打开评论的 信息框
const openAvatarPopover = (index, i) => {
if (i != null) commentList.value[index]["child"][i]["popoverState"] = true
else commentList.value[index]["popoverState"] = true
}
2024-01-05 10:20:39 +00:00
let isInsertCoinsOperationShow = ref(false) // 投票弹窗
let coinMybalance = ref({}) // 我的寄托币数量
let coinConfig = ref({}) // 投币的配置
let coinConnum = ref(0) // 寄托币数量
let coinRanklist = ref({}) // 投币排行榜
let coinAmount = ref(null) // 投币选择的金额
let coinCustomAmount = ref(null) // 投币自定义的金额
let defaultcoinnum = ref(0) // 投币金额默认寄托币数
let coinMessage = ref("") // 投币时的说点什么
let postCoinSbmitState = false // 投币中
// 获取寄托币
const getCoinInfo = () => {
coinHttp({ token }).then(res => {
if (res.code != 200) return
let data = res.data
coinConfig.value = data.config
coinMybalance.value = data.mybalance
coinRanklist.value = data.ranklist
defaultcoinnum.value = data.defaultcoinnum
})
}
// 打开寄托币弹窗
const openCoinOperation = () => {
2024-01-09 07:53:19 +00:00
if (isNeedLogin.value) {
goLogin()
return
}
2024-01-05 10:20:39 +00:00
isInsertCoinsOperationShow.value = true
}
// 处理投币的选择选项
const coinSelectAmountDispose = amount => {
coinAmount.value = amount
}
// 提交寄托币
const postCoinSbmit = () => {
if (postCoinSbmitState) return
postCoinSbmitState = true
coinsubmitHttp({
token,
coinnum: coinAmount.value,
message: coinMessage.value,
})
.then(res => {
if (res.code != 200) {
ElMessage.error(res.message)
return
}
let data = res.data
info.value.coins = info.value.coins + data["coinnum"]
coinMybalance.value = coinMybalance.value - data["coinnum"]
coinAmount.value = null
isInsertCoinsOperationShow.value = false
ElMessage.success(res.message)
if (data.comment) {
const userInfoWin = window.userInfoWin || {}
commentComments.value = data.comment.count
let newComment = {
avatar: userInfoWin["avatar"],
child: [],
childnum: 0,
content: coinMessage.value,
id: parseInt(data.comment.commentid),
...data.comment,
islike: 0,
likenum: 0,
nickname: userInfoWin["nickname"] || "匿名用户",
parentid: 0,
reply: [],
timestamp: generateTime(),
}
commentList.value.unshift(newComment)
}
coinMessage.value = ""
coinrankingList.value = []
})
.finally(() => (postCoinSbmitState = false))
}
let coinrankingList = ref([]) // 投币排行榜数据
let coinrankingState = ref(false) // 投币排行榜 弹窗状态
let coinrankingLoading = false // 投币排行榜加载中
const getCoinranking = () => {
if (coinrankingLoading) return
coinrankingLoading = true
coinrankingHttp({ token })
.then(res => {
if (res.code != 200) return
const data = res.data
coinrankingList.value = data
coinrankingState.value = true
})
.finally(() => (coinrankingLoading = false))
}
// 打开寄托币排行榜
const openCoinRankList = () => {
if (info.value.coins == 0) return
if (coinrankingList.value.length == 0) getCoinranking()
else coinrankingState.value = true
}
// 生成时间
const generateTime = () => {
let date = new Date()
let Y = date.getFullYear() + "-"
let M = (date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1) + "-"
let D = (date.getDate() < 10 ? "0" + date.getDate() : date.getDate()) + " "
let h = (date.getHours() < 10 ? "0" + date.getHours() : date.getHours()) + ":"
let m = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes()
return "" + Y + M + D + h + m
}
provide("coinrankingState", coinrankingState)
provide("openCoinOperation", openCoinOperation)
2024-01-05 10:20:39 +00:00
// 处理点击转发统计
const handleShare = () => shareHttp({ token })
2024-01-09 07:53:19 +00:00
// 登录判断
const loginJudgment = () => {
if (isNeedLogin.value) goLogin()
}
2024-01-09 10:49:37 +00:00
// 取消了同页面的收藏
const unbookmarkSamePage = () => {
iscollection.value = 0
info.value.favnum--
}
provide("unbookmarkSamePage", unbookmarkSamePage)
2024-01-10 07:31:42 +00:00
let labelObj = {
offer: "Offer",
vote: "投票",
mj: "面经",
thread: "帖子",
ask: "回答",
}
2024-01-30 11:08:34 +00:00
let postCommentFocusState = ref(false)
const postInputRef = ref(null)
const postCommentFocusBlur = () => {
const refref = postInputRef.value
setTimeout(() => {
postCommentFocusState.value = false
nextTick(() => {
let targetDom = refref.querySelector(".el-textarea__inner")
targetDom.style.height = "41px"
})
}, 200)
}
2024-07-19 07:03:52 +00:00
let ripostelist = ref([])
let ripostecount = ref({})
let riposteoptions = ref({})
provide("riposteoptions", riposteoptions)
const getRiposte = () => {
getRiposteHttp({ token }).then(res => {
if (res.code != 200) return
let data = res.data
ripostecount.value = data.count || {}
ripostelist.value = data.list || []
riposteoptions.value = data.options || []
if (ripostelist.value.length <= 3) randomEmoji()
})
}
let randomEmojis = ref([]) // 随机 五个 emoji
provide("randomEmojis", randomEmojis)
// 随机 7 个Emoji
const randomEmoji = () => {
let emojiList = ripostelist.value
// 需要排除的 Emoji
let exclude = []
emojiList.forEach(element => {
exclude.push(element.item)
})
let selectedList = [] // 待选择 Emoji To be selected
// 默认是有点赞的
for (const key in riposteoptions.value[0].data) {
if (key != "c150") selectedList.push(key)
}
const random = []
if (!exclude.includes("c150")) random.push("c150") // 添加第一个点赞 emoji
selectedList = selectedList.filter(itemB => !exclude.includes(itemB))
// 生成随机索引,确保不重复
let indexes = []
while (indexes.length < 7) {
let randomIndex = Math.floor(Math.random() * selectedList.length)
if (indexes.indexOf(randomIndex) === -1) {
indexes.push(randomIndex)
random.push(selectedList[randomIndex])
}
}
randomEmojis.value = random
}
// 拼接 回应需要的 字符
const jointriposte = item => {
return `&#x${item};`
}
provide("jointriposte", jointriposte)
let riposteHttpState = false // 回应加载中
// 选择 emoji
const selectEomji = item => {
if (isNeedLogin.value) {
goLogin()
return
}
if (riposteHttpState) return
riposteHttpState = true
riposteSubmitHttp({ token, item })
.then(res => {
if (res.code != 200) {
ElMessage.error(res.message)
return
}
let data = res.data
handleEmojiData(data)
})
.finally(() => {
riposteHttpState = false
})
}
provide("selectEomji", selectEomji)
// 选中 在 Emoji 弹窗中 选择
const selectEomjiPop = key => {
if (isNeedLogin.value) {
goLogin()
return
}
let emojiList = ripostelist.value
// 判断 是否已经 有了
const index = emojiList.findIndex(item => item.item == key)
2024-07-25 06:13:42 +00:00
if (index != -1 && emojiList[index].selected) return
if (riposteHttpState) return
riposteHttpState = true
riposteSubmitHttp({ token, item: key })
.then(res => {
if (res.code != 200) {
ElMessage.error(res.message)
return
}
let data = res.data
handleEmojiData(data)
})
.finally(() => {
riposteHttpState = false
})
2024-07-19 07:03:52 +00:00
}
provide("selectEomjiPop", selectEomjiPop)
// 专门处理 展示列表的 数据结构
const handleEmojiData = data => {
let emojiList = ripostelist.value
let isnew = true
emojiList.forEach((element, index) => {
if (element.item == data.item) {
isnew = false
if (element.selected) element.num--
else element.num++
element.selected = !element.selected
}
})
// 代表是新数据
if (isnew) {
emojiList.push({
item: data.item,
num: 1,
selected: true,
})
}
let newArray = []
emojiList.forEach(item => {
if (item.num > 0) newArray.push(item)
})
if (newArray.length < 3) randomEmoji()
ripostecount.value = data.count
ripostelist.value = newArray
if (!isdisplay.value) isdisplay.value = true
}
// 选择回应
const selectListEomji = index => {
if (isNeedLogin.value) {
goLogin()
return
}
let emojiList = ripostelist.value
let target = emojiList[index]
if (riposteHttpState) return
riposteHttpState = true
riposteSubmitHttp({ token, item: target.item })
.then(res => {
if (res.code != 200) {
ElMessage.error(res.message)
return
}
let data = res.data
handleEmojiData(data)
})
.finally(() => {
riposteHttpState = false
})
}
2024-07-24 08:17:06 +00:00
let respondPopListState = ref(false) // 回应列表弹窗状态
let respondDetail = ref({}) // 已回应列表
// 打开回应弹窗列表
const openPopList = () => {
respondPopListState.value = true
getRespondDetail()
}
// 关闭回应弹窗列表
const closePopList = () => {
respondPopListState.value = false
}
// 回应详情
const getRespondDetail = () => {
riposteDetailHttp({ token }).then(res => {
if (res.code != 200) return
respondDetail.value = res.data
})
}
// 点击回应列表的
const selectEomjiListPop = key => {
// let respondDetail = respondDetail.value
let target = respondDetail.value[key]
riposteSubmitHttp({ token, item: target.item }).then(res => {
if (res.code != 200) {
ElMessage.error(res.message)
return
}
let data = res.data
handleEmojiData(data)
if (target.selected) {
target.user = target.user.filter(item => item.uin != data.uin)
} else {
target.user.push(data)
}
let emojiList = ripostelist.value
if (target.user.length == 0) {
emojiList = emojiList.filter(item => item.item != key)
delete respondDetail.value[key]
} else {
target.selected = !target.selected
respondDetail.value[key] = target
}
ripostelist.value = emojiList
})
}
2023-12-18 03:12:07 +00:00
</script>
<style lang="less" scoped>
2024-07-19 07:03:52 +00:00
@font-face {
font-family: "emojifont";
2024-07-25 04:06:40 +00:00
src: url("https://oss.x-php.com/static/riposte/emojifont-sbix.ttf?t=mj");
2024-07-19 07:03:52 +00:00
}
2023-12-18 03:12:07 +00:00
.content {
width: 1200px;
2024-01-03 09:08:29 +00:00
margin: 0 auto 60px;
2023-12-18 03:12:07 +00:00
background: #fff;
border-radius: 15px;
2024-01-02 11:03:39 +00:00
// position: sticky;
// top: 30px;
// left: 50%;
// transform: translateX(-50%);
2023-12-18 03:12:07 +00:00
.left {
width: 376px;
border-right: 16px solid #f6f6f6;
padding-top: 30px;
2023-12-25 10:39:49 +00:00
height: calc(100vh - 70px);
overflow: auto;
2024-01-03 07:28:16 +00:00
display: flex;
flex-direction: column;
2023-12-25 10:39:49 +00:00
2023-12-18 03:12:07 +00:00
.school-box {
flex-direction: column;
margin-bottom: 40px;
text-align: center;
2023-12-25 10:39:49 +00:00
.school-box-icon {
height: 52px;
.school-icon {
width: 40px;
height: 40px;
margin-bottom: 12px;
}
}
2023-12-18 03:12:07 +00:00
.school-name {
font-weight: 650;
font-size: 15px;
color: #000000;
margin-bottom: 7px;
2023-12-25 10:39:49 +00:00
height: 28px;
2023-12-18 03:12:07 +00:00
}
.school-en-name {
color: #555555;
font-size: 13px;
2023-12-25 10:39:49 +00:00
height: 18px;
2023-12-18 03:12:07 +00:00
}
}
.mj-total {
color: #7f7f7f;
line-height: 22px;
font-size: 13px;
margin-bottom: 20px;
padding: 0 30px;
.value {
font-weight: 650;
color: #000000;
margin: 0 5px;
}
}
.mj-list {
2024-01-05 10:20:39 +00:00
// &::-webkit-scrollbar {
// width: 6px !important;
// }
2024-01-03 09:08:29 +00:00
&::-webkit-scrollbar {
2024-01-05 10:20:39 +00:00
width: 0 !important;
2024-01-03 09:08:29 +00:00
}
2024-01-05 10:20:39 +00:00
scrollbar-width: none;
-ms-overflow-style: none;
2024-01-03 09:08:29 +00:00
margin-right: 9px;
2024-01-05 10:20:39 +00:00
padding: 0 30px 15px;
2024-01-03 07:28:16 +00:00
flex: 1;
overflow: auto;
2023-12-18 03:12:07 +00:00
.mj-item {
flex-direction: column;
margin-bottom: 15px;
padding: 14px 12px;
position: relative;
z-index: 1;
cursor: pointer;
2024-01-04 06:11:30 +00:00
position: relative;
2023-12-18 03:12:07 +00:00
2024-01-05 10:20:39 +00:00
&.recommend {
.mj-header {
display: inline-block;
.label {
2024-01-11 09:23:17 +00:00
// width: 60px;
height: 20px;
2024-01-10 07:31:42 +00:00
background-color: rgba(253, 223, 109, 0.117647058823529);
border: 1px solid rgba(228, 199, 98, 1);
border-radius: 5px;
2024-01-05 10:20:39 +00:00
font-size: 12px;
2024-01-10 07:31:42 +00:00
color: #e4c762;
text-align: center;
2024-01-05 10:20:39 +00:00
display: inline-flex;
margin-right: 10px;
2024-01-10 07:31:42 +00:00
.label-text {
2024-01-11 09:23:17 +00:00
width: 20px;
height: 20px;
2024-01-10 07:31:42 +00:00
background-color: rgba(228, 199, 98, 1);
border-radius: 5px;
font-size: 12px;
color: #ffffff;
}
.label-title {
padding: 0 5px;
2024-01-10 08:56:47 +00:00
height: 100%;
2024-01-11 09:23:17 +00:00
// line-height: 20px;
display: flex;
align-items: center;
2024-01-10 07:31:42 +00:00
}
2024-01-05 10:20:39 +00:00
}
h1 {
display: inline;
font-weight: 650;
font-size: 14px;
color: #000000;
line-height: 26px;
// display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
}
.thread-text {
color: #555555;
font-size: 13px;
.ask-label {
color: #7f7f7f;
}
}
.vote-list {
color: #555555;
font-size: 13px;
.vote-item {
&:not(:last-of-type) {
margin-bottom: 6px;
}
}
}
}
&:hover::after {
content: "";
position: absolute;
background: #f6f6f6;
top: 0;
left: 0;
width: 100%;
height: 100%;
border-radius: 10px;
z-index: -1;
}
2023-12-18 03:12:07 +00:00
&.pitch {
2024-01-04 06:11:30 +00:00
&::before,
&::after {
content: "";
position: absolute;
background: rgb(114, 219, 134);
}
&::after {
top: 0;
left: 0;
2024-01-05 10:20:39 +00:00
width: 100%;
2024-01-04 06:11:30 +00:00
height: 100%;
border-radius: 10px;
z-index: -1;
2023-12-18 03:12:07 +00:00
}
2024-01-04 06:11:30 +00:00
&::before {
top: 50%;
2024-01-05 10:20:39 +00:00
left: 100%;
2024-01-04 06:11:30 +00:00
width: 10px;
height: 10px;
transform: translate(-64%, -50%) rotate(45deg);
}
2023-12-18 03:12:07 +00:00
.mj-header {
.user-name {
color: #fff;
}
.time {
color: #fff;
}
}
.info-list {
.info-item {
.info-name {
color: #fff;
}
.info-value {
color: #fff;
}
}
}
}
.item-bj {
width: 100%;
height: 100%;
z-index: -1;
position: absolute;
top: 0;
left: 0;
display: none;
}
.mj-header {
font-size: 12px;
margin-bottom: 12px;
2023-12-18 11:09:29 +00:00
// justify-content: space-between;
2023-12-18 03:12:07 +00:00
.mj-avatar {
2023-12-29 10:37:38 +00:00
width: 20px;
height: 20px;
2023-12-18 03:12:07 +00:00
margin-right: 10px;
border-radius: 50%;
}
.user-name {
color: #555;
margin-right: 10px;
}
.time {
color: #aaa;
}
}
.info-list {
flex-direction: column;
.info-item {
line-height: 20px;
&:not(:last-of-type) {
2023-12-29 10:37:38 +00:00
margin-bottom: 8px;
2023-12-18 03:12:07 +00:00
}
.info-name {
color: #7f7f7f;
font-size: 13px;
margin-right: 10px;
}
.info-value {
color: #333333;
font-size: 13px;
}
}
}
}
}
}
.right {
2024-01-03 09:08:29 +00:00
// height: calc(100vh - 80px);
2023-12-25 10:39:49 +00:00
overflow: auto;
2024-01-03 07:28:16 +00:00
padding: 5px 0;
2023-12-25 10:39:49 +00:00
&::-webkit-scrollbar {
width: 0 !important;
}
scrollbar-width: none;
-ms-overflow-style: none;
2023-12-29 10:37:38 +00:00
position: relative;
2023-12-25 10:39:49 +00:00
2023-12-18 03:12:07 +00:00
.header {
2024-01-04 09:12:58 +00:00
padding: 30px 30px 25px 45px;
2023-12-18 03:12:07 +00:00
border-bottom: 1px solid #ebebeb;
2024-01-03 09:08:29 +00:00
.titletitle {
2023-12-18 03:12:07 +00:00
font-size: 24px;
font-weight: 650;
color: #000000;
margin-bottom: 15px;
}
2023-12-29 10:37:38 +00:00
.mj-header-left {
position: relative;
}
2023-12-18 03:12:07 +00:00
.mj-header {
line-height: 22px;
font-size: 13px;
2023-12-18 11:09:29 +00:00
justify-content: space-between;
2023-12-18 03:12:07 +00:00
.mj-avatar {
width: 24px;
height: 24px;
margin-right: 10px;
border-radius: 50%;
}
.user-name {
color: #333333;
margin-right: 10px;
}
.time {
color: #aaaaaa;
}
2023-12-18 11:09:29 +00:00
.mj-header-right {
2024-01-05 10:20:39 +00:00
color: #333;
font-size: 14px;
cursor: pointer;
.original-icon {
width: 18px;
height: 16px;
margin-right: 7px;
2023-12-18 11:09:29 +00:00
}
}
2023-12-18 03:12:07 +00:00
}
}
.details-box {
border-bottom: 1px solid #ebebeb;
padding-top: 41px;
.details-item {
margin-bottom: 40px;
.details-top {
font-weight: 650;
font-size: 14px;
color: #000000;
padding-left: 60px;
position: relative;
margin-bottom: 21px;
&::after {
content: "";
width: 6px;
height: 10px;
position: absolute;
top: 5px;
left: 44px;
background-color: rgba(98, 177, 255, 1);
border-radius: 3px;
}
}
.details-list {
width: 733px;
margin-left: 60px;
padding: 20px;
background: inherit;
background-color: rgba(246, 246, 246, 1);
border-radius: 10px;
font-size: 14px;
.details-list-item {
&:not(:last-of-type) {
margin-bottom: 20px;
}
.details-name {
color: #555;
margin-right: 30px;
}
.details-value {
color: #000000;
2023-12-29 10:37:38 +00:00
white-space: break-spaces;
2024-01-02 11:03:39 +00:00
word-wrap: break-word;
2023-12-29 10:37:38 +00:00
// width: 693px;
2023-12-18 03:12:07 +00:00
&.date {
font-weight: 900;
font-style: normal;
font-size: 16px;
color: #000000;
font-family: "Arial-Black", "Arial Black", sans-serif;
}
&.describe {
font-size: 15px;
line-height: 30px;
position: relative;
2023-12-29 10:37:38 +00:00
width: 693px;
2023-12-18 03:12:07 +00:00
.unlock-mask {
display: none;
}
&.unlock-unlock {
overflow: hidden;
2024-01-09 10:49:37 +00:00
height: 180px;
// cursor: pointer;
2023-12-18 03:12:07 +00:00
.unlock-mask {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
2024-01-09 10:49:37 +00:00
background: linear-gradient(to top, rgba(246, 246, 246, 1) 70%, transparent);
2023-12-18 03:12:07 +00:00
font-size: 14px;
color: #000000;
flex-direction: column;
align-items: center;
justify-content: flex-end;
padding-bottom: 38px;
line-height: normal;
2023-12-29 10:37:38 +00:00
display: flex;
2023-12-18 03:12:07 +00:00
> div {
margin-top: 7px;
}
.emphasis {
font-weight: 650;
color: #fa6b11;
}
}
}
}
}
}
}
}
}
2024-07-19 07:03:52 +00:00
.respond-area {
border-bottom: 1px solid #ebebeb;
padding: 40px 45px 30px;
.respond-title {
font-family: "PingFangSC-Semibold", "PingFang SC Semibold", "PingFang SC", sans-serif;
font-weight: 650;
color: #000000;
font-size: 16px;
line-height: 20px;
margin-bottom: 20px;
.value {
font-family: "PingFangSC-Regular", "PingFang SC", sans-serif;
font-weight: 400;
color: #555555;
margin-left: 5px;
2024-07-24 08:17:06 +00:00
flex: 1;
}
.respond-list-btn {
font-weight: 400;
cursor: pointer;
color: #555555;
font-size: 13px;
display: flex;
align-items: center;
.respond-list-btn-amount {
font-weight: 650;
color: #333;
margin: 0 5px;
}
.respond-list-btn-icon {
width: 6px;
margin-left: 5px;
}
2024-07-19 07:03:52 +00:00
}
}
.respond-no-box {
width: 382px;
height: 40px;
background-color: rgba(255, 255, 255, 1);
border: 1px solid rgba(235, 235, 235, 1);
border-radius: 40px 208px 208px 40px;
/deep/ .respond-add {
margin: 5px;
}
.respond-no {
display: flex;
justify-content: space-around;
.code {
margin-right: 4px;
line-height: 30px;
font-size: 16px;
font-family: "emojifont";
cursor: pointer;
user-select: none;
}
}
}
.respond-box {
display: flex;
flex-wrap: wrap;
.respond-item {
font-size: 12px;
color: #555555;
height: 30px;
2024-07-24 08:17:06 +00:00
border: 1px solid #d7d7d7;
background: #fff;
2024-07-19 07:03:52 +00:00
border-radius: 8px;
padding: 0 6px;
display: inline-flex;
margin-right: 10px;
margin-bottom: 10px;
cursor: pointer;
user-select: none;
.code {
margin-right: 4px;
line-height: 30px;
font-size: 16px;
font-family: "emojifont";
user-select: none;
}
&.pitch {
2024-07-24 08:17:06 +00:00
border: none;
background: #f6f6f6;
2024-07-19 07:03:52 +00:00
}
}
.respond-select {
width: 250px;
height: 30px;
background-color: rgba(255, 255, 255, 1);
border: 1px solid rgba(235, 235, 235, 1);
border-radius: 208px;
.respond-select-box {
justify-content: space-around;
.respond-select-item {
cursor: pointer;
font-size: 16px;
font-family: "emojifont";
line-height: 30px;
}
}
}
}
}
2023-12-18 03:12:07 +00:00
.comment-box {
padding-top: 40px;
padding-left: 45px;
.comment-title {
font-size: 16px;
line-height: 20px;
font-weight: 650;
color: #000000;
margin-bottom: 16px;
.value {
color: #555;
font-weight: 400;
margin-left: 5px;
}
}
.post-comment {
width: 749px;
2024-01-30 11:08:34 +00:00
// height: 60px;
2023-12-18 03:12:07 +00:00
background-color: rgba(255, 255, 255, 1);
border: 1px solid rgba(215, 215, 215, 1);
border-radius: 6px;
margin-bottom: 30px;
2024-01-30 11:08:34 +00:00
transition: all 5s;
overflow: hidden;
position: relative;
&.post-comment-focus {
.post-input {
/deep/ .el-textarea__inner {
2024-02-18 02:54:18 +00:00
// width: 468px;
2024-01-30 11:08:34 +00:00
min-height: 200px !important;
max-height: 80vh;
padding-bottom: 52px;
}
/deep/ .el-input__count {
display: block;
left: 10px;
}
}
.post-ok {
height: 32px;
bottom: 10px;
right: 10px;
}
.post-comment-input {
width: 749px;
}
}
.post-comment-input {
width: 690px;
}
2023-12-18 03:12:07 +00:00
.post-input {
height: 100%;
border: none;
outline: none;
background-color: transparent;
outline-color: rgba(98, 177, 255, 1);
2024-01-30 11:08:34 +00:00
// padding: 10px;
2023-12-18 03:12:07 +00:00
font-size: 14px;
resize: none;
&::placeholder {
color: #aaaaaa;
}
2024-01-02 11:03:39 +00:00
&::-webkit-scrollbar {
width: 0 !important;
}
scrollbar-width: none;
-ms-overflow-style: none;
2023-12-18 03:12:07 +00:00
}
2024-01-30 11:08:34 +00:00
.post-input {
background-color: transparent;
font-size: 14px;
resize: none;
transition: all 0.5s;
&::placeholder {
color: #aaaaaa;
}
&::-webkit-scrollbar {
width: 0 !important;
}
scrollbar-width: none;
-ms-overflow-style: none;
border: none;
/deep/ .el-textarea__inner {
border: none;
box-shadow: none;
resize: none;
min-height: 60px !important;
// height: 60px !important;
padding: 10px;
transition: all 0.5s;
}
/deep/ .el-input__count {
display: none;
}
}
2023-12-18 03:12:07 +00:00
.post-ok {
width: 60px;
2024-01-30 11:08:34 +00:00
height: 62px;
2023-12-18 03:12:07 +00:00
background-color: rgba(98, 177, 255, 1);
color: #fff;
2023-12-25 10:39:49 +00:00
font-size: 14px;
2023-12-18 03:12:07 +00:00
cursor: pointer;
border-radius: 6px;
2024-01-30 11:08:34 +00:00
transition: all 0.5s;
position: absolute;
bottom: 0;
right: 0;
2023-12-18 03:12:07 +00:00
}
}
2023-12-25 10:39:49 +00:00
.empty-box {
padding: 80px 0 110px;
}
2023-12-18 03:12:07 +00:00
.comment-list {
margin-bottom: 78px;
.comment-item {
&:not(:first-of-type) {
.comment-avatar {
margin-top: 10px;
}
.comment-header {
padding-top: 10px;
border-top: 1px dotted #d7d7d7;
}
}
padding-right: 30px;
.comment-avatar {
width: 20px;
height: 20px;
border-radius: 50%;
margin-right: 10px;
2024-01-04 09:12:58 +00:00
cursor: pointer;
2023-12-18 03:12:07 +00:00
}
.comment-content {
.comment-header {
display: flex;
justify-content: space-between;
padding-right: 30px;
margin-bottom: 10px;
.comment-header-left {
font-size: 13px;
.comments-avatar {
width: 20px;
height: 20px;
margin-right: 10px;
border-radius: 50%;
}
.comments-username {
color: #555;
margin-right: 10px;
2024-01-04 09:12:58 +00:00
cursor: pointer;
2023-12-18 03:12:07 +00:00
}
.comments-time {
color: #aaaaaa;
2023-12-29 10:37:38 +00:00
// margin-right: 8px;
margin-right: 10px;
2023-12-18 03:12:07 +00:00
}
2024-01-30 11:08:34 +00:00
// .floor-left .comments-identity {
.comments-identity {
2023-12-18 03:12:07 +00:00
font-size: 12px;
color: #7f7f7f;
padding: 0 3px;
height: 20px;
background-color: rgba(240, 242, 245, 1);
border: 1px solid rgba(215, 215, 215, 1);
border-radius: 5px;
2024-01-09 10:49:37 +00:00
margin-right: 10px;
2023-12-18 03:12:07 +00:00
}
}
.comment-header-right {
.menu-box {
position: relative;
&:hover .report-box {
display: flex;
}
.menu-icon {
width: 14px;
height: 14px;
cursor: pointer;
}
.report-box {
display: none;
position: absolute;
top: 24px;
right: 0;
width: 60px;
height: 24px;
background-color: rgba(246, 246, 246, 1);
border: 1px solid rgba(215, 215, 215, 1);
border-radius: 5px;
font-size: 12px;
color: #7f7f7f;
cursor: pointer;
&::after {
content: "";
width: 58px;
height: 36px;
position: absolute;
top: -14px;
right: 0;
}
}
}
.comment-icon {
width: 14px;
height: 13px;
margin-left: 30px;
cursor: pointer;
}
.like-box {
font-size: 12px;
color: #aaa;
margin-left: 30px;
cursor: pointer;
.like-icon {
width: 14px;
height: 14px;
}
.like-quantity {
margin-left: 6px;
}
}
}
}
.comment-text {
font-size: 14px;
line-height: 22px;
color: #333;
margin-bottom: 10px;
2023-12-29 10:37:38 +00:00
word-break: break-all;
2024-01-03 03:42:49 +00:00
min-height: 22px;
2024-01-04 09:12:58 +00:00
cursor: pointer;
2023-12-18 03:12:07 +00:00
.comments-reply {
color: #92a1bf;
display: inline;
}
}
2024-01-31 07:29:31 +00:00
.comments-input-masking {
width: 100vw;
height: 100vh;
min-width: 1200px;
position: fixed;
top: 0;
left: 0;
z-index: 10;
}
2023-12-18 03:12:07 +00:00
.comments-input-box {
margin-top: 13px;
2024-01-31 07:29:31 +00:00
// margin-bottom: 10px;
// height: 0;
// overflow: hidden;
transition: all 0.3s;
position: relative;
z-index: 11;
&.comments-input-box-show {
height: 184px;
// overflow: visible;
margin-bottom: 10px;
2023-12-18 03:12:07 +00:00
&::after {
content: "";
width: 20px;
height: 20px;
display: block;
background-color: rgba(215, 215, 215, 1);
position: absolute;
top: -2px;
left: 21px;
transform: rotate(45deg);
z-index: -1;
}
2024-01-31 07:29:31 +00:00
.comments-input {
border: 1px solid rgba(215, 215, 215, 1);
background-color: #fff;
/deep/ textarea {
height: 140px;
padding: 10px;
min-height: 40px !important;
overflow: auto;
}
/deep/ .el-input__count {
display: block;
}
2023-12-18 03:12:07 +00:00
2024-01-31 07:29:31 +00:00
.operate-bottom {
display: flex;
}
}
}
.comments-input {
// width: 519px;
flex: 1;
border-color: #fff;
// height: 60px;
// border: 1px solid rgba(215, 215, 215, 1);
// border-right: none;
border-radius: 8px;
// margin-right: 16px;
position: relative;
z-index: 1;
transition: all 0.3s;
// background-color: #fff;
// &::after {
// content: "";
// width: 20px;
// height: 20px;
// display: block;
// background-color: rgba(215, 215, 215, 1);
// position: absolute;
// top: -2px;
// left: 21px;
// transform: rotate(45deg);
// z-index: -1;
// }
/deep/ textarea {
2023-12-18 03:12:07 +00:00
border: none;
outline: none;
resize: none;
2024-01-31 07:29:31 +00:00
padding: 10px;
// border-radius: 7px 0 0 7px;
border-radius: 8px;
font-size: 14px;
width: 100%;
// height: 140px;
height: 0;
padding: 0 10px;
min-height: 0 !important;
transition: all 0.2s;
overflow: hidden;
2023-12-18 03:12:07 +00:00
}
2024-01-31 07:29:31 +00:00
/deep/ .el-textarea__inner {
box-shadow: none;
}
/deep/ .el-input__count {
left: 10px;
bottom: -32px;
width: fit-content;
display: none;
}
/deep/ .el-textarea {
display: block;
2023-12-18 03:12:07 +00:00
}
2024-01-31 07:29:31 +00:00
.operate-bottom {
justify-content: flex-end;
display: none;
transition: all 0.3s;
.comments-btn {
width: 60px;
height: 32px;
border-radius: 6px;
background-color: rgba(98, 177, 255, 1);
// border-radius: 0 7px 7px 0;
font-size: 14px;
color: #ffffff;
cursor: pointer;
margin-right: 10px;
margin-bottom: 10px;
&.comments-btn-cancel {
border: 1px solid #cccccc;
color: #797979;
background-color: #fff;
}
}
}
2023-12-18 03:12:07 +00:00
}
2024-01-31 07:29:31 +00:00
// .forkfork {
// width: 12px;
// height: 12px;
// cursor: pointer;
// }
2023-12-18 03:12:07 +00:00
}
}
.child-comments {
.comment-avatar {
margin-top: 10px;
}
.comment-header {
padding-top: 10px;
border-top: 1px dotted #d7d7d7;
}
.comment-item {
padding-right: 0;
}
}
.comments-also {
color: #62b1ff;
line-height: 22px;
font-size: 13px;
height: 46px;
margin-left: 30px;
cursor: pointer;
border-top: 1px dotted #d7d7d7;
.also-icon {
width: 10px;
height: 10px;
margin-left: 8px;
}
}
}
}
.comment-end {
font-size: 12px;
color: #d7d7d7;
text-align: center;
2024-01-04 03:12:34 +00:00
margin-bottom: 118px;
2024-01-04 09:12:58 +00:00
padding-right: 30px;
2023-12-18 03:12:07 +00:00
}
}
}
.floor-area {
position: fixed;
left: 0;
bottom: 0;
width: 100vw;
2023-12-18 11:09:29 +00:00
min-width: 1200px;
2023-12-18 03:12:07 +00:00
height: 70px;
2024-01-31 07:29:31 +00:00
z-index: 11;
2023-12-18 03:12:07 +00:00
background-color: rgba(255, 255, 255, 1);
-moz-box-shadow: 0px -1px 2px rgba(0, 0, 0, 0.192156862745098);
-webkit-box-shadow: 0px -1px 2px rgba(0, 0, 0, 0.192156862745098);
box-shadow: 0px -1px 2px rgba(0, 0, 0, 0.192156862745098);
.floor-content {
width: 1200px;
height: 100%;
margin: 0 auto;
padding: 0 30px;
display: flex;
justify-content: space-between;
// background: #000000;
.floor-left {
2024-01-09 10:49:37 +00:00
// width: 373px;
height: 40px;
2024-01-11 08:58:15 +00:00
// background-color: rgba(98, 177, 255, 0.0980392156862745);
2024-01-09 10:49:37 +00:00
border-radius: 150px;
padding: 0 20px;
2023-12-18 03:12:07 +00:00
.item {
cursor: pointer;
color: #aaaaaa;
font-size: 13px;
2024-01-09 10:49:37 +00:00
&:not(:last-of-type) {
margin-right: 40px;
}
2023-12-18 03:12:07 +00:00
.icon {
2024-01-09 10:49:37 +00:00
// width: 16px;
&.h16 {
height: 16px;
}
&.h15 {
height: 15px;
}
&.h8 {
height: 8px;
}
2023-12-18 03:12:07 +00:00
margin-right: 5px;
}
&.operate-item {
position: relative;
display: flex;
justify-content: center;
}
}
}
2024-01-05 10:20:39 +00:00
.floor-middle {
2024-01-10 09:19:14 +00:00
min-width: 247px;
2024-01-05 10:20:39 +00:00
height: 40px;
background-color: rgba(246, 246, 246, 1);
border-radius: 150px;
.coin-content {
2024-01-10 09:19:14 +00:00
padding: 0 20px 0 16px;
2024-01-05 10:20:39 +00:00
height: 100%;
2024-01-10 08:56:47 +00:00
// cursor: pointer;
2024-01-05 10:20:39 +00:00
.coin-icon {
width: 20px;
height: 24px;
margin-right: 5px;
margin-top: -2px;
}
.coin-text {
font-size: 13px;
color: #333333;
.coin-value {
font-family: "Arial-Black", "Arial Black", sans-serif;
font-weight: 900;
margin: 0 5px;
}
}
}
.coin-btn {
2024-01-10 09:19:14 +00:00
width: 80px;
2024-01-05 10:20:39 +00:00
height: 40px;
background-color: rgba(114, 219, 134, 1);
border-radius: 150px;
color: #ffffff;
font-size: 13px;
cursor: pointer;
}
}
2023-12-18 03:12:07 +00:00
.floor-right {
color: #7f7f7f;
font-size: 13px;
cursor: pointer;
.arrows-icon {
width: 12px;
height: 12px;
margin: 0 10px;
}
.QR-code-ball {
width: 40px;
height: 40px;
background-color: rgba(246, 246, 246, 1);
border-radius: 20px;
cursor: pointer;
}
}
}
}
}
.transmit-box {
width: 628px;
border-radius: 10px;
justify-content: space-between;
padding: 40px 35px 42px;
// z-index: 3;
cursor: auto;
.cross-icon {
width: 22px;
height: 22px;
position: absolute;
top: 6px;
right: 6px;
cursor: pointer;
padding: 6px;
}
.transmit-title {
font-weight: 650;
font-size: 16px;
color: #000000;
line-height: 24px;
margin-bottom: 24px;
}
.transmit-content {
border: 1px solid rgba(242, 242, 242, 1);
border-radius: 16px;
}
.transmit-web {
.transmit-content {
width: 300px;
font-size: 14px;
line-height: 24px;
padding: 14px 16px;
margin-bottom: 32px;
.transmit-headline {
color: #333333;
}
.transmit-url {
color: #aaaaaa;
word-wrap: break-word;
}
}
.transmit-web-btn {
width: 120px;
height: 38px;
background-color: rgba(114, 219, 134, 1);
border-radius: 8px;
font-size: 14px;
color: #fff;
cursor: pointer;
}
}
.transmit-mini {
.transmit-content {
flex-direction: column;
padding: 22px 44px;
.transmit-mini-img {
width: 90px;
height: 90px;
margin-bottom: 21px;
}
color: #555555;
// line-height: 22px;
font-size: 13px;
.give-sweep {
width: 12px;
height: 12px;
margin-right: 8px;
}
}
}
}
.examine-code {
width: 113px;
height: 113px;
}
2024-01-05 10:20:39 +00:00
.pop-masking {
* {
box-sizing: content-box;
}
width: 100vw;
height: 100vh;
position: fixed;
top: 0;
left: 0;
background: rgba(0, 0, 0, 0.6);
z-index: 10;
.slit-pop-box {
width: 433px;
border: 1px solid #e5e5e5;
background-color: #fff;
border-radius: 20px;
padding: 60px 50px 48px 38px;
display: flex;
-webkit-box-shadow: 0px 0px 15px rgba(0, 0, 0, 0.21);
box-shadow: 0px 0px 15px rgba(0, 0, 0, 0.21);
.slit-left-icon {
width: 50px;
height: 60px;
}
.slit-box {
flex: 1;
margin-left: 15px;
.slit-head {
display: flex;
align-items: center;
justify-content: space-between;
height: 54px;
.slit-head-title {
font-weight: 650;
font-size: 20px;
color: #333;
}
.in-all {
font-size: 13px;
color: #7f7f7f;
font-weight: 400;
& > span {
color: #000;
font-weight: 650;
}
}
}
.coin-quantity {
display: flex;
align-items: center;
margin-bottom: 27px;
margin-top: 20px;
}
.coin-quantity-item {
width: 78px;
height: 46px;
border: 1px solid #d7d7d7;
background-color: #f0f2f5;
border-radius: 5px;
font-size: 20px;
color: #000;
font-weight: 650;
line-height: 46px;
text-align: center;
cursor: pointer;
user-select: none;
& > span {
color: #555;
font-weight: 400;
font-size: 14px;
}
&:not(:last-of-type) {
margin-right: 16px;
}
&.coin-pitch {
background-color: #333333;
border-color: #333333;
color: #fff;
& > span {
color: #fff;
}
}
}
.slit-input {
width: 360px;
height: 38px;
padding-left: 8px;
border: 1px solid #d7d7d7;
outline: none;
border-radius: 8px;
/* 去掉number类型自带的加减按钮 */
overflow: hidden;
&::-webkit-outer-spin-button,
&::-webkit-inner-spin-button {
-webkit-appearance: none;
}
&[type="number"] {
-moz-appearance: textfield;
}
/deep/ .el-input__wrapper {
box-shadow: none;
}
}
.message-box {
display: flex;
flex-direction: column;
.message-hint {
color: #000;
font-size: 14px;
margin-top: 29px;
margin-bottom: 12px;
}
}
.operation {
display: flex;
justify-content: flex-end;
margin-top: 48px;
.operation-item {
width: 120px;
height: 41px;
margin-left: 16px;
font-size: 16px;
color: #000;
border: 1px solid #797979;
border-radius: 45px;
cursor: pointer;
&.greenBj {
color: #fff;
}
}
}
}
}
}
.no-jituobi-pop-box {
width: 520px;
flex-direction: column;
border: 1px solid #e5e5e5;
background-color: #fff;
border-radius: 11px;
display: flex;
-webkit-box-shadow: 0px 0px 15px rgba(0, 0, 0, 0.21);
box-shadow: 0px 0px 15px rgba(0, 0, 0, 0.21);
padding-bottom: 55px;
position: relative;
.no-jituobi-close {
width: 16px;
height: 16px;
cursor: pointer;
position: absolute;
top: 10px;
right: 10px;
}
.no-jituobi-head {
font-size: 15px;
color: #333;
margin: 38px auto 44px;
.bi-icon {
width: 50px;
height: 60px;
}
}
.strategy-btn {
width: 198px;
height: 43px;
color: #fff;
font-size: 16px;
border-radius: 100px;
margin: 0 auto;
cursor: pointer;
.strategy-icon {
width: 16px;
height: 16px;
margin-left: 8px;
}
}
}
.greenBj {
background-color: rgba(114, 219, 134, 1);
border-color: rgba(114, 219, 134, 1) !important;
}
2024-07-24 08:17:06 +00:00
.respond-pop-mask {
width: 100vw;
height: 100vh;
position: fixed;
top: 0;
left: 0;
background: rgba(0, 0, 0, 0.6);
z-index: 10;
display: flex;
justify-content: center;
align-items: center;
.respond-pop {
width: 600px;
height: 500px;
background-color: #fff;
border: 1px solid #e5e5e5;
border-radius: 20px;
box-shadow: 0px 0px 15px rgba(0, 0, 0, 0.21);
-webkit-box-shadow: 0px 0px 15px rgba(0, 0, 0, 0.21);
.respond-pop-title {
height: 50px;
display: flex;
justify-content: center;
border-bottom: 1px dotted rgba(215, 215, 215, 0.5);
align-items: center;
color: #555555;
position: relative;
.respond-pop-amount {
margin: 0 8px;
font-weight: 650;
color: #000000;
}
.respond-title-icon {
position: absolute;
width: 20px;
right: 20px;
cursor: pointer;
}
}
.respond-list {
overflow: auto;
height: 450px;
&::-webkit-scrollbar-track {
border-radius: 10px;
}
&::-webkit-scrollbar-thumb {
background-color: #0003;
border-radius: 10px;
transition: all 0.2s ease-in-out;
}
&::-webkit-scrollbar {
width: 6px;
}
.respond-item {
display: flex;
padding: 20px 0 0 20px;
&:not(:last-of-type) .respond-content {
border-bottom: 1px dotted rgba(215, 215, 215, 0.5);
}
.respond-code {
width: 60px;
height: 60px;
background-color: rgba(246, 246, 246, 1);
border-radius: 10px;
font-family: "emojifont";
font-size: 25px;
display: flex;
justify-content: center;
align-items: center;
margin-right: 20px;
cursor: pointer;
box-sizing: border-box;
&.pitch {
background-color: #f6f6bd;
border: 1px solid #ccd003;
}
}
.respond-content {
padding-bottom: 10px;
.respond-total {
font-size: 14px;
color: #7f7f7f;
margin-bottom: 10px;
}
.user-item {
font-size: 14px;
color: #555555;
display: inline-flex;
margin-right: 20px;
margin-bottom: 10px;
align-items: center;
cursor: pointer;
.user-avatar {
width: 26px;
height: 26px;
border-radius: 50%;
margin-right: 10px;
}
}
}
}
}
.respond-pop-no {
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
position: relative;
.respond-title-icon {
position: absolute;
width: 20px;
top: 20px;
right: 20px;
cursor: pointer;
}
.respond-pop-no-icon {
width: 90px;
margin-bottom: 15px;
}
.respond-pop-no-text {
font-size: 13px;
color: #7f7f7f;
line-height: 22px;
}
}
}
}
2023-12-18 03:12:07 +00:00
</style>