Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
提交反馈
为 GitLab 提交贡献
登录
切换导航
P
pica.cloud.web-education-admin
项目
项目
详情
动态
版本
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
成员
成员
收起侧边栏
Close sidebar
动态
分支图
统计图
提交
打开侧边栏
com.pica.cloud.education.frontend
pica.cloud.web-education-admin
提交
5e53a5d0
提交
5e53a5d0
编写于
6月 23, 2020
作者:
guangjun.yang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
删除 优化等
上级
d2298748
变更
17
显示空白字符变更
内嵌
并排
正在显示
17 个修改的文件
包含
0 行增加
和
13175 行删除
+0
-13175
edit-course-dialog copy 10.vue
.../education/custom-resource/edit-course-dialog copy 10.vue
+0
-1224
edit-course-dialog copy 11.vue
.../education/custom-resource/edit-course-dialog copy 11.vue
+0
-1223
edit-course-dialog copy 2.vue
...s/education/custom-resource/edit-course-dialog copy 2.vue
+0
-578
edit-course-dialog copy 3.vue
...s/education/custom-resource/edit-course-dialog copy 3.vue
+0
-717
edit-course-dialog copy 4.vue
...s/education/custom-resource/edit-course-dialog copy 4.vue
+0
-864
edit-course-dialog copy 5.vue
...s/education/custom-resource/edit-course-dialog copy 5.vue
+0
-1048
edit-course-dialog copy 6.vue
...s/education/custom-resource/edit-course-dialog copy 6.vue
+0
-1133
edit-course-dialog copy 7.vue
...s/education/custom-resource/edit-course-dialog copy 7.vue
+0
-1178
edit-course-dialog copy 8.vue
...s/education/custom-resource/edit-course-dialog copy 8.vue
+0
-1194
edit-course-dialog copy 9.vue
...s/education/custom-resource/edit-course-dialog copy 9.vue
+0
-1196
edit-course-dialog copy.vue
...nts/education/custom-resource/edit-course-dialog copy.vue
+0
-580
reject-reason-dialog copy.vue
...s/education/custom-resource/reject-reason-dialog copy.vue
+0
-60
course-list copy 2.vue
src/components/education/custom/course-list copy 2.vue
+0
-415
course-list copy.vue
src/components/education/custom/course-list copy.vue
+0
-393
course-select copy 2.vue
src/components/education/custom/course-select copy 2.vue
+0
-484
course-select copy 3.vue
src/components/education/custom/course-select copy 3.vue
+0
-462
course-select copy.vue
src/components/education/custom/course-select copy.vue
+0
-426
未找到文件。
src/components/education/custom-resource/edit-course-dialog copy 10.vue
已删除
100644 → 0
浏览文件 @
d2298748
<
template
>
<div
class=
"edit-course-wrapper dialog-title-border"
>
<el-dialog
ref=
"testDialogRef"
title=
"上传课程"
:visible=
"dialogVisible"
@
close=
"close"
center
:close-on-click-modal=
"false"
:close-on-press-escape=
"false"
width=
"800px"
>
<div
slot=
"title"
style=
"text-align: left;"
>
<span
style=
"font-weight: 700;"
>
上传课程
</span>
<span
style=
"font-size: 12px;color: #ED3131;margin-left: 4px;"
>
请认真核对上传内容,一旦提交后将不能修改
</span>
</div>
<div
v-show=
"step == 1"
class=
"course-content"
>
<el-form
ref=
"formDataRef"
:model=
"formData"
:rules=
"rules"
label-width=
"120px"
class=
"basic-form"
>
<el-form-item
label=
"课程名称:"
prop=
"courseName"
class=
"valid-msg"
>
<el-col
:span=
"20"
>
<el-input
size=
"small"
v-model=
"formData.courseName"
placeholder=
"请输入课程名称"
style=
"width: 360px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseName
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
<!--
<span
class=
"edit-wrapper"
>
<img
class=
"edit-img"
src=
"../../../assets/image/phrase3/icon-pz.png"
/>
修改信息
</span>
-->
</span>
<div
v-show=
"needShowAuditMsg && formData.courseNameCheck"
class=
"error"
>
<span>
错误信息错误信息错误信息错误信息错误信息错误信息息
</span>
<span
class=
"cancle"
>
X
</span>
</div>
</el-col>
</el-form-item>
<el-form-item
label=
"学科分类:"
prop=
"subjectIdList"
class=
"valid-msg"
>
<el-col
:span=
"18"
>
<!-- :props="
{ expandTrigger: 'hover' }" -->
<el-cascader
style=
"width: 360px"
v-model=
"formData.subjectIdList"
:options=
"labelOptions"
:props=
"
{ value: 'id', label: 'name', children: 'subList'}"
>
</el-cascader>
</el-col>
</el-form-item>
<el-form-item
label=
"开放范围:"
prop=
"shareType"
class=
"valid-msg"
>
<el-radio-group
v-model=
"formData.shareType"
>
<el-radio
:label=
"1"
>
机构共享
</el-radio>
</el-radio-group>
</el-form-item>
<div
class=
"basic-item-icon"
>
<span
class=
"require"
>
*
</span>
<el-form-item
label=
"课程视频:"
prop=
"range"
>
<el-upload
class=
"upload-video"
action=
"#"
:before-upload=
"beforeUploadVideo"
:limit=
"3"
:on-exceed=
"handleExceed"
:show-file-list=
"false"
>
<el-button
size=
"small"
type=
"primary"
>
点击上传
</el-button>
<div
slot=
"tip"
class=
"el-upload__tip"
>
<span
class=
"upload-tips"
>
只支持MP4格式,课程视频最多上传100个,单文件最大2G
</span>
<ul
v-show=
"formData.courseCustomChapterModels[0].courseCustomLectureModelList.length"
class=
"custom-list"
>
<li
v-for=
"(lecture, index) in formData.courseCustomChapterModels[0].courseCustomLectureModelList"
:key=
"index"
>
<ul
class=
"video"
>
<li>
<span
class=
"title"
>
视频
{{
index
+
1
}}
</span>
<img
src=
"../../../assets/image/phrase3/icon-pin.png"
/>
<span
class=
"name"
@
click=
"previewVideoAction(lecture)"
>
{{
lecture
.
resourceModel
.
name
}}
</span>
</li>
<li>
<img
@
click=
"deleteLecture(index)"
class=
"delete"
src=
"../../../assets/image/phrase3/close.png"
/>
</li>
</ul>
<div
class=
"video-name"
>
<span
class=
"title"
>
<span
>
*
</span>
<span
class=
"video-title"
>
视频名称
</span>
</span>
<el-input
size=
"small"
v-model=
"lecture.name"
placeholder=
"请输入课程名称"
style=
"width: 260px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{
(
lecture
.
name
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
</div>
</li>
<span
v-show=
"needShowUploadProcess"
class=
"upload-process"
:style=
"
{'width': (uploadProgress/100 * 340) + 'px'}">
</span>
</ul>
<span
v-if=
"!formData.courseCustomChapterModels[0].courseCustomLectureModelList.length"
v-show=
"needShowUploadProcess"
class=
"upload-process"
:style=
"
{'width': (uploadProgress/100 * 340) + 'px'}">
</span>
</div>
</el-upload>
</el-form-item>
</div>
<div
class=
"other-content valid-msg"
v-show=
"isShowOtherContent"
>
<div
class=
"tips"
>
注:以下信息为非必填项,您也可以根据实际情况修改
</div>
<div
class=
"basic-item-icon"
>
<!--
<span
class=
"require"
>
*
</span>
-->
<el-form-item
label=
"课程封面:"
>
<el-upload
v-model=
"formData.courseIntroImage"
class=
"bg-uploader"
action=
"#"
accept=
"image/*"
:show-file-list=
"false"
:before-upload=
"beforeUpload1"
:disabled=
"disabled"
>
<div
class=
"bg-img-wrapper"
>
<img
v-if=
"formData.courseIntroImage"
@
mouseover
.
stop=
"imgMouseOver=true"
:src=
"formData.courseIntroImage"
class=
"bg-img"
/>
<img
v-if=
"!formData.courseIntroImage"
class=
"bg-img"
src=
"../../../assets/image/small.png"
/>
</div>
</el-upload>
<div
class=
"limit-text"
>
尺寸:750*420,只支持jpeg格式
</div>
</el-form-item>
<p
class=
"upload-message"
v-if=
"uploadImgMessage"
>
请选择列表图片
</p>
</div>
<el-form-item
label=
"课程难度:"
>
<el-radio-group
v-model=
"formData.difficultyLevel"
>
<el-radio
:label=
"1"
>
初级
</el-radio>
<el-radio
:label=
"2"
>
中级
</el-radio>
<el-radio
:label=
"3"
>
高级
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"讲师名称:"
class=
"valid-msg"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
v-model=
"formData.courseCustomDoctorModels[0].courseDoctorName"
placeholder=
"请输入讲师名称"
style=
"width: 360px"
maxlength=
"25"
@
focus=
"isShowDoctorList=true"
@
input=
"filterDoctorName"
@
blur=
"doctorNameInputBlur"
:disabled=
"disabled"
></el-input>
<ul
v-show=
"isShowDoctorList"
class=
"doctor-select-list"
>
<li
v-for=
"(item, index) in doctorNameList"
:key=
"index"
@
click=
"selectDoctor(item.courseDoctorName, index)"
:class=
"
{'doctor-selected': item.seleted}"
>
<span
v-show=
"item.show"
>
{{
item
.
courseDoctorName
||
'测试名'
}}
</span>
</li>
</ul>
<span
class=
"word-num"
>
{{
(
formData
.
courseCustomDoctorModels
[
0
]
&&
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorName
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
</el-col>
</el-form-item>
<div
class=
"basic-item-icon"
>
<el-form-item
label=
"讲师头像:"
>
<el-upload
v-model=
"formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl"
class=
"bg-uploader"
action=
"#"
accept=
"image/*"
:show-file-list=
"false"
:before-upload=
"beforeUpload2"
:disabled=
"disabled"
>
<div
class=
"bg-img-wrapper"
>
<img
v-if=
"formData.courseCustomDoctorModels && formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl || ''"
@
mouseover
.
stop=
"imgMouseOver=true"
:src=
"formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl"
class=
"bg-img-doctor"
/>
<img
v-if=
"!(formData.courseCustomDoctorModels && formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl || '')"
class=
"bg-img-doctor"
src=
"../../../assets/image/small.png"
/>
</div>
</el-upload>
<div
class=
"limit-text"
>
尺寸:88*88,只支持jpeg格式
</div>
</el-form-item>
<p
class=
"upload-message"
v-if=
"uploadImgMessage"
>
请选择列表图片
</p>
</div>
<el-form-item
label=
"所属机构:"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
v-model=
"formData.courseCustomDoctorModels[0].courseDoctorHospital"
placeholder=
"请输入所属机构"
style=
"width: 360px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseCustomDoctorModels
&&
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorHospital
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
</el-col>
</el-form-item>
<el-form-item
label=
"课程简介:"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
type=
"textarea"
maxlength=
"200"
:autosize=
"
{ minRows: 5}"
placeholder="请输入课程简介"
v-model="formData.courseIntro"
style="width:90%;"
>
</el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseIntro
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/200
</span>
</el-col>
</el-form-item>
</div>
<!-- 更多信息 -->
<div
class=
"separator-line"
>
<span
class=
"line-left"
></span>
<div
@
click=
"toggleOtherContent"
class=
"center"
>
<span>
展开更多信息
</span>
<img
v-show=
"isShowOtherContent"
src=
"../../../assets/image/phrase3/arrow-up.png"
/>
<img
v-show=
"!isShowOtherContent"
src=
"../../../assets/image/phrase3/arrow-down.png"
/>
</div>
<span
class=
"line-right"
></span>
</div>
</el-form>
</div>
<div
v-show=
"step == 2"
class=
"course-content-step2"
>
<img
class=
"success-img"
src=
"../../../assets/image/phrase3/icon-audit-success.png"
/>
<span
class=
"tips-1"
>
您上传的课程已成功提交,预计在3-5个工作日内完成审核
</span>
<span
class=
"tips-2"
>
审核通过后,您才可以选择课程完成项目配置。如有任何疑问可联系云鹊医400-920-8877
</span>
<el-button
type=
"primary"
size=
"small"
icon=
"el-icon-back"
@
click=
"backToOrgCourse"
>
返回机构课程
</el-button>
</div>
<div
v-show=
"step == 1"
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"dialogObj.visible=true"
>
取 消
</el-button>
<el-button
type=
"primary"
@
click=
"submitForm('formDataRef')"
>
确 定
</el-button>
</div>
</el-dialog>
<DialogComponet
:dialogObj=
"dialogObj"
@
hide=
"hideCancleTips"
@
confirm=
"dialogObj.visible=false"
></DialogComponet>
<PreviewVideo
:dialogVisible=
"isPreviewVideo"
:videoUrl=
"videoUrl"
@
close=
"isPreviewVideo=false"
></PreviewVideo>
<el-dialog
title=
"拒绝原因"
:visible=
"showCropper"
width=
"1000px"
center
>
<cropper-two
:cropOption=
"cropOption"
@
getCropImg=
"getCropImg(arguments)"
:originImg=
"slide2.oriUrl"
:previewImg=
"slide2.preUrl"
/>
</el-dialog>
<!--
<button
@
click=
"previewVideoAction"
>
test video
</button>
-->
</div>
</
template
>
<
script
>
import
PreviewVideo
from
"@/components/education/custom-resource/preview-video"
;
import
PreviewProtocol
from
"@/components/education/custom-resource/preview-protocol"
;
import
PreviewEditCourse
from
"@/components/education/custom-resource/edit-course-dialog"
;
import
DialogComponet
from
"@/components/education/template/dialog"
;
import
CropperTwo
from
'@/components/common/cropper.two.vue'
import
{
doUpload
,
getFilePath
}
from
"@/utils/qiniu-util"
;
import
{
openLoading
,
closeLoading
,
getQiniuToken1
}
from
"@/utils/utils"
;
import
{
isEmptyUtils
}
from
"@/utils/index"
;
import
{
mapActions
}
from
'vuex'
;
import
{
ossUpload
,
getFilePathForOSS
}
from
"@/utils/oss/ossUtil"
;
let
vm
=
null
;
export
default
{
data
()
{
let
checkCourseName
=
(
rule
,
value
,
callback
)
=>
{
// 如果有审核的信息,则直接报错
if
(
!
value
&&
this
.
needCheckField
)
{
callback
(
new
Error
(
"请输入课程名称"
));
}
else
{
callback
();
}
};
return
{
slide2
:
{
oriUrl
:
'https://avatars1.githubusercontent.com/u/23690568?s=460&v=4'
,
// 原图
preUrl
:
'https://avatars1.githubusercontent.com/u/23690568?s=460&v=4'
// 裁剪后的预览图片,初始化为原图
},
showCropper
:
false
,
cropOption
:
{
offset_x
:
10
,
offset_y
:
10
,
width
:
750
,
height
:
420
},
step
:
1
,
needCheckField
:
false
,
needShowAuditMsg
:
false
,
needShowUploadProcess
:
false
,
disabled
:
false
,
formDataBase
:
{
checkStatus
:
0
,
courseCustomChapterModels
:
[
{
courseCustomLectureModelList
:
[],
id
:
null
,
name
:
"视频课程"
}
],
courseCustomDoctorModels
:
[
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
}
],
courseId
:
null
,
courseIntro
:
""
,
courseIntroCheck
:
""
,
courseIntroImage
:
"https://test1-file.yunqueyi.com/image/png/common/202006201528136.png"
,
courseIntroImageCheck
:
""
,
courseName
:
""
,
courseNameCheck
:
""
,
deleteCustomLectureIds
:
[],
difficultyLevel
:
1
,
shareType
:
1
,
subjectIdList
:
[]
},
formData
:
{
checkStatus
:
0
,
courseCustomChapterModels
:
[
{
courseCustomLectureModelList
:
[],
id
:
null
,
name
:
"视频课程"
}
],
courseCustomDoctorModels
:
[
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
}
],
courseId
:
null
,
courseIntro
:
""
,
courseIntroCheck
:
""
,
courseIntroImage
:
"https://test1-file.yunqueyi.com/image/png/common/202006201528136.png"
,
courseIntroImageCheck
:
""
,
courseName
:
""
,
courseNameCheck
:
""
,
deleteCustomLectureIds
:
[],
difficultyLevel
:
1
,
shareType
:
1
,
subjectIdList
:
[]
},
uploadImgMessage
:
false
,
imgMouseOver
:
false
,
rules
:
{
courseName
:
[
{
required
:
true
,
message
:
" "
},
{
validator
:
checkCourseName
}
],
subjectIdList
:
[
{
required
:
true
,
message
:
"请输入课程名称"
}
],
shareType
:
[
{
required
:
true
,
message
:
"请选择开放范围"
}
]
},
labelOptions
:
[],
isShowOtherContent
:
false
,
fileList
:
[
],
projectBanner
:
"https://file.yunqueyi.com/h5/images/cme/project-banner.png"
,
doctorHeader
:
"https://file.yunqueyi.com/h5/images/cme/doctor-header.png"
,
doctorNameList
:
[
{
courseDoctorName
:
"333"
,
show
:
true
,
seleted
:
false
},
{
courseDoctorName
:
"334"
,
show
:
true
,
seleted
:
false
},
{
courseDoctorName
:
"335"
,
show
:
true
,
seleted
:
false
},
{
courseDoctorName
:
"336"
,
show
:
true
,
seleted
:
false
}
],
isShowDoctorList
:
false
,
isPreviewVideo
:
false
,
videoUrl
:
""
,
orgCourseInfo
:
{
defaultDoctor
:
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
},
doctorModelList
:
[
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
}
],
limitModel
:
{
maxLimitOneVideoSize
:
2147483648
,
maxLimitVideoCount
:
100
,
maxStorageSpace
:
5368709120
,
usedStorageSpace
:
1021842989
}
},
uploadProgress
:
0
,
dialogObj
:
{
visible
:
false
,
title
:
"确定取消吗?"
,
message
:
"发布后,项目将进入审核中,待审核完成后学员可在云鹊医App上参加培训学习"
,
tip
:
""
,
confirmMsg
:
"取 消"
,
hideMsg
:
"确 定"
},
};
},
props
:
{
dialogVisible
:
{
type
:
Boolean
,
default
:
false
},
courseId
:
{
type
:
String
|
Number
,
default
:
0
}
},
computed
:
{},
watch
:
{
dialogVisible
(
isVisible
)
{
this
.
formData
=
JSON
.
parse
(
JSON
.
stringify
(
this
.
formDataBase
));
if
(
isVisible
)
{
if
(
this
.
courseId
==
0
)
{
this
.
initAdd
(
this
.
courseId
);
}
else
{
this
.
initModify
(
this
.
courseId
);
}
}
},
},
components
:
{
PreviewVideo
,
PreviewEditCourse
,
DialogComponet
,
CropperTwo
},
created
()
{
vm
=
this
;
// this.initAdd();
},
mounted
()
{
this
.
getLabelList
();
},
methods
:
{
...
mapActions
([
'setKind'
]),
getCropImg
(
argument
)
{
this
.
showCropper
=
false
;
console
.
log
(
argument
[
0
],
'#####'
,
argument
[
1
]);
this
.
slide2
.
preUrl
=
argument
[
0
]
this
.
cropData
=
argument
[
1
]
},
// 创建课程页面的初始信息
initOrgCourseInfo
()
{
vm
.
GET
(
"contents/course/custom/info/init"
,
{
setEntry
:
true
}).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
this
.
orgCourseInfo
=
res
.
data
;
this
.
formData
.
courseCustomDoctorModels
[
0
]
=
this
.
orgCourseInfo
.
defaultDoctor
;
this
.
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorAvatarUrl
=
this
.
orgCourseInfo
.
defaultDoctor
.
courseDoctorAvatarUrl
||
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
;
this
.
doctorNameList
=
this
.
convertDNameToSelectOpt
(
this
.
orgCourseInfo
.
doctorModelList
);
+
this
.
courseId
&&
this
.
getCourseInfoById
(
this
.
courseId
);
}
}
);
},
// 将医生名称进行处理
convertDNameToSelectOpt
(
doctorModelList
)
{
doctorModelList
.
forEach
(
item
=>
{
item
.
show
=
true
;
item
.
seleted
=
false
;
});
return
doctorModelList
;
},
// 添加时初始化
initAdd
()
{
console
.
log
(
"in initAdd"
);
this
.
step
=
1
;
this
.
needShowAuditMsg
=
false
;
this
.
initOrgCourseInfo
();
},
initModify
()
{
this
.
needShowAuditMsg
=
true
;
console
.
log
(
"in initModify"
);
this
.
initOrgCourseInfo
();
},
// 创建课程页面的初始信息
getCourseInfoById
(
courseId
)
{
vm
.
GET
(
`contents/course/custom/info/
${
courseId
}
`
)
.
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
this
.
formData
=
res
.
data
;
}
}
);
},
// 过滤医生信息
filterDoctorName
(
value
)
{
this
.
doctorNameList
.
forEach
(
item
=>
{
if
(
value
)
{
if
((
item
.
value
+
""
).
indexOf
(
value
)
==
-
1
)
{
item
.
show
=
false
;
}
else
{
item
.
show
=
true
;
}
if
(
item
.
value
==
value
)
{
item
.
seleted
=
true
;
}
else
{
item
.
seleted
=
false
;
}
}
else
{
item
.
show
=
true
;
}
});
},
// 当选择医生的焦点失去时,要反选医生信息
doctorNameInputBlur
()
{
setTimeout
(()
=>
{
this
.
isShowDoctorList
=
false
;
this
.
selectDoctorByName
(
this
.
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorName
);
},
200
);
},
// 根据姓名反选医生信息
// TODO 尝试找到完全匹配的医生
selectDoctorByName
(
name
)
{
},
// 选择其中一个
selectDoctor
(
name
)
{
console
.
log
(
name
);
this
.
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorName
=
name
;
this
.
selectDoctorByName
(
name
);
},
// 关闭当前弹框
close
()
{
this
.
$emit
(
"close"
);
},
// 获取学科列表
getLabelList
()
{
let
req
=
{};
this
.
GET
(
"aggregate/content/labelList"
,
req
).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
this
.
convertLabelList
(
res
.
data
);
}
});
},
// 将所有子分类中的“全部”去掉
convertLabelList
(
labelList
)
{
let
newLabelList
=
[];
labelList
.
forEach
(
item
=>
{
item
.
subList
=
item
.
subList
.
slice
(
1
);
});
this
.
labelOptions
=
labelList
;
},
// 上传视频(mp4)
beforeUploadVideo
(
file
)
{
// orgCourseInfo.limitModel: {
// maxLimitOneVideoSize: 2147483648,
// maxLimitVideoCount: 100,
// maxStorageSpace: 5368709120,
// usedStorageSpace: 1021842989
// }
console
.
log
(
file
);
const
isMP4
=
file
.
type
===
"video/mp4"
;
const
isGt
=
file
.
size
>
this
.
orgCourseInfo
.
limitModel
.
maxLimitOneVideoSize
;
const
isGtMaxNum
=
this
.
formData
.
courseCustomChapterModels
[
0
].
courseCustomLectureModelList
.
length
>=
100
;
const
usedGtMaxStore
=
this
.
orgCourseInfo
.
limitModel
.
usedStorageSpace
+
file
.
size
>
this
.
orgCourseInfo
.
limitModel
.
maxStorageSpace
;
if
(
isGt
||
!
isMP4
||
isGtMaxNum
)
{
this
.
$message
.
error
(
"视频不符合规范,请根据规范上传视频"
);
return
;
}
if
(
usedGtMaxStore
)
{
this
.
$message
.
error
(
"个人存储空间已不够上传此视频"
);
return
;
}
// 直接上传
this
.
needShowUploadProcess
=
true
;
doUpload
(
vm
,
file
,
getFilePath
(
file
,
null
),
"preview4"
,
"progress"
,
""
).
then
(
function
(
path
)
{
// closeLoading(vm);
console
.
log
(
'vm.uploadProgress'
,
vm
.
uploadProgress
);
console
.
log
(
path
);
let
uploadResourceParam
=
{
formatType
:
path
.
ext
,
name
:
path
.
name
.
substring
(
path
.
name
.
length
-
25
),
//path.name,
qCloudUrl
:
path
.
fullPath
,
size
:
path
.
size
,
fileType
:
1
,
status
:
"success"
,
uid
:
new
Date
().
getTime
()
}
vm
.
needShowUploadProcess
=
false
;
vm
.
uploadProgress
=
0
;
vm
.
insertResourceAction
(
uploadResourceParam
);
});
},
// 上传资源(视频)后,生存对应的节
insertResourceAction
(
uploadResourceParam
)
{
this
.
POST
(
"contents/course/custom/info/insertResource"
,
[
uploadResourceParam
]).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
let
cName
=
res
.
data
.
resourceModelList
[
0
].
name
;
// cName = cName.substr(0, cName.lastIndexOf('.'));
let
lectureObj
=
{
id
:
null
,
name
:
cName
,
nameCheck
:
""
,
contentCheck
:
""
,
resourceModel
:
{}
}
this
.
orgCourseInfo
.
limitModel
=
res
.
data
.
limitModel
;
lectureObj
.
resourceModel
=
res
.
data
&&
res
.
data
.
resourceModelList
[
0
];
this
.
formData
.
courseCustomChapterModels
[
0
].
courseCustomLectureModelList
.
push
(
lectureObj
);
}
});
},
//上传列表图片
beforeUploadListPic
(
file
)
{
let
fileLimit
=
{
width
:
230
,
height
:
172
,
size
:
0.5
,
sizeText
:
"500K"
,
key
:
"attachmentUrl"
,
more
:
"attachmentMore1"
,
show
:
"uploadImgMessage"
};
vm
.
beforeAvatarUpload2
(
file
,
fileLimit
);
// vm.beforeAvatarUpload(file, fileLimit);
},
//上传图片校验
beforeAvatarUpload2
(
file
,
fileLimit
)
{
console
.
log
();
const
isJPG
=
file
.
type
===
"image/jpeg"
;
const
isPNG
=
file
.
type
===
"image/png"
;
const
isLt2M
=
file
.
size
/
1024
/
1024
<
fileLimit
.
size
;
console
.
log
(
"isJPG"
,
isJPG
,
"isPNG"
,
isPNG
,
"isLt2M"
,
isLt2M
);
// if (!isJPG && !isPNG) {
// vm.$message.error("图片不符合规范,请根据规范上传图片");
// return;
// }
// if (!isLt2M) {
// vm.$message.error("图片不符合规范,请根据规范上传图片 ");
// return;
// }
let
_img
=
new
FileReader
();
_img
.
readAsDataURL
(
file
);
console
.
log
(
'readAsDataURL'
,
_img
,
file
);
_img
.
onload
=
function
(
theFile
)
{
let
image
=
new
Image
();
image
.
src
=
theFile
.
target
.
result
;
vm
.
slide2
.
oriUrl
=
theFile
.
target
.
result
;
vm
.
showCropper
=
true
;
console
.
log
(
'readAsDataURL222'
,
_img
.
width
,
file
,
theFile
);
image
.
onload
=
function
()
{
console
.
log
(
'image.onload'
,
image
);
let
_vm
=
this
;
if
(
false
// true ||
// _vm.width != fileLimit.width ||
// _vm.height != fileLimit.height
)
{
vm
.
$message
.
error
(
"图片不符合规范,请根据规范上传图片"
);
}
else
{
// openLoading(vm);
// doUpload(
// vm,
// file,
// getFilePath(file, null),
// "preview4",
// "progress1",
// 1
// ).then(function(path) {
// closeLoading(vm);
// console.log(path);
// if (fileLimit.show == "uploadImgMessage") {
// vm.uploadImgMessage = false;
// }
// // else if (fileLimit.show == "uploadImgMessage2") {
// // vm.uploadImgMessage2 = false;
// // }
// vm.formData[fileLimit.key] = path.fullPath;
// vm.formData[fileLimit.more] = {
// attachmentName: path.name,
// attachmentExt: path.ext,
// attachmentSize: path.size
// };
// vm.$message.success("上传成功");
// });
}
};
};
return
isJPG
&&
isLt2M
;
},
//上传图片校验
beforeAvatarUpload
(
file
,
fileLimit
)
{
console
.
log
();
const
isJPG
=
file
.
type
===
"image/jpeg"
;
const
isPNG
=
file
.
type
===
"image/png"
;
const
isLt2M
=
file
.
size
/
1024
/
1024
<
fileLimit
.
size
;
console
.
log
(
"isJPG"
,
isJPG
,
"isPNG"
,
isPNG
,
"isLt2M"
,
isLt2M
);
// if (!isJPG && !isPNG) {
// vm.$message.error("图片不符合规范,请根据规范上传图片");
// return;
// }
// if (!isLt2M) {
// vm.$message.error("图片不符合规范,请根据规范上传图片 ");
// return;
// }
let
_img
=
new
FileReader
();
_img
.
readAsDataURL
(
file
);
_img
.
onload
=
function
(
theFile
)
{
let
image
=
new
Image
();
image
.
src
=
theFile
.
target
.
result
;
image
.
onload
=
function
()
{
let
_vm
=
this
;
if
(
false
// true ||
// _vm.width != fileLimit.width ||
// _vm.height != fileLimit.height
)
{
vm
.
$message
.
error
(
"图片不符合规范,请根据规范上传图片"
);
}
else
{
openLoading
(
vm
);
doUpload
(
vm
,
file
,
getFilePath
(
file
,
null
),
"preview4"
,
"progress1"
,
1
).
then
(
function
(
path
)
{
closeLoading
(
vm
);
console
.
log
(
path
);
if
(
fileLimit
.
show
==
"uploadImgMessage"
)
{
vm
.
uploadImgMessage
=
false
;
}
// else if (fileLimit.show == "uploadImgMessage2") {
// vm.uploadImgMessage2 = false;
// }
vm
.
formData
[
fileLimit
.
key
]
=
path
.
fullPath
;
vm
.
formData
[
fileLimit
.
more
]
=
{
attachmentName
:
path
.
name
,
attachmentExt
:
path
.
ext
,
attachmentSize
:
path
.
size
};
vm
.
$message
.
success
(
"上传成功"
);
});
}
};
};
return
isJPG
&&
isLt2M
;
},
// 展开/收起 更多信息
toggleOtherContent
()
{
this
.
isShowOtherContent
=
!
this
.
isShowOtherContent
;
},
// 限制选择文件个数
handleExceed
(
files
,
fileList
)
{
this
.
$message
.
warning
(
`当前限制选择 100 个文件,您已经共选择了
${
files
.
length
+
fileList
.
length
}
个文件!`
);
},
// 删除按钮
beforeRemove
(
file
,
fileList
)
{
return
this
.
$confirm
(
`确定移除
${
file
.
name
}
?`
);
},
//表单校验
submitForm
(
formName
)
{
this
.
needShowAuditMsg
=
false
;
this
.
$refs
[
formName
].
validate
(
valid
=>
{
if
(
valid
)
{
this
.
insertOrUpdate
();
}
else
{
console
.
log
(
"error submit!!"
);
}
this
.
needShowAuditMsg
=
true
;
});
},
// 添加或修改课程(kind = 3)
insertOrUpdate
()
{
this
.
POST
(
"contents/course/custom/info/insertOrUpdate"
,
this
.
formData
).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
if
(
this
.
courseId
==
'add'
)
{
this
.
step
=
2
;
}
else
{
this
.
close
();
this
.
setKind
(
3
);
}
}
});
},
// 返回到课程选择页面(kind = 3)
backToOrgCourse
()
{
this
.
close
();
this
.
setKind
(
3
);
},
// 关闭(“取消”按钮弹出来的)弹框
hideCancleTips
()
{
this
.
dialogObj
.
visible
=
false
;
this
.
close
();
},
// 预览视频
previewVideoAction
(
lecture
)
{
this
.
videoUrl
=
lecture
.
resourceModel
.
filePath
;
this
.
isPreviewVideo
=
true
;
},
// 删除本节视频
// TODO 要将删除的节ID放在删除的节里
deleteLecture
(
index
)
{
this
.
formData
.
courseCustomChapterModels
[
0
].
courseCustomLectureModelList
.
splice
(
index
,
1
);
},
// 上传课程封面图片
beforeUpload1
(
file
)
{
// const isLt50kb = file.size / 1024
<
50
;
const
isJPG
=
file
.
type
===
'image/jpeg'
if
(
!
isJPG
)
{
this
.
$message
.
error
(
'只支持jpeg格式'
)
return
;
}
var
_img
=
new
FileReader
()
_img
.
readAsDataURL
(
file
)
_img
.
onload
=
function
(
theFile
)
{
let
image
=
new
Image
()
image
.
src
=
theFile
.
target
.
result
image
.
onload
=
function
()
{
let
_this
=
this
if
(
_this
.
width
!=
740
||
_this
.
height
!=
420
)
{
vm
.
$message
.
info
(
"上传图片尺寸大小不合适,请重新上传"
)
}
else
{
vm
.
doUploadOSS
(
file
,
1
);
//封面图片
}
}
}
},
// 上传讲师图片
beforeUpload2
(
file
)
{
// const isLt50kb = file.size / 1024
<
50
;
const
isJPG
=
file
.
type
===
'image/jpeg'
if
(
!
isJPG
)
{
this
.
$message
.
error
(
'只支持jpeg格式'
)
return
;
}
var
_img
=
new
FileReader
()
_img
.
readAsDataURL
(
file
)
_img
.
onload
=
function
(
theFile
)
{
let
image
=
new
Image
()
image
.
src
=
theFile
.
target
.
result
image
.
onload
=
function
()
{
let
_this
=
this
if
(
_this
.
width
!=
88
||
_this
.
height
!=
88
)
{
vm
.
$message
.
info
(
"上传图片尺寸大小不合适,请重新上传"
)
}
else
{
vm
.
doUploadOSS
(
file
,
2
);
//封面图片
}
}
}
},
// (调用OSS API)开始上传
doUploadOSS
(
file
,
index
)
{
let
self
=
this
;
//上传 指定文件名
ossUpload
(
self
,
file
,
getFilePathForOSS
(
file
),
null
,
null
,
null
).
then
(
function
(
path
)
{
let
list
=
[{}];
// list[0].name = file.name;
// list[0].url = localStorage.getItem("resource_url") + path;
if
(
index
===
1
)
{
}
else
if
(
index
===
2
)
{
}
self
.
$message
.
success
(
"上传成功"
);
});
return
false
;
},
}
};
</
script
>
<
style
scoped
lang=
"scss"
>
.edit-course-wrapper
{
.course-content
{
// color: red;
.basic-item-icon
{
position
:
relative
;
margin-top
:
20px
;
.require
{
position
:
absolute
;
left
:
40px
;
top
:
11px
;
color
:
#f56c6c
;
}
.upload-message
{
position
:
absolute
;
left
:
160px
;
top
:
105px
;
font-size
:
12px
;
color
:
#f56c6c
;
}
.img-delete
{
position
:
absolute
;
left
:
0px
;
top
:
0px
;
width
:
84px
;
height
:
100px
;
background
:
#000
;
opacity
:
0
.7
;
z-index
:
999
;
i
{
color
:
#fff
;
margin-top
:
39px
;
margin-left
:
0px
;
}
}
.upload-tips
{
width
:
100%
;
position
:
relative
;
top
:
-10px
;
font-size
:
12px
;
color
:
#979899
;
// display: inline-block;
}
.custom-list
{
// width: 100%;
width
:
480px
;
display
:
flex
;
flex-direction
:
column
;
border-radius
:
3px
;
border
:
1px
solid
rgba
(
228
,
231
,
237
,
1
);
padding
:
20px
;
font-size
:
14px
;
&
>
li
{
margin
:
10px
0
;
}
.video
{
display
:
flex
;
flex-direction
:
row
;
justify-content
:
space-between
;
align-items
:
center
;
.title
{
display
:
inline-block
;
width
:
70px
;
text-align
:
right
;
margin-right
:
10px
;
}
.name
{
cursor
:
pointer
;
color
:
#5890DD
;
}
img
{
width
:
12px
;
height
:
12px
;
}
.delete
{
position
:
relative
;
top
:
4px
;
cursor
:
pointer
;
width
:
16px
;
height
:
16px
;
}
}
.video-name
{
.title
{
display
:
inline-block
;
width
:
70px
;
text-align
:
right
;
margin-right
:
10px
;
}
}
}
}
.word-num
{
font-size
:
12px
;
color
:
#999
;
padding-top
:
5px
;
}
.bg-uploader
{
img
{
float
:
left
;
}
.bg-img-wrapper
{
.bg-img
{
display
:
block
;
width
:
160px
;
height
:
90px
;
}
.bg-img-doctor
{
display
:
block
;
width
:
88px
;
height
:
88px
;
}
}
.bg-video
{
float
:
left
;
width
:
84px
;
height
:
100px
;
}
}
.limit-text
{
position
:
absolute
;
top
:
86px
;
left
:
0px
;
font-size
:
12px
;
color
:
#979899
;
}
.separator-line
{
width
:
100%
;
display
:
flex
;
flex-direction
:
row
;
align-content
:
center
;
align-items
:
center
;
justify-content
:
space-between
;
.center
{
cursor
:
pointer
;
width
:
130px
;
color
:
#666666
;
img
{
width
:
12px
;
}
}
.line-left
,
.line-right
{
// display: inline-block;
// width: 100%;
flex
:
1
;
border-bottom
:
1px
dashed
#e4e7ed
;
}
}
.tips
{
width
:
100%
;
height
:
32px
;
line-height
:
32px
;
padding-left
:
12px
;
background
:
rgba
(
254
,
250
,
245
,
1
);
border-radius
:
3px
;
color
:
#e6a23c
;
}
.valid-msg
{
position
:
relative
;
.error
{
width
:
370px
;
position
:
absolute
;
display
:
flex
;
justify-content
:
space-between
;
top
:
29px
;
font-size
:
13px
;
color
:
#ed3131
;
.text
{
flex
:
1
;
}
.cancle
{
cursor
:
pointer
;
width
:
20px
;
}
}
.edit-wrapper
{
color
:
#449284
;
.edit-img
{
position
:
relative
;
top
:
2px
;
width
:
12px
;
margin
:
0
2px
0
4px
;
}
}
.doctor-select-list
{
width
:
200px
;
// max-height: 100px;
position
:
absolute
;
z-index
:
100
;
background
:
#fff
;
box-shadow
:
0
0
6px
rgba
(
0
,
0
,
0
,
0
.3
);
-webkit-box-shadow
:
0
0
6px
rgba
(
0
,
0
,
0
,
0
.3
);
// margin: 10px;
li
{
padding-left
:
20px
;
cursor
:
pointer
;
&
:hover
{
background
:
#f4f7fd
;
}
&
.doctor-selected
{
background
:
#f4f7fd
;
}
}
}
}
.upload-process
{
margin
:
10px
0
10px
10px
;
display
:
block
;
// width: 310px;
height
:
4px
;
background
:
#449284
;
border-radius
:
2px
;
}
}
.course-content-step2
{
display
:
flex
;
flex-direction
:
column
;
text-align
:
center
;
align-items
:
center
;
.success-img
{
width
:
60px
;
height
:
60px
;
}
.tips-1
{
margin-top
:
30px
;
font-size
:
18px
;
color
:
#303133
;
}
.tips-2
{
margin-top
:
4px
;
margin-bottom
:
40px
;
font-size
:
14px
;
color
:
#999999
;
}
}
}
</
style
>
src/components/education/custom-resource/edit-course-dialog copy 11.vue
已删除
100644 → 0
浏览文件 @
d2298748
<
template
>
<div
class=
"edit-course-wrapper dialog-title-border"
>
<el-dialog
ref=
"testDialogRef"
title=
"上传课程"
:visible=
"dialogVisible"
@
close=
"close"
center
:close-on-click-modal=
"false"
:close-on-press-escape=
"false"
width=
"800px"
>
<div
slot=
"title"
style=
"text-align: left;"
>
<span
style=
"font-weight: 700;"
>
上传课程
</span>
<span
style=
"font-size: 12px;color: #ED3131;margin-left: 4px;"
>
请认真核对上传内容,一旦提交后将不能修改
</span>
</div>
<div
v-show=
"step == 1"
class=
"course-content"
>
<el-form
ref=
"formDataRef"
:model=
"formData"
:rules=
"rules"
label-width=
"120px"
class=
"basic-form"
>
<el-form-item
label=
"课程名称:"
prop=
"courseName"
class=
"valid-msg"
>
<el-col
:span=
"20"
>
<el-input
size=
"small"
v-model=
"formData.courseName"
placeholder=
"请输入课程名称"
style=
"width: 360px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseName
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
<div
v-show=
"needShowAuditMsg && formData.courseNameCheck"
class=
"error"
>
<span>
{{
formData
.
courseNameCheck
}}
</span>
</div>
</el-col>
</el-form-item>
<el-form-item
label=
"学科分类:"
prop=
"subjectIdList"
class=
"valid-msg"
>
<el-col
:span=
"18"
>
<!-- :props="
{ expandTrigger: 'hover' }" -->
<el-cascader
style=
"width: 360px"
v-model=
"formData.subjectIdList"
:options=
"labelOptions"
:props=
"
{ value: 'id', label: 'name', children: 'subList'}"
>
</el-cascader>
</el-col>
</el-form-item>
<el-form-item
label=
"开放范围:"
prop=
"shareType"
>
<el-radio-group
v-model=
"formData.shareType"
>
<el-radio
:label=
"1"
>
机构共享
</el-radio>
</el-radio-group>
</el-form-item>
<div
class=
"basic-item-icon"
>
<span
class=
"require"
>
*
</span>
<el-form-item
label=
"课程视频:"
prop=
"range"
>
<el-upload
class=
"upload-video"
action=
"#"
:before-upload=
"beforeUploadVideo"
:limit=
"3"
:on-exceed=
"handleExceed"
:show-file-list=
"false"
>
<el-button
size=
"small"
type=
"primary"
>
点击上传
</el-button>
<div
slot=
"tip"
class=
"el-upload__tip"
>
<span
class=
"upload-tips"
>
只支持MP4格式,课程视频最多上传100个,单文件最大2G
</span>
<ul
v-show=
"formData.courseCustomChapterModels[0].courseCustomLectureModelList.length"
class=
"custom-list"
>
<li
v-for=
"(lecture, index) in formData.courseCustomChapterModels[0].courseCustomLectureModelList"
:key=
"index"
class=
"valid-msg"
>
<ul
class=
"video"
>
<li>
<span
class=
"title"
>
视频
{{
index
+
1
}}
</span>
<img
src=
"../../../assets/image/phrase3/icon-pin.png"
/>
<span
class=
"name"
@
click=
"previewVideoAction(lecture)"
>
{{
lecture
.
resourceModel
.
name
}}
</span>
</li>
<li>
<img
@
click=
"deleteLecture(index)"
class=
"delete"
src=
"../../../assets/image/phrase3/close.png"
/>
</li>
</ul>
<div
class=
"video-name"
>
<span
class=
"title"
>
<span
>
*
</span>
<span
class=
"video-title"
>
视频名称
</span>
</span>
<el-input
size=
"small"
v-model=
"lecture.name"
placeholder=
"请输入课程名称"
style=
"width: 260px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{
(
lecture
.
name
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
</div>
<div
v-show=
"needShowAuditMsg && !formData.courseCustomChapterModels[0].courseCustomLectureModelList[index].nameCheck"
class=
"error-video"
>
<span>
11
{{
formData
.
courseCustomChapterModels
[
0
].
courseCustomLectureModelList
[
index
].
nameCheck
}}
</span>
</div>
</li>
<span
v-show=
"needShowUploadProcess"
class=
"upload-process"
:style=
"
{'width': (uploadProgress/100 * 340) + 'px'}">
</span>
</ul>
<span
v-if=
"!formData.courseCustomChapterModels[0].courseCustomLectureModelList.length"
v-show=
"needShowUploadProcess"
class=
"upload-process"
:style=
"
{'width': (uploadProgress/100 * 340) + 'px'}">
</span>
</div>
</el-upload>
</el-form-item>
</div>
<div
class=
"other-content valid-msg"
v-show=
"isShowOtherContent"
>
<div
class=
"tips"
>
注:以下信息为非必填项,您也可以根据实际情况修改
</div>
<div
class=
"basic-item-icon"
>
<!--
<span
class=
"require"
>
*
</span>
-->
<el-form-item
label=
"课程封面:"
>
<el-upload
v-model=
"formData.courseIntroImage"
class=
"bg-uploader"
action=
"#"
accept=
"image/*"
:show-file-list=
"false"
:before-upload=
"beforeUpload1"
:disabled=
"disabled"
>
<div
class=
"bg-img-wrapper"
>
<img
v-if=
"formData.courseIntroImage"
@
mouseover
.
stop=
"imgMouseOver=true"
:src=
"formData.courseIntroImage"
class=
"bg-img"
/>
<img
v-if=
"!formData.courseIntroImage"
class=
"bg-img"
src=
"../../../assets/image/small.png"
/>
</div>
</el-upload>
<div
class=
"limit-text"
>
尺寸:750*420,只支持jpeg格式
</div>
</el-form-item>
<p
class=
"upload-message"
v-if=
"uploadImgMessage"
>
请选择列表图片
</p>
</div>
<el-form-item
label=
"课程难度:"
>
<el-radio-group
v-model=
"formData.difficultyLevel"
>
<el-radio
:label=
"1"
>
初级
</el-radio>
<el-radio
:label=
"2"
>
中级
</el-radio>
<el-radio
:label=
"3"
>
高级
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"讲师名称:"
class=
"valid-msg"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
v-model=
"formData.courseCustomDoctorModels[0].courseDoctorName"
placeholder=
"请输入讲师名称"
style=
"width: 360px"
maxlength=
"25"
@
focus=
"isShowDoctorList=true"
@
input=
"filterDoctorName"
@
blur=
"doctorNameInputBlur"
:disabled=
"disabled"
></el-input>
<ul
v-show=
"isShowDoctorList"
class=
"doctor-select-list"
>
<li
v-for=
"(item, index) in doctorNameList"
:key=
"index"
@
click=
"selectDoctor(item.courseDoctorName, index)"
:class=
"
{'doctor-selected': item.seleted}"
>
<span
v-show=
"item.show"
>
{{
item
.
courseDoctorName
||
'测试名'
}}
</span>
</li>
</ul>
<span
class=
"word-num"
>
{{
(
formData
.
courseCustomDoctorModels
[
0
]
&&
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorName
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
</el-col>
</el-form-item>
<div
class=
"basic-item-icon"
>
<el-form-item
label=
"讲师头像:"
>
<el-upload
v-model=
"formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl"
class=
"bg-uploader"
action=
"#"
accept=
"image/*"
:show-file-list=
"false"
:before-upload=
"beforeUpload2"
:disabled=
"disabled"
>
<div
class=
"bg-img-wrapper"
>
<img
v-if=
"formData.courseCustomDoctorModels && formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl || ''"
@
mouseover
.
stop=
"imgMouseOver=true"
:src=
"formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl"
class=
"bg-img-doctor"
/>
<img
v-if=
"!(formData.courseCustomDoctorModels && formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl || '')"
class=
"bg-img-doctor"
src=
"../../../assets/image/small.png"
/>
</div>
</el-upload>
<div
class=
"limit-text"
>
尺寸:88*88,只支持jpeg格式
</div>
</el-form-item>
<p
class=
"upload-message"
v-if=
"uploadImgMessage"
>
请选择列表图片
</p>
</div>
<el-form-item
label=
"所属机构:"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
v-model=
"formData.courseCustomDoctorModels[0].courseDoctorHospital"
placeholder=
"请输入所属机构"
style=
"width: 360px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseCustomDoctorModels
&&
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorHospital
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
</el-col>
</el-form-item>
<el-form-item
label=
"课程简介:"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
type=
"textarea"
maxlength=
"200"
:autosize=
"
{ minRows: 5}"
placeholder="请输入课程简介"
v-model="formData.courseIntro"
style="width:90%;"
>
</el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseIntro
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/200
</span>
</el-col>
</el-form-item>
</div>
<!-- 更多信息 -->
<div
class=
"separator-line"
>
<span
class=
"line-left"
></span>
<div
@
click=
"toggleOtherContent"
class=
"center"
>
<span>
展开更多信息
</span>
<img
v-show=
"isShowOtherContent"
src=
"../../../assets/image/phrase3/arrow-up.png"
/>
<img
v-show=
"!isShowOtherContent"
src=
"../../../assets/image/phrase3/arrow-down.png"
/>
</div>
<span
class=
"line-right"
></span>
</div>
</el-form>
</div>
<div
v-show=
"step == 2"
class=
"course-content-step2"
>
<img
class=
"success-img"
src=
"../../../assets/image/phrase3/icon-audit-success.png"
/>
<span
class=
"tips-1"
>
您上传的课程已成功提交,预计在3-5个工作日内完成审核
</span>
<span
class=
"tips-2"
>
审核通过后,您才可以选择课程完成项目配置。如有任何疑问可联系云鹊医400-920-8877
</span>
<el-button
type=
"primary"
size=
"small"
icon=
"el-icon-back"
@
click=
"backToOrgCourse"
>
返回机构课程
</el-button>
</div>
<div
v-show=
"step == 1"
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"dialogObj.visible=true"
>
取 消
</el-button>
<el-button
type=
"primary"
@
click=
"submitForm('formDataRef')"
>
确 定
</el-button>
</div>
</el-dialog>
<DialogComponet
:dialogObj=
"dialogObj"
@
hide=
"hideCancleTips"
@
confirm=
"dialogObj.visible=false"
></DialogComponet>
<PreviewVideo
:dialogVisible=
"isPreviewVideo"
:videoUrl=
"videoUrl"
@
close=
"isPreviewVideo=false"
></PreviewVideo>
<el-dialog
title=
"拒绝原因"
:visible=
"showCropper"
width=
"1000px"
center
>
<cropper-two
:cropOption=
"cropOption"
@
getCropImg=
"getCropImg(arguments)"
:originImg=
"slide2.oriUrl"
:previewImg=
"slide2.preUrl"
/>
</el-dialog>
<!--
<button
@
click=
"previewVideoAction"
>
test video
</button>
-->
</div>
</
template
>
<
script
>
import
PreviewVideo
from
"@/components/education/custom-resource/preview-video"
;
import
PreviewProtocol
from
"@/components/education/custom-resource/preview-protocol"
;
import
PreviewEditCourse
from
"@/components/education/custom-resource/edit-course-dialog"
;
import
DialogComponet
from
"@/components/education/template/dialog"
;
import
CropperTwo
from
'@/components/common/cropper.two.vue'
import
{
doUpload
,
getFilePath
}
from
"@/utils/qiniu-util"
;
import
{
openLoading
,
closeLoading
,
getQiniuToken1
}
from
"@/utils/utils"
;
import
{
isEmptyUtils
}
from
"@/utils/index"
;
import
{
mapActions
}
from
'vuex'
;
import
{
ossUpload
,
getFilePathForOSS
}
from
"@/utils/oss/ossUtil"
;
let
vm
=
null
;
export
default
{
data
()
{
let
checkCourseName
=
(
rule
,
value
,
callback
)
=>
{
// 如果有审核的信息,则直接报错
if
(
!
value
&&
this
.
needCheckField
)
{
callback
(
new
Error
(
"请输入课程名称"
));
}
else
{
callback
();
}
};
return
{
slide2
:
{
oriUrl
:
'https://avatars1.githubusercontent.com/u/23690568?s=460&v=4'
,
// 原图
preUrl
:
'https://avatars1.githubusercontent.com/u/23690568?s=460&v=4'
// 裁剪后的预览图片,初始化为原图
},
showCropper
:
false
,
cropOption
:
{
offset_x
:
10
,
offset_y
:
10
,
width
:
750
,
height
:
420
},
step
:
1
,
needCheckField
:
false
,
needShowAuditMsg
:
true
,
needShowUploadProcess
:
false
,
disabled
:
false
,
formDataBase
:
{
checkStatus
:
0
,
courseCustomChapterModels
:
[
{
courseCustomLectureModelList
:
[],
id
:
null
,
name
:
"视频课程"
}
],
courseCustomDoctorModels
:
[
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
}
],
courseId
:
null
,
courseIntro
:
""
,
courseIntroCheck
:
""
,
courseIntroImage
:
"https://test1-file.yunqueyi.com/image/png/common/202006201528136.png"
,
courseIntroImageCheck
:
""
,
courseName
:
""
,
courseNameCheck
:
""
,
deleteCustomLectureIds
:
[],
difficultyLevel
:
1
,
shareType
:
1
,
subjectIdList
:
[]
},
formData
:
{
checkStatus
:
0
,
courseCustomChapterModels
:
[
{
courseCustomLectureModelList
:
[],
id
:
null
,
name
:
"视频课程"
}
],
courseCustomDoctorModels
:
[
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
}
],
courseId
:
null
,
courseIntro
:
""
,
courseIntroCheck
:
""
,
courseIntroImage
:
"https://test1-file.yunqueyi.com/image/png/common/202006201528136.png"
,
courseIntroImageCheck
:
""
,
courseName
:
""
,
courseNameCheck
:
""
,
deleteCustomLectureIds
:
[],
difficultyLevel
:
1
,
shareType
:
1
,
subjectIdList
:
[]
},
uploadImgMessage
:
false
,
imgMouseOver
:
false
,
rules
:
{
courseName
:
[
{
required
:
true
,
message
:
" "
},
{
validator
:
checkCourseName
}
],
subjectIdList
:
[
{
required
:
true
,
message
:
"请输入课程名称"
}
],
shareType
:
[
{
required
:
true
,
message
:
"请选择开放范围"
}
]
},
labelOptions
:
[],
isShowOtherContent
:
false
,
fileList
:
[
],
projectBanner
:
"https://file.yunqueyi.com/h5/images/cme/project-banner.png"
,
doctorHeader
:
"https://file.yunqueyi.com/h5/images/cme/doctor-header.png"
,
doctorNameList
:
[
{
courseDoctorName
:
"333"
,
show
:
true
,
seleted
:
false
},
{
courseDoctorName
:
"334"
,
show
:
true
,
seleted
:
false
},
{
courseDoctorName
:
"335"
,
show
:
true
,
seleted
:
false
},
{
courseDoctorName
:
"336"
,
show
:
true
,
seleted
:
false
}
],
isShowDoctorList
:
false
,
isPreviewVideo
:
false
,
videoUrl
:
""
,
orgCourseInfo
:
{
defaultDoctor
:
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
},
doctorModelList
:
[
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
}
],
limitModel
:
{
maxLimitOneVideoSize
:
2147483648
,
maxLimitVideoCount
:
100
,
maxStorageSpace
:
5368709120
,
usedStorageSpace
:
1021842989
}
},
uploadProgress
:
0
,
dialogObj
:
{
visible
:
false
,
title
:
"确定取消吗?"
,
message
:
"发布后,项目将进入审核中,待审核完成后学员可在云鹊医App上参加培训学习"
,
tip
:
""
,
confirmMsg
:
"取 消"
,
hideMsg
:
"确 定"
},
};
},
props
:
{
dialogVisible
:
{
type
:
Boolean
,
default
:
false
},
courseId
:
{
type
:
String
|
Number
,
default
:
0
}
},
computed
:
{},
watch
:
{
dialogVisible
(
isVisible
)
{
this
.
formData
=
JSON
.
parse
(
JSON
.
stringify
(
this
.
formDataBase
));
if
(
isVisible
)
{
if
(
this
.
courseId
==
0
)
{
this
.
initAdd
(
this
.
courseId
);
}
else
{
this
.
initModify
(
this
.
courseId
);
}
}
},
},
components
:
{
PreviewVideo
,
PreviewEditCourse
,
DialogComponet
,
CropperTwo
},
created
()
{
vm
=
this
;
// this.initAdd();
},
mounted
()
{
this
.
getLabelList
();
},
methods
:
{
...
mapActions
([
'setKind'
]),
getCropImg
(
argument
)
{
this
.
showCropper
=
false
;
console
.
log
(
argument
[
0
],
'#####'
,
argument
[
1
]);
this
.
slide2
.
preUrl
=
argument
[
0
]
this
.
cropData
=
argument
[
1
]
},
// 创建课程页面的初始信息
initOrgCourseInfo
()
{
vm
.
GET
(
"contents/course/custom/info/init"
,
{
setEntry
:
true
}).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
this
.
orgCourseInfo
=
res
.
data
;
this
.
formData
.
courseCustomDoctorModels
[
0
]
=
this
.
orgCourseInfo
.
defaultDoctor
;
this
.
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorAvatarUrl
=
this
.
orgCourseInfo
.
defaultDoctor
.
courseDoctorAvatarUrl
||
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
;
this
.
doctorNameList
=
this
.
convertDNameToSelectOpt
(
this
.
orgCourseInfo
.
doctorModelList
);
+
this
.
courseId
&&
this
.
getCourseInfoById
(
this
.
courseId
);
}
}
);
},
// 将医生名称进行处理
convertDNameToSelectOpt
(
doctorModelList
)
{
doctorModelList
.
forEach
(
item
=>
{
item
.
show
=
true
;
item
.
seleted
=
false
;
});
return
doctorModelList
;
},
// 添加时初始化
initAdd
()
{
console
.
log
(
"in initAdd"
);
this
.
step
=
1
;
this
.
needShowAuditMsg
=
false
;
this
.
initOrgCourseInfo
();
},
initModify
()
{
this
.
needShowAuditMsg
=
true
;
console
.
log
(
"in initModify"
);
this
.
initOrgCourseInfo
();
},
// 创建课程页面的初始信息
getCourseInfoById
(
courseId
)
{
vm
.
GET
(
`contents/course/custom/info/
${
courseId
}
`
)
.
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
this
.
formData
=
res
.
data
;
}
}
);
},
// 过滤医生信息
filterDoctorName
(
value
)
{
this
.
doctorNameList
.
forEach
(
item
=>
{
if
(
value
)
{
if
((
item
.
value
+
""
).
indexOf
(
value
)
==
-
1
)
{
item
.
show
=
false
;
}
else
{
item
.
show
=
true
;
}
if
(
item
.
value
==
value
)
{
item
.
seleted
=
true
;
}
else
{
item
.
seleted
=
false
;
}
}
else
{
item
.
show
=
true
;
}
});
},
// 当选择医生的焦点失去时,要反选医生信息
doctorNameInputBlur
()
{
setTimeout
(()
=>
{
this
.
isShowDoctorList
=
false
;
this
.
selectDoctorByName
(
this
.
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorName
);
},
200
);
},
// 根据姓名反选医生信息
// TODO 尝试找到完全匹配的医生
selectDoctorByName
(
name
)
{
},
// 选择其中一个
selectDoctor
(
name
)
{
console
.
log
(
name
);
this
.
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorName
=
name
;
this
.
selectDoctorByName
(
name
);
},
// 关闭当前弹框
close
()
{
this
.
$emit
(
"close"
);
},
// 获取学科列表
getLabelList
()
{
let
req
=
{};
this
.
GET
(
"aggregate/content/labelList"
,
req
).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
this
.
convertLabelList
(
res
.
data
);
}
});
},
// 将所有子分类中的“全部”去掉
convertLabelList
(
labelList
)
{
let
newLabelList
=
[];
labelList
.
forEach
(
item
=>
{
item
.
subList
=
item
.
subList
.
slice
(
1
);
});
this
.
labelOptions
=
labelList
;
},
// 上传视频(mp4)
beforeUploadVideo
(
file
)
{
// orgCourseInfo.limitModel: {
// maxLimitOneVideoSize: 2147483648,
// maxLimitVideoCount: 100,
// maxStorageSpace: 5368709120,
// usedStorageSpace: 1021842989
// }
console
.
log
(
file
);
const
isMP4
=
file
.
type
===
"video/mp4"
;
const
isGt
=
file
.
size
>
this
.
orgCourseInfo
.
limitModel
.
maxLimitOneVideoSize
;
const
isGtMaxNum
=
this
.
formData
.
courseCustomChapterModels
[
0
].
courseCustomLectureModelList
.
length
>=
100
;
const
usedGtMaxStore
=
this
.
orgCourseInfo
.
limitModel
.
usedStorageSpace
+
file
.
size
>
this
.
orgCourseInfo
.
limitModel
.
maxStorageSpace
;
if
(
isGt
||
!
isMP4
||
isGtMaxNum
)
{
this
.
$message
.
error
(
"视频不符合规范,请根据规范上传视频"
);
return
;
}
if
(
usedGtMaxStore
)
{
this
.
$message
.
error
(
"个人存储空间已不够上传此视频"
);
return
;
}
// 直接上传
this
.
needShowUploadProcess
=
true
;
doUpload
(
vm
,
file
,
getFilePath
(
file
,
null
),
"preview4"
,
"progress"
,
""
).
then
(
function
(
path
)
{
// closeLoading(vm);
console
.
log
(
'vm.uploadProgress'
,
vm
.
uploadProgress
);
console
.
log
(
path
);
let
uploadResourceParam
=
{
formatType
:
path
.
ext
,
name
:
path
.
name
.
substring
(
path
.
name
.
length
-
25
),
//path.name,
qCloudUrl
:
path
.
fullPath
,
size
:
path
.
size
,
fileType
:
1
,
status
:
"success"
,
uid
:
new
Date
().
getTime
()
}
vm
.
needShowUploadProcess
=
false
;
vm
.
uploadProgress
=
0
;
vm
.
insertResourceAction
(
uploadResourceParam
);
});
},
// 上传资源(视频)后,生存对应的节
insertResourceAction
(
uploadResourceParam
)
{
this
.
POST
(
"contents/course/custom/info/insertResource"
,
[
uploadResourceParam
]).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
let
cName
=
res
.
data
.
resourceModelList
[
0
].
name
;
// cName = cName.substr(0, cName.lastIndexOf('.'));
let
lectureObj
=
{
id
:
null
,
name
:
cName
,
nameCheck
:
""
,
contentCheck
:
""
,
resourceModel
:
{}
}
this
.
orgCourseInfo
.
limitModel
=
res
.
data
.
limitModel
;
lectureObj
.
resourceModel
=
res
.
data
&&
res
.
data
.
resourceModelList
[
0
];
this
.
formData
.
courseCustomChapterModels
[
0
].
courseCustomLectureModelList
.
push
(
lectureObj
);
}
});
},
//上传列表图片
beforeUploadListPic
(
file
)
{
let
fileLimit
=
{
width
:
230
,
height
:
172
,
size
:
0.5
,
sizeText
:
"500K"
,
key
:
"attachmentUrl"
,
more
:
"attachmentMore1"
,
show
:
"uploadImgMessage"
};
vm
.
beforeAvatarUpload2
(
file
,
fileLimit
);
// vm.beforeAvatarUpload(file, fileLimit);
},
//上传图片校验
beforeAvatarUpload2
(
file
,
fileLimit
)
{
console
.
log
();
const
isJPG
=
file
.
type
===
"image/jpeg"
;
const
isPNG
=
file
.
type
===
"image/png"
;
const
isLt2M
=
file
.
size
/
1024
/
1024
<
fileLimit
.
size
;
console
.
log
(
"isJPG"
,
isJPG
,
"isPNG"
,
isPNG
,
"isLt2M"
,
isLt2M
);
// if (!isJPG && !isPNG) {
// vm.$message.error("图片不符合规范,请根据规范上传图片");
// return;
// }
// if (!isLt2M) {
// vm.$message.error("图片不符合规范,请根据规范上传图片 ");
// return;
// }
let
_img
=
new
FileReader
();
_img
.
readAsDataURL
(
file
);
console
.
log
(
'readAsDataURL'
,
_img
,
file
);
_img
.
onload
=
function
(
theFile
)
{
let
image
=
new
Image
();
image
.
src
=
theFile
.
target
.
result
;
vm
.
slide2
.
oriUrl
=
theFile
.
target
.
result
;
vm
.
showCropper
=
true
;
console
.
log
(
'readAsDataURL222'
,
_img
.
width
,
file
,
theFile
);
image
.
onload
=
function
()
{
console
.
log
(
'image.onload'
,
image
);
let
_vm
=
this
;
if
(
false
// true ||
// _vm.width != fileLimit.width ||
// _vm.height != fileLimit.height
)
{
vm
.
$message
.
error
(
"图片不符合规范,请根据规范上传图片"
);
}
else
{
// openLoading(vm);
// doUpload(
// vm,
// file,
// getFilePath(file, null),
// "preview4",
// "progress1",
// 1
// ).then(function(path) {
// closeLoading(vm);
// console.log(path);
// if (fileLimit.show == "uploadImgMessage") {
// vm.uploadImgMessage = false;
// }
// // else if (fileLimit.show == "uploadImgMessage2") {
// // vm.uploadImgMessage2 = false;
// // }
// vm.formData[fileLimit.key] = path.fullPath;
// vm.formData[fileLimit.more] = {
// attachmentName: path.name,
// attachmentExt: path.ext,
// attachmentSize: path.size
// };
// vm.$message.success("上传成功");
// });
}
};
};
return
isJPG
&&
isLt2M
;
},
//上传图片校验
beforeAvatarUpload
(
file
,
fileLimit
)
{
console
.
log
();
const
isJPG
=
file
.
type
===
"image/jpeg"
;
const
isPNG
=
file
.
type
===
"image/png"
;
const
isLt2M
=
file
.
size
/
1024
/
1024
<
fileLimit
.
size
;
console
.
log
(
"isJPG"
,
isJPG
,
"isPNG"
,
isPNG
,
"isLt2M"
,
isLt2M
);
// if (!isJPG && !isPNG) {
// vm.$message.error("图片不符合规范,请根据规范上传图片");
// return;
// }
// if (!isLt2M) {
// vm.$message.error("图片不符合规范,请根据规范上传图片 ");
// return;
// }
let
_img
=
new
FileReader
();
_img
.
readAsDataURL
(
file
);
_img
.
onload
=
function
(
theFile
)
{
let
image
=
new
Image
();
image
.
src
=
theFile
.
target
.
result
;
image
.
onload
=
function
()
{
let
_vm
=
this
;
if
(
false
// true ||
// _vm.width != fileLimit.width ||
// _vm.height != fileLimit.height
)
{
vm
.
$message
.
error
(
"图片不符合规范,请根据规范上传图片"
);
}
else
{
openLoading
(
vm
);
doUpload
(
vm
,
file
,
getFilePath
(
file
,
null
),
"preview4"
,
"progress1"
,
1
).
then
(
function
(
path
)
{
closeLoading
(
vm
);
console
.
log
(
path
);
if
(
fileLimit
.
show
==
"uploadImgMessage"
)
{
vm
.
uploadImgMessage
=
false
;
}
// else if (fileLimit.show == "uploadImgMessage2") {
// vm.uploadImgMessage2 = false;
// }
vm
.
formData
[
fileLimit
.
key
]
=
path
.
fullPath
;
vm
.
formData
[
fileLimit
.
more
]
=
{
attachmentName
:
path
.
name
,
attachmentExt
:
path
.
ext
,
attachmentSize
:
path
.
size
};
vm
.
$message
.
success
(
"上传成功"
);
});
}
};
};
return
isJPG
&&
isLt2M
;
},
// 展开/收起 更多信息
toggleOtherContent
()
{
this
.
isShowOtherContent
=
!
this
.
isShowOtherContent
;
},
// 限制选择文件个数
handleExceed
(
files
,
fileList
)
{
this
.
$message
.
warning
(
`当前限制选择 100 个文件,您已经共选择了
${
files
.
length
+
fileList
.
length
}
个文件!`
);
},
// 删除按钮
beforeRemove
(
file
,
fileList
)
{
return
this
.
$confirm
(
`确定移除
${
file
.
name
}
?`
);
},
//表单校验
submitForm
(
formName
)
{
this
.
needShowAuditMsg
=
false
;
this
.
$refs
[
formName
].
validate
(
valid
=>
{
if
(
valid
)
{
this
.
insertOrUpdate
();
}
else
{
console
.
log
(
"error submit!!"
);
}
this
.
needShowAuditMsg
=
true
;
});
},
// 添加或修改课程(kind = 3)
insertOrUpdate
()
{
this
.
POST
(
"contents/course/custom/info/insertOrUpdate"
,
this
.
formData
).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
if
(
this
.
courseId
==
'add'
)
{
this
.
step
=
2
;
}
else
{
this
.
close
();
this
.
setKind
(
3
);
}
}
});
},
// 返回到课程选择页面(kind = 3)
backToOrgCourse
()
{
this
.
close
();
this
.
setKind
(
3
);
},
// 关闭(“取消”按钮弹出来的)弹框
hideCancleTips
()
{
this
.
dialogObj
.
visible
=
false
;
this
.
close
();
},
// 预览视频
previewVideoAction
(
lecture
)
{
this
.
videoUrl
=
lecture
.
resourceModel
.
filePath
;
this
.
isPreviewVideo
=
true
;
},
// 删除本节视频
// TODO 要将删除的节ID放在删除的节里
deleteLecture
(
index
)
{
this
.
formData
.
courseCustomChapterModels
[
0
].
courseCustomLectureModelList
.
splice
(
index
,
1
);
},
// 上传课程封面图片
beforeUpload1
(
file
)
{
// const isLt50kb = file.size / 1024
<
50
;
const
isJPG
=
file
.
type
===
'image/jpeg'
if
(
!
isJPG
)
{
this
.
$message
.
error
(
'只支持jpeg格式'
)
return
;
}
var
_img
=
new
FileReader
()
_img
.
readAsDataURL
(
file
)
_img
.
onload
=
function
(
theFile
)
{
let
image
=
new
Image
()
image
.
src
=
theFile
.
target
.
result
image
.
onload
=
function
()
{
let
_this
=
this
if
(
_this
.
width
!=
740
||
_this
.
height
!=
420
)
{
vm
.
$message
.
info
(
"上传图片尺寸大小不合适,请重新上传"
)
}
else
{
vm
.
doUploadOSS
(
file
,
1
);
//封面图片
}
}
}
},
// 上传讲师图片
beforeUpload2
(
file
)
{
// const isLt50kb = file.size / 1024
<
50
;
const
isJPG
=
file
.
type
===
'image/jpeg'
if
(
!
isJPG
)
{
this
.
$message
.
error
(
'只支持jpeg格式'
)
return
;
}
var
_img
=
new
FileReader
()
_img
.
readAsDataURL
(
file
)
_img
.
onload
=
function
(
theFile
)
{
let
image
=
new
Image
()
image
.
src
=
theFile
.
target
.
result
image
.
onload
=
function
()
{
let
_this
=
this
if
(
_this
.
width
!=
88
||
_this
.
height
!=
88
)
{
vm
.
$message
.
info
(
"上传图片尺寸大小不合适,请重新上传"
)
}
else
{
vm
.
doUploadOSS
(
file
,
2
);
//封面图片
}
}
}
},
// (调用OSS API)开始上传
doUploadOSS
(
file
,
index
)
{
let
self
=
this
;
//上传 指定文件名
ossUpload
(
self
,
file
,
getFilePathForOSS
(
file
),
null
,
null
,
null
).
then
(
function
(
path
)
{
let
list
=
[{}];
// list[0].name = file.name;
// list[0].url = localStorage.getItem("resource_url") + path;
if
(
index
===
1
)
{
}
else
if
(
index
===
2
)
{
}
self
.
$message
.
success
(
"上传成功"
);
});
return
false
;
},
}
};
</
script
>
<
style
scoped
lang=
"scss"
>
.edit-course-wrapper
{
.course-content
{
// color: red;
.basic-item-icon
{
position
:
relative
;
margin-top
:
20px
;
.require
{
position
:
absolute
;
left
:
40px
;
top
:
11px
;
color
:
#f56c6c
;
}
.upload-message
{
position
:
absolute
;
left
:
160px
;
top
:
105px
;
font-size
:
12px
;
color
:
#f56c6c
;
}
.img-delete
{
position
:
absolute
;
left
:
0px
;
top
:
0px
;
width
:
84px
;
height
:
100px
;
background
:
#000
;
opacity
:
0
.7
;
z-index
:
999
;
i
{
color
:
#fff
;
margin-top
:
39px
;
margin-left
:
0px
;
}
}
.upload-tips
{
width
:
100%
;
position
:
relative
;
top
:
-10px
;
font-size
:
12px
;
color
:
#979899
;
// display: inline-block;
}
.custom-list
{
// width: 100%;
width
:
480px
;
display
:
flex
;
flex-direction
:
column
;
border-radius
:
3px
;
border
:
1px
solid
rgba
(
228
,
231
,
237
,
1
);
padding
:
20px
;
font-size
:
14px
;
&
>
li
{
margin
:
10px
0
;
}
.video
{
display
:
flex
;
flex-direction
:
row
;
justify-content
:
space-between
;
align-items
:
center
;
.title
{
display
:
inline-block
;
width
:
70px
;
text-align
:
right
;
margin-right
:
10px
;
}
.name
{
cursor
:
pointer
;
color
:
#5890DD
;
}
img
{
width
:
12px
;
height
:
12px
;
}
.delete
{
position
:
relative
;
top
:
4px
;
cursor
:
pointer
;
width
:
16px
;
height
:
16px
;
}
}
.video-name
{
.title
{
display
:
inline-block
;
width
:
70px
;
text-align
:
right
;
margin-right
:
10px
;
}
}
}
}
.word-num
{
font-size
:
12px
;
color
:
#999
;
padding-top
:
5px
;
}
.bg-uploader
{
img
{
float
:
left
;
}
.bg-img-wrapper
{
.bg-img
{
display
:
block
;
width
:
160px
;
height
:
90px
;
}
.bg-img-doctor
{
display
:
block
;
width
:
88px
;
height
:
88px
;
}
}
.bg-video
{
float
:
left
;
width
:
84px
;
height
:
100px
;
}
}
.limit-text
{
position
:
absolute
;
top
:
86px
;
left
:
0px
;
font-size
:
12px
;
color
:
#979899
;
}
.separator-line
{
width
:
100%
;
display
:
flex
;
flex-direction
:
row
;
align-content
:
center
;
align-items
:
center
;
justify-content
:
space-between
;
.center
{
cursor
:
pointer
;
width
:
130px
;
color
:
#666666
;
img
{
width
:
12px
;
}
}
.line-left
,
.line-right
{
// display: inline-block;
// width: 100%;
flex
:
1
;
border-bottom
:
1px
dashed
#e4e7ed
;
}
}
.tips
{
width
:
100%
;
height
:
32px
;
line-height
:
32px
;
padding-left
:
12px
;
background
:
rgba
(
254
,
250
,
245
,
1
);
border-radius
:
3px
;
color
:
#e6a23c
;
}
.valid-msg
{
position
:
relative
;
.error
{
width
:
370px
;
position
:
absolute
;
display
:
flex
;
justify-content
:
space-between
;
top
:
29px
;
font-size
:
13px
;
color
:
#ed3131
;
.text
{
flex
:
1
;
}
.cancle
{
cursor
:
pointer
;
width
:
20px
;
}
}
.edit-wrapper
{
color
:
#449284
;
.edit-img
{
position
:
relative
;
top
:
2px
;
width
:
12px
;
margin
:
0
2px
0
4px
;
}
}
.doctor-select-list
{
width
:
200px
;
// max-height: 100px;
position
:
absolute
;
z-index
:
100
;
background
:
#fff
;
box-shadow
:
0
0
6px
rgba
(
0
,
0
,
0
,
0
.3
);
-webkit-box-shadow
:
0
0
6px
rgba
(
0
,
0
,
0
,
0
.3
);
// margin: 10px;
li
{
padding-left
:
20px
;
cursor
:
pointer
;
&
:hover
{
background
:
#f4f7fd
;
}
&
.doctor-selected
{
background
:
#f4f7fd
;
}
}
}
}
.upload-process
{
margin
:
10px
0
10px
10px
;
display
:
block
;
// width: 310px;
height
:
4px
;
background
:
#449284
;
border-radius
:
2px
;
}
}
.course-content-step2
{
display
:
flex
;
flex-direction
:
column
;
text-align
:
center
;
align-items
:
center
;
.success-img
{
width
:
60px
;
height
:
60px
;
}
.tips-1
{
margin-top
:
30px
;
font-size
:
18px
;
color
:
#303133
;
}
.tips-2
{
margin-top
:
4px
;
margin-bottom
:
40px
;
font-size
:
14px
;
color
:
#999999
;
}
}
}
</
style
>
src/components/education/custom-resource/edit-course-dialog copy 2.vue
已删除
100644 → 0
浏览文件 @
d2298748
<
template
>
<div
class=
"edit-course-wrapper dialog-title-border"
>
<el-dialog
ref=
"testDialogRef"
title=
"上传课程"
:visible=
"dialogVisible"
@
close=
"close"
center
:close-on-click-modal=
"false"
:close-on-press-escape=
"false"
width=
"800px"
>
<div
slot=
"title"
style=
"text-align: left;"
>
<span
style=
"font-weight: 700;"
>
上传课程
</span>
<span
style=
"font-size: 12px;color: #999;"
>
请认真核对上传内容,一旦提交后将不能修改
</span>
</div>
<div
class=
"course-content"
>
<el-form
ref=
"formDataRef"
:model=
"formData"
:rules=
"rules"
label-width=
"120px"
class=
"basic-form"
>
<el-form-item
label=
"课程名称:"
prop=
"courseName"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
v-model=
"formData.courseName"
placeholder=
"请输入课程名称"
style=
"width: 360px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseName
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
</el-col>
</el-form-item>
<el-form-item
label=
"学科分类:"
prop=
"subjectId"
>
<el-col
:span=
"18"
>
<!-- :props="
{ expandTrigger: 'hover' }" -->
<el-cascader
style=
"width: 360px"
v-model=
"formData.subjectIdList"
:options=
"labelOptions"
:props=
"
{ value: 'id', label: 'name', children: 'subList'}"
@change="handleChange">
<!--
<template
slot-scope=
"
{ node, data }">
<span>
{{
data
.
name
}}
</span>
</
template
>
-->
</el-cascader>
</el-col>
</el-form-item>
<el-form-item
label=
"开放范围:"
prop=
"shareType"
>
<el-radio-group
v-model=
"formData.shareType"
>
<el-radio
:label=
"1"
>
机构共享
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"课程视频:"
prop=
"range"
>
<!-- action="https://jsonplaceholder.typicode.com/posts/" -->
<el-upload
class=
"upload-demo"
action=
"https://sc.yunqueyi.com/contents/admin/qiniu/token1"
:on-preview=
"handlePreview"
:on-remove=
"handleRemove"
:before-remove=
"beforeRemove"
multiple
:limit=
"100"
:on-exceed=
"handleExceed"
:file-list=
"fileList"
>
<el-button
size=
"small"
type=
"primary"
>
点击上传
</el-button>
<div
slot=
"tip"
class=
"el-upload__tip"
>
只能上传jpg/png文件,且不超过500kb
</div>
</el-upload>
</el-form-item>
<div
class=
"other-content"
v-show=
"isShowOtherContent"
>
<div
class=
"tips"
>
注:以下信息为非必填项,您也可以根据实际情况修改
</div>
<div
class=
"basic-item-icon"
>
<!-- <span class="require">*</span> -->
<el-form-item
label=
"课程封面:"
>
<el-upload
v-model=
"formData.courseHeaderImage"
class=
"bg-uploader"
action=
"#"
:show-file-list=
"false"
:before-upload=
"beforeUploadListPic"
:disabled=
"disabled"
>
<div
class=
"bg-img-wrapper"
>
<img
v-if=
"formData.courseHeaderImage"
@
mouseover
.
stop=
"imgMouseOver=true"
:src=
"formData.courseHeaderImage"
class=
"bg-img"
>
<img
v-if=
"!formData.courseHeaderImage"
class=
"bg-img"
src=
"../../../assets/image/small.png"
>
</div>
<!-- <div class="img-delete" v-show="imgMouseOver && !disabled" @click.stop="deleteImg(1)" @mouseout.stop="imgMouseOver=false"><i class="el-icon-delete"></i></div> -->
</el-upload>
<div
class=
"limit-text"
>
尺寸:750*420,只支持jpeg格式
</div>
</el-form-item>
<p
class=
"upload-message"
v-if=
"uploadImgMessage"
>
请选择列表图片
</p>
</div>
<el-form-item
label=
"课程难度:"
>
<el-radio-group
v-model=
"formData.difficultyLevel"
>
<el-radio
:label=
"1"
>
初级
</el-radio>
<el-radio
:label=
"2"
>
中级
</el-radio>
<el-radio
:label=
"3"
>
高级
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"讲师名称:"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
v-model=
"formData.courseCustomDocterModel[0].courseDoctorName"
placeholder=
"请输入讲师名称"
style=
"width: 360px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{(formData.courseCustomDocterModel[0].courseDoctorName).replace(/\s+/g,"").length}}/25
</span>
</el-col>
</el-form-item>
<div
class=
"basic-item-icon"
>
<el-form-item
label=
"讲师头像:"
>
<el-upload
v-model=
"formData.courseCustomDocterModel[0].courseDoctorAvatarUrl"
class=
"bg-uploader"
action=
"#"
:show-file-list=
"false"
:before-upload=
"beforeUploadListPic"
:disabled=
"disabled"
>
<div
class=
"bg-img-wrapper"
>
<img
v-if=
"formData.courseCustomDocterModel[0].courseDoctorAvatarUrl"
@
mouseover
.
stop=
"imgMouseOver=true"
:src=
"formData.courseCustomDocterModel[0].courseDoctorAvatarUrl"
class=
"bg-img-doctor"
>
<img
v-if=
"!formData.courseCustomDocterModel[0].courseDoctorAvatarUrl"
class=
"bg-img-doctor"
src=
"../../../assets/image/small.png"
>
</div>
<!-- <div class="img-delete" v-show="imgMouseOver && !disabled" @click.stop="deleteImg(1)" @mouseout.stop="imgMouseOver=false"><i class="el-icon-delete"></i></div> -->
</el-upload>
<div
class=
"limit-text"
>
尺寸:88*88,只支持jpeg格式
</div>
</el-form-item>
<p
class=
"upload-message"
v-if=
"uploadImgMessage"
>
请选择列表图片
</p>
</div>
<el-form-item
label=
"所属机构:"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
v-model=
"formData.courseCustomDocterModel[0].courseDoctorHospital"
placeholder=
"请输入所属机构"
style=
"width: 360px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{(formData.courseCustomDocterModel[0].courseDoctorHospital).replace(/\s+/g,"").length}}/25
</span>
</el-col>
</el-form-item>
<el-form-item
label=
"课程简介:"
>
<el-col
:span=
"22"
>
<el-input
size=
"small"
type=
"textarea"
:autosize=
"{ minRows: 5}"
placeholder=
"请输入课程简介"
v-model=
"formData.courseIntro"
style=
"width:90%;"
></el-input>
<span
class=
"word-num"
>
{{(formData.courseIntro).replace(/\s+/g,"").length}}/200
</span>
</el-col>
</el-form-item>
</div>
<!-- 更多信息 -->
<div
class=
"separator-line"
>
<span
class=
"line-left"
></span>
<div
@
click=
"toggleOtherContent"
class=
"center"
>
<span>
展开更多信息
</span>
<img
v-show=
"isShowOtherContent"
src=
"../../../assets/image/phrase3/arrow-up.png"
/>
<img
v-show=
"!isShowOtherContent"
src=
"../../../assets/image/phrase3/arrow-down.png"
/>
</div>
<span
class=
"line-right"
></span>
</div>
</el-form>
</div>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"close"
>
取 消
</el-button>
<el-button
type=
"primary"
@
click=
"submitForm('formDataRef')"
>
确 定
</el-button>
</div>
</el-dialog>
</div>
</template>
<
script
>
import
{
doUpload
,
getFilePath
}
from
"@/utils/qiniu-util"
;
import
{
openLoading
,
closeLoading
,
getQiniuToken1
}
from
"@/utils/utils"
;
let
vm
=
null
;
export
default
{
data
()
{
let
checkCourseName
=
(
rule
,
value
,
callback
)
=>
{
// 如果有审核的信息,则直接报错
if
(
this
.
needShowAuditMsg
&&
this
.
auditMsgMap
.
name
.
desc
)
{
callback
(
new
Error
(
this
.
auditMsgMap
.
name
.
desc
));
return
;
}
if
(
!
this
.
needShowAuditMsg
&&
!
value
)
{
callback
(
new
Error
(
'请输入课程名称'
));
}
else
{
callback
();
}
};
return
{
needShowAuditMsg
:
true
,
auditMsgMap
:
{
name
:
{
desc
:
'填写的课程名称不对'
}
},
disabled
:
false
,
formData
:
{
checkStatus
:
0
,
courseCustomChapterModel
:
[{
courseCustomLectureModelList
:
[
{
contentCheck
:
''
,
id
:
0
,
name
:
''
,
nameCheck
:
''
,
resourceModel
:
{
createdId
:
0
,
createdTime
:
''
,
deleteFlag
:
0
,
filePath
:
''
,
fileType
:
0
,
formatType
:
0
,
hospitalId
:
0
,
id
:
0
,
idType
:
0
,
lectureId
:
0
,
modifiedId
:
0
,
modifiedTime
:
''
,
name
:
''
,
operateKey
:
''
,
page
:
0
,
resolutionRatio
:
''
,
size
:
0
,
status
:
0
,
totalTime
:
0
,
type
:
0
,
videoType
:
0
}
}
],
id
:
0
,
name
:
''
}],
courseCustomDocterModel
:
[
{
courseDoctorAvatarUrl
:
'https://file.yunqueyi.com/h5/images/cme/doctor-header.png'
,
courseDoctorHospital
:
''
,
courseDoctorHospitalCheck
:
''
,
courseDoctorName
:
''
,
courseDoctorNameCheck
:
''
,
id
:
0
}
],
courseHeaderImage
:
'https://file.yunqueyi.com/h5/images/cme/project-banner.png'
,
courseId
:
0
,
courseIntro
:
''
,
courseIntroCheck
:
''
,
courseName
:
''
,
courseNameCheck
:
''
,
difficultyLevel
:
1
,
shareType
:
1
,
subjectIdList
:
[
410
,
423
]
},
uploadImgMessage
:
false
,
imgMouseOver
:
false
,
rules
:
{
courseName
:
[
{
required
:
true
,
message
:
"请输入课程名称"
},
{
validator
:
checkCourseName
}
],
subjectIdList
:
[
{
required
:
true
,
message
:
"请输入课程名称"
,
trigger
:
"blur"
},
],
range
:
[
{
required
:
true
,
message
:
"请选择开放范围"
,
trigger
:
"blur"
},
],
},
labelOptions
:
[],
isShowOtherContent
:
false
,
fileList
:
[
{
name
:
'food.jpeg'
,
url
:
'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'
},
{
name
:
'food2.jpeg'
,
url
:
'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'
}
],
projectBanner
:
'https://file.yunqueyi.com/h5/images/cme/project-banner.png'
,
doctorHeader
:
'https://file.yunqueyi.com/h5/images/cme/doctor-header.png'
,
};
},
props
:
{
dialogVisible
:
{
type
:
Boolean
,
default
:
false
}
},
computed
:
{
},
created
()
{
vm
=
this
;
},
mounted
()
{
this
.
getLabelList
();
// setTimeout(() => {
// console.log(this.$refs.formDataRef);
// this.$refs['formDataRef'].validateField("name");
// }, 2000);
},
methods
:
{
close
()
{
this
.
$emit
(
'close'
);
},
// 获取学科列表
getLabelList
()
{
let
req
=
{};
this
.
GET
(
"aggregate/content/labelList"
,
req
).
then
(
res
=>
{
if
(
res
.
code
==
'000000'
)
{
// TODO
this
.
convertLabelList
(
res
.
data
);
// this.labelOptions = res.data;
}
});
},
// 将所有子分类中的“全部”去掉
convertLabelList
(
labelList
)
{
let
newLabelList
=
[];
labelList
.
forEach
(
item
=>
{
item
.
subList
=
item
.
subList
.
slice
(
1
);
})
this
.
labelOptions
=
labelList
;
},
//上传列表图片
beforeUploadListPic
(
file
)
{
let
fileLimit
=
{
width
:
230
,
height
:
172
,
size
:
0.5
,
sizeText
:
"500K"
,
key
:
"attachmentUrl"
,
more
:
"attachmentMore1"
,
show
:
"uploadImgMessage"
};
vm
.
beforeAvatarUpload
(
file
,
fileLimit
);
},
//上传图片校验
beforeAvatarUpload
(
file
,
fileLimit
)
{
const
isJPG
=
file
.
type
===
"image/jpeg"
;
const
isPNG
=
file
.
type
===
"image/png"
;
const
isLt2M
=
file
.
size
/
1024
/
1024
<
fileLimit
.
size
;
console
.
log
(
'isJPG'
,
isJPG
,
'isPNG'
,
isPNG
,
'isLt2M'
,
isLt2M
);
if
(
!
isJPG
&&
!
isPNG
)
{
vm
.
$message
.
error
(
"图片不符合规范,请根据规范上传图片"
);
return
;
}
if
(
!
isLt2M
)
{
vm
.
$message
.
error
(
"图片不符合规范,请根据规范上传图片 "
);
return
;
}
let
_img
=
new
FileReader
();
_img
.
readAsDataURL
(
file
);
_img
.
onload
=
function
(
theFile
)
{
let
image
=
new
Image
();
image
.
src
=
theFile
.
target
.
result
;
image
.
onload
=
function
()
{
let
_vm
=
this
;
if
(
false
// true ||
// _vm.width != fileLimit.width ||
// _vm.height != fileLimit.height
)
{
vm
.
$message
.
error
(
"图片不符合规范,请根据规范上传图片"
);
}
else
{
openLoading
(
vm
);
doUpload
(
vm
,
file
,
getFilePath
(
file
,
null
),
"preview4"
,
"progress1"
,
1
).
then
(
function
(
path
)
{
closeLoading
(
vm
);
console
.
log
(
path
);
if
(
fileLimit
.
show
==
"uploadImgMessage"
)
{
vm
.
uploadImgMessage
=
false
;
}
// else if (fileLimit.show == "uploadImgMessage2") {
// vm.uploadImgMessage2 = false;
// }
vm
.
formData
[
fileLimit
.
key
]
=
path
.
fullPath
;
vm
.
formData
[
fileLimit
.
more
]
=
{
attachmentName
:
path
.
name
,
attachmentExt
:
path
.
ext
,
attachmentSize
:
path
.
size
};
vm
.
$message
.
success
(
"上传成功"
);
});
}
};
};
return
isJPG
&&
isLt2M
;
},
// 删除图片
deleteImg
(
type
)
{
if
(
type
==
1
)
{
vm
.
formData
.
attachmentUrl
=
""
;
vm
.
imgMouseOver
=
false
;
}
else
{
// vm.formData.attachmentUrl2 = "";
// vm.imgMouseOver2 = false;
}
},
toggleOtherContent
()
{
this
.
isShowOtherContent
=
!
this
.
isShowOtherContent
;
},
// 上传文件相关
handleRemove
(
file
,
fileList
)
{
console
.
log
(
file
,
fileList
);
},
handlePreview
(
file
)
{
console
.
log
(
file
);
},
handleExceed
(
files
,
fileList
)
{
this
.
$message
.
warning
(
`当前限制选择 3 个文件,本次选择了
${
files
.
length
}
个文件,共选择了
${
files
.
length
+
fileList
.
length
}
个文件`
);
},
beforeRemove
(
file
,
fileList
)
{
return
this
.
$confirm
(
`确定移除
${
file
.
name
}
?`
);
},
//表单校验
submitForm
(
formName
)
{
console
.
log
(
'this.formData'
,
this
.
formData
);
this
.
needShowAuditMsg
=
false
;
let
flag
=
null
;
this
.
$refs
[
formName
].
validate
(
valid
=>
{
if
(
valid
)
{
//console.log("success");
flag
=
true
;
}
else
{
console
.
log
(
"error submit!!"
);
flag
=
false
;
}
});
return
flag
;
},
handleChange
(
value
)
{
console
.
log
(
value
);
},
}
};
</
script
>
<
style
scoped
lang=
"scss"
>
.edit-course-wrapper
{
.course-content
{
// color: red;
.basic-item-icon
{
position
:
relative
;
margin-top
:
20px
;
.require
{
position
:
absolute
;
left
:
40px
;
top
:
11px
;
color
:
#f56c6c
;
}
.upload-message
{
position
:
absolute
;
left
:
160px
;
top
:
105px
;
font-size
:
12px
;
color
:
#f56c6c
;
}
.img-delete
{
position
:
absolute
;
left
:
0px
;
top
:
0px
;
width
:
84px
;
height
:
100px
;
background
:
#000
;
opacity
:
0
.7
;
z-index
:
999
;
i
{
color
:
#fff
;
margin-top
:
39px
;
margin-left
:
0px
;
}
}
}
.word-num
{
font-size
:
12px
;
color
:
#999
;
padding-top
:
5px
;
}
.bg-uploader
{
img
{
float
:
left
;
}
.bg-img-wrapper
{
.bg-img
{
display
:
block
;
width
:
160px
;
height
:
90px
;
}
.bg-img-doctor
{
display
:
block
;
width
:
88px
;
height
:
88px
;
}
}
.bg-video
{
float
:
left
;
width
:
84px
;
height
:
100px
;
}
}
.limit-text
{
position
:
absolute
;
top
:
86px
;
left
:
0px
;
font-size
:
12px
;
color
:
#979899
;
}
.separator-line
{
width
:
100%
;
display
:
flex
;
flex-direction
:
row
;
align-content
:
center
;
align-items
:
center
;
justify-content
:
space-between
;
.center
{
cursor
:
pointer
;
width
:
130px
;
color
:
#666666
;
img
{
width
:
12px
;
}
}
.line-left
,
.line-right
{
// display: inline-block;
// width: 100%;
flex
:
1
;
border-bottom
:
1px
dashed
#E4E7ED
;
}
}
.tips
{
width
:
100%
;
height
:
32px
;
line-height
:
32px
;
padding-left
:
12px
;
background
:rgba
(
254
,
250
,
245
,
1
)
;
border-radius
:
3px
;
color
:
#E6A23C
;
}
}
}
</
style
>
src/components/education/custom-resource/edit-course-dialog copy 3.vue
已删除
100644 → 0
浏览文件 @
d2298748
<
template
>
<div
class=
"edit-course-wrapper dialog-title-border"
>
<el-dialog
ref=
"testDialogRef"
title=
"上传课程"
:visible=
"dialogVisible"
@
close=
"close"
center
:close-on-click-modal=
"false"
:close-on-press-escape=
"false"
width=
"800px"
>
<div
slot=
"title"
style=
"text-align: left;"
>
<span
style=
"font-weight: 700;"
>
上传课程
</span>
<span
style=
"font-size: 12px;color: #999;"
>
请认真核对上传内容,一旦提交后将不能修改
</span>
</div>
<div
class=
"course-content"
>
<el-form
ref=
"formDataRef"
:model=
"formData"
:rules=
"rules"
label-width=
"120px"
class=
"basic-form"
>
<el-form-item
label=
"课程名称:"
prop=
"courseName"
class=
"valid-msg"
>
<el-col
:span=
"20"
>
<el-input
size=
"small"
v-model=
"formData.courseName"
placeholder=
"请输入课程名称"
style=
"width: 360px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseName
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
<span
class=
"edit-wrapper"
><img
class=
"edit-img"
src=
"../../../assets/image/phrase3/icon-pin.png"
>
修改信息
</span>
</span>
<div
class=
"error"
><span>
错误信息错误信息错误信息错误信息错误信息错误信息息
</span><span
class=
"cancle"
>
X
</span></div>
</el-col>
</el-form-item>
<el-form-item
label=
"学科分类:"
prop=
"subjectIdList"
class=
"valid-msg"
>
<el-col
:span=
"18"
>
<!-- :props="
{ expandTrigger: 'hover' }" -->
<el-cascader
style=
"width: 360px"
v-model=
"formData.subjectIdList"
:options=
"labelOptions"
:props=
"
{ value: 'id', label: 'name', children: 'subList'}"
@change="handleChange">
<!--
<template
slot-scope=
"
{ node, data }">
<span>
{{
data
.
name
}}
</span>
</
template
>
-->
</el-cascader>
</el-col>
</el-form-item>
<el-form-item
label=
"开放范围:"
prop=
"shareType"
class=
"valid-msg"
>
<el-radio-group
v-model=
"formData.shareType"
>
<el-radio
:label=
"1"
>
机构共享
</el-radio>
</el-radio-group>
</el-form-item>
<div
class=
"basic-item-icon"
>
<span
class=
"require"
>
*
</span>
<el-form-item
label=
"课程视频:"
prop=
"range"
>
<!-- action="https://jsonplaceholder.typicode.com/posts/" -->
<el-upload
class=
"upload-demo"
action=
"https://sc.yunqueyi.com/contents/admin/qiniu/token1"
:on-preview=
"handlePreview"
:on-remove=
"handleRemove"
:before-remove=
"beforeRemove"
multiple
:limit=
"100"
:on-exceed=
"handleExceed"
:file-list=
"fileList"
>
<el-button
size=
"small"
type=
"primary"
>
点击上传
</el-button>
<div
slot=
"tip"
class=
"el-upload__tip"
>
只能上传jpg/png文件,且不超过500kb
</div>
</el-upload>
</el-form-item>
</div>
<div
class=
"other-content valid-msg"
v-show=
"isShowOtherContent"
>
<div
class=
"tips"
>
注:以下信息为非必填项,您也可以根据实际情况修改
</div>
<div
class=
"basic-item-icon"
>
<!-- <span class="require">*</span> -->
<el-form-item
label=
"课程封面:"
>
<el-upload
v-model=
"formData.courseHeaderImage"
class=
"bg-uploader"
action=
"#"
:show-file-list=
"false"
:before-upload=
"beforeUploadListPic"
:disabled=
"disabled"
>
<div
class=
"bg-img-wrapper"
>
<img
v-if=
"formData.courseHeaderImage"
@
mouseover
.
stop=
"imgMouseOver=true"
:src=
"formData.courseHeaderImage"
class=
"bg-img"
>
<img
v-if=
"!formData.courseHeaderImage"
class=
"bg-img"
src=
"../../../assets/image/small.png"
>
</div>
<!-- <div class="img-delete" v-show="imgMouseOver && !disabled" @click.stop="deleteImg(1)" @mouseout.stop="imgMouseOver=false"><i class="el-icon-delete"></i></div> -->
</el-upload>
<div
class=
"limit-text"
>
尺寸:750*420,只支持jpeg格式
</div>
</el-form-item>
<p
class=
"upload-message"
v-if=
"uploadImgMessage"
>
请选择列表图片
</p>
</div>
<el-form-item
label=
"课程难度:"
>
<el-radio-group
v-model=
"formData.difficultyLevel"
>
<el-radio
:label=
"1"
>
初级
</el-radio>
<el-radio
:label=
"2"
>
中级
</el-radio>
<el-radio
:label=
"3"
>
高级
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"讲师名称:"
class=
"valid-msg"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
v-model=
"formData.courseCustomDocterModel[0].courseDoctorName"
placeholder=
"请输入讲师名称"
style=
"width: 360px"
maxlength=
"25"
@
focus=
"isShowDoctorList=true"
@
input=
"filterDoctorName"
@
blur=
"doctorNameInputBlur"
:disabled=
"disabled"
></el-input>
<ul
v-show=
"isShowDoctorList"
class=
"doctor-select-list"
>
<li
v-for=
"item in doctorNameList"
:key=
"item.value"
@
click=
"selectDoctor(item.value)"
:class=
"{'doctor-selected': item.seleted}"
>
<span
v-show=
"item.show"
>
{{item.value}}
</span>
</li>
</ul>
<span
class=
"word-num"
>
{{(formData.courseCustomDocterModel[0].courseDoctorName).replace(/\s+/g,"").length}}/25
</span>
</el-col>
</el-form-item>
<div
class=
"basic-item-icon"
>
<el-form-item
label=
"讲师头像:"
>
<el-upload
v-model=
"formData.courseCustomDocterModel[0].courseDoctorAvatarUrl"
class=
"bg-uploader"
action=
"#"
:show-file-list=
"false"
:before-upload=
"beforeUploadListPic"
:disabled=
"disabled"
>
<div
class=
"bg-img-wrapper"
>
<img
v-if=
"formData.courseCustomDocterModel[0].courseDoctorAvatarUrl"
@
mouseover
.
stop=
"imgMouseOver=true"
:src=
"formData.courseCustomDocterModel[0].courseDoctorAvatarUrl"
class=
"bg-img-doctor"
>
<img
v-if=
"!formData.courseCustomDocterModel[0].courseDoctorAvatarUrl"
class=
"bg-img-doctor"
src=
"../../../assets/image/small.png"
>
</div>
<!-- <div class="img-delete" v-show="imgMouseOver && !disabled" @click.stop="deleteImg(1)" @mouseout.stop="imgMouseOver=false"><i class="el-icon-delete"></i></div> -->
</el-upload>
<div
class=
"limit-text"
>
尺寸:88*88,只支持jpeg格式
</div>
</el-form-item>
<p
class=
"upload-message"
v-if=
"uploadImgMessage"
>
请选择列表图片
</p>
</div>
<el-form-item
label=
"所属机构:"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
v-model=
"formData.courseCustomDocterModel[0].courseDoctorHospital"
placeholder=
"请输入所属机构"
style=
"width: 360px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{(formData.courseCustomDocterModel[0].courseDoctorHospital).replace(/\s+/g,"").length}}/25
</span>
</el-col>
</el-form-item>
<el-form-item
label=
"课程简介:"
>
<el-col
:span=
"22"
>
<el-input
size=
"small"
type=
"textarea"
:autosize=
"{ minRows: 5}"
placeholder=
"请输入课程简介"
v-model=
"formData.courseIntro"
style=
"width:90%;"
></el-input>
<span
class=
"word-num"
>
{{(formData.courseIntro).replace(/\s+/g,"").length}}/200
</span>
</el-col>
</el-form-item>
</div>
<!-- 更多信息 -->
<div
class=
"separator-line"
>
<span
class=
"line-left"
></span>
<div
@
click=
"toggleOtherContent"
class=
"center"
>
<span>
展开更多信息
</span>
<img
v-show=
"isShowOtherContent"
src=
"../../../assets/image/phrase3/arrow-up.png"
/>
<img
v-show=
"!isShowOtherContent"
src=
"../../../assets/image/phrase3/arrow-down.png"
/>
</div>
<span
class=
"line-right"
></span>
</div>
</el-form>
</div>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"close"
>
取 消
</el-button>
<el-button
type=
"primary"
@
click=
"submitForm('formDataRef')"
>
确 定
</el-button>
</div>
</el-dialog>
<!-- <PreviewVideo :dialogVisible="isPreviewVideo" :videoUrl="videoUrl" @close="closeVideo"></PreviewVideo> -->
<!-- <button @click="previewVideoAction">test video</button> -->
</div>
</template>
<
script
>
import
PreviewVideo
from
"@/components/education/custom-resource/preview-video"
;
import
PreviewProtocol
from
"@/components/education/custom-resource/preview-protocol"
;
import
PreviewEditCourse
from
"@/components/education/custom-resource/edit-course-dialog"
;
import
{
doUpload
,
getFilePath
}
from
"@/utils/qiniu-util"
;
import
{
openLoading
,
closeLoading
,
getQiniuToken1
}
from
"@/utils/utils"
;
let
vm
=
null
;
export
default
{
data
()
{
let
checkCourseName
=
(
rule
,
value
,
callback
)
=>
{
// 如果有审核的信息,则直接报错
// if(this.needShowAuditMsg && this.auditMsgMap.name.desc) {
// callback(new Error(this.auditMsgMap.name.desc));
// return;
// }
// if(!this.needShowAuditMsg && !value) {
// callback(new Error('请输入课程名称'));
// } else {
// callback();
// }
};
return
{
needShowAuditMsg
:
true
,
auditMsgMap
:
{
name
:
{
desc
:
'填写的课程名称不对'
}
},
disabled
:
false
,
formData
:
{
checkStatus
:
0
,
courseCustomChapterModel
:
[{
courseCustomLectureModelList
:
[
{
contentCheck
:
''
,
id
:
0
,
name
:
''
,
nameCheck
:
''
,
resourceModel
:
{
createdId
:
0
,
createdTime
:
''
,
deleteFlag
:
0
,
filePath
:
''
,
fileType
:
0
,
formatType
:
0
,
hospitalId
:
0
,
id
:
0
,
idType
:
0
,
lectureId
:
0
,
modifiedId
:
0
,
modifiedTime
:
''
,
name
:
''
,
operateKey
:
''
,
page
:
0
,
resolutionRatio
:
''
,
size
:
0
,
status
:
0
,
totalTime
:
0
,
type
:
0
,
videoType
:
0
}
}
],
id
:
0
,
name
:
''
}],
courseCustomDocterModel
:
[
{
courseDoctorAvatarUrl
:
'https://file.yunqueyi.com/h5/images/cme/doctor-header.png'
,
courseDoctorHospital
:
''
,
courseDoctorHospitalCheck
:
''
,
courseDoctorName
:
''
,
courseDoctorNameCheck
:
''
,
id
:
0
}
],
courseHeaderImage
:
'https://file.yunqueyi.com/h5/images/cme/project-banner.png'
,
courseId
:
0
,
courseIntro
:
''
,
courseIntroCheck
:
''
,
courseName
:
''
,
courseNameCheck
:
''
,
difficultyLevel
:
1
,
shareType
:
1
,
subjectIdList
:
[
410
,
423
]
},
uploadImgMessage
:
false
,
imgMouseOver
:
false
,
rules
:
{
courseName
:
[
{
required
:
true
,
message
:
"请输入课程名称"
},
{
validator
:
checkCourseName
}
],
subjectIdList
:
[
{
required
:
true
,
message
:
"请输入课程名称"
,
trigger
:
"blur"
},
],
shareType
:
[
{
required
:
true
,
message
:
"请选择开放范围"
,
trigger
:
"blur"
},
],
},
labelOptions
:
[],
isShowOtherContent
:
false
,
fileList
:
[
{
name
:
'food.jpeg'
,
url
:
'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'
},
{
name
:
'food2.jpeg'
,
url
:
'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'
}
],
projectBanner
:
'https://file.yunqueyi.com/h5/images/cme/project-banner.png'
,
doctorHeader
:
'https://file.yunqueyi.com/h5/images/cme/doctor-header.png'
,
doctorNameList
:
[
{
value
:
'333'
,
show
:
true
,
seleted
:
false
},
{
value
:
'334'
,
show
:
true
,
seleted
:
false
},
{
value
:
'335'
,
show
:
true
,
seleted
:
false
},
{
value
:
'336'
,
show
:
true
,
seleted
:
false
},
],
isShowDoctorList
:
false
,
isPreviewVideo
:
false
,
videoUrl
:
''
,
};
},
props
:
{
dialogVisible
:
{
type
:
Boolean
,
default
:
false
},
addOrUpdate
:
{
type
:
String
,
default
:
'add'
}
},
computed
:
{
},
components
:
{
PreviewVideo
,
PreviewEditCourse
},
created
()
{
vm
=
this
;
this
.
addInit
();
},
mounted
()
{
this
.
getLabelList
();
// setTimeout(() => {
// console.log(this.$refs.formDataRef);
// this.$refs['formDataRef'].validateField("name");
// }, 2000);
},
methods
:
{
// 添加时初始化
addInit
()
{
console
.
log
(
'in addInit'
);
},
// 过滤医生信息
filterDoctorName
(
value
)
{
this
.
doctorNameList
.
forEach
(
item
=>
{
if
(
value
)
{
if
((
item
.
value
+
''
).
indexOf
(
value
)
==
-
1
)
{
item
.
show
=
false
;
}
else
{
item
.
show
=
true
;
}
if
(
item
.
value
==
value
)
{
item
.
seleted
=
true
;
}
else
{
item
.
seleted
=
false
;
}
}
else
{
item
.
show
=
true
;
}
})
console
.
log
(
value
);
},
// 当选择医生的焦点失去时,要反选医生信息
doctorNameInputBlur
()
{
setTimeout
(()
=>
{
this
.
isShowDoctorList
=
false
;
this
.
selectDoctorByName
(
this
.
formData
.
courseCustomDocterModel
[
0
].
courseDoctorName
);
},
100
);
},
// 根据姓名反选医生信息
// TODO
selectDoctorByName
()
{
},
// 选择其中一个
selectDoctor
(
name
)
{
console
.
log
(
name
)
this
.
formData
.
courseCustomDocterModel
[
0
].
courseDoctorName
=
name
;
this
.
selectDoctorByName
(
name
);
},
close
()
{
this
.
$emit
(
'close'
);
},
// 获取学科列表
getLabelList
()
{
let
req
=
{};
this
.
GET
(
"aggregate/content/labelList"
,
req
).
then
(
res
=>
{
if
(
res
.
code
==
'000000'
)
{
// TODO
this
.
convertLabelList
(
res
.
data
);
// this.labelOptions = res.data;
}
});
},
// 将所有子分类中的“全部”去掉
convertLabelList
(
labelList
)
{
let
newLabelList
=
[];
labelList
.
forEach
(
item
=>
{
item
.
subList
=
item
.
subList
.
slice
(
1
);
})
this
.
labelOptions
=
labelList
;
},
//上传列表图片
beforeUploadListPic
(
file
)
{
let
fileLimit
=
{
width
:
230
,
height
:
172
,
size
:
0.5
,
sizeText
:
"500K"
,
key
:
"attachmentUrl"
,
more
:
"attachmentMore1"
,
show
:
"uploadImgMessage"
};
vm
.
beforeAvatarUpload
(
file
,
fileLimit
);
},
//上传图片校验
beforeAvatarUpload
(
file
,
fileLimit
)
{
const
isJPG
=
file
.
type
===
"image/jpeg"
;
const
isPNG
=
file
.
type
===
"image/png"
;
const
isLt2M
=
file
.
size
/
1024
/
1024
<
fileLimit
.
size
;
console
.
log
(
'isJPG'
,
isJPG
,
'isPNG'
,
isPNG
,
'isLt2M'
,
isLt2M
);
if
(
!
isJPG
&&
!
isPNG
)
{
vm
.
$message
.
error
(
"图片不符合规范,请根据规范上传图片"
);
return
;
}
if
(
!
isLt2M
)
{
vm
.
$message
.
error
(
"图片不符合规范,请根据规范上传图片 "
);
return
;
}
let
_img
=
new
FileReader
();
_img
.
readAsDataURL
(
file
);
_img
.
onload
=
function
(
theFile
)
{
let
image
=
new
Image
();
image
.
src
=
theFile
.
target
.
result
;
image
.
onload
=
function
()
{
let
_vm
=
this
;
if
(
false
// true ||
// _vm.width != fileLimit.width ||
// _vm.height != fileLimit.height
)
{
vm
.
$message
.
error
(
"图片不符合规范,请根据规范上传图片"
);
}
else
{
openLoading
(
vm
);
doUpload
(
vm
,
file
,
getFilePath
(
file
,
null
),
"preview4"
,
"progress1"
,
1
).
then
(
function
(
path
)
{
closeLoading
(
vm
);
console
.
log
(
path
);
if
(
fileLimit
.
show
==
"uploadImgMessage"
)
{
vm
.
uploadImgMessage
=
false
;
}
// else if (fileLimit.show == "uploadImgMessage2") {
// vm.uploadImgMessage2 = false;
// }
vm
.
formData
[
fileLimit
.
key
]
=
path
.
fullPath
;
vm
.
formData
[
fileLimit
.
more
]
=
{
attachmentName
:
path
.
name
,
attachmentExt
:
path
.
ext
,
attachmentSize
:
path
.
size
};
vm
.
$message
.
success
(
"上传成功"
);
});
}
};
};
return
isJPG
&&
isLt2M
;
},
// 删除图片
deleteImg
(
type
)
{
if
(
type
==
1
)
{
vm
.
formData
.
attachmentUrl
=
""
;
vm
.
imgMouseOver
=
false
;
}
else
{
// vm.formData.attachmentUrl2 = "";
// vm.imgMouseOver2 = false;
}
},
toggleOtherContent
()
{
this
.
isShowOtherContent
=
!
this
.
isShowOtherContent
;
},
// 上传文件相关
handleRemove
(
file
,
fileList
)
{
console
.
log
(
file
,
fileList
);
},
handlePreview
(
file
)
{
console
.
log
(
file
);
},
handleExceed
(
files
,
fileList
)
{
this
.
$message
.
warning
(
`当前限制选择 3 个文件,本次选择了
${
files
.
length
}
个文件,共选择了
${
files
.
length
+
fileList
.
length
}
个文件`
);
},
beforeRemove
(
file
,
fileList
)
{
return
this
.
$confirm
(
`确定移除
${
file
.
name
}
?`
);
},
//表单校验
submitForm
(
formName
)
{
console
.
log
(
'this.formData'
,
this
.
formData
);
this
.
needShowAuditMsg
=
false
;
let
flag
=
null
;
this
.
$refs
[
formName
].
validate
(
valid
=>
{
if
(
valid
)
{
//console.log("success");
flag
=
true
;
}
else
{
console
.
log
(
"error submit!!"
);
flag
=
false
;
}
});
return
flag
;
},
handleChange
(
value
)
{
console
.
log
(
value
);
},
}
};
</
script
>
<
style
scoped
lang=
"scss"
>
.edit-course-wrapper
{
.course-content
{
// color: red;
.basic-item-icon
{
position
:
relative
;
margin-top
:
20px
;
.require
{
position
:
absolute
;
left
:
40px
;
top
:
11px
;
color
:
#f56c6c
;
}
.upload-message
{
position
:
absolute
;
left
:
160px
;
top
:
105px
;
font-size
:
12px
;
color
:
#f56c6c
;
}
.img-delete
{
position
:
absolute
;
left
:
0px
;
top
:
0px
;
width
:
84px
;
height
:
100px
;
background
:
#000
;
opacity
:
0
.7
;
z-index
:
999
;
i
{
color
:
#fff
;
margin-top
:
39px
;
margin-left
:
0px
;
}
}
}
.word-num
{
font-size
:
12px
;
color
:
#999
;
padding-top
:
5px
;
}
.bg-uploader
{
img
{
float
:
left
;
}
.bg-img-wrapper
{
.bg-img
{
display
:
block
;
width
:
160px
;
height
:
90px
;
}
.bg-img-doctor
{
display
:
block
;
width
:
88px
;
height
:
88px
;
}
}
.bg-video
{
float
:
left
;
width
:
84px
;
height
:
100px
;
}
}
.limit-text
{
position
:
absolute
;
top
:
86px
;
left
:
0px
;
font-size
:
12px
;
color
:
#979899
;
}
.separator-line
{
width
:
100%
;
display
:
flex
;
flex-direction
:
row
;
align-content
:
center
;
align-items
:
center
;
justify-content
:
space-between
;
.center
{
cursor
:
pointer
;
width
:
130px
;
color
:
#666666
;
img
{
width
:
12px
;
}
}
.line-left
,
.line-right
{
// display: inline-block;
// width: 100%;
flex
:
1
;
border-bottom
:
1px
dashed
#E4E7ED
;
}
}
.tips
{
width
:
100%
;
height
:
32px
;
line-height
:
32px
;
padding-left
:
12px
;
background
:rgba
(
254
,
250
,
245
,
1
)
;
border-radius
:
3px
;
color
:
#E6A23C
;
}
.valid-msg
{
position
:
relative
;
.error
{
width
:
370px
;
position
:
absolute
;
display
:
flex
;
justify-content
:
space-between
;
top
:
29px
;
font-size
:
13px
;
color
:
#ED3131
;
.text
{
flex
:
1
;
}
.cancle
{
cursor
:
pointer
;
width
:
20px
;
}
}
.edit-wrapper
{
color
:
#449284
;
.edit-img
{
position
:
relative
;
top
:
2px
;
width
:
12px
;
margin
:
0
2px
0
4px
;
}
}
.doctor-select-list
{
width
:
200px
;
// max-height: 100px;
position
:
absolute
;
z-index
:
100
;
background
:
#fff
;
box-shadow
:
0
0
6px
rgba
(
0
,
0
,
0
,
0
.3
);
-webkit-box-shadow
:
0
0
6px
rgba
(
0
,
0
,
0
,
0
.3
);
// margin: 10px;
li
{
padding-left
:
20px
;
cursor
:
pointer
;
&
:hover
{
background
:
#f4f7fD
;
}
&
.doctor-selected
{
background
:
#f4f7fD
;
}
}
}
}
}
}
</
style
>
src/components/education/custom-resource/edit-course-dialog copy 4.vue
已删除
100644 → 0
浏览文件 @
d2298748
<
template
>
<div
class=
"edit-course-wrapper dialog-title-border"
>
<el-dialog
ref=
"testDialogRef"
title=
"上传课程"
:visible=
"dialogVisible"
@
close=
"close"
center
:close-on-click-modal=
"false"
:close-on-press-escape=
"false"
width=
"800px"
>
<div
slot=
"title"
style=
"text-align: left;"
>
<span
style=
"font-weight: 700;"
>
上传课程
</span>
<span
style=
"font-size: 12px;color: #999;"
>
请认真核对上传内容,一旦提交后将不能修改
</span>
</div>
<div
class=
"course-content"
>
<el-form
ref=
"formDataRef"
:model=
"formData"
:rules=
"rules"
label-width=
"120px"
class=
"basic-form"
>
<el-form-item
label=
"课程名称:"
prop=
"courseName"
class=
"valid-msg"
>
<el-col
:span=
"20"
>
<el-input
size=
"small"
v-model=
"formData.courseName"
placeholder=
"请输入课程名称"
style=
"width: 360px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseName
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
<span
class=
"edit-wrapper"
>
<img
class=
"edit-img"
src=
"../../../assets/image/phrase3/icon-pin.png"
/>
修改信息
</span>
</span>
<div
class=
"error"
>
<span>
错误信息错误信息错误信息错误信息错误信息错误信息息
</span>
<span
class=
"cancle"
>
X
</span>
</div>
</el-col>
</el-form-item>
<el-form-item
label=
"学科分类:"
prop=
"subjectIdList"
class=
"valid-msg"
>
<el-col
:span=
"18"
>
<!-- :props="
{ expandTrigger: 'hover' }" -->
<el-cascader
style=
"width: 360px"
v-model=
"formData.subjectIdList"
:options=
"labelOptions"
:props=
"
{ value: 'id', label: 'name', children: 'subList'}"
@change="handleChange"
>
</el-cascader>
</el-col>
</el-form-item>
<el-form-item
label=
"开放范围:"
prop=
"shareType"
class=
"valid-msg"
>
<el-radio-group
v-model=
"formData.shareType"
>
<el-radio
:label=
"1"
>
机构共享
</el-radio>
</el-radio-group>
</el-form-item>
<div
class=
"basic-item-icon"
>
<span
class=
"require"
>
*
</span>
<el-form-item
label=
"课程视频:"
prop=
"range"
>
<!-- action="https://jsonplaceholder.typicode.com/posts/" -->
<!-- multiple -->
<!-- :on-preview="handlePreview"
:on-remove="handleRemove"
:before-remove="beforeRemove"-->
<el-upload
class=
"upload-demo"
action=
"#"
:before-upload=
"beforeUploadVideo"
:limit=
"3"
:on-exceed=
"handleExceed"
:show-file-list=
"false"
>
<el-button
size=
"small"
type=
"primary"
>
点击上传
</el-button>
<div
slot=
"tip"
class=
"el-upload__tip"
>
<span>
只支持MP4格式,课程视频最多上传100个,单文件最大2G
</span>
<ul
class=
"custom-list"
>
<li
v-for=
"(file, index) in fileList"
:key=
"index"
>
<span>
{{
file
.
name
}}
</span>
</li>
</ul>
</div>
</el-upload>
</el-form-item>
</div>
<div
class=
"other-content valid-msg"
v-show=
"isShowOtherContent"
>
<div
class=
"tips"
>
注:以下信息为非必填项,您也可以根据实际情况修改
</div>
<div
class=
"basic-item-icon"
>
<!--
<span
class=
"require"
>
*
</span>
-->
<el-form-item
label=
"课程封面:"
>
<el-upload
v-model=
"formData.courseIntroImage"
class=
"bg-uploader"
action=
"#"
:show-file-list=
"false"
:before-upload=
"beforeUploadListPic"
:disabled=
"disabled"
>
<div
class=
"bg-img-wrapper"
>
<img
v-if=
"formData.courseIntroImage"
@
mouseover
.
stop=
"imgMouseOver=true"
:src=
"formData.courseIntroImage"
class=
"bg-img"
/>
<img
v-if=
"!formData.courseIntroImage"
class=
"bg-img"
src=
"../../../assets/image/small.png"
/>
</div>
</el-upload>
<div
class=
"limit-text"
>
尺寸:750*420,只支持jpeg格式
</div>
</el-form-item>
<p
class=
"upload-message"
v-if=
"uploadImgMessage"
>
请选择列表图片
</p>
</div>
<el-form-item
label=
"课程难度:"
>
<el-radio-group
v-model=
"formData.difficultyLevel"
>
<el-radio
:label=
"1"
>
初级
</el-radio>
<el-radio
:label=
"2"
>
中级
</el-radio>
<el-radio
:label=
"3"
>
高级
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"讲师名称:"
class=
"valid-msg"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
v-model=
"formData.courseCustomDoctorModels[0].courseDoctorName"
placeholder=
"请输入讲师名称"
style=
"width: 360px"
maxlength=
"25"
@
focus=
"isShowDoctorList=true"
@
input=
"filterDoctorName"
@
blur=
"doctorNameInputBlur"
:disabled=
"disabled"
></el-input>
<ul
v-show=
"isShowDoctorList"
class=
"doctor-select-list"
>
<li
v-for=
"(item, index) in doctorNameList"
:key=
"item.courseDoctorName"
@
click=
"selectDoctor(item.courseDoctorName, index)"
:class=
"
{'doctor-selected': item.seleted}"
>
<span
v-show=
"item.show"
>
{{
item
.
courseDoctorName
}}
</span>
</li>
</ul>
<span
class=
"word-num"
>
{{
(
formData
.
courseCustomDoctorModels
[
0
]
&&
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorName
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
</el-col>
</el-form-item>
<div
class=
"basic-item-icon"
>
<el-form-item
label=
"讲师头像:"
>
<el-upload
v-model=
"formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl"
class=
"bg-uploader"
action=
"#"
:show-file-list=
"false"
:before-upload=
"beforeUploadListPic"
:disabled=
"disabled"
>
<div
class=
"bg-img-wrapper"
>
<img
v-if=
"formData.courseCustomDoctorModels && formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl || ''"
@
mouseover
.
stop=
"imgMouseOver=true"
:src=
"formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl"
class=
"bg-img-doctor"
/>
<img
v-if=
"!(formData.courseCustomDoctorModels && formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl || '')"
class=
"bg-img-doctor"
src=
"../../../assets/image/small.png"
/>
</div>
</el-upload>
<div
class=
"limit-text"
>
尺寸:88*88,只支持jpeg格式
</div>
</el-form-item>
<p
class=
"upload-message"
v-if=
"uploadImgMessage"
>
请选择列表图片
</p>
</div>
<el-form-item
label=
"所属机构:"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
v-model=
"formData.courseCustomDoctorModels[0].courseDoctorHospital"
placeholder=
"请输入所属机构"
style=
"width: 360px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseCustomDoctorModels
&&
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorHospital
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
</el-col>
</el-form-item>
<el-form-item
label=
"课程简介:"
>
<el-col
:span=
"22"
>
<el-input
size=
"small"
type=
"textarea"
:autosize=
"
{ minRows: 5}"
placeholder="请输入课程简介"
v-model="formData.courseIntro"
style="width:90%;"
>
</el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseIntro
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/200
</span>
</el-col>
</el-form-item>
</div>
<!-- 更多信息 -->
<div
class=
"separator-line"
>
<span
class=
"line-left"
></span>
<div
@
click=
"toggleOtherContent"
class=
"center"
>
<span>
展开更多信息
</span>
<img
v-show=
"isShowOtherContent"
src=
"../../../assets/image/phrase3/arrow-up.png"
/>
<img
v-show=
"!isShowOtherContent"
src=
"../../../assets/image/phrase3/arrow-down.png"
/>
</div>
<span
class=
"line-right"
></span>
</div>
</el-form>
</div>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"close"
>
取 消
</el-button>
<el-button
type=
"primary"
@
click=
"submitForm('formDataRef')"
>
确 定
</el-button>
</div>
</el-dialog>
<!--
<PreviewVideo
:dialogVisible=
"isPreviewVideo"
:videoUrl=
"videoUrl"
@
close=
"closeVideo"
></PreviewVideo>
-->
<!--
<button
@
click=
"previewVideoAction"
>
test video
</button>
-->
</div>
</
template
>
<
script
>
import
PreviewVideo
from
"@/components/education/custom-resource/preview-video"
;
import
PreviewProtocol
from
"@/components/education/custom-resource/preview-protocol"
;
import
PreviewEditCourse
from
"@/components/education/custom-resource/edit-course-dialog"
;
import
{
doUpload
,
getFilePath
}
from
"@/utils/qiniu-util"
;
import
{
openLoading
,
closeLoading
,
getQiniuToken1
}
from
"@/utils/utils"
;
let
vm
=
null
;
export
default
{
data
()
{
let
checkCourseName
=
(
rule
,
value
,
callback
)
=>
{
// 如果有审核的信息,则直接报错
if
(
!
value
)
{
callback
(
new
Error
(
"请输入课程名称"
));
}
else
{
callback
();
}
};
return
{
needShowAuditMsg
:
true
,
disabled
:
false
,
formData
:
{
checkStatus
:
0
,
courseCustomChapterModels
:
[
{
courseCustomLectureModelList
:
[
{
contentCheck
:
""
,
id
:
0
,
name
:
""
,
nameCheck
:
""
,
resourceModel
:
{
createdId
:
0
,
createdTime
:
""
,
deleteFlag
:
0
,
filePath
:
""
,
fileType
:
0
,
formatType
:
0
,
hospitalId
:
0
,
id
:
0
,
idType
:
0
,
lectureId
:
0
,
modifiedId
:
0
,
modifiedTime
:
""
,
name
:
""
,
operateKey
:
""
,
page
:
0
,
resolutionRatio
:
""
,
shareType
:
0
,
size
:
0
,
status
:
0
,
totalTime
:
0
,
type
:
0
,
videoType
:
0
}
}
],
id
:
0
,
name
:
""
}
],
courseCustomDoctorModels
:
[
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
0
}
],
courseId
:
0
,
courseIntro
:
""
,
courseIntroCheck
:
""
,
courseIntroImage
:
"https://test1-file.yunqueyi.com/image/png/common/202006201528136.png"
,
courseIntroImageCheck
:
""
,
courseName
:
""
,
courseNameCheck
:
""
,
deleteCustomLectureIds
:
[],
difficultyLevel
:
1
,
shareType
:
1
,
subjectIdList
:
[]
},
uploadImgMessage
:
false
,
imgMouseOver
:
false
,
rules
:
{
courseName
:
[
{
required
:
true
,
message
:
"请输入课程名称"
},
{
validator
:
checkCourseName
}
],
subjectIdList
:
[
{
required
:
true
,
message
:
"请输入课程名称"
,
trigger
:
"blur"
}
],
shareType
:
[
{
required
:
true
,
message
:
"请选择开放范围"
,
trigger
:
"blur"
}
]
},
labelOptions
:
[],
isShowOtherContent
:
false
,
fileList
:
[
{
name
:
"food.jpeg"
,
url
:
"https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100"
},
{
name
:
"food2.jpeg"
,
url
:
"https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100"
}
],
projectBanner
:
"https://file.yunqueyi.com/h5/images/cme/project-banner.png"
,
doctorHeader
:
"https://file.yunqueyi.com/h5/images/cme/doctor-header.png"
,
doctorNameList
:
[
{
courseDoctorName
:
"333"
,
show
:
true
,
seleted
:
false
},
{
courseDoctorName
:
"334"
,
show
:
true
,
seleted
:
false
},
{
courseDoctorName
:
"335"
,
show
:
true
,
seleted
:
false
},
{
courseDoctorName
:
"336"
,
show
:
true
,
seleted
:
false
}
],
isShowDoctorList
:
false
,
isPreviewVideo
:
false
,
videoUrl
:
""
,
orgCourseInfo
:
{
defaultDoctor
:
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
0
},
doctorModelList
:
[
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
0
}
],
limitModel
:
{
maxLimitOneVideoSize
:
0
,
maxLimitVideoCount
:
0
,
maxStorageSpace
:
0
,
usedStorageSpace
:
0
}
}
};
},
props
:
{
dialogVisible
:
{
type
:
Boolean
,
default
:
false
},
addOrUpdate
:
{
type
:
String
,
default
:
"add"
}
},
computed
:
{},
watch
:
{
dialogVisible
(
isVisible
)
{
if
(
isVisible
)
{
if
(
this
.
addOrUpdate
==
"add"
)
{
this
.
initAdd
();
}
else
{
this
.
initModify
();
}
}
}
},
components
:
{
PreviewVideo
,
PreviewEditCourse
},
created
()
{
vm
=
this
;
// this.initAdd();
},
mounted
()
{
this
.
getLabelList
();
},
methods
:
{
// 创建课程页面的初始信息
initOrgCourseInfo
()
{
vm
.
GET
(
"contents/course/custom/info/init"
,
{
setEntry
:
true
}).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
this
.
orgCourseInfo
=
res
.
data
;
this
.
formData
.
courseCustomDoctorModels
[
0
]
=
this
.
orgCourseInfo
.
defaultDoctor
;
this
.
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorAvatarUrl
=
this
.
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorAvatarUrl
||
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
;
this
.
doctorNameList
=
this
.
convertDNameToSelectOpt
(
this
.
orgCourseInfo
.
doctorModelList
);
}
}
);
},
// 将医生名称进行处理
convertDNameToSelectOpt
(
doctorModelList
)
{
doctorModelList
.
forEach
(
item
=>
{
item
.
show
=
true
;
item
.
seleted
=
false
;
});
return
doctorModelList
;
},
// 添加时初始化
initAdd
()
{
console
.
log
(
"in initAdd"
);
this
.
initOrgCourseInfo
();
},
initModify
()
{
console
.
log
(
"in initModify"
);
},
// 过滤医生信息
filterDoctorName
(
value
)
{
this
.
doctorNameList
.
forEach
(
item
=>
{
if
(
value
)
{
if
((
item
.
value
+
""
).
indexOf
(
value
)
==
-
1
)
{
item
.
show
=
false
;
}
else
{
item
.
show
=
true
;
}
if
(
item
.
value
==
value
)
{
item
.
seleted
=
true
;
}
else
{
item
.
seleted
=
false
;
}
}
else
{
item
.
show
=
true
;
}
});
},
// 当选择医生的焦点失去时,要反选医生信息
doctorNameInputBlur
()
{
setTimeout
(()
=>
{
this
.
isShowDoctorList
=
false
;
this
.
selectDoctorByName
(
this
.
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorName
);
},
200
);
},
// 根据姓名反选医生信息
// TODO 尝试找到完全匹配的医生
selectDoctorByName
(
name
)
{},
// 选择其中一个
selectDoctor
(
name
)
{
console
.
log
(
name
);
this
.
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorName
=
name
;
this
.
selectDoctorByName
(
name
);
},
close
()
{
this
.
$emit
(
"close"
);
},
// 获取学科列表
getLabelList
()
{
let
req
=
{};
this
.
GET
(
"aggregate/content/labelList"
,
req
).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
this
.
convertLabelList
(
res
.
data
);
}
});
},
// 将所有子分类中的“全部”去掉
convertLabelList
(
labelList
)
{
let
newLabelList
=
[];
labelList
.
forEach
(
item
=>
{
item
.
subList
=
item
.
subList
.
slice
(
1
);
});
this
.
labelOptions
=
labelList
;
},
// 上传视频
beforeUploadVideo
(
file
)
{
let
fileType
=
file
.
type
;
// mp3: audio/mpeg; mp4: video/mp4;
console
.
log
(
'fileType'
,
file
);
let
fileLimit
=
{
size
:
0.5
,
};
// TODO 上传之前要有各种判断 个人最大5G 每个文件是2G limitModel
// if (!isJPG && !isPNG) {
// vm.$message.error("图片不符合规范,请根据规范上传图片");
// return;
// }
// if (!isLt2M) {
// vm.$message.error("图片不符合规范,请根据规范上传图片 ");
// return;
// }
// return;
openLoading
(
vm
);
doUpload
(
vm
,
file
,
getFilePath
(
file
,
null
),
"preview4"
,
"progress1"
).
then
(
path
=>
{
closeLoading
(
vm
);
console
.
log
(
path
);
let
uploadResourceParam
=
{
formatType
:
path
.
ext
,
name
:
path
.
name
,
qCloudUrl
:
path
.
fullPath
,
size
:
path
.
size
,
fileType
:
1
,
status
:
"success"
,
uid
:
new
Date
().
getTime
()
}
this
.
insertResourceAction
(
uploadResourceParam
);
// vm.$message.success("上传成功");
});
},
insertResourceAction
(
uploadResourceParam
)
{
this
.
POST
(
"contents/course/custom/info/insertResource"
,
[
uploadResourceParam
]).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
console
.
log
(
'insertResourceAction'
,
res
);
// 直接push到节里
// this.convertLabelList(res.data);
}
});
},
//上传列表图片
beforeUploadListPic
(
file
)
{
let
fileLimit
=
{
width
:
230
,
height
:
172
,
size
:
0.5
,
sizeText
:
"500K"
,
key
:
"attachmentUrl"
,
more
:
"attachmentMore1"
,
show
:
"uploadImgMessage"
};
vm
.
beforeAvatarUpload
(
file
,
fileLimit
);
},
//上传图片校验
beforeAvatarUpload
(
file
,
fileLimit
)
{
console
.
log
();
const
isJPG
=
file
.
type
===
"image/jpeg"
;
const
isPNG
=
file
.
type
===
"image/png"
;
const
isLt2M
=
file
.
size
/
1024
/
1024
<
fileLimit
.
size
;
console
.
log
(
"isJPG"
,
isJPG
,
"isPNG"
,
isPNG
,
"isLt2M"
,
isLt2M
);
// if (!isJPG && !isPNG) {
// vm.$message.error("图片不符合规范,请根据规范上传图片");
// return;
// }
// if (!isLt2M) {
// vm.$message.error("图片不符合规范,请根据规范上传图片 ");
// return;
// }
let
_img
=
new
FileReader
();
_img
.
readAsDataURL
(
file
);
_img
.
onload
=
function
(
theFile
)
{
let
image
=
new
Image
();
image
.
src
=
theFile
.
target
.
result
;
image
.
onload
=
function
()
{
let
_vm
=
this
;
if
(
false
// true ||
// _vm.width != fileLimit.width ||
// _vm.height != fileLimit.height
)
{
vm
.
$message
.
error
(
"图片不符合规范,请根据规范上传图片"
);
}
else
{
openLoading
(
vm
);
doUpload
(
vm
,
file
,
getFilePath
(
file
,
null
),
"preview4"
,
"progress1"
// 1
).
then
(
function
(
path
)
{
closeLoading
(
vm
);
console
.
log
(
path
);
if
(
fileLimit
.
show
==
"uploadImgMessage"
)
{
vm
.
uploadImgMessage
=
false
;
}
// else if (fileLimit.show == "uploadImgMessage2") {
// vm.uploadImgMessage2 = false;
// }
vm
.
formData
[
fileLimit
.
key
]
=
path
.
fullPath
;
vm
.
formData
[
fileLimit
.
more
]
=
{
attachmentName
:
path
.
name
,
attachmentExt
:
path
.
ext
,
attachmentSize
:
path
.
size
};
vm
.
$message
.
success
(
"上传成功"
);
});
}
};
};
return
isJPG
&&
isLt2M
;
},
toggleOtherContent
()
{
this
.
isShowOtherContent
=
!
this
.
isShowOtherContent
;
},
// 上传文件相关
handleRemove
(
file
,
fileList
)
{
console
.
log
(
file
,
fileList
);
},
handlePreview
(
file
)
{
console
.
log
(
file
);
},
handleExceed
(
files
,
fileList
)
{
this
.
$message
.
warning
(
`当前限制选择 100 个文件,您已经共选择了
${
files
.
length
+
fileList
.
length
}
个文件!`
);
},
beforeRemove
(
file
,
fileList
)
{
return
this
.
$confirm
(
`确定移除
${
file
.
name
}
?`
);
},
//表单校验
submitForm
(
formName
)
{
console
.
log
(
"this.formData"
,
this
.
formData
);
this
.
needShowAuditMsg
=
false
;
let
flag
=
null
;
this
.
$refs
[
formName
].
validate
(
valid
=>
{
console
.
log
(
"valid"
,
valid
);
if
(
valid
)
{
//console.log("success");
flag
=
true
;
}
else
{
console
.
log
(
"error submit!!"
);
flag
=
false
;
}
});
return
flag
;
},
handleChange
(
value
)
{
console
.
log
(
value
);
},
insertOrUpdate
()
{}
}
};
</
script
>
<
style
scoped
lang=
"scss"
>
.edit-course-wrapper
{
.course-content
{
// color: red;
.basic-item-icon
{
position
:
relative
;
margin-top
:
20px
;
.require
{
position
:
absolute
;
left
:
40px
;
top
:
11px
;
color
:
#f56c6c
;
}
.upload-message
{
position
:
absolute
;
left
:
160px
;
top
:
105px
;
font-size
:
12px
;
color
:
#f56c6c
;
}
.img-delete
{
position
:
absolute
;
left
:
0px
;
top
:
0px
;
width
:
84px
;
height
:
100px
;
background
:
#000
;
opacity
:
0
.7
;
z-index
:
999
;
i
{
color
:
#fff
;
margin-top
:
39px
;
margin-left
:
0px
;
}
}
}
.word-num
{
font-size
:
12px
;
color
:
#999
;
padding-top
:
5px
;
}
.bg-uploader
{
img
{
float
:
left
;
}
.bg-img-wrapper
{
.bg-img
{
display
:
block
;
width
:
160px
;
height
:
90px
;
}
.bg-img-doctor
{
display
:
block
;
width
:
88px
;
height
:
88px
;
}
}
.bg-video
{
float
:
left
;
width
:
84px
;
height
:
100px
;
}
}
.limit-text
{
position
:
absolute
;
top
:
86px
;
left
:
0px
;
font-size
:
12px
;
color
:
#979899
;
}
.separator-line
{
width
:
100%
;
display
:
flex
;
flex-direction
:
row
;
align-content
:
center
;
align-items
:
center
;
justify-content
:
space-between
;
.center
{
cursor
:
pointer
;
width
:
130px
;
color
:
#666666
;
img
{
width
:
12px
;
}
}
.line-left
,
.line-right
{
// display: inline-block;
// width: 100%;
flex
:
1
;
border-bottom
:
1px
dashed
#e4e7ed
;
}
}
.tips
{
width
:
100%
;
height
:
32px
;
line-height
:
32px
;
padding-left
:
12px
;
background
:
rgba
(
254
,
250
,
245
,
1
);
border-radius
:
3px
;
color
:
#e6a23c
;
}
.valid-msg
{
position
:
relative
;
.error
{
width
:
370px
;
position
:
absolute
;
display
:
flex
;
justify-content
:
space-between
;
top
:
29px
;
font-size
:
13px
;
color
:
#ed3131
;
.text
{
flex
:
1
;
}
.cancle
{
cursor
:
pointer
;
width
:
20px
;
}
}
.edit-wrapper
{
color
:
#449284
;
.edit-img
{
position
:
relative
;
top
:
2px
;
width
:
12px
;
margin
:
0
2px
0
4px
;
}
}
.doctor-select-list
{
width
:
200px
;
// max-height: 100px;
position
:
absolute
;
z-index
:
100
;
background
:
#fff
;
box-shadow
:
0
0
6px
rgba
(
0
,
0
,
0
,
0
.3
);
-webkit-box-shadow
:
0
0
6px
rgba
(
0
,
0
,
0
,
0
.3
);
// margin: 10px;
li
{
padding-left
:
20px
;
cursor
:
pointer
;
&
:hover
{
background
:
#f4f7fd
;
}
&
.doctor-selected
{
background
:
#f4f7fd
;
}
}
}
}
}
}
</
style
>
src/components/education/custom-resource/edit-course-dialog copy 5.vue
已删除
100644 → 0
浏览文件 @
d2298748
<
template
>
<div
class=
"edit-course-wrapper dialog-title-border"
>
<el-dialog
ref=
"testDialogRef"
title=
"上传课程"
:visible=
"dialogVisible"
@
close=
"close"
center
:close-on-click-modal=
"false"
:close-on-press-escape=
"false"
width=
"800px"
>
<div
slot=
"title"
style=
"text-align: left;"
>
<span
style=
"font-weight: 700;"
>
上传课程
</span>
<span
style=
"font-size: 12px;color: #ED3131;margin-left: 4px;"
>
请认真核对上传内容,一旦提交后将不能修改
</span>
</div>
<div
v-show=
"step == 1"
class=
"course-content"
>
<el-form
ref=
"formDataRef"
:model=
"formData"
:rules=
"rules"
label-width=
"120px"
class=
"basic-form"
>
<el-form-item
label=
"课程名称:"
prop=
"courseName"
class=
"valid-msg"
>
<el-col
:span=
"20"
>
<el-input
size=
"small"
v-model=
"formData.courseName"
placeholder=
"请输入课程名称"
style=
"width: 360px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseName
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
<!--
<span
class=
"edit-wrapper"
>
<img
class=
"edit-img"
src=
"../../../assets/image/phrase3/icon-pz.png"
/>
修改信息
</span>
-->
</span>
<div
v-show=
"needShowAuditMsg && formData.courseNameCheck"
class=
"error"
>
<span>
错误信息错误信息错误信息错误信息错误信息错误信息息
</span>
<span
class=
"cancle"
>
X
</span>
</div>
</el-col>
</el-form-item>
<el-form-item
label=
"学科分类:"
prop=
"subjectIdList"
class=
"valid-msg"
>
<el-col
:span=
"18"
>
<!-- :props="
{ expandTrigger: 'hover' }" -->
<el-cascader
style=
"width: 360px"
v-model=
"formData.subjectIdList"
:options=
"labelOptions"
:props=
"
{ value: 'id', label: 'name', children: 'subList'}"
>
</el-cascader>
</el-col>
</el-form-item>
<el-form-item
label=
"开放范围:"
prop=
"shareType"
class=
"valid-msg"
>
<el-radio-group
v-model=
"formData.shareType"
>
<el-radio
:label=
"1"
>
机构共享
</el-radio>
</el-radio-group>
</el-form-item>
<div
class=
"basic-item-icon"
>
<span
class=
"require"
>
*
</span>
<el-form-item
label=
"课程视频:"
prop=
"range"
>
<el-upload
class=
"upload-video"
action=
"#"
:before-upload=
"beforeUploadVideo"
:limit=
"3"
:on-exceed=
"handleExceed"
:show-file-list=
"false"
>
<el-button
size=
"small"
type=
"primary"
>
点击上传
</el-button>
<div
slot=
"tip"
class=
"el-upload__tip"
>
<span
class=
"upload-tips"
>
只支持MP4格式,课程视频最多上传100个,单文件最大2G
</span>
<ul
v-show=
"formData.courseCustomChapterModels[0].courseCustomLectureModelList.length"
class=
"custom-list"
>
<li
v-for=
"(lecture, index) in formData.courseCustomChapterModels[0].courseCustomLectureModelList"
:key=
"index"
>
<ul
class=
"video"
>
<li>
<span
class=
"title"
>
视频
{{
index
+
1
}}
</span>
<img
src=
"../../../assets/image/phrase3/icon-pin.png"
/>
<span
class=
"name"
@
click=
"previewVideoAction(lecture)"
>
{{
lecture
.
resourceModel
.
name
}}
</span>
</li>
<li>
<img
@
click=
"deleteLecture(index)"
class=
"delete"
src=
"../../../assets/image/phrase3/close.png"
/>
</li>
</ul>
<div
class=
"video-name"
>
<span
class=
"title"
>
<span
>
*
</span>
<span
class=
"video-title"
>
视频名称
</span>
</span>
<el-input
size=
"small"
v-model=
"lecture.name"
placeholder=
"请输入课程名称"
style=
"width: 260px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{
(
lecture
.
name
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
</div>
</li>
<span
v-show=
"needShowUploadProcess"
class=
"upload-process"
:style=
"
{'width': (uploadProgress/100 * 340) + 'px'}">
</span>
</ul>
<span
v-if=
"!formData.courseCustomChapterModels[0].courseCustomLectureModelList.length"
v-show=
"needShowUploadProcess"
class=
"upload-process"
:style=
"
{'width': (uploadProgress/100 * 340) + 'px'}">
</span>
</div>
</el-upload>
</el-form-item>
</div>
<div
class=
"other-content valid-msg"
v-show=
"isShowOtherContent"
>
<div
class=
"tips"
>
注:以下信息为非必填项,您也可以根据实际情况修改
</div>
<div
class=
"basic-item-icon"
>
<!--
<span
class=
"require"
>
*
</span>
-->
<el-form-item
label=
"课程封面:"
>
<el-upload
v-model=
"formData.courseIntroImage"
class=
"bg-uploader"
action=
"#"
:show-file-list=
"false"
:before-upload=
"beforeUploadListPic"
:disabled=
"disabled"
>
<div
class=
"bg-img-wrapper"
>
<img
v-if=
"formData.courseIntroImage"
@
mouseover
.
stop=
"imgMouseOver=true"
:src=
"formData.courseIntroImage"
class=
"bg-img"
/>
<img
v-if=
"!formData.courseIntroImage"
class=
"bg-img"
src=
"../../../assets/image/small.png"
/>
</div>
</el-upload>
<div
class=
"limit-text"
>
尺寸:750*420,只支持jpeg格式
</div>
</el-form-item>
<p
class=
"upload-message"
v-if=
"uploadImgMessage"
>
请选择列表图片
</p>
</div>
<el-form-item
label=
"课程难度:"
>
<el-radio-group
v-model=
"formData.difficultyLevel"
>
<el-radio
:label=
"1"
>
初级
</el-radio>
<el-radio
:label=
"2"
>
中级
</el-radio>
<el-radio
:label=
"3"
>
高级
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"讲师名称:"
class=
"valid-msg"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
v-model=
"formData.courseCustomDoctorModels[0].courseDoctorName"
placeholder=
"请输入讲师名称"
style=
"width: 360px"
maxlength=
"25"
@
focus=
"isShowDoctorList=true"
@
input=
"filterDoctorName"
@
blur=
"doctorNameInputBlur"
:disabled=
"disabled"
></el-input>
<ul
v-show=
"isShowDoctorList"
class=
"doctor-select-list"
>
<li
v-for=
"(item, index) in doctorNameList"
:key=
"index"
@
click=
"selectDoctor(item.courseDoctorName, index)"
:class=
"
{'doctor-selected': item.seleted}"
>
<span
v-show=
"item.show"
>
{{
item
.
courseDoctorName
||
'测试名'
}}
</span>
</li>
</ul>
<span
class=
"word-num"
>
{{
(
formData
.
courseCustomDoctorModels
[
0
]
&&
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorName
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
</el-col>
</el-form-item>
<div
class=
"basic-item-icon"
>
<el-form-item
label=
"讲师头像:"
>
<el-upload
v-model=
"formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl"
class=
"bg-uploader"
action=
"#"
:show-file-list=
"false"
:before-upload=
"beforeUploadListPic"
:disabled=
"disabled"
>
<div
class=
"bg-img-wrapper"
>
<img
v-if=
"formData.courseCustomDoctorModels && formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl || ''"
@
mouseover
.
stop=
"imgMouseOver=true"
:src=
"formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl"
class=
"bg-img-doctor"
/>
<img
v-if=
"!(formData.courseCustomDoctorModels && formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl || '')"
class=
"bg-img-doctor"
src=
"../../../assets/image/small.png"
/>
</div>
</el-upload>
<div
class=
"limit-text"
>
尺寸:88*88,只支持jpeg格式
</div>
</el-form-item>
<p
class=
"upload-message"
v-if=
"uploadImgMessage"
>
请选择列表图片
</p>
</div>
<el-form-item
label=
"所属机构:"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
v-model=
"formData.courseCustomDoctorModels[0].courseDoctorHospital"
placeholder=
"请输入所属机构"
style=
"width: 360px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseCustomDoctorModels
&&
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorHospital
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
</el-col>
</el-form-item>
<el-form-item
label=
"课程简介:"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
type=
"textarea"
maxlength=
"200"
:autosize=
"
{ minRows: 5}"
placeholder="请输入课程简介"
v-model="formData.courseIntro"
style="width:90%;"
>
</el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseIntro
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/200
</span>
</el-col>
</el-form-item>
</div>
<!-- 更多信息 -->
<div
class=
"separator-line"
>
<span
class=
"line-left"
></span>
<div
@
click=
"toggleOtherContent"
class=
"center"
>
<span>
展开更多信息
</span>
<img
v-show=
"isShowOtherContent"
src=
"../../../assets/image/phrase3/arrow-up.png"
/>
<img
v-show=
"!isShowOtherContent"
src=
"../../../assets/image/phrase3/arrow-down.png"
/>
</div>
<span
class=
"line-right"
></span>
</div>
</el-form>
</div>
<div
v-show=
"step == 2"
class=
"course-content-step2"
>
<img
class=
"success-img"
src=
"../../../assets/image/phrase3/icon-audit-success.png"
/>
<span
class=
"tips-1"
>
您上传的课程已成功提交,预计在3-5个工作日内完成审核
</span>
<span
class=
"tips-2"
>
审核通过后,您才可以选择课程完成项目配置。如有任何疑问可联系云鹊医400-920-8877
</span>
<el-button
type=
"primary"
size=
"small"
icon=
"el-icon-back"
@
click=
"backToOrgCourse"
>
返回机构课程
</el-button>
</div>
<div
v-show=
"step == 1"
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"dialogObj.visible=true"
>
取 消
</el-button>
<el-button
type=
"primary"
@
click=
"submitForm('formDataRef')"
>
确 定
</el-button>
</div>
</el-dialog>
<DialogComponet
:dialogObj=
"dialogObj"
@
hide=
"hideCancleTips"
@
confirm=
"dialogObj.visible=false"
></DialogComponet>
<PreviewVideo
:dialogVisible=
"isPreviewVideo"
:videoUrl=
"videoUrl"
@
close=
"isPreviewVideo=false"
></PreviewVideo>
<!--
<button
@
click=
"previewVideoAction"
>
test video
</button>
-->
</div>
</
template
>
<
script
>
import
PreviewVideo
from
"@/components/education/custom-resource/preview-video"
;
import
PreviewProtocol
from
"@/components/education/custom-resource/preview-protocol"
;
import
PreviewEditCourse
from
"@/components/education/custom-resource/edit-course-dialog"
;
import
DialogComponet
from
"@/components/education/template/dialog"
;
import
{
doUpload
,
getFilePath
}
from
"@/utils/qiniu-util"
;
import
{
openLoading
,
closeLoading
,
getQiniuToken1
}
from
"@/utils/utils"
;
import
{
mapActions
}
from
'vuex'
;
let
vm
=
null
;
export
default
{
data
()
{
let
checkCourseName
=
(
rule
,
value
,
callback
)
=>
{
// 如果有审核的信息,则直接报错
if
(
!
value
&&
this
.
needCheckField
)
{
callback
(
new
Error
(
"请输入课程名称"
));
}
else
{
callback
();
}
};
return
{
step
:
1
,
needCheckField
:
false
,
needShowAuditMsg
:
false
,
needShowUploadProcess
:
false
,
disabled
:
false
,
formDataBase
:
{
checkStatus
:
0
,
courseCustomChapterModels
:
[
{
courseCustomLectureModelList
:
[],
id
:
null
,
name
:
"视频课程"
}
],
courseCustomDoctorModels
:
[
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
}
],
courseId
:
null
,
courseIntro
:
""
,
courseIntroCheck
:
""
,
courseIntroImage
:
"https://test1-file.yunqueyi.com/image/png/common/202006201528136.png"
,
courseIntroImageCheck
:
""
,
courseName
:
""
,
courseNameCheck
:
""
,
deleteCustomLectureIds
:
[],
difficultyLevel
:
1
,
shareType
:
1
,
subjectIdList
:
[]
},
formData
:
{
checkStatus
:
0
,
courseCustomChapterModels
:
[
{
courseCustomLectureModelList
:
[],
id
:
null
,
name
:
"视频课程"
}
],
courseCustomDoctorModels
:
[
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
}
],
courseId
:
null
,
courseIntro
:
""
,
courseIntroCheck
:
""
,
courseIntroImage
:
"https://test1-file.yunqueyi.com/image/png/common/202006201528136.png"
,
courseIntroImageCheck
:
""
,
courseName
:
""
,
courseNameCheck
:
""
,
deleteCustomLectureIds
:
[],
difficultyLevel
:
1
,
shareType
:
1
,
subjectIdList
:
[]
},
uploadImgMessage
:
false
,
imgMouseOver
:
false
,
rules
:
{
courseName
:
[
{
required
:
true
,
message
:
" "
},
{
validator
:
checkCourseName
}
],
subjectIdList
:
[
{
required
:
true
,
message
:
"请输入课程名称"
}
],
shareType
:
[
{
required
:
true
,
message
:
"请选择开放范围"
}
]
},
labelOptions
:
[],
isShowOtherContent
:
false
,
fileList
:
[
],
projectBanner
:
"https://file.yunqueyi.com/h5/images/cme/project-banner.png"
,
doctorHeader
:
"https://file.yunqueyi.com/h5/images/cme/doctor-header.png"
,
doctorNameList
:
[
{
courseDoctorName
:
"333"
,
show
:
true
,
seleted
:
false
},
{
courseDoctorName
:
"334"
,
show
:
true
,
seleted
:
false
},
{
courseDoctorName
:
"335"
,
show
:
true
,
seleted
:
false
},
{
courseDoctorName
:
"336"
,
show
:
true
,
seleted
:
false
}
],
isShowDoctorList
:
false
,
isPreviewVideo
:
false
,
videoUrl
:
""
,
orgCourseInfo
:
{
defaultDoctor
:
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
},
doctorModelList
:
[
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
}
],
limitModel
:
{
maxLimitOneVideoSize
:
0
,
maxLimitVideoCount
:
0
,
maxStorageSpace
:
0
,
usedStorageSpace
:
0
}
},
uploadProgress
:
0
,
dialogObj
:
{
// 发布
visible
:
false
,
title
:
"确定取消吗?"
,
message
:
"发布后,项目将进入审核中,待审核完成后学员可在云鹊医App上参加培训学习"
,
tip
:
""
,
confirmMsg
:
"取 消"
,
hideMsg
:
"确 定"
},
};
},
props
:
{
dialogVisible
:
{
type
:
Boolean
,
default
:
false
},
courseId
:
{
type
:
String
|
Number
,
default
:
0
}
},
computed
:
{},
watch
:
{
dialogVisible
(
isVisible
)
{
this
.
formData
=
JSON
.
parse
(
JSON
.
stringify
(
this
.
formDataBase
));
if
(
isVisible
)
{
if
(
this
.
courseId
==
0
)
{
this
.
initAdd
(
this
.
courseId
);
}
else
{
this
.
initModify
(
this
.
courseId
);
}
}
},
},
components
:
{
PreviewVideo
,
PreviewEditCourse
,
DialogComponet
,
},
created
()
{
vm
=
this
;
// this.initAdd();
},
mounted
()
{
this
.
getLabelList
();
},
methods
:
{
...
mapActions
([
'setKind'
]),
// 创建课程页面的初始信息
initOrgCourseInfo
()
{
vm
.
GET
(
"contents/course/custom/info/init"
,
{
setEntry
:
true
}).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
this
.
orgCourseInfo
=
res
.
data
;
this
.
formData
.
courseCustomDoctorModels
[
0
]
=
this
.
orgCourseInfo
.
defaultDoctor
;
this
.
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorAvatarUrl
=
this
.
orgCourseInfo
.
defaultDoctor
.
courseDoctorAvatarUrl
||
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
;
this
.
doctorNameList
=
this
.
convertDNameToSelectOpt
(
this
.
orgCourseInfo
.
doctorModelList
);
+
this
.
courseId
&&
this
.
getCourseInfoById
(
this
.
courseId
);
}
}
);
},
// 将医生名称进行处理
convertDNameToSelectOpt
(
doctorModelList
)
{
doctorModelList
.
forEach
(
item
=>
{
item
.
show
=
true
;
item
.
seleted
=
false
;
});
return
doctorModelList
;
},
// 添加时初始化
initAdd
()
{
console
.
log
(
"in initAdd"
);
this
.
step
=
1
;
this
.
needShowAuditMsg
=
false
;
this
.
initOrgCourseInfo
();
},
initModify
()
{
this
.
needShowAuditMsg
=
true
;
console
.
log
(
"in initModify"
);
this
.
initOrgCourseInfo
();
},
// 创建课程页面的初始信息
getCourseInfoById
(
courseId
)
{
vm
.
GET
(
`contents/course/custom/info/
${
courseId
}
`
)
.
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
this
.
formData
=
res
.
data
;
}
}
);
},
// 过滤医生信息
filterDoctorName
(
value
)
{
this
.
doctorNameList
.
forEach
(
item
=>
{
if
(
value
)
{
if
((
item
.
value
+
""
).
indexOf
(
value
)
==
-
1
)
{
item
.
show
=
false
;
}
else
{
item
.
show
=
true
;
}
if
(
item
.
value
==
value
)
{
item
.
seleted
=
true
;
}
else
{
item
.
seleted
=
false
;
}
}
else
{
item
.
show
=
true
;
}
});
},
// 当选择医生的焦点失去时,要反选医生信息
doctorNameInputBlur
()
{
setTimeout
(()
=>
{
this
.
isShowDoctorList
=
false
;
this
.
selectDoctorByName
(
this
.
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorName
);
},
200
);
},
// 根据姓名反选医生信息
// TODO 尝试找到完全匹配的医生
selectDoctorByName
(
name
)
{
},
// 选择其中一个
selectDoctor
(
name
)
{
console
.
log
(
name
);
this
.
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorName
=
name
;
this
.
selectDoctorByName
(
name
);
},
// 关闭当前弹框
close
()
{
this
.
$emit
(
"close"
);
},
// 获取学科列表
getLabelList
()
{
let
req
=
{};
this
.
GET
(
"aggregate/content/labelList"
,
req
).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
this
.
convertLabelList
(
res
.
data
);
}
});
},
// 将所有子分类中的“全部”去掉
convertLabelList
(
labelList
)
{
let
newLabelList
=
[];
labelList
.
forEach
(
item
=>
{
item
.
subList
=
item
.
subList
.
slice
(
1
);
});
this
.
labelOptions
=
labelList
;
},
// 上传视频
beforeUploadVideo
(
file
)
{
let
fileType
=
file
.
type
;
// mp3: audio/mpeg; mp4: video/mp4;
console
.
log
(
'fileType'
,
file
);
let
fileLimit
=
{
size
:
0.5
,
};
// TODO 上传之前要有各种判断 个人最大5G 每个文件是2G limitModel
// if (!isJPG && !isPNG) {
// vm.$message.error("图片不符合规范,请根据规范上传图片");
// return;
// }
// if (!isLt2M) {
// vm.$message.error("图片不符合规范,请根据规范上传图片 ");
// return;
// }
// return;
// openLoading(vm);
this
.
needShowUploadProcess
=
true
;
doUpload
(
vm
,
file
,
getFilePath
(
file
,
null
),
"preview4"
,
"progress1"
).
then
(
path
=>
{
// closeLoading(vm);
console
.
log
(
'vm.uploadProgress'
,
vm
.
uploadProgress
);
console
.
log
(
path
);
let
uploadResourceParam
=
{
formatType
:
path
.
ext
,
name
:
path
.
name
,
qCloudUrl
:
path
.
fullPath
,
size
:
path
.
size
,
fileType
:
1
,
status
:
"success"
,
uid
:
new
Date
().
getTime
()
}
this
.
needShowUploadProcess
=
false
;
this
.
uploadProgress
=
0
;
this
.
insertResourceAction
(
uploadResourceParam
);
// vm.$message.success("上传成功");
});
},
// 上传资源(视频)后,生存对应的节
insertResourceAction
(
uploadResourceParam
)
{
this
.
POST
(
"contents/course/custom/info/insertResource"
,
[
uploadResourceParam
]).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
let
cName
=
res
.
data
.
resourceModelList
[
0
].
name
;
cName
=
cName
.
substr
(
0
,
cName
.
lastIndexOf
(
'.'
));
let
lectureObj
=
{
id
:
null
,
name
:
cName
,
nameCheck
:
""
,
contentCheck
:
""
,
resourceModel
:
{}
}
lectureObj
.
resourceModel
=
res
.
data
&&
res
.
data
.
resourceModelList
[
0
];
this
.
formData
.
courseCustomChapterModels
[
0
].
courseCustomLectureModelList
.
push
(
lectureObj
);
}
});
},
//上传列表图片
beforeUploadListPic
(
file
)
{
let
fileLimit
=
{
width
:
230
,
height
:
172
,
size
:
0.5
,
sizeText
:
"500K"
,
key
:
"attachmentUrl"
,
more
:
"attachmentMore1"
,
show
:
"uploadImgMessage"
};
vm
.
beforeAvatarUpload
(
file
,
fileLimit
);
},
//上传图片校验
beforeAvatarUpload
(
file
,
fileLimit
)
{
console
.
log
();
const
isJPG
=
file
.
type
===
"image/jpeg"
;
const
isPNG
=
file
.
type
===
"image/png"
;
const
isLt2M
=
file
.
size
/
1024
/
1024
<
fileLimit
.
size
;
console
.
log
(
"isJPG"
,
isJPG
,
"isPNG"
,
isPNG
,
"isLt2M"
,
isLt2M
);
// if (!isJPG && !isPNG) {
// vm.$message.error("图片不符合规范,请根据规范上传图片");
// return;
// }
// if (!isLt2M) {
// vm.$message.error("图片不符合规范,请根据规范上传图片 ");
// return;
// }
let
_img
=
new
FileReader
();
_img
.
readAsDataURL
(
file
);
_img
.
onload
=
function
(
theFile
)
{
let
image
=
new
Image
();
image
.
src
=
theFile
.
target
.
result
;
image
.
onload
=
function
()
{
let
_vm
=
this
;
if
(
false
// true ||
// _vm.width != fileLimit.width ||
// _vm.height != fileLimit.height
)
{
vm
.
$message
.
error
(
"图片不符合规范,请根据规范上传图片"
);
}
else
{
openLoading
(
vm
);
doUpload
(
vm
,
file
,
getFilePath
(
file
,
null
),
"preview4"
,
"progress1"
// 1
).
then
(
function
(
path
)
{
closeLoading
(
vm
);
console
.
log
(
path
);
if
(
fileLimit
.
show
==
"uploadImgMessage"
)
{
vm
.
uploadImgMessage
=
false
;
}
// else if (fileLimit.show == "uploadImgMessage2") {
// vm.uploadImgMessage2 = false;
// }
vm
.
formData
[
fileLimit
.
key
]
=
path
.
fullPath
;
vm
.
formData
[
fileLimit
.
more
]
=
{
attachmentName
:
path
.
name
,
attachmentExt
:
path
.
ext
,
attachmentSize
:
path
.
size
};
vm
.
$message
.
success
(
"上传成功"
);
});
}
};
};
return
isJPG
&&
isLt2M
;
},
// 展开/收起 更多信息
toggleOtherContent
()
{
this
.
isShowOtherContent
=
!
this
.
isShowOtherContent
;
},
// 限制选择文件个数
handleExceed
(
files
,
fileList
)
{
this
.
$message
.
warning
(
`当前限制选择 100 个文件,您已经共选择了
${
files
.
length
+
fileList
.
length
}
个文件!`
);
},
// 删除按钮
beforeRemove
(
file
,
fileList
)
{
return
this
.
$confirm
(
`确定移除
${
file
.
name
}
?`
);
},
//表单校验
submitForm
(
formName
)
{
console
.
log
(
"this.formData"
,
this
.
formData
);
this
.
needShowAuditMsg
=
false
;
let
flag
=
null
;
this
.
$refs
[
formName
].
validate
(
valid
=>
{
console
.
log
(
"valid"
,
valid
);
if
(
valid
)
{
this
.
insertOrUpdate
();
//console.log("success");
flag
=
true
;
}
else
{
console
.
log
(
"error submit!!"
);
flag
=
false
;
}
});
return
flag
;
},
// 添加或修改课程
insertOrUpdate
()
{
console
.
log
(
'in insertOrUpdate'
,
this
.
formData
);
this
.
POST
(
"contents/course/custom/info/insertOrUpdate"
,
this
.
formData
).
then
(
res
=>
{
console
.
log
(
res
);
if
(
res
.
code
==
"000000"
)
{
if
(
this
.
courseId
==
'add'
)
{
this
.
step
=
2
;
}
else
{
this
.
close
();
this
.
setKind
(
3
);
}
}
});
},
// 返回到
backToOrgCourse
()
{
this
.
close
();
this
.
setKind
(
3
);
},
hideCancleTips
()
{
this
.
dialogObj
.
visible
=
false
;
this
.
close
();
},
// 预览视频
previewVideoAction
(
lecture
)
{
this
.
videoUrl
=
lecture
.
resourceModel
.
filePath
;
this
.
isPreviewVideo
=
true
;
},
// 删除本节视频
deleteLecture
(
index
)
{
this
.
formData
.
courseCustomChapterModels
[
0
].
courseCustomLectureModelList
.
splice
(
index
,
1
);
}
}
};
</
script
>
<
style
scoped
lang=
"scss"
>
.edit-course-wrapper
{
.course-content
{
// color: red;
.basic-item-icon
{
position
:
relative
;
margin-top
:
20px
;
.require
{
position
:
absolute
;
left
:
40px
;
top
:
11px
;
color
:
#f56c6c
;
}
.upload-message
{
position
:
absolute
;
left
:
160px
;
top
:
105px
;
font-size
:
12px
;
color
:
#f56c6c
;
}
.img-delete
{
position
:
absolute
;
left
:
0px
;
top
:
0px
;
width
:
84px
;
height
:
100px
;
background
:
#000
;
opacity
:
0
.7
;
z-index
:
999
;
i
{
color
:
#fff
;
margin-top
:
39px
;
margin-left
:
0px
;
}
}
.upload-tips
{
width
:
100%
;
position
:
relative
;
top
:
-10px
;
font-size
:
12px
;
color
:
#979899
;
// display: inline-block;
}
.custom-list
{
// width: 100%;
width
:
480px
;
display
:
flex
;
flex-direction
:
column
;
border-radius
:
3px
;
border
:
1px
solid
rgba
(
228
,
231
,
237
,
1
);
padding
:
20px
;
font-size
:
14px
;
&
>
li
{
margin
:
10px
0
;
}
.video
{
display
:
flex
;
flex-direction
:
row
;
justify-content
:
space-between
;
align-items
:
center
;
.title
{
display
:
inline-block
;
width
:
70px
;
text-align
:
right
;
margin-right
:
10px
;
}
.name
{
cursor
:
pointer
;
color
:
#5890DD
;
}
img
{
width
:
12px
;
height
:
12px
;
}
.delete
{
position
:
relative
;
top
:
4px
;
cursor
:
pointer
;
width
:
16px
;
height
:
16px
;
}
}
.video-name
{
.title
{
display
:
inline-block
;
width
:
70px
;
text-align
:
right
;
margin-right
:
10px
;
}
}
}
}
.word-num
{
font-size
:
12px
;
color
:
#999
;
padding-top
:
5px
;
}
.bg-uploader
{
img
{
float
:
left
;
}
.bg-img-wrapper
{
.bg-img
{
display
:
block
;
width
:
160px
;
height
:
90px
;
}
.bg-img-doctor
{
display
:
block
;
width
:
88px
;
height
:
88px
;
}
}
.bg-video
{
float
:
left
;
width
:
84px
;
height
:
100px
;
}
}
.limit-text
{
position
:
absolute
;
top
:
86px
;
left
:
0px
;
font-size
:
12px
;
color
:
#979899
;
}
.separator-line
{
width
:
100%
;
display
:
flex
;
flex-direction
:
row
;
align-content
:
center
;
align-items
:
center
;
justify-content
:
space-between
;
.center
{
cursor
:
pointer
;
width
:
130px
;
color
:
#666666
;
img
{
width
:
12px
;
}
}
.line-left
,
.line-right
{
// display: inline-block;
// width: 100%;
flex
:
1
;
border-bottom
:
1px
dashed
#e4e7ed
;
}
}
.tips
{
width
:
100%
;
height
:
32px
;
line-height
:
32px
;
padding-left
:
12px
;
background
:
rgba
(
254
,
250
,
245
,
1
);
border-radius
:
3px
;
color
:
#e6a23c
;
}
.valid-msg
{
position
:
relative
;
.error
{
width
:
370px
;
position
:
absolute
;
display
:
flex
;
justify-content
:
space-between
;
top
:
29px
;
font-size
:
13px
;
color
:
#ed3131
;
.text
{
flex
:
1
;
}
.cancle
{
cursor
:
pointer
;
width
:
20px
;
}
}
.edit-wrapper
{
color
:
#449284
;
.edit-img
{
position
:
relative
;
top
:
2px
;
width
:
12px
;
margin
:
0
2px
0
4px
;
}
}
.doctor-select-list
{
width
:
200px
;
// max-height: 100px;
position
:
absolute
;
z-index
:
100
;
background
:
#fff
;
box-shadow
:
0
0
6px
rgba
(
0
,
0
,
0
,
0
.3
);
-webkit-box-shadow
:
0
0
6px
rgba
(
0
,
0
,
0
,
0
.3
);
// margin: 10px;
li
{
padding-left
:
20px
;
cursor
:
pointer
;
&
:hover
{
background
:
#f4f7fd
;
}
&
.doctor-selected
{
background
:
#f4f7fd
;
}
}
}
}
.upload-process
{
margin
:
10px
0
10px
10px
;
display
:
block
;
// width: 310px;
height
:
4px
;
background
:
#449284
;
border-radius
:
2px
;
}
}
.course-content-step2
{
display
:
flex
;
flex-direction
:
column
;
text-align
:
center
;
align-items
:
center
;
.success-img
{
width
:
60px
;
height
:
60px
;
}
.tips-1
{
margin-top
:
30px
;
font-size
:
18px
;
color
:
#303133
;
}
.tips-2
{
margin-top
:
4px
;
margin-bottom
:
40px
;
font-size
:
14px
;
color
:
#999999
;
}
}
}
</
style
>
src/components/education/custom-resource/edit-course-dialog copy 6.vue
已删除
100644 → 0
浏览文件 @
d2298748
<
template
>
<div
class=
"edit-course-wrapper dialog-title-border"
>
<el-dialog
ref=
"testDialogRef"
title=
"上传课程"
:visible=
"dialogVisible"
@
close=
"close"
center
:close-on-click-modal=
"false"
:close-on-press-escape=
"false"
width=
"800px"
>
<div
slot=
"title"
style=
"text-align: left;"
>
<span
style=
"font-weight: 700;"
>
上传课程
</span>
<span
style=
"font-size: 12px;color: #ED3131;margin-left: 4px;"
>
请认真核对上传内容,一旦提交后将不能修改
</span>
</div>
<div
v-show=
"step == 1"
class=
"course-content"
>
<el-form
ref=
"formDataRef"
:model=
"formData"
:rules=
"rules"
label-width=
"120px"
class=
"basic-form"
>
<el-form-item
label=
"课程名称:"
prop=
"courseName"
class=
"valid-msg"
>
<el-col
:span=
"20"
>
<el-input
size=
"small"
v-model=
"formData.courseName"
placeholder=
"请输入课程名称"
style=
"width: 360px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseName
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
<!--
<span
class=
"edit-wrapper"
>
<img
class=
"edit-img"
src=
"../../../assets/image/phrase3/icon-pz.png"
/>
修改信息
</span>
-->
</span>
<div
v-show=
"needShowAuditMsg && formData.courseNameCheck"
class=
"error"
>
<span>
错误信息错误信息错误信息错误信息错误信息错误信息息
</span>
<span
class=
"cancle"
>
X
</span>
</div>
</el-col>
</el-form-item>
<el-form-item
label=
"学科分类:"
prop=
"subjectIdList"
class=
"valid-msg"
>
<el-col
:span=
"18"
>
<!-- :props="
{ expandTrigger: 'hover' }" -->
<el-cascader
style=
"width: 360px"
v-model=
"formData.subjectIdList"
:options=
"labelOptions"
:props=
"
{ value: 'id', label: 'name', children: 'subList'}"
>
</el-cascader>
</el-col>
</el-form-item>
<el-form-item
label=
"开放范围:"
prop=
"shareType"
class=
"valid-msg"
>
<el-radio-group
v-model=
"formData.shareType"
>
<el-radio
:label=
"1"
>
机构共享
</el-radio>
</el-radio-group>
</el-form-item>
<div
class=
"basic-item-icon"
>
<span
class=
"require"
>
*
</span>
<el-form-item
label=
"课程视频:"
prop=
"range"
>
<el-upload
class=
"upload-video"
action=
"#"
:before-upload=
"beforeUploadVideo"
:limit=
"3"
:on-exceed=
"handleExceed"
:show-file-list=
"false"
>
<el-button
size=
"small"
type=
"primary"
>
点击上传
</el-button>
<div
slot=
"tip"
class=
"el-upload__tip"
>
<span
class=
"upload-tips"
>
只支持MP4格式,课程视频最多上传100个,单文件最大2G
</span>
<ul
v-show=
"formData.courseCustomChapterModels[0].courseCustomLectureModelList.length"
class=
"custom-list"
>
<li
v-for=
"(lecture, index) in formData.courseCustomChapterModels[0].courseCustomLectureModelList"
:key=
"index"
>
<ul
class=
"video"
>
<li>
<span
class=
"title"
>
视频
{{
index
+
1
}}
</span>
<img
src=
"../../../assets/image/phrase3/icon-pin.png"
/>
<span
class=
"name"
@
click=
"previewVideoAction(lecture)"
>
{{
lecture
.
resourceModel
.
name
}}
</span>
</li>
<li>
<img
@
click=
"deleteLecture(index)"
class=
"delete"
src=
"../../../assets/image/phrase3/close.png"
/>
</li>
</ul>
<div
class=
"video-name"
>
<span
class=
"title"
>
<span
>
*
</span>
<span
class=
"video-title"
>
视频名称
</span>
</span>
<el-input
size=
"small"
v-model=
"lecture.name"
placeholder=
"请输入课程名称"
style=
"width: 260px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{
(
lecture
.
name
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
</div>
</li>
<span
v-show=
"needShowUploadProcess"
class=
"upload-process"
:style=
"
{'width': (uploadProgress/100 * 340) + 'px'}">
</span>
</ul>
<span
v-if=
"!formData.courseCustomChapterModels[0].courseCustomLectureModelList.length"
v-show=
"needShowUploadProcess"
class=
"upload-process"
:style=
"
{'width': (uploadProgress/100 * 340) + 'px'}">
</span>
</div>
</el-upload>
</el-form-item>
</div>
<div
class=
"other-content valid-msg"
v-show=
"isShowOtherContent"
>
<div
class=
"tips"
>
注:以下信息为非必填项,您也可以根据实际情况修改
</div>
<div
class=
"basic-item-icon"
>
<!--
<span
class=
"require"
>
*
</span>
-->
<el-form-item
label=
"课程封面:"
>
<el-upload
v-model=
"formData.courseIntroImage"
class=
"bg-uploader"
action=
"#"
:show-file-list=
"false"
:before-upload=
"beforeUploadListPic"
:disabled=
"disabled"
>
<div
class=
"bg-img-wrapper"
>
<img
v-if=
"formData.courseIntroImage"
@
mouseover
.
stop=
"imgMouseOver=true"
:src=
"formData.courseIntroImage"
class=
"bg-img"
/>
<img
v-if=
"!formData.courseIntroImage"
class=
"bg-img"
src=
"../../../assets/image/small.png"
/>
</div>
</el-upload>
<div
class=
"limit-text"
>
尺寸:750*420,只支持jpeg格式
</div>
</el-form-item>
<p
class=
"upload-message"
v-if=
"uploadImgMessage"
>
请选择列表图片
</p>
</div>
<el-form-item
label=
"课程难度:"
>
<el-radio-group
v-model=
"formData.difficultyLevel"
>
<el-radio
:label=
"1"
>
初级
</el-radio>
<el-radio
:label=
"2"
>
中级
</el-radio>
<el-radio
:label=
"3"
>
高级
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"讲师名称:"
class=
"valid-msg"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
v-model=
"formData.courseCustomDoctorModels[0].courseDoctorName"
placeholder=
"请输入讲师名称"
style=
"width: 360px"
maxlength=
"25"
@
focus=
"isShowDoctorList=true"
@
input=
"filterDoctorName"
@
blur=
"doctorNameInputBlur"
:disabled=
"disabled"
></el-input>
<ul
v-show=
"isShowDoctorList"
class=
"doctor-select-list"
>
<li
v-for=
"(item, index) in doctorNameList"
:key=
"index"
@
click=
"selectDoctor(item.courseDoctorName, index)"
:class=
"
{'doctor-selected': item.seleted}"
>
<span
v-show=
"item.show"
>
{{
item
.
courseDoctorName
||
'测试名'
}}
</span>
</li>
</ul>
<span
class=
"word-num"
>
{{
(
formData
.
courseCustomDoctorModels
[
0
]
&&
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorName
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
</el-col>
</el-form-item>
<div
class=
"basic-item-icon"
>
<el-form-item
label=
"讲师头像:"
>
<el-upload
v-model=
"formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl"
class=
"bg-uploader"
action=
"#"
:show-file-list=
"false"
:before-upload=
"beforeUploadListPic"
:disabled=
"disabled"
>
<div
class=
"bg-img-wrapper"
>
<img
v-if=
"formData.courseCustomDoctorModels && formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl || ''"
@
mouseover
.
stop=
"imgMouseOver=true"
:src=
"formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl"
class=
"bg-img-doctor"
/>
<img
v-if=
"!(formData.courseCustomDoctorModels && formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl || '')"
class=
"bg-img-doctor"
src=
"../../../assets/image/small.png"
/>
</div>
</el-upload>
<div
class=
"limit-text"
>
尺寸:88*88,只支持jpeg格式
</div>
</el-form-item>
<p
class=
"upload-message"
v-if=
"uploadImgMessage"
>
请选择列表图片
</p>
</div>
<el-form-item
label=
"所属机构:"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
v-model=
"formData.courseCustomDoctorModels[0].courseDoctorHospital"
placeholder=
"请输入所属机构"
style=
"width: 360px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseCustomDoctorModels
&&
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorHospital
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
</el-col>
</el-form-item>
<el-form-item
label=
"课程简介:"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
type=
"textarea"
maxlength=
"200"
:autosize=
"
{ minRows: 5}"
placeholder="请输入课程简介"
v-model="formData.courseIntro"
style="width:90%;"
>
</el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseIntro
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/200
</span>
</el-col>
</el-form-item>
</div>
<!-- 更多信息 -->
<div
class=
"separator-line"
>
<span
class=
"line-left"
></span>
<div
@
click=
"toggleOtherContent"
class=
"center"
>
<span>
展开更多信息
</span>
<img
v-show=
"isShowOtherContent"
src=
"../../../assets/image/phrase3/arrow-up.png"
/>
<img
v-show=
"!isShowOtherContent"
src=
"../../../assets/image/phrase3/arrow-down.png"
/>
</div>
<span
class=
"line-right"
></span>
</div>
</el-form>
</div>
<div
v-show=
"step == 2"
class=
"course-content-step2"
>
<img
class=
"success-img"
src=
"../../../assets/image/phrase3/icon-audit-success.png"
/>
<span
class=
"tips-1"
>
您上传的课程已成功提交,预计在3-5个工作日内完成审核
</span>
<span
class=
"tips-2"
>
审核通过后,您才可以选择课程完成项目配置。如有任何疑问可联系云鹊医400-920-8877
</span>
<el-button
type=
"primary"
size=
"small"
icon=
"el-icon-back"
@
click=
"backToOrgCourse"
>
返回机构课程
</el-button>
</div>
<div
v-show=
"step == 1"
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"dialogObj.visible=true"
>
取 消
</el-button>
<el-button
type=
"primary"
@
click=
"submitForm('formDataRef')"
>
确 定
</el-button>
</div>
</el-dialog>
<DialogComponet
:dialogObj=
"dialogObj"
@
hide=
"hideCancleTips"
@
confirm=
"dialogObj.visible=false"
></DialogComponet>
<PreviewVideo
:dialogVisible=
"isPreviewVideo"
:videoUrl=
"videoUrl"
@
close=
"isPreviewVideo=false"
></PreviewVideo>
<!--
<button
@
click=
"previewVideoAction"
>
test video
</button>
-->
</div>
</
template
>
<
script
>
import
PreviewVideo
from
"@/components/education/custom-resource/preview-video"
;
import
PreviewProtocol
from
"@/components/education/custom-resource/preview-protocol"
;
import
PreviewEditCourse
from
"@/components/education/custom-resource/edit-course-dialog"
;
import
DialogComponet
from
"@/components/education/template/dialog"
;
import
{
doUpload
,
getFilePath
}
from
"@/utils/qiniu-util"
;
import
{
openLoading
,
closeLoading
,
getQiniuToken1
}
from
"@/utils/utils"
;
import
{
isEmptyUtils
}
from
"@/utils/index"
;
import
{
mapActions
}
from
'vuex'
;
import
{
ossUpload
,
getFilePathForOSS
}
from
"@/utils/oss/ossUtil"
;
let
vm
=
null
;
export
default
{
data
()
{
let
checkCourseName
=
(
rule
,
value
,
callback
)
=>
{
// 如果有审核的信息,则直接报错
if
(
!
value
&&
this
.
needCheckField
)
{
callback
(
new
Error
(
"请输入课程名称"
));
}
else
{
callback
();
}
};
return
{
step
:
1
,
needCheckField
:
false
,
needShowAuditMsg
:
false
,
needShowUploadProcess
:
false
,
disabled
:
false
,
formDataBase
:
{
checkStatus
:
0
,
courseCustomChapterModels
:
[
{
courseCustomLectureModelList
:
[],
id
:
null
,
name
:
"视频课程"
}
],
courseCustomDoctorModels
:
[
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
}
],
courseId
:
null
,
courseIntro
:
""
,
courseIntroCheck
:
""
,
courseIntroImage
:
"https://test1-file.yunqueyi.com/image/png/common/202006201528136.png"
,
courseIntroImageCheck
:
""
,
courseName
:
""
,
courseNameCheck
:
""
,
deleteCustomLectureIds
:
[],
difficultyLevel
:
1
,
shareType
:
1
,
subjectIdList
:
[]
},
formData
:
{
checkStatus
:
0
,
courseCustomChapterModels
:
[
{
courseCustomLectureModelList
:
[],
id
:
null
,
name
:
"视频课程"
}
],
courseCustomDoctorModels
:
[
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
}
],
courseId
:
null
,
courseIntro
:
""
,
courseIntroCheck
:
""
,
courseIntroImage
:
"https://test1-file.yunqueyi.com/image/png/common/202006201528136.png"
,
courseIntroImageCheck
:
""
,
courseName
:
""
,
courseNameCheck
:
""
,
deleteCustomLectureIds
:
[],
difficultyLevel
:
1
,
shareType
:
1
,
subjectIdList
:
[]
},
uploadImgMessage
:
false
,
imgMouseOver
:
false
,
rules
:
{
courseName
:
[
{
required
:
true
,
message
:
" "
},
{
validator
:
checkCourseName
}
],
subjectIdList
:
[
{
required
:
true
,
message
:
"请输入课程名称"
}
],
shareType
:
[
{
required
:
true
,
message
:
"请选择开放范围"
}
]
},
labelOptions
:
[],
isShowOtherContent
:
false
,
fileList
:
[
],
projectBanner
:
"https://file.yunqueyi.com/h5/images/cme/project-banner.png"
,
doctorHeader
:
"https://file.yunqueyi.com/h5/images/cme/doctor-header.png"
,
doctorNameList
:
[
{
courseDoctorName
:
"333"
,
show
:
true
,
seleted
:
false
},
{
courseDoctorName
:
"334"
,
show
:
true
,
seleted
:
false
},
{
courseDoctorName
:
"335"
,
show
:
true
,
seleted
:
false
},
{
courseDoctorName
:
"336"
,
show
:
true
,
seleted
:
false
}
],
isShowDoctorList
:
false
,
isPreviewVideo
:
false
,
videoUrl
:
""
,
orgCourseInfo
:
{
defaultDoctor
:
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
},
doctorModelList
:
[
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
}
],
limitModel
:
{
maxLimitOneVideoSize
:
0
,
maxLimitVideoCount
:
0
,
maxStorageSpace
:
0
,
usedStorageSpace
:
0
}
},
uploadProgress
:
0
,
dialogObj
:
{
visible
:
false
,
title
:
"确定取消吗?"
,
message
:
"发布后,项目将进入审核中,待审核完成后学员可在云鹊医App上参加培训学习"
,
tip
:
""
,
confirmMsg
:
"取 消"
,
hideMsg
:
"确 定"
},
};
},
props
:
{
dialogVisible
:
{
type
:
Boolean
,
default
:
false
},
courseId
:
{
type
:
String
|
Number
,
default
:
0
}
},
computed
:
{},
watch
:
{
dialogVisible
(
isVisible
)
{
this
.
formData
=
JSON
.
parse
(
JSON
.
stringify
(
this
.
formDataBase
));
if
(
isVisible
)
{
if
(
this
.
courseId
==
0
)
{
this
.
initAdd
(
this
.
courseId
);
}
else
{
this
.
initModify
(
this
.
courseId
);
}
}
},
},
components
:
{
PreviewVideo
,
PreviewEditCourse
,
DialogComponet
,
},
created
()
{
vm
=
this
;
// this.initAdd();
},
mounted
()
{
this
.
getLabelList
();
},
methods
:
{
...
mapActions
([
'setKind'
]),
// 创建课程页面的初始信息
initOrgCourseInfo
()
{
vm
.
GET
(
"contents/course/custom/info/init"
,
{
setEntry
:
true
}).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
this
.
orgCourseInfo
=
res
.
data
;
this
.
formData
.
courseCustomDoctorModels
[
0
]
=
this
.
orgCourseInfo
.
defaultDoctor
;
this
.
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorAvatarUrl
=
this
.
orgCourseInfo
.
defaultDoctor
.
courseDoctorAvatarUrl
||
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
;
this
.
doctorNameList
=
this
.
convertDNameToSelectOpt
(
this
.
orgCourseInfo
.
doctorModelList
);
+
this
.
courseId
&&
this
.
getCourseInfoById
(
this
.
courseId
);
}
}
);
},
// 将医生名称进行处理
convertDNameToSelectOpt
(
doctorModelList
)
{
doctorModelList
.
forEach
(
item
=>
{
item
.
show
=
true
;
item
.
seleted
=
false
;
});
return
doctorModelList
;
},
// 添加时初始化
initAdd
()
{
console
.
log
(
"in initAdd"
);
this
.
step
=
1
;
this
.
needShowAuditMsg
=
false
;
this
.
initOrgCourseInfo
();
},
initModify
()
{
this
.
needShowAuditMsg
=
true
;
console
.
log
(
"in initModify"
);
this
.
initOrgCourseInfo
();
},
// 创建课程页面的初始信息
getCourseInfoById
(
courseId
)
{
vm
.
GET
(
`contents/course/custom/info/
${
courseId
}
`
)
.
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
this
.
formData
=
res
.
data
;
}
}
);
},
// 过滤医生信息
filterDoctorName
(
value
)
{
this
.
doctorNameList
.
forEach
(
item
=>
{
if
(
value
)
{
if
((
item
.
value
+
""
).
indexOf
(
value
)
==
-
1
)
{
item
.
show
=
false
;
}
else
{
item
.
show
=
true
;
}
if
(
item
.
value
==
value
)
{
item
.
seleted
=
true
;
}
else
{
item
.
seleted
=
false
;
}
}
else
{
item
.
show
=
true
;
}
});
},
// 当选择医生的焦点失去时,要反选医生信息
doctorNameInputBlur
()
{
setTimeout
(()
=>
{
this
.
isShowDoctorList
=
false
;
this
.
selectDoctorByName
(
this
.
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorName
);
},
200
);
},
// 根据姓名反选医生信息
// TODO 尝试找到完全匹配的医生
selectDoctorByName
(
name
)
{
},
// 选择其中一个
selectDoctor
(
name
)
{
console
.
log
(
name
);
this
.
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorName
=
name
;
this
.
selectDoctorByName
(
name
);
},
// 关闭当前弹框
close
()
{
this
.
$emit
(
"close"
);
},
// 获取学科列表
getLabelList
()
{
let
req
=
{};
this
.
GET
(
"aggregate/content/labelList"
,
req
).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
this
.
convertLabelList
(
res
.
data
);
}
});
},
// 将所有子分类中的“全部”去掉
convertLabelList
(
labelList
)
{
let
newLabelList
=
[];
labelList
.
forEach
(
item
=>
{
item
.
subList
=
item
.
subList
.
slice
(
1
);
});
this
.
labelOptions
=
labelList
;
},
// 上传视频(mp4)
beforeUploadVideo
(
file
)
{
console
.
log
(
file
);
const
isMP4
=
file
.
type
===
"video/mp4"
;
const
isLt
=
file
.
size
/
1024
/
1024
/
1024
<
2
;
if
(
!
isLt
)
{
this
.
$message
.
error
(
"视频不符合规范,请根据规范上传视频"
);
return
;
}
if
(
!
isMP4
)
{
this
.
$message
.
error
(
"视频不符合规范,请根据规范上传视频"
);
}
else
{
// openLoading(vm);
this
.
needShowUploadProcess
=
true
;
doUpload
(
vm
,
file
,
getFilePath
(
file
,
null
),
"preview4"
,
"progress"
,
""
).
then
(
function
(
path
)
{
// closeLoading(vm);
console
.
log
(
'vm.uploadProgress'
,
vm
.
uploadProgress
);
console
.
log
(
path
);
let
uploadResourceParam
=
{
formatType
:
path
.
ext
,
name
:
path
.
name
,
qCloudUrl
:
path
.
fullPath
,
size
:
path
.
size
,
fileType
:
1
,
status
:
"success"
,
uid
:
new
Date
().
getTime
()
}
vm
.
needShowUploadProcess
=
false
;
vm
.
uploadProgress
=
0
;
vm
.
insertResourceAction
(
uploadResourceParam
);
});
}
},
// 上传视频
beforeUploadVideo1
(
file
)
{
let
fileType
=
file
.
type
;
// mp3: audio/mpeg; mp4: video/mp4;
console
.
log
(
'fileType'
,
file
);
let
fileLimit
=
{
size
:
0.5
,
};
// TODO 上传之前要有各种判断 个人最大5G 每个文件是2G limitModel
// if (!isJPG && !isPNG) {
// vm.$message.error("图片不符合规范,请根据规范上传图片");
// return;
// }
// if (!isLt2M) {
// vm.$message.error("图片不符合规范,请根据规范上传图片 ");
// return;
// }
// return;
// openLoading(vm);
this
.
needShowUploadProcess
=
true
;
doUpload
(
vm
,
file
,
getFilePath
(
file
,
null
),
"preview4"
,
"progress1"
).
then
(
path
=>
{
// closeLoading(vm);
console
.
log
(
'vm.uploadProgress'
,
vm
.
uploadProgress
);
console
.
log
(
path
);
let
uploadResourceParam
=
{
formatType
:
path
.
ext
,
name
:
path
.
name
,
qCloudUrl
:
path
.
fullPath
,
size
:
path
.
size
,
fileType
:
1
,
status
:
"success"
,
uid
:
new
Date
().
getTime
()
}
this
.
needShowUploadProcess
=
false
;
this
.
uploadProgress
=
0
;
this
.
insertResourceAction
(
uploadResourceParam
);
// vm.$message.success("上传成功");
});
},
// 上传资源(视频)后,生存对应的节
insertResourceAction
(
uploadResourceParam
)
{
this
.
POST
(
"contents/course/custom/info/insertResource"
,
[
uploadResourceParam
]).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
let
cName
=
res
.
data
.
resourceModelList
[
0
].
name
;
cName
=
cName
.
substr
(
0
,
cName
.
lastIndexOf
(
'.'
));
let
lectureObj
=
{
id
:
null
,
name
:
cName
,
nameCheck
:
""
,
contentCheck
:
""
,
resourceModel
:
{}
}
lectureObj
.
resourceModel
=
res
.
data
&&
res
.
data
.
resourceModelList
[
0
];
this
.
formData
.
courseCustomChapterModels
[
0
].
courseCustomLectureModelList
.
push
(
lectureObj
);
}
});
},
//上传列表图片
beforeUploadListPic
(
file
)
{
let
fileLimit
=
{
width
:
230
,
height
:
172
,
size
:
0.5
,
sizeText
:
"500K"
,
key
:
"attachmentUrl"
,
more
:
"attachmentMore1"
,
show
:
"uploadImgMessage"
};
vm
.
beforeAvatarUpload
(
file
,
fileLimit
);
},
//上传图片校验
beforeAvatarUpload
(
file
,
fileLimit
)
{
console
.
log
();
const
isJPG
=
file
.
type
===
"image/jpeg"
;
const
isPNG
=
file
.
type
===
"image/png"
;
const
isLt2M
=
file
.
size
/
1024
/
1024
<
fileLimit
.
size
;
console
.
log
(
"isJPG"
,
isJPG
,
"isPNG"
,
isPNG
,
"isLt2M"
,
isLt2M
);
// if (!isJPG && !isPNG) {
// vm.$message.error("图片不符合规范,请根据规范上传图片");
// return;
// }
// if (!isLt2M) {
// vm.$message.error("图片不符合规范,请根据规范上传图片 ");
// return;
// }
let
_img
=
new
FileReader
();
_img
.
readAsDataURL
(
file
);
_img
.
onload
=
function
(
theFile
)
{
let
image
=
new
Image
();
image
.
src
=
theFile
.
target
.
result
;
image
.
onload
=
function
()
{
let
_vm
=
this
;
if
(
false
// true ||
// _vm.width != fileLimit.width ||
// _vm.height != fileLimit.height
)
{
vm
.
$message
.
error
(
"图片不符合规范,请根据规范上传图片"
);
}
else
{
openLoading
(
vm
);
doUpload
(
vm
,
file
,
getFilePath
(
file
,
null
),
"preview4"
,
"progress1"
,
1
).
then
(
function
(
path
)
{
closeLoading
(
vm
);
console
.
log
(
path
);
if
(
fileLimit
.
show
==
"uploadImgMessage"
)
{
vm
.
uploadImgMessage
=
false
;
}
// else if (fileLimit.show == "uploadImgMessage2") {
// vm.uploadImgMessage2 = false;
// }
vm
.
formData
[
fileLimit
.
key
]
=
path
.
fullPath
;
vm
.
formData
[
fileLimit
.
more
]
=
{
attachmentName
:
path
.
name
,
attachmentExt
:
path
.
ext
,
attachmentSize
:
path
.
size
};
vm
.
$message
.
success
(
"上传成功"
);
});
}
};
};
return
isJPG
&&
isLt2M
;
},
// 展开/收起 更多信息
toggleOtherContent
()
{
this
.
isShowOtherContent
=
!
this
.
isShowOtherContent
;
},
// 限制选择文件个数
handleExceed
(
files
,
fileList
)
{
this
.
$message
.
warning
(
`当前限制选择 100 个文件,您已经共选择了
${
files
.
length
+
fileList
.
length
}
个文件!`
);
},
// 删除按钮
beforeRemove
(
file
,
fileList
)
{
return
this
.
$confirm
(
`确定移除
${
file
.
name
}
?`
);
},
//表单校验
submitForm
(
formName
)
{
this
.
needShowAuditMsg
=
false
;
this
.
$refs
[
formName
].
validate
(
valid
=>
{
if
(
valid
)
{
this
.
insertOrUpdate
();
}
else
{
console
.
log
(
"error submit!!"
);
}
this
.
needShowAuditMsg
=
true
;
});
},
// 添加或修改课程(kind = 3)
insertOrUpdate
()
{
this
.
POST
(
"contents/course/custom/info/insertOrUpdate"
,
this
.
formData
).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
if
(
this
.
courseId
==
'add'
)
{
this
.
step
=
2
;
}
else
{
this
.
close
();
this
.
setKind
(
3
);
}
}
});
},
// 返回到课程选择页面(kind = 3)
backToOrgCourse
()
{
this
.
close
();
this
.
setKind
(
3
);
},
// 关闭(“取消”按钮弹出来的)弹框
hideCancleTips
()
{
this
.
dialogObj
.
visible
=
false
;
this
.
close
();
},
// 预览视频
previewVideoAction
(
lecture
)
{
this
.
videoUrl
=
lecture
.
resourceModel
.
filePath
;
this
.
isPreviewVideo
=
true
;
},
// 删除本节视频
// TODO 要将删除的节ID放在删除的节里
deleteLecture
(
index
)
{
this
.
formData
.
courseCustomChapterModels
[
0
].
courseCustomLectureModelList
.
splice
(
index
,
1
);
},
// 上传课程封面图片
beforeUpload1
(
file
)
{
const
isLt50kb
=
file
.
size
/
1024
<
50
;
// if (!isLt50kb) {
// this.$message.error("上传的图片大小不能超过 50kb");
// return;
// }
vm
.
doUploadOSS
(
file
,
1
);
//评价图片
},
// 上传讲师图片
beforeUpload2
(
file
)
{
const
isLt50kb
=
file
.
size
/
1024
<
50
;
// if (!isLt50kb) {
// this.$message.error("上传的图片大小不能超过 50kb");
// return;
// }
this
.
doUploadOSS
(
file
,
2
);
//web端课程覆盖图片
},
// (调用OSS API)开始上传
doUploadOSS
(
file
,
index
)
{
let
self
=
this
;
//如果没有选择文件,返回
// if (isEmptyUtils(file)) {
// return;
// }
// self.$message.info("开始上传");
//上传 指定文件名
ossUpload
(
self
,
file
,
getFilePathForOSS
(
file
),
null
,
null
,
null
).
then
(
function
(
path
)
{
let
list
=
[{}];
list
[
0
].
name
=
file
.
name
;
list
[
0
].
url
=
localStorage
.
getItem
(
"resource_url"
)
+
path
;
if
(
index
===
1
)
{
self
.
fileList1
=
Object
.
assign
([],
list
);
self
.
model
.
courseInfoUrl
=
path
;
}
else
if
(
index
===
2
)
{
self
.
fileList2
=
Object
.
assign
([],
list
);
self
.
model
.
appCourseUrl
=
path
;
}
self
.
$message
.
success
(
"上传成功"
);
});
return
false
;
},
}
};
</
script
>
<
style
scoped
lang=
"scss"
>
.edit-course-wrapper
{
.course-content
{
// color: red;
.basic-item-icon
{
position
:
relative
;
margin-top
:
20px
;
.require
{
position
:
absolute
;
left
:
40px
;
top
:
11px
;
color
:
#f56c6c
;
}
.upload-message
{
position
:
absolute
;
left
:
160px
;
top
:
105px
;
font-size
:
12px
;
color
:
#f56c6c
;
}
.img-delete
{
position
:
absolute
;
left
:
0px
;
top
:
0px
;
width
:
84px
;
height
:
100px
;
background
:
#000
;
opacity
:
0
.7
;
z-index
:
999
;
i
{
color
:
#fff
;
margin-top
:
39px
;
margin-left
:
0px
;
}
}
.upload-tips
{
width
:
100%
;
position
:
relative
;
top
:
-10px
;
font-size
:
12px
;
color
:
#979899
;
// display: inline-block;
}
.custom-list
{
// width: 100%;
width
:
480px
;
display
:
flex
;
flex-direction
:
column
;
border-radius
:
3px
;
border
:
1px
solid
rgba
(
228
,
231
,
237
,
1
);
padding
:
20px
;
font-size
:
14px
;
&
>
li
{
margin
:
10px
0
;
}
.video
{
display
:
flex
;
flex-direction
:
row
;
justify-content
:
space-between
;
align-items
:
center
;
.title
{
display
:
inline-block
;
width
:
70px
;
text-align
:
right
;
margin-right
:
10px
;
}
.name
{
cursor
:
pointer
;
color
:
#5890DD
;
}
img
{
width
:
12px
;
height
:
12px
;
}
.delete
{
position
:
relative
;
top
:
4px
;
cursor
:
pointer
;
width
:
16px
;
height
:
16px
;
}
}
.video-name
{
.title
{
display
:
inline-block
;
width
:
70px
;
text-align
:
right
;
margin-right
:
10px
;
}
}
}
}
.word-num
{
font-size
:
12px
;
color
:
#999
;
padding-top
:
5px
;
}
.bg-uploader
{
img
{
float
:
left
;
}
.bg-img-wrapper
{
.bg-img
{
display
:
block
;
width
:
160px
;
height
:
90px
;
}
.bg-img-doctor
{
display
:
block
;
width
:
88px
;
height
:
88px
;
}
}
.bg-video
{
float
:
left
;
width
:
84px
;
height
:
100px
;
}
}
.limit-text
{
position
:
absolute
;
top
:
86px
;
left
:
0px
;
font-size
:
12px
;
color
:
#979899
;
}
.separator-line
{
width
:
100%
;
display
:
flex
;
flex-direction
:
row
;
align-content
:
center
;
align-items
:
center
;
justify-content
:
space-between
;
.center
{
cursor
:
pointer
;
width
:
130px
;
color
:
#666666
;
img
{
width
:
12px
;
}
}
.line-left
,
.line-right
{
// display: inline-block;
// width: 100%;
flex
:
1
;
border-bottom
:
1px
dashed
#e4e7ed
;
}
}
.tips
{
width
:
100%
;
height
:
32px
;
line-height
:
32px
;
padding-left
:
12px
;
background
:
rgba
(
254
,
250
,
245
,
1
);
border-radius
:
3px
;
color
:
#e6a23c
;
}
.valid-msg
{
position
:
relative
;
.error
{
width
:
370px
;
position
:
absolute
;
display
:
flex
;
justify-content
:
space-between
;
top
:
29px
;
font-size
:
13px
;
color
:
#ed3131
;
.text
{
flex
:
1
;
}
.cancle
{
cursor
:
pointer
;
width
:
20px
;
}
}
.edit-wrapper
{
color
:
#449284
;
.edit-img
{
position
:
relative
;
top
:
2px
;
width
:
12px
;
margin
:
0
2px
0
4px
;
}
}
.doctor-select-list
{
width
:
200px
;
// max-height: 100px;
position
:
absolute
;
z-index
:
100
;
background
:
#fff
;
box-shadow
:
0
0
6px
rgba
(
0
,
0
,
0
,
0
.3
);
-webkit-box-shadow
:
0
0
6px
rgba
(
0
,
0
,
0
,
0
.3
);
// margin: 10px;
li
{
padding-left
:
20px
;
cursor
:
pointer
;
&
:hover
{
background
:
#f4f7fd
;
}
&
.doctor-selected
{
background
:
#f4f7fd
;
}
}
}
}
.upload-process
{
margin
:
10px
0
10px
10px
;
display
:
block
;
// width: 310px;
height
:
4px
;
background
:
#449284
;
border-radius
:
2px
;
}
}
.course-content-step2
{
display
:
flex
;
flex-direction
:
column
;
text-align
:
center
;
align-items
:
center
;
.success-img
{
width
:
60px
;
height
:
60px
;
}
.tips-1
{
margin-top
:
30px
;
font-size
:
18px
;
color
:
#303133
;
}
.tips-2
{
margin-top
:
4px
;
margin-bottom
:
40px
;
font-size
:
14px
;
color
:
#999999
;
}
}
}
</
style
>
src/components/education/custom-resource/edit-course-dialog copy 7.vue
已删除
100644 → 0
浏览文件 @
d2298748
<
template
>
<div
class=
"edit-course-wrapper dialog-title-border"
>
<el-dialog
ref=
"testDialogRef"
title=
"上传课程"
:visible=
"dialogVisible"
@
close=
"close"
center
:close-on-click-modal=
"false"
:close-on-press-escape=
"false"
width=
"800px"
>
<div
slot=
"title"
style=
"text-align: left;"
>
<span
style=
"font-weight: 700;"
>
上传课程
</span>
<span
style=
"font-size: 12px;color: #ED3131;margin-left: 4px;"
>
请认真核对上传内容,一旦提交后将不能修改
</span>
</div>
<div
v-show=
"step == 1"
class=
"course-content"
>
<el-form
ref=
"formDataRef"
:model=
"formData"
:rules=
"rules"
label-width=
"120px"
class=
"basic-form"
>
<el-form-item
label=
"课程名称:"
prop=
"courseName"
class=
"valid-msg"
>
<el-col
:span=
"20"
>
<el-input
size=
"small"
v-model=
"formData.courseName"
placeholder=
"请输入课程名称"
style=
"width: 360px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseName
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
<!--
<span
class=
"edit-wrapper"
>
<img
class=
"edit-img"
src=
"../../../assets/image/phrase3/icon-pz.png"
/>
修改信息
</span>
-->
</span>
<div
v-show=
"needShowAuditMsg && formData.courseNameCheck"
class=
"error"
>
<span>
错误信息错误信息错误信息错误信息错误信息错误信息息
</span>
<span
class=
"cancle"
>
X
</span>
</div>
</el-col>
</el-form-item>
<el-form-item
label=
"学科分类:"
prop=
"subjectIdList"
class=
"valid-msg"
>
<el-col
:span=
"18"
>
<!-- :props="
{ expandTrigger: 'hover' }" -->
<el-cascader
style=
"width: 360px"
v-model=
"formData.subjectIdList"
:options=
"labelOptions"
:props=
"
{ value: 'id', label: 'name', children: 'subList'}"
>
</el-cascader>
</el-col>
</el-form-item>
<el-form-item
label=
"开放范围:"
prop=
"shareType"
class=
"valid-msg"
>
<el-radio-group
v-model=
"formData.shareType"
>
<el-radio
:label=
"1"
>
机构共享
</el-radio>
</el-radio-group>
</el-form-item>
<div
class=
"basic-item-icon"
>
<span
class=
"require"
>
*
</span>
<el-form-item
label=
"课程视频:"
prop=
"range"
>
<el-upload
class=
"upload-video"
action=
"#"
:before-upload=
"beforeUploadVideo"
:limit=
"3"
:on-exceed=
"handleExceed"
:show-file-list=
"false"
>
<el-button
size=
"small"
type=
"primary"
>
点击上传
</el-button>
<div
slot=
"tip"
class=
"el-upload__tip"
>
<span
class=
"upload-tips"
>
只支持MP4格式,课程视频最多上传100个,单文件最大2G
</span>
<ul
v-show=
"formData.courseCustomChapterModels[0].courseCustomLectureModelList.length"
class=
"custom-list"
>
<li
v-for=
"(lecture, index) in formData.courseCustomChapterModels[0].courseCustomLectureModelList"
:key=
"index"
>
<ul
class=
"video"
>
<li>
<span
class=
"title"
>
视频
{{
index
+
1
}}
</span>
<img
src=
"../../../assets/image/phrase3/icon-pin.png"
/>
<span
class=
"name"
@
click=
"previewVideoAction(lecture)"
>
{{
lecture
.
resourceModel
.
name
}}
</span>
</li>
<li>
<img
@
click=
"deleteLecture(index)"
class=
"delete"
src=
"../../../assets/image/phrase3/close.png"
/>
</li>
</ul>
<div
class=
"video-name"
>
<span
class=
"title"
>
<span
>
*
</span>
<span
class=
"video-title"
>
视频名称
</span>
</span>
<el-input
size=
"small"
v-model=
"lecture.name"
placeholder=
"请输入课程名称"
style=
"width: 260px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{
(
lecture
.
name
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
</div>
</li>
<span
v-show=
"needShowUploadProcess"
class=
"upload-process"
:style=
"
{'width': (uploadProgress/100 * 340) + 'px'}">
</span>
</ul>
<span
v-if=
"!formData.courseCustomChapterModels[0].courseCustomLectureModelList.length"
v-show=
"needShowUploadProcess"
class=
"upload-process"
:style=
"
{'width': (uploadProgress/100 * 340) + 'px'}">
</span>
</div>
</el-upload>
</el-form-item>
</div>
<div
class=
"other-content valid-msg"
v-show=
"isShowOtherContent"
>
<div
class=
"tips"
>
注:以下信息为非必填项,您也可以根据实际情况修改
</div>
<div
class=
"basic-item-icon"
>
<!--
<span
class=
"require"
>
*
</span>
-->
<el-form-item
label=
"课程封面:"
>
<el-upload
v-model=
"formData.courseIntroImage"
class=
"bg-uploader"
action=
"#"
:show-file-list=
"false"
:before-upload=
"beforeUploadListPic"
:disabled=
"disabled"
>
<div
class=
"bg-img-wrapper"
>
<img
v-if=
"formData.courseIntroImage"
@
mouseover
.
stop=
"imgMouseOver=true"
:src=
"formData.courseIntroImage"
class=
"bg-img"
/>
<img
v-if=
"!formData.courseIntroImage"
class=
"bg-img"
src=
"../../../assets/image/small.png"
/>
</div>
</el-upload>
<div
class=
"limit-text"
>
尺寸:750*420,只支持jpeg格式
</div>
</el-form-item>
<p
class=
"upload-message"
v-if=
"uploadImgMessage"
>
请选择列表图片
</p>
</div>
<el-form-item
label=
"课程难度:"
>
<el-radio-group
v-model=
"formData.difficultyLevel"
>
<el-radio
:label=
"1"
>
初级
</el-radio>
<el-radio
:label=
"2"
>
中级
</el-radio>
<el-radio
:label=
"3"
>
高级
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"讲师名称:"
class=
"valid-msg"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
v-model=
"formData.courseCustomDoctorModels[0].courseDoctorName"
placeholder=
"请输入讲师名称"
style=
"width: 360px"
maxlength=
"25"
@
focus=
"isShowDoctorList=true"
@
input=
"filterDoctorName"
@
blur=
"doctorNameInputBlur"
:disabled=
"disabled"
></el-input>
<ul
v-show=
"isShowDoctorList"
class=
"doctor-select-list"
>
<li
v-for=
"(item, index) in doctorNameList"
:key=
"index"
@
click=
"selectDoctor(item.courseDoctorName, index)"
:class=
"
{'doctor-selected': item.seleted}"
>
<span
v-show=
"item.show"
>
{{
item
.
courseDoctorName
||
'测试名'
}}
</span>
</li>
</ul>
<span
class=
"word-num"
>
{{
(
formData
.
courseCustomDoctorModels
[
0
]
&&
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorName
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
</el-col>
</el-form-item>
<div
class=
"basic-item-icon"
>
<el-form-item
label=
"讲师头像:"
>
<el-upload
v-model=
"formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl"
class=
"bg-uploader"
action=
"#"
:show-file-list=
"false"
:before-upload=
"beforeUploadListPic"
:disabled=
"disabled"
>
<div
class=
"bg-img-wrapper"
>
<img
v-if=
"formData.courseCustomDoctorModels && formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl || ''"
@
mouseover
.
stop=
"imgMouseOver=true"
:src=
"formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl"
class=
"bg-img-doctor"
/>
<img
v-if=
"!(formData.courseCustomDoctorModels && formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl || '')"
class=
"bg-img-doctor"
src=
"../../../assets/image/small.png"
/>
</div>
</el-upload>
<div
class=
"limit-text"
>
尺寸:88*88,只支持jpeg格式
</div>
</el-form-item>
<p
class=
"upload-message"
v-if=
"uploadImgMessage"
>
请选择列表图片
</p>
</div>
<el-form-item
label=
"所属机构:"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
v-model=
"formData.courseCustomDoctorModels[0].courseDoctorHospital"
placeholder=
"请输入所属机构"
style=
"width: 360px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseCustomDoctorModels
&&
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorHospital
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
</el-col>
</el-form-item>
<el-form-item
label=
"课程简介:"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
type=
"textarea"
maxlength=
"200"
:autosize=
"
{ minRows: 5}"
placeholder="请输入课程简介"
v-model="formData.courseIntro"
style="width:90%;"
>
</el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseIntro
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/200
</span>
</el-col>
</el-form-item>
</div>
<!-- 更多信息 -->
<div
class=
"separator-line"
>
<span
class=
"line-left"
></span>
<div
@
click=
"toggleOtherContent"
class=
"center"
>
<span>
展开更多信息
</span>
<img
v-show=
"isShowOtherContent"
src=
"../../../assets/image/phrase3/arrow-up.png"
/>
<img
v-show=
"!isShowOtherContent"
src=
"../../../assets/image/phrase3/arrow-down.png"
/>
</div>
<span
class=
"line-right"
></span>
</div>
</el-form>
</div>
<div
v-show=
"step == 2"
class=
"course-content-step2"
>
<img
class=
"success-img"
src=
"../../../assets/image/phrase3/icon-audit-success.png"
/>
<span
class=
"tips-1"
>
您上传的课程已成功提交,预计在3-5个工作日内完成审核
</span>
<span
class=
"tips-2"
>
审核通过后,您才可以选择课程完成项目配置。如有任何疑问可联系云鹊医400-920-8877
</span>
<el-button
type=
"primary"
size=
"small"
icon=
"el-icon-back"
@
click=
"backToOrgCourse"
>
返回机构课程
</el-button>
</div>
<div
v-show=
"step == 1"
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"dialogObj.visible=true"
>
取 消
</el-button>
<el-button
type=
"primary"
@
click=
"submitForm('formDataRef')"
>
确 定
</el-button>
</div>
</el-dialog>
<DialogComponet
:dialogObj=
"dialogObj"
@
hide=
"hideCancleTips"
@
confirm=
"dialogObj.visible=false"
></DialogComponet>
<PreviewVideo
:dialogVisible=
"isPreviewVideo"
:videoUrl=
"videoUrl"
@
close=
"isPreviewVideo=false"
></PreviewVideo>
<cropper-two
v-if=
"showCropper"
:cropOption=
"cropOption"
@
getCropImg=
"getCropImg(arguments)"
:originImg=
"slide2.oriUrl"
:previewImg=
"slide2.preUrl"
/>
<!--
<button
@
click=
"previewVideoAction"
>
test video
</button>
-->
</div>
</
template
>
<
script
>
import
PreviewVideo
from
"@/components/education/custom-resource/preview-video"
;
import
PreviewProtocol
from
"@/components/education/custom-resource/preview-protocol"
;
import
PreviewEditCourse
from
"@/components/education/custom-resource/edit-course-dialog"
;
import
DialogComponet
from
"@/components/education/template/dialog"
;
import
CropperTwo
from
'@/components/common/cropper.two.vue'
import
{
doUpload
,
getFilePath
}
from
"@/utils/qiniu-util"
;
import
{
openLoading
,
closeLoading
,
getQiniuToken1
}
from
"@/utils/utils"
;
import
{
isEmptyUtils
}
from
"@/utils/index"
;
import
{
mapActions
}
from
'vuex'
;
import
{
ossUpload
,
getFilePathForOSS
}
from
"@/utils/oss/ossUtil"
;
let
vm
=
null
;
export
default
{
data
()
{
let
checkCourseName
=
(
rule
,
value
,
callback
)
=>
{
// 如果有审核的信息,则直接报错
if
(
!
value
&&
this
.
needCheckField
)
{
callback
(
new
Error
(
"请输入课程名称"
));
}
else
{
callback
();
}
};
return
{
slide2
:
{
oriUrl
:
'https://avatars1.githubusercontent.com/u/23690568?s=460&v=4'
,
// 原图
preUrl
:
'https://avatars1.githubusercontent.com/u/23690568?s=460&v=4'
// 裁剪后的预览图片,初始化为原图
},
showCropper
:
false
,
cropOption
:
{
offset_x
:
30
,
offset_y
:
40
,
width
:
600
,
height
:
400
},
step
:
1
,
needCheckField
:
false
,
needShowAuditMsg
:
false
,
needShowUploadProcess
:
false
,
disabled
:
false
,
formDataBase
:
{
checkStatus
:
0
,
courseCustomChapterModels
:
[
{
courseCustomLectureModelList
:
[],
id
:
null
,
name
:
"视频课程"
}
],
courseCustomDoctorModels
:
[
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
}
],
courseId
:
null
,
courseIntro
:
""
,
courseIntroCheck
:
""
,
courseIntroImage
:
"https://test1-file.yunqueyi.com/image/png/common/202006201528136.png"
,
courseIntroImageCheck
:
""
,
courseName
:
""
,
courseNameCheck
:
""
,
deleteCustomLectureIds
:
[],
difficultyLevel
:
1
,
shareType
:
1
,
subjectIdList
:
[]
},
formData
:
{
checkStatus
:
0
,
courseCustomChapterModels
:
[
{
courseCustomLectureModelList
:
[],
id
:
null
,
name
:
"视频课程"
}
],
courseCustomDoctorModels
:
[
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
}
],
courseId
:
null
,
courseIntro
:
""
,
courseIntroCheck
:
""
,
courseIntroImage
:
"https://test1-file.yunqueyi.com/image/png/common/202006201528136.png"
,
courseIntroImageCheck
:
""
,
courseName
:
""
,
courseNameCheck
:
""
,
deleteCustomLectureIds
:
[],
difficultyLevel
:
1
,
shareType
:
1
,
subjectIdList
:
[]
},
uploadImgMessage
:
false
,
imgMouseOver
:
false
,
rules
:
{
courseName
:
[
{
required
:
true
,
message
:
" "
},
{
validator
:
checkCourseName
}
],
subjectIdList
:
[
{
required
:
true
,
message
:
"请输入课程名称"
}
],
shareType
:
[
{
required
:
true
,
message
:
"请选择开放范围"
}
]
},
labelOptions
:
[],
isShowOtherContent
:
false
,
fileList
:
[
],
projectBanner
:
"https://file.yunqueyi.com/h5/images/cme/project-banner.png"
,
doctorHeader
:
"https://file.yunqueyi.com/h5/images/cme/doctor-header.png"
,
doctorNameList
:
[
{
courseDoctorName
:
"333"
,
show
:
true
,
seleted
:
false
},
{
courseDoctorName
:
"334"
,
show
:
true
,
seleted
:
false
},
{
courseDoctorName
:
"335"
,
show
:
true
,
seleted
:
false
},
{
courseDoctorName
:
"336"
,
show
:
true
,
seleted
:
false
}
],
isShowDoctorList
:
false
,
isPreviewVideo
:
false
,
videoUrl
:
""
,
orgCourseInfo
:
{
defaultDoctor
:
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
},
doctorModelList
:
[
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
}
],
limitModel
:
{
maxLimitOneVideoSize
:
0
,
maxLimitVideoCount
:
0
,
maxStorageSpace
:
0
,
usedStorageSpace
:
0
}
},
uploadProgress
:
0
,
dialogObj
:
{
visible
:
false
,
title
:
"确定取消吗?"
,
message
:
"发布后,项目将进入审核中,待审核完成后学员可在云鹊医App上参加培训学习"
,
tip
:
""
,
confirmMsg
:
"取 消"
,
hideMsg
:
"确 定"
},
};
},
props
:
{
dialogVisible
:
{
type
:
Boolean
,
default
:
false
},
courseId
:
{
type
:
String
|
Number
,
default
:
0
}
},
computed
:
{},
watch
:
{
dialogVisible
(
isVisible
)
{
this
.
formData
=
JSON
.
parse
(
JSON
.
stringify
(
this
.
formDataBase
));
if
(
isVisible
)
{
if
(
this
.
courseId
==
0
)
{
this
.
initAdd
(
this
.
courseId
);
}
else
{
this
.
initModify
(
this
.
courseId
);
}
}
},
},
components
:
{
PreviewVideo
,
PreviewEditCourse
,
DialogComponet
,
CropperTwo
},
created
()
{
vm
=
this
;
// this.initAdd();
},
mounted
()
{
this
.
getLabelList
();
},
methods
:
{
...
mapActions
([
'setKind'
]),
getCropImg
(
argument
)
{
console
.
log
(
argument
);
this
.
slide2
.
preUrl
=
argument
[
0
]
this
.
cropData
=
argument
[
1
]
},
// 创建课程页面的初始信息
initOrgCourseInfo
()
{
vm
.
GET
(
"contents/course/custom/info/init"
,
{
setEntry
:
true
}).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
this
.
orgCourseInfo
=
res
.
data
;
this
.
formData
.
courseCustomDoctorModels
[
0
]
=
this
.
orgCourseInfo
.
defaultDoctor
;
this
.
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorAvatarUrl
=
this
.
orgCourseInfo
.
defaultDoctor
.
courseDoctorAvatarUrl
||
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
;
this
.
doctorNameList
=
this
.
convertDNameToSelectOpt
(
this
.
orgCourseInfo
.
doctorModelList
);
+
this
.
courseId
&&
this
.
getCourseInfoById
(
this
.
courseId
);
}
}
);
},
// 将医生名称进行处理
convertDNameToSelectOpt
(
doctorModelList
)
{
doctorModelList
.
forEach
(
item
=>
{
item
.
show
=
true
;
item
.
seleted
=
false
;
});
return
doctorModelList
;
},
// 添加时初始化
initAdd
()
{
console
.
log
(
"in initAdd"
);
this
.
step
=
1
;
this
.
needShowAuditMsg
=
false
;
this
.
initOrgCourseInfo
();
},
initModify
()
{
this
.
needShowAuditMsg
=
true
;
console
.
log
(
"in initModify"
);
this
.
initOrgCourseInfo
();
},
// 创建课程页面的初始信息
getCourseInfoById
(
courseId
)
{
vm
.
GET
(
`contents/course/custom/info/
${
courseId
}
`
)
.
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
this
.
formData
=
res
.
data
;
}
}
);
},
// 过滤医生信息
filterDoctorName
(
value
)
{
this
.
doctorNameList
.
forEach
(
item
=>
{
if
(
value
)
{
if
((
item
.
value
+
""
).
indexOf
(
value
)
==
-
1
)
{
item
.
show
=
false
;
}
else
{
item
.
show
=
true
;
}
if
(
item
.
value
==
value
)
{
item
.
seleted
=
true
;
}
else
{
item
.
seleted
=
false
;
}
}
else
{
item
.
show
=
true
;
}
});
},
// 当选择医生的焦点失去时,要反选医生信息
doctorNameInputBlur
()
{
setTimeout
(()
=>
{
this
.
isShowDoctorList
=
false
;
this
.
selectDoctorByName
(
this
.
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorName
);
},
200
);
},
// 根据姓名反选医生信息
// TODO 尝试找到完全匹配的医生
selectDoctorByName
(
name
)
{
},
// 选择其中一个
selectDoctor
(
name
)
{
console
.
log
(
name
);
this
.
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorName
=
name
;
this
.
selectDoctorByName
(
name
);
},
// 关闭当前弹框
close
()
{
this
.
$emit
(
"close"
);
},
// 获取学科列表
getLabelList
()
{
let
req
=
{};
this
.
GET
(
"aggregate/content/labelList"
,
req
).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
this
.
convertLabelList
(
res
.
data
);
}
});
},
// 将所有子分类中的“全部”去掉
convertLabelList
(
labelList
)
{
let
newLabelList
=
[];
labelList
.
forEach
(
item
=>
{
item
.
subList
=
item
.
subList
.
slice
(
1
);
});
this
.
labelOptions
=
labelList
;
},
// 上传视频(mp4)
beforeUploadVideo
(
file
)
{
console
.
log
(
file
);
const
isMP4
=
file
.
type
===
"video/mp4"
;
const
isLt
=
file
.
size
/
1024
/
1024
/
1024
<
2
;
if
(
!
isLt
)
{
this
.
$message
.
error
(
"视频不符合规范,请根据规范上传视频"
);
return
;
}
if
(
!
isMP4
)
{
this
.
$message
.
error
(
"视频不符合规范,请根据规范上传视频"
);
}
else
{
// openLoading(vm);
this
.
needShowUploadProcess
=
true
;
doUpload
(
vm
,
file
,
getFilePath
(
file
,
null
),
"preview4"
,
"progress"
,
""
).
then
(
function
(
path
)
{
// closeLoading(vm);
console
.
log
(
'vm.uploadProgress'
,
vm
.
uploadProgress
);
console
.
log
(
path
);
let
uploadResourceParam
=
{
formatType
:
path
.
ext
,
name
:
path
.
name
,
qCloudUrl
:
path
.
fullPath
,
size
:
path
.
size
,
fileType
:
1
,
status
:
"success"
,
uid
:
new
Date
().
getTime
()
}
vm
.
needShowUploadProcess
=
false
;
vm
.
uploadProgress
=
0
;
vm
.
insertResourceAction
(
uploadResourceParam
);
});
}
},
// 上传资源(视频)后,生存对应的节
insertResourceAction
(
uploadResourceParam
)
{
this
.
POST
(
"contents/course/custom/info/insertResource"
,
[
uploadResourceParam
]).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
let
cName
=
res
.
data
.
resourceModelList
[
0
].
name
;
cName
=
cName
.
substr
(
0
,
cName
.
lastIndexOf
(
'.'
));
let
lectureObj
=
{
id
:
null
,
name
:
cName
,
nameCheck
:
""
,
contentCheck
:
""
,
resourceModel
:
{}
}
lectureObj
.
resourceModel
=
res
.
data
&&
res
.
data
.
resourceModelList
[
0
];
this
.
formData
.
courseCustomChapterModels
[
0
].
courseCustomLectureModelList
.
push
(
lectureObj
);
}
});
},
//上传列表图片
beforeUploadListPic
(
file
)
{
let
fileLimit
=
{
width
:
230
,
height
:
172
,
size
:
0.5
,
sizeText
:
"500K"
,
key
:
"attachmentUrl"
,
more
:
"attachmentMore1"
,
show
:
"uploadImgMessage"
};
vm
.
beforeAvatarUpload
(
file
,
fileLimit
);
},
//上传图片校验
beforeAvatarUpload2
(
file
,
fileLimit
)
{
console
.
log
();
const
isJPG
=
file
.
type
===
"image/jpeg"
;
const
isPNG
=
file
.
type
===
"image/png"
;
const
isLt2M
=
file
.
size
/
1024
/
1024
<
fileLimit
.
size
;
console
.
log
(
"isJPG"
,
isJPG
,
"isPNG"
,
isPNG
,
"isLt2M"
,
isLt2M
);
// if (!isJPG && !isPNG) {
// vm.$message.error("图片不符合规范,请根据规范上传图片");
// return;
// }
// if (!isLt2M) {
// vm.$message.error("图片不符合规范,请根据规范上传图片 ");
// return;
// }
let
_img
=
new
FileReader
();
_img
.
readAsDataURL
(
file
);
console
.
log
(
'readAsDataURL'
,
_img
,
file
);
_img
.
onload
=
function
(
theFile
)
{
let
image
=
new
Image
();
image
.
src
=
theFile
.
target
.
result
;
vm
.
slide2
.
oriUrl
=
theFile
.
target
.
result
;
vm
.
showCropper
=
true
;
console
.
log
(
'readAsDataURL222'
,
_img
.
width
,
file
,
theFile
);
image
.
onload
=
function
()
{
console
.
log
(
'image.onload'
,
image
);
let
_vm
=
this
;
if
(
false
// true ||
// _vm.width != fileLimit.width ||
// _vm.height != fileLimit.height
)
{
vm
.
$message
.
error
(
"图片不符合规范,请根据规范上传图片"
);
}
else
{
// openLoading(vm);
// doUpload(
// vm,
// file,
// getFilePath(file, null),
// "preview4",
// "progress1",
// 1
// ).then(function(path) {
// closeLoading(vm);
// console.log(path);
// if (fileLimit.show == "uploadImgMessage") {
// vm.uploadImgMessage = false;
// }
// // else if (fileLimit.show == "uploadImgMessage2") {
// // vm.uploadImgMessage2 = false;
// // }
// vm.formData[fileLimit.key] = path.fullPath;
// vm.formData[fileLimit.more] = {
// attachmentName: path.name,
// attachmentExt: path.ext,
// attachmentSize: path.size
// };
// vm.$message.success("上传成功");
// });
}
};
};
return
isJPG
&&
isLt2M
;
},
//上传图片校验
beforeAvatarUpload
(
file
,
fileLimit
)
{
console
.
log
();
const
isJPG
=
file
.
type
===
"image/jpeg"
;
const
isPNG
=
file
.
type
===
"image/png"
;
const
isLt2M
=
file
.
size
/
1024
/
1024
<
fileLimit
.
size
;
console
.
log
(
"isJPG"
,
isJPG
,
"isPNG"
,
isPNG
,
"isLt2M"
,
isLt2M
);
// if (!isJPG && !isPNG) {
// vm.$message.error("图片不符合规范,请根据规范上传图片");
// return;
// }
// if (!isLt2M) {
// vm.$message.error("图片不符合规范,请根据规范上传图片 ");
// return;
// }
let
_img
=
new
FileReader
();
_img
.
readAsDataURL
(
file
);
_img
.
onload
=
function
(
theFile
)
{
let
image
=
new
Image
();
image
.
src
=
theFile
.
target
.
result
;
image
.
onload
=
function
()
{
let
_vm
=
this
;
if
(
false
// true ||
// _vm.width != fileLimit.width ||
// _vm.height != fileLimit.height
)
{
vm
.
$message
.
error
(
"图片不符合规范,请根据规范上传图片"
);
}
else
{
openLoading
(
vm
);
doUpload
(
vm
,
file
,
getFilePath
(
file
,
null
),
"preview4"
,
"progress1"
,
1
).
then
(
function
(
path
)
{
closeLoading
(
vm
);
console
.
log
(
path
);
if
(
fileLimit
.
show
==
"uploadImgMessage"
)
{
vm
.
uploadImgMessage
=
false
;
}
// else if (fileLimit.show == "uploadImgMessage2") {
// vm.uploadImgMessage2 = false;
// }
vm
.
formData
[
fileLimit
.
key
]
=
path
.
fullPath
;
vm
.
formData
[
fileLimit
.
more
]
=
{
attachmentName
:
path
.
name
,
attachmentExt
:
path
.
ext
,
attachmentSize
:
path
.
size
};
vm
.
$message
.
success
(
"上传成功"
);
});
}
};
};
return
isJPG
&&
isLt2M
;
},
// 展开/收起 更多信息
toggleOtherContent
()
{
this
.
isShowOtherContent
=
!
this
.
isShowOtherContent
;
},
// 限制选择文件个数
handleExceed
(
files
,
fileList
)
{
this
.
$message
.
warning
(
`当前限制选择 100 个文件,您已经共选择了
${
files
.
length
+
fileList
.
length
}
个文件!`
);
},
// 删除按钮
beforeRemove
(
file
,
fileList
)
{
return
this
.
$confirm
(
`确定移除
${
file
.
name
}
?`
);
},
//表单校验
submitForm
(
formName
)
{
this
.
needShowAuditMsg
=
false
;
this
.
$refs
[
formName
].
validate
(
valid
=>
{
if
(
valid
)
{
this
.
insertOrUpdate
();
}
else
{
console
.
log
(
"error submit!!"
);
}
this
.
needShowAuditMsg
=
true
;
});
},
// 添加或修改课程(kind = 3)
insertOrUpdate
()
{
this
.
POST
(
"contents/course/custom/info/insertOrUpdate"
,
this
.
formData
).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
if
(
this
.
courseId
==
'add'
)
{
this
.
step
=
2
;
}
else
{
this
.
close
();
this
.
setKind
(
3
);
}
}
});
},
// 返回到课程选择页面(kind = 3)
backToOrgCourse
()
{
this
.
close
();
this
.
setKind
(
3
);
},
// 关闭(“取消”按钮弹出来的)弹框
hideCancleTips
()
{
this
.
dialogObj
.
visible
=
false
;
this
.
close
();
},
// 预览视频
previewVideoAction
(
lecture
)
{
this
.
videoUrl
=
lecture
.
resourceModel
.
filePath
;
this
.
isPreviewVideo
=
true
;
},
// 删除本节视频
// TODO 要将删除的节ID放在删除的节里
deleteLecture
(
index
)
{
this
.
formData
.
courseCustomChapterModels
[
0
].
courseCustomLectureModelList
.
splice
(
index
,
1
);
},
// 上传课程封面图片
beforeUpload1
(
file
)
{
const
isLt50kb
=
file
.
size
/
1024
<
50
;
// if (!isLt50kb) {
// this.$message.error("上传的图片大小不能超过 50kb");
// return;
// }
vm
.
doUploadOSS
(
file
,
1
);
//评价图片
},
// 上传讲师图片
beforeUpload2
(
file
)
{
const
isLt50kb
=
file
.
size
/
1024
<
50
;
// if (!isLt50kb) {
// this.$message.error("上传的图片大小不能超过 50kb");
// return;
// }
this
.
doUploadOSS
(
file
,
2
);
//web端课程覆盖图片
},
// (调用OSS API)开始上传
doUploadOSS
(
file
,
index
)
{
let
self
=
this
;
//如果没有选择文件,返回
// if (isEmptyUtils(file)) {
// return;
// }
// self.$message.info("开始上传");
//上传 指定文件名
ossUpload
(
self
,
file
,
getFilePathForOSS
(
file
),
null
,
null
,
null
).
then
(
function
(
path
)
{
let
list
=
[{}];
list
[
0
].
name
=
file
.
name
;
list
[
0
].
url
=
localStorage
.
getItem
(
"resource_url"
)
+
path
;
if
(
index
===
1
)
{
self
.
fileList1
=
Object
.
assign
([],
list
);
self
.
model
.
courseInfoUrl
=
path
;
}
else
if
(
index
===
2
)
{
self
.
fileList2
=
Object
.
assign
([],
list
);
self
.
model
.
appCourseUrl
=
path
;
}
self
.
$message
.
success
(
"上传成功"
);
});
return
false
;
},
}
};
</
script
>
<
style
scoped
lang=
"scss"
>
.edit-course-wrapper
{
.course-content
{
// color: red;
.basic-item-icon
{
position
:
relative
;
margin-top
:
20px
;
.require
{
position
:
absolute
;
left
:
40px
;
top
:
11px
;
color
:
#f56c6c
;
}
.upload-message
{
position
:
absolute
;
left
:
160px
;
top
:
105px
;
font-size
:
12px
;
color
:
#f56c6c
;
}
.img-delete
{
position
:
absolute
;
left
:
0px
;
top
:
0px
;
width
:
84px
;
height
:
100px
;
background
:
#000
;
opacity
:
0
.7
;
z-index
:
999
;
i
{
color
:
#fff
;
margin-top
:
39px
;
margin-left
:
0px
;
}
}
.upload-tips
{
width
:
100%
;
position
:
relative
;
top
:
-10px
;
font-size
:
12px
;
color
:
#979899
;
// display: inline-block;
}
.custom-list
{
// width: 100%;
width
:
480px
;
display
:
flex
;
flex-direction
:
column
;
border-radius
:
3px
;
border
:
1px
solid
rgba
(
228
,
231
,
237
,
1
);
padding
:
20px
;
font-size
:
14px
;
&
>
li
{
margin
:
10px
0
;
}
.video
{
display
:
flex
;
flex-direction
:
row
;
justify-content
:
space-between
;
align-items
:
center
;
.title
{
display
:
inline-block
;
width
:
70px
;
text-align
:
right
;
margin-right
:
10px
;
}
.name
{
cursor
:
pointer
;
color
:
#5890DD
;
}
img
{
width
:
12px
;
height
:
12px
;
}
.delete
{
position
:
relative
;
top
:
4px
;
cursor
:
pointer
;
width
:
16px
;
height
:
16px
;
}
}
.video-name
{
.title
{
display
:
inline-block
;
width
:
70px
;
text-align
:
right
;
margin-right
:
10px
;
}
}
}
}
.word-num
{
font-size
:
12px
;
color
:
#999
;
padding-top
:
5px
;
}
.bg-uploader
{
img
{
float
:
left
;
}
.bg-img-wrapper
{
.bg-img
{
display
:
block
;
width
:
160px
;
height
:
90px
;
}
.bg-img-doctor
{
display
:
block
;
width
:
88px
;
height
:
88px
;
}
}
.bg-video
{
float
:
left
;
width
:
84px
;
height
:
100px
;
}
}
.limit-text
{
position
:
absolute
;
top
:
86px
;
left
:
0px
;
font-size
:
12px
;
color
:
#979899
;
}
.separator-line
{
width
:
100%
;
display
:
flex
;
flex-direction
:
row
;
align-content
:
center
;
align-items
:
center
;
justify-content
:
space-between
;
.center
{
cursor
:
pointer
;
width
:
130px
;
color
:
#666666
;
img
{
width
:
12px
;
}
}
.line-left
,
.line-right
{
// display: inline-block;
// width: 100%;
flex
:
1
;
border-bottom
:
1px
dashed
#e4e7ed
;
}
}
.tips
{
width
:
100%
;
height
:
32px
;
line-height
:
32px
;
padding-left
:
12px
;
background
:
rgba
(
254
,
250
,
245
,
1
);
border-radius
:
3px
;
color
:
#e6a23c
;
}
.valid-msg
{
position
:
relative
;
.error
{
width
:
370px
;
position
:
absolute
;
display
:
flex
;
justify-content
:
space-between
;
top
:
29px
;
font-size
:
13px
;
color
:
#ed3131
;
.text
{
flex
:
1
;
}
.cancle
{
cursor
:
pointer
;
width
:
20px
;
}
}
.edit-wrapper
{
color
:
#449284
;
.edit-img
{
position
:
relative
;
top
:
2px
;
width
:
12px
;
margin
:
0
2px
0
4px
;
}
}
.doctor-select-list
{
width
:
200px
;
// max-height: 100px;
position
:
absolute
;
z-index
:
100
;
background
:
#fff
;
box-shadow
:
0
0
6px
rgba
(
0
,
0
,
0
,
0
.3
);
-webkit-box-shadow
:
0
0
6px
rgba
(
0
,
0
,
0
,
0
.3
);
// margin: 10px;
li
{
padding-left
:
20px
;
cursor
:
pointer
;
&
:hover
{
background
:
#f4f7fd
;
}
&
.doctor-selected
{
background
:
#f4f7fd
;
}
}
}
}
.upload-process
{
margin
:
10px
0
10px
10px
;
display
:
block
;
// width: 310px;
height
:
4px
;
background
:
#449284
;
border-radius
:
2px
;
}
}
.course-content-step2
{
display
:
flex
;
flex-direction
:
column
;
text-align
:
center
;
align-items
:
center
;
.success-img
{
width
:
60px
;
height
:
60px
;
}
.tips-1
{
margin-top
:
30px
;
font-size
:
18px
;
color
:
#303133
;
}
.tips-2
{
margin-top
:
4px
;
margin-bottom
:
40px
;
font-size
:
14px
;
color
:
#999999
;
}
}
}
</
style
>
src/components/education/custom-resource/edit-course-dialog copy 8.vue
已删除
100644 → 0
浏览文件 @
d2298748
<
template
>
<div
class=
"edit-course-wrapper dialog-title-border"
>
<el-dialog
ref=
"testDialogRef"
title=
"上传课程"
:visible=
"dialogVisible"
@
close=
"close"
center
:close-on-click-modal=
"false"
:close-on-press-escape=
"false"
width=
"800px"
>
<div
slot=
"title"
style=
"text-align: left;"
>
<span
style=
"font-weight: 700;"
>
上传课程
</span>
<span
style=
"font-size: 12px;color: #ED3131;margin-left: 4px;"
>
请认真核对上传内容,一旦提交后将不能修改
</span>
</div>
<div
v-show=
"step == 1"
class=
"course-content"
>
<el-form
ref=
"formDataRef"
:model=
"formData"
:rules=
"rules"
label-width=
"120px"
class=
"basic-form"
>
<el-form-item
label=
"课程名称:"
prop=
"courseName"
class=
"valid-msg"
>
<el-col
:span=
"20"
>
<el-input
size=
"small"
v-model=
"formData.courseName"
placeholder=
"请输入课程名称"
style=
"width: 360px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseName
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
<!--
<span
class=
"edit-wrapper"
>
<img
class=
"edit-img"
src=
"../../../assets/image/phrase3/icon-pz.png"
/>
修改信息
</span>
-->
</span>
<div
v-show=
"needShowAuditMsg && formData.courseNameCheck"
class=
"error"
>
<span>
错误信息错误信息错误信息错误信息错误信息错误信息息
</span>
<span
class=
"cancle"
>
X
</span>
</div>
</el-col>
</el-form-item>
<el-form-item
label=
"学科分类:"
prop=
"subjectIdList"
class=
"valid-msg"
>
<el-col
:span=
"18"
>
<!-- :props="
{ expandTrigger: 'hover' }" -->
<el-cascader
style=
"width: 360px"
v-model=
"formData.subjectIdList"
:options=
"labelOptions"
:props=
"
{ value: 'id', label: 'name', children: 'subList'}"
>
</el-cascader>
</el-col>
</el-form-item>
<el-form-item
label=
"开放范围:"
prop=
"shareType"
class=
"valid-msg"
>
<el-radio-group
v-model=
"formData.shareType"
>
<el-radio
:label=
"1"
>
机构共享
</el-radio>
</el-radio-group>
</el-form-item>
<div
class=
"basic-item-icon"
>
<span
class=
"require"
>
*
</span>
<el-form-item
label=
"课程视频:"
prop=
"range"
>
<el-upload
class=
"upload-video"
action=
"#"
:before-upload=
"beforeUploadVideo"
:limit=
"3"
:on-exceed=
"handleExceed"
:show-file-list=
"false"
>
<el-button
size=
"small"
type=
"primary"
>
点击上传
</el-button>
<div
slot=
"tip"
class=
"el-upload__tip"
>
<span
class=
"upload-tips"
>
只支持MP4格式,课程视频最多上传100个,单文件最大2G
</span>
<ul
v-show=
"formData.courseCustomChapterModels[0].courseCustomLectureModelList.length"
class=
"custom-list"
>
<li
v-for=
"(lecture, index) in formData.courseCustomChapterModels[0].courseCustomLectureModelList"
:key=
"index"
>
<ul
class=
"video"
>
<li>
<span
class=
"title"
>
视频
{{
index
+
1
}}
</span>
<img
src=
"../../../assets/image/phrase3/icon-pin.png"
/>
<span
class=
"name"
@
click=
"previewVideoAction(lecture)"
>
{{
lecture
.
resourceModel
.
name
}}
</span>
</li>
<li>
<img
@
click=
"deleteLecture(index)"
class=
"delete"
src=
"../../../assets/image/phrase3/close.png"
/>
</li>
</ul>
<div
class=
"video-name"
>
<span
class=
"title"
>
<span
>
*
</span>
<span
class=
"video-title"
>
视频名称
</span>
</span>
<el-input
size=
"small"
v-model=
"lecture.name"
placeholder=
"请输入课程名称"
style=
"width: 260px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{
(
lecture
.
name
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
</div>
</li>
<span
v-show=
"needShowUploadProcess"
class=
"upload-process"
:style=
"
{'width': (uploadProgress/100 * 340) + 'px'}">
</span>
</ul>
<span
v-if=
"!formData.courseCustomChapterModels[0].courseCustomLectureModelList.length"
v-show=
"needShowUploadProcess"
class=
"upload-process"
:style=
"
{'width': (uploadProgress/100 * 340) + 'px'}">
</span>
</div>
</el-upload>
</el-form-item>
</div>
<div
class=
"other-content valid-msg"
v-show=
"isShowOtherContent"
>
<div
class=
"tips"
>
注:以下信息为非必填项,您也可以根据实际情况修改
</div>
<div
class=
"basic-item-icon"
>
<!--
<span
class=
"require"
>
*
</span>
-->
<el-form-item
label=
"课程封面:"
>
<el-upload
v-model=
"formData.courseIntroImage"
class=
"bg-uploader"
action=
"#"
accept=
"image/*"
:show-file-list=
"false"
:before-upload=
"beforeUploadListPic"
:disabled=
"disabled"
>
<div
class=
"bg-img-wrapper"
>
<img
v-if=
"formData.courseIntroImage"
@
mouseover
.
stop=
"imgMouseOver=true"
:src=
"formData.courseIntroImage"
class=
"bg-img"
/>
<img
v-if=
"!formData.courseIntroImage"
class=
"bg-img"
src=
"../../../assets/image/small.png"
/>
</div>
</el-upload>
<div
class=
"limit-text"
>
尺寸:750*420,只支持jpeg格式
</div>
</el-form-item>
<p
class=
"upload-message"
v-if=
"uploadImgMessage"
>
请选择列表图片
</p>
</div>
<el-form-item
label=
"课程难度:"
>
<el-radio-group
v-model=
"formData.difficultyLevel"
>
<el-radio
:label=
"1"
>
初级
</el-radio>
<el-radio
:label=
"2"
>
中级
</el-radio>
<el-radio
:label=
"3"
>
高级
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"讲师名称:"
class=
"valid-msg"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
v-model=
"formData.courseCustomDoctorModels[0].courseDoctorName"
placeholder=
"请输入讲师名称"
style=
"width: 360px"
maxlength=
"25"
@
focus=
"isShowDoctorList=true"
@
input=
"filterDoctorName"
@
blur=
"doctorNameInputBlur"
:disabled=
"disabled"
></el-input>
<ul
v-show=
"isShowDoctorList"
class=
"doctor-select-list"
>
<li
v-for=
"(item, index) in doctorNameList"
:key=
"index"
@
click=
"selectDoctor(item.courseDoctorName, index)"
:class=
"
{'doctor-selected': item.seleted}"
>
<span
v-show=
"item.show"
>
{{
item
.
courseDoctorName
||
'测试名'
}}
</span>
</li>
</ul>
<span
class=
"word-num"
>
{{
(
formData
.
courseCustomDoctorModels
[
0
]
&&
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorName
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
</el-col>
</el-form-item>
<div
class=
"basic-item-icon"
>
<el-form-item
label=
"讲师头像:"
>
<el-upload
v-model=
"formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl"
class=
"bg-uploader"
action=
"#"
accept=
"image/*"
:show-file-list=
"false"
:before-upload=
"beforeUploadListPic"
:disabled=
"disabled"
>
<div
class=
"bg-img-wrapper"
>
<img
v-if=
"formData.courseCustomDoctorModels && formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl || ''"
@
mouseover
.
stop=
"imgMouseOver=true"
:src=
"formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl"
class=
"bg-img-doctor"
/>
<img
v-if=
"!(formData.courseCustomDoctorModels && formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl || '')"
class=
"bg-img-doctor"
src=
"../../../assets/image/small.png"
/>
</div>
</el-upload>
<div
class=
"limit-text"
>
尺寸:88*88,只支持jpeg格式
</div>
</el-form-item>
<p
class=
"upload-message"
v-if=
"uploadImgMessage"
>
请选择列表图片
</p>
</div>
<el-form-item
label=
"所属机构:"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
v-model=
"formData.courseCustomDoctorModels[0].courseDoctorHospital"
placeholder=
"请输入所属机构"
style=
"width: 360px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseCustomDoctorModels
&&
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorHospital
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
</el-col>
</el-form-item>
<el-form-item
label=
"课程简介:"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
type=
"textarea"
maxlength=
"200"
:autosize=
"
{ minRows: 5}"
placeholder="请输入课程简介"
v-model="formData.courseIntro"
style="width:90%;"
>
</el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseIntro
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/200
</span>
</el-col>
</el-form-item>
</div>
<!-- 更多信息 -->
<div
class=
"separator-line"
>
<span
class=
"line-left"
></span>
<div
@
click=
"toggleOtherContent"
class=
"center"
>
<span>
展开更多信息
</span>
<img
v-show=
"isShowOtherContent"
src=
"../../../assets/image/phrase3/arrow-up.png"
/>
<img
v-show=
"!isShowOtherContent"
src=
"../../../assets/image/phrase3/arrow-down.png"
/>
</div>
<span
class=
"line-right"
></span>
</div>
</el-form>
</div>
<div
v-show=
"step == 2"
class=
"course-content-step2"
>
<img
class=
"success-img"
src=
"../../../assets/image/phrase3/icon-audit-success.png"
/>
<span
class=
"tips-1"
>
您上传的课程已成功提交,预计在3-5个工作日内完成审核
</span>
<span
class=
"tips-2"
>
审核通过后,您才可以选择课程完成项目配置。如有任何疑问可联系云鹊医400-920-8877
</span>
<el-button
type=
"primary"
size=
"small"
icon=
"el-icon-back"
@
click=
"backToOrgCourse"
>
返回机构课程
</el-button>
</div>
<div
v-show=
"step == 1"
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"dialogObj.visible=true"
>
取 消
</el-button>
<el-button
type=
"primary"
@
click=
"submitForm('formDataRef')"
>
确 定
</el-button>
</div>
</el-dialog>
<DialogComponet
:dialogObj=
"dialogObj"
@
hide=
"hideCancleTips"
@
confirm=
"dialogObj.visible=false"
></DialogComponet>
<PreviewVideo
:dialogVisible=
"isPreviewVideo"
:videoUrl=
"videoUrl"
@
close=
"isPreviewVideo=false"
></PreviewVideo>
<el-dialog
title=
"拒绝原因"
:visible=
"showCropper"
@
close=
"hideAuditForm"
width=
"800px"
center
>
<cropper-two
:cropOption=
"cropOption"
@
getCropImg=
"getCropImg(arguments)"
:originImg=
"slide2.oriUrl"
:previewImg=
"slide2.preUrl"
/>
</el-dialog>
<!--
<button
@
click=
"previewVideoAction"
>
test video
</button>
-->
</div>
</
template
>
<
script
>
import
PreviewVideo
from
"@/components/education/custom-resource/preview-video"
;
import
PreviewProtocol
from
"@/components/education/custom-resource/preview-protocol"
;
import
PreviewEditCourse
from
"@/components/education/custom-resource/edit-course-dialog"
;
import
DialogComponet
from
"@/components/education/template/dialog"
;
import
CropperTwo
from
'@/components/common/cropper.two.vue'
import
{
doUpload
,
getFilePath
}
from
"@/utils/qiniu-util"
;
import
{
openLoading
,
closeLoading
,
getQiniuToken1
}
from
"@/utils/utils"
;
import
{
isEmptyUtils
}
from
"@/utils/index"
;
import
{
mapActions
}
from
'vuex'
;
import
{
ossUpload
,
getFilePathForOSS
}
from
"@/utils/oss/ossUtil"
;
let
vm
=
null
;
export
default
{
data
()
{
let
checkCourseName
=
(
rule
,
value
,
callback
)
=>
{
// 如果有审核的信息,则直接报错
if
(
!
value
&&
this
.
needCheckField
)
{
callback
(
new
Error
(
"请输入课程名称"
));
}
else
{
callback
();
}
};
return
{
slide2
:
{
oriUrl
:
'https://avatars1.githubusercontent.com/u/23690568?s=460&v=4'
,
// 原图
preUrl
:
'https://avatars1.githubusercontent.com/u/23690568?s=460&v=4'
// 裁剪后的预览图片,初始化为原图
},
showCropper
:
false
,
cropOption
:
{
offset_x
:
30
,
offset_y
:
40
,
width
:
600
,
height
:
400
},
step
:
1
,
needCheckField
:
false
,
needShowAuditMsg
:
false
,
needShowUploadProcess
:
false
,
disabled
:
false
,
formDataBase
:
{
checkStatus
:
0
,
courseCustomChapterModels
:
[
{
courseCustomLectureModelList
:
[],
id
:
null
,
name
:
"视频课程"
}
],
courseCustomDoctorModels
:
[
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
}
],
courseId
:
null
,
courseIntro
:
""
,
courseIntroCheck
:
""
,
courseIntroImage
:
"https://test1-file.yunqueyi.com/image/png/common/202006201528136.png"
,
courseIntroImageCheck
:
""
,
courseName
:
""
,
courseNameCheck
:
""
,
deleteCustomLectureIds
:
[],
difficultyLevel
:
1
,
shareType
:
1
,
subjectIdList
:
[]
},
formData
:
{
checkStatus
:
0
,
courseCustomChapterModels
:
[
{
courseCustomLectureModelList
:
[],
id
:
null
,
name
:
"视频课程"
}
],
courseCustomDoctorModels
:
[
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
}
],
courseId
:
null
,
courseIntro
:
""
,
courseIntroCheck
:
""
,
courseIntroImage
:
"https://test1-file.yunqueyi.com/image/png/common/202006201528136.png"
,
courseIntroImageCheck
:
""
,
courseName
:
""
,
courseNameCheck
:
""
,
deleteCustomLectureIds
:
[],
difficultyLevel
:
1
,
shareType
:
1
,
subjectIdList
:
[]
},
uploadImgMessage
:
false
,
imgMouseOver
:
false
,
rules
:
{
courseName
:
[
{
required
:
true
,
message
:
" "
},
{
validator
:
checkCourseName
}
],
subjectIdList
:
[
{
required
:
true
,
message
:
"请输入课程名称"
}
],
shareType
:
[
{
required
:
true
,
message
:
"请选择开放范围"
}
]
},
labelOptions
:
[],
isShowOtherContent
:
false
,
fileList
:
[
],
projectBanner
:
"https://file.yunqueyi.com/h5/images/cme/project-banner.png"
,
doctorHeader
:
"https://file.yunqueyi.com/h5/images/cme/doctor-header.png"
,
doctorNameList
:
[
{
courseDoctorName
:
"333"
,
show
:
true
,
seleted
:
false
},
{
courseDoctorName
:
"334"
,
show
:
true
,
seleted
:
false
},
{
courseDoctorName
:
"335"
,
show
:
true
,
seleted
:
false
},
{
courseDoctorName
:
"336"
,
show
:
true
,
seleted
:
false
}
],
isShowDoctorList
:
false
,
isPreviewVideo
:
false
,
videoUrl
:
""
,
orgCourseInfo
:
{
defaultDoctor
:
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
},
doctorModelList
:
[
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
}
],
limitModel
:
{
maxLimitOneVideoSize
:
0
,
maxLimitVideoCount
:
0
,
maxStorageSpace
:
0
,
usedStorageSpace
:
0
}
},
uploadProgress
:
0
,
dialogObj
:
{
visible
:
false
,
title
:
"确定取消吗?"
,
message
:
"发布后,项目将进入审核中,待审核完成后学员可在云鹊医App上参加培训学习"
,
tip
:
""
,
confirmMsg
:
"取 消"
,
hideMsg
:
"确 定"
},
};
},
props
:
{
dialogVisible
:
{
type
:
Boolean
,
default
:
false
},
courseId
:
{
type
:
String
|
Number
,
default
:
0
}
},
computed
:
{},
watch
:
{
dialogVisible
(
isVisible
)
{
this
.
formData
=
JSON
.
parse
(
JSON
.
stringify
(
this
.
formDataBase
));
if
(
isVisible
)
{
if
(
this
.
courseId
==
0
)
{
this
.
initAdd
(
this
.
courseId
);
}
else
{
this
.
initModify
(
this
.
courseId
);
}
}
},
},
components
:
{
PreviewVideo
,
PreviewEditCourse
,
DialogComponet
,
CropperTwo
},
created
()
{
vm
=
this
;
// this.initAdd();
},
mounted
()
{
this
.
getLabelList
();
},
methods
:
{
...
mapActions
([
'setKind'
]),
getCropImg
(
argument
)
{
console
.
log
(
argument
);
this
.
slide2
.
preUrl
=
argument
[
0
]
this
.
cropData
=
argument
[
1
]
},
// 创建课程页面的初始信息
initOrgCourseInfo
()
{
vm
.
GET
(
"contents/course/custom/info/init"
,
{
setEntry
:
true
}).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
this
.
orgCourseInfo
=
res
.
data
;
this
.
formData
.
courseCustomDoctorModels
[
0
]
=
this
.
orgCourseInfo
.
defaultDoctor
;
this
.
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorAvatarUrl
=
this
.
orgCourseInfo
.
defaultDoctor
.
courseDoctorAvatarUrl
||
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
;
this
.
doctorNameList
=
this
.
convertDNameToSelectOpt
(
this
.
orgCourseInfo
.
doctorModelList
);
+
this
.
courseId
&&
this
.
getCourseInfoById
(
this
.
courseId
);
}
}
);
},
// 将医生名称进行处理
convertDNameToSelectOpt
(
doctorModelList
)
{
doctorModelList
.
forEach
(
item
=>
{
item
.
show
=
true
;
item
.
seleted
=
false
;
});
return
doctorModelList
;
},
// 添加时初始化
initAdd
()
{
console
.
log
(
"in initAdd"
);
this
.
step
=
1
;
this
.
needShowAuditMsg
=
false
;
this
.
initOrgCourseInfo
();
},
initModify
()
{
this
.
needShowAuditMsg
=
true
;
console
.
log
(
"in initModify"
);
this
.
initOrgCourseInfo
();
},
// 创建课程页面的初始信息
getCourseInfoById
(
courseId
)
{
vm
.
GET
(
`contents/course/custom/info/
${
courseId
}
`
)
.
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
this
.
formData
=
res
.
data
;
}
}
);
},
// 过滤医生信息
filterDoctorName
(
value
)
{
this
.
doctorNameList
.
forEach
(
item
=>
{
if
(
value
)
{
if
((
item
.
value
+
""
).
indexOf
(
value
)
==
-
1
)
{
item
.
show
=
false
;
}
else
{
item
.
show
=
true
;
}
if
(
item
.
value
==
value
)
{
item
.
seleted
=
true
;
}
else
{
item
.
seleted
=
false
;
}
}
else
{
item
.
show
=
true
;
}
});
},
// 当选择医生的焦点失去时,要反选医生信息
doctorNameInputBlur
()
{
setTimeout
(()
=>
{
this
.
isShowDoctorList
=
false
;
this
.
selectDoctorByName
(
this
.
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorName
);
},
200
);
},
// 根据姓名反选医生信息
// TODO 尝试找到完全匹配的医生
selectDoctorByName
(
name
)
{
},
// 选择其中一个
selectDoctor
(
name
)
{
console
.
log
(
name
);
this
.
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorName
=
name
;
this
.
selectDoctorByName
(
name
);
},
// 关闭当前弹框
close
()
{
this
.
$emit
(
"close"
);
},
// 获取学科列表
getLabelList
()
{
let
req
=
{};
this
.
GET
(
"aggregate/content/labelList"
,
req
).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
this
.
convertLabelList
(
res
.
data
);
}
});
},
// 将所有子分类中的“全部”去掉
convertLabelList
(
labelList
)
{
let
newLabelList
=
[];
labelList
.
forEach
(
item
=>
{
item
.
subList
=
item
.
subList
.
slice
(
1
);
});
this
.
labelOptions
=
labelList
;
},
// 上传视频(mp4)
beforeUploadVideo
(
file
)
{
console
.
log
(
file
);
const
isMP4
=
file
.
type
===
"video/mp4"
;
const
isLt
=
file
.
size
/
1024
/
1024
/
1024
<
2
;
if
(
!
isLt
)
{
this
.
$message
.
error
(
"视频不符合规范,请根据规范上传视频"
);
return
;
}
if
(
!
isMP4
)
{
this
.
$message
.
error
(
"视频不符合规范,请根据规范上传视频"
);
}
else
{
// openLoading(vm);
this
.
needShowUploadProcess
=
true
;
doUpload
(
vm
,
file
,
getFilePath
(
file
,
null
),
"preview4"
,
"progress"
,
""
).
then
(
function
(
path
)
{
// closeLoading(vm);
console
.
log
(
'vm.uploadProgress'
,
vm
.
uploadProgress
);
console
.
log
(
path
);
let
uploadResourceParam
=
{
formatType
:
path
.
ext
,
name
:
path
.
name
.
substring
(
path
.
name
.
length
-
25
),
//path.name,
qCloudUrl
:
path
.
fullPath
,
size
:
path
.
size
,
fileType
:
1
,
status
:
"success"
,
uid
:
new
Date
().
getTime
()
}
vm
.
needShowUploadProcess
=
false
;
vm
.
uploadProgress
=
0
;
vm
.
insertResourceAction
(
uploadResourceParam
);
});
}
},
// 上传资源(视频)后,生存对应的节
insertResourceAction
(
uploadResourceParam
)
{
this
.
POST
(
"contents/course/custom/info/insertResource"
,
[
uploadResourceParam
]).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
let
cName
=
res
.
data
.
resourceModelList
[
0
].
name
;
// cName = cName.substr(0, cName.lastIndexOf('.'));
let
lectureObj
=
{
id
:
null
,
name
:
cName
,
nameCheck
:
""
,
contentCheck
:
""
,
resourceModel
:
{}
}
lectureObj
.
resourceModel
=
res
.
data
&&
res
.
data
.
resourceModelList
[
0
];
this
.
formData
.
courseCustomChapterModels
[
0
].
courseCustomLectureModelList
.
push
(
lectureObj
);
}
});
},
//上传列表图片
beforeUploadListPic
(
file
)
{
let
fileLimit
=
{
width
:
230
,
height
:
172
,
size
:
0.5
,
sizeText
:
"500K"
,
key
:
"attachmentUrl"
,
more
:
"attachmentMore1"
,
show
:
"uploadImgMessage"
};
vm
.
beforeAvatarUpload2
(
file
,
fileLimit
);
// vm.beforeAvatarUpload(file, fileLimit);
},
//上传图片校验
beforeAvatarUpload2
(
file
,
fileLimit
)
{
console
.
log
();
const
isJPG
=
file
.
type
===
"image/jpeg"
;
const
isPNG
=
file
.
type
===
"image/png"
;
const
isLt2M
=
file
.
size
/
1024
/
1024
<
fileLimit
.
size
;
console
.
log
(
"isJPG"
,
isJPG
,
"isPNG"
,
isPNG
,
"isLt2M"
,
isLt2M
);
// if (!isJPG && !isPNG) {
// vm.$message.error("图片不符合规范,请根据规范上传图片");
// return;
// }
// if (!isLt2M) {
// vm.$message.error("图片不符合规范,请根据规范上传图片 ");
// return;
// }
let
_img
=
new
FileReader
();
_img
.
readAsDataURL
(
file
);
console
.
log
(
'readAsDataURL'
,
_img
,
file
);
_img
.
onload
=
function
(
theFile
)
{
let
image
=
new
Image
();
image
.
src
=
theFile
.
target
.
result
;
vm
.
slide2
.
oriUrl
=
theFile
.
target
.
result
;
vm
.
showCropper
=
true
;
console
.
log
(
'readAsDataURL222'
,
_img
.
width
,
file
,
theFile
);
image
.
onload
=
function
()
{
console
.
log
(
'image.onload'
,
image
);
let
_vm
=
this
;
if
(
false
// true ||
// _vm.width != fileLimit.width ||
// _vm.height != fileLimit.height
)
{
vm
.
$message
.
error
(
"图片不符合规范,请根据规范上传图片"
);
}
else
{
// openLoading(vm);
// doUpload(
// vm,
// file,
// getFilePath(file, null),
// "preview4",
// "progress1",
// 1
// ).then(function(path) {
// closeLoading(vm);
// console.log(path);
// if (fileLimit.show == "uploadImgMessage") {
// vm.uploadImgMessage = false;
// }
// // else if (fileLimit.show == "uploadImgMessage2") {
// // vm.uploadImgMessage2 = false;
// // }
// vm.formData[fileLimit.key] = path.fullPath;
// vm.formData[fileLimit.more] = {
// attachmentName: path.name,
// attachmentExt: path.ext,
// attachmentSize: path.size
// };
// vm.$message.success("上传成功");
// });
}
};
};
return
isJPG
&&
isLt2M
;
},
//上传图片校验
beforeAvatarUpload
(
file
,
fileLimit
)
{
console
.
log
();
const
isJPG
=
file
.
type
===
"image/jpeg"
;
const
isPNG
=
file
.
type
===
"image/png"
;
const
isLt2M
=
file
.
size
/
1024
/
1024
<
fileLimit
.
size
;
console
.
log
(
"isJPG"
,
isJPG
,
"isPNG"
,
isPNG
,
"isLt2M"
,
isLt2M
);
// if (!isJPG && !isPNG) {
// vm.$message.error("图片不符合规范,请根据规范上传图片");
// return;
// }
// if (!isLt2M) {
// vm.$message.error("图片不符合规范,请根据规范上传图片 ");
// return;
// }
let
_img
=
new
FileReader
();
_img
.
readAsDataURL
(
file
);
_img
.
onload
=
function
(
theFile
)
{
let
image
=
new
Image
();
image
.
src
=
theFile
.
target
.
result
;
image
.
onload
=
function
()
{
let
_vm
=
this
;
if
(
false
// true ||
// _vm.width != fileLimit.width ||
// _vm.height != fileLimit.height
)
{
vm
.
$message
.
error
(
"图片不符合规范,请根据规范上传图片"
);
}
else
{
openLoading
(
vm
);
doUpload
(
vm
,
file
,
getFilePath
(
file
,
null
),
"preview4"
,
"progress1"
,
1
).
then
(
function
(
path
)
{
closeLoading
(
vm
);
console
.
log
(
path
);
if
(
fileLimit
.
show
==
"uploadImgMessage"
)
{
vm
.
uploadImgMessage
=
false
;
}
// else if (fileLimit.show == "uploadImgMessage2") {
// vm.uploadImgMessage2 = false;
// }
vm
.
formData
[
fileLimit
.
key
]
=
path
.
fullPath
;
vm
.
formData
[
fileLimit
.
more
]
=
{
attachmentName
:
path
.
name
,
attachmentExt
:
path
.
ext
,
attachmentSize
:
path
.
size
};
vm
.
$message
.
success
(
"上传成功"
);
});
}
};
};
return
isJPG
&&
isLt2M
;
},
// 展开/收起 更多信息
toggleOtherContent
()
{
this
.
isShowOtherContent
=
!
this
.
isShowOtherContent
;
},
// 限制选择文件个数
handleExceed
(
files
,
fileList
)
{
this
.
$message
.
warning
(
`当前限制选择 100 个文件,您已经共选择了
${
files
.
length
+
fileList
.
length
}
个文件!`
);
},
// 删除按钮
beforeRemove
(
file
,
fileList
)
{
return
this
.
$confirm
(
`确定移除
${
file
.
name
}
?`
);
},
//表单校验
submitForm
(
formName
)
{
this
.
needShowAuditMsg
=
false
;
this
.
$refs
[
formName
].
validate
(
valid
=>
{
if
(
valid
)
{
this
.
insertOrUpdate
();
}
else
{
console
.
log
(
"error submit!!"
);
}
this
.
needShowAuditMsg
=
true
;
});
},
// 添加或修改课程(kind = 3)
insertOrUpdate
()
{
this
.
POST
(
"contents/course/custom/info/insertOrUpdate"
,
this
.
formData
).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
if
(
this
.
courseId
==
'add'
)
{
this
.
step
=
2
;
}
else
{
this
.
close
();
this
.
setKind
(
3
);
}
}
});
},
// 返回到课程选择页面(kind = 3)
backToOrgCourse
()
{
this
.
close
();
this
.
setKind
(
3
);
},
// 关闭(“取消”按钮弹出来的)弹框
hideCancleTips
()
{
this
.
dialogObj
.
visible
=
false
;
this
.
close
();
},
// 预览视频
previewVideoAction
(
lecture
)
{
this
.
videoUrl
=
lecture
.
resourceModel
.
filePath
;
this
.
isPreviewVideo
=
true
;
},
// 删除本节视频
// TODO 要将删除的节ID放在删除的节里
deleteLecture
(
index
)
{
this
.
formData
.
courseCustomChapterModels
[
0
].
courseCustomLectureModelList
.
splice
(
index
,
1
);
},
// 上传课程封面图片
beforeUpload1
(
file
)
{
console
.
log
(
'beforeUpload1'
,
file
);
const
isLt50kb
=
file
.
size
/
1024
<
50
;
// if (!isLt50kb) {
// this.$message.error("上传的图片大小不能超过 50kb");
// return;
// }
vm
.
doUploadOSS
(
file
,
1
);
//评价图片
},
// 上传讲师图片
beforeUpload2
(
file
)
{
console
.
log
(
'beforeUpload2'
,
file
);
const
isLt50kb
=
file
.
size
/
1024
<
50
;
// if (!isLt50kb) {
// this.$message.error("上传的图片大小不能超过 50kb");
// return;
// }
this
.
doUploadOSS
(
file
,
2
);
//web端课程覆盖图片
},
// (调用OSS API)开始上传
doUploadOSS
(
file
,
index
)
{
let
self
=
this
;
//如果没有选择文件,返回
// if (isEmptyUtils(file)) {
// return;
// }
// self.$message.info("开始上传");
//上传 指定文件名
ossUpload
(
self
,
file
,
getFilePathForOSS
(
file
),
null
,
null
,
null
).
then
(
function
(
path
)
{
let
list
=
[{}];
list
[
0
].
name
=
file
.
name
;
list
[
0
].
url
=
localStorage
.
getItem
(
"resource_url"
)
+
path
;
if
(
index
===
1
)
{
// self.fileList1 = Object.assign([], list);
// self.model.courseInfoUrl = path;
}
else
if
(
index
===
2
)
{
// self.fileList2 = Object.assign([], list);
// self.model.appCourseUrl = path;
}
self
.
$message
.
success
(
"上传成功"
);
});
return
false
;
},
}
};
</
script
>
<
style
scoped
lang=
"scss"
>
.edit-course-wrapper
{
.course-content
{
// color: red;
.basic-item-icon
{
position
:
relative
;
margin-top
:
20px
;
.require
{
position
:
absolute
;
left
:
40px
;
top
:
11px
;
color
:
#f56c6c
;
}
.upload-message
{
position
:
absolute
;
left
:
160px
;
top
:
105px
;
font-size
:
12px
;
color
:
#f56c6c
;
}
.img-delete
{
position
:
absolute
;
left
:
0px
;
top
:
0px
;
width
:
84px
;
height
:
100px
;
background
:
#000
;
opacity
:
0
.7
;
z-index
:
999
;
i
{
color
:
#fff
;
margin-top
:
39px
;
margin-left
:
0px
;
}
}
.upload-tips
{
width
:
100%
;
position
:
relative
;
top
:
-10px
;
font-size
:
12px
;
color
:
#979899
;
// display: inline-block;
}
.custom-list
{
// width: 100%;
width
:
480px
;
display
:
flex
;
flex-direction
:
column
;
border-radius
:
3px
;
border
:
1px
solid
rgba
(
228
,
231
,
237
,
1
);
padding
:
20px
;
font-size
:
14px
;
&
>
li
{
margin
:
10px
0
;
}
.video
{
display
:
flex
;
flex-direction
:
row
;
justify-content
:
space-between
;
align-items
:
center
;
.title
{
display
:
inline-block
;
width
:
70px
;
text-align
:
right
;
margin-right
:
10px
;
}
.name
{
cursor
:
pointer
;
color
:
#5890DD
;
}
img
{
width
:
12px
;
height
:
12px
;
}
.delete
{
position
:
relative
;
top
:
4px
;
cursor
:
pointer
;
width
:
16px
;
height
:
16px
;
}
}
.video-name
{
.title
{
display
:
inline-block
;
width
:
70px
;
text-align
:
right
;
margin-right
:
10px
;
}
}
}
}
.word-num
{
font-size
:
12px
;
color
:
#999
;
padding-top
:
5px
;
}
.bg-uploader
{
img
{
float
:
left
;
}
.bg-img-wrapper
{
.bg-img
{
display
:
block
;
width
:
160px
;
height
:
90px
;
}
.bg-img-doctor
{
display
:
block
;
width
:
88px
;
height
:
88px
;
}
}
.bg-video
{
float
:
left
;
width
:
84px
;
height
:
100px
;
}
}
.limit-text
{
position
:
absolute
;
top
:
86px
;
left
:
0px
;
font-size
:
12px
;
color
:
#979899
;
}
.separator-line
{
width
:
100%
;
display
:
flex
;
flex-direction
:
row
;
align-content
:
center
;
align-items
:
center
;
justify-content
:
space-between
;
.center
{
cursor
:
pointer
;
width
:
130px
;
color
:
#666666
;
img
{
width
:
12px
;
}
}
.line-left
,
.line-right
{
// display: inline-block;
// width: 100%;
flex
:
1
;
border-bottom
:
1px
dashed
#e4e7ed
;
}
}
.tips
{
width
:
100%
;
height
:
32px
;
line-height
:
32px
;
padding-left
:
12px
;
background
:
rgba
(
254
,
250
,
245
,
1
);
border-radius
:
3px
;
color
:
#e6a23c
;
}
.valid-msg
{
position
:
relative
;
.error
{
width
:
370px
;
position
:
absolute
;
display
:
flex
;
justify-content
:
space-between
;
top
:
29px
;
font-size
:
13px
;
color
:
#ed3131
;
.text
{
flex
:
1
;
}
.cancle
{
cursor
:
pointer
;
width
:
20px
;
}
}
.edit-wrapper
{
color
:
#449284
;
.edit-img
{
position
:
relative
;
top
:
2px
;
width
:
12px
;
margin
:
0
2px
0
4px
;
}
}
.doctor-select-list
{
width
:
200px
;
// max-height: 100px;
position
:
absolute
;
z-index
:
100
;
background
:
#fff
;
box-shadow
:
0
0
6px
rgba
(
0
,
0
,
0
,
0
.3
);
-webkit-box-shadow
:
0
0
6px
rgba
(
0
,
0
,
0
,
0
.3
);
// margin: 10px;
li
{
padding-left
:
20px
;
cursor
:
pointer
;
&
:hover
{
background
:
#f4f7fd
;
}
&
.doctor-selected
{
background
:
#f4f7fd
;
}
}
}
}
.upload-process
{
margin
:
10px
0
10px
10px
;
display
:
block
;
// width: 310px;
height
:
4px
;
background
:
#449284
;
border-radius
:
2px
;
}
}
.course-content-step2
{
display
:
flex
;
flex-direction
:
column
;
text-align
:
center
;
align-items
:
center
;
.success-img
{
width
:
60px
;
height
:
60px
;
}
.tips-1
{
margin-top
:
30px
;
font-size
:
18px
;
color
:
#303133
;
}
.tips-2
{
margin-top
:
4px
;
margin-bottom
:
40px
;
font-size
:
14px
;
color
:
#999999
;
}
}
}
</
style
>
src/components/education/custom-resource/edit-course-dialog copy 9.vue
已删除
100644 → 0
浏览文件 @
d2298748
<
template
>
<div
class=
"edit-course-wrapper dialog-title-border"
>
<el-dialog
ref=
"testDialogRef"
title=
"上传课程"
:visible=
"dialogVisible"
@
close=
"close"
center
:close-on-click-modal=
"false"
:close-on-press-escape=
"false"
width=
"800px"
>
<div
slot=
"title"
style=
"text-align: left;"
>
<span
style=
"font-weight: 700;"
>
上传课程
</span>
<span
style=
"font-size: 12px;color: #ED3131;margin-left: 4px;"
>
请认真核对上传内容,一旦提交后将不能修改
</span>
</div>
<div
v-show=
"step == 1"
class=
"course-content"
>
<el-form
ref=
"formDataRef"
:model=
"formData"
:rules=
"rules"
label-width=
"120px"
class=
"basic-form"
>
<el-form-item
label=
"课程名称:"
prop=
"courseName"
class=
"valid-msg"
>
<el-col
:span=
"20"
>
<el-input
size=
"small"
v-model=
"formData.courseName"
placeholder=
"请输入课程名称"
style=
"width: 360px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseName
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
<!--
<span
class=
"edit-wrapper"
>
<img
class=
"edit-img"
src=
"../../../assets/image/phrase3/icon-pz.png"
/>
修改信息
</span>
-->
</span>
<div
v-show=
"needShowAuditMsg && formData.courseNameCheck"
class=
"error"
>
<span>
错误信息错误信息错误信息错误信息错误信息错误信息息
</span>
<span
class=
"cancle"
>
X
</span>
</div>
</el-col>
</el-form-item>
<el-form-item
label=
"学科分类:"
prop=
"subjectIdList"
class=
"valid-msg"
>
<el-col
:span=
"18"
>
<!-- :props="
{ expandTrigger: 'hover' }" -->
<el-cascader
style=
"width: 360px"
v-model=
"formData.subjectIdList"
:options=
"labelOptions"
:props=
"
{ value: 'id', label: 'name', children: 'subList'}"
>
</el-cascader>
</el-col>
</el-form-item>
<el-form-item
label=
"开放范围:"
prop=
"shareType"
class=
"valid-msg"
>
<el-radio-group
v-model=
"formData.shareType"
>
<el-radio
:label=
"1"
>
机构共享
</el-radio>
</el-radio-group>
</el-form-item>
<div
class=
"basic-item-icon"
>
<span
class=
"require"
>
*
</span>
<el-form-item
label=
"课程视频:"
prop=
"range"
>
<el-upload
class=
"upload-video"
action=
"#"
:before-upload=
"beforeUploadVideo"
:limit=
"3"
:on-exceed=
"handleExceed"
:show-file-list=
"false"
>
<el-button
size=
"small"
type=
"primary"
>
点击上传
</el-button>
<div
slot=
"tip"
class=
"el-upload__tip"
>
<span
class=
"upload-tips"
>
只支持MP4格式,课程视频最多上传100个,单文件最大2G
</span>
<ul
v-show=
"formData.courseCustomChapterModels[0].courseCustomLectureModelList.length"
class=
"custom-list"
>
<li
v-for=
"(lecture, index) in formData.courseCustomChapterModels[0].courseCustomLectureModelList"
:key=
"index"
>
<ul
class=
"video"
>
<li>
<span
class=
"title"
>
视频
{{
index
+
1
}}
</span>
<img
src=
"../../../assets/image/phrase3/icon-pin.png"
/>
<span
class=
"name"
@
click=
"previewVideoAction(lecture)"
>
{{
lecture
.
resourceModel
.
name
}}
</span>
</li>
<li>
<img
@
click=
"deleteLecture(index)"
class=
"delete"
src=
"../../../assets/image/phrase3/close.png"
/>
</li>
</ul>
<div
class=
"video-name"
>
<span
class=
"title"
>
<span
>
*
</span>
<span
class=
"video-title"
>
视频名称
</span>
</span>
<el-input
size=
"small"
v-model=
"lecture.name"
placeholder=
"请输入课程名称"
style=
"width: 260px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{
(
lecture
.
name
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
</div>
</li>
<span
v-show=
"needShowUploadProcess"
class=
"upload-process"
:style=
"
{'width': (uploadProgress/100 * 340) + 'px'}">
</span>
</ul>
<span
v-if=
"!formData.courseCustomChapterModels[0].courseCustomLectureModelList.length"
v-show=
"needShowUploadProcess"
class=
"upload-process"
:style=
"
{'width': (uploadProgress/100 * 340) + 'px'}">
</span>
</div>
</el-upload>
</el-form-item>
</div>
<div
class=
"other-content valid-msg"
v-show=
"isShowOtherContent"
>
<div
class=
"tips"
>
注:以下信息为非必填项,您也可以根据实际情况修改
</div>
<div
class=
"basic-item-icon"
>
<!--
<span
class=
"require"
>
*
</span>
-->
<el-form-item
label=
"课程封面:"
>
<el-upload
v-model=
"formData.courseIntroImage"
class=
"bg-uploader"
action=
"#"
accept=
"image/*"
:show-file-list=
"false"
:before-upload=
"beforeUploadListPic"
:disabled=
"disabled"
>
<div
class=
"bg-img-wrapper"
>
<img
v-if=
"formData.courseIntroImage"
@
mouseover
.
stop=
"imgMouseOver=true"
:src=
"formData.courseIntroImage"
class=
"bg-img"
/>
<img
v-if=
"!formData.courseIntroImage"
class=
"bg-img"
src=
"../../../assets/image/small.png"
/>
</div>
</el-upload>
<div
class=
"limit-text"
>
尺寸:750*420,只支持jpeg格式
</div>
</el-form-item>
<p
class=
"upload-message"
v-if=
"uploadImgMessage"
>
请选择列表图片
</p>
</div>
<el-form-item
label=
"课程难度:"
>
<el-radio-group
v-model=
"formData.difficultyLevel"
>
<el-radio
:label=
"1"
>
初级
</el-radio>
<el-radio
:label=
"2"
>
中级
</el-radio>
<el-radio
:label=
"3"
>
高级
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"讲师名称:"
class=
"valid-msg"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
v-model=
"formData.courseCustomDoctorModels[0].courseDoctorName"
placeholder=
"请输入讲师名称"
style=
"width: 360px"
maxlength=
"25"
@
focus=
"isShowDoctorList=true"
@
input=
"filterDoctorName"
@
blur=
"doctorNameInputBlur"
:disabled=
"disabled"
></el-input>
<ul
v-show=
"isShowDoctorList"
class=
"doctor-select-list"
>
<li
v-for=
"(item, index) in doctorNameList"
:key=
"index"
@
click=
"selectDoctor(item.courseDoctorName, index)"
:class=
"
{'doctor-selected': item.seleted}"
>
<span
v-show=
"item.show"
>
{{
item
.
courseDoctorName
||
'测试名'
}}
</span>
</li>
</ul>
<span
class=
"word-num"
>
{{
(
formData
.
courseCustomDoctorModels
[
0
]
&&
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorName
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
</el-col>
</el-form-item>
<div
class=
"basic-item-icon"
>
<el-form-item
label=
"讲师头像:"
>
<el-upload
v-model=
"formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl"
class=
"bg-uploader"
action=
"#"
accept=
"image/*"
:show-file-list=
"false"
:before-upload=
"beforeUploadListPic"
:disabled=
"disabled"
>
<div
class=
"bg-img-wrapper"
>
<img
v-if=
"formData.courseCustomDoctorModels && formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl || ''"
@
mouseover
.
stop=
"imgMouseOver=true"
:src=
"formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl"
class=
"bg-img-doctor"
/>
<img
v-if=
"!(formData.courseCustomDoctorModels && formData.courseCustomDoctorModels[0].courseDoctorAvatarUrl || '')"
class=
"bg-img-doctor"
src=
"../../../assets/image/small.png"
/>
</div>
</el-upload>
<div
class=
"limit-text"
>
尺寸:88*88,只支持jpeg格式
</div>
</el-form-item>
<p
class=
"upload-message"
v-if=
"uploadImgMessage"
>
请选择列表图片
</p>
</div>
<el-form-item
label=
"所属机构:"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
v-model=
"formData.courseCustomDoctorModels[0].courseDoctorHospital"
placeholder=
"请输入所属机构"
style=
"width: 360px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseCustomDoctorModels
&&
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorHospital
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
</el-col>
</el-form-item>
<el-form-item
label=
"课程简介:"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
type=
"textarea"
maxlength=
"200"
:autosize=
"
{ minRows: 5}"
placeholder="请输入课程简介"
v-model="formData.courseIntro"
style="width:90%;"
>
</el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseIntro
||
''
).
replace
(
/
\s
+/g
,
""
).
length
}}
/200
</span>
</el-col>
</el-form-item>
</div>
<!-- 更多信息 -->
<div
class=
"separator-line"
>
<span
class=
"line-left"
></span>
<div
@
click=
"toggleOtherContent"
class=
"center"
>
<span>
展开更多信息
</span>
<img
v-show=
"isShowOtherContent"
src=
"../../../assets/image/phrase3/arrow-up.png"
/>
<img
v-show=
"!isShowOtherContent"
src=
"../../../assets/image/phrase3/arrow-down.png"
/>
</div>
<span
class=
"line-right"
></span>
</div>
</el-form>
</div>
<div
v-show=
"step == 2"
class=
"course-content-step2"
>
<img
class=
"success-img"
src=
"../../../assets/image/phrase3/icon-audit-success.png"
/>
<span
class=
"tips-1"
>
您上传的课程已成功提交,预计在3-5个工作日内完成审核
</span>
<span
class=
"tips-2"
>
审核通过后,您才可以选择课程完成项目配置。如有任何疑问可联系云鹊医400-920-8877
</span>
<el-button
type=
"primary"
size=
"small"
icon=
"el-icon-back"
@
click=
"backToOrgCourse"
>
返回机构课程
</el-button>
</div>
<div
v-show=
"step == 1"
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"dialogObj.visible=true"
>
取 消
</el-button>
<el-button
type=
"primary"
@
click=
"submitForm('formDataRef')"
>
确 定
</el-button>
</div>
</el-dialog>
<DialogComponet
:dialogObj=
"dialogObj"
@
hide=
"hideCancleTips"
@
confirm=
"dialogObj.visible=false"
></DialogComponet>
<PreviewVideo
:dialogVisible=
"isPreviewVideo"
:videoUrl=
"videoUrl"
@
close=
"isPreviewVideo=false"
></PreviewVideo>
<el-dialog
title=
"拒绝原因"
:visible=
"showCropper"
width=
"1000px"
center
>
<cropper-two
:cropOption=
"cropOption"
@
getCropImg=
"getCropImg(arguments)"
:originImg=
"slide2.oriUrl"
:previewImg=
"slide2.preUrl"
/>
</el-dialog>
<!--
<button
@
click=
"previewVideoAction"
>
test video
</button>
-->
</div>
</
template
>
<
script
>
import
PreviewVideo
from
"@/components/education/custom-resource/preview-video"
;
import
PreviewProtocol
from
"@/components/education/custom-resource/preview-protocol"
;
import
PreviewEditCourse
from
"@/components/education/custom-resource/edit-course-dialog"
;
import
DialogComponet
from
"@/components/education/template/dialog"
;
import
CropperTwo
from
'@/components/common/cropper.two.vue'
import
{
doUpload
,
getFilePath
}
from
"@/utils/qiniu-util"
;
import
{
openLoading
,
closeLoading
,
getQiniuToken1
}
from
"@/utils/utils"
;
import
{
isEmptyUtils
}
from
"@/utils/index"
;
import
{
mapActions
}
from
'vuex'
;
import
{
ossUpload
,
getFilePathForOSS
}
from
"@/utils/oss/ossUtil"
;
let
vm
=
null
;
export
default
{
data
()
{
let
checkCourseName
=
(
rule
,
value
,
callback
)
=>
{
// 如果有审核的信息,则直接报错
if
(
!
value
&&
this
.
needCheckField
)
{
callback
(
new
Error
(
"请输入课程名称"
));
}
else
{
callback
();
}
};
return
{
slide2
:
{
oriUrl
:
'https://avatars1.githubusercontent.com/u/23690568?s=460&v=4'
,
// 原图
preUrl
:
'https://avatars1.githubusercontent.com/u/23690568?s=460&v=4'
// 裁剪后的预览图片,初始化为原图
},
showCropper
:
false
,
cropOption
:
{
offset_x
:
10
,
offset_y
:
10
,
width
:
750
,
height
:
420
},
step
:
1
,
needCheckField
:
false
,
needShowAuditMsg
:
false
,
needShowUploadProcess
:
false
,
disabled
:
false
,
formDataBase
:
{
checkStatus
:
0
,
courseCustomChapterModels
:
[
{
courseCustomLectureModelList
:
[],
id
:
null
,
name
:
"视频课程"
}
],
courseCustomDoctorModels
:
[
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
}
],
courseId
:
null
,
courseIntro
:
""
,
courseIntroCheck
:
""
,
courseIntroImage
:
"https://test1-file.yunqueyi.com/image/png/common/202006201528136.png"
,
courseIntroImageCheck
:
""
,
courseName
:
""
,
courseNameCheck
:
""
,
deleteCustomLectureIds
:
[],
difficultyLevel
:
1
,
shareType
:
1
,
subjectIdList
:
[]
},
formData
:
{
checkStatus
:
0
,
courseCustomChapterModels
:
[
{
courseCustomLectureModelList
:
[],
id
:
null
,
name
:
"视频课程"
}
],
courseCustomDoctorModels
:
[
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
}
],
courseId
:
null
,
courseIntro
:
""
,
courseIntroCheck
:
""
,
courseIntroImage
:
"https://test1-file.yunqueyi.com/image/png/common/202006201528136.png"
,
courseIntroImageCheck
:
""
,
courseName
:
""
,
courseNameCheck
:
""
,
deleteCustomLectureIds
:
[],
difficultyLevel
:
1
,
shareType
:
1
,
subjectIdList
:
[]
},
uploadImgMessage
:
false
,
imgMouseOver
:
false
,
rules
:
{
courseName
:
[
{
required
:
true
,
message
:
" "
},
{
validator
:
checkCourseName
}
],
subjectIdList
:
[
{
required
:
true
,
message
:
"请输入课程名称"
}
],
shareType
:
[
{
required
:
true
,
message
:
"请选择开放范围"
}
]
},
labelOptions
:
[],
isShowOtherContent
:
false
,
fileList
:
[
],
projectBanner
:
"https://file.yunqueyi.com/h5/images/cme/project-banner.png"
,
doctorHeader
:
"https://file.yunqueyi.com/h5/images/cme/doctor-header.png"
,
doctorNameList
:
[
{
courseDoctorName
:
"333"
,
show
:
true
,
seleted
:
false
},
{
courseDoctorName
:
"334"
,
show
:
true
,
seleted
:
false
},
{
courseDoctorName
:
"335"
,
show
:
true
,
seleted
:
false
},
{
courseDoctorName
:
"336"
,
show
:
true
,
seleted
:
false
}
],
isShowDoctorList
:
false
,
isPreviewVideo
:
false
,
videoUrl
:
""
,
orgCourseInfo
:
{
defaultDoctor
:
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
},
doctorModelList
:
[
{
courseDoctorAvatarUrl
:
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
,
courseDoctorAvatarUrlCheck
:
""
,
courseDoctorHospital
:
""
,
courseDoctorHospitalCheck
:
""
,
courseDoctorName
:
""
,
courseDoctorNameCheck
:
""
,
id
:
null
}
],
limitModel
:
{
maxLimitOneVideoSize
:
0
,
maxLimitVideoCount
:
0
,
maxStorageSpace
:
0
,
usedStorageSpace
:
0
}
},
uploadProgress
:
0
,
dialogObj
:
{
visible
:
false
,
title
:
"确定取消吗?"
,
message
:
"发布后,项目将进入审核中,待审核完成后学员可在云鹊医App上参加培训学习"
,
tip
:
""
,
confirmMsg
:
"取 消"
,
hideMsg
:
"确 定"
},
};
},
props
:
{
dialogVisible
:
{
type
:
Boolean
,
default
:
false
},
courseId
:
{
type
:
String
|
Number
,
default
:
0
}
},
computed
:
{},
watch
:
{
dialogVisible
(
isVisible
)
{
this
.
formData
=
JSON
.
parse
(
JSON
.
stringify
(
this
.
formDataBase
));
if
(
isVisible
)
{
if
(
this
.
courseId
==
0
)
{
this
.
initAdd
(
this
.
courseId
);
}
else
{
this
.
initModify
(
this
.
courseId
);
}
}
},
},
components
:
{
PreviewVideo
,
PreviewEditCourse
,
DialogComponet
,
CropperTwo
},
created
()
{
vm
=
this
;
// this.initAdd();
},
mounted
()
{
this
.
getLabelList
();
},
methods
:
{
...
mapActions
([
'setKind'
]),
getCropImg
(
argument
)
{
this
.
showCropper
=
false
;
console
.
log
(
argument
[
0
],
'#####'
,
argument
[
1
]);
this
.
slide2
.
preUrl
=
argument
[
0
]
this
.
cropData
=
argument
[
1
]
},
// 创建课程页面的初始信息
initOrgCourseInfo
()
{
vm
.
GET
(
"contents/course/custom/info/init"
,
{
setEntry
:
true
}).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
this
.
orgCourseInfo
=
res
.
data
;
this
.
formData
.
courseCustomDoctorModels
[
0
]
=
this
.
orgCourseInfo
.
defaultDoctor
;
this
.
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorAvatarUrl
=
this
.
orgCourseInfo
.
defaultDoctor
.
courseDoctorAvatarUrl
||
"https://test1-file.yunqueyi.com/image/png/common/2020062015265063.png"
;
this
.
doctorNameList
=
this
.
convertDNameToSelectOpt
(
this
.
orgCourseInfo
.
doctorModelList
);
+
this
.
courseId
&&
this
.
getCourseInfoById
(
this
.
courseId
);
}
}
);
},
// 将医生名称进行处理
convertDNameToSelectOpt
(
doctorModelList
)
{
doctorModelList
.
forEach
(
item
=>
{
item
.
show
=
true
;
item
.
seleted
=
false
;
});
return
doctorModelList
;
},
// 添加时初始化
initAdd
()
{
console
.
log
(
"in initAdd"
);
this
.
step
=
1
;
this
.
needShowAuditMsg
=
false
;
this
.
initOrgCourseInfo
();
},
initModify
()
{
this
.
needShowAuditMsg
=
true
;
console
.
log
(
"in initModify"
);
this
.
initOrgCourseInfo
();
},
// 创建课程页面的初始信息
getCourseInfoById
(
courseId
)
{
vm
.
GET
(
`contents/course/custom/info/
${
courseId
}
`
)
.
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
this
.
formData
=
res
.
data
;
}
}
);
},
// 过滤医生信息
filterDoctorName
(
value
)
{
this
.
doctorNameList
.
forEach
(
item
=>
{
if
(
value
)
{
if
((
item
.
value
+
""
).
indexOf
(
value
)
==
-
1
)
{
item
.
show
=
false
;
}
else
{
item
.
show
=
true
;
}
if
(
item
.
value
==
value
)
{
item
.
seleted
=
true
;
}
else
{
item
.
seleted
=
false
;
}
}
else
{
item
.
show
=
true
;
}
});
},
// 当选择医生的焦点失去时,要反选医生信息
doctorNameInputBlur
()
{
setTimeout
(()
=>
{
this
.
isShowDoctorList
=
false
;
this
.
selectDoctorByName
(
this
.
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorName
);
},
200
);
},
// 根据姓名反选医生信息
// TODO 尝试找到完全匹配的医生
selectDoctorByName
(
name
)
{
},
// 选择其中一个
selectDoctor
(
name
)
{
console
.
log
(
name
);
this
.
formData
.
courseCustomDoctorModels
[
0
].
courseDoctorName
=
name
;
this
.
selectDoctorByName
(
name
);
},
// 关闭当前弹框
close
()
{
this
.
$emit
(
"close"
);
},
// 获取学科列表
getLabelList
()
{
let
req
=
{};
this
.
GET
(
"aggregate/content/labelList"
,
req
).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
this
.
convertLabelList
(
res
.
data
);
}
});
},
// 将所有子分类中的“全部”去掉
convertLabelList
(
labelList
)
{
let
newLabelList
=
[];
labelList
.
forEach
(
item
=>
{
item
.
subList
=
item
.
subList
.
slice
(
1
);
});
this
.
labelOptions
=
labelList
;
},
// 上传视频(mp4)
beforeUploadVideo
(
file
)
{
console
.
log
(
file
);
const
isMP4
=
file
.
type
===
"video/mp4"
;
const
isLt
=
file
.
size
/
1024
/
1024
/
1024
<
2
;
if
(
!
isLt
)
{
this
.
$message
.
error
(
"视频不符合规范,请根据规范上传视频"
);
return
;
}
if
(
!
isMP4
)
{
this
.
$message
.
error
(
"视频不符合规范,请根据规范上传视频"
);
}
else
{
// openLoading(vm);
this
.
needShowUploadProcess
=
true
;
doUpload
(
vm
,
file
,
getFilePath
(
file
,
null
),
"preview4"
,
"progress"
,
""
).
then
(
function
(
path
)
{
// closeLoading(vm);
console
.
log
(
'vm.uploadProgress'
,
vm
.
uploadProgress
);
console
.
log
(
path
);
let
uploadResourceParam
=
{
formatType
:
path
.
ext
,
name
:
path
.
name
.
substring
(
path
.
name
.
length
-
25
),
//path.name,
qCloudUrl
:
path
.
fullPath
,
size
:
path
.
size
,
fileType
:
1
,
status
:
"success"
,
uid
:
new
Date
().
getTime
()
}
vm
.
needShowUploadProcess
=
false
;
vm
.
uploadProgress
=
0
;
vm
.
insertResourceAction
(
uploadResourceParam
);
});
}
},
// 上传资源(视频)后,生存对应的节
insertResourceAction
(
uploadResourceParam
)
{
this
.
POST
(
"contents/course/custom/info/insertResource"
,
[
uploadResourceParam
]).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
let
cName
=
res
.
data
.
resourceModelList
[
0
].
name
;
// cName = cName.substr(0, cName.lastIndexOf('.'));
let
lectureObj
=
{
id
:
null
,
name
:
cName
,
nameCheck
:
""
,
contentCheck
:
""
,
resourceModel
:
{}
}
lectureObj
.
resourceModel
=
res
.
data
&&
res
.
data
.
resourceModelList
[
0
];
this
.
formData
.
courseCustomChapterModels
[
0
].
courseCustomLectureModelList
.
push
(
lectureObj
);
}
});
},
//上传列表图片
beforeUploadListPic
(
file
)
{
let
fileLimit
=
{
width
:
230
,
height
:
172
,
size
:
0.5
,
sizeText
:
"500K"
,
key
:
"attachmentUrl"
,
more
:
"attachmentMore1"
,
show
:
"uploadImgMessage"
};
vm
.
beforeAvatarUpload2
(
file
,
fileLimit
);
// vm.beforeAvatarUpload(file, fileLimit);
},
//上传图片校验
beforeAvatarUpload2
(
file
,
fileLimit
)
{
console
.
log
();
const
isJPG
=
file
.
type
===
"image/jpeg"
;
const
isPNG
=
file
.
type
===
"image/png"
;
const
isLt2M
=
file
.
size
/
1024
/
1024
<
fileLimit
.
size
;
console
.
log
(
"isJPG"
,
isJPG
,
"isPNG"
,
isPNG
,
"isLt2M"
,
isLt2M
);
// if (!isJPG && !isPNG) {
// vm.$message.error("图片不符合规范,请根据规范上传图片");
// return;
// }
// if (!isLt2M) {
// vm.$message.error("图片不符合规范,请根据规范上传图片 ");
// return;
// }
let
_img
=
new
FileReader
();
_img
.
readAsDataURL
(
file
);
console
.
log
(
'readAsDataURL'
,
_img
,
file
);
_img
.
onload
=
function
(
theFile
)
{
let
image
=
new
Image
();
image
.
src
=
theFile
.
target
.
result
;
vm
.
slide2
.
oriUrl
=
theFile
.
target
.
result
;
vm
.
showCropper
=
true
;
console
.
log
(
'readAsDataURL222'
,
_img
.
width
,
file
,
theFile
);
image
.
onload
=
function
()
{
console
.
log
(
'image.onload'
,
image
);
let
_vm
=
this
;
if
(
false
// true ||
// _vm.width != fileLimit.width ||
// _vm.height != fileLimit.height
)
{
vm
.
$message
.
error
(
"图片不符合规范,请根据规范上传图片"
);
}
else
{
// openLoading(vm);
// doUpload(
// vm,
// file,
// getFilePath(file, null),
// "preview4",
// "progress1",
// 1
// ).then(function(path) {
// closeLoading(vm);
// console.log(path);
// if (fileLimit.show == "uploadImgMessage") {
// vm.uploadImgMessage = false;
// }
// // else if (fileLimit.show == "uploadImgMessage2") {
// // vm.uploadImgMessage2 = false;
// // }
// vm.formData[fileLimit.key] = path.fullPath;
// vm.formData[fileLimit.more] = {
// attachmentName: path.name,
// attachmentExt: path.ext,
// attachmentSize: path.size
// };
// vm.$message.success("上传成功");
// });
}
};
};
return
isJPG
&&
isLt2M
;
},
//上传图片校验
beforeAvatarUpload
(
file
,
fileLimit
)
{
console
.
log
();
const
isJPG
=
file
.
type
===
"image/jpeg"
;
const
isPNG
=
file
.
type
===
"image/png"
;
const
isLt2M
=
file
.
size
/
1024
/
1024
<
fileLimit
.
size
;
console
.
log
(
"isJPG"
,
isJPG
,
"isPNG"
,
isPNG
,
"isLt2M"
,
isLt2M
);
// if (!isJPG && !isPNG) {
// vm.$message.error("图片不符合规范,请根据规范上传图片");
// return;
// }
// if (!isLt2M) {
// vm.$message.error("图片不符合规范,请根据规范上传图片 ");
// return;
// }
let
_img
=
new
FileReader
();
_img
.
readAsDataURL
(
file
);
_img
.
onload
=
function
(
theFile
)
{
let
image
=
new
Image
();
image
.
src
=
theFile
.
target
.
result
;
image
.
onload
=
function
()
{
let
_vm
=
this
;
if
(
false
// true ||
// _vm.width != fileLimit.width ||
// _vm.height != fileLimit.height
)
{
vm
.
$message
.
error
(
"图片不符合规范,请根据规范上传图片"
);
}
else
{
openLoading
(
vm
);
doUpload
(
vm
,
file
,
getFilePath
(
file
,
null
),
"preview4"
,
"progress1"
,
1
).
then
(
function
(
path
)
{
closeLoading
(
vm
);
console
.
log
(
path
);
if
(
fileLimit
.
show
==
"uploadImgMessage"
)
{
vm
.
uploadImgMessage
=
false
;
}
// else if (fileLimit.show == "uploadImgMessage2") {
// vm.uploadImgMessage2 = false;
// }
vm
.
formData
[
fileLimit
.
key
]
=
path
.
fullPath
;
vm
.
formData
[
fileLimit
.
more
]
=
{
attachmentName
:
path
.
name
,
attachmentExt
:
path
.
ext
,
attachmentSize
:
path
.
size
};
vm
.
$message
.
success
(
"上传成功"
);
});
}
};
};
return
isJPG
&&
isLt2M
;
},
// 展开/收起 更多信息
toggleOtherContent
()
{
this
.
isShowOtherContent
=
!
this
.
isShowOtherContent
;
},
// 限制选择文件个数
handleExceed
(
files
,
fileList
)
{
this
.
$message
.
warning
(
`当前限制选择 100 个文件,您已经共选择了
${
files
.
length
+
fileList
.
length
}
个文件!`
);
},
// 删除按钮
beforeRemove
(
file
,
fileList
)
{
return
this
.
$confirm
(
`确定移除
${
file
.
name
}
?`
);
},
//表单校验
submitForm
(
formName
)
{
this
.
needShowAuditMsg
=
false
;
this
.
$refs
[
formName
].
validate
(
valid
=>
{
if
(
valid
)
{
this
.
insertOrUpdate
();
}
else
{
console
.
log
(
"error submit!!"
);
}
this
.
needShowAuditMsg
=
true
;
});
},
// 添加或修改课程(kind = 3)
insertOrUpdate
()
{
this
.
POST
(
"contents/course/custom/info/insertOrUpdate"
,
this
.
formData
).
then
(
res
=>
{
if
(
res
.
code
==
"000000"
)
{
if
(
this
.
courseId
==
'add'
)
{
this
.
step
=
2
;
}
else
{
this
.
close
();
this
.
setKind
(
3
);
}
}
});
},
// 返回到课程选择页面(kind = 3)
backToOrgCourse
()
{
this
.
close
();
this
.
setKind
(
3
);
},
// 关闭(“取消”按钮弹出来的)弹框
hideCancleTips
()
{
this
.
dialogObj
.
visible
=
false
;
this
.
close
();
},
// 预览视频
previewVideoAction
(
lecture
)
{
this
.
videoUrl
=
lecture
.
resourceModel
.
filePath
;
this
.
isPreviewVideo
=
true
;
},
// 删除本节视频
// TODO 要将删除的节ID放在删除的节里
deleteLecture
(
index
)
{
this
.
formData
.
courseCustomChapterModels
[
0
].
courseCustomLectureModelList
.
splice
(
index
,
1
);
},
// 上传课程封面图片
beforeUpload1
(
file
)
{
console
.
log
(
'beforeUpload1'
,
file
);
const
isLt50kb
=
file
.
size
/
1024
<
50
;
// if (!isLt50kb) {
// this.$message.error("上传的图片大小不能超过 50kb");
// return;
// }
vm
.
doUploadOSS
(
file
,
1
);
//评价图片
},
// 上传讲师图片
beforeUpload2
(
file
)
{
console
.
log
(
'beforeUpload2'
,
file
);
const
isLt50kb
=
file
.
size
/
1024
<
50
;
// if (!isLt50kb) {
// this.$message.error("上传的图片大小不能超过 50kb");
// return;
// }
this
.
doUploadOSS
(
file
,
2
);
//web端课程覆盖图片
},
// (调用OSS API)开始上传
doUploadOSS
(
file
,
index
)
{
let
self
=
this
;
//如果没有选择文件,返回
// if (isEmptyUtils(file)) {
// return;
// }
// self.$message.info("开始上传");
//上传 指定文件名
ossUpload
(
self
,
file
,
getFilePathForOSS
(
file
),
null
,
null
,
null
).
then
(
function
(
path
)
{
let
list
=
[{}];
list
[
0
].
name
=
file
.
name
;
list
[
0
].
url
=
localStorage
.
getItem
(
"resource_url"
)
+
path
;
if
(
index
===
1
)
{
// self.fileList1 = Object.assign([], list);
// self.model.courseInfoUrl = path;
}
else
if
(
index
===
2
)
{
// self.fileList2 = Object.assign([], list);
// self.model.appCourseUrl = path;
}
self
.
$message
.
success
(
"上传成功"
);
});
return
false
;
},
}
};
</
script
>
<
style
scoped
lang=
"scss"
>
.edit-course-wrapper
{
.course-content
{
// color: red;
.basic-item-icon
{
position
:
relative
;
margin-top
:
20px
;
.require
{
position
:
absolute
;
left
:
40px
;
top
:
11px
;
color
:
#f56c6c
;
}
.upload-message
{
position
:
absolute
;
left
:
160px
;
top
:
105px
;
font-size
:
12px
;
color
:
#f56c6c
;
}
.img-delete
{
position
:
absolute
;
left
:
0px
;
top
:
0px
;
width
:
84px
;
height
:
100px
;
background
:
#000
;
opacity
:
0
.7
;
z-index
:
999
;
i
{
color
:
#fff
;
margin-top
:
39px
;
margin-left
:
0px
;
}
}
.upload-tips
{
width
:
100%
;
position
:
relative
;
top
:
-10px
;
font-size
:
12px
;
color
:
#979899
;
// display: inline-block;
}
.custom-list
{
// width: 100%;
width
:
480px
;
display
:
flex
;
flex-direction
:
column
;
border-radius
:
3px
;
border
:
1px
solid
rgba
(
228
,
231
,
237
,
1
);
padding
:
20px
;
font-size
:
14px
;
&
>
li
{
margin
:
10px
0
;
}
.video
{
display
:
flex
;
flex-direction
:
row
;
justify-content
:
space-between
;
align-items
:
center
;
.title
{
display
:
inline-block
;
width
:
70px
;
text-align
:
right
;
margin-right
:
10px
;
}
.name
{
cursor
:
pointer
;
color
:
#5890DD
;
}
img
{
width
:
12px
;
height
:
12px
;
}
.delete
{
position
:
relative
;
top
:
4px
;
cursor
:
pointer
;
width
:
16px
;
height
:
16px
;
}
}
.video-name
{
.title
{
display
:
inline-block
;
width
:
70px
;
text-align
:
right
;
margin-right
:
10px
;
}
}
}
}
.word-num
{
font-size
:
12px
;
color
:
#999
;
padding-top
:
5px
;
}
.bg-uploader
{
img
{
float
:
left
;
}
.bg-img-wrapper
{
.bg-img
{
display
:
block
;
width
:
160px
;
height
:
90px
;
}
.bg-img-doctor
{
display
:
block
;
width
:
88px
;
height
:
88px
;
}
}
.bg-video
{
float
:
left
;
width
:
84px
;
height
:
100px
;
}
}
.limit-text
{
position
:
absolute
;
top
:
86px
;
left
:
0px
;
font-size
:
12px
;
color
:
#979899
;
}
.separator-line
{
width
:
100%
;
display
:
flex
;
flex-direction
:
row
;
align-content
:
center
;
align-items
:
center
;
justify-content
:
space-between
;
.center
{
cursor
:
pointer
;
width
:
130px
;
color
:
#666666
;
img
{
width
:
12px
;
}
}
.line-left
,
.line-right
{
// display: inline-block;
// width: 100%;
flex
:
1
;
border-bottom
:
1px
dashed
#e4e7ed
;
}
}
.tips
{
width
:
100%
;
height
:
32px
;
line-height
:
32px
;
padding-left
:
12px
;
background
:
rgba
(
254
,
250
,
245
,
1
);
border-radius
:
3px
;
color
:
#e6a23c
;
}
.valid-msg
{
position
:
relative
;
.error
{
width
:
370px
;
position
:
absolute
;
display
:
flex
;
justify-content
:
space-between
;
top
:
29px
;
font-size
:
13px
;
color
:
#ed3131
;
.text
{
flex
:
1
;
}
.cancle
{
cursor
:
pointer
;
width
:
20px
;
}
}
.edit-wrapper
{
color
:
#449284
;
.edit-img
{
position
:
relative
;
top
:
2px
;
width
:
12px
;
margin
:
0
2px
0
4px
;
}
}
.doctor-select-list
{
width
:
200px
;
// max-height: 100px;
position
:
absolute
;
z-index
:
100
;
background
:
#fff
;
box-shadow
:
0
0
6px
rgba
(
0
,
0
,
0
,
0
.3
);
-webkit-box-shadow
:
0
0
6px
rgba
(
0
,
0
,
0
,
0
.3
);
// margin: 10px;
li
{
padding-left
:
20px
;
cursor
:
pointer
;
&
:hover
{
background
:
#f4f7fd
;
}
&
.doctor-selected
{
background
:
#f4f7fd
;
}
}
}
}
.upload-process
{
margin
:
10px
0
10px
10px
;
display
:
block
;
// width: 310px;
height
:
4px
;
background
:
#449284
;
border-radius
:
2px
;
}
}
.course-content-step2
{
display
:
flex
;
flex-direction
:
column
;
text-align
:
center
;
align-items
:
center
;
.success-img
{
width
:
60px
;
height
:
60px
;
}
.tips-1
{
margin-top
:
30px
;
font-size
:
18px
;
color
:
#303133
;
}
.tips-2
{
margin-top
:
4px
;
margin-bottom
:
40px
;
font-size
:
14px
;
color
:
#999999
;
}
}
}
</
style
>
src/components/education/custom-resource/edit-course-dialog copy.vue
已删除
100644 → 0
浏览文件 @
d2298748
<
template
>
<div
class=
"edit-course-wrapper dialog-title-border"
>
<el-dialog
ref=
"testDialogRef"
title=
"上传课程"
:visible=
"dialogVisible"
@
close=
"close"
center
:close-on-click-modal=
"false"
:close-on-press-escape=
"false"
width=
"800px"
>
<div
slot=
"title"
style=
"text-align: left;"
>
<span
style=
"font-weight: 700;"
>
上传课程
</span>
<span
style=
"font-size: 12px;color: #999;"
>
请认真核对上传内容,一旦提交后将不能修改
</span>
</div>
<div
class=
"course-content"
>
<el-form
ref=
"formDataRef"
:model=
"formData"
:rules=
"rules"
label-width=
"120px"
class=
"basic-form"
>
<el-form-item
label=
"课程名称:"
prop=
"courseName"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
v-model=
"formData.courseName"
placeholder=
"请输入课程名称"
style=
"width: 360px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{
(
formData
.
courseName
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
</el-col>
</el-form-item>
<el-form-item
label=
"学科分类:"
prop=
"subjectId"
>
<el-col
:span=
"18"
>
<!-- :props="
{ expandTrigger: 'hover' }" -->
<el-cascader
style=
"width: 360px"
v-model=
"formData.subjectIdList"
:options=
"labelOptions"
:props=
"
{ value: 'id', label: 'name', children: 'subList'}"
@change="handleChange">
<!--
<template
slot-scope=
"
{ node, data }">
<span>
{{
data
.
name
}}
</span>
</
template
>
-->
</el-cascader>
</el-col>
</el-form-item>
<el-form-item
label=
"开放范围:"
prop=
"shareType"
>
<el-radio-group
v-model=
"formData.shareType"
>
<el-radio
:label=
"1"
>
机构共享
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"课程视频:"
prop=
"range"
>
<!-- action="https://jsonplaceholder.typicode.com/posts/" -->
<el-upload
class=
"upload-demo"
action=
"https://sc.yunqueyi.com/contents/admin/qiniu/token1"
:on-preview=
"handlePreview"
:on-remove=
"handleRemove"
:before-remove=
"beforeRemove"
multiple
:limit=
"100"
:on-exceed=
"handleExceed"
:file-list=
"fileList"
>
<el-button
size=
"small"
type=
"primary"
>
点击上传
</el-button>
<div
slot=
"tip"
class=
"el-upload__tip"
>
只能上传jpg/png文件,且不超过500kb
</div>
</el-upload>
</el-form-item>
<div
class=
"other-content"
v-show=
"isShowOtherContent"
>
<div
class=
"tips"
>
注:以下信息为非必填项,您也可以根据实际情况修改
</div>
<div
class=
"basic-item-icon"
>
<!-- <span class="require">*</span> -->
<el-form-item
label=
"课程封面:"
>
<el-upload
v-model=
"formData.courseHeaderImage"
class=
"bg-uploader"
action=
"#"
:show-file-list=
"false"
:before-upload=
"beforeUploadListPic"
:disabled=
"disabled"
>
<div
class=
"bg-img-wrapper"
>
<img
v-if=
"formData.courseHeaderImage"
@
mouseover
.
stop=
"imgMouseOver=true"
:src=
"formData.courseHeaderImage"
class=
"bg-img"
>
<img
v-if=
"!formData.courseHeaderImage"
class=
"bg-img"
src=
"../../../assets/image/small.png"
>
</div>
<!-- <div class="img-delete" v-show="imgMouseOver && !disabled" @click.stop="deleteImg(1)" @mouseout.stop="imgMouseOver=false"><i class="el-icon-delete"></i></div> -->
</el-upload>
<div
class=
"limit-text"
>
尺寸:750*420,只支持jpeg格式
</div>
</el-form-item>
<p
class=
"upload-message"
v-if=
"uploadImgMessage"
>
请选择列表图片
</p>
</div>
<el-form-item
label=
"课程难度:"
>
<el-radio-group
v-model=
"formData.difficultyLevel"
>
<el-radio
:label=
"1"
>
初级
</el-radio>
<el-radio
:label=
"2"
>
中级
</el-radio>
<el-radio
:label=
"3"
>
高级
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"讲师名称:"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
v-model=
"formData.courseCustomDocterModel[0].courseDoctorName"
placeholder=
"请输入讲师名称"
style=
"width: 360px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{(formData.courseCustomDocterModel[0].courseDoctorName).replace(/\s+/g,"").length}}/25
</span>
</el-col>
</el-form-item>
<div
class=
"basic-item-icon"
>
<el-form-item
label=
"讲师头像:"
>
<el-upload
v-model=
"formData.courseCustomDocterModel[0].courseDoctorAvatarUrl"
class=
"bg-uploader"
action=
"#"
:show-file-list=
"false"
:before-upload=
"beforeUploadListPic"
:disabled=
"disabled"
>
<div
class=
"bg-img-wrapper"
>
<img
v-if=
"formData.courseCustomDocterModel[0].courseDoctorAvatarUrl"
@
mouseover
.
stop=
"imgMouseOver=true"
:src=
"formData.courseCustomDocterModel[0].courseDoctorAvatarUrl"
class=
"bg-img-doctor"
>
<img
v-if=
"!formData.courseCustomDocterModel[0].courseDoctorAvatarUrl"
class=
"bg-img-doctor"
src=
"../../../assets/image/small.png"
>
</div>
<!-- <div class="img-delete" v-show="imgMouseOver && !disabled" @click.stop="deleteImg(1)" @mouseout.stop="imgMouseOver=false"><i class="el-icon-delete"></i></div> -->
</el-upload>
<div
class=
"limit-text"
>
尺寸:88*88,只支持jpeg格式
</div>
</el-form-item>
<p
class=
"upload-message"
v-if=
"uploadImgMessage"
>
请选择列表图片
</p>
</div>
<el-form-item
label=
"所属机构:"
>
<el-col
:span=
"18"
>
<el-input
size=
"small"
v-model=
"formData.courseCustomDocterModel[0].courseDoctorHospital"
placeholder=
"请输入所属机构"
style=
"width: 360px"
maxlength=
"25"
:disabled=
"disabled"
></el-input>
<span
class=
"word-num"
>
{{(formData.courseCustomDocterModel[0].courseDoctorHospital).replace(/\s+/g,"").length}}/25
</span>
</el-col>
</el-form-item>
<el-form-item
label=
"课程简介:"
>
<el-col
:span=
"22"
>
<el-input
size=
"small"
type=
"textarea"
:autosize=
"{ minRows: 5}"
placeholder=
"请输入课程简介"
v-model=
"formData.courseIntro"
style=
"width:90%;"
></el-input>
<span
class=
"word-num"
>
{{(formData.courseIntro).replace(/\s+/g,"").length}}/200
</span>
</el-col>
</el-form-item>
</div>
<!-- 更多信息 -->
<div
class=
"separator-line"
>
<span
class=
"line-left"
></span>
<div
@
click=
"toggleOtherContent"
class=
"center"
>
<span>
展开更多信息
</span>
<img
v-show=
"isShowOtherContent"
src=
"../../../assets/image/phrase3/arrow-up.png"
/>
<img
v-show=
"!isShowOtherContent"
src=
"../../../assets/image/phrase3/arrow-down.png"
/>
</div>
<span
class=
"line-right"
></span>
</div>
</el-form>
</div>
<div
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"close"
>
取 消
</el-button>
<el-button
type=
"primary"
@
click=
"submitForm('formDataRef')"
>
确 定
</el-button>
</div>
</el-dialog>
</div>
</template>
<
script
>
import
{
doUpload
,
getFilePath
}
from
"@/utils/qiniu-util"
;
import
{
openLoading
,
closeLoading
,
getQiniuToken1
}
from
"@/utils/utils"
;
let
vm
=
null
;
export
default
{
data
()
{
let
checkCourseName
=
(
rule
,
value
,
callback
)
=>
{
// 如果有审核的信息,则直接报错
if
(
this
.
needShowAuditMsg
&&
this
.
auditMsgMap
.
name
.
desc
)
{
callback
(
new
Error
(
this
.
auditMsgMap
.
name
.
desc
));
return
;
}
if
(
!
this
.
needShowAuditMsg
&&
!
value
)
{
callback
(
new
Error
(
'请输入课程名称'
));
}
else
{
callback
();
}
};
return
{
needShowAuditMsg
:
true
,
auditMsgMap
:
{
name
:
{
desc
:
'填写的课程名称不对'
}
},
disabled
:
false
,
formData
:
{
checkStatus
:
0
,
courseCustomChapterModel
:
[{
courseCustomLectureModelList
:
[
{
contentCheck
:
''
,
id
:
0
,
name
:
''
,
nameCheck
:
''
,
resourceModel
:
{
createdId
:
0
,
createdTime
:
''
,
deleteFlag
:
0
,
filePath
:
''
,
fileType
:
0
,
formatType
:
0
,
hospitalId
:
0
,
id
:
0
,
idType
:
0
,
lectureId
:
0
,
modifiedId
:
0
,
modifiedTime
:
''
,
name
:
''
,
operateKey
:
''
,
page
:
0
,
resolutionRatio
:
''
,
size
:
0
,
status
:
0
,
totalTime
:
0
,
type
:
0
,
videoType
:
0
}
}
],
id
:
0
,
name
:
''
}],
courseCustomDocterModel
:
[
{
courseDoctorAvatarUrl
:
'https://file.yunqueyi.com/h5/images/cme/doctor-header.png'
,
courseDoctorHospital
:
''
,
courseDoctorHospitalCheck
:
''
,
courseDoctorName
:
''
,
courseDoctorNameCheck
:
''
,
id
:
0
}
],
courseHeaderImage
:
'https://file.yunqueyi.com/h5/images/cme/project-banner.png'
,
courseId
:
0
,
courseIntro
:
''
,
courseIntroCheck
:
''
,
courseName
:
''
,
courseNameCheck
:
''
,
difficultyLevel
:
1
,
shareType
:
1
,
subjectIdList
:
[
0
]
},
uploadImgMessage
:
false
,
imgMouseOver
:
false
,
rules
:
{
name
:
[
{
required
:
true
,
message
:
"请输入课程名称"
},
{
validator
:
checkCourseName
}
],
subjectId
:
[
{
required
:
true
,
message
:
"请输入课程名称"
,
trigger
:
"blur"
},
],
range
:
[
{
required
:
true
,
message
:
"请选择开放范围"
,
trigger
:
"blur"
},
],
},
labelOptions
:
[],
isShowOtherContent
:
false
,
fileList
:
[
{
name
:
'food.jpeg'
,
url
:
'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'
},
{
name
:
'food2.jpeg'
,
url
:
'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'
}
],
projectBanner
:
'https://file.yunqueyi.com/h5/images/cme/project-banner.png'
,
doctorHeader
:
'https://file.yunqueyi.com/h5/images/cme/doctor-header.png'
,
};
},
props
:
{
dialogVisible
:
{
type
:
Boolean
,
default
:
false
}
},
computed
:
{
},
created
()
{
vm
=
this
;
},
mounted
()
{
this
.
getLabelList
();
// setTimeout(() => {
// console.log(this.$refs.formDataRef);
// this.$refs['formDataRef'].validateField("name");
// }, 2000);
},
methods
:
{
close
()
{
this
.
$emit
(
'close'
);
},
// 获取学科列表
getLabelList
()
{
let
req
=
{};
this
.
GET
(
"aggregate/content/labelList"
,
req
).
then
(
res
=>
{
if
(
res
.
code
==
'000000'
)
{
// TODO
this
.
convertLabelList
(
res
.
data
);
// this.labelOptions = res.data;
}
});
},
// 将所有子分类中的“全部”去掉
convertLabelList
(
labelList
)
{
let
newLabelList
=
[];
labelList
.
forEach
(
item
=>
{
item
.
subList
=
item
.
subList
.
slice
(
1
);
})
this
.
labelOptions
=
labelList
;
},
//上传列表图片
beforeUploadListPic
(
file
)
{
let
fileLimit
=
{
width
:
230
,
height
:
172
,
size
:
0.5
,
sizeText
:
"500K"
,
key
:
"attachmentUrl"
,
more
:
"attachmentMore1"
,
show
:
"uploadImgMessage"
};
vm
.
beforeAvatarUpload
(
file
,
fileLimit
);
},
//上传图片校验
beforeAvatarUpload
(
file
,
fileLimit
)
{
const
isJPG
=
file
.
type
===
"image/jpeg"
;
const
isPNG
=
file
.
type
===
"image/png"
;
const
isLt2M
=
file
.
size
/
1024
/
1024
<
fileLimit
.
size
;
console
.
log
(
'isJPG'
,
isJPG
,
'isPNG'
,
isPNG
,
'isLt2M'
,
isLt2M
);
if
(
!
isJPG
&&
!
isPNG
)
{
vm
.
$message
.
error
(
"图片不符合规范,请根据规范上传图片"
);
return
;
}
if
(
!
isLt2M
)
{
vm
.
$message
.
error
(
"图片不符合规范,请根据规范上传图片 "
);
return
;
}
let
_img
=
new
FileReader
();
_img
.
readAsDataURL
(
file
);
_img
.
onload
=
function
(
theFile
)
{
let
image
=
new
Image
();
image
.
src
=
theFile
.
target
.
result
;
image
.
onload
=
function
()
{
let
_vm
=
this
;
if
(
false
// true ||
// _vm.width != fileLimit.width ||
// _vm.height != fileLimit.height
)
{
vm
.
$message
.
error
(
"图片不符合规范,请根据规范上传图片"
);
}
else
{
openLoading
(
vm
);
doUpload
(
vm
,
file
,
getFilePath
(
file
,
null
),
"preview4"
,
"progress1"
,
1
).
then
(
function
(
path
)
{
closeLoading
(
vm
);
console
.
log
(
path
);
if
(
fileLimit
.
show
==
"uploadImgMessage"
)
{
vm
.
uploadImgMessage
=
false
;
}
// else if (fileLimit.show == "uploadImgMessage2") {
// vm.uploadImgMessage2 = false;
// }
vm
.
formData
[
fileLimit
.
key
]
=
path
.
fullPath
;
vm
.
formData
[
fileLimit
.
more
]
=
{
attachmentName
:
path
.
name
,
attachmentExt
:
path
.
ext
,
attachmentSize
:
path
.
size
};
vm
.
$message
.
success
(
"上传成功"
);
});
}
};
};
return
isJPG
&&
isLt2M
;
},
// 删除图片
deleteImg
(
type
)
{
if
(
type
==
1
)
{
vm
.
formData
.
attachmentUrl
=
""
;
vm
.
imgMouseOver
=
false
;
}
else
{
// vm.formData.attachmentUrl2 = "";
// vm.imgMouseOver2 = false;
}
},
toggleOtherContent
()
{
this
.
isShowOtherContent
=
!
this
.
isShowOtherContent
;
},
// 上传文件相关
handleRemove
(
file
,
fileList
)
{
console
.
log
(
file
,
fileList
);
},
handlePreview
(
file
)
{
console
.
log
(
file
);
},
handleExceed
(
files
,
fileList
)
{
this
.
$message
.
warning
(
`当前限制选择 3 个文件,本次选择了
${
files
.
length
}
个文件,共选择了
${
files
.
length
+
fileList
.
length
}
个文件`
);
},
beforeRemove
(
file
,
fileList
)
{
return
this
.
$confirm
(
`确定移除
${
file
.
name
}
?`
);
},
//表单校验
submitForm
(
formName
)
{
console
.
log
(
'this.formData'
,
this
.
formData
);
this
.
needShowAuditMsg
=
false
;
let
flag
=
null
;
this
.
$refs
[
formName
].
validate
(
valid
=>
{
if
(
valid
)
{
//console.log("success");
flag
=
true
;
}
else
{
console
.
log
(
"error submit!!"
);
flag
=
false
;
}
});
return
flag
;
},
handleChange
(
value
)
{
console
.
log
(
value
);
},
}
};
</
script
>
<
style
scoped
lang=
"scss"
>
.edit-course-wrapper
{
.course-content
{
// color: red;
.basic-item-icon
{
position
:
relative
;
margin-top
:
20px
;
.require
{
position
:
absolute
;
left
:
40px
;
top
:
11px
;
color
:
#f56c6c
;
}
.upload-message
{
position
:
absolute
;
left
:
160px
;
top
:
105px
;
font-size
:
12px
;
color
:
#f56c6c
;
}
.img-delete
{
position
:
absolute
;
left
:
0px
;
top
:
0px
;
width
:
84px
;
height
:
100px
;
background
:
#000
;
opacity
:
0
.7
;
z-index
:
999
;
i
{
color
:
#fff
;
margin-top
:
39px
;
margin-left
:
0px
;
}
}
}
.word-num
{
font-size
:
12px
;
color
:
#999
;
padding-top
:
5px
;
}
.bg-uploader
{
img
{
float
:
left
;
}
.bg-img-wrapper
{
.bg-img
{
display
:
block
;
width
:
160px
;
height
:
90px
;
}
.bg-img-doctor
{
display
:
block
;
width
:
88px
;
height
:
88px
;
}
}
.bg-video
{
float
:
left
;
width
:
84px
;
height
:
100px
;
}
}
.limit-text
{
position
:
absolute
;
top
:
86px
;
left
:
0px
;
font-size
:
12px
;
color
:
#979899
;
}
.separator-line
{
width
:
100%
;
display
:
flex
;
flex-direction
:
row
;
align-content
:
center
;
align-items
:
center
;
justify-content
:
space-between
;
.center
{
cursor
:
pointer
;
width
:
130px
;
color
:
#666666
;
img
{
width
:
12px
;
}
}
.line-left
,
.line-right
{
// display: inline-block;
// width: 100%;
flex
:
1
;
border-bottom
:
1px
dashed
#E4E7ED
;
}
}
.tips
{
width
:
100%
;
height
:
32px
;
line-height
:
32px
;
padding-left
:
12px
;
background
:rgba
(
254
,
250
,
245
,
1
)
;
border-radius
:
3px
;
color
:
#E6A23C
;
}
}
}
</
style
>
src/components/education/custom-resource/reject-reason-dialog copy.vue
已删除
100644 → 0
浏览文件 @
d2298748
<
template
>
<!-- 拒绝原因 暂时不做 -->
<el-dialog
title=
"拒绝原因"
@
close=
"hideAddEditForm"
:visible
.
sync=
"addEditVisible"
:close-on-click-modal=
"false"
width=
"600px"
center
>
<el-form
ref=
"addEditForm"
:rules=
"rules"
:model=
"addEditForm"
label-width=
"120px"
>
<el-form-item
label=
"拒绝原因:"
>
<el-radio-group
v-model=
"addEditForm.doctorId"
>
<div
style=
"padding-top: 12px;"
>
<el-radio
label=
"含有政治类、医疗健康、社会事件类不实信息"
value=
"1"
></el-radio>
</div>
<div
style=
"padding-top: 16px;"
>
<el-radio
label=
"含有欺诈,色情,诱导、违法犯罪非法字符"
value=
"2"
></el-radio>
</div>
<div
style=
"padding-top: 16px;"
>
<el-radio
label=
"其他"
value=
"3"
></el-radio>
</div>
</el-radio-group>
<el-input
type=
"textarea"
v-model=
"addEditForm.desc"
maxlength=
"25"
style=
"width: 310px;margin-top: 10px;"
></el-input>
<span
class=
"word-num"
>
{{
(
addEditForm
.
desc
).
replace
(
/
\s
+/g
,
""
).
length
}}
/25
</span>
</el-form-item>
</el-form>
<span
slot=
"footer"
class=
"dialog-footer"
>
<el-button
@
click=
"hideAddEditForm"
>
取 消
</el-button>
<el-button
type=
"primary"
@
click=
"submitForm('addEditForm')"
>
确 定
</el-button>
</span>
</el-dialog>
</
template
>
<
script
>
export
default
{
data
()
{
return
{
};
},
props
:
{
dialogVisible
:
{
type
:
Boolean
,
default
:
false
}
},
computed
:
{
},
mounted
()
{
},
methods
:
{
save
()
{
this
.
dialogVisible
=
false
;
}
}
};
</
script
>
<
style
scoped
lang=
"scss"
>
</
style
>
src/components/education/custom/course-list copy 2.vue
已删除
100644 → 0
浏览文件 @
d2298748
<
template
>
<div
class=
"course-list-wrapper"
>
<ul
class=
"course-header"
>
<li
class=
"title"
>
<span
class=
"main"
>
全部课程
</span>
<span
v-show=
"courseLimitCount != -1"
class=
"sub"
>
单个项目最多只能选择
{{
courseLimitCount
}}
个课程
</span>
</li>
<li
class=
"order"
>
<div
class=
"num"
@
click=
"toggleOrder"
>
<span>
学习人数
</span>
<span
v-show=
"kind == 0"
>
<img
v-show=
"!isRise"
src=
"../../../assets/custom/icon/icon-rise.png"
alt
/>
<img
v-show=
"isRise"
src=
"../../../assets/custom/icon/icon-drop.png"
alt
/>
</span>
<span
v-show=
"kind == 1"
>
<img
v-show=
"!isRiseOrg"
src=
"../../../assets/custom/icon/icon-rise.png"
alt
/>
<img
v-show=
"isRiseOrg"
src=
"../../../assets/custom/icon/icon-drop.png"
alt
/>
</span>
</div>
<div
class=
"cart-wrapper"
>
<div
class=
"cart"
@
click=
"toggleCart"
>
<span>
已选课程
</span>
<img
src=
"../../../assets/custom/icon/icon-cart.png"
alt
/>
<div
class=
"count"
>
<span>
{{
cartList
.
length
}}
</span>
</div>
</div>
<div
v-show=
"isShowCart"
class=
"curt-position"
>
<ShoppingCart
@
close=
"toggleCart"
></ShoppingCart>
</div>
</div>
</li>
</ul>
<div
v-if=
"courseList && courseList.list && courseList.list.length"
class=
"list-wrapper"
>
<ul
class=
"list"
>
<li
class=
"course"
:class=
"
{ 'course-checked': item.checked }"
v-for="(item, index) in courseList.list"
:key="index"
@click="toggleChecked(item)"
>
<div
class=
"img"
>
<img
:src=
"item.courseImageUrl"
alt
/>
<span
class=
"level"
>
{{
item
.
typeStr
}}
</span>
</div>
<div
class=
"detail"
>
<span
class=
"title"
>
{{
item
.
courseName
|
shortName
}}
</span>
<div
class=
"chapter"
>
<span>
{{
item
.
docName
|
shortName
(
5
)
}}
</span>
<span
class=
"section-num"
>
{{
item
.
chapterSum
}}
章
{{
item
.
lectureNum
}}
节
{{
item
.
totalTime
}}
分
</span>
<span
v-if=
"item.testCount"
class=
"exam-num"
>
{{
item
.
testCount
}}
场考试
</span>
</div>
<div
class=
"cost"
>
<span
class=
"no"
>
免费
</span>
<span
class=
"num"
>
{{
item
.
joinNum
}}
人已学
</span>
</div>
</div>
<img
v-show=
"item.checked"
class=
"course-selected"
src=
"../../../assets/custom/icon/icon-selected.png"
/>
</li>
</ul>
</div>
<div
v-else
class=
"no-list"
>
<img
src=
"../../../assets/custom/icon/img-no-content.png"
alt
/>
<span
class=
"tips"
>
没有找到相关结果,请重新查询
</span>
<el-button
v-show=
"kind == 1"
type=
"primary"
icon=
"el-icon-plus"
@
click=
"showOrgCourse"
>
创建机构课程
</el-button>
</div>
<el-button
type=
"primary"
icon=
"el-icon-plus"
@
click=
"showOrgCourse"
>
创建机构课程
</el-button>
<div
class=
"page-wrapper"
>
<div
class=
"page"
>
<el-pagination
background
:current-page=
"searchParam.pageNo"
:page-sizes=
"[10, 30, 50, 100]"
:page-size=
"searchParam.pageSize"
layout=
"total, sizes, prev, pager, next, jumper"
:total=
"courseList.totalRows"
@
size-change=
"handleSizeChange"
@
current-change=
"handleCurrentChange"
></el-pagination>
</div>
</div>
<!-- 弹框提示 -->
<dialog-componet
:dialogObj=
"dialogObj"
></dialog-componet>
</div>
</
template
>
<
script
>
import
ShoppingCart
from
"@/components/education/custom/shopping-cart"
;
import
dialog
from
"@/components/education/custom/dialog"
;
import
{
mapGetters
,
mapActions
}
from
"vuex"
;
export
default
{
data
()
{
return
{
isRise
:
true
,
isRiseOrg
:
true
,
isShowCart
:
false
,
dialogObj
:
{
title
:
"课程数量已达上限"
,
visible
:
false
,
message
:
'单个项目最多只能选择3个课程'
,
tip
:
""
,
hideMsg
:
"我知道了"
}
};
},
computed
:
{
...
mapGetters
([
"cartList"
,
"courseList"
,
"searchParam"
,
"searchParamOrg"
,
"courseLimitCount"
,
"kind"
])
},
components
:
{
ShoppingCart
,
dialogComponet
:
dialog
},
methods
:
{
...
mapActions
([
"setCartList"
,
"setSearchParam"
,
"setSearchParamOrg"
]),
toggleOrder
()
{
if
(
this
.
kind
==
0
)
{
this
.
isRise
=
!
this
.
isRise
;
let
dir
=
this
.
isRise
?
1
:
2
;
this
.
searchParam
.
dir
=
dir
;
this
.
setSearchParam
(
this
.
searchParam
);
}
else
{
this
.
isRiseOrg
=
!
this
.
isRiseOrg
;
let
dir
=
this
.
isRiseOrg
?
1
:
2
;
this
.
searchParamOrg
.
dir
=
dir
;
this
.
setSearchParamOrg
(
this
.
searchParamOrg
);
}
},
toggleCart
()
{
this
.
isShowCart
=
!
this
.
isShowCart
;
},
// 选择当前分页个数
handleSizeChange
(
val
)
{
this
.
searchParam
.
pageSize
=
val
;
this
.
setSearchParam
(
this
.
searchParam
);
},
// 选择当前分页
handleCurrentChange
(
val
)
{
this
.
searchParam
.
pageNo
=
val
;
this
.
setSearchParam
(
this
.
searchParam
);
},
// 选择课程(并要处理过滤,删除等)
toggleChecked
(
item
)
{
item
.
checked
=
!
item
.
checked
;
if
(
item
.
checked
)
{
if
(
this
.
courseLimitCount
!=
-
1
&&
this
.
cartList
.
length
>=
this
.
courseLimitCount
)
{
item
.
checked
=
!
item
.
checked
;
this
.
dialogObj
.
message
=
'单个项目最多只能选择'
+
this
.
courseLimitCount
+
'个课程'
;
this
.
dialogObj
.
visible
=
true
;
return
;
}
this
.
cartList
.
unshift
(
item
);
// 倒序
}
else
{
let
delItemIndex
=
this
.
cartList
.
findIndex
(
course
=>
{
return
course
.
courseId
==
item
.
courseId
;
});
this
.
cartList
.
splice
(
delItemIndex
,
1
);
}
this
.
setCartList
(
this
.
cartList
);
this
.
$forceUpdate
();
},
// 通知父组件,打开创建资源(课程)弹框
showOrgCourse
()
{
this
.
$emit
(
'showOrgCourse'
,
'add'
);
},
}
};
</
script
>
<
style
lang=
"less"
scoped
>
.course-list-wrapper {
padding: 0 30px;
// min-width: 1180px;
min-width: 1136px;
// max-width: 1600px;
.course-header {
// position: relative;
// top: 0;
// left: 0;
display: flex;
flex-direction: row;
height: 78px;
// line-height: 78px;
align-items: center;
// margin-right: 100px;
justify-content: space-between;
.title {
.main {
margin-right: 6px;
font-size: 18px;
font-weight: 600;
color: #000;
}
.sub {
font-size: 14px;
font-weight: 400;
color: #676869;
}
}
.order {
// margin-right: 40px;
padding-right: 12px;
display: flex;
flex-direction: row;
align-items: center;
font-size: 14px;
color: #333333;
img {
position: relative;
top: 2px;
width: 14px;
height: 14px;
}
.num {
cursor: pointer;
margin-right: 30px;
}
.cart-wrapper {
position: relative;
.cart {
cursor: pointer;
position: relative;
.count {
position: absolute;
height: 20px;
top: -8px;
right: -12px;
display: inline-block;
span {
display: inline-block;
min-width: 18px;
text-align: center;
font-size: 12px;
padding: 2px;
background: red;
border-radius: 10px;
color: #fff;
}
}
}
.curt-position {
background: #fff;
position: absolute;
top: 30px;
right: 0px;
z-index: 100;
}
}
}
}
.list-wrapper {
// height: 500px;
overflow: auto;
.list {
display: flex;
flex-direction: row;
justify-content: flex-start;
flex-wrap: wrap;
overflow-y: auto;
.course {
user-select: none;
cursor: pointer;
position: relative;
top: 0;
left: 0;
z-index: 1;
display: flex;
flex-direction: row;
height: 120px;
width: 527px;
padding: 15px;
margin-bottom: 10px;
margin-right: 10px;
border-radius: 4px;
border: 1px solid rgba(228, 231, 237, 1);
&.course-checked {
&::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
border: 2px solid #449284;
border-radius: 4px;
}
}
.img {
position: relative;
top: 0;
left: 0;
width: 160px;
height: 90px;
margin-right: 15px;
img {
width: 160px;
height: 90px;
border-radius: 4px;
}
.level {
position: absolute;
top: 0;
left: 0;
width: 44px;
height: 22px;
line-height: 22px;
text-align: center;
font-size: 14px;
font-weight: 500;
color: #fff;
background: rgba(0, 0, 0, 0.5);
border-radius: 4px 0px 4px 0px;
}
}
.detail {
position: relative;
display: flex;
flex-direction: column;
flex: 1;
.title {
position: relative;
top: -3px;
left: 0;
font-size: 16px;
font-weight: 600;
color: #373839;
}
.chapter {
font-size: 14px;
font-weight: 400;
color: #999999;
.section-num::before,
.exam-num::before {
content: "";
position: relative;
top: 2.5px;
left: 0;
display: inline-block;
height: 14px;
line-height: 14px;
margin: 0 10px;
width: 1px;
background: #999999;
}
}
.cost {
position: absolute;
left: 0;
bottom: -5px;
.no {
font-size: 18px;
font-weight: 600;
margin-right: 4px;
color: #d82b2b;
}
.num {
font-size: 14px;
font-weight: 400;
color: #999999;
}
}
}
.course-selected {
position: absolute;
right: 0;
bottom: 0;
width: 44px;
height: 44px;
}
}
}
}
.page-wrapper {
// width: 1074px;
text-align: right;
.page {
// float: right;
margin: 20px 0;
}
}
.no-list {
position: relative;
top: 0;
left: 0;
z-index: 1;
display: flex;
flex-direction: column;
// padding: 30px 200px;
width: 1000px;
text-align: center;
margin-bottom: 100px;
align-items: center;
img {
width: 300px;
height: 300px;
}
.tips {
position: relative;
top: -30px;
left: 10px;
z-index: 2;
color: #999999;
}
}
}
</
style
>
src/components/education/custom/course-list copy.vue
已删除
100644 → 0
浏览文件 @
d2298748
<
template
>
<div
class=
"course-list-wrapper"
>
<ul
class=
"course-header"
>
<li
class=
"title"
>
<span
class=
"main"
>
全部课程
</span>
<span
v-show=
"courseLimitCount != -1"
class=
"sub"
>
单个项目最多只能选择
{{
courseLimitCount
}}
个课程
</span>
</li>
<li
class=
"order"
>
<div
class=
"num"
@
click=
"toggleOrder"
>
<span>
学习人数
</span>
<img
v-show=
"!isRise"
src=
"../../../assets/custom/icon/icon-rise.png"
alt
/>
<img
v-show=
"isRise"
src=
"../../../assets/custom/icon/icon-drop.png"
alt
/>
</div>
<div
class=
"cart-wrapper"
>
<div
class=
"cart"
@
click=
"toggleCart"
>
<span>
已选课程
</span>
<img
src=
"../../../assets/custom/icon/icon-cart.png"
alt
/>
<div
class=
"count"
>
<span>
{{
cartList
.
length
}}
</span>
</div>
</div>
<div
v-show=
"isShowCart"
class=
"curt-position"
>
<ShoppingCart
@
close=
"toggleCart"
></ShoppingCart>
</div>
</div>
</li>
</ul>
<div
v-if=
"courseList && courseList.list && courseList.list.length"
class=
"list-wrapper"
>
<ul
class=
"list"
>
<li
class=
"course"
:class=
"
{ 'course-checked': item.checked }"
v-for="(item, index) in courseList.list"
:key="index"
@click="toggleChecked(item)"
>
<div
class=
"img"
>
<img
:src=
"item.courseImageUrl"
alt
/>
<span
class=
"level"
>
{{
item
.
typeStr
}}
</span>
</div>
<div
class=
"detail"
>
<span
class=
"title"
>
{{
item
.
courseName
|
shortName
}}
</span>
<div
class=
"chapter"
>
<span>
{{
item
.
docName
|
shortName
(
5
)
}}
</span>
<span
class=
"section-num"
>
{{
item
.
chapterSum
}}
章
{{
item
.
lectureNum
}}
节
{{
item
.
totalTime
}}
分
</span>
<span
v-if=
"item.testCount"
class=
"exam-num"
>
{{
item
.
testCount
}}
场考试
</span>
</div>
<div
class=
"cost"
>
<span
class=
"no"
>
免费
</span>
<span
class=
"num"
>
{{
item
.
joinNum
}}
人已学
</span>
</div>
</div>
<img
v-show=
"item.checked"
class=
"course-selected"
src=
"../../../assets/custom/icon/icon-selected.png"
/>
</li>
</ul>
</div>
<div
v-else
class=
"no-list"
>
<img
src=
"../../../assets/custom/icon/img-no-content.png"
alt
/>
<span
class=
"tips"
>
没有找到相关结果,请重新查询
</span>
</div>
<div
class=
"page-wrapper"
>
<div
class=
"page"
>
<el-pagination
background
:current-page=
"searchParam.pageNo"
:page-sizes=
"[10, 30, 50, 100]"
:page-size=
"searchParam.pageSize"
layout=
"total, sizes, prev, pager, next, jumper"
:total=
"courseList.totalRows"
@
size-change=
"handleSizeChange"
@
current-change=
"handleCurrentChange"
></el-pagination>
</div>
</div>
<!-- 弹框提示 -->
<dialog-componet
:dialogObj=
"dialogObj"
></dialog-componet>
</div>
</
template
>
<
script
>
import
ShoppingCart
from
"@/components/education/custom/shopping-cart"
;
import
dialog
from
"@/components/education/custom/dialog"
;
import
{
mapGetters
,
mapActions
}
from
"vuex"
;
export
default
{
data
()
{
return
{
isRise
:
true
,
isRiseOrg
:
true
,
isShowCart
:
false
,
dialogObj
:
{
title
:
"课程数量已达上限"
,
visible
:
false
,
message
:
'单个项目最多只能选择3个课程'
,
tip
:
""
,
hideMsg
:
"我知道了"
}
};
},
computed
:
{
...
mapGetters
([
"cartList"
,
"courseList"
,
"searchParam"
,
"searchParamOrg"
,
"courseLimitCount"
,
"kind"
])
},
components
:
{
ShoppingCart
,
dialogComponet
:
dialog
},
methods
:
{
...
mapActions
([
"setCartList"
,
"setSearchParam"
,
"setSearchParamOrg"
]),
toggleOrder
()
{
this
.
isRise
=
!
this
.
isRise
;
let
dir
=
this
.
isRise
?
1
:
2
;
this
.
searchParam
.
dir
=
dir
;
this
.
setSearchParam
(
this
.
searchParam
);
},
toggleCart
()
{
this
.
isShowCart
=
!
this
.
isShowCart
;
},
// 选择当前分页个数
handleSizeChange
(
val
)
{
this
.
searchParam
.
pageSize
=
val
;
this
.
setSearchParam
(
this
.
searchParam
);
},
// 选择当前分页
handleCurrentChange
(
val
)
{
this
.
searchParam
.
pageNo
=
val
;
this
.
setSearchParam
(
this
.
searchParam
);
},
// 选择课程(并要处理过滤,删除等)
toggleChecked
(
item
)
{
item
.
checked
=
!
item
.
checked
;
if
(
item
.
checked
)
{
if
(
this
.
courseLimitCount
!=
-
1
&&
this
.
cartList
.
length
>=
this
.
courseLimitCount
)
{
item
.
checked
=
!
item
.
checked
;
this
.
dialogObj
.
message
=
'单个项目最多只能选择'
+
this
.
courseLimitCount
+
'个课程'
;
this
.
dialogObj
.
visible
=
true
;
return
;
}
this
.
cartList
.
unshift
(
item
);
// 倒序
}
else
{
let
delItemIndex
=
this
.
cartList
.
findIndex
(
course
=>
{
return
course
.
courseId
==
item
.
courseId
;
});
this
.
cartList
.
splice
(
delItemIndex
,
1
);
}
this
.
setCartList
(
this
.
cartList
);
this
.
$forceUpdate
();
}
}
};
</
script
>
<
style
lang=
"less"
scoped
>
.course-list-wrapper {
padding: 0 30px;
// min-width: 1180px;
min-width: 1136px;
// max-width: 1600px;
.course-header {
// position: relative;
// top: 0;
// left: 0;
display: flex;
flex-direction: row;
height: 78px;
// line-height: 78px;
align-items: center;
// margin-right: 100px;
justify-content: space-between;
.title {
.main {
margin-right: 6px;
font-size: 18px;
font-weight: 600;
color: #000;
}
.sub {
font-size: 14px;
font-weight: 400;
color: #676869;
}
}
.order {
// margin-right: 40px;
padding-right: 12px;
display: flex;
flex-direction: row;
align-items: center;
font-size: 14px;
color: #333333;
img {
position: relative;
top: 2px;
width: 14px;
height: 14px;
}
.num {
cursor: pointer;
margin-right: 30px;
}
.cart-wrapper {
position: relative;
.cart {
cursor: pointer;
position: relative;
.count {
position: absolute;
height: 20px;
top: -8px;
right: -12px;
display: inline-block;
span {
display: inline-block;
min-width: 18px;
text-align: center;
font-size: 12px;
padding: 2px;
background: red;
border-radius: 10px;
color: #fff;
}
}
}
.curt-position {
background: #fff;
position: absolute;
top: 30px;
right: 0px;
z-index: 100;
}
}
}
}
.list-wrapper {
// height: 500px;
overflow: auto;
.list {
display: flex;
flex-direction: row;
justify-content: flex-start;
flex-wrap: wrap;
overflow-y: auto;
.course {
user-select: none;
cursor: pointer;
position: relative;
top: 0;
left: 0;
z-index: 1;
display: flex;
flex-direction: row;
height: 120px;
width: 527px;
padding: 15px;
margin-bottom: 10px;
margin-right: 10px;
border-radius: 4px;
border: 1px solid rgba(228, 231, 237, 1);
&.course-checked {
&::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
border: 2px solid #449284;
border-radius: 4px;
}
}
.img {
position: relative;
top: 0;
left: 0;
width: 160px;
height: 90px;
margin-right: 15px;
img {
width: 160px;
height: 90px;
border-radius: 4px;
}
.level {
position: absolute;
top: 0;
left: 0;
width: 44px;
height: 22px;
line-height: 22px;
text-align: center;
font-size: 14px;
font-weight: 500;
color: #fff;
background: rgba(0, 0, 0, 0.5);
border-radius: 4px 0px 4px 0px;
}
}
.detail {
position: relative;
display: flex;
flex-direction: column;
flex: 1;
.title {
position: relative;
top: -3px;
left: 0;
font-size: 16px;
font-weight: 600;
color: #373839;
}
.chapter {
font-size: 14px;
font-weight: 400;
color: #999999;
.section-num::before,
.exam-num::before {
content: "";
position: relative;
top: 2.5px;
left: 0;
display: inline-block;
height: 14px;
line-height: 14px;
margin: 0 10px;
width: 1px;
background: #999999;
}
}
.cost {
position: absolute;
left: 0;
bottom: -5px;
.no {
font-size: 18px;
font-weight: 600;
margin-right: 4px;
color: #d82b2b;
}
.num {
font-size: 14px;
font-weight: 400;
color: #999999;
}
}
}
.course-selected {
position: absolute;
right: 0;
bottom: 0;
width: 44px;
height: 44px;
}
}
}
}
.page-wrapper {
// width: 1074px;
text-align: right;
.page {
// float: right;
margin: 20px 0;
}
}
.no-list {
position: relative;
top: 0;
left: 0;
z-index: 1;
display: flex;
flex-direction: column;
// padding: 30px 200px;
width: 1000px;
text-align: center;
margin-bottom: 100px;
align-items: center;
img {
width: 300px;
height: 300px;
}
.tips {
position: relative;
top: -30px;
left: 10px;
z-index: 2;
color: #999999;
}
}
}
</
style
>
src/components/education/custom/course-select copy 2.vue
已删除
100644 → 0
浏览文件 @
d2298748
<
template
>
<div
class=
"custom-over"
>
<!--
<div
class=
"custom-select-wrapper"
style=
"overflow:auto;"
>
<div
class=
"department-label"
style=
"width: 1200px;"
>
-->
<!--
<div
class=
"custom-select-wrapper"
>
<div
class=
"department-label"
style=
"min-width:1420px;"
>
<span
v-for=
"(item, index) in allLabelList"
:key=
"index"
class=
"item"
:class=
"
{checked: item.checked}"
@click="selectLabel(index)"
>
<span
class=
"split"
:class=
"
{acitve: item.checked}">
</span>
{{
item
.
name
}}
</span>
</div>
</div>
-->
<div
class=
"custom-select-wrapper"
>
<!-- 学科分类 -->
<div
class=
"subject-level"
>
<span
class=
"title"
>
学科分类
</span>
<span
v-for=
"(item, index) in allLabelList"
:key=
"index"
class=
"item"
:class=
"
{active: item.checked}"
@click="selectLabel(index)"
>
<!--
<span
class=
"item"
v-for=
"(item, index) in courseLevel"
:key=
"index"
@
click=
"selectLevel(index)"
>
-->
<span
class=
"name"
:class=
"
{active: item.checked}">
{{
item
.
name
}}
</span>
</span>
</div>
<!-- 课程分类 -->
<div
class=
"course-class"
>
<div
class=
"title"
>
课程分类
</div>
<div
v-if=
"subLabelList.length"
class=
"item"
@
click=
"selectSubLabel(subLabelList[0], 1)"
>
<span
class=
"name"
:class=
"
{'active': subLabelList[0].checked}">全部
</span>
</div>
<ul
class=
"check-list"
>
<li
class=
"sub-item"
:class=
"
{'active': item.checked}"
v-for="(item, index) in subLabelList.slice(1)"
:key="index"
@click="selectSubLabel(item, 2)"
>
<img
v-show=
"item.checked"
src=
"../../../assets/custom/icon/label-sel.png"
alt
/>
<img
v-show=
"!item.checked"
src=
"../../../assets/custom/icon/label-sel-no.png"
alt
/>
{{
item
.
name
}}
</li>
</ul>
<div
class=
"right"
></div>
</div>
<!-- 课程等级 -->
<div
class=
"course-level"
>
<span
class=
"title"
>
课程等级
</span>
<span
class=
"item"
v-for=
"(item, index) in courseLevel"
:key=
"index"
@
click=
"selectLevel(index)"
>
<span
class=
"name"
:class=
"
{active: item.checked}">
{{
item
.
name
}}
</span>
</span>
</div>
<div
class=
"button-wrapper"
>
<el-button
class=
"add-button"
plain
size=
"small"
@
click=
"resetCond"
>
重 置
</el-button>
<el-button
class=
"add-button"
size=
"small"
type=
"primary"
@
click=
"search"
>
查 询
</el-button>
</div>
</div>
</div>
</
template
>
<
script
>
import
{
mapGetters
,
mapActions
}
from
'vuex'
export
default
{
data
()
{
return
{
courseLevel
:
[
{
name
:
"全部"
,
value
:
0
,
checked
:
true
},
{
name
:
"初级"
,
value
:
1
,
checked
:
false
},
{
name
:
"中级"
,
value
:
2
,
checked
:
false
},
{
name
:
"高级"
,
value
:
3
,
checked
:
false
}
],
checkList
:
[
431
,
441
]
};
},
props
:
{
dataList
:
{
type
:
Array
,
default
:
()
=>
{
return
[
{
name
:
"全部"
,
checked
:
true
},
{
name
:
"内科"
,
checked
:
false
},
{
name
:
"神经科"
,
checked
:
false
},
{
name
:
"肿瘤科"
,
checked
:
false
},
{
name
:
"妇产科"
,
checked
:
false
},
{
name
:
"内科"
,
checked
:
false
},
{
name
:
"神经科"
,
checked
:
false
},
{
name
:
"肿瘤科"
,
checked
:
false
},
{
name
:
"妇产科"
,
checked
:
false
},
{
name
:
"内科"
,
checked
:
false
},
{
name
:
"神经科"
,
checked
:
false
},
{
name
:
"肿瘤科"
,
checked
:
false
},
{
name
:
"妇产科"
,
checked
:
false
}
];
}
}
},
computed
:
{
...
mapGetters
([
'searchParam'
,
'allLabelList'
,
'subLabelList'
])
},
components
:
{},
methods
:
{
...
mapActions
([
'setSubLabelList'
,
'setSearchParam'
]),
// 选择一级
selectLabel
(
index
)
{
this
.
allLabelList
.
forEach
(
element
=>
{
element
.
checked
=
false
;
});
this
.
allLabelList
[
index
].
checked
=
true
;
let
subLabelList
=
this
.
allLabelList
[
index
].
subList
;
this
.
setSubLabelList
(
subLabelList
);
},
// 选择二级
selectSubLabel
(
item
,
type
)
{
item
.
checked
=
!
item
.
checked
;
console
.
log
(
'selectSubLabel'
,
item
);
// 如果被选中
if
(
item
.
checked
)
{
// 是全部按钮 第一个全部:parentid-0
if
(
type
==
1
)
{
let
labelArr
=
item
.
id
.
split
(
'-'
),
labelType
=
labelArr
[
0
],
labelIndex
=
labelArr
[
1
]
-
0
;
labelArr
=
item
.
id
.
split
(
'-'
);
if
(
labelType
==
'parentid'
)
{
// 将所有子项目选中
this
.
allLabelList
[
0
].
subList
.
forEach
(
(
item
,
index
)
=>
{
if
(
index
!=
0
)
{
// 第一个不用
item
.
checked
=
true
;
}
})
// 将其它所有全部置为选中
this
.
allLabelList
.
forEach
(
(
item
,
index
)
=>
{
index
!=
0
&&
(
item
.
subList
[
0
].
checked
=
true
);
})
}
else
{
this
.
allLabelList
[
labelIndex
+
1
].
subList
.
forEach
(
(
item
,
index
)
=>
{
if
(
index
!=
0
)
{
// 第一个不用
item
.
checked
=
true
;
}
})
}
}
// 末被选中
}
else
{
// 是全部按钮 第一个全部:parentid-0
if
(
type
==
1
)
{
let
labelArr
=
item
.
id
.
split
(
'-'
),
labelType
=
labelArr
[
0
],
labelIndex
=
labelArr
[
1
]
-
0
;
labelArr
=
item
.
id
.
split
(
'-'
);
if
(
labelType
==
'parentid'
)
{
// 将所有子项目选中
this
.
allLabelList
[
0
].
subList
.
forEach
(
(
item
,
index
)
=>
{
if
(
index
!=
0
)
{
// 第一个不用
item
.
checked
=
false
;
}
})
// 将其它所有全部置为选中
this
.
allLabelList
.
forEach
(
(
item
,
index
)
=>
{
index
!=
0
&&
(
item
.
subList
[
0
].
checked
=
false
);
})
}
else
{
this
.
allLabelList
[
labelIndex
+
1
].
subList
.
forEach
(
(
item
,
index
)
=>
{
if
(
index
!=
0
)
{
// 第一个不用
item
.
checked
=
false
;
}
})
}
}
}
// 无论哪种操作,都要重置各个“全部”按钮
this
.
allLabelList
.
forEach
(
(
parent
,
index
)
=>
{
let
needhecked
=
true
,
subList
=
parent
.
subList
;
for
(
let
i
=
1
;
i
<
subList
.
length
;
i
++
)
{
if
(
!
subList
[
i
].
checked
)
{
needhecked
=
false
;
break
;
}
}
this
.
allLabelList
[
index
].
subList
[
0
].
checked
=
needhecked
;
})
this
.
$forceUpdate
();
},
// 选中等级
selectLevel
(
index
)
{
this
.
courseLevel
.
forEach
(
element
=>
{
element
.
checked
=
false
;
});
this
.
courseLevel
[
index
].
checked
=
true
;
},
// 重置按钮
resetCond
()
{
this
.
allLabelList
.
forEach
((
item
,
index
)
=>
{
item
.
checked
=
false
;
item
.
subList
.
forEach
((
sub
,
subIndex
)
=>
{
sub
.
checked
=
true
;
});
});
this
.
setSubLabelList
(
this
.
allLabelList
[
0
].
subList
);
this
.
allLabelList
[
0
].
checked
=
true
;
this
.
selectLevel
(
0
);
},
search
()
{
let
allSelectedLabel
=
[];
this
.
allLabelList
[
0
].
subList
.
forEach
(
(
item
,
index
)
=>
{
index
&&
item
.
checked
&&
allSelectedLabel
.
push
(
item
.
id
);
})
this
.
searchParam
.
labelIdList
=
allSelectedLabel
;
this
.
courseLevel
.
forEach
(
item
=>
{
if
(
item
.
checked
)
{
this
.
searchParam
.
grade
=
item
.
value
;
}
})
this
.
searchParam
.
pageNo
=
1
;
this
.
setSearchParam
(
this
.
searchParam
);
console
.
log
(
allSelectedLabel
);
}
}
};
</
script
>
<
style
lang=
"less"
scoped
>
.custom-select-wrapper {
// width: 1090px;
user-select: none;
.department-label {
display: flex;
flex-direction: row;
height: 48px;
line-height: 48px;
border-bottom: 2px solid #449284;
border-radius: 6px 6px 0px 0px;
.item {
cursor: pointer;
position: relative;
z-index: 1;
display: inline-block;
padding: 0 22px;
font-size: 16px;
color: #666666;
// &::after {
// position: absolute;
// content: "";
// top: 14px;
// left: 0px;
// height: 20px;
// border-left: 1px solid #c7c8c9;
// }
&.checked {
color: #fff;
z-index: 3;
background: #449284;
}
&:first-child {
border-radius: 6px 0px 0px 0px;
}
}
.split {
flex-shrink: 0;
position: absolute;
top: 14px;
left: 0px;
z-index: 2;
display: inline-block;
height: 20px;
// width: 1px;
// background: #c7c8c9;
border-left: 1px solid #c7c8c9;
}
.item:nth-child(1) > .split,
.item.checked + .item > .split,
.split.acitve {
display: none;
}
}
}
.subject-level {
display: flex;
flex-direction: row;
box-sizing: content-box;
height: 56px;
line-height: 56px;
padding-left: 20px;
// margin: 16px 0 16px 20px;
border-bottom: 1px dotted #e4e7ed;
.title {
display: inline-block;
padding: 0 10px;
color: #999999;
}
.item {
cursor: pointer;
display: inline-block;
margin: 0 5px;
color: #333333;
margin-bottom: -1px;
&.active {
border-bottom: 2px solid #449284;
}
.name {
height: 26px;
line-height: 26px;
display: inline-block;
padding: 0px 10px;
border-radius: 2px;
&.active {
color: #449284;
font-weight: 700;
// background: #449284;
}
}
}
}
.course-level {
display: flex;
flex-direction: row;
box-sizing: content-box;
height: 56px;
line-height: 56px;
padding-left: 20px;
// margin: 16px 0 16px 20px;
border-bottom: 1px dotted #e4e7ed;
.title {
display: inline-block;
padding: 0 10px;
color: #999999;
}
.item {
cursor: pointer;
display: inline-block;
margin: 0 5px;
color: #333333;
.name {
height: 26px;
line-height: 26px;
display: inline-block;
padding: 0px 10px;
border-radius: 2px;
&.active {
color: #fff;
background: #449284;
}
}
}
}
.course-class {
display: flex;
flex-direction: row;
box-sizing: content-box;
padding: 10px 20px;
// padding-left: 20px;
// margin: 16px 0 16px 20px;
border-bottom: 1px dashed #e4e7ed;
.title {
height: 56px;
line-height: 56px;
display: inline-block;
padding: 0 10px;
color: #999999;
}
.item {
cursor: pointer;
height: 56px;
line-height: 56px;
display: inline-block;
margin: 0 5px;
color: #333333;
.name {
height: 26px;
line-height: 26px;
display: inline-block;
padding: 0px 10px;
border-radius: 2px;
margin-right: 16px;
&.active {
color: #fff;
background: #449284;
}
}
}
.check-list {
display: flex;
flex-direction: row;
flex-wrap: wrap;
margin-top: 14px;
margin-right: 40px;
flex: 1;
.sub-item {
cursor: pointer;
display: flex;
flex-direction: row;
align-items: center;
height: 30px;
line-height: 30px;
font-size: 14px;
color: #333333;
margin-right: 30px;
img {
width: 16px;
height: 16px;
margin-right: 5px;
}
&.active {
color: #449284;
}
}
}
.el-checkbox {
height: 30px;
line-height: 30px;
}
}
.button-wrapper {
display: flex;
flex-direction: row;
justify-content: flex-end;
margin-top: 20px;
// margin-right: 30px;
padding-right: 30px;
min-width: 1125px;
}
</
style
>
src/components/education/custom/course-select copy 3.vue
已删除
100644 → 0
浏览文件 @
d2298748
<
template
>
<div
class=
"custom-over"
>
<div
class=
"custom-select-wrapper"
>
<!-- 学科分类 -->
<div
class=
"subject-level"
>
<span
class=
"title"
>
学科分类
</span>
<span
v-for=
"(item, index) in allLabelList"
:key=
"index"
class=
"item"
:class=
"
{active: item.checked}"
@click="selectLabel(index)"
>
<span
class=
"name"
:class=
"
{active: item.checked}">
{{
item
.
name
}}
</span>
</span>
</div>
<!-- 课程分类 -->
<div
class=
"course-class"
>
<div
class=
"title"
>
课程分类
</div>
<div
v-if=
"subLabelList.length"
class=
"item"
@
click=
"selectSubLabel(subLabelList[0], 1)"
>
<span
class=
"name"
:class=
"
{'active': subLabelList[0].checked}">全部
</span>
</div>
<ul
class=
"check-list"
>
<li
class=
"sub-item"
:class=
"
{'active': item.checked}"
v-for="(item, index) in subLabelList.slice(1)"
:key="index"
@click="selectSubLabel(item, 2)"
>
<img
v-show=
"item.checked"
src=
"../../../assets/custom/icon/label-sel.png"
alt
/>
<img
v-show=
"!item.checked"
src=
"../../../assets/custom/icon/label-sel-no.png"
alt
/>
{{
item
.
name
}}
</li>
</ul>
<div
class=
"right"
></div>
</div>
<!-- 课程等级 -->
<div
class=
"course-level"
>
<span
class=
"title"
>
课程等级
</span>
<span
class=
"item"
v-for=
"(item, index) in courseLevel"
:key=
"index"
@
click=
"selectLevel(index)"
>
<span
class=
"name"
:class=
"
{active: item.checked}">
{{
item
.
name
}}
</span>
</span>
</div>
<div
class=
"button-wrapper"
>
<el-button
class=
"add-button"
plain
size=
"small"
@
click=
"resetCond"
>
重 置
</el-button>
<el-button
class=
"add-button"
size=
"small"
type=
"primary"
@
click=
"search"
>
查 询
</el-button>
</div>
</div>
</div>
</
template
>
<
script
>
import
{
mapGetters
,
mapActions
}
from
'vuex'
export
default
{
data
()
{
return
{
courseLevel
:
[
{
name
:
"全部"
,
value
:
0
,
checked
:
true
},
{
name
:
"初级"
,
value
:
1
,
checked
:
false
},
{
name
:
"中级"
,
value
:
2
,
checked
:
false
},
{
name
:
"高级"
,
value
:
3
,
checked
:
false
}
],
checkList
:
[
431
,
441
]
};
},
props
:
{
dataList
:
{
type
:
Array
,
default
:
()
=>
{
return
[
{
name
:
"全部"
,
checked
:
true
},
{
name
:
"内科"
,
checked
:
false
},
{
name
:
"神经科"
,
checked
:
false
},
{
name
:
"肿瘤科"
,
checked
:
false
},
{
name
:
"妇产科"
,
checked
:
false
},
{
name
:
"内科"
,
checked
:
false
},
{
name
:
"神经科"
,
checked
:
false
},
{
name
:
"肿瘤科"
,
checked
:
false
},
{
name
:
"妇产科"
,
checked
:
false
},
{
name
:
"内科"
,
checked
:
false
},
{
name
:
"神经科"
,
checked
:
false
},
{
name
:
"肿瘤科"
,
checked
:
false
},
{
name
:
"妇产科"
,
checked
:
false
}
];
}
}
},
computed
:
{
...
mapGetters
([
'searchParam'
,
'allLabelList'
,
'subLabelList'
])
},
components
:
{},
methods
:
{
...
mapActions
([
'setSubLabelList'
,
'setSearchParam'
]),
// 选择一级
selectLabel
(
index
)
{
this
.
allLabelList
.
forEach
(
element
=>
{
element
.
checked
=
false
;
});
this
.
allLabelList
[
index
].
checked
=
true
;
let
subLabelList
=
this
.
allLabelList
[
index
].
subList
;
this
.
setSubLabelList
(
subLabelList
);
},
// 选择二级
selectSubLabel
(
item
,
type
)
{
item
.
checked
=
!
item
.
checked
;
console
.
log
(
'selectSubLabel'
,
item
);
// 如果被选中
if
(
item
.
checked
)
{
// 是全部按钮 第一个全部:parentid-0
if
(
type
==
1
)
{
let
labelArr
=
item
.
id
.
split
(
'-'
),
labelType
=
labelArr
[
0
],
labelIndex
=
labelArr
[
1
]
-
0
;
labelArr
=
item
.
id
.
split
(
'-'
);
if
(
labelType
==
'parentid'
)
{
// 将所有子项目选中
this
.
allLabelList
[
0
].
subList
.
forEach
(
(
item
,
index
)
=>
{
if
(
index
!=
0
)
{
// 第一个不用
item
.
checked
=
true
;
}
})
// 将其它所有全部置为选中
this
.
allLabelList
.
forEach
(
(
item
,
index
)
=>
{
index
!=
0
&&
(
item
.
subList
[
0
].
checked
=
true
);
})
}
else
{
this
.
allLabelList
[
labelIndex
+
1
].
subList
.
forEach
(
(
item
,
index
)
=>
{
if
(
index
!=
0
)
{
// 第一个不用
item
.
checked
=
true
;
}
})
}
}
// 末被选中
}
else
{
// 是全部按钮 第一个全部:parentid-0
if
(
type
==
1
)
{
let
labelArr
=
item
.
id
.
split
(
'-'
),
labelType
=
labelArr
[
0
],
labelIndex
=
labelArr
[
1
]
-
0
;
labelArr
=
item
.
id
.
split
(
'-'
);
if
(
labelType
==
'parentid'
)
{
// 将所有子项目选中
this
.
allLabelList
[
0
].
subList
.
forEach
(
(
item
,
index
)
=>
{
if
(
index
!=
0
)
{
// 第一个不用
item
.
checked
=
false
;
}
})
// 将其它所有全部置为选中
this
.
allLabelList
.
forEach
(
(
item
,
index
)
=>
{
index
!=
0
&&
(
item
.
subList
[
0
].
checked
=
false
);
})
}
else
{
this
.
allLabelList
[
labelIndex
+
1
].
subList
.
forEach
(
(
item
,
index
)
=>
{
if
(
index
!=
0
)
{
// 第一个不用
item
.
checked
=
false
;
}
})
}
}
}
// 无论哪种操作,都要重置各个“全部”按钮
this
.
allLabelList
.
forEach
(
(
parent
,
index
)
=>
{
let
needhecked
=
true
,
subList
=
parent
.
subList
;
for
(
let
i
=
1
;
i
<
subList
.
length
;
i
++
)
{
if
(
!
subList
[
i
].
checked
)
{
needhecked
=
false
;
break
;
}
}
this
.
allLabelList
[
index
].
subList
[
0
].
checked
=
needhecked
;
})
this
.
$forceUpdate
();
},
// 选中等级
selectLevel
(
index
)
{
this
.
courseLevel
.
forEach
(
element
=>
{
element
.
checked
=
false
;
});
this
.
courseLevel
[
index
].
checked
=
true
;
},
// 重置按钮
resetCond
()
{
this
.
allLabelList
.
forEach
((
item
,
index
)
=>
{
item
.
checked
=
false
;
item
.
subList
.
forEach
((
sub
,
subIndex
)
=>
{
sub
.
checked
=
true
;
});
});
this
.
setSubLabelList
(
this
.
allLabelList
[
0
].
subList
);
this
.
allLabelList
[
0
].
checked
=
true
;
this
.
selectLevel
(
0
);
},
search
()
{
let
allSelectedLabel
=
[];
this
.
allLabelList
[
0
].
subList
.
forEach
(
(
item
,
index
)
=>
{
index
&&
item
.
checked
&&
allSelectedLabel
.
push
(
item
.
id
);
})
this
.
searchParam
.
labelIdList
=
allSelectedLabel
;
this
.
courseLevel
.
forEach
(
item
=>
{
if
(
item
.
checked
)
{
this
.
searchParam
.
grade
=
item
.
value
;
}
})
this
.
searchParam
.
pageNo
=
1
;
this
.
setSearchParam
(
this
.
searchParam
);
console
.
log
(
allSelectedLabel
);
}
}
};
</
script
>
<
style
lang=
"less"
scoped
>
.custom-select-wrapper {
// width: 1090px;
user-select: none;
.department-label {
display: flex;
flex-direction: row;
height: 48px;
line-height: 48px;
border-bottom: 2px solid #449284;
border-radius: 6px 6px 0px 0px;
.item {
cursor: pointer;
position: relative;
z-index: 1;
display: inline-block;
padding: 0 22px;
font-size: 16px;
color: #666666;
// &::after {
// position: absolute;
// content: "";
// top: 14px;
// left: 0px;
// height: 20px;
// border-left: 1px solid #c7c8c9;
// }
&.checked {
color: #fff;
z-index: 3;
background: #449284;
}
&:first-child {
border-radius: 6px 0px 0px 0px;
}
}
.split {
flex-shrink: 0;
position: absolute;
top: 14px;
left: 0px;
z-index: 2;
display: inline-block;
height: 20px;
// width: 1px;
// background: #c7c8c9;
border-left: 1px solid #c7c8c9;
}
.item:nth-child(1) > .split,
.item.checked + .item > .split,
.split.acitve {
display: none;
}
}
}
.subject-level {
display: flex;
flex-direction: row;
box-sizing: content-box;
height: 56px;
line-height: 56px;
padding-left: 20px;
// margin: 16px 0 16px 20px;
border-bottom: 1px dotted #e4e7ed;
.title {
display: inline-block;
padding: 0 10px;
color: #999999;
}
.item {
cursor: pointer;
display: inline-block;
margin: 0 5px;
color: #333333;
margin-bottom: -1px;
&.active {
border-bottom: 2px solid #449284;
}
.name {
height: 26px;
line-height: 26px;
display: inline-block;
padding: 0px 10px;
border-radius: 2px;
&.active {
color: #449284;
font-weight: 700;
// background: #449284;
}
}
}
}
.course-level {
display: flex;
flex-direction: row;
box-sizing: content-box;
height: 56px;
line-height: 56px;
padding-left: 20px;
// margin: 16px 0 16px 20px;
border-bottom: 1px dotted #e4e7ed;
.title {
display: inline-block;
padding: 0 10px;
color: #999999;
}
.item {
cursor: pointer;
display: inline-block;
margin: 0 5px;
color: #333333;
.name {
height: 26px;
line-height: 26px;
display: inline-block;
padding: 0px 10px;
border-radius: 2px;
&.active {
color: #fff;
background: #449284;
}
}
}
}
.course-class {
display: flex;
flex-direction: row;
box-sizing: content-box;
padding: 10px 20px;
// padding-left: 20px;
// margin: 16px 0 16px 20px;
border-bottom: 1px dashed #e4e7ed;
.title {
height: 56px;
line-height: 56px;
display: inline-block;
padding: 0 10px;
color: #999999;
}
.item {
cursor: pointer;
height: 56px;
line-height: 56px;
display: inline-block;
margin: 0 5px;
color: #333333;
.name {
height: 26px;
line-height: 26px;
display: inline-block;
padding: 0px 10px;
border-radius: 2px;
margin-right: 16px;
&.active {
color: #fff;
background: #449284;
}
}
}
.check-list {
display: flex;
flex-direction: row;
flex-wrap: wrap;
margin-top: 14px;
margin-right: 40px;
flex: 1;
.sub-item {
cursor: pointer;
display: flex;
flex-direction: row;
align-items: center;
height: 30px;
line-height: 30px;
font-size: 14px;
color: #333333;
margin-right: 30px;
img {
width: 16px;
height: 16px;
margin-right: 5px;
}
&.active {
color: #449284;
}
}
}
.el-checkbox {
height: 30px;
line-height: 30px;
}
}
.button-wrapper {
display: flex;
flex-direction: row;
justify-content: flex-end;
margin-top: 20px;
// margin-right: 30px;
padding-right: 30px;
min-width: 1125px;
}
</
style
>
src/components/education/custom/course-select copy.vue
已删除
100644 → 0
浏览文件 @
d2298748
<
template
>
<div
class=
"custom-over"
>
<!--
<div
class=
"custom-select-wrapper"
style=
"overflow:auto;"
>
<div
class=
"department-label"
style=
"width: 1200px;"
>
-->
<div
class=
"custom-select-wrapper"
>
<div
class=
"department-label"
style=
"min-width:1420px;"
>
<span
v-for=
"(item, index) in allLabelList"
:key=
"index"
class=
"item"
:class=
"
{checked: item.checked}"
@click="selectLabel(index)"
>
<span
class=
"split"
:class=
"
{acitve: item.checked}">
</span>
{{
item
.
name
}}
</span>
</div>
</div>
<div
class=
"custom-select-wrapper"
>
<!-- 课程分类 -->
<div
class=
"course-class"
>
<div
class=
"title"
>
课程分类
</div>
<div
v-if=
"subLabelList.length"
class=
"item"
@
click=
"selectSubLabel(subLabelList[0], 1)"
>
<span
class=
"name"
:class=
"
{'active': subLabelList[0].checked}">全部
</span>
</div>
<ul
class=
"check-list"
>
<li
class=
"sub-item"
:class=
"
{'active': item.checked}"
v-for="(item, index) in subLabelList.slice(1)"
:key="index"
@click="selectSubLabel(item, 2)"
>
<img
v-show=
"item.checked"
src=
"../../../assets/custom/icon/label-sel.png"
alt
/>
<img
v-show=
"!item.checked"
src=
"../../../assets/custom/icon/label-sel-no.png"
alt
/>
{{
item
.
name
}}
</li>
</ul>
<div
class=
"right"
></div>
</div>
<!-- 课程等级 -->
<div
class=
"course-level"
>
<span
class=
"title"
>
课程等级
</span>
<span
class=
"item"
v-for=
"(item, index) in courseLevel"
:key=
"index"
@
click=
"selectLevel(index)"
>
<span
class=
"name"
:class=
"
{active: item.checked}">
{{
item
.
name
}}
</span>
</span>
</div>
<div
class=
"button-wrapper"
>
<el-button
class=
"add-button"
plain
size=
"small"
@
click=
"resetCond"
>
重 置
</el-button>
<el-button
class=
"add-button"
size=
"small"
type=
"primary"
@
click=
"search"
>
查 询
</el-button>
</div>
</div>
</div>
</
template
>
<
script
>
import
{
mapGetters
,
mapActions
}
from
'vuex'
export
default
{
data
()
{
return
{
courseLevel
:
[
{
name
:
"全部"
,
value
:
0
,
checked
:
true
},
{
name
:
"初级"
,
value
:
1
,
checked
:
false
},
{
name
:
"中级"
,
value
:
2
,
checked
:
false
},
{
name
:
"高级"
,
value
:
3
,
checked
:
false
}
],
checkList
:
[
431
,
441
]
};
},
props
:
{
dataList
:
{
type
:
Array
,
default
:
()
=>
{
return
[
{
name
:
"全部"
,
checked
:
true
},
{
name
:
"内科"
,
checked
:
false
},
{
name
:
"神经科"
,
checked
:
false
},
{
name
:
"肿瘤科"
,
checked
:
false
},
{
name
:
"妇产科"
,
checked
:
false
},
{
name
:
"内科"
,
checked
:
false
},
{
name
:
"神经科"
,
checked
:
false
},
{
name
:
"肿瘤科"
,
checked
:
false
},
{
name
:
"妇产科"
,
checked
:
false
},
{
name
:
"内科"
,
checked
:
false
},
{
name
:
"神经科"
,
checked
:
false
},
{
name
:
"肿瘤科"
,
checked
:
false
},
{
name
:
"妇产科"
,
checked
:
false
}
];
}
}
},
computed
:
{
...
mapGetters
([
'searchParam'
,
'allLabelList'
,
'subLabelList'
])
},
components
:
{},
methods
:
{
...
mapActions
([
'setSubLabelList'
,
'setSearchParam'
]),
// 选择一级
selectLabel
(
index
)
{
this
.
allLabelList
.
forEach
(
element
=>
{
element
.
checked
=
false
;
});
this
.
allLabelList
[
index
].
checked
=
true
;
let
subLabelList
=
this
.
allLabelList
[
index
].
subList
;
this
.
setSubLabelList
(
subLabelList
);
},
// 选择二级
selectSubLabel
(
item
,
type
)
{
item
.
checked
=
!
item
.
checked
;
console
.
log
(
'selectSubLabel'
,
item
);
// 如果被选中
if
(
item
.
checked
)
{
// 是全部按钮 第一个全部:parentid-0
if
(
type
==
1
)
{
let
labelArr
=
item
.
id
.
split
(
'-'
),
labelType
=
labelArr
[
0
],
labelIndex
=
labelArr
[
1
]
-
0
;
labelArr
=
item
.
id
.
split
(
'-'
);
if
(
labelType
==
'parentid'
)
{
// 将所有子项目选中
this
.
allLabelList
[
0
].
subList
.
forEach
(
(
item
,
index
)
=>
{
if
(
index
!=
0
)
{
// 第一个不用
item
.
checked
=
true
;
}
})
// 将其它所有全部置为选中
this
.
allLabelList
.
forEach
(
(
item
,
index
)
=>
{
index
!=
0
&&
(
item
.
subList
[
0
].
checked
=
true
);
})
}
else
{
this
.
allLabelList
[
labelIndex
+
1
].
subList
.
forEach
(
(
item
,
index
)
=>
{
if
(
index
!=
0
)
{
// 第一个不用
item
.
checked
=
true
;
}
})
}
}
// 末被选中
}
else
{
// 是全部按钮 第一个全部:parentid-0
if
(
type
==
1
)
{
let
labelArr
=
item
.
id
.
split
(
'-'
),
labelType
=
labelArr
[
0
],
labelIndex
=
labelArr
[
1
]
-
0
;
labelArr
=
item
.
id
.
split
(
'-'
);
if
(
labelType
==
'parentid'
)
{
// 将所有子项目选中
this
.
allLabelList
[
0
].
subList
.
forEach
(
(
item
,
index
)
=>
{
if
(
index
!=
0
)
{
// 第一个不用
item
.
checked
=
false
;
}
})
// 将其它所有全部置为选中
this
.
allLabelList
.
forEach
(
(
item
,
index
)
=>
{
index
!=
0
&&
(
item
.
subList
[
0
].
checked
=
false
);
})
}
else
{
this
.
allLabelList
[
labelIndex
+
1
].
subList
.
forEach
(
(
item
,
index
)
=>
{
if
(
index
!=
0
)
{
// 第一个不用
item
.
checked
=
false
;
}
})
}
}
}
// 无论哪种操作,都要重置各个“全部”按钮
this
.
allLabelList
.
forEach
(
(
parent
,
index
)
=>
{
let
needhecked
=
true
,
subList
=
parent
.
subList
;
for
(
let
i
=
1
;
i
<
subList
.
length
;
i
++
)
{
if
(
!
subList
[
i
].
checked
)
{
needhecked
=
false
;
break
;
}
}
this
.
allLabelList
[
index
].
subList
[
0
].
checked
=
needhecked
;
})
this
.
$forceUpdate
();
},
// 选中等级
selectLevel
(
index
)
{
this
.
courseLevel
.
forEach
(
element
=>
{
element
.
checked
=
false
;
});
this
.
courseLevel
[
index
].
checked
=
true
;
},
// 重置按钮
resetCond
()
{
this
.
allLabelList
.
forEach
((
item
,
index
)
=>
{
item
.
checked
=
false
;
item
.
subList
.
forEach
((
sub
,
subIndex
)
=>
{
sub
.
checked
=
true
;
});
});
this
.
setSubLabelList
(
this
.
allLabelList
[
0
].
subList
);
this
.
allLabelList
[
0
].
checked
=
true
;
this
.
selectLevel
(
0
);
},
search
()
{
let
allSelectedLabel
=
[];
this
.
allLabelList
[
0
].
subList
.
forEach
(
(
item
,
index
)
=>
{
index
&&
item
.
checked
&&
allSelectedLabel
.
push
(
item
.
id
);
})
this
.
searchParam
.
labelIdList
=
allSelectedLabel
;
this
.
courseLevel
.
forEach
(
item
=>
{
if
(
item
.
checked
)
{
this
.
searchParam
.
grade
=
item
.
value
;
}
})
this
.
searchParam
.
pageNo
=
1
;
this
.
setSearchParam
(
this
.
searchParam
);
console
.
log
(
allSelectedLabel
);
}
}
};
</
script
>
<
style
lang=
"less"
scoped
>
.custom-select-wrapper {
// width: 1090px;
user-select: none;
.department-label {
display: flex;
flex-direction: row;
height: 48px;
line-height: 48px;
border-bottom: 2px solid #449284;
border-radius: 6px 6px 0px 0px;
.item {
cursor: pointer;
position: relative;
z-index: 1;
display: inline-block;
padding: 0 22px;
font-size: 16px;
color: #666666;
// &::after {
// position: absolute;
// content: "";
// top: 14px;
// left: 0px;
// height: 20px;
// border-left: 1px solid #c7c8c9;
// }
&.checked {
color: #fff;
z-index: 3;
background: #449284;
}
&:first-child {
border-radius: 6px 0px 0px 0px;
}
}
.split {
flex-shrink: 0;
position: absolute;
top: 14px;
left: 0px;
z-index: 2;
display: inline-block;
height: 20px;
// width: 1px;
// background: #c7c8c9;
border-left: 1px solid #c7c8c9;
}
.item:nth-child(1) > .split,
.item.checked + .item > .split,
.split.acitve {
display: none;
}
}
}
.course-level {
display: flex;
flex-direction: row;
box-sizing: content-box;
height: 56px;
line-height: 56px;
padding-left: 20px;
// margin: 16px 0 16px 20px;
border-bottom: 1px dotted #e4e7ed;
.title {
display: inline-block;
padding: 0 10px;
color: #999999;
}
.item {
cursor: pointer;
display: inline-block;
margin: 0 5px;
color: #333333;
.name {
height: 26px;
line-height: 26px;
display: inline-block;
padding: 0px 10px;
border-radius: 2px;
&.active {
color: #fff;
background: #449284;
}
}
}
}
.course-class {
display: flex;
flex-direction: row;
box-sizing: content-box;
padding: 10px 20px;
// padding-left: 20px;
// margin: 16px 0 16px 20px;
border-bottom: 1px dashed #e4e7ed;
.title {
height: 56px;
line-height: 56px;
display: inline-block;
padding: 0 10px;
color: #999999;
}
.item {
cursor: pointer;
height: 56px;
line-height: 56px;
display: inline-block;
margin: 0 5px;
color: #333333;
.name {
height: 26px;
line-height: 26px;
display: inline-block;
padding: 0px 10px;
border-radius: 2px;
margin-right: 16px;
&.active {
color: #fff;
background: #449284;
}
}
}
.check-list {
display: flex;
flex-direction: row;
flex-wrap: wrap;
margin-top: 14px;
margin-right: 40px;
flex: 1;
.sub-item {
cursor: pointer;
display: flex;
flex-direction: row;
align-items: center;
height: 30px;
line-height: 30px;
font-size: 14px;
color: #333333;
margin-right: 30px;
img {
width: 16px;
height: 16px;
margin-right: 5px;
}
&.active {
color: #449284;
}
}
}
.el-checkbox {
height: 30px;
line-height: 30px;
}
}
.button-wrapper {
display: flex;
flex-direction: row;
justify-content: flex-end;
margin-top: 20px;
// margin-right: 30px;
padding-right: 30px;
min-width: 1125px;
}
</
style
>
写
预览
Markdown
格式
0%
请重试
or
附加一个文件
附加文件
取消
您添加了
0
人
到此讨论。请谨慎行事。
先完成此消息的编辑!
取消
想要评论请
注册
或
登录