WANG 6 лет назад
Родитель
Сommit
2ee42c9bd5

+ 886 - 0
src/modules/examwork/view/offlineExam.vue

@@ -0,0 +1,886 @@
+<style>
+.select-margin {
+  margin-left: 20px;
+}
+
+.button-margin {
+  margin-left: 120px;
+}
+</style>
+<template>
+  <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"
+          v-loading="formLoading"
+          element-loading-text="处理中请稍后"
+        >
+          <!-- 基础信息 -->
+          <el-form
+            :inline="true"
+            :rules="rules"
+            ref="offlineExamForm"
+            :model="offlineExamForm"
+            label-position="right"
+            label-width="100px"
+          >
+            <div style="text-align:right">
+              <el-button type="primary" @click="saveOfflineExam"
+                >确 定</el-button
+              >
+              <el-button @click="back">返 回</el-button>
+            </div>
+            <el-tabs v-model="tabs">
+              <el-tab-pane label="基础信息" name="first">
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="考试名称"
+                      :label-width="formLabelWidth"
+                      prop="name"
+                    >
+                      <el-input
+                        style="width:200px"
+                        :maxlength="50"
+                        type="textarea"
+                        autosize
+                        v-model="offlineExamForm.name"
+                        auto-complete="off"
+                      ></el-input>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="考试类型"
+                      class="select-margin"
+                      prop="examType"
+                    >
+                      <el-select
+                        style="width:200px"
+                        :disabled="true"
+                        v-model="offlineExamForm.examType"
+                        placeholder="请选择"
+                      >
+                        <el-option
+                          v-for="item in examTypeList"
+                          :key="item.value"
+                          :label="item.label"
+                          :value="item.value"
+                        >
+                        </el-option>
+                      </el-select>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="开始时间"
+                      :label-width="formLabelWidth"
+                      prop="beginTime"
+                    >
+                      <el-date-picker
+                        style="width:200px"
+                        v-model.number="offlineExamForm.beginTime"
+                        type="datetime"
+                        placeholder="选择考试开始时间"
+                        @change="getBeginTime"
+                      >
+                      </el-date-picker>
+                    </el-form-item>
+                    <el-form-item
+                      label="结束时间"
+                      :label-width="formLabelWidth"
+                      prop="endTime"
+                    >
+                      <el-date-picker
+                        style="width:200px"
+                        v-model.number="offlineExamForm.endTime"
+                        type="datetime"
+                        placeholder="选择考试结束时间"
+                        @change="getEndTime"
+                      >
+                      </el-date-picker>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="上传附件"
+                      :label-width="formLabelWidth"
+                    >
+                      <el-radio-group
+                        v-model="
+                          offlineExamForm.properties.CAN_UPLOAD_ATTACHMENT
+                        "
+                      >
+                        <el-radio label="true">允许</el-radio>
+                        <el-radio label="false">不允许</el-radio>
+                      </el-radio-group>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="是否开启"
+                      :label-width="formLabelWidth"
+                    >
+                      <el-radio-group v-model="offlineExamForm.enable">
+                        <el-radio label="true">开启</el-radio>
+                        <el-radio label="false">关闭</el-radio>
+                      </el-radio-group>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+              </el-tab-pane>
+            </el-tabs>
+          </el-form>
+
+          <!-- 特殊设置 -->
+          <el-form
+            :inline="true"
+            :rules="rules"
+            ref="examOrgSearch"
+            :model="examOrgSearch"
+            label-position="right"
+            label-width="100px"
+          >
+            <el-tabs v-model="tabs" v-show="this.examId != 'add'">
+              <el-tab-pane label="学习中心特殊设置" name="first">
+                <el-form-item label="学习中心" label-width="120px" prop="orgId">
+                  <el-select
+                    class="select"
+                    :remote-method="getOrgList4Search"
+                    :loading="loading4Search"
+                    remote
+                    filterable
+                    clearable
+                    v-model="examOrgSearch.orgId"
+                    placeholder="请选择"
+                  >
+                    <el-option
+                      v-for="item in orgList4Search"
+                      :label="item.name"
+                      :value="item.id"
+                      :key="item.id"
+                    >
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+                <el-form-item class="pull-right buttonframe">
+                  <el-button
+                    size="small"
+                    type="primary"
+                    icon="search"
+                    @click="getExamOrgList"
+                    >查询
+                  </el-button>
+                  <el-button
+                    size="small"
+                    type="primary"
+                    icon="plus"
+                    @click="addExamOrg"
+                    >新增
+                  </el-button>
+                </el-form-item>
+                <el-table
+                  v-loading="loading"
+                  element-loading-text="拼命加载中"
+                  :data="examOrgList"
+                  border
+                  style="width:100%;text-align:center;"
+                >
+                  <el-table-column inline-template width="150" label="ID">
+                    <div>
+                      <span>{{ row.id }}</span>
+                    </div>
+                  </el-table-column>
+                  <el-table-column inline-template label="学习中心代码">
+                    <div>
+                      <span>{{ row.orgCode }}</span>
+                    </div>
+                  </el-table-column>
+                  <el-table-column inline-template label="学习中心名称">
+                    <div>
+                      <span>{{ row.orgName }}</span>
+                    </div>
+                  </el-table-column>
+                  <el-table-column inline-template width="200" label="开始时间">
+                    <div>
+                      <span>{{ offlineExamForm.beginTime }}</span>
+                    </div>
+                  </el-table-column>
+                  <el-table-column inline-template width="200" label="结束时间">
+                    <div>
+                      <span>{{ row.endTime }}</span>
+                    </div>
+                  </el-table-column>
+                  <el-table-column inline-template width="200" label="更新时间">
+                    <div>
+                      <span>{{ row.updateTime }}</span>
+                    </div>
+                  </el-table-column>
+                  <el-table-column inline-template width="100" label="上传附件">
+                    <div>
+                      <span>
+                        <el-tag :type="getCanUploadTag(row)">
+                          {{ getCanUpload(row) }}
+                        </el-tag>
+                      </span>
+                    </div>
+                  </el-table-column>
+                  <el-table-column
+                    :context="_self"
+                    inline-template
+                    label="操作"
+                    width="200"
+                  >
+                    <div>
+                      <el-button
+                        size="mini"
+                        type="info"
+                        @click="editExamOrg(row);"
+                      >
+                        修改
+                      </el-button>
+                    </div>
+                  </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-tab-pane>
+            </el-tabs>
+          </el-form>
+
+          <!-- 新增 -->
+          <el-dialog
+            title="新增学习中心考试设置"
+            size="tiny"
+            v-model="addExamOrgDialog"
+          >
+            <el-form
+              :model="examOrgForm"
+              :rules="examOrgRules"
+              ref="examOrgForm"
+              label-position="right"
+              :inline="true"
+            >
+              <el-row>
+                <el-form-item label-width="120px" label="学习中心" prop="orgId">
+                  <el-select
+                    class="select"
+                    :remote-method="getOrgList4InsertOrUpdate"
+                    :loading="loading4InsertOrUpdate"
+                    remote
+                    filterable
+                    clearable
+                    v-model="examOrgForm.orgId"
+                    placeholder="请选择"
+                  >
+                    <el-option
+                      v-for="item in orgList4InsertOrUpdate"
+                      :label="item.name"
+                      :value="item.id"
+                      :key="item.id"
+                    >
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item
+                  label-width="120px"
+                  label="考试开始时间"
+                  prop="beginTime"
+                >
+                  <el-date-picker
+                    style="width:220px"
+                    v-model.number="examOrgForm.beginTime"
+                    type="datetime"
+                    placeholder="选择考试结束时间"
+                    @change="getOrgBeginTime"
+                    readonly
+                  >
+                  </el-date-picker>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item
+                  label-width="120px"
+                  label="考试结束时间"
+                  prop="endTime"
+                >
+                  <el-date-picker
+                    style="width:220px"
+                    v-model.number="examOrgForm.endTime"
+                    type="datetime"
+                    placeholder="选择考试结束时间"
+                    @change="getOrgEndTime"
+                  >
+                  </el-date-picker>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item label-width="120px" label="上传附件">
+                  <el-radio-group
+                    v-model="examOrgForm.properties.CAN_UPLOAD_ATTACHMENT"
+                  >
+                    <el-radio label="true">允许</el-radio>
+                    <el-radio label="false">不允许</el-radio>
+                  </el-radio-group>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <div style="margin-left:30%">
+                  <el-button type="primary" @click="insertExamOrg"
+                    >确 定</el-button
+                  >
+                  <el-button @click="addExamOrgDialog = false;"
+                    >取 消</el-button
+                  >
+                </div>
+              </el-row>
+            </el-form>
+          </el-dialog>
+
+          <!-- 修改 -->
+          <el-dialog
+            title="新增学习中心考试设置"
+            size="tiny"
+            v-model="updateExamOrgDialog"
+          >
+            <el-form
+              :model="examOrgForm"
+              :rules="examOrgRules"
+              ref="examOrgForm"
+              label-position="right"
+              :inline="true"
+            >
+              <el-row>
+                <el-form-item label-width="120px" label="学习中心" prop="orgId">
+                  <el-select
+                    class="select"
+                    :remote-method="getOrgList4InsertOrUpdate"
+                    :loading="loading4InsertOrUpdate"
+                    remote
+                    filterable
+                    clearable
+                    v-model="examOrgForm.orgId"
+                    placeholder="请选择"
+                  >
+                    <el-option
+                      v-for="item in orgList4InsertOrUpdate"
+                      :label="item.name"
+                      :value="item.id"
+                      :key="item.id"
+                    >
+                    </el-option>
+                  </el-select>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item
+                  label-width="120px"
+                  label="考试开始时间"
+                  prop="beginTime"
+                >
+                  <el-date-picker
+                    style="width:220px"
+                    v-model.number="examOrgForm.beginTime"
+                    type="datetime"
+                    placeholder="选择考试结束时间"
+                    @change="getOrgBeginTime"
+                    readonly
+                  >
+                  </el-date-picker>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item
+                  label-width="120px"
+                  label="考试结束时间"
+                  prop="endTime"
+                >
+                  <el-date-picker
+                    style="width:220px"
+                    v-model.number="examOrgForm.endTime"
+                    type="datetime"
+                    placeholder="选择考试结束时间"
+                    @change="getOrgEndTime"
+                  >
+                  </el-date-picker>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <el-form-item label-width="120px" label="上传附件">
+                  <el-radio-group
+                    v-model="examOrgForm.properties.CAN_UPLOAD_ATTACHMENT"
+                  >
+                    <el-radio label="true">允许</el-radio>
+                    <el-radio label="false">不允许</el-radio>
+                  </el-radio-group>
+                </el-form-item>
+              </el-row>
+              <el-row>
+                <div style="margin-left:30%">
+                  <el-button type="primary" @click="updateExamOrg"
+                    >确 定</el-button
+                  >
+                  <el-button @click="updateExamOrgDialog = false;"
+                    >取 消</el-button
+                  >
+                </div>
+              </el-row>
+            </el-form>
+          </el-dialog>
+        </div>
+      </div>
+    </section>
+  </div>
+</template>
+<script>
+import { core_api, exam_work_api, EXAM_TYPE } from "../store/global";
+import { getDateTime } from "../util/date.js";
+import { mapState } from "vuex";
+
+let _this = null;
+
+export default {
+  data() {
+    var validateBeginTime = (rule, value, callback) => {
+      if (!_this.offlineExamForm.beginTime) {
+        callback(new Error("请选择考试开始日期"));
+      } else {
+        callback();
+      }
+    };
+    var validateEndTime = (rule, value, callback) => {
+      if (!_this.offlineExamForm.endTime) {
+        callback(new Error("请选择考试结束日期"));
+      } else if (
+        _this.offlineExamForm.beginTime > _this.offlineExamForm.endTime
+      ) {
+        callback(new Error("开始日期不能大于结束日期"));
+      } else {
+        callback();
+      }
+    };
+    var validateName = (rule, value, callback) => {
+      if (_this.offlineExamForm.name == "") {
+        callback(new Error("请输入考试名称"));
+      } else if (
+        !_this.offlineExamForm.name.match(/^[\u4E00-\u9FA5A-Za-z0-9_]+$/)
+      ) {
+        callback(new Error("只能为英文、汉字、数字"));
+      } else if (_this.offlineExamForm.name.length > 50) {
+        callback(new Error("最大长度为50"));
+      } else {
+        callback();
+      }
+    };
+    var validateExamOrgEndTime = (rule, value, callback) => {
+      if (!_this.examOrgForm.endTime) {
+        callback(new Error("请选择考试结束日期"));
+      } else if (_this.examOrgForm.beginTime > _this.examOrgForm.endTime) {
+        callback(new Error("开始日期不能大于结束日期"));
+      } else {
+        callback();
+      }
+    };
+
+    return {
+      tabs: "first",
+      loading: false,
+      formLoading: false,
+      currentPage: 1,
+      pageSize: 10,
+      total: 0,
+      examOrgSearch: {
+        examId: null,
+        orgId: null
+      },
+      offlineExamForm: {
+        name: "",
+        examType: "OFFLINE",
+        beginTime: "",
+        endTime: "",
+        enable: "true",
+        properties: {
+          CAN_UPLOAD_ATTACHMENT: "true"
+        }
+      },
+      addExamOrgDialog: false,
+      updateExamOrgDialog: false,
+      examOrgForm: {
+        examId: null,
+        orgId: null,
+        beginTime: null,
+        endTime: null,
+        properties: {
+          CAN_UPLOAD_ATTACHMENT: "true"
+        }
+      },
+
+      orgList4Search: [],
+      loading4Search: false,
+      orgList4InsertOrUpdate: [],
+      loading4InsertOrUpdate: false,
+      examOrgList: [],
+      examTypeList: EXAM_TYPE,
+      formLabelWidth: "120px",
+      examId: "",
+      rules: {
+        name: [{ required: true, validator: validateName, trigger: "blur" }],
+        beginTime: [
+          {
+            type: "date",
+            required: true,
+            validator: validateBeginTime,
+            trigger: "change"
+          }
+        ],
+        endTime: [
+          {
+            type: "date",
+            required: true,
+            validator: validateEndTime,
+            trigger: "change"
+          }
+        ]
+      },
+      examOrgRules: {
+        orgId: [
+          {
+            type: "number",
+            required: true,
+            message: "请选择学习中心",
+            trigger: "change"
+          }
+        ],
+        endTime: [
+          {
+            type: "date",
+            required: true,
+            validator: validateExamOrgEndTime,
+            trigger: "change"
+          }
+        ]
+      }
+    };
+  },
+
+  methods: {
+    getBeginTime(val) {
+      this.offlineExamForm.beginTime = val;
+    },
+    getEndTime(val) {
+      this.offlineExamForm.endTime = val;
+    },
+    getOrgEndTime(val) {
+      this.examOrgForm.endTime = val;
+    },
+    getOrgBeginTime(val) {
+      this.examOrgForm.begin = val;
+    },
+    addExamOrg() {
+      this.examOrgForm.examId = this.examId;
+      this.orgList4InsertOrUpdate = [];
+      this.examOrgForm.orgId = null;
+      this.examOrgForm.beginTime = this.offlineExamForm.beginTime;
+      this.examOrgForm.endTime = this.offlineExamForm.endTime;
+      this.examOrgForm.properties.CAN_UPLOAD_ATTACHMENT = "true";
+      this.addExamOrgDialog = true;
+    },
+    init() {
+      if (this.examId != "add") {
+        var url = exam_work_api + "/exam/" + this.examId;
+        this.$http.get(url).then(
+          response => {
+            var body = response.body;
+            body.properties = this.offlineExamForm.properties;
+            this.offlineExamForm = Object.assign(
+              this.offlineExamForm,
+              response.body
+            );
+            this.offlineExamForm.enable = this.offlineExamForm.enable
+              ? "true"
+              : "false";
+
+            var url = exam_work_api + "/exam/allProperties/" + this.examId;
+            this.$http.get(url).then(
+              response => {
+                this.offlineExamForm.properties = Object.assign(
+                  this.offlineExamForm.properties,
+                  response.body
+                );
+              },
+              response => {
+                this.$notify({
+                  type: "error",
+                  message: response.body.desc
+                });
+              }
+            );
+            this.getExamOrgList();
+          },
+          response => {
+            this.$notify({
+              type: "error",
+              message: response.body.desc
+            });
+          }
+        );
+      }
+    },
+    saveOfflineExam() {
+      var url = exam_work_api + "/exam";
+      this.$refs.offlineExamForm.validate(valid => {
+        if (valid) {
+          this.formLoading = true;
+          if (this.examId != "add") {
+            this.$http.put(url, this.offlineExamForm).then(
+              response => {
+                console.log(response);
+                this.$notify({
+                  type: "success",
+                  message: "保存成功"
+                });
+                this.getExamOrgList();
+                this.formLoading = false;
+              },
+              response => {
+                var errMsg = response.body.errorMsg
+                  ? response.body.errorMsg
+                  : "保存失败";
+                this.$notify({
+                  type: "error",
+                  message: errMsg
+                });
+                this.formLoading = false;
+              }
+            );
+          } else {
+            this.$http.post(url, this.offlineExamForm).then(
+              response => {
+                this.$notify({
+                  type: "success",
+                  message: "新增成功"
+                });
+                this.formLoading = false;
+                this.examId = response.body.id;
+                this.$router.replace({
+                  path: "/index/offlineExam/" + response.body.id
+                });
+              },
+              response => {
+                var errMsg = response.body.errorMsg
+                  ? response.body.errorMsg
+                  : "新增失败";
+                this.$notify({
+                  type: "error",
+                  message: errMsg
+                });
+                this.formLoading = false;
+              }
+            );
+          }
+        } else {
+          return false;
+        }
+      });
+    },
+    back() {
+      this.$router.push({ path: "/index/examInfo" });
+    },
+    getDateTime(ms) {
+      return getDateTime(ms);
+    },
+    editExamOrg(row) {
+      this.examOrgForm.examId = this.examId;
+      this.examOrgForm.beginTime = this.offlineExamForm.beginTime;
+      this.orgList4InsertOrUpdate = [{ id: row.orgId, name: row.orgName }];
+      this.examOrgForm.orgId = row.orgId;
+      this.examOrgForm.endTime = row.endTime;
+      this.examOrgForm.properties.CAN_UPLOAD_ATTACHMENT =
+        row.properties.CAN_UPLOAD_ATTACHMENT;
+      this.updateExamOrgDialog = true;
+    },
+    getCanUpload(row) {
+      if (row.properties.CAN_UPLOAD_ATTACHMENT === null) {
+        if (Date.now() > row.endTime) {
+          return "不允许";
+        } else {
+          return "允许";
+        }
+      } else {
+        return row.properties.CAN_UPLOAD_ATTACHMENT == "true"
+          ? "允许"
+          : "不允许";
+      }
+    },
+    getCanUploadTag(row) {
+      if (this.getCanUpload(row) === "允许") {
+        return "success";
+      } else {
+        return "danger";
+      }
+    },
+    insertExamOrg() {
+      this.$refs.examOrgForm.validate(valid => {
+        if (valid) {
+          var url = exam_work_api + "/exam/examOrgSettings";
+          this.$http.post(url, this.examOrgForm).then(
+            response => {
+              console.log(response);
+              this.$notify({
+                type: "success",
+                message: "保存成功"
+              });
+              this.getExamOrgList();
+              this.addExamOrgDialog = false;
+            },
+            response => {
+              this.$notify({
+                type: "error",
+                message: response.body.desc
+              });
+            }
+          );
+        } else {
+          return false;
+        }
+      });
+    },
+    updateExamOrg() {
+      this.$refs.examOrgForm.validate(valid => {
+        if (valid) {
+          var url = exam_work_api + "/exam/examOrgSettings";
+          this.$http.post(url, this.examOrgForm).then(
+            response => {
+              console.log(response);
+              this.$notify({
+                type: "success",
+                message: "保存成功"
+              });
+              this.getExamOrgList();
+              this.updateExamOrgDialog = false;
+            },
+            response => {
+              this.$notify({
+                type: "error",
+                message: response.body.desc
+              });
+            }
+          );
+        } else {
+          return false;
+        }
+      });
+    },
+    getExamOrgList() {
+      this.examOrgSearch.examId = this.examId;
+      let param = new URLSearchParams(this.examOrgSearch);
+      let url =
+        exam_work_api +
+        "/exam/getExamOrgSettingsList/" +
+        (this.currentPage - 1) +
+        "/" +
+        this.pageSize +
+        "?" +
+        param;
+      this.loading = true;
+      this.$http.get(url).then(response => {
+        console.log(response);
+        this.examOrgList = response.body.list;
+        this.total = response.body.total;
+        this.loading = false;
+      });
+    },
+    getOrgList4Search(orgName) {
+      this.loading4Search = true;
+      var url =
+        core_api + "/org/query?" + new URLSearchParams({ name: orgName });
+      this.$http
+        .get(url)
+        .then(response => {
+          this.orgList4Search = response.body;
+          this.loading4Search = false;
+        })
+        .catch(response => {
+          if (response.status == 500) {
+            this.$notify({
+              showClose: true,
+              message: response.body.desc,
+              type: "error"
+            });
+          }
+          this.loading4Search = false;
+        });
+    },
+    getOrgList4InsertOrUpdate(orgName) {
+      this.loading4InsertOrUpdate = true;
+      var url =
+        core_api + "/org/query?" + new URLSearchParams({ name: orgName });
+      this.$http
+        .get(url)
+        .then(response => {
+          this.orgList4InsertOrUpdate = response.body;
+          this.loading4InsertOrUpdate = false;
+        })
+        .catch(response => {
+          if (response.status == 500) {
+            this.$notify({
+              showClose: true,
+              message: response.body.desc,
+              type: "error"
+            });
+          }
+          this.loading4InsertOrUpdate = false;
+        });
+    },
+    handleCurrentChange(val) {
+      this.currentPage = val;
+      this.getExamOrgList();
+    }
+  },
+  computed: {
+    ...mapState({ user: state => state.user })
+  },
+  created() {
+    _this = this;
+    this.examId = this.$route.params.id;
+    this.init();
+  }
+};
+</script>

