course-start.tsx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. import ColField from '@/components/col-field'
  2. import ColFieldGroup from '@/components/col-field-group'
  3. import {
  4. Button,
  5. Col,
  6. Field,
  7. Form,
  8. Radio,
  9. RadioGroup,
  10. Row,
  11. Sticky,
  12. Tab,
  13. Tabs,
  14. Image,
  15. Icon,
  16. Popup,
  17. DatetimePicker
  18. } from 'vant'
  19. import { defineComponent } from 'vue'
  20. import { createState } from './createState'
  21. import styles from './course-start.module.less'
  22. import ColUpload from '@/components/col-upload'
  23. import { verifiyNumberInteger } from '@/helpers/toolsValidate'
  24. import { formatterDate } from '@/helpers/utils'
  25. import activeButtonIcon from '@common/images/icon_checkbox.png'
  26. import inactiveButtonIcon from '@common/images/icon_checkbox_default.png'
  27. import dayjs from 'dayjs'
  28. export default defineComponent({
  29. name: 'course-start',
  30. data() {
  31. return {
  32. typeDateTime: 'start',
  33. dateStatus: false,
  34. currentDate: new Date(),
  35. minDate: dayjs().toDate(),
  36. maxDate: new Date()
  37. }
  38. },
  39. mounted() {
  40. if (createState.selectCourseList[0]?.startTime) {
  41. this.maxDate = dayjs(createState.selectCourseList[0].startTime)
  42. .subtract(1, 'day')
  43. .toDate()
  44. }
  45. createState.live.salesStartDate =
  46. createState.live.salesStartDate ||
  47. dayjs(this.minDate).format('YYYY-MM-DD')
  48. createState.live.salesEndDate =
  49. createState.live.salesEndDate || dayjs(this.maxDate).format('YYYY-MM-DD')
  50. },
  51. methods: {
  52. tabChange(name: number) {
  53. createState.tabIndex = name
  54. },
  55. selectImg(val: string) {
  56. createState.live.backgroundPic = ''
  57. createState.live.backgroundPicTemplate = val
  58. },
  59. onFormatterInt(val: any) {
  60. if (val && val >= 1) {
  61. return verifiyNumberInteger(val)
  62. } else {
  63. return ''
  64. }
  65. },
  66. onConfirm(val: any) {
  67. if (this.typeDateTime === 'start') {
  68. createState.live.salesStartDate = dayjs(val).format('YYYY-MM-DD')
  69. if (
  70. createState.live.salesEndDate &&
  71. dayjs(createState.live.salesStartDate).isAfter(
  72. dayjs(createState.live.salesEndDate)
  73. )
  74. ) {
  75. createState.live.salesEndDate = ''
  76. }
  77. } else if (this.typeDateTime === 'end') {
  78. createState.live.salesEndDate = dayjs(val).format('YYYY-MM-DD')
  79. }
  80. this.dateStatus = false
  81. }
  82. },
  83. render() {
  84. return (
  85. <Form
  86. class={styles.courseStart}
  87. onSubmit={() => (createState.active = 5)}
  88. scrollToError
  89. disabled={createState.live.courseGroupId ? true : false}
  90. >
  91. <ColFieldGroup>
  92. <ColField title="开售日期" required>
  93. <Field
  94. v-model={createState.live.salesStartDate}
  95. name="salesStartDate"
  96. readonly
  97. isLink
  98. placeholder="请选择开售日期"
  99. onClick={() => {
  100. if (createState.live.courseGroupId) {
  101. return
  102. }
  103. this.minDate = dayjs().toDate()
  104. this.currentDate = dayjs(
  105. createState.live.salesStartDate
  106. ).toDate()
  107. this.typeDateTime = 'start'
  108. this.dateStatus = true
  109. }}
  110. rules={[{ required: true, message: '请选择开售日期' }]}
  111. />
  112. </ColField>
  113. <ColField title="停售日期" required>
  114. <Field
  115. v-model={createState.live.salesEndDate}
  116. name="salesEndDate"
  117. readonly
  118. isLink
  119. onClick={() => {
  120. if (createState.live.courseGroupId) {
  121. return
  122. }
  123. this.minDate = dayjs(createState.live.salesStartDate).toDate()
  124. this.currentDate = dayjs(createState.live.salesEndDate).toDate()
  125. this.typeDateTime = 'end'
  126. this.dateStatus = true
  127. }}
  128. rules={[{ required: true, message: '请选择停售日期' }]}
  129. placeholder="请选择停售日期"
  130. />
  131. </ColField>
  132. </ColFieldGroup>
  133. <ColFieldGroup>
  134. <ColField
  135. title="最低开课人数"
  136. required
  137. style={{
  138. marginBottom: '10px'
  139. }}
  140. >
  141. <Field
  142. v-model={createState.live.mixStudentNum}
  143. name="mixStudentNum"
  144. placeholder="请输入最低开课人数"
  145. type="number"
  146. maxlength={8}
  147. formatter={this.onFormatterInt}
  148. rules={[{ required: true, message: '请输入最低开课人数' }]}
  149. v-slots={{
  150. button: () => <span>人</span>
  151. }}
  152. />
  153. </ColField>
  154. <div class={styles.stepTips}>
  155. 课程停售时付费学员达到该人数可开课,若未达到该人数课程将会失效,已付费学员将自动退款
  156. </div>
  157. </ColFieldGroup>
  158. <ColFieldGroup>
  159. <ColField
  160. required
  161. border={false}
  162. v-slots={{
  163. title: () => (
  164. <Tabs
  165. v-model:active={createState.tabIndex}
  166. class={styles.infoField}
  167. onChange={this.tabChange}
  168. shrink
  169. color="var(--van-primary)"
  170. lineWidth={20}
  171. >
  172. {/* <Tab title="图片模板" name={1}></Tab> */}
  173. <Tab title="自定义模板" name={2}></Tab>
  174. </Tabs>
  175. )
  176. }}
  177. >
  178. <p class={styles.photoTip}>模板图片将作为该课程封面为学员展示</p>
  179. {/* {createState.tabIndex === 1 ? ( */}
  180. <Field
  181. name="backgroundPicTemplate"
  182. border={false}
  183. v-show={createState.tabIndex === 1}
  184. rules={[
  185. {
  186. required:
  187. createState.tabIndex === 1 &&
  188. !createState.live.backgroundPic,
  189. message: '请选择图片模板'
  190. }
  191. ]}
  192. v-slots={{
  193. input: () => (
  194. <RadioGroup v-model={createState.live.backgroundPicTemplate}>
  195. <Row justify="space-between" style={{ width: '100%' }}>
  196. {createState.templateList.map((item: any) => (
  197. <Col
  198. span={12}
  199. class={styles.imgContainer}
  200. onClick={() => this.selectImg(item)}
  201. >
  202. <Image class={styles.imgContainer} src={item} />
  203. <Radio
  204. name={item}
  205. v-slots={{
  206. icon: (props: any) => (
  207. <Icon
  208. class={styles.boxStyle}
  209. name={
  210. props.checked
  211. ? activeButtonIcon
  212. : inactiveButtonIcon
  213. }
  214. size="18"
  215. />
  216. )
  217. }}
  218. />
  219. </Col>
  220. ))}
  221. </Row>
  222. </RadioGroup>
  223. )
  224. }}
  225. />
  226. {/* ) : null} */}
  227. {/* {createState.tabIndex == 2 ? ( */}
  228. <Field
  229. name="backgroundPic"
  230. border={false}
  231. v-show={createState.tabIndex == 2}
  232. rules={[
  233. {
  234. required: createState.tabIndex == 2,
  235. message: '请上传自定义模板'
  236. }
  237. ]}
  238. v-slots={{
  239. input: () => (
  240. <Row justify="space-between" style={{ width: '100%' }}>
  241. <Col span={12} class={styles.imgContainer}>
  242. <ColUpload
  243. cropper
  244. bucket="live-rewind"
  245. options={{
  246. fixedNumber: [1.77, 1],
  247. autoCropWidth: 750,
  248. autoCropHeight: 424
  249. }}
  250. onUploadChange={(val: any) => {
  251. if (val) {
  252. createState.live.backgroundPicTemplate = ''
  253. }
  254. }}
  255. v-model={createState.live.backgroundPic}
  256. class={styles.imgContainer}
  257. />
  258. </Col>
  259. <Col span={24}>
  260. <p
  261. class={styles.photoTip}
  262. style={{ color: '#ff4e19', padding: '0' }}
  263. >
  264. 图片尺寸为750*424能达到最佳显示效果
  265. </p>
  266. </Col>
  267. </Row>
  268. )
  269. }}
  270. />
  271. {/* // ) : null} */}
  272. </ColField>
  273. </ColFieldGroup>
  274. <Sticky offsetBottom={0} position="bottom">
  275. <div class={['btnGroup', 'btnMore']}>
  276. <Button
  277. block
  278. round
  279. type="primary"
  280. plain
  281. onClick={() => {
  282. createState.active = 3
  283. if(!createState.live.courseGroupId){
  284. createState.live.salesStartDate = ''
  285. createState.live.salesEndDate = ''
  286. createState.live.backgroundPic = ''
  287. createState.live.backgroundPicTemplate = ''
  288. createState.live.mixStudentNum = null
  289. }
  290. }}
  291. >
  292. 上一步
  293. </Button>
  294. <Button block round type="primary" native-type="submit">
  295. 下一步
  296. </Button>
  297. </div>
  298. </Sticky>
  299. <Popup show={this.dateStatus} position="bottom" round>
  300. <DatetimePicker
  301. type="date"
  302. v-model={this.currentDate}
  303. minDate={this.minDate}
  304. maxDate={this.maxDate}
  305. formatter={formatterDate}
  306. onCancel={() => {
  307. this.dateStatus = false
  308. }}
  309. onConfirm={this.onConfirm}
  310. />
  311. </Popup>
  312. </Form>
  313. )
  314. }
  315. })