xuhongjie
严飞永 4 weeks ago
parent 8156f91be1
commit ac7ccff395

@ -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'

@ -529,3 +529,79 @@ export function getclglPage(data) {
data
})
}
// 富文本编辑接口
export function exportToPdf(params) {
return request({
url: '/gysl/dpclgl/unloadPdf',
method: 'get',
params,
})
}
//通用下载请求
export function downloadPdf(fileName) {
return request({
url: '/common/download',
method: 'get',
params: { fileName },
})
}
//政务统计
//整体项目情况
export function allinformation(data){
return request({
url:'/gysl/zwStats/allProject',
method:'get',
data
})
}
// //投资主体
export function investall() {
return request({
url: '/gysl/zwStats/investors',
method: 'get'
})
}
// 功能区
export function fungong(){
return request({
url:'/gysl/zwStats/ribbon',
method:'get'
})
}
//详细通知
export function getAllMessages(){
return request({
url:'/gysl/zwStats/zwNotice',
method:'get'
})
}
//项目列表
export function xmlist(){
return request({
url:'/gysl/zwStats/projectList',
method:'get'
})
}
//政务统计结束
//企业统计
//整体项目情况
export function allproject(){
return request({
url:'/gysl/qyStats/allProject',
method:'get'
})
}
//企业详细通知
export function getAllMessagestwo(){
return request({
url:'/gysl/qyStats/qyNotice',
method:'get'
})
}

