1
0

index.js 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  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 More from '../More';
  7. import { Order } from '../../stores/order';
  8. import { User } from '../../stores/user';
  9. import { ServiceKey, ServiceParamMap, CrowdList } from '../../../Constant';
  10. const CrowdMap = getMap(CrowdList, 'value', 'label');
  11. export class SingleItem extends Component {
  12. constructor(props) {
  13. super(props);
  14. this.state = {};
  15. }
  16. buy() {
  17. const { data } = this.props;
  18. User.needLogin().then(() => {
  19. Order.speedPay({ productType: 'course', productId: data.id }).then(result => {
  20. User.needPay(result).then(() => {
  21. linkTo('/my/course');
  22. });
  23. });
  24. });
  25. }
  26. add() {
  27. const { data } = this.props;
  28. User.needLogin().thenn(() => {
  29. Order.addCheckout({ productType: 'course', productId: data.id }).then(() => {
  30. this.setState({ add: true });
  31. });
  32. });
  33. }
  34. render() {
  35. const { data = {}, noAction } = this.props;
  36. const { add } = this.state;
  37. return (
  38. <div className="single-item">
  39. <div className="img" onClick={() => linkTo(`/course/detail/${data.id}`)}>
  40. <div className="title">
  41. <div className="tag">{CrowdMap[data.crowd]}</div>
  42. {data.title}
  43. </div>
  44. <div className="left">
  45. <span>课时数: {data.noNumber}</span>
  46. <span>{formatSeconds(data.time)}</span>
  47. </div>
  48. <div className="right">
  49. <span>{data.trailNumber || 0}次观看</span>
  50. </div>
  51. </div>
  52. <div className="name">
  53. <span>授课老师:{data.teacher}</span>
  54. <span>优质问答: {data.askNumber}</span>
  55. <span>有效期: {data.useExpireDays}天</span>
  56. </div>
  57. <div className="money">¥ {data.price}</div>
  58. {!noAction && (
  59. <div className="action">
  60. {!data.have && (
  61. <Button radius size="lager" onClick={() => this.buy()}>
  62. 立即购买
  63. </Button>
  64. )}
  65. {data.have && (
  66. <Button
  67. className="f-r"
  68. theme="default"
  69. radius
  70. size="lager"
  71. onClick={() => linkTo(`/course/detail/${data.id}`)}
  72. >
  73. 查看课程
  74. </Button>
  75. )}
  76. {!data.have && (
  77. <Button
  78. className="f-r"
  79. theme="default"
  80. disabled={data.add || add}
  81. radius
  82. size="lager"
  83. onClick={() => this.add()}
  84. >
  85. <Assets name="add" />
  86. </Button>
  87. )}
  88. </div>
  89. )}
  90. {!noAction && data.have && <Assets className="buyed" width={75} height={75} name="Purchased" />}
  91. </div>
  92. );
  93. }
  94. }
  95. export class PackageItem extends Component {
  96. constructor(props) {
  97. super(props);
  98. this.state = {};
  99. }
  100. buy() {
  101. const { data } = this.props;
  102. User.needLogin().then(() => {
  103. Order.speedPay({ productType: 'course_package', productId: data.id }).then(result => {
  104. User.needPay(result).then(() => {
  105. linkTo('/my/course');
  106. });
  107. });
  108. });
  109. }
  110. add() {
  111. const { data } = this.props;
  112. User.needLogin().then(() => {
  113. Order.addCheckout({ productType: 'course_package', productId: data.id }).then(() => {
  114. this.setState({ add: true });
  115. });
  116. });
  117. }
  118. render() {
  119. const { data = {} } = this.props;
  120. const { add } = this.state;
  121. const originMoney = data.courses.reduce((a, y) => a + y.price, 0);
  122. const novice = data.courses.filter(row => row.crowd !== 'novice').length === 0;
  123. const teacherMap = {};
  124. data.courses.forEach(row => {
  125. teacherMap[row.teacher] = true;
  126. });
  127. const teachers = Object.keys(teacherMap);
  128. return (
  129. <div className="package-item">
  130. <div className="block m-b-1" onClick={() => linkTo(`/course/package/detail/${data.id}`)}>
  131. <div className="title t-1 m-b-5 f-w-b">
  132. <div hidden={!novice} className="tag f-w-d">
  133. 新手
  134. </div>
  135. {data.title}
  136. </div>
  137. <div className="t-1 t-s-12 m-b-5">授课老师 {teachers.join(' ')}</div>
  138. <div className="t-1 t-s-12 m-b-2">{data.description}</div>
  139. <div className="t-1 t-s-12">包含课程</div>
  140. <div className="p-t-5">
  141. {data.courses.map(course => {
  142. return (
  143. <div className="t m-b-1 t-4 m-r-5 t-s-12 d-i-b p-5">
  144. {course.title}({course.noNumber}课时)
  145. </div>
  146. );
  147. })}
  148. </div>
  149. <div className="t-1 t-s-12">配套服务</div>
  150. <div className="p-t-5">
  151. <div className="t m-b-1 t-4 m-r-5 t-s-12 d-i-b p-5">预习作业</div>
  152. <div className="t m-b-1 t-4 m-r-5 t-s-12 d-i-b p-5">课后答题</div>
  153. </div>
  154. <div className="t-1 t-s-12">赠送服务</div>
  155. <div className="p-t-5">
  156. {data.gift &&
  157. ServiceKey.map(row => {
  158. if (!data.gift[row.value]) return null;
  159. const list = ServiceParamMap[row.value];
  160. if (list) {
  161. const map = getMap(list, 'value', 'label');
  162. return (
  163. <div className="t m-b-1 t-4 m-r-5 t-s-12 d-i-b p-5">
  164. {row.label}×{map[data.gift[row.value]]}
  165. </div>
  166. );
  167. }
  168. return (
  169. <div className="t m-b-1 t-4 m-r-5 t-s-12 d-i-b p-5">
  170. {row.label}×{data.gift[row.value]}
  171. </div>
  172. );
  173. })}
  174. </div>
  175. </div>
  176. <div className="t-1 t-s-12">
  177. 原价: <span className="t-d-l-t">¥{originMoney}</span>
  178. </div>
  179. <div className="t-7 t-s-18 f-w-b m-b-1">套餐价: ¥{data.price}</div>
  180. <div className="action">
  181. <Button radius size="lager" onClick={() => this.buy()}>
  182. 立即购买
  183. </Button>
  184. <Button
  185. className="f-r"
  186. theme="default"
  187. radius
  188. size="lager"
  189. disabled={data.add || add}
  190. onClick={() => this.add()}
  191. >
  192. <Assets name="add" />
  193. </Button>
  194. </div>
  195. </div>
  196. );
  197. }
  198. }
  199. export class DataItem extends Component {
  200. constructor(props) {
  201. super(props);
  202. this.state = {};
  203. }
  204. buy() {
  205. const { data } = this.props;
  206. User.needLogin().then(() => {
  207. Order.speedPay({ productType: 'data', productId: data.id }).then(result => {
  208. User.needPay(result).then(() => {
  209. linkTo('/my/tools?tab=data');
  210. });
  211. });
  212. });
  213. }
  214. add() {
  215. const { data } = this.props;
  216. User.needLogin().then(() => {
  217. Order.addCheckout({ productType: 'data', productId: data.id }).then(() => {
  218. this.setState({ add: true });
  219. });
  220. });
  221. }
  222. render() {
  223. const { data = {} } = this.props;
  224. const { add } = this.state;
  225. return (
  226. <div className="data-item">
  227. <Assets
  228. width="309"
  229. height="264"
  230. name=""
  231. src={data.cover}
  232. onClick={() => linkTo(`/course/data/detail/${data.id}`)}
  233. />
  234. <div className="m-b-1">
  235. <span className="t-7 t-s-24 f-w-b">¥{data.price}</span>
  236. <span className="f-r t-8 t-s-20">{data.saleNumber}人</span>
  237. </div>
  238. <div className="action">
  239. {!data.have && (
  240. <Button
  241. radius
  242. size="lager"
  243. onClick={() => {
  244. this.buy();
  245. }}
  246. >
  247. 立即购买
  248. </Button>
  249. )}
  250. {data.have && (
  251. <Button className="f-r" theme="default" radius size="lager" onClick={() => openLink(data.resource)}>
  252. 查看资料
  253. </Button>
  254. )}
  255. {!data.have && (
  256. <Button
  257. className="f-r"
  258. theme="default"
  259. disabled={data.add || add}
  260. radius
  261. size="lager"
  262. onClick={() => this.add()}
  263. >
  264. <Assets name="add" />
  265. </Button>
  266. )}
  267. </div>
  268. {data.have && <Assets className="buyed" width={75} height={75} name="Purchased" />}
  269. </div>
  270. );
  271. }
  272. }
  273. export class TextbookItem extends Component {
  274. constructor(props) {
  275. super(props);
  276. this.state = {};
  277. }
  278. render() {
  279. const { data = {} } = this.props;
  280. return (
  281. <div className="textbook-item">
  282. <Assets src={data.src} className="m-b-5" />
  283. <div className="t-6 t-s-14 m-b-5">
  284. 已更新至 <span className="t-4">30</span> 题
  285. </div>
  286. <div className="t-6 t-s-12 m-b-1">
  287. 2019-08-31 09:26:13{' '}
  288. <div className="f-r">
  289. <More />
  290. </div>
  291. </div>
  292. </div>
  293. );
  294. }
  295. }