mirror of
https://codeup.aliyun.com/67762337eccfc218f6110e0e/vue/learning-system-portal.git
synced 2025-12-13 04:46:44 +08:00
ai功能静态
This commit is contained in:
BIN
src/assets/images/course/courseNew.png
Normal file
BIN
src/assets/images/course/courseNew.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 48 KiB |
@@ -329,6 +329,45 @@
|
|||||||
placeholder="请尽量填写课程简介,用于列表中显示,可以让用户更容易了解课程信息">
|
placeholder="请尽量填写课程简介,用于列表中显示,可以让用户更容易了解课程信息">
|
||||||
</el-input>
|
</el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
<el-form-item label="AI设置">
|
||||||
|
<div>
|
||||||
|
<div style="display: flex; align-items: center;gap: 10px;">
|
||||||
|
<div style="display: flex; align-items: center;gap: 3px;">
|
||||||
|
<el-tooltip class="item" effect="dark" content="是否将课程进行AI处理" placement="top">
|
||||||
|
<i class="el-icon-question" style="margin-left: 5px; color: #909399; cursor: pointer;"></i>
|
||||||
|
</el-tooltip>
|
||||||
|
<span>AI处理状态:</span>
|
||||||
|
</div>
|
||||||
|
<el-switch v-model="courseInfo.aiSet" active-value="1" inactive-value="0"></el-switch>
|
||||||
|
</div>
|
||||||
|
<div v-show="courseInfo.aiSet==1">
|
||||||
|
<el-row :gutter="20" style="margin: 10px 0;">
|
||||||
|
<el-col :span="9" style="display: flex; align-items: center;gap: 10px;">
|
||||||
|
<span>是否需要生成AI摘要:</span>
|
||||||
|
<el-radio-group v-model="courseInfo.aiAbstract">
|
||||||
|
<el-radio label="1">是</el-radio>
|
||||||
|
<el-radio label="0">否</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="10" style="display: flex; align-items: center;gap: 10px;">
|
||||||
|
<span>是否需要生成AI文稿:</span>
|
||||||
|
<el-radio-group v-model="courseInfo.aiDraft">
|
||||||
|
<el-radio label="1">是</el-radio>
|
||||||
|
<el-radio label="0">否</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
<el-row :gutter="20" style="margin: 10px 0;">
|
||||||
|
<el-col :span="20" style="display: flex; align-items: center;gap: 10px;">
|
||||||
|
<span>请选择该课程所支持的语种:</span>
|
||||||
|
<el-select v-model="courseInfo.languageCode" placeholder="请选择" multiple filterable style="width: 240px;">
|
||||||
|
<el-option v-for="item in selectAllLang" :key="item.key" :label="item.label" :value="item.srclang"> </el-option>
|
||||||
|
</el-select>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-form-item>
|
||||||
<!-- v-if="!weike.onlyRequired" -->
|
<!-- v-if="!weike.onlyRequired" -->
|
||||||
<!-- <el-form-item label="课程描述">
|
<!-- <el-form-item label="课程描述">
|
||||||
<WxEditor v-model="courseInfo.overview" :minHeight="50"></WxEditor>
|
<WxEditor v-model="courseInfo.overview" :minHeight="50"></WxEditor>
|
||||||
@@ -542,7 +581,7 @@ export default {
|
|||||||
this.getSceneData();
|
this.getSceneData();
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters(['resOwnerMap', 'sysTypeMap','userInfo','identity']),
|
...mapGetters(['resOwnerMap', 'sysTypeMap','userInfo','identity', 'selectAllLang']),
|
||||||
catalogTree() {
|
catalogTree() {
|
||||||
let treeList = [];
|
let treeList = [];
|
||||||
let $this = this;
|
let $this = this;
|
||||||
@@ -951,6 +990,18 @@ export default {
|
|||||||
this.dicts = result.dicts; //课程的老师信息
|
this.dicts = result.dicts; //课程的老师信息
|
||||||
console.log("--- 编辑查看 this.isPermission = ",this.isPermission)
|
console.log("--- 编辑查看 this.isPermission = ",this.isPermission)
|
||||||
console.log("--- 编辑查看 this.dicts = ",this.dicts)
|
console.log("--- 编辑查看 this.dicts = ",this.dicts)
|
||||||
|
// 如果ai设置为空则给默认值 - 会看成新增状态
|
||||||
|
if(this.courseInfo.aiSet === null || this.courseInfo.aiSet === '' || this.courseInfo.aiSet === undefined){
|
||||||
|
this.courseInfo.isAddAI = '1'; //暂时是否是新增
|
||||||
|
this.courseInfo.aiSet = '1';
|
||||||
|
this.courseInfo.aiAbstract = '1';
|
||||||
|
this.courseInfo.aiDraft = '1';
|
||||||
|
this.courseInfo.aiTranslate = '1';
|
||||||
|
this.courseInfo.languageCode = ['zh-CN', 'en-US'];
|
||||||
|
} else {
|
||||||
|
// 获取ai设置信息
|
||||||
|
this.courseInfo.isAddAI = '0';
|
||||||
|
}
|
||||||
if(!this.courseInfo.orgId){
|
if(!this.courseInfo.orgId){
|
||||||
//根据课程创建者获取机构id
|
//根据课程创建者获取机构id
|
||||||
apiUser.getOrgSimpleByUserId(result.course.sysCreateAid).then(ors=>{
|
apiUser.getOrgSimpleByUserId(result.course.sysCreateAid).then(ors=>{
|
||||||
|
|||||||
@@ -120,6 +120,32 @@
|
|||||||
<div class="player-time">{{ currentTimeFormat }} / {{ fullTimeFormat }}</div>
|
<div class="player-time">{{ currentTimeFormat }} / {{ fullTimeFormat }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="player-controls-bottom-right">
|
<div class="player-controls-bottom-right">
|
||||||
|
<div class="player-controls-btn box-aiTranslate">
|
||||||
|
<div v-show="isSubtitle" class="player-controls-btn cursor-pointer btn-speed">
|
||||||
|
<span>{{!currentLang ? 'AI翻译' : currentLangLabel}}</span>
|
||||||
|
<div class="speed-control">
|
||||||
|
<ul class="speed-control-list">
|
||||||
|
<li
|
||||||
|
v-for="item in selectableLang"
|
||||||
|
:key="item.srclang"
|
||||||
|
@click="changeLang(item)"
|
||||||
|
:data-value="item.srclang"
|
||||||
|
class="one-line-ellipsis"
|
||||||
|
:title="item.label"
|
||||||
|
:class="{'current': currentLang === item.srclang}"
|
||||||
|
>{{ item.label }}</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-show="isSubtitle" style="margin-top: -3px;">|</div>
|
||||||
|
<div class="player-controls-btn" style="display: flex;gap: 0.3rem;align-items: center;">
|
||||||
|
<span>字幕</span>
|
||||||
|
<el-switch
|
||||||
|
v-model="isSubtitle">
|
||||||
|
</el-switch>
|
||||||
|
</div>
|
||||||
|
<div style="margin-top: -3px;">|</div>
|
||||||
|
</div>
|
||||||
<div class="player-controls-btn cursor-pointer btn-speed">
|
<div class="player-controls-btn cursor-pointer btn-speed">
|
||||||
<span>{{currentSpeed === 1 ? '倍速' : `${currentSpeed}x`}}</span>
|
<span>{{currentSpeed === 1 ? '倍速' : `${currentSpeed}x`}}</span>
|
||||||
<div class="speed-control">
|
<div class="speed-control">
|
||||||
@@ -224,6 +250,7 @@
|
|||||||
import volumeBar from "@/components/VideoPlayer/volume-bar.vue";
|
import volumeBar from "@/components/VideoPlayer/volume-bar.vue";
|
||||||
import progressBar from "@/components/VideoPlayer/progress-bar.vue";
|
import progressBar from "@/components/VideoPlayer/progress-bar.vue";
|
||||||
import playerBarrageScreen from "@/components/VideoPlayer/player-barrage-screen.vue";
|
import playerBarrageScreen from "@/components/VideoPlayer/player-barrage-screen.vue";
|
||||||
|
import { mapGetters, mapMutations } from 'vuex';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "barrage-videoplayer",
|
name: "barrage-videoplayer",
|
||||||
@@ -301,10 +328,15 @@ export default {
|
|||||||
fullTimeFormat: "00:00:00", // 视频总长度的文字
|
fullTimeFormat: "00:00:00", // 视频总长度的文字
|
||||||
barrageTimelineStart: 0, // 弹幕时间轴的起始时间点(手动调整进度条触发更新)
|
barrageTimelineStart: 0, // 弹幕时间轴的起始时间点(手动调整进度条触发更新)
|
||||||
isInit:false, // 是否初始化过
|
isInit:false, // 是否初始化过
|
||||||
|
isSubtitle:false, // 是否开启字幕
|
||||||
|
currentLangLabel:'', // 当前字幕语言
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
...mapGetters(['selectableLang','currentLang'])
|
||||||
|
},
|
||||||
created() {
|
created() {
|
||||||
|
this.SET_currentLang('');
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.videoDom = this.$refs.video;
|
this.videoDom = this.$refs.video;
|
||||||
@@ -411,6 +443,9 @@ export default {
|
|||||||
// });
|
// });
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
...mapMutations({
|
||||||
|
SET_currentLang: 'video/SET_currentLang',
|
||||||
|
}),
|
||||||
//当视频由于需要缓冲下一帧而停止,解决一直计时的问题
|
//当视频由于需要缓冲下一帧而停止,解决一直计时的问题
|
||||||
onWaiting(){
|
onWaiting(){
|
||||||
console.log('触发了onWairing');
|
console.log('触发了onWairing');
|
||||||
@@ -641,9 +676,16 @@ export default {
|
|||||||
this.$emit('onFullscreen',false);//全屏
|
this.$emit('onFullscreen',false);//全屏
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
}
|
* 切换字幕语言
|
||||||
|
*/
|
||||||
|
changeLang(item) {
|
||||||
|
this.SET_currentLang(item.srclang);
|
||||||
|
this.currentLangLabel = item.label;
|
||||||
|
this.$emit('onLangChange', item.srclang);
|
||||||
|
},
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
currentVolume: function () {
|
currentVolume: function () {
|
||||||
@@ -907,6 +949,12 @@ export default {
|
|||||||
color: #fff;
|
color: #fff;
|
||||||
margin-bottom: 0.5rem;
|
margin-bottom: 0.5rem;
|
||||||
}
|
}
|
||||||
|
.box-aiTranslate{
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 0.4rem;
|
||||||
|
}
|
||||||
@media (device-width: 100vw) {
|
@media (device-width: 100vw) {
|
||||||
.player-controls-btn .player-controls-icon {
|
.player-controls-btn .player-controls-icon {
|
||||||
/* height: 26px; */
|
/* height: 26px; */
|
||||||
|
|||||||
@@ -28,5 +28,8 @@ const getters = {
|
|||||||
studyTaskCount:state => state.user.studyTaskCount,
|
studyTaskCount:state => state.user.studyTaskCount,
|
||||||
praisesUnicom:state =>state.pdf.praisesUnicom,
|
praisesUnicom:state =>state.pdf.praisesUnicom,
|
||||||
favoritesUnicom:state =>state.pdf.favoritesUnicom,
|
favoritesUnicom:state =>state.pdf.favoritesUnicom,
|
||||||
|
selectAllLang:state => state.video.selectAllLang,
|
||||||
|
selectableLang:state => state.video.selectableLang,
|
||||||
|
currentLang:state => state.video.currentLang,
|
||||||
}
|
}
|
||||||
export default getters
|
export default getters
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import resOwner from './modules/resOwner'
|
|||||||
import majorType from './modules/majorType'
|
import majorType from './modules/majorType'
|
||||||
import orgDomain from './modules/orgDomain'
|
import orgDomain from './modules/orgDomain'
|
||||||
import pdf from './modules/pdf'
|
import pdf from './modules/pdf'
|
||||||
|
import video from './modules/video'
|
||||||
|
|
||||||
Vue.use(Vuex)
|
Vue.use(Vuex)
|
||||||
|
|
||||||
@@ -27,7 +28,8 @@ const store = new Vuex.Store({
|
|||||||
resOwner,
|
resOwner,
|
||||||
majorType,
|
majorType,
|
||||||
orgDomain,
|
orgDomain,
|
||||||
pdf
|
pdf,
|
||||||
|
video
|
||||||
},
|
},
|
||||||
getters
|
getters
|
||||||
})
|
})
|
||||||
|
|||||||
121
src/store/modules/video.js
Normal file
121
src/store/modules/video.js
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
|
||||||
|
const state = {
|
||||||
|
selectAllLang: [
|
||||||
|
{
|
||||||
|
key: 'ZH_CN',
|
||||||
|
srclang: 'zh-CN',
|
||||||
|
label: '中文',
|
||||||
|
name: '中文',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'EN_US',
|
||||||
|
srclang: 'en-US',
|
||||||
|
label: '英语',
|
||||||
|
name: 'English',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'JA_JP',
|
||||||
|
srclang: 'ja-JP',
|
||||||
|
label: '日语',
|
||||||
|
name: '日本語',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'KO_KR',
|
||||||
|
srclang: 'ko-KR',
|
||||||
|
label: '韩语',
|
||||||
|
name: '한국어',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'FR_FR',
|
||||||
|
srclang: 'fr-FR',
|
||||||
|
label: '法语',
|
||||||
|
name: 'français',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'DE_DE',
|
||||||
|
srclang: 'de-DE',
|
||||||
|
label: '德语',
|
||||||
|
name: 'Deutsch',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'ES_ES',
|
||||||
|
srclang: 'es-ES',
|
||||||
|
label: '西班牙语',
|
||||||
|
name: 'español',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'RU_RU',
|
||||||
|
srclang: 'ru-RU',
|
||||||
|
label: '俄语',
|
||||||
|
name: 'русский',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'PT_BR',
|
||||||
|
srclang: 'pt-BR',
|
||||||
|
label: '葡萄牙语',
|
||||||
|
name: 'português',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'IT_IT',
|
||||||
|
srclang: 'it-IT',
|
||||||
|
label: '意大利语',
|
||||||
|
name: 'italiano',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'AR_SA',
|
||||||
|
srclang: 'ar-SA',
|
||||||
|
label: '阿拉伯语',
|
||||||
|
name: 'العربية',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'TH_TH',
|
||||||
|
srclang: 'th-TH',
|
||||||
|
label: '泰语',
|
||||||
|
name: 'ไทย',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'VI_VN',
|
||||||
|
srclang: 'vi-VN',
|
||||||
|
label: '越南语',
|
||||||
|
name: 'tiếng Việt',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'ID_ID',
|
||||||
|
srclang: 'id-ID',
|
||||||
|
label: '印度尼西亚语',
|
||||||
|
name: 'Bahasa Indonesia',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'HI_IN',
|
||||||
|
srclang: 'hi-IN',
|
||||||
|
label: '印地语',
|
||||||
|
name: 'हिन्दी',
|
||||||
|
}
|
||||||
|
], // 全部语言列表
|
||||||
|
selectableLang: [],
|
||||||
|
currentLang: '',
|
||||||
|
favoritesUnicom: false,
|
||||||
|
}
|
||||||
|
|
||||||
|
const mutations = {
|
||||||
|
SET_currentLang: (state, lang) => {
|
||||||
|
state.currentLang = lang
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
const actions = {
|
||||||
|
unicomPraises({ commit }, data) {
|
||||||
|
commit('SET_praisesUnicom', data)
|
||||||
|
},
|
||||||
|
unicomFavorites({ commit }, data) {
|
||||||
|
commit('SET_favoritesUnicom', data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default {
|
||||||
|
namespaced: true,
|
||||||
|
state,
|
||||||
|
mutations,
|
||||||
|
actions
|
||||||
|
}
|
||||||
|
|
||||||
@@ -64,97 +64,101 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<el-row :gutter="20" style="margin-top:10px">
|
<el-row :gutter="20" style="margin-top:10px">
|
||||||
<el-col :span="4">
|
<el-col :span="24">
|
||||||
<!-- <el-button icon="el-icon-folder" type="primary" size="small">导出</el-button> -->
|
<!-- <el-button icon="el-icon-folder" type="primary" size="small">导出</el-button> -->
|
||||||
<el-button class="Create-coures" type="primary" @click="addNewCourse()" icon="el-icon-plus">新建课程</el-button>
|
<el-button class="Create-coures" type="primary" @click="addNewCourse()" icon="el-icon-plus">新建课程</el-button>
|
||||||
|
<el-button type="primary" @click="setLanguage()" icon="el-icon-connection" :disabled="selectedCourses.length === 0">设置语种</el-button>
|
||||||
|
<el-button type="primary" @click="enableAI()" icon="el-icon-switch-button" :disabled="selectedCourses.length === 0">开启AI处理</el-button>
|
||||||
</el-col >
|
</el-col >
|
||||||
</el-row>
|
</el-row>
|
||||||
</div>
|
</div>
|
||||||
<div style="margin-right:30px;">
|
<div style="margin-right:30px;">
|
||||||
<el-table style="margin:10px 32px 10px 22px;" :data="pageData" border stripe>
|
<el-table style="margin:10px 32px 10px 22px;" :data="pageData" border stripe @selection-change="handleSelectionChange">
|
||||||
<el-table-column label="序号" type="index" width="50"></el-table-column>
|
<el-table-column type="selection" width="55"></el-table-column>
|
||||||
<el-table-column v-if="forChoose" label="选择" width="80">
|
<el-table-column label="序号" type="index" width="50"></el-table-column>
|
||||||
<template slot-scope="scope" v-if="scope.row.published">
|
<el-table-column v-if="forChoose" label="选择" width="80">
|
||||||
<el-button type="default" size="mini" @click="handleChoose(scope.row)">选择</el-button>
|
<template slot-scope="scope" v-if="scope.row.published">
|
||||||
</template>
|
<el-button type="default" size="mini" @click="handleChoose(scope.row)">选择</el-button>
|
||||||
</el-table-column>
|
</template>
|
||||||
<el-table-column label="名称" prop="name" width="200" show-overflow-tooltip>
|
</el-table-column>
|
||||||
<template slot-scope="scope">
|
<el-table-column label="名称" prop="name" width="200" show-overflow-tooltip>
|
||||||
<span class="previewStyle" @click="viewTopic(scope.row)">{{ scope.row.name }}</span>
|
<template slot-scope="scope">
|
||||||
</template>
|
<span class="previewStyle" @click="viewTopic(scope.row)">{{ scope.row.name }}</span>
|
||||||
</el-table-column>
|
</template>
|
||||||
<el-table-column label="内容分类" prop="sysType" sortable width="240px">
|
</el-table-column>
|
||||||
<template slot-scope="scope">
|
<el-table-column label="内容分类" prop="sysType" sortable width="240px">
|
||||||
<span>{{sysTypeName(scope.row.sysType1)}}</span>
|
<template slot-scope="scope">
|
||||||
<span v-if="scope.row.sysType2 !=''">/{{sysTypeName(scope.row.sysType2)}}</span>
|
<span>{{sysTypeName(scope.row.sysType1)}}</span>
|
||||||
<span v-if="scope.row.sysType3 !=''">/{{sysTypeName(scope.row.sysType3)}}</span>
|
<span v-if="scope.row.sysType2 !=''">/{{sysTypeName(scope.row.sysType2)}}</span>
|
||||||
</template>
|
<span v-if="scope.row.sysType3 !=''">/{{sysTypeName(scope.row.sysType3)}}</span>
|
||||||
</el-table-column>
|
</template>
|
||||||
<el-table-column label="关键字" :show-overflow-tooltip="true" prop="name" width="200px">
|
</el-table-column>
|
||||||
<template slot-scope="scope">
|
<el-table-column label="关键字" :show-overflow-tooltip="true" prop="name" width="200px">
|
||||||
{{ scope.row.keywords }}
|
<template slot-scope="scope">
|
||||||
</template>
|
{{ scope.row.keywords }}
|
||||||
</el-table-column>
|
</template>
|
||||||
<!-- <el-table-column label="资源归属" sortable prop="author" width="240px">
|
</el-table-column>
|
||||||
<template slot-scope="scope">
|
<!-- <el-table-column label="资源归属" sortable prop="author" width="240px">
|
||||||
<span>{{resOwnerName(scope.row.resOwner1)}}</span>
|
<template slot-scope="scope">
|
||||||
<span v-if="scope.row.resOwner2 != ''">/{{resOwnerName(scope.row.resOwner2)}}</span>
|
<span>{{resOwnerName(scope.row.resOwner1)}}</span>
|
||||||
<span v-if="scope.row.resOwner3 != ''">/{{resOwnerName(scope.row.resOwner3)}}</span>
|
<span v-if="scope.row.resOwner2 != ''">/{{resOwnerName(scope.row.resOwner2)}}</span>
|
||||||
</template>
|
<span v-if="scope.row.resOwner3 != ''">/{{resOwnerName(scope.row.resOwner3)}}</span>
|
||||||
</el-table-column> -->
|
</template>
|
||||||
<!-- <el-table-column label="授课方式" prop="type" width="120px">
|
</el-table-column> -->
|
||||||
<template slot-scope="scope">
|
<!-- <el-table-column label="授课方式" prop="type" width="120px">
|
||||||
{{ courseType(scope.row.type)}}
|
<template slot-scope="scope">
|
||||||
</template>
|
{{ courseType(scope.row.type)}}
|
||||||
</el-table-column> -->
|
</template>
|
||||||
<el-table-column label="状态" prop="status" width="120px">
|
</el-table-column> -->
|
||||||
<template slot-scope="scope">
|
<el-table-column label="状态" prop="status" width="120px">
|
||||||
<!-- 1,未提交 2.已提交 = 未审核 5 已审核 -->
|
<template slot-scope="scope">
|
||||||
<span v-if="scope.row.status == 1">未提交</span>
|
<!-- 1,未提交 2.已提交 = 未审核 5 已审核 -->
|
||||||
<span v-if="scope.row.status == 2">待审核</span>
|
<span v-if="scope.row.status == 1">未提交</span>
|
||||||
<span v-if="scope.row.status == 5">已审核</span>
|
<span v-if="scope.row.status == 2">待审核</span>
|
||||||
<span v-if="scope.row.status == 3">审核未通过</span>
|
<span v-if="scope.row.status == 5">已审核</span>
|
||||||
</template>
|
<span v-if="scope.row.status == 3">审核未通过</span>
|
||||||
</el-table-column>
|
</template>
|
||||||
<el-table-column label="是否发布" width="130px">
|
</el-table-column>
|
||||||
<template slot-scope="scope">
|
<el-table-column label="是否发布" width="130px">
|
||||||
{{ scope.row.published == true ? '已发布' : '未发布' }}
|
<template slot-scope="scope">
|
||||||
</template>
|
{{ scope.row.published == true ? '已发布' : '未发布' }}
|
||||||
</el-table-column>
|
</template>
|
||||||
<el-table-column label="创建人" prop="sysCreateBy"></el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="创建时间" prop="sysCreateTime" width="230px" show-overflow-tooltip></el-table-column>
|
<el-table-column label="创建人" prop="sysCreateBy"></el-table-column>
|
||||||
<el-table-column label="是否停用" width="130px">
|
<el-table-column label="创建时间" prop="sysCreateTime" width="230px" show-overflow-tooltip></el-table-column>
|
||||||
<template slot-scope="scope">
|
<el-table-column label="是否停用" width="130px">
|
||||||
{{ scope.row.enabled == true ? '启用' : '停用' }}
|
<template slot-scope="scope">
|
||||||
</template>
|
{{ scope.row.enabled == true ? '启用' : '停用' }}
|
||||||
</el-table-column>
|
</template>
|
||||||
<el-table-column label="是否置顶" width="130px">
|
</el-table-column>
|
||||||
<template slot-scope="scope">
|
<el-table-column label="是否置顶" width="130px">
|
||||||
{{ scope.row.isTop == true ? '置顶' : '未置顶' }}
|
<template slot-scope="scope">
|
||||||
</template>
|
{{ scope.row.isTop == true ? '置顶' : '未置顶' }}
|
||||||
</el-table-column>
|
</template>
|
||||||
<el-table-column label="操作" width="180px" fixed="right">
|
</el-table-column>
|
||||||
<template slot-scope="scope" class="btn-gl">
|
<el-table-column label="操作" width="180px" fixed="right">
|
||||||
<!-- 20240621 修改scope.row.isPermission = fasle 时不展示操作按钮-->
|
<template slot-scope="scope" class="btn-gl">
|
||||||
<el-button type="text" size="mini" v-if="scope.row.isPermission && scope.row.status == 5 && !scope.row.published" @click="releaseData(scope.row)">发布</el-button>
|
<!-- 20240621 修改scope.row.isPermission = fasle 时不展示操作按钮-->
|
||||||
<el-button v-if="scope.row.isPermission && pageManage && scope.row.published" @click="showStudent(scope.row)" type="text" size="mini">学员</el-button>
|
<el-button v-if="scope.row.isPermission && scope.row.status != 2" type="text" size="mini" @click="setAI(scope.row)">AI设置</el-button>
|
||||||
<el-button v-if="scope.row.isPermission && !forChoose && scope.row.published" @click="showManageStudy(scope.row)" type="text" size="mini">管理</el-button>
|
<el-button type="text" size="mini" v-if="scope.row.isPermission && scope.row.status == 5 && !scope.row.published" @click="releaseData(scope.row)">发布</el-button>
|
||||||
<el-button v-if="scope.row.isPermission && !forChoose && scope.row.status == 2" @click="withdraw(scope.row)" type="text" size="mini">撤回</el-button>
|
<el-button v-if="scope.row.isPermission && pageManage && scope.row.published" @click="showStudent(scope.row)" type="text" size="mini">学员</el-button>
|
||||||
<el-button v-if="scope.row.isPermission && scope.row.status != 2" type="text" size="mini" @click="editCurriculum(scope.row)">编辑</el-button>
|
<el-button v-if="scope.row.isPermission && !forChoose && scope.row.published" @click="showManageStudy(scope.row)" type="text" size="mini">管理</el-button>
|
||||||
<el-button v-if="scope.row.isPermission && (scope.row.status != 2 && !scope.row.published) || scope.row.isPermission &&!scope.row.enabled" type="text" size="mini" @click="delItem(scope.row)">删除</el-button>
|
<el-button v-if="scope.row.isPermission && !forChoose && scope.row.status == 2" @click="withdraw(scope.row)" type="text" size="mini">撤回</el-button>
|
||||||
<el-dropdown v-if="scope.row.isPermission && scope.row.published" type="text" size="mini" style="margin-left:10px">
|
<el-button v-if="scope.row.isPermission && scope.row.status != 2" type="text" size="mini" @click="editCurriculum(scope.row)">编辑</el-button>
|
||||||
<el-button type="text" size="mini">更多<i class="el-icon-arrow-down el-icon--right"></i></el-button>
|
<el-button v-if="scope.row.isPermission && (scope.row.status != 2 && !scope.row.published) || scope.row.isPermission &&!scope.row.enabled" type="text" size="mini" @click="delItem(scope.row)">删除</el-button>
|
||||||
<el-dropdown-menu slot="dropdown">
|
<el-dropdown v-if="scope.row.isPermission && scope.row.published" type="text" size="mini" style="margin-left:10px">
|
||||||
<el-dropdown-item @click.native="copyCourse(scope.row)">复制</el-dropdown-item>
|
<el-button type="text" size="mini">更多<i class="el-icon-arrow-down el-icon--right"></i></el-button>
|
||||||
<el-dropdown-item v-if="scope.row.published" @click.native="isDisable(scope.row)">{{scope.row.enabled? '停用':'启用'}}</el-dropdown-item>
|
<el-dropdown-menu slot="dropdown">
|
||||||
<el-dropdown-item v-if="scope.row.published" @click.native="showQrimage(scope.row)">二维码</el-dropdown-item><!--发布之后才可以查看二维码-->
|
<el-dropdown-item @click.native="copyCourse(scope.row)">复制</el-dropdown-item>
|
||||||
<el-dropdown-item v-if="scope.row.published" @click.native="setTop(scope.row)">{{scope.row.isTop? '取消置顶':'置顶'}}</el-dropdown-item>
|
<el-dropdown-item v-if="scope.row.published" @click.native="isDisable(scope.row)">{{scope.row.enabled? '停用':'启用'}}</el-dropdown-item>
|
||||||
|
<el-dropdown-item v-if="scope.row.published" @click.native="showQrimage(scope.row)">二维码</el-dropdown-item><!--发布之后才可以查看二维码-->
|
||||||
|
<el-dropdown-item v-if="scope.row.published" @click.native="setTop(scope.row)">{{scope.row.isTop? '取消置顶':'置顶'}}</el-dropdown-item>
|
||||||
|
|
||||||
</el-dropdown-menu>
|
</el-dropdown-menu>
|
||||||
</el-dropdown>
|
</el-dropdown>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
@@ -287,6 +291,204 @@
|
|||||||
<div>
|
<div>
|
||||||
<course-form ref="courseForm" @submitSuccess="searchData" @close="searchData"></course-form>
|
<course-form ref="courseForm" @submitSuccess="searchData" @close="searchData"></course-form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- 设置语种弹框 -->
|
||||||
|
<el-dialog
|
||||||
|
title="AI翻译"
|
||||||
|
:visible.sync="languageSetting.dlgShow"
|
||||||
|
width="500px"
|
||||||
|
:close-on-click-modal="false"
|
||||||
|
>
|
||||||
|
<div style="margin-bottom: 20px;">
|
||||||
|
<div style="margin-bottom: 15px;">请选择课程所支持语种</div>
|
||||||
|
<el-select
|
||||||
|
v-model="languageSetting.selectedLanguages"
|
||||||
|
multiple
|
||||||
|
placeholder="请选择语种"
|
||||||
|
style="width: 100%;"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="lang in selectAllLang"
|
||||||
|
:key="lang.srclang"
|
||||||
|
:label="lang.label"
|
||||||
|
:value="lang.srclang"
|
||||||
|
></el-option>
|
||||||
|
</el-select>
|
||||||
|
</div>
|
||||||
|
<div style="color: #ff4d4f; font-size: 12px;">
|
||||||
|
注:仅支持对已开启AI处理的课程进行批量语种设置;所选的课程中已超过X个未开启AI处理的课程,以上配置仅对X个已开启AI处理的课程生效。
|
||||||
|
</div>
|
||||||
|
<template #footer>
|
||||||
|
<el-button @click="languageSetting.dlgShow = false">取消</el-button>
|
||||||
|
<el-button type="primary" @click="confirmLanguageSetting">确认</el-button>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
|
|
||||||
|
<!-- 开启AI处理弹框 -->
|
||||||
|
<el-dialog
|
||||||
|
title="开启AI处理"
|
||||||
|
:visible.sync="aiProcessSetting.dlgShow"
|
||||||
|
width="500px"
|
||||||
|
>
|
||||||
|
<div class="ai-process-dialog">
|
||||||
|
<!-- AI处理状态 -->
|
||||||
|
<div class="form-item">
|
||||||
|
<span class="form-label">
|
||||||
|
<el-tooltip class="item" effect="dark" content="是否将课程进行AI处理" placement="top">
|
||||||
|
<i class="el-icon-question"></i>
|
||||||
|
</el-tooltip>
|
||||||
|
AI处理状态:</span>
|
||||||
|
<span class="status-text">
|
||||||
|
{{ aiProcessSetting.aiSet === '1' ? '已开启' : '已关闭' }}
|
||||||
|
</span>
|
||||||
|
<el-switch
|
||||||
|
v-model="aiProcessSetting.aiSet"
|
||||||
|
active-value="1"
|
||||||
|
inactive-value="0"
|
||||||
|
></el-switch>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<!-- 是否生成AI摘要 -->
|
||||||
|
<div class="form-item">
|
||||||
|
<span class="form-label">是否需要生成AI摘要:</span>
|
||||||
|
<el-radio-group v-model="aiProcessSetting.aiAbstract" class="radio-group">
|
||||||
|
<el-radio label="1">是</el-radio>
|
||||||
|
<el-radio label="0">否</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 是否生成AI文稿 -->
|
||||||
|
<div class="form-item">
|
||||||
|
<span class="form-label">是否需要生成AI文稿:</span>
|
||||||
|
<el-radio-group v-model="aiProcessSetting.aiDraft" class="radio-group">
|
||||||
|
<el-radio label="1">是</el-radio>
|
||||||
|
<el-radio label="0">否</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 课程支持语种选择 -->
|
||||||
|
<div class="form-item" style="flex-flow: column;align-items: baseline;">
|
||||||
|
<span class="form-label">请选择该课程所支持语种:</span>
|
||||||
|
<el-select
|
||||||
|
v-model="aiProcessSetting.languageCode"
|
||||||
|
multiple
|
||||||
|
style="width: calc(100% - 135px);"
|
||||||
|
placeholder="请选择语种"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="lang in selectAllLang"
|
||||||
|
:key="lang.srclang"
|
||||||
|
:label="lang.label"
|
||||||
|
:value="lang.srclang"
|
||||||
|
></el-option>
|
||||||
|
</el-select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 提示信息 -->
|
||||||
|
<div class="tips">
|
||||||
|
<span>注:已跳过x个已开启AI处理的课程,仅更新剩余x个</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<span slot="footer" class="dialog-footer">
|
||||||
|
<el-button @click="aiProcessSetting.dlgShow = false">取消</el-button>
|
||||||
|
<el-button type="primary" @click="confirmAiProcess">确认</el-button>
|
||||||
|
</span>
|
||||||
|
</el-dialog>
|
||||||
|
|
||||||
|
<!-- AI设置弹框 -->
|
||||||
|
<el-dialog
|
||||||
|
title="AI设置"
|
||||||
|
:visible.sync="aiSetting.dlgShow"
|
||||||
|
width="500px"
|
||||||
|
>
|
||||||
|
<div class="ai-setting-dialog">
|
||||||
|
|
||||||
|
<!-- AI功能状态 -->
|
||||||
|
<div class="form-item">
|
||||||
|
<span class="form-label">
|
||||||
|
<el-tooltip class="item" effect="dark" content="是否将课程进行AI处理" placement="top">
|
||||||
|
<i class="el-icon-question"></i>
|
||||||
|
</el-tooltip>
|
||||||
|
AI功能状态:
|
||||||
|
</span>
|
||||||
|
<span class="status-text">
|
||||||
|
{{ aiSetting.aiSet === '1' ? '已开放' : '未开放' }}
|
||||||
|
</span>
|
||||||
|
<el-switch
|
||||||
|
v-model="aiSetting.aiSet"
|
||||||
|
active-value="1"
|
||||||
|
inactive-value="0"
|
||||||
|
></el-switch>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- AI摘要状态 -->
|
||||||
|
<div class="form-item">
|
||||||
|
<span class="form-label">AI摘要状态:</span>
|
||||||
|
<span class="status-badge" :class="{'status-badge--active': aiSetting.aiAbstract === '1'}">
|
||||||
|
{{ aiSetting.aiAbstract === '1' ? '已上架' : '已下架' }}
|
||||||
|
</span>
|
||||||
|
<div class="action-buttons">
|
||||||
|
<el-button type="text" @click="aiSetting.aiAbstract = '0'">
|
||||||
|
{{ aiSetting.aiAbstract === '0' ? '上架' : '下架' }}
|
||||||
|
</el-button>
|
||||||
|
<el-button type="text" >编辑</el-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- AI文稿状态 -->
|
||||||
|
<div class="form-item">
|
||||||
|
<span class="form-label">AI文稿状态:</span>
|
||||||
|
<span class="status-badge" :class="{'status-badge--active': aiSetting.aiDraft === '1'}">
|
||||||
|
{{ aiSetting.aiDraft === '1' ? '已上架' : '已下架' }}
|
||||||
|
</span>
|
||||||
|
<div class="action-buttons">
|
||||||
|
<el-button type="text" @click="aiSetting.aiDraft = '0'">
|
||||||
|
{{ aiSetting.aiDraft === '0' ? '上架' : '下架' }}
|
||||||
|
</el-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- AI翻译状态 -->
|
||||||
|
<div class="form-item">
|
||||||
|
<span class="form-label">AI翻译状态:</span>
|
||||||
|
<span class="status-badge" :class="{'status-badge--active': aiSetting.aiTranslate === '1'}">
|
||||||
|
{{ aiSetting.aiTranslate === '1' ? '已上架' : '已下架' }}
|
||||||
|
</span>
|
||||||
|
<div class="action-buttons">
|
||||||
|
<el-button type="text" @click="aiSetting.aiTranslate = '0'">
|
||||||
|
{{ aiSetting.aiTranslate === '0' ? '上架' : '下架' }}
|
||||||
|
</el-button>
|
||||||
|
<el-button type="text" >编辑</el-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 支持语种 -->
|
||||||
|
<div class="form-item">
|
||||||
|
<span class="form-label">支持语种:</span>
|
||||||
|
<div class="languages-list">
|
||||||
|
<div class="language-tag">
|
||||||
|
中文
|
||||||
|
<span class="status-badge">已下架</span>
|
||||||
|
</div>
|
||||||
|
<div class="language-tag">
|
||||||
|
英语
|
||||||
|
<span class="status-badge">生成中</span>
|
||||||
|
</div>
|
||||||
|
<div class="language-tag">
|
||||||
|
越南语
|
||||||
|
<span class="status-badge status-badge--active">已上架</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<span slot="footer" class="dialog-footer">
|
||||||
|
<el-button @click="aiSetting.dlgShow = false">取消</el-button>
|
||||||
|
<el-button type="primary" @click="confirmAISetting">确认</el-button>
|
||||||
|
</span>
|
||||||
|
</el-dialog>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -308,7 +510,7 @@ export default {
|
|||||||
name: 'manageCourse',
|
name: 'manageCourse',
|
||||||
components: {courseForm, manager, auditCourse1, auditCourse2,adminPage},
|
components: {courseForm, manager, auditCourse1, auditCourse2,adminPage},
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters(['resOwnerMap','sysTypeMap','userInfo']),
|
...mapGetters(['resOwnerMap','sysTypeMap','userInfo', 'selectAllLang']),
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@@ -392,6 +594,27 @@ export default {
|
|||||||
},
|
},
|
||||||
extendRefId:'',
|
extendRefId:'',
|
||||||
extendRefType:'',
|
extendRefType:'',
|
||||||
|
selectedCourses: [], //已选课程
|
||||||
|
languageSetting: {
|
||||||
|
dlgShow: false,
|
||||||
|
languageCode: ['zh-CN', 'en-US'] // 默认选中的语种
|
||||||
|
},
|
||||||
|
aiProcessSetting: {
|
||||||
|
dlgShow: false,
|
||||||
|
aiSet: '1',
|
||||||
|
aiAbstract: '1',
|
||||||
|
aiDraft: '1',
|
||||||
|
languageCode: ['zh-CN', 'en-US'] // 默认选中的语种
|
||||||
|
},
|
||||||
|
aiSetting: {
|
||||||
|
dlgShow: false,
|
||||||
|
courseId: '',
|
||||||
|
aiSet: '1',
|
||||||
|
aiAbstract: '1', // 1:上架 0:下架
|
||||||
|
aiDraft: '1', // 1:上架 0:下架
|
||||||
|
aiTranslate: '1', // 1:上架 0:下架
|
||||||
|
languageCode: ['zh-CN', 'en-US', 'vi-VN'] // 支持的语种
|
||||||
|
}
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
@@ -438,6 +661,9 @@ export default {
|
|||||||
//出现学员管理
|
//出现学员管理
|
||||||
window.parent.openSelectStu(row);
|
window.parent.openSelectStu(row);
|
||||||
},
|
},
|
||||||
|
handleSelectionChange(val){
|
||||||
|
this.selectedCourses = val;
|
||||||
|
},
|
||||||
handleChoose(row){ //选择课程
|
handleChoose(row){ //选择课程
|
||||||
window.parent.selectCourse(row);
|
window.parent.selectCourse(row);
|
||||||
},
|
},
|
||||||
@@ -449,6 +675,32 @@ export default {
|
|||||||
inputOn() {
|
inputOn() {
|
||||||
this.$forceUpdate();
|
this.$forceUpdate();
|
||||||
},
|
},
|
||||||
|
// AI设置
|
||||||
|
setAI(row) {
|
||||||
|
this.aiSetting.courseId = row.id;
|
||||||
|
// 这里可以添加获取当前课程AI设置的逻辑
|
||||||
|
this.aiSetting.dlgShow = true;
|
||||||
|
},
|
||||||
|
|
||||||
|
// 确认AI设置
|
||||||
|
confirmAISetting() {
|
||||||
|
const { courseId, aiSet, aiAbstract, aiDraft, aiTranslate } = this.aiSetting;
|
||||||
|
|
||||||
|
// 这里可以添加保存AI设置的API调用
|
||||||
|
console.log('保存AI设置', {
|
||||||
|
courseId,
|
||||||
|
aiSet,
|
||||||
|
aiAbstract,
|
||||||
|
aiDraft,
|
||||||
|
aiTranslate
|
||||||
|
});
|
||||||
|
|
||||||
|
// 模拟成功保存
|
||||||
|
this.$message.success('AI设置保存成功');
|
||||||
|
this.aiSetting.dlgShow = false;
|
||||||
|
// 可以选择是否刷新列表数据
|
||||||
|
},
|
||||||
|
|
||||||
// 置顶
|
// 置顶
|
||||||
setTop(row) {
|
setTop(row) {
|
||||||
let params = {
|
let params = {
|
||||||
@@ -837,6 +1089,92 @@ export default {
|
|||||||
// }
|
// }
|
||||||
// this.$message({ message: msg, type: 'success', offset: 50 });
|
// this.$message({ message: msg, type: 'success', offset: 50 });
|
||||||
// },
|
// },
|
||||||
|
setLanguage() {
|
||||||
|
if (this.selectedCourses.length > 0) {
|
||||||
|
this.languageSetting.dlgShow = true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
enableAI() {
|
||||||
|
// 开启AI处理按钮点击事件
|
||||||
|
if (this.selectedCourses.length > 0) {
|
||||||
|
this.aiProcessSetting.dlgShow = true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
async confirmLanguageSetting() {
|
||||||
|
try {
|
||||||
|
// 收集选中的课程ID
|
||||||
|
const courseIds = this.selectedCourses.map(course => course.id).join(',');
|
||||||
|
// 获取选择的语种
|
||||||
|
const languages = this.languageSetting.selectedLanguages.join(',');
|
||||||
|
|
||||||
|
// 这里可以根据实际需求调用API进行语种设置
|
||||||
|
console.log('批量设置课程语种', { courseIds, languages });
|
||||||
|
|
||||||
|
// 显示成功提示
|
||||||
|
this.$message({
|
||||||
|
type: 'success',
|
||||||
|
message: `已成功为${this.selectedCourses.length}个课程设置语种`,
|
||||||
|
offset: 50
|
||||||
|
});
|
||||||
|
|
||||||
|
// 关闭弹框
|
||||||
|
this.languageSetting.dlgShow = false;
|
||||||
|
|
||||||
|
// 刷新数据(如果需要)
|
||||||
|
// this.searchData();
|
||||||
|
} catch (error) {
|
||||||
|
console.error('设置语种失败', error);
|
||||||
|
this.$message({
|
||||||
|
type: 'error',
|
||||||
|
message: '设置语种失败,请稍后重试',
|
||||||
|
offset: 50
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async confirmAiProcess() {
|
||||||
|
try {
|
||||||
|
// 收集选中的课程ID
|
||||||
|
const courseIds = this.selectedCourses.map(course => course.id).join(',');
|
||||||
|
// 获取AI处理配置
|
||||||
|
const { aiSet, aiAbstract, aiDraft, selectedLanguages } = this.aiProcessSetting;
|
||||||
|
|
||||||
|
// 这里可以根据实际需求调用API进行AI处理设置
|
||||||
|
console.log('批量开启AI处理', {
|
||||||
|
courseIds,
|
||||||
|
aiSet,
|
||||||
|
aiAbstract,
|
||||||
|
aiDraft,
|
||||||
|
languages: selectedLanguages.join(',')
|
||||||
|
});
|
||||||
|
|
||||||
|
// 模拟计算跳过和更新的课程数量
|
||||||
|
const totalCourses = this.selectedCourses.length;
|
||||||
|
const skippedCount = Math.floor(totalCourses * 0.2); // 假设20%的课程已开启AI处理
|
||||||
|
const updatedCount = totalCourses - skippedCount;
|
||||||
|
|
||||||
|
// 显示成功提示
|
||||||
|
this.$message({
|
||||||
|
type: 'success',
|
||||||
|
message: `已跳过${skippedCount}个已开启AI处理的课程,成功为${updatedCount}个课程更新AI处理设置`,
|
||||||
|
offset: 50
|
||||||
|
});
|
||||||
|
|
||||||
|
// 关闭弹框
|
||||||
|
this.aiProcessSetting.dlgShow = false;
|
||||||
|
|
||||||
|
// 刷新数据
|
||||||
|
this.searchData();
|
||||||
|
} catch (error) {
|
||||||
|
console.error('开启AI处理失败', error);
|
||||||
|
this.$message({
|
||||||
|
type: 'error',
|
||||||
|
message: '开启AI处理失败,请稍后重试',
|
||||||
|
offset: 50
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
delItem(row) {
|
delItem(row) {
|
||||||
this.$confirm('您确定要删除所选课程吗?', '删除提示', {
|
this.$confirm('您确定要删除所选课程吗?', '删除提示', {
|
||||||
confirmButtonText: '确定',
|
confirmButtonText: '确定',
|
||||||
@@ -953,4 +1291,38 @@ export default {
|
|||||||
.el-dialog__body {
|
.el-dialog__body {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.form-item{
|
||||||
|
margin-bottom: 15px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 5px;
|
||||||
|
}
|
||||||
|
.tips {
|
||||||
|
color: #f56c6c;
|
||||||
|
font-size: 12px;
|
||||||
|
margin: 10px 0;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
.status-badge{
|
||||||
|
display: inline-block;
|
||||||
|
padding: 3px 13px;
|
||||||
|
border-radius: 20px;
|
||||||
|
font-size: 12px;
|
||||||
|
background: rgba(254, 249, 195, 1);
|
||||||
|
color: rgba(133, 77, 14, 1);
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 500;
|
||||||
|
line-height: 17px;
|
||||||
|
letter-spacing: 0px;
|
||||||
|
}
|
||||||
|
.status-badge--active{
|
||||||
|
background: rgba(220, 252, 231, 1);
|
||||||
|
color: rgba(22, 101, 52, 1);
|
||||||
|
}
|
||||||
|
.languages-list{
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 20px;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user