WANG 6 жил өмнө
parent
commit
87ecaabb85

+ 1 - 0
src/modules/examwork/constants/constants.js

@@ -1,2 +1,3 @@
 export const core_api = "/api/ecs_core";
 export const exam_work_api = "/api/ecs_exam_work";
+export const outlet_api = "/api/ecs_outlet";

+ 893 - 8
src/modules/examwork/view/student.vue

@@ -1,17 +1,902 @@
 <template>
-  <div><section class="content" style="margin-top: -10px;"></section></div>
+  <div>
+    <section class="content" style="margin-top: -10px;">
+      <div class="box box-info">
+        <!-- 头信息 -->
+        <div
+          class="box-header with-border"
+          style="background-color:#D3DCE6;margin-bottom:20px;"
+        >
+          <h3 class="box-title">学生管理</h3>
+          <div class="box-tools pull-right">
+            <button
+              type="button"
+              class="btn btn-box-tool"
+              data-widget="collapse"
+            >
+              <i class="fa fa-minus"></i>
+            </button>
+          </div>
+        </div>
+
+        <!-- 正文信息 -->
+        <div class="box-body">
+          <el-form
+            :inline="true"
+            :model="formSearch"
+            label-position="right"
+            label-width="80px"
+          >
+            <el-form-item
+              v-if="isSuperAdmin"
+              label="顶级机构"
+              class="pull-left"
+            >
+              <el-select
+                style="width: 180px"
+                class="input_width_lg"
+                v-model="formSearch.rootOrgId"
+                placeholder="请选择"
+              >
+                <el-option
+                  v-for="item in rootOrgList"
+                  :label="item.name"
+                  :value="item.id"
+                  :key="item.id"
+                >
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="姓名" class="pull-left">
+              <el-input
+                placeholder="请输入姓名"
+                v-model="formSearch.name"
+              ></el-input>
+            </el-form-item>
+            <el-form-item label="学号" class="pull-left">
+              <el-input
+                placeholder="请输入学号"
+                v-model="formSearch.studentCode"
+              ></el-input>
+            </el-form-item>
+            <el-form-item label="身份证" class="pull-left">
+              <el-input
+                placeholder="请输入身份证"
+                v-model="formSearch.identityNumber"
+              ></el-input>
+            </el-form-item>
+            <el-form-item class="pull-right buttonframe">
+              <el-button
+                v-if="rolePrivileges.search_student"
+                size="small"
+                type="primary"
+                icon="search"
+                @click="searchForm"
+                >查询
+              </el-button>
+              <el-button
+                v-if="rolePrivileges.upload_student_photo"
+                size="small"
+                type="info"
+                @click="uploadPhoto"
+                >上传照片
+              </el-button>
+              <el-button
+                v-if="rolePrivileges.reset_student_password"
+                size="small"
+                type="warning"
+                @click="resetPassword('');"
+                >重置密码
+              </el-button>
+              <el-button
+                v-if="rolePrivileges.change_student_availability"
+                size="small"
+                type="success"
+                @click="enableStudent('');"
+                >启用
+              </el-button>
+              <el-button
+                v-if="rolePrivileges.change_student_availability"
+                size="small"
+                type="danger"
+                @click="disableStudent('');"
+                >禁用
+              </el-button>
+            </el-form-item>
+          </el-form>
+
+          <!-- 页面列表 -->
+          <el-table
+            :data="tableData"
+            border
+            style="width: 100%;text-align:center;"
+            @selection-change="selectChange"
+          >
+            <el-table-column type="selection" width="50"></el-table-column>
+            <el-table-column prop="id" width="100" label="ID"></el-table-column>
+            <el-table-column label="考生" width="100">
+              <template slot-scope="scope">
+                <el-popover trigger="hover" placement="left">
+                  <div style="font-size: 18px;font-family: 新宋体">
+                    <tr>
+                      <td style="color: green">姓名</td>
+                      <td style="color:purple;padding-left: 20px;">
+                        {{ scope.row.name }}
+                      </td>
+                    </tr>
+                    <tr>
+                      <td style="color: green">身份证号</td>
+                      <td style="color:purple;padding-left: 20px;">
+                        {{ scope.row.identityNumber }}
+                      </td>
+                    </tr>
+                    <tr>
+                      <td style="color: green">学号</td>
+                      <td style="color:purple;padding-left: 20px;">
+                        {{ scope.row.studentCode }}
+                      </td>
+                    </tr>
+                    <tr>
+                      <td style="color: green">学习中心</td>
+                      <td style="color:purple;padding-left: 20px;">
+                        {{ scope.row.orgName }}
+                      </td>
+                    </tr>
+                    <tr>
+                      <td style="color: green">手机号</td>
+                      <td style="color:purple;padding-left: 20px;">
+                        {{ scope.row.phoneNumber }}
+                      </td>
+                    </tr>
+                    <tr>
+                      <td style="color: green">安全手机号</td>
+                      <td style="color:purple;padding-left: 20px;">
+                        {{ scope.row.securityPhone }}
+                      </td>
+                    </tr>
+                    <tr>
+                      <td style="color: green">创建时间</td>
+                      <td style="color:purple;padding-left: 20px;">
+                        {{ scope.row.creationTime }}
+                      </td>
+                    </tr>
+                  </div>
+
+                  <div slot="reference" class="name-wrapper">
+                    <span>{{ scope.row.name }}</span>
+                  </div>
+                </el-popover>
+              </template>
+            </el-table-column>
+            <el-table-column
+              prop="studentCode"
+              width=""
+              label="学号"
+            ></el-table-column>
+            <el-table-column
+              prop="identityNumber"
+              width=""
+              label="身份证"
+            ></el-table-column>
+            <el-table-column
+              prop="updateTime"
+              width="168"
+              label="更新时间"
+            ></el-table-column>
+            <el-table-column width="100" label="状态">
+              <template slot-scope="scope">
+                <div>
+                  <span>
+                    <el-tag :type="getTag(scope.row.enable)">
+                      {{ getEnable(scope.row.enable) }}
+                    </el-tag>
+                  </span>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column label="操作" width="450">
+              <template slot-scope="scope">
+                <div>
+                  <el-button
+                    size="mini"
+                    type="warning"
+                    @click="showPhoto(scope.row);"
+                    >查看照片
+                  </el-button>
+                  <el-button
+                    size="mini"
+                    type="warning"
+                    @click="showStuExamDialog(scope.row);"
+                    >考试记录
+                  </el-button>
+                  <el-button
+                    v-if="rolePrivileges.reset_student_password"
+                    size="mini"
+                    type="warning"
+                    @click="resetPassword(scope.row);"
+                    >重置密码
+                  </el-button>
+                  <el-button
+                    v-if="
+                      null != scope.row.enable &&
+                        !scope.row.enable &&
+                        rolePrivileges.change_student_availability
+                    "
+                    size="mini"
+                    type="success"
+                    @click="enableStudent(scope.row);"
+                    >启用
+                  </el-button>
+                  <el-button
+                    v-else-if="rolePrivileges.change_student_availability"
+                    size="mini"
+                    type="danger"
+                    @click="disableStudent(scope.row);"
+                    >禁用
+                  </el-button>
+                  <el-button
+                    v-if="rolePrivileges.unbind_student_code"
+                    size="mini"
+                    type="warning"
+                    @click="unbindStudentCode(scope.row);"
+                    >解绑学号
+                  </el-button>
+                  <el-button
+                    v-if="rolePrivileges.unbind_security_phone"
+                    size="mini"
+                    type="warning"
+                    @click="unbindSecurityPhone(scope.row);"
+                    >解绑安全手机
+                  </el-button>
+                </div>
+              </template>
+            </el-table-column>
+          </el-table>
+          <div class="page pull-right">
+            <el-pagination
+              @current-change="handleCurrentChange"
+              :current-page="currentPage"
+              :page-size="pageSize"
+              layout="total, prev, pager, next, jumper"
+              :total="total"
+            >
+            </el-pagination>
+          </div>
+
+          <!-- 考试记录 -->
+          <el-dialog
+            title="学生考试记录"
+            size="small"
+            v-model="stuExamDialog"
+            v-loading="stuExamLoading"
+            element-loading-text="拼命加载中"
+          >
+            <el-form
+              :inline="true"
+              :model="stuExamSearch"
+              label-position="right"
+              label-width="100px"
+            >
+              <el-form-item label="考试" class="pull-left">
+                <el-select
+                  class="input"
+                  :remote-method="queryExams4Search"
+                  remote
+                  :loading="queryExams4SearchLoading"
+                  filterable
+                  clearable
+                  v-model="stuExamSearch.examId"
+                  placeholder="请选择"
+                >
+                  <el-option
+                    v-for="item in examList4Search"
+                    :label="item.name"
+                    :value="item.id"
+                    :key="item.id"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item class="pull-left">
+                <el-button
+                  size="small"
+                  type="primary"
+                  icon="search"
+                  @click="searchStuExam"
+                  >查询
+                </el-button>
+              </el-form-item>
+            </el-form>
+
+            <el-table
+              :data="stuExamList"
+              border
+              style="width: 100%;text-align:center;"
+            >
+              <el-table-column inline-template label="学生姓名">
+                <div>
+                  <span>{{ row.studentName }}</span>
+                </div>
+              </el-table-column>
+              <el-table-column inline-template label="学号">
+                <div>
+                  <span>{{ row.studentCode }}</span>
+                </div>
+              </el-table-column>
+              <el-table-column inline-template label="身份证">
+                <div>
+                  <span>{{ row.identityNumber }}</span>
+                </div>
+              </el-table-column>
+              <el-table-column inline-template label="考试">
+                <div>
+                  <span>{{ row.examName }}</span>
+                </div>
+              </el-table-column>
+              <el-table-column inline-template label="课程">
+                <div>
+                  <span>{{ row.courseName }}</span>
+                </div>
+              </el-table-column>
+              <el-table-column inline-template width="100" label="考试状态">
+                <div>
+                  <span v-if="null == row.started"></span>
+                  <span v-else-if="row.started">已考</span>
+                  <span v-else>未考</span>
+                </div>
+              </el-table-column>
+            </el-table>
+            <div class="page pull-right">
+              <el-pagination
+                @current-change="stuExamCurChange"
+                :current-page="stuExamCurPage"
+                :page-size="stuExamPageSize"
+                layout="total, prev, pager, next, jumper"
+                :total="stuExamTotal"
+              >
+              </el-pagination>
+            </div>
+          </el-dialog>
+
+          <!-- 导入弹窗 -->
+          <el-dialog
+            title="学生照片导入页"
+            size="tiny"
+            :visible.sync="photoUploadDialog"
+          >
+            <el-form>
+              <el-row>
+                <el-form-item style="margin-left:30px">
+                  <el-upload
+                    class="form_left"
+                    ref="upload"
+                    list-type="picture"
+                    :action="uploadAction"
+                    :headers="uploadHeaders"
+                    :data="uploadData"
+                    :before-upload="beforeUpload"
+                    :on-progress="uploadProgress"
+                    :on-success="uploadSuccess"
+                    :on-error="uploadError"
+                    :file-list="fileList"
+                    :auto-upload="false"
+                    :multiple="false"
+                  >
+                    <el-button size="small" slot="trigger" type="primary"
+                      >选择文件
+                    </el-button>
+                    <el-button
+                      size="small"
+                      style="margin-left:10px;"
+                      type="success"
+                      @click="submitUpload"
+                      >确认上传
+                    </el-button>
+                    <div slot="tip" class="el-upload__tip">
+                      只能上传jpg,png文件
+                    </div>
+                  </el-upload>
+                </el-form-item>
+              </el-row>
+            </el-form>
+          </el-dialog>
+
+          <el-dialog
+            @close="closePhotoDialog"
+            title="照片"
+            v-model="photoDialog"
+          >
+            <div class="student_photo">
+              <img :src="photo.url" alt="学生照片" height="20%" width="30%" />
+            </div>
+          </el-dialog>
+        </div>
+      </div>
+    </section>
+  </div>
 </template>
