courseInfo.vue 8.9 KB

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