echarts图表更改,表格表头颜色改变,自定义属性添加

This commit is contained in:
wangxk 2025-06-17 09:41:09 +08:00
parent 4bc641be02
commit d348a65e56
11 changed files with 401 additions and 238 deletions

View File

@ -4,116 +4,71 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, watch, onMounted } from 'vue'; import { ref, watch, onMounted } from 'vue';
import * as d3 from 'd3'; import * as echarts from 'echarts';
const props = defineProps<{ const props = defineProps<{
chartData: Array<{ x: number; y: number }>; chartData: Array<{ x: number; y: number }>;
}>(); }>();
const chartContainer = ref<HTMLElement | null>(null); const chartContainer = ref<HTMLElement | null>(null);
let svg: d3.Selection<SVGSVGElement, unknown, null, undefined>; let chartInstance: echarts.ECharts | null = null; // ECharts
let xScale: d3.ScaleLinear<number, number>;
let yScale: d3.ScaleLinear<number, number>;
let line: d3.Line<{ x: number; y: number }>;
const initChart = () => { const initChart = () => {
if (!chartContainer.value) return; if (!chartContainer.value) return;
// // ECharts
d3.select(chartContainer.value).select("svg").remove(); chartInstance = echarts.init(chartContainer.value);
console.log('chartInstance initialized:', chartInstance); //
// SVG //
svg = d3.select(chartContainer.value) const option: echarts.EChartsOption = {
.append('svg') tooltip: {
.attr('width', '100%') trigger: 'axis'
.attr('height', '100%'); },
xAxis: {
type: 'value',
name: '时间 (s)',
nameLocation: 'middle',
nameGap: 30
},
yAxis: {
type: 'value',
name: '高度 (m)',
nameLocation: 'middle',
nameGap: 40
},
series: [{
name: '高度 (m)',
type: 'line',
smooth: true,
// symbol: 'none', //
lineStyle: {
width: 2,
color: '#5470c6' // ECharts
},
data: []
}]
};
// chartInstance.setOption(option);
xScale = d3.scaleLinear() updateChart(); //
.range([50, 750]);
yScale = d3.scaleLinear()
.range([400, 50]);
// 线
line = d3.line<{ x: number; y: number }>()
.x(d => xScale(d.x))
.y(d => yScale(d.y));
//
svg.append('g')
.attr('class', 'x-axis')
.attr('transform', 'translate(0, 400)');
svg.append('g')
.attr('class', 'y-axis')
.attr('transform', 'translate(50, 0)');
//
svg.append('path')
.attr('class', 'line')
.attr('fill', 'none')
.attr('stroke', 'steelblue')
.attr('stroke-width', 2);
svg.append("text")
.attr("class", "x-axis-label") // class
.attr("transform", "translate(400,440)")
.style("text-anchor", "middle")
.text("时间 (s)");
svg.append("text")
.attr("class", "y-axis-label")
.attr("transform", "rotate(-90) translate(-220, 15)") //
.style("text-anchor", "middle")
.text("高度 (m)");
svg.call(d3.zoom()
.scaleExtent([1, 8])
.on('zoom', (event) => {
xScale.eventTransform.rescaleX(xScale);
yScale.eventTransform.rescaleY(yScale);
updateChart();
}));
//
updateChart();
}; };
const updateChart = () => { const updateChart = () => {
svg.attr('key', Date.now()); if (!chartInstance) return;
//
svg.select('.x-axis').remove();
svg.select('.y-axis').remove();
// console.log('Updating chart...'); //
const xAxis = svg.append('g')
.attr('class', 'x-axis')
.attr('transform', `translate(0, ${yScale.range()[0]})`);
const yAxis = svg.append('g') // {x,y} -> [x,y]
.attr('class', 'y-axis') const seriesData = props.chartData.map(item => [item.x, item.y]);
.attr('transform', `translate(${xScale.range()[0]}, 0)`); console.log('seriesData:', seriesData); //
//
const xDomain = props.chartData.length > 0 ?
d3.extent(props.chartData, d => d.x) : [0, 1];
xScale.domain(xDomain as [number, number]);
yScale.domain([0, d3.max(props.chartData, d => d.y)!]);
// 线 //
svg.select('.line') chartInstance.setOption({
.datum(props.chartData) series: [{
.transition() data: seriesData
.duration(500) }]
.attr('d', line); });
//
svg.select('.x-axis')
.transition()
.duration(500)
.call(d3.axisBottom(xScale));
svg.select('.y-axis')
.transition()
.duration(500)
.call(d3.axisLeft(yScale));
}; };
onMounted(initChart); onMounted(initChart);
@ -124,21 +79,5 @@ watch(() => props.chartData, updateChart, { deep: true });
.chart-container { .chart-container {
width: 800px; width: 800px;
height: 600px; height: 600px;
border: 1px solid #eee;
margin: 20px;
padding: 10px;
}
.x-axis text {
font-size: 10px;
transform: rotate(-45deg);
text-anchor: end;
}
.x-axis-label,
.y-axis-label {
font-size: 12px;
fill: #666;
font-family: Arial, sans-serif;
} }
</style> </style>

View File

