zhangjie 2 vuotta sitten
vanhempi
commit
4c9ae269ae

+ 69 - 0
src/assets/styles/pages.scss

@@ -1086,3 +1086,72 @@
     border-bottom-left-radius: 0;
   }
 }
+
+// assignment-calculate
+.assignment-calculate-detail {
+  .ass-part {
+    margin-bottom: 20px;
+  }
+  .ass-summary {
+    &-tag {
+      padding: 15px 30px 15px 50px;
+      border-radius: 5px;
+      border: 1px solid $--color-border;
+      min-width: 160px;
+
+      &:first-child {
+        background-color: $--color-cyan;
+        color: #fff;
+      }
+      > h6 {
+        font-weight: normal;
+        margin-bottom: 8px;
+        font-size: 14px;
+      }
+      > p {
+        font-size: 20px;
+        margin: 0;
+      }
+    }
+
+    &-noun {
+      margin-bottom: 8px;
+      overflow: hidden;
+    }
+    .noun-label {
+      width: 100px;
+      text-align: right;
+      float: left;
+    }
+    .noun-content {
+      margin-left: 100px;
+    }
+  }
+}
+.assign-config {
+  position: relative;
+  &.is-disabled {
+    &::before {
+      content: "";
+      display: block;
+      position: absolute;
+      width: 100%;
+      height: 100%;
+      top: 0;
+      left: 0;
+      z-index: 9;
+      background-color: rgba(255, 255, 255, 0.1);
+    }
+  }
+
+  .rate-detail {
+    > div {
+      display: inline-block;
+      vertical-align: middle;
+    }
+    &-label {
+      width: 120px;
+      line-height: 1.2;
+    }
+  }
+}

+ 14 - 0
src/constants/menus-data.js

@@ -48,6 +48,13 @@ export default [
     type: "MENU",
     url: "UserManage",
   },
