page.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. import React from 'react';
  2. import './index.less';
  3. import { Icon, Checkbox } from 'antd';
  4. import Page from '@src/containers/Page';
  5. import { timeRange } from '@src/services/Tools';
  6. import UserLayout from '../../../layouts/User';
  7. import UserTable from '../../../components/UserTable';
  8. import UserAction from '../../../components/UserAction';
  9. import menu, { refreshQuestionType, refreshStruct } from '../index';
  10. import Tabs from '../../../components/Tabs';
  11. import Modal from '../../../components/Modal';
  12. import Select from '../../../components/Select';
  13. import GIcon from '../../../components/Icon';
  14. import { TimeRange } from '../../../../Constant';
  15. import { My } from '../../../stores/my';
  16. const columns = [
  17. { key: 'question_type', title: '题型', fixSort: true },
  18. { key: 'title', title: '题目ID', fixSort: true },
  19. { key: 'description', title: '内容' },
  20. { key: 'time', title: '耗时', sort: true },
  21. { key: 'correct', title: '错误率', sort: true },
  22. { key: 'latest_time', title: '最近做题' },
  23. {
  24. key: '',
  25. title: '',
  26. render() {
  27. return [<GIcon name="star" className="m-r-5" />, <GIcon name="note" />];
  28. },
  29. },
  30. ];
  31. const exportType = [
  32. { key: '1', title: '题目' },
  33. { key: '2', title: '官方解析' },
  34. { key: '3', title: '我的笔记' },
  35. { key: '4', title: '千行解析', auth: true },
  36. { key: '5', title: '题源联想', auth: true },
  37. { key: '6', title: '相关问答', auth: true },
  38. ];
  39. export default class extends Page {
  40. constructor(props) {
  41. props.size = 10;
  42. super(props);
  43. }
  44. initState() {
  45. return {
  46. tab: 'exercise',
  47. timerange: 'today',
  48. filterMap: {},
  49. sortMap: {},
  50. data: [{}, {}],
  51. selectList: [],
  52. allChecked: false,
  53. };
  54. }
  55. initData() {
  56. const data = Object.assign(this.state, this.state.search);
  57. data.filterMap = this.state.search;
  58. if (data.order) {
  59. data.sortMap = { [data.order]: data.direction };
  60. }
  61. if (data.timerange) {
  62. data.filterMap.timerange = data.timerange;
  63. }
  64. const [startTime, endTime] = timeRange(data.timerange);
  65. refreshQuestionType(this, data.subject, data.questionType, {
  66. all: true,
  67. needSentence: true,
  68. allSubject: true,
  69. }).then(({ questionTypes }) => {
  70. return refreshStruct(this, data.tab, data.one, data.two, {
  71. all: true,
  72. needPreview: false,
  73. needTextbook: true,
  74. }).then(({ structIds, latest, year }) => {
  75. My.listQuestionAsk(
  76. Object.assign(
  77. { module: data.tab, questionTypes, structIds, latest, year, startTime, endTime },
  78. this.state.search,
  79. {
  80. order: Object.keys(data.sortMap)
  81. .map(key => {
  82. if (key === 'title') return 'pid desc, no desc';
  83. return `${key} ${data.sortMap[key]}`;
  84. })
  85. .join(','),
  86. },
  87. ),
  88. ).then(result => {
  89. this.setState({ list: result.list, total: result.total });
  90. });
  91. });
  92. });
  93. }
  94. onTabChange(tab) {
  95. const data = { tab };
  96. this.refreshQuery(data);
  97. }
  98. onFilter(value) {
  99. this.search(value);
  100. }
  101. onSearch(value) {
  102. console.log(value);
  103. }
  104. onSort(value) {
  105. const keys = Object.keys(value);
  106. // this.search({ order: keys.length ? keys.join('|') : null, direction: keys.length ? Object.values(value).join('|') : null });
  107. const { sortMap } = this.state;
  108. const index = keys.length > 1 && sortMap[keys[0]] ? 1 : 0;
  109. this.search({ order: keys.length ? keys[index] : null, direction: keys.length ? value[keys[index]] : null });
  110. }
  111. onChangePage(page) {
  112. this.search({ page });
  113. }
  114. onAll(checked) {
  115. if (checked) {
  116. const { data = [] } = this.state;
  117. const list = [];
  118. data.forEach(item => {
  119. list.push(item.key);
  120. });
  121. this.setState({ selectList: list, allChecked: true });
  122. } else {
  123. this.setState({ selectList: [], allChecked: false });
  124. }
  125. }
  126. onAction() {}
  127. onSelect(selectList) {
  128. this.setState({ selectList });
  129. }
  130. renderView() {
  131. const { config } = this.props;
  132. return <UserLayout active={config.key} menu={menu} center={this.renderTable()} />;
  133. }
  134. renderTable() {
  135. const {
  136. tab,
  137. questionSubjectSelect,
  138. questionSubjectMap = {},
  139. oneSelect,
  140. twoSelectMap = {},
  141. filterMap = {},
  142. sortMap = {},
  143. list = [],
  144. } = this.state;
  145. const { selectList = [], allChecked, page, total } = this.state;
  146. return (
  147. <div className="table-layout">
  148. <Tabs
  149. border
  150. type="division"
  151. theme="theme"
  152. size="small"
  153. space={2.5}
  154. width={100}
  155. active={tab}
  156. tabs={[{ key: 'exercise', title: '练习' }, { key: 'examination', title: '模考' }]}
  157. onChange={key => this.onTabChange(key)}
  158. />
  159. <UserAction
  160. search
  161. selectList={[
  162. {
  163. children: [
  164. {
  165. key: 'subject',
  166. placeholder: '学科',
  167. select: questionSubjectSelect,
  168. },
  169. {
  170. placeholder: '题型',
  171. key: 'questionType',
  172. be: 'subject',
  173. selectMap: questionSubjectMap,
  174. },
  175. ],
  176. },
  177. {
  178. label: '范围',
  179. children: [
  180. {
  181. key: 'one',
  182. placeholder: '全部',
  183. select: oneSelect,
  184. },
  185. {
  186. key: 'two',
  187. be: 'one',
  188. placeholder: '全部',
  189. selectMap: twoSelectMap,
  190. },
  191. ],
  192. },
  193. {
  194. right: true,
  195. key: 'timerange',
  196. select: TimeRange,
  197. },
  198. ]}
  199. filterMap={filterMap}
  200. onFilter={value => this.onFilter(value)}
  201. onSearch={value => this.onSearch(value)}
  202. />
  203. <UserAction
  204. allCheckbox
  205. allChecked={allChecked}
  206. help
  207. btnList={[
  208. { title: '移除', key: 'remove' },
  209. { title: '组卷', key: 'group', tag: 'vip' },
  210. { title: '导出', key: 'export', tag: 'vip', disabled: true },
  211. ]}
  212. right={
  213. <div className="tip">
  214. 2019-06-03 15:30 组卷50题,做对30题。<span>移除正确题目</span>
  215. <Icon type="close-circle" theme="filled" />
  216. </div>
  217. }
  218. onAll={checked => this.onAll(checked)}
  219. onAction={key => this.onAction(key)}
  220. />
  221. <UserTable
  222. select
  223. columns={columns}
  224. sortMap={sortMap}
  225. data={list}
  226. current={page}
  227. total={total}
  228. selectList={selectList}
  229. onSelect={l => this.onSelect(l)}
  230. onSort={v => this.onSort(v)}
  231. onChange={p => this.onChangePage(p)}
  232. />
  233. {this.renderModal()}
  234. </div>
  235. );
  236. }
  237. renderModal() {
  238. return [
  239. <Modal title="操作提示" confirmText="好的,知道了" btnAlign="center" onConfirm={() => {}}>
  240. <div className="flex-layout m-b-2">
  241. <div className="flex-block">
  242. <div className="t-1 t-s-18">组卷功能</div>
  243. <div className="t-2">操作数量:10-50;</div>
  244. <div className="t-2">注意事项:可跨题型、不可跨学科。</div>
  245. </div>
  246. <div className="flex-block">
  247. <div className="t-1 t-s-18">导出功能</div>
  248. <div className="t-2">操作数量:1-100;</div>
  249. <div className="t-2">注意事项:“综合推理IR”暂时无法导出。</div>
  250. </div>
  251. </div>
  252. <div className="t-3">
  253. *您可点击
  254. <Icon type="question-circle" theme="filled" />
  255. 查阅以上信息。
  256. </div>
  257. </Modal>,
  258. <Modal title="组卷练习" confirmText="好的,知道了" btnAlign="center" onConfirm={() => {}}>
  259. <div className="t-2 t-s-18">不可同时选中语文题和数学题,请重新选择。</div>
  260. </Modal>,
  261. <Modal title="组卷练习" confirmText="开始练习" onConfirm={() => {}} onCancel={() => {}}>
  262. <div className="t-2 t-s-18">
  263. 您共选择了 <span className="t-4">50</span> 道题目,是否开始练习?
  264. </div>
  265. <div className="t-2 t-s-16">
  266. <Checkbox checked className="m-r-5" />
  267. 剔除已组卷练习 <Select
  268. theme="white"
  269. value="1"
  270. list={[{ key: '1', title: '2' }, { key: '2', title: '3' }]}
  271. />{' '}
  272. 次以上的错题
  273. </div>
  274. </Modal>,
  275. <Modal title="移出" onConfirm={() => {}} onCancel={() => {}}>
  276. <div className="t-2 t-s-18">
  277. 当前选中的 <span className="t-4">50</span> 道题即将被移出错题本,移出后无法恢复,是否继续?
  278. </div>
  279. </Modal>,
  280. <Modal title="导出" confirmText="好的,知道了" btnAlign="center" onConfirm={() => {}}>
  281. <div className="t-2 t-s-18">正在下载中,请不要关闭当前页面!</div>
  282. </Modal>,
  283. <Modal title="导出" confirmText="导出" onConfirm={() => {}} onCancel={() => {}}>
  284. <div className="t-2 t-s-18 m-b-5">
  285. 当前共选中 <span className="t-4">50</span> 道题,请确认需要导出的内容:
  286. </div>
  287. <div className="t-2 t-s-16">
  288. {exportType.map(item => {
  289. return (
  290. <div className="d-i-b m-b-5" style={{ width: 135 }}>
  291. <Checkbox checked className="m-r-5" />
  292. {item.title}
  293. </div>
  294. );
  295. })}
  296. </div>
  297. </Modal>,
  298. <Modal title="导出" confirmText="导出" onConfirm={() => {}} onCancel={() => {}}>
  299. <div className="t-2 t-s-18 m-b-5">
  300. 当前共选中 <span className="t-4">50</span> 道题,请确认需要导出的内容:
  301. </div>
  302. <div className="t-2 t-s-16 m-b-2">
  303. {exportType
  304. .filter(item => !item.auth)
  305. .map(item => {
  306. return (
  307. <div className="d-i-b m-b-2" style={{ width: 135 }}>
  308. <Checkbox checked className="m-r-5" />
  309. {item.title}
  310. </div>
  311. );
  312. })}
  313. </div>
  314. <div className="b-b m-b-2 m-t-2" />
  315. <div className="t-3 m-b-1">
  316. 以下内容需实名认证后才可导出: <a className="f-r">去认证 ></a>
  317. </div>
  318. <div className="t-2 t-s-16 m-b-2">
  319. {exportType
  320. .filter(item => item.auth)
  321. .map(item => {
  322. return (
  323. <div className="d-i-b" style={{ width: 135 }}>
  324. <Checkbox disabled className="m-r-5" />
  325. {item.title}
  326. </div>
  327. );
  328. })}
  329. </div>
  330. </Modal>,
  331. ];
  332. }
  333. }