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); }