courseInfo.vue 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. <template>
  2. <a-form
  3. :model="formState"
  4. :rules="rules"
  5. ref="formRef"
  6. layout="horizontal"
  7. :label-col="{ span: 3 }"
  8. :wrapper-col="{ span: 21 }"
  9. >
  10. <a-form-item label="教室名称" name="courseName">
  11. <a-input v-model:value="formState.courseName" placeholder="输入教室名称" />
  12. </a-form-item>
  13. <a-form-item label="授课教师" name="teacherId">
  14. <a-select
  15. v-model:value="formState.teacherId"
  16. :fieldNames="{ label: 'name', value: 'id' }"
  17. :options="teacherOptions"
  18. placeholder="请选择授课教师"
  19. />
  20. </a-form-item>
  21. <a-form-item label="课程分类" name="courseType">
  22. <a-select v-model:value="formState.courseType" :options="courseClass" placeholder="选择课程分类" />
  23. </a-form-item>
  24. <a-form-item label="上传封面" name="coverImageId">
  25. <coverUpload
  26. :coverImageId="formState.coverImageId"
  27. :imageUrl="coverImagePath"
  28. @handleChangeCover="handleChangeCover"
  29. @handleRemoveCover="handleRemoveCover"
  30. ></coverUpload>
  31. </a-form-item>
  32. <!-- <a-form-item label="院系" name="collegeTwoId">
  33. <a-select
  34. v-model:value="formState.collegeTwoId"
  35. :fieldNames="{ label: 'name', value: 'id' }"
  36. :options="collegeMajorOptions"
  37. placeholder="请选择专业"
  38. @change="changeCollegeMajor"
  39. />
  40. </a-form-item>
  41. <a-form-item label="专业" name="majorId">
  42. <a-select
  43. v-model:value="formState.majorId"
  44. :fieldNames="{ label: 'majorName', value: 'id' }"
  45. :options="majorOptions"
  46. placeholder="请选择专业"
  47. />
  48. </a-form-item> -->
  49. <a-form-item label="教室描述" name="courseDesc">
  50. <quill-editor
  51. ref="quillEditorRef"
  52. placeholder="请输入教室描述"
  53. v-model:content="formState.courseDesc"
  54. style="height: 200px"
  55. contentType="html"
  56. theme="snow"
  57. />
  58. </a-form-item>
  59. <a-form-item :wrapper-col="{ offset: 11, span: 2 }">
  60. <a-button type="primary" v-if="!courseInfoId" style="margin-right: 10px" @click="submit">提交</a-button>
  61. <a-button type="primary" v-if="courseInfoId" @click="editSub">编辑提交</a-button>
  62. </a-form-item>
  63. </a-form>
  64. </template>
  65. <script setup>
  66. import { reactive, ref, watch } from 'vue'
  67. import { LoadingOutlined, PlusOutlined } from '@ant-design/icons-vue'
  68. import { QuillEditor } from '@vueup/vue-quill'
  69. import '@vueup/vue-quill/dist/vue-quill.snow.css'
  70. import resourceAuditApi from '@/api/resourceAudit.js'
  71. import courseCenterApi from '@/api/courseCenter/courseinfo.js'
  72. import coverUpload from '@/views/myResources/coverUpload/index.vue'
  73. import sysConfig from '@/config/index'
  74. const emit = defineEmits(['nextStep'])
  75. import tool from '@/utils/tool'
  76. const props = defineProps({
  77. //课程id
  78. courseInfoId: {
  79. type: Number,
  80. required: true,
  81. default: null
  82. }
  83. })
  84. const formState = reactive({
  85. courseName: null,
  86. teacherId: null,
  87. courseType: null,
  88. courseDesc: null,
  89. collegeId: null, //院校一级id
  90. collegeTwoId: null, //院校二级id
  91. collegeThreeId: null, //院校三级id
  92. majorId: null, //专业
  93. coverImageId: null //封面id
  94. })
  95. const rules = {
  96. courseName: [{ required: true, message: '请输入教室名称', trigger: 'blur' }],
  97. teacherId: [{ required: true, message: '请选择授课教师', trigger: 'change' }],
  98. courseType: [{ required: true, message: '请选择课程分类', trigger: 'change' }],
  99. courseDesc: [{ required: true, message: '请输入教室描述', trigger: 'change' }],
  100. collegeTwoId: [{ required: true, message: '请选择院系', trigger: 'change' }],
  101. majorId: [{ required: true, message: '请选择专业', trigger: 'change' }],
  102. coverImageId: [{ required: true, message: '请上传封面', trigger: 'change' }]
  103. }
  104. const loading = ref(false)
  105. const formRef = ref(null)
  106. const courseInfoId = ref(null) //课程表单添加成功id
  107. const collegeMajorOptions = ref([]) //院系
  108. const majorIdName = ref([]) //院系回显
  109. const majorOptions = ref([]) //专业
  110. const courseOptions = ref([]) //课程
  111. const teacherOptions = ref([]) //教师
  112. const coverImagePath = ref() // 预览回显
  113. const quillEditorRef = ref(null) // 预览回显
  114. const courseClass = tool.dictList('COURSE_TYPE')
  115. const handleSubmit = () => {
  116. // 这里添加实际提交逻辑,例如:
  117. // let params = {
  118. // current: pagination.pageNum,
  119. // size: pagination.pageSize,
  120. // verifyStatus: formState.verifyStatus,
  121. // fileName: formState.fileName
  122. // }
  123. // courseDesc.ops
  124. formState.courseDesc = toRaw(quillEditorRef.value).getHTML()
  125. courseCenterApi
  126. .add(formState)
  127. .then((res) => {
  128. courseInfoId.value = res.data.courseId
  129. // localStorage.setItem('courseInfoId', res.data.courseId)
  130. emit('nextStep', res.data.courseId)
  131. })
  132. .catch((err) => {
  133. console.log(err)
  134. })
  135. }
  136. const handleEdit = () => {
  137. // collegeId
  138. formState.courseDesc = toRaw(quillEditorRef.value).getHTML()
  139. courseCenterApi
  140. .edit({ ...formState, courseId: courseInfoId.value })
  141. .then((res) => {
  142. emit('nextStep', courseInfoId.value)
  143. })
  144. .catch((err) => {
  145. console.log(err)
  146. })
  147. }
  148. // 封面文件id
  149. const handleChangeCover = (fileId) => {
  150. formState.coverImageId = fileId
  151. }
  152. const submit = () => {
  153. formRef.value.validate().then(() => {
  154. handleSubmit()
  155. })
  156. }
  157. const editSub = () => {
  158. formRef.value.validate().then(() => {
  159. handleEdit()
  160. })
  161. }
  162. // 移除封面文件
  163. const handleRemoveCover = () => {
  164. formState.coverImageId = null
  165. }
  166. //获取教师人员
  167. const getlecturerListSelector = () => {
  168. courseCenterApi
  169. .lecturerList()
  170. .then((res) => {
  171. teacherOptions.value = res.data
  172. })
  173. .catch((err) => {
  174. console.log(err)
  175. })
  176. }
  177. //院系组织查询
  178. const getOrgTreeSelector = () => {
  179. resourceAuditApi
  180. .orgList()
  181. .then((res) => {
  182. collegeMajorOptions.value = res.data
  183. })
  184. .catch((err) => {
  185. console.log(err)
  186. })
  187. }
  188. const changeCollegeMajor = (value, selectedOptions) => {
  189. if (!value) {
  190. formState.collegeTwoId = ''
  191. // majorIdName.value = ''
  192. return false
  193. }
  194. formState.majorId = undefined
  195. // majorIdName.value = selectedOptions.map((it) => it.name).join('/')
  196. // formState.collegeId = value[0] || null
  197. // formState.collegeTwoId = value[1] || null
  198. // formState.collegeThreeId = value[2] || null
  199. // if (selectedOptions.length) {
  200. // 获取选中的最后一级
  201. // const lastSelected = selectedOptions[selectedOptions.length - 1]
  202. // formState.selectedCollegeMajor = {
  203. // id: lastSelected.id,
  204. // name: lastSelected.name,
  205. // fullPath: selectedOptions.map((opt) => opt.name).join(' / ')
  206. // }
  207. getCollegeMajor(formState.collegeTwoId)
  208. // }
  209. }
  210. const getCollegeMajor = (id) => {
  211. resourceAuditApi
  212. .zyselect({ collegeId: id })
  213. .then((res) => {
  214. majorOptions.value = res.data
  215. })
  216. .catch((err) => {
  217. console.log(err)
  218. })
  219. }
  220. //获取课程下拉
  221. const getCourseAllList = () => {
  222. resourceAuditApi
  223. .courseAllList()
  224. .then((res) => {
  225. courseOptions.value = res.data
  226. })
  227. .catch((err) => {
  228. console.log(err)
  229. })
  230. }
  231. // 获取课程信息
  232. const getDetail = () => {
  233. courseInfoId.value = props.courseInfoId
  234. courseCenterApi.detail({ courseId: props.courseInfoId }).then((res) => {
  235. formState.courseName = res.data.courseName
  236. formState.teacherId = res.data.teacherId
  237. formState.collegeId = res.data.collegeId
  238. formState.collegeTwoId = res.data.collegeTwoId
  239. // majorIdName.value = res.data.collegeAllId?.split(',')
  240. getCollegeMajor(formState.collegeTwoId)
  241. formState.courseType = res.data.courseType
  242. formState.courseDesc = res.data.courseDesc
  243. toRaw(quillEditorRef.value).setHTML(formState.courseDesc)
  244. formState.coverImageId = res.data.coverImageId
  245. coverImagePath.value = res.data.coverImagePath
  246. formState.majorId = res.data.majorId
  247. })
  248. }
  249. const resetForm = () => {
  250. if (formState.courseName) {
  251. formRef.value.resetFields()
  252. formState.coverImageId = null
  253. formState.courseDesc = ''
  254. coverImagePath.value = undefined
  255. // 重置富文本编辑器内容
  256. if (quillEditorRef.value) {
  257. toRaw(quillEditorRef.value).setHTML('')
  258. }
  259. }
  260. }
  261. watch(
  262. () => props.courseInfoId,
  263. (newVal) => {
  264. // 初始化下拉选项数据
  265. getOrgTreeSelector()
  266. // getCourseAllList()
  267. getlecturerListSelector()
  268. if (newVal) {
  269. getDetail()
  270. } else {
  271. resetForm()
  272. }
  273. },
  274. { immediate: true }
  275. )
  276. // 初始化数据
  277. // onMounted(() => {
  278. // // toRaw(quillEditorRef.value).setHTML(props.value)
  279. // // formState.courseDesc = '<p>默认内容</p>'
  280. // getOrgTreeSelector()
  281. // getCourseAllList()
  282. // getlecturerListSelector()
  283. // if (props.courseInfoId) {
  284. // getDetail()
  285. // }
  286. // })
  287. </script>
  288. <style scoped>
  289. .avatar-uploader > .ant-upload {
  290. width: 128px;
  291. height: 128px;
  292. }
  293. .ant-upload-select-picture-card i {
  294. font-size: 32px;
  295. color: #999;
  296. }
  297. .ant-upload-select-picture-card .ant-upload-text {
  298. margin-top: 8px;
  299. color: #666;
  300. }
  301. /* 调整表单间距 */
  302. .ant-form-item {
  303. margin-bottom: 16px;
  304. }
  305. </style>