封装公共form表单

增加详情备用显示样式-描述列表
封装公共table组件
This commit is contained in:
15133876896-BGG25 2023-06-28 17:48:30 +08:00
parent cb2c4cd1ed
commit db13670743
4 changed files with 386 additions and 117 deletions

View File

@ -0,0 +1,42 @@
<!--
* @FilePath: \code\Goats-Cloud-ui\src\views\big\device\components\Wdescriptions.vue
* @Author: 王路平
* @文件版本: V1.0.0
* @Date: 2023-06-28 09:55:31
* @Description:
*
* 版权信息 : 2023 by ${再登软件}, All Rights Reserved.
-->
<template>
<el-descriptions title="" :column="2" border>
<el-descriptions-item label="名称:">{{prop.data.name}}</el-descriptions-item>
<el-descriptions-item label="设备配置:">{{prop.data.devLabel}}</el-descriptions-item>
<el-descriptions-item label="机架号:">{{prop.data.label}}</el-descriptions-item>
<el-descriptions-item label="是否网关:">
<el-tag size="small" :type="prop.data.iswangguan?'':'danger'">{{prop.data.iswangguan?'是':'否'}}</el-tag>
</el-descriptions-item>
<el-descriptions-item label="说明:"
>{{prop.data.remark}}</el-descriptions-item
>
</el-descriptions>
</template>
<script setup lang="ts">
import {ref} from "vue"
const prop = defineProps({
data:{
type:Object,
default:{
name:'',
devLabel:'',
label:'',
iswangguan:false,
remark:''
}
}
})
</script>
<style lang="scss" module>
</style>

View File