+ 886 - 0
src/modules/examwork/view/onlineExam.vue

@@ -0,0 +1,886 @@
+<style>
+.select-margin {
+  margin-left: 20px;
+}
+
+.button-margin {
+  margin-left: 120px;
+}
+
+.ckeditor {
+  width: 450px;
+}
+</style>
+<template>
+  <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"
+            :rules="rules"
+            ref="onlineExamForm"
+            :model="onlineExamForm"
+            label-position="right"
+            label-width="100px"
+          >
+            <div style="text-align:right">
+              <el-button type="primary" @click="saveOnlineExam"
+                >保 存</el-button
+              >
+              <el-button @click="back">返 回</el-button>
+            </div>
+            <el-tabs v-model="tabs">
+              <el-tab-pane label="基础信息" name="first">
+                <el-row :gutter="10">
+                  <el-col>
+                    <el-form-item
+                      label="考试名称"
+                      :label-width="formLabelWidth"
+                      prop="name"
+                    >
+                      <el-input
+                        style="width:200px"
+                        :maxlength="50"
+                        type="textarea"
+                        autosize
+                        v-model="onlineExamForm.name"
+                      ></el-input>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="考试类型"
+                      class="select-margin"
+                      prop="examType"
+                    >
+                      <el-select
+                        style="width:200px"
+                        :disabled="true"
+                        v-model="onlineExamForm.examType"
+                        placeholder="请选择"
+                      >
+                        <el-option
+                          v-for="item in examTypeList"
+                          :key="item.value"
+                          :label="item.label"
+                          :value="item.value"
+                        >
+                        </el-option>
+                      </el-select>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="开始时间"
+                      :label-width="formLabelWidth"
+                      prop="beginTime"
+                    >
+                      <el-date-picker
+                        style="width:200px"
+                        v-model="onlineExamForm.beginTime"
+                        type="datetime"
+                        placeholder="选择考试开始时间"
+                        @change="getBeginTime"
+                      >
+                      </el-date-picker>
+                    </el-form-item>
+                    <el-form-item
+                      label="结束时间"
+                      :label-width="formLabelWidth"
+                      prop="endTime"
+                    >
+                      <el-date-picker
+                        style="width:200px"
+                        v-model="onlineExamForm.endTime"
+                        type="datetime"
+                        placeholder="选择考试结束时间"
+                        @change="getEndTime"
+                      >
+                      </el-date-picker>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="是否开启"
+                      :label-width="formLabelWidth"
+                    >
+                      <el-radio-group v-model="onlineExamForm.enable">
+                        <el-radio label="true">开启</el-radio>
+                        <el-radio label="false">关闭</el-radio>
+                      </el-radio-group>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+              </el-tab-pane>
+            </el-tabs>
+            <el-tabs v-model="tabs">
+              <el-tab-pane label="控制设置" name="first">
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="考试时长"
+                      :label-width="formLabelWidth"
+                      prop="duration"
+                    >
+                      <el-input
+                        v-model.number="onlineExamForm.duration"
+                        auto-complete="off"
+                      ></el-input>
+                    </el-form-item>
+                    <el-form-item label="分钟"></el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="考试次数"
+                      :label-width="formLabelWidth"
+                      prop="examTimes"
+                    >
+                      <el-input
+                        v-model.number="onlineExamForm.examTimes"
+                        auto-complete="off"
+                      ></el-input>
+                    </el-form-item>
+                    <el-form-item label="次"></el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="交卷冻结时间"
+                      :label-width="formLabelWidth"
+                      prop="freezeTime"
+                    >
+                      <el-input
+                        v-model.number="onlineExamForm.properties.FREEZE_TIME"
+                        auto-complete="off"
+                      ></el-input>
+                    </el-form-item>
+                    <el-form-item label="分钟"></el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="断点续考时间"
+                      :label-width="formLabelWidth"
+                      prop="examReconnectTime"
+                    >
+                      <el-input
+                        v-model.number="
+                          onlineExamForm.properties.EXAM_RECONNECT_TIME
+                        "
+                        auto-complete="off"
+                      ></el-input>
+                    </el-form-item>
+                    <el-form-item label="分钟"></el-form-item>
+                  </el-col>
+                </el-row>
+              </el-tab-pane>
+            </el-tabs>
+            <el-tabs v-model="tabs">
+              <el-tab-pane label="显示设置" name="first">
+                <el-row :gutter="10" v-if="show_ckeditor">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="考前说明"
+                      :label-width="formLabelWidth"
+                    >
+                      <ckeditor
+                        v-model="onlineExamForm.properties.BEFORE_EXAM_REMARK"
+                        :height="'100px'"
+                      ></ckeditor>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10" v-if="show_ckeditor">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="考后说明"
+                      :label-width="formLabelWidth"
+                    >
+                      <ckeditor
+                        v-model="onlineExamForm.properties.AFTER_EXAM_REMARK"
+                        :height="'100px'"
+                      ></ckeditor>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="展示作弊说明"
+                      :label-width="formLabelWidth"
+                    >
+                      <el-radio-group
+                        v-model="onlineExamForm.properties.SHOW_CHEATING_REMARK"
+                      >
+                        <el-radio label="true">开启</el-radio>
+                        <el-radio label="false">关闭</el-radio>
+                      </el-radio-group>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10" v-if="show_ckeditor">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="作弊说明"
+                      :label-width="formLabelWidth"
+                    >
+                      <ckeditor
+                        v-model="onlineExamForm.properties.CHEATING_REMARK"
+                        :height="'100px'"
+                      ></ckeditor>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="单选题补充说明"
+                      :label-width="formLabelWidth"
+                    >
+                      <el-input
+                        :disabled="!onlineExamForm.properties.SINGLE_EDIT"
+                        v-model="onlineExamForm.properties.SINGLE_ANSWER_REMARK"
+                        auto-complete="off"
+                      ></el-input>
+                    </el-form-item>
+                    <el-form-item label="" :label-width="formLabelWidth">
+                      <el-switch
+                        v-model="onlineExamForm.properties.SINGLE_EDIT"
+                        on-text="启用"
+                        off-text="禁用"
+                      ></el-switch>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="多选题补充说明"
+                      :label-width="formLabelWidth"
+                    >
+                      <el-input
+                        :disabled="!onlineExamForm.properties.MUTIPLE_EDIT"
+                        v-model="
+                          onlineExamForm.properties.MUTIPLE_ANSWER_REMARK
+                        "
+                        auto-complete="off"
+                      ></el-input>
+                    </el-form-item>
+                    <el-form-item label="" :label-width="formLabelWidth">
+                      <el-switch
+                        v-model="onlineExamForm.properties.MUTIPLE_EDIT"
+                        on-text="启用"
+                        off-text="禁用"
+                      ></el-switch>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="判断题补充说明"
+                      :label-width="formLabelWidth"
+                    >
+                      <el-input
+                        :disabled="!onlineExamForm.properties.BOOL_EDIT"
+                        v-model="onlineExamForm.properties.BOOL_ANSWER_REMARK"
+                        auto-complete="off"
+                      ></el-input>
+                    </el-form-item>
+                    <el-form-item label="" :label-width="formLabelWidth">
+                      <el-switch
+                        v-model="onlineExamForm.properties.BOOL_EDIT"
+                        on-text="启用"
+                        off-text="禁用"
+                      ></el-switch>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="填空题补充说明"
+                      :label-width="formLabelWidth"
+                    >
+                      <el-input
+                        :disabled="!onlineExamForm.properties.FILL_BLANK_EDIT"
+                        v-model="onlineExamForm.properties.FILL_BLANK_REMARK"
+                        auto-complete="off"
+                      ></el-input>
+                    </el-form-item>
+                    <el-form-item label="" :label-width="formLabelWidth">
+                      <el-switch
+                        v-model="onlineExamForm.properties.FILL_BLANK_EDIT"
+                        on-text="启用"
+                        off-text="禁用"
+                      ></el-switch>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="客观题成绩显示"
+                      :label-width="formLabelWidth"
+                    >
+                      <el-radio-group
+                        v-model="onlineExamForm.properties.IS_OBJ_SCORE_VIEW"
+                      >
+                        <el-radio label="true">开启</el-radio>
+                        <el-radio label="false">关闭</el-radio>
+                      </el-radio-group>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+              </el-tab-pane>
+            </el-tabs>
+            <el-tabs v-model="tabs">
+              <el-tab-pane label="人脸识别设置" name="first">
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="是否开启"
+                      :label-width="formLabelWidth"
+                    >
+                      <el-radio-group
+                        v-model="onlineExamForm.properties.IS_FACE_ENABLE"
+                        @change="faceChange"
+                      >
+                        <el-radio label="true">开启</el-radio>
+                        <el-radio label="false">关闭</el-radio>
+                      </el-radio-group>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row
+                  :gutter="10"
+                  v-show="onlineExamForm.properties.IS_FACE_ENABLE == 'true'"
+                >
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="考试强制使用"
+                      :label-width="formLabelWidth"
+                    >
+                      <el-radio-group
+                        v-model="onlineExamForm.properties.IS_FACE_CHECK"
+                      >
+                        <el-radio label="true">强制</el-radio>
+                        <el-radio label="false">非强制</el-radio>
+                      </el-radio-group>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row
+                  :gutter="10"
+                  v-show="onlineExamForm.properties.IS_FACE_ENABLE == 'true'"
+                >
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="抓拍间隔"
+                      :label-width="formLabelWidth"
+                      prop="snapshotInterval"
+                    >
+                      <el-input
+                        v-model.number="
+                          onlineExamForm.properties.SNAPSHOT_INTERVAL
+                        "
+                        auto-complete="off"
+                      ></el-input>
+                    </el-form-item>
+                    <el-form-item label="分钟"></el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row
+                  :gutter="10"
+                  v-show="onlineExamForm.properties.IS_FACE_ENABLE == 'true'"
+                >
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="预警阀值"
+                      :label-width="formLabelWidth"
+                      prop="warnThreshold"
+                    >
+                      <el-input
+                        v-model.number="
+                          onlineExamForm.properties.WARN_THRESHOLD
+                        "
+                        auto-complete="off"
+                      ></el-input>
+                    </el-form-item>
+                    <el-form-item label="%"></el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row
+                  :gutter="10"
+                  v-show="onlineExamForm.properties.IS_FACE_ENABLE == 'true'"
+                >
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="真实性预警阀值"
+                      :label-width="formLabelWidth"
+                      prop="livingWarnThreshold"
+                    >
+                      <el-input
+                        v-model.number="
+                          onlineExamForm.properties.LIVING_WARN_THRESHOLD
+                        "
+                        auto-complete="off"
+                      ></el-input>
+                    </el-form-item>
+                    <el-form-item label="%"></el-form-item>
+                  </el-col>
+                </el-row>
+              </el-tab-pane>
+            </el-tabs>
+            <el-tabs v-model="tabs">
+              <el-tab-pane label="阅卷设置" name="first">
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="阅卷方式"
+                      :label-width="formLabelWidth"
+                    >
+                      <el-radio-group
+                        :disabled="onlineExamForm.started"
+                        v-model="onlineExamForm.properties.MARKING_TYPE"
+                      >
+                        <el-radio label="ALL">全部评阅</el-radio>
+                        <el-radio label="OBJECT_SCORE_MAX">客观分最高</el-radio>
+                        <el-radio label="LAST_SUBMIT">最后一次提交</el-radio>
+                      </el-radio-group>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+              </el-tab-pane>
+            </el-tabs>
+            <el-tabs v-model="tabs">
+              <el-tab-pane label="网络设置" name="first">
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item label="IP限制" :label-width="formLabelWidth">
+                      <el-radio-group
+                        v-model="onlineExamForm.properties.IP_LIMIT"
+                      >
+                        <el-radio label="true">开启</el-radio>
+                        <el-radio label="false">关闭</el-radio>
+                      </el-radio-group>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="IP段( *表示任意 )"
+                      :label-width="formLabelWidth"
+                    >
+                      <el-input
+                        style="width:200px"
+                        :maxlength="500"
+                        type="textarea"
+                        autosize
+                        v-model="onlineExamForm.properties.IP_ADDRESSES"
+                      ></el-input>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+              </el-tab-pane>
+            </el-tabs>
+          </el-form>
+        </div>
+      </div>
+    </section>
+  </div>
+</template>
+
+<script>
+import { exam_work_api, EXAM_TYPE } from "../store/global";
+import ckeditor from "../components/ckeditor.vue";
+
+let _this = null;
+
+export default {
+  components: { ckeditor },
+  data() {
+    var validateBeginTime = (rule, value, callback) => {
+      if (!_this.onlineExamForm.beginTime) {
+        callback(new Error("请选择考试开始日期"));
+      } else {
+        callback();
+      }
+    };
+    var validateEndTime = (rule, value, callback) => {
+      if (!_this.onlineExamForm.endTime) {
+        callback(new Error("请选择考试结束日期"));
+      } else if (
+        _this.onlineExamForm.beginTime > _this.onlineExamForm.endTime
+      ) {
+        callback(new Error("开始日期不能大于结束日期"));
+      } else {
+        callback();
+      }
+    };
+    var validateName = (rule, value, callback) => {
+      if (_this.onlineExamForm.name == "") {
+        callback(new Error("请输入考试名称"));
+      } else if (
+        !_this.onlineExamForm.name.match(/^[\u4E00-\u9FA5A-Za-z0-9_]+$/)
+      ) {
+        callback(new Error("只能为英文、汉字、数字"));
+      } else if (_this.onlineExamForm.name.length > 50) {
+        callback(new Error("最大长度为50"));
+      } else {
+        callback();
+      }
+    };
+    var validateDuration = (rule, value, callback) => {
+      var duration = _this.onlineExamForm.duration;
+      if (duration == "") {
+        callback(new Error("请输入考试时长"));
+      } else if (!duration.match(/^[1-9]\d*|0$/)) {
+        callback(new Error("只能是非负整数"));
+      } else {
+        callback();
+      }
+    };
+    var validateFreezeTime = (rule, value, callback) => {
+      var freezeTime = _this.onlineExamForm.properties.FREEZE_TIME;
+      var duration = _this.onlineExamForm.duration;
+      if (freezeTime == "") {
+        callback(new Error("请输入交卷冻结时长"));
+      } else if (!freezeTime.match(/^[1-9]\d*|0$/)) {
+        callback(new Error("只能是非负整数"));
+      } else if (parseInt(freezeTime) > parseInt(duration)) {
+        callback(new Error("交卷冻结时长不能大于考试时长"));
+      } else {
+        callback();
+      }
+    };
+    var validateSnapshot = (rule, value, callback) => {
+      var isFaceEnable = _this.onlineExamForm.properties.IS_FACE_ENABLE;
+      var snapshotnterval = _this.onlineExamForm.properties.SNAPSHOT_INTERVAL;
+      var duration = _this.onlineExamForm.duration;
+      if (isFaceEnable == "true") {
+        if (snapshotnterval == "") {
+          callback(new Error("请输入抓拍间隔"));
+        } else if (!snapshotnterval.match(/^[1-9]\d*$/)) {
+          callback(new Error("只能是正整数"));
+        } else if (parseInt(snapshotnterval) > parseInt(duration)) {
+          callback(new Error("抓拍间隔不能大于考试时长"));
+        } else {
+          callback();
+        }
+      } else {
+        callback();
+      }
+    };
+    var validateWarnThreshold = (rule, value, callback) => {
+      var isFaceEnable = _this.onlineExamForm.properties.IS_FACE_ENABLE;
+      var warnThreshold = _this.onlineExamForm.properties.WARN_THRESHOLD;
+      if (isFaceEnable == "true") {
+        if (warnThreshold == "") {
+          callback(new Error("请输入预警阀值"));
+        } else if (!warnThreshold.match(/^[1-9]\d*$/)) {
+          callback(new Error("只能是正整数"));
+        } else {
+          callback();
+        }
+      } else {
+        callback();
+      }
+    };
+    var validateLivingWarnThreshold = (rule, value, callback) => {
+      var isFaceEnable = _this.onlineExamForm.properties.IS_FACE_ENABLE;
+      var livingWarnThreshold =
+        _this.onlineExamForm.properties.LIVING_WARN_THRESHOLD;
+      if (isFaceEnable == "true") {
+        if (livingWarnThreshold == "") {
+          callback(new Error("请输入真实性预警阀值"));
+        } else if (!livingWarnThreshold.match(/^[1-9]\d*$/)) {
+          callback(new Error("只能是正整数"));
+        } else {
+          callback();
+        }
+      } else {
+        callback();
+      }
+    };
+    var validateExamTimes = (rule, value, callback) => {
+      var examTimes = _this.onlineExamForm.examTimes;
+      if (examTimes == "") {
+        callback(new Error("请输入考试次数"));
+      } else if (!examTimes.match(/^[1-9]\d*$/)) {
+        callback(new Error("只能是正整数"));
+      } else {
+        callback();
+      }
+    };
+    var validateExamReconnectTime = (rule, value, callback) => {
+      var examReconnectTime =
+        _this.onlineExamForm.properties.EXAM_RECONNECT_TIME;
+      if (examReconnectTime == "") {
+        callback(new Error("请输入断点续考时间"));
+      } else if (!examReconnectTime.match(/^[1-9]\d*$/)) {
+        callback(new Error("只能是正整数"));
+      } else {
+        callback();
+      }
+    };
+
+    return {
+      tabs: "first",
+      show_ckeditor: false,
+      onlineExamForm: {
+        started: false,
+        name: "",
+        examType: "ONLINE",
+        examTimes: 1,
+        beginTime: null,
+        endTime: null,
+        duration: 120,
+        enable: "true",
+        properties: {
+          IS_OBJ_SCORE_VIEW: "true",
+          EXAM_RECONNECT_TIME: 30,
+          FREEZE_TIME: 0,
+          BEFORE_EXAM_REMARK: "",
+          AFTER_EXAM_REMARK: "",
+          SHOW_CHEATING_REMARK: "true",
+          CHEATING_REMARK: "",
+          SINGLE_EDIT: "false",
+          MUTIPLE_EDIT: "false",
+          BOOL_EDIT: "false",
+          FILL_BLANK_EDIT: "false",
+          SINGLE_ANSWER_REMARK: "",
+          MUTIPLE_ANSWER_REMARK: "",
+          FILL_BLANK_REMARK: "",
+          BOOL_ANSWER_REMARK: "",
+          IS_FACE_ENABLE: "false",
+          IS_FACE_CHECK: "false",
+          SNAPSHOT_INTERVAL: 30,
+          WARN_THRESHOLD: 50,
+          MARKING_TYPE: "ALL",
+          IP_LIMIT: "false",
+          IP_ADDRESSES: null,
+          LIVING_WARN_THRESHOLD: 50
+        }
+      },
+      examTypeList: EXAM_TYPE,
+      formLabelWidth: "120px",
+      examId: "",
+      rules: {
+        name: [{ required: true, validator: validateName, trigger: "blur" }],
+        examType: [
+          { required: true, message: "请选择考试类型", trigger: "change" }
+        ],
+        beginTime: [
+          { required: true, validator: validateBeginTime, trigger: "change" }
+        ],
+        endTime: [
+          { required: true, validator: validateEndTime, trigger: "change" }
+        ],
+        duration: [
+          { required: true, validator: validateDuration, trigger: "blur" }
+        ],
+        freezeTime: [
+          { required: true, validator: validateFreezeTime, trigger: "blur" }
+        ],
+        examTimes: [
+          { required: true, validator: validateExamTimes, trigger: "blur" }
+        ],
+        examReconnectTime: [
+          {
+            required: true,
+            validator: validateExamReconnectTime,
+            trigger: "blur"
+          }
+        ],
+        snapshotInterval: [
+          { required: true, validator: validateSnapshot, trigger: "blur" }
+        ],
+        warnThreshold: [
+          { required: true, validator: validateWarnThreshold, trigger: "blur" }
+        ],
+        livingWarnThreshold: [
+          {
+            required: true,
+            validator: validateLivingWarnThreshold,
+            trigger: "blur"
+          }
+        ]
+      }
+    };
+  },
+
+  methods: {
+    getBeginTime(val) {
+      this.onlineExamForm.beginTime = val;
+    },
+    getEndTime(val) {
+      this.onlineExamForm.endTime = val;
+    },
+    faceChange() {
+      if (this.onlineExamForm.properties.IS_FACE_ENABLE == "false") {
+        this.onlineExamForm.properties.SNAPSHOT_INTERVAL = 30;
+        this.onlineExamForm.properties.WARN_THRESHOLD = 50;
+      }
+    },
+    init() {
+      if (this.examId != "add") {
+        var url = exam_work_api + "/exam/" + this.examId;
+        this.$http.get(url).then(
+          response => {
+            var body = response.body;
+            body.properties = this.onlineExamForm.properties;
+            this.onlineExamForm = Object.assign(
+              this.onlineExamForm,
+              response.body
+            );
+            this.onlineExamForm.enable = this.onlineExamForm.enable
+              ? "true"
+              : "false";
+            console.log(
+              "getOnlineExam(); onlineExamForm: ",
+              this.onlineExamForm
+            );
+
+            var url = exam_work_api + "/exam/allProperties/" + this.examId;
+            this.$http.get(url).then(
+              response => {
+                this.onlineExamForm.properties = Object.assign(
+                  this.onlineExamForm.properties,
+                  response.body
+                );
+                this.onlineExamForm.properties.SINGLE_EDIT =
+                  this.onlineExamForm.properties.SINGLE_EDIT == "true"
+                    ? true
+                    : false;
+                this.onlineExamForm.properties.MUTIPLE_EDIT =
+                  this.onlineExamForm.properties.MUTIPLE_EDIT == "true"
+                    ? true
+                    : false;
+                this.onlineExamForm.properties.BOOL_EDIT =
+                  this.onlineExamForm.properties.BOOL_EDIT == "true"
+                    ? true
+                    : false;
+                this.onlineExamForm.properties.FILL_BLANK_EDIT =
+                  this.onlineExamForm.properties.FILL_BLANK_EDIT == "true"
+                    ? true
+                    : false;
+
+                this.show_ckeditor = true;
+              },
+              response => {
+                this.$notify({
+                  type: "error",
+                  message: response.body.desc
+                });
+              }
+            );
+          },
+          response => {
+            this.$notify({
+              type: "error",
+              message: response.body.desc
+            });
+          }
+        );
+      } else {
+        this.show_ckeditor = true;
+      }
+    },
+    saveOnlineExam: function() {
+      var url = exam_work_api + "/exam";
+      console.log(this.onlineExamForm);
+      this.$refs.onlineExamForm.validate(valid => {
+        if (valid) {
+          if (this.examId != "add") {
+            this.$http.put(url, this.onlineExamForm).then(
+              response => {
+                if (200 != response.status) {
+                  this.$notify({
+                    type: "error",
+                    message: response.body.desc
+                  });
+                  return;
+                }
+                this.$notify({
+                  type: "success",
+                  message: "保存成功"
+                });
+              },
+              response => {
+                this.$notify({
+                  type: "error",
+                  message: response.body.desc
+                });
+              }
+            );
+          } else {
+            this.$http.post(url, this.onlineExamForm).then(
+              response => {
+                if (200 != response.status) {
+                  this.$notify({
+                    type: "error",
+                    message: response.body.desc
+                  });
+                  return;
+                }
+                this.$notify({
+                  type: "success",
+                  message: "新增成功"
+                });
+                this.back();
+              },
+              response => {
+                this.$notify({
+                  type: "error",
+                  message: response.body.desc
+                });
+              }
+            );
+          }
+        } else {
+          return false;
+        }
+      });
+    },
+    back() {
+      this.$router.push({ path: "/index/examInfo" });
+    }
+  },
+  created() {
+    _this = this;
+    this.examId = this.$route.params.id;
+    this.init();
+  }
+};
+</script>