+  {
+    id: "10204",
+    parentId: "102",
+    name: "系统参数设置",
+    type: "MENU",
+    url: "SystemSetting",
+  },
   {
     id: "103",
     parentId: "1",
@@ -83,6 +90,13 @@ export default [
     type: "MENU",
     url: "CourseLinkManage",
   },
+  {
+    id: "10305",
+    parentId: "103",
+    name: "赋分试算",
+    type: "MENU",
+    url: "AssignmentCalculate",
+  },
   {
     id: "104",
     parentId: "1",

+ 3 - 0
src/constants/privilege.js

@@ -13,6 +13,8 @@ export const rolePrivilege = {
     "EcsDataManage",
     "DataReturnManage",
     "CourseLinkManage",
+    "SystemSetting",
+    "AssignmentCalculate",
   ],
   IMPLEMENT: [
     "data",
@@ -25,6 +27,7 @@ export const rolePrivilege = {
     "DataReturnManage",
     "CourseLinkManage",
   ],
+  SS: ["data", "score", "AssignmentCalculate", "AssignmentCalculateDetail"],
 };
 
 export const adminPrivilege = ["data", "super", "AuthSet"];

+ 17 - 0
src/mixins/timeMixin.js

@@ -0,0 +1,17 @@
+export default {
+  data() {
+    return {
+      setTs: [],
+    };
+  },
+  methods: {
+    addSetTime(action, time = 1 * 1000) {
+      this.setTs.push(setTimeout(action, time));
+    },
+    clearSetTs() {
+      if (!this.setTs.length) return;
+      this.setTs.forEach((t) => clearTimeout(t));
+      this.setTs = [];
+    },
+  },
+};

+ 19 - 3
src/modules/base/api.js

@@ -129,13 +129,29 @@ export const getCode = (type) => {
   return $postParam("/api/admin/common/get_code", { type });
 };
 
+// system-setting
+export const systemSettingQuery = () => {
+  return $postParam("/api/sys_setting/get", {});
+};
+export const updateSystemSetting = (datas) => {
+  return $post("/api/sys_setting/save", datas);
+};
+export const flushCache = (type) => {
+  return $postParam("/api/admin/common/flush_cache", { type });
+};
 // assignment-calculate
 export const assignmentDataList = (datas) => {
-  return $postParam("/api/exam_course_mapping/page", datas);
+  return $postParam("/api/assign/page", datas);
+};
+export const assignmentDetailInfo = (datas) => {
+  return $postParam("/api/assign/to_calc", datas);
+};
+export const assignmentCalculate = (datas) => {
+  return $postParam("/api/assign/calc", datas);
 };
-export const assignmentResult = (datas) => {
+export const assignmentCalcResult = (datas) => {
   return $postParam("/api/exam_course_mapping/page", datas);
 };
-export const courseExamInfo = (datas) => {
+export const assignmentCompareResult = (datas) => {
   return $postParam("/api/exam_course_mapping/page", datas);
 };

+ 84 - 0
src/modules/base/components/assignment/AssignCompare.vue

@@ -0,0 +1,84 @@
+<template>
+  <div class="assign-compare">
+    <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
+      <el-form-item label="卷面总分:">
+        <el-input-number
+          v-model.number="filter.scope"
+          :min="0"
+          :max="99999"
+          :step="1"
+          step-strictly
+          :controls="false"
+          style="width: 130px"
+        ></el-input-number>
+      </el-form-item>
+      <el-form-item label="及格分:">
+        <el-input-number
+          v-model.number="filter.scope"
+          :min="0"
+          :max="99999"
+          :step="0.1"
+          step-strictly
+          :controls="false"
+          style="width: 130px"
+        ></el-input-number>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" @click="search">查询</el-button>
+      </el-form-item>
+    </el-form>
+
+    <table class="table">
+      <tr>
+        <th rowspan="2">对比项</th>
+        <th colspan="3">总体有效人数:45人</th>
+      </tr>
+      <tr>
+        <th>平均分</th>
+        <th>不及格率</th>
+        <th>不及格人数</th>
+      </tr>
+      <tr>
+        <td>赋分前</td>
+        <td></td>
+        <td></td>
+        <td></td>
+      </tr>
+      <tr>
+        <td>赋分后</td>
+        <td></td>
+        <td></td>
+        <td></td>
+      </tr>
+    </table>
+  </div>
+</template>
+
+<script>
+import { assignmentCompareResult } from "../../api";
+
+export default {
+  name: "assign-compare",
+  data() {
+    return {
+      filter: {
+        semesterId: "",
+        examTypeId: "",
+        collegeId: "",
+        examId: "",
+      },
+      dataList: [],
+    };
+  },
+  methods: {
+    async search() {
+      const datas = {
+        ...this.filter,
+      };
+
+      const data = await assignmentCompareResult(datas);
+      this.dataList = data || [];
+    },
+  },
+};
+</script>

+ 229 - 0
src/modules/base/components/assignment/AssignConfig.vue

@@ -0,0 +1,229 @@
+<template>
+  <div :class="['assign-config', { 'is-disabled': loading }]">
+    <el-form
+      ref="modalFormComp"
+      :model="modalForm"
+      :rules="rules"
+      label-width="100px"
+    >
+      <el-form-item label="赋分公式:" prop="formula">
+        <el-select
+          v-model="modalForm.formula"
+          placeholder="请选择"
+          @change="formulaChange"
+        >
+          <el-option
+            v-for="(val, key) in formulas"
+            :key="key"
+            :label="val"
+            :value="key"
+          ></el-option>
+        </el-select>
+        <div v-if="modalForm.formula">
+          <div v-if="modalForm.formula === 'FORMULA1'">
+            <p>赋值分=卷面成绩+ (100- 卷面成绩)/赋分系数</p>
+          </div>
+          <div v-if="modalForm.formula === 'FORMULA2'">
+            <p>
+              赋值分=ROUND(IF(初始卷面>=参数,55+(初始卷面-参数)/(初始卷面最高分-参数)*(x-55),初始卷面*50/参数)*2,0)/2
+            </p>
+            <div>
+              <span style="float: left">说明:</span>
+              <div>
+                <p>1.如果初始卷面最高的大于99时,则x=100,否则x=99;</p>
+                <p>2.参数根据每次总体初始成绩的不及格率进行调整。</p>
+              </div>
+            </div>
+          </div>
+        </div>
+      </el-form-item>
+      <el-form-item
+        v-if="modalForm.formula === 'FORMULA1'"
+        label="赋分系数:"
+        prop="detail"
+      >
+        <el-radio-group v-model="modalForm.all">
+          <el-radio :label="true">统一设置</el-radio>
+          <el-radio :label="false">按考查学院设置</el-radio>
+        </el-radio-group>
+        <br />
+        <el-input-number
+          v-if="modalForm.all"
+          v-model.number="modalForm.value"
+          :min="0"
+          :controls="false"
+          placeholder="请填写赋分系数"
+          @change="allRateChange"
+        ></el-input-number>
+        <div v-else class="rate-details">
+          <div
+            class="rate-detail"
+            v-for="item in modalForm.detail"
+            :key="item.college"
+          >
+            <div class="rate-detail-label">{{ item.college }}</div>
+            <div class="rate-detail-content">
+              <el-input-number
+                v-model.number="item.value"
+                :min="0"
+                :controls="false"
+                placeholder="请填写赋分系数"
+              ></el-input-number>
+            </div>
+          </div>
+        </div>
+      </el-form-item>
+      <el-form-item
+        v-if="modalForm.formula === 'FORMULA2'"
+        label="参数:"
+        prop="detail"
+      >
+        <el-input-number
+          v-model.number="modalForm.value"
+          :min="0"
+          :controls="false"
+          placeholder="请填写参数"
+          @change="allRateChange"
+        ></el-input-number>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" :loading="loading" @click="toCalc">{{
+          loading ? "正在计算中" : "开始试算"
+        }}</el-button>
+      </el-form-item>
+    </el-form>
+  </div>
+</template>
+
+<script>
+import timeMixin from "@/mixins/timeMixin";
+import { assignmentDetailInfo, assignmentCalculate } from "../../api";
+
+export default {
+  name: "assign-config",
+  mixins: [timeMixin],
+  props: {
+    detailInfo: {
+      type: Object,
+      default() {
+        return {};
+      },
+    },
+    assignInfo: {
+      type: Object,
+      default() {
+        return {};
+      },
+    },
+  },
+  data() {
+    return {
+      modalForm: {
+        formula: "",
+        all: true,
+        value: undefined,
+        detail: [],
+      },
+      formulas: {
+        FORMULA1: "公式1",
+        FORMULA2: "公式2",
+      },
+      rules: {
+        formula: [
+          {
+            required: true,
+            message: "请选择赋分公式",
+            trigger: "change",
+          },
+        ],
+        detail: [
+          {
+            validator: (rule, value, callback) => {
+              if (value.some((item) => !item.value)) {
+                return callback(new Error(`完成参数设置`));
+              }
+
+              callback();
+            },
+            trigger: "change",
+          },
+        ],
+      },
+      loading: false,
+      statusPeriod: 5000,
+    };
+  },
+  mounted() {
+    this.modalForm.formula = this.detailInfo.formula;
+    this.modalForm.all = this.detailInfo.coefficient.all;
+    this.modalForm.value = this.detailInfo.coefficient.value;
+    this.modalForm.detail = this.detailInfo.coefficient.detail || [];
+    if (!this.modalForm.detail.length) {
+      this.modalForm.detail = this.detailInfo.inspectCollege.map((item) => {
+        return {
+          college: item,
+          value: undefined,
+        };
+      });
+    }
+    this.loading = this.detailInfo.status === "RUNNING";
+    if (!this.loading) return;
+    this.addSetTime(() => {
+      this.getData();
+    }, this.statusPeriod);
+  },
+  beforeDestroy() {
+    this.clearSetTs();
+  },
+  methods: {
+    async getData() {
+      this.clearSetTs();
+      const res = await assignmentDetailInfo(this.assignInfo);
+      this.loading = res.status === "RUNNING";
+
+      if (!this.loading) {
+        this.$message.success("计算完成!");
+        return;
+      }
+
+      this.addSetTime(() => {
+        this.getData();
+      }, this.statusPeriod);
+    },
+    formulaChange(val) {
+      if (val === "FORMULA2") {
+        this.modalForm.all = true;
+      }
+      this.modalForm.value = undefined;
+      this.allRateChange(this.modalForm.value);
+    },
+    allRateChange(val) {
+      this.modalForm.detail.forEach((item) => {
+        item.value = val;
+      });
+    },
+    async toCalc() {
+      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
+      if (!valid) return;
+
+      if (this.loading) return;
+      this.loading = true;
+
+      const datas = {
+        ...this.assignInfo,
+        formula: this.modalForm.formula,
+        coefficient: this.modalForm,
+      };
+      const data = await assignmentCalculate(datas).catch(() => {});
+      if (!data) {
+        this.loading = false;
+        return;
+      }
+      this.$message.success("提交成功,正在计算中……");
+      this.addSetTime(() => {
+        this.getData();
+      }, this.statusPeriod);
+    },
+  },
+};
+</script>

+ 90 - 0
src/modules/base/components/assignment/AssignResult.vue

@@ -0,0 +1,90 @@
+<template>
+  <div class="assign-result">
+    <el-form ref="FilterForm" label-position="left" label-width="85px" inline>
+      <el-form-item label="考查学院:"> </el-form-item>
+      <el-form-item label="班级:"> </el-form-item>
+      <el-form-item label="任课老师:"> </el-form-item>
+      <el-form-item>
+        <el-button type="primary" @click="toPage(1)">查询</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-table ref="TableList" :data="dataList">
+      <el-table-column prop="courseCode" label="课程代码"></el-table-column>
+      <el-table-column prop="courseName" label="课程名称"></el-table-column>
+      <el-table-column prop="stdno" label="学号"></el-table-column>
+      <el-table-column prop="stdName" label="姓名"></el-table-column>
+      <el-table-column
+        prop="examId"
+        label="客观总分"
+        width="90"
+      ></el-table-column>
+      <el-table-column
+        prop="examId"
+        label="主观总分"
+        width="90"
+      ></el-table-column>
+      <el-table-column prop="examId" label="总分" width="80"></el-table-column>
+      <el-table-column prop="xnm" label="评分明细"></el-table-column>
+      <el-table-column prop="xqm" label="班级"></el-table-column>
+      <el-table-column prop="xqm" label="学院"></el-table-column>
+      <el-table-column prop="xqm" label="任课老师"></el-table-column>
+      <el-table-column
+        prop="xqm"
+        label="赋分后总分"
+        width="100"
+      ></el-table-column>
+    </el-table>
+    <div class="part-page">
+      <el-pagination
+        background
+        layout="total,prev, pager, next"
+        :current-page="current"
+        :total="total"
+        :page-size="size"
+        :page-sizes="[20, 50, 100]"
+        @current-change="toPage"
+      >
+      </el-pagination>
+    </div>
+  </div>
+</template>
+
+<script>
+import { assignmentCalcResult } from "../../api";
+
+export default {
+  name: "assign-result",
+  data() {
+    return {
+      filter: {
+        semesterId: "",
+        examTypeId: "",
+        collegeId: "",
+        examId: "",
+      },
+      current: 1,
+      size: this.GLOBAL.pageSize,
+      total: 0,
+      dataList: [],
+    };
+  },
+  methods: {
+    async getList() {
+      const datas = {
+        ...this.filter,
+        pageNumber: this.current,
+        pageSize: this.size,
+      };
+
+      const data = await assignmentCalcResult(datas);
+      this.dataList = data.records;
+      this.total = data.total;
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+    },
+  },
+};
+</script>

+ 19 - 0
src/modules/base/router.js

@@ -9,6 +9,10 @@ import EcsDataManage from "./views/EcsDataManage.vue";
 import DataReturnManage from "./views/DataReturnManage.vue";
 import CourseLinkManage from "./views/CourseLinkManage.vue";
 
+import SystemSetting from "./views/SystemSetting.vue";
+import AssignmentCalculate from "./views/AssignmentCalculate.vue";
+import AssignmentCalculateDetail from "./views/AssignmentCalculateDetail.vue";
+
 export default [
   {
     path: "/base/user-manage",
@@ -55,4 +59,19 @@ export default [
     name: "CourseLinkManage",
     component: CourseLinkManage,
   },
+  {
+    path: "/base/assignment-calculate",
+    name: "AssignmentCalculate",
+    component: AssignmentCalculate,
+  },
+  {
+    path: "/base/assignment-calculate-detail",
+    name: "AssignmentCalculateDetail",
+    component: AssignmentCalculateDetail,
+  },
+  {
+    path: "/base/system-setting",
+    name: "SystemSetting",
+    component: SystemSetting,
+  },
 ];

+ 15 - 55
src/modules/base/views/AssignmentCalculate.vue

@@ -14,14 +14,8 @@
         <el-form-item prop="examTypeId" label="考试类型:">
           <exam-type-select v-model="filter.examTypeId"></exam-type-select>
         </el-form-item>
-        <el-form-item label="学院:">
-          <college-select v-model="filter.collegeId"></college-select>
-        </el-form-item>
-        <el-form-item label="考试:">
-          <ecs-exam-select
-            v-model="filter.examId"
-            :college-id="filter.collegeId"
-          ></ecs-exam-select>
+        <el-form-item label="课程代码:">
+          <college-select v-model="filter.courseCode"></college-select>
         </el-form-item>
         <el-form-item>
           <el-button type="primary" @click="toPage(1)">查询</el-button>
@@ -30,21 +24,19 @@
     </div>
     <div class="part-box part-box-pad">
       <el-table ref="TableList" :data="dataList">
-        <el-table-column
-          type="index"
-          label="序号"
-          width="70"
-          :index="indexMethod"
-        ></el-table-column>
-        <el-table-column prop="examId" label="云阅卷id"></el-table-column>
-        <el-table-column prop="xnm" label="学年"></el-table-column>
-        <el-table-column prop="xqm" label="学期"></el-table-column>
+        <el-table-column prop="course" label="课程(代码)">
+          <span slot-scope="scope">
+            {{ scope.row.courseName }}({{ scope.row.courseCode }})
+          </span>
+        </el-table-column>
+        <el-table-column prop="openCollege" label="开课学院"></el-table-column>
+        <el-table-column prop="actualCount" label="有效人数"></el-table-column>
         <el-table-column class-name="action-column" label="操作" width="200px">
           <template slot-scope="scope">
             <el-button
               :class="scope.row.enable ? 'btn-danger' : 'btn-primary'"
               type="text"
-              @click="toEnable(scope.row)"
+              @click="toCalc(scope.row)"
               >{{ scope.row.enable ? "重算" : "试算" }}</el-button
             >
             <!-- 查看 -->
@@ -64,41 +56,29 @@
         </el-pagination>
       </div>
     </div>
-
-    <!-- DataTaskDialog -->
-    <data-task-dialog
-      ref="DataTaskDialog"
-      task-type="CLOUD_MARKING_STUDENT_SCORE"
-    ></data-task-dialog>
   </div>
 </template>
 
 <script>
-import { dataReturnList, downloadDataReturn } from "../api";
-import DataTaskDialog from "../components/DataTaskDialog.vue";
-import { downloadByApi } from "@/plugins/download";
+import { assignmentDataList } from "../api";
 
 export default {
   name: "assignment-calculate",
-  components: { DataTaskDialog },
   data() {
     return {
       filter: {
         semesterId: "",
         examTypeId: "",
-        collegeId: "",
-        examId: "",
+        courseCode: "",
       },
       current: 1,
       size: this.GLOBAL.pageSize,
       total: 0,
       dataList: [],
-      downloading: false,
     };
   },
   async mounted() {
     await this.$refs.SemesterSelect.search();
-    // this.getList();
   },
   methods: {
     async getList() {
@@ -108,7 +88,7 @@ export default {
         pageSize: this.size,
       };
 
-      const data = await dataReturnList(datas);
+      const data = await assignmentDataList(datas);
       this.dataList = data.records;
       this.total = data.total;
     },
@@ -116,28 +96,8 @@ export default {
       this.current = page;
       this.getList();
     },
-    async toDownload() {
-      if (
-        !this.filter.semesterId ||
-        !this.filter.examTypeId ||
-        !this.filter.examId
-      ) {
-        this.$message.error("学期、考试以及考试类型必选!");
-        return;
-      }
-
-      if (this.downloading) return;
-      this.downloading = true;
-
-      const res = await downloadByApi(() => {
-        return downloadDataReturn(this.filter);
-      }).catch((e) => {
-        this.$message.error(e || "下载失败,请重新尝试!");
-      });
-      this.downloading = false;
-
-      if (!res) return;
-      this.$message.success("下载成功!");
+    toCalc(row) {
+      console.log(row);
     },
   },
 };

+ 118 - 0
src/modules/base/views/AssignmentCalculateDetail.vue

@@ -0,0 +1,118 @@
+<template>
+  <div class="assignment-calculate-detail">
+    <div class="ass-part">
+      <div class="box-justify mb-2">
+        <h3>开课课程考试情况总览</h3>
+      </div>
+      <div class="part-box part-box-pad ass-summary">
+        <div class="ass-summary-tags">
+          <div class="ass-summary-tag">
+            <h6>课程</h6>
+            <p>{{ detailInfo.courseName }}</p>
+          </div>
+          <div class="ass-summary-tag">
+            <h6>有效(实考)人数</h6>
+            <p>{{ detailInfo.actualCount }}</p>
+          </div>
+          <div class="ass-summary-tag">
+            <h6>考查学院</h6>
+            <p>{{ detailInfo.inspectCollege.length }}</p>
+          </div>
+        </div>
+        <div class="ass-summary-nouns">
+          <div class="ass-summary-noun">
+            <div class="noun-label">开课学院</div>
+            <div class="noun-content">{{ detailInfo.openCollege }}</div>
+          </div>
+          <div class="ass-summary-noun">
+            <div class="noun-label">考查学院</div>
+            <div class="noun-content">
+              {{ detailInfo.inspectCollege.join(",") }}
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <div class="ass-part">
+      <div class="box-justify mb-2">
+        <h3>赋分试算</h3>
+      </div>
+      <assign-config
+        v-if="dataReady"
+        ref="AssignConfig"
+        class="part-box part-box-pad"
+        :detail-info="detailInfo"
+        :assign-info="curAssignInfo"
+      ></assign-config>
+    </div>
+
+    <div class="ass-part">
+      <div class="box-justify mb-2">
+        <h3>赋分结果预览</h3>
+      </div>
+      <assign-result
+        ref="AssignResult"
+        class="part-box part-box-pad"
+        :data="detailInfo"
+      ></assign-result>
+    </div>
+    <div class="ass-part">
+      <div class="box-justify mb-2">
+        <h3>赋分结果对比预览</h3>
+      </div>
+      <assign-compare
+        ref="AssignCompare"
+        class="part-box part-box-pad"
+        :data="detailInfo"
+      ></assign-compare>
+    </div>
+  </div>
+</template>
+
+<script>
+import { assignmentDetailInfo } from "../api";
+import AssignCompare from "../components/assignment/AssignCompare.vue";
+import AssignConfig from "../components/assignment/AssignConfig.vue";
+import AssignResult from "../components/assignment/AssignResult.vue";
+
+export default {
+  name: "assignment-calculate-detail",
+  components: {
+    AssignConfig,
+    AssignResult,
+    AssignCompare,
+  },
+  data() {
+    return {
+      curAssignInfo: {},
+      detailInfo: {
+        semesterId: "",
+        examTypeId: "",
+        courseCode: "",
+        courseName: "",
+        actualCount: "",
+        openCollege: "", // 开课学院
+        formula: "FORMULA1", // 公式
+        coefficient: "", // 系统json
+        inspectCollege: [],
+      },
+      dataReady: false,
+    };
+  },
+  mounted() {
+    this.curAssignInfo = this.$ls.get("curAssignInfo");
+    this.getData();
+  },
+  beforeDestroy() {
+    this.$ls.remove("curAssignInfo");
+  },
+  methods: {
+    async getData() {
+      const res = await assignmentDetailInfo(this.curAssignInfo);
+      this.detailInfo = res || {};
+      this.dataReady = true;
+    },
+  },
+};
+</script>

+ 131 - 0
src/modules/base/views/SystemSetting.vue

@@ -0,0 +1,131 @@
+<template>
+  <div class="system-setting">
+    <div class="part-box part-box-pad">
+      <el-form
+        ref="modalFormComp"
+        :model="modalForm"
+        :rules="rules"
+        label-width="200px"
+      >
+        <div v-for="(group, gindex) in setList" :key="gindex" class="form-part">
+          <h2 class="form-part-title">{{ group.name }}</h2>
+          <div class="form-part-body">
+            <template v-for="field in group.data">
+              <el-form-item
+                v-if="field.enable"
+                :key="field.code"
+                :prop="field.code"
+                :label="`${field.name}:`"
+              >
+                <el-radio-group
+                  v-if="checkValueIsBoolean(field.value)"
+                  v-model="modalForm[field.code]"
+                >
+                  <el-radio
+                    v-for="item in BOOLEAN_STATUS"
+                    :key="item.value"
+                    :label="item.value"
+                    >{{ item.label }}</el-radio
+                  >
+                </el-radio-group>
+                <el-input
+                  v-else
+                  v-model="modalForm[field.code]"
+                  placeholder="请输入"
+                  clearable
+                ></el-input>
+              </el-form-item>
+            </template>
+          </div>
+        </div>
+        <el-form-item v-if="setList.length">
+          <el-button type="primary" :disabled="isSubmit" @click="submit"
+            >确认</el-button
+          >
+          <el-button type="primary" @click="freshCache">刷新缓存</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+  </div>
+</template>
+
+<script>
+import { systemSettingQuery, updateSystemSetting, flushCache } from "../api";
+
+export default {
+  name: "system-setting",
+  data() {
+    return {
+      modalForm: {},
+      isSubmit: false,
+      BOOLEAN_STATUS: [
+        {
+          label: "开启",
+          value: "true",
+        },
+        {
+          label: "关闭",
+          value: "false",
+        },
+      ],
+      rules: {},
+      setList: [],
+    };
+  },
+  mounted() {
+    this.getSysSet();
+  },
+  methods: {
+    checkValueIsBoolean(val) {
+      return ["true", "false"].includes(val);
+    },
+    async getSysSet() {
+      const data = await systemSettingQuery();
+      this.setList = data;
+      let modalForm = {},
+        rules = {};
+      data.forEach((item) => {
+        item.data.forEach((field) => {
+          modalForm[field.code] = field.value;
+          rules[field.code] = [
+            {
+              required: true,
+              message: `请设置${field.name}`,
+              trigger: "change",
+            },
+          ];
+        });
+      });
+      this.modalForm = modalForm;
+      this.rules = rules;
+    },
+    async submit() {
+      const valid = await this.$refs.modalFormComp.validate().catch(() => {});
+      if (!valid) return;
+
+      if (this.isSubmit) return;
+      this.isSubmit = true;
+      this.setList.forEach((item) => {
+        item.data.forEach((field) => {
+          field.value = this.modalForm[field.code];
+        });
+      });
+
+      const data = await updateSystemSetting(this.setList).catch(() => {});
+      this.isSubmit = false;
+
+      if (!data) return;
+
+      this.$message.success("设置成功!");
+    },
+    async freshCache() {
+      const schoolId = this.$ls.get("schoolId");
+      if (!schoolId) {
+        await flushCache("SYS_SETTING_GLOBAL");
+      } else {
+        await flushCache("SYS_SETTING");
+      }
+    },
+  },
+};
+</script>