+
 <script>
+import { core_api, exam_work_api, outlet_api } from "../constants/constants.js";
+import { mapState } from "vuex";
+
 export default {
   data() {
-    return {};
+    return {
+      rolePrivileges: {
+        search_student: false,
+        upload_student_photo: false,
+        reset_student_password: false,
+        change_student_availability: false,
+        unbind_student_code: false,
+        unbind_security_phone: false
+      },
+      isSuperAdmin: false,
+      rootOrgList: null,
+      stuExamLoading: false,
+      button: {},
+      formSearch: {
+        rootOrgId: null,
+        name: "",
+        studentCode: "",
+        identityNumber: "",
+        enable: ""
+      },
+      selectedStuIds: [],
+      statusList: [
+        {
+          value: true,
+          label: "启用"
+        },
+        {
+          value: false,
+          label: "禁用"
+        }
+      ],
+
+      tableData: [],
+      currentPage: 1,
+      pageSize: 10,
+      total: 10,
+      photoDialog: false,
+      photo: { url: "" },
+
+      errMessages: [],
+      uploadAction: outlet_api + "/facepp/add",
+      uploadData: {},
+      fileLoading: false,
+      fileList: [],
+      uploadHeaders: {},
+      photoUploadDialog: false,
+
+      stuExamCurPage: 1,
+      stuExamPageSize: 10,
+      stuExamTotal: 10,
+      stuExamDialog: false,
+      stuExamList: [],
+      examList4Search: [],
+      queryExams4SearchLoading: false,
+      stuExamSearch: {
+        rootOrgId: null,
+        examId: "",
+        studentCode: "",
+        studentName: "",
+        orgId: null,
+        specialtyName: "",
+        courseCode: "",
+        courseName: "",
+        infoCollector: "",
+        identityNumber: "",
+        identityNumberLike: false,
+        withStarted: true
+      }
+    };
+  },
+  computed: {
+    ...mapState({ user: state => state.user }),
+    stuIds() {
+      var stuIds = "";
+      for (let stuId of this.selectedStuIds) {
+        if (!stuIds) {
+          stuIds += stuId;
+        } else {
+          stuIds += "," + stuId;
+        }
+      }
+      return stuIds;
+    }
   },
-  computed: {},
-  methods: {},
+  methods: {
+    queryExams4Search(name) {
+      this.queryExams(name, "search");
+    },
+    queryExams(name, where) {
+      console.log("queryExams; name: " + name);
+      if ("search" == where) {
+        this.queryExams4SearchLoading = true;
+      }
+      this.$http
+        .get(exam_work_api + "/exam/queryByNameLike?name=" + name)
+        .then(response => {
+          if ("search" == where) {
+            this.queryExams4SearchLoading = false;
+            this.examList4Search = response.body;
+          }
+        })
+        .catch(response => {
+          if (response.status == 500) {
+            this.$notify({
+              showClose: true,
+              message: response.body.desc,
+              type: "error"
+            });
+          }
+          if ("search" == where) {
+            this.queryExams4SearchLoading = false;
+          }
+        });
+    },
+    closeStuExamDialog() {
+      this.stuExamDialog = false;
+    },
+    showStuExamDialog(row) {
+      this.stuExamSearch.identityNumber = row.identityNumber;
+      this.stuExamList = [];
+      this.stuExamTotal = 0;
+      this.searchStuExam();
+      this.stuExamDialog = true;
+    },
+    searchStuExam() {
+      var param = new URLSearchParams(this.stuExamSearch);
+      this.stuExamLoading = true;
+      var url =
+        exam_work_api +
+        "/exam_student/examStudentPage/" +
+        (this.stuExamCurPage - 1) +
+        "/" +
+        this.stuExamPageSize +
+        "?" +
+        param;
+      this.$http
+        .get(url)
+        .then(response => {
+          this.stuExamList = response.body.list;
+          this.stuExamTotal = response.body.total;
+          this.stuExamLoading = false;
+        })
+        .catch(function(response) {
+          if (response.status == 500) {
+            this.$notify({
+              showClose: true,
+              message: response.body.desc,
+              type: "error"
+            });
+          }
+
+          this.stuExamLoading = false;
+        });
+    },
+    stuExamCurChange(val) {
+      this.stuExamCurPage = val;
+      this.stuExamSearch.page = val - 1;
+      this.searchStuExam();
+    },
+    closePhotoDialog() {
+      this.photo.url = "";
+      this.photoDialog = false;
+    },
+    showPhoto(row) {
+      if (row.photoPath) {
+        this.photo.url = row.photoPath;
+        this.photoDialog = true;
+      } else {
+        this.$notify({
+          showClose: true,
+          message: "未上传照片",
+          type: "error"
+        });
+      }
+    },
+    uploadPhoto() {
+      this.photoUploadDialog = true;
+      this.initUpload();
+    },
+    selectChange(row) {
+      this.selectedStuIds = [];
+      row.forEach((element, index) => {
+        console.log(index);
+        this.selectedStuIds.push(element.id);
+      });
+      console.log(this.selectedStuIds);
+    },
+    getStatus(status) {
+      if (status == true) {
+        return "启用";
+      } else if (status == false) {
+        return "禁用";
+      } else {
+        return "";
+      }
+    },
+    handleCurrentChange(val) {
+      this.currentPage = val;
+      this.searchForm();
+    },
+    //查询方法
+    searchForm() {
+      var param = new URLSearchParams(this.formSearch);
+      var url =
+        core_api +
+        "/student/studentPage/" +
+        (this.currentPage - 1) +
+        "/" +
+        this.pageSize +
+        "?" +
+        param;
+      this.$http
+        .get(url)
+        .then(response => {
+          this.tableData = response.data.list;
+          this.total = response.data.total;
+        })
+        .catch(function(response) {
+          if (response.status == 500) {
+            this.$notify({
+              showClose: true,
+              message: response.body.desc,
+              type: "error"
+            });
+          }
+        });
+    },
+    checkIds(row) {
+      if (row) {
+        return row.id;
+      } else {
+        if (this.stuIds.length == 0) {
+          this.$notify({
+            type: "warning",
+            message: "请选择学生"
+          });
+          return "";
+        } else {
+          return this.stuIds;
+        }
+      }
+    },
+    unbindStudentCode(row) {
+      var stuIds = this.checkIds(row);
+      if (!stuIds) return;
+      this.$confirm("是否解绑学号?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        var url = core_api + "/student/unbindStudentCode/" + stuIds;
+        this.$http.put(url).then(response => {
+          console.log(response);
+          this.$notify({
+            type: "success",
+            message: "解绑成功"
+          });
+          this.searchForm();
+        });
+      });
+    },
+    unbindSecurityPhone(row) {
+      var stuIds = this.checkIds(row);
+      if (!stuIds) return;
+      this.$confirm("是否解绑安全手机号?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        var url = core_api + "/student/unbindSecurityPhone/" + stuIds;
+        this.$http.put(url).then(response => {
+          console.log(response);
+          this.$notify({
+            type: "success",
+            message: "解绑成功"
+          });
+          this.searchForm();
+        });
+      });
+    },
+    //重置密码方法
+    resetPassword(row) {
+      var stuIds = this.checkIds(row);
+      if (!stuIds) return;
+      this.$confirm("是否重置所选学生的密码?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        var url = core_api + "/student/resetPass/" + stuIds;
+        this.$http.put(url).then(response => {
+          console.log(response);
+          this.$notify({
+            type: "success",
+            message: "重置密码成功"
+          });
+          this.searchForm();
+        });
+      });
+    },
+
+    //禁用
+    disableStudent(row) {
+      var stuIds = this.checkIds(row);
+      if (!stuIds) return;
+      this.$confirm("是否禁用所选学生?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        var url = core_api + "/student/disable/" + stuIds;
+        this.$http.put(url).then(response => {
+          console.log(response);
+          this.$notify({
+            type: "success",
+            message: "禁用成功"
+          });
+          this.searchForm();
+        });
+      });
+    },
 
