Go 6 anni fa
parent
commit
748c8cb42b
60 ha cambiato i file con 1364 aggiunte e 42 eliminazioni
  1. 1 1
      front/project/h5/routes/page/login/index.js
  2. 9 0
      front/project/h5/routes/page/message/index.js
  3. 3 0
      front/project/h5/routes/page/message/index.less
  4. 12 0
      front/project/h5/routes/page/message/page.js
  5. 9 0
      front/project/h5/routes/page/study/index.js
  6. 3 0
      front/project/h5/routes/page/study/index.less
  7. 12 0
      front/project/h5/routes/page/study/page.js
  8. 9 0
      front/project/h5/routes/product/bought/index.js
  9. 3 0
      front/project/h5/routes/product/bought/index.less
  10. 12 0
      front/project/h5/routes/product/bought/page.js
  11. 9 0
      front/project/h5/routes/product/course/index.js
  12. 3 0
      front/project/h5/routes/product/course/index.less
  13. 12 0
      front/project/h5/routes/product/course/page.js
  14. 9 0
      front/project/h5/routes/product/courseDetail/index.js
  15. 3 0
      front/project/h5/routes/product/courseDetail/index.less
  16. 12 0
      front/project/h5/routes/product/courseDetail/page.js
  17. 9 0
      front/project/h5/routes/product/coursePackage/index.js
  18. 3 0
      front/project/h5/routes/product/coursePackage/index.less
  19. 12 0
      front/project/h5/routes/product/coursePackage/page.js
  20. 9 0
      front/project/h5/routes/product/courseSingle/index.js
  21. 3 0
      front/project/h5/routes/product/courseSingle/index.less
  22. 12 0
      front/project/h5/routes/product/courseSingle/page.js
  23. 9 0
      front/project/h5/routes/product/data/index.js
  24. 3 0
      front/project/h5/routes/product/data/index.less
  25. 12 0
      front/project/h5/routes/product/data/page.js
  26. 9 0
      front/project/h5/routes/product/dataDetail/index.js
  27. 3 0
      front/project/h5/routes/product/dataDetail/index.less
  28. 12 0
      front/project/h5/routes/product/dataDetail/page.js
  29. 9 0
      front/project/h5/routes/product/dataHistory/index.js
  30. 3 0
      front/project/h5/routes/product/dataHistory/index.less
  31. 12 0
      front/project/h5/routes/product/dataHistory/page.js
  32. 9 0
      front/project/h5/routes/product/list/index.js
  33. 3 0
      front/project/h5/routes/product/list/index.less
  34. 12 0
      front/project/h5/routes/product/list/page.js
  35. 9 0
      front/project/h5/routes/textbook/detail/index.js
  36. 3 0
      front/project/h5/routes/textbook/detail/index.less
  37. 12 0
      front/project/h5/routes/textbook/detail/page.js
  38. 9 0
      front/project/h5/routes/textbook/index/index.js
  39. 3 0
      front/project/h5/routes/textbook/index/index.less
  40. 12 0
      front/project/h5/routes/textbook/index/page.js
  41. 9 0
      front/project/h5/routes/textbook/library/index.js
  42. 3 0
      front/project/h5/routes/textbook/library/index.less
  43. 12 0
      front/project/h5/routes/textbook/library/page.js
  44. 1 1
      server/data/src/main/java/com/qxgmat/data/constants/enums/SettingKey.java
  45. 7 0
      server/data/src/main/java/com/qxgmat/data/dao/CourseFaqMapper.java
  46. 7 0
      server/data/src/main/java/com/qxgmat/data/dao/CourseMapper.java
  47. 7 0
      server/data/src/main/java/com/qxgmat/data/dao/CourseNoMapper.java
  48. 7 0
      server/data/src/main/java/com/qxgmat/data/dao/UserCourseProgressMapper.java
  49. 230 0
      server/data/src/main/java/com/qxgmat/data/dao/entity/Course.java
  50. 168 0
      server/data/src/main/java/com/qxgmat/data/dao/entity/CourseFaq.java
  51. 265 0
      server/data/src/main/java/com/qxgmat/data/dao/entity/CourseNo.java
  52. 33 32
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserCourse.java
  53. 203 0
      server/data/src/main/java/com/qxgmat/data/dao/entity/UserCourseProgress.java
  54. 19 0
      server/data/src/main/java/com/qxgmat/data/dao/mapping/CourseFaqMapper.xml
  55. 21 0
      server/data/src/main/java/com/qxgmat/data/dao/mapping/CourseMapper.xml
  56. 33 0
      server/data/src/main/java/com/qxgmat/data/dao/mapping/CourseNoMapper.xml
  57. 3 3
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserCourseMapper.xml
  58. 20 0
      server/data/src/main/java/com/qxgmat/data/dao/mapping/UserCourseProgressMapper.xml
  59. 0 3
      server/gateway-api/src/main/java/com/qxgmat/Application.java
  60. 3 2
      server/gateway-api/src/main/java/com/qxgmat/service/extend/QuestionFlowService.java

+ 1 - 1
front/project/h5/routes/page/login/index.js

