asd/asd-pc/homePackage/pages/newsDetail.vue

613 lines
13 KiB
Vue
Raw Normal View History

2024-11-21 11:06:22 +08:00
<template>
<view class="wrapper">
<view style="padding:30rpx;">
<u-row customStyle="margin-bottom: 10px;">
<u-col span="12">
<view class="title">
<h3>{{article.title}}</h3>
</view>
</u-col>
</u-row>
<u-row customStyle="margin-bottom: 10px">
<u-col span="12">
<view class="content" v-html="article.content"></view>
</u-col>
</u-row>
<u-row customStyle="margin-bottom: 10px" v-if="article.videoUrl">
<u-col span="12">
<video style="width: 100%;"
:src="article.videoUrl.indexOf('http')!=-1?article.videoUrl:baseUrl1+article.videoUrl"
controls></video>
</u-col>
</u-row>
</view>
<!-- <view id="pagebottom"></view>
<u-divider></u-divider> -->
<!-- 评论列表 -->
<!-- <view class="comment-title">
<text>评论</text>
</view> -->
<!-- <view class="comment-list">
<view class="comment" v-for="(res, index) in commentList" :key="res.id">
<view class="right">
<view class="top">
<view class="name">{{ res.fullName }}</view>
</view>
<view class="content">{{ res.content }}</view>
<view class="bottom">
<text>{{res.createTime.replace('T',' ').replace('.000+08:00',' ')}}</text>
<text v-if="res.userId == user.userId" @click="userDelComment(res.id)">删除</text>
</view>
<u-divider></u-divider>
</view>
</view>
</view> -->
<!-- 底部按钮 -->
<view class="bottom-button">
<view class="button-content">
<view class="enjoy-button" v-if="showBtn">
<button class="button" size="mini" data-name="shareBtn" open-type="share">
<image src="../../static/images/enjoy0.png"></image>
</button>
</view>
<view v-else>
<image class="btn-image" src="../../static/images/enjoy0.png" @click="toShare"></image>
</view>
<view class="like-button">
<image src="@/static/images/vector.png" v-if="unFavorite" @click="userAddFavorite"
style="width:40rpx;height:40rpx;"></image>
<image src="@/static/images/vectored.png" v-else @click="userDelFavorite(favoriteId)"
style="width:40rpx;height:40rpx;"></image>
</view>
<!-- <view class="comment-button" @click="commentClick">
<image src="@/static/images/pinglun.png"></image>
<view class="box" style="position: relative; top: -5px; left: -10px;">
<u-badge type="error" max="99" :value="commentList.length"></u-badge>
</view> </view> -->
<view class="like-button">
<image src="@/static/images/dainzan.png" v-if="unLaud" @click="userAddLaud"
style="width:44rpx;height:44rpx;"></image>
<image src="@/static/images/dainzaned.png" v-else @click="userDelLaud(laudId)"
style="width:44rpx;height:44rpx;"></image>
</view>
</view>
</view>
<!-- 评论区 -->
<uni-popup type="bottom" ref="warrantPop" :animation="true" :maskClick="true">
<view class="comment-popup" style="background: #fff;">
<view class="head">
<text @click="commentClose">取消</text>
<text @click="userAddComment">发布</text>
</view>
<view class="comment-con">
<view class="comment-input">
<view class="con">
<u--textarea v-model="content" placeholder="好观点会被优先展示" autoHeight count
border="bottom"></u--textarea>
</view>
</view>
</view>
</view>
</uni-popup>
</view>
</template>
<script>
export default {
data() {
return {
showBtn: this.$store.getters.token ? true : false,
unLaud: true, //点赞前
laudId: null,
unFavorite: true, //收藏前
favoriteId: null,
articleId: '',
inputVal: '',
commentNull: false,
contentId: '',
commentList: [],
article: {},
user: {},
content: '',
baseUrl1: ""
}
},
onLoad(option) {
console.log(121, this.baseUrl);
this.baseUrl1 = this.baseUrl;
this.getArticleDetail(option.id)
},
methods: {
toShare() {
uni.navigateTo({
url: '/loginPackage/pages/Login'
})
},
// 文章详情
async getArticleDetail(id) {
const resUser = await this.$myRequest({
url: '/getInfo'
})
this.user = resUser.data.user;
const res = await this.$myRequest({
url: '/system/article/' + id,
})
try {
// res.data.data.content = this.replaceImg(res.data.data.content)
res.data.data.content = res.data.data.content
} catch (e) {
res.data.data.content = res.data.data.content
}
this.article = res.data.data
this.commentList = res.data.data.asdArticleCommentList
console.log(this.commentList);
const resFav = await this.$myRequest({
url: '/system/favorite/list',
data: {
articleId: id,
userId: resUser.data.user.userId
}
})
if (resFav.data.rows.length > 0) {
this.unFavorite = false;
this.favoriteId = resFav.data.rows[0].id
}
const resLaud = await this.$myRequest({
url: '/system/laud/list',
data: {
articleId: id,
userId: resUser.data.user.userId
}
})
if (resLaud.data.rows.length > 0) {
this.unLaud = false;
this.laudId = resLaud.data.rows[0].id
}
},
// 点赞功能
async userAddLaud() {
if (this.$store.getters.token) {
const res = await this.$myRequest({
method: 'POST',
url: '/system/laud/userAddLaud',
data: {
articleId: this.article.id
}
})
if (res.data.code == 200) {
this.unLaud = false
this.getArticleDetail(this.article.id)
uni.showToast({
title: '点赞成功',
icon: 'none'
});
}
} else {
uni.navigateTo({
url: '/loginPackage/pages/Login'
})
}
},
// 取消点赞功能
async userDelLaud(laudId) {
if (this.$store.getters.token) {
const res = await this.$myRequest({
method: 'DELETE',
url: '/system/laud/userDelLaud/' + laudId,
})
if (res.data.code == 200) {
this.unLaud = true
this.getArticleDetail(this.article.id)
uni.showToast({
title: '点赞已取消',
icon: 'none'
});
}
} else {
uni.navigateTo({
url: '/loginPackage/pages/Login'
})
}
},
// 收藏功能
async userAddFavorite() {
if (this.$store.getters.token) {
const res = await this.$myRequest({
method: 'POST',
url: '/system/favorite/userAddFavorite',
data: {
articleId: this.article.id
}
})
if (res.data.code == 200) {
this.unFavorite = false
this.getArticleDetail(this.article.id)
uni.showToast({
title: '收藏成功',
icon: 'none'
});
}
} else {
uni.navigateTo({
url: '/loginPackage/pages/Login'
})
}
},
// 取消收藏功能
async userDelFavorite(favoriteId) {
if (this.$store.getters.token) {
const res = await this.$myRequest({
method: 'DELETE',
url: '/system/favorite/userDelFavorite/' + favoriteId,
})
if (res.data.code == 200) {
this.unFavorite = true
this.getArticleDetail(this.article.id)
uni.showToast({
title: '收藏已取消',
icon: 'none'
});
}
} else {
uni.navigateTo({
url: '/loginPackage/pages/Login'
})
}
},
// 评论按钮
commentClick() {
if (this.$store.getters.token) {
this.$refs.warrantPop.open();
this.content = '';
this.commentNull = true;
uni.pageScrollTo({
duration: 300,
selector: '#pagebottom' // string 选择器
});
} else {
uni.navigateTo({
url: '/loginPackage/pages/Login'
})
}
},
commentClose() {
this.$refs.warrantPop.close();
},
async userAddComment() {
const res = await this.$myRequest({
method: 'POST',
url: '/system/comment/userAddComment',
data: {
articleId: this.article.id,
content: this.content
}
})
if (res.data.code == 200) {
uni.pageScrollTo({
duration: 300,
selector: '#pagebottom' // string 选择器
});
this.unFavorite = true
this.commentClose();
this.getArticleDetail(this.article.id)
uni.showToast({
title: '评论成功',
icon: 'none'
});
}
},
async userDelComment(id) {
uni.showModal({
content: '将删除这条评论',
success: (res) => {
if (res.confirm) {
const res = this.$myRequest({
method: 'DELETE',
url: '/system/comment/userDelComment/' + id,
}).then((delres) => {
if (delres.data.code == 200) {
uni.pageScrollTo({
duration: 300,
selector: '#pagebottom' // string 选择器
});
this.getArticleDetail(this.article.id)
uni.showToast({
title: '删除成功',
icon: 'none'
});
}
})
}
}
})
},
/**
* 替换图片链接 && 图片自适应
* @param {*} a
* @returns
*/
replaceImg(a) {
// a 为富文本的字符串内容为了测试只写了img标签
var b = /<img [^>]*src=['"]([^'"]+)[^>]*>/g; // img 标签取src里面内容的正则
var s = a.match(b); // 取到所有img标签 放到数组 s里面
if (s) {
for (var i = 0; i < s.length; i++) {
var srcImg = s[i].replace(b, '$1'); //取src面的内容
console.log(346, srcImg);
// srcImg = srcImg.slice(8)
if (srcImg.slice(0, 4) == 'http' || srcImg.slice(0, 5) == 'https') {
//若src前4位置或者前5位是http、https则不做任何修改
//console.log('不做任何修改');
} else {
//修改富文本字符串内容 img标签src 相对路径改为绝对路径
a = a.replace(/src=['"]([^'"]+)[^>]*>/gi, 'src="' + this.baseUrl + srcImg + '"' + '>');
// console.log(baseUrl, a)
}
}
}
let newContent = a.replace(/<img[^>]*>/gi, function(match, capture) {
match = match.replace(/style="[^"]+"/gi, '').replace(/style='[^']+'/gi, '');
match = match.replace(/width="[^"]+"/gi, '').replace(/width='[^']+'/gi, '');
match = match.replace(/height="[^"]+"/gi, '').replace(/height='[^']+'/gi, '');
return match;
});
newContent = newContent.replace(/style="[^"]+"/gi, function(match, capture) {
match = match.replace(/width:[^;]+;/gi, 'max-width:100%;').replace(/width:[^;]+;/gi,
'max-width:100%;');
return match;
});
newContent = newContent.replace(/<br[^>]*\/>/gi, '');
newContent = newContent.replace(/\<img/gi,
'<img style="max-width:100%;height:auto;display:block;margin:10px 0;"');
return newContent;
}
},
}
</script>
<style lang="less" scoped>
.wrapper {
// background-image: url("http://43.140.199.34:81/choujiangbeijing.png");
}
button {
background-color: #e2ebf7;
image {
width: 40rpx;
height: 40rpx;
margin-top: 20rpx;
}
}
button::after {
border: none;
}
.btn-image {
width: 40rpx;
height: 40rpx;
margin-top: 10rpx;
}
/deep/ .u-icon__icon .uicon-share-square {
color: #e2ebf7;
}
/deep/.u-button--plain {
background-color: #e2ebf7;
}
/deep/ img {
width: 95%;
}
img {
width: 95%;
}
.title {
display: flex;
justify-content: center;
}
.content {
// text-indent: 2em;
}
.head {
display: flex;
justify-content: space-between;
height: 100rpx;
padding: 20rpx;
color: #626262;
}
.con {
min-height: 100rpx;
}
.bottom-button {
display: flex;
position: fixed;
bottom: 0rpx;
width: 100%;
background: #e2ebf7;
height: 100rpx;
align-items: center;
.button-content {
display: flex;
width: 70%;
left: 15%;
position: fixed;
justify-content: space-between;
align-items: center;
.enjoy-button {
display: flex;
margin-right: -30rpx;
background-image: url(../../static/images/enjoy0.png);
}
.comment-button {
display: flex;
color: #626262;
font-size: 24rpx;
image {
width: 42rpx;
height: 42rpx;
margin-right: 10rpx;
}
}
.like-button {
display: flex;
color: #626262;
font-size: 24rpx;
image {
// width:44rpx;
// height:44rpx;
margin-right: 10rpx;
}
}
}
}
</style>
<style lang="scss" scoped>
.comment-title {
padding: 30rpx;
font-weight: bold;
}
.comment-list {
padding-bottom: 35rpx;
}
.comment {
display: flex;
padding: 30rpx;
.left {
image {
width: 64rpx;
height: 64rpx;
border-radius: 50%;
background-color: #f2f2f2;
}
}
.right {
flex: 1;
padding-left: 20rpx;
font-size: 30rpx;
.top {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10rpx;
.name {
color: #5677fc;
}
.like {
display: flex;
align-items: center;
color: #9a9a9a;
font-size: 26rpx;
.num {
margin-right: 4rpx;
color: #9a9a9a;
}
}
.highlight {
color: #5677fc;
.num {
color: #5677fc;
}
}
}
.content {
margin-bottom: 10rpx;
}
.reply-box {
background-color: rgb(242, 242, 242);
border-radius: 12rpx;
.item {
padding: 20rpx;
border-bottom: solid 2rpx $u-border-color;
.username {
font-size: 24rpx;
color: #999999;
}
}
.all-reply {
padding: 20rpx;
display: flex;
color: #5677fc;
align-items: center;
.more {
margin-left: 6rpx;
}
}
}
.bottom {
margin-top: 20rpx;
display: flex;
justify-content: space-between;
font-size: 24rpx;
color: #9a9a9a;
.reply {
color: #5677fc;
margin-left: 10rpx;
}
}
}
}
</style>