courseInfo.vue 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. <template>
  2. <a-form
  3. :model="formState"
  4. :rules="rules"
  5. ref="formRef"
  6. layout="horizontal"
  7. :label-col="{ span: 2 }"
  8. :wrapper-col="{ span: 12 }"
  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-cascader-->
  41. <!-- v-model:value="majorIdName"-->
  42. <!-- :options="collegeMajorOptions"-->
  43. <!-- :fieldNames="{ label: 'name', value: 'id' }"-->
  44. <!-- placeholder="请选择院系"-->
  45. <!-- changeOnSelect-->
  46. <!-- @change="changeCollegeMajor"-->
  47. <!-- />-->
  48. </a-form-item>
  49. <a-form-item label="专业" name="majorId">
  50. <a-select
  51. v-model:value="formState.majorId"
  52. :fieldNames="{ label: 'majorName', value: 'id' }"
  53. :options="majorOptions"
  54. placeholder="请选择专业"
  55. />
  56. </a-form-item>
  57. <a-form-item label="教室描述" name="courseDesc">
  58. <quill-editor
  59. ref="quillEditorRef"
  60. placeholder="请输入教室描述"
  61. v-model:content="formState.courseDesc"
  62. style="height: 200px"
  63. contentType="html"
  64. theme="snow"
  65. />
  66. </a-form-item>
  67. <a-form-item :wrapper-col="{ offset: 5, span: 12 }">
  68. <a-button
  69. type="primary"
  70. v-if="!courseInfoId"
  71. style="margin-right: 10px"
  72. @click="submit"
  73. >提交</a-button
  74. >
  75. <a-button type="primary" v-if="courseInfoId" @click="editSub"
  76. >编辑提交</a-button
  77. >
  78. </a-form-item>
  79. </a-form>
  80. </template>
  81. <script setup>
  82. import { reactive, ref, onMounted } from 'vue'
  83. import { LoadingOutlined, PlusOutlined } from '@ant-design/icons-vue'
  84. import { QuillEditor } from '@vueup/vue-quill'
  85. import '@vueup/vue-quill/dist/vue-quill.snow.css'
  86. import resourceAuditApi from '@/api/resourceAudit.js'
  87. import courseCenterApi from '@/api/courseCenter/courseinfo.js'
  88. import coverUpload from '@/views/myResources/coverUpload/index.vue'
  89. import sysConfig from '@/config/index'
  90. const emit = defineEmits(['nextStep'])
  91. import tool from '@/utils/tool'
  92. const props = defineProps({
  93. //课程id
  94. courseInfoId: {
  95. type: Number,
  96. required: true,
  97. default: null
  98. }
  99. })
  100. const formState = reactive({
  101. courseName: null,
  102. teacherId: null,
  103. courseType: null,
  104. courseDesc: null,
  105. collegeId: null, //院校一级id
  106. collegeTwoId: null, //院校二级id
  107. collegeThreeId: null, //院校三级id
  108. majorId: null, //专业
  109. coverImageId: null //封面id
  110. })
  111. const rules = {
  112. courseName: [{ required: true, message: '请输入教室名称', trigger: 'blur' }],
  113. teacherId: [{ required: true, message: '请选择授课教师', trigger: 'change' }],
  114. courseType: [{ required: true, message: '请选择课程分类', trigger: 'change' }],
  115. courseDesc: [{ required: true, message: '请输入教室描述', trigger: 'change' }],
  116. collegeTwoId: [{ required: true, message: '请选择院系', trigger: 'change' }],
  117. majorId: [{ required: true, message: '请选择专业', trigger: 'change' }],
  118. coverImageId: [{ required: true, message: '请上传封面', trigger: 'change' }]
  119. }
  120. const loading = ref(false)
  121. const formRef = ref(null)
  122. const courseInfoId = ref(null) //课程表单添加成功id
  123. const collegeMajorOptions = ref([]) //院系
  124. const majorIdName = ref([]) //院系回显
  125. const majorOptions = ref([]) //专业
  126. const courseOptions = ref([]) //课程
  127. const teacherOptions = ref([]) //教师
  128. const coverImagePath = ref() // 预览回显
  129. const quillEditorRef = ref(null) // 预览回显
  130. const courseClass = tool.dictList('COURSE_TYPE')
  131. const handleSubmit = () => {
  132. console.log('表单数据:', formState)
  133. // 这里添加实际提交逻辑,例如:
  134. // let params = {
  135. // current: pagination.pageNum,
  136. // size: pagination.pageSize,
  137. // verifyStatus: formState.verifyStatus,
  138. // fileName: formState.fileName
  139. // }
  140. // courseDesc.ops
  141. formState.courseDesc = toRaw(quillEditorRef.value).getHTML()
  142. courseCenterApi
  143. .add(formState)
  144. .then((res) => {
  145. console.log(res.data, '表单添加')
  146. courseInfoId.value = res.data.courseId
  147. // localStorage.setItem('courseInfoId', res.data.courseId)
  148. emit('nextStep',res.data.courseId)
  149. })
  150. .catch((err) => {
  151. console.log(err)
  152. })
  153. }
  154. const handleEdit = () => {
  155. console.log('表单编辑数据:', formState)
  156. // collegeId
  157. formState.courseDesc = toRaw(quillEditorRef.value).getHTML()
  158. courseCenterApi
  159. .edit({ ...formState, courseId: courseInfoId.value })
  160. .then((res) => {
  161. console.log(res.data, '表单编辑')
  162. emit('nextStep',courseInfoId.value)
  163. })
  164. .catch((err) => {
  165. console.log(err)
  166. })
  167. }
  168. // 封面文件id
  169. const handleChangeCover = (fileId) => {
  170. formState.coverImageId = fileId
  171. }
  172. const submit = () => {
  173. formRef.value.validate().then(()=>{
  174. handleSubmit()
  175. })
  176. }
  177. const editSub = () => {
  178. formRef.value.validate().then(()=>{
  179. handleEdit()
  180. })
  181. }
  182. // 移除封面文件
  183. const handleRemoveCover = () => {
  184. formState.coverImageId = null
  185. }
  186. //获取教师人员
  187. const getlecturerListSelector = () => {
  188. courseCenterApi
  189. .lecturerList()
  190. .then((res) => {
  191. console.log(res.data, '获取教师下拉数据')
  192. teacherOptions.value = res.data
  193. })
  194. .catch((err) => {
  195. console.log(err)
  196. })
  197. }
  198. //院系组织查询
  199. const getOrgTreeSelector = () => {
  200. resourceAuditApi
  201. .orgList()
  202. .then((res) => {
  203. console.log(res.data, '获取学院')
  204. collegeMajorOptions.value = res.data
  205. })
  206. .catch((err) => {
  207. console.log(err)
  208. })
  209. }
  210. const changeCollegeMajor = (value, selectedOptions) => {
  211. console.log('Selected:', value, selectedOptions)
  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>