class-info.tsx 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. import ColField from '@/components/col-field'
  2. import ColFieldGroup from '@/components/col-field-group'
  3. import ColPopup from '@/components/col-popup'
  4. import ColUpload from '@/components/col-upload'
  5. import request from '@/helpers/request'
  6. import { verifyNumberIntegerAndFloat } from '@/helpers/toolsValidate'
  7. import {
  8. Button,
  9. Col,
  10. Field,
  11. Form,
  12. Icon,
  13. Image,
  14. Radio,
  15. RadioGroup,
  16. Row,
  17. Sticky,
  18. Tab,
  19. Tabs
  20. } from 'vant'
  21. import { defineComponent } from 'vue'
  22. import SubjectModel from '../../business-components/subject-list'
  23. import styles from './class-info.module.less'
  24. import { createState } from './createState'
  25. import activeButtonIcon from '@common/images/icon_checkbox.png'
  26. import inactiveButtonIcon from '@common/images/icon_checkbox_default.png'
  27. import { state } from '@/state'
  28. import ColHeader from '@/components/col-header'
  29. export default defineComponent({
  30. name: 'ClassInfo',
  31. data() {
  32. return {
  33. subjectStatus: false,
  34. checked: false // 是否为审核版本
  35. }
  36. },
  37. computed: {
  38. choiceSubjectIds() {
  39. // 选择的科目编号
  40. const ids = createState.lessonGroup.lessonSubject
  41. ? Number(createState.lessonGroup.lessonSubject)
  42. : null
  43. console.log(ids)
  44. return ids ? [ids] : []
  45. },
  46. subjectList() {
  47. // 学科列表
  48. return createState.subjectList || []
  49. },
  50. lessonSubjectName() {
  51. // 选择的科目
  52. let tempStr = ''
  53. this.subjectList.forEach((item: any) => {
  54. if (this.choiceSubjectIds.includes(item.id)) {
  55. tempStr = item.name
  56. }
  57. })
  58. return tempStr
  59. },
  60. calcRatePrice() {
  61. // 计算手续费
  62. const rate = createState.rate || 0
  63. const price = createState.lessonGroup.lessonPrice || 0
  64. return (price - (rate / 100) * price).toFixed(2)
  65. }
  66. },
  67. async mounted() {
  68. try {
  69. if (createState.subjectList.length <= 0) {
  70. const res = await request.post('/api-teacher/teacher/querySubject')
  71. createState.subjectList = res.data || []
  72. }
  73. const resVersion = await request.post('/api-teacher/open/appVersion', {
  74. data: {
  75. platform:
  76. state.platformType === 'STUDENT' ? 'ios-student' : 'ios-teacher',
  77. version: state.version
  78. }
  79. })
  80. this.checked = resVersion.data.check ? true : false
  81. // 审核版本金额默认为0
  82. if (this.checked) {
  83. createState.lessonGroup.lessonPrice = 0
  84. }
  85. } catch {
  86. //
  87. }
  88. },
  89. methods: {
  90. onChoice(id: number) {
  91. // 切换声部,初始化专辑,曲目选择
  92. if (id != createState.lessonGroup.lessonSubject) {
  93. createState.lessonList.forEach((element: any) => {
  94. element.relationList = []
  95. })
  96. }
  97. createState.lessonGroup.lessonSubject = id
  98. this.subjectStatus = false
  99. },
  100. onFormatter(val: any) {
  101. return verifyNumberIntegerAndFloat(val)
  102. },
  103. tabChange(name: number) {
  104. ;(this as any).$refs.form.resetValidation('lessonCoverTemplateUrl')
  105. ;(this as any).$refs.form.resetValidation('lessonCoverUrl')
  106. createState.tabIndex = name
  107. },
  108. selectImg(val: string) {
  109. createState.lessonGroup.lessonCoverUrl = ''
  110. createState.lessonGroup.lessonCoverTemplateUrl = val
  111. }
  112. },
  113. render() {
  114. return createState.loadingStatus ? (
  115. <div></div>
  116. ) : (
  117. <Form
  118. class={styles.classInfo}
  119. ref="form"
  120. onSubmit={() => (createState.active = 2)}
  121. onFailed={(e: any) => console.log(e)}
  122. scrollToError
  123. >
  124. <ColFieldGroup>
  125. <ColField title="课程名称" required>
  126. <Field
  127. v-model={createState.lessonGroup.lessonName}
  128. name="lessonName"
  129. maxlength={50}
  130. placeholder="请输入您的课程名称"
  131. rules={[{ required: true, message: '请输入您的课程名称' }]}
  132. />
  133. </ColField>
  134. <ColField title="课程声部" required>
  135. <Field
  136. modelValue={this.lessonSubjectName}
  137. name="lessonSubjectName"
  138. readonly
  139. isLink
  140. onClick={() => {
  141. this.subjectStatus = true
  142. }}
  143. rules={[{ required: true, message: '请选择课程声部' }]}
  144. placeholder="请选择课程声部"
  145. />
  146. </ColField>
  147. </ColFieldGroup>
  148. <ColFieldGroup>
  149. <ColField title="课程介绍" required border={false}>
  150. <Field
  151. v-model={createState.lessonGroup.lessonDesc}
  152. name="lessonDesc"
  153. placeholder="请输入课程介绍"
  154. rows="3"
  155. maxlength={200}
  156. showWordLimit
  157. autosize
  158. rules={[{ required: true, message: '请输入课程介绍' }]}
  159. type="textarea"
  160. />
  161. </ColField>
  162. </ColFieldGroup>
  163. <ColFieldGroup>
  164. <ColField title="收费方式" required border={false}>
  165. <div class={styles.radioGroup}>
  166. <div
  167. onClick={() => {
  168. createState.lessonGroup.payType = 'PAY'
  169. }}
  170. class={[
  171. styles.radio,
  172. createState.lessonGroup.payType === 'PAY'
  173. ? styles.active
  174. : null
  175. ]}
  176. >
  177. 购买
  178. </div>
  179. <div
  180. onClick={() => {
  181. createState.lessonGroup.payType = 'VIP'
  182. }}
  183. class={[
  184. styles.radio,
  185. createState.lessonGroup.payType === 'VIP'
  186. ? styles.active
  187. : null
  188. ]}
  189. >
  190. 会员
  191. </div>
  192. </div>
  193. </ColField>
  194. </ColFieldGroup>
  195. {createState.lessonGroup.payType === 'PAY' && (
  196. <>
  197. {!this.checked && (
  198. <ColFieldGroup>
  199. <ColField title="课程组售价" required>
  200. <Field
  201. v-model={createState.lessonGroup.lessonPrice}
  202. name="lessonPrice"
  203. placeholder="请输入您的课程组售价"
  204. formatter={this.onFormatter}
  205. type="number"
  206. maxlength={8}
  207. rules={[
  208. { required: true, message: '请输入您的课程组售价' }
  209. ]}
  210. v-slots={{
  211. button: () => <span>元</span>
  212. }}
  213. />
  214. </ColField>
  215. </ColFieldGroup>
  216. )}
  217. <div class={styles['class-info-tip']}>
  218. <p>扣除手续费后您的课程预计收入为:</p>
  219. <p>
  220. 课程组总收入<span>{this.calcRatePrice}</span>元/人
  221. </p>
  222. <p>
  223. 您的课程收入将在学员购买{createState.video_account_period}
  224. 天后结算到您的账户中
  225. </p>
  226. </div>
  227. </>
  228. )}
  229. <ColFieldGroup>
  230. <ColField
  231. required
  232. border={false}
  233. v-slots={{
  234. title: () => (
  235. // <Tabs
  236. // v-model:active={createState.tabIndex}
  237. // class={styles.infoField}
  238. // onChange={this.tabChange}
  239. // shrink
  240. // color="var(--van-primary)"
  241. // lineWidth={20}
  242. // >
  243. // <Tab title="图片模板" name={1}></Tab>
  244. // <Tab title="自定义模板" name={2}></Tab>
  245. // </Tabs>
  246. <p>请上传自定义模板</p>
  247. )
  248. }}
  249. >
  250. <p class={styles.photoTip}>模板图片将作为该课程封面为学员展示</p>
  251. {/* {createState.tabIndex === 1 && ( */}
  252. {/* <Field
  253. name="lessonCoverTemplateUrl"
  254. border={false}
  255. v-show={createState.tabIndex === 1}
  256. rules={[
  257. {
  258. required:
  259. createState.tabIndex === 1 &&
  260. !createState.lessonGroup.lessonCoverUrl,
  261. message: '请选择图片模板'
  262. }
  263. ]}
  264. v-slots={{
  265. input: () => (
  266. <RadioGroup
  267. v-model={createState.lessonGroup.lessonCoverTemplateUrl}
  268. >
  269. <Row justify="space-between" style={{ width: '100%' }}>
  270. {createState.templateList.map((item: any) => (
  271. <Col
  272. span={12}
  273. class={styles.imgContainer}
  274. onClick={() => this.selectImg(item)}
  275. >
  276. <Image class={styles.imgContainer} src={item} />
  277. <Radio
  278. name={item}
  279. v-slots={{
  280. icon: (props: any) => (
  281. <Icon
  282. class={styles.boxStyle}
  283. name={
  284. props.checked
  285. ? activeButtonIcon
  286. : inactiveButtonIcon
  287. }
  288. size="18"
  289. />
  290. )
  291. }}
  292. />
  293. </Col>
  294. ))}
  295. </Row>
  296. </RadioGroup>
  297. )
  298. }}
  299. /> */}
  300. {/* )} */}
  301. {/* {createState.tabIndex == 2 && ( */}
  302. {/* v-show={createState.tabIndex == 2} createState.tabIndex == 2*/}
  303. <Field
  304. name="lessonCoverUrl"
  305. rules={[
  306. {
  307. required: true,
  308. message: '请上传自定义模板'
  309. }
  310. ]}
  311. v-slots={{
  312. input: () => (
  313. <Row justify="space-between" style={{ width: '100%' }}>
  314. <Col span={12} class={styles.imgContainer}>
  315. <ColUpload
  316. cropper
  317. bucket="video-course"
  318. options={{
  319. fixedNumber: [1.77, 1],
  320. autoCropWidth: 750,
  321. autoCropHeight: 424
  322. }}
  323. onUploadChange={(val: any) => {
  324. if (val) {
  325. createState.lessonGroup.lessonCoverTemplateUrl = ''
  326. }
  327. }}
  328. v-model={createState.lessonGroup.lessonCoverUrl}
  329. class={styles.imgContainer}
  330. />
  331. </Col>
  332. <Col span={24}>
  333. <p
  334. class={styles.photoTip}
  335. style={{ color: '#ff4e19', padding: '0' }}
  336. >
  337. 图片尺寸为750*424能达到最佳显示效果
  338. </p>
  339. </Col>
  340. </Row>
  341. )
  342. }}
  343. />
  344. {/* )} */}
  345. </ColField>
  346. </ColFieldGroup>
  347. <Sticky offsetBottom={0} position="bottom">
  348. <div class={['btnGroup']}>
  349. <Button block round type="primary" native-type="submit">
  350. 下一步
  351. </Button>
  352. </div>
  353. </Sticky>
  354. <ColPopup v-model={this.subjectStatus} destroy zIndex={9999999}>
  355. <ColHeader />
  356. <SubjectModel
  357. selectType="Radio"
  358. single
  359. subjectList={createState.subjectList}
  360. choiceSubjectIds={this.choiceSubjectIds}
  361. onChoice={this.onChoice}
  362. />
  363. </ColPopup>
  364. </Form>
  365. )
  366. }
  367. })