地图和接口

xuhongjie
严飞永 2 months ago
parent 5fdadd26bf
commit 5af939f6a1

@ -50,6 +50,7 @@
"jsencrypt": "3.0.0-rc.1",
"leaflet": "^1.9.4",
"mars2d": "^3.3.1",
"mars2d-esri": "^3.3.1",
"nprogress": "0.2.0",
"quill": "2.0.2",
"screenfull": "5.0.2",

@ -281,4 +281,46 @@ export function getXmxlPage(params) {
method: 'get',
params
});
}
}
//企业入驻内容区表格
//新增数据
export function addqyrz(data) {
return request({
url: '/gysl/qyrzInformation/add',
method: 'post',
data
});
}
//修改数据
export function updateqyrz(data) {
return request({
url: '/gysl/qyrzInformation/edit',
method: 'post',
data
});
}
//分页查询所有数据
export function getqyrzPage(params) {
return request({
url: '/gysl/qyrzInformation/page',
method: 'get',
params
});
}
//删除数据
export function deleteqyrz(idList) {
return request({
url: '/gysl/qyrzInformation/delete',
method: 'delete',
params: { idList }
});
}
//通过主键查询单条数据
export function getqyrzById(id) {
return request({
url: `/gysl/qyrzInformation/${id}`,
method: 'get'
});
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

@ -43,32 +43,31 @@
<el-form :model="form" :rules="rules" ref="form" label-width="180px">
<el-row>
<el-col :span="12">
<el-form-item label="项目名称">
<el-input v-model="form.name"></el-input>
<el-form-item label="项目名称" prop="name">
<el-input v-model="form.name" maxlength="50"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="建设地点">
<el-input v-model="form.jsdd"></el-input>
<el-form-item label="建设地点" prop="jsdd">
<el-input v-model="form.jsdd" maxlength="50"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="项目法人单位">
<el-input v-model="form.xmfrdwxz"></el-input>
<el-form-item label="项目法人单位" prop="xmfrdwxz">
<el-input v-model="form.xmfrdwxz" maxlength="50"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="重点发展产业">
<el-input v-model="form.prioritize
"></el-input>
<el-form-item label="重点发展产业" prop="prioritize">
<el-input v-model="form.prioritize" maxlength="50"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="项目法人单位性质">
<el-form-item label="项目法人单位性质" prop="nature">
<el-select v-model="form.nature" placeholder="请选择" value-key="value"
style="width: 22.5rem;">
<el-option v-for="dict in dict.type.xmfrdwxz" :key="dict.value" :label="dict.label"
@ -77,7 +76,7 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="建设模式">
<el-form-item label="建设模式" prop="jsms">
<el-select v-model="form.jsms" placeholder="请选择" value-key="value" style="width: 22.5rem;">
<el-option v-for="dict in dict.type.jsms" :key="dict.value" :label="dict.label"
:value="parseInt(dict.value)" />
@ -87,43 +86,43 @@
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="施工单位">
<el-input v-model="form.sgdw"></el-input>
<el-form-item label="施工单位" prop="sgdw">
<el-input v-model="form.sgdw" maxlength="50"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目标签">
<el-input v-model="form.label"></el-input>
<el-form-item label="项目标签" prop="label">
<el-input v-model="form.label" maxlength="50"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="设计单位">
<el-input v-model="form.sjdw"></el-input>
<el-form-item label="设计单位" prop="sjdw">
<el-input v-model="form.sjdw" maxlength="50"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目负责人">
<el-input v-model="form.projectLeader"></el-input>
<el-form-item label="项目负责人" prop="projectLeader">
<el-input v-model="form.projectLeader" maxlength="50"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="总投资额(万元)">
<el-input v-model.number="form.ztze"></el-input>
<el-form-item label="总投资额(万元)" prop="ztze">
<el-input v-model.number="form.ztze" maxlength="50"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系方式">
<el-input v-model="form.phone"></el-input>
<el-form-item label="联系方式" prop="phone">
<el-input v-model="form.phone" maxlength="50"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="所属功能区">
<el-form-item label="所属功能区" prop="ssgnq">
<el-select v-model="form.ssgnq" placeholder="请选择" value-key="value" style="width: 22.5rem;">
<el-option v-for="dict in dict.type.ssgnq" :key="dict.value" :label="dict.label"
:value="parseInt(dict.value)" />
@ -131,37 +130,28 @@
</el-form-item>
</el-col>
<el-col :span="12">
<!-- <el-form-item label="施工许可证发放时间">
<el-date-picker
v-model="form.issuingTime"
type="datetime"
placeholder="选择日期时间"
style="width: 22.5rem;"
value-format="yyyy-MM-dd HH:mm:ss"
></el-date-picker>
</el-form-item> -->
<el-form-item label="施工许可证发放时间">
<el-input v-model="form.issuingTime"></el-input>
<el-form-item label="施工许可证发放时间" prop="issuingTime">
<el-input v-model="form.issuingTime" maxlength="50"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="建设起止时间">
<el-form-item label="建设起止时间" prop="begainTime">
<el-date-picker v-model="form.begainTime" type="daterange" range-separator=""
start-placeholder="开始日期" end-placeholder="结束日期"
style="width: 22.5rem;"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="竣工验收时间">
<el-input v-model="form.acceptanceTime"></el-input>
<el-form-item label="竣工验收时间" prop="acceptanceTime">
<el-input v-model="form.acceptanceTime" maxlength="50"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="现状分类">
<el-form-item label="现状分类" prop="xzfl">
<el-select v-model="form.xzfl" placeholder="请选择" value-key="value" style="width: 22.5rem;">
<el-option v-for="dict in dict.type.xzfl" :key="dict.value" :label="dict.label"
:value="parseInt(dict.value)" />
@ -169,16 +159,16 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="建设进度">
<el-input v-model="form.constructionProgress"></el-input>
<el-form-item label="建设进度" prop="constructionProgress">
<el-input v-model="form.constructionProgress" maxlength="50"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="项目法人单位简介">
<el-input v-model="form.unitIntroduction" type="textarea" rows="4"></el-input>
<el-form-item label="项目法人单位简介" prop="unitIntroduction">
<el-input v-model="form.unitIntroduction" type="textarea" rows="4" maxlength="1000"></el-input>
</el-form-item>
<el-form-item label="项目简介">
<el-input v-model="form.introduction" type="textarea" rows="4"></el-input>
<el-form-item label="项目简介" prop="introduction">
<el-input v-model="form.introduction" type="textarea" rows="4" maxlength="1000"></el-input>
</el-form-item>
<el-form-item label="项目代表性照片">
<ImageUpload v-model="form.fj" />
@ -244,8 +234,52 @@ export default {
fj: ''
},
rules: {
name: [{ required: true, message: '项目名称不能为空', trigger: 'blur' }],
jsdd: [{ required: true, message: '建设地点不能为空', trigger: 'blur' }],
name: [
{ required: true, message: '项目名称不能为空', trigger: 'blur' },
{ max: 50, message: '项目名称不能超过50个字', trigger: 'blur' }
],
jsdd: [
{ required: true, message: '建设地点不能为空', trigger: 'blur' },
{ max: 50, message: '建设地点不能超过50个字', trigger: 'blur' }
],
xmfrdwxz: [
{ required: true, message: '项目法人单位不能为空', trigger: 'blur' },
{ max: 50, message: '项目法人单位不能超过50个字', trigger: 'blur' }
],
nature: [
{ required: true, message: '项目法人单位性质不能为空', trigger: 'change' }
],
sgdw: [
{ max: 50, message: '施工单位不能超过50个字', trigger: 'blur' }
],
sjdw: [
{ max: 50, message: '设计单位不能超过50个字', trigger: 'blur' }
],
ztze: [
{ required: true, message: '总投资额不能为空', trigger: 'blur' },
{ type: 'number', message: '总投资额必须是数字', trigger: 'blur' },
],
ssgnq: [
{ required: true, message: '所属功能区不能为空', trigger: 'change' }
],
// begainTime: [
// { required: true, message: '', trigger: 'change' }
// ],
xzfl: [
{ required: true, message: '现状分类不能为空', trigger: 'change' }
],
projectLeader: [
{ required: true, message: '项目负责人不能为空', trigger: 'blur' },
],
phone: [
{ required: true, message: '联系方式不能为空', trigger: 'blur' },
],
unitIntroduction: [
{ max: 1000, message: '项目法人单位简介不能超过1000个字', trigger: 'blur' }
],
introduction: [
{ max: 1000, message: '项目简介不能超过1000个字', trigger: 'blur' }
]
},
// select
ssgnqMap: {

@ -1,165 +1,197 @@
<template>
<div class="maintenance">
<!-- 导入按钮 -->
<el-button type="primary" icon="plus" @click="handleOpenUploadDialog"> Excel</el-button>
<!-- 表格 -->
<el-table :data="tableData" style="width: 100%" border>
<el-table-column
v-for="(header, index) in tableHeaders"
:key="index"
:prop="header"
:label="header"
></el-table-column>
</el-table>
<!-- 上传文件的弹窗 -->
<el-dialog title="上传 Excel 文件" :visible.sync="uploadDialogVisible" width="30%">
<el-upload
action="#"
accept=".xlsx,.xls"
:before-upload="beforeUpload"
:on-change="handleFileChange"
:auto-upload="false"
:show-file-list="false"
>
<el-button type="primary" icon="upload">选择文件</el-button>
<el-button type="primary" icon="download" @click="downloadTemplate"></el-button>
</el-upload>
<div v-if="fileName">
已选择文件: {{ fileName }}
<div class="container">
<!-- 顶部信息 -->
<div class="containertop">
<div class="topleft">
<img src="../../../assets/images/detailsicon/1.png" alt="">
<span>企业入驻信息</span>
</div>
<div class="topright">
<!-- 编辑按钮 -->
<el-button type="primary" size="medium" plain
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;" @click="toggleEdit">
<img src="../../../assets/images/detailsicon/icon-bj@2x.png" alt="编辑"
style="width: 0.6rem; height: 0.6rem; margin-right: 4px;">
{{ editMode ? '保存' : '编辑' }}
</el-button>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="uploadDialogVisible = false">取消</el-button>
<el-button type="primary" @click="handleUploadFile"></el-button>
</span>
</el-dialog>
</div>
<!-- 内容区上方的表格 -->
<div class="tagdiv">
<div class="descriptionsdiv">
<el-descriptions class="margin-top" :column="4" border>
<el-descriptions-item>
<template slot="label">
入驻企业数
</template>
<el-input v-model="currentCompany.rzqys" v-if="editMode"></el-input>
<span v-else>{{ currentCompany.rzqys }}</span>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
入驻企业行业类型
</template>
<el-input v-model="currentCompany.rzqyhylx" v-if="editMode"></el-input>
<span v-else>{{ currentCompany.rzqyhylx }}</span>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
人员数量
</template>
<el-input v-model="currentCompany.rysl" v-if="editMode"></el-input>
<span v-else>{{ currentCompany.rysl }}</span>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
入住率%
</template>
<el-input v-model="currentCompany.rzl" v-if="editMode"></el-input>
<span v-else>{{ currentCompany.rzl }}</span>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
已出租面积平方米
</template>
<el-input v-model="currentCompany.yczmj" v-if="editMode"></el-input>
<span v-else>{{ currentCompany.yczmj }}</span>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
空置出租面积平方米
</template>
<el-input v-model="currentCompany.kzczmj" v-if="editMode"></el-input>
<span v-else>{{ currentCompany.kzczmj }}</span>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
工业厂房平均租金/平方米*
</template>
<el-input v-model="currentCompany.gycfpjzj" v-if="editMode"></el-input>
<span v-else>{{ currentCompany.gycfpjzj }}</span>
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
工业厂房平均物业费(/平方米*)
</template>
<el-input v-model="currentCompany.gycfpjwyf" v-if="editMode"></el-input>
<span v-else>{{ currentCompany.gycfpjwyf }}</span>
</el-descriptions-item>
</el-descriptions>
</div>
</div>
</div>
</template>
<script>
import * as XLSX from 'xlsx';
import { updateqyrz, getqyrzById } from '@/api/ManageApi/index';
export default {
data() {
return {
title: 'Excel 文件处理',
uploadDialogVisible: false, //
tableHeaders: [], //
tableData: [], //
selectedFile: null, //
fileName: '', //
editMode: false, //
currentCompany: {
rzqys: 0, //
rzqyhylx: '', //
rysl: 0, //
rzl: 0, //
yczmj: 0, //
kzczmj: 0, //
gycfpjzj: 0, //
gycfpjwyf: 0, //
},
};
},
mounted() {
this.fetchCompanyData(); //
},
methods: {
//
handleOpenUploadDialog() {
this.uploadDialogVisible = true;
},
//
beforeUpload(file) {
const isExcel =
file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ||
file.type === 'application/vnd.ms-excel';
if (!isExcel) {
this.$message.error('只能上传 Excel 文件!');
return false;
//
toggleEdit() {
if (this.editMode) {
this.saveData(); //
}
const requiredHeaders = ['企业名称', '统一信用代码', '所属行业', '租金价格(元/每平方米*月)'];
const reader = new FileReader();
reader.onload = (e) => {
const data = e.target.result;
const workbook = XLSX.read(data, { type: 'binary' });
//
const sheetName = workbook.SheetNames[0];
const worksheet = workbook.Sheets[sheetName];
// JSON
const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
//
if (jsonData.length > 0) {
const headers = jsonData[0];
const hasRequiredHeaders = requiredHeaders.every(header => headers.includes(header));
if (!hasRequiredHeaders) {
this.$message.error('上传的文件格式不正确,请使用模板文件!');
return false;
}
}
// handleFileChange
this.handleFileChange({ raw: file, name: file.name });
return true;
};
reader.readAsBinaryString(file);
return false; //
this.editMode = !this.editMode; //
},
//
handleFileChange(file) {
if (file) {
this.selectedFile = file.raw; //
this.fileName = file.name; //
//
async fetchCompanyData() {
try {
const response = await getqyrzById(this.$route.params.id);
this.currentCompany = response.data; //
} catch (error) {
console.error('获取企业入驻信息失败:', error);
this.$message.error('获取企业入驻信息失败');
}
},
//
handleUploadFile() {
if (!this.selectedFile) {
this.$message.warning('请先选择文件!');
return;
//
async saveData() {
try {
const response = await updateqyrz(this.currentCompany);
if (response.success) {
this.$message.success('保存成功');
} else {
this.$message.error('保存失败');
}
} catch (error) {
console.error('保存失败:', error);
this.$message.error('保存失败');
}
}
}
};
</script>
const reader = new FileReader();
reader.onload = (e) => {
const data = e.target.result;
const workbook = XLSX.read(data, { type: 'binary' });
//
const sheetName = workbook.SheetNames[0];
const worksheet = workbook.Sheets[sheetName];
<style scoped>
.container {
display: flex;
flex-direction: column;
width: 100%;
background-color: #FFFFFF;
box-shadow: 0rem 0.13rem 0.63rem 0rem rgba(177, 177, 177, 0.1);
border-radius: 0.5rem 0.5rem 0.5rem 0.5rem;
}
// JSON
const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
.containertop {
height: auto;
display: flex;
justify-content: space-between;
padding: .7rem 0;
padding: .5rem;
border-bottom: 1px solid #E5E5E5;
}
//
if (jsonData.length > 0) {
this.tableHeaders = jsonData[0]; //
this.tableData = jsonData.slice(1).map((row) => {
const rowData = {};
this.tableHeaders.forEach((header, index) => {
rowData[header] = row[index];
});
return rowData;
});
}
.topleft {
width: 8rem;
display: flex;
gap: 0.4rem;
align-items: center;
}
this.$message.success('文件上传并解析成功!');
this.uploadDialogVisible = false; //
};
.topleft img {
width: 0.81rem;
height: 0.81rem;
}
reader.readAsBinaryString(this.selectedFile);
},
.topleft span {
width: auto;
height: 0.88rem;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 500;
font-size: 0.88rem;
color: #3D424C;
line-height: 0.88rem;
text-align: right;
font-style: normal;
text-transform: none;
}
//
downloadTemplate() {
const link = document.createElement('a');
link.href = '/template.xlsx'; //
link.download = 'template.xlsx';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
},
},
};
</script>
.descriptionsdiv {
width: 100%;
margin-left: 1rem;
height: auto;
}
<style scoped>
.maintenance {
padding: 20px;
.tagdiv {
padding: 1rem 3em 1rem 1rem;
}
</style>

@ -1,91 +1,91 @@
<template>
<div class="container">
<!-- 顶部操作栏 -->
<div class="containertop">
<div class="topleft">
<img src="../../../assets/images/detailsicon/1.png" alt="">
<span>项目图例</span>
</div>
<div class="topright">
<el-button type="primary" size="medium" plain
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;" @click="handleEdit">
<img src="../../../assets/images/detailsicon/icon-xz@2x.png" alt="编辑"
style="width: 0.6rem; height: 0.6rem; margin-right: 4px;">
编辑
</el-button>
</div>
</div>
<!-- 内容区域 -->
<div class="main-content">
<!-- 左侧两个轮播图 -->
<div class="carousel-container">
<!-- 上侧轮播图 -->
<div class="carousel">
<div class="carousel-control left" @click="prevImage(1)">
<img src="../../../assets/images/icon-left@2x.png" alt="">
</div>
<div v-for="(item, index) in carousel1Items" :key="index" class="carousel-item"
:class="{ active: index === currentIndex1 }">
<img :src="item" :alt="'Image ' + (index + 1)" />
</div>
<div class="carousel-control right" @click="nextImage(1)">
<img src="../../../assets/images/icon-right@2x.png" alt="">
</div>
<div class="classify">
外部
</div>
<div class="container">
<!-- 顶部操作栏 -->
<div class="containertop">
<div class="topleft">
<img src="../../../assets/images/detailsicon/1.png" alt="">
<span>项目图例</span>
</div>
<div class="topright">
<el-button type="primary" size="medium" plain
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;" @click="handleEdit">
<img src="../../../assets/images/detailsicon/icon-xz@2x.png" alt="编辑"
style="width: 0.6rem; height: 0.6rem; margin-right: 4px;">
编辑
</el-button>
</div>
</div>
<!-- 下侧轮播图 -->
<div class="carousel">
<div class="carousel-control left" @click="prevImage(2)">
<img src="../../../assets/images/icon-left@2x.png" alt="">
</div>
<div v-for="(item, index) in carousel2Items" :key="index" class="carousel-item"
:class="{ active: index === currentIndex2 }">
<img :src="item" :alt="'Image ' + (index + 1)" />
</div>
<div class="carousel-control right" @click="nextImage(2)">
<img src="../../../assets/images/icon-right@2x.png" alt="">
</div>
<div class="classify">
内部
</div>
</div>
</div>
<!-- 内容区域 -->
<div class="main-content">
<!-- 左侧两个轮播图 -->
<div class="carousel-container">
<!-- 上侧轮播图 -->
<div class="carousel">
<div class="carousel-control left" @click="prevImage(1)">
<img src="../../../assets/images/icon-left@2x.png" alt="">
</div>
<div v-for="(item, index) in carousel1Items" :key="index" class="carousel-item"
:class="{ active: index === currentIndex1 }">
<img :src="item" :alt="'Image ' + (index + 1)" />
</div>
<div class="carousel-control right" @click="nextImage(1)">
<img src="../../../assets/images/icon-right@2x.png" alt="">
</div>
<div class="classify">
外部
</div>
</div>
<!-- 右侧地图缩略图 -->
<div class="map-thumbnail">
<div id="mars2dContainer" class="mars2d-container"></div>
<div class="classify">
位置
<!-- 下侧轮播图 -->
<div class="carousel">
<div class="carousel-control left" @click="prevImage(2)">
<img src="../../../assets/images/icon-left@2x.png" alt="">
</div>
<div v-for="(item, index) in carousel2Items" :key="index" class="carousel-item"
:class="{ active: index === currentIndex2 }">
<img :src="item" :alt="'Image ' + (index + 1)" />
</div>
<div class="carousel-control right" @click="nextImage(2)">
<img src="../../../assets/images/icon-right@2x.png" alt="">
</div>
<div class="classify">
内部
</div>
</div>
</div>
<!-- 右侧地图缩略图 -->
<div class="map-thumbnail">
<div id="mars2dContainerSSS" class="mars2d-container"></div>
<div class="classify">
位置
</div>
</div>
</div>
</div>
</div>
<!-- 编辑/新增对话框 -->
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="500px">
<el-form :model="form" label-width="120px">
<el-form-item label="类型">
<el-select v-model="form.type" placeholder="请选择类型">
<el-option v-for="dict in dict.type.tplx" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="图片上传">
<el-upload action="https://jsonplaceholder.typicode.com/posts/" :on-success="handleUploadSuccess"
:on-remove="handleUploadRemove" :file-list="fileList" list-type="picture-card">
<i class="el-icon-plus"></i>
</el-upload>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="handleSubmit"></el-button>
</span>
</el-dialog>
</div>
<!-- 编辑/新增对话框 -->
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="500px">
<el-form :model="form" label-width="120px">
<el-form-item label="类型">
<el-select v-model="form.type" placeholder="请选择类型">
<el-option v-for="dict in dict.type.tplx" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="图片上传">
<el-upload action="https://jsonplaceholder.typicode.com/posts/" :on-success="handleUploadSuccess"
:on-remove="handleUploadRemove" :file-list="fileList" list-type="picture-card">
<i class="el-icon-plus"></i>
</el-upload>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="handleSubmit"></el-button>
</span>
</el-dialog>
</div>
</template>
<script>
@ -93,250 +93,273 @@ import 'mars2d/mars2d.css';
import * as mars2d from 'mars2d';
export default {
components: {},
dicts: ['tplx'],
data() {
const basePathUrl = window.basePathUrl || "";
return {
configUrl: basePathUrl + "config/config.json",
mapOptions: {
// http://mars2d.cn/apidoc.html#Map
copyright: false, // logo
// basemap: 2021,
basemaps: [
{
"id": 2021,
"pid": 10,
"name": "高德电子",
"icon": "img/basemaps/gaode_vec.png",
"type": "gaode",
"layer": "vec",
"show": true
},
],
center: { lat: 31.2704, lng: 120.7600 }, //
zoom: 16, //
minZoom: 15, //
maxZoom: 20, //
zoomControl: true,
},
// 使
carousel1Items: [
'https://picsum.photos/300/200?random=1',
'https://picsum.photos/300/200?random=2',
'https://picsum.photos/300/200?random=3',
],
carousel2Items: [
'https://picsum.photos/300/200?random=4',
'https://picsum.photos/300/200?random=5',
'https://picsum.photos/300/200?random=6',
],
currentIndex1: 0, //
currentIndex2: 0, //
//
dialogVisible: false,
dialogTitle: '编辑项目',
form: {
type: '外部', //
images: [], //
},
fileList: [], //
map: null, //
};
},
methods: {
onload(map) {
//
components: {},
dicts: ['tplx'],
data() {
const basePathUrl = window.basePathUrl || "";
return {
configUrl: basePathUrl + "config/config.json",
mapOptions: {
// http://mars2d.cn/apidoc.html#Map
copyright: false, // logo
basemaps: [
{
"id": 2021,
"pid": 10,
"name": "高德电子",
"icon": "img/basemaps/gaode_vec.png",
"type": "gaode",
"layer": "vec",
"show": true
},
],
center: { lat: 31.3256, lng: 120.7457 },
zoom: 16, //
minZoom: 15, //
maxZoom: 20, //
zoomControl: true,
},
// 使
carousel1Items: [
'https://picsum.photos/300/200?random=1',
'https://picsum.photos/300/200?random=2',
'https://picsum.photos/300/200?random=3',
],
carousel2Items: [
'https://picsum.photos/300/200?random=4',
'https://picsum.photos/300/200?random=5',
'https://picsum.photos/300/200?random=6',
],
currentIndex1: 0, //
currentIndex2: 0, //
//
dialogVisible: false,
dialogTitle: '编辑项目',
form: {
type: '外部', //
images: [], //
},
fileList: [], //
map: null, //
markerIcon: require('@/assets/images/detailsicon/icon-定位@2x.png'), // 使 require
};
},
//
prevImage(carouselIndex) {
if (carouselIndex === 1) {
this.currentIndex1 =
(this.currentIndex1 - 1 + this.carousel1Items.length) % this.carousel1Items.length;
} else if (carouselIndex === 2) {
this.currentIndex2 =
(this.currentIndex2 - 1 + this.carousel2Items.length) % this.carousel2Items.length;
}
methods: {
onload(map) {
//
},
//
prevImage(carouselIndex) {
if (carouselIndex === 1) {
this.currentIndex1 =
(this.currentIndex1 - 1 + this.carousel1Items.length) % this.carousel1Items.length;
} else if (carouselIndex === 2) {
this.currentIndex2 =
(this.currentIndex2 - 1 + this.carousel2Items.length) % this.carousel2Items.length;
}
},
//
nextImage(carouselIndex) {
if (carouselIndex === 1) {
this.currentIndex1 = (this.currentIndex1 + 1) % this.carousel1Items.length;
} else if (carouselIndex === 2) {
this.currentIndex2 = (this.currentIndex2 + 1) % this.carousel2Items.length;
}
},
//
handleEdit() {
this.dialogTitle = '编辑项目';
this.dialogVisible = true;
//
this.form = {
type: '外部', //
images: [], //
};
},
//
handleSubmit() {
this.dialogVisible = false;
// API
},
//
handleUploadSuccess(response, file) {
this.fileList.push(file);
this.form.images.push(file.url);
},
//
handleUploadRemove(file) {
const index = this.fileList.indexOf(file);
if (index !== -1) {
this.fileList.splice(index, 1);
this.form.images.splice(index, 1);
}
},
//
initMap() {
this.map = new mars2d.Map('mars2dContainerSSS', this.mapOptions);
this.map.on('load', this.onload);
},
//
onload() {
this.addTestMarker();
},
addTestMarker() {
const graphic = new mars2d.graphic.Marker({
latlng: [31.3256, 120.7457], //xxxx
style: {
image: this.markerIcon, // 使
width: 46,
height: 60,
horizontalOrigin: mars2d.HorizontalOrigin.CENTER,
verticalOrigin: mars2d.VerticalOrigin.BOTTOM
},
// attr: { remark: "xxxx" }
});
this.map.graphicLayer.addGraphic(graphic);
}
},
//
nextImage(carouselIndex) {
if (carouselIndex === 1) {
this.currentIndex1 = (this.currentIndex1 + 1) % this.carousel1Items.length;
} else if (carouselIndex === 2) {
this.currentIndex2 = (this.currentIndex2 + 1) % this.carousel2Items.length;
}
mounted() {
this.initMap();
},
//
handleEdit() {
this.dialogTitle = '编辑项目';
this.dialogVisible = true;
//
this.form = {
type: '外部', //
images: [], //
};
},
//
handleSubmit() {
this.dialogVisible = false;
// API
},
//
handleUploadSuccess(response, file) {
this.fileList.push(file);
this.form.images.push(file.url);
},
//
handleUploadRemove(file) {
const index = this.fileList.indexOf(file);
if (index !== -1) {
this.fileList.splice(index, 1);
this.form.images.splice(index, 1);
}
},
//
initMap() {
this.map = new mars2d.Map('mars2dContainer', this.mapOptions);
},
},
mounted() {
this.initMap();
},
beforeDestroy() {
if (this.map) {
this.map.destroy();
}
}
};
</script>
<style scoped>
.container {
display: flex;
flex-direction: column;
width: 100%;
background-color: #FFFFFF;
box-shadow: 0rem 0.13rem 0.63rem 0rem rgba(177, 177, 177, 0.1);
border-radius: 0.5rem 0.5rem 0.5rem 0.5rem;
gap: 1rem;
overflow: auto;
display: flex;
flex-direction: column;
width: 100%;
background-color: #FFFFFF;
box-shadow: 0rem 0.13rem 0.63rem 0rem rgba(177, 177, 177, 0.1);
border-radius: 0.5rem 0.5rem 0.5rem 0.5rem;
gap: 1rem;
overflow: auto;
}
.containertop {
height: auto;
display: flex;
justify-content: space-between;
padding: .5rem;
border-bottom: 1px solid #E5E5E5;
height: auto;
display: flex;
justify-content: space-between;
padding: .5rem;
border-bottom: 1px solid #E5E5E5;
}
.action-bar {
margin-bottom: 20px;
margin-bottom: 20px;
}
.main-content {
display: flex;
gap: 2rem;
padding: 1rem;
display: flex;
gap: 2rem;
padding: 1rem;
}
.carousel-container {
display: flex;
flex-direction: column;
gap: 1rem;
display: flex;
flex-direction: column;
gap: 1rem;
}
.carousel {
width: 21rem;
height: 12rem;
position: relative;
overflow: hidden;
width: 21rem;
height: 12rem;
position: relative;
overflow: hidden;
}
.carousel-item {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
opacity: 0;
transition: opacity 0.5s ease-in-out;
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
opacity: 0;
transition: opacity 0.5s ease-in-out;
}
.carousel-item img {
width: 100%;
height: 100%;
object-fit: cover;
width: 100%;
height: 100%;
object-fit: cover;
}
.carousel-item.active {
opacity: 1;
opacity: 1;
}
.carousel-control {
position: absolute;
top: 50%;
transform: translateY(-50%);
cursor: pointer;
font-size: 1.5rem;
color: white;
padding: 0.5rem;
z-index: 10;
position: absolute;
top: 50%;
transform: translateY(-50%);
cursor: pointer;
font-size: 1.5rem;
color: white;
padding: 0.5rem;
z-index: 10;
}
.carousel-control.left {
left: 0;
left: 0;
}
.carousel-control.right {
right: 0;
right: 0;
}
.topleft {
width: 8rem;
display: flex;
gap: 0.4rem;
align-items: center;
width: 8rem;
display: flex;
gap: 0.4rem;
align-items: center;
}
.topleft img {
width: 0.81rem;
height: 0.81rem;
width: 0.81rem;
height: 0.81rem;
}
.topleft span {
width: auto;
height: 0.88rem;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 500;
font-size: 0.88rem;
color: #3D424C;
line-height: 0.88rem;
text-align: right;
font-style: normal;
text-transform: none;
width: auto;
height: 0.88rem;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 500;
font-size: 0.88rem;
color: #3D424C;
line-height: 0.88rem;
text-align: right;
font-style: normal;
text-transform: none;
}
.classify {
width: 2.81rem;
height: 1.38rem;
background-color: rgba(43, 98, 241, 0.8);
border-radius: 0.69rem 0.69rem 0.69rem 0.69rem;
color: white;
position: absolute;
bottom: .5rem;
left: .5rem;
display: flex;
justify-content: center;
align-items: center;
font-size: .7rem;
z-index: 999;
width: 2.81rem;
height: 1.38rem;
background-color: rgba(43, 98, 241, 0.8);
border-radius: 0.69rem 0.69rem 0.69rem 0.69rem;
color: white;
position: absolute;
bottom: .5rem;
left: .5rem;
display: flex;
justify-content: center;
align-items: center;
font-size: .7rem;
z-index: 999;
}
.map-thumbnail {
width: 76rem;
height: 25rem;
position: relative;
width: 76rem;
height: 25rem;
position: relative;
}
.mars2d-container {
width: 76rem;
height: 25rem;
width: 100%;
height: 100%;
}
</style>

@ -0,0 +1,137 @@
<template>
<div class="container">
<!-- 顶部操作栏 -->
<!-- 内容区域 -->
<div class="main-content">
<!-- 右侧地图缩略图 -->
<div class="map-thumbnail">
<div id="mars2dContainerSSS" class="mars2d-container"></div>
<div class="classify">
位置
</div>
</div>
</div>
</div>
</template>
<script>
import 'mars2d/mars2d.css';
import * as mars2d from 'mars2d';
export default {
components: {},
data() {
const basePathUrl = window.basePathUrl || "";
return {
configUrl: basePathUrl + "config/config.json",
mapOptions: {
// http://mars2d.cn/apidoc.html#Map
copyright: false, // logo
basemaps: [
{
"id": 2021,
"pid": 10,
"name": "高德电子",
"icon": "img/basemaps/gaode_vec.png",
"type": "gaode",
"layer": "vec",
"show": true
},
],
center: { lat: 31.2704, lng: 120.7600 }, //
zoom: 16, //
minZoom: 15, //
maxZoom: 20, //
zoomControl: true,
},
map: null, //
markerIcon: require('@/assets/images/detailsicon/icon-定位@2x.png'), // 使 require
};
},
methods: {
//
initMap() {
this.map = new mars2d.Map('mars2dContainerSSS', this.mapOptions);
this.map.on('load', this.onload);
},
//
onload() {
this.addTestMarker();
},
// WGS84()
addTestMarker() {
const graphic = new mars2d.graphic.Marker({
latlng: [31.835299, 120.216588],
style: {
image: this.markerIcon, // 使
width: 32,
height: 44,
horizontalOrigin: mars2d.HorizontalOrigin.CENTER,
verticalOrigin: mars2d.VerticalOrigin.BOTTOM
},
attr: { remark: "示例1" }
});
this.map.graphicLayer.addGraphic(graphic);
graphic.bindPopup("<p>我是WGS84坐标下望江西路与怀宁路交口</p>").openPopup();
}
},
mounted() {
this.initMap();
},
beforeDestroy() {
if (this.map) {
this.map.destroy();
}
}
};
</script>
<style scoped>
.container {
display: flex;
flex-direction: column;
width: 100%;
background-color: #FFFFFF;
box-shadow: 0rem 0.13rem 0.63rem 0rem rgba(177, 177, 177, 0.1);
border-radius: 0.5rem 0.5rem 0.5rem 0.5rem;
gap: 1rem;
overflow: auto;
}
.main-content {
display: flex;
gap: 2rem;
padding: 1rem;
}
.map-thumbnail {
width: 76rem;
height: 25rem;
position: relative;
}
.mars2d-container {
width: 100%;
height: 100%;
}
.classify {
width: 2.81rem;
height: 1.38rem;
background-color: rgba(43, 98, 241, 0.8);
border-radius: 0.69rem 0.69rem 0.69rem 0.69rem;
color: white;
position: absolute;
bottom: .5rem;
left: .5rem;
display: flex;
justify-content: center;
align-items: center;
font-size: .7rem;
z-index: 999;
}
</style>

@ -0,0 +1,165 @@
<template>
<div class="maintenance">
<!-- 导入按钮 -->
<el-button type="primary" icon="plus" @click="handleOpenUploadDialog"> Excel</el-button>
<!-- 表格 -->
<el-table :data="tableData" style="width: 100%" border>
<el-table-column
v-for="(header, index) in tableHeaders"
:key="index"
:prop="header"
:label="header"
></el-table-column>
</el-table>
<!-- 上传文件的弹窗 -->
<el-dialog title="上传 Excel 文件" :visible.sync="uploadDialogVisible" width="30%">
<el-upload
action="#"
accept=".xlsx,.xls"
:before-upload="beforeUpload"
:on-change="handleFileChange"
:auto-upload="false"
:show-file-list="false"
>
<el-button type="primary" icon="upload">选择文件</el-button>
<el-button type="primary" icon="download" @click="downloadTemplate"></el-button>
</el-upload>
<div v-if="fileName">
已选择文件: {{ fileName }}
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="uploadDialogVisible = false">取消</el-button>
<el-button type="primary" @click="handleUploadFile"></el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import * as XLSX from 'xlsx';
export default {
data() {
return {
title: 'Excel 文件处理',
uploadDialogVisible: false, //
tableHeaders: [], //
tableData: [], //
selectedFile: null, //
fileName: '', //
};
},
methods: {
//
handleOpenUploadDialog() {
this.uploadDialogVisible = true;
},
//
beforeUpload(file) {
const isExcel =
file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ||
file.type === 'application/vnd.ms-excel';
if (!isExcel) {
this.$message.error('只能上传 Excel 文件!');
return false;
}
const requiredHeaders = ['企业名称', '统一信用代码', '所属行业', '租金价格(元/每平方米*月)'];
const reader = new FileReader();
reader.onload = (e) => {
const data = e.target.result;
const workbook = XLSX.read(data, { type: 'binary' });
//
const sheetName = workbook.SheetNames[0];
const worksheet = workbook.Sheets[sheetName];
// JSON
const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
//
if (jsonData.length > 0) {
const headers = jsonData[0];
const hasRequiredHeaders = requiredHeaders.every(header => headers.includes(header));
if (!hasRequiredHeaders) {
this.$message.error('上传的文件格式不正确,请使用模板文件!');
return false;
}
}
// handleFileChange
this.handleFileChange({ raw: file, name: file.name });
return true;
};
reader.readAsBinaryString(file);
return false; //
},
//
handleFileChange(file) {
if (file) {
this.selectedFile = file.raw; //
this.fileName = file.name; //
}
},
//
handleUploadFile() {
if (!this.selectedFile) {
this.$message.warning('请先选择文件!');
return;
}
const reader = new FileReader();
reader.onload = (e) => {
const data = e.target.result;
const workbook = XLSX.read(data, { type: 'binary' });
//
const sheetName = workbook.SheetNames[0];
const worksheet = workbook.Sheets[sheetName];
// JSON
const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
//
if (jsonData.length > 0) {
this.tableHeaders = jsonData[0]; //
this.tableData = jsonData.slice(1).map((row) => {
const rowData = {};
this.tableHeaders.forEach((header, index) => {
rowData[header] = row[index];
});
return rowData;
});
}
this.$message.success('文件上传并解析成功!');
this.uploadDialogVisible = false; //
};
reader.readAsBinaryString(this.selectedFile);
},
//
downloadTemplate() {
const link = document.createElement('a');
link.href = '/template.xlsx'; //
link.download = 'template.xlsx';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
},
},
};
</script>
<style scoped>
.maintenance {
padding: 20px;
}
</style>

@ -4,7 +4,7 @@
<div class="containertop">
<div class="topleft">
<img src="../../../assets/images/detailsicon/1.png" alt="">
<span>项目图例</span>
<span>落图实例演示</span>
</div>
<div class="topright">
<el-button type="primary" size="medium" plain

@ -1,19 +1,295 @@
<template>
<div class="mapcontain"></div>
<div class="container">
<!-- 顶部操作栏 -->
<!-- 内容区域 -->
<div class="main-content">
<!-- 右侧地图缩略图 -->
<div class="map-thumbnail">
<div id="mars2dContainerSSS" class="mars2d-container"></div>
</div>
</div>
</div>
</template>
<script>
import 'mars2d/mars2d.css';
import * as mars2d from 'mars2d';
export default {
components: {},
data() {
const basePathUrl = window.basePathUrl || "";
return {
configUrl: basePathUrl + "config/config.json",
mapOptions: {
copyright: false, // logo
basemaps: [
{
"id": 2021,
"pid": 10,
"name": "高德电子",
"icon": "img/basemaps/gaode_vec.png",
"type": "gaode",
"layer": "vec",
"show": true
},
{
"pid": 10,
"name": "高德卫星",
"icon": "img/basemaps/gaode_img.png",
"type": "group",
"layers": [
{
"name": "底图",
"type": "gaode",
"layer": "img_d"
},
{
"name": "注记",
"type": "gaode",
"layer": "img_z"
}
]
},
],
center: { lat: 31.324918, lng: 120.618391 },
zoom: 9,
zoomControl: true,
},
map: null, //
markerIcon: require('@/assets/images/detailsicon/icon-定位@2x.png'), // icon
};
},
methods: {
//
initMap() {
this.map = new mars2d.Map('mars2dContainerSSS', this.mapOptions);
this.map.on('load', this.onload);
},
//
onload() {
this.addDistrictsLayer();
},
//
addDistrictsLayer() {
const geoJsonLayer = new mars2d.layer.GeoJsonLayer({
name: "苏州市各区",
url: "http://data.mars2d.cn/file/geojson/areas/100000_full.json",
symbol: {
type: "polygon",
styleOptions: {
fill: true,
fillColor: "white",
fillOpacity: 0.7,
outline: true,
outlineWidth: 2,
outlineOpacity: 1,
outlineColor: "white"
}
},
tooltip: "{name}<br/>项目数量:{num}个",
flyTo: true
});
this.map.addLayer(geoJsonLayer);
</script>
//
geoJsonLayer.on(mars2d.EventType.load, (event) => {
console.log("数据加载完成", event);
const arrdata = [
{ name: "辽宁省", Y: 41.485959939, X: 124.049036594, value: 6, id: 0 },
{ name: "天津市", Y: 39.292278417, X: 117.337698238, value: 1, id: 1 },
{ name: "河北省", Y: 38.887537102, X: 115.05608039, value: 3, id: 2 },
{ name: "山东省", Y: 36.384634338, X: 118.335456608, value: 8, id: 3 },
{ name: "江苏省", Y: 31.949468221, X: 119.175534669, value: 12, id: 4 },
{ name: "上海市", Y: 31.205117603, X: 121.507670825, value: 1, id: 5 },
{ name: "浙江省", Y: 29.249913493, X: 120.438160114, value: 7, id: 6 },
{ name: "福建省", Y: 26.032479861, X: 118.134283206, value: 4, id: 7 },
{ name: "广东省", Y: 23.69235645, X: 113.489506429, value: 18, id: 8 },
{ name: "广西壮族自治区", Y: 23.806009465, X: 108.79016159, value: 6, id: 9 },
{ name: "海南省", Y: 19.210592585, X: 109.774303805, value: 11, id: 10 },
{ name: "云南省", Y: 24.224322869, X: 101.862567546, value: 1, id: 11 },
{ name: "四川省", Y: 30.627387401, X: 102.694776433, value: 2, id: 12 },
{ name: "重庆市", Y: 30.057271884, X: 107.874570298, value: 1, id: 13 },
{ name: "湖北省", Y: 30.975494014, X: 112.27112659, value: 14, id: 14 },
{ name: "湖南省", Y: 27.610006298, X: 111.708571339, value: 2, id: 15 },
{ name: "江西省", Y: 27.613817395, X: 115.721821513, value: 2, id: 16 },
{ name: "安徽省", Y: 31.825459619, X: 117.226379045, value: 7, id: 17 },
{ name: "黑龙江省", Y: 46.951327674, X: 128.132064887, value: 2, id: 18 }
];
this.bindYewuData(event.graphics, arrdata);
});
//
geoJsonLayer.on(mars2d.EventType.click, (event) => {
const graphic = event.graphic;
this.map.fitBounds(graphic.getBounds());
});
geoJsonLayer.on(mars2d.EventType.mouseover, (event) => {
const graphic = event.graphic;
graphic.setStyle({
outlineColor: "#666",
outlineWidth: 3,
fillOpacity: 0.7
});
graphic.bringToFront();
});
geoJsonLayer.on(mars2d.EventType.mouseout, (event) => {
const graphic = event.graphic;
graphic.setStyle({
outlineColor: "white",
outlineWidth: 2,
fillOpacity: 0.5
});
});
},
//
bindYewuData(graphics, arrdata) {
for (let i = 0; i < graphics.length; i++) {
const graphic = graphics[i];
graphic.attr.num = 0;
for (let j = 0; j < arrdata.length; j++) {
const fname = graphic.attr.name;
if (arrdata[j].name.indexOf(fname) !== -1) {
graphic.attr.num = arrdata[j].value;
break;
}
}
graphic.setStyle({ fillColor: this.getColor(graphic.attr.num) });
}
},
//
getColor(num) {
const arrSpan = [1, 5, 10, 15, 20];
const arrColor = ["#FFEDA0", "#FEB24C", "#FD8D3C", "#FC4E2A", "#E31A1C", "#BD0026", "#800026"];
let length = arrSpan.length;
if (length > arrColor.length) {
length = arrColor.length;
}
for (let k = 0; k < length; k++) {
if (num < arrSpan[k]) {
return arrColor[k];
}
}
return arrColor[length - 1];
},
//
addLegend() {
let strHtml = "<div class='legend-title'>项目数量(个)</div>";
const arrSpan = [1, 5, 10, 15, 20];
const arrColor = ["#FFEDA0", "#FEB24C", "#FD8D3C", "#FC4E2A", "#E31A1C", "#BD0026", "#800026"];
let length = arrSpan.length;
if (length > arrColor.length) {
length = arrColor.length;
}
for (let i = 0; i <= length; i++) {
let label = arrSpan[i];
if (i === 0) {
label = "小于" + arrSpan[i];
} else if (i === length) {
label = "大于" + arrSpan[i - 1];
} else {
label = arrSpan[i - 1] + "-" + arrSpan[i];
}
strHtml +=
"<div class='legend-item'><span class='legend-color' style='background:" +
arrColor[i] +
"'></span><span class='legend-des'>" +
label +
"</span></div>";
}
eventTarget.fire("initHtml", {
html: strHtml
});
}
},
mounted() {
this.initMap();
this.addLegend(); // mounted addLegend
},
beforeDestroy() {
if (this.map) {
this.map.destroy();
}
}
};
// vue
export const eventTarget = new mars2d.BaseClass()
</script>
<style scoped>
.mapcontain{
width: 100%;
height: 19rem;
background-image: url(../../../assets/images/map@2x.png);
background-size: 100% 100%;
background-repeat: no-repeat;
.container {
display: flex;
flex-direction: column;
width: 100%;
background-color: #FFFFFF;
box-shadow: 0rem 0.13rem 0.63rem 0rem rgba(177, 177, 177, 0.1);
border-radius: 0.5rem 0.5rem 0.5rem 0.5rem;
gap: 1rem;
overflow: auto;
}
.main-content {
display: flex;
gap: 2rem;
padding: 1rem;
}
.map-thumbnail {
width: 100%;
height: 25rem;
position: relative;
}
.mars2d-container {
width: 100%;
height: 100%;
}
.classify {
width: 2.81rem;
height: 1.38rem;
background-color: rgba(43, 98, 241, 0.8);
border-radius: 0.69rem 0.69rem 0.69rem 0.69rem;
color: white;
position: absolute;
bottom: .5rem;
left: .5rem;
display: flex;
justify-content: center;
align-items: center;
font-size: .7rem;
z-index: 999;
}
.legend-title {
font-size: 1rem;
font-weight: bold;
margin-bottom: 0.5rem;
}
.legend-item {
display: flex;
align-items: center;
margin-bottom: 0.3rem;
}
.legend-color {
width: 1rem;
height: 1rem;
margin-right: 0.5rem;
display: inline-block;
}
.legend-des {
font-size: 0.9rem;
}
</style>

@ -235,4 +235,5 @@ export default {
margin-top: 1rem;
margin-bottom: 1rem;
}
</style>

@ -72,6 +72,7 @@
<div>
<luotu/>
</div>
<!-- 返回顶部 -->
<!-- <el-backtop target=".backtop"></el-backtop> -->
</div>
@ -94,6 +95,7 @@ import Projectpicturetwo from '../components/ProjectDetails/Projectpicturetwo.vu
import Others from '../components/ProjectDetails/Others.vue';
import luotu from '@/views/components/ProjectDetails/luotugongnengshifan.vue'
export default {
components: {
luotu,

@ -1,33 +1,60 @@
<template>
<div>
<div class="headerbox"></div>
<div style="margin: .5rem;">
<el-button type="primary" icon="el-icon-plus" @click="dialogVisible = true; resetForm()">新增要素</el-button>
<div class="headerbox">
<el-form size="small" :inline="true" label-width="7rem">
<el-row style="margin-top: 1rem;">
<el-col :span="6">
<el-form-item label="关键要素" style="width: 100%;">
<el-input placeholder="请输入关键要素" clearable style="width: 14rem;" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="具体指标" style="width: 100%;">
<el-input placeholder="请输入具体指标" clearable style="width: 14rem;" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item style="margin-left: 2.5rem;">
<el-button type="primary" icon="el-icon-search" size="mini">查询</el-button>
<el-button icon="el-icon-refresh" size="mini">重置</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
<div v-for="(category, categoryName) in tableData" :key="categoryName" class="tablebox">
<div v-for="(items, itemName) in category" :key="itemName" class="tablebox">
<div class="boxheader">
<div>{{ categoryName }}</div>
<div>{{ itemName }}</div>
<div> <el-button type="primary" icon="el-icon-edit" @click="handleUpdate(items[0])"></el-button></div>
<div> <el-button type="primary" icon="el-icon-edit" @click="showAddIndicatorDialog"></el-button></div>
<div class="tablebox" style="margin: .5rem;">
<el-button type="primary" icon="el-icon-plus" @click="dialogVisible = true; resetForm()">新增要素</el-button>
<div v-for="(category, categoryName) in tableData" :key="categoryName">
<div v-for="(items, itemName) in category" :key="itemName" class="tablebox">
<div class="boxheader">
<div class="headerone">
<div>{{ categoryName }}</div>
<div>{{ itemName }}</div>
</div>
<div class="headertwo">
<el-button type="primary" icon="el-icon-edit" size="mini"
@click="handleUpdate(items[0])">编辑要素</el-button>
<el-button type="primary" icon="el-icon-edit"
@click="showAddIndicatorDialog">新增指标</el-button>
</div>
</div>
<el-table :data="items" style="width: 100%">
<el-table-column prop="id" label="序号" width="180"></el-table-column>
<el-table-column prop="jtzb" label="具体指标" width="180"></el-table-column>
<el-table-column prop="xxyq" label="详细要求" width="950"></el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button size="mini" type="text" @click="handleUpdate(scope.row)"
v-hasPermi="['system:post:edit']">编辑</el-button>
<el-button size="mini" type="text" @click="handleDelete(scope.row)" style="color: #F25353;"
v-hasPermi="['system:post:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
<el-table :data="items" style="width: 100%">
<el-table-column prop="id" label="序号" width="180"></el-table-column>
<el-table-column prop="jtzb" label="具体指标" width="180"></el-table-column>
<el-table-column prop="xxyq" label="详细要求"></el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
v-hasPermi="['system:post:edit']">编辑</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
v-hasPermi="['system:post:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
</div>
<!-- 新增要素// -->
<el-dialog :title="form.id ? '编辑要素' : '新增要素'" :visible.sync="dialogVisible" width="30%">
<el-form :model="form" label-width="80px">
@ -191,7 +218,6 @@ export default {
.headerbox {
background-color: #fff;
border-radius: 0.5rem;
padding: 1rem;
margin: 0.5rem;
border: 1px solid #eee;
}
@ -206,5 +232,19 @@ export default {
.boxheader {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: .5rem;
background-color: #F5F7FE;
}
.headerone {
color: #000000;
font-weight: bold;
display: flex;
}
.headertwo {
display: flex;
}
</style>

@ -10,16 +10,16 @@
@keyup.enter.native="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-col :span="7">
<el-form-item label="工业大类" prop="industryCategory" style="width: 100%;">
<el-input v-model="queryParams.industryCategory" placeholder="请输入工业大类" clearable style="width: 15.5rem;"
@keyup.enter.native="handleQuery" maxlength="50" show-word-limit />
<el-input v-model="queryParams.industryCategory" placeholder="请输入工业大类" clearable style="width: 20.5rem;"
@keyup.enter.native="handleQuery" maxlength="50" show-word-limit />
</el-form-item>
</el-col>
<el-col :span="6">
<el-col :span="7">
<el-form-item label="产业" prop="industry" style="width: 100%;">
<el-input v-model="queryParams.industry" placeholder="请输入产业" clearable style="width: 15.5rem;" @keyup.enter.native="handleQuery"
maxlength="50" show-word-limit />
<el-input v-model="queryParams.industry" placeholder="请输入产业" clearable style="width: 20.5rem;"
@keyup.enter.native="handleQuery" maxlength="50" show-word-limit />
</el-form-item>
</el-col>
</el-row>
@ -89,7 +89,7 @@
<el-input v-model="form.industryCategory" placeholder="请输入工业大类" maxlength="50" show-word-limit />
</el-form-item>
<el-form-item label="产业" prop="industry">
<el-input v-model="form.industry" placeholder="请输入产业" maxlength="50" show-word-limit />
<el-input v-model="form.industry" placeholder="请输入产业" maxlength="100" show-word-limit />
</el-form-item>
<el-form-item label="更新时间" prop="updateTime">
<el-date-picker v-model="form.updateTime" type="date" placeholder="选择日期" value-format="yyyy-MM-dd"
@ -257,16 +257,16 @@ export default {
},
//
reset() {
this.form = {
id: undefined,
postName: undefined,
industryCategory: undefined,
industry: undefined,
updateTime: undefined,
remark: undefined
};
this.resetForm("form");
},
this.form = {
id: undefined,
postName: undefined,
industryCategory: undefined,
industry: undefined,
updateTime: undefined,
remark: undefined
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
@ -412,4 +412,5 @@ export default {
.el-table .success-row {
background: #f0f9eb;
}
</style>

@ -11,16 +11,16 @@
@keyup.enter.native="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-col :span="7">
<el-form-item label="产业细分" prop="postName" style="width: 100%;">
<el-input v-model="queryParams.postName" placeholder="请输入产业细分" clearable
<el-input v-model="queryParams.postName" placeholder="请输入产业细分" clearable style="width: 20rem;"
@keyup.enter.native="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-col :span="7">
<el-form-item label="上楼适应性" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择上楼适应性" clearable>
<el-option v-for="dict in dict.type.sys_normal_disable" :key="dict.value"
<el-select v-model="queryParams.status" placeholder="请选择上楼适应性" clearable style="width: 20rem;">
<el-option v-for="dict in dict.type.slsyx" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
@ -51,32 +51,18 @@
<div class="tablebtntwo">
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
<el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
v-hasPermi="['system:post:add']">新增</el-button>
</el-col>
<!-- <el-col :span="1.5">
<el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single"
@click="handleUpdate" v-hasPermi="['system:post:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
@click="handleDelete" v-hasPermi="['system:post:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
v-hasPermi="['system:post:export']">导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> -->
</el-row>
</div>
<div class="headbtn">
<!-- <el-button type="primary" icon="el-icon-search">下载模板</el-button> -->
<el-button type="primary" icon="el-icon-download" size="mini" @click="handleExport"
<el-button type="primary" size="mini" @click="handleExport"
v-hasPermi="['system:post:export']">导出</el-button>
<el-button type="primary" icon="el-icon-upload2" size="mini" @click="handleImport"></el-button>
<el-button type="primary" size="mini" @click="handleImport"></el-button>
</div>
</div>
<!-- 导出行 -->
<el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
@ -88,12 +74,8 @@
<el-table-column label="更新时间" align="center" prop="postSort" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<!-- <el-button size="mini" type="text" icon="el-icon-view" @click="getInfo(scope.row)"
v-hasPermi="['system:post:detail']">详情</el-button> -->
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
v-hasPermi="['system:post:edit']">编辑</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
v-hasPermi="['system:post:remove']">删除</el-button>
<el-button size="mini" type="text" @click="handleEdit(scope.row)"></el-button>
<el-button size="mini" type="text" style="color: #F25353;" @click="handleDelete(scope.row)"></el-button>
</template>
</el-table-column>
</el-table>
@ -115,7 +97,7 @@
</el-form-item>
<el-form-item label="项目状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio v-for="dict in dict.type.sys_normal_disable" :key="dict.value" :label="dict.value">{{
<el-radio v-for="dict in dict.type.slsyx" :key="dict.value" :label="dict.value">{{
dict.label
}}</el-radio>
</el-radio-group>
@ -156,7 +138,7 @@ import { listPost, getPost, delPost, addPost, updatePost } from "@/api/system/po
export default {
name: "Post",
dicts: ['sys_normal_disable'],
dicts: ['slsyx'],
data() {
return {
//

Loading…
Cancel
Save