@ -166,7 +166,7 @@ onMounted(() => {
</el-tab-pane> </el-tab-pane>
<el-table v-loading="loading" :data="tableData" style="width: 100%; margin-bottom: 20px;overflow:hidden;" height="400px" <el-table v-loading="loading" :data="tableData" style="width: 100%; margin-bottom: 20px;overflow:hidden;" height="400px"
row-key="id" border @selection-change="handleSelectionChange" default-expand-all row-key="id" border @selection-change="handleSelectionChange" default-expand-all
:header-cell-style="{ background: 'rgb(250 250 250)', height: '50px' }"> :header-cell-style="{ background: 'rgb(250 250 250)', color: '#383838',height: '50px' }">
<el-table-column v-if="active == '1'" type="selection" align="center" width="50" /> <el-table-column v-if="active == '1'" type="selection" align="center" width="50" />
<el-table-column type="index" label="序号" align="center" width="70" /> <el-table-column type="index" label="序号" align="center" width="70" />
<el-table-column prop="title" label="消息标题"> <el-table-column prop="title" label="消息标题">

View File

@ -13,7 +13,7 @@ import { Search } from '@element-plus/icons-vue'
import Page from '@/components/Pagination/page.vue'; import Page from '@/components/Pagination/page.vue';
import AudioPlayer from '@/components/file/preview/AudioPlayer.vue'; import AudioPlayer from '@/components/file/preview/AudioPlayer.vue';
import { batchDeleteReq } from "@/api/file-operator"; import { batchDeleteReq } from "@/api/file-operator";
import { projectList, selectNodesByProjectId, documentUploadById, obtainInformationAsync, getNodesTree, addNodes, updateNodes, deleteNodesById, getFilesPage, addFiles, updateFiles, deleteFilesById, deleteFilesByIds, specialScanById,sdLocalUrl } from "@/api/document"; import { projectList, selectNodesByProjectId, documentUploadById, obtainInformationAsync, getNodesTree, addNodes, updateNodes, deleteNodesById, getFilesPage, addFiles, updateFiles, deleteFilesById, deleteFilesByIds, specialScanById, sdLocalUrl } from "@/api/document";
import ZUpload from '@/components/file/ZUpload.vue' import ZUpload from '@/components/file/ZUpload.vue'
import useFileUpload from "@/components/file/file/useFileUpload"; import useFileUpload from "@/components/file/file/useFileUpload";
import useHeaderStorageList from "@/components/header/useHeaderStorageList"; import useHeaderStorageList from "@/components/header/useHeaderStorageList";
@ -151,7 +151,7 @@ function gettreedata() {
treeloading.value = false treeloading.value = false
if (treedata.value[0]) { if (treedata.value[0]) {
pathid.value = treedata.value[0].id pathid.value = treedata.value[0].id
filePath.value = res.data[0].path + res.data[0].nodeName + '/' filePath.value = res.data[0].path + res.data[0].nodeName + '/'
nextTick(() => { nextTick(() => {
treeRef.value?.setCurrentKey(pathid.value); treeRef.value?.setCurrentKey(pathid.value);
}); });
@ -252,6 +252,7 @@ async function submitForm(formEl: any) {
if (!formEl) return if (!formEl) return
await formEl.validate((valid: any, fields: any) => { await formEl.validate((valid: any, fields: any) => {
if (valid) { if (valid) {
projectForme.value.custom3 = filePath.value
if (projectForme.value.id) { if (projectForme.value.id) {
updateNodes(projectForme.value).then((res: any) => { updateNodes(projectForme.value).then((res: any) => {
if (res.code == 0) { if (res.code == 0) {
@ -259,7 +260,6 @@ async function submitForm(formEl: any) {
ElMessage.success("修改成功") ElMessage.success("修改成功")
frame.value = false frame.value = false
} }
}) })
} else { } else {
addNodes(projectForme.value).then((res: any) => { addNodes(projectForme.value).then((res: any) => {
@ -268,11 +268,8 @@ async function submitForm(formEl: any) {
ElMessage.success("添加成功") ElMessage.success("添加成功")
frame.value = false frame.value = false
} }
}) })
} }
} }
}) })
} }
@ -590,8 +587,8 @@ function xiafile(row: any) {
.then(() => { .then(() => {
sdLocalUrl({ id: row.id }).then((res: any) => { sdLocalUrl({ id: row.id }).then((res: any) => {
window.open(res.data.url); window.open(res.data.url);
}) })
}) })
@ -802,17 +799,17 @@ const buttonmsg1 = ref('初始化导入项目完整压缩包')
function tonstatus() { function tonstatus() {
//sao //sao
obtainInformationAsync({ id: projectId.value }).then((res: any) => { obtainInformationAsync({ id: projectId.value }).then((res: any) => {
if (res.data.scanstatus == '1' ) { if (res.data.scanstatus == '1') {
tonloading.value = false tonloading.value = false
buttonmsg.value = '扫描项目完整路径' buttonmsg.value = '扫描项目完整路径'
} else if (res.data.scanstatus == '0' ) { } else if (res.data.scanstatus == '0') {
tonloading.value = true tonloading.value = true
buttonmsg.value = '处理中...' buttonmsg.value = '处理中...'
} }
if (res.data.uploadstatus == '1' ) { if (res.data.uploadstatus == '1') {
tonloading1.value = false tonloading1.value = false
buttonmsg1.value = '初始化导入项目完整压缩包' buttonmsg1.value = '初始化导入项目完整压缩包'
} else if (res.data.uploadstatus == '0' ) { } else if (res.data.uploadstatus == '0') {
tonloading1.value = true tonloading1.value = true
buttonmsg1.value = '处理中...' buttonmsg1.value = '处理中...'
} }
@ -844,7 +841,7 @@ function tonstatus() {
<span class="custom-tree-node"> <span class="custom-tree-node">
<span class="text">{{ data.nodeName }}</span> <span class="text">{{ data.nodeName }}</span>
<span class="img_tree"> <span class="img_tree">
<!-- <img src="@/assets/project/xiu.png" alt="" title="编辑" @click="editSubItem(data)"> --> <img src="@/assets/project/xiu.png" alt="" title="编辑" @click="editSubItem(data)">
<img src="@/assets/project/del.png" alt="" title="删除" @click="delSubItem(data)"> <img src="@/assets/project/del.png" alt="" title="删除" @click="delSubItem(data)">
<img v-if="data.nodeType == '01'" src="@/assets/project/jia.png" alt="" title="添加课题" <img v-if="data.nodeType == '01'" src="@/assets/project/jia.png" alt="" title="添加课题"
@click="addSubItem(data)"> @click="addSubItem(data)">
@ -891,7 +888,7 @@ function tonstatus() {
</div> </div>
<el-table v-loading="loading" :data="tableData" @selection-change="handleSelectionChange" <el-table v-loading="loading" :data="tableData" @selection-change="handleSelectionChange"
:header-cell-style="{ background: 'rgb(250 250 250)', height: '50px' }" :header-cell-style="{ background: 'rgb(250 250 250)', color: '#383838', height: '50px' }"
style="width: 100%; height: calc(100vh - 275px);margin-bottom: 20px;" border> style="width: 100%; height: calc(100vh - 275px);margin-bottom: 20px;" border>
<el-table-column type="selection" width="40" /> <el-table-column type="selection" width="40" />
<!-- <el-table-column type="index" label="序号" width="70" align="center"></el-table-column> --> <!-- <el-table-column type="index" label="序号" width="70" align="center"></el-table-column> -->
@ -935,8 +932,7 @@ function tonstatus() {
<el-form ref="ruleFormRef" style="max-width: 600px" :model="projectForme" :rules="moderules" <el-form ref="ruleFormRef" style="max-width: 600px" :model="projectForme" :rules="moderules"
label-width="auto" class="demo-ruleForm" status-icon> label-width="auto" class="demo-ruleForm" status-icon>
<el-form-item label="节点名称" prop="nodeName"> <el-form-item label="节点名称" prop="nodeName">
<el-input v-model="projectForme.nodeName" maxlength="40" show-word-limit <el-input v-model="projectForme.nodeName" maxlength="40" show-word-limit />
:disabled="projectForme.id" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<div style="width: 100%;display: flex;justify-content: end;"> <div style="width: 100%;display: flex;justify-content: end;">
@ -948,7 +944,7 @@ function tonstatus() {
</el-dialog> </el-dialog>
<el-dialog :title="title" v-model="upfile" width="50%" :before-close="fileClose" top="30px" draggable <el-dialog :title="title" v-model="upfile" width="50%" :before-close="fileClose" top="30px" draggable
:close-on-click-modal="false" destroy-on-close> :close-on-click-modal="false" destroy-on-close>
<div v-if="titleon" style="width: 100%;text-align: center;font-size: 18px;margin-bottom: 15px;color: red;" > <div v-if="titleon" style="width: 100%;text-align: center;font-size: 18px;margin-bottom: 15px;color: red;">
请保持压缩包内第一层文件夹名称与项目名称一致 请保持压缩包内第一层文件夹名称与项目名称一致
</div> </div>
<el-scrollbar :height="judge ? '400px' : ''"> <el-scrollbar :height="judge ? '400px' : ''">
@ -971,7 +967,7 @@ function tonstatus() {
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-scrollbar> </el-scrollbar>
<div style="width: 100%;display: flex;justify-content: end;"> <div style="width: 100%;display: flex;justify-content: end;">
<el-button type="primary" @click="submitfile">确定</el-button> <el-button type="primary" @click="submitfile">确定</el-button>
<el-button @click="fileClose">取消</el-button> <el-button @click="fileClose">取消</el-button>
@ -1107,7 +1103,7 @@ function tonstatus() {
.img_tree { .img_tree {
display: flex; display: flex;
width: 13%; width: 20%;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;

View File

@ -10,6 +10,7 @@ import { ElMessage, ElMessageBox } from 'element-plus'
import Page from '@/components/Pagination/page.vue' import Page from '@/components/Pagination/page.vue'
import { projectPage, addSdproject, updateSdproject, deleteSdprojectById, deleteSdprojectByIds } from "@/api/project"; import { projectPage, addSdproject, updateSdproject, deleteSdprojectById, deleteSdprojectByIds } from "@/api/project";
import { getDict } from '@/api/dict' import { getDict } from '@/api/dict'
import { id } from "element-plus/es/locale";
// //
const tableData: any = ref([{}, {}]); const tableData: any = ref([{}, {}]);
// //
@ -32,6 +33,16 @@ function getdata() {
queryParams.value.current = res.data.current queryParams.value.current = res.data.current
queryParams.value.size = res.data.size queryParams.value.size = res.data.size
total.value = res.data.total total.value = res.data.total
let arr = []
tableData.value.forEach((item: any) => {
if (item.projectProps) {
arr = JSON.parse(item.projectProps)
} else {
arr = []
}
item.projectProps = arr
});
console.log(tableData.value)
}) })
} }
// //
@ -56,13 +67,16 @@ function addproject() {
projectProps: "",// projectProps: "",//
projectTime: "",// projectTime: "",//
projectType: ""// projectType: ""//
, localStorageId: "1"
} }
formitemarr.value.length = 0
} }
// //
function editproject(row: any) { function editproject(row: any) {
title.value = "修改项目" title.value = "修改项目"
frame.value = true frame.value = true
projectForme.value = JSON.parse(JSON.stringify(row)) projectForme.value = JSON.parse(JSON.stringify(row))
formitemarr.value = projectForme.value.projectProps
} }
// //
function delproject(row: any) { function delproject(row: any) {
@ -141,12 +155,18 @@ const projectForme: any = ref({
projectProps: "",// projectProps: "",//
projectTime: "",// projectTime: "",//
projectType: ""// projectType: ""//
, localStorageId: "1"
}) })
// //
async function submitForm(formEl: any) { async function submitForm(formEl: any) {
if (!formEl) return if (!formEl) return
await formEl.validate((valid: any, fields: any) => { await formEl.validate((valid: any, fields: any) => {
if (valid) { if (valid) {
if (formitemarr.value.length > 0) {
projectForme.value.projectProps = JSON.stringify(formitemarr.value)
} else {
projectForme.value.projectProps = '[]'
}
if (projectForme.value.id) { if (projectForme.value.id) {
updateSdproject(projectForme.value).then((res: any) => { updateSdproject(projectForme.value).then((res: any) => {
if (res.code == 0) { if (res.code == 0) {
@ -200,6 +220,62 @@ function Loglist(row: any) {
function handleClose1() { function handleClose1() {
logqing.value = false logqing.value = false
} }
//
const formitemarr = ref([])
const dataname = ref('')
const labledone = ref(false)
function addformItem() {
labledone.value = true
dataname.value = ''
}
function labledoneclose() {
labledone.value = false
}
function labledsure() {
if (!dataname.value) {
ElMessage.warning('请输入属性名称')
return
}
generateUniqueId
formitemarr.value.push({ name: dataname.value, data: '', id: generateUniqueId(8) })
labledone.value = false
}
function generateUniqueId(length: any) {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
let result = '';
// 36
const timePart = Date.now().toString(36).toUpperCase().replace(/[0-9]/g, '');
result += timePart;
//
for (let i = result.length; i < length; i++) {
result += chars.charAt(Math.floor(Math.random() * chars.length));
}
return result.substring(0, length);
}
function dellable(index: any) {
formitemarr.value.splice(index, 1)
}
let result1 =ref([])
let result2 =ref([])
const attloading = ref(false)
const attbute = ref(false)
function attribute(input: any) {
result2.value = input
result1.value.length = 0
let inoutarr = JSON.parse(JSON.stringify(input))
result1.value = [inoutarr.reduce((acc:any, item:any) => {
acc[item.id] = item.data;
return acc;
}, {})];
attbute.value = true
}
function attributeclose(){
attbute.value = false
}
</script> </script>
<template> <template>
@ -228,7 +304,7 @@ function handleClose1() {
</div> </div>
<el-table v-loading="loading" :data="tableData" @selection-change="handleSelectionChange" <el-table v-loading="loading" :data="tableData" @selection-change="handleSelectionChange"
:header-cell-style="{ background: 'rgb(250 250 250)', height: '50px' }" :header-cell-style="{ background: 'rgb(250 250 250)', color: '#383838', height: '50px' }"
style="width: 100%; height: calc(100vh - 275px);margin-bottom: 20px;" border> style="width: 100%; height: calc(100vh - 275px);margin-bottom: 20px;" border>
<el-table-column type="selection" width="40" /> <el-table-column type="selection" width="40" />
<!-- <el-table-column type="index" label="序号" width="70" align="center"></el-table-column> --> <!-- <el-table-column type="index" label="序号" width="70" align="center"></el-table-column> -->
@ -247,11 +323,18 @@ function handleClose1() {
<img src="@/assets/MenuIcon/xqing.png" alt="" title="详情" @click="Loglist(scope.row)" <img src="@/assets/MenuIcon/xqing.png" alt="" title="详情" @click="Loglist(scope.row)"
style="cursor: pointer;"> style="cursor: pointer;">
</div> </div>
</template>
</el-table-column>
<el-table-column prop="description" label="自定义属性" width="100">
<template #default="scope">
<div class="ellipsis1">
<img src="@/assets/MenuIcon/xqing.png" alt="" title="详情"
@click="attribute(scope.row.projectProps)" style="cursor: pointer;">
</div>
</template> </template>
</el-table-column> </el-table-column>
<!-- <el-table-column prop="projectProps" label="项目信息"></el-table-column> --> <!-- <el-table-column prop="projectProps" label="项目信息"></el-table-column> -->
<!-- <el-table-column v-for="item in tableData.projectProps" :prop="item.data" :label="item.name" width="165" align="center"></el-table-column> -->
<el-table-column fixed="right" label="操作" width="80" align="center"> <el-table-column fixed="right" label="操作" width="80" align="center">
<template #default="scope"> <template #default="scope">
<span <span
@ -272,41 +355,56 @@ function handleClose1() {
:close-on-click-modal="false" destroy-on-close> :close-on-click-modal="false" destroy-on-close>
<el-form ref="ruleFormRef" :model="projectForme" :rules="moderules" label-width="auto" class="demo-ruleForm" <el-form ref="ruleFormRef" :model="projectForme" :rules="moderules" label-width="auto" class="demo-ruleForm"
status-icon> status-icon>
<div style="width: 100%;display: flex;justify-content: space-between;align-items: center;"> <el-scrollbar height="75vh">
<el-form-item label=" 项目编号" style="width: 50%;"> <div style="width: 100%;display: flex;justify-content: space-between;align-items: center;">
<el-input v-model="projectForme.projectCode" maxlength="40" show-word-limit disabled /> <el-form-item label=" 项目编号" style="width: 50%;">
<el-input v-model="projectForme.projectCode" maxlength="40" show-word-limit disabled />
</el-form-item>
<el-form-item label=" 项目名称" prop="projectName" style="width: 50%;margin-left: 15px;">
<el-input v-model="projectForme.projectName" maxlength="40" show-word-limit
:disabled="projectForme.id" />
</el-form-item>
</div>
<div style="width: 100%;display: flex;justify-content: space-between;align-items: center;">
<el-form-item label=" 项目类型" prop="projectType" style="width: 50%;">
<el-select v-model="projectForme.projectType" clearable placeholder=" " @change="getdata()">
<el-option v-for="item in dictType" :key="item.itemcode" :label="item.dictname"
:value="item.itemcode" />
</el-select>
<!-- <el-input v-model="projectForme.projectType" /> -->
</el-form-item>
<el-form-item label=" 项目启动时间" style="width: 50%;margin-left: 15px;">
<el-date-picker v-model="projectForme.projectTime" type="datetime"
format="YYYY-MM-DD HH:mm:ss" style="width:100%;" value-format="YYYY-MM-DD HH:mm:ss" />
</el-form-item>
</div>
<el-form-item label=" 项目描述">
<el-input v-model="projectForme.description" :rows="25" type="textarea" show-word-limit />
</el-form-item> </el-form-item>
<el-form-item label=" 项目名称" prop="projectName" style="width: 50%;margin-left: 15px;"> <el-form-item v-for="(item, index) in formitemarr" :label="item.name">
<el-input v-model="projectForme.projectName" maxlength="40" show-word-limit <div style="width: 100%;display: flex;align-items: center;justify-content: space-between;">
:disabled="projectForme.id" /> <el-input v-model="item.data" style="width: 92%;" />
</el-form-item> <el-button type="primary" @click="dellable(index)">删除</el-button>
</div> </div>
<div style="width: 100%;display: flex;justify-content: space-between;align-items: center;">
<el-form-item label=" 项目类型" prop="projectType" style="width: 50%;">
<el-select v-model="projectForme.projectType" clearable placeholder=" " @change="getdata()">
<el-option v-for="item in dictType" :key="item.itemcode" :label="item.dictname"
:value="item.itemcode" />
</el-select>
<!-- <el-input v-model="projectForme.projectType" /> -->
</el-form-item>
<el-form-item label=" 项目启动时间" style="width: 50%;margin-left: 15px;">
<el-date-picker v-model="projectForme.projectTime" type="datetime" format="YYYY-MM-DD HH:mm:ss"
style="width:100%;" value-format="YYYY-MM-DD HH:mm:ss" />
</el-form-item>
</div>
<el-form-item label=" 项目描述">
<el-input v-model="projectForme.description" :rows="25" type="textarea" show-word-limit />
</el-form-item>
</el-form-item>
</el-scrollbar>
<el-form-item> <el-form-item>
<div style="width: 100%;display: flex;justify-content: end;"> <div style="width: 100%;display: flex;justify-content: end;margin-top: 20px;">
<el-button type="primary" @click="addformItem">添加属性</el-button>
<el-button type="primary" @click="submitForm(ruleFormRef)">确定</el-button> <el-button type="primary" @click="submitForm(ruleFormRef)">确定</el-button>
<el-button @click="handleClose(ruleFormRef)">取消</el-button> <el-button @click="handleClose(ruleFormRef)">取消</el-button>
</div> </div>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-dialog> </el-dialog>
<el-dialog :title="'添加属性'" v-model="labledone" width="20%" :before-close="labledoneclose" top="30px" draggable
:close-on-click-modal="false" destroy-on-close>
<el-input v-model="dataname" placeholder="请输入属性名称" />
<div style="width: 100%;display: flex;justify-content: end;margin-top: 10px;">
<el-button type="primary" @click="labledsure()">确定</el-button>
</div>
</el-dialog>
<el-dialog :title="title" v-model="logqing" width="60%" :before-close="handleClose1" top="30px" draggable <el-dialog :title="title" v-model="logqing" width="60%" :before-close="handleClose1" top="30px" draggable
:close-on-click-modal="false" destroy-on-close> :close-on-click-modal="false" destroy-on-close>
<div class="texlog"> <div class="texlog">
@ -315,6 +413,17 @@ function handleClose1() {
</el-scrollbar> </el-scrollbar>
</div> </div>
</el-dialog> </el-dialog>
<el-dialog :title="'自定义属性详情'" v-model="attbute" width="1200px" :before-close="attributeclose" top="30px" draggable
:close-on-click-modal="false" destroy-on-close>
<el-table v-if="result2.length > 0" v-loading="attloading" :data="result1"
:header-cell-style="{ background: 'rgb(250 250 250)', color: '#383838', height: '50px' }"
style="width: 100%; height: calc(30vh);margin-bottom: 20px;" border>
<el-table-column v-for="item in result2" :prop="item.id" :label="item.name" ></el-table-column>
</el-table>
<div v-else style="width: 100%;height: 285px;display: flex;align-items: center;justify-content: center;border: 1px solid #ebeef5;">
<el-empty description="暂无数据" />
</div>
</el-dialog>
</div> </div>
</template> </template>
@ -333,6 +442,13 @@ function handleClose1() {
justify-content: space-between; justify-content: space-between;
} }
.ellipsis1 {
display: flex;
width: 100%;
align-items: center;
justify-content: center;
}
.single-line-ellipsis { .single-line-ellipsis {
width: 800px; width: 800px;
/* 限制容器宽度 */ /* 限制容器宽度 */

View File

@ -415,7 +415,7 @@ const vMove = {
</el-col> </el-col>
</el-row> </el-row>
<el-table v-loading="loading" :data="tableData" style="width: 100%; margin-bottom: 20px" row-key="id" border <el-table v-loading="loading" :data="tableData" style="width: 100%; margin-bottom: 20px" row-key="id" border
@selection-change="handleSelectionChange" default-expand-all :header-cell-style="{background:'rgb(250 250 250)',height:'50px'}" > @selection-change="handleSelectionChange" default-expand-all :header-cell-style="{background:'rgb(250 250 250)', color: '#383838',height:'50px'}" >
<el-table-column type="selection" width="50" align="center" /> <el-table-column type="selection" width="50" align="center" />
<el-table-column prop="orgcode" label="部门编号" width="100"></el-table-column> <el-table-column prop="orgcode" label="部门编号" width="100"></el-table-column>
<el-table-column prop="orgname" label="部门名称" width="140"></el-table-column> <el-table-column prop="orgname" label="部门名称" width="140"></el-table-column>

View File

@ -445,7 +445,7 @@ const total = ref()
<div class="draggable"> <div class="draggable">
<el-table v-loading="tableloading" :data="tableData" row-key="id" style="width: 100%;margin-bottom: 20px;" border <el-table v-loading="tableloading" :data="tableData" row-key="id" style="width: 100%;margin-bottom: 20px;" border
@selection-change="handleSelectionChange" default-expand-all @selection-change="handleSelectionChange" default-expand-all
:header-cell-style="{ background: 'rgb(250 250 250)', height: '50px' }"> :header-cell-style="{ background: 'rgb(250 250 250)', color: '#383838', height: '50px' }">
<el-table-column type="selection" width="50" align="center" /> <el-table-column type="selection" width="50" align="center" />
<el-table-column prop="orderNo" label="序号" width="80"> <el-table-column prop="orderNo" label="序号" width="80">
<template #default="scope"> <template #default="scope">

View File

@ -145,7 +145,7 @@ function handleClose(){
</div> </div>
<el-table v-loading="loading" :data="tableData" <el-table v-loading="loading" :data="tableData"
style="width: 100%; height: calc(100vh - 266px);margin-bottom: 20px;" border style="width: 100%; height: calc(100vh - 266px);margin-bottom: 20px;" border
:header-cell-style="{ background: 'rgb(250 250 250)', height: '50px' }"> :header-cell-style="{ background: 'rgb(250 250 250)', color: '#383838', height: '50px' }">
<el-table-column type="index" label="序号" width="70" align="center"></el-table-column> <el-table-column type="index" label="序号" width="70" align="center"></el-table-column>
<el-table-column prop="usercode" label="操作账户" width="100"></el-table-column> <el-table-column prop="usercode" label="操作账户" width="100"></el-table-column>
<el-table-column prop="username" label="用户姓名" width="180"></el-table-column> <el-table-column prop="username" label="用户姓名" width="180"></el-table-column>
@ -173,7 +173,7 @@ function handleClose(){
<el-dialog title="日志详情" v-model="LogDetails" width="90%" :before-close="handleClose" top="30px" draggable destroy-on-close> <el-dialog title="日志详情" v-model="LogDetails" width="90%" :before-close="handleClose" top="30px" draggable destroy-on-close>
<el-table v-loading="loading" :data="Logdata" <el-table v-loading="loading" :data="Logdata"
style="width: 100%; height: calc(50vh - 266px);margin-bottom: 20px;" border style="width: 100%; height: calc(50vh - 266px);margin-bottom: 20px;" border
:header-cell-style="{ background: 'rgb(250 250 250)', height: '50px' }"> :header-cell-style="{ background: 'rgb(250 250 250)', color: '#383838', height: '50px' }">
<el-table-column type="index" label="序号" width="70" align="center"></el-table-column> <el-table-column type="index" label="序号" width="70" align="center"></el-table-column>
<el-table-column prop="username" label="用户姓名" width="110"></el-table-column> <el-table-column prop="username" label="用户姓名" width="110"></el-table-column>
<el-table-column prop="module" label="模块名称" width="120"></el-table-column> <el-table-column prop="module" label="模块名称" width="120"></el-table-column>

View File

@ -149,7 +149,7 @@ function Submit(row){
</el-col> </el-col>
</el-row> </el-row>
<el-table v-loading="loading" :data="tableData" style="width: 100%;height:calc(100vh - 210px); margin-bottom: 20px" row-key="id" border <el-table v-loading="loading" :data="tableData" style="width: 100%;height:calc(100vh - 210px); margin-bottom: 20px" row-key="id" border
default-expand-all :header-cell-style="{background:'rgb(250 250 250)',height:'50px'}" default-expand-all :header-cell-style="{background:'rgb(250 250 250)', color: '#383838',height:'50px'}"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"> :tree-props="{children: 'children', hasChildren: 'hasChildren'}">
<el-table-column type="index" label="序号" align="center" width="70" /> <el-table-column type="index" label="序号" align="center" width="70" />
<el-table-column prop="code" label="机构代码" min-width="140"></el-table-column> <el-table-column prop="code" label="机构代码" min-width="140"></el-table-column>

View File

@ -1504,6 +1504,8 @@ function openMap(row: any) {
} }
function mapClose() { function mapClose() {
mapTrajectory.value = false mapTrajectory.value = false
lineData.value.length = 0
dynamicCoordinates.value.length = 0
closeSSE() closeSSE()
// index = 0 // index = 0
} }
@ -1513,26 +1515,14 @@ const options = ref([
name: '1秒' name: '1秒'
, id: 1 , id: 1
}, },
{
name: '10秒'
, id: 10
},
{
name: '30秒'
, id: 30
},
{
name: '1分钟'
, id: 60
},
{
name: '2分钟'
, id: 120
},
{ {
name: '5分钟' name: '5分钟'
, id: 300 , id: 300
}, },
{
name: '10分钟'
, id: 600
},
]) ])
const maptime: any = ref(1) const maptime: any = ref(1)
// //
@ -1704,13 +1694,13 @@ function repstring(row: any) {
</div> </div>
<el-table ref="filetableRef" v-loading="loading" :data="tableData" @selection-change="handleSelectionChange" <el-table ref="filetableRef" v-loading="loading" :data="tableData" @selection-change="handleSelectionChange"
:header-cell-style="{ background: 'rgb(250 250 250)', height: '50px' }" :header-cell-style="{ background: 'rgb(250 250 250)', color: '#383838', height: '50px' }"
style="width: 100%; height: calc(66vh);margin-bottom: 20px;" border> style="width: 100%; height: calc(66vh);margin-bottom: 20px;" border>
<el-table-column type="selection" width="40" /> <el-table-column type="selection" width="40" />
<!-- <el-table-column type="index" label="序号" width="70" align="center"></el-table-column> --> <!-- <el-table-column type="index" label="序号" width="70" align="center"></el-table-column> -->
<el-table-column prop="fileName" label="文件名称" width="200"> <el-table-column prop="fileName" label="文件名称" width="200">
<template #default="scope"> <template #default="scope">
<div class="tableweight" v-if="scope.row.isFile == 'FOLDER'">{{ scope.row.fileName }} </div> <div class="tableweight" v-if="scope.row.isFile == 'FOLDER'" @click="openNode(scope.row)" >{{ scope.row.fileName }} </div>
<div v-else-if="scope.row.isFile == 'FILE'">{{ scope.row.fileName }} </div> <div v-else-if="scope.row.isFile == 'FILE'">{{ scope.row.fileName }} </div>
</template> </template>
</el-table-column> </el-table-column>
@ -1833,7 +1823,7 @@ function repstring(row: any) {
}})</el-button> }})</el-button>
</div> </div>
<el-table v-loading="loading" :data="copytable" @selection-change="copyhand" <el-table v-loading="loading" :data="copytable" @selection-change="copyhand"
:header-cell-style="{ background: 'rgb(250 250 250)', height: '50px' }" :header-cell-style="{ background: 'rgb(250 250 250)', color: '#383838', height: '50px' }"
style="width: 100%; height: calc(100vh - 275px);margin-bottom: 20px;" border> style="width: 100%; height: calc(100vh - 275px);margin-bottom: 20px;" border>
<el-table-column type="selection" width="40" /> <el-table-column type="selection" width="40" />
<!-- <el-table-column type="index" label="序号" width="70" align="center"></el-table-column> --> <!-- <el-table-column type="index" label="序号" width="70" align="center"></el-table-column> -->
@ -2192,6 +2182,10 @@ function repstring(row: any) {
.tableweight { .tableweight {
font-size: 16px; font-size: 16px;
background: #dbf500; background: #dbf500;
cursor: pointer;
}
.tableweight:hover{
color: #409eff;
} }
// //

View File

@ -1190,7 +1190,7 @@ const tabs = ref(1)
@click="moretableBeifen()">备份</el-button> @click="moretableBeifen()">备份</el-button>
</div> </div>
<el-table v-loading="loading1" :data="localOnlyFiles" @selection-change="bifenChange" <el-table v-loading="loading1" :data="localOnlyFiles" @selection-change="bifenChange"
:header-cell-style="{ background: 'rgb(250 250 250)', height: '50px' }" :header-cell-style="{ background: 'rgb(250 250 250)', color: '#383838',height: '50px' }"
style="width: 100%; height: calc(60vh);margin-bottom: 20px;" border> style="width: 100%; height: calc(60vh);margin-bottom: 20px;" border>
<el-table-column type="selection" width="40" /> <el-table-column type="selection" width="40" />
@ -1232,7 +1232,7 @@ const tabs = ref(1)
</div> </div>
</div> </div>
<el-table v-loading="loading2" :data="md5MismatchedFiles" @selection-change="handleChange" <el-table v-loading="loading2" :data="md5MismatchedFiles" @selection-change="handleChange"
:header-cell-style="{ background: 'rgb(250 250 250)', height: '50px' }" :header-cell-style="{ background: 'rgb(250 250 250)', color: '#383838', height: '50px' }"
style="width: 100%; height: calc(60vh);margin-bottom: 20px;" border> style="width: 100%; height: calc(60vh);margin-bottom: 20px;" border>
<el-table-column type="selection" width="40" /> <el-table-column type="selection" width="40" />
<el-table-column prop="fileName" label="文件名称"></el-table-column> <el-table-column prop="fileName" label="文件名称"></el-table-column>
@ -1276,7 +1276,7 @@ const tabs = ref(1)
</div> </div>
<el-table v-loading="loading3" :data="minioOnlyFiles" @selection-change="restoreChange" <el-table v-loading="loading3" :data="minioOnlyFiles" @selection-change="restoreChange"
:header-cell-style="{ background: 'rgb(250 250 250)', height: '50px' }" :header-cell-style="{ background: 'rgb(250 250 250)', color: '#383838', height: '50px' }"
style="width: 100%; height: calc(60vh);margin-bottom: 20px;" border> style="width: 100%; height: calc(60vh);margin-bottom: 20px;" border>
<el-table-column type="selection" width="40" /> <el-table-column type="selection" width="40" />
<el-table-column prop="fileName" label="文件名称"></el-table-column> <el-table-column prop="fileName" label="文件名称"></el-table-column>

View File

@ -8,7 +8,7 @@ export default {
import { onMounted, ref } from "vue"; import { onMounted, ref } from "vue";
import { ElMessage, ElMessageBox } from 'element-plus' import { ElMessage, ElMessageBox } from 'element-plus'
import Page from '@/components/Pagination/page.vue' import Page from '@/components/Pagination/page.vue'
import { tstaskPage, addtsTask, updatetsTask, deleteTsTaskById, deleteTsTaskByIds,confirmDeleteTask } from "@/api/testtask"; import { tstaskPage, addtsTask, updatetsTask, deleteTsTaskById, deleteTsTaskByIds, confirmDeleteTask } from "@/api/testtask";
import { getDict } from '@/api/dict' import { getDict } from '@/api/dict'
// //
const tableData: any = ref([]); const tableData: any = ref([]);
@ -60,6 +60,15 @@ function getdata() {
queryParams.value.current = res.data.current queryParams.value.current = res.data.current
queryParams.value.size = res.data.size queryParams.value.size = res.data.size
total.value = res.data.total total.value = res.data.total
let arr = []
tableData.value.forEach((item: any) => {
if (item.taskProps) {
arr = JSON.parse(item.taskProps)
} else {
arr = []
}
item.taskProps = arr
});
}) })
} }
// //
@ -83,11 +92,16 @@ function addproject() {
taskType: "", taskType: "",
testDescribe: "",// testDescribe: "",//
sensorDescribe: "",// sensorDescribe: "",//
taskProps: "",//
localStorageId: '1',
backupStorageId: '2'
} }
formitemarr.value.length = 0
} }
// //
function editproject(row: any) { function editproject(row: any) {
projectForme.value = JSON.parse(JSON.stringify(row)) projectForme.value = JSON.parse(JSON.stringify(row))
formitemarr.value = projectForme.value.taskProps
projectForme.value.taskDate = [projectForme.value.taskStartdate, projectForme.value.taskEnddate] projectForme.value.taskDate = [projectForme.value.taskStartdate, projectForme.value.taskEnddate]
title.value = "修改试验任务" title.value = "修改试验任务"
frame.value = true frame.value = true
@ -185,12 +199,20 @@ const projectForme: any = ref({
, taskType: "", , taskType: "",
testDescribe: "",// testDescribe: "",//
sensorDescribe: "",// sensorDescribe: "",//
taskProps: "",//
localStorageId: '1',
backupStorageId: '2'
}) })
// //
async function submitForm(formEl: any) { async function submitForm(formEl: any) {
if (!formEl) return if (!formEl) return
await formEl.validate((valid: any, fields: any) => { await formEl.validate((valid: any, fields: any) => {
if (valid) { if (valid) {
if (formitemarr.value.length > 0) {
projectForme.value.taskProps = JSON.stringify(formitemarr.value)
} else {
projectForme.value.taskProps = '[]'
}
if (projectForme.value.taskDate.length > 0) { if (projectForme.value.taskDate.length > 0) {
projectForme.value.taskStartdate = projectForme.value.taskDate[0] projectForme.value.taskStartdate = projectForme.value.taskDate[0]
projectForme.value.taskEnddate = projectForme.value.taskDate[1] projectForme.value.taskEnddate = projectForme.value.taskDate[1]
@ -256,6 +278,63 @@ function Loglist(row: any, title1: any) {
function handleClose1() { function handleClose1() {
logqing.value = false logqing.value = false
} }
//
const formitemarr = ref([])
const dataname = ref('')
const labledone = ref(false)
function addformItem() {
labledone.value = true
dataname.value = ''
}
function labledoneclose() {
labledone.value = false
}
function labledsure() {
if (!dataname.value) {
ElMessage.warning('请输入属性名称')
return
}
generateUniqueId
formitemarr.value.push({ name: dataname.value, data: '', id: generateUniqueId(8) })
labledone.value = false
}
function generateUniqueId(length: any) {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
let result = '';
// 36
const timePart = Date.now().toString(36).toUpperCase().replace(/[0-9]/g, '');
result += timePart;
//
for (let i = result.length; i < length; i++) {
result += chars.charAt(Math.floor(Math.random() * chars.length));
}
return result.substring(0, length);
}
function dellable(index: any) {
formitemarr.value.splice(index, 1)
}
let result1 = ref([])
let result2 = ref([])
const attloading = ref(false)
const attbute = ref(false)
function attribute(input: any) {
result2.value = input
result1.value.length = 0
let inoutarr = JSON.parse(JSON.stringify(input))
result1.value = [inoutarr.reduce((acc: any, item: any) => {
acc[item.id] = item.data;
return acc;
}, {})];
attbute.value = true
console.log(result1.value)
}
function attributeclose() {
attbute.value = false
}
</script> </script>
<template> <template>
@ -297,7 +376,7 @@ function handleClose1() {
</div> </div>
<el-table v-loading="loading" :data="tableData" @selection-change="handleSelectionChange" <el-table v-loading="loading" :data="tableData" @selection-change="handleSelectionChange"
:header-cell-style="{ background: 'rgb(250 250 250)', height: '50px' }" :header-cell-style="{ background: 'rgb(250 250 250)', color: '#383838', height: '50px' }"
style="width: 100%; height: calc(64vh);margin-bottom: 20px;" border> style="width: 100%; height: calc(64vh);margin-bottom: 20px;" border>
<el-table-column type="selection" width="40" /> <el-table-column type="selection" width="40" />
<el-table-column prop="taskCode" label="任务编号" width="90"></el-table-column> <el-table-column prop="taskCode" label="任务编号" width="90"></el-table-column>
@ -313,6 +392,14 @@ function handleClose1() {
scope.row.taskEnddate : '' }}</span> scope.row.taskEnddate : '' }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="description" label="自定义属性" width="100">
<template #default="scope">
<div class="ellipsis1">
<img src="@/assets/MenuIcon/xqing.png" alt="" title="详情"
@click="attribute(scope.row.taskProps)" style="cursor: pointer;">
</div>
</template>
</el-table-column>
<el-table-column prop="taskPlace" label="任务地点" width="180"></el-table-column> <el-table-column prop="taskPlace" label="任务地点" width="180"></el-table-column>
<el-table-column prop="taskPerson" label="任务人员" width="280"></el-table-column> <el-table-column prop="taskPerson" label="任务人员" width="280"></el-table-column>
<el-table-column prop="carrierName" label="载机名称" width="180"></el-table-column> <el-table-column prop="carrierName" label="载机名称" width="180"></el-table-column>
@ -357,65 +444,96 @@ function handleClose1() {
:close-on-click-modal="false" destroy-on-close> :close-on-click-modal="false" destroy-on-close>
<el-form ref="ruleFormRef" style="max-width:100%" :model="projectForme" :rules="moderules" <el-form ref="ruleFormRef" style="max-width:100%" :model="projectForme" :rules="moderules"
label-width="auto" class="demo-ruleForm" status-icon> label-width="auto" class="demo-ruleForm" status-icon>
<div style="width: 100%;display: flex;justify-content: space-between;align-items: center;"> <el-scrollbar height="80vh">
<el-form-item label="任务编号" style="width: 50%;"> <div style="width: 100%;display: flex;justify-content: space-between;align-items: center;">
<el-input v-model="projectForme.taskCode" maxlength="40" show-word-limit disabled <el-form-item label="任务编号" style="width: 50%;">
style="width: 100%;" /> <el-input v-model="projectForme.taskCode" maxlength="40" show-word-limit disabled
</el-form-item> style="width: 100%;" />
<el-form-item label="任务名称" style="width: 50%;margin-left: 15px;"> </el-form-item>
<el-input v-model="projectForme.taskName" show-word-limit disabled /> <el-form-item label="任务名称" style="width: 50%;margin-left: 15px;">
</el-form-item> <el-input v-model="projectForme.taskName" show-word-limit disabled />
</div> </el-form-item>
<div style="width: 100%;display: flex;justify-content: space-between;align-items: center;"> </div>
<el-form-item label="任务类型" prop="taskType" style="width: 50%;"> <div style="width: 100%;display: flex;justify-content: space-between;align-items: center;">
<el-select v-model="projectForme.taskType" clearable placeholder=" " @change="getdata()"> <el-form-item label="任务类型" prop="taskType" style="width: 50%;">
<el-option v-for="item in dictType" :key="item.itemcode" :label="item.dictname" <el-select v-model="projectForme.taskType" clearable placeholder=" " @change="getdata()">
:value="item.itemcode" /> <el-option v-for="item in dictType" :key="item.itemcode" :label="item.dictname"
</el-select> :value="item.itemcode" />
</el-form-item> </el-select>
<el-form-item label="任务时间" prop="taskDate" style="width: 50%;margin-left: 15px;"> </el-form-item>
<el-date-picker v-model="projectForme.taskDate" type="daterange" range-separator="-" <el-form-item label="任务时间" prop="taskDate" style="width: 50%;margin-left: 15px;">
start-placeholder="开始时间" end-placeholder="结束时间" format="YYYY-MM-DD" <el-date-picker v-model="projectForme.taskDate" type="daterange" range-separator="-"
value-format="YYYY-MM-DD" /> start-placeholder="开始时间" end-placeholder="结束时间" format="YYYY-MM-DD"
</el-form-item> value-format="YYYY-MM-DD" />
</div> </el-form-item>
<div style="width: 100%;display: flex;justify-content: space-between;align-items: center;"> </div>
<el-form-item label="任务地点" prop="taskPlace" style="width: 50%;"> <div style="width: 100%;display: flex;justify-content: space-between;align-items: center;">
<el-input v-model="projectForme.taskPlace" maxlength="500" show-word-limit /> <el-form-item label="任务地点" prop="taskPlace" style="width: 50%;">
</el-form-item> <el-input v-model="projectForme.taskPlace" maxlength="500" show-word-limit />
<el-form-item label="任务人员" style="width: 50%;margin-left: 15px;"> </el-form-item>
<el-input v-model="projectForme.taskPerson" maxlength="500" show-word-limit /> <el-form-item label="任务人员" style="width: 50%;margin-left: 15px;">
</el-form-item> <el-input v-model="projectForme.taskPerson" maxlength="500" show-word-limit />
</div> </el-form-item>
<div style="width: 100%;display: flex;justify-content: space-between;align-items: center;"> </div>
<el-form-item label="载机名称" style="width: 50%;"> <div style="width: 100%;display: flex;justify-content: space-between;align-items: center;">
<el-input v-model="projectForme.carrierName" maxlength="40" show-word-limit /> <el-form-item label="载机名称" style="width: 50%;">
</el-form-item> <el-input v-model="projectForme.carrierName" maxlength="40" show-word-limit />
<el-form-item label="设备代号_编号" style="width: 50%;margin-left: 15px;"> </el-form-item>
<el-input v-model="projectForme.deviceCode" maxlength="40" show-word-limit /> <el-form-item label="设备代号_编号" style="width: 50%;margin-left: 15px;">
</el-form-item> <el-input v-model="projectForme.deviceCode" maxlength="40" show-word-limit />
</div> </el-form-item>
<!-- <el-form-item label="载体类型"> </div>
<!-- <el-form-item label="载体类型">
<el-input v-model="projectForme.carrierType" maxlength="200" show-word-limit /> <el-input v-model="projectForme.carrierType" maxlength="200" show-word-limit />
</el-form-item> --> </el-form-item> -->
<el-form-item label="试验描述"> <el-form-item label="试验描述">
<el-input v-model="projectForme.testDescribe" :rows="12" type="textarea" show-word-limit /> <el-input v-model="projectForme.testDescribe" :rows="12" type="textarea" show-word-limit />
</el-form-item> </el-form-item>
<el-form-item label="传感器描述"> <el-form-item label="传感器描述">
<el-input v-model="projectForme.sensorDescribe" :rows="12" type="textarea" show-word-limit /> <el-input v-model="projectForme.sensorDescribe" :rows="12" type="textarea" show-word-limit />
</el-form-item> </el-form-item>
<!-- <el-form-item label="设备名称"> <!-- <el-form-item label="设备名称">
<el-input v-model="projectForme.deviceName" maxlength="40" show-word-limit /> <el-input v-model="projectForme.deviceName" maxlength="40" show-word-limit />
</el-form-item> --> </el-form-item> -->
<el-form-item v-for="(item, index) in formitemarr" :label="item.name">
<div style="width: 100%;display: flex;align-items: center;justify-content: space-between;">
<el-input v-model="item.data" style="width: 92%;" />
<el-button type="primary" @click="dellable(index)">删除</el-button>
</div>
</el-form-item>
</el-scrollbar>
<el-form-item> <el-form-item>
<div style="width: 100%;display: flex;justify-content: end;"> <div style="width: 100%;display: flex;justify-content: end;">
<el-button type="primary" @click="submitForm(ruleFormRef)">确定</el-button> <el-button type="primary" @click="addformItem">添加属性</el-button>
<el-button @click="handleClose(ruleFormRef)">取消</el-button> <el-button type="primary" @click="submitForm(ruleFormRef)">确定</el-button>
</div> <el-button @click="handleClose(ruleFormRef)">取消</el-button>
</el-form-item> </div>
</el-form-item>
</el-form> </el-form>
</el-dialog> </el-dialog>
<el-dialog :title="'添加属性'" v-model="labledone" width="20%" :before-close="labledoneclose" top="30px" draggable
:close-on-click-modal="false" destroy-on-close>
<el-input v-model="dataname" placeholder="请输入属性名称" />
<div style="width: 100%;display: flex;justify-content: end;margin-top: 10px;">
<el-button type="primary" @click="labledsure()">确定</el-button>
</div>
</el-dialog>
<el-dialog :title="'自定义属性详情'" v-model="attbute" width="1200px" :before-close="attributeclose" top="30px"
draggable :close-on-click-modal="false" destroy-on-close>
<el-table v-if="result2.length > 0" v-loading="attloading" :data="result1"
:header-cell-style="{ background: 'rgb(250 250 250)', color: '#383838', height: '50px' }"
style="width: 100%; height: calc(30vh);margin-bottom: 20px;" border>
<el-table-column v-for="item in result2" :prop="item.id" :label="item.name"></el-table-column>
</el-table>
<div v-else
style="width: 100%;height: 285px;display: flex;align-items: center;justify-content: center;border: 1px solid #ebeef5;">
<el-empty description="暂无数据" />
</div>
</el-dialog>
<el-dialog :title="title" v-model="logqing" width="60%" :before-close="handleClose1" top="30px" draggable <el-dialog :title="title" v-model="logqing" width="60%" :before-close="handleClose1" top="30px" draggable
:close-on-click-modal="false" destroy-on-close> :close-on-click-modal="false" destroy-on-close>
<div class="texlog"> <div class="texlog">