@@ -1,7 +1,7 @@
 export default {
   path: '/login',
   key: 'login',
-  title: '登录',
+  title: '登录', // 绑定手机
   needLogin: false,
   component() {
     return import('./page');

+ 9 - 0
front/project/h5/routes/page/message/index.js

@@ -0,0 +1,9 @@
+export default {
+  path: '/message',
+  key: 'message',
+  title: '站内信',
+  needLogin: false,
+  component() {
+    return import('./page');
+  },
+};

+ 3 - 0
front/project/h5/routes/page/message/index.less

@@ -0,0 +1,3 @@
+@charset "utf-8";
+
+#message {}

+ 12 - 0
front/project/h5/routes/page/message/page.js

@@ -0,0 +1,12 @@
+import React from 'react';
+import './index.less';
+import Page from '@src/containers/Page';
+
+export default class extends Page {
+  init() {
+  }
+
+  renderView() {
+    return <div />;
+  }
+}

+ 9 - 0
front/project/h5/routes/page/study/index.js

@@ -0,0 +1,9 @@
+export default {
+  path: '/study',
+  key: 'study',
+  title: '数据',
+  needLogin: false,
+  component() {
+    return import('./page');
+  },
+};

+ 3 - 0
front/project/h5/routes/page/study/index.less

@@ -0,0 +1,3 @@
+@charset "utf-8";
+
+#study {}

+ 12 - 0
front/project/h5/routes/page/study/page.js

@@ -0,0 +1,12 @@
+import React from 'react';
+import './index.less';
+import Page from '@src/containers/Page';
+
+export default class extends Page {
+  init() {
+  }
+
+  renderView() {
+    return <div />;
+  }
+}

+ 9 - 0
front/project/h5/routes/product/bought/index.js

@@ -0,0 +1,9 @@
+export default {
+  path: '/product/data',
+  key: 'product-data',
+  title: '全部资料',
+  needLogin: false,
+  component() {
+    return import('./page');
+  },
+};

+ 3 - 0
front/project/h5/routes/product/bought/index.less

@@ -0,0 +1,3 @@
+@charset "utf-8";
+
+#product-bought {}

+ 12 - 0
front/project/h5/routes/product/bought/page.js

@@ -0,0 +1,12 @@
+import React from 'react';
+import './index.less';
+import Page from '@src/containers/Page';
+
+export default class extends Page {
+  init() {
+  }
+
+  renderView() {
+    return <div />;
+  }
+}

+ 9 - 0
front/project/h5/routes/product/course/index.js

@@ -0,0 +1,9 @@
+export default {
+  path: '/product/course',
+  key: 'product-course',
+  title: '在线课程',
+  needLogin: false,
+  component() {
+    return import('./page');
+  },
+};

+ 3 - 0
front/project/h5/routes/product/course/index.less

@@ -0,0 +1,3 @@
+@charset "utf-8";
+
+#product-course {}

+ 12 - 0
front/project/h5/routes/product/course/page.js

@@ -0,0 +1,12 @@
+import React from 'react';
+import './index.less';
+import Page from '@src/containers/Page';
+
+export default class extends Page {
+  init() {
+  }
+
+  renderView() {
+    return <div />;
+  }
+}

+ 9 - 0
front/project/h5/routes/product/courseDetail/index.js

@@ -0,0 +1,9 @@
+export default {
+  path: '/product/course/detail/:id',
+  key: 'product-course-detail',
+  title: '在线课程',
+  needLogin: false,
+  component() {
+    return import('./page');
+  },
+};

+ 3 - 0
front/project/h5/routes/product/courseDetail/index.less

@@ -0,0 +1,3 @@
+@charset "utf-8";
+
+#product-course-detail {}

+ 12 - 0
front/project/h5/routes/product/courseDetail/page.js

@@ -0,0 +1,12 @@
+import React from 'react';
+import './index.less';
+import Page from '@src/containers/Page';
+
+export default class extends Page {
+  init() {
+  }
+
+  renderView() {
+    return <div />;
+  }
+}

+ 9 - 0
front/project/h5/routes/product/coursePackage/index.js

@@ -0,0 +1,9 @@
+export default {
+  path: '/product/course/package/:id',
+  key: 'product-course-package',
+  title: '课程套餐',
+  needLogin: false,
+  component() {
+    return import('./page');
+  },
+};

+ 3 - 0
front/project/h5/routes/product/coursePackage/index.less

@@ -0,0 +1,3 @@
+@charset "utf-8";
+
+#product-course-package {}

+ 12 - 0
front/project/h5/routes/product/coursePackage/page.js

@@ -0,0 +1,12 @@
+import React from 'react';
+import './index.less';
+import Page from '@src/containers/Page';
+
+export default class extends Page {
+  init() {
+  }
+
+  renderView() {
+    return <div />;
+  }
+}

+ 9 - 0
front/project/h5/routes/product/courseSingle/index.js

@@ -0,0 +1,9 @@
+export default {
+  path: '/product/course/single',
+  key: 'product-course-single',
+  title: '1vs1课程',
+  needLogin: false,
+  component() {
+    return import('./page');
+  },
+};

+ 3 - 0
front/project/h5/routes/product/courseSingle/index.less

@@ -0,0 +1,3 @@
+@charset "utf-8";
+
+#product-course-detail {}

+ 12 - 0
front/project/h5/routes/product/courseSingle/page.js

@@ -0,0 +1,12 @@
+import React from 'react';
+import './index.less';
+import Page from '@src/containers/Page';
+
+export default class extends Page {
+  init() {
+  }
+
+  renderView() {
+    return <div />;
+  }
+}

+ 9 - 0
front/project/h5/routes/product/data/index.js

@@ -0,0 +1,9 @@
+export default {
+  path: '/product/bought',
+  key: 'product-bought',
+  title: '已购买',
+  needLogin: false,
+  component() {
+    return import('./page');
+  },
+};

+ 3 - 0
front/project/h5/routes/product/data/index.less

@@ -0,0 +1,3 @@
+@charset "utf-8";
+
+#product-data {}

+ 12 - 0
front/project/h5/routes/product/data/page.js

@@ -0,0 +1,12 @@
+import React from 'react';
+import './index.less';
+import Page from '@src/containers/Page';
+
+export default class extends Page {
+  init() {
+  }
+
+  renderView() {
+    return <div />;
+  }
+}

+ 9 - 0
front/project/h5/routes/product/dataDetail/index.js

@@ -0,0 +1,9 @@
+export default {
+  path: '/product/data/detail/:id',
+  key: 'product-data-detail',
+  title: '已购买',
+  needLogin: false,
+  component() {
+    return import('./page');
+  },
+};

+ 3 - 0
front/project/h5/routes/product/dataDetail/index.less

@@ -0,0 +1,3 @@
+@charset "utf-8";
+
+#product-data-detail {}

+ 12 - 0
front/project/h5/routes/product/dataDetail/page.js

@@ -0,0 +1,12 @@
+import React from 'react';
+import './index.less';
+import Page from '@src/containers/Page';
+
+export default class extends Page {
+  init() {
+  }
+
+  renderView() {
+    return <div />;
+  }
+}

+ 9 - 0
front/project/h5/routes/product/dataHistory/index.js

@@ -0,0 +1,9 @@
+export default {
+  path: '/product/data/history',
+  key: 'product-data-history',
+  title: '资料更新',
+  needLogin: false,
+  component() {
+    return import('./page');
+  },
+};

+ 3 - 0
front/project/h5/routes/product/dataHistory/index.less

@@ -0,0 +1,3 @@
+@charset "utf-8";
+
+#product-data-history {}

+ 12 - 0
front/project/h5/routes/product/dataHistory/page.js

@@ -0,0 +1,12 @@
+import React from 'react';
+import './index.less';
+import Page from '@src/containers/Page';
+
+export default class extends Page {
+  init() {
+  }
+
+  renderView() {
+    return <div />;
+  }
+}

+ 9 - 0
front/project/h5/routes/product/list/index.js

@@ -0,0 +1,9 @@
+export default {
+  path: '/product/list',
+  key: 'product-list',
+  title: '全部资料',
+  needLogin: false,
+  component() {
+    return import('./page');
+  },
+};

+ 3 - 0
front/project/h5/routes/product/list/index.less

@@ -0,0 +1,3 @@
+@charset "utf-8";
+
+#product-list {}

+ 12 - 0
front/project/h5/routes/product/list/page.js

@@ -0,0 +1,12 @@
+import React from 'react';
+import './index.less';
+import Page from '@src/containers/Page';
+
+export default class extends Page {
+  init() {
+  }
+
+  renderView() {
+    return <div />;
+  }
+}

+ 9 - 0
front/project/h5/routes/textbook/detail/index.js

@@ -0,0 +1,9 @@
+export default {
+  path: '/textbook/detail/:id',
+  key: 'textbook-detail',
+  title: '机经详情',
+  needLogin: false,
+  component() {
+    return import('./page');
+  },
+};

+ 3 - 0
front/project/h5/routes/textbook/detail/index.less

@@ -0,0 +1,3 @@
+@charset "utf-8";
+
+#textbook {}

+ 12 - 0
front/project/h5/routes/textbook/detail/page.js

@@ -0,0 +1,12 @@
+import React from 'react';
+import './index.less';
+import Page from '@src/containers/Page';
+
+export default class extends Page {
+  init() {
+  }
+
+  renderView() {
+    return <div />;
+  }
+}

+ 9 - 0
front/project/h5/routes/textbook/index/index.js

@@ -0,0 +1,9 @@
+export default {
+  path: '/textbook',
+  key: 'textbook',
+  title: '机经主页',
+  needLogin: false,
+  component() {
+    return import('./page');
+  },
+};

+ 3 - 0
front/project/h5/routes/textbook/index/index.less

@@ -0,0 +1,3 @@
+@charset "utf-8";
+
+#textbook {}

+ 12 - 0
front/project/h5/routes/textbook/index/page.js

@@ -0,0 +1,12 @@
+import React from 'react';
+import './index.less';
+import Page from '@src/containers/Page';
+
+export default class extends Page {
+  init() {
+  }
+
+  renderView() {
+    return <div />;
+  }
+}

+ 9 - 0
front/project/h5/routes/textbook/library/index.js

@@ -0,0 +1,9 @@
+export default {
+  path: '/textbook/library',
+  key: 'textbook-library',
+  title: '换库表',
+  needLogin: false,
+  component() {
+    return import('./page');
+  },
+};

+ 3 - 0
front/project/h5/routes/textbook/library/index.less

@@ -0,0 +1,3 @@
+@charset "utf-8";
+
+#textbook-library {}

+ 12 - 0
front/project/h5/routes/textbook/library/page.js

@@ -0,0 +1,12 @@
+import React from 'react';
+import './index.less';
+import Page from '@src/containers/Page';
+
+export default class extends Page {
+  init() {
+  }
+
+  renderView() {
+    return <div />;
+  }
+}

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

@@ -23,7 +23,7 @@ public enum SettingKey {
     SERVICE_QX_CAT("service_qx_cat"), // 千行CAT服务信息
     SERVICE_TEXTBOOK("service_textbook"), // 数学机经服务信息
     SERVICE_VIP("service_vip"), // vip服务信息
-
+    COURSE_INDEX("course_index"), // 课程首页设置
 
     TIPS("tips"); // 页面提示信息
 

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

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

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

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

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

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

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

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

+ 230 - 0
server/data/src/main/java/com/qxgmat/data/dao/entity/Course.java

@@ -0,0 +1,230 @@
+package com.qxgmat.data.dao.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+import javax.persistence.*;
+
+@Table(name = "course")
+public class Course implements Serializable {
+    @Id
+    @Column(name = "`id`")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Integer id;
+
+    /**
+     * 节点id
+     */
+    @Column(name = "`struct_id`")
+    private Integer structId;
+
+    /**
+     * 上级节点id,0为无上级
+     */
+    @Column(name = "`parent_struct_id`")
+    private Integer parentStructId;
+
+    /**
+     * 题型:从struct上获取extend
+     */
+    @Column(name = "`question_type`")
+    private String questionType;
+
+    /**
+     * 课程名称
+     */
+    @Column(name = "`title`")
+    private String title;
+
+    @Column(name = "`create_time`")
+    private Date createTime;
+
+    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 struct_id - 节点id
+     */
+    public Integer getStructId() {
+        return structId;
+    }
+
+    /**
+     * 设置节点id
+     *
+     * @param structId 节点id
+     */
+    public void setStructId(Integer structId) {
+        this.structId = structId;
+    }
+
+    /**
+     * 获取上级节点id,0为无上级
+     *
+     * @return parent_struct_id - 上级节点id,0为无上级
+     */
+    public Integer getParentStructId() {
+        return parentStructId;
+    }
+
+    /**
+     * 设置上级节点id,0为无上级
+     *
+     * @param parentStructId 上级节点id,0为无上级
+     */
+    public void setParentStructId(Integer parentStructId) {
+        this.parentStructId = parentStructId;
+    }
+
+    /**
+     * 获取题型:从struct上获取extend
+     *
+     * @return question_type - 题型:从struct上获取extend
+     */
+    public String getQuestionType() {
+        return questionType;
+    }
+
+    /**
+     * 设置题型:从struct上获取extend
+     *
+     * @param questionType 题型:从struct上获取extend
+     */
+    public void setQuestionType(String questionType) {
+        this.questionType = questionType;
+    }
+
+    /**
+     * 获取课程名称
+     *
+     * @return title - 课程名称
+     */
+    public String getTitle() {
+        return title;
+    }
+
+    /**
+     * 设置课程名称
+     *
+     * @param title 课程名称
+     */
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    /**
+     * @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();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", structId=").append(structId);
+        sb.append(", parentStructId=").append(parentStructId);
+        sb.append(", questionType=").append(questionType);
+        sb.append(", title=").append(title);
+        sb.append(", createTime=").append(createTime);
+        sb.append("]");
+        return sb.toString();
+    }
+
+    public static Course.Builder builder() {
+        return new Course.Builder();
+    }
+
+    public static class Builder {
+        private Course obj;
+
+        public Builder() {
+            this.obj = new Course();
+        }
+
+        /**
+         * @param id
+         */
+        public Builder id(Integer id) {
+            obj.setId(id);
+            return this;
+        }
+
+        /**
+         * 设置节点id
+         *
+         * @param structId 节点id
+         */
+        public Builder structId(Integer structId) {
+            obj.setStructId(structId);
+            return this;
+        }
+
+        /**
+         * 设置上级节点id,0为无上级
+         *
+         * @param parentStructId 上级节点id,0为无上级
+         */
+        public Builder parentStructId(Integer parentStructId) {
+            obj.setParentStructId(parentStructId);
+            return this;
+        }
+
+        /**
+         * 设置题型:从struct上获取extend
+         *
+         * @param questionType 题型:从struct上获取extend
+         */
+        public Builder questionType(String questionType) {
+            obj.setQuestionType(questionType);
+            return this;
+        }
+
+        /**
+         * 设置课程名称
+         *
+         * @param title 课程名称
+         */
+        public Builder title(String title) {
+            obj.setTitle(title);
+            return this;
+        }
+
+        /**
+         * @param createTime
+         */
+        public Builder createTime(Date createTime) {
+            obj.setCreateTime(createTime);
+            return this;
+        }
+
+        public Course build() {
+            return this.obj;
+        }
+    }
+}

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

@@ -0,0 +1,168 @@
+package com.qxgmat.data.dao.entity;
+
+import java.io.Serializable;
+import javax.persistence.*;
+
+@Table(name = "course_faq")
+public class CourseFaq implements Serializable {
+    @Id
+    @Column(name = "`id`")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Integer id;
+
+    /**
+     * 课程id
+     */
+    @Column(name = "`course_id`")
+    private Integer courseId;
+
+    /**
+     * 是否精选:0不是精选,1是精选
+     */
+    @Column(name = "`is_special`")
+    private Integer isSpecial;
+
+    /**
+     * 问答状态:0未回答,1回答,忽略
+     */
+    @Column(name = "`status`")
+    private Integer status;
+
+    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 course_id - 课程id
+     */
+    public Integer getCourseId() {
+        return courseId;
+    }
+
+    /**
+     * 设置课程id
+     *
+     * @param courseId 课程id
+     */
+    public void setCourseId(Integer courseId) {
+        this.courseId = courseId;
+    }
+
+    /**
+     * 获取是否精选:0不是精选,1是精选
+     *
+     * @return is_special - 是否精选:0不是精选,1是精选
+     */
+    public Integer getIsSpecial() {
+        return isSpecial;
+    }
+
+    /**
+     * 设置是否精选:0不是精选,1是精选
+     *
+     * @param isSpecial 是否精选:0不是精选,1是精选
+     */
+    public void setIsSpecial(Integer isSpecial) {
+        this.isSpecial = isSpecial;
+    }
+
+    /**
+     * 获取问答状态:0未回答,1回答,忽略
+     *
+     * @return status - 问答状态:0未回答,1回答,忽略
+     */
+    public Integer getStatus() {
+        return status;
+    }
+
+    /**
+     * 设置问答状态:0未回答,1回答,忽略
+     *
+     * @param status 问答状态:0未回答,1回答,忽略
+     */
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    @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(", courseId=").append(courseId);
+        sb.append(", isSpecial=").append(isSpecial);
+        sb.append(", status=").append(status);
+        sb.append("]");
+        return sb.toString();
+    }
+
+    public static CourseFaq.Builder builder() {
+        return new CourseFaq.Builder();
+    }
+
+    public static class Builder {
+        private CourseFaq obj;
+
+        public Builder() {
+            this.obj = new CourseFaq();
+        }
+
+        /**
+         * @param id
+         */
+        public Builder id(Integer id) {
+            obj.setId(id);
+            return this;
+        }
+
+        /**
+         * 设置课程id
+         *
+         * @param courseId 课程id
+         */
+        public Builder courseId(Integer courseId) {
+            obj.setCourseId(courseId);
+            return this;
+        }
+
+        /**
+         * 设置是否精选:0不是精选,1是精选
+         *
+         * @param isSpecial 是否精选:0不是精选,1是精选
+         */
+        public Builder isSpecial(Integer isSpecial) {
+            obj.setIsSpecial(isSpecial);
+            return this;
+        }
+
+        /**
+         * 设置问答状态:0未回答,1回答,忽略
+         *
+         * @param status 问答状态:0未回答,1回答,忽略
+         */
+        public Builder status(Integer status) {
+            obj.setStatus(status);
+            return this;
+        }
+
+        public CourseFaq build() {
+            return this.obj;
+        }
+    }
+}

+ 265 - 0
server/data/src/main/java/com/qxgmat/data/dao/entity/CourseNo.java

@@ -0,0 +1,265 @@
+package com.qxgmat.data.dao.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+import javax.persistence.*;
+
+@Table(name = "course_no")
+public class CourseNo implements Serializable {
+    @Id
+    @Column(name = "`id`")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Integer id;
+
+    /**
+     * 课程id
+     */
+    @Column(name = "`course_id`")
+    private Integer courseId;
+
+    /**
+     * 课时序号
+     */
+    @Column(name = "`no`")
+    private Integer no;
+
+    /**
+     * 资源文件地址
+     */
+    @Column(name = "`resource`")
+    private String resource;
+
+    /**
+     * 课程时长
+     */
+    @Column(name = "`time`")
+    private Integer time;
+
+    @Column(name = "`create_time`")
+    private Date createTime;
+
+    /**
+     * 课时描述
+     */
+    @Column(name = "`content`")
+    private String content;
+
+    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 course_id - 课程id
+     */
+    public Integer getCourseId() {
+        return courseId;
+    }
+
+    /**
+     * 设置课程id
+     *
+     * @param courseId 课程id
+     */
+    public void setCourseId(Integer courseId) {
+        this.courseId = courseId;
+    }
+
+    /**
+     * 获取课时序号
+     *
+     * @return no - 课时序号
+     */
+    public Integer getNo() {
+        return no;
+    }
+
+    /**
+     * 设置课时序号
+     *
+     * @param no 课时序号
+     */
+    public void setNo(Integer no) {
+        this.no = no;
+    }
+
+    /**
+     * 获取资源文件地址
+     *
+     * @return resource - 资源文件地址
+     */
+    public String getResource() {
+        return resource;
+    }
+
+    /**
+     * 设置资源文件地址
+     *
+     * @param resource 资源文件地址
+     */
+    public void setResource(String resource) {
+        this.resource = resource;
+    }
+
+    /**
+     * 获取课程时长
+     *
+     * @return time - 课程时长
+     */
+    public Integer getTime() {
+        return time;
+    }
+
+    /**
+     * 设置课程时长
+     *
+     * @param time 课程时长
+     */
+    public void setTime(Integer time) {
+        this.time = time;
+    }
+
+    /**
+     * @return create_time
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    /**
+     * @param createTime
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * 获取课时描述
+     *
+     * @return content - 课时描述
+     */
+    public String getContent() {
+        return content;
+    }
+
+    /**
+     * 设置课时描述
+     *
+     * @param content 课时描述
+     */
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    @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(", courseId=").append(courseId);
+        sb.append(", no=").append(no);
+        sb.append(", resource=").append(resource);
+        sb.append(", time=").append(time);
+        sb.append(", createTime=").append(createTime);
+        sb.append(", content=").append(content);
+        sb.append("]");
+        return sb.toString();
+    }
+
+    public static CourseNo.Builder builder() {
+        return new CourseNo.Builder();
+    }
+
+    public static class Builder {
+        private CourseNo obj;
+
+        public Builder() {
+            this.obj = new CourseNo();
+        }
+
+        /**
+         * @param id
+         */
+        public Builder id(Integer id) {
+            obj.setId(id);
+            return this;
+        }
+
+        /**
+         * 设置课程id
+         *
+         * @param courseId 课程id
+         */
+        public Builder courseId(Integer courseId) {
+            obj.setCourseId(courseId);
+            return this;
+        }
+
+        /**
+         * 设置课时序号
+         *
+         * @param no 课时序号
+         */
+        public Builder no(Integer no) {
+            obj.setNo(no);
+            return this;
+        }
+
+        /**
+         * 设置资源文件地址
+         *
+         * @param resource 资源文件地址
+         */
+        public Builder resource(String resource) {
+            obj.setResource(resource);
+            return this;
+        }
+
+        /**
+         * 设置课程时长
+         *
+         * @param time 课程时长
+         */
+        public Builder time(Integer time) {
+            obj.setTime(time);
+            return this;
+        }
+
+        /**
+         * @param createTime
+         */
+        public Builder createTime(Date createTime) {
+            obj.setCreateTime(createTime);
+            return this;
+        }
+
+        /**
+         * 设置课时描述
+         *
+         * @param content 课时描述
+         */
+        public Builder content(String content) {
+            obj.setContent(content);
+            return this;
+        }
+
+        public CourseNo build() {
+            return this.obj;
+        }
+    }
+}