-  //初始化查询
-  created() {}
+    //启用
+    enableStudent(row) {
+      var stuIds = this.checkIds(row);
+      if (!stuIds) return;
+      this.$confirm("是否启用所选学生?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        var url = core_api + "/student/enable/" + stuIds;
+        this.$http.put(url).then(response => {
+          console.log(response);
+          this.$notify({
+            type: "success",
+            message: "启用成功"
+          });
+          this.searchForm();
+        });
+      });
+    },
+    beforeUpload(file) {
+      console.log(file);
+    },
+    uploadProgress(event, file, fileList) {
+      console.log("uploadProgress");
+      console.log(event);
+      console.log(file);
+      console.log(fileList);
+    },
+    uploadSuccess(response, file, fileList) {
+      console.log(response);
+      console.log(file);
+      console.log(fileList);
+      this.$notify({
+        message: "上传成功",
+        type: "success"
+      });
+      this.fileLoading = false;
+      this.photoUploadDialog = false;
+      this.searchForm();
+    },
+    uploadError(response, file, fileList) {
+      console.log(response);
+      console.log(file);
+      console.log(fileList);
+      var jsonStr = response.message.substring(4);
+      var resp = eval("(" + jsonStr + ")");
+      if (response.status == 500) {
+        this.$notify({
+          message: resp.desc,
+          type: "error"
+        });
+      }
+      this.fileLoading = false;
+    },
+    initUpload() {
+      this.fileList = [];
+    },
+    checkUpload() {
+      var fileList = this.$refs.upload.uploadFiles;
+      if (fileList.length == 0) {
+        this.$notify({
+          message: "上传文件不能为空",
+          type: "error"
+        });
+        return false;
+      }
+      if (fileList.length > 1) {
+        this.$notify({
+          message: "每次只能上传一个文件",
+          type: "error"
+        });
+        return false;
+      }
+      for (let file of fileList) {
+        let f = file.name.toLowerCase();
+        if (!f.endsWith(".jpg") && !f.endsWith(".png")) {
+          this.$notify({
+            message: "上传文件必须为jpg或者png格式",
+            type: "error"
+          });
+          this.initUpload();
+          return false;
+        }
+      }
+      return true;
+    },
+    //确定上传
+    submitUpload() {
+      if (!this.checkUpload()) {
+        return false;
+      }
+      this.$refs.upload.submit();
+      this.fileLoading = true;
+    },
+    //清空文件
+    removeFile() {
+      this.$refs.upload.clearFiles();
+    },
+    getTag(status) {
+      if (status == true) {
+        return "success";
+      } else if (status == false) {
+        return "danger";
+      } else {
+        return status;
+      }
+    },
+    getEnable(enable) {
+      if (enable == true) {
+        return "启用";
+      } else if (enable == false) {
+        return "禁用";
+      } else {
+        return "启用";
+      }
+    },
+    initPrivileges() {
+      let params = new URLSearchParams({
+        privilegeCodes: Object.keys(this.rolePrivileges).toString()
+      });
+      let url = core_api + "/rolePrivilege/checkPrivileges?" + params;
+      this.$http.post(url).then(response => {
+        this.rolePrivileges = response.data;
+      });
+    },
+    init() {
+      this.initPrivileges();
+
+      for (let role of this.user.roleList) {
+        if (role.roleCode == "SUPER_ADMIN") {
+          this.isSuperAdmin = true;
+          break;
+        }
+      }
+
+      var url = core_api + "/org/getRootOrgList";
+
+      this.$http.get(url).then(response => {
+        this.rootOrgList = response.data;
+        this.formSearch.rootOrgId = this.user.rootOrgId;
+        this.searchForm();
+      });
+    }
+  },
+  created() {
+    this.init();
+    this.uploadHeaders = {
+      key: this.user.key,
+      token: this.user.token
+    };
+  }
 };
 </script>
-
-<style scoped></style>
+<style scoped>
+</style>