1.评价,问答

master
sws 2023-10-25 16:46:07 +08:00
parent fa55764a43
commit 30b2cf552e
12 changed files with 1730 additions and 854 deletions

View File

@ -13,7 +13,7 @@
</view>
<view v-if="(item.images || null) != null && item.images.length > 0" class="images oh margin-top-lg">
<block v-for="(iv, ix) in item.images" :key="ix">
<image class="br radius" @tap="comment_images_show_event" :data-index="index" :data-ix="ix" :src="iv" mode="aspectFit"></image>
<image class="br radius margin-right-sm" @tap="comment_images_show_event" :data-index="index" :data-ix="ix" :src="iv" mode="aspectFit"></image>
</block>
</view>
</view>
@ -48,7 +48,17 @@
created: function () {},
methods: {},
methods: {
//
comment_images_show_event(e) {
var index = e.currentTarget.dataset.index;
var ix = e.currentTarget.dataset.ix;
uni.previewImage({
current: this.propData[index]["images"][ix],
urls: this.propData[index]["images"],
});
},
},
};
</script>
<style scoped>

View File

@ -0,0 +1,610 @@
<template>
<view>
<view v-if="(data || null) != null && (data_base || null) != null" class="padding-bottom-main">
<view>
<!-- 点赞评论分享 -->
<view v-if="propType == 'detail'" class="tr ask-comments-bottom-container spacing-mt cr-grey padding-horizontal-main">
<view v-if="(data_base.is_blog_comments_show || 0) == 1" class="item dis-inline-block" :data-value="'/pages/plugins/blog/comments/comments?id=' + data.id" @tap="url_event">
<iconfont name="icon-bowenxiangqing-huifu" size="28rpx" class="pr top-sm margin-right-xs"></iconfont>
<text class="text-size-xs">评论({{ data.comments_count }})</text>
</view>
<view v-if="(data_base.is_blog_give_thumbs || 0) == 1" :class="'item dis-inline-block cr-' + ((data.is_give_thumbs || 0) == 1 ? 'main' : 'grey')" :data-blogid="data.id" @tap="give_thumbs_event">
<iconfont :name="(data.is_give_thumbs || 0) == 1 ? 'icon-bowenxiangqing-dianzan-xuaz' : 'icon-bowenxiangqing-dianzan'" size="28rpx" class="pr top-sm margin-right-xs"></iconfont>
<text class="va-m text-size-xs">点赞({{ data.give_thumbs_count }})</text>
</view>
<view class="item dis-inline-block" @tap="popup_share_event">
<iconfont name="icon-bowenxiangqing-fenxiang" size="28rpx" class="pr top-sm margin-right-xs"></iconfont>
<text class="text-size-xs">分享</text>
</view>
</view>
<!-- 评论回复表单 -->
<view v-if="(data_base.is_blog_comments_add || 0) == 1 && !input_comments_modal_status" class="padding-top-xxxl padding-bottom-xxl padding-horizontal-main blog-comments-reply-container flex-row jc-sb spacing-mb">
<image :src="avatar" mode="aspectFill" class="user-avatar fl circle"></image>
<view class="right-base flex-1 flex-width">
<view class="bg-white border-radius-main padding-main">
<textarea placeholder="期待您的发言..." placeholder-class="cr-grey" class="wh-auto" :value="input_comments_value" :maxlength="input_comments_length_max" @input="comments_input_event" @blur="comments_input_event"></textarea>
<view class="oh flex-row jc-sb align-e">
<image :src="common_static_url + 'emoji-icon.png'" mode="aspectFill" class="emoji-icon va-m" @tap="emoji_event"></image>
<view class="flex-row align-e">
<text class="text-size-xs cr-grey-d margin-right-sm">剩余{{ input_comments_length_value }}</text>
<button type="default" size="mini" class="comment-btn cr-white border-radius-sm text-size-md va-m" :class="input_comments_value.length > 0 ? 'bg-main br-main ' : 'br-grey-d bg-grey-d'" @tap="comments_event"></button>
</view>
</view>
</view>
</view>
</view>
<!-- 评论回复内容 -->
<view v-if="(data_base.is_blog_comments_show || 0) == 1 && (data.comments_list || null) != null && data.comments_list.length > 0" class="blog-comments-list margin-bottom-xxxl padding-left-main">
<block v-for="(item, index) in data.comments_list" :key="index">
<view class="item oh flex-row jc-sb">
<image :src="item.user.avatar" mode="aspectFill" class="user-avatar circle fl"></image>
<view class="right-content padding-bottom-main margin-bottom-main br-b-e flex-1 flex-width">
<view class="comments-base oh">
<span class="username fw-b">{{ item.user.user_name_view }}</span>
<span class="cr-grey-9 margin-left-main">{{ item.add_time }}</span>
</view>
<view class="margin-top-sm comments-content">{{ item.content }}</view>
<view class="blog-comments-right-content-operate margin-top-main flex-row jc-e align-c text-size-xs cr-grey-9">
<view v-if="(data_base.is_blog_comments_show || 0) == 1" class="item dis-inline-block" :data-index="index" :data-username="item.user.user_name_view" :data-blogcommentsid="item.id" @tap="modal_open_event">
<iconfont name="icon-bowenxiangqing-huifu" size="28rpx" class="pr top-md margin-right-xs"></iconfont>
<text class="va-m">回复({{ item.comments_count }})</text>
</view>
<view
v-if="(data_base.is_blog_give_thumbs || 0) == 1"
:class="'item dis-inline-block margin-left-xxxl padding-left-sm cr-' + ((item.is_give_thumbs || 0) == 1 ? 'main' : '')"
data-type="1"
:data-index="index"
:data-blogid="item.blog_id"
:data-blogcommentsid="item.id"
@tap="give_thumbs_event"
>
<iconfont :name="(item.is_give_thumbs || 0) == 1 ? 'icon-bowenxiangqing-dianzan-xuaz' : 'icon-bowenxiangqing-dianzan'" size="28rpx" class="pr top-md margin-right-xs"></iconfont>
<text class="va-m">点赞({{ item.give_thumbs_count }})</text>
</view>
</view>
<view v-if="(item.reply_comments_list || null) != null && item.reply_comments_list.length > 0" class="reply-blog-comments-list">
<block v-for="(comments, index2) in item.reply_comments_list" :key="index2">
<view class="bg-grey-e">
<view class="item padding-main oh flex-row jc-sb">
<image :src="comments.user.avatar" mode="aspectFill" class="user-avatar circle fl"></image>
<view class="right-content flex-1 flex-width">
<view class="comments-reply-base oh">
<span class="username fw-b">{{ comments.user.user_name_view }}</span>
<span class="cr-grey-9 margin-left-main">{{ comments.add_time }}</span>
</view>
<view v-if="(comments.reply_comments_text || null) != null" class="margin-top-sm reply-content">{{ comments.reply_comments_text }}</view>
<view class="margin-top-sm">{{ comments.content }}</view>
<view class="blog-comments-right-content-operate flex-row jc-e align-c text-size-xs cr-grey-9 padding-0">
<view
v-if="(data_base.is_blog_comments_show || 0) == 1"
class="item dis-inline-block"
:data-index="index"
:data-username="comments.user.user_name_view"
:data-blogcommentsid="comments.blog_comments_id"
:data-replycommentsid="comments.id"
@tap="modal_open_event"
>
<iconfont name="icon-bowenxiangqing-huifu" size="28rpx" class="pr top-md margin-right-xs"></iconfont>
<text class="va-m">回复({{ comments.comments_count }})</text>
</view>
<view
v-if="(data_base.is_blog_give_thumbs || 0) == 1"
:class="'item dis-inline-block margin-left-xxxl padding-left-sm cr-' + ((comments.is_give_thumbs || 0) == 1 ? 'main' : '')"
data-type="2"
:data-index="index"
:data-indexs="index2"
:data-blogid="comments.blog_id"
:data-blogcommentsid="comments.id"
:data-replycommentsid="comments.blog_comments_id"
@tap="give_thumbs_event"
>
<iconfont :name="(comments.is_give_thumbs || 0) == 1 ? 'icon-bowenxiangqing-dianzan-xuaz' : 'icon-bowenxiangqing-dianzan'" size="28rpx" class="pr top-md margin-right-xs"></iconfont>
<text class="va-m">点赞({{ comments.give_thumbs_count }})</text>
</view>
</view>
</view>
</view>
</view>
</block>
</view>
<view v-if="(item.comments_count || 0) > 0 && (item.is_comments_list_submit == undefined || item.is_comments_list_submit == 1)" class="margin-top-lg text-size-xs">
<text :data-index="index" :data-blogid="item.blog_id" :data-blogcommentsid="item.id" @tap="comments_list_reply_event">
<text v-if="item.is_comments_list_submit == undefined" class="cr-grey">{{ item.comments_count }}</text>
<text v-else class="cr-grey">查看更多回复</text>
<iconfont name="icon-mendian-jiantou2" size="24rpx" class="margin-left-xs pr top-xs"></iconfont>
</text>
</view>
</view>
</view>
</block>
<block v-if="((data_base.blog_detail_comments_more_page_number || 0) == 0 && (data.comments_count || 0) > 20) || ((data_base.blog_detail_comments_more_page_number || 0) > 0 && data.comments_count > data_base.blog_detail_comments_more_page_number)">
<view v-if="propType == 'detail'" class="margin-top-xxl tc padding-bottom-xxl">
<text :data-value="'/pages/plugins/blog/comments/comments?id=' + data.id" @tap="url_event">
<text class="cr-grey">查看全部{{ data.comments_count }}条评论</text>
<iconfont name="icon-qiandao-jiantou2" size="24rpx" class="margin-left-xs pr top-xs"></iconfont>
</text>
</view>
<view v-if="propType == 'comments' && (data.is_comments_list_submit == undefined || data.is_comments_list_submit == 1)" class="margin-top-xxl tc padding-bottom-xxl">
<text :data-blogid="data.id" @tap="comments_list_reply_event">
<text class="cr-grey">查看更多评论</text>
<iconfont name="icon-mendian-jiantou2" size="24rpx" class="margin-left-xs pr top-xs"></iconfont>
</text>
</view>
</block>
</view>
</view>
<!-- 回复弹窗 -->
<view v-if="input_comments_modal_status" class="blog-comments-modal pf">
<view class="blog-comments-modal-content bg-white border-radius-main pr">
<view class="tc margin-bottom-lg">
<text>回复 @{{ input_comments_modal_username }}</text>
<view class="close pa">
<view @tap.stop="modal_close_event">
<uni-icons type="clear" size="46rpx" color="#999"></uni-icons>
</view>
</view>
</view>
<textarea placeholder="期待您的发言..." placeholder-class="cr-grey" class="wh-auto br padding-main" :value="input_comments_value" :maxlength="input_comments_length_max" @input="comments_input_event" @blur="comments_input_event"></textarea>
<view class="margin-top-lg oh">
<image :src="common_static_url + 'emoji-icon.png'" mode="aspectFill" class="emoji-icon va-m" @tap="emoji_event"></image>
<view class="fr">
<text class="va-m text-size-xs cr-grey margin-right-lg">剩余{{ input_comments_length_value }}</text>
<button type="default" size="mini" class="comment-btn cr-white border-radius-sm text-size-xs va-m" :class="input_comments_value.length > 0 ? 'bg-main br-main ' : 'br-grey-d bg-grey-d'" @tap="comments_event"></button>
</view>
</view>
</view>
</view>
<!-- 表情弹窗 -->
<component-emoji-popup ref="emoji" v-on:choiceConfirmEvent="emoji_choice_confirm_event"></component-emoji-popup>
<!-- 分享弹窗 -->
<component-share-popup ref="share"></component-share-popup>
</view>
</view>
</template>
<script>
const app = getApp();
var common_static_url = app.globalData.get_static_url('common');
import componentPopup from '../../components/popup/popup';
import componentSharePopup from '../../components/share-popup/share-popup';
import componentEmojiPopup from '../../components/emoji-popup/emoji-popup';
export default {
data() {
return {
common_static_url: common_static_url,
avatar: app.globalData.data.default_user_head_src,
user: null,
data_base: null,
data: null,
emoji_list: [],
input_comments_value: '',
input_comments_cursor: 0,
input_comments_length_value: 500,
input_comments_length_max: 500,
input_comments_modal_status: false,
input_comments_modal_index: 0,
input_comments_modal_username: '',
input_comments_modal_blog_comments_id: 0,
input_comments_modal_reply_comments_id: 0,
};
},
props: {
propType: {
type: String,
default: 'detail',
},
propData: {
type: [Object, null],
default: null,
},
propDataBase: {
type: [Object, null],
default: null,
},
propEmojiList: {
type: [Array, null],
default: [],
},
},
components: {
componentPopup,
componentSharePopup,
componentEmojiPopup,
},
//
created: function (e) {
var avatar = app.globalData.data.default_user_head_src;
var user = app.globalData.get_user_cache_info() || null;
this.setData({
user: user,
avatar: user == null ? avatar : user.avatar || avatar,
data: this.propData,
data_base: this.propDataBase,
emoji_list: this.propEmojiList,
});
},
methods: {
//
popup_share_event(e) {
if ((this.$refs.share || null) != null) {
this.$refs.share.init();
}
},
//
modal_close_event(e) {
this.setData({
input_comments_modal_status: false,
input_comments_modal_index: 0,
input_comments_modal_username: '',
input_comments_modal_blog_comments_id: 0,
input_comments_modal_reply_comments_id: 0,
input_comments_value: '',
});
},
//
modal_open_event(e) {
if (!app.globalData.is_single_page_check()) {
return false;
}
var user = app.globalData.get_user_info();
if (user != false) {
//
if (app.globalData.user_is_need_login(user)) {
uni.navigateTo({
url: '/pages/login/login?event_callback=favor_event',
});
return false;
} else {
var index = parseInt(e.currentTarget.dataset.index || 0);
var username = e.currentTarget.dataset.username;
var blog_comments_id = e.currentTarget.dataset.blogcommentsid || 0;
var reply_comments_id = e.currentTarget.dataset.replycommentsid || 0;
this.setData({
input_comments_modal_status: true,
input_comments_value: '',
input_comments_modal_index: index,
input_comments_modal_username: username,
input_comments_modal_blog_comments_id: blog_comments_id,
input_comments_modal_reply_comments_id: reply_comments_id,
});
}
}
},
//
emoji_event() {
if (this.input_comments_length_value == 0) {
app.globalData.showToast('已超过最大输入字符限制');
return false;
}
if ((this.$refs.emoji || null) != null) {
this.$refs.emoji.init({ emoji_list: this.emoji_list });
}
},
//
comments_input_event(e) {
var value = e.detail.value.trim();
var length = this.input_comments_length_max - value.length;
this.setData({
input_comments_cursor: e.detail.cursor || 0,
input_comments_value: value,
input_comments_length_value: length <= 0 ? 0 : length,
});
},
//
emoji_choice_confirm_event(emoji) {
var value = this.input_comments_value;
var cursor = parseInt(this.input_comments_cursor || 0);
if (value != '') {
if (cursor == 0) {
value = emoji + value;
} else {
var first = value.substr(0, cursor);
var last = value.substr(cursor, value.length);
value = first + emoji + last;
}
} else {
value = emoji;
}
var length = this.input_comments_length_max - value.length;
this.setData({
input_comments_value: value,
input_comments_length_value: length <= 0 ? 0 : length,
});
},
//
comments_list_reply_event(e) {
var temp_data = this.data;
var page = 1;
var index = parseInt(e.currentTarget.dataset.index || 0);
var blog_id = e.currentTarget.dataset.blogid;
var blog_comments_id = e.currentTarget.dataset.blogcommentsid || 0;
if (blog_comments_id == 0) {
if ((temp_data['page'] || null) == null) {
temp_data['page'] = 1;
} else {
temp_data['page'] += 1;
}
page = temp_data['page'];
} else {
if ((temp_data['comments_list'][index]['page'] || null) == null) {
temp_data['comments_list'][index]['page'] = 1;
} else {
temp_data['comments_list'][index]['page'] += 1;
}
page = temp_data['comments_list'][index]['page'];
}
uni.showLoading({
title: '加载中...',
});
uni.request({
url: app.globalData.get_request_url('commentsreplylist', 'index', 'blog'),
method: 'POST',
data: {
blog_id: blog_id,
blog_comments_id: blog_comments_id,
page: page,
},
dataType: 'json',
success: (res) => {
uni.hideLoading();
if (res.data.code == 0) {
if (blog_comments_id == 0) {
var temp_list = temp_data['comments_list'] || [];
} else {
var temp_list = temp_data['comments_list'][index]['reply_comments_list'] || [];
}
var data = res.data.data.data;
for (var i in data) {
temp_list.push(data[i]);
}
if (blog_comments_id == 0) {
temp_data['comments_list'] = temp_list;
temp_data['is_comments_list_submit'] = res.data.data.page >= res.data.data.page_total ? 0 : 1;
} else {
temp_data['comments_list'][index]['reply_comments_list'] = temp_list;
temp_data['comments_list'][index]['is_comments_list_submit'] = res.data.data.page >= res.data.data.page_total ? 0 : 1;
}
this.setData({ data: temp_data });
} else {
app.globalData.showToast(res.data.msg);
}
},
fail: () => {
uni.hideLoading();
app.globalData.showToast('服务器请求出错');
},
});
},
//
comments_event() {
if (!app.globalData.is_single_page_check()) {
return false;
}
var user = app.globalData.get_user_info();
if (user != false) {
//
if (app.globalData.user_is_need_login(user)) {
uni.navigateTo({
url: '/pages/login/login?event_callback=favor_event',
});
return false;
} else {
if (this.input_comments_value == '') {
app.globalData.showToast('请填写评论内容');
return false;
}
uni.showLoading({
title: '提交中...',
});
uni.request({
url: app.globalData.get_request_url('comments', 'index', 'blog'),
method: 'POST',
data: {
blog_id: this.data.id,
content: this.input_comments_value,
blog_comments_id: this.input_comments_modal_blog_comments_id,
reply_comments_id: this.input_comments_modal_reply_comments_id,
},
dataType: 'json',
success: (res) => {
uni.hideLoading();
if (res.data.code == 0) {
var temp_data = this.data;
if ((this.input_comments_modal_blog_comments_id || 0) == 0) {
var temp_list = temp_data.comments_list || [];
temp_list.splice(0, 0, res.data.data);
temp_data['comments_list'] = temp_list;
temp_data['comments_count'] = parseInt(temp_data['comments_count']) + 1;
} else {
var index = this.input_comments_modal_index;
var temp_list = temp_data.comments_list[index]['reply_comments_list'] || [];
temp_list.splice(0, 0, res.data.data);
if ((this.input_comments_modal_reply_comments_id || 0) != 0) {
for (var i in temp_list) {
if (temp_list[i]['id'] == this.input_comments_modal_reply_comments_id) {
temp_list[i]['comments_count'] = parseInt(temp_list[i]['comments_count']) + 1;
break;
}
}
}
temp_data.comments_list[index]['reply_comments_list'] = temp_list;
temp_data.comments_list[index]['comments_count'] = parseInt(temp_data.comments_list[index]['comments_count']) + 1;
}
this.setData({
data: temp_data,
input_comments_value: '',
input_comments_length_value: this.input_comments_length_max,
input_comments_modal_status: false,
});
} else {
app.globalData.showToast(res.data.msg);
}
},
fail: () => {
uni.hideLoading();
app.globalData.showToast('服务器请求出错');
},
});
}
}
},
//
give_thumbs_event(e) {
if (!app.globalData.is_single_page_check()) {
return false;
}
var user = app.globalData.get_user_info();
if (user != false) {
//
if (app.globalData.user_is_need_login(user)) {
uni.navigateTo({
url: '/pages/login/login?event_callback=favor_event',
});
return false;
} else {
var type = parseInt(e.currentTarget.dataset.type || 0);
var blog_id = e.currentTarget.dataset.blogid;
var blog_comments_id = e.currentTarget.dataset.blogcommentsid || 0;
var reply_comments_id = e.currentTarget.dataset.replycommentsid || 0;
uni.request({
url: app.globalData.get_request_url('givethumbs', 'index', 'blog'),
method: 'POST',
data: {
blog_id: blog_id,
blog_comments_id: blog_comments_id,
reply_comments_id: reply_comments_id,
},
dataType: 'json',
success: (res) => {
if (res.data.code == 0) {
var data = res.data.data;
var temp_data = this.data;
switch (type) {
//
case 0:
temp_data.is_give_thumbs = data.is_active;
temp_data.give_thumbs_count = data.count;
break;
//
case 1:
var index = parseInt(e.currentTarget.dataset.index || 0);
temp_data['comments_list'][index]['is_give_thumbs'] = data.is_active;
temp_data['comments_list'][index]['give_thumbs_count'] = data.count;
break;
//
case 2:
var index = parseInt(e.currentTarget.dataset.index || 0);
var indexs = parseInt(e.currentTarget.dataset.indexs || 0);
temp_data['comments_list'][index]['reply_comments_list'][indexs]['is_give_thumbs'] = data.is_active;
temp_data['comments_list'][index]['reply_comments_list'][indexs]['give_thumbs_count'] = data.count;
break;
}
this.setData({ data: temp_data });
} else {
if (app.globalData.is_login_check(res.data)) {
app.globalData.showToast(res.data.msg);
}
}
},
fail: () => {
app.globalData.showToast('服务器请求出错');
},
});
}
}
},
// url
url_event(e) {
app.globalData.url_event(e);
},
},
};
</script>
<style scoped>
/**
* 聚合点赞评论分享
*/
.ask-comments-bottom-container .item:not(:last-child) {
margin-right: 64rpx;
}
.blog-comments-reply-container .emoji-icon,
.blog-comments-modal .emoji-icon {
width: 40rpx;
height: 40rpx !important;
}
.blog-comments-reply-container .user-avatar {
width: 72rpx;
height: 72rpx !important;
border: 1px solid #eee;
}
.blog-comments-reply-container .right-base {
padding-left: 16rpx;
}
.blog-comments-reply-container .right-base textarea {
height: 120rpx;
}
.blog-comments-modal {
top: 0;
left: 0;
width: calc(100% - 80rpx);
height: 100%;
background: rgba(0, 0, 0, 0.6);
padding: 40rpx;
z-index: 10;
}
.blog-comments-modal-content {
padding: 10px;
border-radius: 10px;
margin: 0 auto;
margin-top: 30%;
max-width: calc(800px - 180rpx);
}
.blog-comments-modal-content textarea {
height: 200rpx;
}
.blog-comments-modal-content .close {
top: 8rpx;
right: 14rpx;
}
.comment-btn {
height: 56rpx;
line-height: 56rpx;
padding: 0 24rpx;
}
/**
* 评论列表
*/
.blog-comments-list > .item .user-avatar {
width: 50rpx;
height: 50rpx;
border: 1px solid #eee;
}
.blog-comments-list .comments-base,
.blog-comments-list .comments-content {
padding-left: 16rpx;
padding-right: 20rpx;
}
.blog-comments-right-content-operate,
.reply-blog-comments-list {
padding-right: 20rpx;
}
.reply-blog-comments-list {
margin-top: 28rpx;
}
.reply-blog-comments-list .right-content {
padding-left: 16rpx;
}
</style>

