Compare commits

..

No commits in common. '8156f91be13d8929a17fc7568ed72523b6806360' and '979fd3b3326aec079da55bfd2ff126f17aeffd2e' have entirely different histories.

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

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

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

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

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

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

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

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

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

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

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

@ -1,7 +1,60 @@
<template> <template>
<div class="container"> <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="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 class="map-thumbnail">
<div id="mars2dContainerSSS" class="mars2d-container"></div> <div id="mars2dContainerSSS" class="mars2d-container"></div>
@ -10,14 +63,35 @@
</div> </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="图片上传">
<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> </div>
</template> </template>
<script> <script>
import ImageUpload from '@/components/ImageUpload';
import 'mars2d/mars2d.css'; import 'mars2d/mars2d.css';
import * as mars2d from 'mars2d'; import * as mars2d from 'mars2d';
export default { export default {
components: {ImageUpload},
dicts: ['tplx'], dicts: ['tplx'],
data() { data() {
const basePathUrl = window.basePathUrl || ""; const basePathUrl = window.basePathUrl || "";
@ -42,11 +116,73 @@ export default {
maxZoom: 20, // maxZoom: 20, //
zoomControl: true, 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, // map: null, //
markerIcon: require('@/assets/images/detailsicon/icon-定位@2x.png'), markerIcon: require('@/assets/images/detailsicon/icon-定位@2x.png'),
}; };
}, },
methods: { 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() { initMap() {
this.map = new mars2d.Map('mars2dContainerSSS', this.mapOptions); this.map = new mars2d.Map('mars2dContainerSSS', this.mapOptions);
@ -89,6 +225,7 @@ export default {
background-color: #FFFFFF; background-color: #FFFFFF;
box-shadow: 0rem 0.13rem 0.63rem 0rem rgba(177, 177, 177, 0.1); box-shadow: 0rem 0.13rem 0.63rem 0rem rgba(177, 177, 177, 0.1);
border-radius: 0.5rem 0.5rem 0.5rem 0.5rem; border-radius: 0.5rem 0.5rem 0.5rem 0.5rem;
gap: 1rem;
overflow: auto; overflow: auto;
} }
@ -100,6 +237,68 @@ export default {
border-bottom: 1px solid #E5E5E5; 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 { .topleft {
width: 8rem; width: 8rem;
display: flex; display: flex;
@ -125,24 +324,6 @@ export default {
text-transform: none; 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 { .classify {
width: 2.81rem; width: 2.81rem;
height: 1.38rem; height: 1.38rem;
@ -158,4 +339,15 @@ export default {
font-size: .7rem; font-size: .7rem;
z-index: 98; z-index: 98;
} }
.map-thumbnail {
width: 76rem;
height: 25rem;
position: relative;
}
.mars2d-container {
width: 100%;
height: 100%;
}
</style> </style>

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

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

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

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

Loading…
Cancel
Save