Merge branch 'master' of codeup.aliyun.com:6265f483e4166464dc2f9c14/boeu/portal into online

This commit is contained in:
dongruihua
2022-07-15 22:25:04 +08:00
28 changed files with 872 additions and 633 deletions

Binary file not shown.

View File

@@ -97,7 +97,6 @@ const delReply=function(data){
return ajax.post('/xboe/m/comment/delete-reply',data); return ajax.post('/xboe/m/comment/delete-reply',data);
} }
export default{ export default{
del, del,
update, update,
@@ -107,5 +106,5 @@ export default{
reply, reply,
replyList, replyList,
userReplyList, userReplyList,
delReply delReply,
} }

View File

@@ -139,16 +139,15 @@ export default {
} }
this.loading=true; this.loading=true;
this.addForm.status = 2; this.addForm.status = 2;
let content= this.addForm.content.replace(/<.*?>/ig,""); // let content= this.addForm.content.replace(/<.*?>/ig,"");
console.log(content) // let content= this.addForm.content.replace(/[^\u4E00-\u9FA5|\d|\a-zA-Z|\r\n\s,.?!,。?!<>…—&$=()-+/*{}[\]]|\r\n\s/g,"");
if(content.trim() == ''){ if(this.addForm.content.trim() == ''){
this.$message('您输入的内容为空,无法发布') this.$message('您输入的内容为空,无法发布')
type: 'warning' type: 'warning'
this.loading=false this.loading=false
return return
} }
this.addForm.content=content.trim() this.addForm.content=this.addForm.content.trim()
console.log(this.addForm.content,'iguighui')
apiArticle.save(this.addForm).then(res => { apiArticle.save(this.addForm).then(res => {
if (res.status == 200) { if (res.status == 200) {
if(res.message=='服务处理成功'){ if(res.message=='服务处理成功'){

View File

@@ -15,7 +15,7 @@
<router-link :to="'/case/detail?id='+item.cases.id" > {{item.cases.summary}}</router-link> <router-link :to="'/case/detail?id='+item.cases.id" > {{item.cases.summary}}</router-link>
</div> </div>
<div class="article-info-tools"> <div class="article-info-tools">
<authorInfo :avatar="item.avatar" :name="item.name" :info="item.orgInfo"></authorInfo> <authorInfo :avatar="item.avatar" :name="item.name" :info="item.orgInfo" :sex="item.sex"></authorInfo>
<span style="margin-top:2px">发布时间{{ item.cases.sysCreateTime || item.publishTime | timeFilter }}</span> <span style="margin-top:2px">发布时间{{ item.cases.sysCreateTime || item.publishTime | timeFilter }}</span>
<span style="margin-top:2px">收藏时间{{ item.time || item.favoritesTime | timeFilter }}</span> <span style="margin-top:2px">收藏时间{{ item.time || item.favoritesTime | timeFilter }}</span>
<!-- <interactBar :type="0" :data="item.cases" :shares="false" :views="false"></interactBar> --> <!-- <interactBar :type="0" :data="item.cases" :shares="false" :views="false"></interactBar> -->

View File

@@ -547,7 +547,7 @@
apiCourse.updateContentName({id:this.content.id,name:value}).then(rs=>{ apiCourse.updateContentName({id:this.content.id,name:value}).then(rs=>{
if(rs.status!=200){ if(rs.status!=200){
console.log('更新名称失败:'+rs.message); console.log('更新名称失败:'+rs.message);
}saveData }
}) })
}, },
// 作业上传 // 作业上传

View File

@@ -0,0 +1,113 @@
<template>
<div class="choice">
<el-tag type="info"
closable
v-for="(item,index) in teacherValueList"
:key="item.teacherId"
@close="handleClose(item,index)">{{item.teacherName}}</el-tag>
<el-select
style="width: 100%;"
v-model="teacherValues"
filterable
remote
clearable
value-key="teacherId"
ref="elSelect"
reserve-keyword
placeholder="请输入授课教师姓名"
@change="changeTeachers"
:remote-method="remoteFindTeacher"
:loading="loading">
<el-option v-for="item in teacherDownList" :key="item.teacherId" :label="item.teacherName + item.teacherCode" :value="item"></el-option>
</el-select>
</div>
</template>
<script>
import { mapGetters } from 'vuex';
import apiTeacher from '../../api/modules/teacher.js';
export default{
name: 'choice',
computed: {
...mapGetters(['userInfo'])
},
props: {
teacherValue:{
type:Array,
},
},
data(){
return {
teacherValueList:[],
teacherValues:{},
loading:false,
teacherDownList:[],
}
},
watch:{
teacherValue(val) {
this.teacherValueList = val;
}
},
mounted(){
},
methods:{
handleClose(item,index){
this.teacherValueList.splice(index, 1);
this.$emit('getTeacherList',this.teacherValueList);
},
changeTeachers(t) {
if(t) {
let isCan = this.teacherValueList.some(it=>it.teacherId == t.teacherId);
if(isCan){
this.teacherValues = {};
this.teacherDownList = [];
this.$message.warning('教师重复,请重新选择!')
return;
}
this.teacherValueList.push(t);
this.teacherDownList = [];
this.teacherValues = {};
this.$emit('getTeacherList',this.teacherValueList);
}
},
// 教师列标,远程查询
async remoteFindTeacher(query) {
if (query) {
this.loading = true;
try {
const { result, message, status } = await apiTeacher.findByName(query);
this.loading = false;
if (status === 200) {
let list = [];
result.forEach(item => {
list.push({
teacherId: item.id,
teacherName: item.name,
teacherCode: item.code
});
});
this.teacherDownList = list;
} else {
this.$message.error('查询教师信息失败:' + message);
}
} catch (err) {
this.loading = false;
}
} else {
this.teacherDownList = [];
}
},
}
}
</script>
<style lang="scss">
.choice{
.el-tag--info{
height: 22px;
line-height: 22px;
}
}
</style>

View File

@@ -90,20 +90,22 @@
</el-form-item> </el-form-item>
<el-form-item label="授课教师" required> <el-form-item label="授课教师" required>
<!--授课老师默认是当前操作人--> <!--授课老师默认是当前操作人-->
<el-select <!-- <el-select
style="width: 100%;" style="width: 100%;"
v-model="teacherValues" v-model="teacherValues"
multiple multiple
filterable filterable
remote remote
value-key="teacherId" value-key="teacherId"
ref="elSelect"
reserve-keyword reserve-keyword
placeholder="请输入授课教师姓名" placeholder="请输入授课教师姓名"
@change="changeTeachers" @change="changeTeachers"
:remote-method="remoteFindTeacher" :remote-method="remoteFindTeacher"
:loading="loading"> :loading="loading">
<el-option v-for="item in teacherDownList" :key="item.teacherId" :label="item.teacherName + item.teacherCode" :value="item"></el-option> <el-option v-for="item in teacherDownList" :key="item.teacherId" :label="item.teacherName + item.teacherCode" :value="item"></el-option>
</el-select> </el-select> -->
<choice :teacherValue="teacherValues" @getTeacherList="getTeacherList"></choice>
</el-form-item> </el-form-item>
<el-form-item label="目标人群" required> <el-form-item label="目标人群" required>
<el-input maxlength="50" v-model="courseInfo.forUsers" show-word-limit placeholder="目标人群(限50字以内)"></el-input> <el-input maxlength="50" v-model="courseInfo.forUsers" show-word-limit placeholder="目标人群(限50字以内)"></el-input>
@@ -233,20 +235,22 @@
</el-form-item> </el-form-item>
<el-form-item label="授课教师" required> <el-form-item label="授课教师" required>
<!--授课老师默认是当前操作人--> <!--授课老师默认是当前操作人-->
<el-select <!-- <el-select
style="width: 100%;" style="width: 100%;"
v-model="teacherValues" v-model="teacherValues"
multiple multiple
filterable filterable
remote remote
value-key="teacherId" value-key="teacherId"
ref="elSelect"
reserve-keyword reserve-keyword
placeholder="请输入授课教师姓名" placeholder="请输入授课教师姓名"
@change="changeTeachers" @change="changeTeachers"
:remote-method="remoteFindTeacher" :remote-method="remoteFindTeacher"
:loading="loading"> :loading="loading">
<el-option v-for="item in teacherDownList" :key="item.teacherId" :label="item.teacherName + item.teacherCode" :value="item"></el-option> <el-option v-for="item in teacherDownList" :key="item.teacherId" :label="item.teacherName + item.teacherCode" :value="item"></el-option>
</el-select> </el-select> -->
<choice :teacherValue="teacherValues" @getTeacherList="getTeacherList"></choice>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-form-item> </el-form-item>
@@ -377,7 +381,8 @@
</div> </div>
</template> </template>
<script> <script>
import agreement from '@/components/Portal/agreement.vue' import choice from '@/components/Course/choice.vue';
import agreement from '@/components/Portal/agreement.vue';
import weikeContent from '@/components/Course/weikeContent.vue'; import weikeContent from '@/components/Course/weikeContent.vue';
import catalogCourseware from '@/components/Course/catalogCourseware.vue'; import catalogCourseware from '@/components/Course/catalogCourseware.vue';
import imageUpload from '@/components/ImageUpload/index.vue'; import imageUpload from '@/components/ImageUpload/index.vue';
@@ -394,7 +399,7 @@ import { mapGetters, mapActions } from 'vuex';
import filecloud from '@/components/FileCloud/index.vue'; import filecloud from '@/components/FileCloud/index.vue';
export default { export default {
props: {}, props: {},
components: { weikeContent, catalogCourseware, imageUpload, WxEditor, catalogSort,agreement,filecloud}, components: { weikeContent, catalogCourseware, imageUpload, WxEditor, catalogSort,agreement,filecloud,choice},
data() { data() {
return { return {
checked:false, checked:false,
@@ -528,6 +533,9 @@ export default {
this.loadUserGroup(); this.loadUserGroup();
}, },
methods: { methods: {
getTeacherList(res) {
this.teacherValues = res;
},
chooseFile(){ chooseFile(){
this.dlgFileChoose.show=true; this.dlgFileChoose.show=true;
}, },
@@ -538,7 +546,6 @@ export default {
if(!img.path){ if(!img.path){
return; return;
} }
//console.log(img);
this.dlgFileChoose.show=false; this.dlgFileChoose.show=false;
this.courseInfo.coverImg = img.path; this.courseInfo.coverImg = img.path;
this.courseCoverurl = this.fileUrl+img.path; this.courseCoverurl = this.fileUrl+img.path;
@@ -800,8 +807,8 @@ export default {
}, },
changeTeachers(t) { changeTeachers(t) {
//用于监听教师列表的选择变化 //用于监听教师列表的选择变化
//console.log(t);
this.requireSaveCourse = true; this.requireSaveCourse = true;
this.$refs.elSelect.query = '';
}, },
formartTeacher() {}, formartTeacher() {},
addNewSection() { addNewSection() {
@@ -1205,7 +1212,8 @@ export default {
if (index == -1) { if (index == -1) {
this.contentInfo.list.push(cc); this.contentInfo.list.push(cc);
} else { } else {
this.contentInfo.list[index] = cc; // this.contentInfo.list[index] = cc;
this.contentInfo.list.splice(index,1,cc);
} }
//计算顺序值 //计算顺序值
}, },

View File

@@ -164,6 +164,7 @@ export default {
change(e) { change(e) {
let file = e.target.files[0] let file = e.target.files[0]
const formData = new FormData() const formData = new FormData()
console.log(file,'file');
formData.append('file', file) formData.append('file', file)
upload(formData) upload(formData)
.then(res => { .then(res => {
@@ -185,6 +186,12 @@ export default {
</script> </script>
<style> <style>
.editor{
min-height: 250px !important;
}
.ql-editor{
min-height: 250px !important;
}
.ql-container{ .ql-container{
font-size: 15px; font-size: 15px;
} }

View File

@@ -15,14 +15,11 @@
<div v-if="!onlyAvatar" style="padding-left: 5px;padding-top: 6px;font-size: 14px;color: #666666;"> <div v-if="!onlyAvatar" style="padding-left: 5px;padding-top: 6px;font-size: 14px;color: #666666;">
<span>{{userName}}</span> <span>{{userName}}</span>
<span class="author-text" v-if="userInfo && userInfo!=''">({{userInfo}})</span> <span class="author-text" v-if="userInfo && userInfo!=''">({{userInfo}})</span>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import { import { userAvatarText } from "@/utils/tools.js";
userAvatarText
} from "@/utils/tools.js";
export default { export default {
props:{ props:{
avatar:{ avatar:{

View File

@@ -36,8 +36,7 @@
class="reference-tag" class="reference-tag"
v-for="item in toUsers" v-for="item in toUsers"
:key="item.aid" :key="item.aid"
:label="item.aid">{{ item.name }}</el-radio-button :label="item.aid">{{ item.name }}</el-radio-button>
>
</el-radio-group> </el-radio-group>
</div> </div>
@@ -68,7 +67,7 @@
type="textarea" type="textarea"
class="hideControl" class="hideControl"
show-word-limit show-word-limit
v-model.trim="inputValue" v-model="inputValue"
maxlength="800" maxlength="800"
placeholder="写下您的评论(800字以内),可以@案主哦~" placeholder="写下您的评论(800字以内),可以@案主哦~"
></el-input> ></el-input>
@@ -97,7 +96,7 @@
<div class="comment-body" > <div class="comment-body" >
<div class="comment-info" @mouseover="showButtons(com.id)" @mouseout="hideButtons()"> <div class="comment-info" @mouseover="showButtons(com.id)" @mouseout="hideButtons()">
<div class="comment-content" @click="cancelReply()"> <div class="comment-content" @click="cancelReply()">
{{displayAll(com)}} <span style="color: #303133" v-html="displayAll(com)"></span>
<span v-if="com.content.length>170" @click="changeIsAll(com)"> <span v-if="com.content.length>170" @click="changeIsAll(com)">
{{com.isAll?'收起':'全文'}} {{com.isAll?'收起':'全文'}}
</span> </span>
@@ -138,7 +137,7 @@
<div class="comment-body" @mouseover="showButtons(reply.id)" @mouseout="hideButtons()"> <div class="comment-body" @mouseover="showButtons(reply.id)" @mouseout="hideButtons()">
<div class="comment-info" > <div class="comment-info" >
<div class="comment-content" @click="cancelReply()"> <div class="comment-content" @click="cancelReply()">
{{displayAll(reply)}} <span style="color: #303133" v-html="displayAll(reply)"></span>
<span v-if="reply.content.length>170" @click="changeIsAll(reply)"> <span v-if="reply.content.length>170" @click="changeIsAll(reply)">
{{reply.isAll?'收起':'全文'}} {{reply.isAll?'收起':'全文'}}
</span> </span>
@@ -488,7 +487,7 @@
objType:this.objType, objType:this.objType,
objId:this.objId, objId:this.objId,
parentId:'-1', parentId:'-1',
content:this.inputValue, content:this.inputValue.trim(),
clevel:1, clevel:1,
toAid:'', toAid:'',
toAname:'', toAname:'',
@@ -533,7 +532,9 @@
}, },
//展示全部 //展示全部
displayAll(item) { displayAll(item) {
//console.log(item,'item'); let content = '';
content = item.content.replace(/(\n){2,}/,'<br>');
item.content = content;
if(!item.isAll && item.content && item.content.length > 170) { if(!item.isAll && item.content && item.content.length > 170) {
return item.content.slice(0, 170) + "..."; return item.content.slice(0, 170) + "...";
} }
@@ -554,6 +555,7 @@
this.replyInfo.parentId=''; this.replyInfo.parentId='';
}, },
submitReply(comment){ submitReply(comment){
this.replyInfo.content = this.replyInfo.content.trim();
if(this.replyInfo.content==''){ if(this.replyInfo.content==''){
return; return;
} }
@@ -660,6 +662,7 @@
this.replyShow=true; this.replyShow=true;
}, },
submitDlgReply(){ submitDlgReply(){
this.replyInfo.content = this.replyInfo.content.trim();
if(this.replyInfo.content==''){ if(this.replyInfo.content==''){
return; return;
} }

View File

@@ -7,7 +7,7 @@
<div style="display: flex;justify-content: space-around;margin-left: 20px;"> <div style="display: flex;justify-content: space-around;margin-left: 20px;">
<div class="top-nav" :class="current == 'index' ? 'current-nav' : ''"><router-link to="/index">首页</router-link></div> <div class="top-nav" :class="current == 'index' ? 'current-nav' : ''"><router-link to="/index">首页</router-link></div>
<div class="top-nav" :class="current == 'course' ? 'current-nav' : ''"><router-link to="/course">课程</router-link></div> <div class="top-nav" :class="current == 'course' ? 'current-nav' : ''"><router-link to="/course">课程</router-link></div>
<div class="top-nav" v-if="caseShow" :class="current == 'case' ? 'current-nav' : ''"><router-link to="/case">案例</router-link></div> <div class="top-nav" :class="current == 'case' ? 'current-nav' : ''"><router-link to="/case">案例</router-link></div>
<div class="top-nav" :class="current == 'article' ? 'current-nav' : ''"><router-link to="/article">文章</router-link></div> <div class="top-nav" :class="current == 'article' ? 'current-nav' : ''"><router-link to="/article">文章</router-link></div>
<div class="top-nav" :class="current == 'qa' ? 'current-nav' : ''"><router-link to="/qa">问答</router-link></div> <div class="top-nav" :class="current == 'qa' ? 'current-nav' : ''"><router-link to="/qa">问答</router-link></div>
<div class="top-nav"> <div class="top-nav">
@@ -29,7 +29,7 @@
<el-input v-show="!hideSearch" placeholder="请输入标题搜索" style="width: 260px;" @keyup.enter.native="searchJump()" clearable maxlength="20" v-model="keyword" class="input-with-select"> <el-input v-show="!hideSearch" placeholder="请输入标题搜索" style="width: 260px;" @keyup.enter.native="searchJump()" clearable maxlength="20" v-model="keyword" class="input-with-select">
<el-select v-if="current == 'index'" v-model="findType" style="width: 75px;" slot="prepend" placeholder="请选择"> <el-select v-if="current == 'index'" v-model="findType" style="width: 75px;" slot="prepend" placeholder="请选择">
<el-option label="课程" value="1"></el-option> <el-option label="课程" value="1"></el-option>
<el-option v-if="caseShow" label="案例" value="2"></el-option> <el-option label="案例" value="2"></el-option>
<el-option label="文章" value="3"></el-option> <el-option label="文章" value="3"></el-option>
<el-option label="问答" value="4"></el-option> <el-option label="问答" value="4"></el-option>
<!-- <el-option label="专区" value="5"></el-option> --> <!-- <el-option label="专区" value="5"></el-option> -->
@@ -86,7 +86,7 @@ export default {
}, },
computed: { computed: {
...mapGetters(['userInfo', 'userMsg','caseShow']), ...mapGetters(['userInfo', 'userMsg']),
avatarText(){ avatarText(){
return userAvatarText(this.userInfo.name); return userAvatarText(this.userInfo.name);

View File

@@ -4,7 +4,7 @@
<el-form-item label="回答内容"> <el-form-item label="回答内容">
<el-input <el-input
type="textarea" type="textarea"
v-model.trim="editData.content" v-model="editData.content"
placeholder="请输入详细描述" placeholder="请输入详细描述"
rows="8" rows="8"
minlength="1" minlength="1"
@@ -45,6 +45,7 @@
type: 'warning' type: 'warning'
}); });
} }
this.editData.content = this.editData.content.trim();
// if(this.editData.content.length<0||this.editData.content.length>255){ // if(this.editData.content.length<0||this.editData.content.length>255){
// return this.$message({ // return this.$message({
// message: '回复内容为0-800个字', // message: '回复内容为0-800个字',

View File

@@ -14,7 +14,7 @@
:default-active="activeMenu" :default-active="activeMenu"
router router
active-text-color="#00aaff" active-text-color="#00aaff"
:default-openeds="['manageTodo','manageFinish','teacherTodo','teacherFinish','myqa', 'mystudy', 'course', 'exam', 'u001', 'u002', 'u003', 'u004']" :default-openeds="['manageTodo','manageFinish','teacherTodo','teacherFinish','myqa', 'mystudy', 'course', 'exam', 'u001', 'u002', 'u003', 'u004','u009','u008']"
class="el-menu-vertical" class="el-menu-vertical"
@open="handleOpen" @open="handleOpen"
@close="handleClose" @close="handleClose"
@@ -93,7 +93,7 @@
<svg-icon icon-class="interlocution"></svg-icon> <svg-icon icon-class="interlocution"></svg-icon>
<span slot="title">问答管理</span> <span slot="title">问答管理</span>
</el-menu-item> </el-menu-item>
<el-menu-item v-show="curIdentity == 3"> <el-menu-item v-show="curIdentity == 3" index="u008">
<template slot="title"> <template slot="title">
<!-- <i class="el-icon-s-grid"></i> --> <!-- <i class="el-icon-s-grid"></i> -->
<svg-icon icon-class="administrator" style="font-size:17px"></svg-icon> <svg-icon icon-class="administrator" style="font-size:17px"></svg-icon>
@@ -102,7 +102,7 @@
</template> </template>
<!-- <i class="el-icon-menu"></i> --> <!-- <i class="el-icon-menu"></i> -->
</el-menu-item> </el-menu-item>
<el-menu-item v-show="curIdentity == 3"> <el-menu-item v-show="curIdentity == 3" index="u009">
<template slot="title"> <template slot="title">
<svg-icon icon-class="management" style="font-size:16px"></svg-icon> <svg-icon icon-class="management" style="font-size:16px"></svg-icon>
<span><a href="https://u.boe.com/train/manager/index.html" target="_blank">业务支援读书会管理</a></span> <span><a href="https://u.boe.com/train/manager/index.html" target="_blank">业务支援读书会管理</a></span>
@@ -344,8 +344,7 @@ export default {
activeMenu() { activeMenu() {
const route = this.$route; const route = this.$route;
const { meta, path } = route; const { meta, path } = route;
console.log(meta) if(meta.title == '添加受众' || meta.title == '查看受众'){
if(meta.title == '添加受众'){
meta.activeMenu = '/manage/ugroups' meta.activeMenu = '/manage/ugroups'
} }
if (meta.activeMenu) { if (meta.activeMenu) {

View File

@@ -9,7 +9,7 @@
<div class="xtop-nav"> <div class="xtop-nav">
<div><a :href="`${webBaseUrl}/index`">首页</a></div> <div><a :href="`${webBaseUrl}/index`">首页</a></div>
<div><a :href="`${webBaseUrl}/course`">课程</a></div> <div><a :href="`${webBaseUrl}/course`">课程</a></div>
<div v-if="caseShow"><a :href="`${webBaseUrl}/case`">案例</a></div> <div><a :href="`${webBaseUrl}/case`">案例</a></div>
<div><a :href="`${webBaseUrl}/article`">文章</a></div> <div><a :href="`${webBaseUrl}/article`">文章</a></div>
<div><a :href="`${webBaseUrl}/qa`">问答</a></div> <div><a :href="`${webBaseUrl}/qa`">问答</a></div>
<div> <div>
@@ -113,7 +113,7 @@ export default {
}; };
}, },
computed: { computed: {
...mapGetters(['userInfo', 'userMsg','caseShow']), ...mapGetters(['userInfo', 'userMsg']),
showName: function() { showName: function() {
//console.log('name='+this.name); //console.log('name='+this.name);
//console.log('loginName='+this.loginName); //console.log('loginName='+this.loginName);

View File

@@ -7,7 +7,6 @@ const getters = {
cachedViews: state => state.tagsView.cachedViews, cachedViews: state => state.tagsView.cachedViews,
avatar: state => state.user.info.avatar, avatar: state => state.user.info.avatar,
userInfo: state => state.user.info, userInfo: state => state.user.info,
caseShow: state => state.user.caseShow,
newslist: state => state.user.newslist, newslist: state => state.user.newslist,
orgId: state => state.user.orgId, orgId: state => state.user.orgId,
permissions: state => state.user.permissions, permissions: state => state.user.permissions,

View File

@@ -5,7 +5,6 @@ import apiMessage from '@/api/system/message.js'
import apiCourse from "@/api/modules/course.js"; import apiCourse from "@/api/modules/course.js";
import apiBoeCourse from "@/api/boe/course.js"; import apiBoeCourse from "@/api/boe/course.js";
import apiBoeLogout from "@/api/boe/login.js"; import apiBoeLogout from "@/api/boe/login.js";
import caseUser from "@/utils/caseShow.js"
const user = { const user = {
state: { state: {
@@ -16,7 +15,6 @@ const user = {
studyTaskCount:0,//学习任务数 studyTaskCount:0,//学习任务数
curIdentity: sessionStorage.getItem("curIdentity") == null ? 1 : sessionStorage.getItem("curIdentity"), // 用户当前选择的身份 1学员 2教师 3管理员 curIdentity: sessionStorage.getItem("curIdentity") == null ? 1 : sessionStorage.getItem("curIdentity"), // 用户当前选择的身份 1学员 2教师 3管理员
permissions: [], permissions: [],
caseShow:false,
}, },
mutations: { mutations: {
SET_Identity: (state, iden) => { SET_Identity: (state, iden) => {
@@ -41,9 +39,6 @@ const user = {
SET_PERMISSIONS: (state, permissions) => { SET_PERMISSIONS: (state, permissions) => {
state.permissions = permissions state.permissions = permissions
}, },
SET_caseShow:(state, iden) => {
state.caseShow = iden
},
}, },
actions: { actions: {
refrashMsg({ commit }) { refrashMsg({ commit }) {
@@ -133,19 +128,6 @@ const user = {
dfn = res.result.departFullName; dfn = res.result.departFullName;
} }
} }
let nowTime = new Date() //当前时间
let endTime = new Date('2022/07/01 09:30:00') //对比时间
if(nowTime.getTime() < endTime.getTime()){
if (res.result.userNo != '') {
for(let key in caseUser){
if(res.result.userNo == key) {
commit('SET_caseShow',true);
}
}
}
}else{
commit('SET_caseShow',true);
}
const user = { const user = {
aid: res.result.aid, aid: res.result.aid,
sysId:res.result.sysId, sysId:res.result.sysId,

View File

@@ -1,29 +0,0 @@
/**页面设置的一些常量*/
const caseUser={
'12345601': '测试',
'00004409': '李玉冰',
'101215': '徐涛',
'00005011': '邱炜玮',
'107863': '苗怡',
'00004928': '夏辉',
'110858': '毛继禹',
'10726944': '王芮',
'boeutest': '测试小助手',
'boeuadmin': '运营小助手',
'10181457': '董瑞华',
'10149996':'李曼钰',
'30114900':'虞节星',
'00004006':'吴丽娜',
'10611675':'辛月',
'00002197':'李晓雪',
'104612':'李仙',
'10532630':'谭骁育',
'102321':'沈水',
'10290110':'王梦迪',
'104719':'黄华',
'132501':'吴广霞',
'10364371':'刘俊'
}
export default caseUser;

View File

@@ -107,7 +107,7 @@
</div> </div>
</div> </div>
<!-- 推荐案例2版 --> <!-- 推荐案例2版 -->
<div class="modules" v-if="caseShow"> <div class="modules">
<div class="modules-title"> <div class="modules-title">
<span class="modules-text">推荐案例</span> <span class="modules-text">推荐案例</span>
@@ -139,7 +139,7 @@
<div class="case-inter"> <div class="case-inter">
<interactBar :type="3" :readonly="true" :data="ca" :shares="false" :views="false"></interactBar> <interactBar :type="3" :readonly="true" :data="ca" :shares="false" :views="false"></interactBar>
</div> </div>
<div class="case-orginfo" style="margin-top:10px"> <div class="case-orginfo" style="margin-top:18px">
<authorInfo :avatar="ca.authorInfo.avatar" :info="ca.authorInfo.orgInfo" :name="ca.authorInfo.name" :sex="ca.authorInfo.sex"></authorInfo></div> <authorInfo :avatar="ca.authorInfo.avatar" :info="ca.authorInfo.orgInfo" :name="ca.authorInfo.name" :sex="ca.authorInfo.sex"></authorInfo></div>
</div> </div>
</div> </div>
@@ -339,7 +339,7 @@ export default {
name: 'index', name: 'index',
components: { portalHeader,ad, portalFooter, articleImage, portalFloatTools, authorInfo, interactRowBar, interactBar, courseImage }, components: { portalHeader,ad, portalFooter, articleImage, portalFloatTools, authorInfo, interactRowBar, interactBar, courseImage },
computed: { computed: {
...mapGetters(['userInfo','caseShow']) ...mapGetters(['userInfo'])
}, },
data() { data() {
return { return {

View File

@@ -96,8 +96,8 @@ export default {
}, },
saveSuccess(data){ saveSuccess(data){
this.diagSync=false; this.diagSync=false;
this.articleList.pageIndex = 1; this.pageData.pageIndex = 1;
this.articleList.list = []; this.pageData.list = [];
this.getArticleList(); this.getArticleList();
}, },
//获取文章列表数据 //获取文章列表数据

View File

@@ -8,7 +8,7 @@
<div style="padding: 10px 22px 10px 23px;"> <div style="padding: 10px 22px 10px 23px;">
<el-select v-model="dataList.type" style="margin-right: 10px" placeholder="类型"> <el-select v-model="dataList.type" style="margin-right: 10px" placeholder="类型">
<!-- <el-option label="全部" :value="0"></el-option> --> <el-option label="全部" :value="null"></el-option>
<el-option label="文章" :value="2"></el-option> <el-option label="文章" :value="2"></el-option>
<!-- <el-option label="课程" :value="1"></el-option> --> <!-- <el-option label="课程" :value="1"></el-option> -->
<el-option label="案例" :value="3"></el-option> <el-option label="案例" :value="3"></el-option>
@@ -42,13 +42,11 @@
<span style="font-size: 16px; color: #666666; line-height:30px"> <span style="font-size: 16px; color: #666666; line-height:30px">
<!-- <i class="el-icon-time"> --> <!-- <i class="el-icon-time"> -->
{{item.sysCreateBy}}@ {{item.sysCreateBy}}@
</span> </span>
<span style="margin-left:5px; font-size: 16px; color: #666666; line-height:25px "> <span style="margin-left:5px; font-size: 16px; color: #666666; line-height:25px ">
{{ item.content }} {{ item.content }}
</span> </span>
</div> </div>
<!-- <el-button type="primary" v-if="!item.isread" size="mini">标记已读</el-button> --> <!-- <el-button type="primary" v-if="!item.isread" size="mini">标记已读</el-button> -->
</div> </div>
<div style="margin-top:10px; position: relative;"> <div style="margin-top:10px; position: relative;">
@@ -121,7 +119,7 @@ export default {
type:0, type:0,
dataList: { dataList: {
pageIndex:1, pageIndex:1,
type:4, type:'',
pageSize:10, pageSize:10,
count:0, count:0,
list:[], list:[],
@@ -149,13 +147,13 @@ export default {
// let routeData = this.$router.resolve({ path:'/article/detail?id='+item.objId}); // , query: { id: 1 } // let routeData = this.$router.resolve({ path:'/article/detail?id='+item.objId}); // , query: { id: 1 }
// window.open(routeData.href, '_blank'); // window.open(routeData.href, '_blank');
// this.$router.push({path:'/article/detail',query:{id:item.objId}}) // this.$router.push({path:'/article/detail',query:{id:item.objId}})
if(this.dataList.type == 2){ if(item.objType == 2){
this.$router.push({path:'/article/detail',query:{id:item.objId}}) this.$router.push({path:'/article/detail',query:{id:item.objId}})
}else if(this.dataList.type == 1){ }else if(item.objType == 1){
}else if(this.dataList.type == 4){ }else if(item.objType == 4){
this.$router.push({ path: '/qa/answer', query: { id: item.objId } }); this.$router.push({ path: '/qa/answer', query: { id: item.objId } });
} else if(this.dataList.type == 3){ } else if(item.objType == 3){
this.$router.push({ path: '/case/detail', query: { id: item.objId } }); this.$router.push({ path: '/case/detail', query: { id: item.objId } });
} }
}, },
@@ -192,6 +190,7 @@ export default {
reset(){ reset(){
this.dataList.pageIndex = 1; this.dataList.pageIndex = 1;
this.dataList.send = '', this.dataList.send = '',
this.dataList.type = '',
this.type = 0; this.type = 0;
this.getData(); this.getData();
this.isSearh = false; this.isSearh = false;

View File

@@ -28,12 +28,12 @@
placeholder="题干" placeholder="题干"
clearable></el-input> clearable></el-input>
</el-col> </el-col>
<el-col :span="14"> <el-col :span="17" style="display:flex;justify-content: space-between;">
<div style="flex: 1;">
<el-button type="primary" @click="getsearch(1)" style="margin-left: 20px" icon="el-icon-search" >搜索</el-button> <el-button type="primary" @click="getsearch(1)" style="margin-left: 20px" icon="el-icon-search" >搜索</el-button>
<el-button icon="el-icon-refresh-right" type="primary" @click="reset"> 重置 </el-button> <el-button icon="el-icon-refresh-right" type="primary" @click="reset"> 重置 </el-button>
<el-button type="primary" @click="addQuestion(1)" style="margin-left: 10px" icon="el-icon-plus"> 添加 </el-button> <el-button type="primary" @click="addQuestion(1)" style="margin-left: 10px" icon="el-icon-plus"> 添加 </el-button>
<div style="display: inline-block;margin-left: 10px;"> <div style="display: inline-block;margin-left: 10px;">
<file-upload <file-upload
dir="files" dir="files"
text="导入" text="导入"
@@ -45,6 +45,8 @@
@remove="removeFile" > @remove="removeFile" >
</file-upload> </file-upload>
</div> </div>
</div>
<div style="display: inline-block;margin-top: 10px;"><el-link @click="downloadTemplate">下载模板文件</el-link></div>
</el-col> </el-col>
</el-row> </el-row>
</el-header> </el-header>
@@ -380,6 +382,18 @@ export default {
}); });
}, },
methods: { methods: {
downloadTemplate(){
let fileName = "试题导入模板.xls";
let link = document.createElement('a'); //创建a标签
link.style.display = 'none'; //使其隐藏
link.download = this.webBaseUrl+'/template/test-question-template.xls';
link.setAttribute('target', '_blank');
link.href = this.webBaseUrl+'/template/test-question-template.xls'; //赋予文件下载地址
link.setAttribute('download', fileName); //设置下载属性 以及文件名
document.body.appendChild(link); //a标签插至页面中
link.click(); //强制触发a标签事件
document.body.removeChild(link);
},
uploadFile(file) { uploadFile(file) {
this.loadData(1); this.loadData(1);
setTimeout(this.$message.warning('请耐心等待片刻,正在导入'), 2000 ); setTimeout(this.$message.warning('请耐心等待片刻,正在导入'), 2000 );

View File

@@ -33,11 +33,14 @@
<div v-if="examStatus==2" style="text-align: center;color:#6d6d6d; ">考试已结束</div> <div v-if="examStatus==2" style="text-align: center;color:#6d6d6d; ">考试已结束</div>
</div> </div>
<div v-else class="no-text"> <div v-else class="no-text">
<span>您没有需要的考试</span> <span v-if="noExam">您没有需要的考试</span>
</div> </div>
<div class="re-list" v-if="canExam"> <div class="re-list" v-if="canExam">
<p>历史记录</p> <p>历史记录</p>
<el-table :data="tableData" style="width: 100%"> <div style="height:300px" v-if="loading == 1" v-loading="loading == 1">
</div>
<el-table :data="tableData" style="width: 100%" v-if="loading == 2">
<el-table-column prop="startTime" label="完成时间" width="180"></el-table-column> <el-table-column prop="startTime" label="完成时间" width="180"></el-table-column>
<el-table-column prop="score" align="center" label="成绩"> <el-table-column prop="score" align="center" label="成绩">
<template slot-scope="scope"> <template slot-scope="scope">
@@ -235,11 +238,13 @@ import { formatSeconds } from '@/utils/datetime.js'
export default { export default {
data() { data() {
return { return {
loading:0,
toScoreTow, toScoreTow,
examId:'',//考试的id examId:'',//考试的id
taskId:'',//考试任务的id taskId:'',//考试任务的id
lastId:'',//最后一次提交的答卷 lastId:'',//最后一次提交的答卷
canExam:false,//能否参加考试 canExam:false,//能否参加考试
noExam:false,//不能参加考试
tipText:'',//提示信息 tipText:'',//提示信息
examStatus:0,//0表无1表考试中2表已结束 examStatus:0,//0表无1表考试中2表已结束
btnText:'开始考试', btnText:'开始考试',
@@ -301,6 +306,9 @@ export default {
apiTestPaper.getTestInfo(this.examId).then(res=>{ apiTestPaper.getTestInfo(this.examId).then(res=>{
if(res.status==200){ if(res.status==200){
this.canExam = res.result.hasTask; this.canExam = res.result.hasTask;
if(!this.canExam) {
this.noExam = true;
}
this.examStatus=res.result.examStatus; this.examStatus=res.result.examStatus;
this.testPaper = res.result.exam; this.testPaper = res.result.exam;
this.taskId=res.result.taskId; this.taskId=res.result.taskId;
@@ -400,8 +408,10 @@ export default {
}) })
}, },
testAnswers(){ //获取当前考试的历史记录 testAnswers(){ //获取当前考试的历史记录
this.loading = 1;
apiTestPaper.myTestAnswers(this.examId).then(res=>{ apiTestPaper.myTestAnswers(this.examId).then(res=>{
if(res.status ==200) { if(res.status ==200) {
this.loading = 2;
this.tableData = res.result; this.tableData = res.result;
let len=res.result.length; let len=res.result.length;
let times=this.testPaper.times? this.testPaper.times:0; let times=this.testPaper.times? this.testPaper.times:0;
@@ -410,6 +420,7 @@ export default {
this.tipText='已达到允许考试次数上限'; this.tipText='已达到允许考试次数上限';
} }
}else{ }else{
this.loading = 2;
this.$message.error('加载考试记录失败'); this.$message.error('加载考试记录失败');
} }
}) })

View File

@@ -69,7 +69,7 @@
</span> </span>
</el-dialog> </el-dialog>
<el-dialog center custom-class="g-dialog" title="导入人员数据" :close-on-click-modal="false" :visible.sync="importUserShow"> <el-dialog center custom-class="g-dialog" title="导入人员数据" :close-on-click-modal="false" :visible.sync="importUserShow">
<div style="padding: 10px 0px;color: #009ae7; ">单个导入文件受众成员请勿超过200条记录以员工号为准必须是本系统人员</div> <div style="padding: 10px 0px;color: #009ae7; ">单个导入文件受众成员请勿超过5000条记录以员工号为准必须是本系统人员</div>
<el-row type="flex" align="middle" justify="start" style="margin-bottom: 10px;"> <el-row type="flex" align="middle" justify="start" style="margin-bottom: 10px;">
文件名称<el-input style="width: 200px;" disabled v-model="selectFile"></el-input> 文件名称<el-input style="width: 200px;" disabled v-model="selectFile"></el-input>
<el-upload <el-upload

View File

@@ -146,6 +146,7 @@
}, },
viewDetail(row){ viewDetail(row){
this.$router.push({path:'/manage/viewugroup', query: {id: row.id}}) this.$router.push({path:'/manage/viewugroup', query: {id: row.id}})
// this.$router.push({path:'/manage/addaudiences', query: {id: row.id}})
}, },
jumpRouter(type){ jumpRouter(type){
if(type==1){ if(type==1){

View File

@@ -1,7 +1,7 @@
<template> <template>
<div id="answer-detail"> <div id="answer-detail">
<portal-header current="qa" :goSearch="4"></portal-header> <portal-header current="qa" :goSearch="4"></portal-header>
<div class="portal-content xcontent" > <div class="portal-content xcontent">
<el-breadcrumb separator-class="el-icon-arrow-right" class="breadcrumb-nav"> <el-breadcrumb separator-class="el-icon-arrow-right" class="breadcrumb-nav">
<el-breadcrumb-item :to="{ path: '/qa' }">问答列表</el-breadcrumb-item> <el-breadcrumb-item :to="{ path: '/qa' }">问答列表</el-breadcrumb-item>
<el-breadcrumb-item>问答详情</el-breadcrumb-item> <el-breadcrumb-item>问答详情</el-breadcrumb-item>
@@ -10,44 +10,52 @@
<div style="flex: 1;"> <div style="flex: 1;">
<el-row v-if="noData"> <el-row v-if="noData">
<el-card :body-style="{ padding: '0px' }" class="detail"> <el-card :body-style="{ padding: '0px' }" class="detail">
<div class="title" > <div class="title">
<span class="qa-basic" :class="detailData.isResolve ? 'qa-solve' : 'qa-unSolve'"> <span class="qa-basic" :class="detailData.isResolve ? 'qa-solve' : 'qa-unSolve'">
{{ detailData.isResolve === true ? '【已解决】' : detailData.isResolve === false ? '【待解决】' : '' }} {{ detailData.isResolve === true ? '【已解决】' : detailData.isResolve === false ? '【待解决】' : '' }}
</span> </span>
{{ detailData.title }} {{ detailData.title }}
</div> </div>
<div class="label" style="display: flex;margin: 9px 0 14px 0;justify-content: space-between;align-items: center;font-size: 12px;"> <div class="label"
style="display: flex;margin: 9px 0 14px 0;justify-content: space-between;align-items: center;font-size: 12px;">
<!-- <img :src="detailData.avatar || '/temp/index/male.jpg'" /> --> <!-- <img :src="detailData.avatar || '/temp/index/male.jpg'" /> -->
<author width="24px" height="24px" :avatar="detailData.avatar" :name="detailData.name" :sex="detailData.sex"></author> <author width="24px" height="24px" :avatar="detailData.avatar" :name="detailData.name"
:sex="detailData.sex"></author>
<!-- <author :avatar="detailData.avatar" :info="detailData.orgInfo" :name="detailData.name"></author> --> <!-- <author :avatar="detailData.avatar" :info="detailData.orgInfo" :name="detailData.name"></author> -->
<time-show :time="detailData.sysCreateTime"></time-show> <time-show :time="detailData.sysCreateTime"></time-show>
</div> </div>
<div class="content"> <div class="content">
<div style="word-break:break-all;">{{ detailData.content }}</div> <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 v-if="detailData.images" style="margin: 10px 0px;">
<el-image :src="fileUrl + detailData.images" fit="scaleDown" />
</div>
</div> </div>
<div class="btn-div"> <div class="btn-div">
<div class="write-btn" @click="answerShow=true"> <div class="write-btn" @click="answerShow = true">
<el-button type="text" icon="el-icon-edit">写回答</el-button> <el-button type="text" icon="el-icon-edit">写回答</el-button>
</div> </div>
<span class="answer-total">共计{{detailData.answers}}条回答</span> <span class="answer-total">共计{{ detailData.answers }}条回答</span>
<interactBar v-if="detailData.id" :type="4" :comments="false" :data="detailData" :views="false"></interactBar> <interactBar v-if="detailData.id" :type="4" :comments="false" :data="detailData" :views="false">
</interactBar>
</div> </div>
</el-card> </el-card>
<div v-if="answerShow"> <div v-if="answerShow">
<el-card :body-style="{ padding: '0px' }" style="padding: 20px;"> <el-card :body-style="{ padding: '0px' }" style="padding: 20px;">
<div> <div>
<el-input type="textarea" rows="5" placeholder="写下您的答案(800字以内),可以@提问者哦~" minlength="1" maxlength="800" v-model="content"></el-input> <el-input type="textarea" rows="5" placeholder="写下您的答案(800字以内),可以@提问者哦~" minlength="1" maxlength="800"
v-model="content"></el-input>
</div> </div>
<div style="padding-top: 10px;"> <div style="padding-top: 10px;">
<el-button type="primary" :disabled="!checked" class="dian-btn" @click="publishAnswer">发布</el-button> <el-button type="primary" :disabled="!checked" class="dian-btn" @click="publishAnswer">发布</el-button>
<!-- <el-checkbox style="margin-left:20px" v-model="checked"></el-checkbox><span style="margin-left:10px" @click="qaFormCheckedShow = true">我已阅读并遵守平台内容发布要求</span> --> <!-- <el-checkbox style="margin-left:20px" v-model="checked"></el-checkbox><span style="margin-left:10px" @click="qaFormCheckedShow = true">我已阅读并遵守平台内容发布要求</span> -->
<el-checkbox style="margin-left:20px" v-model="checked"></el-checkbox><span style="font-size:14px;color:#787878;margin-left:10px">我已阅读并遵守<span style="color:#588afc;cursor: pointer;" @click="qaFormCheckedShow = true">平台内容发布要求</span></span> <el-checkbox style="margin-left:20px" v-model="checked"></el-checkbox><span
style="font-size:14px;color:#787878;margin-left:10px">我已阅读并遵守<span
style="color:#588afc;cursor: pointer;" @click="qaFormCheckedShow = true">平台内容发布要求</span></span>
</div> </div>
</el-card> </el-card>
</div> </div>
<el-card class="box-card" v-if="answerList.length ==0&&!answerShow" :body-style="{ padding: '0px' }"> <el-card class="box-card" v-if="answerList.length == 0 && !answerShow" :body-style="{ padding: '0px' }">
<div> <div>
<div style="height:50px;margin-top: 50px;"> <div style="height:50px;margin-top: 50px;">
<img style="width:50px" src="../../../assets/images/icon/anser.png" alt="" srcset=""> <img style="width:50px" src="../../../assets/images/icon/anser.png" alt="" srcset="">
@@ -65,29 +73,49 @@
<el-button type="primary" class="dian-btn" @click="publishAnswer">发布</el-button> <el-button type="primary" class="dian-btn" @click="publishAnswer">发布</el-button>
</el-card> --> </el-card> -->
<el-card :body-style="{ padding: '0px' }" class="answer-reply-box"> <el-card :body-style="{ padding: '0px' }" class="answer-reply-box">
<div class="answer" v-for="(item, index) of answerList" :key="item.id" :style="index === answerList.length - 1 ? 'border-bottom:none;' : ''"> <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 class="answer-top">
<div><author :avatar="item.avatar" :name="item.sysCreateBy" :sex="item.sex"></author></div>
<div> <div>
<span v-if="detailData.isResolve&&item.isBest" style="color: #ffb30f">最佳答案</span> <author :avatar="item.avatar" :name="item.sysCreateBy" :sex="item.sex"></author>
<el-button type="primary" v-if="!detailData.isResolve && detailData.sysCreateAid == userInfo.aid" class="zuijia" @click="editAnsweBest(item)">设为最佳答案</el-button> </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> </div>
<div class="answer-body"> <div class="answer-body">
<div @mouseover="showButtons(item.id)" @mouseout="hideButtons()"><!--在这一层上加事件--> <div @mouseover="showButtons(item.id)" @mouseout="hideButtons()">
<div class="answer-text">{{ displayAll(item) }} <!--在这一层上加事件-->
<span v-if="item.content.length>170" @click="changeIsAll(item)">{{item.isAll?'收起':'全文'}}</span> <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>
<div class="answer-time"> <div class="answer-time">
<div>回答于 <time-show :time="item.sysCreateTime"></time-show></div> <div>回答于 <time-show :time="item.sysCreateTime"></time-show>
<div style="margin-right: 10px;"><interactBar :type="5" :comments="false" :favorites="false" :data="item" :shares="false" :views="false"></interactBar></div> </div>
<div style="margin-right: 10px;">
<interactBar :type="5" :comments="false" :favorites="false" :data="item" :shares="false"
:views="false"></interactBar>
</div>
</div> </div>
<div class="answer-boot"> <div class="answer-boot">
<div class="answer-boot-btns"> <div class="answer-boot-btns">
<div v-show="btnsShowRowId==item.id"> <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 @click="showRowInput(item, {})">
<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> <svg-icon icon-class="comment" style="margin-right: 0px;font-size: 16px;"></svg-icon>
<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> <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> --> <!-- <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> </div>
<!-- <i class="el-icon-chat-line-round" @click="showRowInput(item,{})" style="margin-right:10px;"></i> <!-- <i class="el-icon-chat-line-round" @click="showRowInput(item,{})" style="margin-right:10px;"></i>
@@ -96,54 +124,64 @@
</div> </div>
</div> </div>
<!----> <!---->
<div v-show="curParentId==item.id" class="answer-reply"> <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-input type="textarea" v-model="replyContent" show-word-limit maxlength="800"
<el-button type="primary" @click="replyContentMethod(item,{})">发布回复</el-button> placeholder="回复内容"></el-input>
<el-button type="primary" @click="replyContentMethod(item, {})">发布回复</el-button>
</div> </div>
</div> </div>
<!--一级评论二级数据--> <!--一级评论二级数据-->
<div v-if="item.answers && item.answers.length!=0"> <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" v-for="(con, i) in item.answers" :key="i"
:class="i === item.answers.length - 1 ? 'comment-last' : ''">
<div class="comment-top"> <div class="comment-top">
<div class="comment-author"> <div class="comment-author">
<author :avatar="con.avatar" :name="con.sysCreateBy" :sex="con.sex"></author> <author :avatar="con.avatar" :name="con.sysCreateBy" :sex="con.sex"></author>
<span class="comment-author-text">回复</span> <span class="comment-author-text">回复</span>
<span style="margin-left: 10px; font-size:14px">{{con.replayName}}</span> <span style="margin-left: 10px; font-size:14px">{{ con.replayName }}</span>
</div> </div>
<div class="comment-time"> <div class="comment-time">
<time-show :time="con.sysCreateTime"></time-show> <time-show :time="con.sysCreateTime"></time-show>
</div> </div>
</div> </div>
<div class="comment-body" > <div class="comment-body">
<div class="comment-info" @mouseover="showButtons(con.id)" @mouseout="hideButtons()"> <div class="comment-info" @mouseover="showButtons(con.id)" @mouseout="hideButtons()">
<div class="comment-content"> <div class="comment-content">
{{ displayAll(con) }} <span style="color: #303133" v-html="displayAll(con)"></span>
<span v-if="con.content.length>170" @click="changeIsAll(con)"> <span v-if="con.content.length > 170" @click="changeIsAll(con)">
{{con.isAll?'收起':'全文'}} {{ con.isAll ? '收起' : '全文' }}
</span> </span>
</div> </div>
<div class="comment-btns"> <div class="comment-btns">
<div v-show="btnsShowRowId==con.id"> <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 @click="showRowInput(con, item)">
<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> <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> </div>
<!-- <i class="el-icon-chat-line-round" @click="showRowInput(con,item)" style="margin-right:10px;"></i> <!-- <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-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> --> <i class="el-icon-delete" v-if="detailData.sysCreateAid == userInfo.aid||con.sysCreateAid == userInfo.aid" @click="delAnswer(con)"></i> -->
</div> </div>
<div class="comment-reply" v-show="curParentId==con.id"> <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-input type="textarea" v-model="replyContent" placeholder="回复内容" show-word-limit
<el-button type="primary" @click="replyContentMethod(con,item)">发布回复</el-button> maxlength="100"></el-input>
<el-button type="primary" @click="replyContentMethod(con, item)">发布回复</el-button>
</div> </div>
</div> </div>
<!--三级数据--> <!--三级数据-->
<div v-if="con.answers && con.answers.length>0"> <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" v-for="(row, rowIdx) in con.answers" :key="rowIdx"
:class="rowIdx === con.answers.length - 1 ? 'comment-last' : ''">
<div class="comment-top"> <div class="comment-top">
<div class="comment-author"> <div class="comment-author">
<author :avatar="row.avatar" :name="row.sysCreateBy" :sex="row.sex"></author> <author :avatar="row.avatar" :name="row.sysCreateBy" :sex="row.sex"></author>
<span class="comment-author-text">回复</span> <span class="comment-author-text">回复</span>
<span style="margin-left: 10px; font-size:14px">{{row.replayName}}</span> <span style="margin-left: 10px; font-size:14px">{{ row.replayName }}</span>
</div> </div>
<div class="comment-time"> <div class="comment-time">
<time-show :time="row.sysCreateTime"></time-show> <time-show :time="row.sysCreateTime"></time-show>
@@ -152,15 +190,21 @@
<div class="comment-body"> <div class="comment-body">
<div class="comment-info" @mouseover="showButtons(row.id)" @mouseout="hideButtons()"> <div class="comment-info" @mouseover="showButtons(row.id)" @mouseout="hideButtons()">
<div class="comment-content"> <div class="comment-content">
{{ displayAll(row) }} <span style="color: #303133" v-html="displayAll(row)"></span>
<span v-if="row.content.length>170" @click="changeIsAll(row)"> <span v-if="row.content.length > 170" @click="changeIsAll(row)">
{{row.isAll?'收起':'全文'}} {{ row.isAll ? '收起' : '全文' }}
</span> </span>
</div> </div>
<div class="comment-btns"> <div class="comment-btns">
<div v-show="btnsShowRowId==row.id"> <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 @click="showRowInput(row, con)">
<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> <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> </div>
<!-- <i class="el-icon-thumb" style="margin-right:10px;"></i> --> <!-- <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-chat-line-round" @click="showRowInput(row,con)" style="margin-right:10px;"></i>
@@ -168,16 +212,18 @@
<i class="el-icon-delete" v-if="detailData.sysCreateAid == userInfo.aid||row.sysCreateAid == userInfo.aid" @click="delAnswer(row)"></i> --> <i class="el-icon-delete" v-if="detailData.sysCreateAid == userInfo.aid||row.sysCreateAid == userInfo.aid" @click="delAnswer(row)"></i> -->
</div> </div>
</div> </div>
<div class="comment-reply" v-show="curParentId==row.id"> <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-input type="textarea" v-model="replyContent" show-word-limit maxlength="100"
<el-button type="primary" @click="replyContentMethod(row,con)">发布回复</el-button> placeholder="回复内容"></el-input>
<el-button type="primary" @click="replyContentMethod(row, con)">发布回复</el-button>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div><!--二级数据结束--> </div>
<!--二级数据结束-->
</div> </div>
</div> </div>
</div> </div>
@@ -185,7 +231,8 @@
</el-card> </el-card>
<div class="pagination-div"> <div class="pagination-div">
<span class="pag-text" @click="loadMore()" v-if="moreState == 1">加载更多</span> <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> <span class="pag-text-msg" style="font-size:14px;color: #444444;"
v-else-if="moreState == 3">没有更多数据了</span>
</div> </div>
</div> </div>
</div> </div>
@@ -196,13 +243,14 @@
</div> </div>
<div style="width: 245px;margin-left: 5px;"> <div style="width: 245px;margin-left: 5px;">
<el-row> <el-row>
<div class="qa-ranking" > <div class="qa-ranking">
<div style="margin-bottom:15px;padding: 0"> <div style="margin-bottom:15px;padding: 0">
<el-button style="height: 100%;height: 37px;border-radius: 0; width: 100%;" @click="$refs.addQuestion.askQuestionDialog = true" type="primary">提问题</el-button> <el-button style="height: 100%;height: 37px;border-radius: 0; width: 100%;"
@click="$refs.addQuestion.askQuestionDialog = true" type="primary">提问题</el-button>
</div> </div>
<div :span="24" style="padding:0"> <div :span="24" style="padding:0">
<el-card class="ranking-card"> <el-card class="ranking-card">
<div slot="header" > <div slot="header">
<span style="font-size: 14px;font-weight: 600;color: #333333;">贡献排行榜</span> <span style="font-size: 14px;font-weight: 600;color: #333333;">贡献排行榜</span>
<!-- <el-radio-group v-model="anking" size="mini" style="float: right"> <!-- <el-radio-group v-model="anking" size="mini" style="float: right">
<el-radio-button label="年"></el-radio-button> <el-radio-button label="年"></el-radio-button>
@@ -212,12 +260,13 @@
</div> </div>
<div style="padding-bottom:10px"> <div style="padding-bottom:10px">
<el-row class="ranking-title bacolor" v-for="(item, index) in ankingList" :key="index" > <el-row class="ranking-title bacolor" v-for="(item, index) in ankingList" :key="index">
<el-col :span="6" style="height:34px;" > <el-col :span="6" style="height:34px;">
<img style="margin-top: 5px;" v-if="index===0" :src="`${webBaseUrl}/images/first.png`"/> <img style="margin-top: 5px;" v-if="index === 0" :src="`${webBaseUrl}/images/first.png`" />
<img style="margin-top: 5px;" v-if="index===1" :src="`${webBaseUrl}/images/second.png`"/> <img style="margin-top: 5px;" v-if="index === 1" :src="`${webBaseUrl}/images/second.png`" />
<img style="margin-top: 5px;" v-if="index===2" :src="`${webBaseUrl}/images/third.png`"/> <img style="margin-top: 5px;" v-if="index === 2" :src="`${webBaseUrl}/images/third.png`" />
<span style="margin-left: 10px" v-if="index!=2&&index!=0&&index!=1">{{index+1}}</span> <span style="margin-left: 10px" v-if="index != 2 && index != 0 && index != 1">{{ index + 1
}}</span>
</el-col> </el-col>
<!-- <el-tooltip :enterable="false" @click.native="jumpRouter(item)" effect="light" :content="item.name" placement="top-start"> --> <!-- <el-tooltip :enterable="false" @click.native="jumpRouter(item)" effect="light" :content="item.name" placement="top-start"> -->
<el-col :span="18" class="one-line-ellipsis"> {{ item.sysCreateUname }}</el-col> <el-col :span="18" class="one-line-ellipsis"> {{ item.sysCreateUname }}</el-col>
@@ -243,7 +292,8 @@
</div> </div>
<addQuestion ref="addQuestion" @sure="toDetail"></addQuestion> <addQuestion ref="addQuestion" @sure="toDetail"></addQuestion>
<editQuestion ref="editQuestion" @enSure="enSure" :editData="editData"></editQuestion> <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"> <el-dialog class="checked-show" :visible.sync="qaFormCheckedShow" width="800px" top="14vh" :show-close="false"
:modal="false">
<agreement></agreement> <agreement></agreement>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<!-- <el-button @click="qaFormCheckedShow = false"> </el-button> --> <!-- <el-button @click="qaFormCheckedShow = false"> </el-button> -->
@@ -290,7 +340,7 @@ export default {
}, },
data() { data() {
return { return {
noData:true, noData: true,
qaFormCheckedShow: false, qaFormCheckedShow: false,
checked: false, checked: false,
// sex:null, // sex:null,
@@ -311,19 +361,19 @@ export default {
anking: 2, //排行榜 anking: 2, //排行榜
ankingList: [], ankingList: [],
controlListNew: [], //用来控制回复输入框的显示与否 controlListNew: [], //用来控制回复输入框的显示与否
curParent:{},//当前输入的上级的对象用于往answers中追加回复的内容 curParent: {},//当前输入的上级的对象用于往answers中追加回复的内容
curParentId:'',//当前回复的内容的id curParentId: '',//当前回复的内容的id
replyContent: "" ,//回复的内容 replyContent: "",//回复的内容
readonly:false,//是否只读,用于预览 readonly: false,//是否只读,用于预览
btnsShowRowId:'',//显示的button的条目id btnsShowRowId: '',//显示的button的条目id
replyDiaglog:{ replyDiaglog: {
show:false, show: false,
pageIndex:1, pageIndex: 1,
pageSize:8, pageSize: 8,
pages:1, pages: 1,
count:0, count: 0,
commentId:'', commentId: '',
list:[] list: []
} }
}; };
}, },
@@ -386,10 +436,10 @@ export default {
}, },
messageSave(type) { messageSave(type) {
let content; let content;
if(type == "set") { if (type == "set") {
content = this.userInfo.name + "设置了我的回答为" + "-" + this.detailData.title + "为最佳答案"; content = this.userInfo.name + "设置了我的回答为" + "-" + this.detailData.title + "为最佳答案";
} }
if(type == "send") { if (type == "send") {
content = this.userInfo.name + "回答了我的问答" + "-" + this.detailData.title; content = this.userInfo.name + "回答了我的问答" + "-" + this.detailData.title;
} }
let message = { let message = {
@@ -411,13 +461,13 @@ export default {
this.editData = {}; this.editData = {};
this.loadAnswer(); this.loadAnswer();
}, },
showRowInput(row,parent){ //显示行输框 showRowInput(row, parent) { //显示行输框
if(this.curParentId){ if (this.curParentId) {
this.curParentId=''; this.curParentId = '';
this.curParent={}; this.curParent = {};
}else{ } else {
this.curParentId=row.id; this.curParentId = row.id;
this.curParent=parent; this.curParent = parent;
} }
}, },
//获取问题详细信息 //获取问题详细信息
@@ -433,7 +483,7 @@ export default {
if (JSON.stringify(this.detailData) != "{}") { if (JSON.stringify(this.detailData) != "{}") {
this.getQaUserData(this.detailData); this.getQaUserData(this.detailData);
} }
}else{ } else {
this.noData = false; this.noData = false;
this.$message.error(res.message); this.$message.error(res.message);
} }
@@ -446,7 +496,7 @@ export default {
this.answerList = []; this.answerList = [];
} }
this.moreState = 2; this.moreState = 2;
if(this.pageIndex == 1) { if (this.pageIndex == 1) {
// 重置数据 // 重置数据
this.answerList = []; this.answerList = [];
} }
@@ -459,15 +509,15 @@ export default {
if (res.status == 200) { if (res.status == 200) {
let allList = []; let allList = [];
let ids = []; let ids = [];
let level3ParentIds=[]; let level3ParentIds = [];
if (res.result.list.length != 0) { if (res.result.list.length != 0) {
res.result.list.forEach(item => { res.result.list.forEach(item => {
item.avatar = ""; item.avatar = "";
item.sex = null; item.sex = null;
item.isAll=false;//字数过大时,显示隐藏控制 item.isAll = false;//字数过大时,显示隐藏控制
allList.push(item); allList.push(item);
ids.push(item.sysCreateAid); ids.push(item.sysCreateAid);
if(item.answers && item.answers.length != 0) { if (item.answers && item.answers.length != 0) {
item.answers.forEach(answers => { item.answers.forEach(answers => {
answers.avatar = ""; answers.avatar = "";
answers.sex = null; answers.sex = null;
@@ -482,9 +532,9 @@ export default {
this.answerList.push(...res.result.list); this.answerList.push(...res.result.list);
this.loadLevel3Data(level3ParentIds); this.loadLevel3Data(level3ParentIds);
} }
if(res.result.totalPages>this.pageIndex){ if (res.result.totalPages > this.pageIndex) {
that.moreState = 1; that.moreState = 1;
}else{ } else {
that.moreState = 3; that.moreState = 3;
} }
} else { } else {
@@ -495,26 +545,26 @@ export default {
}); });
}, },
//加载第三级的数据 //加载第三级的数据
loadLevel3Data(commentIdArray){ loadLevel3Data(commentIdArray) {
let $this=this; let $this = this;
if(commentIdArray && commentIdArray.length>0){ if (commentIdArray && commentIdArray.length > 0) {
apiQa.replayClevel3(commentIdArray).then(rs=>{ apiQa.replayClevel3(commentIdArray).then(rs => {
if(rs.status==200){ if (rs.status == 200) {
//先处理头像 //先处理头像
let aids=[]; let aids = [];
rs.result.forEach(item=>{ rs.result.forEach(item => {
item.avatar = ""; item.avatar = "";
item.sex=null; item.sex = null;
item.isAll=false; item.isAll = false;
aids.push(item.sysCreateAid); aids.push(item.sysCreateAid);
}); });
$this.getUserInfoList(rs.result,aids); $this.getUserInfoList(rs.result, aids);
$this.answerList.forEach(one1=>{ $this.answerList.forEach(one1 => {
if(one1.answers.length>0){ if (one1.answers.length > 0) {
one1.answers.forEach(one2=>{ one1.answers.forEach(one2 => {
one2.answers=one2.answers? one2.answers:[]; one2.answers = one2.answers ? one2.answers : [];
rs.result.forEach(rsRow=>{ rs.result.forEach(rsRow => {
if(rsRow.commentId==one2.id){ if (rsRow.commentId == one2.id) {
one2.answers.push(rsRow); one2.answers.push(rsRow);
} }
}) })
@@ -572,10 +622,10 @@ export default {
// if(this.content.indexOf('@'+this.detailData.name)!=-1){ // if(this.content.indexOf('@'+this.detailData.name)!=-1){
// content=this.content.slice(this.detailData.name.length+1) // content=this.content.slice(this.detailData.name.length+1)
// } // }
if(this.content.length < 1 || this.content.trim() == "@" + this.detailData.name) { if (this.content.length < 1 || this.content.trim() == "@" + this.detailData.name) {
return this.$message.warning("请输入回答"); return this.$message.warning("请输入回答");
}else { } else {
content = this.content; content = this.content.trim();
} }
apiQa.saveAnswer({ apiQa.saveAnswer({
qid: this.$route.query.id, qid: this.$route.query.id,
@@ -583,16 +633,16 @@ export default {
}).then(res => { }).then(res => {
if (res.status == 200) { if (res.status == 200) {
this.messageSave("send"); this.messageSave("send");
this.$message({message: "发布回答成功",type: "success"}); this.$message({ message: "发布回答成功", type: "success" });
this.answerShow = false; this.answerShow = false;
this.getQuestionDetail(); this.getQuestionDetail();
this.loadAnswer(); this.loadAnswer();
this.content = ""; this.content = "";
} else { } else {
this.$message({message: res.message,type: "error"}); this.$message({ message: res.message, type: "error" });
} }
}).catch(err => { }).catch(err => {
this.$message({message: "发布失败",type: "error"}); this.$message({ message: "发布失败", type: "error" });
}); });
}, },
//编辑回答 //编辑回答
@@ -629,7 +679,7 @@ export default {
type: "error" type: "error"
}); });
}); });
}).catch(() => {}); }).catch(() => { });
}, },
//设置为最佳答案 //设置为最佳答案
editAnsweBest(data) { editAnsweBest(data) {
@@ -655,68 +705,71 @@ export default {
this.loadAnswer(); this.loadAnswer();
this.$off("ensure"); this.$off("ensure");
}, },
showButtons(id){ showButtons(id) {
if(!this.readonly){ if (!this.readonly) {
this.btnsShowRowId=id; this.btnsShowRowId = id;
} }
}, },
hideButtons(){ hideButtons() {
this.btnsShowRowId=''; this.btnsShowRowId = '';
}, },
//展示全部 //展示全部
displayAll(item) { displayAll(item) {
if(!item.isAll && item.content.length > 170) { 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.slice(0, 170) + "...";
} }
return item.content; return item.content;
}, },
changeIsAll(item) { changeIsAll(item) {
item.isAll=!item.isAll; item.isAll = !item.isAll;
}, },
openAnswer() { openAnswer() {
this.answerShow = true; this.answerShow = true;
}, },
replyContentMethod(data,parent) { replyContentMethod(data, parent) {
if (!this.replyContent) { if (!this.replyContent) {
return this.$message.error("回复内容不能为空"); return this.$message.error("回复内容不能为空");
} }
//默认是一级评论2级数据 //默认是一级评论2级数据
let replyData={ let replyData = {
replayAid: data.sysCreateAid, replayAid: data.sysCreateAid,
replayName: data.sysCreateBy, replayName: data.sysCreateBy,
content: this.replyContent, content: this.replyContent.trim(),
parentId: data.id, parentId: data.id,
commentId: "", commentId: "",
clevel: 2 clevel: 2
} }
//console.log(data,'data'); //console.log(data,'data');
if(data.clevel==2){ //当前是一级评论 if (data.clevel == 2) { //当前是一级评论
replyData.commentId=data.id; replyData.commentId = data.id;
replyData.clevel=3; replyData.clevel = 3;
}else if(data.clevel>2){ } else if (data.clevel > 2) {
replyData.commentId=data.commentId; replyData.commentId = data.commentId;
replyData.clevel=3; replyData.clevel = 3;
} }
apiQa.saveComment(replyData).then(res => { apiQa.saveComment(replyData).then(res => {
if(res.status == 200) { if (res.status == 200) {
res.result.avatar = ""; res.result.avatar = "";
res.result.sex = null; res.result.sex = null;
res.result.isAll = false; res.result.isAll = false;
this.$message.success("回复成功"); this.$message.success("回复成功");
this.getUserInfoList([res.result], [res.result.sysCreateAid]); this.getUserInfoList([res.result], [res.result.sysCreateAid]);
this.curParentId=''; this.curParentId = '';
this.curParent={}; this.curParent = {};
this.replyContent=''; this.replyContent = '';
//添加到页面中 //添加到页面中
if(data.clevel<3){ if (data.clevel < 3) {
if(data.answers){ if (data.answers) {
data.answers.push(res.result); data.answers.push(res.result);
}else{ } else {
data.answers=[]; data.answers = [];
data.answers.push(res.result); data.answers.push(res.result);
} }
}else{ } else {
parent.answers.push(res.result); parent.answers.push(res.result);
} }
@@ -725,26 +778,26 @@ export default {
} }
}); });
}, },
showMoreReply(comment){ showMoreReply(comment) {
this.replyDiaglog.pages=1; this.replyDiaglog.pages = 1;
this.replyDiaglog.count=0; this.replyDiaglog.count = 0;
this.replyDiaglog.pageIndex=1; this.replyDiaglog.pageIndex = 1;
this.replyDiaglog.list=[]; this.replyDiaglog.list = [];
this.replyDiaglog.show=true; this.replyDiaglog.show = true;
this.replyDiaglog.commentId=comment.id; this.replyDiaglog.commentId = comment.id;
this.loadAllReplyData(false); this.loadAllReplyData(false);
}, },
loadMoreReply(){ loadMoreReply() {
this.replyDiaglog.pageIndex++; this.replyDiaglog.pageIndex++;
this.loadAllReplyData(true); this.loadAllReplyData(true);
}, },
loadAllReplyData(append){ loadAllReplyData(append) {
let params={ let params = {
pageIndex:this.replyDiaglog.pageIndex, pageIndex: this.replyDiaglog.pageIndex,
pageSize:this.replyDiaglog.pageSize, pageSize: this.replyDiaglog.pageSize,
commentId:this.replyDiaglog.commentId commentId: this.replyDiaglog.commentId
} }
let $this=this; let $this = this;
// apiComment.replyList(params).then(rs=>{ // apiComment.replyList(params).then(rs=>{
// if(rs.status==200){ // if(rs.status==200){
// $this.replyDiaglog.count=rs.result.count; // $this.replyDiaglog.count=rs.result.count;
@@ -774,22 +827,26 @@ export default {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
::v-deep .checked-show{ ::v-deep .checked-show {
.el-dialog__header{ .el-dialog__header {
padding:0; padding: 0;
} }
} }
::v-deep .el-card__body { ::v-deep .el-card__body {
padding: 0; padding: 0;
} }
::v-deep .bacolor:nth-child(odd) { ::v-deep .bacolor:nth-child(odd) {
background-color: #fff; background-color: #fff;
padding: 0 5px; padding: 0 5px;
} }
::v-deep .bacolor:nth-child(even) { ::v-deep .bacolor:nth-child(even) {
background-color: #f6f6f6; background-color: #f6f6f6;
padding: 0 5px; padding: 0 5px;
} }
.write-btn { .write-btn {
width: 80px; width: 80px;
// height: 50px; // height: 50px;
@@ -806,67 +863,82 @@ export default {
line-height: 34px; line-height: 34px;
font-size: 15px; font-size: 15px;
color: #333333; color: #333333;
.center-titlt { .center-titlt {
font-size: 15px; font-size: 15px;
color: #333333; color: #333333;
} }
.center { .center {
text-align: right; text-align: right;
} }
img { img {
margin-top: 5px; margin-top: 5px;
} }
} }
.detail { .detail {
background-color: #fff; background-color: #fff;
padding: 5px 20px 10px 20px; padding: 5px 20px 10px 20px;
.title { .title {
margin-top: 20px; margin-top: 20px;
font-size: 22px; font-size: 22px;
line-height: 30px; line-height: 30px;
word-break: break-all; word-break: break-all;
.resolve { .resolve {
// padding: 3px; // padding: 3px;
color: #08a890; color: #08a890;
margin-left: -10px; margin-left: -10px;
} }
.unResolve { .unResolve {
// padding:3px; // padding:3px;
color: #588afc; color: #588afc;
margin-left: -10px; margin-left: -10px;
} }
} }
.label { .label {
font-size: 15px; font-size: 15px;
color: #999999; color: #999999;
} }
.content { .content {
line-height: 21px; line-height: 21px;
margin: 14px 0 16px 0; margin: 14px 0 16px 0;
font-size: 15px; font-size: 15px;
color: #666666; color: #666666;
} }
.btn-div { .btn-div {
display: flex; display: flex;
align-items: center; align-items: center;
margin-bottom: 9px; margin-bottom: 9px;
.answer-total { .answer-total {
font-size: 14px; font-size: 14px;
margin: 0 10px; margin: 0 10px;
} }
::v-deep .interact-bar-btns { ::v-deep .interact-bar-btns {
justify-content: flex-start !important; justify-content: flex-start !important;
} }
} }
.dian-btn { .dian-btn {
margin-top: 50px; margin-top: 50px;
width: 60%; width: 60%;
} }
} }
.answer { .answer {
margin-top: 14px; margin-top: 14px;
background-color: #fff; background-color: #fff;
border-bottom: 1px solid #dddddd; border-bottom: 1px solid #dddddd;
// padding: 5px 20px 20px 20px; // padding: 5px 20px 20px 20px;
.answer-top { .answer-top {
font-size: 16px; font-size: 16px;
@@ -874,6 +946,7 @@ export default {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
img { img {
margin-right: 10px; margin-right: 10px;
width: 30px; width: 30px;
@@ -881,6 +954,7 @@ export default {
border-radius: 50%; border-radius: 50%;
vertical-align: middle; vertical-align: middle;
} }
.zuijia { .zuijia {
width: 106px; width: 106px;
height: 42px; height: 42px;
@@ -895,35 +969,42 @@ export default {
text-align: center; text-align: center;
} }
} }
.answer-body{
.answer-body {
padding-left: 40px; padding-left: 40px;
.answer-text{
.answer-text {
margin: 20px 0 15px; margin: 20px 0 15px;
line-height: 24px; line-height: 24px;
white-space: pre-wrap; white-space: pre-wrap;
word-break: break-all; word-break: break-all;
span { span {
color: #409eff; color: #409eff;
cursor: pointer; cursor: pointer;
margin-left: 5px; margin-left: 5px;
} }
} }
.answer-time{
.answer-time {
font-size: 14px; font-size: 14px;
color: #8590a6; color: #8590a6;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
} }
.answer-boot{
.answer-boot {
height: 35px; height: 35px;
line-height: 35px; line-height: 35px;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
.answer-boot-btns{
a{ .answer-boot-btns {
margin-right:15px; a {
span{ margin-right: 15px;
span {
margin-left: 6px; margin-left: 6px;
color: #8590A6; color: #8590A6;
font-size: 14px; font-size: 14px;
@@ -932,89 +1013,109 @@ export default {
} }
} }
.answer-reply { .answer-reply {
display: flex; display: flex;
margin-bottom: 10px; margin-bottom: 10px;
.el-button { .el-button {
margin-left: 10px; margin-left: 10px;
} }
} }
} }
// .bottom { // .bottom {
// text-align: right; // text-align: right;
// } // }
} }
.comment{
.comment {
margin-top: 10px; margin-top: 10px;
background-color: #FFFFFF; background-color: #FFFFFF;
border-bottom: 1px solid #dddddd; border-bottom: 1px solid #dddddd;
.comment-top{
.comment-top {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
padding-bottom:10px; padding-bottom: 10px;
font-weight: 500; font-weight: 500;
line-height: 30px; line-height: 30px;
font-size: 1.1em; font-size: 1.1em;
.comment-author{
.comment-author {
display: flex; display: flex;
align-items: center; align-items: center;
height: 30px; height: 30px;
line-height: 30px; line-height: 30px;
.comment-author-text{
.comment-author-text {
margin-left: 10px; margin-left: 10px;
color: #8590A6; color: #8590A6;
font-size:14px; font-size: 14px;
} }
} }
.comment-time{
.comment-time {
color: #666666; color: #666666;
font-size: 12px; font-size: 12px;
} }
} }
.comment-body{
.comment-body {
padding-left: 40px; padding-left: 40px;
.comment-content{
.comment-content {
padding-bottom: 0px; padding-bottom: 0px;
white-space: pre-wrap; white-space: pre-wrap;
word-break: break-all; word-break: break-all;
span{
span {
cursor: pointer; cursor: pointer;
color: #409EFF color: #409EFF
} }
} }
.comment-btns{
.comment-btns {
// padding: 5px 10px 10px 0px; // padding: 5px 10px 10px 0px;
height: 35px; height: 35px;
line-height: 35px; line-height: 35px;
a{
margin-right:15px; a {
span{ margin-right: 15px;
span {
margin-left: 6px; margin-left: 6px;
color: #8590A6; color: #8590A6;
font-size: 14px; font-size: 14px;
} }
} }
} }
.comment-reply { .comment-reply {
display: flex; display: flex;
margin-bottom: 10px; margin-bottom: 10px;
.el-button { .el-button {
margin-left: 10px; margin-left: 10px;
} }
} }
} }
.comment-replys{
.comment-replys {
padding-left: 40px; padding-left: 40px;
} }
} }
.comment-last{
.comment-last {
border-bottom: none; border-bottom: none;
} }
.answer-reply-box { .answer-reply-box {
margin-top: 10px; margin-top: 10px;
background-color: #fff; background-color: #fff;
padding: 5px 20px 10px 20px; padding: 5px 20px 10px 20px;
} }
// ::v-deep .publishAnswer { // ::v-deep .publishAnswer {
// padding: 24px 20px; // padding: 24px 20px;
// .el-card__body { // .el-card__body {
@@ -1041,6 +1142,7 @@ export default {
margin-bottom: -24px; margin-bottom: -24px;
height: 190px; height: 190px;
line-height: 40px; line-height: 40px;
.el-link { .el-link {
line-height: 1; line-height: 1;
} }

View File

@@ -252,7 +252,7 @@ export default {
apiQa apiQa
.saveAnswer({ .saveAnswer({
qid: this.answer.id, qid: this.answer.id,
content: this.answer.inputValue content: this.answer.inputValue.trim()
}) })
.then(res => { .then(res => {
if (res.status == 200) { if (res.status == 200) {

View File

@@ -313,7 +313,8 @@ export default {
isAppendTime:false,//是否追加学习时长 isAppendTime:false,//是否追加学习时长
appentId:'',//当前追加的学习时长的id appentId:'',//当前追加的学习时长的id
appentInterval:30000,//追加学习时间的间隔 30秒加一次 appentInterval:30000,//追加学习时间的间隔 30秒加一次
handleTimeout:null handleTimeout:null,
completed:[],
}; };
}, },
mounted() { mounted() {
@@ -325,6 +326,7 @@ export default {
...mapGetters(['userInfo']), ...mapGetters(['userInfo']),
catalogTree() { catalogTree() {
let treeList = []; let treeList = [];
this.completed = [];
let $this = this; let $this = this;
$this.sectionList.forEach(sec => { $this.sectionList.forEach(sec => {
let treeNode = { section: sec, children: [] }; let treeNode = { section: sec, children: [] };
@@ -338,6 +340,9 @@ export default {
finishCount++; finishCount++;
} }
} }
if(c.status == 9) {
$this.completed.push(c.id);
}
treeNode.children.push(c); treeNode.children.push(c);
} }
}); });
@@ -648,8 +653,9 @@ export default {
}); });
}); });
//如果没有,就定位第一项内容 //如果没有,就定位第一项内容
if (playIndex == -1) { if (playIndex === -1) {
this.showRes(this.contentList[0]); // this.showRes(this.contentList[0]);
this.showRes(this.catalogTree[0].children[0])
} else { } else {
this.showRes(this.contentList[playIndex]); this.showRes(this.contentList[playIndex]);
} }
@@ -785,8 +791,9 @@ export default {
//console.log(e); //console.log(e);
}, },
showRes(r,i,index) {//i:子节下标index:章下标 showRes(r,i,index) {//i:子节下标index:章下标
if(i!=undefined && index!=undefined) { if(i!=undefined && index!=undefined && r.status<9) {
if(this.courseInfo.orderStudy) { if(this.courseInfo.orderStudy) {
//判断上个是否学完
if(i == 0) { if(i == 0) {
if(index > 0) { //第一章 第一节 if(index > 0) { //第一章 第一节
let preCatalog=this.catalogTree[index-1]; let preCatalog=this.catalogTree[index-1];
@@ -803,6 +810,28 @@ export default {
return; return;
} }
} }
//判断是否是第一个未学完的
let isAllow=false;
let has=this.catalogTree.some(treeNode=>{
let hasNo=treeNode.children.some(child=>{
if(child.status<9){
if(child.id==r.id){
isAllow=true;
}
return true;
}else{
return false;
}
});
return hasNo;
});
if(has){
if(!isAllow){
this.$message.warning('请按顺序学习');
return;
}
}
} }
} }

View File

@@ -26,6 +26,11 @@
} }
}, },
mounted(){ mounted(){
let protocol=window.location.protocol;
let idx=this.fileBaseUrl.indexOf('://');
if(!this.fileBaseUrl.startsWith(protocol)){
this.fileBaseUrl=protocol+this.fileBaseUrl.substring(idx+1);
}
this.loadData(); this.loadData();
}, },
methods:{ methods:{