123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329 |
- import ColUpload from '@/components/col-upload'
- import ColUploadVideo from '@/components/col-upload-video'
- import request from '@/helpers/request'
- import { scrollAnimation } from '@/util/scroll'
- import {
- ElButton,
- ElCol,
- ElDialog,
- ElForm,
- ElFormItem,
- ElIcon,
- ElInput,
- ElMessage,
- ElMessageBox,
- ElRow,
- ElTooltip
- } from 'element-plus'
- import { defineComponent } from 'vue'
- import CoursePreview from '../course-preview'
- import { createState } from '../createState'
- import styles from './index.module.less'
- import iconDown from '../images/icon_down.png'
- import iconUp from '../images/icon_up.png'
- import iconDelete from '../images/icon_delete.png'
- import ColVideo from '@/components/col-video'
- export default defineComponent({
- name: 'course-content',
- data() {
- return {
- show: false,
- form: {
- lessonList: [
- {
- key: 1,
- videoTitle: '',
- videoContent: '',
- videoUrl: '',
- coverUrl: ''
- }
- ] as any
- }
- }
- },
- methods: {
- handleUpload(urls: any) {
- console.log(urls)
- // 上传视频连接s
- const urlList = urls || []
- urlList.forEach((item: any) => {
- createState.lessonList.push({
- videoTitle: '',
- videoContent: '',
- videoUrl: item,
- coverUrl: ''
- })
- })
- },
- handleSubmit() {
- ;(this as any).$refs.form.validate(async (valid: any) => {
- if (valid) {
- if (createState.lessonList.length <= 0) {
- ElMessage.error('请上传课程视频')
- return
- }
- // 提交数据
- console.log('提交数据')
- this.show = true
- } else {
- this.$nextTick(() => {
- let isError = document.getElementsByClassName('is-error')
- isError[0].scrollIntoView({
- block: 'center',
- behavior: 'smooth'
- })
- })
- return false
- }
- })
- },
- async createSubmit() {
- try {
- const videoDetail = createState.lessonGroup
- let params = {
- lessonList: createState.lessonList,
- lessonGroup: {
- ...videoDetail,
- lessonCoverUrl:
- videoDetail.lessonCoverTemplateUrl || videoDetail.lessonCoverUrl
- }
- }
- if (createState.groupId) {
- await request.post('/api-website/videoLessonGroup/update', {
- data: params
- })
- ElMessage.success('修改成功')
- } else {
- await request.post('/api-website/videoLessonGroup/add', {
- data: params
- })
- ElMessage.success('创建成功')
- }
- sessionStorage.setItem('videoActiveName', 'DOING')
- this.$router.back()
- } catch {}
- },
- swapItems(arr: any, index1: number, index2: number) {
- arr[index1] = arr.splice(index2, 1, arr[index1])[0]
- return arr
- }
- },
- render() {
- return (
- <div class={styles.courseContent}>
- <ElForm
- class="px-6 pb-10 pt-7 min-h-[280px]"
- size="large"
- labelWidth={'120px'}
- labelPosition="left"
- ref="form"
- model={createState}
- >
- <ElFormItem label="课程视频" required>
- <div>
- <ColUploadVideo
- multiple
- limit={3}
- bucket="video-course"
- multipleModel={(urls: any) => {
- this.handleUpload(urls)
- }}
- />
- </div>
- {/* <ElInput placeholder="请输入课程名称" /> */}
- </ElFormItem>
- {createState.lessonList.map((item: any, index: number) => (
- <div
- class="p-4 mb-10 border-b border-solid border-[#E7E6E6] relative"
- key={item.key}
- >
- <div class="absolute right-4 top-4 z-10 flex">
- {index !== 0 && (
- <ElTooltip
- class="box-item"
- effect="dark"
- content="上移"
- placement="top"
- >
- <div
- onClick={() => {
- this.swapItems(createState.lessonList, index, index - 1)
- }}
- >
- <ElIcon size={29}>
- <img src={iconUp} />
- </ElIcon>
- </div>
- </ElTooltip>
- )}
- {createState.lessonList.length - 1 !== index && (
- <ElTooltip
- class="box-item"
- effect="dark"
- content="下移"
- placement="top"
- >
- <div
- onClick={() => {
- this.swapItems(createState.lessonList, index, index + 1)
- }}
- >
- <ElIcon size={29} class="ml-3">
- <img src={iconDown} title="向下移动" />
- </ElIcon>
- </div>
- </ElTooltip>
- )}
- {createState.lessonList.length > 1 && (
- <ElTooltip
- class="box-item"
- effect="dark"
- content="删除"
- placement="top"
- >
- <div
- onClick={() => {
- ElMessageBox.confirm('确定删除该条数据吗?', '提示', {
- type: 'warning'
- }).then(() => {
- createState.lessonList.splice(index, 1)
- })
- }}
- >
- <ElIcon size={29} class="ml-3">
- <img src={iconDelete} />
- </ElIcon>
- </div>
- </ElTooltip>
- )}
- </div>
- <h2 class="text-xl font-semibold pb-5">{`第 ${index + 1} 课`}</h2>
- <ElFormItem
- label="课程标题"
- prop={`lessonList.${index}.videoTitle`}
- rules={[
- {
- required: true,
- message: '请输入课程标题'
- }
- ]}
- >
- <ElInput
- placeholder="请输入课程标题"
- maxlength={50}
- v-model={item.videoTitle}
- />
- </ElFormItem>
- <ElFormItem
- label="课程介绍"
- prop={`lessonList.${index}.videoContent`}
- rules={[
- {
- required: true,
- message: '请输入课程介绍'
- }
- ]}
- >
- <ElInput
- placeholder="请输入课程介绍"
- v-model={item.videoContent}
- type="textarea"
- // @ts-ignore
- maxlength={200}
- rows={4}
- showWordLimit
- />
- </ElFormItem>
- <ElRow>
- <ElCol span={12}>
- {/* <ElFormItem label={`第${index + 1}课`}> */}
- <ElFormItem label="课程视频" required>
- {/* <ColUploadVideo
- v-model:modelValue={item.videoUrl}
- disabled
- /> */}
- <ColVideo
- styleValue={{ with: '150px', height: '85px' }}
- controls={false}
- src={item.videoUrl}
- // progress={false}
- volume={false}
- />
- <p></p>
- </ElFormItem>
- </ElCol>
- <ElCol span={10}>
- <ElFormItem
- label="视频封面"
- prop={`lessonList.${index}.coverUrl`}
- rules={[{ required: true, message: '请上传视频封面' }]}
- >
- <ColUpload
- v-model:modelValue={item.coverUrl}
- bucket="video-course"
- />
- </ElFormItem>
- </ElCol>
- </ElRow>
- </div>
- ))}
- </ElForm>
- <div class="text-center pt-6 pb-7">
- <ElButton
- round
- class="!w-44 !h-[48px] !text-base"
- onClick={() => {
- createState.active = 0
- const currentY =
- document.documentElement.scrollTop || document.body.scrollTop
- scrollAnimation(currentY, 0)
- }}
- >
- 上一步
- </ElButton>
- <ElButton
- round
- type="primary"
- class="!w-44 !h-[48px] !text-base"
- onClick={this.handleSubmit}
- >
- 下一步
- </ElButton>
- </div>
- {/* @ts-ignore */}
- <ElDialog
- v-model={this.show}
- title="预览"
- v-slots={{
- footer: () => (
- <span class="dialog-footer !text-center block ">
- <ElButton
- size="large"
- round
- onClick={() => {
- this.show = false
- }}
- >
- 返回编辑
- </ElButton>
- <ElButton
- size="large"
- round
- type="primary"
- onClick={this.createSubmit}
- >
- 创建完成
- </ElButton>
- </span>
- )
- }}
- >
- <CoursePreview />
- </ElDialog>
- </div>
- )
- }
- })
|