+ 512 - 0
src/modules/examwork/view/practiceExam.vue

@@ -0,0 +1,512 @@
+<style>
+.select-margin {
+  margin-left: 20px;
+}
+
+.button-margin {
+  margin-left: 120px;
+}
+
+textarea {
+  width: 200px;
+}
+</style>
+<template>
+  <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"
+            :rules="rules"
+            ref="practiceExamForm"
+            :model="practiceExamForm"
+            label-position="right"
+            label-width="100px"
+          >
+            <div style="text-align:right">
+              <el-button type="primary" @click="saveOnlineExam"
+                >保 存</el-button
+              >
+              <el-button @click="back">返 回</el-button>
+            </div>
+            <el-tabs v-model="tabs">
+              <el-tab-pane label="基础信息" name="first">
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="考试名称"
+                      :label-width="formLabelWidth"
+                      prop="name"
+                    >
+                      <el-input
+                        style="width:200px"
+                        :maxlength="50"
+                        type="textarea"
+                        autosize
+                        v-model="practiceExamForm.name"
+                        auto-complete="off"
+                      ></el-input>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="考试类型"
+                      class="select-margin"
+                      prop="examType"
+                    >
+                      <el-select
+                        style="width:200px"
+                        :disabled="true"
+                        v-model="practiceExamForm.examType"
+                        placeholder="请选择"
+                      >
+                        <el-option
+                          v-for="item in examTypeList"
+                          :key="item.value"
+                          :label="item.label"
+                          :value="item.value"
+                        >
+                        </el-option>
+                      </el-select>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="开始时间"
+                      :label-width="formLabelWidth"
+                      prop="beginTime"
+                    >
+                      <el-date-picker
+                        style="width:200px"
+                        v-model="practiceExamForm.beginTime"
+                        type="datetime"
+                        placeholder="选择考试开始时间"
+                        @change="getBeginTime"
+                      >
+                      </el-date-picker>
+                    </el-form-item>
+                    <el-form-item
+                      label="结束时间"
+                      :label-width="formLabelWidth"
+                      prop="endTime"
+                    >
+                      <el-date-picker
+                        style="width:200px"
+                        v-model="practiceExamForm.endTime"
+                        type="datetime"
+                        placeholder="选择考试结束时间"
+                        @change="getEndTime"
+                      >
+                      </el-date-picker>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="是否开启"
+                      :label-width="formLabelWidth"
+                    >
+                      <el-radio-group v-model="practiceExamForm.enable">
+                        <el-radio label="true">开启</el-radio>
+                        <el-radio label="false">关闭</el-radio>
+                      </el-radio-group>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+              </el-tab-pane>
+            </el-tabs>
+            <el-tabs v-model="tabs">
+              <el-tab-pane label="控制设置" name="first">
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="考试时长"
+                      :label-width="formLabelWidth"
+                      prop="duration"
+                    >
+                      <el-input
+                        v-model.number="practiceExamForm.duration"
+                        auto-complete="off"
+                      ></el-input>
+                    </el-form-item>
+                    <el-form-item label="分钟"></el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="考试次数"
+                      :label-width="formLabelWidth"
+                      prop="examTimes"
+                    >
+                      <el-input
+                        v-model.number="practiceExamForm.examTimes"
+                        auto-complete="off"
+                      ></el-input>
+                    </el-form-item>
+                    <el-form-item label="次"></el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="交卷冻结时间"
+                      :label-width="formLabelWidth"
+                      prop="freezeTime"
+                    >
+                      <el-input
+                        v-model.number="practiceExamForm.properties.FREEZE_TIME"
+                        auto-complete="off"
+                      ></el-input>
+                    </el-form-item>
+                    <el-form-item label="分钟"></el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="断点续考时间"
+                      :label-width="formLabelWidth"
+                      prop="examReconnectTime"
+                    >
+                      <el-input
+                        v-model.number="
+                          practiceExamForm.properties.EXAM_RECONNECT_TIME
+                        "
+                        auto-complete="off"
+                      ></el-input>
+                    </el-form-item>
+                    <el-form-item label="分钟"></el-form-item>
+                  </el-col>
+                </el-row>
+              </el-tab-pane>
+            </el-tabs>
+            <el-tabs v-model="tabs">
+              <el-tab-pane label="显示设置" name="first">
+                <el-row :gutter="10" v-if="show_ckeditor">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="考前说明"
+                      :label-width="formLabelWidth"
+                    >
+                      <ckeditor
+                        v-model="practiceExamForm.properties.BEFORE_EXAM_REMARK"
+                        :height="'100px'"
+                      ></ckeditor>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="客观题成绩显示"
+                      :label-width="formLabelWidth"
+                    >
+                      <el-radio-group
+                        v-model="practiceExamForm.properties.IS_OBJ_SCORE_VIEW"
+                      >
+                        <el-radio label="true">开启</el-radio>
+                        <el-radio label="false">关闭</el-radio>
+                      </el-radio-group>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="练习模式"
+                      :label-width="formLabelWidth"
+                    >
+                      <el-radio-group
+                        v-model="practiceExamForm.properties.PRACTICE_TYPE"
+                      >
+                        <el-radio label="IN_PRACTICE">边答边显示答案</el-radio>
+                        <el-radio label="AFTER_PRACTICE"
+                          >结束统一显示答案</el-radio
+                        >
+                        <el-radio label="NO_ANSWER">不显示答案</el-radio>
+                      </el-radio-group>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+              </el-tab-pane>
+            </el-tabs>
+          </el-form>
+        </div>
+      </div>
+    </section>
+  </div>
+</template>
+
+<script>
+import { exam_work_api, EXAM_TYPE } from "../store/global";
+import ckeditor from "../components/ckeditor.vue";
+
+let _this = null;
+
+export default {
+  components: { ckeditor },
+  data() {
+    var validateBeginTime = (rule, value, callback) => {
+      if (!_this.practiceExamForm.beginTime) {
+        callback(new Error("请选择考试开始日期"));
+      } else {
+        callback();
+      }
+    };
+    var validateEndTime = (rule, value, callback) => {
+      if (!_this.practiceExamForm.endTime) {
+        callback(new Error("请选择考试结束日期"));
+      } else if (
+        _this.practiceExamForm.beginTime > _this.practiceExamForm.endTime
+      ) {
+        callback(new Error("开始日期不能大于结束日期"));
+      } else {
+        callback();
+      }
+    };
+    var validateName = (rule, value, callback) => {
+      if (_this.practiceExamForm.name == "") {
+        callback(new Error("请输入考试名称"));
+      } else if (
+        !_this.practiceExamForm.name.match(/^[\u4E00-\u9FA5A-Za-z0-9_]+$/)
+      ) {
+        callback(new Error("只能为英文、汉字、数字"));
+      } else if (_this.practiceExamForm.name.length > 50) {
+        callback(new Error("最大长度为50"));
+      } else {
+        callback();
+      }
+    };
+    var validateDuration = (rule, value, callback) => {
+      if (_this.practiceExamForm.duration == "") {
+        callback(new Error("请输入考试时长"));
+      } else if (!_this.practiceExamForm.duration.match(/^[1-9]\d*|0$/)) {
+        callback(new Error("只能是非负整数"));
+      } else {
+        callback();
+      }
+    };
+    var validateFreezeTime = (rule, value, callback) => {
+      var freezeTime = _this.practiceExamForm.properties.FREEZE_TIME;
+      var duration = _this.practiceExamForm.duration;
+      if (freezeTime == "") {
+        callback(new Error("请输入交卷冻结时长"));
+      } else if (!freezeTime.match(/^[1-9]\d*|0$/)) {
+        callback(new Error("只能是非负整数"));
+      } else if (parseInt(freezeTime) > parseInt(duration)) {
+        callback(new Error("交卷冻结时长不能大于考试时长"));
+      } else {
+        callback();
+      }
+    };
+    var validateExamTimes = (rule, value, callback) => {
+      if (_this.practiceExamForm.examTimes == "") {
+        callback(new Error("请输入考试次数"));
+      } else if (!_this.practiceExamForm.examTimes.match(/^[1-9]\d*$/)) {
+        callback(new Error("只能是正整数"));
+      } else {
+        callback();
+      }
+    };
+    var validateExamReconnectTime = (rule, value, callback) => {
+      if (_this.practiceExamForm.properties.EXAM_RECONNECT_TIME == "") {
+        callback(new Error("请输入断点续考时间"));
+      } else if (
+        !_this.practiceExamForm.properties.EXAM_RECONNECT_TIME.match(
+          /^[1-9]\d*$/
+        )
+      ) {
+        callback(new Error("只能是正整数"));
+      } else {
+        callback();
+      }
+    };
+
+    return {
+      tabs: "first",
+      show_ckeditor: true,
+      practiceExamForm: {
+        name: "",
+        examType: "PRACTICE",
+        examTimes: 1,
+        beginTime: "",
+        endTime: "",
+        duration: 1,
+        enable: "true",
+        properties: {
+          FREEZE_TIME: 0,
+          EXAM_RECONNECT_TIME: 30,
+          BEFORE_EXAM_REMARK: "",
+          AFTER_EXAM_REMARK: "",
+          IS_OBJ_SCORE_VIEW: "true",
+          PRACTICE_TYPE: "IN_PRACTICE"
+        }
+      },
+      examTypeList: EXAM_TYPE,
+      formLabelWidth: "120px",
+      examId: "",
+      rules: {
+        name: [{ required: true, validator: validateName, trigger: "blur" }],
+        beginTime: [
+          {
+            type: "date",
+            required: true,
+            validator: validateBeginTime,
+            trigger: "change"
+          }
+        ],
+        endTime: [
+          {
+            type: "date",
+            required: true,
+            validator: validateEndTime,
+            trigger: "change"
+          }
+        ],
+        duration: [
+          { required: true, validator: validateDuration, trigger: "blur" }
+        ],
+        freezeTime: [
+          { required: true, validator: validateFreezeTime, trigger: "blur" }
+        ],
+        examTimes: [
+          { required: true, validator: validateExamTimes, trigger: "blur" }
+        ],
+        examReconnectTime: [
+          {
+            required: true,
+            validator: validateExamReconnectTime,
+            trigger: "blur"
+          }
+        ]
+      }
+    };
+  },
+
+  methods: {
+    getBeginTime(val) {
+      this.practiceExamForm.beginTime = val;
+    },
+    getEndTime(val) {
+      this.practiceExamForm.endTime = val;
+    },
+    getPracticeExam() {
+      if (this.examId != "add") {
+        var url = exam_work_api + "/exam/" + this.examId;
+        this.$http.get(url).then(
+          response => {
+            var body = response.body;
+            body.properties = this.practiceExamForm.properties;
+            this.practiceExamForm = Object.assign(
+              this.practiceExamForm,
+              response.body
+            );
+            this.practiceExamForm.enable = this.practiceExamForm.enable
+              ? "true"
+              : "false";
+
+            var url = exam_work_api + "/exam/allProperties/" + this.examId;
+            this.$http.get(url).then(
+              response => {
+                this.practiceExamForm.properties = Object.assign(
+                  this.practiceExamForm.properties,
+                  response.body
+                );
+                this.show_ckeditor = true;
+              },
+              response => {
+                this.$notify({
+                  type: "error",
+                  message: response.body.desc
+                });
+              }
+            );
+          },
+          response => {
+            this.$notify({
+              type: "error",
+              message: response.body.desc
+            });
+          }
+        );
+      }
+    },
+    saveOnlineExam: function() {
+      var url = exam_work_api + "/exam";
+      this.$refs.practiceExamForm.validate(valid => {
+        if (valid) {
+          if (this.examId != "add") {
+            this.$http.put(url, this.practiceExamForm).then(
+              response => {
+                console.log(response);
+                this.$notify({
+                  type: "success",
+                  message: "保存成功"
+                });
+              },
+              response => {
+                this.$notify({
+                  type: "error",
+                  message: response.body.desc
+                });
+              }
+            );
+          } else {
+            this.$http.post(url, this.practiceExamForm).then(
+              response => {
+                console.log(response);
+                this.$notify({
+                  type: "success",
+                  message: "新增成功"
+                });
+                this.back();
+              },
+              response => {
+                this.$notify({
+                  type: "error",
+                  message: response.body.desc
+                });
+              }
+            );
+          }
+        } else {
+          return false;
+        }
+      });
+    },
+    back() {
+      this.$router.push({ path: "/index/examInfo" });
+    }
+  },
+  created() {
+    _this = this;
+    this.examId = this.$route.params.id;
+    this.getPracticeExam();
+  }
+};
+</script>

