糖尿病网pc端官网
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

945 lines
26 KiB

<!-- eslint-disable vue/no-v-html-->
<template>
<div class="article-detail-page" style="padding: 30px 0">
<div class="left-content">
<div class="top">
<img
v-if="!articleData.thumb"
src="~/assets/images/article_cover.png"
alt=""
style="display: none"
/>
<img
v-else
:src="articleData.thumb"
:alt="articleData.title"
style="display: none"
/>
<h4>{{ articleData.title }}</h4>
</div>
<p>
{{ articleData.hit }}&nbsp;<i class="el-icon-view"></i>&nbsp;&nbsp;{{
articleData.published_at
}}
</p>
<div v-if="showNovoTeacher" class="chatbot-audio">
<img src="~/assets/images/chatbot_audio_feature.png" alt="" />
<div>
<h6>保护双眼,听小诺朗读</h6>
<div>
<img
:style="{ display: audioPause ? '' : 'none' }"
src="~/assets/images/play_chatbot_audio.png"
alt=""
@click="playPauseAudio"
/>
<img
:style="{ display: !audioPause ? '' : 'none' }"
src="~/assets/images/pause_chatbot_audio.png"
alt=""
@click="playPauseAudio"
/>
<div>
<span :style="{ color: playTime != '00:00' ? '#3099EA' : '' }">{{
playTime
}}</span>
<p><span :style="{ width: playWidth + '%' }"></span></p>
<span>{{ allTime }}</span>
</div>
</div>
<audio
ref="chatbotAudio"
:src="articleData.audio_url"
@canplay="getDuration"
@timeupdate="updateTime"
@ended="audioEnd"
></audio>
</div>
</div>
<div v-if="articleData.video_url" class="video-box">
<video
x5-video-player-type="h5"
x5-video-player-fullscreen="true"
x-webkit-airplay="true"
x5-playsinline="true"
webkit-playsinline="true"
playsinline="true"
width="100%"
controls
style="object-fit: fill"
:poster="articleData.thumb"
:src="articleData.video_url"
></video>
</div>
<div class="article-content" v-html="articleData.content"></div>
<div class="bottom-box">
<p
v-if="!isLogin && deviceType === 'pc'"
class="go-follow"
@click="
baiduStat('文章详情页', 'click', '文章详情页-未登录按钮');
showLoginDialog(true);
"
>
点击关注微信公众号,查看更多专业资讯
</p>
<div class="comment-box">
<h6>
<span>最新看法</span>
<span @click="getCommentCorpus(1, 1)">发表你的看法</span>
</h6>
<div class="comment-content">
<Barrage
ref="barrage"
class="barrage"
:barrage-list="barrageList"
:speed="deviceType === 'pc' ? 4 : 3"
:loop="true"
:channels="3"
:border-color="'#ededed'"
:background="'#fff'"
:barrage-height="120"
:device-type="deviceType"
/>
</div>
<p v-if="!barrageIsShow">还没有人发表看法</p>
</div>
</div>
</div>
<div
class="right-content"
:style="{ position: isFixed ? 'fixed' : 'static', right: right + 'px' }"
>
<h6 class="common-title">
猜你喜欢<img src="~/assets/images/heart.png" alt="" />
</h6>
<div>
<div
v-for="item in recommendArticles"
:key="item.id"
@click="
baiduStat(
'文章详情页',
'click',
'文章点击猜你喜欢-' + item.id + '+' + item.title
);
goHref('/article/' + item.id);
"
>
<img
v-if="!item.thumb"
src="~/assets/images/article_cover.png"
alt=""
/>
<img v-else :src="item.thumb" :alt="item.title" />
<p>{{ item.title }}</p>
<div class="bottom">
<span
>{{ item.hit
}}<i class="el-icon-view" style="margin-right: 8px"></i
>{{ item.collect }}<i class="el-icon-star-on"></i
></span>
</div>
</div>
</div>
</div>
<div v-if="commentModelPopupShow" class="comment-model-popup">
<div class="mask" @click="commentModelPopupShow = false"></div>
<div class="content">
<div
ref="commentCorpus"
:style="{ maxHeight: commentMaxHeight + 'px' }"
>
<div ref="commentCorpusContent">
<div>
<template v-for="(item, index) in commentModelList">
<div :key="'comment' + item.id">
<p
:class="item.chosen ? 'chosen' : ''"
@click="chooseCorpus(item.id, index)"
>
{{ item.content }}
</p>
</div>
</template>
</div>
<p v-if="commentLoading" class="load-more">
加载更多<i class="el-icon-loading"></i>
</p>
</div>
</div>
<p @click="commentArticle">立即发布</p>
</div>
</div>
<BottomRightFixed
:show-share="true"
:show-collect="true"
:is-login="isLogin"
:is-collect="articleData.is_collected"
:show-comment="true"
@commentClick="getCommentCorpus(1, 2)"
@collectClick="collectArticle"
/>
</div>
</template>
<script>
import { createNamespacedHelpers } from 'vuex';
const { mapActions, mapGetters } = createNamespacedHelpers('user');
export default {
name: 'ArticleDetailPage',
layout: 'detail',
validate({ params }) {
return /^\d+$/.test(params.id);
},
async asyncData({ $axios, params, req, redirect }) {
// if (!process.server) return;
const data = await $axios.$get(
'/article/detail/' + params.id,
$axios.genSSROptions(req)
);
// data.detail.articleData.audio_url = 'https://app.diabetes.com.cn/uploadfile/article/audio/8160-16395833618215.mp3';
// console.log('dafa:', data);
if (data.success === false) {
redirect('/error?code=' + 404);
}
return { ...data.detail };
},
data() {
return {
audioPause: true,
playTime: '00:00',
allTime: '00:00',
canPlayAudio: false,
playWidth: 0,
barrageIsShow: false,
barrageList: [],
commentModelPopupShow: false,
commentModelList: [],
inComment: false,
commentPage: 1,
commentLoading: false,
commentHasMore: true,
chosenCommentId: 0,
inCollect: false,
isFixed: false,
right: 89,
commentMaxHeight: 300
};
},
head() {
return {
title: this.articleData.title,
meta: [
{
hid: 'description',
name: 'description',
content: 'Home page description'
}
]
};
},
computed: {
...mapGetters({
isLogin: 'isLogin'
}),
deviceType() {
return this.$store.state.device.deviceType;
},
env() {
return this.$store.state.device.env;
}
},
mounted() {
const that = this;
this.getComment();
this.$nextTick(() => {
if (that.deviceType === 'pc') {
window.addEventListener('scroll', function () {
that.isFixed = true;
const scrollLeft =
document.documentElement.scrollLeft || document.body.scrollLeft;
if (document.documentElement.offsetWidth < 1258) {
that.right =
89 - (1258 - document.documentElement.offsetWidth) + scrollLeft;
} else {
that.right = (document.documentElement.offsetWidth - 1080) / 2;
}
});
} else {
that.commentMaxHeight =
(document.documentElement.clientHeight ||
document.body.clientHeight) * 0.6;
if (this.deviceType === 'ios') {
if (that.env === 'wechat') {
document.addEventListener(
'WeixinJSBridgeReady',
function () {
that.$refs.chatbotAudio.play();
that.$refs.chatbotAudio.pause();
that.$refs.chatbotAudio.currentTime = 0;
},
false
);
} else {
window.onload = function () {
that.$refs.chatbotAudio.play();
that.$refs.chatbotAudio.pause();
that.$refs.chatbotAudio.currentTime = 0;
if (!isNaN(that.$refs.chatbotAudio.duration)) {
const duration = that.$refs.chatbotAudio.duration;
let minutes = parseInt(duration / 60, 10);
let seconds = parseInt(duration % 60);
minutes = minutes < 10 ? '0' + minutes : minutes;
seconds = seconds < 10 ? '0' + seconds : seconds;
that.allTime = minutes + ':' + seconds;
that.canPlayAudio = true;
} else {
that.canPlayAudio = true;
}
};
}
}
}
});
},
methods: {
...mapActions({
showLoginDialog: 'showLoginDialog'
}),
getDuration() {
const duration = this.$refs.chatbotAudio.duration;
let minutes = parseInt(duration / 60, 10);
let seconds = parseInt(duration % 60);
minutes = minutes < 10 ? '0' + minutes : minutes;
seconds = seconds < 10 ? '0' + seconds : seconds;
this.allTime = minutes + ':' + seconds;
this.canPlayAudio = true;
},
playPauseAudio() {
if (this.canPlayAudio) {
if (this.audioPause) {
this.baiduStat('文章详情页', 'click', '小诺老师语音控件');
this.$refs.chatbotAudio.play();
} else {
this.$refs.chatbotAudio.pause();
}
this.audioPause = !this.audioPause;
}
},
updateTime(e) {
const currentTime = e.target.currentTime;
const duration = e.target.duration;
let minutes = parseInt(currentTime / 60, 10);
let seconds = parseInt(currentTime % 60);
minutes = minutes < 10 ? '0' + minutes : minutes;
seconds = seconds < 10 ? '0' + seconds : seconds;
this.playWidth = (currentTime / duration) * 100;
this.playTime = minutes + ':' + seconds;
},
audioEnd() {
this.audioPause = true;
this.playTime = '00:00';
this.playWidth = 0;
},
async getComment() {
const data = await this.$axios.$get(
'/article/comment-list?aid=' + this.$route.params.id
);
for (const item of data.detail.commentList) {
item.time = Math.random() * 15 + 9;
}
this.barrageIsShow = data.detail.commentList.length > 0;
const _list = [];
for (const comment of data.detail.commentList) {
_list.push({
content: comment.comment_content,
color: '#939AA7',
icon: comment.headimgurl
});
}
this.barrageList = _list;
},
async getCommentCorpus(page, type) {
if (!this.isLogin) {
this.showLoginDialog(true);
} else {
const that = this;
if (page === 1) {
this.baiduStat(
'文章详情页',
'click',
type === 1 ? '文章内发表你的想法-点击' : '文章内评论'
);
this.chosenCommentId = 0;
this.commentModelList = [];
this.commentPage = 1;
this.commentHasMore = true;
this.commentModelPopupShow = true;
setTimeout(function () {
that.$refs.commentCorpus.addEventListener('scroll', function () {
// 变量scrollTop是滚动条滚动时,距离顶部的距离
const scrollTop = that.$refs.commentCorpus.scrollTop;
// 变量windowHeight是可视区的高度
const contentHeight = that.$refs.commentCorpus.clientHeight;
// 变量scrollHeight是滚动条的总高度
const allHeight = that.$refs.commentCorpusContent.clientHeight;
// 滚动条到底部的条件
if (scrollTop + contentHeight > allHeight - 20) {
// 写后台加载数据的函数 一定要用that
that.getCommentCorpus();
}
});
});
}
if (this.commentHasMore && !this.commentLoading) {
this.commentLoading = true;
const data = await this.$axios.$get(
'/article/comment-corpus?page=' + this.commentPage
);
for (const item of data.detail.list) {
item.chosen = false;
}
this.commentPage = this.commentPage + 1;
this.commentModelList = this.commentModelList.concat(
data.detail.list
);
this.commentHasMore = data.detail.hasMore;
this.commentLoading = false;
}
}
},
chooseCorpus(id, index) {
for (const item of this.commentModelList) {
item.chosen = false;
}
this.chosenCommentId = id;
this.commentModelList[index].chosen = true;
},
async commentArticle() {
if (this.chosenCommentId === 0) {
this.$message({
message: '请选择看法模版',
type: 'warning'
});
} else {
const loading = this.$loading({
lock: true,
text: 'Loading',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
const data = await this.$axios.$post('/article/user-comment', {
aid: this.$route.params.id,
comment_template_id: this.chosenCommentId
});
if (data && data.success) {
this.baiduStat('文章详情页', 'click', '文章内发表你的想法-发表成功');
}
console.log(data);
loading.close();
this.commentModelPopupShow = false;
this.getComment();
}
},
async collectArticle() {
if (!this.isLogin) {
this.showLoginDialog(true);
} else if (this.inCollect) {
this.$message({
message: '您的操作太快了',
type: 'warning'
});
} else {
this.baiduStat('文章详情页', 'click', '文章内收藏');
this.inCollect = true;
const data = await this.$axios.$post('/article/user-collect', {
aid: this.$route.params.id
});
console.log(data);
this.articleData.is_collected = data.detail.curState;
this.inCollect = false;
}
},
goHref(url) {
let openNew = false;
if (this.deviceType === 'pc') {
openNew = true;
}
url = this.$router.resolve({
path: url
});
if (openNew) {
window.open(url.href, '_blank');
} else {
window.location.href = url.href;
}
}
}
};
</script>
<style lang="scss">
.article-detail-page {
position: relative;
.left-content {
div.top {
margin-bottom: 20px;
border-bottom: 1px solid $bg-color;
padding-bottom: 30px;
img {
width: 100%;
height: 407px;
border-radius: 4px;
}
h4 {
/*margin-top: 30px;*/
font-size: 32px;
font-family: MicrosoftYaHei-Bold, MicrosoftYaHei;
font-weight: bold;
color: $font-color1;
line-height: 44px;
}
}
& > p:nth-child(2) {
margin-bottom: 20px;
font-size: 16px;
font-family: Apis-Regular, Apis;
font-weight: 400;
color: #bac0c2;
line-height: 28px;
}
.video-box {
margin-bottom: 20px;
video {
width: 100%;
}
}
.chatbot-audio {
position: relative;
margin-bottom: 20px;
padding: 16px 16px 0 85px;
width: 100%;
height: 105px;
background: $bg-color;
border-radius: 8px;
box-sizing: border-box;
& > img {
position: absolute;
top: 12px;
left: 12px;
width: 57px;
height: 87px;
}
& > div {
h6 {
font-size: 18px;
font-family: PingFangSC-Semibold, PingFang SC;
font-weight: 600;
color: #333;
line-height: 25px;
}
& > div {
position: relative;
margin-top: 25px;
padding-left: 48px;
& > img {
position: absolute;
top: -17px;
left: -10px;
width: 60px;
height: 60px;
cursor: pointer;
}
div {
display: flex;
& > span {
width: 38px;
font-size: 12px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: $font-color3;
line-height: 17px;
}
p {
position: relative;
margin-top: 7px;
width: calc(100% - 76px);
height: 3px;
background: #e3e3e3;
border-radius: 2px;
span {
position: absolute;
top: 0;
left: 0;
height: 3px;
background: linear-gradient(90deg, #3b97de 0%, #38b0ff 100%);
border-radius: 2px;
}
}
& > span:last-child {
text-align: right;
}
}
}
}
}
.article-content {
border-bottom: 1px solid $bg-color;
padding: 23px 0;
font-size: 18px;
color: $font-color1;
line-height: 30px;
img {
max-width: 100%;
border-radius: 4px;
}
}
.bottom-box {
padding-top: 20px;
div.comment-box {
position: relative;
h6 {
height: 50px;
span:first-child {
font-size: 24px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: $main-blue-color;
line-height: 50px;
}
span:last-child {
float: right;
width: 208px;
height: 50px;
background: #3099ea;
border-radius: 4px;
text-align: center;
font-size: 18px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: $body-color;
line-height: 50px;
cursor: pointer;
}
}
.comment-content {
position: relative;
margin-top: 24px;
height: 365px;
box-sizing: border-box;
.baberrage-item {
padding: 0;
.barrage-items {
display: inline-block;
border: 1px solid #ededed;
padding: 0 20px 0 10px;
height: 60px;
background: $body-color;
border-radius: 30px;
box-sizing: border-box;
img {
margin: 9px 10px 0 0;
@include roundFun(40px);
}
span {
font-size: 18px;
font-family: AppleColorEmoji;
color: $font-color3;
line-height: 58px;
}
}
}
}
& > p {
position: absolute;
top: 100px;
width: 100%;
font-size: 20px;
color: $font-color1;
text-align: center;
line-height: 100px;
}
}
}
}
.right-content {
position: fixed;
top: 116px;
.common-title {
padding: 0 0 8px;
font-size: 18px;
color: $font-color1;
line-height: 25px;
img {
margin: 3px 0 0 4px;
width: 20px;
height: 20px;
}
}
& > div {
& > div {
display: block;
position: relative;
border-bottom: 1px solid $bg-color;
padding: 20px 0 0 124px;
height: 120px;
box-sizing: border-box;
img {
position: absolute;
left: 0;
width: 110px;
height: 80px;
border-radius: 4px;
}
p {
font-size: 16px;
color: $font-color1;
line-height: 24px;
@include textEllipsisMore1Line(2);
}
div.bottom {
position: absolute;
right: 0;
bottom: 19px;
text-align: right;
span {
font-size: 16px;
font-family: Apis-Regular, Apis;
font-weight: 400;
color: #bac0c2;
line-height: 28px;
i {
margin-left: 3px;
}
}
}
}
}
}
.comment-model-popup {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 9;
.mask {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.content {
position: absolute;
bottom: 0;
left: 0;
border: 1px solid #e3e3e3;
padding: 44px 0 42px;
width: 100%;
box-shadow: 0 -10px 10px 0 rgba(0, 0, 0, 0.08);
border-radius: 4px 4px 0 0;
background: $body-color;
text-align: center;
& > div {
overflow-y: scroll;
margin: 0 auto 39px;
max-width: 1044px;
max-height: 300px;
& > div {
& > div {
display: flex;
flex-wrap: wrap;
& > div {
padding: 0 14px;
p {
margin-bottom: 20px;
border: 1px solid $bg-color;
padding: 0 20px;
min-width: 320px;
height: 60px;
box-sizing: border-box;
background: $bg-color;
font-size: 16px;
font-family: AppleColorEmoji;
color: #292b2c;
line-height: 58px;
@extend .text-ellipsis;
border-radius: 30px;
cursor: pointer;
}
p.chosen {
border-color: #3099ea;
background: rgba(48, 153, 234, 0.1);
}
}
}
}
}
& > p {
margin: 0 auto;
width: 325px;
height: 50px;
background: #3099ea;
border-radius: 4px;
font-size: 18px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: $body-color;
line-height: 50px;
cursor: pointer;
}
}
}
}
.isMobile {
.article-detail-page {
padding: 11px 15px 400px !important;
background: $body-color;
.left-content {
div.top {
margin-bottom: 10px;
padding-bottom: 10px;
h4 {
font-size: 24px;
line-height: 30px;
}
}
& > p:nth-child(2) {
margin-bottom: 10px;
font-size: 14px;
}
.chatbot-audio {
margin-top: 20px;
padding: 25px 15px 10px 70px;
& > img {
left: 10px;
top: -15px;
}
& > div {
& > div {
margin-left: -55px;
padding: 0;
width: calc(100% + 55px);
& > img {
top: -62px;
right: -13px;
left: auto;
}
}
}
}
.bottom-box {
position: absolute;
bottom: 20px;
left: 0;
padding: 0 15px;
width: 100%;
box-sizing: border-box;
div.comment-box {
h6 {
height: 40px;
span:first-child {
display: none;
}
span:last-child {
width: 150px;
height: 40px;
line-height: 40px;
}
}
.comment-content {
height: 290px;
.z_barrage {
left: -15px;
}
}
}
}
}
.right-content {
float: none;
padding-top: 10px;
width: 100%;
& > div {
& > div {
margin-bottom: 10px;
border: none;
padding: 15px 15px 12px;
height: auto;
background: #f1f1f1;
border-radius: 10px;
box-sizing: border-box;
img {
display: none;
}
div.bottom {
position: unset;
margin-top: 4px;
text-align: left;
}
}
}
}
.comment-model-popup {
z-index: 10;
.mask {
background: rgba(0, 0, 0, 0.5);
}
.content {
border: none;
padding: 62px 15px 15px;
box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.05);
border-radius: 20px 20px 0 0;
box-sizing: border-box;
& > div {
margin: 0;
width: 100%;
max-width: none;
& > div {
& > div {
display: block;
& > div {
padding: 0;
p {
margin-bottom: 10px;
border: none;
padding: 11px 15px;
height: auto;
min-width: auto;
background: #eef5fb;
border-radius: 10px;
box-sizing: border-box;
text-align: left;
font-size: 16px;
font-family: AppleColorEmoji;
color: $font-color1;
line-height: 26px;
&.chosen {
color: #3099ea;
}
}
}
}
}
}
& > p {
position: absolute;
top: 15px;
right: 15px;
width: 100px;
height: 32px;
line-height: 32px;
font-size: 16px;
}
}
}
}
}
</style>