流程和按钮

xuhongjie
严飞永 2 weeks ago
parent 979fd3b332
commit 711c8fa4b6

@ -5,4 +5,4 @@ VUE_APP_TITLE = 苏州工业园区工业上楼项目系统
ENV = 'production'
# 苏州工业园区工业上楼项目系统/生产环境
# VUE_APP_BASE_API = 'http://39.101.188.84:7071'
VUE_APP_BASE_API = 'http://39.101.188.84:7071'

@ -51,6 +51,7 @@
"leaflet": "^1.9.4",
"mars2d": "^3.3.1",
"mars2d-esri": "^3.3.1",
"moment": "^2.30.1",
"nprogress": "0.2.0",
"quill": "2.0.2",
"screenfull": "5.0.2",

@ -49,11 +49,13 @@ export function updateBasicInformation(data) {
});
}
// 基本信息的导出功能
export function exportBasicInformation(params) {
export function exportBasicInformation(idList) {
return request({
url: `/gysl/basicInformation/export`,
url: '/gysl/basicInformation/exportInfo',
method: 'post',
data: params,
params: { idList }, // 作为查询参数传递
// 或者如果需要放在body中
// data: { idList },
responseType: 'blob'
});
}
@ -284,11 +286,13 @@ export function deleteXmxl(idList) {
return request({
url: '/gysl/xmxl/delete',
method: 'delete',
params: { idList }
params: {
idList: idList.join(',') // 将数组转换为逗号分隔的字符串
}
});
}
//修改项目巡礼
export function updateXmxl(data) {
export function updataXmxl (data) {
return request({
url: '/gysl/xmxl/edit',
method: 'post',
@ -296,14 +300,15 @@ export function updateXmxl(data) {
});
}
//分页查询所有项目巡礼
export function getXmxlPagebymid(quey) {
export function getXmxlList(params) {
return request({
url: '/gysl/xmxl/page',
url: '/gysl/xmxl/list',
method: 'get',
quey
params
});
}
//企业入驻内容区表格
//新增数据
export function addqyrz(data) {
@ -358,7 +363,6 @@ export function addjzxx(data) {
}
//删除数据
export function deletejzxx(idList) {
console.log('Deleting buildings with IDs:', idList); // 调试信息
return request({
url: '/gysl/buildingInformation/delete',
method: 'delete',
@ -484,18 +488,23 @@ export function addxmmmb(data) {
//删除数据
export function deletexmmmb(idList) {
return request({
url:'/gysl/projectRemark/delete',
method:'delete',
params:{idList}
})
url: '/gysl/projectRemark/delete',
method: 'delete',
params: {
idList: idList.join(',') // 将数组转换为逗号分隔的字符串
}
});
}
//修改数据
export function updatexmmmb(data) {
export function updateProjectRemark(projectRemark) {
return request({
url:'/gysl/projectRemark/edit',
method:'post',
data
})
url: '/gysl/projectRemark/edit',
method: 'put',
data: projectRemark,
headers: {
'Content-Type': 'application/json'
}
});
}
//查询所有数据
export function getxmmmbPage(params) {

@ -7,25 +7,25 @@
<span>建筑信息</span>
</div>
<div class="topright">
<el-button type="primary" size="medium" plain
<el-button type="primary" size="medium" plain v-if="action === 'fill' || !action"
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;" @click="addBuildingTag">
<img src="../../../assets/images/detailsicon/icon-xz@2x.png" alt="新增"
style="width: 0.6rem; height: 0.6rem; margin-right: 4px;">
新增
</el-button>
<el-button type="primary" size="medium" plain
<el-button type="primary" size="medium" plain v-if="action === 'fill' || !action"
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;"
@click="handleEdit(selectedBuilding)">
<img src="../../../assets/images/detailsicon/icon-bj@2x.png" alt="编辑"
style="width: 0.6rem; height: 0.6rem; margin-right: 4px;">
编辑
</el-button>
<el-button type="primary" size="medium" plain
<el-button type="primary" size="medium" plain v-if="action === 'fill' || !action"
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;">
<i class="el-icon-download" style="width: 0.6rem; height: 0.6rem; margin-right: 4px;"></i>
导入
</el-button>
<el-button type="primary" size="medium" plain
<el-button type="primary" size="medium" plain v-if="action === 'fill' || !action"
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;">
<img src="../../../assets/images/detailsicon/icon-dc@2x.png" alt="导出"
style="width: 0.6rem; height: 0.6rem; margin-right: 4px;">
@ -35,10 +35,13 @@
</div>
<!-- 栋数楼栋名称 -->
<div class="tagdiv">
<div class="tagitem" v-for="building in buildings" :key="building.id" @click="selectBuilding(building.id)":class="getTagItemClass(building)">
<div class="tagitem" v-for="building in buildings" :key="building.id" @click="selectBuilding(building.id)"
:class="getTagItemClass(building)">
<img src="@/assets/images/detailsicon/icon-楼栋@2x.png" alt="">
<span>{{ building.name }}</span>
<img src="@/assets/images/detailsicon/icon-gb@2x.png" alt="" @click.stop="handleDelete(building.id)">
<img src="@/assets/images/detailsicon/icon-gb@2x.png"
v-if="action === 'fill' || !action"
alt="" @click.stop="handleDelete(building.id)">
</div>
</div>
<!-- 内容区 -->
@ -87,7 +90,7 @@
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">是否有吊装口</template>
{{ getTextForBoolean(selectedBuilding.sfydzk )}}
{{ getTextForBoolean(selectedBuilding.sfydzk) }}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">是否有汽车盘道</template>
@ -218,6 +221,10 @@ export default {
xmId: {
type: [Number, String],
required: true
},
action: {
type: String,
required: true
}
},
data() {
@ -237,9 +244,9 @@ export default {
name: '',
scdmhz: 0,
scgd: 0,
sfwzyld: 2,
sfwzyld: 2,
sfydzk: 2,
sfyqcpd: 2,
sfyqcpd: 2,
totalBuildingHeight: 0,
twoAndFourCg: 0,
twoAndThreeLmhz: 0,
@ -260,8 +267,8 @@ export default {
return value === 1 ? '是' : '否';
},
//
getTagItemClass(building){
return{
getTagItemClass(building) {
return {
'important-building': building.sfwzyld === 1,
};
},
@ -397,13 +404,14 @@ export default {
height: auto;
display: flex;
justify-content: space-between;
padding: .7rem 0;
/* padding: .7rem 0; */
padding: .5rem;
border-bottom: 1px solid #E5E5E5;
}
.topleft {
width: 8rem;
height: 2rem;
display: flex;
gap: 0.4rem;
align-items: center;
@ -464,7 +472,8 @@ export default {
align-items: center;
cursor: pointer;
}
.important-building {
background-color: rgba(43,98,241,0.1);
background-color: rgba(43, 98, 241, 0.1);
}
</style>

@ -6,7 +6,7 @@
<img src="../../../assets/images/detailsicon/1.png" alt="">
<span>企业入驻信息</span>
</div>
<div class="topright">
<div class="topright" v-if="action === 'fill' || !action">
<el-button v-if="!isEditing" type="primary" size="medium" plain
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;" @click="edit">
<img src="../../../assets/images/detailsicon/icon-bj@2x.png" alt="编辑"
@ -58,7 +58,7 @@
<span v-else>{{ form.gycfpjwyf }}</span>
</el-descriptions-item>
</el-descriptions>
<div class="btnarea">
<div class="btnarea" v-if="action === 'fill' || !action">
<el-button type="primary" size="mini" @click="handleImport">
批量导入
</el-button>
@ -143,6 +143,10 @@ export default {
gycfpjzj: 0,
gycfpjwyf: 0
})
},
action: {
type: String,
required: true
}
},
data() {
@ -288,6 +292,7 @@ export default {
}
.topleft {
height: 2rem;
width: 8rem;
display: flex;
gap: 0.4rem;

@ -6,7 +6,7 @@
<img src="../../../assets/images/detailsicon/1.png" alt="">
<span>现场实况</span>
</div>
<div class="topright">
<div class="topright" v-if="action === 'fill' || !action">
<el-button type="primary" size="medium" plain
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;" @click="">
<img src="../../../assets/images/detailsicon/icon-xz@2x.png" alt="编辑"
@ -37,6 +37,12 @@
<script>
export default {
props: {
action: {
type: String,
required: true
}
},
data() {
return {
images: [

@ -21,7 +21,8 @@
<el-form-item>
<el-col :span="11">
<el-date-picker type="date" placeholder="选择日期" v-model="form.date1"
style="width: 21.75rem;"></el-date-picker>
@change="handleDateChange" style="width: 21.75rem;"
value-format="yyyy-MM-dd"></el-date-picker>
</el-col>
</el-form-item>
</el-form>
@ -32,8 +33,10 @@
<div class="itemone">{{ memo.createTime }}</div>
<div class="itemtwo">{{ memo.remark }}</div>
<div class="itemthree">记录人{{ memo.createBy }}</div>
<div class="iconguanbi" @click="handleDeleteMemo(memo.id)"> <img src="@/assets/images/icon-关闭-项目备忘录@2x.png" alt=""></div>
<div class="iconguanbi2" @click="handleEditMemo(memo)"> <img src="@/assets/images/detailsicon/icon-bj@2x.png" alt=""></div>
<div class="iconguanbi" @click="handleDeleteMemo(memo.id)"> <img
src="../../../assets/images/icon-关闭-项目备忘录@2x.png" alt=""></div>
<div class="iconguanbi2" @click="handleEditMemo(memo)"> <img
src="../../../assets/images/detailsicon/icon-bj@2x.png" alt=""></div>
</div>
</div>
</div>
@ -61,29 +64,31 @@
</template>
<script>
import { addxmmmb, deletexmmmb, updateProjectRemark, getxmmmbPage } from '@/api/ManageApi/index';
export default {
props: {
Remark: {
type: Array,
xmId: {
type: Number,
required: true
}
},
data() {
return {
form: {
createBy:"",
createTime:"",
createId:0,
updateBy:"",
updateId:0,
updateTime:"",
id:0,
xmId:0,
remark:""
date1: null,
},
dialogVisible: false,
dialogTitle: '新增备忘录',
newMemo: {
id: 0,
remark: '',
xmId: this.xmId,
createTime: '',
createBy: '',
},
memos: [],
date1: null,
};
},
created() {
@ -94,51 +99,108 @@ export default {
console.log('submit!');
console.log(this.form);
},
handleDateChange(date) {
if (date) {
this.fetchMemosByDate(date);
} else {
//
this.fetchMemos();
}
},
//
fetchMemosByDate(date) {
const params = {
xmId: this.xmId,
startTime: date,
};
getxmmmbPage(params)
.then(response => {
if (response.code === 200) {
this.memos = response.data || [];
} else {
this.$message.error(response.msg || '查询失败');
}
})
.catch(error => {
console.error("查询失败:", error);
this.$message.error('查询失败');
});
},
// fetchMemos
fetchMemos() {
const params = {
xmId: this.xmId
};
getxmmmbPage(params)
.then(response => {
if (response.code === 200) {
this.memos = response.data || [];
} else {
this.$message.error(response.msg || '查询失败');
}
})
.catch(error => {
console.error("查询失败:", error);
this.$message.error('查询失败');
});
},
// IDVuex
getCurrentUserId() {
return this.$store.state.user.id || 0;
},
//
handleAdd() {
this.dialogTitle = '新增备忘录';
this.dialogVisible = true;
const now = new Date();
this.newMemo = {
id: null,
remark: '', // remark
xmId: this.xmId, // 使 xmId
createTime: new Date().toISOString().slice(0, 10), //
createBy: this.getCurrentUserName(), //
id: 0,
remark: '',
xmId: this.xmId,
createTime: now.toISOString().replace('T', ' ').substring(0, 19),
createBy: this.getCurrentUserName(),
createId: this.getCurrentUserId(),
updateTime: now.toISOString().replace('T', ' ').substring(0, 19),
updateBy: this.getCurrentUserName(),
updateId: this.getCurrentUserId()
};
},
//
handleEditMemo(memo) {
if (memo) {
this.dialogTitle = '编辑备忘录';
this.dialogVisible = true;
const now = new Date();
this.newMemo = {
id: memo.id,
remark: memo.remark, // remark
xmId: memo.xmId,
createTime: memo.createTime, // 使
createBy: memo.createBy, // 使
...memo, //
updateTime: now.toISOString().replace('T', ' ').substring(0, 19),
updateBy: this.getCurrentUserName(),
updateId: this.getCurrentUserId()
};
}
},
//
handleDeleteMemo(id) {
this.$confirm('此操作将永久删除该备忘录, 是否继续?', '提示', {
this.$confirm('确认删除该备忘录?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
type: 'warning',
}).then(() => {
deletexmmmb([id])
.then(response => {
if (response.code === 200) {
this.$message.success('删除成功!');
this.fetchMemos(); //
this.$message.success('删除成功');
this.fetchMemos(); //
} else {
this.$message.error('删除失败!');
this.$message.error('删除失败' + (response.msg || '未知错误'));
}
})
.catch(error => {
console.error('删除失败', error);
this.$message.error('删除失败!');
console.error('删除失败:', error.response?.data || error.message);
this.$message.error('删除失败');
});
}).catch(() => {
this.$message.info('已取消删除');
@ -146,36 +208,38 @@ export default {
},
// /
handleSubmit() {
console.log('提交的数据:', JSON.stringify(this.newMemo, null, 2));
this.dialogVisible = false;
if (this.newMemo.id) {
if (this.newMemo.id && this.newMemo.id !== 0) {
//
updatexmmmb(this.newMemo)
updateProjectRemark(this.newMemo)
.then(response => {
if (response.code === 200) {
this.$message.success('数据编辑成功!');
this.fetchMemos(); //
this.$message.success('备忘录更新成功!');
this.fetchMemos();
} else {
this.$message.error('数据编辑失败!');
this.$message.error(response.msg || '更新失败');
}
})
.catch(error => {
console.error('编辑数据失败', error);
this.$message.error('数据编辑失败!');
console.error('更新失败:', error);
this.$message.error('更新失败');
});
} else {
//
addxmmmb(this.newMemo)
.then(response => {
if (response.code === 200) {
this.$message.success('数据新增成功!');
this.fetchMemos(); //
this.$message.success('备忘录添加成功!');
this.fetchMemos();
} else {
this.$message.error('数据新增失败!');
this.$message.error(response.msg || '添加失败');
}
})
.catch(error => {
console.error('新增数据失败', error);
this.$message.error('数据新增失败!');
console.error('添加失败:', error);
this.$message.error('添加失败');
});
}
},
@ -341,23 +405,26 @@ export default {
top: 0;
right: 0;
}
.iconguanbi2 {
position: absolute;
top: 1rem;
right: 1rem;
width: 2rem;
height: 2rem;
background-color: rgba(43,98,241,0.1);
background-color: rgba(43, 98, 241, 0.1);
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
}
.iconguanbi2 img{
.iconguanbi2 img {
width: 1.2rem;
height: 1.2rem;
}
.iconguanbi img{
.iconguanbi img {
width: 1.4rem;
height: 1.4rem;
}

@ -6,7 +6,7 @@
<img src="../../../assets/images/detailsicon/1.png" alt="">
<span>五要素模型信息</span>
</div>
<div class="topright">
<div class="topright" v-if="action === 'fill' || !action">
<el-button type="primary" size="medium" plain
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;" @click="toggleEditAll">
<img src="../../../assets/images/detailsicon/icon-bj@2x.png" alt="编辑"
@ -46,6 +46,10 @@ export default {
wysmxInfo: {
type: Array,
required: true,
},
action: {
type: String,
required: true
}
},
data() {
@ -58,7 +62,7 @@ export default {
wysmxInfo: {
immediate: true,
handler(newVal) {
console.log('接收到的 wysmxInfo 数据:', newVal);
console.log('接收到的 wysmxInfo 数据:', newVal);
this.form = newVal.map(item => ({
id: item.id,
xmId: item.xmId,
@ -129,6 +133,7 @@ export default {
.topleft {
width: 8rem;
height: 2rem;
display: flex;
gap: 0.4rem;
align-items: center;

@ -6,7 +6,7 @@
<img src="../../../assets/images/detailsicon/1.png" alt="">
<span>其他信息</span>
</div>
<div class="topright">
<div class="topright" v-if="action === 'fill' || !action">
<el-button type="primary" size="medium" plain v-if="checkRole(['admin','common'])"
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;" @click="openDialog('add')">
<img src="../../../assets/images/detailsicon/icon-bj@2x.png" alt="新增"
@ -79,6 +79,10 @@ export default {
type: Array,
required: true,
default: () => []
},
action: {
type: String,
required: true
}
},
created() {
@ -216,6 +220,7 @@ export default {
.topleft {
width: 8rem;
height: 2rem;
display: flex;
gap: 0.4rem;
align-items: center;

@ -6,7 +6,7 @@
<img src="../../../assets/images/detailsicon/1.png" alt="">
<span>规划信息</span>
</div>
<div class="topright">
<div class="topright" v-if="action === 'fill' || !action">
<el-button v-if="!isEditing" type="primary" size="medium" plain
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;" @click="edit">
<img src="../../../assets/images/detailsicon/icon-bj@2x.png" alt="编辑"
@ -127,6 +127,10 @@ export default {
planInfo: {
type: Object,
required: true
},
action: {
type: String,
required: true
}
},
data() {
@ -271,6 +275,7 @@ export default {
}
.topleft {
height: 2rem;
width: 8rem;
display: flex;
gap: 0.4rem;

@ -6,59 +6,65 @@
<img src="../../../assets/images/detailsicon/1.png" alt="">
<span>项目巡礼</span>
</div>
<div class="topright">
<div class="topright" v-if="action === 'fill' || !action">
<el-button type="primary" size="medium" plain
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;"
@click="dialogVisible = true">
<img src="../../../assets/images/detailsicon/icon-xz@2x.png" alt="编辑"
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;" @click="openAddDialog">
<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="image-container">
<div v-for="(image, index) in images" :key="index" class="image-box">
<img :src="image.src" alt="项目图片" class="image">
<div v-for="(item, index) in projectList" :key="index" class="image-box" >
<img :src="item.img" alt="项目图片" class="image">
<div class="close-button" @click="removeImage(index)">
<img src="../../../assets/images/detailsicon/icon-关闭@2x.png" alt="">
</div>
<div class="iconguanbi2" @click="openEditDialog(item)"> <img
src="../../../assets/images/detailsicon/icon-bj@2x.png" alt=""></div>
<div class="dianjibox" @click="handleItemClick(item)"></div>
<div class="bottombox">
<div class="bottomtext"><span>新科大厦项目正在施工</span></div>
<div class="bottomtime"><span>2025-02-11</span></div>
<div class="bottomtext"><span>{{ item.xmmc || '未命名项目' }}</span></div>
<div class="bottomtime"><span>{{ formatDate(item.createTime) }}</span></div>
</div>
</div>
</div>
<!-- 弹窗 -->
<el-dialog title="上传附件" :visible.sync="dialogVisible" width="50%">
<el-form :model="form" label-width="100px">
<!-- 新增弹窗 -->
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="50%">
<el-form :model="form" :rules="rules" ref="projectForm" label-width="100px">
<el-row>
<el-col :span="12">
<el-form-item label="项目名称">
<el-form-item label="项目名称" prop="xmmc">
<el-input v-model="form.xmmc" placeholder="请输入项目名称"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="年度">
<el-input v-model="form.year" placeholder="请输入年度"></el-input>
<el-date-picker v-model="form.year" type="year" value-format="yyyy" placeholder="选择年度"
@change="handleYearChange" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="网页地址">
<el-input v-model="form.webUrl" placeholder="请输入网页地址"></el-input>
</el-form-item>
<el-form-item label="时间">
<el-date-picker v-model="form.sj" type="datetime" placeholder="选择日期时间" style="width: 51rem;"
value-format="yyyy-MM-dd HH:mm:ss"></el-date-picker>
</el-form-item>
<el-form-item label="图片上传">
<el-upload action="https://jsonplaceholder.typicode.com/posts/" list-type="picture-card"
:on-preview="handlePictureCardPreview" :on-remove="handleRemove" :before-upload="beforeUpload">
<i class="el-icon-plus"></i>
</el-upload>
<el-dialog :visible.sync="dialogImageUrlVisible">
<img width="100%" :src="dialogImageUrl" alt="">
</el-dialog>
<el-row>
<el-col :span="12">
<el-form-item label="网页地址">
<el-input v-model="form.webUrl" placeholder="请输入网页地址"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="时间">
<el-date-picker v-model="form.sj" type="date" value-format="yyyy-MM-dd" placeholder="选择日期">
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="图片上传" prop="img">
<ImageUpload v-model="form.img" :file-list="fileList" :multiple="false" :limit="1"
@change="handleImageChange" />
</el-form-item>
<el-form-item label="说明">
<el-input v-model="form.content" type="textarea" :rows="4" placeholder="请输入说明"></el-input>
@ -70,146 +76,334 @@
<el-input v-model="form.newsEvent" type="textarea" :rows="4" placeholder="请输入新闻事件"></el-input>
</el-form-item>
<el-form-item label="附件上传">
<el-upload action="https://jsonplaceholder.typicode.com/posts/" :on-preview="handleFilePreview"
:on-remove="handleRemove" :before-upload="beforeUpload">
<el-button size="small" type="primary">点击上传</el-button>
</el-upload>
<fileUpload v-model="form.fj" />
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="handleAddXmxl"> </el-button>
<el-button type="primary" @click="submitForm" :loading="loading">{{ isEditMode ? '保存' : '确 定'
}}</el-button>
</span>
</el-dialog>
<!-- 新增详情弹窗 -->
<el-dialog title="项目详情" :visible.sync="detailVisible" width="50%">
<el-form :model="currentItem" label-width="100px" :disabled="true">
<el-row>
<el-col :span="12">
<el-form-item label="项目名称">
<el-input v-model="currentItem.xmmc"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="年度">
<el-input v-model="currentItem.year"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="网页地址">
<el-input v-model="currentItem.webUrl"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="时间">
<el-input v-model="currentItem.sj"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="项目图片">
<img :src="currentItem.img" style="max-width: 100%; max-height: 200px;" v-if="currentItem.img">
<span v-else></span>
</el-form-item>
<el-form-item label="说明">
<el-input v-model="currentItem.content" type="textarea" :rows="4"></el-input>
</el-form-item>
<el-form-item label="大事记">
<el-input v-model="currentItem.bigEvent" type="textarea" :rows="4"></el-input>
</el-form-item>
<el-form-item label="新闻事件">
<el-input v-model="currentItem.newsEvent" type="textarea" :rows="4"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="detailVisible = false"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { addXmxl, getXmxlPage } from '@/api/ManageApi/index.js';
import ImageUpload from '@/components/ImageUpload';
import fileUpload from '@/components/FileUpload';
import { addXmxl, getXmxlList, deleteXmxl, updataXmxl } from '@/api/ManageApi/index';
export default {
components: { ImageUpload, fileUpload },
props: {
xmId: {
type: Number,
required: true,
default: 0
},
action: {
type: String,
required: true
}
},
data() {
return {
images: [
{ src: 'https://picsum.photos/300/200?random=1', },
{ src: 'https://picsum.photos/300/200?random=2', },
{ src: 'https://picsum.photos/300/200?random=3', },
],
detailVisible: false,
currentItem: {},
dialogVisible: false,
previewDialogVisible: false,
previewImageUrl: '',
isEditMode: false,
loading: false,
currentEditId: null,
projectList: [],
fileList: [],
form: {
xmmc: '',
year: '',
webUrl: '',
sj: '',
content: '',
bigEvent: '',
newsEvent: '',
fj: '',
img: '',
createBy: '',
createId: 0,
createTime: '',
id: 0,
updateBy: '',
updateId: 0,
updateTime: '',
xmId: 0 // xmId
bigEvent: "",
content: "",
fj: "",
img: "",
newsEvent: "",
sj: "",
webUrl: "",
xmmc: "",
year: ""
},
rules: {
xmmc: [{ required: true, message: '请输入项目名称', trigger: 'blur' }],
year: [{ required: true, message: '请选择年度', trigger: 'change' }],
img: [{ required: true, message: '请上传项目图片', trigger: 'change' }]
}
};
}
},
computed: {
dialogTitle() {
return this.isEditMode ? '编辑项目巡礼' : '新增项目巡礼';
}
},
created() {
const xmid = this.$route.query.xmid; // xmid
this.form.xmId = xmid; // xmId
this.fetchImages(xmid);
this.fetchProjectList();
},
methods: {
async fetchImages(xmid) {
//
handleItemClick(item) {
//
event.stopPropagation();
//
const isActionButton = event.target.closest('.close-button') ||
event.target.closest('.iconguanbi2');
if (isActionButton) {
return; //
}
if (item.webUrl) {
//
window.open(item.webUrl, '_blank');
} else {
//
this.currentItem = { ...item };
this.detailVisible = true;
}
},
//
fetchProjectList() {
getXmxlList({ xmId: this.xmId })
.then(response => {
if (response.code === 200) {
this.projectList = response.data || [];
} else {
this.$message.error(response.msg || '获取数据失败');
}
})
.catch(error => {
this.$message.error('请求失败');
console.error(error);
});
},
//
async removeImage(index,event) {
event.stopPropagation();
try {
const response = await getXmxlPage({ xmid });
if (response.data && response.data.list) {
this.images = response.data.list.map(item => ({
src: item.fj
}));
await this.$confirm('确定要删除该项目巡礼吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
});
const item = this.projectList[index];
const response = await deleteXmxl([item.id]);
if (response.code === 200) {
this.$message.success('删除成功');
this.projectList.splice(index, 1);
this.$emit('deleted', item.id);
} else {
throw new Error(response.msg || '删除失败');
}
} catch (error) {
// this.$message.error('');
console.error(error);
if (error !== 'cancel') {
this.$message.error(error.message || '删除失败');
}
}
},
handleAdd() {
//
openAddDialog() {
this.isEditMode = false;
this.currentEditId = null;
this.resetForm();
this.dialogVisible = true;
},
removeImage(index) {
if (confirm('确定要删除吗?')) {
this.images.splice(index, 1);
}
//
openEditDialog(item) {
this.isEditMode = true;
this.currentEditId = item.id;
this.dialogVisible = true;
//
this.form = {
bigEvent: item.bigEvent || "",
content: item.content || "",
fj: item.fj || "",
img: item.img || "",
newsEvent: item.newsEvent || "",
sj: item.sj || "",
webUrl: item.webUrl || "",
xmmc: item.xmmc || "",
year: item.year ? item.year.substring(0, 4) : "" //
};
//
this.fileList = item.img ? [{ url: item.img }] : [];
},
handleRemove(file, fileList) {
this.fileList = fileList;
//
handleYearChange(year) {
if (year) {
const today = new Date();
const currentMonth = String(today.getMonth() + 1).padStart(2, '0');
const currentDay = String(today.getDate()).padStart(2, '0');
this.form.year = `${year}-${currentMonth}-${currentDay}`;
}
},
handlePictureCardPreview(file) {
this.previewImageUrl = file.url;
this.previewDialogVisible = true;
//
resetForm() {
this.$refs.projectForm?.resetFields();
this.form = {
bigEvent: "",
content: "",
fj: "",
img: "",
newsEvent: "",
sj: "",
webUrl: "",
xmmc: "",
year: ""
};
this.fileList = [];
},
handleSuccess(response, file, fileList) {
this.fileList = fileList;
this.images.push({ src: URL.createObjectURL(file.raw) });
//
handleImageChange(file) {
this.form.img = file.url;
},
beforeUpload(file) {
const isJPG = file.type === 'image/jpeg';
const isPNG = file.type === 'image/png';
const isLt2M = file.size / 1024 / 1024 < 2;
if (!isJPG && !isPNG) {
this.$message.error('上传图片只能是 JPG 或 PNG 格式!');
}
if (!isLt2M) {
this.$message.error('上传图片大小不能超过 2MB!');
}
return (isJPG || isPNG) && isLt2M;
//
submitForm() {
this.$refs.projectForm.validate(valid => {
if (valid) {
this.loading = true;
if (this.isEditMode) {
this.handleEditXmxl();
} else {
this.handleAddXmxl();
}
}
});
},
submitUpload() {
this.$refs.upload.submit();
this.dialogVisible = false;
this.handleAddXmxl();
//
handleAddXmxl() {
const submitData = {
...this.form,
xmId: this.xmId,
id: 0,
createTime: "",
createBy: "",
createId: 0,
updateTime: "",
updateBy: "",
updateId: 0,
};
addXmxl(submitData)
.then(response => {
if (response.code === 200) {
this.$message.success('新增成功');
this.dialogVisible = false;
this.fetchProjectList();
} else {
this.$message.error(response.msg || '新增失败');
}
})
.catch(error => {
this.$message.error('请求失败');
console.error(error);
})
.finally(() => {
this.loading = false;
});
},
async handleAddXmxl() {
//
const requestData = {
bigEvent: this.form.bigEvent,
content: this.form.content,
createBy: this.form.createBy,
createId: this.form.createId,
createTime: this.form.createTime,
fj: this.form.fj,
id: this.form.id,
img: this.form.img,
newsEvent: this.form.newsEvent,
sj: this.form.sj,
updateBy: this.form.updateBy,
updateId: this.form.updateId,
updateTime: this.form.updateTime,
webUrl: this.form.webUrl,
xmId: this.form.xmId,
xmmc: this.form.xmmc,
year: this.form.year
//
handleEditXmxl() {
const submitData = {
...this.form,
id: this.currentEditId,
xmId: this.xmId
};
try {
const response = await addXmxl(requestData);
this.$message.success('新增成功');
console.log(response);
this.fetchImages(); //
} catch (error) {
this.$message.error('新增失败');
console.error(error);
}
updataXmxl(submitData)
.then(response => {
if (response.code === 200) {
this.$message.success('编辑成功');
this.dialogVisible = false;
this.fetchProjectList();
} else {
this.$message.error(response.msg || '编辑失败');
}
})
.catch(error => {
this.$message.error('请求失败');
console.error(error);
})
.finally(() => {
this.loading = false;
});
},
//
formatDate(date) {
if (!date) return '';
return new Date(date).toLocaleDateString();
}
},
watch: {
xmId(newVal) {
if (newVal) {
this.fetchProjectList();
}
}
}
};
}
</script>
<style scoped>
@ -324,4 +518,29 @@ export default {
font-style: normal;
text-transform: none;
}
.iconguanbi2 {
position: absolute;
top: 1rem;
right: 1rem;
width: 2rem;
height: 2rem;
background-color: rgba(43, 98, 241, 0.1);
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
}
.iconguanbi2 img {
width: 1.2rem;
height: 1.2rem;
}
.dianjibox{
width: 18rem;
height: 11rem;
/* background-color: red; */
position: absolute;
bottom: 0rem;
}
</style>

@ -1,60 +1,7 @@
<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>
<!-- 下侧轮播图 -->
<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>
@ -63,35 +10,14 @@
</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="图片上传">
<ImageUpload />
</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>
import ImageUpload from '@/components/ImageUpload';
import 'mars2d/mars2d.css';
import * as mars2d from 'mars2d';
export default {
components: {ImageUpload},
dicts: ['tplx'],
data() {
const basePathUrl = window.basePathUrl || "";
@ -116,73 +42,11 @@ export default {
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'),
};
},
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;
addxmt(this.form).then((res) => {
if (res.code === 200) {
this.$message.success('数据提交成功!');
}else {
this.$message.error('数据提交失败!');
}
})
},
//
initMap() {
this.map = new mars2d.Map('mars2dContainerSSS', this.mapOptions);
@ -225,7 +89,6 @@ export default {
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;
}
@ -237,68 +100,6 @@ export default {
border-bottom: 1px solid #E5E5E5;
}
.action-bar {
margin-bottom: 20px;
}
.main-content {
display: flex;
gap: 2rem;
padding: 1rem;
}
.carousel-container {
display: flex;
flex-direction: column;
gap: 1rem;
}
.carousel {
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;
}
.carousel-item img {
width: 100%;
height: 100%;
object-fit: cover;
}
.carousel-item.active {
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;
}
.carousel-control.left {
left: 0;
}
.carousel-control.right {
right: 0;
}
.topleft {
width: 8rem;
display: flex;
@ -324,6 +125,24 @@ export default {
text-transform: none;
}
.main-content {
display: flex;
width: 75rem;
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;
@ -339,15 +158,4 @@ export default {
font-size: .7rem;
z-index: 98;
}
.map-thumbnail {
width: 76rem;
height: 25rem;
position: relative;
}
.mars2d-container {
width: 100%;
height: 100%;
}
</style>

@ -2,7 +2,11 @@
<div class="container">
<!-- 顶部操作栏 -->
<div class="containertop">
<div class="topright">
<div class="topleft">
<img src="../../../assets/images/detailsicon/1.png" alt="">
<span>项目图例</span>
</div>
<div class="topright" v-if="action === 'fill' || !action">
<el-button type="primary" size="medium" plain
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;" @click="handleAdd">
<img src="../../../assets/images/detailsicon/icon-xz@2x.png" alt="新增"
@ -39,44 +43,50 @@
</el-dialog>
<!-- 图片展示区 - 默认轮播图样式 -->
<div class="main-content">
<template v-if="legendsData && legendsData.length > 0">
<div v-for="(legend, index) in legendsData" :key="index">
<!-- 类型1轮播图 -->
<div v-if="legend.type1 && legend.type1.images && legend.type1.images.length > 0">
<h3 class="type-title">类型1</h3>
<div class="fixed-carousel-container">
<el-carousel height="12.44rem" indicator-position="outside" class="fixed-carousel">
<el-carousel-item v-for="(img, imgIndex) in legend.type1.images"
:key="'type1-' + imgIndex">
<div class="carousel-item-wrapper">
<img :src="img" :alt="'类型1图片' + imgIndex" class="fixed-carousel-image">
<div class="classify">类型1</div>
</div>
</el-carousel-item>
</el-carousel>
<div class="longbox">
<div class="main-content">
<template v-if="legendsData && legendsData.length > 0">
<div v-for="(legend, index) in legendsData" :key="index"
style="display: flex;flex-direction: column;gap: 1rem;">
<!-- 类型1轮播图 -->
<div v-if="legend.type1 && legend.type1.images && legend.type1.images.length > 0">
<div class="fixed-carousel-container">
<el-carousel height="12.44rem" indicator-position="outside" class="fixed-carousel">
<el-carousel-item v-for="(img, imgIndex) in legend.type1.images"
:key="'type1-' + imgIndex">
<div class="carousel-item-wrapper">
<img :src="img" :alt="'外部图片' + imgIndex" class="fixed-carousel-image">
<div class="classify">外部</div>
</div>
</el-carousel-item>
</el-carousel>
</div>
</div>
</div>
<!-- 类型2轮播图 -->
<div v-if="legend.type2 && legend.type2.images && legend.type2.images.length > 0">
<h3 class="type-title">类型2</h3>
<div class="fixed-carousel-container">
<el-carousel height="12.44rem" indicator-position="outside" class="fixed-carousel">
<el-carousel-item v-for="(img, imgIndex) in legend.type2.images"
:key="'type2-' + imgIndex">
<div class="carousel-item-wrapper">
<img :src="img" :alt="'类型2图片' + imgIndex" class="fixed-carousel-image">
<div class="classify">类型2</div>
</div>
</el-carousel-item>
</el-carousel>
<!-- 类型2轮播图 -->
<div v-if="legend.type2 && legend.type2.images && legend.type2.images.length > 0">
<div class="fixed-carousel-container">
<el-carousel height="12.44rem" indicator-position="outside" class="fixed-carousel">
<el-carousel-item v-for="(img, imgIndex) in legend.type2.images"
:key="'type2-' + imgIndex">
<div class="carousel-item-wrapper">
<img :src="img" :alt="'内部图片' + imgIndex" class="fixed-carousel-image">
<div class="classify">内部</div>
</div>
</el-carousel-item>
</el-carousel>
</div>
</div>
</div>
</template>
<div v-else class="no-data">
暂无图例数据
</div>
</template>
<div v-else class="no-data">
暂无图例数据
</div>
<div>
<Projectpicturetwo />
</div>
</div>
</div>
@ -85,14 +95,19 @@
<script>
import ImageUpload from '@/components/ImageUpload';
import { addxmtl, getxmtlPageByxmId } from '@/api/ManageApi/index';
import Projectpicturetwo from '@/views/components/ProjectDetails/Projectpicturetwo.vue';
export default {
components: { ImageUpload },
components: { ImageUpload, Projectpicturetwo },
dicts: ['tplx'],
props: {
xmId: {
type: Number,
required: true
},
action: {
type: String,
required: true
}
},
data() {
@ -265,6 +280,32 @@ export default {
overflow: auto;
}
.topleft {
width: 8rem;
height: 2rem;
display: flex;
gap: 0.4rem;
align-items: center;
}
.topleft img {
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;
}
.containertop {
height: auto;
display: flex;
@ -355,31 +396,37 @@ export default {
.el-carousel__arrow:hover {
background-color: rgba(43, 98, 241, 0.5);
}
/* 固定尺寸轮播图样式 */
.fixed-carousel-container {
width: 21.75rem;
height: 12.44rem;
margin: 0 auto;
position: relative;
width: 21.75rem;
height: 12.44rem;
margin: 0 auto;
position: relative;
}
.fixed-carousel {
width: 21.75rem;
height: 12.44rem;
border-radius: 0.5rem;
overflow: hidden;
box-shadow: 0 0.13rem 0.63rem rgba(177, 177, 177, 0.1);
width: 21.75rem;
height: 12.44rem;
border-radius: 0.5rem;
overflow: hidden;
box-shadow: 0 0.13rem 0.63rem rgba(177, 177, 177, 0.1);
}
.fixed-carousel-image {
width: 21.75rem;
height: 12.44rem;
object-fit: cover;
display: block;
width: 21.75rem;
height: 12.44rem;
object-fit: cover;
display: block;
}
/* 调整指示器位置 */
.el-carousel__indicators {
bottom: -1.5rem;
bottom: -1.5rem;
}
.longbox {
display: flex;
align-items: center;
}
</style>

@ -144,11 +144,6 @@ export default {
2: '待审核',
3: '审核通过'
},
// xzflMap:{
// 1:'',
// 2:'',
// 3:''
// },
//
queryParams: {
pageNum: 1,
@ -189,13 +184,6 @@ export default {
handleImport() {
this.upload.open = true;
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id);
this.single = selection.length !== 1;
this.multiple = !selection.length;
},
//
handleFileUploadProgress(event, file, fileList) {
this.upload.isUploading = true;
@ -220,16 +208,18 @@ export default {
submitFileForm() {
this.$refs.upload.submit();
},
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id);
this.single = selection.length !== 1;
this.multiple = !selection.length;
},
/** 导出按钮操作 */
handleExport() {
this.download(
"/gysl/basicInformation/exportInfo",
{
...this.queryParams,
},
`项目列表${new Date().getTime()}.xlsx`
);
this.download('/gysl/basicInformation/exportInfo', {
...this.queryParams,
idList: this.ids[0]
}, `post_${new Date().getTime()}.xlsx`)
},
/** 详情按钮操作 */

@ -241,13 +241,10 @@ export default {
/** 导出按钮操作 */
handleExport() {
this.download(
"/gysl/basicInformation/exportInfo",
{
...this.queryParams,
},
`项目列表${new Date().getTime()}.xlsx`
);
this.download('/gysl/basicInformation/exportInfo', {
...this.queryParams,
idList: this.ids[0]
}, `post_${new Date().getTime()}.xlsx`)
},
/** 删除按钮操作 */
handleDelete(row) {

@ -30,52 +30,70 @@
</div>
<!-- 规划信息 -->
<div id="programme">
<Programme :planInfo="planInformation" @update-data="handleDataUpdate('planInformation', $event)">
<Programme
:action="action"
:planInfo="planInformation" @update-data="handleDataUpdate('planInformation', $event)">
</Programme>
</div>
<!-- 建筑信息 -->
<div id="buildings">
<Buildings
:action="action"
:xmId="projectId"></Buildings>
</div>
<!-- 要素模型信息 -->
<div id="models">
<Models :wysmxInfo="wysmxInformations" @updata-data="handleDataUpdate('wysmxInformations', $event)">
<Models
:action="action"
:wysmxInfo="wysmxInformations" @updata-data="handleDataUpdate('wysmxInformations', $event)">
</Models>
</div>
<!-- 月度进展信息 -->
<div id="months">
<Months></Months>
<Months
:action="action"></Months>
</div>
<!-- 企业入驻信息 -->
<div id="companyenter">
<Companyenter :qyrzInfo="qyrzInformation" @update-data="handleDataUpdate('qyrzInformation', $event)">
<Companyenter
:action="action"
:qyrzInfo="qyrzInformation" @update-data="handleDataUpdate('qyrzInformation', $event)">
</Companyenter>
</div>
<!-- 项目画像 -->
<div id="projectpicture">
<Projectpicture></Projectpicture>
<Projectpicture
:action="action"></Projectpicture>
</div>
<!-- 项目图例 -->
<div id="projectpicturetwo">
<!-- <Projectpicturetwo :id="projectId"></Projectpicturetwo> -->
<Projectpicturetwo22 :xmId="projectId"> </Projectpicturetwo22>
<Projectpicturetwo22
:action="action"
:xmId="projectId"> </Projectpicturetwo22>
</div>
<!-- 项目巡礼 -->
<div id="projectgift">
<!-- <Projectgift></Projectgift> -->
<Projectgift
:action="action"
:xmId="projectId"></Projectgift>
</div>
<!-- 现场实况 -->
<div id="liver">
<Liver></Liver>
<Liver
:action="action"
></Liver>
</div>
<!-- 项目备忘录 -->
<div id="memo">
<!-- <Memo></Memo> -->
<Memo
:action="action"
:xmId="projectId"></Memo>
</div>
<!-- 其他信息 -->
<div class="bottombox" id="others">
<Others :anotherInfo="projectOtherInfos" @update-data="handleDataUpdate('projectOtherInfos', $event)">
<Others
:action="action"
:anotherInfo="projectOtherInfos" @update-data="handleDataUpdate('projectOtherInfos', $event)">
</Others>
</div>
<div class="footer">
@ -102,7 +120,6 @@ import Months from '@/views/components/ProjectDetails/Months.vue';
import Programme from '@/views/components/ProjectDetails/Programme.vue';
import Projectgift from '@/views/components/ProjectDetails/Projectgift.vue';
import Projectpicture from '@/views/components/ProjectDetails/Projectpicture.vue';
import Projectpicturetwo from '@/views/components/ProjectDetails/Projectpicturetwo.vue';
import Projectpicturetwo22 from '@/views/components/ProjectDetails/Projectpicturetwo22.vue';
import Others from '@/views/components/ProjectDetails/Others.vue';
import { checkPermi, checkRole } from "@/utils/permission";
@ -121,7 +138,6 @@ export default {
Programme,
Projectgift,
Projectpicture,
Projectpicturetwo,
Projectpicturetwo22,
Others,
},

Loading…
Cancel
Save