index.tsx 9.4 KB

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