123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551 |
- <template>
- <view class="hb-comment">
- <!-- 阅读数-start -->
- <!-- <view>
- <img style="width: 14px; height: 14px;"
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAA0tJREFUWEftVk2IHUUQ/qp311NOksRT8JBDkARCfrxEDyLK+pe/DQkmJpBlZ7ofDwQ15iRocjYSSWAzU/OWd4hCMJiQH43xBz2YXCRivIgHQQ8SRPGUU/btfNLPnuU5O7OZlWz2kobh8aq/qvq6qrq6BEu8ZIn94wGBBUWg3W6v6vV62wFsILlGRNYA6AH4AcCPJH8mebPT6dxomtpGBJxz4wD2kny2oWHN81ybEJmXQKvVWpfn+VsAXi45vgPgj/D5rUfC91AJ54m83el0PLZy1RKw1u4GkAB4OGj+LSJXRORMkiSXq6xFUfSUiHi93SKyImB+BeBU9fMqnUoCcRy/IiIfFAoicp7kYVX9pUkKrLWrReRdkjsLvNfPsuxYWX8OAWvtOwCODACPqOrRJo7LmApbe1T17CDuPwSccy2SpwZYj2VZdr7K+fj4+IqRkZFVIjJD8ndV/asKdzcSswTiON4iIlcBLPOGROTFNE0/rTHqQ3motHdWVffU1YYx5utizxjzXJIk3te/nbDdbi/r9XpesCWAasNureV86VDVurqKRUSD7k8zMzPPT01N/dYHW2uPA3gtnDxL09TWnPwjX+F+j+Q1EfkCwC0ALwHYGnTeU9U3q/Sdc0oyDnvnVHWXOOdeIPlJEN4E8ExVPq21ywH8GXCXVHXboJM4jr8VkSe8bHp6emW32y2ws7Bg40sA68NhD3gCXZIHA2q07r4659aT9C3XL3+vi3D2BaVi26Sq31dFIY7jgyLSDXs3xFp7rci9MebJJEn8/zlrMQj00+ic20/ydAjJhTRNd9Tk/56ngOT2ogg/BjAWHB9X1TfuQxG+r6qv9wlMTEw8OjQ0dAXAY8HxYl/D68PDw6OTk5O3Z+9sq9UazfP8s+Lki9iIbpMczbLsej/tg6F2zr1K8kQhI3n/WnHhdDEfI5L7syz7cPDQlW2zHIl78RwDqCzu2oEkiqKnjTFfDbD9vwOJb9vHsiw7XHWz5h3JoijaZIzxz/PjJeVGIxnJb4wxJ9M0PVflfE4R1oGcc2Mk9wHYVYcpyS8BuKiqnbvhG03FhRHn3GaSG0muM8as9b8AjB/HRcR/35G8oKr+hWy0FkSgkcUFgh4QWPII/ANy0cUvD9WbkgAAAABJRU5ErkJggg==" />
- <span class="top-read">{{commentData.readNumer}}</span>
- </view> -->
- <!-- 阅读数-end -->
- <!-- 阅读数下边那条线-start -->
- <!-- <view class="seg_line_box">
- <view class="seg_line"></view>
- <view class="seg_dot"></view>
- <view class="seg_line"></view>
- </view> -->
- <!-- 阅读数下边那条线-end -->
- <!-- 评论主体-start -->
- <view class="comment-list" v-if="commentData.comment.length != 0">
- <!-- 评论主体-顶部数量及发表评论按钮-start -->
- <view class="comment-num">
- <view>{{ $t('common.allComments') }} ({{commentData.commentSize}})</view>
- <!-- <view class="add-btn">
- <button type="primary" size="mini" @click="commentInput">发表评论</button>
- </view> -->
- </view>
- <!-- 评论主体-顶部数量及发表评论按钮-end -->
- <!-- 评论列表-start -->
- <view class="comment-box" v-for="(item, index) in commentData.comment" :key="index">
- <view class="comment-box-item">
- <view>
- <image :src="item.avatar || emptyAvatar" mode="aspectFill" class="avatar"></image>
- </view>
- <view class="comment-main">
- <!-- 父评论体-start -->
- <view class="comment-main-top">
- <view class="nick-name-box">
- <!-- <view class="comLogo com1" v-if="index == 0">沙发</view>
- <view class="comLogo com2" v-if="index == 1">板凳</view>
- <view class="comLogo com3" v-if="index == 2">地板</view> -->
- <!-- <view class="comLogo com4" v-if="index > 2">{{index + 1}}楼</view> -->
- <view class="nick-name">{{item.user_nickname}}</view>
- </view>
- <view class="zan-box flex-center" @click="like(item.id)">
- <span :class="item.is_likes == 1 ? 'isLike' : 'notLike'">{{item.like == 0 ? '' : item.like}}</span>
- <img style="width: 48rpx; height: 48rpx;" v-if="item.is_likes == 0" src="/static/image/news/zan-false.png" />
- <img style="width: 48rpx; height: 48rpx;" v-else src="/static/image/news/zan.png" />
- </view>
- </view>
- <view class="comment-main-content">
- {{item.content.length > 60 ? item.content.slice(0, 59) : item.content}}
- <span v-if="item.content.length > 60">
- {{item.hasShowMore ? item.content.slice(59) : '...'}}
- <span class="foot-btn" @click="showMore(item.id)">
- <!-- 收起 展开 -->
- {{item.hasShowMore ? $t('common.retract') : $t('common.expand')}}
- </span>
- </span>
- </view>
- <view class="comment-main-foot">
- <view class="foot-time">{{item.addtime}}</view>
- <!-- <view class="foot-btn" @click="reply(item.user_nickname,item.user_nickname,item.id)">回复</view>
- <view class="foot-btn" v-if="item.owner" @click="confirmDelete(item.id)">删除</view> -->
- </view>
- <!-- 父评论体-end -->
- <!-- 子评论列表-start -->
- <view class="comment-sub-box">
- <view class="comment-sub-item" v-for="(each,index) in item.children" :key="index">
- <view>
- <image :src="each.avatar || emptyAvatar" mode="aspectFill" class="avatar">
- </image>
- </view>
- <view class="comment-main">
- <view class="sub-comment-main-top">
- <view class="nick-name">{{each.user_nickname}}</view>
- <view class="zan-box flex-center" @click="like(each.id)">
- <span :class="each.is_likes == 1 ? 'isLike' : 'notLike'">{{each.like == 0 ? '' : each.like}}</span>
- <img style="width: 48rpx; height: 48rpx;" v-if="each.is_likes == 0" src="/static/image/news/zan-false.png" />
- <img style="width: 48rpx; height: 48rpx;" v-else src="/static/image/news/zan.png" />
- </view>
- </view>
- <view class="comment-main-content">
- {{each.content.length > 60 ? each.content.slice(0, 59) : each.content}}
- <span v-if="each.content.length > 60">
- {{each.hasShowMore ? each.content.slice(59) : '...'}}
- <span class="foot-btn" @click="showMore(each.id)">
- <!-- 收起 展开 -->
- {{each.hasShowMore ? $t('common.retract') : $t('common.expand')}}
- </span>
- </span>
- </view>
- <view class="comment-main-foot">
- <!-- <view class="foot-time">{{each.addtime}}</view> -->
- <!-- <view class="foot-btn" @click="reply(item.user_nickname,each.user_nickname,item.id)">
- 回复</view> -->
- <!-- <view class="foot-btn" v-if="each.owner" @click="confirmDelete(each.id)">删除
- </view> -->
- </view>
- </view>
- </view>
- </view>
- <!-- 子评论列表-end -->
- </view>
- </view>
- </view>
- <!-- 评论列表-end -->
- </view>
- <!-- 评论主体-end -->
- <!-- 无评论-start -->
- <view class="comment-none font24" v-else>
- <!-- No comments, Click on the comments-->
- {{$t('common.noComments')}},<span @click="commentInput" style="color: #DC3C23;">{{$t('common.COTComments')}}</span>
- </view>
- <!-- 无评论-end -->
- <!-- 新增评论-start -->
- <view class="comment-submit-box" v-if="submit" @click="closeInput">
- <!-- 下边的click.stop.prevent用于让上边的click不传下去,以防点到下边的空白处触发closeInput方法 -->
- <view class="comment-add" @click.stop.prevent="stopPrevent" :style="'bottom:' + KeyboardHeight + 'px'">
- <view class="comment-submit">
- <view class="btn-click cancel" @click="closeInput">{{$t('news.cancel')}}</view>
- <view>
- <view class="replayTag" v-show="showTag">
- <!-- 回复在 {{pUser}} 的评论下 -->
- <view>{{ $t('common.reUnder').replace('{params}', pUser) }}</view>
- <view @click="tagClose" class="replyTagClose">×</view>
- </view>
- </view>
- <view>
- <view class="btn-click" @click="add">{{$t('news.confirm')}}</view>
- </view>
- </view>
- <textarea class="textarea" v-model="commentReq.content" :placeholder="placeholder" :adjust-position="false" :show-confirm-bar="false"
- @blur="blur" @focus="focusOn" :focus="focus" maxlength="800"></textarea>
- </view>
- </view>
- <!-- 新增评论-end -->
- </view>
- </template>
- <script>
- export default {
- name: 'hb-comment',
- props: {
- cmData: {
- type: Object,
- default: () => {
- return null;
- }
- },
- deleteTip: {
- type: String,
- default: () => {
- // 操作不可逆,如果评论下有子评论,也将被一并删除,确认?
- return this.$t('common.operationNot');
- }
- },
- },
- watch: {
- cmData: {
- handler: function(newVal, oldVal) {
- this.init(newVal);
- },
- immediate: true
- }
- },
- data() {
- return {
- "emptyAvatar": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAABF5JREFUWEfFl11oHFUUx//nbmKwxdJ9qFL7YPEhRJC2gljjF60WG0WsoNkWfSnZ7Jy7FVPF0AoKpmBFqyIG3Jk7G1iIQXHbBz+KbbGtRfBbMe2LseKjiVDoiqIhwZ0jV3fb3cnM7kQCuU+7M+ec/+9+nHPPEJZ50DLrY1EApVJp9fz8/BYRuZ2INgDYWJvAWRE5R0RnZmZmPh4ZGZlPOrFEAMVi8e4gCPYSUZ+IXGGFgiCYIaJpKyQi1yql1orIFgAXARxRSvm5XO67diBtAYwxRQCDAE4RUUkpdWxwcNCKLBiu665TSj0kIpqIbgTgMzO3gmgJYIz5CMB9AIaZ+bXGQMVi8RoRuZeI/lZKHc1ms3/U34+Pj6+cnZ3dC+AggGPMfH8cRCyAMUZqThlmPlwPUCgU0qlUyq7Kww1BrbjHzPsahYwx/QDK9hkzR2pFPjTGnAWwIexkjOkRkRIR3Rozo5Miskdr/VMIxE7mHDPXD+2l1wsA6nseBMHmfD7/dSjQOwB2tTlYC/bddd1blFJfARhj5lyjfxNA7bSfitpz3/d3iYgFaDuUUjeHM8AY8zSAV5VS9+RyudP1IE0Axpj3Aaxk5m1hFc/zPiWiO9uq/2dwiJn3h22NMScB/MnMOxYAjI6Orurq6rpgU0hrXYpw/hFAd0KAD5n5wbCt7/t7ROT1ubm5NUNDQ7/b95dWwHXd7Uqp452dnVcPDAxciACwDlclAbAFynGcdRGr2EtEnwdB0JfP5080ARhjDhLRbY7jbI0SMcZUAKxOAgDgN2ZOx8SxGfEiMz/bBOD7/lgQBCu01o/GOH4PYFNCgElmvinK1vf9X2xxchzHVtfLW2CMOQpgipmHYwBeBtBUaOJgRKSgtX48Js63AH5l5geaADzPe1cpddFxnHyM42YAXyZYAXt+epn557iVFJHzWuudYYDnlFJ9juPcESfi+35JRHa3gdjPzIfibIwxNtPe0Fq/EAZ4hIhcZl4T5+y67nql1CcA1kfZENFnrSZQ6ycqItKvtT4SBthIRJMdHR092WzW5nzk8H1/WEReiQHY4TjOB3G+nuf9qyEim7TW9r65fAjL5fKVlUrlPICXmPnNFquwWym1oFBZ+yAItubz+TMtAJ4gon3pdLo7k8nMNgHYP7ZeE5EWkbuYeaYx0NjY2HXValUDeApAV4zIJIADzPxe+H2hULg+lUp9U6sBl3qLprugXC6nKpXKF0R02nGcZ2wQ3/e3ichOEckQ0aoEWQDbsgF4a3p6eqLeH3qeN0FE3el0ujeTyVTrcaKuY1uIjIg8CaCfiLYnEW1hY4WPi8gEgMeY+e1G27iGxHYxtptZynGYmTPhgK1asqWEiBRfcAjDdMaYpYCIFW8LUMuM54nIsb3/YvbDXskiYtuzA6382n4X1CDWAnCSgNSFa98ETakcWbwWMytjzAoAPUEQ3JBKpXrs75r/VLVanVJK/VC7Uf9KGjfRCiQN9n/slh3gHz9i4jC+FVL5AAAAAElFTkSuQmCC",
- "commentData": null,
- "placeholder": this.$t('news.input'),
- "commentReq": {
- "pId": null, // 评论父id
- "content": null // 评论内容
- },
- "pUser": null, // 标签-回复人
- "showTag": false, // 标签展示与否
- "focus": false, // 输入框自动聚焦
- "submit": false, // 弹出评论
- "KeyboardHeight": 0 // 键盘高度
- };
- },
- mounted: function() {
- uni.onKeyboardHeightChange(res => {
- this.KeyboardHeight = res.height;
- })
- },
- methods: {
- // 初始化评论
- init(cmData) {
- // for (var i in cmData.comment) {
- // cmData.comment[i].hasShowMore = false;
- // for (var j in cmData.comment[i].children) {
- // cmData.comment[i].children[j].hasShowMore = false;
- // }
- // }
- this.commentData = cmData;
- },
- // 没用的方法,但不要删
- stopPrevent() {},
- // 回复评论
- reply(pUser, reUser, pId) {
- if (this.$store.state.isLogin != 1) {
- this.$toUrl('/pages/login/login')
- return
- }
- this.pUser = pUser;
- this.commentReq.pId = pId;
- if (reUser) {
- this.commentReq.content = '@' + reUser + ' ';
- } else {
- this.commentReq.content = '';
- }
- this.showTag = true;
- this.commentInput();
- },
- // 删除评论前确认
- confirmDelete(commentId) {
- var that = this;
- uni.showModal({
- // 警告
- title: this.$t('common.warn'),
- content: that.deleteTip,
- confirmText: this.$t('common.delete1'),
- success: function(res) {
- if (res.confirm) {
- that.$emit('del', commentId);
- }
- }
- });
- },
- // 新增评论
- add() {
- if (this.$store.state.isLogin != 1) {
- this.$toUrl('/pages/login/login')
- return
- }
- if (this.commentReq.content == null || this.commentReq.content.length < 2) {
- // Please enter content
- this.$toast(this.$t('common.PEContent'))
- return
- }
- this.$emit('add', this.commentReq);
- },
- // 点赞评论
- like(commentId) {
- if (this.$store.state.isLogin != 1) {
- this.$toUrl('/pages/login/login')
- return
- }
- this.$emit('like', commentId);
- },
- // 新增完成
- addComplete() {
- this.commentReq.content = null;
- this.tagClose();
- this.closeInput();
- },
- // 点赞完成-本地修改点赞结果
- likeComplete(commentId) {
- for (var i in this.commentData.comment) {
- if (this.commentData.comment[i].id == commentId) {
- this.commentData.comment[i].is_likes == 1 ? this.commentData.comment[i].like-- : this.commentData
- .comment[i].like++;
- this.commentData.comment[i].is_likes == 1?this.commentData.comment[i].is_likes = 0 : this.commentData.comment[i].is_likes = 1;
- return
- }
- for (var j in this.commentData.comment[i].children) {
- if (this.commentData.comment[i].children[j].id == commentId) {
- this.commentData.comment[i].children[j].is_likes == 1 ? this.commentData.comment[i].children[j].like-- : this.commentData.comment[i].children[j].like++;
- this.commentData.comment[i].children[j].is_likes == 1 ? this.commentData.comment[i].children[j].is_likes = 0 : this.commentData.comment[i].children[j].is_likes= 1;
- return
- }
- }
- }
- },
- // 删除完成-本地删除评论
- deleteComplete(commentId) {
- for (var i in this.commentData.comment) {
- for (var j in this.commentData.comment[i].children) {
- if (this.commentData.comment[i].children[j].id == commentId) {
- this.commentData.comment[i].children.splice(Number(j), 1);
- return
- }
- }
- if (this.commentData.comment[i].id == commentId) {
- this.commentData.comment.splice(Number(i), 1);
- return
- }
- }
- },
- // 展开评论
- showMore(commentId) {
- for (var i in this.commentData.comment) {
- if (this.commentData.comment[i].id == commentId) {
- this.commentData.comment[i].hasShowMore = !this.commentData.comment[i].hasShowMore;
- this.$forceUpdate();
- return
- }
- for (var j in this.commentData.comment[i].children) {
- if (this.commentData.comment[i].children[j].id == commentId) {
- this.commentData.comment[i].children[j].hasShowMore = !this.commentData.comment[i].children[j]
- .hasShowMore;
- this.$forceUpdate();
- return
- }
- }
- }
- },
- // 输入框失去焦点
- blur() {
- this.focus = false;
- },
- // 输入框聚焦
- focusOn() {
- this.$emit('focusOn');
- },
- // 标签关闭
- tagClose() {
- this.showTag = false;
- this.pUser = null;
- this.commentReq.pId = null;
- },
- // 输入评论
- commentInput() {
- // TODO 调起键盘方法
- this.submit = true;
- setTimeout(() => {
- this.focus = true;
- }, 50)
- },
- // 关闭输入评论
- closeInput() {
- this.focus = false;
- this.submit = false;
- }
- }
- };
- </script>
- <style lang="scss" scoped>
- .hb-comment {
- padding: 24rpx;
- height: 100%;
- overflow-y:auto;
- // border-top: 20rpx solid #F3F3F7;
- }
- .top-read {
- font-size: 28rpx;
- padding-left: 10rpx;
- color: #999999;
- }
- .seg_line_box {
- display: flex;
- height: 5rpx;
- justify-content: space-between;
- margin: 5rpx 0;
- }
- .seg_line {
- width: 45%;
- border-bottom: 1rpx solid #e1e1e1;
- }
- .seg_dot {
- width: 8%;
- border-bottom: 5rpx dotted #dbdbdb;
- }
- .comment-num {
- display: flex;
- justify-content: space-between;
- align-items: center;
- padding: 20rpx 0;
- }
- .comment-box {
- padding: 24rpx 0;
- border-bottom: 2rpx solid #E9E9E9;
- }
- .comment-box-item {
- display: flex;
- }
- .comment-main {
- padding-left: 20rpx;
- }
- .comment-main-top {
- width: 600rpx;
- padding-top: 6rpx;
- display: flex;
- justify-content: space-between;
- }
- .sub-comment-main-top {
- width: 510rpx;
- padding-top: 6rpx;
- display: flex;
- justify-content: space-between;
- }
- .avatar {
- width: 70rpx;
- height: 70rpx;
- border-radius: 50%;
- }
- .nick-name-box {
- display: flex;
- align-items: center;
- }
- .comLogo {
- margin-right: 18rpx;
- font-size: 22rpx;
- border-radius: 10rpx;
- padding: 5rpx 15rpx;
- color: #FFFFFF;
- }
- .com1 {
- background-color: #d218b1;
- }
- .com2 {
- background-color: #f19c0b;
- }
- .com3 {
- background-color: #c8da85;
- }
- .com4 {
- background-color: #bfd0da;
- }
- .nick-name {
- font-size: 32rpx;
- color: #333;
- }
- .isLike {
- font-size: 28rpx;
- padding-right: 10rpx;
- color: #DC3C23;
- }
- .notLike {
- font-size: 28rpx;
- padding-right: 10rpx;
- color: #999999;
- }
- .comment-main-content {
- font-size: 28rpx;
- padding: 10rpx 10rpx 10rpx 0;
- }
- .comment-main-foot {
- display: flex;
- font-size: 22rpx;
- }
- .replayTag {
- color: #909399;
- margin-bottom: 5px;
- border: 1px solid #c8c9cc;
- background-color: #f4f4f5;
- border-radius: 3px;
- display: flex;
- justify-content: space-between;
- align-items: center;
- font-size: 16rpx;
- padding: 5px 10px;
- }
- .replyTagClose {
- font-size: 20px;
- line-height: 12px;
- padding: 0 0 2px 5px;
- }
- .foot-btn {
- padding-left: 10rpx;
- color: #007AFF;
- }
- .comment-sub-box {
- padding: 20rpx 0;
- }
- .comment-sub-item {
- display: flex;
- }
- .comment-none {
- padding: 20rpx;
- width: 100%;
- text-align: center;
- color: #999999;
- }
- .comment-submit-box {
- position: fixed;
- display: flex;
- align-items: flex-end;
- z-index: 9900;
- left: 0;
- top: var(--window-top);
- bottom: 0;
- background-color: rgba($color: #000000, $alpha: 0.5);
- width: 100%;
- }
- .comment-add {
- position: fixed;
- background-color: #FFFFFF;
- width: 100%;
- padding: 5rpx;
- border: 1px solid #ddd;
- transition: .3s;
- -webkit-transition: .3s;
- }
- .btn-click {
- color: $color2;
- font-size: 28rpx;
- padding: 10rpx;
- }
- .cancel {
- color: #606266;
- }
- .textarea {
- height: 100px;
- padding: 16rpx;
- width: 100%;
- }
- .comment-submit {
- padding: 5rpx 20rpx 0 20rpx;
- border-bottom: 1px dashed #ddd;
- width: calc(100% - 40rpx);
- display: flex;
- justify-content: space-between;
- align-items: center;
- }
- </style>
|