This commit is contained in:
daihh
2022-06-13 18:39:55 +08:00
20 changed files with 291 additions and 90 deletions

View File

@@ -107,7 +107,7 @@
</div>
</div>
<!-- 推荐案例2版 -->
<div class="modules">
<div class="modules" v-if="caseShow">
<div class="modules-title">
<span class="modules-text">推荐案例</span>
@@ -336,7 +336,7 @@ export default {
name: 'index',
components: { portalHeader,ad, portalFooter, articleImage, portalFloatTools, authorInfo, interactRowBar, interactBar, courseImage },
computed: {
...mapGetters(['userInfo'])
...mapGetters(['userInfo','caseShow'])
},
data() {
return {

View File

@@ -194,7 +194,7 @@
</template>
</el-dialog>
<!--课程管理-->
<el-dialog custom-class="g-dialog" title="课程学习管理" width="80%" :visible.sync="manageStudy.dlgShow">
<el-dialog custom-class="g-dialog" title="课程学习管理" width="900px" :visible.sync="manageStudy.dlgShow" :close-on-click-modal="false">
<manager :manageStudyData="manageStudyData"></manager>
<template #footer>
<el-button @click="manageStudy.dlgShow = false">关闭</el-button>

View File

@@ -8,12 +8,12 @@
<!-- <el-cascader :options="resOwnerListMap" v-model="ownership" placeholder="资源归属" clearable :props="resourceProps"></el-cascader> -->
<div style="display: flex;justify-content:flex-start;">
<div style="padding-right: 5px;">
<!-- <div style="padding-right: 5px;">
<el-select placeholder="试卷类型" v-model="params.paperType" style="width: 110px;" clearable>
<el-option label="考试卷" :value="1"></el-option>
<el-option label="测试卷" :value="2"></el-option>
</el-select>
</div>
</div> -->
<div style="padding: 0px 5px;"><el-input placeholder="关键词" v-model="params.keyWord" clearable></el-input></div>
<div style="padding: 0px 5px;"><el-button icon="el-icon-search" @click="getsearch" type="primary" >搜索</el-button></div>
<div style="padding: 0px 5px;"><el-button icon="el-icon-refresh-right" type="primary" @click="reset">重置</el-button></div>
@@ -39,7 +39,7 @@
{{resOwnerName(scope.row.resOwner1)}}/{{resOwnerName(scope.row.resOwner2)}}{{scope.row.resOwner3? '/' : ''}}{{resOwnerName(scope.row.resOwner3)}}
</template>
</el-table-column> -->
<el-table-column label="最后更新" prop="sysCreateTime" width="150px"></el-table-column>
<el-table-column label="最后更新" prop="sysCreateTime" width="160px"></el-table-column>
<!-- <el-table-column label="试卷类型" prop="content">
<template slot-scope="scope">
{{scope.row.paperType == 1? '考试卷':'测试卷'}}

View File

@@ -14,7 +14,7 @@
<div class="title">{{ caseDetail.title }}</div>
<div class="label">
<author :onlyAvatar="true" :avatar="authorInfo.avatar" :sex="authorInfo.sex" ></author>
<span>作者{{ authorInfo.name }}</span>
<span>案主{{ authorInfo.name }}</span>
<span>工号{{ authorInfo.code }}</span>
<span>组织{{ authorInfo.orgInfo }}</span>
<span style="text-align: right;" v-if="caseDetail.sysCreateTime">{{ caseDetail.sysCreateTime.substring(0,10) }}</span>
@@ -25,8 +25,9 @@
</div> -->
<!-- <div class="case-summary"><span>{{ caseDetail.summary }}</span></div> -->
<div class="btn-div clearfix" >
<div style="color:#666" v-if="caseDetail.orgDomain" class="item">{{ caseDetail.orgDomain }}</div>
<div style="color:#666" v-if="caseDetail.majorType" class="item">{{ caseDetail.majorType }}</div>
<div style="color:#666" v-if="caseDetail.orgDomain" class="item">{{ orgDomainTranslate(caseDetail.orgDomain) }}</div>
<div style="color:#666" class="item" v-if="caseDetail.orgDomain == '' && caseDetail.orgDomainParent">{{ orgDomainTranslate(caseDetail.orgDomainParent) }}</div>
<div style="color:#666" v-if="caseDetail.majorType" class="item">{{ majorTypeTranslate(caseDetail.majorType) }}</div>
<div v-if="caseDetail.keyword1" class="item">{{ caseDetail.keyword1 }}</div>
<div v-if="caseDetail.keyword2" class="item">{{ caseDetail.keyword2 }}</div>
<div v-if="caseDetail.keyword3" class="item">{{ caseDetail.keyword3 }}</div>
@@ -197,7 +198,10 @@ export default {
filePath:''
},
ankingList:[],
authorInfo:{ aid: '', name: '', orgInfo: '', avatar: '', code: '',sex:null}
authorInfo:{ aid: '', name: '', orgInfo: '', avatar: '', code: '',sex:null},
domain: [],
Profess: [],
orgData: [],
};
},
mounted() {
@@ -207,6 +211,8 @@ export default {
if (this.resolveId) {
this.getCaseData();
}
this.getdomain();
this.getProfess();
this.getAnkingData();
this.getPopularity();
this.getPositive();
@@ -216,6 +222,59 @@ export default {
);
},
methods: {
getdomain() {
let key = "org_domain";
apiDict.items(key).then(res => {
if (res.status == 200) {
this.domain = res.result;
if(res.result.length > 0) {
this.orgDomainLevel(res.result)
}
}
});
},
getProfess() {
let key = "major_type";
apiDict.items(key).then(res => {
if (res.status == 200) {
this.Profess = res.result;
}
});
},
orgDomainLevel(organization) {
this.orgData = [];
organization.forEach(item=>{
this.orgData.push(item);
if(item.list && item.list != "" && item.list.length > 0){
item.list.forEach(it =>{
this.orgData.push(it);
})
}
})
},
orgDomainTranslate(code){ // 组织领域翻译
if(code == '') {
return
}
let name = '';
let data = this.orgData.find(item => item.code == code);
if(data == undefined){
name = '';
} else {
name = data.name;
}
return name;
},
majorTypeTranslate(code){ // 专业分类翻译
let name = '';
let data = this.Profess.find(item => item.code == code);
if(data == undefined){
name = '';
} else {
name = data.name;
}
return name;
},
zoomBox(){
this.zoomShow = !this.zoomShow;
},
@@ -303,6 +362,8 @@ export default {
}
}
}else{
this.$message.error(res.message)
}
});
},

