course.tsx 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. import ColField from '@/components/col-field'
  2. import ColFieldGroup from '@/components/col-field-group'
  3. import ColPopup from '@/components/col-popup'
  4. import SubjectModel from '@/business-components/subject-list'
  5. import { ActionSheet, Button, Field, Form } from 'vant'
  6. import { defineComponent } from 'vue'
  7. import styles from './course.module.less'
  8. import { createState } from './createState'
  9. import {
  10. verifiyNumberInteger,
  11. verifyNumberIntegerAndFloat
  12. } from '@/helpers/toolsValidate'
  13. import request from '@/helpers/request'
  14. import { state } from '@/state'
  15. import ColHeader from '@/components/col-header'
  16. import TheSticky from '@/components/the-sticky'
  17. // 校验函数返回 true 表示校验通过,false 表示不通过
  18. export const validator = val => {
  19. console.log(val)
  20. if (Number(val) <= 0) {
  21. return '课程组售价必须大于0'
  22. } else {
  23. return true
  24. }
  25. }
  26. export default defineComponent({
  27. name: 'course',
  28. data() {
  29. return {
  30. subjectStatus: false,
  31. classTimeStatus: false,
  32. checked: false
  33. }
  34. },
  35. computed: {
  36. choiceSubjectIds() {
  37. // 选择的科目编号
  38. const ids = createState.live.subjectId
  39. ? Number(createState.live.subjectId)
  40. : null
  41. return ids ? [ids] : []
  42. },
  43. subjectList() {
  44. // 学科列表
  45. return createState.subjectList || []
  46. },
  47. lessonSubjectName() {
  48. // 选择的科目
  49. let tempStr = ''
  50. this.subjectList.forEach((item: any) => {
  51. if (this.choiceSubjectIds.includes(item.id)) {
  52. tempStr = item.name
  53. }
  54. })
  55. return tempStr
  56. },
  57. calcSingleRatePrice() {
  58. const rate = createState.rate || 0
  59. const nums = createState.live.courseNum
  60. const price = createState.live.coursePrice || 0
  61. return nums ? ((price / nums) * (1 - rate / 100)).toFixed(2) : 0
  62. },
  63. calcRatePrice() {
  64. // 计算手续费
  65. const rate = createState.rate || 0
  66. const price = createState.live.coursePrice || 0
  67. return (price - (rate / 100) * price).toFixed(2)
  68. },
  69. disabled() {
  70. return createState.live.courseGroupId ? true : false
  71. }
  72. },
  73. async mounted() {
  74. try {
  75. const resVersion = await request.post('/api-teacher/open/appVersion', {
  76. data: {
  77. platform:
  78. state.platformType === 'STUDENT' ? 'ios-student' : 'ios-teacher',
  79. version: state.version
  80. }
  81. })
  82. this.checked = resVersion.data.check ? true : false
  83. // 审核版本金额默认为0
  84. if (this.checked) {
  85. createState.live.coursePrice = 0
  86. }
  87. } catch {
  88. //
  89. }
  90. },
  91. methods: {
  92. onChoice(id: number) {
  93. createState.live.subjectId = id
  94. this.subjectStatus = false
  95. },
  96. onFormatter(val: any) {
  97. return verifyNumberIntegerAndFloat(val)
  98. },
  99. onFormatterInt(val: any) {
  100. if (val && val >= 1) {
  101. return verifiyNumberInteger(val)
  102. } else {
  103. return ''
  104. }
  105. },
  106. onSelect(action: any) {
  107. createState.live.singleCourseMinutes =
  108. Number(action.name || 0) + Number(action.freeMinutes || 0)
  109. createState.live.singleMins = Number(action.name || 0)
  110. createState.live.freeMinutes = Number(action.freeMinutes || 0)
  111. }
  112. },
  113. render() {
  114. return (
  115. <Form
  116. class={styles.classInfo}
  117. onSubmit={() => (createState.active = 2)}
  118. scrollToError
  119. >
  120. <ColFieldGroup>
  121. <ColField title="课程名称" required>
  122. <Field
  123. v-model={createState.live.name}
  124. name="name"
  125. maxlength={20}
  126. placeholder="请输入您的课程名称"
  127. rules={[{ required: true, message: '请输入您的课程名称' }]}
  128. disabled={this.disabled}
  129. />
  130. </ColField>
  131. <ColField title="课程声部" required>
  132. <Field
  133. modelValue={this.lessonSubjectName}
  134. name="subjectId"
  135. readonly
  136. isLink
  137. disabled={this.disabled}
  138. onClick={() => {
  139. if (createState.live.courseGroupId) {
  140. return
  141. }
  142. this.subjectStatus = true
  143. }}
  144. rules={[{ required: true, message: '请选择课程声部' }]}
  145. placeholder="请选择课程声部"
  146. />
  147. </ColField>
  148. <ColField title="课程介绍" required border={false}>
  149. <Field
  150. v-model={createState.live.courseIntroduce}
  151. name="courseIntroduce"
  152. placeholder="请输入课程介绍"
  153. rows="3"
  154. maxlength={200}
  155. showWordLimit
  156. autosize
  157. rules={[{ required: true, message: '请输入课程介绍' }]}
  158. type="textarea"
  159. />
  160. </ColField>
  161. </ColFieldGroup>
  162. <ColFieldGroup>
  163. <ColField title="课时数" required>
  164. <Field
  165. v-model={createState.live.courseNum}
  166. name="courseNum"
  167. placeholder="请输入您的课时数"
  168. formatter={this.onFormatterInt}
  169. type="number"
  170. maxlength={2}
  171. disabled={this.disabled}
  172. rules={[{ required: true, message: '请输入您的课时数' }]}
  173. v-slots={{
  174. button: () => <span>课时</span>
  175. }}
  176. />
  177. </ColField>
  178. <ColField title="单课时时长" required>
  179. <Field
  180. modelValue={createState.live.singleMins}
  181. name="singleMins"
  182. readonly
  183. disabled={this.disabled}
  184. isLink
  185. onClick={() => {
  186. if (!createState.live.courseGroupId) {
  187. this.classTimeStatus = true
  188. }
  189. }}
  190. rules={[{ required: true, message: '请选择单课时时长' }]}
  191. placeholder="请选择单课时时长"
  192. />
  193. </ColField>
  194. {/* 是审核版本才会显示金额 */}
  195. {!this.checked && (
  196. <ColField title="课程组售价" required>
  197. <Field
  198. v-model={createState.live.coursePrice}
  199. name="coursePrice"
  200. placeholder="请输入您的课程组售价"
  201. formatter={this.onFormatter}
  202. type="number"
  203. maxlength={8}
  204. disabled={this.disabled}
  205. rules={[
  206. { required: true, validator, message: '请输入您的课程组售价' }
  207. ]}
  208. v-slots={{
  209. button: () => <span>元</span>
  210. }}
  211. />
  212. </ColField>
  213. )}
  214. </ColFieldGroup>
  215. {/* 是审核版本才会显示金额 */}
  216. {!this.checked && (
  217. <div class={styles['class-info-tip']}>
  218. <p>扣除手续费后您的课程预计收入为:</p>
  219. <p>
  220. 单课时<span>{this.calcSingleRatePrice}</span>元/人
  221. </p>
  222. <p>
  223. 课程组总收入<span>{this.calcRatePrice}</span>元/人
  224. </p>
  225. <p>您的课程收入将在课程结束后结算到您的账户中</p>
  226. </div>
  227. )}
  228. <TheSticky position="bottom">
  229. <div class={'btnGroup'}>
  230. <Button block round type="primary" native-type="submit">
  231. 下一步
  232. </Button>
  233. </div>
  234. </TheSticky>
  235. <ColPopup v-model={this.subjectStatus}>
  236. <ColHeader title="选择声部" />
  237. <SubjectModel
  238. selectType="Radio"
  239. single
  240. subjectList={createState.subjectList}
  241. choiceSubjectIds={this.choiceSubjectIds}
  242. onChoice={this.onChoice}
  243. />
  244. </ColPopup>
  245. <ActionSheet
  246. v-model:show={this.classTimeStatus}
  247. actions={createState.minutes}
  248. cancelText="取消"
  249. closeOnClickAction
  250. onSelect={this.onSelect}
  251. />
  252. </Form>
  253. )
  254. }
  255. })