course-start.tsx 11 KB

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