+ 33 - 32
server/data/src/main/java/com/qxgmat/data/dao/entity/UserCourse.java

@@ -1,6 +1,7 @@
 package com.qxgmat.data.dao.entity;
 
 import java.io.Serializable;
+import java.util.Date;
 import javax.persistence.*;
 
 @Table(name = "user_course")
@@ -23,16 +24,16 @@ public class UserCourse implements Serializable {
     private Integer courseId;
 
     /**
-     * 课时id
+     * 开通时间
      */
-    @Column(name = "`course_no_id`")
-    private Integer courseNoId;
+    @Column(name = "`start_time`")
+    private Date startTime;
 
     /**
-     * 已学习时间
+     * 到期时间
      */
-    @Column(name = "`user_time`")
-    private Integer userTime;
+    @Column(name = "`expire_time`")
+    private Date expireTime;
 
     private static final long serialVersionUID = 1L;
 
@@ -87,39 +88,39 @@ public class UserCourse implements Serializable {
     }
 
     /**
-     * 获取课时id
+     * 获取开通时间
      *
-     * @return course_no_id - 课时id
+     * @return start_time - 开通时间
      */
-    public Integer getCourseNoId() {
-        return courseNoId;
+    public Date getStartTime() {
+        return startTime;
     }
 
     /**
-     * 设置课时id
+     * 设置开通时间
      *
-     * @param courseNoId 课时id
+     * @param startTime 开通时间
      */
-    public void setCourseNoId(Integer courseNoId) {
-        this.courseNoId = courseNoId;
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
     }
 
     /**
-     * 获取已学习时间
+     * 获取到期时间
      *
-     * @return user_time - 已学习时间
+     * @return expire_time - 到期时间
      */
-    public Integer getUserTime() {
-        return userTime;
+    public Date getExpireTime() {
+        return expireTime;
     }
 
     /**
-     * 设置已学习时间
+     * 设置到期时间
      *
-     * @param userTime 已学习时间
+     * @param expireTime 到期时间
      */
-    public void setUserTime(Integer userTime) {
-        this.userTime = userTime;
+    public void setExpireTime(Date expireTime) {
+        this.expireTime = expireTime;
     }
 
     @Override
@@ -131,8 +132,8 @@ public class UserCourse implements Serializable {
         sb.append(", id=").append(id);
         sb.append(", userId=").append(userId);
         sb.append(", courseId=").append(courseId);
-        sb.append(", courseNoId=").append(courseNoId);
-        sb.append(", userTime=").append(userTime);
+        sb.append(", startTime=").append(startTime);
+        sb.append(", expireTime=").append(expireTime);
         sb.append("]");
         return sb.toString();
     }
@@ -177,22 +178,22 @@ public class UserCourse implements Serializable {
         }
 
         /**
-         * 设置课时id
+         * 设置开通时间
          *
-         * @param courseNoId 课时id
+         * @param startTime 开通时间
          */
-        public Builder courseNoId(Integer courseNoId) {
-            obj.setCourseNoId(courseNoId);
+        public Builder startTime(Date startTime) {
+            obj.setStartTime(startTime);
             return this;
         }
 
         /**
-         * 设置已学习时间
+         * 设置到期时间
          *
-         * @param userTime 已学习时间
+         * @param expireTime 到期时间
          */
-        public Builder userTime(Integer userTime) {
-            obj.setUserTime(userTime);
+        public Builder expireTime(Date expireTime) {
+            obj.setExpireTime(expireTime);
             return this;
         }
 

+ 203 - 0
server/data/src/main/java/com/qxgmat/data/dao/entity/UserCourseProgress.java

@@ -0,0 +1,203 @@
+package com.qxgmat.data.dao.entity;
+
+import java.io.Serializable;
+import javax.persistence.*;
+
+@Table(name = "user_course_progress")
+public class UserCourseProgress implements Serializable {
+    @Id
+    @Column(name = "`id`")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Integer id;
+
+    /**
+     * 用户id
+     */
+    @Column(name = "`user_id`")
+    private Integer userId;
+
+    /**
+     * 课程id
+     */
+    @Column(name = "`course_id`")
+    private Integer courseId;
+
+    /**
+     * 课时id
+     */
+    @Column(name = "`course_no_id`")
+    private Integer courseNoId;
+
+    /**
+     * 已学习时间
+     */
+    @Column(name = "`user_time`")
+    private Integer userTime;
+
+    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 user_id - 用户id
+     */
+    public Integer getUserId() {
+        return userId;
+    }
+
+    /**
+     * 设置用户id
+     *
+     * @param userId 用户id
+     */
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    /**
+     * 获取课程id
+     *
+     * @return course_id - 课程id
+     */
+    public Integer getCourseId() {
+        return courseId;
+    }
+
+    /**
+     * 设置课程id
+     *
+     * @param courseId 课程id
+     */
+    public void setCourseId(Integer courseId) {
+        this.courseId = courseId;
+    }
+
+    /**
+     * 获取课时id
+     *
+     * @return course_no_id - 课时id
+     */
+    public Integer getCourseNoId() {
+        return courseNoId;
+    }
+
+    /**
+     * 设置课时id
+     *
+     * @param courseNoId 课时id
+     */
+    public void setCourseNoId(Integer courseNoId) {
+        this.courseNoId = courseNoId;
+    }
+
+    /**
+     * 获取已学习时间
+     *
+     * @return user_time - 已学习时间
+     */
+    public Integer getUserTime() {
+        return userTime;
+    }
+
+    /**
+     * 设置已学习时间
+     *
+     * @param userTime 已学习时间
+     */
+    public void setUserTime(Integer userTime) {
+        this.userTime = userTime;
+    }
+
+    @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(", userId=").append(userId);
+        sb.append(", courseId=").append(courseId);
+        sb.append(", courseNoId=").append(courseNoId);
+        sb.append(", userTime=").append(userTime);
+        sb.append("]");
+        return sb.toString();
+    }
+
+    public static UserCourseProgress.Builder builder() {
+        return new UserCourseProgress.Builder();
+    }
+
+    public static class Builder {
+        private UserCourseProgress obj;
+
+        public Builder() {
+            this.obj = new UserCourseProgress();
+        }
+
+        /**
+         * @param id
+         */
+        public Builder id(Integer id) {
+            obj.setId(id);
+            return this;
+        }
+
+        /**
+         * 设置用户id
+         *
+         * @param userId 用户id
+         */
+        public Builder userId(Integer userId) {
+            obj.setUserId(userId);
+            return this;
+        }
+
+        /**
+         * 设置课程id
+         *
+         * @param courseId 课程id
+         */
+        public Builder courseId(Integer courseId) {
+            obj.setCourseId(courseId);
+            return this;
+        }
+
+        /**
+         * 设置课时id
+         *
+         * @param courseNoId 课时id
+         */
+        public Builder courseNoId(Integer courseNoId) {
+            obj.setCourseNoId(courseNoId);
+            return this;
+        }
+
+        /**
+         * 设置已学习时间
+         *
+         * @param userTime 已学习时间
+         */
+        public Builder userTime(Integer userTime) {
+            obj.setUserTime(userTime);
+            return this;
+        }
+
+        public UserCourseProgress build() {
+            return this.obj;
+        }
+    }
+}

+ 19 - 0
server/data/src/main/java/com/qxgmat/data/dao/mapping/CourseFaqMapper.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.CourseFaqMapper">
+  <resultMap id="BaseResultMap" type="com.qxgmat.data.dao.entity.CourseFaq">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="id" jdbcType="INTEGER" property="id" />
+    <result column="course_id" jdbcType="INTEGER" property="courseId" />
+    <result column="is_special" jdbcType="INTEGER" property="isSpecial" />
+    <result column="status" jdbcType="INTEGER" property="status" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    `id`, `course_id`, `is_special`, `status`
+  </sql>
+</mapper>

+ 21 - 0
server/data/src/main/java/com/qxgmat/data/dao/mapping/CourseMapper.xml

@@ -0,0 +1,21 @@
+<?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.CourseMapper">
+  <resultMap id="BaseResultMap" type="com.qxgmat.data.dao.entity.Course">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="id" jdbcType="INTEGER" property="id" />
+    <result column="struct_id" jdbcType="INTEGER" property="structId" />
+    <result column="parent_struct_id" jdbcType="INTEGER" property="parentStructId" />
+    <result column="question_type" jdbcType="VARCHAR" property="questionType" />
+    <result column="title" jdbcType="VARCHAR" property="title" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    `id`, `struct_id`, `parent_struct_id`, `question_type`, `title`, `create_time`
+  </sql>
+</mapper>

+ 33 - 0
server/data/src/main/java/com/qxgmat/data/dao/mapping/CourseNoMapper.xml

@@ -0,0 +1,33 @@
+<?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.CourseNoMapper">
+  <resultMap id="BaseResultMap" type="com.qxgmat.data.dao.entity.CourseNo">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="id" jdbcType="INTEGER" property="id" />
+    <result column="course_id" jdbcType="INTEGER" property="courseId" />
+    <result column="no" jdbcType="INTEGER" property="no" />
+    <result column="resource" jdbcType="VARCHAR" property="resource" />
+    <result column="time" jdbcType="INTEGER" property="time" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+  </resultMap>
+  <resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="com.qxgmat.data.dao.entity.CourseNo">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <result column="content" jdbcType="LONGVARCHAR" property="content" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    `id`, `course_id`, `no`, `resource`, `time`, `create_time`
+  </sql>
+  <sql id="Blob_Column_List">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    `content`
+  </sql>
+</mapper>

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

@@ -8,13 +8,13 @@
     <id column="id" jdbcType="INTEGER" property="id" />
     <result column="user_id" jdbcType="INTEGER" property="userId" />
     <result column="course_id" jdbcType="INTEGER" property="courseId" />
-    <result column="course_no_id" jdbcType="INTEGER" property="courseNoId" />
-    <result column="user_time" jdbcType="INTEGER" property="userTime" />
+    <result column="start_time" jdbcType="TIMESTAMP" property="startTime" />
+    <result column="expire_time" jdbcType="TIMESTAMP" property="expireTime" />
   </resultMap>
   <sql id="Base_Column_List">
     <!--
       WARNING - @mbg.generated
     -->
-    `id`, `user_id`, `course_id`, `course_no_id`, `user_time`
+    `id`, `user_id`, `course_id`, `start_time`, `expire_time`
   </sql>
 </mapper>

+ 20 - 0
server/data/src/main/java/com/qxgmat/data/dao/mapping/UserCourseProgressMapper.xml

@@ -0,0 +1,20 @@
+<?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.UserCourseProgressMapper">
+  <resultMap id="BaseResultMap" type="com.qxgmat.data.dao.entity.UserCourseProgress">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="id" jdbcType="INTEGER" property="id" />
+    <result column="user_id" jdbcType="INTEGER" property="userId" />
+    <result column="course_id" jdbcType="INTEGER" property="courseId" />
+    <result column="course_no_id" jdbcType="INTEGER" property="courseNoId" />
+    <result column="user_time" jdbcType="INTEGER" property="userTime" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    `id`, `user_id`, `course_id`, `course_no_id`, `user_time`
+  </sql>
+</mapper>

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

@@ -28,9 +28,6 @@ public class Application {
 
 // 服务:开通,服务权限验证,后台支付
 // 预习作业添加模式:用于主动发送用户
-// 课程与预习作业关系,分册进度
 // 模考做题次数,reset
 // 订单结构分析:服务、课程、数据都是商品
 // 购物车,订单
-// 练习列表,进度
-// 模考出题

+ 3 - 2
server/gateway-api/src/main/java/com/qxgmat/service/extend/QuestionFlowService.java

@@ -591,11 +591,12 @@ public class QuestionFlowService {
             throw new ParameterException("试卷不存在");
         }
 
-        if (userReport.getDetail() != null && userReport.getFinishTime() != null){
+        if (userReport.getIsFinish() > 0){
             return true;
         }
         userReport.setFinishTime(new Date());
         userReport.setIsFinish(1);
+
         List<UserQuestion> userQuestionList = userQuestionService.listByReport(userId, userReportId);
         // 分析做题结果
         StatReport callback = finishCallback.get(PaperModule.ValueOf(userReport.getPaperModule()));
@@ -1472,13 +1473,13 @@ public class QuestionFlowService {
 
             // 题型难度分计算
             QuestionDifficult questionDifficult = QuestionDifficult.ValueOf(difficultKey);
-
             if (userQuestion.getIsCorrect() > 0){
                 typeInfo.put("diffCorrect", typeInfo.getFloatValue("diffCorrect") + toolsService.diffScore(relation.getTotalNumber(), relation.getTotalCorrect(), questionDifficult));
             }else{
                 typeInfo.put("diffIncorrect", typeInfo.getFloatValue("diffIncorrect") + toolsService.diffScore(relation.getTotalNumber(), relation.getTotalCorrect(), questionDifficult));
             }
 
+            // 获取2级难度得分
             float difficultScore = relation.getQuestion().getDifficultScore();
             subjectInfo.put("difficultScore", subjectInfo.getFloatValue("difficultScore")+difficultScore);
         }