瀏覽代碼

LY 考试模块 考试记录

ly 1 年之前
父節點
當前提交
a866f2373d

+ 6 - 1
master/src/main/java/com/ruoyi/project/training/elearn/controller/TElQuController.java

@@ -365,7 +365,12 @@ public class TElQuController extends BaseController {
                     quStr = "";
                 }
 
-            } else {
+            }else if (text.startsWith("正确答案")) {
+                if (qu.getQuType() != -1) {
+                    qu.setAnalysis(text);
+                    tElQuService.updateTElQu(qu);
+                }
+            }else {
                 quStr = quStr + text;
             }
         }

+ 13 - 1
master/src/main/java/com/ruoyi/project/training/elearn/controller/TElUserExamController.java

@@ -33,6 +33,19 @@ public class TElUserExamController extends BaseController
     @Autowired
     private ITElUserExamService tElUserExamService;
 
+    /**
+     * 查询我的成绩列表
+     */
+    @PreAuthorize("@ss.hasPermi('elearn:userExam:list')")
+    @GetMapping("/myList")
+    public TableDataInfo mylist(TElUserExam tElUserExam)
+    {
+        tElUserExam.setUserId(getUserId());
+        startPage();
+        List<TElUserExam> list = tElUserExamService.selectTElUserExamList(tElUserExam);
+        return getDataTable(list);
+    }
+
     /**
      * 查询我的成绩列表
      */
