Pārlūkot izejas kodu

feat(server): 添加接口

Go 5 gadi atpakaļ
vecāks
revīzija
7276904f23
100 mainītis faili ar 2809 papildinājumiem un 793 dzēšanām
  1. 5 0
      front/package-lock.json
  2. 1 0
      front/package.json
  3. 4 5
      front/project/admin/routes/setting/struct/page.js
  4. 1 1
      front/project/admin/routes/subject/previewDetail/index.js
  5. 71 22
      front/project/admin/routes/subject/previewDetail/page.js
  6. 7 2
      front/project/admin/routes/subject/sentence/page.js
  7. 1 1
      front/project/admin/routes/subject/sentenceArticle/index.js
  8. 5 1
      front/project/admin/routes/subject/sentenceArticle/index.less
  9. 80 69
      front/project/admin/routes/subject/sentenceArticle/page.js
  10. 2 2
      front/project/admin/routes/subject/sentenceQuestion/page.js
  11. 2 1
      front/project/admin/stores/index.js
  12. 17 0
      front/project/admin/stores/question.js
  13. 8 0
      front/project/admin/stores/sentence.js
  14. 16 0
      front/project/admin/stores/system.js
  15. 16 0
      front/project/admin/stores/user.js
  16. 63 0
      front/src/components/DragList/index.js
  17. 7 0
      front/src/components/DragList/index.less
  18. 74 27
      front/src/components/Editor/index.js
  19. 11 12
      front/src/services/Tools.js
  20. 12 1
      server/data/src/main/java/com/qxgmat/data/constants/enums/SettingKey.java
  21. 5 2
      server/data/src/main/java/com/qxgmat/data/constants/enums/user/MessageType.java
  22. 7 0
      server/data/src/main/java/com/qxgmat/data/dao/ExerciseQuestionMapper.java
  23. 31 31
      server/data/src/main/java/com/qxgmat/data/dao/entity/ExaminationPaper.java
  24. 31 31
      server/data/src/main/java/com/qxgmat/data/dao/entity/ExercisePaper.java
  25. 168 0
      server/data/src/main/java/com/qxgmat/data/dao/entity/ExerciseQuestion.java
  26. 35 35
      server/data/src/main/java/com/qxgmat/data/dao/entity/HomeworkPreview.java
  27. 86 16
      server/data/src/main/java/com/qxgmat/data/dao/entity/Question.java
  28. 4 4
      server/data/src/main/java/com/qxgmat/data/dao/entity/QuestionNo.java
  29. 210 0
      server/data/src/main/java/com/qxgmat/data/dao/entity/Rank.java
  30. 35 0
      server/data/src/main/java/com/qxgmat/data/dao/entity/SentenceArticle.java
  31. 35 35
      server/data/src/main/java/com/qxgmat/data/dao/entity/SentenceQuestion.java
  32. 29 29
      server/data/src/main/java/com/qxgmat/data/dao/entity/TextbookPaper.java
  33. 7 7
      server/data/src/main/java/com/qxgmat/data/dao/entity/User.java
  34. 80 10
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserAsk.java
  35. 70 0
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserMessage.java
  36. 35 35
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserPaper.java
  37. 140 0
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserPay.java
  38. 89 54
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserReport.java
  39. 2 13
      server/data/src/main/java/com/qxgmat/data/dao/mapping/ExaminationPaperMapper.xml
  40. 2 13
      server/data/src/main/java/com/qxgmat/data/dao/mapping/ExercisePaperMapper.xml
  41. 19 0
      server/data/src/main/java/com/qxgmat/data/dao/mapping/ExerciseQuestionMapper.xml
  42. 3 14
      server/data/src/main/java/com/qxgmat/data/dao/mapping/HomeworkPreviewMapper.xml
  43. 6 4
      server/data/src/main/java/com/qxgmat/data/dao/mapping/QuestionMapper.xml
  44. 1 1
      server/data/src/main/java/com/qxgmat/data/dao/mapping/QuestionNoMapper.xml
  45. 12 0
      server/data/src/main/java/com/qxgmat/data/dao/mapping/RankMapper.xml
  46. 2 1
      server/data/src/main/java/com/qxgmat/data/dao/mapping/SentenceArticleMapper.xml
  47. 3 3
      server/data/src/main/java/com/qxgmat/data/dao/mapping/SentenceQuestionMapper.xml
  48. 2 13
      server/data/src/main/java/com/qxgmat/data/dao/mapping/TextbookPaperMapper.xml
  49. 4 2
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserAskMapper.xml
  50. 3 1
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserMessageMapper.xml
  51. 2 13
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserPaperMapper.xml
  52. 5 1
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserPayMapper.xml
  53. 6 15
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserReportMapper.xml
  54. 23 0
      server/data/src/main/java/com/qxgmat/data/relation/ExerciseQuestionRelationMapper.java
  55. 14 0
      server/data/src/main/java/com/qxgmat/data/relation/QuestionNoRelationMapper.java
  56. 0 14
      server/data/src/main/java/com/qxgmat/data/relation/QuestionRelationMapper.java
  57. 8 8
      server/data/src/main/java/com/qxgmat/data/relation/UserAskRelationMapper.java
  58. 8 1
      server/data/src/main/java/com/qxgmat/data/relation/UserPaperRelationMapper.java
  59. 7 4
      server/data/src/main/java/com/qxgmat/data/relation/UserReportRelationMapper.java
  60. 16 0
      server/data/src/main/java/com/qxgmat/data/relation/entity/QuestionNoRelation.java
  61. 0 4
      server/data/src/main/java/com/qxgmat/data/relation/entity/SentenceQuestionRelation.java
  62. 43 0
      server/data/src/main/java/com/qxgmat/data/relation/entity/UserHomeworkPreviewRelation.java
  63. 0 12
      server/data/src/main/java/com/qxgmat/data/relation/entity/UserPaperRelation.java
  64. 52 0
      server/data/src/main/java/com/qxgmat/data/relation/mapping/ExerciseQuestionRelationMapper.xml
  65. 17 0
      server/data/src/main/java/com/qxgmat/data/relation/mapping/QuestionNoRelationMapper.xml
  66. 0 35
      server/data/src/main/java/com/qxgmat/data/relation/mapping/QuestionRelationMapper.xml
  67. 2 2
      server/data/src/main/java/com/qxgmat/data/relation/mapping/UserAskRelationMapper.xml
  68. 19 16
      server/data/src/main/java/com/qxgmat/data/relation/mapping/UserPaperRelationMapper.xml
  69. 38 22
      server/data/src/main/java/com/qxgmat/data/relation/mapping/UserReportRelationMapper.xml
  70. 25 21
      server/data/src/main/resources/mybatis-generator.xml
  71. 2 0
      server/gateway-api/src/main/java/com/qxgmat/Application.java
  72. 1 1
      server/gateway-api/src/main/java/com/qxgmat/controller/admin/AdController.java
  73. 3 3
      server/gateway-api/src/main/java/com/qxgmat/controller/admin/AuthController.java
  74. 52 10
      server/gateway-api/src/main/java/com/qxgmat/controller/admin/ExerciseController.java
  75. 3 3
      server/gateway-api/src/main/java/com/qxgmat/controller/admin/ManagerController.java
  76. 18 4
      server/gateway-api/src/main/java/com/qxgmat/controller/admin/PreviewController.java
  77. 48 4
      server/gateway-api/src/main/java/com/qxgmat/controller/admin/QuestionController.java
  78. 13 20
      server/gateway-api/src/main/java/com/qxgmat/controller/admin/SentenceController.java
  79. 40 4
      server/gateway-api/src/main/java/com/qxgmat/controller/admin/SettingController.java
  80. 64 18
      server/gateway-api/src/main/java/com/qxgmat/controller/admin/UserAskController.java
  81. 3 3
      server/gateway-api/src/main/java/com/qxgmat/controller/admin/UserController.java
  82. 11 12
      server/gateway-api/src/main/java/com/qxgmat/controller/admin/UserPreviewController.java
  83. 13 0
      server/gateway-api/src/main/java/com/qxgmat/controller/api/AuthController.java
  84. 86 0
      server/gateway-api/src/main/java/com/qxgmat/controller/api/BaseController.java
  85. 3 0
      server/gateway-api/src/main/java/com/qxgmat/controller/api/CommonController.java
  86. 107 2
      server/gateway-api/src/main/java/com/qxgmat/controller/api/MyController.java
  87. 35 0
      server/gateway-api/src/main/java/com/qxgmat/controller/api/QuestionController.java
  88. 32 0
      server/gateway-api/src/main/java/com/qxgmat/controller/gateway/OauthController.java
  89. 38 5
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/extend/QuestionExtendDto.java
  90. 18 0
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/extend/QuestionNoExtendDto.java
  91. 56 0
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/extend/UserAskExtendDto.java
  92. 9 19
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/request/HomeworkPreviewDto.java
  93. 31 0
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/request/QuestionNoSearchDto.java
  94. 94 0
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/request/RankDto.java
  95. 20 0
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/request/UserAskDto.java
  96. 11 10
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/response/ExerciseQuestionListDto.java
  97. 102 0
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/response/HomeworkPreviewDetailDto.java
  98. 9 9
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/response/HomeworkPreviewListDto.java
  99. 43 0
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/response/SentenceQuestionListDto.java
  100. 0 0
      server/gateway-api/src/main/java/com/qxgmat/dto/admin/response/UserAskDetailDto.java

+ 5 - 0
front/package-lock.json

@@ -10781,6 +10781,11 @@
         "is-plain-obj": "1.1.0"
       }
     },
+    "sortablejs": {
+      "version": "1.10.0-rc2",
+      "resolved": "https://registry.npm.taobao.org/sortablejs/download/sortablejs-1.10.0-rc2.tgz",
+      "integrity": "sha1-o9TlWx3fvCjKNrwG7idl2FGPL28="
+    },
     "source-list-map": {
       "version": "0.1.8",
       "resolved": "http://registry.npm.taobao.org/source-list-map/download/source-list-map-0.1.8.tgz",

+ 1 - 0
front/package.json

@@ -86,6 +86,7 @@
     "redbox-react": "^1.6.0",
     "redux": "^3.6.0",
     "redux-thunk": "^2.0.0",
+    "sortablejs": "^1.10.0-rc2",
     "superagent": "^3.4.1",
     "url": "^0.11.0"
   },

+ 4 - 5
front/project/admin/routes/setting/struct/page.js

@@ -130,8 +130,7 @@ export default class extends Page {
   refreshExercise() {
     Exercise.allStruct().then(result => {
       const list = result.map(row => { row.title = `${row.titleZh}/${row.titleEn}`; return row; });
-      this.exerciseItemList[1].tree = formatTreeData([{ title: '根节点', id: 0 }].concat(list));
-
+      this.exerciseItemList[1].tree = formatTreeData([{ title: '根节点', id: 0 }].concat(list), 'id', 'title', 'parentId');
       this.setState({
         exerciseList: list,
         exerciseStruct: formatTreeData(list.map(row => {
@@ -145,7 +144,7 @@ export default class extends Page {
             });
           }}>{row.questionStatus > 0 ? [<Icon type='pause' />, <span>提问中</span>] : [<Icon type="caret-right" />, <span>提问关闭</span>]}</Button></div>;
           return row;
-        }), 'id', 'title'),
+        }), 'id', 'title', 'parentId'),
       });
     });
   }
