diff --git a/sample-form-manager-ui/admin/src/api/system.js b/sample-form-manager-ui/admin/src/api/system.js
new file mode 100644
index 0000000000000000000000000000000000000000..173358ec87d391fcb9fcbbde0d724440b2bf6e29
--- /dev/null
+++ b/sample-form-manager-ui/admin/src/api/system.js
@@ -0,0 +1,94 @@
+// 绯荤粺api
+import request from "@/utils/request";
+/**
+ *  绯荤粺鍙傛暟
+ */
+// 鑾峰彇绯荤粺鍙傛暟鍒楄〃
+export const getParamList = (data) => {
+  return request({
+    url: `/sampleform/param/list`,
+    method: "post",
+    data,
+  });
+};
+// 鏌ョ湅绯荤粺鍙傛暟
+export const getParamInfo = (params) => {
+  return request({
+    url: `/sampleform/param/info`,
+    method: "get",
+    params,
+  });
+};
+// 淇濆瓨缂栬緫绯荤粺鍙傛暟
+export const saveParam = (data) => {
+  return request({
+    url: `/sampleform/param/save`,
+    method: "post",
+    data,
+  });
+};
+// 鍒犻櫎绯荤粺鍙傛暟
+export const delParam = (params) => {
+  return request({
+    url: `/sampleform/param/delete`,
+    method: "get",
+    params,
+  });
+};
+
+/**
+ *  浠诲姟淇℃伅
+ */
+// 鑾峰彇浠诲姟淇℃伅鍒楄〃
+export const getTaskList = (data) => {
+  return request({
+    url: `/sampleform/task/list`,
+    method: "post",
+    data,
+  });
+};
+// 鏌ョ湅浠诲姟淇℃伅
+export const getTaskInfo = (params) => {
+  return request({
+    url: `/sampleform/task/info`,
+    method: "get",
+    params,
+  });
+};
+// 淇濆瓨缂栬緫浠诲姟淇℃伅
+export const saveTask = (data) => {
+  return request({
+    url: `/sampleform/task/save`,
+    method: "post",
+    data,
+  });
+};
+// 鍒犻櫎浠诲姟淇℃伅
+export const delTask = (params) => {
+  return request({
+    url: `/sampleform/task/delete`,
+    method: "get",
+    params,
+  });
+};
+
+/**
+ *  鎿嶄綔鏃ュ織
+ */
+
+// 鑾峰彇鎿嶄綔鏃ュ織
+export const getlogsList = (data) => {
+  return request({
+    url: `/sampleform/oper/log/list`,
+    method: "post",
+    data,
+  });
+};
+// 鏌ョ湅鎿嶄綔鏃ュ織
+export const getlog = (params) => {
+  return request({
+    url: `/sampleform/oper/log/info`,
+    method: "get",
+    params,
+  });
+};
diff --git a/sample-form-manager-ui/admin/src/pages/layouts/Layouts.vue b/sample-form-manager-ui/admin/src/pages/layouts/Layouts.vue
index 670f18818264316c5662b82619fb88c67a8940f1..a78988a90b17faa0875572500ab64bd35bddcef4 100644
--- a/sample-form-manager-ui/admin/src/pages/layouts/Layouts.vue
+++ b/sample-form-manager-ui/admin/src/pages/layouts/Layouts.vue
@@ -88,7 +88,7 @@ export default {
 <style lang="less" scoped>
 .layouts {
   width: 100%;
-  min-width: 1500px;
+  min-width: 1620px;
   height: 100%;
   padding-bottom: 10px;
   // .crumbs {
diff --git a/sample-form-manager-ui/admin/src/pages/layouts/components/Header.vue b/sample-form-manager-ui/admin/src/pages/layouts/components/Header.vue
index 83a51fc7b8ccc784f9c3f8d37b3ad9967ec7361e..2cc3e90295593b9f41ea64a18f472357494b4bb1 100644
--- a/sample-form-manager-ui/admin/src/pages/layouts/components/Header.vue
+++ b/sample-form-manager-ui/admin/src/pages/layouts/components/Header.vue
@@ -50,7 +50,12 @@ export default {
   },
   computed: {
     activeMenu() {
-      return this.$route.path;
+      const route = this.$route;
+      const { meta, path } = route;
+      if (meta.activeMenu) {
+        return meta.activeMenu;
+      }
+      return path;
     },
     meuns() {
       return this.$store.state.menus;
diff --git a/sample-form-manager-ui/admin/src/pages/system/System.vue b/sample-form-manager-ui/admin/src/pages/system/System.vue
new file mode 100644
index 0000000000000000000000000000000000000000..1f4f273a2f6f90152abcb9135672e4e688f72695
--- /dev/null
+++ b/sample-form-manager-ui/admin/src/pages/system/System.vue
@@ -0,0 +1,44 @@
+<template>
+  <div class="system flex flexc">
+    <el-tabs :value="activeKey" @tab-click="changeRouter">
+      <el-tab-pane label="绯荤粺鍙傛暟" name="/system/parameter"></el-tab-pane>
+      <el-tab-pane label="浠诲姟淇℃伅" name="/system/task"></el-tab-pane>
+      <el-tab-pane label="鎿嶄綔鏃ュ織" name="/system/systemlogs"></el-tab-pane>
+    </el-tabs>
+    <div class="system-out-box flex1">
+      <router-view></router-view>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  computed: {
+    activeKey() {
+      return this.$route.path;
+    },
+  },
+  methods: {
+    changeRouter(e) {
+      this.$router.push(e.name);
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+:deep(.el-tabs__nav-scroll) {
+  padding-left: 15px;
+}
+.system {
+  width: 100%;
+  height: 100%;
+  .system-out-box {
+    padding: 0px 15px 15px 15px;
+    overflow-y: auto;
+  }
+  /deep/.ant-tabs-nav-container {
+    border-bottom: 1px solid #f0f0f0 !important;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/sample-form-manager-ui/admin/src/pages/system/parameter/Parameter.vue b/sample-form-manager-ui/admin/src/pages/system/parameter/Parameter.vue
new file mode 100644
index 0000000000000000000000000000000000000000..3fdad907b6854395d1d5861572ec4382b6eba5bd
--- /dev/null
+++ b/sample-form-manager-ui/admin/src/pages/system/parameter/Parameter.vue
@@ -0,0 +1,265 @@
+<template>
+  <div class="parameter">
+    <TableHeader>
+      <div slot="left">
+        <el-button size="small" type="primary" @click="handleAdd"
+          >鏂板鍙傛暟</el-button
+        >
+        <el-button size="small" type="danger" @click="handleDelAll"
+          >鎵归噺绉婚櫎</el-button
+        >
+      </div>
+      <div slot="right" class="flex">
+        <el-input
+          size="small"
+          v-model="searchVal"
+          style="width: 200px"
+          class="ml10 mr10"
+          placeholder="璇疯緭鍏ュ弬鏁板悕绉版悳绱�"
+          @keyup.native.enter="handleSearch"
+        ></el-input>
+        <el-button size="small" type="primary" @click="handleSearch"
+          >鎼滅储</el-button
+        >
+        <el-button size="small" @click="handleReset">閲嶇疆</el-button>
+      </div>
+    </TableHeader>
+    <!-- 琛ㄦ牸 -->
+    <div class="table-content">
+      <el-table
+        ref="multipleTable"
+        size="small"
+        v-loading="loading"
+        :data="tableData"
+        border
+        tooltip-effect="dark"
+        style="width: 100%"
+        max-height="676px"
+        :row-key="(row) => row.id"
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column
+          reserve-selection
+          type="selection"
+          width="55"
+          align="center"
+        >
+        </el-table-column>
+        <el-table-column
+          type="index"
+          label="搴忓彿"
+          width="55"
+          align="center"
+          :index="(index) => (current - 1) * size + index + 1"
+        >
+        </el-table-column>
+        <el-table-column label="鍙傛暟鍚嶇О" align="center" prop="name">
+        </el-table-column>
+        <el-table-column label="涓€绾х粍缁�" align="center" prop="firstOrganize">
+        </el-table-column>
+        <el-table-column label="浜岀骇缁勭粐" align="center" prop="secondOrganize">
+        </el-table-column>
+        <el-table-column label="鍙傛暟閿�" align="center" prop="paramKey">
+        </el-table-column>
+        <el-table-column label="鍙傛暟鍊�" align="center" prop="paramValue">
+        </el-table-column>
+        <el-table-column label="鍙傛暟鏈夋晥鐘舵€�" align="center" prop="validStatus">
+          <template slot-scope="scope">
+            <el-tag
+              size="small"
+              v-if="scope.row.validStatus == 1"
+              type="success"
+              >鏈夋晥</el-tag
+            >
+            <el-tag size="small" v-else type="info">绂佺敤</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="澶囨敞" align="center" prop="remark">
+        </el-table-column>
+        <el-table-column label="鎿嶄綔" align="center" width="100">
+          <template slot-scope="scope">
+            <div class="flex jca">
+              <span class="primary pointer" @click="handleEdit(scope.row)"
+                >缂栬緫</span
+              >
+              <span class="delete pointer" @click="handleDel(scope.row.id)"
+                >鍒犻櫎</span
+              >
+            </div>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+    <div class="pagination" v-if="total">
+      <el-pagination
+        background
+        layout="total,sizes,prev,pager,next,jumper"
+        :pager-count="5"
+        :total="total"
+        :current-page="current"
+        :page-size="size"
+        :page-sizes="pageSizes"
+        @current-change="changePagination"
+        @size-change="changeSize"
+      >
+      </el-pagination>
+    </div>
+    <!-- 鏂板鍙傛暟 -->
+    <AddParameter
+      ref="AddParameter"
+      :addVisible.sync="addVisible"
+      :title="title"
+      :dict="dict"
+      @addSuccess="getParamList"
+    ></AddParameter>
+  </div>
+</template>
+
+<script>
+import TableHeader from "@/components/TableHeader.vue";
+import AddParameter from "./modal/AddParameter.vue";
+import { getParamList, delParam } from "@/api/system";
+export default {
+  components: {
+    TableHeader,
+    AddParameter,
+  },
+  data() {
+    return {
+      searchVal: "",
+      tableData: [],
+      current: 1,
+      size: 10,
+      total: 10,
+      pageSizes: [10, 20, 30, 40, 50, 100, 200],
+      loading: false,
+      selectKeys: [],
+      addVisible: false,
+      title: "鏂板鍙傛暟",
+      dict: {}, // 瀛楀吀
+    };
+  },
+  created() {
+    this.getParamList();
+  },
+  computed: {},
+  methods: {
+    // 绯荤粺浜嬮」鍒楄〃
+    async getParamList() {
+      this.loading = true;
+      let res = await getParamList({
+        page: this.current,
+        size: this.size,
+        name: `%${this.searchVal}%`,
+      });
+      if (res.data.code == 1) {
+        let { data, total, dict } = res.data.data;
+        this.dict = dict;
+        if (!data.length && this.current > 1) {
+          this.current -= 1;
+          this.getParamList();
+        }
+        this.tableData = data;
+        this.total = total;
+        this.$refs.multipleTable.bodyWrapper.scrollTop = 0;
+      }
+      this.loading = false;
+    },
+
+    // 鎵归噺绉婚櫎
+    handleDelAll() {
+      if (!this.selectKeys.length) {
+        this.$message.warning("璇峰厛鍕鹃€夋暟鎹�");
+        return;
+      }
+      let ids = this.selectKeys.map((v) => v.id).join(",");
+      this.handleDel(ids);
+    },
+    // 鎼滅储
+    handleSearch() {
+      this.current = 1;
+      this.$refs.multipleTable.clearSelection();
+      this.getParamList();
+    },
+    // 閲嶇疆
+    handleReset() {
+      this.searchVal = "";
+      this.current = 1;
+      this.$refs.multipleTable.clearSelection();
+      this.getParamList();
+    },
+    // 閫変腑
+    handleSelectionChange(select) {
+      this.selectKeys = select;
+    },
+    // 缈婚〉
+    changePagination(cur) {
+      this.current = cur;
+      this.getParamList();
+    },
+    // 鏀瑰彉娌℃湁鏄剧ず鏁伴噺
+    changeSize(size) {
+      this.size = size;
+      this.getParamList();
+    },
+    // 鏂板
+    handleAdd() {
+      this.title = "鏂板鍙傛暟";
+      this.$refs.AddParameter.onAdd();
+      this.addVisible = true;
+    },
+    // 缂栬緫
+    handleEdit(row) {
+      this.title = "缂栬緫鍙傛暟";
+      this.$refs.AddParameter.onEdit(row);
+      this.addVisible = true;
+    },
+    // 绉婚櫎
+    handleDel(id) {
+      this.$confirm("姝ゆ搷浣滃皢鍒犻櫎鎵€閫夋暟鎹紝鏄惁缁х画锛�", "绯荤粺鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        cancelButtonClass: "btn-custom-cancel",
+        type: "warning",
+      })
+        .then(async () => {
+          let res = await delParam({ id });
+          let { code, msg } = res.data;
+          if (code === 1) {
+            this.$message.success(msg);
+            this.getParamList();
+            this.$refs.multipleTable.clearSelection();
+            this.selectKeys = [];
+          }
+        })
+        .catch(() => {
+          console.log("鍙栨秷鎴愬姛锛�");
+        });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.parameter {
+  width: 100%;
+  min-height: 100%;
+  .short {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+  .full-name {
+    color: rgb(172, 170, 170);
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+  :deep(.el-card) {
+    height: auto;
+  }
+  // .table-content {
+  //   height: 550px;
+  // }
+}
+</style>
\ No newline at end of file
diff --git a/sample-form-manager-ui/admin/src/pages/system/parameter/modal/AddParameter.vue b/sample-form-manager-ui/admin/src/pages/system/parameter/modal/AddParameter.vue
new file mode 100644
index 0000000000000000000000000000000000000000..cab9e7f1bed6a1c132c9859ddd14f292f9fa08c0
--- /dev/null
+++ b/sample-form-manager-ui/admin/src/pages/system/parameter/modal/AddParameter.vue
@@ -0,0 +1,198 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :destroy-on-close="true"
+      :visible.sync="Visible"
+      width="30%"
+      @close="handleClose"
+      :close-on-click-modal="false"
+      top="10vh"
+    >
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="鍙傛暟鍚嶇О" prop="name">
+          <el-input
+            size="small"
+            v-model="form.name"
+            placeholder="璇疯緭鍏ュ弬鏁板悕绉�"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="涓€绾х粍缁�" prop="firstOrganize">
+          <el-input
+            size="small"
+            v-model="form.firstOrganize"
+            placeholder="璇疯緭鍏ヤ竴绾х粍缁�"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="浜岀骇缁勭粐" prop="secondOrganize">
+          <el-input
+            size="small"
+            v-model="form.secondOrganize"
+            placeholder="璇疯緭鍏ヤ簩绾х粍缁�"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="鍙傛暟閿�" prop="paramKey">
+          <el-input
+            size="small"
+            v-model="form.paramKey"
+            placeholder="璇疯緭鍏ュ弬鏁伴敭"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="鍙傛暟鍊�" prop="paramValue">
+          <el-input
+            size="small"
+            v-model="form.paramValue"
+            placeholder="璇疯緭鍏ュ弬鏁板€�"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="鍙傛暟淇敼鐘舵€�" prop="modStatus">
+          <el-select v-model="form.modStatus" placeholder="璇烽€夋嫨鍙傛暟鏈夋晥鐘舵€�">
+            <el-option
+              v-for="(v, key) in dict.modStatus"
+              :key="key"
+              :label="v"
+              :value="Number(key)"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="灞曠幇绫诲瀷" prop="displayType">
+          <el-select v-model="form.displayType" placeholder="璇烽€夋嫨灞曠幇绫诲瀷">
+            <el-option
+              v-for="(v, key) in dict.displayType"
+              :key="key"
+              :label="v"
+              :value="Number(key)"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鍙傛暟鏈夋晥鐘舵€�" prop="validStatus">
+          <el-radio-group v-model="form.validStatus">
+            <el-radio
+              v-for="(v, key) in dict.validStatus"
+              :key="key"
+              :label="Number(key)"
+            >
+              {{ v }}
+            </el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="remark">
+          <el-input
+            resize="none"
+            :autosize="{ minRows: 3, maxRows: 3 }"
+            type="textarea"
+            placeholder="璇疯緭鍏ュ娉�"
+            v-model="form.remark"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="small" @click="handleRest">閲� 缃�</el-button>
+        <el-button size="small" type="primary" @click="handleOk"
+          >纭� 瀹�</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { saveParam } from "@/api/system";
+export default {
+  props: {
+    title: {
+      type: String,
+      required: true,
+      default: "",
+    },
+    addVisible: {
+      type: Boolean,
+      required: true,
+      default: false,
+    },
+    dict: {
+      type: Object,
+      required: true,
+      default: () => {
+        return {};
+      },
+    },
+  },
+  data() {
+    return {
+      form: {
+        name: "", // 鍙傛暟鍚嶇О
+        firstOrganize: "", // 涓€绾х粍缁�
+        secondOrganize: "", // 浜岀骇缁勭粐
+        paramKey: "", // 鍙傛暟閿�
+        paramValue: "", // 鍙傛暟鍊�
+        modStatus: "", // 鍙傛暟淇敼鐘舵€�
+        displayType: "", // 灞曠幇绫诲瀷
+        validStatus: 1, // 鍙傛暟鏈夋晥鐘舵€�
+        remark: "", // 澶囨敞
+      },
+      rules: {
+        name: [{ required: true, message: "璇疯緭鍏ュ弬鏁板悕绉�", trigger: "blur" }],
+        paramKey: [
+          { required: true, message: "璇疯緭鍏ュ弬鏁伴敭", trigger: "blur" },
+        ],
+        paramValue: [
+          { required: true, message: "璇疯緭鍏ュ弬鏁板€�", trigger: "blur" },
+        ],
+      },
+    };
+  },
+  computed: {
+    Visible: {
+      get() {
+        return this.addVisible;
+      },
+      set(val) {
+        this.$emit("update:addVisible", val);
+      },
+    },
+  },
+  methods: {
+    // 纭畾
+    handleOk() {
+      this.$refs.form.validate(async (valid) => {
+        if (valid) {
+          let res = await saveParam(this.form);
+          let { code, msg } = res.data;
+          if (code === 1) {
+            this.$message.success(msg);
+            this.$emit("addSuccess");
+            this.handleClose();
+          }
+        }
+      });
+    },
+    // 鏂板
+    onAdd() {
+      Object.assign(this.form, this.$options.data().form);
+      this.form.id && this.$delete(this.form, "id");
+    },
+    // 缂栬緫
+    onEdit(row) {
+      this.form = { ...row };
+    },
+    // 閲嶇疆
+    handleRest() {
+      this.$refs.form.resetFields();
+    },
+    // 鍏抽棴
+    handleClose() {
+      this.$refs.form.resetFields();
+      this.Visible = false;
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+/deep/.el-select {
+  width: 100%;
+}
+</style>
\ No newline at end of file
diff --git a/sample-form-manager-ui/admin/src/pages/system/systemlogs/SystemLogs.vue b/sample-form-manager-ui/admin/src/pages/system/systemlogs/SystemLogs.vue
new file mode 100644
index 0000000000000000000000000000000000000000..0b5ef0c1b1a597ca18d8d0ffa34f4ddf1975bd8e
--- /dev/null
+++ b/sample-form-manager-ui/admin/src/pages/system/systemlogs/SystemLogs.vue
@@ -0,0 +1,175 @@
+<template>
+  <div class="system">
+    <TableHeader>
+      <div slot="right" class="flex">
+        <el-input
+          size="small"
+          v-model="searchVal"
+          style="width: 200px"
+          class="ml10 mr10"
+          placeholder="璇疯緭鍏ヨ姹傚湴鍧€鎼滅储"
+          @keyup.native.enter="handleSearch"
+        ></el-input>
+        <el-button size="small" type="primary" @click="handleSearch"
+          >鎼滅储</el-button
+        >
+        <el-button size="small" @click="handleReset">閲嶇疆</el-button>
+      </div>
+    </TableHeader>
+    <!-- 琛ㄦ牸 -->
+    <div class="table-content">
+      <el-table
+        ref="multipleTable"
+        size="small"
+        v-loading="loading"
+        :data="tableData"
+        border
+        tooltip-effect="dark"
+        style="width: 100%"
+        max-height="676px"
+        :row-key="(row) => row.id"
+      >
+        <el-table-column
+          type="index"
+          label="搴忓彿"
+          width="55"
+          align="center"
+          :index="(index) => (current - 1) * size + index + 1"
+        >
+        </el-table-column>
+        <el-table-column label="鐢ㄦ埛鍚嶇О" align="center" prop="userName">
+        </el-table-column>
+        <el-table-column label="鐧诲綍鍚嶇О" align="center" prop="loginName">
+        </el-table-column>
+        <el-table-column label="璇锋眰鍦板潃" align="center" prop="requestUrl">
+        </el-table-column>
+        <el-table-column label="鎿嶄綔鍐呭" align="center" prop="content">
+        </el-table-column>
+        <el-table-column label="鎿嶄綔IP鍦板潃" align="center" prop="ip">
+        </el-table-column>
+        <el-table-column label="鎿嶄綔绫诲瀷" align="center" prop="operType">
+          <template slot-scope="scope">
+            <span v-if="scope.row.operType == 0">鏂板</span>
+            <span v-else-if="scope.row.operType == 1">淇敼</span>
+            <span v-else-if="scope.row.operType == 2">鍒犻櫎</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="鎿嶄綔鏃堕棿" align="center" prop="logDate">
+        </el-table-column>
+      </el-table>
+    </div>
+    <div class="pagination" v-if="total">
+      <el-pagination
+        background
+        layout="total,sizes,prev,pager,next,jumper"
+        :pager-count="5"
+        :total="total"
+        :current-page="current"
+        :page-size="size"
+        :page-sizes="pageSizes"
+        @current-change="changePagination"
+        @size-change="changeSize"
+      >
+      </el-pagination>
+    </div>
+  </div>
+</template>
+
+<script>
+import TableHeader from "@/components/TableHeader.vue";
+import { getlogsList } from "@/api/system";
+export default {
+  components: {
+    TableHeader,
+  },
+  data() {
+    return {
+      searchVal: "",
+      tableData: [],
+      current: 1,
+      size: 10,
+      total: 10,
+      pageSizes: [10, 20, 30, 40, 50, 100, 200],
+      loading: false,
+      selectKeys: [],
+      dict: {}, // 瀛楀吀
+    };
+  },
+  created() {
+    this.getlogsList();
+  },
+  computed: {},
+  methods: {
+    // 绯荤粺浜嬮」鍒楄〃
+    async getlogsList() {
+      this.loading = true;
+      let res = await getlogsList({
+        page: this.current,
+        size: this.size,
+        name: `%${this.searchVal}%`,
+      });
+      if (res.data.code == 1) {
+        let { data, total, dict } = res.data.data;
+        this.dict = dict;
+        if (!data.length && this.current > 1) {
+          this.current -= 1;
+          this.getlogsList();
+        }
+        this.tableData = data;
+        this.total = total;
+        this.$refs.multipleTable.bodyWrapper.scrollTop = 0;
+      }
+      this.loading = false;
+    },
+
+    // 鎼滅储
+    handleSearch() {
+      this.current = 1;
+      this.$refs.multipleTable.clearSelection();
+      this.getlogsList();
+    },
+    // 閲嶇疆
+    handleReset() {
+      this.searchVal = "";
+      this.current = 1;
+      this.$refs.multipleTable.clearSelection();
+      this.getlogsList();
+    },
+
+    // 缈婚〉
+    changePagination(cur) {
+      this.current = cur;
+      this.getlogsList();
+    },
+    // 鏀瑰彉娌℃湁鏄剧ず鏁伴噺
+    changeSize(size) {
+      this.size = size;
+      this.getlogsList();
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.system {
+  width: 100%;
+  min-height: 100%;
+  .short {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+  .full-name {
+    color: rgb(172, 170, 170);
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+  :deep(.el-card) {
+    height: auto;
+  }
+  // .table-content {
+  //   height: 550px;
+  // }
+}
+</style>
\ No newline at end of file
diff --git a/sample-form-manager-ui/admin/src/pages/system/task/TaskSet.vue b/sample-form-manager-ui/admin/src/pages/system/task/TaskSet.vue
new file mode 100644
index 0000000000000000000000000000000000000000..416e59402edc1406fa5981b798c3be9f295f1be9
--- /dev/null
+++ b/sample-form-manager-ui/admin/src/pages/system/task/TaskSet.vue
@@ -0,0 +1,286 @@
+<template>
+  <div class="task-set">
+    <TableHeader>
+      <div slot="left">
+        <el-button size="small" type="primary" @click="handleAdd"
+          >鏂板浠诲姟</el-button
+        >
+        <el-button size="small" type="danger" @click="handleDelAll"
+          >鎵归噺绉婚櫎</el-button
+        >
+      </div>
+      <div slot="right" class="flex">
+        <el-input
+          size="small"
+          v-model="searchVal"
+          style="width: 200px"
+          class="ml10 mr10"
+          placeholder="璇疯緭鍏ュ弬鏁板悕绉版悳绱�"
+          @keyup.native.enter="handleSearch"
+        ></el-input>
+        <el-button size="small" type="primary" @click="handleSearch"
+          >鎼滅储</el-button
+        >
+        <el-button size="small" @click="handleReset">閲嶇疆</el-button>
+      </div>
+    </TableHeader>
+    <!-- 琛ㄦ牸 -->
+    <div class="table-content">
+      <el-table
+        ref="multipleTable"
+        size="small"
+        v-loading="loading"
+        :data="tableData"
+        border
+        tooltip-effect="dark"
+        style="width: 100%"
+        max-height="676px"
+        :row-key="(row) => row.id"
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column
+          reserve-selection
+          type="selection"
+          width="55"
+          align="center"
+        >
+        </el-table-column>
+        <el-table-column
+          type="index"
+          label="搴忓彿"
+          width="55"
+          align="center"
+          :index="(index) => (current - 1) * size + index + 1"
+        >
+        </el-table-column>
+        <el-table-column label="浠诲姟鍚嶇О" align="center" prop="name">
+        </el-table-column>
+        <el-table-column label="鎵ц涓绘満" align="center" prop="excuteHost">
+        </el-table-column>
+        <el-table-column label="鎵ц鍏抽敭瀛�" align="center" prop="taskKey">
+        </el-table-column>
+        <el-table-column label="鎵ц绛栫暐" align="center" prop="excuteStrategy">
+          <template slot-scope="scope">
+            <el-tag type="info">{{
+              filterItems(scope.row.excuteStrategy, dict.excuteStrategy)
+            }}</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="鏈€鍚庢墽琛屼富鏈�"
+          align="center"
+          prop="lastExcuteHost"
+        >
+        </el-table-column>
+        <el-table-column
+          label="鏈€鍚庢墽琛屾椂闂�"
+          align="center"
+          prop="lastExcuteTime"
+        >
+        </el-table-column>
+        <el-table-column label="浠诲姟鐘舵€�" align="center" prop="status">
+          <template slot-scope="scope">
+            <!-- <el-tag v-if="scope.row.status == 1" type="success">鎵ц涓�</el-tag> -->
+            <el-tag size="small" type="info">{{
+              filterItems(scope.row.status, dict.status)
+            }}</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="鎿嶄綔" align="center" width="100">
+          <template slot-scope="scope">
+            <div class="flex jca">
+              <span class="primary pointer" @click="handleEdit(scope.row)"
+                >缂栬緫</span
+              >
+              <span class="delete pointer" @click="handleDel(scope.row.id)"
+                >鍒犻櫎</span
+              >
+            </div>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+    <div class="pagination" v-if="total">
+      <el-pagination
+        background
+        layout="total,sizes,prev,pager,next,jumper"
+        :pager-count="5"
+        :total="total"
+        :current-page="current"
+        :page-size="size"
+        :page-sizes="pageSizes"
+        @current-change="changePagination"
+        @size-change="changeSize"
+      >
+      </el-pagination>
+    </div>
+    <!-- 鏂板鍙傛暟 -->
+    <AddTask
+      ref="AddTask"
+      :addVisible.sync="addVisible"
+      :title="title"
+      :dict="dict"
+      @addSuccess="getTaskList"
+    ></AddTask>
+  </div>
+</template>
+
+<script>
+import TableHeader from "@/components/TableHeader.vue";
+import AddTask from "./modal/AddTask.vue";
+import { getTaskList, delTask } from "@/api/system";
+export default {
+  components: {
+    TableHeader,
+    AddTask,
+  },
+  data() {
+    return {
+      searchVal: "",
+      tableData: [],
+      current: 1,
+      size: 10,
+      total: 10,
+      pageSizes: [10, 20, 30, 40, 50, 100, 200],
+      loading: false,
+      selectKeys: [],
+      addVisible: false,
+      title: "鏂板鍙傛暟",
+      dict: {}, // 瀛楀吀
+    };
+  },
+  created() {
+    this.getTaskList();
+  },
+  computed: {},
+  methods: {
+    // 绯荤粺浜嬮」鍒楄〃
+    async getTaskList() {
+      this.loading = true;
+      let res = await getTaskList({
+        page: this.current,
+        size: this.size,
+        name: `%${this.searchVal}%`,
+      });
+      if (res.data.code == 1) {
+        let { data, total, dict } = res.data.data;
+        this.dict = dict;
+        if (!data.length && this.current > 1) {
+          this.current -= 1;
+          this.getTaskList();
+        }
+        this.tableData = data;
+        this.total = total;
+        this.$refs.multipleTable.bodyWrapper.scrollTop = 0;
+        console.log(dict);
+      }
+      this.loading = false;
+    },
+
+    // 鎵归噺绉婚櫎
+    handleDelAll() {
+      if (!this.selectKeys.length) {
+        this.$message.warning("璇峰厛鍕鹃€夋暟鎹�");
+        return;
+      }
+      let ids = this.selectKeys.map((v) => v.id).join(",");
+      this.handleDel(ids);
+    },
+    // 鎼滅储
+    handleSearch() {
+      this.current = 1;
+      this.$refs.multipleTable.clearSelection();
+      this.getTaskList();
+    },
+    // 閲嶇疆
+    handleReset() {
+      this.searchVal = "";
+      this.current = 1;
+      this.$refs.multipleTable.clearSelection();
+      this.getTaskList();
+    },
+    // 閫変腑
+    handleSelectionChange(select) {
+      this.selectKeys = select;
+    },
+    // 缈婚〉
+    changePagination(cur) {
+      this.current = cur;
+      this.getTaskList();
+    },
+    // 鏀瑰彉娌℃湁鏄剧ず鏁伴噺
+    changeSize(size) {
+      this.size = size;
+      this.getTaskList();
+    },
+    // 鏂板
+    handleAdd() {
+      this.title = "鏂板浠诲姟";
+      this.$refs.AddTask.onAdd();
+      this.addVisible = true;
+    },
+    // 缂栬緫
+    handleEdit(row) {
+      this.title = "缂栬緫浠诲姟";
+      this.$refs.AddTask.onEdit(row);
+      this.addVisible = true;
+    },
+    // 绉婚櫎
+    handleDel(id) {
+      this.$confirm("姝ゆ搷浣滃皢鍒犻櫎鎵€閫夋暟鎹紝鏄惁缁х画锛�", "绯荤粺鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        cancelButtonClass: "btn-custom-cancel",
+        type: "warning",
+      })
+        .then(async () => {
+          let res = await delTask({ id });
+          let { code, msg } = res.data;
+          if (code === 1) {
+            this.$message.success(msg);
+            this.getTaskList();
+            this.$refs.multipleTable.clearSelection();
+            this.selectKeys = [];
+          }
+        })
+        .catch(() => {
+          console.log("鍙栨秷鎴愬姛锛�");
+        });
+    },
+    // 杩囨护琛ㄦ牸鏁版嵁
+    filterItems(key, dict = {}) {
+      let val = "";
+      Object.keys(dict).forEach((keys) => {
+        if (key == keys) {
+          val = dict[keys];
+        }
+      });
+      return val;
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.task-set {
+  width: 100%;
+  min-height: 100%;
+  .short {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+  .full-name {
+    color: rgb(172, 170, 170);
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+  :deep(.el-card) {
+    height: auto;
+  }
+  // .table-content {
+  //   height: 550px;
+  // }
+}
+</style>
\ No newline at end of file
diff --git a/sample-form-manager-ui/admin/src/pages/system/task/modal/AddTask.vue b/sample-form-manager-ui/admin/src/pages/system/task/modal/AddTask.vue
new file mode 100644
index 0000000000000000000000000000000000000000..c30339bb204d62e6c8dbc0e05c3e762165769557
--- /dev/null
+++ b/sample-form-manager-ui/admin/src/pages/system/task/modal/AddTask.vue
@@ -0,0 +1,255 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :destroy-on-close="true"
+      :visible.sync="Visible"
+      width="30%"
+      @close="handleClose"
+      :close-on-click-modal="false"
+      top="10vh"
+    >
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="浠诲姟鍚嶇О" prop="name">
+          <el-input
+            size="small"
+            v-model="form.name"
+            placeholder="璇疯緭鍏ヤ换鍔″悕绉�"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="鍏抽敭瀛�" prop="taskKey">
+          <el-input
+            size="small"
+            v-model="form.taskKey"
+            placeholder="璇疯緭鍏ュ叧閿瓧"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="鎵ц鏈嶅姟" prop="excuteService">
+          <el-input
+            size="small"
+            v-model="form.excuteService"
+            placeholder="璇疯緭鍏ユ墽琛屾湇鍔�"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="鎵ц绛栫暐" prop="excuteStrategy">
+          <el-select
+            v-model="form.excuteStrategy"
+            placeholder="璇烽€夋嫨鎵ц绛栫暐"
+            @change="changeExcuteStrategy"
+          >
+            <el-option
+              v-for="(v, key) in dict.excuteStrategy"
+              :key="key"
+              :label="v"
+              :value="Number(key)"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item
+          label="鎵ц鏃ユ湡"
+          v-if="form.excuteStrategy != 4"
+          prop="excuteDate"
+        >
+          <el-input
+            disabled
+            v-if="form.excuteStrategy == 1"
+            size="small"
+            value="姣忔棩"
+            placeholder="璇疯緭鍏ュ弬鏁板€�"
+          ></el-input>
+          <el-select
+            placeholder="璇烽€夋嫨鎵ц鏃ユ湡"
+            v-model.number="form.excuteDate"
+            v-else-if="form.excuteStrategy == 2"
+          >
+            <el-option
+              v-for="(v, key) in weeks"
+              :key="key"
+              :value="Number(key)"
+              :label="v"
+            >
+            </el-option>
+          </el-select>
+          <el-select
+            placeholder="璇烽€夋嫨鎵ц鏃ユ湡"
+            v-else-if="form.excuteStrategy == 3"
+            v-model="form.excuteDate"
+          >
+            <el-option
+              v-for="(v, key) in days"
+              :key="key"
+              :value="Number(key)"
+              :label="v"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鎵ц闂撮殧鏃堕棿" v-else prop="excuteDate">
+          <el-input placeholder="鎵ц闂撮殧鏃堕棿" v-model.number="form.excuteDate">
+            <template slot="suffix"> 绉� </template>
+          </el-input>
+        </el-form-item>
+        <el-form-item label="鎵ц鏃堕棿" prop="excuteTime">
+          <el-time-picker
+            format="HH:mm"
+            value-format="HH:mm"
+            v-model="form.excuteTime"
+            placeholder="璇烽€夋嫨鏃堕棿"
+          >
+          </el-time-picker>
+        </el-form-item>
+        <el-form-item label="鎵ц涓绘満" prop="excuteHost">
+          <el-input
+            size="small"
+            v-model="form.excuteHost"
+            placeholder="璇疯緭鍏ユ墽琛屼富鏈�"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="鎵ц鍙傛暟" prop="excuteParam">
+          <el-input
+            size="small"
+            v-model="form.excuteParam"
+            placeholder="璇疯緭鍏ユ墽琛屽弬鏁�"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="remark">
+          <el-input
+            resize="none"
+            :autosize="{ minRows: 3, maxRows: 3 }"
+            type="textarea"
+            placeholder="璇疯緭鍏ュ娉�"
+            v-model="form.remark"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="small" @click="handleRest">閲� 缃�</el-button>
+        <el-button size="small" type="primary" @click="handleOk"
+          >纭� 瀹�</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { saveTask } from "@/api/system";
+export default {
+  props: {
+    title: {
+      type: String,
+      required: true,
+      default: "",
+    },
+    addVisible: {
+      type: Boolean,
+      required: true,
+      default: false,
+    },
+    dict: {
+      type: Object,
+      required: true,
+      default: () => {
+        return {};
+      },
+    },
+  },
+  data() {
+    return {
+      days: {}, // 鍙锋暟
+      weeks: {}, // 鍛�
+      form: {
+        name: "", // 浠诲姟鍚嶇О
+        taskKey: "", // 鍏抽敭瀛�
+        excuteService: "", // 鎵ц鏈嶅姟
+        excuteStrategy: 1, // 鎵ц绛栫暐
+        excuteDate: 0, // 鎵ц鏃ユ湡
+        excuteTime: "", // 鎵ц鏃堕棿
+        excuteHost: "", // 鎵ц涓绘満
+        excuteParam: "", // 鎵ц鍙傛暟
+        remark: "", // 澶囨敞
+      },
+      rules: {
+        name: [{ required: true, message: "璇疯緭鍏ュ弬鏁板悕绉�", trigger: "blur" }],
+        paramKey: [
+          { required: true, message: "璇疯緭鍏ュ弬鏁伴敭", trigger: "blur" },
+        ],
+        paramValue: [
+          { required: true, message: "璇疯緭鍏ュ弬鏁板€�", trigger: "blur" },
+        ],
+      },
+    };
+  },
+  computed: {
+    Visible: {
+      get() {
+        return this.addVisible;
+      },
+      set(val) {
+        this.$emit("update:addVisible", val);
+      },
+    },
+  },
+  created() {
+    for (let i = 1; i <= 31; i++) {
+      this.days[i] = i + "鍙�";
+    }
+    let numArr = ["涓€", "浜�", "涓�", "鍥�", "浜�", "鍏�", "鏃�"];
+    for (let i = 1; i <= 7; i++) {
+      this.weeks[i] = "鏄熸湡" + numArr[i - 1];
+    }
+  },
+  methods: {
+    // 纭畾
+    handleOk() {
+      this.$refs.form.validate(async (valid) => {
+        if (valid) {
+          let res = await saveTask(this.form);
+          let { code, msg } = res.data;
+          if (code === 1) {
+            this.$message.success(msg);
+            this.$emit("addSuccess");
+            this.handleClose();
+          }
+        }
+      });
+    },
+    // 鏂板
+    onAdd() {
+      Object.assign(this.form, this.$options.data().form);
+      this.form.id && this.$delete(this.form, "id");
+    },
+    // 缂栬緫
+    onEdit(row) {
+      this.form = { ...row };
+    },
+    // 閲嶇疆
+    handleRest() {
+      this.$refs.form.resetFields();
+    },
+    // 鍏抽棴
+    handleClose() {
+      this.$refs.form.resetFields();
+      this.Visible = false;
+    },
+    // 鍒囨崲绛栫暐
+    changeExcuteStrategy(val) {
+      if (val == 1) {
+        this.form.excuteDate = 0;
+      } else {
+        this.form.excuteDate = "";
+      }
+      if (val == 4) {
+        this.form.excuteTime = "";
+      }
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+/deep/.el-select {
+  width: 100%;
+}
+</style>
\ No newline at end of file
diff --git a/sample-form-manager-ui/admin/src/router/index.js b/sample-form-manager-ui/admin/src/router/index.js
index 4ce75ca6235cfec6b48b3d490daad96b1dbabea1..ae7e77e8f5ab8e47a6dafcb94541cc035b4c8ced 100644
--- a/sample-form-manager-ui/admin/src/router/index.js
+++ b/sample-form-manager-ui/admin/src/router/index.js
@@ -137,12 +137,53 @@ const dynamicRouter = [
       },
     ],
   },
+  {
+    path: "/system",
+    component: Layouts,
+    meta: {
+      icon: "el-icon-data-board",
+      title: "绯荤粺璁剧疆",
+    },
+    children: [
+      {
+        path: "",
+        component: () => import("@/pages/system/System.vue"),
+        redirect: "/system/parameter",
+        children: [
+          {
+            path: "/system/parameter",
+            component: () => import("@/pages/system/parameter/Parameter.vue"),
+            meta: {
+              activeMenu: "/system",
+              hidden: true,
+            },
+          },
+          {
+            path: "/system/task",
+            component: () => import("@/pages/system/task/TaskSet.vue"),
+            meta: {
+              activeMenu: "/system",
+              hidden: true,
+            },
+          },
+          {
+            path: "/system/systemlogs",
+            component: () => import("@/pages/system/systemlogs/SystemLogs.vue"),
+            meta: {
+              activeMenu: "/system",
+              hidden: true,
+            },
+          },
+        ],
+      },
+    ],
+  },
 ];
 
 // 杩囨护鑿滃崟
 function menusFilter(arr) {
   let router = arr.filter((v) => {
-    if (v.meta && v.meta.title) {
+    if (v.meta && !v.meta.hidden) {
       if (v.children) {
         v.children = menusFilter(v.children);
       }