View File

@ -3,7 +3,7 @@
<view v-if="(data || null) != null && (data_base || null) != null" class="padding-bottom-main">
<view>
<!-- 点赞评论分享 -->
<view v-if="propType == 'detail'" class="tr blog-comments-bottom-container spacing-mt cr-grey padding-horizontal-main">
<view v-if="propType == 'detail'" class="tr blog-comments-bottom-container spacing-mt cr-grey">
<view v-if="(data_base.is_blog_comments_show || 0) == 1" class="item dis-inline-block" :data-value="'/pages/plugins/blog/comments/comments?id=' + data.id" @tap="url_event">
<iconfont name="icon-bowenxiangqing-huifu" size="28rpx" class="pr top-sm margin-right-xs"></iconfont>
<text class="text-size-xs">评论({{ data.comments_count }})</text>
@ -18,10 +18,10 @@
</view>
</view>
<!-- 评论回复表单 -->
<view v-if="(data_base.is_blog_comments_add || 0) == 1 && !input_comments_modal_status" class="padding-top-xxxl padding-bottom-xxl padding-horizontal-main blog-comments-reply-container flex-row jc-sb spacing-mb">
<view v-if="(data_base.is_blog_comments_add || 0) == 1 && !input_comments_modal_status" class="padding-top-xxxl padding-bottom-xxl blog-comments-reply-container flex-row jc-sb spacing-mb">
<image :src="avatar" mode="aspectFill" class="user-avatar fl circle"></image>
<view class="right-base flex-1 flex-width">
<view class="bg-white border-radius-main padding-main">
<view class="comments border-radius-main padding-main">
<textarea placeholder="期待您的发言..." placeholder-class="cr-grey" class="wh-auto" :value="input_comments_value" :maxlength="input_comments_length_max" @input="comments_input_event" @blur="comments_input_event"></textarea>
<view class="oh flex-row jc-sb align-e">
<image :src="common_static_url + 'emoji-icon.png'" mode="aspectFill" class="emoji-icon va-m" @tap="emoji_event"></image>
@ -552,6 +552,9 @@
.blog-comments-reply-container .right-base {
padding-left: 16rpx;
}
.blog-comments-reply-container .right-base .comments {
background-color: #f8f8f8;
}
.blog-comments-reply-container .right-base textarea {
height: 120rpx;
}

