Files
learning-system-mobile/components/interact-fixed/interact-fixed.vue
zhaofang 00cf84c906 提交
2022-11-14 19:47:22 +08:00

657 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="" 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>
<u-popup :show="shareInfo.show" @close="closeShare" @open="addShare" mode="right">
<view style="padding: 10px 20px;line-height: 60upx;">
<view style="padding: 10upx;">请输入要分享给人的姓名</view>
<view style="padding: 10upx;">
<u--input placeholder="请输入人员姓名" border="surround" v-model="shareInfo.name"></u--input>
</view>
<view style="padding-top:20upx;">
<u-button @click="findUsers()" type="primary" text="查询"></u-button>
</view>
<view style="padding-top: 50upx;">
<!--查询内容列表-->
<view style="line-height: 60upx;" v-for="(su,suidx) in shareInfo.users" :key="suidx" @click="confirmShare(su)">{{suidx+1}}, {{su.name}} {{su.code}}</view>
</view>
</view>
</u-popup>
</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 { 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'
},
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 //默认是课程
},
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() {
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='问答'
}
content=sendName+typeText+content+'-'+title
let message={
content,
refId,
refType:this.type,
sendName,
acceptName,
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);
}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);
}else{
this.$refs.interactToast.show({message:'取消失败',type:'error'});
}
})
} else {
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);
}else{
this.$refs.interactToast.show({message:'点赞失败',type:'error'});
}
})
}
},
addFavorite(){
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(){
//分享
this.shareInfo.show=true;
},
findUsers(){
this.shareInfo.users=[];
//模拟数据
//模拟数据
if(!this.shareInfo.name){
uni.showToast({
title: '请输入查询条件',
icon: 'none'
});
// return this.$refs.interactToast.show({message:'请输入工号或姓名',type:'warning'});
}
var name=this.shareInfo.name;
var regPos = /^\d+(\.\d+)?$/; //非负浮点数
if(regPos.test(name)){
apiUser.getByLoginName(name).then(rs=>{
if(rs.status==200){
//因为根据工号查询只会是一个人所有会有null情况而json会返回空字符串
if(rs.result!=''){
this.shareInfo.users=[rs.result];
}else{
uni.showToast({
title: '查无此用户',
icon: 'none'
});
// this.$refs.interactToast.show({message:"查无此用户",type:'warning'});
}
}else{
uni.showToast({
title: rs.message,
icon: 'none'
});
// this.$refs.interactToast.show({message:rs.message,type:'warning'});
}
})
}else{
apiUser.findByName(name).then(rs=>{
if(rs.status==200){
if(rs.result.length==0){
return uni.showToast({
title: rs.message,
icon: 'none'
});
// return this.$refs.interactToast.show({message:rs.message,type:'error'});
}
this.shareInfo.users=rs.result;
}else{
uni.showToast({
title: rs.message,
icon: 'none'
});
// this.$refs.interactToast.show({message:rs.message,type:'error'});
}
})
}
// apiUser.findByName(name).then(rs=>{
// if(rs.status==200){
// this.shareInfo.users=rs.result;
// }else{
// this.$refs.interactToast.show({message:'查询用户失败',type:'error'});
// console.log(rs.message);
// console.log(rs.error)
// }
// })
},
closeShare(){
this.shareInfo.show=false;
},
confirmShare(u){
let conType;
if(this.type == 1) {
conType = this.data.type;
}
let postData={
objType:this.type,
objId:this.data.id,
content:'',
isRead:false,
toAid:u.aid,
toAname:u.name,
conType:conType,
}
if(this.userInfo.aid==postData.toAid){
uni.showToast({
title: '不能分享给自己',
icon: 'none'
});
// return this.$message.warning("不能分享给自己")
}
apiShares.save(postData).then(rs=>{
if(rs.status==200){
if(rs.result){
this.shareInfo.show=false;
this.$refs.interactToast.show({message:'分享成功',type:'success'});
this.$emit("share-success", rs.result);
if(this.type!=3){
if(this.type==1){
this.messageSave(this.data.id,this.data.name,this.userInfo.name,u.name,u.aid,'分享给我的');
}else{
this.messageSave(this.data.id,this.data.title,this.userInfo.name,u.name,u.aid,'分享给我的');
}
}
}else{
uni.showToast({
title: '分享失败,您不能将同一资源多次分享给同一个人',
icon: 'none'
});
// this.$refs.interactToast.show({message:'分享失败,您不能将同一资源多次分享给同一个人',type:'warning'});
}
}else{
// this.$message({message:'分享失败',type:'success'});
this.$refs.interactToast.show({message:'分享处理失败',type:'error'});
console.log(rs.message);
}
});
},
}
};
</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: 10upx;
display: flex;
.field-icon{
margin-top: 2px;
margin-left: 10px;
}
.wenz{
font-size: 12px;
color: #666666;
margin-left: 2px;
margin-top: 6px;
}
}
</style>