index.tsx 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. import ColCropper from '@/components/col-cropper'
  2. import styles from './index.module.less'
  3. import request from '@/helpers/request'
  4. import { verifyNumberIntegerAndFloat } from '@/helpers/toolsValidate'
  5. import {
  6. ElButton,
  7. ElCol,
  8. ElForm,
  9. ElFormItem,
  10. ElImage,
  11. ElInput,
  12. ElOption,
  13. ElRadio,
  14. ElRadioGroup,
  15. ElRow,
  16. ElSelect,
  17. ElTabPane,
  18. ElTabs
  19. } from 'element-plus'
  20. import { defineComponent } from 'vue'
  21. import { createState } from '../createState'
  22. import { scrollAnimation } from '@/util/scroll'
  23. import ColUpload from '@/components/col-upload'
  24. export default defineComponent({
  25. name: 'course-info',
  26. data() {
  27. return {
  28. url: ''
  29. // calcRatePrice: 0 as any
  30. }
  31. },
  32. computed: {
  33. choiceSubjectIds() {
  34. // 选择的科目编号
  35. let ids = createState.lessonGroup.lessonSubject
  36. ? Number(createState.lessonGroup.lessonSubject)
  37. : null
  38. return ids ? [ids] : []
  39. },
  40. subjectList() {
  41. // 学科列表
  42. return createState.subjectList || []
  43. },
  44. lessonSubjectName() {
  45. // 选择的科目
  46. let tempStr = ''
  47. this.subjectList.forEach((item: any) => {
  48. if (this.choiceSubjectIds.includes(item.id)) {
  49. tempStr = item.name
  50. }
  51. })
  52. return tempStr
  53. },
  54. calcRatePrice() {
  55. // 计算手续费
  56. let rate = createState.rate || 0
  57. let price = createState.lessonGroup.lessonPrice || 0
  58. return (price - (rate / 100) * price).toFixed(2)
  59. }
  60. },
  61. async mounted() {
  62. try {
  63. if (createState.subjectList.length <= 0) {
  64. const res = await request.post('/api-website/teacher/querySubject')
  65. createState.subjectList = res.data || []
  66. }
  67. const rate = createState.rate || 0
  68. const price = createState.lessonGroup.lessonPrice || 0
  69. // this.calcRatePrice = (price - (rate / 100) * price).toFixed(2)
  70. // setInterval(() => {
  71. // console.log(
  72. // createState.lessonGroup.lessonCoverTemplateUrl,
  73. // 'createState.lessonGroup.lessonCoverTemplateUrl'
  74. // )
  75. // }, 1000)
  76. } catch {
  77. //
  78. }
  79. },
  80. methods: {
  81. // onChoice(id: number) {
  82. // createState.lessonGroup.lessonSubject = id
  83. // this.subjectStatus = false
  84. // },
  85. onFormatter(e: any) {
  86. e.target.value = verifyNumberIntegerAndFloat(e.target.value)
  87. // 计算手续费
  88. let rate = createState.rate || 0
  89. let price = e.target.value || 0
  90. // this.calcRatePrice = (price - (rate / 100) * price).toFixed(2)
  91. },
  92. tabChange(name: number) {
  93. ;(this as any).$refs.form.clearValidate('lessonCoverTemplateUrl')
  94. ;(this as any).$refs.form.clearValidate('lessonCoverUrl')
  95. createState.tabIndex = name
  96. },
  97. selectImg(val: string) {
  98. createState.lessonGroup.lessonCoverUrl = ''
  99. createState.lessonGroup.lessonCoverTemplateUrl = val
  100. }
  101. },
  102. render() {
  103. return (
  104. <div class={styles.courseInfo}>
  105. <ElForm
  106. class="px-6 pb-10 pt-7"
  107. size="large"
  108. ref="form"
  109. labelWidth={'120px'}
  110. labelPosition="left"
  111. model={createState.lessonGroup}
  112. >
  113. <ElFormItem
  114. label="课程名称"
  115. prop="lessonName"
  116. rules={[
  117. {
  118. required: true,
  119. message: '请输入课程名称'
  120. }
  121. ]}
  122. >
  123. <ElInput
  124. v-model={createState.lessonGroup.lessonName}
  125. maxlength={20}
  126. placeholder="请输入课程名称"
  127. />
  128. </ElFormItem>
  129. <ElFormItem
  130. label="课程声部"
  131. prop="lessonSubject"
  132. rules={[
  133. {
  134. required: true,
  135. message: '请选择课程声部'
  136. }
  137. ]}
  138. >
  139. <ElSelect
  140. class="w-full"
  141. v-model={createState.lessonGroup.lessonSubject}
  142. placeholder="请选择课程声部"
  143. // disabled={createState.lessonGroup.id ? true : false}
  144. >
  145. {createState.subjectList.map((item: any) => (
  146. <ElOption key={item.id} value={item.id} label={item.name} />
  147. ))}
  148. </ElSelect>
  149. </ElFormItem>
  150. <ElFormItem
  151. label="课程介绍"
  152. prop="lessonDesc"
  153. rules={[
  154. {
  155. required: true,
  156. message: '请输入课程介绍'
  157. }
  158. ]}
  159. >
  160. <ElInput
  161. placeholder="请输入课程介绍"
  162. v-model={createState.lessonGroup.lessonDesc}
  163. type="textarea"
  164. // @ts-ignore
  165. maxlength={200}
  166. rows={4}
  167. showWordLimit
  168. />
  169. </ElFormItem>
  170. <ElFormItem
  171. label="课程组售价"
  172. prop="lessonPrice"
  173. rules={[
  174. {
  175. required: true,
  176. message: '请输入课程组售价'
  177. }
  178. ]}
  179. >
  180. <ElInput
  181. placeholder="请输入课程组售价"
  182. v-model={createState.lessonGroup.lessonPrice}
  183. // @ts-ignore
  184. onKeyup={this.onFormatter}
  185. maxlength={9}
  186. v-slots={{
  187. suffix: () => <span class="text-base text-[#999]">元</span>
  188. }}
  189. // disabled={createState.lessonGroup.id ? true : false}
  190. />
  191. </ElFormItem>
  192. <div class="text-sm text-[#999] pl-[120px] leading-relaxed pb-2">
  193. <p>扣除手续费后您的课程预计收入为: </p>
  194. <p>
  195. 课程组总收入
  196. <span class="px-1 text-[#FF4E19]">{this.calcRatePrice}</span>元/人
  197. </p>
  198. <p>您的课程收入将在课程结束后结算到您的账户中 </p>
  199. </div>
  200. {/* <ElFormItem label="课程封面" class="!mb-0" required>
  201. <ElTabs
  202. v-model={createState.tabIndex}
  203. class={styles.tabs}
  204. onTab-change={(name: any) => {
  205. this.tabChange(name)
  206. }}
  207. >
  208. <ElTabPane label="图片模板" name={1}></ElTabPane>
  209. <ElTabPane label="自定义模板" name={2}></ElTabPane>
  210. </ElTabs>
  211. </ElFormItem> */}
  212. {/* {createState.tabIndex === 1 && (
  213. <ElFormItem
  214. prop="lessonCoverTemplateUrl"
  215. rules={[
  216. {
  217. required: true,
  218. message: '请上传课程封面'
  219. }
  220. ]}
  221. >
  222. <ElRadioGroup
  223. v-model={createState.lessonGroup.lessonCoverTemplateUrl}
  224. >
  225. <ElRow>
  226. {createState.templateList.map((item: any) => (
  227. <ElCol span={7} class="mb-3 cursor-pointer">
  228. <div
  229. class="w-[152px] relative rounded-xl overflow-hidden border"
  230. onClick={() => {
  231. this.selectImg(item)
  232. }}
  233. >
  234. <ElImage src={item} class="align-middle" />
  235. <ElRadio
  236. label={item}
  237. class="!absolute bottom-2 right-0 !h-auto z-10"
  238. >
  239. {''}
  240. </ElRadio>
  241. </div>
  242. </ElCol>
  243. ))}
  244. </ElRow>
  245. </ElRadioGroup>
  246. </ElFormItem>
  247. )} */}
  248. {/* {createState.tabIndex === 2 && ( */}
  249. <ElFormItem
  250. label="课程封面"
  251. class="!mb-0"
  252. prop="lessonCoverUrl"
  253. rules={[
  254. {
  255. required: true,
  256. message: '请上传课程封面',
  257. trigger: 'change'
  258. }
  259. ]}
  260. >
  261. {/* <ColUpload
  262. v-model:modelValue={createState.lessonGroup.lessonCoverUrl}
  263. onChange={(value: any) => {
  264. createState.lessonGroup.lessonCoverTemplateUrl = ''
  265. }}
  266. /> */}
  267. <ColCropper
  268. modelValue={createState.lessonGroup.lessonCoverUrl}
  269. bucket="video-course"
  270. cropUploadSuccess={(data: any) => {
  271. createState.lessonGroup.lessonCoverUrl = data
  272. createState.lessonGroup.lessonCoverTemplateUrl = ''
  273. }}
  274. options={{
  275. title: '课程封面',
  276. fixedNumber: [3.34, 2],
  277. autoCropWidth: 375,
  278. autoCropHeight: 212
  279. // fixedNumber: [3, 2],
  280. // autoCropWidth: 300,
  281. // autoCropHeight: 200
  282. }}
  283. />
  284. </ElFormItem>
  285. {/* )} */}
  286. </ElForm>
  287. <div class=" text-center pt-6 pb-7">
  288. <ElButton
  289. type="primary"
  290. round
  291. class="!w-44 !h-[48px] !text-base"
  292. onClick={() => {
  293. ;(this as any).$refs.form.validate(async (valid: boolean) => {
  294. if (valid) {
  295. createState.active = 1
  296. const currentY =
  297. document.documentElement.scrollTop ||
  298. document.body.scrollTop
  299. scrollAnimation(currentY, 0)
  300. } else {
  301. this.$nextTick(() => {
  302. let isError = document.getElementsByClassName('is-error')
  303. isError[0].scrollIntoView({
  304. block: 'center',
  305. behavior: 'smooth'
  306. })
  307. })
  308. return false
  309. }
  310. })
  311. }}
  312. >
  313. 下一步
  314. </ElButton>
  315. </div>
  316. </div>
  317. )
  318. }
  319. })