View File

@ -1002,7 +1002,7 @@
"path": "goods-list/goods-list",
"style": {
"enablePullDownRefresh": true,
"navigationBarTitleText": "问答列表"
"navigationBarTitleText": "问答专区"
}
}
]

File diff suppressed because it is too large Load Diff

View File

@ -22,6 +22,13 @@
</view>
<view class="text-size-md padding-top-main">{{ detail_data.reply }}</view>
</view>
<view class="padding-main spacing-mt br-t-dashed">
<view class="fw-b">共3个回答</view>
<view class="spacing-mt">
<!-- 评论内容 -->
<component-comments :propData="data" :propDataBase="data_base" :propEmojiList="emoji_list"></component-comments>
</view>
</view>
</view>
<!-- 猜你喜欢 -->
<view v-if="goods_list.length > 0" class="padding-horizontal-main padding-top-sm">
@ -34,13 +41,13 @@
</view>
<view class="bottom-fixed ask-btn-content">
<view class="flex-row jc-sa align-c text-size fw-b bottom-line-exclude">
<navigator url="/pages/user-form/user-form" hover-class="none" class="flex-1 tc flex-col jc-c align-c">
<navigator url="/pages/plugins/ask/user-form/user-form" hover-class="none" class="flex-1 tc flex-col jc-c align-c">
<view class="divider-r-d wh-auto">
<iconfont name="icon-wenda-wytw" size="30rpx" color="#333" class="margin-right-sm"></iconfont>
我要提问
</view>
</navigator>
<navigator url="/pages/user-question/user-question" hover-class="none" class="flex-1 tc flex-col jc-c align-c">
<navigator url="/pages/plugins/ask/user-list/user-list" hover-class="none" class="flex-1 tc flex-col jc-c align-c">
<view class="wh-auto">
<iconfont name="icon-wenda-wdtw" size="32rpx" color="#333" class="margin-right-sm pr top-xs"></iconfont>
我的提问
@ -59,6 +66,7 @@
import componentNoData from '@/components/no-data/no-data';
import componentBottomLine from '@/components/bottom-line/bottom-line';
import componentGoodsList from '@/components/goods-list/goods-list';
import componentComments from '@/components/blog-comments/blog-comments';
export default {
data() {
@ -87,6 +95,7 @@
componentNoData,
componentBottomLine,
componentGoodsList,
componentComments,
},
props: {},

View File

@ -0,0 +1,23 @@
.question .title{
width: 40rpx;
height: 40rpx;
line-height: 40rpx;
background: #fd9525;
border-radius: 4rpx;
}
.question .avatar,
.ask .avatar {
width: 80rpx;
height: 80rpx;
border-radius: 4rpx;
background: #F5F5F5;
}
.ask .title{
width: 40rpx;
height: 40rpx;
line-height: 40rpx;
background: #99BB12;
border-radius: 4rpx;
}

View File

@ -1,8 +1,220 @@
<template>
<view class="padding-main">
<block v-if="data_list.length > 0">
<view v-for="(item, index) in data_list" :key="index" class="bg-white border-radius-main padding-main oh" :class="data_list.length > index + 1 ? 'spacing-b':''">
<view class="title flex-row jc-sb align-c wh-auto">
<view class="name flex-1 flex-width cr-base">{{ item.name }}的提问</view>
<view class="date cr-grey-9">{{ item.add_time_date }}</view>
</view>
<view class="question flex-row spacing-mt">
<view class="title cr-white tc margin-right-sm"></view>
<view class="flex-1 flex-width">
<view class="fw-b">{{ item.content }}</view>
<view v-if="(item.images || null) != null && item.images.length > 0" class="avatar spacing-mt-10 radius margin-right-sm oh">
<image class="wh-auto" @tap="comment_images_show_event" :data-index="index" :data-ix="ix" :src="iv" mode="aspectFit"></image>
</view>
</view>
</view>
<block v-if="item.is_reply == 1 || item.comments_count > 0 ">
<view class="ask flex-row spacing-mt">
<view class="title cr-white tc margin-right-sm"></view>
<view class="flex-1 flex-width">
<view class="cr-base">
<block v-if="item.reply">
{{ item.reply }}
</block>
<block v-if="(item.comments_list || null ) !== null && item.comments_list.length > 0 ">
{{ item.comments_list[0].content }}
</block>
</view>
<view v-if="(item.images || null) != null && item.images.length > 0" class="avatar spacing-mt-10 radius margin-right-sm oh">
<image class="wh-auto" @tap="comment_images_show_event" :data-index="index" :data-ix="ix" :src="iv" mode="aspectFit"></image>
</view>
</view>
</view>
<view class="more flex-row jc-e align-c spacing-mt">
<navigator :url="item.url" hover-class="none">
<view class="cr-red text-size-xs">
查看全部{{ item.comments_count }}个回答
<iconfont name="icon-qiandao-jiantou2" size="24rpx" class="pr top-xs"></iconfont>
</view>
</navigator>
</view>
</block>
</view>
<!-- 结尾 -->
<component-bottom-line :propStatus="data_bottom_line_status"></component-bottom-line>
</block>
<block v-else>
<!-- 提示信息 -->
<component-no-data :propStatus="data_list_loding_status"></component-no-data>
</block>
</view>
</template>
<script>
</script>
const app = getApp();
import componentNoData from '@/components/no-data/no-data';
import componentBottomLine from '@/components/bottom-line/bottom-line';
<style>
</style>
export default {
data() {
return {
data_list: [],
data_total: 0,
data_page_total: 0,
data_page: 1,
data_list_loding_status: 1,
data_bottom_line_status: false,
data_is_loading: 0,
goods_id: null,
};
},
components: {
componentNoData,
componentBottomLine,
},
props: {},
onLoad(params) {
if (params || params.goods_id) {
this.setData({
goods_id: params.goods_id,
});
}
},
onShow() {
this.init();
},
methods: {
init() {
var user = app.globalData.get_user_info(this, 'init');
if (user != false) {
//
if (app.globalData.user_is_need_login(user)) {
uni.redirectTo({
url: '/pages/login/login?event_callback=init',
});
return false;
} else {
//
this.get_data_list();
}
} else {
this.setData({
data_list_loding_status: 0,
data_bottom_line_status: false,
});
}
},
get_data_list(is_mandatory) {
//
if ((is_mandatory || 0) == 0) {
if (this.data_bottom_line_status == true) {
uni.stopPullDownRefresh();
return false;
}
}
//
if (this.data_is_loading == 1) {
return false;
}
this.setData({
data_is_loading: 1,
data_list_loding_status: 1,
});
// loding
uni.showLoading({
title: '加载中...',
});
//
uni.request({
url: app.globalData.get_request_url('datalist', 'index', 'ask'),
method: 'POST',
data: {
page: this.data_page,
goods_id: this.goods_id,
is_comments: 1,
},
dataType: 'json',
success: (res) => {
uni.hideLoading();
uni.stopPullDownRefresh();
if (res.data.code == 0) {
if (res.data.data.data.length > 0) {
if (this.data_page <= 1) {
var temp_data_list = res.data.data.data;
} else {
var temp_data_list = this.data_list || [];
var temp_data = res.data.data.data;
for (var i in temp_data) {
temp_data_list.push(temp_data[i]);
}
}
this.setData({
data_list: temp_data_list,
data_total: res.data.data.total,
data_page_total: res.data.data.page_total,
data_list_loding_status: 3,
data_page: this.data_page + 1,
data_is_loading: 0,
});
console.log(this.data_list);
//
this.setData({
data_bottom_line_status: this.data_page > 1 && this.data_page > this.data_page_total,
});
} else {
this.setData({
data_list_loding_status: 0,
data_is_loading: 0,
});
}
} else {
this.setData({
data_list_loding_status: 0,
data_is_loading: 0,
});
if (app.globalData.is_login_check(res.data, this, 'get_data_list')) {
app.globalData.showToast(res.data.msg);
}
}
},
fail: () => {
uni.hideLoading();
uni.stopPullDownRefresh();
this.setData({
data_list_loding_status: 2,
data_is_loading: 0,
});
app.globalData.showToast('服务器请求出错');
},
});
},
//
scroll_lower(e) {
this.get_data_list();
},
//
comment_images_show_event(e) {
var index = e.currentTarget.dataset.index;
var ix = e.currentTarget.dataset.ix;
uni.previewImage({
current: this.data_list[index]['images'][ix],
urls: this.data_list[index]['images'],
});
},
},
};
</script>
<style scoped>
@import './goods-list.css';
</style>

View File

@ -2,7 +2,7 @@
<view class="page-bottom-fixed">
<view v-if="data_list.length > 0" class="padding-main">
<view v-for="(item, index) in data_list" :key="index">
<navigator :url="'/pages/user-detail/user-detail?id=' + item.id" hover-class="none" class="padding-main border-radius-main bg-white oh spacing-mb">
<navigator :url="'/pages/plugins/ask/detail/detail?id=' + item.id" hover-class="none" class="padding-main border-radius-main bg-white oh spacing-mb">
<view class="margin-bottom-xs flex-row jc-sb align-c">
<text class="fw-b text-size">{{ item.name }}</text>
<text class="ask-status cr-white border-radius-sm text-size-xss" :class="item.is_reply === '1' ? 'ask-bg-green' : 'ask-bg-yellow'">{{ item.is_reply === '1' ? '已回' : '未回' }}</text>

View File

@ -3,29 +3,30 @@
<view v-if="(data || null) != null" class="padding-top-main">
<view class="padding-horizontal-main">
<view class="padding-main border-radius-main bg-white spacing-mb">
<view class="fw-b text-size-xl">{{ data.title }}</view>
<view class="cr-grey-9 margin-top-lg oh br-t padding-top-main text-size-xs">
<view class="fl">
<text>时间</text>
<text>{{ data.add_time }}</text>
</view>
<view class="fr">
<text class="margin-left-xxxl">浏览</text>
<text>{{ data.access_count }}</text>
<view class="spacing-mb">
<view class="fw-b text-size-xl">{{ data.title }}</view>
<view class="cr-grey-9 margin-top-lg oh br-t padding-top-main text-size-xs">
<view class="fl">
<text>时间</text>
<text>{{ data.add_time }}</text>
</view>
<view class="fr">
<text class="margin-left-xxxl">浏览</text>
<text>{{ data.access_count }}</text>
</view>
</view>
</view>
</view>
<view class="padding-main border-radius-main bg-white oh web-html-content spacing-mb">
<view v-if="(data.video_url || null) != null && ((data.is_live_play || 0) == 0 || client_type == 'weixin')">
<video :src="data.video_url" class="wh-auto" :autoplay="false" :controls="true"></video>
<view class="oh web-html-content spacing-mb">
<view v-if="(data.video_url || null) != null && ((data.is_live_play || 0) == 0 || client_type == 'weixin')">
<video :src="data.video_url" class="wh-auto" :autoplay="false" :controls="true"></video>
</view>
<mp-html :content="data.content" />
</view>
<mp-html :content="data.content" />
<!-- 评论内容 -->
<component-blog-comments :propData="data" :propDataBase="data_base" :propEmojiList="emoji_list"></component-blog-comments>
</view>
</view>
<!-- 评论内容 -->
<component-blog-comments :propData="data" :propDataBase="data_base" :propEmojiList="emoji_list"></component-blog-comments>
<view class="padding-horizontal-main">
<!-- 上一篇下一篇 -->
<view v-if="(last_next || null) != null" class="last-next-data spacing-mb">

View File

@ -57,6 +57,7 @@
},
components: {
componentNoData,
componentUpload,
},