index.js 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. import React, { Component } from 'react';
  2. import './index.less';
  3. import Assets from '@src/components/Assets';
  4. import { getMap, formatSeconds } from '@src/services/Tools';
  5. import Button from '../Button';
  6. import { Order } from '../../stores/order';
  7. import { User } from '../../stores/user';
  8. import { ServiceKey, ServiceParamMap, CrowdList } from '../../../Constant';
  9. const CrowdMap = getMap(CrowdList, 'value', 'label');
  10. export class SingleItem extends Component {
  11. constructor(props) {
  12. super(props);
  13. this.state = {};
  14. }
  15. buy() {
  16. const { data } = this.props;
  17. User.needLogin().then(() => {
  18. Order.speedPay({ productType: 'course', productId: data.id })
  19. .then(result => {
  20. User.needPay(result)
  21. .then(() => {
  22. linkTo('/my/course');
  23. });
  24. });
  25. });
  26. }
  27. add() {
  28. const { data } = this.props;
  29. User.needLogin().thenn(() => {
  30. Order.addCheckout({ productType: 'course', productId: data.id })
  31. .then(() => {
  32. this.setState({ add: true });
  33. });
  34. });
  35. }
  36. render() {
  37. const { data = {}, noAction } = this.props;
  38. const { add } = this.state;
  39. return (
  40. <div className="single-item">
  41. <div className="img" onClick={() => linkTo(`/course/detail/${data.id}`)}>
  42. <div className="title">
  43. <div className="tag">{CrowdMap[data.crowd]}</div>{data.title}
  44. </div>
  45. <div className="left">
  46. <span>课时数: {data.noNumber}</span>
  47. <span>{formatSeconds(data.time)}</span>
  48. </div>
  49. <div className="right">
  50. <span>{data.trailNumber || 0}次观看</span>
  51. </div>
  52. </div>
  53. <div className="name">
  54. <span>授课老师:{data.teacher}</span>
  55. <span>优质问答: {data.askNumber}</span>
  56. <span>有效期: {data.useExpireDays}天</span>
  57. </div>
  58. <div className="money">¥ {data.price}</div>
  59. {!noAction && <div className="action">
  60. {!data.have && <Button radius size="lager" onClick={() => this.buy()}>
  61. 立即购买
  62. </Button>}
  63. {data.have && <Button className="f-r" theme="default" radius size="lager" onClick={() => linkTo(`/course/detail/${data.id}`)}>
  64. 查看课程
  65. </Button>}
  66. {!data.have && <Button className="f-r" theme="default" disabled={data.add || add} radius size="lager" onClick={() => this.add()} >
  67. <Assets name="add" />
  68. </Button>}
  69. </div>}
  70. {!noAction && data.have && <Assets className="buyed" width={75} height={75} name="Purchased" />}
  71. </div>
  72. );
  73. }
  74. }
  75. export class PackageItem extends Component {
  76. constructor(props) {
  77. super(props);
  78. this.state = {};
  79. }
  80. buy() {
  81. const { data } = this.props;
  82. User.needLogin().then(() => {
  83. Order.speedPay({ productType: 'course_package', productId: data.id })
  84. .then(result => {
  85. User.needPay(result)
  86. .then(() => {
  87. linkTo('/my/course');
  88. });
  89. });
  90. });
  91. }
  92. add() {
  93. const { data } = this.props;
  94. User.needLogin().then(() => {
  95. Order.addCheckout({ productType: 'course_package', productId: data.id })
  96. .then(() => {
  97. this.setState({ add: true });
  98. });
  99. });
  100. }
  101. render() {
  102. const { data = {} } = this.props;
  103. const { add } = this.state;
  104. const originMoney = data.courses.reduce((a, y) => a + y.price, 0);
  105. const novice = data.courses.filter(row => row.crowd !== 'novice').length === 0;
  106. const teacherMap = {};
  107. data.courses.forEach(row => {
  108. teacherMap[row.teacher] = true;
  109. });
  110. const teachers = Object.keys(teacherMap);
  111. return (
  112. <div className="package-item">
  113. <div className="block m-b-1" onClick={() => linkTo(`/course/package/detail/${data.id}`)}>
  114. <div className="title t-1 m-b-5 f-w-b">
  115. <div hidden={!novice} className="tag f-w-d">新手</div>{data.title}
  116. </div>
  117. <div className="t-1 t-s-12 m-b-5">授课老师 {teachers.join(' ')}</div>
  118. <div className="t-1 t-s-12 m-b-2">{data.description}</div>
  119. <div className="t-1 t-s-12">包含课程</div>
  120. <div className="p-t-5">
  121. {data.courses.map((course => {
  122. return <div className="t m-b-1 t-4 m-r-5 t-s-12 d-i-b p-5">{course.title}({course.noNumber}课时)</div>;
  123. }))}
  124. </div>
  125. <div className="t-1 t-s-12">配套服务</div>
  126. <div className="p-t-5">
  127. <div className="t m-b-1 t-4 m-r-5 t-s-12 d-i-b p-5">预习作业</div>
  128. <div className="t m-b-1 t-4 m-r-5 t-s-12 d-i-b p-5">课后答题</div>
  129. </div>
  130. <div className="t-1 t-s-12">赠送服务</div>
  131. <div className="p-t-5">
  132. {data.gift &&
  133. ServiceKey.map(row => {
  134. if (!data.gift[row.value]) return null;
  135. const list = ServiceParamMap[row.value];
  136. if (list) {
  137. const map = getMap(list, 'value', 'label');
  138. return <div className="t m-b-1 t-4 m-r-5 t-s-12 d-i-b p-5">{row.label}×{map[data.gift[row.value]]}</div>;
  139. }
  140. return <div className="t m-b-1 t-4 m-r-5 t-s-12 d-i-b p-5">{row.label}×{data.gift[row.value]}</div>;
  141. })}
  142. </div>
  143. </div>
  144. <div className="t-1 t-s-12">
  145. 原价: <span className="t-d-l-t">¥{originMoney}</span>
  146. </div>
  147. <div className="t-7 t-s-18 f-w-b m-b-1">套餐价: ¥{data.price}</div>
  148. <div className="action">
  149. <Button radius size="lager" onClick={() => this.buy()}>
  150. 立即购买
  151. </Button>
  152. <Button className="f-r" theme="default" radius size="lager" disabled={data.add || add} onClick={() => this.add()}>
  153. <Assets name="add" />
  154. </Button>
  155. </div>
  156. </div>
  157. );
  158. }
  159. }
  160. export class DataItem extends Component {
  161. constructor(props) {
  162. super(props);
  163. this.state = {};
  164. }
  165. buy() {
  166. const { data } = this.props;
  167. User.needLogin().then(() => {
  168. Order.speedPay({ productType: 'data', productId: data.id })
  169. .then(result => {
  170. User.needPay(result)
  171. .then(() => {
  172. linkTo('/my/tools?tab=data');
  173. });
  174. });
  175. });
  176. }
  177. add() {
  178. const { data } = this.props;
  179. User.needLogin().then(() => {
  180. Order.addCheckout({ productType: 'data', productId: data.id })
  181. .then(() => {
  182. this.setState({ add: true });
  183. });
  184. });
  185. }
  186. render() {
  187. const { data = {} } = this.props;
  188. const { add } = this.state;
  189. return (
  190. <div className="data-item">
  191. <Assets width="309" height="264" name="" src={data.cover} onClick={() => linkTo(`/course/data/detail/${data.id}`)} />
  192. <div className="m-b-1">
  193. <span className="t-7 t-s-24 f-w-b">¥{data.price}</span>
  194. <span className="f-r t-8 t-s-20">{data.saleNumber}人</span>
  195. </div>
  196. <div className="action">
  197. {!data.have && <Button radius size="lager" onClick={() => {
  198. this.buy();
  199. }}>
  200. 立即购买
  201. </Button>}
  202. {data.have && <Button className="f-r" theme="default" radius size="lager" onClick={() => openLink(data.resource)}>
  203. 查看资料
  204. </Button>}
  205. {!data.have && <Button className="f-r" theme="default" disabled={data.add || add} radius size="lager" onClick={() => this.add()}>
  206. <Assets name="add" />
  207. </Button>}
  208. </div>
  209. {data.have && <Assets className="buyed" width={75} height={75} name="Purchased" />}
  210. </div>
  211. );
  212. }
  213. }