@ -45,8 +45,8 @@
</template>
</el-table-column>
</el-table>
<!-- <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
@pagination="getList" /> -->
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
@pagination="getList" />
</div>
<!-- 新增/编辑的弹窗 -->
@ -80,7 +80,9 @@
<div class="previewhead">
<div class="headone">预览</div>
<div class="headtwo">
<el-button type="primary" size="mini" icon="el-icon-upload2" @click="handleReturn"></el-button>
<el-button type="primary" size="mini" icon="el-icon-upload2" @click="handleExporttwo" :loading="loading">
导出PDF
</el-button>
<el-button type="primary" size="mini" icon="el-icon-back" @click="handleReturn"></el-button>
</div>
</div>
@ -104,7 +106,7 @@
<script>
import Editorone from '@/components/Editor';
import { getclglPage } from '@/api/ManageApi/index';
import { getclglPage, exportToPdf, downloadPdf } from '@/api/ManageApi/index';
export default {
components: { Editorone },
@ -131,16 +133,83 @@ export default {
content: ''
},
rules: {
title: [{ required: true, message: '请输入文件标题', trigger: 'blur' }],
date: [{ required: true, message: '请选择发布时间', trigger: 'change' }],
unit: [{ required: true, message: '请输入发布单位', trigger: 'blur' }],
author: [{ required: true, message: '请输入发布人', trigger: 'blur' }]
},
previewMode: false,
previewData: {},
previewMode: false,
previewData: {},
};
},
methods: {
// PDF
async handleExporttwo() {
try {
this.loading = true;
//
if (!this.previewData.title || !this.previewData.content) {
this.$message.warning('请确保标题和内容不为空');
return;
}
// 1.
const exportResponse = await exportToPdf({
htmlArticleTitle: this.previewData.title,
htmlContent: this.previewData.content
});
console.log('完整的:', exportResponse);
// - data
if (!exportResponse?.data || exportResponse.code !== 200) {
throw new Error(exportResponse?.msg || '导出PDF失败');
}
const fileData = exportResponse.data;
if (!fileData.fileName || !fileData.url) {
throw new Error('后端未返回有效的文件路径或文件名');
}
// else {
// const downloadResponse = await downloadPdf(fileData.fileName);
// const blob = new Blob([downloadResponse], { type: 'application/pdf' });
// const url = window.URL.createObjectURL(blob);
// const link = document.createElement('a');
// link.href = url;
// link.download = fileData.newFileName || this.previewData.title + '.pdf';
// link.click();
// window.URL.revokeObjectURL(url);
// }
// 使
this.handleDownload(fileData);
this.$message.success('PDF导出下载成功');
} catch (error) {
} finally {
this.loading = false;
}
},
//
handleDownload(fileData) {
var name = fileData.fileName;
var url = fileData.url;
console.log(name);
console.log(url);
var suffix = url.substring(url.lastIndexOf("."), url.length);
const a = document.createElement('a');
a.setAttribute('download', name + suffix);
a.setAttribute('target', '_blank');
a.setAttribute('href', url);
a.click();
},
//
handleReturn() {
this.previewMode = false;
this.previewData = {};
},
handleAdd() {
this.dialogTitle = '新增';
this.dialogVisible = true;
@ -180,17 +249,17 @@ export default {
this.postList.splice(index, 1, this.form);
} else {
//
const newForm = { ...this.form };
newForm.id = this.postList.length + 1;
const newForm = { ...this.form };
newForm.id = this.postList.length + 1;
this.postList.push(newForm);
this.total += 1;
const formData = { ...newForm };
delete formData.id;
//
getclglPage(formData).then(response => {
this.$message({ type: 'success', message: '新增成功!' });
})
// getclglPage(formData).then(response => {
// this.$message({ type: 'success', message: '!' });
// })
}
this.dialogVisible = false;
this.$message({ type: 'success', message: '操作成功!' });

@ -233,6 +233,7 @@ export default {
handleImport() {
this.upload.open = true;
},
//
importTemplate() {
download(
"/api/enterprise/template", //
@ -240,6 +241,7 @@ export default {
`企业入驻模板_${new Date().getTime()}.xlsx`
);
},
handleFileUploadProgress() {
this.upload.isUploading = true;
},
@ -267,7 +269,6 @@ export default {
</script>
<style scoped>
/* 保持原有样式不变 */
.container {
display: flex;
flex-direction: column;

@ -15,7 +15,7 @@
<!-- 内容区 -->
<div class="content">
<div class="picturediv">
<div ref="chart" style="width: 40rem; height: 28rem; margin-left: 2rem;"></div>
<div ref="chart" style="width: 30rem; height: 28rem; margin-left: 2rem;"></div>
</div>
<div class="descriptionsdiv">
<div class="tablehead">

@ -1,7 +1,7 @@
<template>
<div class="container">
<div>
<div class="title">整体项目情况</div class="title">
<div class="title">整体项目情况</div>
<table>
<thead>
<tr>
@ -15,17 +15,17 @@
</thead>
<tbody>
<tr>
<td>{{ projectData.totalProjects }}</td>
<td>{{ projectData.totalArea }}</td>
<td>{{ projectData.completedProjects }}</td>
<td>{{ projectData.ongoingProjects }}</td>
<td>{{ projectData.plannedProjects }}</td>
<td>{{ projectData.allProject }}</td>
<td>{{ projectData.allGrossArea }}</td>
<td>{{ projectData.allBuilding1 }}</td>
<td>{{ projectData.allBuilding2 }}</td>
<td>{{ projectData.allBuilding3 }}</td>
</tr>
</tbody>
</table>
</div>
<div>
<div class="title">当年项目情况</div class="title">
<div class="title">当年项目情况</div>
<table>
<thead>
<tr>
@ -39,36 +39,72 @@
</thead>
<tbody>
<tr>
<td>{{ projectData.totalProjects }}</td>
<td>{{ projectData.totalArea }}</td>
<td>{{ projectData.completedProjects }}</td>
<td>{{ projectData.ongoingProjects }}</td>
<!-- <td>{{ projectData.plannedProjects }}</td> -->
<td>{{ currentYearData.currentYearProject }}</td>
<td>{{ currentYearData.currentYearGrossArea }}</td>
<td>{{ currentYearData.currentYearBuilding1 }}</td>
<td>{{ currentYearData.currentBuilding2 || 0 }}</td>
</tr>
</tbody>
</table>
</div>
</div>
</template>
<script>
import { allinformation } from '@/api/ManageApi';
export default {
data() {
return {
projectData: {
totalProjects: 384,
totalArea: 2352.6,
completedProjects: 189,
ongoingProjects: 100,
plannedProjects: 97
}
allProject: 0, //
allGrossArea: 0, //
allBuilding1: 0, //
allBuilding2: 0, //
allBuilding3: 0 //
},
currentYearData: {
currentYearProject: 0, //
currentYearGrossArea: 0, //
currentYearBuilding1: 0, //
currentBuilding2: 0 //
},
loading: false,
error: null
};
},
created() {
this.fetchProjectData();
},
methods: {
async fetchProjectData() {
this.loading = true;
try {
const response = await allinformation();
this.projectData = {
allProject: response.data.allProject || 0,
allGrossArea: response.data.allGrossArea || 0,
allBuilding1: response.data.allBuilding1 || 0,
allBuilding2: response.data.allBuilding2 || 0,
allBuilding3: response.data.allBuilding3 || 0
};
this.currentYearData = {
currentYearProject: response.data.currentYearProject || 0,
currentYearGrossArea: response.data.currentYearGrossArea || 0,
currentYearBuilding1: response.data.currentYearBuilding1 || 0,
currentBuilding2: response.data.currentBuilding2 || 0
};
}
finally {
this.loading = false;
}
}
}
};
</script>
<style scoped>
/* Your existing styles remain unchanged */
.container {
display: flex;
flex-direction: column;

@ -0,0 +1,162 @@
<template>
<div class="container">
<div>
<div class="title">整体项目情况</div>
<table>
<thead>
<tr>
<th>项目总数</th>
<th>建筑面积(万平方米)</th>
<th>已建数量()</th>
<th>在建数量()</th>
<th>拟建数量()</th>
<th style="visibility: hidden;">拟建数量()</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ projectData.allProject }}</td>
<td>{{ projectData.allGrossArea }}</td>
<td>{{ projectData.allBuilding1 }}</td>
<td>{{ projectData.allBuilding2 }}</td>
<td>{{ projectData.allBuilding3 }}</td>
</tr>
</tbody>
</table>
</div>
<div>
<div class="title">当年项目情况</div>
<table>
<thead>
<tr>
<th>新开工项目数</th>
<th>建筑面积(万平方米)</th>
<th>已建数量()</th>
<th>在建数量()</th>
<th style="visibility: hidden;">拟建数量()</th>
<th style="visibility: hidden;">拟建数量()</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ currentYearData.currentYearProject }}</td>
<td>{{ currentYearData.currentYearGrossArea }}</td>
<td>{{ currentYearData.currentYearBuilding1 }}</td>
<td>{{ currentYearData.currentBuilding2 || 0 }}</td>
</tr>
</tbody>
</table>
</div>
</div>
</template>
<script>
import { allproject } from '@/api/ManageApi';
export default {
data() {
return {
projectData: {
allProject: 0, //
allGrossArea: 0, //
allBuilding1: 0, //
allBuilding2: 0, //
allBuilding3: 0 //
},
currentYearData: {
currentYearProject: 0, //
currentYearGrossArea: 0, //
currentYearBuilding1: 0, //
currentBuilding2: 0 //
},
loading: false,
error: null
};
},
created() {
this.fetchProjectData();
},
methods: {
async fetchProjectData() {
this.loading = true;
try {
const response = await allproject();
this.projectData = {
allProject: response.data.allProject || 0,
allGrossArea: response.data.allGrossArea || 0,
allBuilding1: response.data.allBuilding1 || 0,
allBuilding2: response.data.allBuilding2 || 0,
allBuilding3: response.data.allBuilding3 || 0
};
this.currentYearData = {
currentYearProject: response.data.currentYearProject || 0,
currentYearGrossArea: response.data.currentYearGrossArea || 0,
currentYearBuilding1: response.data.currentYearBuilding1 || 0,
currentBuilding2: response.data.currentBuilding2 || 0
};
}
finally {
this.loading = false;
}
}
}
};
</script>
<style scoped>
.container {
display: flex;
flex-direction: column;
gap: 1.5rem;
}
table {
width: 100%;
border-collapse: collapse;
}
th,
td {
border: none;
padding: 8px;
text-align: left;
}
th {
width: 7rem;
}
.title {
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 600;
font-size: 1.25rem;
color: #3D424C;
line-height: 1.69rem;
text-align: left;
font-style: normal;
text-transform: none;
margin-bottom: .5rem;
margin-left: .4rem;
}
thead tr {
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 400;
font-size: 0.88rem;
color: #7B8599;
line-height: 1.19rem;
text-align: left;
font-style: normal;
text-transform: none;
}
tbody tr {
font-family: DIN, DIN;
font-weight: 600;
font-size: 1.5rem;
color: #292C33;
line-height: 2.11rem;
text-align: left;
font-style: normal;
text-transform: none;
}
</style>

@ -1,58 +1,86 @@
<template>
<!-- 功能区 -->
<div ref="chart" style="width: 30rem; height: 15rem;"></div>
</template>
<script>
import * as echarts from 'echarts';
import { fungong } from '@/api/ManageApi/index';
export default {
name: 'RingChart',
name: 'FunctionChart',
data() {
return {
chartData: [
{ value: 54, name: '高贸区', itemStyle: { color: '#36C3FB' } },
{ value: 65, name: '科创区', itemStyle: { color: '#5B76F9' } },
{ value: 32, name: '度假区', itemStyle: { color: '#F08445' } },
{ value: 25, name: '商务区', itemStyle: { color: '#F6B600' } },
{ value: 15, name: '苏相合作区', itemStyle: { color: '#50DFB3' } }
]
};
},
mounted() {
this.renderChart();
this.getData();
},
methods: {
async getData() {
try {
const response = await fungong();
if (response && response.code === 200 && response.data) {
this.chartData = this.processData(response.data);
this.renderChart();
} else {
console.error('获取数据失败:', response);
}
} catch (error) {
console.error('获取数据失败:', error);
}
},
processData(data) {
const names = ['高贸区', '科创区', '度假区', '商务区', '苏相合作区'];
const counts = data.map(item => item.count);
const total = counts.reduce((sum, count) => sum + count, 0);
return names.map((name, index) => ({
value: counts[index] || 0,
name: name,
itemStyle: { color: ['#36C3FB', '#5B76F9', '#F08445', '#F6B600', '#50DFB3'][index] },
percent: ((counts[index] || 0) / total * 100).toFixed(2)
}));
},
renderChart() {
const chartDom = this.$refs.chart;
const myChart = echarts.init(chartDom);
const option = {
tooltip: {
trigger: 'item'
trigger: 'item',
formatter: function (params) {
return `${params.name}: ${params.value}个 (${params.percent}%)`;
}
},
legend: {
orient: 'vertical', //
right: '10%', //
top: 'center', //
itemGap: 20, //
itemGap: 40, //
formatter: function (name) {
//
const data = [
{ value: 54, name: '高贸区' , itemStyle:{color:'#36C3FB'}},
{ value: 65, name: '科创区' , itemStyle:{color:'#5B76F9'} },
{ value: 32, name: '度假区' , itemStyle:{color:'#F08445'} },
{ value: 25, name: '商务区' , itemStyle:{color:'#F6B600'} },
{ value: 15, name: '苏相合作区' , itemStyle:{color:'#50DFB3'} }
];
//
const item = data.find(item => item.name === name);
return `${name} ${item.value}${((item.value / 384) * 100).toFixed(1)}%`;
}
const item = this.chartData.find(item => item.name === name);
return `${name} ${item.value}个 (${item.percent}%)`;
}.bind(this)
},
series: [
{
name: '项目分布',
type: 'pie',
radius: ['40%', '60%'],
center: ['30%', '50%'],
data: [
{ value: 54, name: '高贸区' , itemStyle:{color:'#36C3FB'}},
{ value: 65, name: '科创区' , itemStyle:{color:'#5B76F9'} },
{ value: 32, name: '度假区' , itemStyle:{color:'#F08445'} },
{ value: 25, name: '商务区' , itemStyle:{color:'#F6B600'} },
{ value: 15, name: '苏相合作区' , itemStyle:{color:'#50DFB3'} }
],
radius: ['40%', '60%'],
center: ['30%', '50%'],
data: this.chartData,
label: {
show: false //
show: false //
},
emphasis: {
itemStyle: {
@ -72,5 +100,5 @@ export default {
</script>
<style scoped>
/* 你可以在这里添加样式 */
</style>

@ -1,74 +1,87 @@
<template>
<div>分析</div>
</template><template>
<div ref="chart" style="width: 30rem; height: 15rem;"></div>
</template>
<script>
import * as echarts from 'echarts';
export default {
name: 'RingChart',
mounted() {
this.renderChart();
<!-- 投资主体 -->
<div ref="chart" style="width: 30rem; height: 15rem;"></div>
</template>
<script>
import * as echarts from 'echarts';
import { investall } from '@/api/ManageApi/index';
export default {
name: 'RingChart',
data() {
return {
chartData: [
{ value: 54, name: '国企', itemStyle: { color: '#36C3FB' } },
{ value: 65, name: '民企', itemStyle: { color: '#5B76F9' } },
{ value: 32, name: '外企', itemStyle: { color: '#FAC858' } },
],
};
},
mounted() {
this.getData();
},
methods: {
async getData() {
const response = await investall();
if (response && response.code === 200 && response.data) {
this.chartData = this.processData(response.data);
this.renderChart();
} else {}
},
methods: {
renderChart() {
const chartDom = this.$refs.chart;
const myChart = echarts.init(chartDom);
const option = {
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical', //
right: '10%', //
top: 'center', //
itemGap: 40, //
formatter: function (name) {
//
const data = [
{ value: 54, name: '国企' },
{ value: 65, name: '民企' },
{ value: 32, name: '外企' },
];
//
const item = data.find(item => item.name === name);
return `${name} ${item.value}`;
}
},
series: [
{
name: '项目分布',
type: 'pie',
radius: ['40%', '60%'],
center: ['30%', '50%'],
data: [
{ value: 54, name: '国企' , itemStyle:{color:'#36C3FB'}},
{ value: 65, name: '民企' , itemStyle:{color:'#5B76F9'} },
{ value: 32, name: '外企' , itemStyle:{color:'#FAC858'} },
],
label: {
show: false //
},
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
processData(data) {
const names = ['国企', '民企', '外企'];
const counts = data.map(item => item.count);
return names.map((name, index) => ({
value: counts[index] || 0,
name: name,
itemStyle: { color: ['#36C3FB', '#5B76F9', '#FAC858'][index] },
}));
},
renderChart() {
const chartDom = this.$refs.chart;
const myChart = echarts.init(chartDom);
const option = {
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical', //
right: '10%', //
top: 'center', //
itemGap: 40, //
formatter: function (name) {
//
const item = this.chartData.find(item => item.name === name);
return `${name} ${item.value}`;
}.bind(this)
},
series: [
{
name: '项目分布',
type: 'pie',
radius: ['40%', '60%'],
center: ['30%', '50%'],
data: this.chartData,
label: {
show: false //
},
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
]
};
myChart.setOption(option);
}
}
]
};
myChart.setOption(option);
}
};
</script>
<style scoped>
/* 你可以在这里添加样式 */
</style>
}
};
</script>
<style scoped></style>

@ -15,52 +15,48 @@
</template>
<script>
import { getAllMessages } from '@/api/ManageApi/index';
export default {
name: 'MessageTable',
data() {
return {
tableData: [
{
date: '2016-05-02',
name: 'xxxxxxx项目2024年12月项目进展未填写',
},
{
date: '2016-05-04',
name: 'xxxxxxx项目2024年12月项目进展未填写',
},
{
date: '2016-05-01',
name: 'xxxxxxx项目2024年12月项目进展未填写',
},
{
date: '2016-05-03',
name: 'xxxxxxx项目2024年12月项目进展未填写',
},
{
date: '2016-05-03',
name: 'xxxxxxx项目2024年12月项目进展未填写',
},
{
date: '2016-05-03',
name: 'xxxxxxx项目2024年12月项目进展未填写',
},
{
date: '2016-05-03',
name: 'xxxxxxx项目2024年12月项目进展未填写',
}
]
}
tableData: []
};
},
mounted() {
this.getData();
},
methods: {
async getData() {
const response = await getAllMessages();
if (response && response.code === 200 && response.data) {
this.tableData = this.processData(response.data);
}
},
processData(data) {
return data.map(item => ({
name: item.content,
date: this.formatDate(item.createTime)
}));
},
getIcon(index) {
return index === 0 ? require('@/assets/images/new@2x.png') : require('@/assets/images/other.png');
},
formatDate(dateString) {
const date = new Date(dateString);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
}
}
}
};
</script>
<style scoped>
.container{
.container {
width: 30rem;
height: 14.5rem;;
height: 14.5rem;
}
</style>

@ -0,0 +1,62 @@
<template>
<div class="container">
<el-table :data="tableData" style="width: 100%" :show-header="false">
<el-table-column width="80">
<template slot-scope="scope">
<img :src="getIcon(scope.$index)" alt="icon" style="width: 2.19rem; height: 1.25rem;">
</template>
</el-table-column>
<el-table-column prop="name" width="300">
</el-table-column>
<el-table-column prop="date" width="100">
</el-table-column>
</el-table>
</div>
</template>
<script>
import { getAllMessagestwo } from '@/api/ManageApi/index';
export default {
name: 'MessageTable',
data() {
return {
tableData: []
};
},
mounted() {
this.getData();
},
methods: {
async getData() {
const response = await getAllMessagestwo();
if (response && response.code === 200 && response.data) {
this.tableData = this.processData(response.data);
}
},
processData(data) {
return data.map(item => ({
name: item.content,
date: this.formatDate(item.createTime)
}));
},
getIcon(index) {
return index === 0 ? require('@/assets/images/new@2x.png') : require('@/assets/images/other.png');
},
formatDate(dateString) {
const date = new Date(dateString);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
}
}
};
</script>
<style scoped>
.container {
width: 30rem;
height: 14.5rem;
}
</style>

@ -1,99 +1,96 @@
<template>
<div class="projectList">
<el-table
:data="tableData"
style="width: 100%">
<el-table-column
prop="name"
label="项目名称"
width="170">
<template slot-scope="scope">
<span style="color: #2B62F1;">{{ scope.row.name }}</span>
</template>
</el-table-column>
<el-table-column
prop="address"
label="所在区域">
</el-table-column>
<el-table-column
prop="data"
label='总投资额(万元)'
width="88"
>
</el-table-column>
<el-table-column
prop="data"
label='建筑面积(万平方米)'
width="88">
</el-table-column>
<el-table-column
prop="status"
label="状态"
width="70">
<template slot-scope="scope">
<span :style="getStatusColor(scope.row.status)">{{ scope.row.status }}</span>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
export default {
data() {
return {
tableData: [
{
date: '2016-05-02',
name: '大众电脑生成制造基地',
address: '高贸区',
data: '1000',
status: '在建'
},
{
date: '2016-05-04',
name: '大众电脑生成制造基地',
address: ' 科创区',
data: '1500',
status: '拟建'
},
{
date: '2016-05-01',
name: '大众电脑生成制造基地',
address: ' 度假区',
data: '2000',
status: '已建'
},
{
date: '2016-05-03',
name: '大众电脑生成制造基地',
address: ' 苏相合作区',
data: '2500',
status: '在建'
}
],
<div class="projectList">
<el-table :data="tableData" style="width: 100%">
<el-table-column prop="name" label="项目名称" width="170">
<template slot-scope="scope">
<span style="color: #2B62F1;">{{ scope.row.name }}</span>
</template>
</el-table-column>
<el-table-column prop="ssgnq" label="所在区域">
</el-table-column>
<el-table-column prop="ztze" label='总投资额(万元)' width="88">
</el-table-column>
<el-table-column prop="zydmj" label='建筑面积(万平方米)' width="88">
</el-table-column>
<el-table-column prop="status" label="状态" width="70">
<template slot-scope="scope">
<span :style="getStatusColor(scope.row.status)">{{ scope.row.status }}</span>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import { xmlist } from '@/api/ManageApi'
export default {
data() {
return {
tableData: [],
ssgnqMap:{
1:'高贸区',
2:'科创区',
3:'度假区',
4:'商务区',
5:'苏相合作区'
}
}
},
created() {
this.getxmList();
},
methods: {
async getxmList() {
const response = await xmlist();
if (response && response.code === 200 && response.data.records) {
this.tableData = this.processData(response.data.records);
}
},
methods: {
getStatusColor(status) {
switch (status) {
case '在建':
return 'color: #2DD29F;';
case '拟建':
return 'color: #F08445;';
case '已建':
return 'color: #2B62F1;';
}
processData(data) {
return data.map(item => ({
name: item.name,
ssgnq: this.getRegion(item.ssgnq),
ztze: item.ztze,
zydmj: item.zydmj || 0,
status: this.getStatus(item.xzfl)
}));
},
getStatus(xzfl) {
switch (xzfl) {
case 1:
return '已建';
case 2:
return '在建';
case 3:
return '拟建';
default:
return '未知';
}
},
getRegion(ssgnq) {
return this.ssgnqMap[ssgnq] || '未知区域';
},
getStatusColor(status) {
switch (status) {
case '在建':
return 'color: #2DD29F;';
case '拟建':
return 'color: #F08445;';
case '已建':
return 'color: #2B62F1;';
default:
return 'color: #000000;';
}
}
}
</script>
<style scoped>
.projectList {
padding: 0 .5rem 0rem 0;
height: 15rem;
overflow-y: auto;
}
</style>
}
</script>
<style scoped>
.projectList {
padding: 0 .5rem 0rem 0;
height: 15rem;
overflow-y: auto;
}
</style>

@ -99,8 +99,7 @@
<el-button @click="infoDialogVisible = false"> </el-button>
</span>
</el-dialog>
<!-- 修改对话框 -->
<el-dialog title="修改项目" :visible.sync="dialogVisible" width="50%">
<el-form :model="editForm" label-width="120px">
@ -133,7 +132,7 @@
</template>
<script>
import { getProjectEvaluationList, updateProjectEvaluationList } from '@/api/ManageApi/index.js';
// import { getProjectEvaluationList, updateProjectEvaluationList } from '@/api/ManageApi/index.js';
export default {
dicts: [

@ -11,14 +11,14 @@
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="工业大类" prop="industryCategory" style="width: 100%;">
<el-input v-model="queryParams.industryCategory" placeholder="请输入工业大类" clearable style="width: 20.5rem;"
<el-form-item label="工业大类" prop="gydl" style="width: 100%;">
<el-input v-model="queryParams.gydl" placeholder="请输入工业大类" clearable style="width: 20.5rem;"
@keyup.enter.native="handleQuery" show-word-limit />
</el-form-item>
</el-col>
<el-col :span="7">
<el-form-item label="产业" prop="industry" style="width: 100%;">
<el-input v-model="queryParams.industry" placeholder="请输入产业" clearable style="width: 20.5rem;"
<el-form-item label="产业" prop="cy" style="width: 100%;">
<el-input v-model="queryParams.cy" placeholder="请输入产业" clearable style="width: 20.5rem;"
@keyup.enter.native="handleQuery" show-word-limit />
</el-form-item>
</el-col>
@ -46,7 +46,7 @@
<div class="tablehead">
<div class="tablebtntwo">
<div>
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"></el-button>
<el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"></el-button>
</div>
<div class="tablebtn">
<el-button type="primary" size="mini" @click="handleExport"></el-button>
@ -56,7 +56,6 @@
</div>
<el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange"
:row-class-name="tableRowClassName">
<el-table-column label="序号" align="center" prop="id" />
<el-table-column label="上楼目录类别" align="center" prop="slmllb" />
<el-table-column label="工业大类" align="center" prop="gydl" />
<el-table-column label="产业" align="center" prop="cy" />
@ -72,48 +71,50 @@
@pagination="getList" />
</div>
<!-- 添加或修改项目对话框 -->
<el-dialog :title="title" :visible.sync="open" width="40rem" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="7rem">
<!-- 新增按钮的对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body :close-on-click-modal="false">
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-form-item label="上楼目录类别" prop="slmllb">
<el-select v-model="form.slmllb" placeholder="请选择上楼目录类别" style="width: 100%;">
<el-select v-model="form.slmllb" placeholder="请选择文件类型" style="width: 100%;">
<el-option v-for="dict in dict.type.shangloumulu" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="工业大类" prop="industryCategory">
<el-input v-model="form.industryCategory" placeholder="请输入工业大类" maxlength="50" show-word-limit />
<el-form-item label="工业大类" prop="gydl">
<el-input v-model="form.gydl" placeholder="请输入工业大类" />
</el-form-item>
<el-form-item label="产业" prop="industry">
<el-input v-model="form.industry" placeholder="请输入产业" maxlength="100" show-word-limit />
</el-form-item>
<el-form-item label="更新时间" prop="updateTime">
<el-date-picker v-model="form.updateTime" type="date" placeholder="选择日期" value-format="yyyy-MM-dd"
style="width: 100%;" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
<el-form-item label="产业" prop="cy">
<el-input v-model="form.cy" placeholder="请输入产业" />
</el-form-item>
<!-- <el-form-item label="更新时间" prop="updateTime">
<el-date-picker v-model="form.updateTime" type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
placeholder="选择日期" />
</el-form-item> -->
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
<el-button type="primary" @click="submitForm"> </el-button>
</div>
</el-dialog>
<!-- 批量导入对话框 -->
<el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
<el-upload ref="upload" :limit="1" accept=".xlsx, .xls"
:action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"
:on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
<el-dialog title="数据导入" :visible.sync="upload.open" width="400px" append-to-body :close-on-click-modal="false">
<el-upload ref="upload" :limit="1" accept=".xlsx,.xls" :headers="upload.headers" :action="upload.url"
:disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess"
:auto-upload="false" drag>
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<div class="el-upload__tip text-center" slot="tip">
<span>仅允许导入xlsxlsx格式文件</span>
<el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline"
@click="importTemplate">下载模板</el-link>
</div>
</el-upload>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitFileForm"> </el-button>
<el-button @click="upload.open = false"> </el-button>
<el-button type="primary" @click="submitFileForm" :loading="upload.isUploading">
</el-button>
</div>
</el-dialog>
</div>
@ -121,6 +122,7 @@
<script>
import { addCatalog, deleteCatalog, editCatalog, getAllCatalogs } from '@/api/ManageApi/index';
import { getToken } from "@/utils/auth";
export default {
dicts: [
@ -151,17 +153,17 @@ export default {
queryParams: {
pageNum: 1,
pageSize: 10,
slmllb: undefined, // slmllb
industryCategory: undefined,
industry: undefined,
slmllb: undefined,
gydl: undefined,
cy: undefined,
updateTimeRange: undefined
},
//
form: {
id: undefined,
slmllb: undefined, // slmllb
industryCategory: undefined,
industry: undefined,
slmllb: undefined,
gydl: undefined,
cy: undefined,
updateTime: undefined,
remark: undefined
},
@ -170,30 +172,25 @@ export default {
slmllb: [
{ required: true, message: "上楼目录类别不能为空", trigger: "change" }
],
industryCategory: [
gydl: [
{ required: true, message: "工业大类不能为空", trigger: "blur" },
{ max: 50, message: "工业大类长度不能超过50个字符", trigger: "blur" }
],
industry: [
cy: [
{ required: true, message: "产业不能为空", trigger: "blur" },
{ max: 50, message: "产业长度不能超过50个字符", trigger: "blur" }
],
updateTime: [
{ required: true, message: "更新时间不能为空", trigger: "change" }
]
// updateTime: [
// { required: true, message: "", trigger: "change" }
// ]
},
//
upload: {
//
open: false,
//
title: "导入",
//
isUploading: false,
//
updateSupport: 0,
//
url: process.env.VUE_APP_BASE_API + "/gysl/ml/importData"
open: false, //
isUploading: false, //
updateSupport: 0, //
headers: { Authorization: "Bearer " + getToken() }, //
url: process.env.VUE_APP_BASE_API + "/ml", //
},
};
},
@ -213,6 +210,14 @@ export default {
handleImport() {
this.upload.open = true;
},
//
importTemplate() {
this.download(
"/ml/",
{},
`目录导入模板${new Date().getTime()}.xlsx`
);
},
//
handleFileUploadProgress(event, file, fileList) {
this.upload.isUploading = true;
@ -255,9 +260,9 @@ export default {
reset() {
this.form = {
id: undefined,
postName: undefined,
industryCategory: undefined,
industry: undefined,
slmllb: undefined,
gydl: undefined,
cy: undefined,
updateTime: undefined,
remark: undefined
};
@ -297,12 +302,13 @@ export default {
}
this.form = {
id: data.id,
postName: data.slmllb,
industryCategory: data.gydl,
industry: data.cy,
slmllb: data.slmllb,
gydl: data.gydl,
cy: data.cy,
updateTime: data.updateTime,
remark: data.remark
};
console.log("Form data after update:", this.form); //
this.open = true;
this.title = "修改目录";
}).catch(error => {
@ -315,12 +321,14 @@ export default {
if (valid) {
const formData = {
id: this.form.id,
slmllb: this.form.postName,
gydl: this.form.industryCategory,
cy: this.form.industry,
slmllb: this.form.slmllb,
gydl: this.form.gydl,
cy: this.form.cy,
updateTime: this.form.updateTime,
remark: this.form.remark
};
console.log("完整的提交数据:", JSON.stringify(formData, null, 2));
if (this.form.id !== undefined) {
editCatalog(formData).then(response => {
this.$modal.msgSuccess("修改成功");
@ -408,5 +416,4 @@ export default {
.el-table .success-row {
background: #f0f9eb;
}
</style>

@ -23,7 +23,7 @@
</div>
<div class="relaitem">
<div class="itemsall">
<span>384</span>
<span>{{ functionnumber.functionnumber}}</span>
<span>项目总数</span>
</div>
<FunctionArea />
@ -45,7 +45,7 @@
</div>
<div class="relaitem">
<div class="itemsall">
<span>112</span>
<span>{{ allnumber.touzinumber }}</span>
<span>项目总数</span>
</div>
<InvestArea />
@ -55,7 +55,7 @@
<!-- 地图模块 -->
<div class="mapareaone">
<div style="position: absolute; top: 2rem;left: 5rem; z-index: 999;">
<el-input placeholder="请输入项目名称" />
<el-input placeholder="请输入项目名称" />
</div>
<MapArea />
</div>
@ -70,9 +70,9 @@ import InvestArea from '@/views/components/analysis/invest.vue'
import Message from '@/views/components/analysis/message.vue'
import ProjectList from '@/views/components/analysis/projectList.vue'
import MapArea from '@/views/components/analysis/map.vue'
import { investall,fungong } from '@/api/ManageApi/index'
export default {
name: "Pc2FbEcharts",
components: {
AllArea,
FunctionArea,
@ -82,14 +82,42 @@ export default {
MapArea,
},
data() {
return {};
},
mounted() {
return {
allnumber: {
touzinumber: 0
},
functionnumber: {
functionnumber: 0
}
};
},
methods: {
async getData() {
const response = await investall();
if (response && response.data) {
// count
const totalCount = response.data.reduce((sum, item) => sum + item.count, 0);
this.allnumber = {
touzinumber: totalCount
};
}
},
async getfuncdata() {
const response2 = await fungong();
if(response2 && response2.data){
const totalCount2 = response2.data.reduce(
(sum,item) => sum + item.count,0
);
this.functionnumber = {
functionnumber: totalCount2
}
}
}
},
created() {
this.getData();
this.getfuncdata();
}
};
</script>
@ -119,10 +147,12 @@ export default {
display: flex;
align-items: center;
}
.relaitem{
.relaitem {
position: relative;
}
.itemsall{
.itemsall {
position: absolute;
display: flex;
flex-direction: column;
@ -131,7 +161,8 @@ export default {
top: 5.5rem;
left: 7.2rem;
}
.itemsall span:nth-child(1){
.itemsall span:nth-child(1) {
font-family: DIN, DIN;
font-weight: 500;
font-size: 1.75rem;
@ -141,7 +172,8 @@ export default {
font-style: normal;
text-transform: none;
}
.itemsall span:nth-child(2){
.itemsall span:nth-child(2) {
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 400;
font-size: 0.88rem;
@ -151,6 +183,7 @@ export default {
font-style: normal;
text-transform: none;
}
.itemhead span {
margin-left: 1rem;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
@ -162,7 +195,8 @@ export default {
font-style: normal;
text-transform: none;
}
.mainarea{
.mainarea {
padding: 0rem 0rem 0 1.4rem;
overflow: auto;
}
@ -186,7 +220,8 @@ export default {
grid-column: span 3;
/* 占三列 */
}
.mapareaone{
.mapareaone {
position: relative;
}
</style>

@ -3,7 +3,7 @@
<div class="grid-item item-1">
<!-- 整体项目情况 -->
<div class="allarea">
<AllArea />
<AllArea2 />
</div>
</div>
<div class="grid-item item-2">
@ -12,7 +12,7 @@
<span>消息通知</span>
</div>
<div class="mainarea">
<Message />
<Message2 />
</div>
</div>
<div class="grid-item item-1">
@ -54,19 +54,19 @@
</template>
<script>
import AllArea from '@/views/components/analysis/all.vue'
import AllArea2 from '@/views/components/analysis/allcompany.vue'
import FunctionArea from '@/views/components/analysis/function.vue'
import InvestArea from '@/views/components/analysis/invest.vue'
import Message from '@/views/components/analysis/message.vue'
import Message2 from '@/views/components/analysis/messagecompany.vue'
import daiban from '@/views/components/analysis/daiban.vue'
export default {
name: "Pc2FbEcharts",
components: {
AllArea,
AllArea2,
FunctionArea,
InvestArea,
Message,
Message2,
daiban
},
data() {

@ -31,13 +31,13 @@ module.exports = {
// webpack-dev-server 相关配置
devServer: {
host: '0.0.0.0',
public:'192.168.0.119',
// public:'192.168.0.119',
port: port,
open: true,
proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: {
target: `192.168.0.111:7071`,
target: `http://192.168.0.125:7071/`,
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: ''

Loading…
Cancel
Save