+ 301 - 0
src/modules/examwork/view/printExam.vue

@@ -0,0 +1,301 @@
+<style>
+.select-margin {
+  margin-left: 20px;
+}
+
+.button-margin {
+  margin-left: 120px;
+}
+</style>
+<template>
+  <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"
+            :rules="rules"
+            ref="printExamForm"
+            :model="printExamForm"
+            label-position="right"
+            label-width="100px"
+          >
+            <div style="text-align:right">
+              <el-button type="primary" @click="savePrintExam">确 定</el-button>
+              <el-button @click="back">返 回</el-button>
+            </div>
+            <el-tabs v-model="tabs">
+              <el-tab-pane label="基础信息" name="first">
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="考试名称"
+                      :label-width="formLabelWidth"
+                      prop="name"
+                    >
+                      <el-input
+                        style="width:200px"
+                        :maxlength="50"
+                        type="textarea"
+                        autosize
+                        v-model="printExamForm.name"
+                        auto-complete="off"
+                      ></el-input>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="考试类型"
+                      class="select-margin"
+                      prop="examType"
+                    >
+                      <el-select
+                        style="width:200px"
+                        :disabled="true"
+                        v-model="printExamForm.examType"
+                        placeholder="请选择"
+                      >
+                        <el-option
+                          v-for="item in examTypeList"
+                          :key="item.value"
+                          :label="item.label"
+                          :value="item.value"
+                        >
+                        </el-option>
+                      </el-select>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="开始时间"
+                      :label-width="formLabelWidth"
+                      prop="beginTime"
+                    >
+                      <el-date-picker
+                        style="width:200px"
+                        v-model.number="printExamForm.beginTime"
+                        type="datetime"
+                        placeholder="选择考试开始时间"
+                        @change="getBeginTime"
+                      >
+                      </el-date-picker>
+                    </el-form-item>
+                    <el-form-item
+                      label="结束时间"
+                      :label-width="formLabelWidth"
+                      prop="endTime"
+                    >
+                      <el-date-picker
+                        style="width:200px"
+                        v-model.number="printExamForm.endTime"
+                        type="datetime"
+                        placeholder="选择考试结束时间"
+                        @change="getEndTime"
+                      >
+                      </el-date-picker>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="是否开启"
+                      :label-width="formLabelWidth"
+                    >
+                      <el-radio-group v-model="printExamForm.enable">
+                        <el-radio label="true">开启</el-radio>
+                        <el-radio label="false">关闭</el-radio>
+                      </el-radio-group>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+              </el-tab-pane>
+            </el-tabs>
+          </el-form>
+        </div>
+      </div>
+    </section>
+  </div>
+</template>
+<script>
+import { exam_work_api, EXAM_TYPE } from "../store/global";
+
+let _this = null;
+
+export default {
+  data() {
+    var validateBeginTime = (rule, value, callback) => {
+      if (!_this.printExamForm.beginTime) {
+        callback(new Error("请选择考试开始日期"));
+      } else {
+        callback();
+      }
+    };
+    var validateEndTime = (rule, value, callback) => {
+      if (!_this.printExamForm.endTime) {
+        callback(new Error("请选择考试结束日期"));
+      } else if (_this.printExamForm.beginTime > _this.printExamForm.endTime) {
+        callback(new Error("开始日期不能大于结束日期"));
+      } else {
+        callback();
+      }
+    };
+    var validateName = (rule, value, callback) => {
+      if (_this.printExamForm.name == "") {
+        callback(new Error("请输入考试名称"));
+      } else if (
+        !_this.printExamForm.name.match(/^[\u4E00-\u9FA5A-Za-z0-9_]+$/)
+      ) {
+        callback(new Error("只能为英文、汉字、数字"));
+      } else if (_this.printExamForm.name.length > 50) {
+        callback(new Error("最大长度为50"));
+      } else {
+        callback();
+      }
+    };
+
+    return {
+      tabs: "first",
+      examType: "分布式印刷考试",
+      printExamForm: {
+        name: null,
+        examType: "PRINT_EXAM",
+        beginTime: null,
+        endTime: null,
+        enable: "true"
+      },
+      examTypeList: EXAM_TYPE,
+      formLabelWidth: "120px",
+      examId: "",
+      rules: {
+        name: [{ required: true, validator: validateName, trigger: "blur" }],
+        beginTime: [
+          {
+            type: "date",
+            required: true,
+            validator: validateBeginTime,
+            trigger: "change"
+          }
+        ],
+        endTime: [
+          {
+            type: "date",
+            required: true,
+            validator: validateEndTime,
+            trigger: "change"
+          }
+        ]
+      }
+    };
+  },
+
+  methods: {
+    getBeginTime(val) {
+      this.printExamForm.beginTime = val;
+    },
+    getEndTime(val) {
+      this.printExamForm.endTime = val;
+    },
+    getPrintExam() {
+      if (this.examId != "add") {
+        var url = exam_work_api + "/exam/" + this.examId;
+        this.$http.get(url).then(response => {
+          console.log(response);
+          this.printExamForm = response.body;
+          this.printExamForm.enable = this.printExamForm.enable
+            ? "true"
+            : "false";
+        });
+      } else {
+        this.printExamForm = {
+          name: "",
+          examType: "PRINT_EXAM",
+          beginTime: "",
+          endTime: "",
+          status: "true",
+          enable: "true"
+        };
+      }
+    },
+    savePrintExam() {
+      var url = exam_work_api + "/exam";
+      this.$refs.printExamForm.validate(valid => {
+        if (valid) {
+          if (this.examId != "add") {
+            this.$http.put(url, this.printExamForm).then(
+              response => {
+                console.log(response);
+                this.$notify({
+                  type: "success",
+                  message: "保存成功"
+                });
+              },
+              response => {
+                if (response.status == 500) {
+                  this.$notify({
+                    showClose: true,
+                    message: response.body.desc,
+                    type: "error"
+                  });
+                }
+              }
+            );
+          } else {
+            this.$http.post(url, this.printExamForm).then(
+              response => {
+                console.log(response);
+                this.$notify({
+                  type: "success",
+                  message: "新增成功"
+                });
+                this.back();
+              },
+              response => {
+                if (response.status == 500) {
+                  this.$notify({
+                    showClose: true,
+                    message: response.body.desc,
+                    type: "error"
+                  });
+                }
+              }
+            );
+          }
+        } else {
+          return false;
+        }
+      });
+    },
+    back() {
+      this.$router.push({ path: "/index/examInfo" });
+    }
+  },
+  created() {
+    _this = this;
+    this.examId = this.$route.params.id;
+    this.getPrintExam();
+  }
+};
+</script>

