page.js 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. import React from 'react';
  2. import { Form, Input, InputNumber, Tabs, Switch, Checkbox, Row, Col, Button } from 'antd';
  3. import './index.less';
  4. import Page from '@src/containers/Page';
  5. import Block from '@src/components/Block';
  6. import Editor from '@src/components/Editor';
  7. import Select from '@src/components/Select';
  8. // import FileUpload from '@src/components/FileUpload';
  9. import { formatFormError } from '@src/services/Tools';
  10. import { asyncSMessage } from '@src/services/AsyncTools';
  11. import { SentenceOption } from '../../../../Constant';
  12. import { Preview } from '../../../stores/preview';
  13. import { Exercise } from '../../../stores/exercise';
  14. import { Sentence } from '../../../stores/sentence';
  15. import config from './index';
  16. export default class extends Page {
  17. constructor(props) {
  18. super(props);
  19. const { id } = this.params;
  20. if (id) {
  21. config.title = '编辑长难句题目';
  22. } else {
  23. config.title = '添加长难句题目';
  24. }
  25. }
  26. init() {
  27. Exercise.allStruct().then(result => {
  28. result = result.filter(row => row.level === 2).map(row => { row.title = `${row.titleZh}/${row.titleEn}`; row.value = row.id; return row; });
  29. this.setState({ exercise: result });
  30. });
  31. }
  32. initData() {
  33. const { id } = this.params;
  34. const { form } = this.props;
  35. let handler;
  36. if (id) {
  37. handler = Preview.get({ id });
  38. } else {
  39. handler = Promise.resolve({ no: 1, question: {} });
  40. }
  41. handler
  42. .then(result => {
  43. result.isPaper = !!result.isPaper;
  44. result.isTrail = !!result.isTrail;
  45. result.question.questionType = 'sentence';
  46. form.getFieldDecorator('question.answer.subject');
  47. form.getFieldDecorator('question.answer.predicate');
  48. form.getFieldDecorator('question.answer.object');
  49. form.getFieldDecorator('question.answer.options');
  50. form.getFieldDecorator('question.qxContent');
  51. form.getFieldDecorator('question.stem');
  52. form.getFieldDecorator('question.questionType');
  53. form.getFieldDecorator('question.place');
  54. form.getFieldDecorator('question.id');
  55. form.getFieldDecorator('questionId');
  56. form.getFieldDecorator('chinese');
  57. form.getFieldDecorator('title');
  58. form.getFieldDecorator('isPaper');
  59. form.getFieldDecorator('isTrail');
  60. form.getFieldDecorator('no');
  61. form.getFieldDecorator('id');
  62. form.setFieldsValue(result);
  63. this.setState({ data: result });
  64. });
  65. }
  66. submit() {
  67. const { form } = this.props;
  68. form.validateFields((err) => {
  69. if (!err) {
  70. const data = form.getFieldsValue();
  71. data.isTrail = data.isTrail ? 1 : 0;
  72. data.isPaper = data.isPaper ? 1 : 0;
  73. data.question.stem = data.quesiton.stem || '';
  74. data.question.description = data.question.stem.replace(/<[^>]+>/g, '');
  75. let handler;
  76. if (!data.id) {
  77. handler = Sentence.editQuestion(data);
  78. } else {
  79. handler = Sentence.addQuestion(data);
  80. }
  81. handler.then((result) => {
  82. asyncSMessage('保存成功');
  83. if (data.id) {
  84. linkTo(`/subject/sentence/question/${data.id}`);
  85. } else {
  86. linkTo(`/subject/sentence/question/${result.id}`);
  87. }
  88. }).catch((e) => {
  89. if (e.result) form.setFields(formatFormError(data, e.result));
  90. });
  91. }
  92. });
  93. }
  94. renderTitle() {
  95. const { id } = this.params;
  96. const { getFieldDecorator } = this.props.form;
  97. return <Block>
  98. <Form>
  99. {getFieldDecorator('id')(<input hidden />)}
  100. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='题目序号'>
  101. {getFieldDecorator('no', {
  102. rules: [
  103. { required: true, message: '请输入序号' },
  104. // {
  105. // validator: (rule, value, callback) => {
  106. // if (this.partList.indexOf(value) >= 0) callback('该part已被使用');
  107. // else callback();
  108. // callback();
  109. // },
  110. // },
  111. ],
  112. })(
  113. <InputNumber min={1} precision={0} formatter={(v) => parseInt(v, 10) || 1} />,
  114. )}
  115. </Form.Item>
  116. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='名称'>
  117. {getFieldDecorator('title', {
  118. rules: [
  119. { required: true, message: '请输入名称' },
  120. ],
  121. })(
  122. <Input placeholder='请输入' />,
  123. )}
  124. </Form.Item>
  125. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='开放试用'>
  126. {getFieldDecorator('isTrail', {
  127. valuePropName: 'checked',
  128. })(
  129. <Switch checkedChildren='on' unCheckedChildren='off' />,
  130. )}
  131. </Form.Item>
  132. {/* 不允许修改组卷逻辑 */}
  133. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='组卷题目' >
  134. {!id && getFieldDecorator('isPaper', {
  135. valuePropName: 'checked',
  136. })(
  137. <Switch checkedChildren='on' unCheckedChildren='off' />,
  138. )}
  139. </Form.Item>
  140. </Form>
  141. </Block>;
  142. }
  143. renderBase() {
  144. const { getFieldDecorator } = this.props.form;
  145. return <Block flex>
  146. <h1>题干信息</h1>
  147. <Form>
  148. {getFieldDecorator('question.id')(<input hidden />)}
  149. <Form.Item>
  150. {getFieldDecorator('question.stem', {
  151. })(
  152. <Editor placeholder='请输入内容' />,
  153. )}
  154. </Form.Item>
  155. </Form>
  156. </Block>;
  157. }
  158. renderAnswer() {
  159. const { getFieldDecorator } = this.props.form;
  160. return <Block flex>
  161. <h1>题目答案</h1>
  162. <table boarder cellSpacing className='answer'>
  163. <tr>
  164. <td>主语</td>
  165. <td>
  166. <Form.Item>
  167. {getFieldDecorator('question.answer.subject')(
  168. <Select mode='tags' maxTagCount={200} notFoundContent={null} tokenSeparators={[',', ',']} />,
  169. )}
  170. </Form.Item>
  171. </td>
  172. </tr>
  173. <tr>
  174. <td>谓语</td>
  175. <td><Form.Item>
  176. {getFieldDecorator('question.answer.predicate')(
  177. <Select mode='tags' maxTagCount={200} notFoundContent={null} tokenSeparators={[',', ',']} />,
  178. )}
  179. </Form.Item></td>
  180. </tr>
  181. <tr>
  182. <td>宾语</td>
  183. <td><Form.Item>
  184. {getFieldDecorator('question.answer.object')(
  185. <Select mode='tags' maxTagCount={200} notFoundContent={null} tokenSeparators={[',', ',']} />,
  186. )}
  187. </Form.Item></td>
  188. </tr>
  189. </table>
  190. </Block>;
  191. }
  192. renderOption() {
  193. const { getFieldDecorator } = this.props.form;
  194. return <Block flex>
  195. <h1>选项信息(长难句)</h1>
  196. <Form>
  197. <Form.Item>
  198. {getFieldDecorator('question.answer.options')(
  199. <Checkbox.Group options={SentenceOption} />,
  200. )}
  201. </Form.Item>
  202. </Form>
  203. </Block>;
  204. }
  205. renderQX() {
  206. const { getFieldDecorator } = this.props.form;
  207. return <Block flex>
  208. <Form>
  209. <Form.Item label='千行解析'>
  210. {getFieldDecorator('question.qxContent', {
  211. })(
  212. <Editor placeholder='输入内容' />,
  213. )}
  214. </Form.Item>
  215. </Form>
  216. </Block>;
  217. }
  218. renderChinese() {
  219. const { getFieldDecorator } = this.props.form;
  220. return <Block flex>
  221. <Form>
  222. <Form.Item label='中文解析'>
  223. {getFieldDecorator('chinese', {
  224. })(
  225. <Editor placeholder='输入内容' />,
  226. )}
  227. </Form.Item>
  228. </Form>
  229. </Block>;
  230. }
  231. renderTab() {
  232. return <Tabs activeKey='sentence' onChange={(tab) => {
  233. switch (tab) {
  234. case 'textbook':
  235. linkTo('/subject/textbook/question');
  236. break;
  237. case 'base':
  238. linkTo('/subject/question');
  239. break;
  240. default:
  241. }
  242. }}>
  243. <Tabs.TabPane key='base' tab='考试题型' />
  244. <Tabs.TabPane key='sentence' tab='长难句' />
  245. <Tabs.TabPane key='textbook' tab='数学机经' />
  246. </Tabs>;
  247. }
  248. renderView() {
  249. return <div flex >
  250. {this.renderTab()}
  251. {this.renderTitle()}
  252. {this.renderBase()}
  253. {this.renderAnswer()}
  254. {this.renderOption()}
  255. {this.renderQX()}
  256. {this.renderChinese()}
  257. <Row type="flex" justify="center">
  258. <Col>
  259. <Button type="primary" onClick={() => {
  260. this.submit();
  261. }}>保存</Button>
  262. </Col>
  263. </Row>
  264. </div>;
  265. }
  266. }