View File

@@ -19,7 +19,7 @@
<div class="searchbar" v-if="searchTags.length > 0">
<div style="line-height: 30px;">
<span class="item-title">搜索条件</span>
<el-tag closable v-for="(tag, tagIdx) in searchTags" :key="tagIdx" @close="tagsClose(tag,tagIdx)">{{ tag }}</el-tag>
<el-tag closable v-for="(tag, tagIdx) in searchTags" :key="tagIdx" @close="tagsClose(tag,tagIdx)">{{ tag.value }}</el-tag>
</div>
</div>
<el-row class="search-item">
@@ -32,7 +32,7 @@
<div style="flex:1;">
<el-radio-group v-model="queryCondition.orgDomain" size="mini" @change="search()">
<el-radio-button :label="null">全部</el-radio-button>
<el-radio-button v-for="item in domain" :key="item.code" :label="item.name"> {{ item.name}}</el-radio-button>
<el-radio-button v-for="item in domain" :key="item.code" :label="item.code"> {{ item.name}}</el-radio-button>
</el-radio-group>
</div>
</div>
@@ -48,9 +48,9 @@
</div>
<div style="flex:1" id="searchBox">
<el-radio-group v-model="queryCondition.majorType" size="mini" @change="search()">
<el-radio-button :label="null">全部</el-radio-button>
<el-radio-button v-for="item in Profess" :key="item.code" :label="item.name" > {{ item.name }} </el-radio-button>
</el-radio-group>
<el-radio-button :label="null">全部</el-radio-button>
<el-radio-button v-for="item in Profess" :key="item.code" :label="item.code" > {{ item.name }} </el-radio-button>
</el-radio-group>
</div>
</div>
</el-col>
@@ -90,8 +90,9 @@
<author :avatar="item.authorInfo.avatar" :name="item.authorInfo.name" :info="item.authorInfo.orgInfo" :sex="item.authorInfo.sex"></author>
</div>
<div class="keyword-text clearfix">
<div style="color:#666" v-if="item.orgDomain">{{ item.orgDomain }}</div>
<div style="color:#666" v-if="item.majorType">{{ item.majorType }}</div>
<div style="color:#666" v-if="item.orgDomain">{{ orgDomainTranslate(item.orgDomain) }}</div>
<div style="color:#666" v-if="item.orgDomain == '' && item.orgDomainParent">{{ orgDomainTranslate(item.orgDomainParent) }}</div>
<div style="color:#666" v-if="item.majorType">{{ majorTypeTranslate(item.majorType) }}</div>
<div v-if="item.keyword1">{{ item.keyword1 }}</div>
<div v-if="item.keyword2">{{ item.keyword2 }}</div>
<div v-if="item.keyword3">{{ item.keyword3 }}</div>
@@ -306,12 +307,12 @@ export default {
type2: 0,
type3: 0,
isFind: false,
searchTags: []
searchTags: [],
orgData: [],
};
},
mounted() {
this.$nextTick(function() {
this.closeSearch();
});
@@ -390,7 +391,6 @@ export default {
apiCase.usernameList(5).then(res => {
if (res.status == 200) {
this.ankingList = res.result;
console.log(res);
}
});
},
@@ -416,6 +416,9 @@ export default {
apiDict.items(key).then(res => {
if (res.status == 200) {
this.domain = res.result;
if(res.result.length > 0) {
this.orgDomainLevel(res.result)
}
}
});
},
@@ -427,6 +430,40 @@ export default {
}
});
},
orgDomainLevel(organization) {
this.orgData = [];
organization.forEach(item=>{
this.orgData.push(item);
if(item.list && item.list != "" && item.list.length > 0){
item.list.forEach(it =>{
this.orgData.push(it);
})
}
})
},
orgDomainTranslate(code){ // 组织领域翻译
if(code == '') {
return
}
let name = '';
let data = this.orgData.find(item => item.code == code);
if(data == undefined){
name = '';
} else {
name = data.name;
}
return name;
},
majorTypeTranslate(code){ // 专业分类翻译
let name = '';
let data = this.Profess.find(item => item.code == code);
if(data == undefined){
name = '';
} else {
name = data.name;
}
return name;
},
emitInput(val) {
this.keyWord = val;
this.isSeach = true;
@@ -548,15 +585,24 @@ export default {
caseData[i] !== null &&
caseData[i] !== undefined
) {
if (caseData[i] !== "0") {
this.searchTags.push(caseData[i]);
if (caseData[i] == "0") {
return;
}
if(i == 'majorType'){
this.searchTags.push({ type:'majorType',value:this.majorTypeTranslate(caseData[i])})
}
if(i == 'orgDomain'){
this.searchTags.push({type:'orgDomain',value:this.orgDomainTranslate(caseData[i])})
}
if(i == 'keyWord'){
this.searchTags.push({type:'keyWord',value:caseData[i]})
}
}
}
},
tagsClose(tag, index) {
for (let i in this.queryCondition) {
if (tag === this.queryCondition[i]) {
if (tag.type === i) {
if (i == "majorType") {
this.queryCondition.majorType = null;
}

View File

@@ -135,12 +135,18 @@
</div>
<div style="display: flex;align-items: center;padding-top: 15px;">
<div @click="praiseContent" style="cursor: pointer;">
<img class="icon-small" v-if="isPraise" :src="require('@/assets/images/icon/praise-active.png')">
<img class="icon-small" v-else :src="require('@/assets/images/icon/praise.png')"><span style="margin-left: 5px;color: #666666;font-size: 18px;">{{courseInfo.praises}}</span>
<el-tooltip class="item" effect="light" :content="isPraise?'取消点赞':'点赞'" placement="top-start">
<img class="icon-small" v-if="isPraise" :src="require('@/assets/images/icon/praise-active.png')">
<img class="icon-small" v-else :src="require('@/assets/images/icon/praise.png')">
</el-tooltip>
<span style="margin-left: 5px;color: #666666;font-size: 18px;">{{courseInfo.praises}}</span>
</div>
<div style="margin-left: 15px;cursor: pointer;" @click="treadContent">
<img class="icon-small" v-if="isTrample" :src="require('@/assets/images/icon/trample-active.png')">
<img class="icon-small" v-else :src="require('@/assets/images/icon/trample.png')"><span style="margin-left: 5px;color: #666666;font-size: 18px;">{{courseInfo.trampleCount}}</span>
<el-tooltip class="item" effect="light" :content="isTrample?'取消踩':'踩'" placement="top-start">
<img class="icon-small" v-if="isTrample" :src="require('@/assets/images/icon/trample-active.png')">
<img class="icon-small" v-else :src="require('@/assets/images/icon/trample.png')">
</el-tooltip>
<span style="margin-left: 5px;color: #666666;font-size: 18px;">{{courseInfo.trampleCount}}</span>
</div>
</div>
</div>

View File

@@ -65,7 +65,7 @@
</div>
<div style="display: flex;">
<div style="flex: 83%" class="qa-info-summary two-line-ellipsis" @click="jumpDetail(qa)" v-html="$keywordActiveShow(qa.content,queryKeyWord)"></div>
<div style="flex: 17% ;text-align: right;" v-if="qa.images!==''">
<div style="flex: 17% ; cursor: pointer; text-align: right;cursor: pointer;" v-if="qa.images!==''" @click="jumpDetail(qa)">
<img style="width: 156px;height: 105px;" :src="fileBaseUrl + qa.images" alt="">
</div>
</div>

View File

@@ -42,7 +42,7 @@
<el-button style="margin-left:0px" type="success" @click="setEssence('set')" >设置精华</el-button>
<el-button type="warning" @click="setEssence('cancel')" >取消精华</el-button>
<div style="padding-left:10px"><el-checkbox v-model="queryObj.isEssence">精华问题</el-checkbox></div>
<div style="padding-left:10px"><el-checkbox v-model="queryObj.isEssence" @change="isEssenceChange()">精华问题</el-checkbox></div>
</div>
</div>
@@ -52,34 +52,34 @@
border stripe
@selection-change="handleSelectionChange"
:row-key="getRowKeys">
<el-table-column type="selection" width="55" :reserve-selection="true"></el-table-column>
<el-table-column label="标题" width="200px" show-overflow-tooltip prop="title" :reserve-selection="true">
<el-table-column type="selection" width="55"></el-table-column>
<el-table-column label="标题" width="200px" show-overflow-tooltip prop="title">
<template slot-scope="scope">
<span @click="viewTopic(scope.row)" :class="scope.row.isEssence ? 'isSelect' : 'previewStyle'">{{ scope.row.title }}</span>
<!-- <a :style="cursor:pointer;" target="_blank" :href="`${webBaseUrl}/qa/answer`">{{scope.row.name}}</a> -->
</template>
</el-table-column>
<el-table-column label="浏览" width="60px" prop="views" :reserve-selection="true"></el-table-column>
<el-table-column label="点赞" width="60px" prop="praises" :reserve-selection="true"></el-table-column>
<el-table-column label="收藏" width="60px" prop="favorites" :reserve-selection="true"></el-table-column>
<el-table-column label="回复" width="60px" prop="answers" :reserve-selection="true"></el-table-column>
<el-table-column width="100px" label="发布时间" prop="sysCreateTime" :reserve-selection="true">
<el-table-column label="浏览" width="60px" prop="views"></el-table-column>
<el-table-column label="点赞" width="60px" prop="praises"></el-table-column>
<el-table-column label="收藏" width="60px" prop="favorites"></el-table-column>
<el-table-column label="回复" width="60px" prop="answers"></el-table-column>
<el-table-column width="100px" label="发布时间" prop="sysCreateTime">
<template slot-scope="scope">
{{ scope.row.sysCreateTime | sysCreateTimeFilter }}
</template>
</el-table-column>
<el-table-column label="作者" prop="sysCreateBy" :reserve-selection="true"></el-table-column>
<el-table-column label="状态" prop="status" :reserve-selection="true">
<el-table-column label="作者" prop="sysCreateBy"></el-table-column>
<el-table-column label="状态" prop="status">
<template slot-scope="scope">
{{ scope.row.isResolve ? '已解决' : '待解决' }}
</template>
</el-table-column>
<el-table-column label="审核状态" prop="status" :reserve-selection="true">
<el-table-column label="审核状态" prop="status">
<template slot-scope="scope">
{{ scope.row.status === 0 ? '待审核' : scope.row.status === 1 ? '已通过' : scope.row.status === 2 ? '未通过' : '已撤销' }}
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="120px" :reserve-selection="true">
<el-table-column label="操作" fixed="right" width="120px">
<template slot-scope="scope">
<el-button-group>
<el-button type="text" v-if="scope.row.status==0" icon="el-icon-s-check" @click="aduit(scope.row)" size="small">审核</el-button>
@@ -163,6 +163,9 @@ export default {
}
},
methods: {
isEssenceChange(){
this.getQaList();
},
search(){
this.queryObj.pageIndex = 1;
this.getQaList();

View File

@@ -132,13 +132,17 @@
</div>
<div style="display: flex;justify-content: flex-end;cursor: pointer;">
<div @click="praiseContent">
<img class="icon-small" v-if="isPraise" :src="require('@/assets/images/icon/praise-active.png')" />
<img class="icon-small" v-else :src="require('@/assets/images/icon/praise.png')" />
<el-tooltip class="item" effect="light" :content="isPraise?'取消点赞':'点赞'" placement="top-start">
<img class="icon-small" v-if="isPraise" :src="require('@/assets/images/icon/praise-active.png')" />
<img class="icon-small" v-else :src="require('@/assets/images/icon/praise.png')" />
</el-tooltip>
{{ courseInfo.praises }}
</div>
<div style="margin-left: 15px;" @click="treadContent">
<el-tooltip class="item" effect="light" :content="isTrample?'取消踩':'踩'" placement="top-start">
<img class="icon-small" v-if="isTrample" :src="require('@/assets/images/icon/trample-active.png')" />
<img class="icon-small" v-else :src="require('@/assets/images/icon/trample.png')" />
</el-tooltip>
{{ courseInfo.trampleCount }}
</div>
</div>
@@ -257,8 +261,8 @@ import pdfPreview from '@/components/PdfPreview/index.vue';
import audioPlayer from '@/components/AudioPlayer/index.vue';
import videoPlayer from '@/components/VideoPlayer/index.vue';
import hyperLink from '@/components/Course/hyperLink.vue';
import studyUtil from '@/utils/study.js';
import {encrypt} from '@/utils/jsencrypt.js';
import studyUtil from '@/utils/study.js';
import {encrypt} from '@/utils/jsencrypt.js';
import cookies from 'vue-cookies'
export default {
name: 'ucStudyIndex',
@@ -345,22 +349,22 @@ export default {
return treeList;
}
},
methods: {
createPlayUrl(fid,u){
let nowDate=new Date();
let ctime=parseInt(nowDate.getTime()/1000);
let beforeUrl=parseInt(nowDate.getTime()/1000)+'/'+fid;
//console.log(beforeUrl,'beforeUrl');
let urlSign=encodeURIComponent(encrypt(beforeUrl));
//console.log(urlSign,'urlSign');
cookies.set('PLAYSIGN_TIME', ctime);//写客户端的cookie保存
//以下判断是为了区分本地环境和服务器环境
if(process.env.NODE_ENV == 'development'){
this.blobUrl=process.env.VUE_APP_FILE_BASE_URL+u;
}else{
this.blobUrl=process.env.VUE_APP_BASE_API+'/xboe/m/course/cware/resource?sign='+urlSign;
}
console.log(this.blobUrl,'this.blobUrl');
methods: {
createPlayUrl(fid,u){
let nowDate=new Date();
let ctime=parseInt(nowDate.getTime()/1000);
let beforeUrl=parseInt(nowDate.getTime()/1000)+'/'+fid;
//console.log(beforeUrl,'beforeUrl');
let urlSign=encodeURIComponent(encrypt(beforeUrl));
//console.log(urlSign,'urlSign');
cookies.set('PLAYSIGN_TIME', ctime);//写客户端的cookie保存
//以下判断是为了区分本地环境和服务器环境
if(process.env.NODE_ENV == 'development'){
this.blobUrl=process.env.VUE_APP_FILE_BASE_URL+u;
}else{
this.blobUrl=process.env.VUE_APP_BASE_API+'/xboe/m/course/cware/resource?sign='+urlSign;
}
console.log(this.blobUrl,'this.blobUrl');
},
widthOpen(url) {
window.open(url, '_blank');
@@ -822,14 +826,14 @@ export default {
// if (r.content != '' && r.content.indexOf('.pdf') == -1) {
apiCourseFile.detail(r.contentRefId).then(cfrs => {
if (cfrs.status == 200) {
r.content = cfrs.result.previewFilePath;
r.content = cfrs.result.previewFilePath;
this.curCFile = cfrs.result;
if(cfrs.result.previewFilePath == '' && cfrs.result.filePath.indexOf('pdf') > -1) {
r.content = cfrs.result.filePath;
r.content = cfrs.result.filePath;
this.curCFile.converStatus=2;
}
if(r.content && r.content.indexOf('.pdf')>-1){
this.curCFile.converStatus=2;
}
if(r.content && r.content.indexOf('.pdf')>-1){
this.curCFile.converStatus=2;
}
} else {
$this.$message.error('加载pdf课件文件失败');