|
@@ -1,9 +1,540 @@
|
|
|
-import React from 'react';
|
|
|
+import React, { Component } from 'react';
|
|
|
+import { Link } from 'react-router-dom';
|
|
|
import './index.less';
|
|
|
+import { Icon } from 'antd';
|
|
|
import Page from '@src/containers/Page';
|
|
|
+import Assets from '@src/components/Assets';
|
|
|
+import UserLayout from '../../../layouts/User';
|
|
|
+import Button from '../../../components/Button';
|
|
|
+import ProgressText from '../../../components/ProgressText';
|
|
|
+import { Icon as GIcon } from '../../../components/Icon';
|
|
|
+import menu from '../index';
|
|
|
+import Tabs from '../../../components/Tabs';
|
|
|
+import UserTable from '../../../components/UserTable';
|
|
|
+import More from '../../../components/More';
|
|
|
|
|
|
export default class extends Page {
|
|
|
+ initState() {
|
|
|
+ return {
|
|
|
+ tab1: '2',
|
|
|
+ tab2: '1',
|
|
|
+ data: [
|
|
|
+ {
|
|
|
+ status: 'ing',
|
|
|
+ history: [{}],
|
|
|
+ list: [
|
|
|
+ { status: 'ing', type: '1' },
|
|
|
+ { status: 'not', type: '2' },
|
|
|
+ { status: 'end', type: '3' },
|
|
|
+ { status: 'not', type: '4' },
|
|
|
+ { status: 'end', type: '5' },
|
|
|
+ { status: 'not', type: '6' },
|
|
|
+ { status: 'end', type: '7' },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ status: 'not',
|
|
|
+ history: [{}],
|
|
|
+ list: [
|
|
|
+ { status: 'ing', type: '1' },
|
|
|
+ { status: 'not', type: '2' },
|
|
|
+ { status: 'end', type: '3' },
|
|
|
+ { status: 'not', type: '4' },
|
|
|
+ { status: 'end', type: '5' },
|
|
|
+ { status: 'not', type: '6' },
|
|
|
+ { status: 'end', type: '7' },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ { status: 'end', history: [{}], list: [] },
|
|
|
+ ],
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ onAction() {}
|
|
|
+
|
|
|
+ refresh(tab1, tab2) {
|
|
|
+ this.setState({ tab1, tab2 });
|
|
|
+ }
|
|
|
+
|
|
|
renderView() {
|
|
|
- return <div />;
|
|
|
+ const { config } = this.props;
|
|
|
+ return <UserLayout active={config.key} menu={menu} center={this.renderDetail()} />;
|
|
|
+ }
|
|
|
+
|
|
|
+ renderDetail() {
|
|
|
+ const { tab1, tab2 } = this.state;
|
|
|
+ return (
|
|
|
+ <div className="detail-layout">
|
|
|
+ <div className="tip">
|
|
|
+ <div className="text">理清备考思路,避开常见误区,让学习的每一分钟发光发热!</div>
|
|
|
+ <Link to="">去填写 ></Link>
|
|
|
+ <Icon type="close-circle" theme="filled" />
|
|
|
+ </div>
|
|
|
+ <Tabs
|
|
|
+ type="division"
|
|
|
+ theme="theme"
|
|
|
+ size="small"
|
|
|
+ space={2.5}
|
|
|
+ width={100}
|
|
|
+ active={tab1}
|
|
|
+ tabs={[{ key: '1', title: '在线课程' }, { key: '2', title: '1V1私教' }]}
|
|
|
+ onChange={key => this.refresh(key, tab2)}
|
|
|
+ />
|
|
|
+ <Tabs
|
|
|
+ type="tag"
|
|
|
+ theme="white"
|
|
|
+ size="small"
|
|
|
+ space={5}
|
|
|
+ width={54}
|
|
|
+ active={tab2}
|
|
|
+ tabs={[
|
|
|
+ { key: '1', title: '全部' },
|
|
|
+ { key: '2', title: '未开通' },
|
|
|
+ { key: '3', title: '学习中' },
|
|
|
+ { key: '4', title: '已结束' },
|
|
|
+ ]}
|
|
|
+ onChange={key => this.refresh(tab1, key)}
|
|
|
+ />
|
|
|
+ {this[`renderTab${tab1}`]()}
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ renderTab1() {
|
|
|
+ const { data = [] } = this.state;
|
|
|
+ return data.map(item => {
|
|
|
+ return <Course data={item} />;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ renderTab2() {
|
|
|
+ const { data = [] } = this.state;
|
|
|
+ return data.map(item => {
|
|
|
+ return <Education data={item} />;
|
|
|
+ });
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class Course extends Component {
|
|
|
+ constructor(props) {
|
|
|
+ super(props);
|
|
|
+ this.columns = [
|
|
|
+ { title: '学习内容' },
|
|
|
+ { title: '预习作业' },
|
|
|
+ { title: '进度' },
|
|
|
+ { title: '最近学习' },
|
|
|
+ { title: '笔记' },
|
|
|
+ { title: '问答' },
|
|
|
+ ];
|
|
|
+ this.state = { open: false };
|
|
|
+ }
|
|
|
+
|
|
|
+ render() {
|
|
|
+ const { data = {} } = this.props;
|
|
|
+ switch (data.status) {
|
|
|
+ case 'ing':
|
|
|
+ return this.renderIng();
|
|
|
+ case 'not':
|
|
|
+ return this.renderNot();
|
|
|
+ case 'end':
|
|
|
+ return this.renderEnd();
|
|
|
+ default:
|
|
|
+ return <div />;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ renderIng() {
|
|
|
+ const { data } = this.props;
|
|
|
+ const { history = [] } = data;
|
|
|
+ return (
|
|
|
+ <div className="course-item ing">
|
|
|
+ <div className="title">
|
|
|
+ <div className="tag">学习中</div>
|
|
|
+ <div className="text">OG20整合刷题-语法SC</div>
|
|
|
+ </div>
|
|
|
+ <div className="continue">
|
|
|
+ <Assets name="notice" />
|
|
|
+ 继续学习:课时 13:解读句子属性
|
|
|
+ </div>
|
|
|
+ <div className="detail">
|
|
|
+ <div className="left">
|
|
|
+ <Assets name="sun_blue" />
|
|
|
+ <div className="info">
|
|
|
+ <div className="t1">授课老师</div>
|
|
|
+ <div className="t2">李小小</div>
|
|
|
+ <div className="t1">有效期</div>
|
|
|
+ <div className="t2">88Day</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="right">
|
|
|
+ <div className="item">
|
|
|
+ <Assets name="logic" />
|
|
|
+ <div className="text">
|
|
|
+ <span>12</span>/20
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="item">
|
|
|
+ <Assets name="logic" />
|
|
|
+ <div className="text">
|
|
|
+ <span>12</span>/20
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="item">
|
|
|
+ <Assets name="logic" />
|
|
|
+ <div className="text">
|
|
|
+ <span>12</span>/20
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="item">
|
|
|
+ <Assets name="logic" />
|
|
|
+ <div className="text">
|
|
|
+ <span>12</span>/20
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <UserTable size="small" columns={this.columns} data={history} />
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ renderNot() {
|
|
|
+ return (
|
|
|
+ <div className="course-item not">
|
|
|
+ <div className="title">
|
|
|
+ <div className="tag">未开通</div>
|
|
|
+ <div className="text">OG20整合刷题-语法SC</div>
|
|
|
+ </div>
|
|
|
+ <div className="detail">
|
|
|
+ <div className="left">
|
|
|
+ <Assets name="sun_blue" />
|
|
|
+ <div className="info">
|
|
|
+ <div className="t1">授课老师</div>
|
|
|
+ <div className="t2">李小小</div>
|
|
|
+ <div className="t1">有效期</div>
|
|
|
+ <div className="t2">88Day</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="right t-c">
|
|
|
+ <div className="text">请于 2020-06-26 前开通</div>
|
|
|
+ <Button size="lager" radius>
|
|
|
+ 立即开通
|
|
|
+ </Button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ renderEnd() {
|
|
|
+ return (
|
|
|
+ <div className="course-item end">
|
|
|
+ <div className="title">
|
|
|
+ <div className="tag">已结束</div>
|
|
|
+ <div className="text">OG20整合刷题-语法SC</div>
|
|
|
+ </div>
|
|
|
+ <div className="detail">
|
|
|
+ <div className="left">
|
|
|
+ <Assets name="sun_blue" />
|
|
|
+ <div className="info">
|
|
|
+ <div className="t1">授课老师</div>
|
|
|
+ <div className="t2">李小小</div>
|
|
|
+ <div className="t1">有效期</div>
|
|
|
+ <div className="t2">88Day</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="right">
|
|
|
+ <div className="item">
|
|
|
+ <Assets name="logic" />
|
|
|
+ <div className="text">
|
|
|
+ <span>12</span>/20
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="item">
|
|
|
+ <Assets name="logic" />
|
|
|
+ <div className="text">
|
|
|
+ <span>12</span>/20
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="item">
|
|
|
+ <Assets name="logic" />
|
|
|
+ <div className="text">
|
|
|
+ <span>12</span>/20
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="item">
|
|
|
+ <Assets name="logic" />
|
|
|
+ <div className="text">
|
|
|
+ <span>12</span>/20
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class Education extends Component {
|
|
|
+ constructor(props) {
|
|
|
+ super(props);
|
|
|
+ this.columns = [
|
|
|
+ { title: '学习内容' },
|
|
|
+ { title: '预习作业' },
|
|
|
+ { title: '授课时间' },
|
|
|
+ { title: '课后笔记' },
|
|
|
+ { title: '课后补充' },
|
|
|
+ ];
|
|
|
+ this.state = { open: true, tab: '1' };
|
|
|
+ }
|
|
|
+
|
|
|
+ render() {
|
|
|
+ const { data = {} } = this.props;
|
|
|
+ switch (data.status) {
|
|
|
+ case 'ing':
|
|
|
+ return this.renderIng();
|
|
|
+ case 'not':
|
|
|
+ return this.renderNot();
|
|
|
+ case 'end':
|
|
|
+ return this.renderEnd();
|
|
|
+ default:
|
|
|
+ return <div />;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ renderIng() {
|
|
|
+ const { tab } = this.state;
|
|
|
+ return (
|
|
|
+ <div className="education-item ing">
|
|
|
+ <div className="title">
|
|
|
+ <div className="tag">学习中</div>
|
|
|
+ <div className="text">OG20整合刷题-语法SC</div>
|
|
|
+ <div className="right">
|
|
|
+ <More menu={[{ label: '评价', key: '1' }, { label: '停课', key: '2' }]} />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="continue">
|
|
|
+ <Assets name="notice" />
|
|
|
+ 继续学习:课时 13:解读句子属性
|
|
|
+ </div>
|
|
|
+ <div className="detail">
|
|
|
+ <div className="left">
|
|
|
+ <div className="item">
|
|
|
+ <div className="t1">授课老师</div>
|
|
|
+ <div className="t2">李小小</div>
|
|
|
+ </div>
|
|
|
+ <div className="item">
|
|
|
+ <div className="t1">有效期</div>
|
|
|
+ <div className="t2">88Day</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="right">
|
|
|
+ <div className="item">
|
|
|
+ <Assets name="logic" />
|
|
|
+ <div className="text">
|
|
|
+ <span>12</span>/20
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="item">
|
|
|
+ <Assets name="logic" />
|
|
|
+ <div className="text">
|
|
|
+ <span>12</span>/20
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <Tabs
|
|
|
+ className="t-l"
|
|
|
+ type="line"
|
|
|
+ theme="theme"
|
|
|
+ size="small"
|
|
|
+ width={80}
|
|
|
+ active={tab}
|
|
|
+ tabs={[{ key: '1', title: '在线课程' }, { key: '2', title: '1V1私教' }]}
|
|
|
+ onChange={key => this.setState({ tab: key })}
|
|
|
+ />
|
|
|
+ <div className="class-hour">
|
|
|
+ <div className="text">课时 5:解读句子属性</div>
|
|
|
+ <div className="right">
|
|
|
+ <GIcon name="prev" onClick={() => {}} />
|
|
|
+ <span>上一课时</span>
|
|
|
+ <span>下一课时</span>
|
|
|
+ <GIcon name="next" onClick={() => {}} />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ {tab === '1' ? this.renderTimeLine() : this.renderTable()}
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ renderNot() {
|
|
|
+ return (
|
|
|
+ <div className="education-item not">
|
|
|
+ <div className="title">
|
|
|
+ <div className="tag">未开通</div>
|
|
|
+ <div className="text">OG20整合刷题-语法SC</div>
|
|
|
+ </div>
|
|
|
+ <div className="detail">
|
|
|
+ <div className="left">
|
|
|
+ <Assets name="sun_blue" />
|
|
|
+ <div className="info">
|
|
|
+ <div className="t1">授课老师</div>
|
|
|
+ <div className="t2">李小小</div>
|
|
|
+ <div className="t1">有效期</div>
|
|
|
+ <div className="t2">88Day</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="right">
|
|
|
+ <div className="qr-code">
|
|
|
+ <Assets name="qrcode" />
|
|
|
+ <div className="i">
|
|
|
+ <div className="t1">请尽快与老师预约上课时间</div>
|
|
|
+ <div className="t2">请于 2019-07-25 前开通课程</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ {this.renderTimeLine()}
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ renderEnd() {
|
|
|
+ const { open } = this.state;
|
|
|
+ return (
|
|
|
+ <div className="education-item end">
|
|
|
+ <div className="title">
|
|
|
+ <div className="tag">已结课</div>
|
|
|
+ <div className="text">OG20整合刷题-语法SC</div>
|
|
|
+ </div>
|
|
|
+ <div className="detail">
|
|
|
+ <div className="left">
|
|
|
+ <div className="item">
|
|
|
+ <div className="t1">授课老师</div>
|
|
|
+ <div className="t2">李小小</div>
|
|
|
+ </div>
|
|
|
+ <div className="item">
|
|
|
+ <div className="t1">有效期</div>
|
|
|
+ <div className="t2">88Day</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="right">
|
|
|
+ <div className="item">
|
|
|
+ <Assets name="logic" />
|
|
|
+ <div className="text">
|
|
|
+ <span>12</span>/20
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="item">
|
|
|
+ <Assets name="logic" />
|
|
|
+ <div className="text">
|
|
|
+ <span>12</span>/20
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="open">
|
|
|
+ <GIcon name={open ? 'up' : 'down'} onClick={() => this.setState({ open: !open })} />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ {open && this.renderTable()}
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ renderTimeLine() {
|
|
|
+ const { data = {} } = this.props;
|
|
|
+ const { list = [] } = data;
|
|
|
+ return (
|
|
|
+ <div className="time-line">
|
|
|
+ {list.map(item => {
|
|
|
+ return <TimeLineItem data={item} />;
|
|
|
+ })}
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ renderTable() {
|
|
|
+ const { data = {} } = this.props;
|
|
|
+ const { history = [] } = data;
|
|
|
+ return <UserTable size="small" columns={this.columns} data={history} />;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class TimeLineItem extends Component {
|
|
|
+ constructor(props) {
|
|
|
+ super(props);
|
|
|
+ this.titleMap = {
|
|
|
+ 1: '预约时间',
|
|
|
+ 2: '答疑文档',
|
|
|
+ 3: '上课',
|
|
|
+ 4: '课后笔记',
|
|
|
+ 5: '课后补充',
|
|
|
+ 6: '备考信息',
|
|
|
+ 7: '完成作业',
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ onClick(key) {
|
|
|
+ const { data = {}, onClick } = this.props;
|
|
|
+ const { status } = data;
|
|
|
+ if (status === 'not') return;
|
|
|
+ if (onClick) onClick(key);
|
|
|
+ }
|
|
|
+
|
|
|
+ render() {
|
|
|
+ const { data = {} } = this.props;
|
|
|
+ const { status, type } = data;
|
|
|
+ return (
|
|
|
+ <div className={`time-line-item ${status}`}>
|
|
|
+ <div className="icon-title">
|
|
|
+ <GIcon name="star" active={status !== 'not'} noHover />
|
|
|
+ <div className="title">{this.titleMap[type]}</div>
|
|
|
+ </div>
|
|
|
+ <div className="time-line-detail">{this.renderDetail()}</div>
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ renderDetail() {
|
|
|
+ const { data = {} } = this.props;
|
|
|
+ const { type, status } = data;
|
|
|
+ switch (type) {
|
|
|
+ case '1':
|
|
|
+ return status === 'not' ? (
|
|
|
+ <span>请尽快与老师预约上课时间,扫码加微信</span>
|
|
|
+ ) : (
|
|
|
+ <span>2019-07-24 09:00 ~ 10:00</span>
|
|
|
+ );
|
|
|
+ case '2':
|
|
|
+ return <span className="link">点此上传</span>;
|
|
|
+ case '3':
|
|
|
+ return status === 'end' ? (
|
|
|
+ <span>
|
|
|
+ CCtalk 频道号 :1234567 <span className="link">CC talk使用手册</span>
|
|
|
+ </span>
|
|
|
+ ) : (
|
|
|
+ <input placeholder="请输入CCtalk用户名查看授课频道" />
|
|
|
+ );
|
|
|
+ case '4':
|
|
|
+ return <span className="link">点此上传</span>;
|
|
|
+ case '5':
|
|
|
+ return <span className="link">写留言</span>;
|
|
|
+ case '6':
|
|
|
+ return [
|
|
|
+ <div>
|
|
|
+ <span>基本情况梳理</span>
|
|
|
+ <span>2019-08-20 更新</span>
|
|
|
+ <span className="link">修改</span>
|
|
|
+ </div>,
|
|
|
+ <div>
|
|
|
+ <span>备考细节梳理</span>
|
|
|
+ <span className="link">填写</span>
|
|
|
+ </div>,
|
|
|
+ ];
|
|
|
+ case '7':
|
|
|
+ return <ProgressText progress={10} size="small" />;
|
|
|
+ default:
|
|
|
+ return <div />;
|
|
|
+ }
|
|
|
}
|
|
|
}
|