123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593 |
- import React, { Component } from 'react';
- import { Link } from 'react-router-dom';
- import './index.less';
- import { Icon } from 'antd';
- import FileUpload from '@src/components/FileUpload';
- 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';
- import Modal from '../../../components/Modal';
- import Date from '../../../components/Date';
- export default class extends Page {
- initState() {
- return {
- tab1: '1',
- 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() {
- 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}`]()}
- <Modal show className="clock-modal" title="打卡表" width={460} onClose={() => {}}>
- <div>
- <div className="d-i-b w-3">
- <div className="t-2 t-s-14">听课频率</div>
- <div className="t-4 t-s-18">2天/课时</div>
- </div>
- <div className="d-i-b w-3">
- <div className="t-2 t-s-14">作业完成度</div>
- <div className="t-4 t-s-18">50%</div>
- </div>
- </div>
- <div className="b-b m-t-1 m-b-1" />
- <div className="m-b-1">
- <div className="tag d-i-b t-s-16">
- <i style={{ background: '#6865FD' }} />
- 听课
- </div>
- <div className="tag d-i-b t-s-16">
- <i style={{ background: '#4299FF' }} />
- 预习
- </div>
- <div className="tag d-i-b t-s-16">
- <i style={{ background: '#E7E7E7' }} />
- 停课
- </div>
- </div>
- <Date
- hideInput
- disabledDate={() => false}
- dateRender={current => {
- return (
- <div className="ant-calendar-date">
- {current.get('date')}
- <i className="s1" style={{ background: '#6865FD' }} />
- <i className="s2" style={{ background: '#4299FF' }} />
- </div>
- );
- }}
- checkRefresh={(date, refresh) => {
- console.log(date);
- setTimeout(() => {
- refresh();
- }, 2000);
- return true;
- }}
- />
- <div className="t-2 t-s-12">*听课频率≤2天/课时,作业完成度≥90%,课程有效期可延长7-10天。</div>
- </Modal>
- <Modal title="恢复学习" onConfirm={() => {}} onCancel={() => {}}>
- <div className="t-2 t-s-18">恢复学习后,本课程的停课功能将无法使用。是否恢复学习?</div>
- </Modal>
- <Modal title="上传笔记" width={630} confirmText="提交" onConfirm={() => {}} onCancel={() => {}}>
- <textarea
- className="b-c-1 w-10 p-10 m-b-1"
- rows={6}
- placeholder="请输入留言内容,也可将文件拖动到这里上传。"
- />
- <div className="t-2 t-s-16 m-b-1">
- 上传文件 <FileUpload type="file" title="选择文件" />
- <span className="t-3 t-s-14">支持 docx, xls, PDF, rar, zip, PNG, JPG 等类型的文件</span>
- </div>
- <div className="b-b m-t-2" />
- </Modal>
- </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">
- <GIcon name="speed-block" noHover />
- <div className="text">
- <span>12</span>/20
- </div>
- </div>
- <div className="item">
- <GIcon name="question-block" active noHover />
- <div className="text">
- <span>12</span>/20
- </div>
- </div>
- <div className="item">
- <GIcon name="clockin-block" noHover />
- <div className="text">
- <span>12</span>/20
- </div>
- </div>
- <div className="item">
- <GIcon name="note-block" noHover />
- <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">
- <GIcon name="gift-block" active />
- <div className="text">赠送7天</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">
- <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">
- <GIcon name="speed-block" noHover />
- <div className="text">
- <span>12</span>/20
- </div>
- </div>
- <div className="item">
- <GIcon name="question-block" active noHover />
- <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">
- <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">
- <GIcon name="speed-block" noHover />
- <div className="text">
- <span>12</span>/20
- </div>
- </div>
- <div className="item">
- <GIcon name="question-block" active noHover />
- <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: '完成作业',
- };
- this.iconMap = {
- 1: 'time-icon',
- 2: 'QA-icon',
- 3: 'class-icon',
- 4: 'note-icon',
- 5: 'supplement-icon',
- 6: 'information-icon',
- 7: 'homework-icon',
- };
- }
- 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={this.iconMap[type]} 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 />;
- }
- }
- }
|