Files
learning-system-mobile/components/interact-fixed/interact-fixed.vue
2023-11-23 13:40:00 +08:00

630 lines
18 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>
<view style="height: 50px;"></view>
<view class="interact-fixed">
<view class="interact-bar" style="display: flex;">
<view class="interact-bar-item" style="width: 50%;">
<slot>
<view class="field" @click="openInput()">
<u-icon name="edit-pen-fill" size="18" class="field-icon"></u-icon>
<text class="wenz">写评论</text>
</view>
</slot>
</view>
<!-- <view v-if="answers" class="interact-bar-item">
<view class="interact-bar-icon"><image style="width:34upx;height: 31upx;" src="/static/images/icon/comment.png" alt=""></view>
<view class="interact-bar-txt">{{data.answers}}</view>
</view> -->
<view class="field-right" style="display:flex;width: 50%;justify-content: flex-end;padding-right: 20rpx;margin-top: 16upx;">
<view v-if="comments" class="interact-bar-item" @click="handleComment()">
<view class="interact-bar-icon"><image style="width:40upx;height: 40upx;" src="/static/images/icon/comment.png" alt=""></view>
<!-- <view class="interact-bar-txt">{{data.comments}}</view> -->
</view>
<view v-if="praises" @click="addPraise" class="interact-bar-item">
<view class="interact-bar-icon" v-if="isPraise"><image style="width:40upx;height: 40upx;" src="/static/images/icon/artice-praise-active.png" alt="" ></view>
<view class="interact-bar-icon" v-else><image style="width:40upx;height: 40upx;" src="/static/images/icon/artice-praise.png" alt="" ></view>
<!-- <view class="interact-bar-txt">{{data.praises}}</view> -->
</view>
<view v-if="favorites" @click="addFavorite()" class="interact-bar-item">
<view class="interact-bar-icon" v-if="isFavorite"><image style="width:40upx;height: 40upx;" src="/static/images/icon/favorite-active.png" alt="" ></view>
<view class="interact-bar-icon" v-else><image style="width:40upx;height: 40upx;" src="/static/images/icon/favorite.png" alt="" ></view>
<!-- <view class="interact-bar-txt">收藏</view> -->
<!-- <view class="interact-bar-txt">{{data.favorites}}</view> -->
<!-- 这里需要一个是否已经收藏的变量来控制已收藏就显示收藏数 -->
</view>
<view v-if="shares" @click="addShare" class="interact-bar-item">
<view class="interact-bar-icon"><image style="width:40upx;height: 40upx;" src="/static/images/icon/share.png" alt=""></view>
<!-- <view class="interact-bar-txt">分享</view> -->
</view>
</view>
</view>
</view>
<u-toast ref="interactToast"></u-toast>
<u-popup :show="inputShow" @close="closeInput" @open="openInput" :round="16">
<view class="users-box" v-show="usersListShow">
<view class="users-list" v-for="u in usersList" :key="u.id" @click="userSelect(u)">
<u-avatar shape="circle" :size="50" v-if="u.avatar != ''" :src="u.avatar"></u-avatar>
<view v-else>
<u-avatar shape="circle" v-if="u.sex === 1" :size="50" src="../../static/images/man.png"></u-avatar>
<u-avatar shape="circle" v-else :size="50" src="../../static/images/woman.png"></u-avatar>
</view>
<!-- <u-avatar v-else :size="25" random-bg-color :text="data.name" shape="square"></u-avatar> -->
<view class="uavatar-scale">{{u.name}}</view>
</view>
</view>
<view>
<view style="padding: 40upx 44upx 32upx 22upx;">
<view ><u--textarea style="border: none;background: #F4F4F4;" :height="50" v-model="inputValue" placeholder="写下您的评论(140字以内),可以@作者哦~" count ></u--textarea></view>
<view style="padding-top: 10px;line-height: 80upx;display: flex;float: right;">
<!-- <view @click="usersClick()">@</view> -->
<view style="padding:20upx;"><u-button @click="submit" style="padding: 2upx 30upx;height: 52upx;background: #87B3FF;border-color: #87B3FF;" type="primary" text="发布"></u-button></view>
</view>
</view>
<view>
</view>
</view>
</u-popup>
<interact-share ref="comShare" :data="data":type="type"></interact-share>
</view>
</template>
<script>
import apiPraises from '@/api/modules/praises.js'
import apiComment from '@/api/modules/comments.js'
import apiShares from '@/api/modules/shares.js'
import apiFavorites from '@/api/modules/favorites.js'
import apiUser from '@/api/system/user.js'
import apiCoursePortal from '@/api/modules/coursePortal.js'
import apiMessage from '@/api/system/message.js'
import apiStat from '@/api/phase2/stat.js'
import { mapGetters } from 'vuex';
export default {
props: {
data:{
type:Object,
default(){
return{
id:'',
type:1,
answers:23,
favorites:23,
comments:18,
shares:16,
praises:68,
views:12,
}
}
},
align:{
type:String,
default:'right'
},
isCrowd:{
type:Boolean,
default:false
},
answers:{
type:Boolean,
default:false
},
comments:{
type:Boolean,
default:true
},
favorites:{
type:Boolean,
default:true
},
shares:{
type:Boolean,
default:true
},
praises:{
type:Boolean,
default:true
},
views:{
type:Boolean,
default:true
},
type:{
type:Number,
default:0 //默认是课程
},
pageType:{
type:Number,
default:0
},
pageParams:{
type:String,
default:''
},
users:{
// type:Object,
}
},
computed:{
...mapGetters(['userInfo']),
},
data(){
return {
userData:{},
usersListShow: false,
usersList: [],
isPraise:false,
isFavorite:false,
inputShow:false,
inputValue:'',
loading:false,
shareInfo:{
show:false,
name:'',
users:[],
},
toUserDig:{
show:false,
name:'',
chooseUserId:'',
chooseUserName:'',
list:[]
}
}
},
watch:{
data(newVal,oldVal){
if(newVal && newVal.id!=''){
this.checkHas();
this.loadUser();
}
}
},
mounted() {
this.checkHas();
this.loadUser();
},
methods:{
handleComment() {
if(!this.isCrowd){
return
}
this.$emit('handle-comment');
},
messageSave(refId,title,sendName,acceptName,acceptId,typeText){
let content;
let conType;
if(this.type==1){
content='课程';
conType = this.data.type;
}
if(this.type==2){
content='文章'
}
if(this.type==3){
content='案例'
}
if(this.type==4){
content='问答'
}
if(title){
content=sendName+typeText+content+'-'+title
}else{
content=sendName+typeText+content
}
let message={
content,
refId,
refType:this.type,
sendName,
acceptName,
pageType:this.type,
pageParams:refId,
acceptId,
title:'系统消息',
sendType:1,
conType,
content,
source:1,
// pageUrl:location.href,
pageUrl:'',
sendAid:this.userInfo.aid,
}
apiMessage.save(message).then(res=>{
if(res.status==200){
}
})
},
userSelect(data) {
this.usersListShow = false;
this.userData = data;
// this.toUserDig.chooseUserId = data.id;
// this.toUserDig.chooseUserName = data.name;
this.toUserDig.chooseUserId = data.sysCreateAid;
this.toUserDig.chooseUserName = data.sysCreateBy;
this.inputValue = "@"+data.name+this.inputValue;
},
usersClick() {
if(this.usersListShow) {
this.usersListShow = false;
} else {
this.usersListShow = true;
}
},
loadUser() {
if(this.type == 1) {
this.usersList = this.users;
}
if(this.type == 2) {
this.usersList = [];
this.usersList.push({
sysCreateAid: this.data.sysCreateAid,
sysCreateBy:this.data.sysCreateBy
})
}
let ids = [];
this.usersList && this.usersList.forEach(item=>{
if(this.type == 1) {
item.sysCreateAid = item.teacherId;
}
item.avatar= '';
item.name= '';
item.sex = '';
ids.push(item.sysCreateAid);
})
this.loadUserInfos(this.usersList,ids);
},
loadUserInfos(list,userIds){
let $this=this;
const noReapetIds=[...new Set(userIds)]
apiUser.getByIds(noReapetIds).then(res=>{
if(res.status==200){
list&& list.forEach(item=>{
res.result.some(author=>{
if(author.aid==item.sysCreateAid){
if(author.avatar!=''){
item.avatar=$this.$config.fileUrl+author.avatar;
}
item.name = author.name;
item.sex = author.sex;
return true;
}
return false;
})
})
}else{
console.log('查询用户信息失败:'+res.error);
}
})
},
checkHas(){
if(this.type>0 && this.data.id){
if(this.praises){
apiPraises.has(this.type,this.data.id).then(rs=>{
if(rs.status==200 && rs.result){
this.isPraise=true;
}else{
this.isPraise=false;
}
});
}
if(this.favorites){
apiFavorites.has(this.type,this.data.id).then(rs=>{
if(rs.status==200 && rs.result){
this.isFavorite=true;
}else{
this.isFavorite=false;
}
})
}
}
},
submit(){
if(this.inputValue!=''){
let cdata={
objType:this.type,
objId:this.data.id,
parentId:'-1',
content:this.inputValue,
clevel:1,
toAid:'',
toAname:'',
}
if(this.inputValue.charAt(0) == '@' && this.toUserDig.chooseUserId!=='' && this.toUserDig.chooseUserName!=''){
cdata.toAid=this.toUserDig.chooseUserId;
cdata.toAname=this.toUserDig.chooseUserName;
}
apiComment.add(cdata).then(res=>{
if(res.status==200){
// this.$refs.interactToast.show({message:'发布成功',type:'success'});
this.inputValue='';
this.data.comments++;
this.toUserDig.chooseUserId='';
this.toUserDig.chooseUserName='';
this.inputShow=false;
this.$emit("comment-success", res.result);
let event = {
key: "PublishComment",//后台的事件key 发布文章且审核通过
title: "发表评论",//事件的标题
parameters:"",//用户自定义参数 name:value,name:value
content: "每发表一个评论",//事件的内容
objId: res.result.id,//关联的id
objType: '80',//关联的类型,这里关联的类型应该是评论,不是课程
objInfo: "评论",
aid: this.userInfo.aid, //当前登录人的id
aname: this.userInfo.name,//当前人的姓名
status: 1 ,//状态直接写1
source:2,
}
apiStat.sendEvent(event);
}else{
this.$refs.interactToast.show({message:'发布失败',type:'error'});
}
});
}
},
addPraise(){
if(this.type==0){
//console.log('未设置type值,1表课程,2表文章3表案例4表问答')
return;
}
if(this.loading){
return;
}
//需要判断是否已点赞,已点赞的不再加
let postData={
objType:this.type,
objId:this.data.id,
title:'',
}
if(this.type==1){
postData.title=this.data.name;
}else{
postData.title=this.data.title;
}
this.loading=true;
if(this.isPraise){
apiPraises.remove(this.type,this.data.id).then(res=>{
this.loading=false;
if(res.status==200){
if(res.result){
this.data.praises--;
}
this.isPraise=false;
this.$refs.interactToast.show({message:'取消点赞',type:'success'});
this.$emit("praise-success", res.result);
let event = {
key: "CancelPraise",//
title: "取消点赞",//事件的标题
parameters:"author:"+authorId,//用户自定义参数 name:value,name:value
content: "取消点赞"+postData.title,//事件的内容
objId: this.data.id,//关联的id
objType: this.type,//关联的类型
objInfo: this.data.title,
aid: this.userInfo.aid, //当前登录人的id
aname: this.userInfo.name,//当前人的姓名
status: 1 ,//状态直接写1
source:2,
}
apiStat.sendEvent(event);
}else{
this.$refs.interactToast.show({message:'取消失败',type:'error'});
}
})
} else {
let contentText = '';
if(this.type==1){
contentText='课程';
// conType = this.data.type;
}
if(this.type==2){
contentText='文章'
}
if(this.type==3){
contentText='案例'
}
if(this.type==4){
contentText='提问'
}
if(this.type==5){
contentText='回答'
}
if(this.type==6){
contentText='课程笔记'
}
if(this.type==60){
contentText='课程笔记评论'
}
// 点赞type
if(this.type==10){
contentText='课程评论'
}
if(this.type==20){
contentText='文章评论'
}
if(this.type==30){
contentText='案例评论'
}
apiPraises.save(postData).then(res=>{
this.loading=false;
if(res.status==200){
if(res.result){
this.data.praises++;
}
this.isPraise=true;
this.$refs.interactToast.show({message:'点赞成功',type:'success'});
this.messageSave(this.data.id,this.data.title,this.userInfo.name,this.data.sysCreateBy,this.data.sysCreateAid,'点赞了我的');
this.$emit("praise-success", res.result);
let event = {
key: "Praise",//后台的事件key 发布文章且审核通过
title: "点赞",//事件的标题
parameters:"author:"+this.data.sysCreateAid,//用户自定义参数 name:value,name:value
content: "点赞了"+contentText,//事件的内容
objId: this.data.id,//关联的id
objType: this.type,//关联的类型
objInfo: this.data.title,
aid: this.userInfo.aid, //当前登录人的id
aname: this.userInfo.name,//当前人的姓名
status: 1 ,//状态直接写1
source:2,
}
apiStat.sendEvent(event);
}else{
this.$refs.interactToast.show({message:'点赞失败',type:'error'});
}
})
}
},
addFavorite(){
if(!this.isCrowd){
return
}
if(this.type==0){
console.log('未设置type值,1表课程,2表文章3表案例4表问答')
return;
}
if(this.loading){
return;
}
//需要判断是否已点赞,已点赞的不再加
let postData={
objType:this.type,
objId:this.data.id,
title:'',
}
if(this.type==1){
postData.title=this.data.name;
}else{
postData.title=this.data.title;
}
this.loading=true;
if(this.isFavorite) {// 已经收藏,再次点击取消收藏
apiFavorites.remove(this.type,this.data.id).then(res=>{
this.loading=false;
if(res.status==200){
this.isFavorite=false;
if(res.result){
this.data.favorites--;
}
this.$refs.interactToast.show({message:'已取消收藏',type:'success'});
// this.$emit('addFavorite',res.result);//添加收藏,如果是true代表添加成功false代表已存在
}else{
console.log('取消收藏失败:'+res.message);
}
})
} else {
apiFavorites.save(postData).then(res=>{
this.loading=false;
if(res.status==200 && res.result){
this.isFavorite=true;
this.data.favorites++;
this.$refs.interactToast.show({message:'已加入收藏',type:'success'});
if(this.type==1){
this.messageSave(this.data.id,this.data.name,this.userInfo.name,this.data.sysCreateBy,this.data.sysCreateAid,'收藏了我发布的');
}else{
this.messageSave(this.data.id,this.data.title,this.userInfo.name,this.data.sysCreateBy,this.data.sysCreateAid,'收藏了我发布的');
}
this.$emit('favorite-success',res.result);//添加收藏,如果是true代表添加成功false代表已存在
}else{
this.$refs.interactToast.show({message:'收藏失败',type:'error'});
console.log('加入收藏失败:'+res.message);
}
})
}
},
openInput(){
this.inputShow=true;
},
closeInput(){
this.inputShow=false;
},
addShare(){
if(!this.isCrowd){
return
}
//分享
this.$refs.comShare.openShare();
}
}
};
</script>
<style lang="scss" scoped>
.users-box{
height: 150upx;
padding: 50upx;
display: flex;
.users-list{
width: 100upx;
.uavatar-scale{
text-align: center;
margin-top: 10upx;
}
}
}
.txtbtn{
background-color: #e9e9e9;
border: 1px solid #e0e0e0;
padding: 3px 10px;
border-radius: 6px;
font-size: 0.8em;
}
.interact-fixed{
position: fixed;
z-index: 999;
bottom: 0px;
width: 100%;
border-top: 1px solid rgba(153,153,153,0.12);;
height: 50px;
padding-top: 10px;
background-color: #FFFFFF;
}
.interact-bar{
height: 35px;
// display: flex;
// justify-content: space-around;
padding-left: 40rpx;
.interact-bar-item {
width: 50px;
.interact-bar-icon{
text-align: center;
img{
width: 30upx;
height: 30upx;
}
}
.interact-bar-txt{
font-size: 12px;
color: #343434;
text-align: center;
}
}
}
.field{
width: 200px;
height: 40px;
line-height: 30px;
background: rgb(247,247,249);
border-radius: 34upx;
display: flex;
.field-icon{
margin-top: 2px;
margin-left: 10px;
}
.wenz{
font-size: 12px;
color: #666666;
margin-left: 2px;
margin-top: 6px;
}
}
</style>