Files
nuttyreading-html/pages/comments/commentsList.vue
2024-02-26 09:05:04 +08:00

847 lines
20 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<view class="container">
<!-- 公共组件-每个页面必须引入 -->
<public-module></public-module>
<view class="header">
<!-- 顶部导航栏 -->
<z-nav-bar title="书评列表"></z-nav-bar>
<view class="orderTabs">
<view v-for="(item,index) in commentsTabs" @click="commentsTabCLi(item.value)" :key="index"
:class="commentsListTab==item.value?'orderdefine ordStyle':'orderdefine'">{{item.name}}</view>
</view>
</view>
<!-- 站位 -->
<view class="orderTabs" style="z-index:0;position:unset;">
<view class="orderdefine">1</view>
</view>
<view v-if="commentsListTab == 1">
<view v-if="newList.length > 0">
<view class="bookInfo" v-for="(item,index) in newList" :key="index">
<view class="mainContent">
<view class="item" @click.stop="toDetail(item)">
<view class="title">{{item.title}}</view>
<image class="feng" v-if="item.bookimage" :src="item.bookimage" mode="aspectFill"></image>
<view class="description" v-html="item.content">
</view>
<view class="btns flexbox">
<span class="left">{{item.bookname}}</span>
<span class="right flexbox opbtns" style="color:#3c9cff;">
全文
</span>
</view>
<view class="btns flexbox" style="margin-top:10rpx;">
<span class="left"
style="color: #C0C4CC;">{{formatTimeDifferenceFromT(item.createTime)}}</span>
<span class="right flexbox opbtns">
<image class="gzicon" v-if="item.ilike" src="../../static/icon/gz2.png"
mode="aspectFill" @click.stop="clickLike(item)"></image>
<image class="gzicon" v-else src="../../static/icon/gz.png" mode="aspectFill"
@click.stop="clickLike(item)"></image>
<view style="color: #C0C4CC;">{{item.contlike}}</view>
<image class="gzicon" v-if="1" src="../../static/icon/pinglun.png"
mode="aspectFill"></image>
<view style="color: #C0C4CC;">{{item.commentNum}}</view>
</span>
</view>
<view style="border-bottom:2rpx solid #e9e9e9;height:50rpx;" v-if="index<item.length-1">
</view>
</view>
</view>
</view>
</view>
<view class="quesheng" v-else>
暂无书评内容~
</view>
</view>
<view v-if="commentsListTab == 2">
<view v-if="hotList.length > 0">
<view class="bookInfo" v-for="(item,index) in hotList" :key="index">
<view class="mainContent">
<view class="item" @click.stop="toDetail(item)">
<view class="title">{{item.title}}</view>
<image class="feng" v-if="item.bookimage" :src="item.bookimage" mode="aspectFill"></image>
<view class="description" v-html="item.content">
</view>
<view class="btns flexbox">
<span class="left">{{item.bookname}}</span>
<span class="right flexbox opbtns" style="color:#3c9cff;">
全文
</span>
</view>
<view class="btns flexbox" style="margin-top:10rpx;">
<span class="left"
style="color: #C0C4CC;">{{formatTimeDifferenceFromT(item.createTime)}}</span>
<span class="right flexbox opbtns">
<image class="gzicon" v-if="item.ilike" src="../../static/icon/gz2.png"
mode="aspectFill" @click.stop="clickLike(item)"></image>
<image class="gzicon" v-else src="../../static/icon/gz.png" mode="aspectFill"
@click.stop="clickLike(item)"></image>
<view style="color: #C0C4CC;">{{item.contlike}}</view>
<image class="gzicon" v-if="1" src="../../static/icon/pinglun.png"
mode="aspectFill"></image>
<view style="color: #C0C4CC;">{{item.commentNum}}</view>
</span>
</view>
<view style="border-bottom:2rpx solid #e9e9e9;height:50rpx;" v-if="index<item.length-1">
</view>
</view>
</view>
</view>
</view>
<view class="quesheng" v-else>
暂无书评内容~
</view>
</view>
<view v-if="commentsListTab == 3">
<view class="" style="padding:40rpx 20rpx;">
<view class="mytabs flexbox">
<view :class="['item','item1', contentShow == 1 ? 'active' :'']" @click="setData(1)">
已购图书
</view>
<view :class="['item','item2', contentShow == 2 ? 'active' :'']" @click="setData(2)">
推荐图书
</view>
</view>
</view>
<view v-if="bookList.length > 0">
<view class="bookInfo3" v-for="(item,index) in bookList" :key="index">
<view class="mainContent3">
<view class="item">
<view class="btns flexbox" @click.stop="toMore(item)">
<view class="title">{{item.name}}</view>
<view class="pianshuping">{{item.forumNum}}篇书评</view>
</view>
<image class="feng" v-if="item.images" :src="item.images" mode="aspectFill"
@click.stop="toMore(item)"></image>
<view class="shupingList">
<view class="description" v-for="(item1,index1) in item.forums" :key="index1"
@click.stop="toDetail1(item1)">{{item1.title}}</view>
</view>
<view class="btns flexbox" @click.stop="toMore(item)">
<span class="left"></span>
<span class="right flexbox opbtns" style="color:#3c9cff;">
全部
</span>
</view>
</view>
</view>
</view>
</view>
<view class="quesheng" v-else>
暂无书评内容~
</view>
</view>
<view v-if="status==0" style="text-align: center;">
<u-loading-icon style="display: inline-block;"></u-loading-icon>
<font style='vertical-align: super;margin-left: 10px;font-size: 26rpx;color: #909399;'>努力加载中</font>
</view>
<view v-if="status==1" style="padding-bottom: 20rpx;">
<u-divider text="全部加载完成"></u-divider>
</view>
<music-play :playData="playData"></music-play>
</view>
</template>
<script>
import $http from '@/config/requestConfig.js';
import emotion from '@/bkhumor-emojiplus/components/bkhumor-emojiplus/bkhumor-emojiplus.vue';
import musicPlay from '@/components/music.vue'
import {
data
} from 'jquery';
import {
mapState,
mapMutations
} from 'vuex';
import {
checkBookRight
} from '@/config/utils';
export default {
data() {
return {
// loadingNow : false,
playData: {},
emojiIcon: 'cuIcon-emoji',
windowWidth: 0,
bookid: null,
booklistpage: 1,
productList: [],
productInfo: {},
pingjiaShow: false, //添加评价
Pform: { // 评价表单
star: 0,
comment: '',
img: [],
html: ''
},
emoji: [],
Files: [],
page: 1,
pageSize: 10,
total: 0, // 资源的总页数1
status: 3,
shupingList: [],
bfaid: null,
commentsTabs: [{
name: '书集',
value: 3
}, {
name: '最新',
value: 1
}, {
name: '最热',
value: 2
}],
commentsListTab: 3,
newestpage: 1,
hotestpage: 1,
booksetpage: 1,
newList: [],
hotList: [],
bookList: [],
contentShow: 1,
}
},
onPullDownRefresh() {
console.log('下拉刷新了')
uni.stopPullDownRefresh();
this.newestpage = 1
this.hotestpage = 1
this.booksetpage = 1
this.newList = []
this.hotList = []
this.bookList = []
this.total = 0
this.getBookList(this.commentsListTab, false)
},
onReachBottom() {
if (this.newestpage + 1 <= this.total || this.hotestpage + 1 <= this.total || this.booksetpage + 1 <= this
.total) {
this.newestpage++
this.hotestpage++
this.booksetpage++
this.getBookList(this.commentsListTab, false)
} else {
this.status = 1
}
},
onLoad(e) {
this.windowWidth = uni.getSystemInfoSync().windowWidth;
console.log(e, 'onload')
// this.bookid = e.bookid
this.getBookList(3, false)
},
computed: {
...mapState(['userInfo']),
},
methods: {
...mapMutations(['setLoadingShow']),
setData(e) {
this.contentShow = e
this.getBookList(this.commentsListTab, true)
},
formatTimeDifferenceFromT(dateTimeT) {
const now = new Date();
const t = new Date(dateTimeT);
const differenceInSeconds = Math.floor((now - t) / 1000);
if (differenceInSeconds <= 3600) {
const minutes = Math.floor(differenceInSeconds / 60);
return `${minutes} 分钟前`;
} else if (differenceInSeconds <= 86400) {
const hours = Math.floor(differenceInSeconds / 3600);
return `${hours} 小时前`;
} else if (differenceInSeconds <= 2592000) {
const days = Math.floor(differenceInSeconds / 86400);
return `${days} 天前`;
} else {
const currentYear = now.getFullYear();
const tYear = t.getFullYear();
if (currentYear === tYear) {
const month = t.getMonth() + 1;
const day = t.getDate();
return `${month < 10 ? '0' : ''}${month}-${day < 10 ? '0' : ''}${day}`;
} else {
const year = t.getFullYear();
const month = t.getMonth() + 1;
const day = t.getDate();
return `${year}-${month < 10 ? '0' : ''}${month}-${day < 10 ? '0' : ''}${day}`;
}
}
},
// 切换tab状态
commentsTabCLi(e) {
this.commentsListTab = e
this.newestpage = 1
this.hotestpage = 1
this.booksetpage = 1
this.total = 0
this.newList = []
this.hotList = []
this.bookList = []
this.getBookList(this.commentsListTab, false)
},
// 查看本书更多书评
toMore(val) {
// console.log(val,'val')
let data = {
'userId': this.userInfo.id,
'bookId': val.id
}
checkBookRight(data, res => {
console.log(res)
if (res.success) {
uni.navigateTo({
url: '../comments/comments?bookid=' + val.id,
});
} else {
uni.showToast({
title: '购买本书后方可查看此内容!',
icon: 'none'
})
}
})
},
// 书评详情
toDetail(val) {
// console.log(val,'val')
uni.navigateTo({
url: '../comments/commentsDetail?bookid=' + val.bookid + '&bfa_id=' + val.id
})
},
// 判断健全
toDetail1(val) {
// console.log(val,'val')
let data = {
'userId': this.userInfo.id,
'bookId': val.bookid
}
checkBookRight(data, res => {
console.log(res)
if (res.success) {
uni.navigateTo({
url: '../comments/commentsDetail?bookid=' + val.bookid + '&bfa_id=' + val.id
})
} else {
uni.showToast({
title: '购买本书后方可查看此内容!',
icon: 'none'
})
}
})
},
clickLike(item) {
this.$http
.post("forum/articles/chickForumContlike?forum_id=" + item.id, )
.then(res => {
if (res.code == 0) {
uni.showToast({
title: '点赞成功!',
icon: 'success'
})
item.contlike++
}
}).catch((e) => {
console.log(e, 'e')
})
},
getBookList(flag, tushuflag) {
// 根据tab不同获取最新书评、最热书评、书集列表
// uni.showLoading({
// title: '加载中'
// });
var httpurl = ""
if (flag == 1) {
httpurl = "forum/articles/getForumsNew?page=" + this.newestpage + '&limit=10'
} else if (flag == 2) {
httpurl = "forum/articles/getForumsHot?page=" + this.hotestpage + '&limit=10'
} else {
if (tushuflag) { // 点击切换已购和推荐
this.booksetpage = 1
this.bookList = []
}
if (this.contentShow == 1) {
httpurl = "forum/articles/getHasForumsAndBook?page=" + this.booksetpage + '&limit=10&userId=' +
this.userInfo.id
} else {
httpurl = "forum/articles/getBestForumsAndBook?page=" + this.booksetpage + '&limit=10&userId=' +
this.userInfo.id
}
}
this.$http
.post(httpurl)
.then(res => {
if (flag == 1) {
this.newList = this.newList.concat(res.page.records)
} else if (flag == 2) {
this.hotList = this.hotList.concat(res.page.records)
} else {
this.bookList = this.bookList.concat(res.page.records)
}
this.total = res.page.pages
console.log(this.newList, 'this.newList')
// let list = res.page.records
// console.log(list,'list')
// for(let i=0; i < list.length; i++){
// let data = {
// 'page': 1,
// 'limit': 3,
// 'bookid' : list[i].bookid
// }
// this.$http
// .post('forum/articles/descupdatelist', data)
// .then(res => {
// // this.total = res.page.totalPage
// // this.shupingList = this.shupingList.concat(res.page.list)
// list[i].shupingList = res.page.list
// console.log(res.page.list,'评论获取成功')
// console.log(list,'list')
// this.productList.push(list[i])
// console.log(this.productList,'productList')
// // this.status = 3
// }).catch((e)=>{
// console.log(e,'e')
// })
// }
// if(res.page.records.length != 10){
// this.status = 1
// } else {
this.status = 0
// }
// uni.hideLoading();
}).catch((e) => {
console.log(e, 'e')
})
},
// 显示评论
pinglun(val) {
this.bfaid = val
this.pingjiaShow = true
},
// 提交评论
submitPJ() {
if (this.Pform.comment != '') {
let data = {
'content': this.Pform.comment,
'userid': this.userInfo.id,
'bookid': this.bookid,
'bfaid': this.bfaid
}
// console.log(data,'data')
$http.request({
url: "forum/comment/save",
method: "POST", // POST、GET、PUT、DELETE具体说明查看官方文档
data,
header: { //默认 无 说明:请求头
'Content-Type': 'application/json'
},
}).then(res => {
if (res.code == 0) {
uni.showToast({
title: '评论成功!',
icon: 'success'
})
this.pingjiaShow = false
this.Pform.comment = ''
this.pinglunId = null
}
})
} else {
uni.showToast({
title: '请先输入您的评价内容 ',
icon: 'none'
})
}
},
},
components: {
musicPlay,
emotion
}
}
</script>
<style lang="scss" scoped>
// @import '@/style/mixin.scss';
.orderTabs {
// margin: 70rpx 0 0 0;
width: 100%;
// padding: 0 3% 3% 3%;
position: fixed;
// top: 80rpx;
background-color: #f7faf9;
z-index: 100;
.orderdefine {
display: inline-block;
padding: 20rpx 0 20rpx 0;
// margin: 40rpx 0 15rpx 0;
width: 230rpx;
text-align: center;
font-size: 30rpx;
}
.ordStyle {
// border-bottom: 4rpx solid #54a966;
// color: #54a966;
font-weight: bold;
}
}
.flexbox {
display: flex;
}
.container {
padding: 0 10px;
}
.star {
display: inline-block;
width: 20px;
height: 20px;
margin-right: 10rpx;
}
.starGray {
background: url(../../static/icon/star_greey.png) no-repeat;
background-size: contain;
}
.starLight {
background: url(../../static/icon/star_light.png) no-repeat;
background-size: contain;
}
.cuIcon-emoji {
background: url(../../static/biaoqing.png) no-repeat;
background-size: contain;
display: block;
margin-right: 20rpx;
width: 30px;
}
.cuIcon-keyboard {
background: url(../../static/biaoqing.png) no-repeat;
background-size: contain;
display: block;
width: 30px;
}
.tanchu {
padding: 40rpx 30rpx 40rpx 30rpx;
position: relative;
.dp_title {
font-size: 32rpx;
margin-bottom: 50rpx;
color: #555;
text-align: center;
font-weight: bold;
}
.dp_add {
position: absolute;
top: 40rpx;
right: 30rpx;
font-size: 22rpx;
background-color: #fd6004;
color: #fff;
border-radius: 10rpx;
padding: 5rpx 10rpx;
.u-icon {
display: inline-block;
margin-right: 5rpx;
}
}
}
.quesheng {
text-align: center;
margin-top: 100rpx;
color: #8b8a91;
padding-bottom: 20rpx;
padding-top: 20rpx;
}
.gengduoshuping {
text-align: right;
color: #0044ff;
padding-bottom: 20rpx;
padding-top: 20rpx;
}
.bookInfo {
justify-content: space-between;
// margin-bottom: 15px;
background-color: #fff;
padding: 20rpx;
border: 1px splid #999;
box-sizing: border-box;
// padding-bottom: 20rpx;
border-radius: 20rpx;
margin-bottom: 20rpx;
// .imageradius{
// border-radius: 20rpx;
// border:1rpx solid #e9e9e9;
// }
// .bookInfo-inner{ padding-left: 30rpx; box-sizing: border-box; width: calc(100% - 150px);
// .title{font-size: 32rpx; margin-top: 0rpx; margin-bottom: 20rpx;font-weight: 700; display: block;}
// .author{font-size: 30rpx;margin-top: 0rpx;margin-bottom: 20rpx;font-weight: 500; display: block; }
// .description{
// font-size: 28rpx;
// line-height: 20px;
// width: 100%;
// color:#888;
// padding-left: 0;
// overflow:hidden;
// text-overflow: ellipsis;
// -webkit-line-clamp: 9;
// display: -webkit-box;
// -webkit-box-orient: vertical;
// }
// }
// .bookinfoimage{width: 150px !important; }
}
.mainContent {
background-color: #fff;
.item {
// padding: 10px;
// margin-bottom: 30rpx;
// border: 1px solid #999;
box-sizing: border-box;
// padding-bottom: 20rpx;
border-radius: 20rpx;
// margin-bottom: 20rpx;
}
.feng {
margin: 10rpx 20rpx 0 0;
height: 160rpx;
width: 140rpx;
float: left;
border-radius: 20rpx;
border: 1rpx solid #e9e9e9;
}
.title {
font-size: 30rpx;
font-weight: 700;
color: #000;
overflow: hidden;
}
/deep/.description {
overflow: hidden;
color: #666;
text-overflow: -o-ellipsis-lastline;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 5;
line-clamp: 5;
-webkit-box-orient: vertical;
font-size: 26rpx;
margin-bottom: 20rpx;
margin-top: 10rpx;
line-height: 34rpx;
height: calc(5 * 34rpx);
img {
width: 100% !important;
}
}
.btns {
font-size: 22rpx;
justify-content: space-between;
align-items: center;
.left {
width: 300rpx;
color: #a1a1a1;
}
.right {
width: 300rpx;
display: flex;
justify-content: flex-end;
align-items: center;
}
.gzicon {
margin: 0 0 0 20rpx;
height: 40rpx;
width: 40rpx;
// float:left;
// border-radius: 20rpx;
// border:1rpx solid #e9e9e9;
}
.opbtns {
.pingjia {
margin-left: 10px;
}
}
}
}
.mb30 {
margin-bottom: 30rpx;
overflow: hidden;
}
.bookInfo3 {
justify-content: space-between;
// margin-bottom: 15px;
background-color: #fff;
padding: 20rpx;
border: 1px splid #999;
box-sizing: border-box;
// padding-bottom: 20rpx;
border-radius: 20rpx;
margin-bottom: 20rpx;
.mainContent3 {
background-color: #fff;
.item {
// padding: 10px;
// margin-bottom: 30rpx;
// border: 1px solid #999;
box-sizing: border-box;
// padding-bottom: 20rpx;
border-radius: 20rpx;
// margin-bottom: 20rpx;
}
.feng {
margin: 10rpx 20rpx 0 0;
height: 240rpx;
width: 164rpx;
float: left;
border-radius: 20rpx;
border: 1rpx solid #e9e9e9;
}
.title {
font-size: 30rpx;
font-weight: 700;
color: #000;
overflow: hidden;
}
.pianshuping {
font-size: 24rpx;
color: red;
}
.shupingList {
min-height: 212rpx;
}
/deep/.description {
overflow: hidden;
color: #666;
text-overflow: -o-ellipsis-lastline;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 1;
line-clamp: 1;
-webkit-box-orient: vertical;
font-size: 26rpx;
margin-bottom: 20rpx;
margin-top: 10rpx;
img {
width: 100% !important;
}
}
.btns {
font-size: 22rpx;
justify-content: space-between;
align-items: center;
.left {
width: 300rpx;
color: #a1a1a1;
}
.right {
width: 300rpx;
display: flex;
justify-content: flex-end;
align-items: center;
}
.gzicon {
margin: 0 0 0 20rpx;
height: 40rpx;
width: 40rpx;
// float:left;
// border-radius: 20rpx;
// border:1rpx solid #e9e9e9;
}
.opbtns {
.pingjia {
margin-left: 10px;
}
}
}
}
}
.mytabs {
// background: url('@/static/icon/bgtushu.png') no-repeat left top;
height: 80rpx;
// margin-bottom: 30rpx;
.item {
border-radius: 10rpx;
background-color: #c6ead0;
width: 48%;
// margin: 0 10rpx;
text-align: center;
color: #3c7f56;
font-size: 36rpx;
line-height: 80rpx;
}
.item.active {
background-color: #3c7f56;
color: #fff;
}
.item1 {
margin-right: 20rpx;
}
}
</style>