page.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540
  1. import React, { Component } from 'react';
  2. import { Link } from 'react-router-dom';
  3. import './index.less';
  4. import { Icon } from 'antd';
  5. import Page from '@src/containers/Page';
  6. import Assets from '@src/components/Assets';
  7. import UserLayout from '../../../layouts/User';
  8. import Button from '../../../components/Button';
  9. import ProgressText from '../../../components/ProgressText';
  10. import { Icon as GIcon } from '../../../components/Icon';
  11. import menu from '../index';
  12. import Tabs from '../../../components/Tabs';
  13. import UserTable from '../../../components/UserTable';
  14. import More from '../../../components/More';
  15. export default class extends Page {
  16. initState() {
  17. return {
  18. tab1: '2',
  19. tab2: '1',
  20. data: [
  21. {
  22. status: 'ing',
  23. history: [{}],
  24. list: [
  25. { status: 'ing', type: '1' },
  26. { status: 'not', type: '2' },
  27. { status: 'end', type: '3' },
  28. { status: 'not', type: '4' },
  29. { status: 'end', type: '5' },
  30. { status: 'not', type: '6' },
  31. { status: 'end', type: '7' },
  32. ],
  33. },
  34. {
  35. status: 'not',
  36. history: [{}],
  37. list: [
  38. { status: 'ing', type: '1' },
  39. { status: 'not', type: '2' },
  40. { status: 'end', type: '3' },
  41. { status: 'not', type: '4' },
  42. { status: 'end', type: '5' },
  43. { status: 'not', type: '6' },
  44. { status: 'end', type: '7' },
  45. ],
  46. },
  47. { status: 'end', history: [{}], list: [] },
  48. ],
  49. };
  50. }
  51. onAction() {}
  52. refresh(tab1, tab2) {
  53. this.setState({ tab1, tab2 });
  54. }
  55. renderView() {
  56. const { config } = this.props;
  57. return <UserLayout active={config.key} menu={menu} center={this.renderDetail()} />;
  58. }
  59. renderDetail() {
  60. const { tab1, tab2 } = this.state;
  61. return (
  62. <div className="detail-layout">
  63. <div className="tip">
  64. <div className="text">理清备考思路,避开常见误区,让学习的每一分钟发光发热!</div>
  65. <Link to="">去填写 ></Link>
  66. <Icon type="close-circle" theme="filled" />
  67. </div>
  68. <Tabs
  69. type="division"
  70. theme="theme"
  71. size="small"
  72. space={2.5}
  73. width={100}
  74. active={tab1}
  75. tabs={[{ key: '1', title: '在线课程' }, { key: '2', title: '1V1私教' }]}
  76. onChange={key => this.refresh(key, tab2)}
  77. />
  78. <Tabs
  79. type="tag"
  80. theme="white"
  81. size="small"
  82. space={5}
  83. width={54}
  84. active={tab2}
  85. tabs={[
  86. { key: '1', title: '全部' },
  87. { key: '2', title: '未开通' },
  88. { key: '3', title: '学习中' },
  89. { key: '4', title: '已结束' },
  90. ]}
  91. onChange={key => this.refresh(tab1, key)}
  92. />
  93. {this[`renderTab${tab1}`]()}
  94. </div>
  95. );
  96. }
  97. renderTab1() {
  98. const { data = [] } = this.state;
  99. return data.map(item => {
  100. return <Course data={item} />;
  101. });
  102. }
  103. renderTab2() {
  104. const { data = [] } = this.state;
  105. return data.map(item => {
  106. return <Education data={item} />;
  107. });
  108. }
  109. }
  110. class Course extends Component {
  111. constructor(props) {
  112. super(props);
  113. this.columns = [
  114. { title: '学习内容' },
  115. { title: '预习作业' },
  116. { title: '进度' },
  117. { title: '最近学习' },
  118. { title: '笔记' },
  119. { title: '问答' },
  120. ];
  121. this.state = { open: false };
  122. }
  123. render() {
  124. const { data = {} } = this.props;
  125. switch (data.status) {
  126. case 'ing':
  127. return this.renderIng();
  128. case 'not':
  129. return this.renderNot();
  130. case 'end':
  131. return this.renderEnd();
  132. default:
  133. return <div />;
  134. }
  135. }
  136. renderIng() {
  137. const { data } = this.props;
  138. const { history = [] } = data;
  139. return (
  140. <div className="course-item ing">
  141. <div className="title">
  142. <div className="tag">学习中</div>
  143. <div className="text">OG20整合刷题-语法SC</div>
  144. </div>
  145. <div className="continue">
  146. <Assets name="notice" />
  147. 继续学习:课时 13:解读句子属性
  148. </div>
  149. <div className="detail">
  150. <div className="left">
  151. <Assets name="sun_blue" />
  152. <div className="info">
  153. <div className="t1">授课老师</div>
  154. <div className="t2">李小小</div>
  155. <div className="t1">有效期</div>
  156. <div className="t2">88Day</div>
  157. </div>
  158. </div>
  159. <div className="right">
  160. <div className="item">
  161. <Assets name="logic" />
  162. <div className="text">
  163. <span>12</span>/20
  164. </div>
  165. </div>
  166. <div className="item">
  167. <Assets name="logic" />
  168. <div className="text">
  169. <span>12</span>/20
  170. </div>
  171. </div>
  172. <div className="item">
  173. <Assets name="logic" />
  174. <div className="text">
  175. <span>12</span>/20
  176. </div>
  177. </div>
  178. <div className="item">
  179. <Assets name="logic" />
  180. <div className="text">
  181. <span>12</span>/20
  182. </div>
  183. </div>
  184. </div>
  185. </div>
  186. <UserTable size="small" columns={this.columns} data={history} />
  187. </div>
  188. );
  189. }
  190. renderNot() {
  191. return (
  192. <div className="course-item not">
  193. <div className="title">
  194. <div className="tag">未开通</div>
  195. <div className="text">OG20整合刷题-语法SC</div>
  196. </div>
  197. <div className="detail">
  198. <div className="left">
  199. <Assets name="sun_blue" />
  200. <div className="info">
  201. <div className="t1">授课老师</div>
  202. <div className="t2">李小小</div>
  203. <div className="t1">有效期</div>
  204. <div className="t2">88Day</div>
  205. </div>
  206. </div>
  207. <div className="right t-c">
  208. <div className="text">请于 2020-06-26 前开通</div>
  209. <Button size="lager" radius>
  210. 立即开通
  211. </Button>
  212. </div>
  213. </div>
  214. </div>
  215. );
  216. }
  217. renderEnd() {
  218. return (
  219. <div className="course-item end">
  220. <div className="title">
  221. <div className="tag">已结束</div>
  222. <div className="text">OG20整合刷题-语法SC</div>
  223. </div>
  224. <div className="detail">
  225. <div className="left">
  226. <Assets name="sun_blue" />
  227. <div className="info">
  228. <div className="t1">授课老师</div>
  229. <div className="t2">李小小</div>
  230. <div className="t1">有效期</div>
  231. <div className="t2">88Day</div>
  232. </div>
  233. </div>
  234. <div className="right">
  235. <div className="item">
  236. <Assets name="logic" />
  237. <div className="text">
  238. <span>12</span>/20
  239. </div>
  240. </div>
  241. <div className="item">
  242. <Assets name="logic" />
  243. <div className="text">
  244. <span>12</span>/20
  245. </div>
  246. </div>
  247. <div className="item">
  248. <Assets name="logic" />
  249. <div className="text">
  250. <span>12</span>/20
  251. </div>
  252. </div>
  253. <div className="item">
  254. <Assets name="logic" />
  255. <div className="text">
  256. <span>12</span>/20
  257. </div>
  258. </div>
  259. </div>
  260. </div>
  261. </div>
  262. );
  263. }
  264. }
  265. class Education extends Component {
  266. constructor(props) {
  267. super(props);
  268. this.columns = [
  269. { title: '学习内容' },
  270. { title: '预习作业' },
  271. { title: '授课时间' },
  272. { title: '课后笔记' },
  273. { title: '课后补充' },
  274. ];
  275. this.state = { open: true, tab: '1' };
  276. }
  277. render() {
  278. const { data = {} } = this.props;
  279. switch (data.status) {
  280. case 'ing':
  281. return this.renderIng();
  282. case 'not':
  283. return this.renderNot();
  284. case 'end':
  285. return this.renderEnd();
  286. default:
  287. return <div />;
  288. }
  289. }
  290. renderIng() {
  291. const { tab } = this.state;
  292. return (
  293. <div className="education-item ing">
  294. <div className="title">
  295. <div className="tag">学习中</div>
  296. <div className="text">OG20整合刷题-语法SC</div>
  297. <div className="right">
  298. <More menu={[{ label: '评价', key: '1' }, { label: '停课', key: '2' }]} />
  299. </div>
  300. </div>
  301. <div className="continue">
  302. <Assets name="notice" />
  303. 继续学习:课时 13:解读句子属性
  304. </div>
  305. <div className="detail">
  306. <div className="left">
  307. <div className="item">
  308. <div className="t1">授课老师</div>
  309. <div className="t2">李小小</div>
  310. </div>
  311. <div className="item">
  312. <div className="t1">有效期</div>
  313. <div className="t2">88Day</div>
  314. </div>
  315. </div>
  316. <div className="right">
  317. <div className="item">
  318. <Assets name="logic" />
  319. <div className="text">
  320. <span>12</span>/20
  321. </div>
  322. </div>
  323. <div className="item">
  324. <Assets name="logic" />
  325. <div className="text">
  326. <span>12</span>/20
  327. </div>
  328. </div>
  329. </div>
  330. </div>
  331. <Tabs
  332. className="t-l"
  333. type="line"
  334. theme="theme"
  335. size="small"
  336. width={80}
  337. active={tab}
  338. tabs={[{ key: '1', title: '在线课程' }, { key: '2', title: '1V1私教' }]}
  339. onChange={key => this.setState({ tab: key })}
  340. />
  341. <div className="class-hour">
  342. <div className="text">课时 5:解读句子属性</div>
  343. <div className="right">
  344. <GIcon name="prev" onClick={() => {}} />
  345. <span>上一课时</span>
  346. <span>下一课时</span>
  347. <GIcon name="next" onClick={() => {}} />
  348. </div>
  349. </div>
  350. {tab === '1' ? this.renderTimeLine() : this.renderTable()}
  351. </div>
  352. );
  353. }
  354. renderNot() {
  355. return (
  356. <div className="education-item not">
  357. <div className="title">
  358. <div className="tag">未开通</div>
  359. <div className="text">OG20整合刷题-语法SC</div>
  360. </div>
  361. <div className="detail">
  362. <div className="left">
  363. <Assets name="sun_blue" />
  364. <div className="info">
  365. <div className="t1">授课老师</div>
  366. <div className="t2">李小小</div>
  367. <div className="t1">有效期</div>
  368. <div className="t2">88Day</div>
  369. </div>
  370. </div>
  371. <div className="right">
  372. <div className="qr-code">
  373. <Assets name="qrcode" />
  374. <div className="i">
  375. <div className="t1">请尽快与老师预约上课时间</div>
  376. <div className="t2">请于 2019-07-25 前开通课程</div>
  377. </div>
  378. </div>
  379. </div>
  380. </div>
  381. {this.renderTimeLine()}
  382. </div>
  383. );
  384. }
  385. renderEnd() {
  386. const { open } = this.state;
  387. return (
  388. <div className="education-item end">
  389. <div className="title">
  390. <div className="tag">已结课</div>
  391. <div className="text">OG20整合刷题-语法SC</div>
  392. </div>
  393. <div className="detail">
  394. <div className="left">
  395. <div className="item">
  396. <div className="t1">授课老师</div>
  397. <div className="t2">李小小</div>
  398. </div>
  399. <div className="item">
  400. <div className="t1">有效期</div>
  401. <div className="t2">88Day</div>
  402. </div>
  403. </div>
  404. <div className="right">
  405. <div className="item">
  406. <Assets name="logic" />
  407. <div className="text">
  408. <span>12</span>/20
  409. </div>
  410. </div>
  411. <div className="item">
  412. <Assets name="logic" />
  413. <div className="text">
  414. <span>12</span>/20
  415. </div>
  416. </div>
  417. </div>
  418. <div className="open">
  419. <GIcon name={open ? 'up' : 'down'} onClick={() => this.setState({ open: !open })} />
  420. </div>
  421. </div>
  422. {open && this.renderTable()}
  423. </div>
  424. );
  425. }
  426. renderTimeLine() {
  427. const { data = {} } = this.props;
  428. const { list = [] } = data;
  429. return (
  430. <div className="time-line">
  431. {list.map(item => {
  432. return <TimeLineItem data={item} />;
  433. })}
  434. </div>
  435. );
  436. }
  437. renderTable() {
  438. const { data = {} } = this.props;
  439. const { history = [] } = data;
  440. return <UserTable size="small" columns={this.columns} data={history} />;
  441. }
  442. }
  443. class TimeLineItem extends Component {
  444. constructor(props) {
  445. super(props);
  446. this.titleMap = {
  447. 1: '预约时间',
  448. 2: '答疑文档',
  449. 3: '上课',
  450. 4: '课后笔记',
  451. 5: '课后补充',
  452. 6: '备考信息',
  453. 7: '完成作业',
  454. };
  455. }
  456. onClick(key) {
  457. const { data = {}, onClick } = this.props;
  458. const { status } = data;
  459. if (status === 'not') return;
  460. if (onClick) onClick(key);
  461. }
  462. render() {
  463. const { data = {} } = this.props;
  464. const { status, type } = data;
  465. return (
  466. <div className={`time-line-item ${status}`}>
  467. <div className="icon-title">
  468. <GIcon name="star" active={status !== 'not'} noHover />
  469. <div className="title">{this.titleMap[type]}</div>
  470. </div>
  471. <div className="time-line-detail">{this.renderDetail()}</div>
  472. </div>
  473. );
  474. }
  475. renderDetail() {
  476. const { data = {} } = this.props;
  477. const { type, status } = data;
  478. switch (type) {
  479. case '1':
  480. return status === 'not' ? (
  481. <span>请尽快与老师预约上课时间,扫码加微信</span>
  482. ) : (
  483. <span>2019-07-24 09:00 ~ 10:00</span>
  484. );
  485. case '2':
  486. return <span className="link">点此上传</span>;
  487. case '3':
  488. return status === 'end' ? (
  489. <span>
  490. CCtalk 频道号 :1234567 <span className="link">CC talk使用手册</span>
  491. </span>
  492. ) : (
  493. <input placeholder="请输入CCtalk用户名查看授课频道" />
  494. );
  495. case '4':
  496. return <span className="link">点此上传</span>;
  497. case '5':
  498. return <span className="link">写留言</span>;
  499. case '6':
  500. return [
  501. <div>
  502. <span>基本情况梳理</span>
  503. <span>2019-08-20 更新</span>
  504. <span className="link">修改</span>
  505. </div>,
  506. <div>
  507. <span>备考细节梳理</span>
  508. <span className="link">填写</span>
  509. </div>,
  510. ];
  511. case '7':
  512. return <ProgressText progress={10} size="small" />;
  513. default:
  514. return <div />;
  515. }
  516. }
  517. }