@@ -40,7 +53,6 @@ public class TElUserExamController extends BaseController
     @GetMapping("/list")
     public TableDataInfo list(TElUserExam tElUserExam)
     {
-        tElUserExam.setUserId(getUserId());
         startPage();
         List<TElUserExam> list = tElUserExamService.selectTElUserExamList(tElUserExam);
         return getDataTable(list);

+ 33 - 0
master/src/main/java/com/ruoyi/project/training/elearn/controller/TElUserQuController.java

@@ -1,9 +1,14 @@
 package com.ruoyi.project.training.elearn.controller;
 
+import java.util.Date;
 import java.util.List;
 
+import com.ruoyi.project.training.elearn.domain.TElQu;
 import com.ruoyi.project.training.elearn.domain.TElQuRepo;
+import com.ruoyi.project.training.elearn.domain.TElUserBook;
+import com.ruoyi.project.training.elearn.mapper.TElQuMapper;
 import com.ruoyi.project.training.elearn.mapper.TElQuRepoMapper;
+import com.ruoyi.project.training.elearn.mapper.TElUserBookMapper;
 import com.ruoyi.project.training.elearn.mapper.TElUserQuMapper;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -42,6 +47,10 @@ public class TElUserQuController extends BaseController
     private TElUserQuMapper tElUserQuMapper;
     @Resource
     private TElQuRepoMapper tElQuRepoMapper;
+    @Resource
+    private TElUserBookMapper tElUserBookMapper;
+    @Resource
+    private TElQuMapper tElQuMapper;
     /**
      * 查询答题记录列表
      */
@@ -111,6 +120,30 @@ public class TElUserQuController extends BaseController
     @PostMapping
     public AjaxResult add(@RequestBody TElUserQu tElUserQu)
     {
+        long userId = getUserId();
+        tElUserQu.setUserId(userId);
+        if (0 == tElUserQu.getIsRight()) { //加入错题
+            TElUserBook quey = new TElUserBook();
+            quey.setUserId(userId);
+            quey.setQuId(tElUserQu.getQuId());
+            List<TElUserBook> books = tElUserBookMapper.selectTElUserBookList(quey);
+            TElQu qu = tElQuMapper.selectTElQuById(tElUserQu.getQuId());
+            if (books.size() == 0) {
+                TElUserBook book = new TElUserBook();
+                book.setUserId(userId);
+                book.setTitle(qu.getContent());
+                book.setQuId(tElUserQu.getQuId());
+                book.setWrongCount(1l);
+                book.setUpdatedate(new Date());
+                tElUserBookMapper.insertTElUserBook(book);
+            }else {
+                TElUserBook  book =books.get(0);
+                book.setUpdatedate(new Date());
+                book.setWrongCount(book.getWrongCount()+1);
+                tElUserBookMapper.updateTElUserBook(book);
+            }
+
+        }
         return toAjax(tElUserQuService.insertTElUserQu(tElUserQu));
     }
 

+ 3 - 3
master/src/main/java/com/ruoyi/project/training/elearn/domain/TElPaper.java

@@ -76,7 +76,7 @@ public class TElPaper extends BaseEntity
     private Long state;
 
     /** 截止时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd" , timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8")
     @Excel(name = "截止时间", width = 30, dateFormat = "yyyy-MM-dd")
     private Date limitTime;
 
@@ -88,7 +88,7 @@ public class TElPaper extends BaseEntity
     private String createrCode;
 
     /** 创建时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd" , timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8")
     @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd")
     private Date createdate;
 
@@ -97,7 +97,7 @@ public class TElPaper extends BaseEntity
     private String updaterCode;
 
     /** 更新日期 */
-    @JsonFormat(pattern = "yyyy-MM-dd" , timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8")
     @Excel(name = "更新日期", width = 30, dateFormat = "yyyy-MM-dd")
     private Date updatedate;
 

+ 11 - 2
master/src/main/java/com/ruoyi/project/training/elearn/domain/TElUserExam.java

@@ -24,6 +24,7 @@ public class TElUserExam extends BaseEntity
     @Excel(name = "用户ID")
     private Long userId;
 
+    private String userName;
     /** 考试ID */
     @Excel(name = "考试ID")
     private Long examId;
@@ -50,7 +51,7 @@ public class TElUserExam extends BaseEntity
     private String createrCode;
 
     /** 创建时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd" , timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8")
     @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd")
     private Date createdate;
 
@@ -59,7 +60,7 @@ public class TElUserExam extends BaseEntity
     private String updaterCode;
 
     /** 更新日期 */
-    @JsonFormat(pattern = "yyyy-MM-dd" , timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8")
     @Excel(name = "更新日期", width = 30, dateFormat = "yyyy-MM-dd")
     private Date updatedate;
 
@@ -184,6 +185,14 @@ public class TElUserExam extends BaseEntity
         this.title = title;
     }
 
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

+ 10 - 0
master/src/main/java/com/ruoyi/project/training/elearn/domain/TElUserQu.java

@@ -65,6 +65,8 @@ public class TElUserQu extends BaseEntity
     @Excel(name = "排序")
     private Long sort;
 
+    private Long isRight;
+
     public void setId(Long id)
     {
         this.id = id;
@@ -174,6 +176,14 @@ public class TElUserQu extends BaseEntity
         return sort;
     }
 
+    public Long getIsRight() {
+        return isRight;
+    }
+
+    public void setIsRight(Long isRight) {
+        this.isRight = isRight;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

+ 8 - 1
master/src/main/java/com/ruoyi/project/training/elearn/service/impl/TElPaperServiceImpl.java

@@ -4,6 +4,8 @@ import java.text.SimpleDateFormat;
 import java.util.*;
 
 import com.ruoyi.framework.job.service.JobService;
+import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.mapper.SysUserMapper;
 import com.ruoyi.project.training.elearn.domain.*;
 import com.ruoyi.project.training.elearn.mapper.*;
 import org.apache.commons.lang3.StringUtils;
@@ -52,6 +54,8 @@ public class TElPaperServiceImpl implements ITElPaperService
     private TElUserExamMapper tElUserExamMapper;
     @Resource
     private TElUserBookMapper tElUserBookMapper;
+    @Resource
+    private SysUserMapper sysUserMapper;
     /**
      * 查询在线考试
      *
@@ -264,6 +268,7 @@ public class TElPaperServiceImpl implements ITElPaperService
             // 同步保存考试成绩
             TElUserExam record = tElUserExamMapper.selectTElUserExamByPaPer(paper);
             long pass = objScore>=paper.getQualifyScore()?1:0;
+            SysUser user = sysUserMapper.selectUserById(paper.getUserId());
             if(record == null){
                 record = new TElUserExam();
                 record.setUserId(paper.getUserId());
@@ -272,12 +277,14 @@ public class TElPaperServiceImpl implements ITElPaperService
                 record.setMaxScore((long) objScore);
                 record.setTryCount(1l);
                 record.setPassed(pass);
+                record.setUpdatedate(new Date());
+                record.setUserName(user.getNickName());
                 tElUserExamMapper.insertTElUserExam(record);
             }else {
                 // 修复低分数不加入统计问题
                 record.setTryCount(record.getTryCount()+1);
                 record.setUpdatedate(new Date());
-
+                record.setUserName(user.getNickName());
                 if(record.getMaxScore() < objScore){
                     record.setMaxScore((long) objScore);
                     record.setPassed(pass);

+ 1 - 1
master/src/main/resources/mybatis/training/elearn/TElPaperMapper.xml

@@ -61,7 +61,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             and d.del_flag = 0
         </where>
         <!-- 数据范围过滤 -->
-        ${params.dataScope}
+        order by d.createdate desc
     </select>
 
     <select id="selectTElPaperById" parameterType="Long" resultMap="TElPaperResult">

+ 1 - 0
master/src/main/resources/mybatis/training/elearn/TElUserBookMapper.xml

@@ -40,6 +40,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             and d.del_flag = 0
         </where>
         <!-- 数据范围过滤 -->
+        order by d.updatedate desc
     </select>
 
     <select id="selectTElUserBookById" parameterType="Long" resultMap="TElUserBookResult">

+ 5 - 1
master/src/main/resources/mybatis/training/elearn/TElUserExamMapper.xml

@@ -19,10 +19,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="deptId"    column="dept_id"    />
         <result property="title"    column="title"    />
         <result property="deptName" column="dept_name" />
+        <result property="userName"    column="user_name"    />
     </resultMap>
 
     <sql id="selectTElUserExamVo">
-        select d.id,d.title, d.user_id, d.exam_id, d.try_count, d.max_score, d.passed, d.del_flag, d.creater_code, d.createdate, d.updater_code, d.updatedate, d.dept_id from t_el_user_exam d
+        select d.id,d.title, d.user_id, d.exam_id, d.try_count, d.max_score, d.passed, d.del_flag, d.creater_code, d.createdate, d.updater_code, d.updatedate, d.dept_id,d.user_name from t_el_user_exam d
     </sql>
 
     <select id="selectTElUserExamList" parameterType="TElUserExam" resultMap="TElUserExamResult">
@@ -76,6 +77,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updatedate != null">updatedate,</if>
             <if test="deptId != null">dept_id,</if>
             <if test="title != null">title,</if>
+            <if test="userName != null">user_name,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="id != null">#{id},</if>
@@ -91,6 +93,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updatedate != null">#{updatedate},</if>
             <if test="deptId != null">#{deptId},</if>
             <if test="title != null">#{title},</if>
+            <if test="userName != null">#{userName},</if>
          </trim>
     </insert>
 
@@ -109,6 +112,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updatedate != null">updatedate = #{updatedate},</if>
             <if test="deptId != null">dept_id = #{deptId},</if>
             <if test="title != null">title = #{title},</if>
+            <if test="userName != null">user_name = #{userName},</if>
         </trim>
         where id = #{id}
     </update>

+ 5 - 1
master/src/main/resources/mybatis/training/elearn/TElUserQuMapper.xml

@@ -17,10 +17,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="updaterCode"    column="updater_code"    />
         <result property="updatedate"    column="updatedate"    />
         <result property="sort"    column="sort"    />
+        <result property="isRight"    column="is_right"    />
+
     </resultMap>
 
     <sql id="selectTElUserQuVo">
-        select d.id, d.user_id, d.exam_id, d.qu_id, d.repo_id, d.title, d.del_flag, d.creater_code, d.createdate, d.updater_code, d.updatedate, d.sort  from t_el_user_qu d
+        select d.id, d.user_id, d.exam_id, d.qu_id, d.repo_id, d.title, d.del_flag, d.creater_code, d.createdate, d.updater_code, d.updatedate, d.sort, d.is_right  from t_el_user_qu d
     </sql>
 
     <select id="selectTElUserQuList" parameterType="TElUserQu" resultMap="TElUserQuResult">
@@ -79,6 +81,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updaterCode != null">updater_code,</if>
             <if test="updatedate != null">updatedate,</if>
             <if test="sort != null">sort,</if>
+            <if test="isRight != null">is_right,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="id != null">#{id},</if>
@@ -93,6 +96,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updaterCode != null">#{updaterCode},</if>
             <if test="updatedate != null">#{updatedate},</if>
             <if test="sort != null">#{sort},</if>
+            <if test="isRight != null">#{isRight},</if>
          </trim>
     </insert>
 

+ 9 - 0
ui/src/api/training/elearn/userExam.js

@@ -9,6 +9,15 @@ export function listUserExam(query) {
   })
 }
 
+// 查询我的成绩列表
+export function myListUserExam(query) {
+  return request({
+    url: '/elearn/userExam/myList',
+    method: 'get',
+    params: query
+  })
+}
+
 // 查询我的成绩详细
 export function getUserExam(id) {
   return request({

+ 7 - 0
ui/src/router/index.js

@@ -618,6 +618,13 @@ export const constantRoutes = [
         meta: { title: '题库训练', noCache: true },
         hidden: true
       },
+      {
+        path: 'userQu/users/:examId',
+        component: () => import('@/views/training/elearn/userExam/userList'),
+        name: 'ListExamUser',
+        meta: { title: '考试人员', noCache: true },
+        hidden: true
+      },
     ]
   },
   {

+ 9 - 0
ui/src/views/training/elearn/exam/index.vue

@@ -85,6 +85,12 @@
             @click="handleDelete(scope.row)"
             v-hasPermi="['elearn:exam:remove']"
           >删除</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleExamDetail(scope.row)"
+          >考试详情</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -577,6 +583,9 @@ export default {
         }
       });
     },
+    handleExamDetail(row) {
+      this.$router.push({ name: 'ListExamUser', params: { examId: row.examId }})
+    },
     /** 删除按钮操作 */
     handleDelete(row) {
       const examIds = row.examId || this.ids;

+ 21 - 98
ui/src/views/training/elearn/userExam/index.vue

@@ -33,7 +33,7 @@
 
       <el-table-column label="更新日期" align="center" prop="updatedate" width="100">
         <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.updatedate, '{y}-{m}-{d}') }}</span>
+          <span>{{ parseTime(scope.row.updatedate, '{y}-{m}-{d} {h}:{i}') }}</span>
         </template>
       </el-table-column>
       <el-table-column label="操作" align="center" fixed="right" width="120" class-name="small-padding fixed-width">
@@ -41,17 +41,9 @@
           <el-button
             size="mini"
             type="text"
-            icon="el-icon-edit"
-            @click="handleUpdate(scope.row)"
-            v-hasPermi="['elearn:userExam:edit']"
-          >修改</el-button>
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-delete"
-            @click="handleDelete(scope.row)"
-            v-hasPermi="['elearn:userExam:remove']"
-          >删除</el-button>
+            icon="el-icon-view"
+            @click="handlePaperDetail(scope.row)"
+          >考试明细</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -63,105 +55,29 @@
       :limit.sync="queryParams.pageSize"
       @pagination="getList"
     />
-
     <!-- 添加或修改我的成绩对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
-      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="用户ID" prop="userId">
-          <el-input v-model="form.userId" placeholder="请输入用户ID" />
-        </el-form-item>
-        <el-form-item label="考试ID" prop="examId">
-          <el-input v-model="form.examId" placeholder="请输入考试ID" />
-        </el-form-item>
-        <el-form-item label="考试次数" prop="tryCount">
-          <el-input v-model="form.tryCount" placeholder="请输入考试次数" />
-        </el-form-item>
-        <el-form-item label="最高分数" prop="maxScore">
-          <el-input v-model="form.maxScore" placeholder="请输入最高分数" />
-        </el-form-item>
-        <el-form-item label="是否通过" prop="passed">
-          <el-input v-model="form.passed" placeholder="请输入是否通过" />
-        </el-form-item>
-        <el-form-item label="删除" prop="delFlag">
-          <el-input v-model="form.delFlag" placeholder="请输入删除" />
-        </el-form-item>
-        <el-form-item label="创建人" prop="createrCode">
-          <el-input v-model="form.createrCode" placeholder="请输入创建人" />
-        </el-form-item>
-        <el-form-item label="创建时间" prop="createdate">
-          <el-date-picker clearable size="small" style="width: 200px"
-            v-model="form.createdate"
-            type="date"
-            value-format="yyyy-MM-dd"
-            placeholder="选择创建时间">
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="更新人" prop="updaterCode">
-          <el-input v-model="form.updaterCode" placeholder="请输入更新人" />
-        </el-form-item>
-        <el-form-item label="更新日期" prop="updatedate">
-          <el-date-picker clearable size="small" style="width: 200px"
-            v-model="form.updatedate"
-            type="date"
-            value-format="yyyy-MM-dd"
-            placeholder="选择更新日期">
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="所属部门" prop="deptId">
-          <el-input v-model="form.deptId" placeholder="请输入所属部门" />
-        </el-form-item>
-          <el-form-item label="归属部门" prop="deptId">
-              <treeselect v-model="form.deptId" :options="deptOptions" :show-count="true" placeholder="请选择归属部门" />
-          </el-form-item>
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="cancel">取 消</el-button>
+    <el-dialog :visible.sync="open" title="考试明细" width="60%" append-to-body>
+
+      <div class="el-dialog-div">
+        <my-paper-list :exam-id="examId" :user-id="userId" />
       </div>
+
     </el-dialog>
-      <!-- 用户导入对话框 -->
-      <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
-          <el-upload
-                  ref="upload"
-                  :limit="1"
-                  accept=".xlsx, .xls"
-                  :headers="upload.headers"
-                  :action="upload.url + '?updateSupport=' + upload.updateSupport"
-                  :disabled="upload.isUploading"
-                  :on-progress="handleFileUploadProgress"
-                  :on-success="handleFileSuccess"
-                  :auto-upload="false"
-                  drag
-          >
-              <i class="el-icon-upload"></i>
-              <div class="el-upload__text">
-                  将文件拖到此处,或
-                  <em>点击上传</em>
-              </div>
-              <div class="el-upload__tip" slot="tip">
-                  <el-checkbox v-model="upload.updateSupport" />是否更新已经存在的用户数据
-                  <el-link type="info" style="font-size:12px" @click="importTemplate">下载模板</el-link>
-              </div>
-              <div class="el-upload__tip" style="color:red" slot="tip">提示:仅允许导入“xls”或“xlsx”格式文件!</div>
-          </el-upload>
-          <div slot="footer" class="dialog-footer">
-              <el-button type="primary" @click="submitFileForm">确 定</el-button>
-              <el-button @click="upload.open = false">取 消</el-button>
-          </div>
-      </el-dialog>
+
   </div>
 </template>
 
 <script>
-import { listUserExam, getUserExam, delUserExam, addUserExam, updateUserExam, exportUserExam, importTemplate} from "@/api/training/elearn/userExam";
+import { myListUserExam, getUserExam, delUserExam, addUserExam, updateUserExam, exportUserExam, importTemplate} from "@/api/training/elearn/userExam";
 import { treeselect } from "@/api/system/dept";
 import { getToken } from "@/utils/auth";
 import Treeselect from "@riophae/vue-treeselect";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import MyPaperList from '@/views/training/elearn/userExam/paper'
 
 export default {
   name: "UserExam",
-  components: { Treeselect },
+  components: { Treeselect,MyPaperList },
   data() {
     return {
       // 遮罩层
@@ -185,6 +101,8 @@ export default {
       clientHeight:300,
       // 是否显示弹出层
       open: false,
+      examId: null,
+      userId: null,
         // 用户导入参数
         upload: {
             // 是否显示弹出层(用户导入)
@@ -240,11 +158,16 @@ export default {
     /** 查询我的成绩列表 */
     getList() {
       this.loading = true;
-      listUserExam(this.queryParams).then(response => {
+      myListUserExam(this.queryParams).then(response => {
         this.userExamList = response.rows;
         this.total = response.total;
         this.loading = false;
       });
+    },
+    handlePaperDetail(row){
+      this.examId = row.examId
+      this.userId = row.userId
+      this.open = true
     },
      /** 查询部门下拉树结构 */
      getTreeselect() {

+ 78 - 0
ui/src/views/training/elearn/userExam/paper.vue

@@ -0,0 +1,78 @@
+<template>
+
+  <div>
+
+    <el-table :data="paperList"  border>
+      <el-table-column label="考试标题" align="center" prop="title" :show-overflow-tooltip="true"/>
+      <el-table-column label="用户时长(分钟)" align="center" prop="userTime" :show-overflow-tooltip="true"/>
+      <el-table-column label="用户得分" align="center" prop="userScore" :show-overflow-tooltip="true"/>
+      <el-table-column label="考试时间" align="center" prop="createdate" width="200">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createdate, '{y}-{m}-{d} {h}:{i}') }}</span>
+        </template>
+      </el-table-column>
+
+    </el-table>
+
+  </div>
+
+</template>
+
+<script>
+
+import { listPaper } from '@/api/training/elearn/paper'
+
+export default {
+
+  name: 'UserPaperList',
+  props: {
+    examId: {
+      type: String,
+      default: ''
+    },
+    userId: {
+      type: String,
+      default: ''
+    }
+  },
+
+  data() {
+    return {
+      value1: null,
+      paperList: []
+    }
+  },
+
+  watch: {
+
+    // 检测查询变化
+    examId: {
+      handler() {
+        this.fetchPaperList()
+      },
+      deep: true
+    },
+
+    // 检测查询变化
+    userId: {
+      handler() {
+        this.fetchPaperList()
+      },
+      deep: true
+    }
+  },
+
+  created() {
+    this.fetchPaperList()
+  },
+  methods: {
+
+    fetchPaperList() {
+      const param = {userId:this.userId ,examId: this.examId }
+      listPaper(param).then(response => {
+        this.paperList = response.rows
+      })
+    }
+  }
+}
+</script>

+ 313 - 0
ui/src/views/training/elearn/userExam/userList.vue

@@ -0,0 +1,313 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+
+      <el-form-item label="考试名称" prop="title">
+        <el-input
+          v-model="queryParams.title"
+          placeholder="请输入考试名称"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+	  <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="userExamList" @selection-change="handleSelectionChange" :height="clientHeight" border>
+      <el-table-column label="人员" align="center" prop="userName" :show-overflow-tooltip="true"/>
+
+      <el-table-column label="考试" align="center" prop="title" :show-overflow-tooltip="true"/>
+      <el-table-column label="考试次数" align="center" prop="tryCount" :show-overflow-tooltip="true"/>
+      <el-table-column label="最高分数" align="center" prop="maxScore" :show-overflow-tooltip="true"/>
+      <el-table-column label="是否通过" align="center" prop="passed" :show-overflow-tooltip="true">
+          <template v-slot="scope">
+            <el-tag v-if="scope.row.passed == 1" size="small" type="success">通过</el-tag>
+            <el-tag v-else-if="scope.row.passed == 0" size="small" type="info">未通过</el-tag>
+          </template>
+      </el-table-column>
+
+      <el-table-column label="更新日期" align="center" prop="updatedate" width="100">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.updatedate, '{y}-{m}-{d} {h}:{i}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" fixed="right" width="120" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-view"
+            @click="handlePaperDetail(scope.row)"
+          >考试明细</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改我的成绩对话框 -->
+      <el-dialog :visible.sync="open" title="考试明细" width="60%" append-to-body>
+
+        <div class="el-dialog-div">
+          <my-paper-list :exam-id="examId" :user-id="userId" />
+        </div>
+
+    </el-dialog>
+      <!-- 用户导入对话框 -->
+  </div>
+</template>
+
+<script>
+import { listUserExam, getUserExam, delUserExam, addUserExam, updateUserExam, exportUserExam, importTemplate} from "@/api/training/elearn/userExam";
+import { treeselect } from "@/api/system/dept";
+import { getToken } from "@/utils/auth";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import MyPaperList from '@/views/training/elearn/userExam/paper'
+
+export default {
+  name: "UserExam",
+  components: { Treeselect,MyPaperList },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 我的成绩表格数据
+      userExamList: [],
+      // 弹出层标题
+      title: "",
+      // 部门树选项
+      deptOptions: undefined,
+      clientHeight:300,
+      // 是否显示弹出层
+      open: false,
+      examId: null,
+      userId: null,
+        // 用户导入参数
+        upload: {
+            // 是否显示弹出层(用户导入)
+            open: false,
+            // 弹出层标题(用户导入)
+            title: "",
+            // 是否禁用上传
+            isUploading: false,
+            // 是否更新已经存在的用户数据
+            updateSupport: 0,
+            // 设置上传的请求头部
+            headers: { Authorization: "Bearer " + getToken() },
+            // 上传的地址
+            url: process.env.VUE_APP_BASE_API + "/elearn/userExam/importData"
+        },
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 20,
+        userId: null,
+        examId: null,
+        tryCount: null,
+        maxScore: null,
+        passed: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  watch: {
+        // 根据名称筛选部门树
+        deptName(val) {
+            this.$refs.tree.filter(val);
+        }
+   },
+  created() {
+    this.queryParams.examId = this.$route.params.examId
+      //设置表格高度对应屏幕高度
+      this.$nextTick(() => {
+          this.clientHeight = document.body.clientHeight -250
+      })
+    this.getList();
+    this.getTreeselect();
+  },
+  methods: {
+    /** 查询我的成绩列表 */
+    getList() {
+      this.loading = true;
+      listUserExam(this.queryParams).then(response => {
+        this.userExamList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+     /** 查询部门下拉树结构 */
+     getTreeselect() {
+          treeselect().then(response => {
+              this.deptOptions = response.data;
+          });
+     },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        userId: null,
+        examId: null,
+        tryCount: null,
+        maxScore: null,
+        passed: null,
+        delFlag: null,
+        createrCode: null,
+        createdate: null,
+        updaterCode: null,
+        updatedate: null,
+        deptId: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    handlePaperDetail(row){
+      this.examId = row.examId
+      this.userId = row.userId
+      this.open = true
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加我的成绩";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getUserExam(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改我的成绩";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateUserExam(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addUserExam(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delUserExam(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        })
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有我的成绩数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return exportUserExam(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        })
+    },
+      /** 导入按钮操作 */
+      handleImport() {
+          this.upload.title = "用户导入";
+          this.upload.open = true;
+      },
+      /** 下载模板操作 */
+      importTemplate() {
+          importTemplate().then(response => {
+              this.download(response.msg);
+          });
+      },
+      // 文件上传中处理
+      handleFileUploadProgress(event, file, fileList) {
+          this.upload.isUploading = true;
+      },
+      // 文件上传成功处理
+      handleFileSuccess(response, file, fileList) {
+          this.upload.open = false;
+          this.upload.isUploading = false;
+          this.$refs.upload.clearFiles();
+          this.$alert(response.msg, "导入结果", { dangerouslyUseHTMLString: true });
+          this.getList();
+      },
+      // 提交上传文件
+      submitFileForm() {
+          this.$refs.upload.submit();
+      }
+  }
+};
+</script>

+ 13 - 4
ui/src/views/training/elearn/userQu/train.vue

@@ -59,7 +59,7 @@
 
     <div style="padding-top: 30px">
       <el-button type="primary" @click="handNext">继续下一题</el-button>
-      <el-button type="info" @click="onCancel">返回</el-button>
+<!--      <el-button type="info" @click="onCancel">返回</el-button>-->
     </div>
 
   </div>
@@ -67,7 +67,8 @@
 
 <script>
 import { getQu } from '@/api/training/elearn/qu'
-import { nextQu } from '@/api/training/elearn/userQu'
+import { nextQu, addUserQu } from '@/api/training/elearn/userQu'
+import { addUserBook } from "@/api/training/elearn/userBook";
 
 export default {
   name: 'BookTrain',
@@ -143,7 +144,12 @@ export default {
       // this.$router.push({ name: 'ListTran' })
       this.$router.push({ name: 'BookList' })
     },
+    addUserQu(isRight){
+      //
+      addUserQu({quId: this.quId,isRight:isRight}).then(response => {
 
+      })
+    },
     handNext() {
       // 直接显示下一个
       if (this.analysisShow) {
@@ -156,17 +162,20 @@ export default {
             message: '回答正确,你好棒哦!',
             type: 'success'
           })
-
+          // 添加正确历史记录
+          this.addUserQu(1)
           // 正确显示下一个
           this.fetchNextQu()
         } else {
           // 错误显示解析
           this.analysisShow = true
-
+          // 添加错误历史记录
+          this.addUserQu(0)
           this.$message({
             message: '很遗憾,做错了呢,请参考答案解析!',
             type: 'error'
           })
+
         }
       }
     }