Files
learning-system-portal/src/views/portal/qa/Answer.vue
2022-10-21 16:00:17 +08:00

1178 lines
40 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>
<div id="answer-detail">
<div class="qa-banner">
<portal-header current="qa" textColor="#000000" :goSearch="4"></portal-header>
</div>
<div style="padding-top:30px" >
<div class="xcontent2">
<div style="margin-right: 30px;" class="xcontent2-main">
<div v-if="noData">
<div class="qust-detail">
<div class="xpage-detail-crumbs">
<router-link to="/case"><span class="crumbs-first">问答列表</span></router-link>
<span class="crumbs-line">/</span>
<span class="crumbs-last">问答详情</span>
</div>
<div class="qust-hear">
{{ detailData.sysCreateBy }}提问了问题
<time-show :time="detailData.sysCreateTime"></time-show>
</div>
<div class="qust-title">
<span :class="detailData.isResolve ? 'qa-unSolve' : 'qa-solve'">
{{ detailData.isResolve === true ? '【已解决】' : detailData.isResolve === false ? '【待解决】' : '' }}
</span>
{{ detailData.title }}
</div>
<div class="qust-content">
<div class="content-text">
<div style="word-break:break-all;">{{ detailData.content }}</div>
<div v-if="detailData.images" style="margin: 10px 0px;">
<el-image :src="fileUrl + detailData.images" fit="scaleDown" />
</div>
</div>
<div class="content-inter">
<interactBar v-if="detailData.id" :type="4" :shares="false" :comments="false" :data="detailData" :answers="true" :clickAnswer="true" :views="false"> </interactBar>
</div>
</div>
</div>
<div style="margin-top: 20px;" class="box-card" v-if="answerList.length == 0 && !answerShow">
<div>
<div style="height:50px;margin-top: 50px;">
<img style="width:50px" src="../../../assets/images/icon/anser.png" alt="" srcset="">
</div>
<div style="font-size:14px;padding-bottom: 50px;">
暂时还没有回答开始 <el-link type="primary" @click="openAnswer">写第一个回答</el-link>
</div>
</div>
</div>
<div style="background-color: #fff;">
<div class="wrt-answer" v-if="answerList.length > 0 || answerShow" style="margin-top: 30px;padding: 0px 40px;">
<div class="answer-tit">
写回答
</div>
<div class="answer-content">
<input minlength="1" maxlength="800" v-model="content" placeholder="写下你的回答吧~" type="text">
<el-button type="primary" @click="publishAnswer">发布</el-button>
</div>
</div>
<div v-if="answerList.length > 0" style="padding: 0px 40px;">
<div>
<div class="answer" v-for="(item, index) of answerList" :key="item.id" :style="index === answerList.length - 1 ? 'border-bottom:none;' : ''">
<div class="answer-top">
<div>
<author :aid="item.sysCreateAid" :avatar="item.avatar" :name="item.sysCreateBy" :info="item.orgInfo" :sex="item.sex" :sign="item.sign"></author>
</div>
<div>
<span v-if="detailData.isResolve && item.isBest" style="color: #ffb30f">最佳答案</span>
<el-button type="primary"
v-if="!detailData.isResolve && detailData.sysCreateAid == userInfo.aid" class="zuijia"
@click="editAnsweBest(item)">设为最佳答案</el-button>
</div>
</div>
<div class="answer-body">
<div @mouseover="showButtons(item.id)" @mouseout="hideButtons()">
<!--在这一层上加事件-->
<div class="answer-text">
<span style="color: #303133" v-html="displayAll(item)"></span>
<span v-if="item.content.length > 170" @click="changeIsAll(item)">{{ item.isAll ? '收起' : '全文'
}}</span>
</div>
<div class="answer-time">
<div>
</div>
<div style="margin-right: 10px;">
<interactBar :type="5" :data="item" :favorites="false" :comments="false" :shares="false" :views="false"></interactBar>
</div>
</div>
<div class="answer-boot">
<div class="answer-boot-btns">
<div v-show="btnsShowRowId == item.id">
<a @click="showRowInput(item, {})">
<svg-icon icon-class="comment" style="margin-right: 0px;font-size: 16px;"></svg-icon>
<span>回复</span>
</a>
<a v-if="item.sysCreateAid == userInfo.aid" @click="editAnswer(item)"> <i
class="el-icon-edit"
style="margin-right:10px;font-size: 15px;color: #8590A6; ">编辑</i></a>
<a v-if="item.sysCreateAid == userInfo.aid" @click="delAnswer(item)">
<svg-icon icon-class="remove" style="margin-right: 0px;font-size: 16px;"></svg-icon>
<span>删除</span>
</a>
<!-- <a v-if="item.answers && item.answers.length==5" @click="showMoreReply(item)" ><svg-icon icon-class="all" style="margin-right: 0px;font-size: 16px;"></svg-icon><span>全部回复</span></a> -->
</div>
<!-- <i class="el-icon-chat-line-round" @click="showRowInput(item,{})" style="margin-right:10px;"></i>
<i class="el-icon-edit" style="margin-right:10px;" v-if="item.sysCreateAid == userInfo.aid" @click="editAnswer(item)"></i>
<i class="el-icon-delete" v-if="detailData.sysCreateAid == userInfo.aid||item.sysCreateAid == userInfo.aid" @click="delAnswer(item)"></i> -->
</div>
</div>
<!---->
<div v-show="curParentId == item.id" class="answer-reply">
<el-input type="textarea" v-model="replyContent" show-word-limit maxlength="800"
placeholder="回复内容"></el-input>
<el-button type="primary" @click="replyContentMethod(item, {})">发布回复</el-button>
</div>
</div>
<!--一级评论二级数据-->
<div v-if="item.answers && item.answers.length != 0">
<div class="comment" v-for="(con, i) in item.answers" :key="i"
:class="i === item.answers.length - 1 ? 'comment-last' : ''">
<div class="comment-top">
<div class="comment-author">
<author :aid="con.sysCreateAid" :avatar="con.avatar" :name="con.sysCreateBy" :sex="con.sex" :sign="con.sign"></author>
<span class="comment-author-text">回复</span>
<span style="margin-left: 10px; font-size:14px">{{ con.replayName }}</span>
</div>
<div class="comment-time">
<!-- <time-show :time="con.sysCreateTime"></time-show> -->
</div>
</div>
<div class="comment-body">
<div class="comment-info" @mouseover="showButtons(con.id)" @mouseout="hideButtons()">
<div class="comment-content">
<span style="color: #303133" v-html="displayAll(con)"></span>
<span v-if="con.content.length > 170" @click="changeIsAll(con)">
{{ con.isAll ? '收起' : '全文' }}
</span>
</div>
<div class="comment-btns">
<div v-show="btnsShowRowId == con.id">
<a @click="showRowInput(con, item)">
<svg-icon icon-class="comment" style="margin-right: 0px;font-size: 16px;">
</svg-icon><span>回复</span>
</a>
<a v-if="con.sysCreateAid == userInfo.aid" @click="delAnswer(con)">
<svg-icon icon-class="remove" style="margin-right: 0px;font-size: 16px;"></svg-icon>
<span>删除</span>
</a>
</div>
<!-- <i class="el-icon-chat-line-round" @click="showRowInput(con,item)" style="margin-right:10px;"></i>
<i class="el-icon-edit" style="margin-right:10px;" v-if="con.sysCreateAid == userInfo.aid" @click="editAnswer(con)"></i>
<i class="el-icon-delete" v-if="detailData.sysCreateAid == userInfo.aid||con.sysCreateAid == userInfo.aid" @click="delAnswer(con)"></i> -->
</div>
<div class="comment-reply" v-show="curParentId == con.id">
<el-input type="textarea" v-model="replyContent" placeholder="回复内容" show-word-limit
maxlength="100"></el-input>
<el-button type="primary" @click="replyContentMethod(con, item)">发布回复</el-button>
</div>
</div>
<!--三级数据-->
<div v-if="con.answers && con.answers.length > 0">
<div class="comment" v-for="(row, rowIdx) in con.answers" :key="rowIdx"
:class="rowIdx === con.answers.length - 1 ? 'comment-last' : ''">
<div class="comment-top">
<div class="comment-author">
<author :aid="row.sysCreateAid" :avatar="row.avatar" :name="row.sysCreateBy" :sex="row.sex" :sign="row.sign"></author>
<span class="comment-author-text">回复</span>
<span style="margin-left: 10px; font-size:14px">{{ row.replayName }}</span>
</div>
<div class="comment-time">
<time-show :time="row.sysCreateTime"></time-show>
</div>
</div>
<div class="comment-body">
<div class="comment-info" @mouseover="showButtons(row.id)" @mouseout="hideButtons()">
<div class="comment-content">
<span style="color: #303133" v-html="displayAll(row)"></span>
<span v-if="row.content.length > 170" @click="changeIsAll(row)">
{{ row.isAll ? '收起' : '全文' }}
</span>
</div>
<div class="comment-btns">
<div v-show="btnsShowRowId == row.id">
<a @click="showRowInput(row, con)">
<svg-icon icon-class="comment" style="margin-right: 0px;font-size: 16px;">
</svg-icon><span>回复</span>
</a>
<a v-if="row.sysCreateAid == userInfo.aid" @click="delAnswer(row)">
<svg-icon icon-class="remove" style="margin-right: 0px;font-size: 16px;">
</svg-icon><span>删除</span>
</a>
</div>
<!-- <i class="el-icon-thumb" style="margin-right:10px;"></i> -->
<!-- <i class="el-icon-chat-line-round" @click="showRowInput(row,con)" style="margin-right:10px;"></i>
<i class="el-icon-edit" style="margin-right:10px;" v-if="row.sysCreateAid == userInfo.aid" @click="editAnswer(row)"></i>
<i class="el-icon-delete" v-if="detailData.sysCreateAid == userInfo.aid||row.sysCreateAid == userInfo.aid" @click="delAnswer(row)"></i> -->
</div>
</div>
<div class="comment-reply" v-show="curParentId == row.id">
<el-input type="textarea" v-model="replyContent" show-word-limit maxlength="100"
placeholder="回复内容"></el-input>
<el-button type="primary" @click="replyContentMethod(row, con)">发布回复</el-button>
</div>
</div>
</div>
</div>
</div>
<!--二级数据结束-->
</div>
</div>
</div>
</div>
</div>
<div class="pagination-div">
<span class="pag-text" @click="loadMore()" v-if="moreState == 1">加载更多</span>
<span class="pag-text-msg" style="font-size:14px;color: #444444;"
v-else-if="moreState == 3">没有更多数据了</span>
</div>
</div>
</div>
</div>
<div v-else>
<el-empty :image-size="200"></el-empty>
</div>
</div>
<div class="xcontent2-minor">
<div class="qa-ranking">
<div class="portal-model-btn pointer" @click="$refs.addQuestion.askQuestionDialog = true">
<svg-icon style="margin-right: 0;font-size: 24px;" icon-class="question-mark"></svg-icon>
提问题
</div>
<div class="portal-ranking ranking-bg">
<p class="ranking-title">贡献榜</p>
<ul class="ranking-data">
<li v-for="(item, index) in ankingList" :key="index" style="margin-top:30px;line-height: 22px;cursor: pointer;">
<span class="portal-right-text orange-one" v-if="index==0" style="margin-right:94px">
<img :src="`${webBaseUrl}/images/list-01.png`" alt="">
</span>
<span class="portal-right-text orange-tow" v-if="index==1" style="margin-right:94px">
<img :src="`${webBaseUrl}/images/list02.png`" alt="">
</span>
<span class="portal-right-text orange-three" v-if="index==2" style="margin-right:94px">
<img :src="`${webBaseUrl}/images/list03.png`" alt="">
</span>
<span class="portal-right-text" v-if="index==3" style="margin-right:94px">
<img :src="`${webBaseUrl}/images/list04.png`" alt="">
</span>
<span class="portal-right-text" v-if="index==4" style="margin-right:94px">
<img :src="`${webBaseUrl}/images/list05.png`" alt="">
</span>
<span class="portal-title-desc">{{ item.sysCreateUname }}</span>
</li>
</ul>
</div>
<!-- <div class="course-resources"> -->
<!-- 资源位 -->
<!-- <img :src="fileBaseUrl + resonimg.image" alt=""> -->
<!-- </div> -->
</div>
</div>
</div>
<addQuestion ref="addQuestion" @sure="toDetail"></addQuestion>
<editQuestion ref="editQuestion" @enSure="enSure" :editData="editData"></editQuestion>
<el-dialog class="checked-show" :visible.sync="qaFormCheckedShow" width="800px" top="14vh" :show-close="false"
:modal="false">
<agreement></agreement>
<span slot="footer" class="dialog-footer">
<!-- <el-button @click="qaFormCheckedShow = false"> </el-button> -->
<el-button style="margin-right:10px" type="primary" @click="qaFormCheckedShow = false"> </el-button>
</span>
</el-dialog>
</div>
<portal-footer></portal-footer>
<portalFloatTools></portalFloatTools>
</div>
</template>
<script>
import agreement from "@/components/Portal/agreement.vue";
import { mapGetters } from "vuex";
import portalHeader from "@/components/PortalHeader.vue";
import addQuestion from "@/components/Qa/addQuestion.vue";
import portalFooter from "@/components/PortalFooter.vue";
import interactBar from "@/components/Portal/interactBar.vue";
import editQuestion from "@/components/Qa/editQuestion.vue";
import timeShow from "@/components/Portal/datetimeShow.vue";
import author from "@/components/Portal/artauthor.vue";
import portalFloatTools from "@/components/PortalFloatTools.vue";
import apiQa from "@/api/modules/qa.js";
import apiUser from "@/api/system/user.js";
import apiPraise from "@/api/modules/praises.js";
import apiFavorites from "@/api/modules/favorites.js";
import apiMessage from "@/api/system/message.js";
import apiPlace from "@/api/phase2/place.js"
export default {
name: "answer",
components: {
portalHeader,
portalFooter,
interactBar,
addQuestion,
editQuestion,
timeShow,
author,
portalFloatTools,
agreement
},
computed: {
...mapGetters(["userInfo"])
},
data() {
return {
resonimg:{},
fileBaseUrl: process.env.VUE_APP_FILE_BASE_URL,
noData: true,
qaFormCheckedShow: false,
checked: false,
// sex:null,
moreState: 1,
pageIndex: 1,
qid: "",
fileUrl: process.env.VUE_APP_FILE_BASE_URL,
detailData: {}, //单条问答数据详情,不包括答案列表
content: "", //发布回答内容,
// curQa:{id:'',shares:20,collects:30,praises:10,browses:236},
// answer: "",
updateDialog: false, //控制弹窗
answerList: [], //回复列表
editData: {}, //用于保存的单条数据
editDataIndex: "", //单条数据的位置
controlList: [],
answerShow: false, //控制回答输入框是否显示
anking: 2, //排行榜
ankingList: [],
controlListNew: [], //用来控制回复输入框的显示与否
curParent: {},//当前输入的上级的对象用于往answers中追加回复的内容
curParentId: '',//当前回复的内容的id
replyContent: "",//回复的内容
readonly: false,//是否只读,用于预览
btnsShowRowId: '',//显示的button的条目id
replyDiaglog: {
show: false,
pageIndex: 1,
pageSize: 8,
pages: 1,
count: 0,
commentId: '',
list: []
}
};
},
watch: {
content(newVal, oldVal) {
if (!oldVal && newVal === "@") {
this.content += this.detailData.name;
}
}
},
mounted() {
let $this = this;
this.qid = this.$route.query.id;
this.getQuestionDetail();
this.loadAnswer();
this.$watermark.set(this.userInfo.name + this.userInfo.loginName);
window.addEventListener("scroll", this.handleScroll);
this.getAnkingData();
this.couresreso();
},
beforeDestroy() {
window.removeEventListener("scroll", this.handleScroll);
},
methods: {
couresreso(){
let key = 'qa';
apiPlace.detail(key).then(res=>{
console.log(res)
let lmj = JSON.parse(res.result.content)
this.resonimg = lmj[0]
console.log(this.resonimg.image)
})
},
handleScroll() {
let innerw = document.querySelector(".qa-ranking");
let innerHeight = document.querySelector("#answer-detail").clientHeight;
let outerHeight = document.documentElement.clientHeight;
let outerWidth = innerw.clientWidth;
let scrollTop = document.documentElement.scrollTop;
if (outerHeight + scrollTop + 350 >= innerHeight) {
if (this.moreState == 1) {
this.loadMore();
}
}
if (scrollTop > 400) {
document.querySelector(".qa-ranking").style.cssText =
"position: fixed;top: 0;width:"+outerWidth+"px";
} else {
document.querySelector(".qa-ranking").style.cssText =
"position: static";
}
},
toDetail(flag, form) {
if (flag) {
location.href = "answer?id=" + form.id;
}
},
loadMore() {
this.pageIndex += 1;
this.getAnswerList(false);
},
getAnkingData() {
apiQa.queryList(5).then(res => {
if (res.status == 200) {
this.ankingList = res.result;
}
});
},
loadAnswer() {
this.pageIndex = 1;
this.getAnswerList(true);
},
messageSave(type) {
let content;
if (type == "set") {
content = this.userInfo.name + "设置了我的回答为" + "-" + this.detailData.title + "为最佳答案";
}
if (type == "send") {
content = this.userInfo.name + "回答了我的问答" + "-" + this.detailData.title;
}
let message = {
refId: this.detailData.id,
title: "系统消息",
sendName: this.userInfo.name,
acceptName: this.detailData.sysCreateBy,
acceptId: this.detailData.sysCreateAid,
content,
refType: 4,
sendType: 1
};
apiMessage.save(message).then(res => {
if (res.status == 200) {
}
});
},
enSure() {
this.editData = {};
this.loadAnswer();
},
showRowInput(row, parent) { //显示行输框
if (this.curParentId) {
this.curParentId = '';
this.curParent = {};
} else {
this.curParentId = row.id;
this.curParent = parent;
}
},
//获取问题详细信息
getQuestionDetail() {
if (!this.qid) return;
apiQa.detail(this.qid, true).then(res => {
if (res.status == 200) {
res.result.avatar = "";
res.result.name = "";
res.result.orgInfo = "";
res.result.sign= "";
res.result.sex = null;
this.detailData = res.result;
if (JSON.stringify(this.detailData) != "{}") {
this.getQaUserData(this.detailData);
}
let event = {
key: "ReadQuestion",//后台的事件key 发布文章且审核通过
title: "阅读问题",//事件的标题
parameters:"author:"+res.result.sysCreateAid,//用户自定义参数 name:value,name:value
content: '阅读了问题',//事件的内容
objId: this.qid,//关联的id
objType: "4",//关联的类型
objInfo: this.detailData.title,
aid: this.userInfo.aid, //当前登录人的id
aname: this.userInfo.name,//当前人的姓名
status: 1 //状态直接写1
}
this.$store.dispatch("userTrigger", event);
} else {
this.noData = false;
this.$message.error(res.message);
}
});
},
//获取回答列表
getAnswerList(flag) {
// 隐藏loadMore
if (flag) {
this.answerList = [];
}
this.moreState = 2;
if (this.pageIndex == 1) {
// 重置数据
this.answerList = [];
}
let that = this;
apiQa.page({
qid: this.$route.query.id,
pageSize: 10,
pageIndex: this.pageIndex
}).then(res => {
if (res.status == 200) {
if(res.result.length>0){
this.answerShow=true;
}
let allList = [];
let ids = [];
let level3ParentIds = [];
if (res.result.list.length != 0) {
res.result.list.forEach(item => {
item.avatar = "";
item.sex = null;
item.sign = " ";
item.isAll = false;//字数过大时,显示隐藏控制
allList.push(item);
ids.push(item.sysCreateAid);
if (item.answers && item.answers.length != 0) {
item.answers.forEach(answers => {
answers.avatar = "";
answers.sex = null;
answers.sign = " ";
answers.isAll = false;
allList.push(answers);
level3ParentIds.push(answers.id);
ids.push(answers.sysCreateAid);
});
}
});
this.getUserInfoList(allList, ids);
this.answerList.push(...res.result.list);
this.loadLevel3Data(level3ParentIds);
}
if (res.result.totalPages > this.pageIndex) {
that.moreState = 1;
} else {
that.moreState = 3;
}
} else {
that.moreState = 3;
//加载错误
this.$message.error('加载数据失败');
}
});
},
//加载第三级的数据
loadLevel3Data(commentIdArray) {
let $this = this;
if (commentIdArray && commentIdArray.length > 0) {
apiQa.replayClevel3(commentIdArray).then(rs => {
if (rs.status == 200) {
//先处理头像
let aids = [];
rs.result.forEach(item => {
item.avatar = "";
item.sex = null;
item.isAll = false;
aids.push(item.sysCreateAid);
});
$this.getUserInfoList(rs.result, aids);
$this.answerList.forEach(one1 => {
if (one1.answers.length > 0) {
one1.answers.forEach(one2 => {
one2.answers = one2.answers ? one2.answers : [];
rs.result.forEach(rsRow => {
if (rsRow.commentId == one2.id) {
one2.answers.push(rsRow);
}
})
})
}
})
}
})
}
},
//获取人物信息列表
getUserInfoList(list, ids) {
// const ids = idsList.map(item => item.sysCreateAid);
if (ids.length == 0) {
return;
}
const noReapetIds = [...new Set(ids)];
apiUser.getByIds(noReapetIds).then(res => {
if (res.status == 200) {
list.forEach((item, index) => {
res.result.some(author => {
// item.sex=author.sex;
if (author.aid == item.sysCreateAid) {
item.avatar = author.avatar;
item.orgInfo = author.orgInfo;
item.sign = author.sign
item.sex = author.sex;
return true;
} else {
return false;
}
});
});
}
});
},
//获取人物信息
getQaUserData(detailData) {
apiUser
.getByIds([detailData.sysCreateAid])
.then(res => {
if (res.status == 200) {
this.detailData = Object.assign(detailData, res.result[0]);
}
})
.catch(err => {
this.$message({
message: "数据请求失败",
type: "error"
});
});
},
//发布回答
publishAnswer() {
let content = "";
// if(this.content.indexOf('@'+this.detailData.name)!=-1){
// content=this.content.slice(this.detailData.name.length+1)
// }
if (this.content.length < 1 || this.content.trim() == "@" + this.detailData.name) {
return this.$message.warning("请输入回答");
} else {
content = this.content.trim();
}
apiQa.saveAnswer({
qid: this.$route.query.id,
content: content
}).then(res => {
if (res.status == 200) {
this.messageSave("send");
this.$message({ message: "发布回答成功", type: "success" });
this.answerShow = false;
this.getQuestionDetail();
this.loadAnswer();
this.content = "";
let event = {
key: "AnswerQuestion",//后台的事件key
title: "回答问题",//事件的标题
parameters:"",//用户自定义参数 name:value,name:value
content: '回答了问题',//事件的内容
objId: res.result.id,//关联的id
objType: "5",//关联的类型
objInfo: this.detailData.title,
aid: this.userInfo.aid, //当前登录人的id
aname: this.userInfo.name,//当前人的姓名
status: 1 //状态直接写1
}
this.$store.dispatch("userTrigger", event);
} else {
this.$message({ message: res.message, type: "error" });
}
}).catch(err => {
this.$message({ message: "发布失败", type: "error" });
});
},
//编辑回答
editAnswer(data) {
let { sysCreateAid, id: answerid, content } = data;
this.editData = { sysCreateAid, answerid, content };
this.$refs.editQuestion.updateDialog = true;
},
//删除答案
delAnswer(data) {
this.$confirm("此操作将永久删除该答案, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
const { id } = data;
apiQa.delAnswer(id).then(res => {
if (res.status == 200) {
this.loadAnswer();
this.getQuestionDetail();
this.$message({
message: "删除成功",
type: "success"
});
} else {
this.$message({
message: res.message,
type: "error"
});
}
}).catch(err => {
this.$message({
message: "删除失败",
type: "error"
});
});
}).catch(() => { });
},
//设置为最佳答案
editAnsweBest(data) {
const { id } = data;
apiQa.isBest(id).then(res => {
if (res.status == 200) {
this.messageSave("set");
this.loadAnswer();
this.getQuestionDetail();
this.$message({
type: "success",
message: "设置为最佳答案成功"
});
}
}).catch(err => {
this.$message({
type: "warning",
message: "设置为最佳答案失败"
});
});
},
enSure(data) {
this.loadAnswer();
this.$off("ensure");
},
showButtons(id) {
if (!this.readonly) {
this.btnsShowRowId = id;
}
},
hideButtons() {
this.btnsShowRowId = '';
},
//展示全部
displayAll(item) {
let content = '';
content = item.content.replace(/(\n){2,}/,'<br>');
item.content = content;
if (!item.isAll && item.content.length > 170) {
return item.content.slice(0, 170) + "...";
}
return item.content;
},
changeIsAll(item) {
item.isAll = !item.isAll;
},
openAnswer() {
this.answerShow = true;
},
replyContentMethod(data, parent) {
if (!this.replyContent) {
return this.$message.error("回复内容不能为空");
}
//默认是一级评论2级数据
let replyData = {
replayAid: data.sysCreateAid,
replayName: data.sysCreateBy,
content: this.replyContent.trim(),
parentId: data.id,
commentId: "",
clevel: 2
}
//console.log(data,'data');
if (data.clevel == 2) { //当前是一级评论
replyData.commentId = data.id;
replyData.clevel = 3;
} else if (data.clevel > 2) {
replyData.commentId = data.commentId;
replyData.clevel = 3;
}
apiQa.saveComment(replyData).then(res => {
if (res.status == 200) {
res.result.avatar = "";
res.result.sex = null;
res.result.isAll = false;
this.$message.success("回复成功");
this.getUserInfoList([res.result], [res.result.sysCreateAid]);
this.curParentId = '';
this.curParent = {};
this.replyContent = '';
//添加到页面中
if (data.clevel < 3) {
if (data.answers) {
data.answers.push(res.result);
} else {
data.answers = [];
data.answers.push(res.result);
}
} else {
parent.answers.push(res.result);
}
} else {
this.$message.error("回复失败");
}
});
},
showMoreReply(comment) {
this.replyDiaglog.pages = 1;
this.replyDiaglog.count = 0;
this.replyDiaglog.pageIndex = 1;
this.replyDiaglog.list = [];
this.replyDiaglog.show = true;
this.replyDiaglog.commentId = comment.id;
this.loadAllReplyData(false);
},
loadMoreReply() {
this.replyDiaglog.pageIndex++;
this.loadAllReplyData(true);
},
loadAllReplyData(append) {
let params = {
pageIndex: this.replyDiaglog.pageIndex,
pageSize: this.replyDiaglog.pageSize,
commentId: this.replyDiaglog.commentId
}
let $this = this;
},
}
};
</script>
<style scoped lang="scss">
.wrt-answer{
.answer-tit{
font-size: 18px;
font-weight: 600;
color: #333333;
}
.answer-content{
margin-top: 20px;
display: flex;
margin-bottom: 45px;
input{
flex: 1;
height: 81px;
border-radius: 4px;
opacity: 0.5;
border: 1px solid #999999;
margin-right: 35px;
padding-left: 34px;
}
button{
width: 80px;
height: 35px;
margin-top: 42px;
}
}
}
.qust-detail{
width: 100%;
min-height: 200px;
box-sizing: border-box;
padding: 50px;
background: #FFFFFF;
border-radius: 8px;
.qust-content{
font-size: 14px;
font-weight: 400;
color: #666666;
margin-top: 18px;
display: flex;
.content-text{
flex: 1;
margin-right: 70px;
margin-left: 0 !important;
}
.content-inter{
width: 200px;
}
}
.qust-hear{
display: flex;justify-content: space-between;
align-items: center;
font-size: 14px;
color: #666666;
font-weight: 400;
margin-bottom: 20px;
margin-top:20px;
}
.qust-title{
font-size: 16px;
font-weight: 500;
color: #333333;
}
}
.qa-banner{
height: 240px;
background: url('../../../../public/images/qa-banner.png');
}
.course-resources{
margin-top: 26px;
img{
width: 100%;
height: 100%;
border-radius: 8px;
}
}
::v-deep .checked-show {
.el-dialog__header {
padding: 0;
}
}
::v-deep .el-card__body {
padding: 0;
}
::v-deep .bacolor:nth-child(odd) {
background-color: #fff;
padding: 0 5px;
}
::v-deep .bacolor:nth-child(even) {
background-color: #f6f6f6;
padding: 0 5px;
}
.write-btn {
width: 80px;
// height: 50px;
line-height: 36px;
text-align: center;
font-size: 14px;
border-radius: 4px;
border: 1px solid #3e7fff;
color: #3e7fff;
margin-right: 10px;
}
.ranking-title {
line-height: 34px;
font-size: 24px;
font-weight: 500;
color: #000;
.center-titlt {
font-size: 15px;
color: #333333;
}
.center {
text-align: right;
}
img {
margin-top: 5px;
}
}
.answer {
margin-top: 14px;
background-color: #fff;
// border-bottom: 1px solid #dddddd;
// padding: 5px 20px 20px 20px;
.answer-top {
font-size: 16px;
font-weight: 600;
display: flex;
justify-content: space-between;
align-items: center;
img {
margin-right: 10px;
width: 30px;
border: 1px solid #eee;
border-radius: 50%;
vertical-align: middle;
}
.sign{
padding:5px 0px 10px 42px;
color:#666666;
font-weight: 400;
}
.zuijia {
width: 106px;
height: 42px;
color: #3e7fff;
font-size: 14px;
margin-left: auto;
background: rgba(38, 128, 235, 0.2);
//
border: 0;
padding: 0;
line-height: 42px;
text-align: center;
}
}
.answer-body {
padding-left: 40px;
.answer-text {
//margin: 6px 0 15px;
margin:6px 70px 15px 0px;//按ui图让开右边区域位置
line-height: 24px;
height: 48px;
white-space: pre-wrap;
word-break: break-all;
span {
color: #409eff;
cursor: pointer;
margin-left: 5px;
}
}
.answer-time {
font-size: 14px;
color: #8590a6;
//display: flex;
//justify-content: space-between;
//align-items: center;
//按ui图不再占一行只是占右边
float: right;
margin-top: -50px;
}
.answer-boot {
// height: 35px;
line-height: 35px;
display: flex;
justify-content: space-between;
.answer-boot-btns {
a {
margin-right: 15px;
span {
margin-left: 6px;
color: #8590A6;
font-size: 14px;
}
}
}
}
.answer-reply {
display: flex;
margin-bottom: 10px;
.el-button {
margin-left: 10px;
}
}
}
// .bottom {
// text-align: right;
// }
}
.comment {
margin-top: 10px;
background-color: #FFFFFF;
// border-bottom: 1px solid #dddddd;
.comment-top {
display: flex;
justify-content: space-between;
padding-bottom: 10px;
font-weight: 500;
line-height: 30px;
font-size: 1.1em;
.comment-author {
display: flex;
align-items: center;
height: 30px;
line-height: 30px;
.comment-author-text {
margin-left: 10px;
color: #8590A6;
font-size: 14px;
}
}
.comment-time {
color: #666666;
font-size: 12px;
}
}
.comment-body {
padding-left: 40px;
.comment-content {
padding-bottom: 0px;
white-space: pre-wrap;
word-break: break-all;
span {
cursor: pointer;
color: #409EFF
}
}
.comment-btns {
// padding: 5px 10px 10px 0px;
// height: 35px;
line-height: 35px;
a {
margin-right: 15px;
span {
margin-left: 6px;
color: #8590A6;
font-size: 14px;
}
}
}
.comment-reply {
display: flex;
margin-bottom: 10px;
.el-button {
margin-left: 10px;
}
}
}
.comment-replys {
padding-left: 40px;
}
}
.comment-last {
border-bottom: none;
}
.answer-reply-box {
margin-top: 30px;
background-color: #fff;
padding: 30px 40px;
}
// ::v-deep .publishAnswer {
// padding: 24px 20px;
// .el-card__body {
// // display: flex;
// // justify-content: space-between;
// align-items: center;
// .el-input__inner {
// height: 48px;
// }
// .el-button {
// margin-left: 20px;
// // height: 48px;
// // width: 78px;
// color: #e8f3fa;
// font-size: 16px;
// }
// }
// }
.box-card {
text-align: center;
font-size: 18px;
color: #6666;
// line-height: 84px;
margin-bottom: -24px;
height: 190px;
line-height: 40px;
.el-link {
line-height: 1;
}
}
</style>