page.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. import React from 'react';
  2. import './index.less';
  3. import Assets from '@src/components/Assets';
  4. import Page from '@src/containers/Page';
  5. import { getMap } from '@src/services/Tools';
  6. import Footer from '../../../components/Footer';
  7. import { FaqModal, FinishModal } from '../../../components/OtherModal';
  8. import { CommentFalls, AnswerCarousel, Consultation, Contact } from '../../../components/Other';
  9. import Button from '../../../components/Button';
  10. import { User } from '../../../stores/user';
  11. import { Main } from '../../../stores/main';
  12. import { Course } from '../../../stores/course';
  13. import { ServiceKey, ServiceParamMap } from '../../../../Constant';
  14. import { Order } from '../../../stores/order';
  15. import Video from '../../../components/Video';
  16. export default class extends Page {
  17. initState() {
  18. return {};
  19. }
  20. initData() {
  21. Main.getCourseIndex()
  22. .then(result => {
  23. this.setState({ courseIndex: result });
  24. });
  25. Main.getBase()
  26. .then(result => {
  27. this.setState({ base: result });
  28. });
  29. Course.listPackage({ isSpecial: true, page: 1, size: 3 })
  30. .then(result => {
  31. this.setState({ packages: result.list || [] });
  32. });
  33. Main.listFaq({ page: 1, size: 100, channel: 'course-index' }).then(result => {
  34. this.setState({ faqs: result.list });
  35. });
  36. Main.listComment({ page: 1, size: 100, channel: 'course-index' }).then(result => {
  37. this.setState({ coments: result.list });
  38. });
  39. }
  40. renderView() {
  41. const { courseIndex = {}, base = {}, packages = [], faqs = [], comments = [], showFaq, faq = {}, showFinish } = this.state;
  42. return (
  43. <div>
  44. <div className="block-1">
  45. <div className="body">
  46. <Assets name="" />
  47. <div className="main-title">Waste Less, Learn More.</div>
  48. <div className="btn-list">
  49. <Button width={100} size="lager" onClick={() => linkTo('/course/online?tab=package')}>
  50. 查看套餐
  51. </Button>
  52. <Button className="t-4" width={100} theme="default" size="lager" onClick={() => linkTo('/course/online?tab=single')}>
  53. 试听课程
  54. </Button>
  55. </div>
  56. </div>
  57. </div>
  58. <div className="block-2">
  59. <div className="main-title">找到你的Style</div>
  60. <div className="video-list">
  61. <div className="video-div">
  62. <Video src={courseIndex.onlineVideo || '/1.mp4'} width={580} height={360} hideAction />
  63. <div className="name" onClick={() => linkTo('/course/online')}>在线课程 ></div>
  64. </div>
  65. <div className="video-div">
  66. <Video src={'/1.mp4'} width={580} height={360} hideAction />
  67. <div className="name" onClick={() => linkTo('/course/vs')}>1v1私教 ></div>
  68. </div>
  69. </div>
  70. <div className="class-list">
  71. {packages.map(data => {
  72. const originMoney = data.courses.reduce((a, y) => a + y.price, 0);
  73. const novice = data.courses.filter(row => row.crowd !== 'novice').length === 0;
  74. return <div className="class-item">
  75. {novice && <Assets width={55} height={52} className="new" name="noviciate" />}
  76. <div className="t-s-22 t-4 m-b-5 f-w-b"><a href={`/course/package/detail/${data.id}`}>{data.title}</a></div>
  77. <div className="t-8 m-b-1">{data.description}</div>
  78. <div className="t-1 t-s-12">包含课程</div>
  79. <div className="m-b-5">
  80. {data.courses.map((course => {
  81. return <div className="m-b-1 m-r-5 t-9 t-s-12 d-i-b b-c-2 p-5">{course.title}({course.noNumber}课时)</div>;
  82. }))}
  83. </div>
  84. <div className="t-1 t-s-12">配套服务</div>
  85. <div className="m-b-5">
  86. <div className="m-b-1 m-r-5 t-9 t-s-12 d-i-b b-c-2 p-5">预习作业</div>
  87. <div className="m-b-1 m-r-5 t-9 t-s-12 d-i-b b-c-2 p-5">课后答题</div>
  88. </div>
  89. <div className="t-1 t-s-12">赠送服务</div>
  90. <div className="m-b-2">
  91. {data.gift &&
  92. ServiceKey.map(row => {
  93. if (!data.gift[row.value]) return null;
  94. const list = ServiceParamMap[row.value];
  95. if (list) {
  96. const map = getMap(list, 'value', 'label');
  97. return <div className="m-b-1 m-r-5 t-9 t-s-12 d-i-b b-c-2 p-5">{row.label}×{map[data.gift[row.value]]}</div>;
  98. }
  99. return <div className="m-b-1 m-r-5 t-9 t-s-12 d-i-b b-c-2 p-5">{row.label}×{data.gift[row.value]}</div>;
  100. })}
  101. </div>
  102. <div className="t-8">
  103. 总价值: <span className="t-d-l-t">¥{originMoney}</span>
  104. </div>
  105. <div className="t-1 t-s-18 f-w-b m-b-1">套餐价: ¥{data.price}</div>
  106. <div className="m-b-5">
  107. <Button size="lager" onClick={() => User.needLogin().then(() => Order.addCheckout({ productType: 'course_package', productId: data.id }).then(() => linkTo('/cart')))}>立即购买</Button>
  108. </div>
  109. </div>;
  110. })}
  111. </div>
  112. </div>
  113. <Consultation data={base.contact} />
  114. <div className="block-4">
  115. <div className="main-title">You will always find the answers</div>
  116. <Assets name="" />
  117. <div className="list">
  118. <div className="item">
  119. <div className="t-1 t-s-20 m-b-2">
  120. <Assets className="m-r-5" name="self_paced" /> Self-Paced
  121. </div>
  122. <div className="t-8">随时随地学习;不限听课次数;支持停课申请。</div>
  123. </div>
  124. <div className="item">
  125. <div className="t-1 t-s-20 m-b-2">
  126. <Assets className="m-r-5" name="teacher" /> 实力导师
  127. </div>
  128. <div className="t-8">从业8年,考取700+成绩10次。</div>
  129. <div className="t-4 ">
  130. <a className="link d-i-b" href="/course/experience" target="_blank">查看成绩单 ></a>
  131. </div>
  132. </div>
  133. <div className="item">
  134. <div className="t-1 t-s-20 m-b-2">
  135. <Assets className="m-r-5" name="excitation" /> 激励机制
  136. </div>
  137. <div className="t-8">保持听课频率,赠送课程时效。</div>
  138. </div>
  139. </div>
  140. </div>
  141. <CommentFalls list={comments} />
  142. <AnswerCarousel list={faqs} onFaq={() => this.setState({ showFaq: true, faq: { channel: 'course-index' } })} />
  143. <Contact data={base.contact} />
  144. <Footer />
  145. <FaqModal show={showFaq} defaultData={faq} onCancel={() => this.setState({ showFaq: false })} onConfirm={() => this.setState({ showFaq: false, showFinish: true })} />
  146. <FinishModal
  147. show={showFinish}
  148. onConfirm={() => this.setState({ showFinish: false })}
  149. />
  150. </div >
  151. );
  152. }
  153. }