@ -8,21 +8,27 @@
* 版权信息 : 2023 by ${再登软件}, All Rights Reserved. * 版权信息 : 2023 by ${再登软件}, All Rights Reserved.
--> -->
<template> <template>
<el-form :model="data" :label-position="config.labelPosition"> <el-form :model="tempData" :label-position="config.labelPosition">
<el-form-item :label="item.label" v-for="item in config.formItem" :key="item.model" :label-width="item.labelWidth"> <el-form-item :label="item.label" v-for="item in config.formItem" :key="item.model" :label-width="item.labelWidth">
<el-input v-if="item.content.type=='input'" v-model="data[item.content.model]" :readonly="item.content.readonly" :disabled="item.content.disabled"/> <!-- // -->
<el-input v-if="item.content.type=='input'" v-model="tempData[item.content.model]" :readonly="item.content.readonly" :disabled="item.content.disabled" :type="item.content.textarea?'textarea':''"/>
<!-- 多选框配置 -->
<el-checkbox-group v-if="item.content.type=='checkbox'" v-model="tempData[item.content.model]">
<el-checkbox :label="checkItem.val" :disabled="checkItem.disabled" v-for="checkItem in item.content.value" :key="checkItem.id"/>
</el-checkbox-group>
</el-form-item> </el-form-item>
</el-form> </el-form>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {ref} from "vue" import {computed, ref} from "vue"
const prop = defineProps({ const prop = defineProps({
config: { config: {
type: Object, type: Object,
default: { default: {
labelPosition:'top', labelPosition:'top',
formItem:[{ formItem:[
{ //
label:'默认', label:'默认',
labelWidth:'120px', labelWidth:'120px',
content:{ content:{
@ -30,17 +36,41 @@ const prop = defineProps({
model:"name", model:"name",
readonly:true, readonly:true,
disabled:true, disabled:true,
textarea:false
} }
},
{ //
label:'多选',
labelWidth:'auto',
content:{
type:'checkbox',
model:"checkbox",
value:[{
id:1,
val:'多选',
disabled:true,
}] }]
}
},]
}, },
}, },
data: { data: {
type: Object, type: Object,
default: { default: {
name:'' name:'',
checkbox:[]
}, },
} }
}) })
const emit = defineEmits(['update:data'])
//
const tempData = computed({
get: () => prop.data,
set: val => {
emit('update:data', val)
}
})
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -0,0 +1,100 @@
<!--
* @FilePath: \code\Goats-Cloud-ui\src\views\big\device\components\Wtable.vue
* @Author: 王路平
* @文件版本: V1.0.0
* @Date: 2023-06-28 10:45:06
* @Description:
*
* 版权信息 : 2023 by ${再登软件}, All Rights Reserved.
-->
<template>
<div style="width: 100%; height: 100%; display: flex; flex-direction: column; justify-content: space-between;">
<el-table :data="tableData" style="width: 100%" :height="config.height">
<el-table-column
:prop="configItem.prop"
:label="configItem.label"
:width="configItem.width"
v-for="configItem in config.column"
:key="configItem.prop"
/>
</el-table>
<!-- /div -->
<div style="width: 100%; height: 10px;"></div>
<el-pagination
v-model:current-page="currentPage.page"
v-model:page-size="currentPage.pageSize"
:page-sizes="[5, 10, 20, 50]"
:small="small"
:disabled="disabled"
:background="background"
layout=" prev, pager, next, sizes"
:total="currentPage.total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</template>
<script setup lang="ts">
import { computed, ref } from "vue";
const prop = defineProps({
config: {
type: Object,
default: {
height:800,
column: [
{
//
prop: "name",
label: "",
width: "180",
},
],
},
},
tableData: {
type: Array,
default: [
{
name: "",
},
],
},
page:{
type: Object,
default: {
page:1,
pageSize:5,
total:1
},
}
});
//
const currentPage = computed({
get: () => prop.page,
set: val => {
emit('update:page', val)
},
})
// //
// const currentPage=ref(1)
// //
// const pageSize=ref(10)
//
const small = ref(true)
//
const disabled = ref(false)
//
const background = ref(false)
//
const handleSizeChange = (val: number) => {
emit('gettabellist')
}
//
const handleCurrentChange = (val: number) => {
emit('gettabellist')
}
const emit = defineEmits([ 'gettabellist','update:page'])
</script>
<style lang="scss" scoped></style>

View File

@ -1,18 +1,36 @@
<template> <template>
<el-drawer :model-value="prop.visible" title="prop.title" :with-header="false" @close="handleClose" class="drawer-class"> <el-drawer
:model-value="prop.visible"
title="prop.title"
:with-header="false"
@close="handleClose"
class="drawer-class"
>
<div class="info-header"> <div class="info-header">
<h2>{{prop.title}}</h2> <h2>{{ prop.title }}</h2>
<span>设备详情 </span> <span>设备详情 </span>
</div> </div>
<div class="info-body"> <div class="info-body">
<el-tabs v-model="activeinfo" class="demo-tabs" @tab-click="handleClick"> <el-tabs v-model="activeinfo" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane label="详情" name="info"> <el-tab-pane label="详情" name="info">
<div style="margin: 0 20px;"> <div style="margin: 0 20px">
<Wform :config="formconfig" :data="formdata"></Wform> <Wform :config="formconfig" :data="formdata"></Wform>
<!-- <Wdescriptions :data="descriptionsData"></Wdescriptions> -->
</div> </div>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="属性" name="attribute">User</el-tab-pane> <el-tab-pane label="属性" name="attribute">
<el-row style=" margin-bottom: 10px;">
<el-col :span="20"></el-col>
<el-col :span="2"><el-button :icon="Refresh" circle @click="researchtable"/></el-col>
<el-col :span="2"></el-col>
</el-row>
<Wtable
:config="tableConfig"
:tableData="tableData"
@gettabellist="getTableList"
:page="pageval"
></Wtable>
</el-tab-pane>
<el-tab-pane label="最新遥测数据" name="newDAata">Role</el-tab-pane> <el-tab-pane label="最新遥测数据" name="newDAata">Role</el-tab-pane>
<el-tab-pane label="pdf" name="pdf">Task</el-tab-pane> <el-tab-pane label="pdf" name="pdf">Task</el-tab-pane>
</el-tabs> </el-tabs>
@ -21,11 +39,15 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {ref} from "vue" import { ref } from "vue";
import Wform from "./Wform.vue" import Wform from "./Wform.vue";
import type { TabsPaneContext } from 'element-plus' import Wdescriptions from "./Wdescriptions.vue";
import Wtable from "./Wtable.vue";
const activeinfo=ref('info') import type { TabsPaneContext } from "element-plus";
import {
Refresh,
} from '@element-plus/icons-vue'
const activeinfo = ref("info");
const prop = defineProps({ const prop = defineProps({
visible: { visible: {
type: Boolean, type: Boolean,
@ -33,82 +55,157 @@ const prop = defineProps({
}, },
title: { title: {
type: String, type: String,
default: '信息详情', default: "信息详情",
}, },
form: { form: {
type: Object, type: Object,
default: { default: {
id: '', id: "",
inspector: '', inspector: "",
assemblyGroup: '', assemblyGroup: "",
electricGroup: '' electricGroup: "",
},
},
});
//
const formconfig = ref({
labelPosition: "top",
formItem: [
{
label: "名称",
labelWidth: "auto",
content: {
type: "input",
model: "name",
readonly: true,
disabled: true,
}, },
}
})
const formconfig=ref({
labelPosition:'top',
formItem:[{
label:'名称',
labelWidth:'auto',
content:{
type:'input',
model:"name",
readonly:true,
disabled:true,
}
}, },
{ {
label:'设备配置', label: "设备配置",
labelWidth:'auto', labelWidth: "auto",
content:{ content: {
type:'input', type: "input",
model:"name", model: "name",
readonly:true, readonly: true,
disabled:true, disabled: true,
} },
}, },
{ {
label:'机架号', label: "机架号",
labelWidth:'auto', labelWidth: "auto",
content:{ content: {
type:'input', type: "input",
model:"name", model: "name",
readonly:true, readonly: true,
disabled:true, disabled: true,
} },
}, },
{ {
label:'说明', label: "是否网关",
labelWidth:'auto', labelWidth: "auto",
content:{ content: {
type:'input', type: "checkbox",
model:"name", model: "checkbox",
readonly:true, value: [
disabled:true, {
} id: 1,
}] val: "是否网关",
}) disabled: true,
const formdata=ref({ },
name:'默认' ],
}) },
},
{
label: "说明",
labelWidth: "auto",
content: {
type: "input",
model: "name",
readonly: true,
disabled: true,
textarea: true,
},
},
],
});
const formdata = ref({
name: "默认",
checkbox: ["是否网关"],
});
//
const descriptionsData = ref({
name: prop.title,
devLabel: "00111",
label: "00111",
iswangguan: true,
remark: "说明",
});
//
const tableConfig = ref({
height: 430,
column: [
{
prop: "nowTime",
label: "最后更新时间",
width: "",
},
{
prop: "keyName",
label: "键名",
width: "",
},
{
prop: "keyValue",
label: "值",
width: "",
},
],
});
const tableData = ref([
{
nowTime: "1",
keyName: "1",
keyValue: "1",
},
{
nowTime: "2",
keyName: "2",
keyValue: "2",
},
{
nowTime: "3",
keyName: "3",
keyValue: "3",
},
]);
const pageval=ref({page:1,pageSize:5,total:1})
const handleClose = () => { const handleClose = () => {
//baseFormRef.value.reset() //baseFormRef.value.reset()
emit('closeDialog') emit("closeDialog");
} };
const handleClick = (tab: TabsPaneContext, event: Event) => { const handleClick = (tab: TabsPaneContext, event: Event) => {
console.log(tab, event) // console.log(tab, event)
};
const researchtable=()=>{
pageval.value.page=1
pageval.value.pageSize=5
} }
const getTableList = () => {
console.log(pageval.value);
};
// //
const emit = defineEmits([ 'closeDialog']) const emit = defineEmits(["closeDialog"]);
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.info-header {
.info-header{
width: 100%; width: 100%;
height: 130px; height: 130px;
background-color: #409EFF; background-color: #409eff;
color: #fff; color: #fff;
padding-left: 20px; padding-left: 20px;
padding-top: 10px; padding-top: 10px;
@ -116,13 +213,13 @@ const emit = defineEmits([ 'closeDialog'])
flex-direction: column; flex-direction: column;
align-items: flex-start; align-items: flex-start;
justify-content: center; justify-content: center;
& h2{ & h2 {
margin: 0; margin: 0;
font-size: 30px; font-size: 30px;
font-weight: 600; font-weight: 600;
} }
} }
:deep(.el-tabs__nav){ :deep(.el-tabs__nav) {
margin-left: 20px; margin-left: 20px;
} }
</style> </style>