ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

CSDN_02_课程管理功能详解_优化版

CSDN_02_课程管理功能详解_优化版 课程管理功能详解从课程创建到上架运营的技术实现课程管理不是简单的 CRUD。运营人员需要维护课程基础信息、章节顺序、试看策略、视频和文档素材还要处理审核上架、套餐售卖和讲师展示。织码在线教育系统将课程、章节、媒体资源、套餐和讲师拆分建模再通过状态机与发布校验保证内容能够安全进入学习端。一、课程模型主表、章节与媒体资源分离课程主表保存标题、封面、简介、富文本详情、分类、讲师、价格、状态和运营统计章节表保存课程归属、排序、媒体类型、媒体 ID、时长和试看属性。媒体文件不直接塞进课程表而是通过 VOD 视频 ID 或 OSS 文件 Key 关联便于后续替换存储平台。CREATETABLEedu_course(idbigintNOTNULL,titlevarchar(200)NOTNULL,cover_urlvarchar(500),detaillongtextCOMMENT富文本HTML,category_idbigint,lecturer_idbigint,pricedecimal(10,2)DEFAULT0,statustinyintDEFAULT0COMMENT0草稿 1待审核 2上架 3下架 4驳回,sortintDEFAULT0,PRIMARYKEY(id),KEYidx_status_sort(status,sort),KEYidx_category(category_id),KEYidx_lecturer(lecturer_id));CREATETABLEedu_course_chapter(idbigintNOTNULL,course_idbigintNOTNULL,titlevarchar(200)NOTNULL,sortintDEFAULT0,media_typetinyintCOMMENT1视频 2图文 3文档,media_idvarchar(100),durationint,is_freetinyintDEFAULT0,PRIMARYKEY(id),KEYidx_course_sort(course_id,sort));idx_status_sort服务于后台课程列表和学员端上架课程查询idx_course_sort保障章节按课程和顺序快速读取。章节排序更新时应在事务内处理避免同一课程出现重复顺序或显示跳跃。二、生命周期管理用状态机控制发布质量课程状态为DRAFT - REVIEW - ONLINE - OFFLINE审核驳回进入REJECTED修改后可再次提交。状态迁移只能由服务端执行前端按钮只是操作入口。TransactionalpublicvoidpublishCourse(LongcourseId){CoursecoursecourseMapper.selectById(courseId);validateCourseBasic(course);ListChapterchapterschapterMapper.selectByCourseId(courseId);if(chapters.isEmpty())thrownewBizException(请至少添加一个章节);for(Chapterchapter:chapters){if(chapter.isVideo()!Normal.equals(vodService.getVideoStatus(chapter.getMediaId()))){thrownewBizException(章节视频未转码完成);}}course.setStatus(CourseStatus.REVIEW);courseMapper.updateById(course);auditLogService.log(COURSE_PUBLISH,courseId,提交课程审核);}上架校验至少包含基础字段、章节数量、章节媒体状态和审核权限。VOD 视频必须处于可播放状态避免学员打开课程后得到失效地址。发布动作与操作日志放在同一事务中便于审计和问题追踪。三、WangEditor 5富文本编辑与内容安全课程详情使用 WangEditor 5 封装为 Vue 组件工具栏和编辑器实例分离管理。图片采用 OSS 签名直传视频先获取 VOD 上传凭证再通过 VOD SDK 上传并回填播放信息。consteditorConfig{MENU_CONF:{uploadImage:{asynccustomUpload(file,insertFn){constsignawaitgetOSSSignature(file.name)awaitfetch(sign.uploadUrl,{method:PUT,body:file})insertFn(sign.fileUrl,file.name,sign.fileUrl)}}}}onBeforeUnmount(()editorRef.value?.destroy())富文本入库前必须做 XSS 清洗只放行业务所需标签和属性。图片、视频和 iframe 的协议应限制为 HTTPS禁止脚本事件属性编辑器组件卸载时销毁实例避免路由切换造成内存泄漏。四、多媒体素材库VOD 与 OSS 的职责分工视频交给阿里云 VOD 处理上传、转码、截图和播放信息图片与文档使用 OSS 对象存储。客户端从服务端获取临时凭证后直传云端后端只保存素材元数据和资源状态降低应用服务带宽压力。PostMapping(/upload-auth)publicResultUploadAuthVOuploadAuth(RequestBodyUploadDTOdto){UploadAuthauthvodService.createUploadAuth(dto.getFileName());mediaService.preCreate(dto.getFileName(),auth.getVideoId(),MediaStatus.UPLOADING);returnResult.success(auth);}PostMapping(/callback)publicStringcallback(RequestBodyVodCallbackcallback){if(callback.isSuccess())mediaService.markReady(callback);returnsuccess;}上传凭证需要短时有效VOD 回调要校验来源或签名并保证重复回调幂等。素材状态建议至少包含上传中、转码中、可用和失败课程发布只允许引用可用资源。五、课程套餐商品关系与学习权限解耦套餐由edu_course_package和edu_package_course组成关联表用(package_id, course_id)唯一约束防止重复配置。订单支付成功后系统批量创建套餐内课程的UserCourse权限并保留订单来源和到期时间。TransactionalpublicvoidhandlePackageOrderPaid(Orderorder){ListLongcourseIdspackageCourseMapper.selectCourseIdsByPackageId(order.getProductId());userCourseMapper.batchInsert(courseIds.stream().map(courseId-UserCourse.builder().userId(order.getUserId()).courseId(courseId).source(OrderSource.PACKAGE).orderId(order.getId()).expireTime(order.getExpireTime()).build()).toList());}支付回调可能重复到达权限开通需要使用订单号和课程 ID 做幂等约束或 upsert。套餐权限与课程展示状态解耦课程下架后是否保留已购用户访问应由业务规则明确而不是由前端判断。六、讲师主页聚合接口降低前端请求编排成本讲师主页通过一个聚合接口返回讲师资料、已上架课程和统计数据减少前端分别请求多个接口造成的瀑布流。课程列表必须过滤ONLINE状态并按排序字段分页。GetMapping(/{id})publicResultLecturerHomeVOhome(PathVariableLongid){LecturerHomeVOvonewLecturerHomeVO();vo.setLecturer(lecturerMapper.selectById(id));vo.setCourses(courseMapper.selectByLecturerAndStatus(id,CourseStatus.ONLINE));vo.setStats(lecturerStatsService.getStats(id));returnResult.success(vo);}聚合查询要关注 N1 查询和统计口径一致性。课程数量、学习人数等高频数据可以采用缓存或异步统计学员端只返回已上架课程避免把草稿或审核中的内容暴露出去。七、管理端体验列表查询与批量操作后台列表使用 Element Plus Table、筛选表单和分页组件筛选条件至少包含课程名称与状态。批量上架前应逐条执行发布校验不能因为批量接口而绕过单课程规则批量操作结果最好返回成功项与失败原因。constfetchListasync(){loading.valuetruetry{constresawaitapi.get(/admin/course/page,{keyword:filters.keyword,status:filters.status,current:page.current,size:page.size})list.valueres.data.records page.totalres.data.total}finally{loading.valuefalse}}八、总结课程管理模块的工程价值在于把内容运营规则固化为可执行流程课程与章节分离保证模型扩展状态机和发布校验保证上架质量WangEditor 5 提供富文本生产能力VOD OSS 承担不同媒体类型套餐关系支撑组合销售讲师聚合接口改善内容展示。如需私有化部署报价、远程产品演示可访问官网 https://www.weavecodes.com/ 私信作者领取企业落地案例。程价值在于把内容运营规则固化为可执行流程课程与章节分离保证模型扩展状态机和发布校验保证上架质量WangEditor 5 提供富文本生产能力VOD OSS 承担不同媒体类型套餐关系支撑组合销售讲师聚合接口改善内容展示。
返回列表