+ 291 - 0
src/modules/examwork/view/traditionExam.vue

@@ -0,0 +1,291 @@
+<style>
+.select-margin {
+  margin-left: 20px;
+}
+
+.button-margin {
+  margin-left: 120px;
+}
+</style>
+<template>
+  <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"
+            :rules="rules"
+            ref="traditionExamForm"
+            :model="traditionExamForm"
+            label-position="right"
+            label-width="100px"
+          >
+            <div style="text-align:right">
+              <el-button type="primary" @click="saveTraditionExam"
+                >确 定</el-button
+              >
+              <el-button @click="back">返 回</el-button>
+            </div>
+            <el-tabs v-model="tabs">
+              <el-tab-pane label="基础信息" name="first">
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="考试名称"
+                      :label-width="formLabelWidth"
+                      prop="name"
+                    >
+                      <el-input
+                        style="width:200px"
+                        :maxlength="50"
+                        type="textarea"
+                        autosize
+                        v-model="traditionExamForm.name"
+                        auto-complete="off"
+                      ></el-input>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="考试类型"
+                      class="select-margin"
+                      prop="examType"
+                    >
+                      <el-select
+                        style="width:200px"
+                        :disabled="true"
+                        v-model="traditionExamForm.examType"
+                        placeholder="请选择"
+                      >
+                        <el-option
+                          v-for="item in examTypeList"
+                          :key="item.value"
+                          :label="item.label"
+                          :value="item.value"
+                        >
+                        </el-option>
+                      </el-select>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="开始时间"
+                      :label-width="formLabelWidth"
+                      prop="beginTime"
+                    >
+                      <el-date-picker
+                        style="width:200px"
+                        v-model.number="traditionExamForm.beginTime"
+                        type="datetime"
+                        placeholder="选择考试开始时间"
+                        @change="getBeginTime"
+                      >
+                      </el-date-picker>
+                    </el-form-item>
+                    <el-form-item
+                      label="结束时间"
+                      :label-width="formLabelWidth"
+                      prop="endTime"
+                    >
+                      <el-date-picker
+                        style="width:200px"
+                        v-model.number="traditionExamForm.endTime"
+                        type="datetime"
+                        placeholder="选择考试结束时间"
+                        @change="getEndTime"
+                      >
+                      </el-date-picker>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="10">
+                  <el-col :xs="15" :sm="15" :md="15" :lg="15">
+                    <el-form-item
+                      label="是否开启"
+                      :label-width="formLabelWidth"
+                    >
+                      <el-radio-group v-model="traditionExamForm.enable">
+                        <el-radio label="true">开启</el-radio>
+                        <el-radio label="false">关闭</el-radio>
+                      </el-radio-group>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+              </el-tab-pane>
+            </el-tabs>
+          </el-form>
+        </div>
+      </div>
+    </section>
+  </div>
+</template>
+<script>
+import { exam_work_api, EXAM_TYPE } from "../store/global";
+
+let _this = null;
+
+export default {
+  data() {
+    var validateBeginTime = (rule, value, callback) => {
+      if (!_this.traditionExamForm.beginTime) {
+        callback(new Error("请选择考试开始日期"));
+      } else {
+        callback();
+      }
+    };
+    var validateEndTime = (rule, value, callback) => {
+      if (!_this.traditionExamForm.endTime) {
+        callback(new Error("请选择考试结束日期"));
+      } else if (
+        _this.traditionExamForm.beginTime > _this.traditionExamForm.endTime
+      ) {
+        callback(new Error("开始日期不能大于结束日期"));
+      } else {
+        callback();
+      }
+    };
+    var validateName = (rule, value, callback) => {
+      if (_this.traditionExamForm.name == "") {
+        callback(new Error("请输入考试名称"));
+      } else if (
+        !_this.traditionExamForm.name.match(/^[\u4E00-\u9FA5A-Za-z0-9_]+$/)
+      ) {
+        callback(new Error("只能为英文、汉字、数字"));
+      } else if (_this.traditionExamForm.name.length > 50) {
+        callback(new Error("最大长度为50"));
+      } else {
+        callback();
+      }
+    };
+
+    return {
+      tabs: "first",
+      traditionExamForm: {
+        name: null,
+        examType: "TRADITION",
+        beginTime: null,
+        endTime: null,
+        enable: "true"
+      },
+      examTypeList: EXAM_TYPE,
+      formLabelWidth: "120px",
+      examId: "",
+      rules: {
+        name: [{ required: true, validator: validateName, trigger: "blur" }],
+        beginTime: [
+          {
+            type: "date",
+            required: true,
+            validator: validateBeginTime,
+            trigger: "change"
+          }
+        ],
+        endTime: [
+          {
+            type: "date",
+            required: true,
+            validator: validateEndTime,
+            trigger: "change"
+          }
+        ]
+      }
+    };
+  },
+
+  methods: {
+    getBeginTime(val) {
+      this.traditionExamForm.beginTime = val;
+    },
+    getEndTime(val) {
+      this.traditionExamForm.endTime = val;
+    },
+    getTraditionExam() {
+      if (this.examId != "add") {
+        var url = exam_work_api + "/exam/" + this.examId;
+        this.$http.get(url).then(response => {
+          this.traditionExamForm = Object.assign(
+            this.traditionExamForm,
+            response.body
+          );
+          this.traditionExamForm.enable = this.traditionExamForm.enable
+            ? "true"
+            : "false";
+        });
+      }
+    },
+    saveTraditionExam() {
+      var url = exam_work_api + "/exam";
+      this.$refs.traditionExamForm.validate(valid => {
+        if (valid) {
+          if (this.examId != "add") {
+            this.$http.put(url, this.traditionExamForm).then(
+              response => {
+                console.log(response);
+                this.$notify({
+                  type: "success",
+                  message: "保存成功"
+                });
+              },
+              response => {
+                this.$notify({
+                  type: "error",
+                  message: response.body.desc
+                });
+              }
+            );
+          } else {
+            this.$http.post(url, this.traditionExamForm).then(
+              response => {
+                console.log(response);
+                this.$notify({
+                  type: "success",
+                  message: "新增成功"
+                });
+                this.back();
+              },
+              response => {
+                this.$notify({
+                  type: "error",
+                  message: response.body.desc
+                });
+              }
+            );
+          }
+        } else {
+          return false;
+        }
+      });
+    },
+    back() {
+      this.$router.push({ path: "/index/examInfo" });
+    }
+  },
+  created() {
+    _this = this;
+    this.examId = this.$route.params.id;
+    this.getTraditionExam();
+  }
+};
+</script>