From 69228821110dcd66dc544cee95a8f0e505cd9a48 Mon Sep 17 00:00:00 2001 From: huweihang Date: Mon, 22 Dec 2025 14:55:10 +0800 Subject: [PATCH] Merge branch '251114-feature-course-online' --- src/api/modules/course.js | 290 +- src/assets/images/course/courseAbstract.png | Bin 0 -> 8947 bytes src/assets/images/course/courseNew.png | Bin 0 -> 49237 bytes src/assets/images/course/generationFailed.png | Bin 0 -> 8669 bytes src/assets/images/course/languageIcon.png | Bin 0 -> 478 bytes src/assets/images/course/noData.png | Bin 0 -> 5076 bytes src/assets/images/course/selectLanguage.png | Bin 0 -> 8440 bytes src/assets/images/course/wengaoTip.png | Bin 0 -> 504 bytes src/assets/styles/btn.scss | 26 + src/components/Course/aiScript.vue | 439 ++ src/components/Course/courseForm.vue | 148 +- src/components/VideoPlayer/index.vue | 182 +- src/data/pages.js | 2 + src/security.js | 13 + src/store/getters.js | 7 + src/store/index.js | 4 +- src/store/modules/video.js | 171 + src/views/course/ManageList.vue | 611 ++- src/views/course/aiSet/aiAbstract.vue | 245 + src/views/course/aiSet/aiTranslate.vue | 388 ++ src/views/portal/course/Index.vue | 67 +- src/views/study/coursenew.vue | 4483 +++++++++-------- src/views/study/coursenew_v1.vue | 3118 ++++++++++++ 23 files changed, 7838 insertions(+), 2356 deletions(-) create mode 100644 src/assets/images/course/courseAbstract.png create mode 100644 src/assets/images/course/courseNew.png create mode 100644 src/assets/images/course/generationFailed.png create mode 100644 src/assets/images/course/languageIcon.png create mode 100644 src/assets/images/course/noData.png create mode 100644 src/assets/images/course/selectLanguage.png create mode 100644 src/assets/images/course/wengaoTip.png create mode 100644 src/components/Course/aiScript.vue create mode 100644 src/store/modules/video.js create mode 100644 src/views/course/aiSet/aiAbstract.vue create mode 100644 src/views/course/aiSet/aiTranslate.vue create mode 100644 src/views/study/coursenew_v1.vue diff --git a/src/api/modules/course.js b/src/api/modules/course.js index 39a88137..f76839c7 100644 --- a/src/api/modules/course.js +++ b/src/api/modules/course.js @@ -4,6 +4,7 @@ * **/ import ajax from '@/utils/xajax.js' +import ajax2 from '../unionAjax.js'; /** * 保存课程基本信息,新增和更新都是此方式 @@ -42,8 +43,8 @@ import ajax from '@/utils/xajax.js' ] } */ -const saveBase = function(data) { - return ajax.postJson('/xboe/m/course/manage/save', data); +const saveBase = function (data) { + return ajax.postJson('/xboe/m/course/manage/save', data); } @@ -52,39 +53,39 @@ const saveBase = function(data) { * 仅仅是保存课程信息,不包括教师信息 * @param {Object} data */ -const saveOnlyCourse = function(data) { - return ajax.postJson('/xboe/m/course/manage/save-only-course', data); +const saveOnlyCourse = function (data) { + return ajax.postJson('/xboe/m/course/manage/save-only-course', data); } /**提交课程*/ -const submitCourse = function(data) { - return ajax.postJson('/xboe/m/course/manage/submit', data); +const submitCourse = function (data) { + return ajax.postJson('/xboe/m/course/manage/submit', data); } /**撤销已提交审核的课程*/ -const revokeSubmit = function(id) { - return ajax.post('/xboe/m/course/manage/revoke', {id}); +const revokeSubmit = function (id) { + return ajax.post('/xboe/m/course/manage/revoke', { id }); } /** * 复制课程 * @param {Object} */ -const copyCourse = function(data) { - return ajax.post('/xboe/m/course/manage/copy',data); +const copyCourse = function (data) { + return ajax.post('/xboe/m/course/manage/copy', data); } /* 查询课程是否有重复名称 */ -const isRedoName=function(){ - return ajax.get('/xboe/m/course/manage/isRedoName'); +const isRedoName = function () { + return ajax.get('/xboe/m/course/manage/isRedoName'); } /* 查询当前添加课程是否已有 courseName 要添加的课程姓名 */ -const isCourseName=function(courseName,courseId){ - return ajax.get(`/xboe/m/course/manage/isCourseName?courseName=${courseName}&courseId=${courseId}`); +const isCourseName = function (courseName, courseId) { + return ajax.get(`/xboe/m/course/manage/isCourseName?courseName=${courseName}&courseId=${courseId}`); } /** * 查询修改日志,列表,不分页 @@ -95,16 +96,16 @@ const isCourseName=function(courseName,courseId){ name: 修改人 } */ -const findUpdateLogs = function(params) { - return ajax.post('/xboe/m/course/manage/upldate-logs',params); +const findUpdateLogs = function (params) { + return ajax.post('/xboe/m/course/manage/upldate-logs', params); } /** * 根据id获取修改的详细信息 * @param {Object} id */ -const getUpdateLog = function(id) { - return ajax.get('/xboe/m/course/manage/upldate-log-detail?id='+id); +const getUpdateLog = function (id) { + return ajax.get('/xboe/m/course/manage/upldate-log-detail?id=' + id); } /** @@ -139,8 +140,8 @@ const getUpdateLog = function(id) { ] } */ -const saveContent = function(data) { - return ajax.postJson('/xboe/m/course/content/save', data); +const saveContent = function (data) { + return ajax.postJson('/xboe/m/course/content/save', data); } @@ -159,18 +160,18 @@ const saveContent = function(data) { * ] * @returns */ -const updateContentOrders = function(cid,items) { - return ajax.postJson('/xboe/m/course/content/update-orders/'+cid, items); +const updateContentOrders = function (cid, items) { + return ajax.postJson('/xboe/m/course/content/update-orders/' + cid, items); } /** * 课程的详细信息 * @param {String} id */ -const detail = function(id) { - return ajax.get('/xboe/m/course/manage/detail?id=' + id); +const detail = function (id) { + return ajax.get('/xboe/m/course/manage/detail?id=' + id); } -const getDictIds = function(pid,type) { +const getDictIds = function (pid, type) { return ajax.get(`/xboe/m/course/manage/getDictIds?pid=${pid}&type=${type}`); } /** @@ -181,8 +182,8 @@ const getDictIds = function(pid,type) { name:'' } */ -const updateContentName = function(data) { - return ajax.post('/xboe/m/course/content/update-name', data); +const updateContentName = function (data) { + return ajax.post('/xboe/m/course/content/update-name', data); } /** @@ -194,8 +195,8 @@ const updateContentName = function(data) { erasable:是否物理删除,此值是课程信息中系统带过来的字段,直接使用它就可以了 } */ -const delContent = function(data) { - return ajax.post('/xboe/m/course/content/delete', data); +const delContent = function (data) { + return ajax.post('/xboe/m/course/content/delete', data); } /** @@ -207,40 +208,40 @@ const delContent = function(data) { parentId: 上级id。如果没有可以填“-1”字符串 orderIndex:显示顺序,顺序索引,整数 */ -const saveSection = function(data) { - return ajax.post('/xboe/m/course/content/save-section', data); +const saveSection = function (data) { + return ajax.post('/xboe/m/course/content/save-section', data); } /** * 删除章节目录,注意只有目录下没有学习内容时才允许删除 * @param {Object} data */ -const delSection = function(id) { - return ajax.post('/xboe/m/course/content/delete-section?id=' + id); +const delSection = function (id) { + return ajax.post('/xboe/m/course/content/delete-section?id=' + id); } /** * 根据课程学习内容的id。获取作业信息,只有学习内容是作业时才会有信息 * @param {Object} ccid */ -const getHomework = function(ccid) { - return ajax.post('/xboe/m/course/content/homework?ccid=' + ccid); +const getHomework = function (ccid) { + return ajax.post('/xboe/m/course/content/homework?ccid=' + ccid); } /** * 根据课程学习内容的id。获取考试信息,只有学习内容是考试时才会有信息 * @param {Object} ccid */ -const getExam = function(ccid) { - return ajax.post('/xboe/m/course/content/exam?ccid=' + ccid); +const getExam = function (ccid) { + return ajax.post('/xboe/m/course/content/exam?ccid=' + ccid); } /** * 根据课程学习内容的id。获取评估信息,评估内容可以获取 * @param {Object} ccid */ -const getAssess = function(ccid) { - return ajax.post('/xboe/m/course/content/assess?ccid=' + ccid); +const getAssess = function (ccid) { + return ajax.post('/xboe/m/course/content/assess?ccid=' + ccid); } /** @@ -265,21 +266,21 @@ const getAssess = function(ccid) { name 课程名称 */ -const pageList = function(query) { - return ajax.post('/xboe/m/course/manage/pagelist', query); +const pageList = function (query) { + return ajax.post('/xboe/m/course/manage/pagelist', query); } /** * 课程管理分页查询(新) * @param {Object} query */ -const managePage = function(query) { - return ajax.postJson('/xboe/m/course/manage/page', query); +const managePage = function (query) { + return ajax.postJson('/xboe/m/course/manage/page', query); } /**计算待审核课程*/ -const countWaitAudit = function() { +const countWaitAudit = function () { return ajax.get('/xboe/m/course/manage/wait-audit-num'); } @@ -288,8 +289,8 @@ const countWaitAudit = function() { * 当前用户需要审核的课程列表 * @param {Object} query 同pageList */ -const auditList = function(query) { - return ajax.post('/xboe/m/course/manage/audit-pagelist', query); +const auditList = function (query) { + return ajax.post('/xboe/m/course/manage/audit-pagelist', query); } @@ -297,8 +298,8 @@ const auditList = function(query) { * 【已移到courseAudit中】 * 教师需要审核的课程列表 */ -const teacherAuditList = function(query) { - return ajax.post('/xboe/m/course/audit/teacher-course', query); +const teacherAuditList = function (query) { + return ajax.post('/xboe/m/course/audit/teacher-course', query); } /** @@ -307,16 +308,16 @@ const teacherAuditList = function(query) { * @param {Object} data * {courseId:课程id,teacherId:指定的审核人教师的id,teacherName:教师名称,remark:备注} */ -const auditAppoint = function(data) { - return ajax.post('/xboe/m/course/audit/appoint', data); +const auditAppoint = function (data) { + return ajax.post('/xboe/m/course/audit/appoint', data); } /** * 获取审核信息,上面教师点击审核课程时,用于查询,上面“转审”时,用户填写的备注信息 * @param {courseId:'课程id',teacherId:'可以不填写,系统会查询当前人'} data */ -const getAuditInfo = function(data) { - return ajax.post('/xboe/m/course/audit/infos', data); +const getAuditInfo = function (data) { + return ajax.post('/xboe/m/course/audit/infos', data); } @@ -324,56 +325,56 @@ const getAuditInfo = function(data) { * 管理员的课程审核处理 * @param {Object} query {id:课程id,title:课程的名称, Boolean pass 是否通过,remark 备注} */ -const audit = function(data) { - return ajax.post('/xboe/m/course/manage/audit', data); +const audit = function (data) { + return ajax.post('/xboe/m/course/manage/audit', data); } /** * 审核记录列表,分页查询 */ -const auditPageRecords = function(data) { - return ajax.post('/xboe/m/course/audit/page-records', data); +const auditPageRecords = function (data) { + return ajax.post('/xboe/m/course/audit/page-records', data); } /** * 审核记录列表,要卖课程id,查询出审核列记录信息 * { courseId:必须} */ -const auditCourseRecords = function(data) { - return ajax.post('/xboe/m/course/audit/course-records',data); +const auditCourseRecords = function (data) { + return ajax.post('/xboe/m/course/audit/course-records', data); } /** * 管理员的课程发布,当前已经不再使用了 * @param {Object} query {ids:课程id,多个使用逗号分隔,title:课程的名称, Boolean pass 是否发布} */ -const publish = function(data) { - return ajax.post('/xboe/m/course/manage/publish', data); +const publish = function (data) { + return ajax.post('/xboe/m/course/manage/publish', data); } -const auditAndPublish=function(data) { - return ajax.post('/xboe/m/course/manage/audit-publish', data); +const auditAndPublish = function (data) { + return ajax.post('/xboe/m/course/manage/audit-publish', data); } /** * 设置top * @param {Object} query {ids:课程id,多个使用逗号分隔,title:课程的名称,Boolean top 是否置顶} */ -const setTop = function(data) { - return ajax.post('/xboe/m/course/manage/top', data); +const setTop = function (data) { + return ajax.post('/xboe/m/course/manage/top', data); } /** * 是否展示置顶相关功能 */ -const showSetTop = function() { +const showSetTop = function () { return ajax.get('/xboe/m/course/manage/show-settop'); } /** * 获取置顶课程列表 */ -const fetchTopCourseList = function() { +const fetchTopCourseList = function () { return ajax.get('/xboe/m/course/manage/topList'); } @@ -381,7 +382,7 @@ const fetchTopCourseList = function() { * 更新置顶课程排序 * @param {Array<{id:string,sortWeight:number}>} data */ -const updateTopCourseSort = function(data) { +const updateTopCourseSort = function (data) { return ajax.postJson('/xboe/m/course/manage/top-sortchange', data); } @@ -389,8 +390,8 @@ const updateTopCourseSort = function(data) { * 管理员的设置启用停用 * @param {Object} query {ids:课程id,多个使用逗号分隔,title:课程的名称, Boolean enabled 是否启用} */ -const setEnabled = function(data) { - return ajax.post('/xboe/m/course/manage/enabled', data); +const setEnabled = function (data) { + return ajax.post('/xboe/m/course/manage/enabled', data); } /** @@ -398,34 +399,34 @@ const setEnabled = function(data) { * erasable 此值是课程信息带过来的,直接传就可以 * @param {Object} query {id:课程id,多个使用逗号分隔,Boolean erasable 是否物理删除,title:课程的名称, remark 备注} */ -const del = function(data) { - return ajax.post('/xboe/m/course/manage/delete', data); +const del = function (data) { + return ajax.post('/xboe/m/course/manage/delete', data); } /* 详情 */ -const detailFew=function(id){ - return ajax.get('/xboe/m/course/portal/detail-few?id=' + id); +const detailFew = function (id) { + return ajax.get('/xboe/m/course/portal/detail-few?id=' + id); } /* 直接审核,教师提交审核 */ -const sumbits=function(data){ - return ajax.post('/xboe/m/course/manage/sumbits',data); +const sumbits = function (data) { + return ajax.post('/xboe/m/course/manage/sumbits', data); } /* 教师授课记录 */ -const teacherCourse=function(teacherId){ - return ajax.get('/xboe/m/course/manage/teacher-course?teacherId='+teacherId); +const teacherCourse = function (teacherId) { + return ajax.get('/xboe/m/course/manage/teacher-course?teacherId=' + teacherId); } /* 教师授课记录导出 @param teacherId 教师id */ -const exportTeacherCourse=function(teacherId){ - return ajax.post('/xboe/m/course/manage/export-teacher-course?teacherId='+teacherId) +const exportTeacherCourse = function (teacherId) { + return ajax.post('/xboe/m/course/manage/export-teacher-course?teacherId=' + teacherId) } /* *待审核课程记录导出 @@ -445,25 +446,25 @@ const exportTeacherCourse=function(teacherId){ type:课程类型,10微课,21在线课(直播);20:在线课( 录播);30:面授课;40:混合式, name 课程名称 */ -const exportCourseAudit=function(query){ - return ajax.post('/xboe/m/course/manage/exportCourseAudit',query); +const exportCourseAudit = function (query) { + return ajax.post('/xboe/m/course/manage/exportCourseAudit', query); } /* 参数同上待审核课程记录导出 课程的导出和已审核的课程导出 */ -const exportCourse = function(query) { - return ajax.get({ - url: '/xboe/m/course/manage/export', - method: 'get', - params: query, - responseType: 'blob' - }); +const exportCourse = function (query) { + return ajax.get({ + url: '/xboe/m/course/manage/export', + method: 'get', + params: query, + responseType: 'blob' + }); } //判断受众id是否有关联 -const queryCrowd=function(query){ - return ajax.postJson('/xboe/m/course/manage/queryCrowd',query); +const queryCrowd = function (query) { + return ajax.postJson('/xboe/m/course/manage/queryCrowd', query); } /** @@ -472,69 +473,78 @@ const queryCrowd=function(query){ * ids * } * */ -const ids=function (data){ - return ajax.postJson('/xboe/m/course/manage/ids',data); +const ids = function (data) { + return ajax.postJson('/xboe/m/course/manage/ids', data); } -const saveTip = function() { +const saveTip = function () { return ajax.postJson('/xboe/m/course/manage/saveTip'); } /** * 获取我开发的课程列表 */ -const courseList = function(data) { +const courseList = function (data) { return ajax.postJson('/xboe/m/course/manage/develop_page', data); } +// ai播放器相关 - 批量AI设置 +const benchAiSet = function (data) { + return ajax.postJson('/xboe/m/course/manage/benchAiSet', data); +} +const listByUser = function (data) { + return ajax2.get('/manageApi/admin/thirdApi/permission/listByUser?permissionType=PAGE'); +} export default { - saveBase, - submitCourse, - revokeSubmit, - copyCourse, - findUpdateLogs, - getUpdateLog, - detail, - getDictIds, - saveContent, - pageList, - managePage, - setEnabled, - del, - publish, - saveSection, - getHomework, - countWaitAudit, - auditList, - teacherAuditList, - auditAppoint, - getAuditInfo, - audit, - auditPageRecords, - auditCourseRecords, - auditAndPublish, - getAssess, - setTop, - showSetTop, - fetchTopCourseList, - updateTopCourseSort, - delSection, - getExam, - delContent, - updateContentName, - updateContentOrders, - saveOnlyCourse, - isRedoName, - isCourseName, - detailFew, - sumbits, - teacherCourse, - exportTeacherCourse, - exportCourseAudit, - exportCourse, - queryCrowd, + saveBase, + submitCourse, + revokeSubmit, + copyCourse, + findUpdateLogs, + getUpdateLog, + detail, + getDictIds, + saveContent, + pageList, + managePage, + setEnabled, + del, + publish, + saveSection, + getHomework, + countWaitAudit, + auditList, + teacherAuditList, + auditAppoint, + getAuditInfo, + audit, + auditPageRecords, + auditCourseRecords, + auditAndPublish, + getAssess, + setTop, + showSetTop, + fetchTopCourseList, + updateTopCourseSort, + delSection, + getExam, + delContent, + updateContentName, + updateContentOrders, + saveOnlyCourse, + isRedoName, + isCourseName, + detailFew, + sumbits, + teacherCourse, + exportTeacherCourse, + exportCourseAudit, + exportCourse, + queryCrowd, ids, saveTip, - courseList + courseList, + benchAiSet, + listByUser, } diff --git a/src/assets/images/course/courseAbstract.png b/src/assets/images/course/courseAbstract.png new file mode 100644 index 0000000000000000000000000000000000000000..180aeaac0659e5283ddcc0c07ac88f039b9e45c5 GIT binary patch literal 8947 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/course/generationFailed.png b/src/assets/images/course/generationFailed.png new file mode 100644 index 0000000000000000000000000000000000000000..5ca255d5a8cd1b0d51b78d56f97dc7648b0ac1cb GIT binary patch literal 8669 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 NtlPY{?#bu({u`*20f+zq literal 0 HcmV?d00001 diff --git a/src/assets/images/course/languageIcon.png b/src/assets/images/course/languageIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..454e67cbdbcf680ba7ea772c01c56b409ce5feb2 GIT binary patch literal 478 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 C(p2IA literal 0 HcmV?d00001 diff --git a/src/assets/images/course/selectLanguage.png b/src/assets/images/course/selectLanguage.png new file mode 100644 index 0000000000000000000000000000000000000000..f13efb3adc4379838264ee70d74f923639a5c5ec GIT binary patch literal 8440 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 E2dDknsQ>@~ literal 0 HcmV?d00001 diff --git a/src/assets/images/course/wengaoTip.png b/src/assets/images/course/wengaoTip.png new file mode 100644 index 0000000000000000000000000000000000000000..f83ce6fb2e0e6d074849300e1e0812e1b4ec1b92 GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngd!3HEhbh*7}U|`(u>Eakt!T9z8;{+AYNh+Q~ z-K%Eqc6V_}OG^t21%h%A_mh6kZ^L};B9M<=(KQkU2v{@eQY1jT>`%i(p zTnq~HZkzu+C{oA$F@fR8T9LT6?-%vXvo%!I?K}M5_d{&V$BTRV_q9D|0g0UEU-qel zLCx=j-L0pVj0$lR +
+ +
+ +
+ 语言 + + + +
+
+ + +
+ +
+
+
+ + {{ formatTime(item.start) }} +
+
+ +
+
+
+
+
+ + 生成中,过程可能耗时较长,
无需在此等待哦~
+
+
+ + + + + \ No newline at end of file diff --git a/src/components/Course/courseForm.vue b/src/components/Course/courseForm.vue index 05018a13..54a9da41 100644 --- a/src/components/Course/courseForm.vue +++ b/src/components/Course/courseForm.vue @@ -208,6 +208,44 @@ placeholder="请尽量填写课程简介,用于列表中显示,可以让用户更容易了解课程信息"> + + +
+
+ + + + +
+
+
+
+ AI摘要 + + + + +
+
+ AI文稿 + + + + +
+
+
+ AI翻译语种 + + + + + + +
+
+
+
@@ -390,6 +428,44 @@ placeholder="请尽量填写课程简介,用于列表中显示,可以让用户更容易了解课程信息"> + + +
+
+ + + + +
+
+
+
+ AI摘要 + + + + +
+
+ AI文稿 + + + + +
+
+
+ AI翻译语种 + + + + + + +
+
+
+
+
+
+ {{!currentLang ? 'AI翻译' : currentLangLabel}} +
+
    +
  • {{ item.label }}
  • +
+
+
+
|
+
+ 字幕 + + +
+
|
+
{{currentSpeed === 1 ? '倍速' : `${currentSpeed}x`}}
@@ -224,6 +252,7 @@ import volumeBar from "@/components/VideoPlayer/volume-bar.vue"; import progressBar from "@/components/VideoPlayer/progress-bar.vue"; import playerBarrageScreen from "@/components/VideoPlayer/player-barrage-screen.vue"; +import { mapGetters, mapMutations } from 'vuex'; export default { name: "barrage-videoplayer", @@ -301,12 +330,24 @@ export default { fullTimeFormat: "00:00:00", // 视频总长度的文字 barrageTimelineStart: 0, // 弹幕时间轴的起始时间点(手动调整进度条触发更新) isInit:false, // 是否初始化过 + // ai播放器相关 + isSubtitle: true, // 是否开启字幕 + currentLangLabel:'', // 当前字幕语言 }; }, + // ai播放器相关 + computed: { + ...mapGetters(['selectableLang','currentLang','courseInfo']), + isAiTranslate () { + return this.courseInfo?.aiSet == 1 && this.courseInfo?.aiTranslate == 1 && this.selectableLang && this.selectableLang.length > 0; + } + }, created() { - + // ai播放器相关 + this.SET_currentLang(''); }, mounted() { + console.log('---',this.isAiTranslate,this.courseInfo,'courseInfo'); this.videoDom = this.$refs.video; this.videoDom.focus({preventScroll: true}); let speedValue=localStorage.getItem('boe_video_speed'); @@ -317,7 +358,8 @@ export default { } setInterval(() => { - console.log('当前状态:',this.currentProgress,this.isDrag,this.videoDom.currentTime , this.videoDom.duration) + this.SET_duration(this.videoDom.duration); + console.log('当前状态:',localStorage.getItem('videoProgressData'),this.currentProgress,this.isDrag,this.videoDom.currentTime , this.videoDom.duration) // 视频播放时本地记录视频实时播放时长,视频设置了禁止拖动时执行 if(!this.isDrag){ var time = localStorage.getItem('videoProgressData') @@ -372,6 +414,7 @@ export default { //if() //console.log(this.videoDom.readyState,'this.videoDom.readyState'); }, 1000); + // 视频dom监听器,用于控制鼠标的显示 this.videoDom.addEventListener("mousemove", () => { this.isCursorStatic = false; @@ -411,6 +454,13 @@ export default { // }); }, methods: { + // ai播放器相关 + ...mapMutations({ + SET_currentLang: 'video/SET_currentLang', + SET_currentTime: 'video/SET_currentTime', + SET_selectableLang: 'video/SET_selectableLang', + SET_duration: 'video/SET_duration', + }), //当视频由于需要缓冲下一帧而停止,解决一直计时的问题 onWaiting(){ console.log('触发了onWairing'); @@ -624,6 +674,8 @@ export default { }, onAudioTimeUpdate() { const currentTime = this.$refs.video.currentTime; + // ai播放器相关 + this.SET_currentTime(currentTime) this.$emit('onTimeUpdate', currentTime); }, /** @@ -641,9 +693,77 @@ export default { this.$emit('onFullscreen',false);//全屏 } } + }, + /** ai播放器相关 + * 切换字幕 + */ + toggleSubtitle(value) { + if (this.videoDom && this.videoDom.textTracks && this.videoDom.textTracks.length >0) { + if (!value) { + // 关闭字幕 + this.videoDom.textTracks[this.videoDom.textTracks.length - 1].mode = 'hidden'; + } else { + // 打开字幕 + this.videoDom.textTracks[this.videoDom.textTracks.length - 1].mode = 'showing'; + } + } + }, + /** ai播放器相关 + * 切换字幕语言 + */ + changeLang(item = {}) { + this.SET_currentLang(item.srclang); + this.currentLangLabel = item.label; + console.log("changeLang",item); + // 先移除所有字幕轨道 + Array.from(this.videoDom.querySelectorAll('track')).forEach(t => t.remove()); + if(!item.vttContent){ + console.log("字幕内容为空!") + return; + } + if(!item.srcUrl){ + try{ + const blob = new Blob([item.vttContent], { type: 'text/vtt' }); + item.srcUrl = URL.createObjectURL(blob); + }catch(e){ + console.log("字幕格式错误",e) + } + } + const trackEl = document.createElement('track'); + trackEl.kind = 'subtitles'; + trackEl.srclang = item.srclang; + trackEl.label = item.label; + trackEl.src = item.srcUrl; + trackEl.default = true; // 确保字幕默认启用 + // 使用箭头函数保持this上下文 + trackEl.addEventListener('load', () => { + console.log('字幕加载成功!'); + // console.log('#########Track cues:', trackEl.track.cues); + }); + + trackEl.addEventListener('error', () => { + console.error('字幕加载失败!'); + }); + + // 确保视频已加载到可添加轨道的状态 + if (this.videoDom.readyState >= 1) { + this.videoDom.appendChild(trackEl); + this.videoDom.textTracks[this.videoDom.textTracks.length - 1].mode = 'showing'; + } else { + this.videoDom.addEventListener('loadedmetadata', () => { + this.videoDom.appendChild(trackEl); + this.videoDom.textTracks[this.videoDom.textTracks.length - 1].mode = 'showing'; + }, { once: true }); + } + }, + seekToTime(time) { + if (!this.videoDom) return; + this.videoDom.currentTime = time + 0.01; + this.isPlaying = true; + this.videoDom.play(); + }, - } }, watch: { currentVolume: function () { @@ -668,9 +788,37 @@ export default { // } // }, src: function () { - // 当视频地址变更时,重载视频 + // 当视频地址变更时,先重置字幕再重载视频 + this.isPlaying = false; + // 重置字幕相关状态 + this.SET_currentLang(''); + this.currentLangLabel = ''; + + // 移除所有现有字幕轨道元素 + Array.from(this.videoDom.querySelectorAll('track')).forEach(t => t.remove()); + + // 更彻底地清除字幕:重置所有textTracks + Array.from(this.videoDom.textTracks).forEach(track => { + track.mode = 'hidden'; + // 尝试移除所有cues(浏览器支持的话) + if (track.cues) { + while (track.cues.length > 0) { + track.cues.remove(0); + } + } + }); + + // 重载视频 this.videoDom.load(); - this.isPlaying = false + + // 如果有默认语言且支持AI翻译,重新设置字幕 + // if (this.isAiTranslate && this.selectableLang && this.selectableLang.length > 0) { + // // 找到默认语言或第一个可用语言 + // const defaultLang = this.selectableLang.find(lang => lang.srclang === 'zh-CN') || this.selectableLang[0]; + // if (defaultLang) { + // this.changeLang(defaultLang); + // } + // } }, }, }; @@ -907,6 +1055,12 @@ export default { color: #fff; margin-bottom: 0.5rem; } +.box-aiTranslate{ + display: flex; + align-items: center; + justify-content: center; + gap: 0.4rem; +} @media (device-width: 100vw) { .player-controls-btn .player-controls-icon { /* height: 26px; */ @@ -918,4 +1072,22 @@ export default { height: 100px; } } +video::cue { + /* color: #fff; */ + /* background-color: transparent; */ + /* font-size: 0.85em; */ + /* font-family: 'Arial', sans-serif; + -webkit-text-stroke: 4px #000; + text-stroke: 4px #000; */ + + /* text-shadow: + 2px 2px 0 #000, + -2px 2px 0 #000, + 2px -2px 0 #000, + -2px -2px 0 #000, + 0 2px 0 #000, + 2px 0 0 #000, + 0 -2px 0 #000, + -2px 0 0 #000; */ +} diff --git a/src/data/pages.js b/src/data/pages.js index 87de1d28..3f1b8274 100644 --- a/src/data/pages.js +++ b/src/data/pages.js @@ -122,6 +122,8 @@ export const iframes=[ {title:'课程管理', path:'/iframe/course/manages',hidden:false,component:'course/ManageList'}, {title:'课程管理新版', path:'/iframe/course/manage-remote',hidden:false,component:'course/ManageListRemote'}, {title:'课程管理新版', path:'/iframe/course/coursemanage-remote',hidden:false,component:'course/CourseManageRemote'}, + {title:'ai摘要', path:'/iframe/course/aiAbstract',hidden:false,component:'course/aiSet/aiAbstract'}, + {title:'ai翻译', path:'/iframe/course/aiTranslate',hidden:false,component:'course/aiSet/aiTranslate'}, {title:'考试试题管理', path:'/iframe/exam/questions',hidden:false,component:'exam/Question'}, {title:'查看答卷', path:'/iframe/exam/viewanswer',hidden:false,component:'exam/viewAnswer'}, {title:'考试试卷管理', path:'/iframe/exam/papers',hidden:false,component:'exam/TestPaper'}, diff --git a/src/security.js b/src/security.js index 9788cc03..a0fccc63 100644 --- a/src/security.js +++ b/src/security.js @@ -29,6 +29,19 @@ router.beforeEach((to, from, next) => { // 在免登录白名单,直接进入 next() }else{ + // if (!store.getters.init) { + // store.commit('app/SET_INITDATA',true); + // let myRouters=routers(); + // store.dispatch('GenerateRoutes',{routers:myRouters}).then(accessRoutes=>{ + // console.log('accessRoutes::',accessRoutes) + // router.addRoutes(accessRoutes) // 动态添加可访问路由表 + // next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 + // }); + // } else { + // to.meta.keepAlive = true + // next(); + // } + // return; if(getToken()){ if(to.path === '/login'){ // 如果是外部用户,把配置的路由跳转到个人中心 diff --git a/src/store/getters.js b/src/store/getters.js index 999ef0c6..a9956d27 100644 --- a/src/store/getters.js +++ b/src/store/getters.js @@ -28,5 +28,12 @@ const getters = { studyTaskCount:state => state.user.studyTaskCount, praisesUnicom:state =>state.pdf.praisesUnicom, favoritesUnicom:state =>state.pdf.favoritesUnicom, + // ai播放器相关 + selectAllLang:state => state.video.selectAllLang, + selectableLang:state => state.video.selectableLang, + currentLang:state => state.video.currentLang, + currentTime:state => state.video.currentTime, + courseInfo:state => state.video.courseInfo, + duration:state => state.video.duration, } export default getters diff --git a/src/store/index.js b/src/store/index.js index ff0d0868..a44d8dba 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -12,6 +12,7 @@ import resOwner from './modules/resOwner' import majorType from './modules/majorType' import orgDomain from './modules/orgDomain' import pdf from './modules/pdf' +import video from './modules/video' // ai播放器相关 Vue.use(Vuex) @@ -27,7 +28,8 @@ const store = new Vuex.Store({ resOwner, majorType, orgDomain, - pdf + pdf, + video }, getters }) diff --git a/src/store/modules/video.js b/src/store/modules/video.js new file mode 100644 index 00000000..7227e9e7 --- /dev/null +++ b/src/store/modules/video.js @@ -0,0 +1,171 @@ +// ai播放器相关 + +/** + * +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: 'हिन्दी', + } + ], // 全部语言列表 +*/ + +const state = { + selectAllLang: [ + { + key: 'ZH_CN', + srclang: 'zh-CN', + label: '中文', + name: '中文', + }, + { + key: 'EN_US', + srclang: 'en-US', + label: '英语', + name: 'English', + }, + { + key: 'VI_VN', + srclang: 'vi-VN', + label: '越南语', + name: 'tiếng Việt', + }, + { + key: 'ES_ES', + srclang: 'es-ES', + label: '西班牙语', + name: 'español', + }, + ], // 一期语言列表 + selectableLang: [], // 可选语言列表+字幕信息 + currentLang: '', // 当前选中语言 + currentTime: -1, // 当前视频时间 + courseInfo: {}, + duration: 0, // 视频时长 +} + +const mutations = { + SET_currentLang: (state, lang) => { + state.currentLang = lang + }, + SET_selectableLang: (state, list = []) => { + let selectableLang = [] + list.forEach(item => { + let selectItem = state.selectAllLang.find(selectItem => selectItem.srclang === item.language) + if (selectItem) { + selectableLang.push({ + ...item, + ...selectItem, + }) + } + }) + state.selectableLang = selectableLang + }, + SET_currentTime: (state, time) => { + state.currentTime = time + }, + SET_courseInfo: (state, info) => { + state.courseInfo = info + }, + SET_duration: (state, duration) => { + state.duration = duration + }, +} + +const actions = { + +} + +export default { + namespaced: true, + state, + mutations, + actions +} + diff --git a/src/views/course/ManageList.vue b/src/views/course/ManageList.vue index d0c2b60d..f6f86a0e 100644 --- a/src/views/course/ManageList.vue +++ b/src/views/course/ManageList.vue @@ -60,101 +60,108 @@
搜索 - 重置 + 重置
- - - 新建课程 - + + + + 新建课程 + 设置语种 + 开启AI处理 +
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
@@ -287,6 +294,236 @@
+ + + + +
+
请选择课程所支持语种
+ + + +
+
+ 注:仅支持对已开启AI处理的课程进行批量语种设置;所选的课程中有{{languageSetting.aiSetNoNum}}个未开启AI处理的课程,以上配置仅对{{languageSetting.aiSetNum}}个已开启AI处理的课程生效。 +
+ +
+ + + +
+ +
+ + + + + AI处理: + + + {{ aiProcessSetting.aiSet === 1 ? '开启' : '关闭' }} + + +
+ +
+ +
+ + + + + AI摘要: + + + {{ aiProcessSetting.aiAbstract === 1 ? '开启' : '关闭' }} + + + +
+ + +
+ + + + + AI文稿: + + + {{ aiProcessSetting.aiDraft === 1 ? '开启' : '关闭' }} + + + +
+ + +
+ + + + + AI翻译语种: + + + + +
+
+ + +
+ 注:已跳过{{aiProcessSetting.aiSetNum}}个已开启AI处理的课程,仅更新剩余{{aiProcessSetting.aiSetNoNum}}个 +
+
+ + 取消 + 确认 + +
+ + + +
+ + +
+ + + + + AI功能状态: + + + {{ aiSetting.aiSet === 1 ? '已开放' : '未开放' }} + + +
+
+ +
+ AI摘要状态: + + {{ aiSetting.aiAbstract === 1 ? '已上架' : '已下架' }} + +
+ + {{ aiSetting.aiAbstract === 1 ? '下架' : '上架' }} + + 编辑 +
+
+ + +
+ AI文稿状态: + + {{ aiSetting.aiDraft === 1 ? '已上架' : '已下架' }} + +
+ + {{ aiSetting.aiDraft === 1 ? '下架' : '上架' }} + +
+
+ + +
+ AI翻译状态: + + {{ aiSetting.aiTranslate === 1 ? '已上架' : '已下架' }} + +
+ + {{ aiSetting.aiTranslate === 1 ? '下架' : '上架' }} + + 编辑 +
+
+ + +
+ 支持语种: +
+
+ {{ getLanguageName(lang) }} + 已下架 +
+
+ + + +
+
+
+ + 取消 + 确认 + +
@@ -299,7 +536,7 @@ import auditCourse2 from '@/components/Course/auditCourse2.vue'; import adminPage from '@/components/Administration/adminPage.vue'; import apiResowner from '../../api/modules/resowner.js'; import apiType from '../../api/modules/type.js' -import {courseType} from '../../utils/tools.js'; +import {courseType, deepCopy} from '../../utils/tools.js'; import apiCourse from '../../api/modules/course.js'; // import {resOwnerIndexName,sysTypeIndexName} from '@/utils/type.js'; import { mapGetters,mapActions } from 'vuex'; @@ -307,8 +544,9 @@ import apiUserbasic from "@/api/boe/userbasic.js" export default { name: 'manageCourse', components: {courseForm, manager, auditCourse1, auditCourse2,adminPage}, + // ai播放器相关 computed: { - ...mapGetters(['resOwnerMap','sysTypeMap','userInfo']), + ...mapGetters(['resOwnerMap','sysTypeMap','userInfo', 'selectAllLang']), }, data() { return { @@ -392,9 +630,38 @@ export default { }, extendRefId:'', extendRefType:'', + // ai播放器相关 + aiPermission: false, + selectedCourses: [], //已选课程 + languageSetting: { // 设置语种弹框 + dlgShow: false, + languageCode: ['zh-CN', 'en-US'] // 默认选中的语种 + }, + aiProcessSetting: { // 开启AI处理弹框 + dlgShow: false, + aiSet: 1, + aiAbstract: 1, + aiDraft: 1, + languageCode: ['zh-CN', 'en-US'] // 默认选中的语种 + }, + aiSetting: { // AI设置弹框 + dlgShow: false, + courseId: '', + aiSet: 1, + aiAbstract: 1, // 1:上架 0:下架 + aiDraft: 1, // 1:上架 0:下架 + aiTranslate: 1, // 1:上架 0:下架 + languageCode: ['zh-CN', 'en-US', 'vi-VN'] // 支持的语种 + }, + aiSetTip: '是否将课程进行AI处理', //提示信息 + aiAbstractTip: '一键提炼课程视频核心要点,助力学员课前高效掌握重点,快速筛选学习资源', // 提示信息 + aiDraftTip: '分段展示视频内容并精准同步时间轴,实现视频进度与文稿双向定位,学习内容触手可及', //提示信息 + aiTranslateTip: '智能转换视频字幕与语音为多语种,支持全球学员按需切换语言,打破学习边界', // 提示信息 }; }, mounted() { + // ai播放器相关 + this.getAiPermission(); this.getAudiences() let chooseFlag=this.$route.query.f; this.extendRefId=this.$route.query.refId; @@ -426,6 +693,7 @@ export default { }, methods: { + getAudiences(){ apiUserbasic.getInAudienceIds().then(res=>{ if (res.status == 200) { @@ -449,6 +717,7 @@ export default { inputOn() { this.$forceUpdate(); }, + // 置顶 setTop(row) { let params = { @@ -885,6 +1154,150 @@ export default { saveNewCatalogZhang() { this.catalogs.addNewZhang = false; }, + + + // ai播放器相关 + getLanguageName(lang){ + return this.selectAllLang.find(item => item.srclang === lang)?.label || ''; + }, + handleSelectionChange(val){ + this.selectedCourses = val; + console.log(val); + }, + // 获取选中课程的AI信息 + getAIInfoByList(list = []) { + let selectNum = 0; // 选中的课程数量 + let aiSetNum = 0; // 已设置AI的课程数量 + let aiSetNoNum = 0; // 未设置AI的课程数量 + list.forEach(item => { + if(item.aiSet === 1){ + aiSetNum++; + }else{ + aiSetNoNum++; + } + }); + return { + selectNum, + aiSetNum, + aiSetNoNum + } + }, + // AI设置 + setAI(row) { + console.log('row', row); + this.aiSetting = { + dlgShow: true, + ...row + }; + }, + changeAIKey(key) { + this.aiSetting[key] = this.aiSetting[key] === 1 ? 0 : 1; + }, + // 确认AI设置 + confirmAISetting() { + const item = deepCopy(this.aiSetting); + item.languageStatus = item.aiSet; + item.languageCode = item.languageCode || []; + if (!item.languageCode.includes('zh-CN')) { + item.languageCode.unshift('zh-CN'); // 默认添加中文 去重 + } + this._benchAiSet([item], (res) => { + this.$message.success('AI设置保存成功'); + this.aiSetting.dlgShow = false; + // 可以选择是否刷新列表数据 + this.searchData(); + }, (res) => { + this.$message.error('AI设置保存失败!'); + }) + }, + setLanguage() { + if (this.selectedCourses.length > 0) { + this.languageSetting = {...{ + dlgShow: true, + languageCode: ['zh-CN', 'en-US'] // 默认选中的语种 + }, ...this.getAIInfoByList(this.selectedCourses)} + } + }, + enableAI() { + // 开启AI处理按钮点击事件 + if (this.selectedCourses.length > 0) { + this.aiProcessSetting = {...{ + dlgShow: true, + aiSet: 1, + aiAbstract: 1, + aiDraft: 1, + languageCode: ['zh-CN', 'en-US'] // 默认选中的语种 + }, ...this.getAIInfoByList(this.selectedCourses)} + } + }, + // 批量设置语种 - 确认 + confirmLanguageSetting() { + const courseList = deepCopy(this.selectedCourses); + let languageCode = deepCopy(this.languageSetting.languageCode || []); + if (!languageCode.includes('zh-CN')) { + languageCode.unshift('zh-CN'); // 默认添加中文 去重 + } + courseList.forEach(item => { + item.languageCode = languageCode; + item.aiTranslate = item.aiSet; + item.languageStatus = item.aiSet; + }) + this._benchAiSet(courseList, (res) => { + this.$message.success('设置语种成功!'); + this.languageSetting.dlgShow = false; + // 可以选择是否刷新列表数据 + this.searchData(); + }, (res) => { + this.$message.error('设置语种失败!'); + }) + }, + + // 批量开启AI处理 - 确认 + confirmAiProcess() { + // 获取AI处理配置 + let { aiSet, aiAbstract, aiDraft, languageCode } = this.aiProcessSetting; + const courseList = deepCopy(this.selectedCourses); + languageCode = languageCode || []; + if (!languageCode.includes('zh-CN')) { + languageCode.unshift('zh-CN'); // 默认添加中文 去重 + } + courseList.forEach(item => { + item.aiSet = aiSet; + item.aiAbstract = aiAbstract; + item.aiDraft = aiDraft; + item.aiTranslate = aiSet; + item.languageStatus = aiSet; + item.languageCode = languageCode; + }) + this._benchAiSet(courseList, (res) => { + this.$message.success('开启AI处理成功!'); + this.aiProcessSetting.dlgShow = false; + // 可以选择是否刷新列表数据 + this.searchData(); + }, (res) => { + this.$message.error('开启AI处理失败!'); + }) + }, + + _benchAiSet(courseList, successCB, failCB) { + apiCourse.benchAiSet({courseList}).then(res => { + if(res.status === 200){ + successCB && successCB(res); + }else{ + failCB && failCB(res); + } + }) + }, + getAiPermission() { + apiCourse.listByUser({}).then(res => { + console.log('res', res); + if(res.code === 200){ + let index = res.data.findIndex(item => item.permissionCode === 'KjbAiSetCode'); + this.aiPermission = index !== -1; + console.log('index', index, this.aiPermission); + } + }) + } } }; @@ -953,4 +1366,22 @@ export default { .el-dialog__body { overflow: hidden; } + + .form-item{ + margin-bottom: 20px; + display: flex; + align-items: center; + gap: 10px; + } +.tips { + color: #f56c6c; + font-size: 12px; + margin: 10px 0; + line-height: 1.5; +} +.languages-list{ + display: flex; + flex-wrap: wrap; + gap: 20px; +} diff --git a/src/views/course/aiSet/aiAbstract.vue b/src/views/course/aiSet/aiAbstract.vue new file mode 100644 index 00000000..2efd2c32 --- /dev/null +++ b/src/views/course/aiSet/aiAbstract.vue @@ -0,0 +1,245 @@ + + + + + diff --git a/src/views/course/aiSet/aiTranslate.vue b/src/views/course/aiSet/aiTranslate.vue new file mode 100644 index 00000000..28f146b6 --- /dev/null +++ b/src/views/course/aiSet/aiTranslate.vue @@ -0,0 +1,388 @@ + + + + + diff --git a/src/views/portal/course/Index.vue b/src/views/portal/course/Index.vue index 336bc801..9dd9ff78 100644 --- a/src/views/portal/course/Index.vue +++ b/src/views/portal/course/Index.vue @@ -206,8 +206,25 @@
开课时间:{{ cinfo.startTime }}
- -
+ +
+ +
+

课程摘要

+
{{ cinfo.summaryContent }}
+
+ + 暂无数据 +
+
+ + 摘要 +
{{ cinfo.teacher }} @@ -217,13 +234,13 @@ {{ formatNum(cinfo.studies) }}人学习
-
+
- {{ toScore(cinfo.score) }}分 + {{ toScore(cinfo.score) }}分
-
未评分
+
未评分
@@ -2710,3 +2727,43 @@ a.custom2 { } } + + \ No newline at end of file diff --git a/src/views/study/coursenew.vue b/src/views/study/coursenew.vue index a6c6cbde..cd08ffc7 100644 --- a/src/views/study/coursenew.vue +++ b/src/views/study/coursenew.vue @@ -1,21 +1,21 @@ -