From d4cb3d99f5a17132ed1ff5e6a9a5b218a68df2fc Mon Sep 17 00:00:00 2001 From: JINGYJ <1458671527@qq.com> Date: Fri, 28 Jun 2024 17:54:03 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=9A=E5=8A=A1=E7=AE=A1=E7=90=86=20?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2=E5=BC=80?= =?UTF-8?q?=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/createForm.vue | 339 ++++++++++++++++++ .../processConfiguration/index.vue | 152 +------- .../dictionaryManagement/columns.tsx | 51 +++ .../dictionaryManagement/index.vue | 113 +++--- .../sublibraryManagement/index.vue | 6 +- 5 files changed, 473 insertions(+), 188 deletions(-) create mode 100644 src/views/businessManagement/processConfiguration/components/createForm.vue create mode 100644 src/views/systemManagement/dictionaryManagement/columns.tsx diff --git a/src/views/businessManagement/processConfiguration/components/createForm.vue b/src/views/businessManagement/processConfiguration/components/createForm.vue new file mode 100644 index 0000000..23a40c0 --- /dev/null +++ b/src/views/businessManagement/processConfiguration/components/createForm.vue @@ -0,0 +1,339 @@ +<script setup lang="ts"> +import { reactive, ref, watch } from "vue"; +import { FormInstance, FormRules, type CheckboxValueType } from "element-plus"; +defineOptions({ + name: "CreateForm" +}); + +const props = defineProps({ + createFlag: { + type: Boolean, + default: false + }, + closeDrawer: { + type: Function + } +}); +const modalVisible = ref(false); + +// 监听 props.message 的变化,并更新 modalVisible +watch( + () => props.createFlag, + newValue => { + modalVisible.value = newValue; // 更新 modalVisible + } +); +const ruleFormRef = ref<FormInstance>(); +const processForm = reactive({ + title: "", + sublibraryName: [], + dataType: "", + link: [ + { + linkName: "", + directorRole: "", + directorName: "" + } + ], + desc: "" +}); +const checkAll = ref(false); +const indeterminate = ref(false); +const value = ref<CheckboxValueType[]>([]); +const cities = ref([ + { + value: "Beijing", + label: "Beijing" + }, + { + value: "Shanghai", + label: "Shanghai" + }, + { + value: "Nanjing", + label: "Nanjing" + }, + { + value: "Chengdu", + label: "Chengdu" + }, + { + value: "Shenzhen", + label: "Shenzhen" + }, + { + value: "Guangzhou", + label: "Guangzhou" + } +]); +const rules = reactive<FormRules>({ + title: [{ required: true, message: "请输入", trigger: "blur" }], + sublibraryName: [ + { + required: true, + message: "请选择", + trigger: "change" + } + ], + dataType: [ + { + required: true, + message: "请选择", + trigger: "change" + } + ], + linkName: [{ required: true, message: "请输入", trigger: "blur" }], + directorRole: [ + { + required: true, + message: "请选择", + trigger: "change" + } + ], + directorName: [ + { + required: true, + message: "请选择", + trigger: "change" + } + ], + desc: [{ required: true, message: "请输入", trigger: "blur" }] +}); + +watch(value, val => { + if (val.length === 0) { + checkAll.value = false; + indeterminate.value = false; + } else if (val.length === cities.value.length) { + checkAll.value = true; + indeterminate.value = false; + } else { + indeterminate.value = true; + } +}); + +const handleCheckAll = (val: CheckboxValueType) => { + indeterminate.value = false; + if (val) { + processForm.sublibraryName = cities.value.map(_ => _.value); + } else { + processForm.sublibraryName = []; + } +}; +// const submitForm = () => { +// props.closeDrawer(); +// }; +const submitForm = async (formEl: FormInstance | undefined) => { + if (!formEl) return; + await formEl.validate((valid, fields) => { + if (valid) { + console.log("submit!"); + } else { + console.log("error submit!", fields); + } + }); +}; +const resetForm = (formEl: FormInstance | undefined) => { + if (!formEl) return; + formEl.resetFields(); +}; +const handleDrawerClosed = () => { + props.closeDrawer(); +}; +const addLink = () => { + processForm.link.push({ + linkName: "", + directorRole: "", + directorName: "" + }); +}; +</script> + +<template> + <div> + <el-drawer + v-model="modalVisible" + modal-class="drawer_content" + :with-header="false" + @closed="handleDrawerClosed" + > + <div class="drawer_header"> + <span>新建流程</span> + </div> + <div class="drawer_box"> + <el-form + :model="processForm" + label-width="auto" + :rules="rules" + ref="ruleFormRef" + > + <div class="text-[20px] text-[#333] font-bold mb-6">基本信息</div> + <el-form-item label="流程名称" prop="title"> + <el-input + v-model="processForm.title" + autocomplete="off" + placeholder="请输入" + /> + </el-form-item> + <el-form-item label="子库名称" prop="sublibraryName"> + <el-select + v-model="processForm.sublibraryName" + multiple + clearable + collapse-tags + popper-class="custom-header" + :max-collapse-tags="3" + placeholder="请选择" + class="w-[80%]" + > + <el-option + v-for="item in cities" + :key="item.value" + :label="item.label" + :value="item.value" + /> + </el-select> + <el-checkbox + class="ml-6" + v-model="checkAll" + :indeterminate="indeterminate" + @change="handleCheckAll" + > + 全部 + </el-checkbox> + </el-form-item> + <el-form-item label="数据类型" prop="dataType"> + <el-radio-group v-model="processForm.dataType"> + <el-radio label="1">知识报送</el-radio> + <el-radio label="2">知识删除</el-radio> + <el-radio label="3">知识撤回</el-radio> + </el-radio-group> + </el-form-item> + <div class="text-[20px] text-[#333] font-bold mb-6">流程设计</div> + <div v-for="(item, index) in processForm.link" :key="index"> + <el-form-item + label="环节名称" + :prop="'link.' + index + '.linkName'" + :rules="{ + required: true, + message: '请输入', + trigger: 'blur' + }" + > + <el-input + v-model="item.linkName" + autocomplete="off" + placeholder="请输入" + /> + </el-form-item> + <el-form-item label="负责人" required> + <el-col :span="8"> + <el-form-item + :prop="'link.' + index + '.directorRole'" + :rules="{ + required: true, + message: '请选择', + trigger: 'change' + }" + > + <el-select + v-model="item.directorRole" + clearable + popper-class="custom-header" + placeholder="请选择" + class="w-[100%]" + > + <el-option + v-for="item in cities" + :key="item.value" + :label="item.label" + :value="item.value" + /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="2" class="text-center" /> + <el-col :span="14"> + <el-form-item + :prop="'link.' + index + '.directorName'" + :rules="{ + required: true, + message: '请选择', + trigger: 'change' + }" + > + <el-select + v-model="item.directorName" + clearable + popper-class="custom-header" + placeholder="请选择" + class="w-[100%]" + > + <el-option + v-for="item in cities" + :key="item.value" + :label="item.label" + :value="item.value" + /> + </el-select> + </el-form-item> + </el-col> + </el-form-item> + <el-divider + border-style="double" + v-if="index < processForm.link.length - 1" + /> + </div> + <el-form-item label=" "> + <el-button @click="addLink">+添加审批环节</el-button> + </el-form-item> + <el-form-item label="备注" prop="desc"> + <el-input v-model="processForm.desc" type="textarea" /> + </el-form-item> + </el-form> + <div class="drawer_footer"> + <el-button plain @click="resetForm(ruleFormRef)">重置</el-button> + <el-button type="primary" @click="submitForm(ruleFormRef)" + >确定</el-button + > + </div> + </div> + </el-drawer> + </div> +</template> + +<style lang="scss" scoped> +:deep(.el-drawer__body) { + padding: 0 !important; +} + +.drawer_content { + .drawer_header { + box-sizing: border-box; + height: 96px; + padding: 24px; + line-height: 65px; + border-bottom: 1px solid #e9e9e9; + + span { + padding-left: 8px; + font-size: 20px; + border-left: 6px solid #0052d9; + } + } + + .drawer_box { + box-sizing: border-box; + display: flex; + flex-direction: column; + justify-content: space-between; + height: calc(100vh - 96px); + padding: 24px; + + .drawer_footer { + display: flex; + justify-content: flex-end; + } + } +} +</style> diff --git a/src/views/businessManagement/processConfiguration/index.vue b/src/views/businessManagement/processConfiguration/index.vue index eb97337..bcbdc5a 100644 --- a/src/views/businessManagement/processConfiguration/index.vue +++ b/src/views/businessManagement/processConfiguration/index.vue @@ -1,6 +1,6 @@ <script setup lang="ts"> -import { reactive, ref, watch } from "vue"; -import type { CheckboxValueType } from "element-plus"; +import { reactive, ref } from "vue"; +import CreateForm from "./components/createForm.vue"; defineOptions({ name: "ProcessConfiguration" }); @@ -9,11 +9,6 @@ const seachForm = reactive({ publishDeptName: "", status: "" }); -const processForm = reactive({ - title: "", - publishDeptName: "", - status: "" -}); const pagination = reactive({ total: 0, pageSize: 10, @@ -65,59 +60,12 @@ const create = () => { createFlag.value = true; // search(); }; +const closeDrawer = () => { + createFlag.value = false; +}; // const changeStatus = item => { // seachForm.status = item.id; // }; -const checkAll = ref(false); -const indeterminate = ref(false); -const value = ref<CheckboxValueType[]>([]); -const cities = ref([ - { - value: "Beijing", - label: "Beijing" - }, - { - value: "Shanghai", - label: "Shanghai" - }, - { - value: "Nanjing", - label: "Nanjing" - }, - { - value: "Chengdu", - label: "Chengdu" - }, - { - value: "Shenzhen", - label: "Shenzhen" - }, - { - value: "Guangzhou", - label: "Guangzhou" - } -]); - -watch(value, val => { - if (val.length === 0) { - checkAll.value = false; - indeterminate.value = false; - } else if (val.length === cities.value.length) { - checkAll.value = true; - indeterminate.value = false; - } else { - indeterminate.value = true; - } -}); - -const handleCheckAll = (val: CheckboxValueType) => { - indeterminate.value = false; - if (val) { - value.value = cities.value.map(_ => _.value); - } else { - value.value = []; - } -}; </script> <template> @@ -152,62 +100,14 @@ const handleCheckAll = (val: CheckboxValueType) => { color: 'var(--el-text-color-primary)' }" > - <template #operation="{ row }"> + <!-- <template #operation="{ row }"> <el-button link type="danger" @click="handleDelete(row)"> 删除 </el-button> - </template></pure-table - > + </template> --> + </pure-table> </div> - <el-drawer - v-model="createFlag" - modal-class="drawer_content" - :with-header="false" - > - <div class="drawer_header"> - <span>新建流程</span> - </div> - <div class="drawer_box"> - <el-form :model="processForm"> - <el-form-item label="子库名称"> - <el-input v-model="processForm.title" autocomplete="off" /> - </el-form-item> - <el-form-item label="子库编码"> - <el-input v-model="processForm.title" autocomplete="off" /> - </el-form-item> - <el-form-item label="关联部门"> - <el-select - v-model="value" - multiple - clearable - collapse-tags - placeholder="Select" - popper-class="custom-header" - :max-collapse-tags="3" - style="width: 240px" - > - <el-option - v-for="item in cities" - :key="item.value" - :label="item.label" - :value="item.value" - /> - </el-select> - <el-checkbox - v-model="checkAll" - :indeterminate="indeterminate" - @change="handleCheckAll" - > - All - </el-checkbox> - </el-form-item> - </el-form> - <div class="drawer_footer"> - <el-button plain>重置</el-button> - <el-button type="primary">确定</el-button> - </div> - </div> - </el-drawer> + <CreateForm :createFlag="createFlag" :closeDrawer="closeDrawer" /> </div> </template> <style lang="scss" scoped> @@ -222,39 +122,5 @@ const handleCheckAll = (val: CheckboxValueType) => { margin-bottom: 24px; } } - - :deep(.el-drawer__body) { - padding: 0 !important; - } - - .drawer_content { - .drawer_header { - box-sizing: border-box; - height: 96px; - padding: 24px; - line-height: 65px; - border-bottom: 1px solid #e9e9e9; - - span { - padding-left: 8px; - font-size: 20px; - border-left: 6px solid #0052d9; - } - } - - .drawer_box { - box-sizing: border-box; - display: flex; - flex-direction: column; - justify-content: space-between; - height: calc(100vh - 96px); - padding: 24px; - - .drawer_footer { - display: flex; - justify-content: flex-end; - } - } - } } </style> diff --git a/src/views/systemManagement/dictionaryManagement/columns.tsx b/src/views/systemManagement/dictionaryManagement/columns.tsx new file mode 100644 index 0000000..c975964 --- /dev/null +++ b/src/views/systemManagement/dictionaryManagement/columns.tsx @@ -0,0 +1,51 @@ +import { ref } from "vue"; + +export function useColumns() { + const dataList1 = ref([]); + + const columns1: TableColumnList = [ + { + label: "字典标签", + prop: "name", + cellRenderer: ({ row }) => <el-input v-model={row.name} /> + }, + { + label: "字典数值", + prop: "name", + cellRenderer: ({ row }) => <el-input v-model={row.name} /> + }, + { + label: "字典排序", + prop: "name", + cellRenderer: ({ row }) => <el-input v-model={row.name} /> + }, + { + label: "操作", + fixed: "right", + width: 90, + slot: "operation" + } + ]; + + function onAdd() { + dataList1.value.push({ + id: dataList1.value.length + 1, + name: "", + sex: 0, + hobby: "", + date: "" + }); + } + + function onDel(row) { + const index = dataList1.value.indexOf(row); + if (index !== -1) dataList1.value.splice(index, 1); + } + + return { + columns1, + dataList1, + onAdd, + onDel + }; +} diff --git a/src/views/systemManagement/dictionaryManagement/index.vue b/src/views/systemManagement/dictionaryManagement/index.vue index b5ed1ae..effa254 100644 --- a/src/views/systemManagement/dictionaryManagement/index.vue +++ b/src/views/systemManagement/dictionaryManagement/index.vue @@ -1,9 +1,14 @@ <script setup lang="ts"> import { reactive, ref, watch } from "vue"; import type { CheckboxValueType } from "element-plus"; +import { useColumns } from "./columns"; +import { useRenderIcon } from "@/components/ReIcon/src/hooks"; +import AddFill from "@iconify-icons/ep/plus"; +import Delete from "@iconify-icons/ep/delete"; defineOptions({ name: "DictionaryManagement" }); +const { columns1, dataList1, onAdd, onDel } = useColumns(); const seachForm = reactive({ title: "", publishDeptName: "", @@ -11,8 +16,8 @@ const seachForm = reactive({ }); const dictionaryForm = reactive({ title: "", - publishDeptName: "", - status: "" + code: "", + desc: "" }); const pagination = reactive({ total: 0, @@ -60,9 +65,10 @@ const reset = () => { // search(); }; const createFlag = ref(false); +const updateFlag = ref(false); const create = () => { - createFlag.value = true; + updateFlag.value = true; // search(); }; // const changeStatus = item => { @@ -109,15 +115,6 @@ watch(value, val => { indeterminate.value = true; } }); - -const handleCheckAll = (val: CheckboxValueType) => { - indeterminate.value = false; - if (val) { - value.value = cities.value.map(_ => _.value); - } else { - value.value = []; - } -}; </script> <template> @@ -139,7 +136,7 @@ const handleCheckAll = (val: CheckboxValueType) => { <div class="main-table"> <div class="main-table-header"> <div class="header-btn"> - <el-button @click="create" type="primary">新建子库</el-button> + <el-button @click="create" type="primary">新建字典</el-button> </div> </div> <pure-table @@ -152,12 +149,12 @@ const handleCheckAll = (val: CheckboxValueType) => { color: 'var(--el-text-color-primary)' }" > - <template #operation="{ row }"> + <!-- <template #operation="{ row }"> <el-button link type="danger" @click="handleDelete(row)"> 删除 </el-button> - </template></pure-table - > + </template> --> + </pure-table> </div> <el-drawer v-model="createFlag" @@ -168,39 +165,71 @@ const handleCheckAll = (val: CheckboxValueType) => { <span>新建字典</span> </div> <div class="drawer_box"> - <el-form :model="dictionaryForm"> + <el-form :model="dictionaryForm" label-width="auto"> <el-form-item label="字典名称"> <el-input v-model="dictionaryForm.title" autocomplete="off" /> </el-form-item> <el-form-item label="字典编码"> + <el-input v-model="dictionaryForm.code" autocomplete="off" /> + </el-form-item> + <el-form-item label="备注"> + <el-input v-model="dictionaryForm.desc" type="textarea" /> + </el-form-item> + </el-form> + <div class="drawer_footer"> + <el-button plain>重置</el-button> + <el-button type="primary">确定</el-button> + </div> + </div> + </el-drawer> + <el-drawer + v-model="updateFlag" + modal-class="drawer_content" + :with-header="false" + > + <div class="drawer_header"> + <span>新建字典</span> + </div> + <div class="drawer_box"> + <el-form :model="dictionaryForm" label-width="auto"> + <el-form-item label="字典名称"> <el-input v-model="dictionaryForm.title" autocomplete="off" /> </el-form-item> - <el-form-item label="关联部门"> - <el-select - v-model="value" - multiple - clearable - collapse-tags - placeholder="Select" - popper-class="custom-header" - :max-collapse-tags="3" - style="width: 240px" - > - <el-option - v-for="item in cities" - :key="item.value" - :label="item.label" - :value="item.value" - /> - </el-select> - <el-checkbox - v-model="checkAll" - :indeterminate="indeterminate" - @change="handleCheckAll" + <div> + <pure-table + row-key="id" + align-whole="center" + :header-cell-style="{ + background: 'var(--el-fill-color-light)', + color: 'var(--el-text-color-primary)' + }" + :data="dataList1" + :columns="columns1" > - All - </el-checkbox> - </el-form-item> + <!-- <template #empty> + <Empty fill="var(--el-svg-monochrome-grey)" class="m-auto" /> + </template> --> + <template #append> + <el-button + plain + class="w-full my-2" + :icon="useRenderIcon(AddFill)" + @click="onAdd" + > + 添加 + </el-button> + </template> + <template #operation="{ row }"> + <el-button + class="reset-margin" + link + type="primary" + :icon="useRenderIcon(Delete)" + @click="onDel(row)" + /> + </template> + </pure-table> + </div> </el-form> <div class="drawer_footer"> <el-button plain>重置</el-button> diff --git a/src/views/systemManagement/sublibraryManagement/index.vue b/src/views/systemManagement/sublibraryManagement/index.vue index b294ef7..30e107d 100644 --- a/src/views/systemManagement/sublibraryManagement/index.vue +++ b/src/views/systemManagement/sublibraryManagement/index.vue @@ -152,12 +152,12 @@ const handleCheckAll = (val: CheckboxValueType) => { color: 'var(--el-text-color-primary)' }" > - <template #operation="{ row }"> + <!-- <template #operation="{ row }"> <el-button link type="danger" @click="handleDelete(row)"> 删除 </el-button> - </template></pure-table - > + </template> --> + </pure-table> </div> <el-drawer v-model="createFlag"