index.tsx 10 KB

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