From db6c8388b3493c5f5a7d2582480f9c1d2cb1a59a Mon Sep 17 00:00:00 2001 From: zmj <1493694146@qq.com> Date: Thu, 4 Jul 2024 10:11:38 +0800 Subject: [PATCH] add --- package-lock.json | 98 ++++++++ src/components/generateTable/genBtn.vue | 39 +++ src/components/generateTable/index.vue | 236 ++++++++++++++++++ .../components/header/user-drop-down.vue | 2 +- src/views/workbench/{index.vue => index..vue} | 0 src/views/workbench/index2.vue | 25 ++ src/views/workbench/index3.vue | 220 ++++++++++++++++ 7 files changed, 619 insertions(+), 1 deletion(-) create mode 100644 src/components/generateTable/genBtn.vue create mode 100644 src/components/generateTable/index.vue rename src/views/workbench/{index.vue => index..vue} (100%) create mode 100644 src/views/workbench/index2.vue create mode 100644 src/views/workbench/index3.vue diff --git a/package-lock.json b/package-lock.json index c7558e2..ef8d5fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "MIT", "dependencies": { "@element-plus/icons-vue": "^2.0.6", + "@form-create/element-ui": "^3.2.0", "@highlightjs/vue-plugin": "^2.1.0", "@wangeditor/editor": "^5.1.12", "@wangeditor/editor-for-vue": "^5.1.12", @@ -704,6 +705,103 @@ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" }, + "node_modules/@form-create/component-elm-checkbox": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/@form-create/component-elm-checkbox/-/component-elm-checkbox-3.2.0.tgz", + "integrity": "sha512-6F6iWzTf0+km4cGKTS8GGe8vXl7Goao2GdmwZWBOG0tsMrx52m/ZGgcWCYHqKx3zkibPpXdqyxuMnLYvb1epfw==", + "dependencies": { + "@form-create/utils": "^3.2.0" + } + }, + "node_modules/@form-create/component-elm-frame": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/@form-create/component-elm-frame/-/component-elm-frame-3.2.0.tgz", + "integrity": "sha512-XJnYRwZBaViqSF4oQpPucmQiMctG9mAPeNpggUJG8rYZv/IxPb4qNovWaZsqfiCY8wyKtRTkWqqZFe9r9ubGUg==", + "dependencies": { + "@form-create/utils": "^3.2.0" + } + }, + "node_modules/@form-create/component-elm-group": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/@form-create/component-elm-group/-/component-elm-group-3.2.0.tgz", + "integrity": "sha512-3Vjdi/zro0HCOnsb2LgQQy7V+vcJxJNrDMn0npYjqARN/ragovHrdSAUqIZ4Ixelo/q3+6vr488tW/SCQjFUSg==", + "dependencies": { + "@form-create/utils": "^3.2.0" + } + }, + "node_modules/@form-create/component-elm-radio": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/@form-create/component-elm-radio/-/component-elm-radio-3.2.0.tgz", + "integrity": "sha512-oIdkRxFQmwcN2fZDZul0qgIPHjb/0RvrmnZsDU2PYG7aJjxfGY1ZTdtyW21q3Un1ug7FircwqZK7zlbrVXMOWw==", + "dependencies": { + "@form-create/utils": "^3.2.0" + } + }, + "node_modules/@form-create/component-elm-select": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/@form-create/component-elm-select/-/component-elm-select-3.2.0.tgz", + "integrity": "sha512-jzrrUyLSVDRZHTap3MYVqNub/A00X+hpLn2DCiFj6hNPZC63fuScHhIKWjkQSF4KBDGPYNfi69kFI7SCYPhhjQ==", + "dependencies": { + "@form-create/utils": "^3.2.0" + } + }, + "node_modules/@form-create/component-elm-tree": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/@form-create/component-elm-tree/-/component-elm-tree-3.2.0.tgz", + "integrity": "sha512-7Cc6XaRcIc88XuOVs8pVHg9uuoByGqa56f8bQy05GsyQTBESV7tIXY78qWXCuDvc+MzE9BtTD7EEdK1YONqYmQ==", + "dependencies": { + "@form-create/utils": "^3.2.0" + } + }, + "node_modules/@form-create/component-elm-upload": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/@form-create/component-elm-upload/-/component-elm-upload-3.2.0.tgz", + "integrity": "sha512-gg/195vj5PDi1U+0KBOXArTzYnwW63fxlRHyNpb8uolD+Bf9mGwAyLu9V1IfjFSyR33zw6ftQ7K8Q5W2HvN6CA==", + "dependencies": { + "@form-create/utils": "^3.2.0" + } + }, + "node_modules/@form-create/component-subform": { + "version": "3.1.34", + "resolved": "https://registry.npmmirror.com/@form-create/component-subform/-/component-subform-3.1.34.tgz", + "integrity": "sha512-OJcFH/7MTHx7JLEjDK/weS27qfuFWAI+OK+gXTJ2jIt9aZkGWF/EWkjetiJLt5a0KMw4Z15wOS2XCY9pVK9vlA==" + }, + "node_modules/@form-create/core": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/@form-create/core/-/core-3.2.0.tgz", + "integrity": "sha512-Mp/rxbbvBN1SXfIgpmJeRAgzhlNebCjUnzOzmUg9BvpZeKoxCiBkqDnqRfohMoBNTjDjUtg37WoiyDuzi4L0DQ==", + "dependencies": { + "@form-create/utils": "^3.2.0" + }, + "peerDependencies": { + "vue": "^3.1.0" + } + }, + "node_modules/@form-create/element-ui": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/@form-create/element-ui/-/element-ui-3.2.0.tgz", + "integrity": "sha512-r722YiMbSog6yN9rJxA6BdutExEj4ukHyTMAISnEDuwgCgy90oDXp4fSUHUscA6AqLh1+SKK5Rl3RMbp6jLzaA==", + "dependencies": { + "@form-create/component-elm-checkbox": "^3.2.0", + "@form-create/component-elm-frame": "^3.2.0", + "@form-create/component-elm-group": "^3.2.0", + "@form-create/component-elm-radio": "^3.2.0", + "@form-create/component-elm-select": "^3.2.0", + "@form-create/component-elm-tree": "^3.2.0", + "@form-create/component-elm-upload": "^3.2.0", + "@form-create/component-subform": "^3.1.34", + "@form-create/core": "^3.2.0", + "@form-create/utils": "^3.2.0" + }, + "peerDependencies": { + "vue": "^3.1.0" + } + }, + "node_modules/@form-create/utils": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/@form-create/utils/-/utils-3.2.0.tgz", + "integrity": "sha512-fqc7/l+US76NhloxMF3xE7UafYgxA8jU+t5WrAhmjaIAJ0vUNp6ScL/kdwN4nfOvjByZ/Q8BFQT0wqrp4lcgtw==" + }, "node_modules/@highlightjs/vue-plugin": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@highlightjs/vue-plugin/-/vue-plugin-2.1.0.tgz", diff --git a/src/components/generateTable/genBtn.vue b/src/components/generateTable/genBtn.vue new file mode 100644 index 0000000..86e1321 --- /dev/null +++ b/src/components/generateTable/genBtn.vue @@ -0,0 +1,39 @@ +<template> + <el-button :type="config.type" :size="config.size" @click="emetClikc(config.click)"> + <template #icon v-if="config.icon"> + <icon :name="config.icon" /> + </template> + {{ config.label }} + </el-button> +</template> +<script setup> +import { defineProps, defineEmits } from 'vue' +const props = defineProps({ + config: { + type: Object, + default: () => { } + } +}) + + +const emits = defineEmits(['add', 'edit', 'del']) + +const emetClikc = (event) => { + switch (event) { + case 'handleCreate': + emits("add"); + break; + case 'handleUpdate': + emits("edit"); + break; + default: + emits("del"); + break; + } + // emit(props.config.click) + +} + + + +</script> \ No newline at end of file diff --git a/src/components/generateTable/index.vue b/src/components/generateTable/index.vue new file mode 100644 index 0000000..312a0ed --- /dev/null +++ b/src/components/generateTable/index.vue @@ -0,0 +1,236 @@ + +<!-- <template> + <el-card class="!border-none" shadow="never"> + <el-form class="mb-[-16px]" :model="queryParams" inline> + <el-form-item :label="item.label" v-for="(item, index) in config.serchList" :key="index"> + <el-select v-model="queryParams[item.value]" v-if="item.select" :disabled="isDisabled(item.value)"> + <el-option :label="i.name" :value="i.value" v-for="i in item.select" + v-if="Array.isArray(item.select)"></el-option> + <el-option v-for="(i, index) in dictData[item.select]" :key="index" :label="i.name" + :value="parseInt(i.value)" v-else /> + </el-select> + <el-input class="w-[280px]" v-model="queryParams[item.value]" clearable :placeholder="`请输入${item.label}`" + v-else /> + </el-form-item> + <el-form-item> + <el-button type="primary" @click="resetPage">查询</el-button> + <el-button @click="resetParams">重置</el-button> + </el-form-item> + </el-form> + </el-card> + + + <el-card class="!border-none mt-5" v-loading="pager.loading" shadow="never"> + <div class="mt-4"> + <el-table :data="pager.lists" @cell-click="handleCurrentChange" row-key="id" + @selection-change="handleSelectionChange"> + + <el-table-column type="selection" width="55" v-if="multipleChoice" /> + <el-table-column :label="item[(Object.keys(item))[0]]" show-overflow-tooltip + v-for="item in config.tableList "> + <template #default="{ row }"> + {{ (Object.keys(item))[0].includes('.') ? + row[(Object.keys(item))[0].split(".")[0]][(Object.keys(item))[0].split(".")[1]] : + row[(Object.keys(item))[0]] }} + </template> + </el-table-column> + </el-table> + </div> + <div class="flex justify-end mt-4"> + <pagination v-model="pager" @change="getLists" /> + </div> + <div class="flex justify-end mt-4" v-if="multipleChoice"> + <el-button type="primary" @click="confirm">确定</el-button> + </div> + </el-card> +</template> + +<script lang="ts" setup> +import { usePaging } from "@/hooks/usePaging" +import { defineEmits } from "vue" +import { useDictData } from '@/hooks/useDictOptions' + +const props = defineProps({ + config: { + type: Object, + required: true + }, + query: Object, + multipleChoice: Boolean +}) + + +/**根据传入的config生成queryParmas */ +const getParmasFn = () => { + const arr = props.config.serchList.map((item: any) => (item.value)) + const result = arr.reduce((acc: any, curr: any) => { + acc[curr] = ''; + return acc; + }, {}); + const mergedObj = Object.assign({}, result, props.query); + return mergedObj +} + + +/**判断是否需要disabled的搜索框*/ +const isDisabled = (key: String) => { + if (!props.query) return + return Object.keys(props.query).includes(key) +} + + +// 查询条件 +const queryParams = reactive({ + ...getParmasFn() +}); + +// const { dictData } = useDictData(props.config.dictData) + +// 选中数据 +const emits = defineEmits(["customEvent"]); + +// 选中数据子父传递 +const handleCurrentChange = (value: any) => { + if (props.multipleChoice) return + emits("customEvent", value); +}; + +// 多选 +const multipleSelection = ref([]) + +const handleSelectionChange = (val: any) => { + multipleSelection.value = val +} + +const confirm = () => { + emits("customEvent", multipleSelection.value); +} + + +// 分页相关 +const { pager, getLists, resetParams, resetPage } = usePaging({ + fetchFun: props.config.fetchFn, + params: queryParams, +}); + +getLists(); +</script> --> + +<template> + {{ queryParams }} + <el-card class="!border-none" shadow="never"> + <el-form class="mb-[-16px]" :model="queryParams" inline> + <el-form-item :label="item.title" v-for="(item, index) in config.search" :key="index"> + <el-input class="w-[280px]" v-model="queryParams[item.field]" clearable + :placeholder="item.props.placeholder" v-if="item.type == 'input'" /> + <el-select v-if="item.type == 'select'" v-model="queryParams[item.field]"> + <el-option :label="i.label" :value="i.value" v-for="i in item.options"></el-option> + </el-select> + </el-form-item> + <el-form-item> + <el-button type="primary" @click="resetPage">查询</el-button> + <el-button @click="resetParams">重置</el-button> + </el-form-item> + </el-form> + </el-card> + <el-card class="!border-none mt-5" shadow="never"> + <genBtn :config="btn" v-for="btn in config.actions" @add="handAdd" /> + <div class="mt-4"> + <el-table :data="pager.lists"> + <el-table-column :label="item.label" :prop="item.prop" v-show="item.show" show-overflow-tooltip + v-for="item in config.headers" :width="item.width && item.width" :fixed="item.fixed && item.fixed"> + <!-- 图片 --> + <template #default="{ row }" v-if="item.component"> + <el-image + :style="{ width: item.component[0].options.width, height: item.component[0].options.height }" + :src="row[item.prop]" /> + </template> + <!-- 图片结束 --> + + <!-- 操作按钮 --> + <template #default="{ row }" v-if="item.action"> + <genBtn :config="btn" v-for="btn in item.action" @edit="handEdit(row)" @del="handDel(row)" /> + </template> + <!-- 操作按钮结束 --> + + </el-table-column> + </el-table> + </div> + <div class="flex justify-end mt-4"> + <pagination v-model="pager" @change="getLists" /> + </div> + </el-card> +</template> + +<script setup name="asd"> +import { defineEmits, defineProps, ref, reactive } from "vue" +import genBtn from "./genBtn.vue" +import { usePaging } from "@/hooks/usePaging" + +const props = defineProps({ + config: { + type: Object, + required: true + }, + tabFetchFn: { + type: Function, + required: true + } +}) + + +/**根据传入的config.serch生成queryParmas,主要用于重置按钮 */ +const getParmasFn = () => { + const arr = props.config.search.map((item) => (item.field)) + const result = arr.reduce((acc, curr) => { + acc[curr] = ''; + return acc; + }, {}); + const mergedObj = Object.assign({}, result, props.query); + + return mergedObj +} + + + +const queryParams = reactive( + { + ...getParmasFn() + } +) + +// 分页相关 +const { pager, getLists, resetParams, resetPage } = usePaging({ + fetchFun: props.tabFetchFn, + params: queryParams, +}); + + + +//add +const handAdd = () => { + // console.log9 + alert("add") +} + +// edit +const handEdit = (row) => { + console.log(row) +} + + +// del +const handdEL = (row) => { + console.log('DEL') +} + + + + + + + + + +getLists(); +</script> diff --git a/src/layout/default/components/header/user-drop-down.vue b/src/layout/default/components/header/user-drop-down.vue index 371bfda..2077ede 100644 --- a/src/layout/default/components/header/user-drop-down.vue +++ b/src/layout/default/components/header/user-drop-down.vue @@ -2,7 +2,7 @@ <el-dropdown class="px-2" @command="handleCommand"> <div class="flex items-center"> <el-avatar :size="34" :src="userInfo.avatar" /> - <div class="ml-3 mr-1">{{ userInfo.name }}</div> + <div class="ml-3 mr-1">{{ userInfo.staff_name }}</div> <icon name="el-icon-ArrowDown" /> </div> diff --git a/src/views/workbench/index.vue b/src/views/workbench/index..vue similarity index 100% rename from src/views/workbench/index.vue rename to src/views/workbench/index..vue diff --git a/src/views/workbench/index2.vue b/src/views/workbench/index2.vue new file mode 100644 index 0000000..57e05ed --- /dev/null +++ b/src/views/workbench/index2.vue @@ -0,0 +1,25 @@ +<template> + <generateTable v-if="config.ref" :config="config" :tabFetchFn="apiGoodsListLists"></generateTable> +</template> +<script setup> +import { apiDeliveryLists } from "@/api/delivery"; +import { ref, reactive } from "vue" +import axios from "axios" +import { apiGoodsListLists } from '@/api/goodsList' + +const config = ref({}) +axios.get('http://192.168.1.22:8544/index/view ') + .then(function (response) { + config.value = response.data + // 处理成功情况 + console.log(response.data); + }) + .catch(function (error) { + // 处理错误情况 + console.log(error); + }) + .finally(function () { + // 总是会执行 + }); +</script> + diff --git a/src/views/workbench/index3.vue b/src/views/workbench/index3.vue new file mode 100644 index 0000000..c51341f --- /dev/null +++ b/src/views/workbench/index3.vue @@ -0,0 +1,220 @@ +<!-- + * @Author: oneMiu + * @Date: 2022-05-17 14:33:56 + * @LastEditors: oneMiu + * @LastEditTime: 2022-05-18 11:30:03 + * @Desc: +--> + +<template> + <section> + <FormCreate v-model="fApi" :rule="rule" :option="option" /> + </section> +</template> +<script lang="ts"> +import { + defineComponent, + ref, + onMounted +} from "vue"; +export default defineComponent({ + name: "FormCreateFoarmat", + peops: ["formJson"], + setup(props, { emit }) { + let fApi = ref({}) + console.log(props.formJson) + let rule = ref([{ + "type": "select", // 生成组件的名称(就是表单的名称:如input,radio,checkbox,select,slider等) + "field": "s705v90rbcg3", // 表单组件的字段名称(就是表单的name属性,注:该必须唯一),自定义组件可以不配置 + "title": "请假类型", // 组件的名称, 选填 + "info": "", //提示信息 + "effect": { + "fetch": "" + }, + "props": { + // input的表单类型 <input type="">:注:有些表单类型form-create和element-ui专门做成了组件,可以在上面的type中直接用,所以下面有些类型如(radio)在这里会无效哦!! + + // text 默认。定义单行输入字段,用户可在其中输入文本。默认是 20 个字符。 + // button 定义可点击的按钮(大多与 JavaScript 使用来启动脚本) + // checkbox 定义复选框。 + // color 定义拾色器。 + // date 定义日期字段(带有 calendar 控件) + // datetime 定义日期字段(带有 calendar 和 time 控件) + // datetime-local 定义日期字段(带有 calendar 和 time 控件) + // month 定义日期字段的月(带有 calendar 控件) + // week 定义日期字段的周(带有 calendar 控件) + // time 定义日期字段的时、分、秒(带有 time 控件) + // email 定义用于 e-mail 地址的文本字段 + // file 定义输入字段和 "浏览..." 按钮,供文件上传 + // hidden 定义隐藏输入字段 + // image 定义图像作为提交按钮 + // number 定义带有 spinner 控件的数字字段 + // password 定义密码字段。字段中的字符会被遮蔽。 + // radio 定义单选按钮。 + // range 定义带有 slider 控件的数字字段。 + // reset 定义重置按钮。重置按钮会将所有表单字段重置为初始值。 + // search 定义用于搜索的文本字段。 + // submit 定义提交按钮。提交按钮向服务器发送数据。 + // tel 定义用于电话号码的文本字段。 + // url 定义用于 URL 的文本字段。 + "clearable": true + }, + "options": [{ + "value": "1", + "label": "事假" + }, + { + "value": "2", + "label": "调休" + }, + { + "label": "病假", + "value": "3" + }, + { + "label": "年假", + "value": "4" + }, + { + "label": "产假", + "value": "5" + }, + { + "label": "陪产假", + "value": "6" + }, + { + "label": "婚嫁", + "value": "7" + }, + { + "label": "例假", + "value": "8" + }, + { + "label": "丧假", + "value": "9" + }, + { + "label": "哺乳假", + "value": "10" + } + ], + "_fc_drag_tag": "select", + "hidden": false, + "display": true, + "$required": "" + }, + { + "type": "datePicker", + "field": "7su1moi7tfy8o", + "title": "开始时间", + "info": "", + "props": { + "type": "datetime", + "placeholder": "请选择开始时间" + }, + "_fc_drag_tag": "datePicker", + "hidden": false, + "display": true, + "$required": "请选择开始时间" + }, + { + "type": "datePicker", + "field": "3wm1moi7vuyvt", + "title": "结束时间", + "info": "", + "props": { + "type": "datetime", + "placeholder": "请选择结束时间" + }, + "_fc_drag_tag": "datePicker", + "hidden": false, + "display": true, + "$required": "请选择结束时间" + }, + { + "type": "input", + "field": "dyg1moi7xxx16", + "title": "时长(小时)", + "info": "", + "props": { + "type": "number", + "placeholder": "请输入时长", + "readonly": true + }, + "_fc_drag_tag": "input", + "hidden": false, + "display": true, + "$required": "请输入时长" + }, + { + "type": "input", + "field": "3qs1moi80lnhh", + "title": "请假事由", + "info": "", + "props": { + "type": "textarea", + "placeholder": "请输入请假事由", + "rows": 3 + }, + "_fc_drag_tag": "input", + "hidden": false, + "display": true, + "$required": "" + } + ]) + let option = ref({ + // 显示重置表单按扭 + resetBtn: true, + + // 表单提交按扭事件 + onSubmit: formData => { + // alert(JSON.stringify(formData)); + + // console.log("获取表单中的数据:", formData); + emit('submitForm', formData) + //按钮进入提交状态 + // this.fApi.btn.loading(); + + //重置按钮禁用 + // this.fApi.resetBtn.disabled(); + + //按钮进入可点击状态 + // this.fApi.btn.finish(); + } + }) + //获取Form表单 model对象 + function getFormModelFn() { + console.log("Form表单 model对象:", this.fApi.model()); + } + + function getUserNameChange(e) { + this.$nextTick(() => { + this.rule[2].value = this.rule[0].value; + }); + console.log(this.fApi.getValue("userName")); + } + onMounted(() => { + + }); + return { + option, + getFormModelFn, + rule, + fApi + }; + }, +}); +</script> +<style scoped> +.el-form { + padding: 20px 30px 20px 0; + width: 100vw; + height: 500px; + overflow-y: scroll; + height: calc(100vh - 100px); + background-color: #fff; +} +</style> +