courseInfo.vue 9.8 KB

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