@@ -153,8 +152,8 @@ export default class extends Page {
   refreshExamination() {
     Examination.allStruct().then(result => {
       const list = result.map(row => { row.title = `${row.titleZh}/${row.titleEn}`; return row; });
-      this.examinationItemList[1].tree = formatTreeData([{ title: '根节点', id: 0 }].concat(list));
-      this.setState({ examinationList: list, examinationStruct: formatTreeData(list, 'id', 'title') });
+      this.examinationItemList[1].tree = formatTreeData([{ title: '根节点', id: 0 }].concat(list), 'id', 'title', 'parentId');
+      this.setState({ examinationList: list, examinationStruct: formatTreeData(list, 'id', 'title', 'parentId') });
     });
   }
 

+ 1 - 1
front/project/admin/routes/subject/previewDetail/index.js

@@ -4,7 +4,7 @@ import group from '../group';
 export default {
   path: '/subject/preview/detail/:id?',
   key: 'subject-preview-detail',
-  title: '新建预习作业',
+  title: '预习作业处理',
   needLogin: true,
   module,
   group,

+ 71 - 22
front/project/admin/routes/subject/previewDetail/page.js

@@ -1,18 +1,31 @@
 import React from 'react';
-import { Form, Input, Button, Row, Col, DatePicker, List, Icon } from 'antd';
+import { Form, Input, Button, Row, Col, DatePicker, List, Icon, Typography, Avatar } from 'antd';
 import './index.less';
 import Page from '@src/containers/Page';
 import Block from '@src/components/Block';
 import Select from '@src/components/Select';
+import DragList from '@src/components/DragList';
 // import FileUpload from '@src/components/FileUpload';
-import { formatFormError, generateSearch } from '@src/services/Tools';
+import { formatFormError, generateSearch, getMap } from '@src/services/Tools';
 import { asyncSMessage } from '@src/services/AsyncTools';
 import { Preview } from '../../../stores/preview';
-import { Exercise } from '../../../stores/exercise';
 import { User } from '../../../stores/user';
+import { Question } from '../../../stores/question';
+import { Exercise } from '../../../stores/exercise';
 import config from './index';
 
 export default class extends Page {
+  constructor(props) {
+    super(props);
+    const { id } = this.params;
+
+    if (id) {
+      config.title = '编辑预习作业';
+    } else {
+      config.title = '添加预习作业';
+    }
+  }
+
   init() {
     Exercise.allStruct().then(result => {
       result = result.filter(row => row.level === 2).map(row => { row.title = `${row.titleZh}/${row.titleEn}`; row.value = row.id; return row; });
@@ -25,14 +38,14 @@ export default class extends Page {
     const { form } = this.props;
     let handler;
     if (id) {
-      config.title = '编辑预习作业';
       handler = Preview.get({ id });
     } else {
-      config.title = '添加预习作业';
-      handler = Promise.resolve({});
+      handler = Promise.resolve({ questionNos: [] });
     }
     handler
       .then(result => {
+        const { questionNos } = result;
+        result.questionNos = result.questionNos.map(row => row.no);
         form.setFieldsValue(result);
         generateSearch('userIds', { mode: 'multiple' }, this, (search) => {
           return User.list(search);
@@ -42,15 +55,33 @@ export default class extends Page {
             value: row.id,
           };
         }, result.userIds || [], null);
+        this.setState({ questionNos });
       });
   }
 
+  deleteQuestion(index) {
+    const { questionNos } = this.state;
+    questionNos.splice(index, 1);
+    this.setState({ questionNos });
+    this.props.form.setFieldsValue({ questionNos: questionNos.map(row => row.no) });
+  }
+
+  orderQuestion(oldIndex, newIndex) {
+    const { questionNos } = this.state;
+    const tmp = questionNos[oldIndex];
+    questionNos[oldIndex] = questionNos[newIndex];
+    questionNos[newIndex] = tmp;
+    this.setState({ questionNos });
+    this.props.form.setFieldsValue({ questionNos: questionNos.map(row => row.no) });
+  }
+
   submit() {
     const { form } = this.props;
     form.validateFields((err) => {
       if (!err) {
         const data = form.getFieldsValue();
         let handler;
+        data.questionNoIds = this.state.questionNos.map(row => row.id);
         if (data.id) {
           handler = Preview.add(data);
         } else {
@@ -66,7 +97,17 @@ export default class extends Page {
   }
 
   searchQuestion(values) {
-    console.log(values);
+    if (values.length === 0) {
+      this.setState({ questionNos: [] });
+      return;
+    }
+    // 查找练习题目
+    Question.listNo({ no: values, module: 'exercise' }).then(result => {
+      const map = getMap(result, 'no');
+      const questionNos = values.map(no => map[no]).filter(row => row);
+      this.setState({ questionNos });
+      this.props.form.setFieldsValue({ questionNos: questionNos.map(row => row.no) });
+    });
   }
 
   renderBase() {
@@ -111,12 +152,12 @@ export default class extends Page {
           )}
         </Form.Item>
         <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='选择作业题'>
-          {getFieldDecorator('questionIds', {
+          {getFieldDecorator('questionNos', {
             rules: [
               { required: true, message: '请选择作业题' },
             ],
           })(
-            <Select select={[]} mode='tags' maxTagCount={200} notFoundContent={null} placeholder='输入题目id, 逗号分隔' tokenSeparators={[',', ',']} onSelect={(values) => {
+            <Select mode='tags' maxTagCount={200} notFoundContent={null} placeholder='输入题目id, 逗号分隔' tokenSeparators={[',', ',']} onChange={(values) => {
               this.searchQuestion(values);
             }} />,
           )}
@@ -126,19 +167,27 @@ export default class extends Page {
   }
 
   renderQuestionList() {
-    return <List
-      header={<h1>题目预览</h1>}
-      loading={this.props.core.loading}
-      itemLayout="horizontal"
-      dataSource={this.state.questionList || [{}]}
-      renderItem={item => (
-        <List.Item actions={[<Button type='link' onClick={() => {
-          console.log(item);
-        }}><Icon type='delete' /></Button>, <a>more</a>]}>
-          123123
-        </List.Item>
-      )}
-    />;
+    return <Block>
+      <h1>题目预览</h1>
+      <DragList
+        loading={this.props.core.loading}
+        dataSource={this.state.questionNos || []}
+        handle={'.icon'}
+        onMove={(oldIndex, newIndex) => {
+          this.orderQuestion(oldIndex, newIndex);
+        }}
+        renderItem={(item, index) => (
+          <List.Item actions={[<Icon type='delete' onClick={() => {
+            this.deleteQuestion(index);
+          }} />, <Icon type='bars' className='icon' />]}>
+            <List.Item.Meta
+              avatar={<Avatar alt={index + 1} size='small' >{index + 1}</Avatar>}
+              title={item.no}
+              description={<Typography.Text ellipsis disabled>{item.stem}</Typography.Text>}
+            />
+          </List.Item>
+        )}
+      /></Block>;
   }
 
   renderView() {

+ 7 - 2
front/project/admin/routes/subject/sentence/page.js

@@ -70,8 +70,7 @@ export default class extends Page {
       render: (text, record) => {
         const item = this.structMap[this.state.search.chapter];
         return <div className="table-button">
-          {item.exercise && (<Link to={`/sentence/question/${record.id}`}>编辑</Link>)}
-          {!item.exercise && (<Link to={`/sentence/article/${record.id}`}>编辑</Link>)}
+          {item.exercise > 0 ? (<Link to={`/subject/sentence/question/${record.id}`}>编辑</Link>) : (<Link to={`/subject/sentence/article/${record.id}`}>编辑</Link>)}
         </div>;
       },
     }];
@@ -111,6 +110,8 @@ export default class extends Page {
   init() {
     Sentence.getStruct().then(result => {
       return this.refreshStruct(result);
+    }).then(() => {
+      this.initData();
     });
   }
 
@@ -119,6 +120,10 @@ export default class extends Page {
     if (!item) return;
     if (item.exercise) {
       Sentence.listQuestion(this.state.search).then(result => {
+        result.list = result.list.map(row => {
+          row.chapter = this.state.search.chapter || 0;
+          return row;
+        });
         this.setTableData(result.list, result.total);
       });
     } else {

+ 1 - 1
front/project/admin/routes/subject/sentenceArticle/index.js

@@ -4,7 +4,7 @@ import group from '../group';
 export default {
   path: '/subject/sentence/article/:id?',
   key: 'subject-sentence-article',
-  title: '新建长难句文章',
+  title: '文章处理',
   needLogin: true,
   module,
   group,

+ 5 - 1
front/project/admin/routes/subject/sentenceArticle/index.less

@@ -1,3 +1,7 @@
 @charset "utf-8";
 
-#subject-sentence-article {}
+#subject-sentence-article {
+  .ql-editor {
+    height: 200px;
+  }
+}

+ 80 - 69
front/project/admin/routes/subject/sentenceArticle/page.js

@@ -1,22 +1,52 @@
 import React from 'react';
-import { Form, Input, Button, Row, Col, DatePicker, List, Icon } from 'antd';
+import { Form, Input, Button, Row, Col, InputNumber, Switch } from 'antd';
 import './index.less';
+import Editor from '@src/components/Editor';
 import Page from '@src/containers/Page';
 import Block from '@src/components/Block';
 import Select from '@src/components/Select';
 // import FileUpload from '@src/components/FileUpload';
-import { formatFormError, generateSearch } from '@src/services/Tools';
+import { formatFormError, getMap } from '@src/services/Tools';
 import { asyncSMessage } from '@src/services/AsyncTools';
-import { Preview } from '../../../stores/preview';
-import { Exercise } from '../../../stores/exercise';
-import { User } from '../../../stores/user';
+import { Sentence } from '../../../stores/sentence';
 import config from './index';
 
 export default class extends Page {
+  constructor(props) {
+    super(props);
+    this.structMap = {};
+    this.partList = [];
+
+    const { id } = this.params;
+
+    if (id) {
+      config.title = '编辑长难句文章';
+    } else {
+      config.title = '添加长难句文章';
+    }
+  }
+
   init() {
-    Exercise.allStruct().then(result => {
-      result = result.filter(row => row.level === 2).map(row => { row.title = `${row.titleZh}/${row.titleEn}`; row.value = row.id; return row; });
-      this.setState({ exercise: result });
+    Sentence.getStruct().then(result => {
+      return this.refreshStruct(result);
+    });
+  }
+
+  refreshStruct(result) {
+    result = result || {};
+    result.chapters = result.chapters || [];
+    const chapters = result.chapters.map((row, index) => { row.value = index + 1; return row; }).filter(row => !row.exercise);
+    this.structMap = getMap(chapters, 'value');
+    this.setState({ struct: result, chapters });
+  }
+
+  refreshPart(chapter) {
+    const { id } = this.params;
+    Sentence.listArticle({ chapter }).then(result => {
+      this.partList = result.list.map(row => row.part);
+      if (id) {
+        this.partList = this.partList.filter(row => row !== this.data.part);
+      }
     });
   }
 
@@ -25,23 +55,14 @@ export default class extends Page {
     const { form } = this.props;
     let handler;
     if (id) {
-      config.title = '编辑预习作业';
-      handler = Preview.get({ id });
+      handler = Sentence.getArticle({ id });
     } else {
-      config.title = '添加预习作业';
-      handler = Promise.resolve({});
+      handler = Promise.resolve({ part: 1 });
     }
     handler
       .then(result => {
+        this.data = result;
         form.setFieldsValue(result);
-        generateSearch('userIds', { mode: 'multiple' }, this, (search) => {
-          return User.list(search);
-        }, (row) => {
-          return {
-            title: `${row.nickname}(${row.mobile})`,
-            value: row.id,
-          };
-        }, result.userIds || [], null);
       });
   }
 
@@ -50,14 +71,16 @@ export default class extends Page {
     form.validateFields((err) => {
       if (!err) {
         const data = form.getFieldsValue();
+        data.isTrail = data.isTrail ? 1 : 0;
         let handler;
         if (data.id) {
-          handler = Preview.add(data);
+          handler = Sentence.editArticle(data);
         } else {
-          handler = Preview.edit(data);
+          handler = Sentence.addArticle(data);
         }
         handler.then(() => {
           asyncSMessage('保存成功');
+          goBack();
         }).catch((e) => {
           if (e.result) form.setFields(formatFormError(data, e.result));
         });
@@ -65,87 +88,75 @@ export default class extends Page {
     });
   }
 
-  searchQuestion(values) {
-    console.log(values);
-  }
-
   renderBase() {
     const { getFieldDecorator } = this.props.form;
     return <Block>
       <Form>
         {getFieldDecorator('id')(<input hidden />)}
-        <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='选择课程'>
-          {getFieldDecorator('category', {
+        <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='Chapter'>
+          {getFieldDecorator('chapter', {
             rules: [
-              { required: true, message: '请选择课程' },
+              { required: true, message: '请选择章节' },
             ],
           })(
-            <Select select={this.state.exercise} placeholder='请选择课程' />,
+            <Select select={this.state.chapters} placeholder='请选择章节' onChange={(v) => {
+              this.refreshPart(v);
+            }} />,
           )}
         </Form.Item>
-        <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='起止时间'>
-          {getFieldDecorator('time', {
+        <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='Part'>
+          {getFieldDecorator('part', {
             rules: [
-              { required: true, message: '请输入起止时间' },
+              { required: true, message: '请输入Part' },
+              {
+                validator: (rule, value, callback) => {
+                  if (this.partList.indexOf(value) >= 0) callback('该part已被使用');
+                  else callback();
+                },
+              },
             ],
           })(
-            <DatePicker.RangePicker />,
+            <InputNumber min={1} precision={0} formatter={(v) => parseInt(v, 10) || 1} />,
           )}
         </Form.Item>
-        <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='作业标题'>
+        <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='名称'>
           {getFieldDecorator('title', {
             rules: [
-              { required: true, message: '请输入作业标题' },
+              { required: true, message: '请输入名称' },
             ],
           })(
-            <Input placeholder='请输入作业标题' />,
+            <Input placeholder='请输入名称' />,
           )}
         </Form.Item>
-        <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='指定做题人'>
-          {getFieldDecorator('userIds', {
-            rules: [
-              { required: true, message: '请指定做题人' },
-            ],
+        <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='开放试用'>
+          {getFieldDecorator('isTrail', {
+            valuePropName: 'checked',
           })(
-            <Select {...this.state.userIds} placeholder='请指定做题人' />,
+            <Switch checkedChildren='on' unCheckedChildren='off' />,
           )}
         </Form.Item>
-        <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='选择作业题'>
-          {getFieldDecorator('questionIds', {
-            rules: [
-              { required: true, message: '请选择作业题' },
-            ],
+      </Form>
+    </Block>;
+  }
+
+  renderContent() {
+    const { getFieldDecorator } = this.props.form;
+    return <Block flex>
+      <Form>
+        <Form.Item label='文章录入'>
+          {getFieldDecorator('content', {
           })(
-            <Select select={[]} mode='tags' maxTagCount={200} notFoundContent={null} placeholder='输入题目id, 逗号分隔' tokenSeparators={[',', ',']} onSelect={(values) => {
-              this.searchQuestion(values);
-            }} />,
+            <Editor placeholder='输入内容' />,
           )}
         </Form.Item>
       </Form>
     </Block>;
   }
 
-  renderQuestionList() {
-    return <List
-      header={<h1>题目预览</h1>}
-      loading={this.props.core.loading}
-      itemLayout="horizontal"
-      dataSource={this.state.questionList || [{}]}
-      renderItem={item => (
-        <List.Item actions={[<Button type='link' onClick={() => {
-          console.log(item);
-        }}><Icon type='delete' /></Button>, <a>more</a>]}>
-          123123
-        </List.Item>
-      )}
-    />;
-  }
-
   renderView() {
     return <Block flex>
       {this.renderBase()}
-      {this.renderQuestionList()}
-
+      {this.renderContent()}
       <Row type="flex" justify="center">
         <Col>
           <Button type="primary" onClick={() => {

+ 2 - 2
front/project/admin/routes/subject/sentenceQuestion/page.js

@@ -52,9 +52,9 @@ export default class extends Page {
         const data = form.getFieldsValue();
         let handler;
         if (data.id) {
-          handler = Preview.add(data);
-        } else {
           handler = Preview.edit(data);
+        } else {
+          handler = Preview.add(data);
         }
         handler.then(() => {
           asyncSMessage('保存成功');

+ 2 - 1
front/project/admin/stores/index.js

@@ -4,5 +4,6 @@ import { Exercise } from './exercise';
 import { Preview } from './preview';
 import { User } from './user';
 import { Sentence } from './sentence';
+import { Question } from './question';
 
-export default [System, Examination, Exercise, Preview, User, Sentence];
+export default [System, Examination, Exercise, Preview, User, Sentence, Question];

+ 17 - 0
front/project/admin/stores/question.js

@@ -0,0 +1,17 @@
+import BaseStore from '@src/stores/base';
+
+export default class QuestionStore extends BaseStore {
+  searchNo(params) {
+    return this.apiGet('/question/search/no', params);
+  }
+
+  searchStem(params) {
+    return this.apiGet('/question/search/stem', params);
+  }
+
+  listNo(params) {
+    return this.apiPost('/question/list/no', params);
+  }
+}
+
+export const Question = new QuestionStore({ key: 'question' });

+ 8 - 0
front/project/admin/stores/sentence.js

@@ -13,6 +13,10 @@ export default class SentenceStore extends BaseStore {
     return this.apiGet('/sentence/article/list', params);
   }
 
+  getArticle(params) {
+    return this.apiGet('/sentence/article/detail', params);
+  }
+
   addArticle(params) {
     return this.apiPost('/sentence/article/add', params);
   }
@@ -29,6 +33,10 @@ export default class SentenceStore extends BaseStore {
     return this.apiGet('/sentence/question/list', params);
   }
 
+  getQuestion(params) {
+    return this.apiGet('/sentence/question/detail', params);
+  }
+
   addQuestion(params) {
     return this.apiPost('/sentence/question/add', params);
   }

+ 16 - 0
front/project/admin/stores/system.js

@@ -77,6 +77,22 @@ export default class SystemStore extends BaseStore {
     return this.apiPut('/setting/tips', params);
   }
 
+  listRank(params) {
+    return this.apiGet('/rank/list', params);
+  }
+
+  addRank(params) {
+    return this.apiPost('/rank/add', params);
+  }
+
+  editRank(params) {
+    return this.apiPut('/rank/edit', params);
+  }
+
+  delRank(params) {
+    return this.apiDel('/rank/delete', params);
+  }
+
   uploadImage(file) {
     return this.apiForm('/common/upload/image', { file });
   }

+ 16 - 0
front/project/admin/stores/user.js

@@ -20,6 +20,22 @@ export default class UserStore extends BaseStore {
   del(params) {
     return this.apiDel('/user/delete', params);
   }
+
+  listAsk(params) {
+    return this.apiGet('/user/ask/list', params);
+  }
+
+  editAsk(params) {
+    return this.apiPut('/user/ask/edit', params);
+  }
+
+  detailAsk(params) {
+    return this.apiGet('/user/ask/detail', params);
+  }
+
+  listPreview(params) {
+    return this.apiGet('/user/preview/list', params);
+  }
 }
 
 export const User = new UserStore({ key: 'users' });

+ 63 - 0
front/src/components/DragList/index.js

@@ -0,0 +1,63 @@
+import React from 'react';
+import { Spin } from 'antd';
+import Sortable from 'sortablejs';
+import './index.less';
+import { uuid } from '../../services/Tools';
+
+export default class DragSortingTable extends React.Component {
+  // sortableContainersDecorator = (componentBackingInstance) => {
+  //   // check if backing instance not null
+  //   if (componentBackingInstance) {
+  //     const options = {
+  //       handle: '.group-title-proxy', // Restricts sort start click/touch to the specified element
+  //     };
+  //     Sortable.create(componentBackingInstance, options);
+  //   }
+  // }
+
+  sortableDecorator(componentBackingInstance) {
+    // check if backing instance not null
+    if (componentBackingInstance) {
+      const options = Object.assign({
+        // draggable: 'div.drag', // Specifies which items inside the element should be sortable
+        handle: this.props.handle || '.drag', // this.props.handle, // Restricts sort start click/touch to the specified element
+        group: this.props.group || uuid(),
+        ghostClass: 'ghost',
+        onEnd: (event) => {
+          this.props.onMove(event.oldIndex, event.newIndex);
+        },
+      }, this.props.sortable || {});
+      Sortable.create(componentBackingInstance, options);
+    }
+  }
+
+  // sortableCategoryDecorator = (componentBackingInstance) => {
+  //   if (componentBackingInstance) {
+  //     const options = {
+  //       // draggable: 'div', // Specifies which items inside the element should be sortable
+  //       handle: '.cross_hair', // Restricts sort start click/touch to the specified element
+  //       group: 'category',
+  //       chosenClass: 'dangefeilei_choose',
+  //       onEnd: (event) => {
+  //         const id = event.item.getAttribute('data-id');
+  //         this.moveCategory(id, event.newIndex + 1);
+  //       },
+  //     };
+  //     Sortable.create(componentBackingInstance, options);
+  //   }
+  // }
+
+  render() {
+    return (
+      <Spin spinning={this.props.loading}>
+        <div className='drag-container'
+          ref={(ref) => {
+            if (ref) this.sortableDecorator(ref);
+          }}>
+          {this.props.dataSource.map((item, index) => {
+            return <div className='drag'>{this.props.renderItem(item, index)}</div>;
+          })}
+        </div></Spin>
+    );
+  }
+}

+ 7 - 0
front/src/components/DragList/index.less

@@ -0,0 +1,7 @@
+@charset "utf-8";
+@import '../../style/core';
+
+.ghost {
+  opacity: 0.4;
+  border: 2px dashed darkturquoise;
+}

+ 74 - 27
front/src/components/Editor/index.js

@@ -1,22 +1,91 @@
 import React from 'react';
 import ReactQuill from 'react-quill';
 import 'react-quill/dist/quill.snow.css';
+import { uuid } from '../../services/Tools';
 
 class Editor extends React.Component {
   constructor(props) {
     super(props);
     this.state = { theme: 'snow' };
+    this.modules = {
+      toolbar: {
+        container: [
+          [{ header: '1' }, { header: '2' }],
+          [
+            'bold',
+            'underline',
+            'blockquote',
+            // { color: ['red', 'green', 'blue', 'orange', 'violet', '#d0d1d2', 'black'] },
+          ],
+          [{ list: 'ordered' }, { list: 'bullet' }, { indent: '-1' }, { indent: '+1' }],
+          // ['image'],
+          // ['link', 'video'],
+          // ['clean'],
+        ],
+        handlers: {
+          image: () => {
+            const self = this;
+            this.container = this.quillRef.editingArea;
+            const quill = this.quillRef.getEditor();
+            let fileInput = this.container.querySelector('input.ql-image[type=file]'); // fileInput
+
+            if (fileInput == null) {
+              fileInput = document.createElement('input');
+              fileInput.setAttribute('type', 'file');
+              fileInput.setAttribute('accept', 'image/png, image/gif, image/jpeg, image/bmp, image/x-icon');
+              fileInput.classList.add('ql-image');
+              fileInput.addEventListener('change', () => {
+                if (fileInput.files != null && fileInput.files[0] != null) {
+                  // getSelection 选择当前光标位置咯 然后在下一个range.index用它自带的embed媒介插入方式插入你已经存储在阿里上的图片了
+                  const range = quill.getSelection(true);
+                  const file = fileInput.files[0];
+                  const suffix = file.name.substring(file.name.lastIndexOf('.')).toLowerCase();
+                  const name = uuid();
+                  self.props
+                    .onUpload(file, self.props.path, self.progress, `${self.props.path}/${name}${suffix}`)
+                    .then(data => {
+                      self.setState({ uploading: false, load: self.state.load + 1 });
+                      quill.insertEmbed(range.index, 'image', data.url);
+                      quill.setSelection(range.index + 1);
+                    })
+                    .catch(err => {
+                      self.setState({ uploading: false, load: self.state.load + 1 });
+                      if (self.props.onError) self.props.onError(err);
+                    });
+                }
+              });
+            }
+            fileInput.click();
+          },
+        },
+      },
+      clipboard: {
+        // toggle to add extra line breaks when pasting HTML:
+        matchVisual: false,
+      },
+    };
+  }
+
+  progress(data) {
+    return done => {
+      if (this.props.onProgress) this.props.onProgress(data);
+      done();
+    };
   }
 
   render() {
     return (
       <div>
         <ReactQuill
+          ref={el => {
+            this.quillRef = el;
+          }}
+          defaultValue={this.props.value}
           style={this.props.style}
           theme={'snow'}
-          onChange={this.props.onChange}
-          value={this.props.value}
-          modules={Editor.modules}
+          onChange={(content, delta, source, editor) => this.props.onChange && this.props.onChange(content, delta, source, editor)}
+          // value={new Delta(this.props.value)}
+          modules={this.modules}
           formats={Editor.formats}
           placeholder={this.props.placeholder}
         />
@@ -25,28 +94,6 @@ class Editor extends React.Component {
   }
 }
 
-Editor.modules = {
-  toolbar: [
-    [{ header: '1' }, { header: '2' }, { font: [] }],
-    [{ size: [] }],
-    [
-      'bold',
-      'italic',
-      'underline',
-      'strike',
-      'blockquote',
-      { color: ['red', 'green', 'blue', 'orange', 'violet', '#d0d1d2', 'black'] },
-    ],
-    [{ list: 'ordered' }, { list: 'bullet' }, { indent: '-1' }, { indent: '+1' }],
-    ['link', 'image', 'video'],
-    ['clean'],
-  ],
-  clipboard: {
-    // toggle to add extra line breaks when pasting HTML:
-    matchVisual: false,
-  },
-};
-
 Editor.formats = [
   'header',
   'font',
@@ -61,8 +108,8 @@ Editor.formats = [
   'bullet',
   'indent',
   'link',
-  'image',
-  'video',
+  // 'image',
+  // 'video',
 ];
 
 export default Editor;

+ 11 - 12
front/src/services/Tools.js

@@ -254,7 +254,7 @@ export function formatPercent(child, mother) {
 }
 
 export function formatTreeData(list, key = 'id', title = 'title', index = 'parent_id') {
-  const map = getMap(list, 'id');
+  const map = getMap(list, key);
   const result = [];
   list.forEach(row => {
     row.children = [];
@@ -368,6 +368,12 @@ export function bindSearch(targetList, field, Component, listFunc, render, def,
 export function generateSearch(field, prop, Component, listFunc, render, def, notFound) {
   const key = `lastFetchId${field}`;
   if (!Component[key]) Component[key] = 0;
+  let item = {
+    showSearch: true,
+    showArrow: true,
+    filterOption: false,
+    notFoundContent: notFound,
+  };
   const searchFunc = (data) => {
     Component[key] += 1;
     const fetchId = Component[key];
@@ -377,23 +383,16 @@ export function generateSearch(field, prop, Component, listFunc, render, def, no
         // for fetch callback order
         return;
       }
-      const item = Component.state[field];
       item.select = result.list.map(row => {
         return render(row);
       });
-      Component.setState({ [field]: item, fetching: false });
+      Component.setState({ [field]: prop, fetching: false });
     });
   };
-  const item = {
-    showSearch: true,
-    showArrow: true,
-    filterOption: false,
-    onSearch: keyword => {
-      searchFunc({ page: 1, number: 5, keyword });
-    },
-    notFoundContent: notFound,
+  item.onSearch = (keyword) => {
+    searchFunc({ page: 1, number: 5, keyword });
   };
-  prop = Object.assign(prop || {}, item);
+  item = Object.assign(prop || {}, item);
   if (def) {
     searchFunc({ ids: def, page: 1, number: def.length });
   } else {

+ 12 - 1
server/data/src/main/java/com/qxgmat/data/constants/enums/SettingKey.java

@@ -4,7 +4,18 @@ package com.qxgmat.data.constants.enums;
  * Created by gaojie on 2017/11/19.
  */
 public enum SettingKey {
-    INDEX("index"), SENTENCE("sentence"), PLACE("place"), EXERCISE_TIME("exercise_time"), EXAMINATION_TIME("examination_time"), FILTER_TIME("filter_time"), EXERCISE_PAPER("exercise_paper"), PREPARE_INFO("prepare_info"), TIPS("tips");
+    INDEX("index"), // 首页设置
+    SENTENCE("sentence"), // 长难句目录
+    PLACE("place"), // 难点设置
+    EXERCISE_TIME("exercise_time"), // 练习题目时间
+    EXAMINATION_TIME("examination_time"), // 考试时间
+    FILTER_TIME("filter_time"), // 题目剔除时间
+    EXERCISE_PAPER_AUTO("exercise_paper_auto"), // 自动组卷设置
+    EXERCISE_PAPER_STATUS("exercise_paper_status"), // 练习自动组卷状态:process进度,finish时间
+    PREPARE_INFO("prepare_info"), // 备考统计信息
+
+    TIPS("tips"); // 页面提示信息
+
     final static public String message = "设置key";
 
     public String key;

+ 5 - 2
server/data/src/main/java/com/qxgmat/data/constants/enums/user/MessageType.java

@@ -4,8 +4,11 @@ package com.qxgmat.data.constants.enums.user;
  * Created by gaojie on 2017/11/20.
  */
 public enum MessageType {
-    INVITED_PLAN("PayService", "购买服务");
-    final static public String message = "类型: ";
+    PAY("pay", "购买"),
+    CHANGE("change", "换库"),
+    CLASS("class", "课程"),
+    OTHER("other", "其他");
+    final static public String message = "消息类型";
 
 
     public String type;

+ 7 - 0
server/data/src/main/java/com/qxgmat/data/dao/ExerciseQuestionMapper.java

@@ -0,0 +1,7 @@
+package com.qxgmat.data.dao;
+
+import com.nuliji.tools.mybatis.Mapper;
+import com.qxgmat.data.dao.entity.ExerciseQuestion;
+
+public interface ExerciseQuestionMapper extends Mapper<ExerciseQuestion> {
+}

+ 31 - 31
server/data/src/main/java/com/qxgmat/data/dao/entity/ExaminationPaper.java

@@ -26,16 +26,16 @@ public class ExaminationPaper implements Serializable {
     private Integer questionNumber;
 
     /**
-     * 开放状态:0关闭,1开启
+     * 题目编号ids:json
      */
-    @Column(name = "`status`")
-    private Integer status;
+    @Column(name = "`question_no_ids`")
+    private Integer[] questionNoIds;
 
     /**
-     * 题目编号ids:json
+     * 开放状态:0关闭,1开启
      */
-    @Column(name = "`question_no_ids`")
-    private String questionNoIds;
+    @Column(name = "`status`")
+    private Integer status;
 
     private static final long serialVersionUID = 1L;
 
@@ -104,39 +104,39 @@ public class ExaminationPaper implements Serializable {
     }
 
     /**
-     * 获取开放状态:0关闭,1开启
+     * 获取题目编号ids:json
      *
-     * @return status - 开放状态:0关闭,1开启
+     * @return question_no_ids - 题目编号ids:json
      */
-    public Integer getStatus() {
-        return status;
+    public Integer[] getQuestionNoIds() {
+        return questionNoIds;
     }
 
     /**
-     * 设置开放状态:0关闭,1开启
+     * 设置题目编号ids:json
      *
-     * @param status 开放状态:0关闭,1开启
+     * @param questionNoIds 题目编号ids:json
      */
-    public void setStatus(Integer status) {
-        this.status = status;
+    public void setQuestionNoIds(Integer[] questionNoIds) {
+        this.questionNoIds = questionNoIds;
     }
 
     /**
-     * 获取题目编号ids:json
+     * 获取开放状态:0关闭,1开启
      *
-     * @return question_no_ids - 题目编号ids:json
+     * @return status - 开放状态:0关闭,1开启
      */
-    public String getQuestionNoIds() {
-        return questionNoIds;
+    public Integer getStatus() {
+        return status;
     }
 
     /**
-     * 设置题目编号ids:json
+     * 设置开放状态:0关闭,1开启
      *
-     * @param questionNoIds 题目编号ids:json
+     * @param status 开放状态:0关闭,1开启
      */
-    public void setQuestionNoIds(String questionNoIds) {
-        this.questionNoIds = questionNoIds;
+    public void setStatus(Integer status) {
+        this.status = status;
     }
 
     @Override
@@ -149,8 +149,8 @@ public class ExaminationPaper implements Serializable {
         sb.append(", structId=").append(structId);
         sb.append(", title=").append(title);
         sb.append(", questionNumber=").append(questionNumber);
-        sb.append(", status=").append(status);
         sb.append(", questionNoIds=").append(questionNoIds);
+        sb.append(", status=").append(status);
         sb.append("]");
         return sb.toString();
     }
@@ -203,22 +203,22 @@ public class ExaminationPaper implements Serializable {
         }
 
         /**
-         * 设置开放状态:0关闭,1开启
+         * 设置题目编号ids:json
          *
-         * @param status 开放状态:0关闭,1开启
+         * @param questionNoIds 题目编号ids:json
          */
-        public Builder status(Integer status) {
-            obj.setStatus(status);
+        public Builder questionNoIds(Integer[] questionNoIds) {
+            obj.setQuestionNoIds(questionNoIds);
             return this;
         }
 
         /**
-         * 设置题目编号ids:json
+         * 设置开放状态:0关闭,1开启
          *
-         * @param questionNoIds 题目编号ids:json
+         * @param status 开放状态:0关闭,1开启
          */
-        public Builder questionNoIds(String questionNoIds) {
-            obj.setQuestionNoIds(questionNoIds);
+        public Builder status(Integer status) {
+            obj.setStatus(status);
             return this;
         }
 

+ 31 - 31
server/data/src/main/java/com/qxgmat/data/dao/entity/ExercisePaper.java

@@ -53,16 +53,16 @@ public class ExercisePaper implements Serializable {
     private Integer questionNumber;
 
     /**
-     * 开放状态:0关闭,1开启
+     * 题目编号ids:json
      */
-    @Column(name = "`status`")
-    private Integer status;
+    @Column(name = "`question_no_ids`")
+    private Integer[] questionNoIds;
 
     /**
-     * 题目编号ids:json
+     * 开放状态:0关闭,1开启
      */
-    @Column(name = "`question_no_ids`")
-    private String questionNoIds;
+    @Column(name = "`status`")
+    private Integer status;
 
     private static final long serialVersionUID = 1L;
 
@@ -207,39 +207,39 @@ public class ExercisePaper implements Serializable {
     }
 
     /**
-     * 获取开放状态:0关闭,1开启
+     * 获取题目编号ids:json
      *
-     * @return status - 开放状态:0关闭,1开启
+     * @return question_no_ids - 题目编号ids:json
      */
-    public Integer getStatus() {
-        return status;
+    public Integer[] getQuestionNoIds() {
+        return questionNoIds;
     }
 
     /**
-     * 设置开放状态:0关闭,1开启
+     * 设置题目编号ids:json
      *
-     * @param status 开放状态:0关闭,1开启
+     * @param questionNoIds 题目编号ids:json
      */
-    public void setStatus(Integer status) {
-        this.status = status;
+    public void setQuestionNoIds(Integer[] questionNoIds) {
+        this.questionNoIds = questionNoIds;
     }
 
     /**
-     * 获取题目编号ids:json
+     * 获取开放状态:0关闭,1开启
      *
-     * @return question_no_ids - 题目编号ids:json
+     * @return status - 开放状态:0关闭,1开启
      */
-    public String getQuestionNoIds() {
-        return questionNoIds;
+    public Integer getStatus() {
+        return status;
     }
 
     /**
-     * 设置题目编号ids:json
+     * 设置开放状态:0关闭,1开启
      *
-     * @param questionNoIds 题目编号ids:json
+     * @param status 开放状态:0关闭,1开启
      */
-    public void setQuestionNoIds(String questionNoIds) {
-        this.questionNoIds = questionNoIds;
+    public void setStatus(Integer status) {
+        this.status = status;
     }
 
     @Override
@@ -256,8 +256,8 @@ public class ExercisePaper implements Serializable {
         sb.append(", structParent=").append(structParent);
         sb.append(", title=").append(title);
         sb.append(", questionNumber=").append(questionNumber);
-        sb.append(", status=").append(status);
         sb.append(", questionNoIds=").append(questionNoIds);
+        sb.append(", status=").append(status);
         sb.append("]");
         return sb.toString();
     }
@@ -352,22 +352,22 @@ public class ExercisePaper implements Serializable {
         }
 
         /**
-         * 设置开放状态:0关闭,1开启
+         * 设置题目编号ids:json
          *
-         * @param status 开放状态:0关闭,1开启
+         * @param questionNoIds 题目编号ids:json
          */
-        public Builder status(Integer status) {
-            obj.setStatus(status);
+        public Builder questionNoIds(Integer[] questionNoIds) {
+            obj.setQuestionNoIds(questionNoIds);
             return this;
         }
 
         /**
-         * 设置题目编号ids:json
+         * 设置开放状态:0关闭,1开启
          *
-         * @param questionNoIds 题目编号ids:json
+         * @param status 开放状态:0关闭,1开启
          */
-        public Builder questionNoIds(String questionNoIds) {
-            obj.setQuestionNoIds(questionNoIds);
+        public Builder status(Integer status) {
+            obj.setStatus(status);
             return this;
         }
 

+ 168 - 0
server/data/src/main/java/com/qxgmat/data/dao/entity/ExerciseQuestion.java

@@ -0,0 +1,168 @@
+package com.qxgmat.data.dao.entity;
+
+import java.io.Serializable;
+import javax.persistence.*;
+
+@Table(name = "exercise_question")
+public class ExerciseQuestion implements Serializable {
+    @Id
+    @Column(name = "`id`")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Integer id;
+
+    /**
+     * 练习册:组卷id
+     */
+    @Column(name = "`paper_id`")
+    private Integer paperId;
+
+    /**
+     * 题目id
+     */
+    @Column(name = "`question_id`")
+    private Integer questionId;
+
+    /**
+     * 题目编号id
+     */
+    @Column(name = "`question_no_id`")
+    private Integer questionNoId;
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * @return id
+     */
+    public Integer getId() {
+        return id;
+    }
+
+    /**
+     * @param id
+     */
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * 获取练习册:组卷id
+     *
+     * @return paper_id - 练习册:组卷id
+     */
+    public Integer getPaperId() {
+        return paperId;
+    }
+
+    /**
+     * 设置练习册:组卷id
+     *
+     * @param paperId 练习册:组卷id
+     */
+    public void setPaperId(Integer paperId) {
+        this.paperId = paperId;
+    }
+
+    /**
+     * 获取题目id
+     *
+     * @return question_id - 题目id
+     */
+    public Integer getQuestionId() {
+        return questionId;
+    }
+
+    /**
+     * 设置题目id
+     *
+     * @param questionId 题目id
+     */
+    public void setQuestionId(Integer questionId) {
+        this.questionId = questionId;
+    }
+
+    /**
+     * 获取题目编号id
+     *
+     * @return question_no_id - 题目编号id
+     */
+    public Integer getQuestionNoId() {
+        return questionNoId;
+    }
+
+    /**
+     * 设置题目编号id
+     *
+     * @param questionNoId 题目编号id
+     */
+    public void setQuestionNoId(Integer questionNoId) {
+        this.questionNoId = questionNoId;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", paperId=").append(paperId);
+        sb.append(", questionId=").append(questionId);
+        sb.append(", questionNoId=").append(questionNoId);
+        sb.append("]");
+        return sb.toString();
+    }
+
+    public static ExerciseQuestion.Builder builder() {
+        return new ExerciseQuestion.Builder();
+    }
+
+    public static class Builder {
+        private ExerciseQuestion obj;
+
+        public Builder() {
+            this.obj = new ExerciseQuestion();
+        }
+
+        /**
+         * @param id
+         */
+        public Builder id(Integer id) {
+            obj.setId(id);
+            return this;
+        }
+
+        /**
+         * 设置练习册:组卷id
+         *
+         * @param paperId 练习册:组卷id
+         */
+        public Builder paperId(Integer paperId) {
+            obj.setPaperId(paperId);
+            return this;
+        }
+
+        /**
+         * 设置题目id
+         *
+         * @param questionId 题目id
+         */
+        public Builder questionId(Integer questionId) {
+            obj.setQuestionId(questionId);
+            return this;
+        }
+
+        /**
+         * 设置题目编号id
+         *
+         * @param questionNoId 题目编号id
+         */
+        public Builder questionNoId(Integer questionNoId) {
+            obj.setQuestionNoId(questionNoId);
+            return this;
+        }
+
+        public ExerciseQuestion build() {
+            return this.obj;
+        }
+    }
+}

+ 35 - 35
server/data/src/main/java/com/qxgmat/data/dao/entity/HomeworkPreview.java

@@ -24,6 +24,12 @@ public class HomeworkPreview implements Serializable {
     private Integer category;
 
     /**
+     * 题目编号id:json
+     */
+    @Column(name = "`question_no_ids`")
+    private Integer[] questionNoIds;
+
+    /**
      * 制定作业用户id:json
      */
     @Column(name = "`user_ids`")
@@ -53,12 +59,6 @@ public class HomeworkPreview implements Serializable {
     @Column(name = "`update_time`")
     private Date updateTime;
 
-    /**
-     * 题目编号id:json
-     */
-    @Column(name = "`question_no_ids`")
-    private String questionNoIds;
-
     private static final long serialVersionUID = 1L;
 
     /**
@@ -112,6 +112,24 @@ public class HomeworkPreview implements Serializable {
     }
 
     /**
+     * 获取题目编号id:json
+     *
+     * @return question_no_ids - 题目编号id:json
+     */
+    public Integer[] getQuestionNoIds() {
+        return questionNoIds;
+    }
+
+    /**
+     * 设置题目编号id:json
+     *
+     * @param questionNoIds 题目编号id:json
+     */
+    public void setQuestionNoIds(Integer[] questionNoIds) {
+        this.questionNoIds = questionNoIds;
+    }
+
+    /**
      * 获取制定作业用户id:json
      *
      * @return user_ids - 制定作业用户id:json
@@ -211,24 +229,6 @@ public class HomeworkPreview implements Serializable {
         this.updateTime = updateTime;
     }
 
-    /**
-     * 获取题目编号id:json
-     *
-     * @return question_no_ids - 题目编号id:json
-     */
-    public String getQuestionNoIds() {
-        return questionNoIds;
-    }
-
-    /**
-     * 设置题目编号id:json
-     *
-     * @param questionNoIds 题目编号id:json
-     */
-    public void setQuestionNoIds(String questionNoIds) {
-        this.questionNoIds = questionNoIds;
-    }
-
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
@@ -238,13 +238,13 @@ public class HomeworkPreview implements Serializable {
         sb.append(", id=").append(id);
         sb.append(", title=").append(title);
         sb.append(", category=").append(category);
+        sb.append(", questionNoIds=").append(questionNoIds);
         sb.append(", userIds=").append(userIds);
         sb.append(", startTime=").append(startTime);
         sb.append(", endTime=").append(endTime);
         sb.append(", finish=").append(finish);
         sb.append(", createTime=").append(createTime);
         sb.append(", updateTime=").append(updateTime);
-        sb.append(", questionNoIds=").append(questionNoIds);
         sb.append("]");
         return sb.toString();
     }
@@ -289,6 +289,16 @@ public class HomeworkPreview implements Serializable {
         }
 
         /**
+         * 设置题目编号id:json
+         *
+         * @param questionNoIds 题目编号id:json
+         */
+        public Builder questionNoIds(Integer[] questionNoIds) {
+            obj.setQuestionNoIds(questionNoIds);
+            return this;
+        }
+
+        /**
          * 设置制定作业用户id:json
          *
          * @param userIds 制定作业用户id:json
@@ -344,16 +354,6 @@ public class HomeworkPreview implements Serializable {
             return this;
         }
 
-        /**
-         * 设置题目编号id:json
-         *
-         * @param questionNoIds 题目编号id:json
-         */
-        public Builder questionNoIds(String questionNoIds) {
-            obj.setQuestionNoIds(questionNoIds);
-            return this;
-        }
-
         public HomeworkPreview build() {
             return this.obj;
         }

+ 86 - 16
server/data/src/main/java/com/qxgmat/data/dao/entity/Question.java

@@ -37,11 +37,23 @@ public class Question implements Serializable {
     private String difficult;
 
     /**
+     * 样式:json
+     */
+    @Column(name = "`style`")
+    private JSONObject style;
+
+    /**
      * 系统答案:json
      */
     @Column(name = "`answer`")
     private JSONObject answer;
 
+    /**
+     * 内容:json
+     */
+    @Column(name = "`content`")
+    private JSONObject content;
+
     @Column(name = "`question_time`")
     private Date questionTime;
 
@@ -79,10 +91,10 @@ public class Question implements Serializable {
     private Date updateTime;
 
     /**
-     * 样式:json
+     * 题干
      */
-    @Column(name = "`style`")
-    private String style;
+    @Column(name = "`stem`")
+    private String stem;
 
     @Column(name = "`qx_content`")
     private String qxContent;
@@ -182,6 +194,24 @@ public class Question implements Serializable {
     }
 
     /**
+     * 获取样式:json
+     *
+     * @return style - 样式:json
+     */
+    public JSONObject getStyle() {
+        return style;
+    }
+
+    /**
+     * 设置样式:json
+     *
+     * @param style 样式:json
+     */
+    public void setStyle(JSONObject style) {
+        this.style = style;
+    }
+
+    /**
      * 获取系统答案:json
      *
      * @return answer - 系统答案:json
@@ -200,6 +230,24 @@ public class Question implements Serializable {
     }
 
     /**
+     * 获取内容:json
+     *
+     * @return content - 内容:json
+     */
+    public JSONObject getContent() {
+        return content;
+    }
+
+    /**
+     * 设置内容:json
+     *
+     * @param content 内容:json
+     */
+    public void setContent(JSONObject content) {
+        this.content = content;
+    }
+
+    /**
      * @return question_time
      */
     public Date getQuestionTime() {
@@ -338,21 +386,21 @@ public class Question implements Serializable {
     }
 
     /**
-     * 获取样式:json
+     * 获取题干
      *
-     * @return style - 样式:json
+     * @return stem - 题干
      */
-    public String getStyle() {
-        return style;
+    public String getStem() {
+        return stem;
     }
 
     /**
-     * 设置样式:json
+     * 设置题干
      *
-     * @param style 样式:json
+     * @param stem 题干
      */
-    public void setStyle(String style) {
-        this.style = style;
+    public void setStem(String stem) {
+        this.stem = stem;
     }
 
     /**
@@ -408,7 +456,9 @@ public class Question implements Serializable {
         sb.append(", type=").append(type);
         sb.append(", place=").append(place);
         sb.append(", difficult=").append(difficult);
+        sb.append(", style=").append(style);
         sb.append(", answer=").append(answer);
+        sb.append(", content=").append(content);
         sb.append(", questionTime=").append(questionTime);
         sb.append(", qxTime=").append(qxTime);
         sb.append(", officialTime=").append(officialTime);
@@ -418,7 +468,7 @@ public class Question implements Serializable {
         sb.append(", totalCorrect=").append(totalCorrect);
         sb.append(", createTime=").append(createTime);
         sb.append(", updateTime=").append(updateTime);
-        sb.append(", style=").append(style);
+        sb.append(", stem=").append(stem);
         sb.append(", qxContent=").append(qxContent);
         sb.append(", officialContent=").append(officialContent);
         sb.append(", associationContent=").append(associationContent);
@@ -486,6 +536,16 @@ public class Question implements Serializable {
         }
 
         /**
+         * 设置样式:json
+         *
+         * @param style 样式:json
+         */
+        public Builder style(JSONObject style) {
+            obj.setStyle(style);
+            return this;
+        }
+
+        /**
          * 设置系统答案:json
          *
          * @param answer 系统答案:json
@@ -496,6 +556,16 @@ public class Question implements Serializable {
         }
 
         /**
+         * 设置内容:json
+         *
+         * @param content 内容:json
+         */
+        public Builder content(JSONObject content) {
+            obj.setContent(content);
+            return this;
+        }
+
+        /**
          * @param questionTime
          */
         public Builder questionTime(Date questionTime) {
@@ -574,12 +644,12 @@ public class Question implements Serializable {
         }
 
         /**
-         * 设置样式:json
+         * 设置题干
          *
-         * @param style 样式:json
+         * @param stem 题干
          */
-        public Builder style(String style) {
-            obj.setStyle(style);
+        public Builder stem(String stem) {
+            obj.setStem(stem);
             return this;
         }
 

+ 4 - 4
server/data/src/main/java/com/qxgmat/data/dao/entity/QuestionNo.java

@@ -33,7 +33,7 @@ public class QuestionNo implements Serializable {
      * 对应模块结构信息,逗号分隔
      */
     @Column(name = "`module_struct`")
-    private String moduleStruct;
+    private Integer[] moduleStruct;
 
     /**
      * 总作答时间
@@ -131,7 +131,7 @@ public class QuestionNo implements Serializable {
      *
      * @return module_struct - 对应模块结构信息,逗号分隔
      */
-    public String getModuleStruct() {
+    public Integer[] getModuleStruct() {
         return moduleStruct;
     }
 
@@ -140,7 +140,7 @@ public class QuestionNo implements Serializable {
      *
      * @param moduleStruct 对应模块结构信息,逗号分隔
      */
-    public void setModuleStruct(String moduleStruct) {
+    public void setModuleStruct(Integer[] moduleStruct) {
         this.moduleStruct = moduleStruct;
     }
 
@@ -275,7 +275,7 @@ public class QuestionNo implements Serializable {
          *
          * @param moduleStruct 对应模块结构信息,逗号分隔
          */
-        public Builder moduleStruct(String moduleStruct) {
+        public Builder moduleStruct(Integer[] moduleStruct) {
             obj.setModuleStruct(moduleStruct);
             return this;
         }

+ 210 - 0
server/data/src/main/java/com/qxgmat/data/dao/entity/Rank.java

@@ -10,6 +10,42 @@ public class Rank implements Serializable {
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Integer id;
 
+    /**
+     * 总分
+     */
+    @Column(name = "`total_score`")
+    private Integer totalScore;
+
+    /**
+     * 总排行
+     */
+    @Column(name = "`total_rank`")
+    private String totalRank;
+
+    /**
+     * quant分数
+     */
+    @Column(name = "`quant_score`")
+    private Integer quantScore;
+
+    /**
+     * quant排行
+     */
+    @Column(name = "`quant_rank`")
+    private String quantRank;
+
+    /**
+     * verbal分数
+     */
+    @Column(name = "`verbal_score`")
+    private Integer verbalScore;
+
+    /**
+     * verbal排行
+     */
+    @Column(name = "`verbal_rank`")
+    private String verbalRank;
+
     private static final long serialVersionUID = 1L;
 
     /**
@@ -26,6 +62,114 @@ public class Rank implements Serializable {
         this.id = id;
     }
 
+    /**
+     * 获取总分
+     *
+     * @return total_score - 总分
+     */
+    public Integer getTotalScore() {
+        return totalScore;
+    }
+
+    /**
+     * 设置总分
+     *
+     * @param totalScore 总分
+     */
+    public void setTotalScore(Integer totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    /**
+     * 获取总排行
+     *
+     * @return total_rank - 总排行
+     */
+    public String getTotalRank() {
+        return totalRank;
+    }
+
+    /**
+     * 设置总排行
+     *
+     * @param totalRank 总排行
+     */
+    public void setTotalRank(String totalRank) {
+        this.totalRank = totalRank;
+    }
+
+    /**
+     * 获取quant分数
+     *
+     * @return quant_score - quant分数
+     */
+    public Integer getQuantScore() {
+        return quantScore;
+    }
+
+    /**
+     * 设置quant分数
+     *
+     * @param quantScore quant分数
+     */
+    public void setQuantScore(Integer quantScore) {
+        this.quantScore = quantScore;
+    }
+
+    /**
+     * 获取quant排行
+     *
+     * @return quant_rank - quant排行
+     */
+    public String getQuantRank() {
+        return quantRank;
+    }
+
+    /**
+     * 设置quant排行
+     *
+     * @param quantRank quant排行
+     */
+    public void setQuantRank(String quantRank) {
+        this.quantRank = quantRank;
+    }
+
+    /**
+     * 获取verbal分数
+     *
+     * @return verbal_score - verbal分数
+     */
+    public Integer getVerbalScore() {
+        return verbalScore;
+    }
+
+    /**
+     * 设置verbal分数
+     *
+     * @param verbalScore verbal分数
+     */
+    public void setVerbalScore(Integer verbalScore) {
+        this.verbalScore = verbalScore;
+    }
+
+    /**
+     * 获取verbal排行
+     *
+     * @return verbal_rank - verbal排行
+     */
+    public String getVerbalRank() {
+        return verbalRank;
+    }
+
+    /**
+     * 设置verbal排行
+     *
+     * @param verbalRank verbal排行
+     */
+    public void setVerbalRank(String verbalRank) {
+        this.verbalRank = verbalRank;
+    }
+
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
@@ -33,6 +177,12 @@ public class Rank implements Serializable {
         sb.append(" [");
         sb.append("Hash = ").append(hashCode());
         sb.append(", id=").append(id);
+        sb.append(", totalScore=").append(totalScore);
+        sb.append(", totalRank=").append(totalRank);
+        sb.append(", quantScore=").append(quantScore);
+        sb.append(", quantRank=").append(quantRank);
+        sb.append(", verbalScore=").append(verbalScore);
+        sb.append(", verbalRank=").append(verbalRank);
         sb.append("]");
         return sb.toString();
     }
@@ -56,6 +206,66 @@ public class Rank implements Serializable {
             return this;
         }
 
+        /**
+         * 设置总分
+         *
+         * @param totalScore 总分
+         */
+        public Builder totalScore(Integer totalScore) {
+            obj.setTotalScore(totalScore);
+            return this;
+        }
+
+        /**
+         * 设置总排行
+         *
+         * @param totalRank 总排行
+         */
+        public Builder totalRank(String totalRank) {
+            obj.setTotalRank(totalRank);
+            return this;
+        }
+
+        /**
+         * 设置quant分数
+         *
+         * @param quantScore quant分数
+         */
+        public Builder quantScore(Integer quantScore) {
+            obj.setQuantScore(quantScore);
+            return this;
+        }
+
+        /**
+         * 设置quant排行
+         *
+         * @param quantRank quant排行
+         */
+        public Builder quantRank(String quantRank) {
+            obj.setQuantRank(quantRank);
+            return this;
+        }
+
+        /**
+         * 设置verbal分数
+         *
+         * @param verbalScore verbal分数
+         */
+        public Builder verbalScore(Integer verbalScore) {
+            obj.setVerbalScore(verbalScore);
+            return this;
+        }
+
+        /**
+         * 设置verbal排行
+         *
+         * @param verbalRank verbal排行
+         */
+        public Builder verbalRank(String verbalRank) {
+            obj.setVerbalRank(verbalRank);
+            return this;
+        }
+
         public Rank build() {
             return this.obj;
         }

+ 35 - 0
server/data/src/main/java/com/qxgmat/data/dao/entity/SentenceArticle.java

@@ -11,6 +11,12 @@ public class SentenceArticle implements Serializable {
     private Integer id;
 
     /**
+     * 标题
+     */
+    @Column(name = "`title`")
+    private String title;
+
+    /**
      * 章节
      */
     @Column(name = "`chapter`")
@@ -51,6 +57,24 @@ public class SentenceArticle implements Serializable {
     }
 
     /**
+     * 获取标题
+     *
+     * @return title - 标题
+     */
+    public String getTitle() {
+        return title;
+    }
+
+    /**
+     * 设置标题
+     *
+     * @param title 标题
+     */
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    /**
      * 获取章节
      *
      * @return chapter - 章节
@@ -129,6 +153,7 @@ public class SentenceArticle implements Serializable {
         sb.append(" [");
         sb.append("Hash = ").append(hashCode());
         sb.append(", id=").append(id);
+        sb.append(", title=").append(title);
         sb.append(", chapter=").append(chapter);
         sb.append(", part=").append(part);
         sb.append(", isTrail=").append(isTrail);
@@ -157,6 +182,16 @@ public class SentenceArticle implements Serializable {
         }
 
         /**
+         * 设置标题
+         *
+         * @param title 标题
+         */
+        public Builder title(String title) {
+            obj.setTitle(title);
+            return this;
+        }
+
+        /**
          * 设置章节
          *
          * @param chapter 章节

+ 35 - 35
server/data/src/main/java/com/qxgmat/data/dao/entity/SentenceQuestion.java

@@ -11,6 +11,12 @@ public class SentenceQuestion implements Serializable {
     private Integer id;
 
     /**
+     * 标题
+     */
+    @Column(name = "`title`")
+    private String title;
+
+    /**
      * 是否试用:0非试用,1试用
      */
     @Column(name = "`is_trail`")
@@ -46,12 +52,6 @@ public class SentenceQuestion implements Serializable {
     @Column(name = "`chinese`")
     private String chinese;
 
-    /**
-     * 题干
-     */
-    @Column(name = "`stem`")
-    private String stem;
-
     private static final long serialVersionUID = 1L;
 
     /**
@@ -69,6 +69,24 @@ public class SentenceQuestion implements Serializable {
     }
 
     /**
+     * 获取标题
+     *
+     * @return title - 标题
+     */
+    public String getTitle() {
+        return title;
+    }
+
+    /**
+     * 设置标题
+     *
+     * @param title 标题
+     */
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    /**
      * 获取是否试用:0非试用,1试用
      *
      * @return is_trail - 是否试用:0非试用,1试用
@@ -176,24 +194,6 @@ public class SentenceQuestion implements Serializable {
         this.chinese = chinese;
     }
 
-    /**
-     * 获取题干
-     *
-     * @return stem - 题干
-     */
-    public String getStem() {
-        return stem;
-    }
-
-    /**
-     * 设置题干
-     *
-     * @param stem 题干
-     */
-    public void setStem(String stem) {
-        this.stem = stem;
-    }
-
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
@@ -201,13 +201,13 @@ public class SentenceQuestion implements Serializable {
         sb.append(" [");
         sb.append("Hash = ").append(hashCode());
         sb.append(", id=").append(id);
+        sb.append(", title=").append(title);
         sb.append(", isTrail=").append(isTrail);
         sb.append(", paperId=").append(paperId);
         sb.append(", no=").append(no);
         sb.append(", questionId=").append(questionId);
         sb.append(", sentenceId=").append(sentenceId);
         sb.append(", chinese=").append(chinese);
-        sb.append(", stem=").append(stem);
         sb.append("]");
         return sb.toString();
     }
@@ -232,6 +232,16 @@ public class SentenceQuestion implements Serializable {
         }
 
         /**
+         * 设置标题
+         *
+         * @param title 标题
+         */
+        public Builder title(String title) {
+            obj.setTitle(title);
+            return this;
+        }
+
+        /**
          * 设置是否试用:0非试用,1试用
          *
          * @param isTrail 是否试用:0非试用,1试用
@@ -291,16 +301,6 @@ public class SentenceQuestion implements Serializable {
             return this;
         }
 
-        /**
-         * 设置题干
-         *
-         * @param stem 题干
-         */
-        public Builder stem(String stem) {
-            obj.setStem(stem);
-            return this;
-        }
-
         public SentenceQuestion build() {
             return this.obj;
         }

+ 29 - 29
server/data/src/main/java/com/qxgmat/data/dao/entity/TextbookPaper.java

@@ -11,14 +11,14 @@ public class TextbookPaper implements Serializable {
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Integer id;
 
-    @Column(name = "`create_time`")
-    private Date createTime;
-
     /**
      * 题目编号ids:json
      */
     @Column(name = "`question_no_ids`")
-    private String questionNoIds;
+    private Integer[] questionNoIds;
+
+    @Column(name = "`create_time`")
+    private Date createTime;
 
     private static final long serialVersionUID = 1L;
 
@@ -37,25 +37,11 @@ public class TextbookPaper implements Serializable {
     }
 
     /**
-     * @return create_time
-     */
-    public Date getCreateTime() {
-        return createTime;
-    }
-
-    /**
-     * @param createTime
-     */
-    public void setCreateTime(Date createTime) {
-        this.createTime = createTime;
-    }
-
-    /**
      * 获取题目编号ids:json
      *
      * @return question_no_ids - 题目编号ids:json
      */
-    public String getQuestionNoIds() {
+    public Integer[] getQuestionNoIds() {
         return questionNoIds;
     }
 
@@ -64,10 +50,24 @@ public class TextbookPaper implements Serializable {
      *
      * @param questionNoIds 题目编号ids:json
      */
-    public void setQuestionNoIds(String questionNoIds) {
+    public void setQuestionNoIds(Integer[] questionNoIds) {
         this.questionNoIds = questionNoIds;
     }
 
+    /**
+     * @return create_time
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    /**
+     * @param createTime
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
@@ -75,8 +75,8 @@ public class TextbookPaper implements Serializable {
         sb.append(" [");
         sb.append("Hash = ").append(hashCode());
         sb.append(", id=").append(id);
-        sb.append(", createTime=").append(createTime);
         sb.append(", questionNoIds=").append(questionNoIds);
+        sb.append(", createTime=").append(createTime);
         sb.append("]");
         return sb.toString();
     }
@@ -101,20 +101,20 @@ public class TextbookPaper implements Serializable {
         }
 
         /**
-         * @param createTime
+         * 设置题目编号ids:json
+         *
+         * @param questionNoIds 题目编号ids:json
          */
-        public Builder createTime(Date createTime) {
-            obj.setCreateTime(createTime);
+        public Builder questionNoIds(Integer[] questionNoIds) {
+            obj.setQuestionNoIds(questionNoIds);
             return this;
         }
 
         /**
-         * 设置题目编号ids:json
-         *
-         * @param questionNoIds 题目编号ids:json
+         * @param createTime
          */
-        public Builder questionNoIds(String questionNoIds) {
-            obj.setQuestionNoIds(questionNoIds);
+        public Builder createTime(Date createTime) {
+            obj.setCreateTime(createTime);
             return this;
         }
 

+ 7 - 7
server/data/src/main/java/com/qxgmat/data/dao/entity/User.java

@@ -130,7 +130,7 @@ public class User implements Serializable {
     private Date prepareExaminationTime;
 
     /**
-     * 备考:分时间
+     * 备考:分时间
      */
     @Column(name = "`prepare_score_time`")
     private Date prepareScoreTime;
@@ -535,18 +535,18 @@ public class User implements Serializable {
     }
 
     /**
-     * 获取备考:分时间
+     * 获取备考:分时间
      *
-     * @return prepare_score_time - 备考:分时间
+     * @return prepare_score_time - 备考:分时间
      */
     public Date getPrepareScoreTime() {
         return prepareScoreTime;
     }
 
     /**
-     * 设置备考:分时间
+     * 设置备考:分时间
      *
-     * @param prepareScoreTime 备考:分时间
+     * @param prepareScoreTime 备考:分时间
      */
     public void setPrepareScoreTime(Date prepareScoreTime) {
         this.prepareScoreTime = prepareScoreTime;
@@ -893,9 +893,9 @@ public class User implements Serializable {
         }
 
         /**
-         * 设置备考:分时间
+         * 设置备考:分时间
          *
-         * @param prepareScoreTime 备考:分时间
+         * @param prepareScoreTime 备考:分时间
          */
         public Builder prepareScoreTime(Date prepareScoreTime) {
             obj.setPrepareScoreTime(prepareScoreTime);

+ 80 - 10
server/data/src/main/java/com/qxgmat/data/dao/entity/UserAsk.java

@@ -24,12 +24,24 @@ public class UserAsk implements Serializable {
     private Integer questionId;
 
     /**
+     * 题目编号id
+     */
+    @Column(name = "`question_no_id`")
+    private Integer questionNoId;
+
+    /**
      * 问题对象:question,offical,qx,association
      */
     @Column(name = "`target`")
     private String target;
 
     /**
+     * 回答状态
+     */
+    @Column(name = "`answer_status`")
+    private Integer answerStatus;
+
+    /**
      * 回答人id
      */
     @Column(name = "`manager_id`")
@@ -124,6 +136,24 @@ public class UserAsk implements Serializable {
     }
 
     /**
+     * 获取题目编号id
+     *
+     * @return question_no_id - 题目编号id
+     */
+    public Integer getQuestionNoId() {
+        return questionNoId;
+    }
+
+    /**
+     * 设置题目编号id
+     *
+     * @param questionNoId 题目编号id
+     */
+    public void setQuestionNoId(Integer questionNoId) {
+        this.questionNoId = questionNoId;
+    }
+
+    /**
      * 获取问题对象:question,offical,qx,association
      *
      * @return target - 问题对象:question,offical,qx,association
@@ -142,6 +172,24 @@ public class UserAsk implements Serializable {
     }
 
     /**
+     * 获取回答状态
+     *
+     * @return answer_status - 回答状态
+     */
+    public Integer getAnswerStatus() {
+        return answerStatus;
+    }
+
+    /**
+     * 设置回答状态
+     *
+     * @param answerStatus 回答状态
+     */
+    public void setAnswerStatus(Integer answerStatus) {
+        this.answerStatus = answerStatus;
+    }
+
+    /**
      * 获取回答人id
      *
      * @return manager_id - 回答人id
@@ -286,7 +334,9 @@ public class UserAsk implements Serializable {
         sb.append(", id=").append(id);
         sb.append(", userId=").append(userId);
         sb.append(", questionId=").append(questionId);
+        sb.append(", questionNoId=").append(questionNoId);
         sb.append(", target=").append(target);
+        sb.append(", answerStatus=").append(answerStatus);
         sb.append(", managerId=").append(managerId);
         sb.append(", showStatus=").append(showStatus);
         sb.append(", answerTime=").append(answerTime);
@@ -339,6 +389,16 @@ public class UserAsk implements Serializable {
         }
 
         /**
+         * 设置题目编号id
+         *
+         * @param questionNoId 题目编号id
+         */
+        public Builder questionNoId(Integer questionNoId) {
+            obj.setQuestionNoId(questionNoId);
+            return this;
+        }
+
+        /**
          * 设置问题对象:question,offical,qx,association
          *
          * @param target 问题对象:question,offical,qx,association
@@ -349,6 +409,26 @@ public class UserAsk implements Serializable {
         }
 
         /**
+         * 设置回答
+         *
+         * @param answer 回答
+         */
+        public Builder answer(String answer) {
+            obj.setAnswer(answer);
+            return this;
+        }
+
+        /**
+         * 设置回答状态
+         *
+         * @param answerStatus 回答状态
+         */
+        public Builder answerStatus(Integer answerStatus) {
+            obj.setAnswerStatus(answerStatus);
+            return this;
+        }
+
+        /**
          * 设置回答人id
          *
          * @param managerId 回答人id
@@ -369,16 +449,6 @@ public class UserAsk implements Serializable {
         }
 
         /**
-         * 设置回答
-         *
-         * @param answer 回答
-         */
-        public Builder answer(String answer) {
-            obj.setAnswer(answer);
-            return this;
-        }
-
-        /**
          * 设置回答时间
          *
          * @param answerTime 回答时间

+ 70 - 0
server/data/src/main/java/com/qxgmat/data/dao/entity/UserMessage.java

@@ -18,6 +18,12 @@ public class UserMessage implements Serializable {
     private Integer userId;
 
     /**
+     * 消息类型
+     */
+    @Column(name = "`type`")
+    private String type;
+
+    /**
      * 标题
      */
     @Column(name = "`title`")
@@ -29,6 +35,12 @@ public class UserMessage implements Serializable {
     @Column(name = "`link`")
     private String link;
 
+    /**
+     * 已读状态:0未读,1已读
+     */
+    @Column(name = "`is_read`")
+    private Integer isRead;
+
     @Column(name = "`create_time`")
     private Date createTime;
 
@@ -73,6 +85,24 @@ public class UserMessage implements Serializable {
     }
 
     /**
+     * 获取消息类型
+     *
+     * @return type - 消息类型
+     */
+    public String getType() {
+        return type;
+    }
+
+    /**
+     * 设置消息类型
+     *
+     * @param type 消息类型
+     */
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    /**
      * 获取标题
      *
      * @return title - 标题
@@ -109,6 +139,24 @@ public class UserMessage implements Serializable {
     }
 
     /**
+     * 获取已读状态:0未读,1已读
+     *
+     * @return is_read - 已读状态:0未读,1已读
+     */
+    public Integer getIsRead() {
+        return isRead;
+    }
+
+    /**
+     * 设置已读状态:0未读,1已读
+     *
+     * @param isRead 已读状态:0未读,1已读
+     */
+    public void setIsRead(Integer isRead) {
+        this.isRead = isRead;
+    }
+
+    /**
      * @return create_time
      */
     public Date getCreateTime() {
@@ -148,8 +196,10 @@ public class UserMessage implements Serializable {
         sb.append("Hash = ").append(hashCode());
         sb.append(", id=").append(id);
         sb.append(", userId=").append(userId);
+        sb.append(", type=").append(type);
         sb.append(", title=").append(title);
         sb.append(", link=").append(link);
+        sb.append(", isRead=").append(isRead);
         sb.append(", createTime=").append(createTime);
         sb.append(", content=").append(content);
         sb.append("]");
@@ -186,6 +236,16 @@ public class UserMessage implements Serializable {
         }
 
         /**
+         * 设置消息类型
+         *
+         * @param type 消息类型
+         */
+        public Builder type(String type) {
+            obj.setType(type);
+            return this;
+        }
+
+        /**
          * 设置标题
          *
          * @param title 标题
@@ -206,6 +266,16 @@ public class UserMessage implements Serializable {
         }
 
         /**
+         * 设置已读状态:0未读,1已读
+         *
+         * @param isRead 已读状态:0未读,1已读
+         */
+        public Builder isRead(Integer isRead) {
+            obj.setIsRead(isRead);
+            return this;
+        }
+
+        /**
          * @param createTime
          */
         public Builder createTime(Date createTime) {

+ 35 - 35
server/data/src/main/java/com/qxgmat/data/dao/entity/UserPaper.java

@@ -35,6 +35,12 @@ public class UserPaper implements Serializable {
     private Integer moduleId;
 
     /**
+     * 题目编号id列表:json
+     */
+    @Column(name = "`question_no_ids`")
+    private Integer[] questionNoIds;
+
+    /**
      * 练习次数
      */
     @Column(name = "`number`")
@@ -46,12 +52,6 @@ public class UserPaper implements Serializable {
     @Column(name = "`time`")
     private Integer time;
 
-    /**
-     * 题目编号id列表:json
-     */
-    @Column(name = "`question_no_ids`")
-    private String questionNoIds;
-
     private static final long serialVersionUID = 1L;
 
     /**
@@ -141,6 +141,24 @@ public class UserPaper implements Serializable {
     }
 
     /**
+     * 获取题目编号id列表:json
+     *
+     * @return question_no_ids - 题目编号id列表:json
+     */
+    public Integer[] getQuestionNoIds() {
+        return questionNoIds;
+    }
+
+    /**
+     * 设置题目编号id列表:json
+     *
+     * @param questionNoIds 题目编号id列表:json
+     */
+    public void setQuestionNoIds(Integer[] questionNoIds) {
+        this.questionNoIds = questionNoIds;
+    }
+
+    /**
      * 获取练习次数
      *
      * @return number - 练习次数
@@ -176,24 +194,6 @@ public class UserPaper implements Serializable {
         this.time = time;
     }
 
-    /**
-     * 获取题目编号id列表:json
-     *
-     * @return question_no_ids - 题目编号id列表:json
-     */
-    public String getQuestionNoIds() {
-        return questionNoIds;
-    }
-
-    /**
-     * 设置题目编号id列表:json
-     *
-     * @param questionNoIds 题目编号id列表:json
-     */
-    public void setQuestionNoIds(String questionNoIds) {
-        this.questionNoIds = questionNoIds;
-    }
-
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
@@ -205,9 +205,9 @@ public class UserPaper implements Serializable {
         sb.append(", title=").append(title);
         sb.append(", module=").append(module);
         sb.append(", moduleId=").append(moduleId);
+        sb.append(", questionNoIds=").append(questionNoIds);
         sb.append(", number=").append(number);
         sb.append(", time=").append(time);
-        sb.append(", questionNoIds=").append(questionNoIds);
         sb.append("]");
         return sb.toString();
     }
@@ -272,6 +272,16 @@ public class UserPaper implements Serializable {
         }
 
         /**
+         * 设置题目编号id列表:json
+         *
+         * @param questionNoIds 题目编号id列表:json
+         */
+        public Builder questionNoIds(Integer[] questionNoIds) {
+            obj.setQuestionNoIds(questionNoIds);
+            return this;
+        }
+
+        /**
          * 设置练习次数
          *
          * @param number 练习次数
@@ -291,16 +301,6 @@ public class UserPaper implements Serializable {
             return this;
         }
 
-        /**
-         * 设置题目编号id列表:json
-         *
-         * @param questionNoIds 题目编号id列表:json
-         */
-        public Builder questionNoIds(String questionNoIds) {
-            obj.setQuestionNoIds(questionNoIds);
-            return this;
-        }
-
         public UserPaper build() {
             return this.obj;
         }

+ 140 - 0
server/data/src/main/java/com/qxgmat/data/dao/entity/UserPay.java

@@ -17,9 +17,33 @@ public class UserPay implements Serializable {
     @Column(name = "`user_id`")
     private Integer userId;
 
+    /**
+     * 模块
+     */
+    @Column(name = "`module`")
+    private String module;
+
+    /**
+     * 模块扩展信息
+     */
+    @Column(name = "`module_extend`")
+    private String moduleExtend;
+
     @Column(name = "`create_time`")
     private Date createTime;
 
+    /**
+     * 使用状态:0未使用,1已使用
+     */
+    @Column(name = "`is_use`")
+    private Integer isUse;
+
+    /**
+     * 使用时间
+     */
+    @Column(name = "`use_time`")
+    private Date useTime;
+
     private static final long serialVersionUID = 1L;
 
     /**
@@ -55,6 +79,42 @@ public class UserPay implements Serializable {
     }
 
     /**
+     * 获取模块
+     *
+     * @return module - 模块
+     */
+    public String getModule() {
+        return module;
+    }
+
+    /**
+     * 设置模块
+     *
+     * @param module 模块
+     */
+    public void setModule(String module) {
+        this.module = module;
+    }
+
+    /**
+     * 获取模块扩展信息
+     *
+     * @return module_extend - 模块扩展信息
+     */
+    public String getModuleExtend() {
+        return moduleExtend;
+    }
+
+    /**
+     * 设置模块扩展信息
+     *
+     * @param moduleExtend 模块扩展信息
+     */
+    public void setModuleExtend(String moduleExtend) {
+        this.moduleExtend = moduleExtend;
+    }
+
+    /**
      * @return create_time
      */
     public Date getCreateTime() {
@@ -68,6 +128,42 @@ public class UserPay implements Serializable {
         this.createTime = createTime;
     }
 
+    /**
+     * 获取使用状态:0未使用,1已使用
+     *
+     * @return is_use - 使用状态:0未使用,1已使用
+     */
+    public Integer getIsUse() {
+        return isUse;
+    }
+
+    /**
+     * 设置使用状态:0未使用,1已使用
+     *
+     * @param isUse 使用状态:0未使用,1已使用
+     */
+    public void setIsUse(Integer isUse) {
+        this.isUse = isUse;
+    }
+
+    /**
+     * 获取使用时间
+     *
+     * @return use_time - 使用时间
+     */
+    public Date getUseTime() {
+        return useTime;
+    }
+
+    /**
+     * 设置使用时间
+     *
+     * @param useTime 使用时间
+     */
+    public void setUseTime(Date useTime) {
+        this.useTime = useTime;
+    }
+
     @Override
     public String toString() {
         StringBuilder sb = new StringBuilder();
@@ -76,7 +172,11 @@ public class UserPay implements Serializable {
         sb.append("Hash = ").append(hashCode());
         sb.append(", id=").append(id);
         sb.append(", userId=").append(userId);
+        sb.append(", module=").append(module);
+        sb.append(", moduleExtend=").append(moduleExtend);
         sb.append(", createTime=").append(createTime);
+        sb.append(", isUse=").append(isUse);
+        sb.append(", useTime=").append(useTime);
         sb.append("]");
         return sb.toString();
     }
@@ -111,6 +211,26 @@ public class UserPay implements Serializable {
         }
 
         /**
+         * 设置模块
+         *
+         * @param module 模块
+         */
+        public Builder module(String module) {
+            obj.setModule(module);
+            return this;
+        }
+
+        /**
+         * 设置模块扩展信息
+         *
+         * @param moduleExtend 模块扩展信息
+         */
+        public Builder moduleExtend(String moduleExtend) {
+            obj.setModuleExtend(moduleExtend);
+            return this;
+        }
+
+        /**
          * @param createTime
          */
         public Builder createTime(Date createTime) {
@@ -118,6 +238,26 @@ public class UserPay implements Serializable {
             return this;
         }
 
+        /**
+         * 设置使用状态:0未使用,1已使用
+         *
+         * @param isUse 使用状态:0未使用,1已使用
+         */
+        public Builder isUse(Integer isUse) {
+            obj.setIsUse(isUse);
+            return this;
+        }
+
+        /**
+         * 设置使用时间
+         *
+         * @param useTime 使用时间
+         */
+        public Builder useTime(Date useTime) {
+            obj.setUseTime(useTime);
+            return this;
+        }
+
         public UserPay build() {
             return this.obj;
         }

+ 89 - 54
server/data/src/main/java/com/qxgmat/data/dao/entity/UserReport.java

@@ -19,6 +19,12 @@ public class UserReport implements Serializable {
     private Integer userId;
 
     /**
+     * 用户组卷id
+     */
+    @Column(name = "`paper_id`")
+    private Integer paperId;
+
+    /**
      * 对应模块:exercise,examination,sentence, homework_preview
      */
     @Column(name = "`module`")
@@ -27,9 +33,6 @@ public class UserReport implements Serializable {
     @Column(name = "`module_id`")
     private Integer moduleId;
 
-    @Column(name = "`create_time`")
-    private Date createTime;
-
     /**
      * 总题目数
      */
@@ -55,6 +58,12 @@ public class UserReport implements Serializable {
     private Integer userTime;
 
     /**
+     * 题目编号id列表:json
+     */
+    @Column(name = "`question_no_ids`")
+    private Integer[] questionNoIds;
+
+    /**
      * 正确题目数
      */
     @Column(name = "`correct_number`")
@@ -67,16 +76,13 @@ public class UserReport implements Serializable {
     private Date finishTime;
 
     /**
-     * 详细信息
+     * 详细信息: json
      */
     @Column(name = "`detail`")
     private JSONObject detail;
 
-    /**
-     * 题目编号id列表:json
-     */
-    @Column(name = "`question_no_ids`")
-    private String questionNoIds;
+    @Column(name = "`create_time`")
+    private Date createTime;
 
     private static final long serialVersionUID = 1L;
 
@@ -113,6 +119,24 @@ public class UserReport implements Serializable {
     }
 
     /**
+     * 获取用户组卷id
+     *
+     * @return paper_id - 用户组卷id
+     */
+    public Integer getPaperId() {
+        return paperId;
+    }
+
+    /**
+     * 设置用户组卷id
+     *
+     * @param paperId 用户组卷id
+     */
+    public void setPaperId(Integer paperId) {
+        this.paperId = paperId;
+    }
+
+    /**
      * 获取对应模块:exercise,examination,sentence, homework_preview
      *
      * @return module - 对应模块:exercise,examination,sentence, homework_preview
@@ -145,20 +169,6 @@ public class UserReport implements Serializable {
     }
 
     /**
-     * @return create_time
-     */
-    public Date getCreateTime() {
-        return createTime;
-    }
-
-    /**
-     * @param createTime
-     */
-    public void setCreateTime(Date createTime) {
-        this.createTime = createTime;
-    }
-
-    /**
      * 获取总题目数
      *
      * @return total_number - 总题目数
@@ -231,6 +241,24 @@ public class UserReport implements Serializable {
     }
 
     /**
+     * 获取题目编号id列表:json
+     *
+     * @return question_no_ids - 题目编号id列表:json
+     */
+    public Integer[] getQuestionNoIds() {
+        return questionNoIds;
+    }
+
+    /**
+     * 设置题目编号id列表:json
+     *
+     * @param questionNoIds 题目编号id列表:json
+     */
+    public void setQuestionNoIds(Integer[] questionNoIds) {
+        this.questionNoIds = questionNoIds;
+    }
+
+    /**
      * 获取正确题目数
      *
      * @return correct_number - 正确题目数
@@ -267,39 +295,35 @@ public class UserReport implements Serializable {
     }
 
     /**
-     * 获取详细信息
+     * 获取详细信息: json
      *
-     * @return detail - 详细信息
+     * @return detail - 详细信息: json
      */
     public JSONObject getDetail() {
         return detail;
     }
 
     /**
-     * 设置详细信息
+     * 设置详细信息: json
      *
-     * @param detail 详细信息
+     * @param detail 详细信息: json
      */
     public void setDetail(JSONObject detail) {
         this.detail = detail;
     }
 
     /**
-     * 获取题目编号id列表:json
-     *
-     * @return question_no_ids - 题目编号id列表:json
+     * @return create_time
      */
-    public String getQuestionNoIds() {
-        return questionNoIds;
+    public Date getCreateTime() {
+        return createTime;
     }
 
     /**
-     * 设置题目编号id列表:json
-     *
-     * @param questionNoIds 题目编号id列表:json
+     * @param createTime
      */
-    public void setQuestionNoIds(String questionNoIds) {
-        this.questionNoIds = questionNoIds;
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
     }
 
     @Override
@@ -310,17 +334,18 @@ public class UserReport implements Serializable {
         sb.append("Hash = ").append(hashCode());
         sb.append(", id=").append(id);
         sb.append(", userId=").append(userId);
+        sb.append(", paperId=").append(paperId);
         sb.append(", module=").append(module);
         sb.append(", moduleId=").append(moduleId);
-        sb.append(", createTime=").append(createTime);
         sb.append(", totalNumber=").append(totalNumber);
         sb.append(", totalTime=").append(totalTime);
         sb.append(", userNumber=").append(userNumber);
         sb.append(", userTime=").append(userTime);
+        sb.append(", questionNoIds=").append(questionNoIds);
         sb.append(", correctNumber=").append(correctNumber);
         sb.append(", finishTime=").append(finishTime);
         sb.append(", detail=").append(detail);
-        sb.append(", questionNoIds=").append(questionNoIds);
+        sb.append(", createTime=").append(createTime);
         sb.append("]");
         return sb.toString();
     }
@@ -355,6 +380,16 @@ public class UserReport implements Serializable {
         }
 
         /**
+         * 设置用户组卷id
+         *
+         * @param paperId 用户组卷id
+         */
+        public Builder paperId(Integer paperId) {
+            obj.setPaperId(paperId);
+            return this;
+        }
+
+        /**
          * 设置对应模块:exercise,examination,sentence, homework_preview
          *
          * @param module 对应模块:exercise,examination,sentence, homework_preview
@@ -373,14 +408,6 @@ public class UserReport implements Serializable {
         }
 
         /**
-         * @param createTime
-         */
-        public Builder createTime(Date createTime) {
-            obj.setCreateTime(createTime);
-            return this;
-        }
-
-        /**
          * 设置总题目数
          *
          * @param totalNumber 总题目数
@@ -421,6 +448,16 @@ public class UserReport implements Serializable {
         }
 
         /**
+         * 设置题目编号id列表:json
+         *
+         * @param questionNoIds 题目编号id列表:json
+         */
+        public Builder questionNoIds(Integer[] questionNoIds) {
+            obj.setQuestionNoIds(questionNoIds);
+            return this;
+        }
+
+        /**
          * 设置正确题目数
          *
          * @param correctNumber 正确题目数
@@ -441,9 +478,9 @@ public class UserReport implements Serializable {
         }
 
         /**
-         * 设置详细信息
+         * 设置详细信息: json
          *
-         * @param detail 详细信息
+         * @param detail 详细信息: json
          */
         public Builder detail(JSONObject detail) {
             obj.setDetail(detail);
@@ -451,12 +488,10 @@ public class UserReport implements Serializable {
         }
 
         /**
-         * 设置题目编号id列表:json
-         *
-         * @param questionNoIds 题目编号id列表:json
+         * @param createTime
          */
-        public Builder questionNoIds(String questionNoIds) {
-            obj.setQuestionNoIds(questionNoIds);
+        public Builder createTime(Date createTime) {
+            obj.setCreateTime(createTime);
             return this;
         }
 

+ 2 - 13
server/data/src/main/java/com/qxgmat/data/dao/mapping/ExaminationPaperMapper.xml

@@ -9,24 +9,13 @@
     <result column="struct_id" jdbcType="INTEGER" property="structId" />
     <result column="title" jdbcType="VARCHAR" property="title" />
     <result column="question_number" jdbcType="INTEGER" property="questionNumber" />
+    <result column="question_no_ids" jdbcType="VARCHAR" property="questionNoIds" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler" />
     <result column="status" jdbcType="INTEGER" property="status" />
   </resultMap>
-  <resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="com.qxgmat.data.dao.entity.ExaminationPaper">
-    <!--
-      WARNING - @mbg.generated
-    -->
-    <result column="question_no_ids" jdbcType="LONGVARCHAR" property="questionNoIds" />
-  </resultMap>
   <sql id="Base_Column_List">
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `struct_id`, `title`, `question_number`, `status`
-  </sql>
-  <sql id="Blob_Column_List">
-    <!--
-      WARNING - @mbg.generated
-    -->
-    `question_no_ids`
+    `id`, `struct_id`, `title`, `question_number`, `question_no_ids`, `status`
   </sql>
 </mapper>

+ 2 - 13
server/data/src/main/java/com/qxgmat/data/dao/mapping/ExercisePaperMapper.xml

@@ -13,25 +13,14 @@
     <result column="struct_parent" jdbcType="VARCHAR" property="structParent" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayHandler" />
     <result column="title" jdbcType="VARCHAR" property="title" />
     <result column="question_number" jdbcType="INTEGER" property="questionNumber" />
+    <result column="question_no_ids" jdbcType="VARCHAR" property="questionNoIds" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler" />
     <result column="status" jdbcType="INTEGER" property="status" />
   </resultMap>
-  <resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="com.qxgmat.data.dao.entity.ExercisePaper">
-    <!--
-      WARNING - @mbg.generated
-    -->
-    <result column="question_no_ids" jdbcType="LONGVARCHAR" property="questionNoIds" />
-  </resultMap>
   <sql id="Base_Column_List">
     <!--
       WARNING - @mbg.generated
     -->
     `id`, `type`, `logic`, `logic_extend`, `struct_id`, `struct_parent`, `title`, `question_number`, 
-    `status`
-  </sql>
-  <sql id="Blob_Column_List">
-    <!--
-      WARNING - @mbg.generated
-    -->
-    `question_no_ids`
+    `question_no_ids`, `status`
   </sql>
 </mapper>

+ 19 - 0
server/data/src/main/java/com/qxgmat/data/dao/mapping/ExerciseQuestionMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qxgmat.data.dao.ExerciseQuestionMapper">
+  <resultMap id="BaseResultMap" type="com.qxgmat.data.dao.entity.ExerciseQuestion">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="id" jdbcType="INTEGER" property="id" />
+    <result column="paper_id" jdbcType="INTEGER" property="paperId" />
+    <result column="question_id" jdbcType="INTEGER" property="questionId" />
+    <result column="question_no_id" jdbcType="INTEGER" property="questionNoId" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    `id`, `paper_id`, `question_id`, `question_no_id`
+  </sql>
+</mapper>

+ 3 - 14
server/data/src/main/java/com/qxgmat/data/dao/mapping/HomeworkPreviewMapper.xml

@@ -8,6 +8,7 @@
     <id column="id" jdbcType="INTEGER" property="id" />
     <result column="title" jdbcType="VARCHAR" property="title" />
     <result column="category" jdbcType="INTEGER" property="category" />
+    <result column="question_no_ids" jdbcType="VARCHAR" property="questionNoIds" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler" />
     <result column="user_ids" jdbcType="VARCHAR" property="userIds" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler" />
     <result column="start_time" jdbcType="TIMESTAMP" property="startTime" />
     <result column="end_time" jdbcType="TIMESTAMP" property="endTime" />
@@ -15,23 +16,11 @@
     <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
     <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
   </resultMap>
-  <resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="com.qxgmat.data.dao.entity.HomeworkPreview">
-    <!--
-      WARNING - @mbg.generated
-    -->
-    <result column="question_no_ids" jdbcType="LONGVARCHAR" property="questionNoIds" />
-  </resultMap>
   <sql id="Base_Column_List">
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `title`, `category`, `user_ids`, `start_time`, `end_time`, `finish`, `create_time`, 
-    `update_time`
-  </sql>
-  <sql id="Blob_Column_List">
-    <!--
-      WARNING - @mbg.generated
-    -->
-    `question_no_ids`
+    `id`, `title`, `category`, `question_no_ids`, `user_ids`, `start_time`, `end_time`, 
+    `finish`, `create_time`, `update_time`
   </sql>
 </mapper>

+ 6 - 4
server/data/src/main/java/com/qxgmat/data/dao/mapping/QuestionMapper.xml

@@ -10,7 +10,9 @@
     <result column="type" jdbcType="VARCHAR" property="type" />
     <result column="place" jdbcType="VARCHAR" property="place" />
     <result column="difficult" jdbcType="VARCHAR" property="difficult" />
+    <result column="style" jdbcType="VARCHAR" property="style" typeHandler="com.nuliji.tools.mybatis.handler.JsonObjectHandler" />
     <result column="answer" jdbcType="VARCHAR" property="answer" typeHandler="com.nuliji.tools.mybatis.handler.JsonObjectHandler" />
+    <result column="content" jdbcType="VARCHAR" property="content" typeHandler="com.nuliji.tools.mybatis.handler.JsonObjectHandler" />
     <result column="question_time" jdbcType="TIMESTAMP" property="questionTime" />
     <result column="qx_time" jdbcType="TIMESTAMP" property="qxTime" />
     <result column="official_time" jdbcType="TIMESTAMP" property="officialTime" />
@@ -25,7 +27,7 @@
     <!--
       WARNING - @mbg.generated
     -->
-    <result column="style" jdbcType="LONGVARCHAR" property="style" />
+    <result column="stem" jdbcType="LONGVARCHAR" property="stem" />
     <result column="qx_content" jdbcType="LONGVARCHAR" property="qxContent" />
     <result column="official_content" jdbcType="LONGVARCHAR" property="officialContent" />
     <result column="association_content" jdbcType="LONGVARCHAR" property="associationContent" />
@@ -34,14 +36,14 @@
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `keyword`, `type`, `place`, `difficult`, `answer`, `question_time`, `qx_time`, 
-    `official_time`, `association_time`, `total_time`, `total_number`, `total_correct`, 
+    `id`, `keyword`, `type`, `place`, `difficult`, `style`, `answer`, `content`, `question_time`, 
+    `qx_time`, `official_time`, `association_time`, `total_time`, `total_number`, `total_correct`, 
     `create_time`, `update_time`
   </sql>
   <sql id="Blob_Column_List">
     <!--
       WARNING - @mbg.generated
     -->
-    `style`, `qx_content`, `official_content`, `association_content`
+    `stem`, `qx_content`, `official_content`, `association_content`
   </sql>
 </mapper>

+ 1 - 1
server/data/src/main/java/com/qxgmat/data/dao/mapping/QuestionNoMapper.xml

@@ -9,7 +9,7 @@
     <result column="question_id" jdbcType="INTEGER" property="questionId" />
     <result column="module" jdbcType="VARCHAR" property="module" />
     <result column="no" jdbcType="VARCHAR" property="no" />
-    <result column="module_struct" jdbcType="VARCHAR" property="moduleStruct" />
+    <result column="module_struct" jdbcType="VARCHAR" property="moduleStruct" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayHandler" />
     <result column="total_time" jdbcType="INTEGER" property="totalTime" />
     <result column="total_number" jdbcType="INTEGER" property="totalNumber" />
     <result column="total_correct" jdbcType="INTEGER" property="totalCorrect" />

+ 12 - 0
server/data/src/main/java/com/qxgmat/data/dao/mapping/RankMapper.xml

@@ -6,5 +6,17 @@
       WARNING - @mbg.generated
     -->
     <id column="id" jdbcType="INTEGER" property="id" />
+    <result column="total_score" jdbcType="INTEGER" property="totalScore" />
+    <result column="total_rank" jdbcType="VARCHAR" property="totalRank" />
+    <result column="quant_score" jdbcType="INTEGER" property="quantScore" />
+    <result column="quant_rank" jdbcType="VARCHAR" property="quantRank" />
+    <result column="verbal_score" jdbcType="INTEGER" property="verbalScore" />
+    <result column="verbal_rank" jdbcType="VARCHAR" property="verbalRank" />
   </resultMap>
+  <sql id="Base_Column_List">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    `id`, `total_score`, `total_rank`, `quant_score`, `quant_rank`, `verbal_score`, `verbal_rank`
+  </sql>
 </mapper>

+ 2 - 1
server/data/src/main/java/com/qxgmat/data/dao/mapping/SentenceArticleMapper.xml

@@ -6,6 +6,7 @@
       WARNING - @mbg.generated
     -->
     <id column="id" jdbcType="INTEGER" property="id" />
+    <result column="title" jdbcType="VARCHAR" property="title" />
     <result column="chapter" jdbcType="INTEGER" property="chapter" />
     <result column="part" jdbcType="INTEGER" property="part" />
     <result column="is_trail" jdbcType="INTEGER" property="isTrail" />
@@ -20,7 +21,7 @@
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `chapter`, `part`, `is_trail`
+    `id`, `title`, `chapter`, `part`, `is_trail`
   </sql>
   <sql id="Blob_Column_List">
     <!--

+ 3 - 3
server/data/src/main/java/com/qxgmat/data/dao/mapping/SentenceQuestionMapper.xml

@@ -6,6 +6,7 @@
       WARNING - @mbg.generated
     -->
     <id column="id" jdbcType="INTEGER" property="id" />
+    <result column="title" jdbcType="VARCHAR" property="title" />
     <result column="is_trail" jdbcType="INTEGER" property="isTrail" />
     <result column="paper_id" jdbcType="INTEGER" property="paperId" />
     <result column="no" jdbcType="INTEGER" property="no" />
@@ -17,18 +18,17 @@
       WARNING - @mbg.generated
     -->
     <result column="chinese" jdbcType="LONGVARCHAR" property="chinese" />
-    <result column="stem" jdbcType="LONGVARCHAR" property="stem" />
   </resultMap>
   <sql id="Base_Column_List">
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `is_trail`, `paper_id`, `no`, `question_id`, `sentence_id`
+    `id`, `title`, `is_trail`, `paper_id`, `no`, `question_id`, `sentence_id`
   </sql>
   <sql id="Blob_Column_List">
     <!--
       WARNING - @mbg.generated
     -->
-    `chinese`, `stem`
+    `chinese`
   </sql>
 </mapper>

+ 2 - 13
server/data/src/main/java/com/qxgmat/data/dao/mapping/TextbookPaperMapper.xml

@@ -6,24 +6,13 @@
       WARNING - @mbg.generated
     -->
     <id column="id" jdbcType="INTEGER" property="id" />
+    <result column="question_no_ids" jdbcType="VARCHAR" property="questionNoIds" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler" />
     <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
   </resultMap>
-  <resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="com.qxgmat.data.dao.entity.TextbookPaper">
-    <!--
-      WARNING - @mbg.generated
-    -->
-    <result column="question_no_ids" jdbcType="LONGVARCHAR" property="questionNoIds" />
-  </resultMap>
   <sql id="Base_Column_List">
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `create_time`
-  </sql>
-  <sql id="Blob_Column_List">
-    <!--
-      WARNING - @mbg.generated
-    -->
-    `question_no_ids`
+    `id`, `question_no_ids`, `create_time`
   </sql>
 </mapper>

+ 4 - 2
server/data/src/main/java/com/qxgmat/data/dao/mapping/UserAskMapper.xml

@@ -8,7 +8,9 @@
     <id column="id" jdbcType="INTEGER" property="id" />
     <result column="user_id" jdbcType="INTEGER" property="userId" />
     <result column="question_id" jdbcType="INTEGER" property="questionId" />
+    <result column="question_no_id" jdbcType="INTEGER" property="questionNoId" />
     <result column="target" jdbcType="VARCHAR" property="target" />
+    <result column="answer_status" jdbcType="INTEGER" property="answerStatus" />
     <result column="manager_id" jdbcType="INTEGER" property="managerId" />
     <result column="show_status" jdbcType="INTEGER" property="showStatus" />
     <result column="answer_time" jdbcType="TIMESTAMP" property="answerTime" />
@@ -27,8 +29,8 @@
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `user_id`, `question_id`, `target`, `manager_id`, `show_status`, `answer_time`, 
-    `order`, `create_time`, `update_time`
+    `id`, `user_id`, `question_id`, `question_no_id`, `target`, `answer_status`, `manager_id`, 
+    `show_status`, `answer_time`, `order`, `create_time`, `update_time`
   </sql>
   <sql id="Blob_Column_List">
     <!--

+ 3 - 1
server/data/src/main/java/com/qxgmat/data/dao/mapping/UserMessageMapper.xml

@@ -7,8 +7,10 @@
     -->
     <id column="id" jdbcType="INTEGER" property="id" />
     <result column="user_id" jdbcType="INTEGER" property="userId" />
+    <result column="type" jdbcType="VARCHAR" property="type" />
     <result column="title" jdbcType="VARCHAR" property="title" />
     <result column="link" jdbcType="VARCHAR" property="link" />
+    <result column="is_read" jdbcType="INTEGER" property="isRead" />
     <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
   </resultMap>
   <resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="com.qxgmat.data.dao.entity.UserMessage">
@@ -21,7 +23,7 @@
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `user_id`, `title`, `link`, `create_time`
+    `id`, `user_id`, `type`, `title`, `link`, `is_read`, `create_time`
   </sql>
   <sql id="Blob_Column_List">
     <!--

+ 2 - 13
server/data/src/main/java/com/qxgmat/data/dao/mapping/UserPaperMapper.xml

@@ -10,25 +10,14 @@
     <result column="title" jdbcType="VARCHAR" property="title" />
     <result column="module" jdbcType="VARCHAR" property="module" />
     <result column="module_id" jdbcType="INTEGER" property="moduleId" />
+    <result column="question_no_ids" jdbcType="VARCHAR" property="questionNoIds" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler" />
     <result column="number" jdbcType="INTEGER" property="number" />
     <result column="time" jdbcType="INTEGER" property="time" />
   </resultMap>
-  <resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="com.qxgmat.data.dao.entity.UserPaper">
-    <!--
-      WARNING - @mbg.generated
-    -->
-    <result column="question_no_ids" jdbcType="LONGVARCHAR" property="questionNoIds" />
-  </resultMap>
   <sql id="Base_Column_List">
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `user_id`, `title`, `module`, `module_id`, `number`, `time`
-  </sql>
-  <sql id="Blob_Column_List">
-    <!--
-      WARNING - @mbg.generated
-    -->
-    `question_no_ids`
+    `id`, `user_id`, `title`, `module`, `module_id`, `question_no_ids`, `number`, `time`
   </sql>
 </mapper>

+ 5 - 1
server/data/src/main/java/com/qxgmat/data/dao/mapping/UserPayMapper.xml

@@ -7,12 +7,16 @@
     -->
     <id column="id" jdbcType="INTEGER" property="id" />
     <result column="user_id" jdbcType="INTEGER" property="userId" />
+    <result column="module" jdbcType="VARCHAR" property="module" />
+    <result column="module_extend" jdbcType="VARCHAR" property="moduleExtend" />
     <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+    <result column="is_use" jdbcType="INTEGER" property="isUse" />
+    <result column="use_time" jdbcType="TIMESTAMP" property="useTime" />
   </resultMap>
   <sql id="Base_Column_List">
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `user_id`, `create_time`
+    `id`, `user_id`, `module`, `module_extend`, `create_time`, `is_use`, `use_time`
   </sql>
 </mapper>

+ 6 - 15
server/data/src/main/java/com/qxgmat/data/dao/mapping/UserReportMapper.xml

@@ -7,34 +7,25 @@
     -->
     <id column="id" jdbcType="INTEGER" property="id" />
     <result column="user_id" jdbcType="INTEGER" property="userId" />
+    <result column="paper_id" jdbcType="INTEGER" property="paperId" />
     <result column="module" jdbcType="VARCHAR" property="module" />
     <result column="module_id" jdbcType="INTEGER" property="moduleId" />
-    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
     <result column="total_number" jdbcType="INTEGER" property="totalNumber" />
     <result column="total_time" jdbcType="INTEGER" property="totalTime" />
     <result column="user_number" jdbcType="INTEGER" property="userNumber" />
     <result column="user_time" jdbcType="INTEGER" property="userTime" />
+    <result column="question_no_ids" jdbcType="VARCHAR" property="questionNoIds" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler" />
     <result column="correct_number" jdbcType="INTEGER" property="correctNumber" />
     <result column="finish_time" jdbcType="TIMESTAMP" property="finishTime" />
     <result column="detail" jdbcType="VARCHAR" property="detail" typeHandler="com.nuliji.tools.mybatis.handler.JsonObjectHandler" />
-  </resultMap>
-  <resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="com.qxgmat.data.dao.entity.UserReport">
-    <!--
-      WARNING - @mbg.generated
-    -->
-    <result column="question_no_ids" jdbcType="LONGVARCHAR" property="questionNoIds" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
   </resultMap>
   <sql id="Base_Column_List">
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `user_id`, `module`, `module_id`, `create_time`, `total_number`, `total_time`, 
-    `user_number`, `user_time`, `correct_number`, `finish_time`, `detail`
-  </sql>
-  <sql id="Blob_Column_List">
-    <!--
-      WARNING - @mbg.generated
-    -->
-    `question_no_ids`
+    `id`, `user_id`, `paper_id`, `module`, `module_id`, `total_number`, `total_time`, 
+    `user_number`, `user_time`, `question_no_ids`, `correct_number`, `finish_time`, `detail`, 
+    `create_time`
   </sql>
 </mapper>

+ 23 - 0
server/data/src/main/java/com/qxgmat/data/relation/ExerciseQuestionRelationMapper.java

@@ -0,0 +1,23 @@
+package com.qxgmat.data.relation;
+
+import com.qxgmat.data.dao.entity.ExerciseQuestion;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * Created by gaojie on 2017/11/9.
+ */
+public interface ExerciseQuestionRelationMapper {
+    List<ExerciseQuestion> listAdmin(
+            @Param("structId") Number structId,
+            @Param("questionNo") Number questionNo,
+            @Param("paperId") Number paperId,
+            @Param("place") String place,
+            @Param("difficult") String difficult,
+            @Param("startTime") String startTime,
+            @Param("endTime") String endTime,
+            @Param("order") String order,
+            @Param("direction") String direction
+    );
+}

+ 14 - 0
server/data/src/main/java/com/qxgmat/data/relation/QuestionNoRelationMapper.java

@@ -0,0 +1,14 @@
+package com.qxgmat.data.relation;
+
+import com.qxgmat.data.dao.entity.Question;
+import com.qxgmat.data.dao.entity.QuestionNo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * Created by gaojie on 2017/11/9.
+ */
+public interface QuestionNoRelationMapper {
+
+}

+ 0 - 14
server/data/src/main/java/com/qxgmat/data/relation/QuestionRelationMapper.java

@@ -9,19 +9,5 @@ import java.util.List;
  * Created by gaojie on 2017/11/9.
  */
 public interface QuestionRelationMapper {
-    List<Question> listExerciseAdmin(
-            @Param("structId") Number structId,
-            @Param("questionNo") Number questionNo,
-            @Param("paperId") Number paperId,
-            @Param("place") String place,
-            @Param("difficult") String difficult,
-            @Param("startTime") String startTime,
-            @Param("endTime") String endTime,
-            @Param("order") String order,
-            @Param("direction") String direction
-    );
 
-    List<Question> listExaminationAdmin(
-
-    );
 }

+ 8 - 8
server/data/src/main/java/com/qxgmat/data/relation/UserAskRelationMapper.java

@@ -9,10 +9,17 @@ import java.util.List;
  * Created by gaojie on 2017/11/9.
  */
 public interface UserAskRelationMapper {
+    void adjust(
+            @Param("questionNoId") Number questionNoId,
+            @Param("order") Integer order,
+            @Param("direction") String direction,
+            @Param("flag") String flag
+    );
+
     List<UserAsk> listWithUser(
             @Param("category") Number category,
             @Param("userId") Number userId,
-            @Param("questionId") Number questionId,
+            @Param("questionNoId") Number questionNoId,
             @Param("target") String target,
             @Param("status") Integer status,
             @Param("showStatus") Integer showStatus,
@@ -21,11 +28,4 @@ public interface UserAskRelationMapper {
             String order,
             String direction
     );
-
-    void adjust(
-            @Param("questionId") Number questionId,
-            @Param("order") Integer order,
-            @Param("direction") String direction,
-            @Param("flag") String flag
-    );
 }

+ 8 - 1
server/data/src/main/java/com/qxgmat/data/relation/UserPaperRelationMapper.java

@@ -11,11 +11,18 @@ import java.util.List;
  * Created by gaojie on 2017/11/9.
  */
 public interface UserPaperRelationMapper {
-    List<UserPaper> listHomeworkPreview(
+
+    List<UserPaper> listHomeworkPreviewAdmin(
             @Param("category") Number category,
             @Param("userId") Number userId,
             @Param("previewId") Number previewId,
             @Param("startTime") String startTime,
             @Param("endTime") String endTime
     );
+    List<UserPaper> listHomeworkPreview(
+            @Param("category") Number category,
+            @Param("userId") Number userId,
+            @Param("endTime") String endTime,
+            @Param("finish") Boolean finish
+    );
 }

+ 7 - 4
server/data/src/main/java/com/qxgmat/data/relation/UserReportRelationMapper.java

@@ -3,17 +3,20 @@ package com.qxgmat.data.relation;
 import com.qxgmat.data.dao.entity.UserReport;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Collection;
 import java.util.List;
 
 /**
  * Created by gaojie on 2017/11/9.
  */
 public interface UserReportRelationMapper {
-    List<UserReport> listHomeworkPreviewAdmin(
-            @Param("category") Number category,
-            @Param("userId") Number userId,
-            @Param("previewId") Number previewId,
+    List<UserReport> listFinishLast(
+            @Param("paperIds") Collection paperIds,
             @Param("startTime") String startTime,
             @Param("endTime") String endTime
     );
+
+    List<UserReport> listLast(
+            @Param("paperIds") Collection paperIds
+    );
 }

+ 16 - 0
server/data/src/main/java/com/qxgmat/data/relation/entity/QuestionNoRelation.java

@@ -0,0 +1,16 @@
+package com.qxgmat.data.relation.entity;
+
+import com.qxgmat.data.dao.entity.Question;
+import com.qxgmat.data.dao.entity.QuestionNo;
+
+public class QuestionNoRelation extends QuestionNo {
+    private Question question;
+
+    public Question getQuestion() {
+        return question;
+    }
+
+    public void setQuestion(Question question) {
+        this.question = question;
+    }
+}

+ 0 - 4
server/data/src/main/java/com/qxgmat/data/relation/entity/SentenceQuestionRelation.java

@@ -2,11 +2,7 @@ package com.qxgmat.data.relation.entity;
 
 import com.qxgmat.data.dao.entity.Question;
 import com.qxgmat.data.dao.entity.SentenceQuestion;
-import com.qxgmat.data.dao.entity.UserPaper;
 
-/**
- * Created by gaojie on 2017/11/9.
- */
 public class SentenceQuestionRelation extends SentenceQuestion {
     private Question question;
 

+ 43 - 0
server/data/src/main/java/com/qxgmat/data/relation/entity/UserHomeworkPreviewRelation.java

@@ -0,0 +1,43 @@
+package com.qxgmat.data.relation.entity;
+
+import com.qxgmat.data.dao.entity.HomeworkPreview;
+import com.qxgmat.data.dao.entity.User;
+import com.qxgmat.data.dao.entity.UserPaper;
+import com.qxgmat.data.dao.entity.UserReport;
+
+import java.util.List;
+
+/**
+ * Created by gaojie on 2017/11/9.
+ */
+public class UserHomeworkPreviewRelation extends UserPaper {
+    private HomeworkPreview preview;
+
+    private UserReport report;
+
+    private User user;
+
+    public HomeworkPreview getPreview() {
+        return preview;
+    }
+
+    public void setPreview(HomeworkPreview preview) {
+        this.preview = preview;
+    }
+
+    public User getUser() {
+        return user;
+    }
+
+    public void setUser(User user) {
+        this.user = user;
+    }
+
+    public UserReport getReport() {
+        return report;
+    }
+
+    public void setReport(UserReport report) {
+        this.report = report;
+    }
+}

+ 0 - 12
server/data/src/main/java/com/qxgmat/data/relation/entity/UserPaperRelation.java

@@ -1,12 +0,0 @@
-package com.qxgmat.data.relation.entity;
-
-import com.qxgmat.data.dao.entity.UserPaper;
-
-import java.util.List;
-
-/**
- * Created by gaojie on 2017/11/9.
- */
-public class UserPaperRelation extends UserPaper {
-
-}

+ 52 - 0
server/data/src/main/java/com/qxgmat/data/relation/mapping/ExerciseQuestionRelationMapper.xml

@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qxgmat.data.relation.ExerciseQuestionRelationMapper">
+  <resultMap id="BaseResultMap" type="com.qxgmat.data.dao.entity.ExerciseQuestion">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="id" jdbcType="INT" property="id" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    q.`id`
+  </sql>
+
+  <!--练习题目列表列表-->
+  <select id="listAdmin" resultMap="BaseResultMap">
+    select
+    <include refid="Base_Column_List" />
+    from `question_no` qn
+    left join `question` q on q.`id` = qn.`question_id`
+    <if test="paperId != null">
+    left join `exercise_paper_question` epq on q.`id` = epg.`question_id`
+    left join `exercise_paper` ep on ep.`id` = epg.`paper_id`
+        and ep.`id` = #{paperId,jdbcType=VARCHAR}
+    </if>
+    where q.`module` = "exercise"
+    <if test="paperId != null">
+      and ep.`id` != null
+    </if>
+    <if test="structId != null">
+      and find_in_set(#{structId,jdbcType=VARCHAR}, q.`module_struct`)
+    </if>
+    <if test="questionNo != null">
+      and qn.`id` =#{questionNo,jdbcType=VARCHAR}
+    </if>
+    <if test="place != null">
+      and q.`place` =#{place,jdbcType=VARCHAR}
+    </if>
+    <if test="difficult != null">
+      and q.`difficult` =#{difficult,jdbcType=VARCHAR}
+    </if>
+    <if test="startTime != null">
+      and hp.`update_time` &gt; #{startTime,jdbcType=VARCHAR}
+    </if>
+    <if test="endTime != null">
+      and hp.`update_time` &lt; #{endTime,jdbcType=VARCHAR}
+    </if>
+    order by q.${order} ${direction}
+  </select>
+</mapper>

+ 17 - 0
server/data/src/main/java/com/qxgmat/data/relation/mapping/QuestionNoRelationMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qxgmat.data.relation.QuestionRelationMapper">
+  <resultMap id="BaseResultMap" type="com.qxgmat.data.dao.entity.QuestionNo">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="id" jdbcType="INT" property="id" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    q.`id`
+  </sql>
+
+</mapper>

+ 0 - 35
server/data/src/main/java/com/qxgmat/data/relation/mapping/QuestionRelationMapper.xml

@@ -14,39 +14,4 @@
     q.`id`
   </sql>
 
-  <!--练习题目列表列表-->
-  <select id="listExerciseAdmin" resultMap="BaseResultMap">
-    select
-    <include refid="Base_Column_List" />
-    from `question_no` qn
-    left join `question` q on q.`id` = qn.`question_id`
-    <if test="paperId != null">
-    left join `exercise_paper_question` epq on q.`id` = epg.`question_id`
-    left join `exercise_paper` ep on ep.`id` = epg.`paper_id`
-        and ep.`id` = #{paperId,jdbcType=VARCHAR}
-    </if>
-    where q.`module` = "exercise"
-    <if test="paperId != null">
-      and ep.`id` != null
-    </if>
-    <if test="structId != null">
-      and find_in_set(#{structId,jdbcType=VARCHAR}, q.`module_struct`)
-    </if>
-    <if test="questionNo != null">
-      and qn.`id` =#{questionNo,jdbcType=VARCHAR}
-    </if>
-    <if test="place != null">
-      and q.`place` =#{place,jdbcType=VARCHAR}
-    </if>
-    <if test="difficult != null">
-      and q.`difficult` =#{difficult,jdbcType=VARCHAR}
-    </if>
-    <if test="startTime != null">
-      and hp.`update_time` &gt; #{startTime,jdbcType=VARCHAR}
-    </if>
-    <if test="endTime != null">
-      and hp.`update_time` &lt; #{endTime,jdbcType=VARCHAR}
-    </if>
-    order by q.${order} ${direction}
-  </select>
 </mapper>

+ 2 - 2
server/data/src/main/java/com/qxgmat/data/relation/mapping/UserAskRelationMapper.xml

@@ -40,8 +40,8 @@
       </if>
     where
     u.`id` != null
-    <if test="questionId != null">
-      and ua.`question_id` = #{questionId,jdbcType=VARCHAR}
+    <if test="questionNoId != null">
+      and ua.`question_no_id` = #{questionNoId,jdbcType=VARCHAR}
     </if>
     <if test="target != null">
       and ua.`target` = #{target,jdbcType=VARCHAR}

+ 19 - 16
server/data/src/main/java/com/qxgmat/data/relation/mapping/UserPaperRelationMapper.xml

@@ -14,30 +14,33 @@
     up.`id`
   </sql>
 
-  <!--用户预习作业列表-->
-  <select id="listHomeworkPreview" resultMap="BaseResultMap">
+  <!--用户预习作业列表
+    https://blog.csdn.net/t_1007/article/details/52369261
+  -->
+  <select id="listHomeworkPreviewAdmin" resultMap="BaseResultMap">
     select
     <include refid="Base_Column_List" />
     from `user_paper` up
     left join `homework_preview` hp on hp.`id` = up.`module_id`
       and up.`module` = "homework_preview"
-      <if test="category != null">
-        and hp.`category` = #{category,jdbcType=VARCHAR}
-      </if>
-      <if test="previewId != null">
-        and hp.`module_id` = #{previewId,jdbcType=VARCHAR}
-      </if>
-      <if test="startTime != null">
-        and hp.`start_time` &gt; #{startTime,jdbcType=VARCHAR}
-      </if>
-      <if test="endTime != null">
-        and hp.`end_time` &lt; #{endTime,jdbcType=VARCHAR}
-      </if>
+    left join `user_report` ur on hp.`id` = ur.`module_id`
+      and ur.`module` = "homework_preview"
+    <if test="previewId != null">
+      and up.`module_id` = #{previewId,jdbcType=VARCHAR}
+    </if>
+    <if test="category != null">
+      and hp.`category` = #{category,jdbcType=VARCHAR}
+    </if>
     where
     hp.`id` != null
     <if test="userId != null">
-    and up.`user_id` = #{userId,jdbcType=VARCHAR}
+      and up.`user_id` = #{userId,jdbcType=VARCHAR}
+    </if>
+    <if test="startTime != null">
+      and up.`createTime` &gt; #{startTime,jdbcType=VARCHAR}
+    </if>
+    <if test="endTime != null">
+      and up.`createTime` &lt; #{endTime,jdbcType=VARCHAR}
     </if>
-    order by up.`id` desc
   </select>
 </mapper>

+ 38 - 22
server/data/src/main/java/com/qxgmat/data/relation/mapping/UserReportRelationMapper.xml

@@ -14,33 +14,49 @@
     ur.`id`
   </sql>
 
-  <!--用户预习作业列表
-    后台查询:用户完成度最高的最后一次
+  <!--
+    用户完成度最高的最后一次
     https://blog.csdn.net/t_1007/article/details/52369261
   -->
-  <select id="listHomeworkPreviewAdmin" resultMap="BaseResultMap">
+  <select id="listFinishLast" resultMap="BaseResultMap">
     select
       SUBSTRING_INDEX(GROUP_CONCAT(ur.`id` ORDER BY ur.`user_number` desc, ur.`create_time` desc),',',1)
     from `user_report` ur
-    left join `homework_preview` hp on hp.`id` = ur.`module_id`
-      and up.`module` = "homework_preview"
-      <if test="previewId != null">
-        and hp.`module_id` = #{previewId,jdbcType=VARCHAR}
-      </if>
-      <if test="category != null">
-        and hp.`category` = #{category,jdbcType=VARCHAR}
-      </if>
     where
-    hp.`id` != null
-    <if test="userId != null">
-    and up.`user_id` = #{userId,jdbcType=VARCHAR}
-    </if>
-    <if test="startTime != null">
-      and up.`createTime` &gt; #{startTime,jdbcType=VARCHAR}
-    </if>
-    <if test="endTime != null">
-      and up.`createTime` &lt; #{endTime,jdbcType=VARCHAR}
-    </if>
-    group by up.`user_id`
+    up.`paper_id` IN
+    <foreach collection="paperIds" item="item" index="index" open="(" close=")" separator=",">
+      #{id}
+    </foreach>
+
+    <!--<if test="startTime != null">-->
+      <!--and up.`createTime` &gt; #{startTime,jdbcType=VARCHAR}-->
+    <!--</if>-->
+    <!--<if test="endTime != null">-->
+      <!--and up.`createTime` &lt; #{endTime,jdbcType=VARCHAR}-->
+    <!--</if>-->
+    group by up.`paper_id`
+  </select>
+
+  <!--
+    用户最后一次
+    https://blog.csdn.net/t_1007/article/details/52369261
+  -->
+  <select id="listLast" resultMap="BaseResultMap">
+    select
+    SUBSTRING_INDEX(GROUP_CONCAT(ur.`id` ORDER BY ur.`create_time` desc),',',1)
+    from `user_report` ur
+    where
+    up.`paper_id` IN
+    <foreach collection="paperIds" item="item" index="index" open="(" close=")" separator=",">
+      #{id}
+    </foreach>
+
+    <!--<if test="startTime != null">-->
+    <!--and up.`createTime` &gt; #{startTime,jdbcType=VARCHAR}-->
+    <!--</if>-->
+    <!--<if test="endTime != null">-->
+    <!--and up.`createTime` &lt; #{endTime,jdbcType=VARCHAR}-->
+    <!--</if>-->
+    group by up.`paper_id`
   </select>
 </mapper>

+ 25 - 21
server/data/src/main/resources/mybatis-generator.xml

@@ -98,14 +98,23 @@
             <generatedKey column="id" sqlStatement="Mysql" identity="true"/>
             <columnOverride column="permission_list" javaType="String[]" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.StringArrayWithJsonHandler"/>
         </table>
-        <table schema="qianxing" tableName="homework_preview" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" delimitAllColumns="true">
+        <table schema="qianxing" tableName="exercise_paper" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" delimitAllColumns="true">
             <generatedKey column="id" sqlStatement="Mysql" identity="true"/>
-            <columnOverride column="question_ids" javaType="Integer[]" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler"/>
-            <columnOverride column="user_ids" javaType="Integer[]" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler"/>
+            <columnOverride column="struct_parent" javaType="Integer[]" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayHandler"/>
+            <columnOverride column="question_no_ids" javaType="Integer[]" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler"/>
         </table>
-        <table schema="qianxing" tableName="user_paper" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" delimitAllColumns="true">
+        <table schema="qianxing" tableName="examination_paper" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" delimitAllColumns="true">
+            <generatedKey column="id" sqlStatement="Mysql" identity="true"/>
+            <columnOverride column="question_no_ids" javaType="Integer[]" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler"/>
+        </table>
+        <table schema="qianxing" tableName="textbook_paper" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" delimitAllColumns="true">
             <generatedKey column="id" sqlStatement="Mysql" identity="true"/>
-            <columnOverride column="question_ids" javaType="Integer[]" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler"/>
+            <columnOverride column="question_no_ids" javaType="Integer[]" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler"/>
+        </table>
+        <table schema="qianxing" tableName="homework_preview" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" delimitAllColumns="true">
+            <generatedKey column="id" sqlStatement="Mysql" identity="true"/>
+            <columnOverride column="question_no_ids" javaType="Integer[]" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler"/>
+            <columnOverride column="user_ids" javaType="Integer[]" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler"/>
         </table>
         <table schema="qianxing" tableName="setting" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" delimitAllColumns="true">
             <generatedKey column="id" sqlStatement="Mysql" identity="true"/>
@@ -115,32 +124,27 @@
             <generatedKey column="id" sqlStatement="Mysql" identity="true"/>
             <columnOverride column="keyword" javaType="String[]" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.StringArrayHandler"/>
             <columnOverride column="answer" javaType="com.alibaba.fastjson.JSONObject" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.JsonObjectHandler"/>
+            <columnOverride column="style" javaType="com.alibaba.fastjson.JSONObject" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.JsonObjectHandler"/>
+            <columnOverride column="content" javaType="com.alibaba.fastjson.JSONObject" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.JsonObjectHandler"/>
         </table>
-        <table schema="qianxing" tableName="question_id" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" delimitAllColumns="true">
+        <table schema="qianxing" tableName="question_no" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" delimitAllColumns="true">
             <generatedKey column="id" sqlStatement="Mysql" identity="true"/>
             <columnOverride column="module_struct" javaType="Integer[]" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayHandler"/>
         </table>
-        <table schema="qianxing" tableName="user_question" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" delimitAllColumns="true">
-            <generatedKey column="id" sqlStatement="Mysql" identity="true"/>
-            <columnOverride column="user_answer" javaType="com.alibaba.fastjson.JSONObject" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.JsonObjectHandler"/>
-            <columnOverride column="answer" javaType="com.alibaba.fastjson.JSONObject" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.JsonObjectHandler"/>
-        </table>
-        <table schema="qianxing" tableName="exercise_paper" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" delimitAllColumns="true">
-            <generatedKey column="id" sqlStatement="Mysql" identity="true"/>
-            <columnOverride column="struct_parent" javaType="Integer[]" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayHandler"/>
-        </table>
-        <table schema="qianxing" tableName="exercise_paper" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" delimitAllColumns="true">
-            <generatedKey column="id" sqlStatement="Mysql" identity="true"/>
-            <columnOverride column="struct_parent" javaType="Integer[]" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayHandler"/>
-        </table>
         <table schema="qianxing" tableName="user_paper" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" delimitAllColumns="true">
             <generatedKey column="id" sqlStatement="Mysql" identity="true"/>
-            <columnOverride column="question_ids" javaType="Integer[]" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler"/>
+            <columnOverride column="question_no_ids" javaType="Integer[]" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler"/>
         </table>
         <table schema="qianxing" tableName="user_report" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" delimitAllColumns="true">
             <generatedKey column="id" sqlStatement="Mysql" identity="true"/>
             <columnOverride column="detail" javaType="com.alibaba.fastjson.JSONObject" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.JsonObjectHandler"/>
-            <columnOverride column="question_ids" javaType="Integer[]" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler"/>
+            <columnOverride column="question_no_ids" javaType="Integer[]" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.IntegerArrayWithJsonHandler"/>
+            <columnOverride column="detail" javaType="com.alibaba.fastjson.JSONObject" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.JsonObjectHandler"/>
+        </table>
+        <table schema="qianxing" tableName="user_question" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" delimitAllColumns="true">
+            <generatedKey column="id" sqlStatement="Mysql" identity="true"/>
+            <columnOverride column="user_answer" javaType="com.alibaba.fastjson.JSONObject" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.JsonObjectHandler"/>
+            <columnOverride column="answer" javaType="com.alibaba.fastjson.JSONObject" jdbcType="VARCHAR" typeHandler="com.nuliji.tools.mybatis.handler.JsonObjectHandler"/>
         </table>
     </context>
 </generatorConfiguration>

+ 2 - 0
server/gateway-api/src/main/java/com/qxgmat/Application.java

@@ -5,12 +5,14 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.web.servlet.ServletComponentScan;
 import org.springframework.cache.annotation.EnableCaching;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 
 @EnableScheduling
 @EnableCaching
+@EnableAsync
 @EnableTransactionManagement
 @SpringBootApplication(
     scanBasePackages = {"com.nuliji.*", "com.qxgmat.*", "com.qxgmat.data.*"}

+ 1 - 1
server/gateway-api/src/main/java/com/qxgmat/controller/admin/AdController.java

@@ -57,7 +57,7 @@ public class AdController {
     @RequestMapping(value = "/detail", method = RequestMethod.GET)
     @ApiOperation(value = "获取广告", httpMethod = "GET")
     public Response<Ad> detail(@RequestParam int id, HttpSession session) {
-        Ad entity = adService.selectOne(id);
+        Ad entity = adService.get(id);
         return ResponseHelp.success(entity);
     }
 

+ 3 - 3
server/gateway-api/src/main/java/com/qxgmat/controller/admin/AuthController.java

@@ -56,7 +56,7 @@ public class AuthController {
             throw new AuthException("未登录");
         }
         ManagerRelation managerRelation = Transform.convert(manager, ManagerRelation.class);
-        managerRelation.setRole(managerRoleService.selectOne(managerRelation.getRoleId()));
+        managerRelation.setRole(managerRoleService.get(managerRelation.getRoleId()));
         managerLogService.log(request);
         return ResponseHelp.success(Transform.convert(managerRelation, LoginUserDto.class));
     }
@@ -67,7 +67,7 @@ public class AuthController {
         shiroHelp.getSession().login(shiroHelp.manager(loginDto.getUsername(), loginDto.getPassword(), loginDto.getRemember()));
         Manager manager = shiroHelp.getLoginManager();
         ManagerRelation managerRelation = Transform.convert(manager, ManagerRelation.class);
-        managerRelation.setRole(managerRoleService.selectOne(managerRelation.getRoleId()));
+        managerRelation.setRole(managerRoleService.get(managerRelation.getRoleId()));
         managerLogService.log(request);
         return ResponseHelp.success(Transform.convert(managerRelation, LoginUserDto.class));
     }
@@ -86,7 +86,7 @@ public class AuthController {
         Manager manager = (Manager)shiroHelp.getLoginManager();
         if(manager == null) return ResponseHelp.success(new LoginUserDto());
         ManagerRelation managerRelation = Transform.convert(manager, ManagerRelation.class);
-        managerRelation.setRole(managerRoleService.selectOne(managerRelation.getRoleId()));
+        managerRelation.setRole(managerRoleService.get(managerRelation.getRoleId()));
         return ResponseHelp.success(Transform.convert(managerRelation, LoginUserDto.class));
     }
 }

+ 52 - 10
server/gateway-api/src/main/java/com/qxgmat/controller/admin/ExerciseController.java

@@ -1,22 +1,26 @@
 package com.qxgmat.controller.admin;
 
 
+import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.Page;
 import com.nuliji.tools.PageMessage;
 import com.nuliji.tools.Response;
 import com.nuliji.tools.ResponseHelp;
 import com.nuliji.tools.Transform;
+import com.nuliji.tools.exception.ParameterException;
+import com.qxgmat.data.constants.enums.SettingKey;
 import com.qxgmat.data.constants.enums.status.DirectionStatus;
-import com.qxgmat.data.dao.entity.ExercisePaper;
-import com.qxgmat.data.dao.entity.ExerciseStruct;
-import com.qxgmat.data.dao.entity.Question;
+import com.qxgmat.data.dao.entity.*;
+import com.qxgmat.data.relation.entity.QuestionNoRelation;
+import com.qxgmat.dto.admin.extend.ExercisePaperExtendDto;
+import com.qxgmat.dto.admin.extend.QuestionExtendDto;
+import com.qxgmat.dto.admin.extend.QuestionNoExtendDto;
 import com.qxgmat.dto.admin.request.ExerciseStructDto;
 import com.qxgmat.dto.admin.response.ExercisePaperListDto;
 import com.qxgmat.dto.admin.response.ExerciseQuestionListDto;
 import com.qxgmat.service.ExercisePaperService;
-import com.qxgmat.service.inline.ExerciseStructService;
-import com.qxgmat.service.inline.ManagerLogService;
-import com.qxgmat.service.inline.QuestionService;
+import com.qxgmat.service.inline.*;
+import com.qxgmat.task.AsyncTask;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -26,6 +30,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
+import java.util.Collection;
 import java.util.List;
 
 @RestController("AdminExerciseController")
@@ -42,8 +47,20 @@ public class ExerciseController {
     private ExercisePaperService exercisePaperService;
 
     @Autowired
+    private ExerciseQuestionService exerciseQuestionService;
+
+    @Autowired
+    private QuestionNoService questionNoService;
+
+    @Autowired
     private QuestionService questionService;
 
+    @Autowired
+    private SettingService settingService;
+
+    @Autowired
+    private AsyncTask asyncTask;
+
     @RequestMapping(value = "/struct/add", method = RequestMethod.POST)
     @ApiOperation(value = "添加练习层级", httpMethod = "POST")
     public Response<ExerciseStruct> add(@RequestBody @Validated ExerciseStructDto dto, HttpServletRequest request) {
@@ -52,6 +69,7 @@ public class ExerciseController {
         managerLogService.log(request);
         return ResponseHelp.success(entity);
     }
+
     @RequestMapping(value = "/struct/edit", method = RequestMethod.PUT)
     @ApiOperation(value = "编辑练习层级", httpMethod = "PUT")
     public Response<Boolean> edit(@RequestBody @Validated ExerciseStructDto dto, HttpServletRequest request) {
@@ -104,14 +122,38 @@ public class ExerciseController {
             @RequestParam(required = false, defaultValue = "id") String order,
             @RequestParam(required = false, defaultValue = "desc") String direction,
             HttpSession session) {
-        Page<Question> p = questionService.listExerciseAdmin(page, size, structId, questionNoId, paperId, place, difficult, startTime, endTime, order, DirectionStatus.ValueOf(direction));
+        Page<ExerciseQuestion> p = exerciseQuestionService.listAdmin(page, size, structId, questionNoId, paperId, place, difficult, startTime, endTime, order, DirectionStatus.ValueOf(direction));
         List<ExerciseQuestionListDto> pr = Transform.convert(p, ExerciseQuestionListDto.class);
 
+        // 绑定题目
+        Collection questionIds = Transform.getIds(p, ExerciseQuestion.class, "questionId");
+        List<Question> questionList = questionService.select(questionIds);
+        Transform.combine(pr, questionList, ExerciseQuestionListDto.class, "questionId", "question", Question.class, "id", QuestionExtendDto.class);
+
+        // 绑定题目编号
+        Collection questionNoIds = Transform.getIds(p, ExerciseQuestion.class, "questionNoId");
+        List<QuestionNo> questionNoList = questionNoService.select(questionNoIds);
+        Transform.combine(pr, questionNoList, ExerciseQuestionListDto.class, "questionNoId", "questionNo", QuestionNo.class, "id", QuestionNoExtendDto.class);
+
         // 绑定练习册
-//        Collection previewIds = Transform.getIds(p, Question.class, "moduleId");
-//        List<HomeworkPreview> homeworkPreviewList = homeworkPreviewService.select(previewIds);
-//        Transform.combine(pr, homeworkPreviewList, UserHomeworkPreviewListDto.class, "moduleId", "preview", HomeworkPreview.class, "id", HomeworkPreviewExtendDto.class);
+        Collection paperIds = Transform.getIds(p, ExerciseQuestion.class, "paperId");
+        List<ExercisePaper> paperList = exercisePaperService.select(paperIds);
+        Transform.combine(pr, paperList, ExerciseQuestionListDto.class, "paperId", "paper", ExercisePaper.class, "id", ExercisePaperExtendDto.class);
 
         return ResponseHelp.success(pr, page, size, p.getTotal());
     }
+
+    @RequestMapping(value = "/paper/auto", method = RequestMethod.POST)
+    @ApiOperation(value = "自动组卷", httpMethod = "POST")
+    public Response<Boolean> paperAuto(@RequestBody @Validated ExerciseStructDto dto, HttpServletRequest request) {
+        // 判断当前组卷状态
+        Setting setting = settingService.getByKey(SettingKey.EXERCISE_PAPER_STATUS);
+        JSONObject status = setting.getValue();
+        if (status.getInteger("process")<100){
+            throw new ParameterException("组卷进行中,请稍后再试");
+        }
+        asyncTask.autoExercisePaper();
+
+        return ResponseHelp.success(true);
+    }
 }

+ 3 - 3
server/gateway-api/src/main/java/com/qxgmat/controller/admin/ManagerController.java

@@ -64,9 +64,9 @@ public class ManagerController {
     @RequestMapping(value = "/detail", method = RequestMethod.GET)
     @ApiOperation(value = "获取管理账号", httpMethod = "GET")
     public Response<ManagerRelation> detail(@RequestParam int id, HttpSession session) {
-        Manager entity = managerService.selectOne(id);
+        Manager entity = managerService.get(id);
         ManagerRelation relation = Transform.convert(entity, ManagerRelation.class);
-        relation.setRole(managerRoleService.selectOne(relation.getRoleId()));
+        relation.setRole(managerRoleService.get(relation.getRoleId()));
         return ResponseHelp.success(relation);
     }
     @RequestMapping(value = "/list", method = RequestMethod.GET)
@@ -115,7 +115,7 @@ public class ManagerController {
     @RequestMapping(value = "/role/detail", method = RequestMethod.GET)
     @ApiOperation(value = "获取管理角色", httpMethod = "GET")
     public Response<ManagerRole> detailRole(@RequestParam int id, HttpSession session) {
-        ManagerRole entity = managerRoleService.selectOne(id);
+        ManagerRole entity = managerRoleService.get(id);
         return ResponseHelp.success(entity);
     }
     @RequestMapping(value = "/role/list", method = RequestMethod.GET)

+ 18 - 4
server/gateway-api/src/main/java/com/qxgmat/controller/admin/PreviewController.java

@@ -7,10 +7,14 @@ import com.nuliji.tools.ResponseHelp;
 import com.nuliji.tools.Transform;
 import com.qxgmat.data.constants.enums.status.HomeworkPreviewStatus;
 import com.qxgmat.data.dao.entity.HomeworkPreview;
+import com.qxgmat.data.relation.entity.QuestionNoRelation;
+import com.qxgmat.dto.admin.extend.QuestionNoExtendDto;
 import com.qxgmat.dto.admin.request.HomeworkPreviewDto;
+import com.qxgmat.dto.admin.response.HomeworkPreviewDetailDto;
 import com.qxgmat.dto.admin.response.HomeworkPreviewListDto;
-import com.qxgmat.service.inline.HomeworkPreviewService;
+import com.qxgmat.service.HomeworkPreviewService;
 import com.qxgmat.service.inline.ManagerLogService;
+import com.qxgmat.service.inline.QuestionNoService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -32,6 +36,9 @@ public class PreviewController {
     @Autowired
     private HomeworkPreviewService homeworkPreviewService;
 
+    @Autowired
+    private QuestionNoService questionNoService;
+
     @RequestMapping(value = "/add", method = RequestMethod.POST)
     @ApiOperation(value = "添加预习作业", httpMethod = "POST")
     public Response<HomeworkPreview> add(@RequestBody @Validated HomeworkPreviewDto dto, HttpServletRequest request) {
@@ -59,9 +66,16 @@ public class PreviewController {
 
     @RequestMapping(value = "/detail", method = RequestMethod.GET)
     @ApiOperation(value = "获取预习作业", httpMethod = "GET")
-    public Response<HomeworkPreview> detail(@RequestParam int id, HttpSession session) {
-        HomeworkPreview entity = homeworkPreviewService.selectOne(id);
-        return ResponseHelp.success(entity);
+    public Response<HomeworkPreviewDetailDto> detail(@RequestParam int id, HttpSession session) {
+        HomeworkPreview entity = homeworkPreviewService.get(id);
+        HomeworkPreviewDetailDto dto = Transform.convert(entity, HomeworkPreviewDetailDto.class);
+
+        List<QuestionNoRelation> questionNos = questionNoService.listByIds(entity.getQuestionNoIds());
+        List<QuestionNoExtendDto> questionNoExtendDtos = Transform.convert(questionNos, QuestionNoExtendDto.class);
+
+        dto.setQuestionNos(questionNoExtendDtos);
+
+        return ResponseHelp.success(dto);
     }
 
     @RequestMapping(value = "/list", method = RequestMethod.GET)

+ 48 - 4
server/gateway-api/src/main/java/com/qxgmat/controller/admin/QuestionController.java

@@ -5,20 +5,23 @@ import com.nuliji.tools.Response;
 import com.nuliji.tools.ResponseHelp;
 import com.nuliji.tools.Transform;
 import com.qxgmat.data.dao.entity.Question;
+import com.qxgmat.data.relation.entity.QuestionNoRelation;
+import com.qxgmat.dto.admin.extend.QuestionNoExtendDto;
 import com.qxgmat.dto.admin.request.QuestionDto;
+import com.qxgmat.dto.admin.request.QuestionNoSearchDto;
 import com.qxgmat.service.ExercisePaperService;
 import com.qxgmat.service.inline.ManagerLogService;
+import com.qxgmat.service.inline.QuestionNoService;
+import com.qxgmat.service.inline.QuestionService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 
 @RestController("AdminQuestionController")
 @RequestMapping("/admin/question")
@@ -31,6 +34,12 @@ public class QuestionController {
     @Autowired
     private ExercisePaperService exercisePaperService;
 
+    @Autowired
+    private QuestionNoService questionNoService;
+
+    @Autowired
+    private QuestionService questionService;
+
     @RequestMapping(value = "/add", method = RequestMethod.POST)
     @ApiOperation(value = "添加题目", httpMethod = "POST")
     public Response<Question> add(@RequestBody @Validated QuestionDto dto, HttpServletRequest request) {
@@ -52,4 +61,39 @@ public class QuestionController {
         managerLogService.log(request);
         return ResponseHelp.success(true);
     }
+
+    @RequestMapping(value = "/list/no", method = RequestMethod.POST)
+    @ApiOperation(value = "题目编号列表:通过编号", httpMethod = "POST")
+    public Response<List<QuestionNoExtendDto>> listNo(@RequestBody @Validated QuestionNoSearchDto dto, HttpServletRequest request) {
+        List<QuestionNoRelation> questionNos = questionNoService.listByNos(dto.getNo(), dto.getModule());
+        List<QuestionNoExtendDto> questionNoExtendDtos = Transform.convert(questionNos, QuestionNoExtendDto.class);
+
+        return ResponseHelp.success(questionNoExtendDtos);
+    }
+
+    @RequestMapping(value = "/search/stem", method = RequestMethod.GET)
+    @ApiOperation(value = "搜索题目编号列表:题干搜索", httpMethod = "GET")
+    public Response<List<QuestionNoExtendDto>> searchStem(
+            @RequestParam(required = false, defaultValue = "1") int page,
+            @RequestParam(required = false, defaultValue = "100") int size,
+            @RequestParam(required = false, name="stem") String stem,
+            HttpServletRequest request) {
+        List<QuestionNoRelation> questionNos = questionNoService.searchStem(page, size, stem);
+        List<QuestionNoExtendDto> questionNoExtendDtos = Transform.convert(questionNos, QuestionNoExtendDto.class);
+
+        return ResponseHelp.success(questionNoExtendDtos);
+    }
+
+    @RequestMapping(value = "/search/no", method = RequestMethod.GET)
+    @ApiOperation(value = "搜索题目编号列表:题干搜索", httpMethod = "GET")
+    public Response<List<QuestionNoExtendDto>> searchNo(
+            @RequestParam(required = false, defaultValue = "1") int page,
+            @RequestParam(required = false, defaultValue = "100") int size,
+            @RequestParam(required = false, name="no") String no,
+            HttpServletRequest request) {
+        List<QuestionNoRelation> questionNos = questionNoService.searchNo(page, size, no);
+        List<QuestionNoExtendDto> questionNoExtendDtos = Transform.convert(questionNos, QuestionNoExtendDto.class);
+
+        return ResponseHelp.success(questionNoExtendDtos);
+    }
 }

+ 13 - 20
server/gateway-api/src/main/java/com/qxgmat/controller/admin/SentenceController.java

@@ -10,6 +10,7 @@ import com.qxgmat.data.dao.entity.SentenceArticle;
 import com.qxgmat.data.dao.entity.SentenceQuestion;
 import com.qxgmat.data.relation.entity.SentenceQuestionRelation;
 import com.qxgmat.dto.admin.request.ManagerDto;
+import com.qxgmat.dto.admin.response.SentenceQuestionListDto;
 import com.qxgmat.service.SentencePaperService;
 import com.qxgmat.service.inline.ManagerLogService;
 import com.qxgmat.service.inline.QuestionService;
@@ -45,16 +46,16 @@ public class SentenceController {
 
     @RequestMapping(value = "/article/add", method = RequestMethod.POST)
     @ApiOperation(value = "添加长难句文章", httpMethod = "POST")
-    public Response<SentenceArticle> addArticle(@RequestBody @Validated ManagerDto dto, HttpServletRequest request) {
-        SentenceArticle entity = Transform.dtoToEntity(dto);
+    public Response<SentenceArticle> addArticle(@RequestBody @Validated SentenceArticle dto, HttpServletRequest request) {
+        SentenceArticle entity = Transform.convert(dto, SentenceArticle.class);
         entity = sentenceArticleService.add(entity);
         managerLogService.log(request);
         return ResponseHelp.success(Transform.convert(entity, SentenceArticle.class));
     }
     @RequestMapping(value = "/article/edit", method = RequestMethod.PUT)
     @ApiOperation(value = "编辑长难句文章", httpMethod = "PUT")
-    public Response<Boolean> editArticle(@RequestBody @Validated ManagerDto dto, HttpServletRequest request) {
-        SentenceArticle entity = Transform.dtoToEntity(dto);
+    public Response<Boolean> editArticle(@RequestBody @Validated SentenceArticle dto, HttpServletRequest request) {
+        SentenceArticle entity = Transform.convert(dto, SentenceArticle.class);
         entity = sentenceArticleService.edit(entity);
         managerLogService.log(request);
         return ResponseHelp.success(true);
@@ -70,7 +71,7 @@ public class SentenceController {
     @RequestMapping(value = "/article/detail", method = RequestMethod.GET)
     @ApiOperation(value = "获取长难句文章", httpMethod = "GET")
     public Response<SentenceArticle> detailArticle(@RequestParam int id, HttpSession session) {
-        SentenceArticle entity = sentenceArticleService.selectOne(id);
+        SentenceArticle entity = sentenceArticleService.get(id);
         return ResponseHelp.success(Transform.convert(entity, SentenceArticle.class));
     }
     @RequestMapping(value = "/article/list", method = RequestMethod.GET)
@@ -78,8 +79,8 @@ public class SentenceController {
     public Response<PageMessage<SentenceArticle>> listArticle(
             @RequestParam(required = false, defaultValue = "1") int page,
             @RequestParam(required = false, defaultValue = "100") int size,
-            @RequestParam(required = false, defaultValue = "") int chapter,
-            @RequestParam(required = false, defaultValue = "desc") int part,
+            @RequestParam(required = false) Number chapter,
+            @RequestParam(required = false) Number part,
             HttpSession session) {
         Page<SentenceArticle> p = sentenceArticleService.select(page, size, chapter, part);
         List<SentenceArticle> pr = Transform.convert(p, SentenceArticle.class);
@@ -113,26 +114,18 @@ public class SentenceController {
     @RequestMapping(value = "/question/detail", method = RequestMethod.GET)
     @ApiOperation(value = "获取长难句题目", httpMethod = "GET")
     public Response<SentenceQuestionRelation> detailQuestion(@RequestParam int id, HttpSession session) {
-        SentenceQuestion entity = sentenceQuestionService.selectOne(id);
-        SentenceQuestionRelation relation = Transform.convert(entity, SentenceQuestionRelation.class);
-        relation.setQuestion(questionService.selectOne(relation.getQuestionId()));
+        SentenceQuestion entity = sentenceQuestionService.get(id);
+        SentenceQuestionRelation relation = sentenceQuestionService.relation(entity);
         return ResponseHelp.success(relation);
     }
     @RequestMapping(value = "/question/list", method = RequestMethod.GET)
     @ApiOperation(value = "长难句题目列表", httpMethod = "GET")
-    public Response<PageMessage<SentenceQuestionRelation>> listQuestion(
+    public Response<PageMessage<SentenceQuestionListDto>> listQuestion(
             @RequestParam(required = false, defaultValue = "1") int page,
             @RequestParam(required = false, defaultValue = "100") int size,
-            @RequestParam(required = false, defaultValue = "0") int chapter,
-            @RequestParam(required = false, defaultValue = "0") int part,
             HttpSession session) {
-        Page<SentenceQuestion> p = sentenceQuestionService.select(page, size, chapter, part);
-        List<SentenceQuestionRelation> pr = Transform.convert(p, SentenceQuestionRelation.class);
-
-        // 绑定题目
-        Collection ids = Transform.getIds(p, SentenceQuestion.class, "questionId");
-        List<Question> questionList = questionService.select(ids);
-        Transform.combine(pr, questionList, SentenceQuestionRelation.class, "questionId", "question", Question.class, "id");
+        Page<SentenceQuestion> p = sentenceQuestionService.select(page, size);
+        List<SentenceQuestionListDto> pr = Transform.convert(p, SentenceQuestionListDto.class);
 
         return ResponseHelp.success(pr, page, size, p.getTotal());
     }

+ 40 - 4
server/gateway-api/src/main/java/com/qxgmat/controller/admin/SettingController.java

@@ -3,8 +3,12 @@ package com.qxgmat.controller.admin;
 import com.alibaba.fastjson.JSONObject;
 import com.nuliji.tools.Response;
 import com.nuliji.tools.ResponseHelp;
+import com.nuliji.tools.Transform;
 import com.qxgmat.data.constants.enums.SettingKey;
+import com.qxgmat.data.dao.entity.Rank;
 import com.qxgmat.data.dao.entity.Setting;
+import com.qxgmat.dto.admin.request.RankDto;
+import com.qxgmat.service.inline.RankService;
 import com.qxgmat.service.inline.SettingService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -13,10 +17,9 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
 
 
 @RestController("AdminSettingController")
@@ -28,6 +31,9 @@ public class SettingController {
     @Autowired
     private SettingService settingService;
 
+    @Autowired
+    private RankService rankService;
+
     @RequestMapping(value = "/index", method = RequestMethod.PUT)
     @ApiOperation(value = "修改首页配置", httpMethod = "PUT")
     private Response<Boolean> indexEdit(@RequestBody @Validated JSONObject dto){
@@ -147,4 +153,34 @@ public class SettingController {
 
         return ResponseHelp.success(entity.getValue());
     }
+
+    @RequestMapping(value = "/rank/add", method = RequestMethod.POST)
+    @ApiOperation(value = "添加排行", httpMethod = "POST")
+    private Response<Boolean> rankAdd(@RequestBody @Validated RankDto dto){
+        Rank entity = Transform.dtoToEntity(dto);
+        rankService.add(entity);
+        return ResponseHelp.success(true);
+    }
+
+    @RequestMapping(value = "/rank/edit", method = RequestMethod.PUT)
+    @ApiOperation(value = "修改排行", httpMethod = "PUT")
+    private Response<Boolean> rankEdit(@RequestBody @Validated RankDto dto){
+        Rank entity = Transform.dtoToEntity(dto);
+        rankService.edit(entity);
+        return ResponseHelp.success(true);
+    }
+
+    @RequestMapping(value = "/rank/delete", method = RequestMethod.DELETE)
+    @ApiOperation(value = "删除排行", httpMethod = "DELETE")
+    private Response<Boolean> rankDelete(@RequestParam int id){
+        rankService.delete(id);
+        return ResponseHelp.success(true);
+    }
+
+    @RequestMapping(value = "/rank/list", method = RequestMethod.GET)
+    @ApiOperation(value = "获取排行设置", httpMethod = "GET")
+    private Response<List<Rank>> rankGet(){
+        List<Rank> rankList = rankService.all();
+        return ResponseHelp.success(rankList);
+    }
 }

+ 64 - 18
server/gateway-api/src/main/java/com/qxgmat/controller/admin/UserAskController.java

@@ -8,19 +8,17 @@ import com.nuliji.tools.Transform;
 import com.qxgmat.data.constants.enums.status.DirectionStatus;
 import com.qxgmat.data.constants.enums.user.AskTarget;
 import com.qxgmat.data.constants.enums.user.MoneyRange;
-import com.qxgmat.data.dao.entity.Manager;
-import com.qxgmat.data.dao.entity.Question;
-import com.qxgmat.data.dao.entity.User;
-import com.qxgmat.data.dao.entity.UserAsk;
-import com.qxgmat.dto.admin.extend.ManagerExtendDto;
-import com.qxgmat.dto.admin.extend.QuestionExtendDto;
-import com.qxgmat.dto.admin.extend.UserExtendDto;
+import com.qxgmat.data.dao.entity.*;
+import com.qxgmat.dto.admin.extend.*;
 import com.qxgmat.dto.admin.request.UserAskDto;
 import com.qxgmat.dto.admin.request.UserAskOrderDto;
+import com.qxgmat.dto.admin.response.UserAskDetailDto;
 import com.qxgmat.dto.admin.response.UserAskListDto;
+import com.qxgmat.help.ShiroHelp;
 import com.qxgmat.service.ManagerService;
 import com.qxgmat.service.UsersService;
 import com.qxgmat.service.inline.ManagerLogService;
+import com.qxgmat.service.inline.QuestionNoService;
 import com.qxgmat.service.inline.QuestionService;
 import com.qxgmat.service.inline.UserAskService;
 import io.swagger.annotations.Api;
@@ -33,39 +31,83 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 import java.util.Collection;
+import java.util.Date;
 import java.util.List;
 
 @RestController("AdminUserAskController")
-@RequestMapping("/admin/user_ask")
+@RequestMapping("/admin/user/ask")
 @Api(tags = "用户提问接口", description = "用户提问相关", produces = MediaType.APPLICATION_JSON_VALUE)
 public class UserAskController {
     @Autowired
     private ManagerLogService managerLogService;
+    @Autowired
+    private ShiroHelp shiroHelp;
 
     @Autowired
     private UserAskService userAskService;
+
     @Autowired
     private QuestionService questionService;
+
+    @Autowired
+    private QuestionNoService questionNoService;
+
     @Autowired
     private UsersService usersService;
+
     @Autowired
     private ManagerService managerService;
 
-
     @RequestMapping(value = "/edit", method = RequestMethod.PUT)
     @ApiOperation(value = "修改提问信息", httpMethod = "PUT")
     public Response<Boolean> edit(@RequestBody @Validated UserAskDto dto, HttpServletRequest request) {
         UserAsk entity = Transform.dtoToEntity(dto);
+        if(!entity.getAnswer().isEmpty()){
+
+            entity.setAnswerTime(new Date());
+            entity.setAnswerStatus(1);
+        }
+
+        Manager manager = shiroHelp.getLoginManager();
+        entity.setManagerId(manager.getId());
         entity = userAskService.edit(entity);
+        userAskService.updateOrder(dto.getOther());
         managerLogService.log(request);
         return ResponseHelp.success(true);
     }
 
-    @RequestMapping(value = "/order", method = RequestMethod.PUT)
+//    @RequestMapping(value = "/order", method = RequestMethod.PUT)
+//    @ApiOperation(value = "修改提问排序", httpMethod = "PUT")
+//    public Response<Boolean> order(@RequestBody @Validated UserAskOrderDto dto, HttpServletRequest request) {
+//        userAskService.order(dto.getId(), dto.getOrder());
+//        return ResponseHelp.success(true);
+//    }
+
+    @RequestMapping(value = "/detail", method = RequestMethod.PUT)
     @ApiOperation(value = "修改提问排序", httpMethod = "PUT")
-    public Response<Boolean> order(@RequestBody @Validated UserAskOrderDto dto, HttpServletRequest request) {
-        userAskService.order(dto.getId(), dto.getOrder());
-        return ResponseHelp.success(true);
+    public Response<UserAskDetailDto> detail(@RequestParam int id, HttpServletRequest request) {
+        UserAsk entity = userAskService.get(id);
+        UserAskDetailDto dto = Transform.convert(entity, UserAskDetailDto.class);
+
+        if (entity.getManagerId() != null && entity.getManagerId() > 0){
+            Manager manager = managerService.get(entity.getManagerId());
+            if (manager != null)
+                dto.setManager(Transform.convert(manager, ManagerExtendDto.class));
+        }
+
+        User user = usersService.get(entity.getUserId());
+        dto.setUser(Transform.convert(user, UserExtendDto.class));
+
+        Question question = questionService.get(entity.getQuestionId());
+        dto.setQuestion(Transform.convert(question, QuestionExtendDto.class));
+
+        QuestionNo questionNo = questionNoService.get(entity.getQuestionNoId());
+        dto.setQuestionNo(Transform.convert(questionNo, QuestionNoExtendDto.class));
+
+        // 所有回答
+        List<UserAsk> userAskList = userAskService.listByQuestion(entity.getQuestionId(), null);
+        dto.setOthers(Transform.convert(userAskList, UserAskExtendDto.class));
+        return ResponseHelp.success(dto);
     }
 
     @RequestMapping(value = "/list", method = RequestMethod.GET)
@@ -74,8 +116,8 @@ public class UserAskController {
             @RequestParam(required = false, defaultValue = "1") int page,
             @RequestParam(required = false, defaultValue = "100") int size,
             @RequestParam(required = false) int category,
-            @RequestParam(required = false, name = "user_id") int userId,
-            @RequestParam(required = false, name = "question_id") int questionId,
+            @RequestParam(required = false, name = "user_id") Number userId,
+            @RequestParam(required = false, name = "question_no_id") Number questionNoId,
             @RequestParam(required = false, name="target") String target,
             @RequestParam(required = false, name="status") Integer status,
             @RequestParam(required = false, name="show_status") Integer showStatus,
@@ -83,14 +125,18 @@ public class UserAskController {
             @RequestParam(required = false, defaultValue = "id") String order,
             @RequestParam(required = false, defaultValue = "desc") String direction,
             HttpSession session) {
-        Page<UserAsk> p = userAskService.listWithUser(page, size, category, userId, questionId, AskTarget.ValueOf(target), status, showStatus, MoneyRange.ValueOf(moneyRang), order, DirectionStatus.ValueOf(direction));
+        Page<UserAsk> p = userAskService.listWithUser(page, size, category, userId, questionNoId, AskTarget.ValueOf(target), status, showStatus, MoneyRange.ValueOf(moneyRang), order, DirectionStatus.ValueOf(direction));
         List<UserAskListDto> pr = Transform.convert(p, UserAskListDto.class);
 
         // 绑定题目
         Collection questionIds = Transform.getIds(p, UserAsk.class, "questionId");
         List<Question> questionList = questionService.select(questionIds);
-        List<QuestionExtendDto> questionExtendDtoList = Transform.convert(questionList, QuestionExtendDto.class);
-        Transform.combine(pr, questionExtendDtoList, UserAskListDto.class, "questionId", "question", QuestionExtendDto.class, "id");
+        Transform.combine(pr, questionList, UserAskListDto.class, "questionId", "question", Question.class, "id", QuestionExtendDto.class);
+
+        // 绑定题目编号
+        Collection questionNoIds = Transform.getIds(p, UserAsk.class, "questionNoId");
+        List<QuestionNo> questionNoList = questionNoService.select(questionNoIds);
+        Transform.combine(pr, questionNoList, UserAskListDto.class, "questionNoId", "question", QuestionNo.class, "id", QuestionNoExtendDto.class);
 
         // 绑定用户
         Collection userIds = Transform.getIds(p, UserAsk.class, "userId");

+ 3 - 3
server/gateway-api/src/main/java/com/qxgmat/controller/admin/UserController.java

@@ -70,7 +70,7 @@ public class UserController {
     @RequestMapping(value = "/detail", method = RequestMethod.GET)
     @ApiOperation(value = "获取用户", httpMethod = "GET")
     public Response<User> detail(@RequestParam int id, HttpSession session) {
-        User entity = usersService.selectOne(id);
+        User entity = usersService.get(id);
 
         return ResponseHelp.success(Transform.convert(entity, User.class));
     }
@@ -80,8 +80,8 @@ public class UserController {
             @RequestParam(required = false, defaultValue = "1") int page,
             @RequestParam(required = false, defaultValue = "100") int size,
             @RequestParam(required = false, defaultValue = "") String keyword,
-            @RequestParam(required = false, defaultValue = "") Boolean real,
-            @RequestParam(required = false, defaultValue = "") String order,
+            @RequestParam(required = false) Boolean real,
+            @RequestParam(required = false) String order,
             @RequestParam(required = false, defaultValue = "desc") String direction,
             HttpSession session) {
         Page<User> p = usersService.select(page, size, keyword, real, order, DirectionStatus.ValueOf(direction));

+ 11 - 12
server/gateway-api/src/main/java/com/qxgmat/controller/admin/UserPreviewController.java

@@ -7,13 +7,13 @@ import com.nuliji.tools.ResponseHelp;
 import com.nuliji.tools.Transform;
 import com.qxgmat.data.dao.entity.HomeworkPreview;
 import com.qxgmat.data.dao.entity.User;
-import com.qxgmat.data.dao.entity.UserPaper;
 import com.qxgmat.data.dao.entity.UserReport;
+import com.qxgmat.data.relation.entity.UserHomeworkPreviewRelation;
 import com.qxgmat.dto.admin.extend.HomeworkPreviewExtendDto;
 import com.qxgmat.dto.admin.extend.UserExtendDto;
 import com.qxgmat.dto.admin.response.UserHomeworkPreviewListDto;
 import com.qxgmat.service.UsersService;
-import com.qxgmat.service.inline.HomeworkPreviewService;
+import com.qxgmat.service.HomeworkPreviewService;
 import com.qxgmat.service.inline.ManagerLogService;
 import com.qxgmat.service.inline.UserPaperService;
 import com.qxgmat.service.inline.UserReportService;
@@ -28,7 +28,7 @@ import java.util.Collection;
 import java.util.List;
 
 @RestController("AdminUserPreviewController")
-@RequestMapping("/admin/user_preview")
+@RequestMapping("/admin/user/preview")
 @Api(tags = "用户预习作业接口", description = "用户预习作业", produces = MediaType.APPLICATION_JSON_VALUE)
 public class UserPreviewController {
     @Autowired
@@ -38,10 +38,8 @@ public class UserPreviewController {
     private UserPaperService userPaperService;
 
     @Autowired
-    private UserReportService userReportService;
-
-    @Autowired
     private UsersService usersService;
+
     @Autowired
     private HomeworkPreviewService homeworkPreviewService;
 
@@ -56,18 +54,19 @@ public class UserPreviewController {
             @RequestParam(required = false, name="start_time") String startTime,
             @RequestParam(required = false, name="end_time") String endTime,
             HttpSession session) {
-        Page<UserReport> p = userReportService.listHomeworkPreviewAdmin(page, size, category, userId, previewId, startTime, endTime);
-        List<UserHomeworkPreviewListDto> pr = Transform.convert(p, UserHomeworkPreviewListDto.class);
+        Page<UserHomeworkPreviewRelation> p = homeworkPreviewService.listAdmin(page, size, category, userId, previewId, startTime, endTime);
 
         // 绑定用户
-        Collection userIds = Transform.getIds(p, UserReport.class, "userId");
+        Collection userIds = Transform.getIds(p, UserHomeworkPreviewRelation.class, "userId");
         List<User> userList = usersService.select(userIds);
-        Transform.combine(pr, userList, UserHomeworkPreviewListDto.class, "userId", "user", User.class, "id", UserExtendDto.class);
+        Transform.combine(p, userList, UserHomeworkPreviewRelation.class, "userId", "user", User.class, "id");
 
         // 绑定预习作业
-        Collection previewIds = Transform.getIds(p, UserReport.class, "moduleId");
+        Collection previewIds = Transform.getIds(p, UserHomeworkPreviewRelation.class, "moduleId");
         List<HomeworkPreview> homeworkPreviewList = homeworkPreviewService.select(previewIds);
-        Transform.combine(pr, homeworkPreviewList, UserHomeworkPreviewListDto.class, "moduleId", "preview", HomeworkPreview.class, "id", HomeworkPreviewExtendDto.class);
+        Transform.combine(p, homeworkPreviewList, UserHomeworkPreviewRelation.class, "moduleId", "preview", HomeworkPreview.class, "id");
+
+        List<UserHomeworkPreviewListDto> pr = Transform.convert(p, UserHomeworkPreviewListDto.class);
 
         return ResponseHelp.success(pr, page, size, p.getTotal());
     }

+ 13 - 0
server/gateway-api/src/main/java/com/qxgmat/controller/api/AuthController.java

@@ -3,6 +3,7 @@ package com.qxgmat.controller.api;
 import com.nuliji.tools.Response;
 import com.nuliji.tools.ResponseHelp;
 import com.nuliji.tools.Transform;
+import com.nuliji.tools.exception.AuthException;
 import com.nuliji.tools.exception.ParameterException;
 import com.nuliji.tools.exception.SystemException;
 import com.qxgmat.data.dao.entity.User;
@@ -46,6 +47,18 @@ public class AuthController {
     @Autowired
     private UsersService usersService;
 
+
+    @RequestMapping(value = "/token", method = RequestMethod.POST)
+    @ApiOperation(value = "验证token", httpMethod = "POST")
+    public Response<MyDto> token(HttpSession session, HttpServletRequest request) {
+        User user = shiroHelp.getLoginUser();
+        if (user == null) {
+            throw new AuthException("未登录");
+        }
+        User entity = usersService.get(user.getId());
+        return ResponseHelp.success(Transform.convert(entity, MyDto.class));
+    }
+
     @RequestMapping(value = "/login", method = RequestMethod.POST)
     @ApiOperation(value = "登录/注册", httpMethod = "POST")
     public Response<MyDto> login(@RequestBody @Validated UserLoginDto userLoginDto, HttpSession session, HttpServletRequest request) {

+ 86 - 0
server/gateway-api/src/main/java/com/qxgmat/controller/api/BaseController.java

@@ -0,0 +1,86 @@
+package com.qxgmat.controller.api;
+
+import com.alibaba.fastjson.JSONObject;
+import com.nuliji.tools.Response;
+import com.nuliji.tools.ResponseHelp;
+import com.qxgmat.data.constants.enums.SettingKey;
+import com.qxgmat.data.dao.entity.*;
+import com.qxgmat.service.inline.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpSession;
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/base")
+@Api(tags = "基本接口", description = "全站基本数据接口", produces = MediaType.APPLICATION_JSON_VALUE)
+public class BaseController {
+
+    @Autowired
+    private SettingService settingService;
+
+    @Autowired
+    private AdService adService;
+
+    @Autowired
+    private RankService rankService;
+
+    @Autowired
+    private ExerciseStructService exerciseStructService;
+
+    @Autowired
+    private ExaminationStructService examinationStructService;
+
+    @RequestMapping(value = "/index", method = RequestMethod.GET)
+    @ApiOperation(value = "获取首页配置", httpMethod = "GET")
+    private Response<JSONObject> index(){
+        Setting entity = settingService.getByKey(SettingKey.INDEX);
+        return ResponseHelp.success(entity.getValue());
+    }
+
+    @RequestMapping(value = "/ad", method = RequestMethod.GET)
+    @ApiOperation(value = "获取广告", notes = "获取广告列表", httpMethod = "GET")
+    public Response<List<Ad>> ad()  {
+        List<Ad> adList = adService.all();
+        return ResponseHelp.success(adList);
+    }
+
+    @RequestMapping(value = "/score", method = RequestMethod.GET)
+    @ApiOperation(value = "考分计算", notes = "获取考分排行信息", httpMethod = "GET")
+    public Response<Rank> score(
+            @RequestParam(required = true) Number total,
+            @RequestParam(required = true) Number quant
+    )  {
+        Rank rank = rankService.compute(total, quant);
+        return ResponseHelp.success(rank);
+    }
+
+    @RequestMapping(value = "/exercise/struct", method = RequestMethod.GET)
+    @ApiOperation(value = "所有练习层级", httpMethod = "GET")
+    public Response<List<ExerciseStruct>> exerciseStruct(HttpSession session) {
+        List<ExerciseStruct> p = exerciseStructService.all();
+        return ResponseHelp.success(p);
+    }
+
+    @RequestMapping(value = "/examination/struct", method = RequestMethod.GET)
+    @ApiOperation(value = "所有模考层级", httpMethod = "GET")
+    public Response<List<ExaminationStruct>> examinationStruct(HttpSession session) {
+        List<ExaminationStruct> p = examinationStructService.all();
+        return ResponseHelp.success(p);
+    }
+
+    @RequestMapping(value = "/sentence/struct", method = RequestMethod.GET)
+    @ApiOperation(value = "所有长难句结构", httpMethod = "GET")
+    public Response<JSONObject> sentenceStruct(HttpSession session) {
+        Setting entity = settingService.getByKey(SettingKey.SENTENCE);
+
+        return ResponseHelp.success(entity.getValue());
+    }
+}

+ 3 - 0
server/gateway-api/src/main/java/com/qxgmat/controller/api/CommonController.java

@@ -2,6 +2,7 @@ package com.qxgmat.controller.api;
 
 import com.nuliji.tools.ResponseHelp;
 import com.nuliji.tools.exception.SystemException;
+import com.qxgmat.data.dao.entity.Ad;
 import com.qxgmat.dto.request.SmsSendDto;
 import com.qxgmat.dto.response.UploadInfoDto;
 import com.qxgmat.help.CaptchaHelp;
@@ -27,6 +28,7 @@ import javax.servlet.http.HttpSession;
 import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.IOException;
+import java.util.List;
 import java.util.UUID;
 
 /**
@@ -53,6 +55,7 @@ public class CommonController {
     @Autowired
     private UploadHelp uploadHelp;
 
+
 //    @RequestMapping(value = "/sms/register", method = RequestMethod.POST)
 //    @ApiOperation(value = "注册验证码", notes = "相关接口验证后失效", httpMethod = "POST")
 //    public Response<Boolean> sendSmsRegister(@RequestBody @Validated SmsSendDto smsSendDto, HttpSession session) {

+ 107 - 2
server/gateway-api/src/main/java/com/qxgmat/controller/api/MyController.java

@@ -1,18 +1,31 @@
 package com.qxgmat.controller.api;
 
+import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.Page;
 import com.nuliji.tools.PageMessage;
 import com.nuliji.tools.Response;
 import com.nuliji.tools.ResponseHelp;
+import com.nuliji.tools.Transform;
 import com.nuliji.tools.exception.ParameterException;
 import com.nuliji.tools.exception.SystemException;
+import com.qxgmat.data.constants.enums.SettingKey;
+import com.qxgmat.data.dao.entity.Setting;
 import com.qxgmat.data.dao.entity.User;
 import com.qxgmat.data.dao.entity.UserMessage;
+import com.qxgmat.data.relation.entity.UserHomeworkPreviewRelation;
+import com.qxgmat.dto.extend.UserHomeworkPreviewExtendDto;
 import com.qxgmat.dto.request.UserEmailDto;
 import com.qxgmat.dto.request.UserInfoDto;
+import com.qxgmat.dto.request.UserPrepareDto;
+import com.qxgmat.dto.response.UserClassDetailDto;
+import com.qxgmat.dto.response.UserPrepareDetailDto;
 import com.qxgmat.dto.response.UserRealDto;
 import com.qxgmat.help.ShiroHelp;
+import com.qxgmat.service.HomeworkPreviewService;
 import com.qxgmat.service.UsersService;
+import com.qxgmat.service.inline.SettingService;
+import com.qxgmat.service.inline.StatDayService;
+import com.qxgmat.service.inline.UserClassService;
 import com.qxgmat.service.inline.UserMessageService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -28,6 +41,10 @@ import javax.servlet.http.HttpSession;
 import javax.validation.Validator;
 import java.io.File;
 import java.io.IOException;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.util.Date;
+import java.util.List;
 import java.util.UUID;
 
 /**
@@ -56,6 +73,18 @@ public class MyController {
     @Autowired
     private UserMessageService userMessageService;
 
+    @Autowired
+    private SettingService settingService;
+
+    @Autowired
+    private StatDayService statDayService;
+
+    @Autowired
+    private UserClassService userClassService;
+
+    @Autowired
+    private HomeworkPreviewService homeworkPreviewService;
+
     @RequestMapping(value = "/email", method = RequestMethod.POST)
     @ApiOperation(value = "绑定邮箱", httpMethod = "POST")
     public Response<Boolean> email(@RequestBody @Validated UserEmailDto dto, HttpSession session, HttpServletRequest request) {
@@ -116,11 +145,87 @@ public class MyController {
     @ApiOperation(value = "用户站内信", notes = "用户消息列表", httpMethod = "GET")
     public Response<PageMessage<UserMessage>> message(
             @RequestParam(required = false, defaultValue = "1") int page,
-            @RequestParam(required = false, defaultValue = "100") int size
+            @RequestParam(required = false, defaultValue = "100") int size,
+            @RequestParam(required = false) String type,
+            @RequestParam(required = false) Integer read
     )  {
         User user = (User) shiroHelp.getLoginUser();
-        Page<UserMessage> p = userMessageService.select(page, size, user.getId());
+        Page<UserMessage> p = userMessageService.select(page, size, user.getId(), type, read);
 
         return ResponseHelp.success(p, page, size, p.getTotal());
     }
+
+    @RequestMapping(value = "/message/read", method = RequestMethod.PUT)
+    @ApiOperation(value = "读取消息", notes = "读取用户消息/全部", httpMethod = "PUT")
+    public Response<Boolean> readMessage()  {
+        User user = (User) shiroHelp.getLoginUser();
+        userMessageService.clear(user.getId());
+
+        return ResponseHelp.success(true);
+    }
+
+    @RequestMapping(value = "/prepare", method = RequestMethod.PUT)
+    @ApiOperation(value = "修改备考信息", notes = "修改用户备考信息", httpMethod = "PUT")
+    public Response<Boolean> prepareEdit(@RequestBody @Validated UserPrepareDto dto)  {
+        User entity = Transform.dtoToEntity(dto);
+        User user = (User) shiroHelp.getLoginUser();
+        userMessageService.clear(user.getId());
+
+        return ResponseHelp.success(true);
+    }
+
+    @RequestMapping(value = "/prepare", method = RequestMethod.GET)
+    @ApiOperation(value = "获取备考信息", notes = "获取备考信息及分布", httpMethod = "GET")
+    public Response<UserPrepareDetailDto> prepareGet()  {
+        User user = (User) shiroHelp.getLoginUser();
+        User entity = usersService.get(user.getId());
+        UserPrepareDetailDto dto = Transform.convert(entity, UserPrepareDetailDto.class);
+        Setting setting = settingService.getByKey(SettingKey.PREPARE_INFO);
+        JSONObject value = setting.getValue();
+        return ResponseHelp.success(dto);
+    }
+
+    @RequestMapping(value = "/study", method = RequestMethod.GET)
+    @ApiOperation(value = "获取学习记录", notes = "获取选择那天的做题信息", httpMethod = "GET")
+    public Response<UserPrepareDetailDto> studyTime(
+            @RequestParam(required = false) String date
+    )  {
+        User user = (User) shiroHelp.getLoginUser();
+        try {
+            Date day = DateFormat.getDateInstance().parse(date);
+        } catch (ParseException e) {
+            throw new ParameterException("日期格式错误");
+        }
+        User entity = usersService.get(user.getId());
+        UserPrepareDetailDto dto = Transform.convert(entity, UserPrepareDetailDto.class);
+        Setting setting = settingService.getByKey(SettingKey.PREPARE_INFO);
+        JSONObject value = setting.getValue();
+        return ResponseHelp.success(dto);
+    }
+
+
+    @RequestMapping(value = "/class/list", method = RequestMethod.GET)
+    @ApiOperation(value = "获取课程", notes = "获取所有课程及状态", httpMethod = "GET")
+    public Response<List<UserClassDetailDto>> classList()  {
+        User user = (User) shiroHelp.getLoginUser();
+
+        return ResponseHelp.success(null);
+    }
+
+    @RequestMapping(value = "/preview/list", method = RequestMethod.GET)
+    @ApiOperation(value = "获取预习作业列表", notes = "获取预习作业列表", httpMethod = "GET")
+    public Response<PageMessage<UserHomeworkPreviewExtendDto>> previewList(
+            @RequestParam(required = false, defaultValue = "1") int page,
+            @RequestParam(required = false, defaultValue = "100") int size,
+            @RequestParam(required = false) Number category,
+            @RequestParam(required = false) String endTime,
+            @RequestParam(required = false) Boolean finish
+    )  {
+        User user = (User) shiroHelp.getLoginUser();
+        Page<UserHomeworkPreviewRelation> p = homeworkPreviewService.list(page, size, category, user.getId(), endTime, finish);
+
+        List<UserHomeworkPreviewExtendDto> pr = Transform.convert(p, UserHomeworkPreviewExtendDto.class);
+
+        return ResponseHelp.success(pr, page, size, p.getTotal());
+    }
 }

+ 35 - 0
server/gateway-api/src/main/java/com/qxgmat/controller/api/QuestionController.java

@@ -0,0 +1,35 @@
+package com.qxgmat.controller.api;
+
+
+import com.nuliji.tools.Response;
+import com.nuliji.tools.ResponseHelp;
+import com.qxgmat.data.dao.entity.ExerciseStruct;
+import com.qxgmat.service.inline.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpSession;
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/question")
+@Api(tags = "题目", description = "题目接口")
+public class QuestionController {
+    @Autowired
+    private QuestionNoService questionNoService;
+
+    @Autowired
+    private UserPaperService userPaperService;
+
+    @Autowired
+    private UserReportService userReportService;
+
+    @Autowired
+    private UserQuestionService userQuestionService;
+
+
+}

+ 32 - 0
server/gateway-api/src/main/java/com/qxgmat/controller/gateway/OauthController.java

@@ -1,5 +1,7 @@
 package com.qxgmat.controller.gateway;
 
+import com.nuliji.tools.MessageHelp;
+import com.nuliji.tools.Response;
 import com.qxgmat.data.dao.entity.User;
 import com.qxgmat.help.ShiroHelp;
 import com.qxgmat.help.WechatHelp;
@@ -59,4 +61,34 @@ public class OauthController {
         }
         response.sendRedirect(jump.toString());
     }
+
+    @RequestMapping(value = "/direct/wechat_pc", method = RequestMethod.GET)
+    @ApiOperation(value = "直接微信二维码登录", httpMethod = "GET")
+    public Response<Boolean> directWechatPc(
+            @RequestParam(required = false, defaultValue = "") String code,
+            HttpSession session, HttpServletResponse response) {
+        User user = (User) shiroHelp.getLoginUser();
+        if (user!=null){
+            // 已登录用户,绑定
+            usersService.Oauth(user, code, "wechat_pc");
+        }else{
+            shiroHelp.getSession().login(shiroHelp.oauth(code, "wechat_pc"));
+        }
+        return MessageHelp.success(true);
+    }
+
+    @RequestMapping(value = "/direct/wechat", method = RequestMethod.GET)
+    @ApiOperation(value = "直接微信二维码登录", httpMethod = "GET")
+    public Response<Boolean> directWechat(
+            @RequestParam(required = false, defaultValue = "") String code,
+            HttpSession session, HttpServletResponse response) {
+        User user = (User) shiroHelp.getLoginUser();
+        if (user!=null){
+            // 已登录用户,绑定
+            usersService.Oauth(user, code, "wechat_native");
+        }else{
+            shiroHelp.getSession().login(shiroHelp.oauth(code, "wechat_native"));
+        }
+        return MessageHelp.success(true);
+    }
 }

+ 38 - 5
server/gateway-api/src/main/java/com/qxgmat/dto/admin/extend/QuestionExtendDto.java

@@ -1,9 +1,18 @@
 package com.qxgmat.dto.admin.extend;
 
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.dao.entity.Question;
+
+@Dto(entity = Question.class)
 public class QuestionExtendDto {
 
     private Integer id;
-    private String title;
+
+    private String stem;
+
+    private String type;
+    private String difficult;
+    private String place;
 
     public Integer getId() {
         return id;
@@ -13,11 +22,35 @@ public class QuestionExtendDto {
         this.id = id;
     }
 
-    public String getTitle() {
-        return title;
+    public String getStem() {
+        return stem;
+    }
+
+    public void setStem(String stem) {
+        this.stem = stem;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getDifficult() {
+        return difficult;
+    }
+
+    public void setDifficult(String difficult) {
+        this.difficult = difficult;
+    }
+
+    public String getPlace() {
+        return place;
     }
 
-    public void setTitle(String title) {
-        this.title = title;
+    public void setPlace(String place) {
+        this.place = place;
     }
 }

+ 18 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/admin/extend/QuestionNoExtendDto.java

@@ -27,6 +27,8 @@ public class QuestionNoExtendDto {
     @NotEmpty(message = "对应模块层级!")
     private Integer[] moduleStruct;
 
+    private QuestionExtendDto question;
+
     public String getModule() {
         return module;
     }
@@ -50,4 +52,20 @@ public class QuestionNoExtendDto {
     public void setModuleStruct(Integer[] moduleStruct) {
         this.moduleStruct = moduleStruct;
     }
+
+    public QuestionExtendDto getQuestion() {
+        return question;
+    }
+
+    public void setQuestion(QuestionExtendDto question) {
+        this.question = question;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
 }

+ 56 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/admin/extend/UserAskExtendDto.java

@@ -0,0 +1,56 @@
+package com.qxgmat.dto.admin.extend;
+
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.dao.entity.UserAsk;
+
+@Dto(entity = UserAsk.class)
+public class UserAskExtendDto {
+
+    private Integer id;
+
+    private String stem;
+
+    private String type;
+    private String difficult;
+    private String place;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getStem() {
+        return stem;
+    }
+
+    public void setStem(String stem) {
+        this.stem = stem;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getDifficult() {
+        return difficult;
+    }
+
+    public void setDifficult(String difficult) {
+        this.difficult = difficult;
+    }
+
+    public String getPlace() {
+        return place;
+    }
+
+    public void setPlace(String place) {
+        this.place = place;
+    }
+}

+ 9 - 19
server/gateway-api/src/main/java/com/qxgmat/dto/admin/request/HomeworkPreviewDto.java

@@ -23,12 +23,10 @@ public class HomeworkPreviewDto {
     private Date endTime;
 
     @NotEmpty(message = "题目不能为空!")
-    private Integer[] questionIds;
+    private Integer[] questionNoIds;
 
     private Integer[] userIds;
 
-    private Integer finish;
-
     public Integer getId() {
         return id;
     }
@@ -61,22 +59,6 @@ public class HomeworkPreviewDto {
         this.endTime = endTime;
     }
 
-    public Integer getFinish() {
-        return finish;
-    }
-
-    public void setFinish(Integer finish) {
-        this.finish = finish;
-    }
-
-    public Integer[] getQuestionIds() {
-        return questionIds;
-    }
-
-    public void setQuestionIds(Integer[] questionIds) {
-        this.questionIds = questionIds;
-    }
-
     public Integer[] getUserIds() {
         return userIds;
     }
@@ -84,4 +66,12 @@ public class HomeworkPreviewDto {
     public void setUserIds(Integer[] userIds) {
         this.userIds = userIds;
     }
+
+    public Integer[] getQuestionNoIds() {
+        return questionNoIds;
+    }
+
+    public void setQuestionNoIds(Integer[] questionNoIds) {
+        this.questionNoIds = questionNoIds;
+    }
 }

+ 31 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/admin/request/QuestionNoSearchDto.java

@@ -0,0 +1,31 @@
+package com.qxgmat.dto.admin.request;
+
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.dao.entity.Question;
+import com.qxgmat.dto.admin.extend.QuestionNoExtendDto;
+import org.json.JSONObject;
+
+import javax.validation.constraints.NotEmpty;
+
+public class QuestionNoSearchDto {
+
+    private String[] no;
+
+    private String module;
+
+    public String[] getNo() {
+        return no;
+    }
+
+    public void setNo(String[] no) {
+        this.no = no;
+    }
+
+    public String getModule() {
+        return module;
+    }
+
+    public void setModule(String module) {
+        this.module = module;
+    }
+}

+ 94 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/admin/request/RankDto.java

@@ -0,0 +1,94 @@
+package com.qxgmat.dto.admin.request;
+
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.dao.entity.Rank;
+
+@Dto(entity = Rank.class)
+public class RankDto {
+    private Integer id;
+    /**
+     * 总分
+     */
+    private Integer totalScore;
+
+    /**
+     * 总排行
+     */
+    private String totalRank;
+
+    /**
+     * quant分数
+     */
+    private Integer quantScore;
+
+    /**
+     * quant排行
+     */
+    private String quantRank;
+
+    /**
+     * verbal分数
+     */
+    private Integer verbalScore;
+
+    /**
+     * verbal排行
+     */
+    private String verbalRank;
+
+    public Integer getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Integer totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public String getTotalRank() {
+        return totalRank;
+    }
+
+    public void setTotalRank(String totalRank) {
+        this.totalRank = totalRank;
+    }
+
+    public Integer getQuantScore() {
+        return quantScore;
+    }
+
+    public void setQuantScore(Integer quantScore) {
+        this.quantScore = quantScore;
+    }
+
+    public String getQuantRank() {
+        return quantRank;
+    }
+
+    public void setQuantRank(String quantRank) {
+        this.quantRank = quantRank;
+    }
+
+    public Integer getVerbalScore() {
+        return verbalScore;
+    }
+
+    public void setVerbalScore(Integer verbalScore) {
+        this.verbalScore = verbalScore;
+    }
+
+    public String getVerbalRank() {
+        return verbalRank;
+    }
+
+    public void setVerbalRank(String verbalRank) {
+        this.verbalRank = verbalRank;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+}

+ 20 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/admin/request/UserAskDto.java

@@ -15,6 +15,10 @@ public class UserAskDto {
     @NotEmpty(message = "回答不允许为空")
     private String answer;
 
+    private Integer[] other;
+
+    private Integer showStatus;
+
     public Integer getId() {
         return id;
     }
@@ -30,4 +34,20 @@ public class UserAskDto {
     public void setAnswer(String answer) {
         this.answer = answer;
     }
+
+    public Integer[] getOther() {
+        return other;
+    }
+
+    public void setOther(Integer[] other) {
+        this.other = other;
+    }
+
+    public Integer getShowStatus() {
+        return showStatus;
+    }
+
+    public void setShowStatus(Integer showStatus) {
+        this.showStatus = showStatus;
+    }
 }

+ 11 - 10
server/gateway-api/src/main/java/com/qxgmat/dto/admin/response/ExerciseQuestionListDto.java

@@ -4,6 +4,7 @@ import com.nuliji.tools.annotation.Dto;
 import com.qxgmat.data.dao.entity.QuestionNo;
 import com.qxgmat.dto.admin.extend.ExercisePaperExtendDto;
 import com.qxgmat.dto.admin.extend.QuestionExtendDto;
+import com.qxgmat.dto.admin.extend.QuestionNoExtendDto;
 
 
 @Dto(entity = QuestionNo.class)
@@ -11,12 +12,12 @@ public class ExerciseQuestionListDto {
 
     private Integer id;
 
-    private String no;
-
     private ExercisePaperExtendDto paper;
 
     private QuestionExtendDto question;
 
+    private QuestionNoExtendDto questionNo;
+
     public Integer getId() {
         return id;
     }
@@ -33,14 +34,6 @@ public class ExerciseQuestionListDto {
         this.paper = paper;
     }
 
-    public String getNo() {
-        return no;
-    }
-
-    public void setNo(String no) {
-        this.no = no;
-    }
-
     public QuestionExtendDto getQuestion() {
         return question;
     }
@@ -48,4 +41,12 @@ public class ExerciseQuestionListDto {
     public void setQuestion(QuestionExtendDto question) {
         this.question = question;
     }
+
+    public QuestionNoExtendDto getQuestionNo() {
+        return questionNo;
+    }
+
+    public void setQuestionNo(QuestionNoExtendDto questionNo) {
+        this.questionNo = questionNo;
+    }
 }

+ 102 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/admin/response/HomeworkPreviewDetailDto.java

@@ -0,0 +1,102 @@
+package com.qxgmat.dto.admin.response;
+
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.dao.entity.HomeworkPreview;
+import com.qxgmat.dto.admin.extend.QuestionNoExtendDto;
+
+import java.util.Collection;
+import java.util.Date;
+
+@Dto(entity = HomeworkPreview.class)
+public class HomeworkPreviewDetailDto {
+
+    private Integer id;
+
+    private String title;
+
+    private Integer category;
+
+    private Date startTime;
+
+    private Date endTime;
+
+    private Integer[] questionNoIds;
+
+    private Integer[] userIds;
+
+    private Integer finish;
+
+    private Collection<QuestionNoExtendDto> questionNos;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getFinish() {
+        return finish;
+    }
+
+    public void setFinish(Integer finish) {
+        this.finish = finish;
+    }
+
+    public Integer[] getUserIds() {
+        return userIds;
+    }
+
+    public void setUserIds(Integer[] userIds) {
+        this.userIds = userIds;
+    }
+
+    public Integer getCategory() {
+        return category;
+    }
+
+    public void setCategory(Integer category) {
+        this.category = category;
+    }
+
+    public Integer[] getQuestionNoIds() {
+        return questionNoIds;
+    }
+
+    public void setQuestionNoIds(Integer[] questionNoIds) {
+        this.questionNoIds = questionNoIds;
+    }
+
+    public Collection<QuestionNoExtendDto> getQuestionNos() {
+        return questionNos;
+    }
+
+    public void setQuestionNos(Collection<QuestionNoExtendDto> questionNos) {
+        this.questionNos = questionNos;
+    }
+}

+ 9 - 9
server/gateway-api/src/main/java/com/qxgmat/dto/admin/response/HomeworkPreviewListDto.java

@@ -19,7 +19,7 @@ public class HomeworkPreviewListDto {
 
     private Date endTime;
 
-    private Integer[] questionIds;
+    private Integer[] questionNoIds;
 
     private Integer[] userIds;
 
@@ -65,14 +65,6 @@ public class HomeworkPreviewListDto {
         this.finish = finish;
     }
 
-    public Integer[] getQuestionIds() {
-        return questionIds;
-    }
-
-    public void setQuestionIds(Integer[] questionIds) {
-        this.questionIds = questionIds;
-    }
-
     public Integer[] getUserIds() {
         return userIds;
     }
@@ -88,4 +80,12 @@ public class HomeworkPreviewListDto {
     public void setCategory(Integer category) {
         this.category = category;
     }
+
+    public Integer[] getQuestionNoIds() {
+        return questionNoIds;
+    }
+
+    public void setQuestionNoIds(Integer[] questionNoIds) {
+        this.questionNoIds = questionNoIds;
+    }
 }

+ 43 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/admin/response/SentenceQuestionListDto.java

@@ -0,0 +1,43 @@
+package com.qxgmat.dto.admin.response;
+
+import com.nuliji.tools.annotation.Dto;
+import com.qxgmat.data.dao.entity.Question;
+import com.qxgmat.data.dao.entity.QuestionNo;
+import com.qxgmat.data.dao.entity.SentenceQuestion;
+import com.qxgmat.dto.admin.extend.ExercisePaperExtendDto;
+import com.qxgmat.dto.admin.extend.QuestionExtendDto;
+
+
+@Dto(entity = SentenceQuestion.class)
+public class SentenceQuestionListDto {
+
+    private Integer id;
+
+    private Integer questionId;
+
+    private String title;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getQuestionId() {
+        return questionId;
+    }
+
+    public void setQuestionId(Integer questionId) {
+        this.questionId = questionId;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+}

+ 0 - 0
server/gateway-api/src/main/java/com/qxgmat/dto/admin/response/UserAskDetailDto.java


Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels