项洋 1 month ago
commit 8c160c3816

@ -5,6 +5,9 @@ VUE_APP_TITLE = 苏州工业园区工业上楼管理系统
ENV = 'production' ENV = 'production'
# 苏州工业园区工业上楼管理系统/生产环境 # 苏州工业园区工业上楼管理系统/生产环境
# VUE_APP_BASE_API = '' # 个人环境
VUE_APP_BASE_API = 'http://39.101.188.84:7071' VUE_APP_BASE_API = ''
# VUE_APP_BASE_API = '/api' # 测试环境
# VUE_APP_BASE_API = 'http://39.101.188.84:7071'
# 正式环境
# VUE_APP_BASE_API = 'https://gysl.sipac.gov.cn/api'

@ -43,7 +43,7 @@
"autofit.js": "^3.2.2", "autofit.js": "^3.2.2",
"axios": "0.28.1", "axios": "0.28.1",
"clipboard": "2.0.8", "clipboard": "2.0.8",
"core-js": "3.37.1", "core-js": "^3.42.0",
"docx-preview": "^0.3.5", "docx-preview": "^0.3.5",
"echarts": "^5.4.0", "echarts": "^5.4.0",
"element-ui": "^2.15.13", "element-ui": "^2.15.13",
@ -57,10 +57,12 @@
"mars2d": "^3.3.1", "mars2d": "^3.3.1",
"mars2d-esri": "^3.3.1", "mars2d-esri": "^3.3.1",
"moment": "^2.30.1", "moment": "^2.30.1",
"node-forge": "^1.3.1",
"nprogress": "0.2.0", "nprogress": "0.2.0",
"quill": "2.0.2", "quill": "2.0.2",
"regenerator-runtime": "^0.14.1",
"screenfull": "5.0.2", "screenfull": "5.0.2",
"sortablejs": "1.10.2", "sortablejs": "^1.10.2",
"splitpanes": "2.4.1", "splitpanes": "2.4.1",
"vue": "2.6.12", "vue": "2.6.12",
"vue-count-to": "1.0.13", "vue-count-to": "1.0.13",

@ -714,6 +714,14 @@ export function xmlist(){
//政务统计结束 //政务统计结束
//企业统计 //企业统计
//储备项目统计分析
export function getAllProjects() {
return request({
url: '/gysl/zwStats/cbxmtj',
method: 'get'
})
}
//整体项目情况 //整体项目情况
export function allinformationtwo(){ export function allinformationtwo(){
return request({ return request({

@ -37,6 +37,14 @@ export function deletespan(idList) {
}); });
} }
//月度信息新增
export function addmonth(data) {
return request({
url: "/gysl/projectProgress/add",
method: "post",
data,
})
}
// 月度进展信息修改 // 月度进展信息修改
export function updateProjectProgress(data) { export function updateProjectProgress(data) {

@ -8,7 +8,7 @@
</div> </div>
<div class="right-menu"> <div class="right-menu">
<!-- <bearicon /> --> <!-- <bearicon /> -->
<div class="avatar-container right-menu-item hover-effect" > <div class="avatar-container right-menu-item hover-effect" style="display: flex;">
<div class="avatar-wrapper"> <div class="avatar-wrapper">
<div v-if="checkRole(['common'])"> <div v-if="checkRole(['common'])">
<span>{{ name }}</span> <span>{{ name }}</span>
@ -18,8 +18,29 @@
</div> </div>
<img src="@/assets/images/退出登录.png" alt="" @click="logout"> <img src="@/assets/images/退出登录.png" alt="" @click="logout">
</div> </div>
<router-link to="/user/profile" style="margin-left: 10px;margin-top: 1px;" v-if="checkRole(['admin'])">
<i class="el-icon-user-solid"></i>
</router-link>
</div> </div>
<!-- <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
<div class="avatar-wrapper">
<img :src="avatar" class="user-avatar">
<i class="el-icon-caret-bottom" />
</div>
<el-dropdown-menu slot="dropdown">
<router-link to="/user/profile">
<el-dropdown-item>个人中心</el-dropdown-item>
</router-link>
<el-dropdown-item @click.native="setting = true">
<span>布局设置</span>
</el-dropdown-item>
<el-dropdown-item divided @click.native="logout">
<span>退出登录</span>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown> -->
</div> </div>
</div> </div>
</template> </template>
@ -78,7 +99,7 @@ export default {
this.$store.dispatch('LogOut').then(() => { this.$store.dispatch('LogOut').then(() => {
this.$router.replace('/login') this.$router.replace('/login')
}) })
}).catch(() => {}) }).catch(() => { })
}, },
handleCommand(command) { handleCommand(command) {
this.$message('点击了: ' + command) this.$message('点击了: ' + command)
@ -110,7 +131,7 @@ export default {
.logoimg span { .logoimg span {
width: auto; width: auto;
height: 2.06rem; height: 2.06rem;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi; font-family: AlibabaPuHuiTi;
font-weight: 500; font-weight: 500;
font-size: 1.5rem; font-size: 1.5rem;
color: #292C33; color: #292C33;
@ -118,7 +139,6 @@ export default {
text-align: left; text-align: left;
font-style: normal; font-style: normal;
text-transform: none; text-transform: none;
} }
.navbarleft { .navbarleft {
@ -189,17 +209,20 @@ export default {
position: relative; position: relative;
display: flex; display: flex;
align-items: center; align-items: center;
.user-avatar { .user-avatar {
width: 40px; width: 40px;
height: 40px; height: 40px;
border-radius: 10px; border-radius: 10px;
} }
img{
img {
width: 1rem; width: 1rem;
height: 1rem; height: 1rem;
margin-left: 1rem; margin-left: 1rem;
cursor: pointer; cursor: pointer;
} }
.el-icon-caret-bottom { .el-icon-caret-bottom {
position: absolute; position: absolute;
right: -20px; right: -20px;

@ -24,8 +24,8 @@
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button> <el-button type="primary" icon="el-icon-search" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button> <el-button icon="el-icon-refresh" @click="resetQuery"></el-button>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>

@ -388,12 +388,12 @@ export default {
this.reset(); this.reset();
const catalogId = row.id; const catalogId = row.id;
this.form = { ...row }; this.form = { ...row };
this.setProtocolType(this.form.wz); // this.setProtocolType(this.form.wz);
this.$nextTick(() => { this.$nextTick(() => {
this.handleTypeChange(); // DOM this.handleTypeChange(); // DOM
}); });
this.open = true; this.open = true;
this.title = "修改项目知识库"; this.title = "编辑项目知识库";
}, },
/** 提交按钮 */ /** 提交按钮 */
submitForm: function () { submitForm: function () {
@ -404,9 +404,7 @@ export default {
this.$modal.msgSuccess("修改成功"); this.$modal.msgSuccess("修改成功");
this.open = false; this.open = false;
this.getList(); this.getList();
}).catch(error => { }).catch();
console.error('API Request Error:', error);
});
} else { } else {
addXmzsk(this.form).then(response => { addXmzsk(this.form).then(response => {
this.$modal.msgSuccess("新增成功"); this.$modal.msgSuccess("新增成功");

@ -30,7 +30,7 @@
<div class="descriptionsdiv"> <div class="descriptionsdiv">
<el-descriptions class="margin-top" :column="3" border> <el-descriptions class="margin-top" :column="3" border>
<el-descriptions-item v-for="(item, index) in descriptions" :key="index" <el-descriptions-item v-for="(item, index) in descriptions" :key="index"
:span="item.label === '项目法人单位简介' || item.label === '计划投资额' ? 3 : 1"> :span="item.label === '项目法人单位简介' || item.label === '所属细分产业' ? 3 : 1">
<template slot="label"> <template slot="label">
{{ item.label }} {{ item.label }}
</template> </template>
@ -186,6 +186,24 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row>
<el-col :span="12">
<el-form-item label="所属产业目录" prop="ml">
<el-select v-model="form.ml" placeholder="请选择产业目录" value-key="value" style="width: 100%;">
<el-option v-for="dict in dict.type.shangloumulu" :key="dict.value" :label="dict.label"
:value="parseInt(dict.value)" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属细分产业" prop="xfcy">
<el-select v-model="form.xfcy" placeholder="请选择所属细分产业" value-key="value" style="width: 100%;">
<el-option v-for="dict in dict.type.bqlx" :key="dict.value" :label="dict.label"
:value="parseInt(dict.value)" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row style="display: none;"> <el-row style="display: none;">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="经度" prop="longitude"> <el-form-item label="经度" prop="longitude">
@ -231,7 +249,7 @@ export default {
ImageUpload, luotu ImageUpload, luotu
}, },
dicts: [ dicts: [
'ssgnq', 'xmfrdwxz', 'xzfl', 'jsms' 'ssgnq', 'xmfrdwxz', 'xzfl', 'jsms','shangloumulu',"bqlxbqlx",'bqlx'
], ],
props: { props: {
size: { size: {
@ -359,6 +377,18 @@ export default {
1: '已建', 1: '已建',
2: '在建', 2: '在建',
3: '拟建', 3: '拟建',
},
mlMap:{
1:'重点鼓励上楼',
2:'有条件上楼',
},
xfMap:{
1:'新一代信息技术',
2:'高端装备制造',
3:'生物医药及大健康',
4:'纳米技术应用及新材料',
5:'人工智能及数字产业',
6:'新能源及绿色产业',
} }
}; };
}, },
@ -418,6 +448,8 @@ export default {
{ label: '建设进度', value: data.jsjd }, { label: '建设进度', value: data.jsjd },
{ label: '统一社会信用代码', value: data.tyshxydm }, { label: '统一社会信用代码', value: data.tyshxydm },
{ label: '计划投资额', value: data.jhtze }, { label: '计划投资额', value: data.jhtze },
{ label: '所属产业目录', value: this.mlMap[data.ml] || '' },
{ label: '所属细分产业', value: this.xfMap[data.xfcy] || '' },
{ label: '项目法人单位简介', value: data.unitIntroduction }, { label: '项目法人单位简介', value: data.unitIntroduction },
{ label: '项目简介', value: data.introduction } { label: '项目简介', value: data.introduction }
]; ];

@ -119,8 +119,8 @@
</el-descriptions> </el-descriptions>
</div> </div>
</div> </div>
<!-- 新增楼栋弹窗 --> <!-- 新增编辑楼栋弹窗 -->
<el-dialog title="新增楼栋" :visible.sync="dialogVisible" width="68%"> <el-dialog :title="buildingForm.id ? '编辑楼栋' : '新增楼栋'" :visible.sync="dialogVisible" width="68%">
<el-form :model="buildingForm" :rules="rules" ref="buildingFormRef" label-width="260px"> <el-form :model="buildingForm" :rules="rules" ref="buildingFormRef" label-width="260px">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">

@ -101,7 +101,7 @@
<template slot-scope="scope"> <template slot-scope="scope">
<el-date-picker v-if="scope.row.isEditing" v-model="scope.row.clrq" type="datetime" <el-date-picker v-if="scope.row.isEditing" v-model="scope.row.clrq" type="datetime"
value-format="yyyy-MM-dd HH:mm:ss" style="width: 100%;"></el-date-picker> value-format="yyyy-MM-dd HH:mm:ss" style="width: 100%;"></el-date-picker>
<span v-else>{{ new Date(scope.row.clrq).toLocaleDateString('en-CA') }}</span> <span v-else>{{ scope.row.clrq ? new Date(scope.row.clrq).toLocaleDateString('en-CA') : '' }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="zczb" label='注册资本'> <el-table-column prop="zczb" label='注册资本'>
@ -145,9 +145,9 @@
<el-button v-if="scope.row.isEditing" size="medium" type="text" icon="el-icon-check" <el-button v-if="scope.row.isEditing" size="medium" type="text" icon="el-icon-check"
@click="saveRow(scope.row)">保存</el-button> @click="saveRow(scope.row)">保存</el-button>
<el-button v-else size="medium" type="text" icon="el-icon-edit" <el-button v-else size="medium" type="text" icon="el-icon-edit"
@click="editRow(scope.row)">编辑</el-button> @click="editRow(scope.row)"></el-button>
<el-button size="medium" type="text" icon="el-icon-delete" style="color: #F25353;" <el-button size="medium" type="text" icon="el-icon-delete" style="color: #F25353;"
@click="deleteRow(scope.$index)">删除</el-button> @click="deleteRow(scope.$index)"></el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>

@ -7,11 +7,17 @@
<span>月度进展信息</span> <span>月度进展信息</span>
</div> </div>
<div class="topright" v-if="action === 'fill' || !action || action === 'okay'"> <div class="topright" v-if="action === 'fill' || !action || action === 'okay'">
<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="handleExport"> style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;" @click="handleExport">
<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;">
导出 导出
</el-button> -->
<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="新增"
style="width: 0.6rem; height: 0.6rem; margin-right: 4px;">
新增
</el-button> </el-button>
</div> </div>
</div> </div>
@ -71,14 +77,60 @@
</div> </div>
</div> </div>
</div> </div>
<!-- 弹窗 -->
<el-dialog title="新增月度进展" :visible.sync="dialogVisible" width="50%">
<el-form :model="form" :rules="rules" label-width="160px" ref="formRef">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="进度月份" prop="month">
<el-date-picker v-model="form.month" type="month" placeholder="选择月份" value-format="yyyy-MM"
style="width: 100%;"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="状态" prop="status" style="display: none;">
<el-select v-model="form.status" placeholder="请选择状态" style="width: 100%;">
<el-option label="未更新" value="未更新"></el-option>
<el-option label="已更新" value="已更新"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="当月完成投资" prop="monthDoneAmount">
<el-input v-model.number="form.monthDoneAmount" placeholder="请输入金额"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="累计完成投资" prop="totalDoneAmount">
<el-input v-model.number="form.totalDoneAmount" placeholder="请输入金额"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="累计建成面积(㎡)" prop="cumulativeArea">
<el-input v-model="form.cumulativeArea" placeholder="请输入面积"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="项目进展详情" prop="xmjzxq">
<el-input v-model="form.xmjzxq" type="textarea" :rows="3" placeholder="请输入详情"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="submitForm"> </el-button>
</span>
</el-dialog>
</div> </div>
</template> </template>
<script> <script>
// //
// import { getMonthInformationPage } from "@/api/ManageApi/index"; import { getMonthInformationPage } from "@/api/ManageApi/index";
//Apitwo //Apitwo
import { updateProjectProgress, deletemonth } from "@/api/manageApitwo/index"; import { updateProjectProgress, deletemonth, addmonth } from "@/api/manageApitwo/index";
import { checkPermi, checkRole } from "@/utils/permission"; import { checkPermi, checkRole } from "@/utils/permission";
export default { export default {
@ -98,11 +150,71 @@ export default {
current: 1, current: 1,
size: 10, size: 10,
total: 0, total: 0,
dialogVisible: false, //
form: {
month: '', //
status: '未更新', //
monthDoneAmount: 0, //
totalDoneAmount: 0, //
cumulativeArea: '', //
xmjzxq: '' //
},
rules: {
month: [
{ required: true, message: '请选择月份', trigger: 'change' }
],
monthDoneAmount: [
{ required: true, message: '请输入当月完成投资', trigger: 'blur' }
],
totalDoneAmount: [
{ required: true, message: '请输入累计完成投资', trigger: 'blur' }
]
}
}; };
}, },
methods: { methods: {
checkPermi, checkPermi,
checkRole, checkRole,
handleAdd() {
this.form = {
month: '',
status: '未更新',
monthDoneAmount: 0,
totalDoneAmount: 0,
cumulativeArea: '',
xmjzxq: ''
};
this.dialogVisible = true;
},
submitForm() {
this.$refs.formRef.validate(valid => {
if (valid) {
const payload = {
...this.form,
xmId: this.xmId,
status: this.form.status
};
addmonth(payload)
.then(response => {
if (response.code === 200) {
this.$message.success('新增成功');
this.dialogVisible = false;
this.getMonthInformationPage();
} else {
this.$message.error(response.msg || '新增失败');
}
})
.catch(error => {
console.error('新增失败:', error);
this.$message.error('新增失败,请稍后再试');
});
} else {
this.$message.error('请填写必填项');
return false;
}
});
},
/** 导出 */ /** 导出 */
handleExport() { handleExport() {
this.download( this.download(
@ -204,26 +316,26 @@ export default {
}); });
}); });
}, },
// async getMonthInformationPage() { async getMonthInformationPage() {
// try { try {
// const response = await getMonthInformationPage({ xmId: this.xmId }); const response = await getMonthInformationPage({ xmId: this.xmId });
// if (Array.isArray(response.data.records) && response.data.records.length > 0) { if (Array.isArray(response.data.records) && response.data.records.length > 0) {
// this.tableData = response.data.records; this.tableData = response.data.records;
// this.total = response.data.total || 0; this.total = response.data.total || 0;
// } else { } else {
// // //
// this.tableData = []; this.tableData = [];
// this.total = 0; this.total = 0;
// } }
// } catch (error) { } catch (error) {
// console.error(":", error); console.error("获取月度进展信息失败:", error);
// this.$message.error(""); this.$message.error("获取月度进展信息失败");
// } }
// }, },
}, },
created() { created() {
// this.getMonthInformationPage(); this.getMonthInformationPage();
}, },
}; };
</script> </script>

@ -49,7 +49,7 @@
<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-date-picker v-model="form.year" type="year" value-format="yyyy" placeholder="选择年度"
@change="handleYearChange" /> @change="handleYearChange" style="width: 100%;" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -69,7 +69,7 @@
</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.sj" type="date" value-format="yyyy-MM-dd" placeholder="选择日期"> <el-date-picker v-model="form.sj" type="date" value-format="yyyy-MM-dd" placeholder="选择日期" style="width: 100%;">
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -497,6 +497,7 @@ export default {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
gap: 0.5rem; gap: 0.5rem;
padding: .5rem 1rem;
} }
.image-box { .image-box {

@ -42,8 +42,6 @@
<div class="number">{{ projectData.allBuilding2 }}</div> <div class="number">{{ projectData.allBuilding2 }}</div>
</div> </div>
</div> </div>
</div>
<div class="mainarea" style="margin-top: 0rem;">
<div class="itemone"> <div class="itemone">
<img src="@/assets/images/icon-yjsl@2x.png" alt=""> <img src="@/assets/images/icon-yjsl@2x.png" alt="">
<div class="itemleft"> <div class="itemleft">
@ -51,6 +49,15 @@
<div class="number">{{ projectData.allBuilding3 }}</div> <div class="number">{{ projectData.allBuilding3 }}</div>
</div> </div>
</div> </div>
<el-tooltip class="item" effect="dark" content="更多信息" placement="top-start" style="cursor: pointer;">
<div @click="toggleSection('section1')">
<i v-if="showSection1" class="el-icon-caret-top"></i>
<i v-else class="el-icon-caret-bottom"></i>
</div>
</el-tooltip>
</div>
<div class="mainareatwo" style="margin-top: 0rem;" v-show="showSection1">
<div class="itemone"> <div class="itemone">
<img src="@/assets/images/icon-yjsl@2x.png" alt=""> <img src="@/assets/images/icon-yjsl@2x.png" alt="">
<div class="itemleft"> <div class="itemleft">
@ -72,6 +79,26 @@
<div class="number">{{ projectData.allInvest3 }}</div> <div class="number">{{ projectData.allInvest3 }}</div>
</div> </div>
</div> </div>
<div class="itemone" style="visibility: hidden;">
<img src="@/assets/images/icon-yjsl@2x.png" alt="">
<div class="itemleft">
<div class="lefttitle">占地面积</div>
<div class="number">{{ projectData.allInvest3 }}</div>
</div>
</div>
<div class="itemone" style="visibility: hidden;">
<img src="@/assets/images/icon-yjsl@2x.png" alt="">
<div class="itemleft">
<div class="lefttitle">占地面积</div>
<div class="number">{{ projectData.allInvest3 }}</div>
</div>
</div>
<el-tooltip class="item" effect="dark" content="更多信息" placement="top-start">
<div style="visibility: hidden;">
<i v-if="showSection1" class="el-icon-caret-top"></i>
<i v-else class="el-icon-caret-bottom"></i>
</div>
</el-tooltip>
</div> </div>
</div> </div>
<div> <div>
@ -105,8 +132,6 @@
<div class="number">{{ currentYearData.currentBuilding2 }}</div> <div class="number">{{ currentYearData.currentBuilding2 }}</div>
</div> </div>
</div> </div>
</div>
<div class="mainarea" style="margin-top: 0rem;">
<div class="itemone"> <div class="itemone">
<img src="@/assets/images/icon-yjsl@2x.png" alt=""> <img src="@/assets/images/icon-yjsl@2x.png" alt="">
<div class="itemleft"> <div class="itemleft">
@ -114,6 +139,15 @@
<div class="number">{{ currentYearData.currentBuilding3 }}</div> <div class="number">{{ currentYearData.currentBuilding3 }}</div>
</div> </div>
</div> </div>
<el-tooltip class="item" effect="dark" content="更多信息" placement="top-start" style="cursor: pointer;">
<div @click="toggleSection('section2')">
<i v-if="showSection2" class="el-icon-caret-top"></i>
<i v-else class="el-icon-caret-bottom"></i>
</div>
</el-tooltip>
</div>
<div class="mainareatwo" style="margin-top: 0rem;" v-show="showSection2">
<div class="itemone"> <div class="itemone">
<img src="@/assets/images/icon-yjsl@2x.png" alt=""> <img src="@/assets/images/icon-yjsl@2x.png" alt="">
<div class="itemleft"> <div class="itemleft">
@ -135,6 +169,24 @@
<div class="number">{{ currentYearData.currentAllInvest3 }}</div> <div class="number">{{ currentYearData.currentAllInvest3 }}</div>
</div> </div>
</div> </div>
<div class="itemone" style="visibility: hidden;">
<img src="@/assets/images/icon-yjsl@2x.png" alt="">
<div class="itemleft">
<div class="lefttitle">占地面积</div>
<div class="number">{{ projectData.allInvest3 }}</div>
</div>
</div>
<div class="itemone" style="visibility: hidden;">
<img src="@/assets/images/icon-yjsl@2x.png" alt="">
<div class="itemleft">
<div class="lefttitle">占地面积</div>
<div class="number">{{ projectData.allInvest3 }}</div>
</div>
</div>
<div style="visibility: hidden;">
<i v-if="showSection1" class="el-icon-caret-top"></i>
<i v-else class="el-icon-caret-bottom"></i>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -146,6 +198,8 @@ import { allinformation } from '@/api/ManageApi';
export default { export default {
data() { data() {
return { return {
showSection1: false, //
showSection2: false, //
selectedYear: new Date().getFullYear().toString(), selectedYear: new Date().getFullYear().toString(),
projectData: { projectData: {
allProject: 0, // allProject: 0, //
@ -153,9 +207,9 @@ export default {
allBuilding1: 0, // allBuilding1: 0, //
allBuilding2: 0, // allBuilding2: 0, //
allBuilding3: 0, // allBuilding3: 0, //
allInvest1:0, // allInvest1: 0, //
allInvest2:0, // allInvest2: 0, //
allInvest3:0, // allInvest3: 0, //
}, },
currentYearData: { currentYearData: {
currentYearProject: 0, // currentYearProject: 0, //
@ -163,9 +217,9 @@ export default {
currentYearBuilding1: 0, // currentYearBuilding1: 0, //
currentBuilding2: 0, // currentBuilding2: 0, //
currentBuilding3: 0, currentBuilding3: 0,
currentAllInvest1:0, // currentAllInvest1: 0, //
currentAllInvest2:0, currentAllInvest2: 0,
currentAllInvest3:0 currentAllInvest3: 0
}, },
loading: false, loading: false,
error: null error: null
@ -175,6 +229,13 @@ export default {
this.fetchProjectData(); this.fetchProjectData();
}, },
methods: { methods: {
toggleSection(section) {
if (section === 'section1') {
this.showSection1 = !this.showSection1;
} else if (section === 'section2') {
this.showSection2 = !this.showSection2;
}
},
/** 导出按钮操作 */ /** 导出按钮操作 */
handleExport() { handleExport() {
this.download( this.download(
@ -215,7 +276,7 @@ export default {
currentYearProject: response.data.currentYearProject || 0, currentYearProject: response.data.currentYearProject || 0,
currentYearGrossArea: response.data.currentYearGrossArea || 0, currentYearGrossArea: response.data.currentYearGrossArea || 0,
currentYearBuilding1: response.data.currentYearBuilding1 || 0, currentYearBuilding1: response.data.currentYearBuilding1 || 0,
currentBuilding2: response.data.currentBuilding2 || 0 , currentBuilding2: response.data.currentBuilding2 || 0,
currentBuilding3: response.data.currentBuilding3 || 0, currentBuilding3: response.data.currentBuilding3 || 0,
currentAllInvest1: response.data.currentAllInvest1 || 0, currentAllInvest1: response.data.currentAllInvest1 || 0,
currentAllInvest2: response.data.currentAllInvest2 || 0, currentAllInvest2: response.data.currentAllInvest2 || 0,
@ -242,6 +303,7 @@ export default {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 1rem; gap: 1rem;
padding: .5rem 0;
} }
table { table {
@ -277,6 +339,7 @@ th {
font-family: aliregular; font-family: aliregular;
font-weight: 400; font-weight: 400;
font-size: 0.9rem; font-size: 0.9rem;
padding-left: .3rem;
color: #7B8599; color: #7B8599;
line-height: 1.19rem; line-height: 1.19rem;
text-align: left; text-align: left;
@ -306,6 +369,16 @@ th {
margin-top: 1rem; margin-top: 1rem;
} }
.mainareatwo {
padding: .5rem 0rem;
height: auto;
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 1rem;
}
.itemone { .itemone {
width: 12rem; width: 12rem;
height: 3rem; height: 3rem;

@ -3,8 +3,15 @@
<div> <div>
<div class="top"> <div class="top">
<div class="title">整体项目情况</div> <div class="title">整体项目情况</div>
<div class="importdiv"> <!-- <div class="importdiv">
</div> <el-date-picker v-model="selectedYear" type="year" placeholder="选择年份" format="yyyy"
value-format="yyyy" @change="handleYearChange">
</el-date-picker>
<el-button icon="el-icon-upload2" style="background-color: #2B62F1; color: #FFFFFF;"
@click="handleExport">
报告导出
</el-button>
</div> -->
</div> </div>
<div class="mainarea"> <div class="mainarea">
<div class="itemone"> <div class="itemone">
@ -42,6 +49,56 @@
<div class="number">{{ projectData.allBuilding3 }}</div> <div class="number">{{ projectData.allBuilding3 }}</div>
</div> </div>
</div> </div>
<el-tooltip class="item" effect="dark" content="更多信息" placement="top-start" style="cursor: pointer;">
<div @click="toggleSection('section1')">
<i v-if="showSection1" class="el-icon-caret-top"></i>
<i v-else class="el-icon-caret-bottom"></i>
</div>
</el-tooltip>
</div>
<div class="mainareatwo" style="margin-top: 0rem;" v-show="showSection1">
<div class="itemone">
<img src="@/assets/images/icon-yjsl@2x.png" alt="">
<div class="itemleft">
<div class="lefttitle">总投资额</div>
<div class="number">{{ projectData.allInvest1 }}</div>
</div>
</div>
<div class="itemone">
<img src="@/assets/images/icon-yjsl@2x.png" alt="">
<div class="itemleft">
<div class="lefttitle">计划投资额</div>
<div class="number">{{ projectData.allInvest2 }}</div>
</div>
</div>
<div class="itemone">
<img src="@/assets/images/icon-yjsl@2x.png" alt="">
<div class="itemleft">
<div class="lefttitle">占地面积</div>
<div class="number">{{ projectData.allInvest3 }}</div>
</div>
</div>
<div class="itemone" style="visibility: hidden;">
<img src="@/assets/images/icon-yjsl@2x.png" alt="">
<div class="itemleft">
<div class="lefttitle">占地面积</div>
<div class="number">{{ projectData.allInvest3 }}</div>
</div>
</div>
<div class="itemone" style="visibility: hidden;">
<img src="@/assets/images/icon-yjsl@2x.png" alt="">
<div class="itemleft">
<div class="lefttitle">占地面积</div>
<div class="number">{{ projectData.allInvest3 }}</div>
</div>
</div>
<el-tooltip class="item" effect="dark" content="更多信息" placement="top-start">
<div style="visibility: hidden;">
<i v-if="showSection1" class="el-icon-caret-top"></i>
<i v-else class="el-icon-caret-bottom"></i>
</div>
</el-tooltip>
</div> </div>
</div> </div>
<div> <div>
@ -82,6 +139,54 @@
<div class="number">{{ currentYearData.currentBuilding3 }}</div> <div class="number">{{ currentYearData.currentBuilding3 }}</div>
</div> </div>
</div> </div>
<el-tooltip class="item" effect="dark" content="更多信息" placement="top-start" style="cursor: pointer;">
<div @click="toggleSection('section2')">
<i v-if="showSection2" class="el-icon-caret-top"></i>
<i v-else class="el-icon-caret-bottom"></i>
</div>
</el-tooltip>
</div>
<div class="mainareatwo" style="margin-top: 0rem;" v-show="showSection2">
<div class="itemone">
<img src="@/assets/images/icon-yjsl@2x.png" alt="">
<div class="itemleft">
<div class="lefttitle">总投资额</div>
<div class="number">{{ currentYearData.currentAllInvest1 }}</div>
</div>
</div>
<div class="itemone">
<img src="@/assets/images/icon-yjsl@2x.png" alt="">
<div class="itemleft">
<div class="lefttitle">计划投资额</div>
<div class="number">{{ currentYearData.currentAllInvest2 }}</div>
</div>
</div>
<div class="itemone">
<img src="@/assets/images/icon-yjsl@2x.png" alt="">
<div class="itemleft">
<div class="lefttitle">占地面积</div>
<div class="number">{{ currentYearData.currentAllInvest3 }}</div>
</div>
</div>
<div class="itemone" style="visibility: hidden;">
<img src="@/assets/images/icon-yjsl@2x.png" alt="">
<div class="itemleft">
<div class="lefttitle">占地面积</div>
<div class="number">{{ projectData.allInvest3 }}</div>
</div>
</div>
<div class="itemone" style="visibility: hidden;">
<img src="@/assets/images/icon-yjsl@2x.png" alt="">
<div class="itemleft">
<div class="lefttitle">占地面积</div>
<div class="number">{{ projectData.allInvest3 }}</div>
</div>
</div>
<div style="visibility: hidden;">
<i v-if="showSection1" class="el-icon-caret-top"></i>
<i v-else class="el-icon-caret-bottom"></i>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -93,20 +198,28 @@ import { allinformationtwo } from '@/api/ManageApi';
export default { export default {
data() { data() {
return { return {
showSection1: false, //
showSection2: false, //
selectedYear: new Date().getFullYear().toString(), selectedYear: new Date().getFullYear().toString(),
projectData: { projectData: {
allProject: 0, // allProject: 0, //
allGrossArea: 0, // allGrossArea: 0, //
allBuilding1: 0, // allBuilding1: 0, //
allBuilding2: 0, // allBuilding2: 0, //
allBuilding3: 0 // allBuilding3: 0, //
allInvest1: 0, //
allInvest2: 0, //
allInvest3: 0, //
}, },
currentYearData: { currentYearData: {
currentYearProject: 0, // currentYearProject: 0, //
currentYearGrossArea: 0, // currentYearGrossArea: 0, //
currentYearBuilding1: 0, // currentYearBuilding1: 0, //
currentBuilding2: 0 , // currentBuilding2: 0, //
currentBuilding3: 0 // currentBuilding3: 0,
currentAllInvest1: 0, //
currentAllInvest2: 0,
currentAllInvest3: 0
}, },
loading: false, loading: false,
error: null error: null
@ -116,6 +229,13 @@ export default {
this.fetchProjectData(); this.fetchProjectData();
}, },
methods: { methods: {
toggleSection(section) {
if (section === 'section1') {
this.showSection1 = !this.showSection1;
} else if (section === 'section2') {
this.showSection2 = !this.showSection2;
}
},
/** 导出按钮操作 */ /** 导出按钮操作 */
handleExport() { handleExport() {
this.download( this.download(
@ -126,12 +246,11 @@ export default {
`项目整体情况${this.selectedYear}.docx` `项目整体情况${this.selectedYear}.docx`
); );
}, },
// Handle year change
handleYearChange(year) { handleYearChange(year) {
if (year) { if (year) {
this.selectedYear = year; this.selectedYear = year;
this.fetchProjectData(); this.fetchProjectData();
this.$emit('year-change', this.selectedYear); //
} }
}, },
@ -141,14 +260,17 @@ export default {
// API years // API years
const response = await allinformationtwo({ const response = await allinformationtwo({
years: this.selectedYear, years: this.selectedYear,
_t: Date.now() // // _t: Date.now()
}); });
this.projectData = { this.projectData = {
allProject: response.data.allProject || 0, allProject: response.data.allProject || 0,
allGrossArea: response.data.allGrossArea || 0, allGrossArea: response.data.allGrossArea || 0,
allBuilding1: response.data.allBuilding1 || 0, allBuilding1: response.data.allBuilding1 || 0,
allBuilding2: response.data.allBuilding2 || 0, allBuilding2: response.data.allBuilding2 || 0,
allBuilding3: response.data.allBuilding3 || 0 allBuilding3: response.data.allBuilding3 || 0,
allInvest1: response.data.allInvest1 || 0,
allInvest2: response.data.allInvest2 || 0,
allInvest3: response.data.allInvest3 || 0,
}; };
this.currentYearData = { this.currentYearData = {
currentYearProject: response.data.currentYearProject || 0, currentYearProject: response.data.currentYearProject || 0,
@ -156,6 +278,9 @@ export default {
currentYearBuilding1: response.data.currentYearBuilding1 || 0, currentYearBuilding1: response.data.currentYearBuilding1 || 0,
currentBuilding2: response.data.currentBuilding2 || 0, currentBuilding2: response.data.currentBuilding2 || 0,
currentBuilding3: response.data.currentBuilding3 || 0, currentBuilding3: response.data.currentBuilding3 || 0,
currentAllInvest1: response.data.currentAllInvest1 || 0,
currentAllInvest2: response.data.currentAllInvest2 || 0,
currentAllInvest3: response.data.currentAllInvest3 || 0
}; };
} catch (error) { } catch (error) {
console.error("获取数据失败:", error); console.error("获取数据失败:", error);
@ -174,11 +299,11 @@ export default {
gap: .5rem; gap: .5rem;
} }
/* Your existing styles remain unchanged */
.container { .container {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 2rem; gap: 1rem;
padding: .5rem 0;
} }
table { table {
@ -213,7 +338,7 @@ th {
.lefttitle { .lefttitle {
font-family: aliregular; font-family: aliregular;
font-weight: 400; font-weight: 400;
font-size: 0.88rem; font-size: 0.9rem;
color: #7B8599; color: #7B8599;
line-height: 1.19rem; line-height: 1.19rem;
text-align: left; text-align: left;
@ -234,7 +359,17 @@ th {
} }
.mainarea { .mainarea {
padding: .5rem; padding: .5rem 0rem;
height: auto;
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 1rem;
}
.mainareatwo {
padding: .5rem 0rem;
height: auto; height: auto;
width: 100%; width: 100%;
display: flex; display: flex;
@ -248,7 +383,6 @@ th {
height: 3rem; height: 3rem;
/* background-color: lightblue; */ /* background-color: lightblue; */
display: flex; display: flex;
gap: .3rem;
} }
.itemleft { .itemleft {

@ -67,7 +67,7 @@ export default {
<style scoped> <style scoped>
.progress-container { .progress-container {
width: 100%; width: 100%;
height: 9rem; height: 100%;
padding: 0 3rem 0 0; padding: 0 3rem 0 0;
overflow: auto; overflow: auto;
font-family: aliregular; font-family: aliregular;

@ -0,0 +1,93 @@
<template>
<div class="container">
<div id="pieChart" style="width: 700px; height: 200px;"></div>
</div>
</template>
<script>
import * as echarts from 'echarts';
import { getAllProjects } from '@/api/ManageApi/index';
export default {
name: 'ChubeiXm',
mounted() {
this.initPieChart();
},
methods: {
async initPieChart() {
try {
const res = await getAllProjects();
if (res.code === 200) {
const chartData = this.formatData(res.data);
this.renderChart(chartData);
}
} catch (error) {
console.error('获取数据失败:', error);
}
},
formatData(rawData) {
const mapping = {
'1': '新供地实施',
'2': '存量产业用地改扩建'
};
return rawData.map(item => ({
name: mapping[item.ssgnq] || '未知类型',
value: item.count
}));
},
renderChart(data) {
const chartDom = document.getElementById('pieChart');
const myChart = echarts.init(chartDom);
const option = {
tooltip: {
trigger: 'item',
formatter: '{b}: {d}%'
},
legend: {
orient: 'horizontal',
bottom: '0%',
itemGap: 30
},
series: [
{
name: '储备项目统计',
type: 'pie',
radius: '50%',
data: data,
color: ['#409EFF', '#36CBCB'],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
},
label: {
show: true,
formatter: '{b}: {d}%'
}
}
}
]
};
myChart.setOption(option);
}
}
};
</script>
<style scoped>
.container {
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
padding-bottom: 2%;
}
/* #pieChart {
margin: 20px auto;
} */
</style>

@ -39,7 +39,7 @@
</div> </div>
<!-- 悬浮窗 --> <!-- 悬浮窗 -->
<div class="app-container" v-show="dialogVisible" v-click-outside="closeDialog"> <div class="app-container" v-show="dialogVisible">
<div class="close-btn" @click="closeDialog"> <div class="close-btn" @click="closeDialog">
<i class="el-icon-close"></i> <i class="el-icon-close"></i>
</div> </div>

@ -0,0 +1,122 @@
<template>
<div class="year-progress-container">
<div class="top">
<span>时间截止至2025年2月</span>
</div>
<!-- 循环渲染 4 年的数据 -->
<div class="year-progress" v-for="item in progressData" :key="item.year">
<div class="header">
<span>{{ item.year }}</span>
<span>已完成 {{ item.completed }} / 目标 {{ item.target }} / 未完成 {{ item.remaining }}</span>
</div>
<div class="progress-bar">
<!-- 已完成 -->
<div class="completed" :style="{ width: completedWidth(item) }"></div>
<!-- 未完成 -->
<div class="remaining" :style="{ width: remainingWidth(item) }"></div>
<!-- 缓冲区只有当 completed <= target 时才显示 -->
<div class="buffer" :style="{
width: shouldShowBuffer(item) ? bufferWidth(item) : '0%',
transition: 'width 0.3s ease'
}"></div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'YearProgress',
data() {
const currentYear = new Date().getFullYear();
return {
//
progressData: [
{ year: currentYear, completed: 950, target: 900, remaining: 50 },
{ year: currentYear - 1, completed: 800, target: 800, remaining: 0 },
{ year: currentYear - 2, completed: 750, target: 700, remaining: 0 },
{ year: currentYear - 3, completed: 500, target: 600, remaining: 100 },
],
bufferZone: 50
};
},
methods: {
shouldShowBuffer(item) {
return item.completed <= item.target;
},
// +
completedWidth(item) {
const max = item.target + this.bufferZone;
const value = Math.min(item.completed, max);
return `${(value / max) * 100}%`;
},
//
bufferWidth(item) {
const max = item.target + this.bufferZone;
return `${(this.bufferZone / max) * 100}%`;
},
//
remainingWidth(item) {
const max = item.target + this.bufferZone;
const remaining = Math.max(0, max - item.completed);
return `${(remaining / max) * 100}%`;
}
}
};
</script>
<style scoped>
.year-progress-container {
padding: 0rem 1rem 1rem 1rem;
height: 100%;
overflow: auto;
}
.top{
width: 100%;
display: flex;
margin-bottom: 10px;
font-size: 0.88rem;
color: gray;
justify-content: flex-end;
}
.year-progress {
margin-bottom: 1.5rem;
}
.header {
display: flex;
justify-content: space-between;
font-size: 0.875rem;
color: #666;
}
.progress-bar {
height: 1rem;
border-radius: 0.5rem;
background-color: #e0e0e0;
overflow: hidden;
display: flex;
}
.completed {
background-color: #409EFF;
/* 蓝色 - 已完成 */
height: 100%;
}
.buffer {
background-color: #f0f0f0;
/* 浅灰 - 缓冲区 */
height: 100%;
}
.remaining {
background-color: #87CEFA;
/* 淡蓝色 - 未完成 */
height: 100%;
}
</style>

@ -152,7 +152,7 @@ export default {
const postId = row.id || this.ids; // 使 id const postId = row.id || this.ids; // 使 id
this.form = { ...row }; this.form = { ...row };
this.open = true; this.open = true;
this.title = '修改规则'; this.title = '编辑规则';
}, },
// //
cancel() { cancel() {

@ -389,7 +389,7 @@ export default {
this.isView = true; this.isView = true;
this.dialogVisible = true; this.dialogVisible = true;
this.dialogTitle = "查看智能提醒规则"; this.dialogTitle = "查看流程提醒规则";
// //
this.$nextTick(() => { this.$nextTick(() => {
this.$refs.ruleForm.clearValidate(); this.$refs.ruleForm.clearValidate();
@ -401,7 +401,7 @@ export default {
handleAdd() { handleAdd() {
this.isView = false; this.isView = false;
this.dialogVisible = true; this.dialogVisible = true;
this.dialogTitle = "新增智能提醒规则"; this.dialogTitle = "新增流程提醒规则";
this.isReminder = 1; // this.isReminder = 1; //
// //
@ -428,7 +428,7 @@ export default {
}, },
handleEdit(row) { handleEdit(row) {
this.dialogVisible = true; this.dialogVisible = true;
this.dialogTitle = "修改智能提醒规则"; this.dialogTitle = "编辑流程提醒规则";
this.isView = false; this.isView = false;
this.ruleForm = { this.ruleForm = {
@ -503,7 +503,7 @@ export default {
this.$refs[formName].validate((valid) => { this.$refs[formName].validate((valid) => {
if (valid) { if (valid) {
let param = {}; let param = {};
if (this.dialogTitle == "新增智能提醒规则") { if (this.dialogTitle == "新增流程提醒规则") {
param = { param = {
rulesName: this.ruleForm.rulesName, rulesName: this.ruleForm.rulesName,
alertRecipients: Number(this.ruleForm.alertRecipients), alertRecipients: Number(this.ruleForm.alertRecipients),
@ -520,7 +520,7 @@ export default {
this.initData(); this.initData();
} }
}); });
} else if (this.dialogTitle == "修改智能提醒规则") { } else if (this.dialogTitle == "修改流程提醒规则") {
param = { param = {
...this.editData, ...this.editData,
}; };

@ -46,7 +46,9 @@
style="width:100%;background: #2B62F1;" @click.native.prevent="handleEnterpriseLogin"> style="width:100%;background: #2B62F1;" @click.native.prevent="handleEnterpriseLogin">
<span>企业统一身份认证登录</span> <span>企业统一身份认证登录</span>
</el-button> </el-button>
</el-form-item> </el-form-item>
<div style="font-size: 0.88rem;color: #333;">主办单位苏州工业园区经济发展委员会</div>
</el-form> </el-form>
<!-- 底部 --> <!-- 底部 -->
<div class="el-login-footer"> <div class="el-login-footer">
@ -59,6 +61,7 @@
import { getCodeImg } from '@/api/login' import { getCodeImg } from '@/api/login'
import Cookies from 'js-cookie' import Cookies from 'js-cookie'
import { encrypt, decrypt } from '@/utils/jsencrypt' import { encrypt, decrypt } from '@/utils/jsencrypt'
import forge from 'node-forge'
export default { export default {
name: 'Login', name: 'Login',
@ -84,31 +87,33 @@ export default {
code: [{ required: true, trigger: 'change', message: '请输入验证码' }] code: [{ required: true, trigger: 'change', message: '请输入验证码' }]
}, },
loading: false, loading: false,
//
captchaEnabled: true, captchaEnabled: true,
//
register: false, register: false,
redirect: undefined redirect: undefined,
a1: `MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl8bS1kYTiMhIS5MZU253bc0ukaxrA1lfCziABFxQrC2c09tMrQGjuH6V1x2ofNBMGhOD9uWN/qkAQy/HwOe/NKUqCw6N0ov6guSrqMDW/BdZ3Bl0rmM1/95jTC1xffFFvej7xWNffIbaPI+bJ4WLX9NViNi9HmT0BRNzJ4d2R86LPPCa+bxLaPjsh2R2tBkbLkUot9769aJaPPiwPCZHMkuQenjHSmpWL0okleqMH8EGX7j6A5A/4IUXPMNKMMzkiSRpsIJ65GJmDAbnR3ZXRfC8MzVBBJB6zr5N0F4N9xZfF+JS/Yx726tCu+rA6GDCyTxtQ/wnKpPdwFP5nUWCWQIDAQAB`
} }
}, },
watch: { watch: {
$route(route) { $route: {
this.redirect = route.query && route.query.redirect handler: function (route) {
this.redirect = route.query && route.query.redirect;
},
immediate: true
}, },
activeName(newVal) { activeName(newVal) {
if (newVal === 'first') { if (newVal === 'first') {
this.loginForm.loginRole = 2; this.loginForm.loginRole = 2
} else if (newVal === 'second') { } else if (newVal === 'second') {
this.loginForm.loginRole = 1; this.loginForm.loginRole = 1
} }
} }
}, },
computed: { computed: {
showGovernmentLoginButton() { showGovernmentLoginButton() {
return this.activeName === 'second'; return this.activeName === 'second'
}, },
showEnterpriseLoginButton() { showEnterpriseLoginButton() {
return this.activeName === 'first'; return this.activeName === 'first'
} }
}, },
created() { created() {
@ -117,15 +122,13 @@ export default {
}, },
methods: { methods: {
getCode() { getCode() {
getCodeImg().then((res) => { getCodeImg().then(res => {
this.captchaEnabled = res.captchaEnabled === undefined ? true : res.captchaEnabled this.captchaEnabled = res.captchaEnabled === undefined ? true : res.captchaEnabled;
if (this.captchaEnabled) { if (this.captchaEnabled) {
this.codeUrl = `data:image/gif;base64,${res.img}` this.codeUrl = "data:image/gif;base64," + res.img;
this.loginForm.uuid = res.uuid this.loginForm.uuid = res.uuid;
} }
}).catch((error) => { });
console.error('获取验证码失败:', error)
})
}, },
getCookie() { getCookie() {
const username = Cookies.get('username') const username = Cookies.get('username')
@ -138,22 +141,44 @@ export default {
} }
}, },
handleLogin() { handleLogin() {
this.$refs.loginForm.validate((valid) => { this.$refs.loginForm.validate(valid => {
if (valid) { if (valid) {
this.loading = true; this.loading = true;
if (this.loginForm.rememberMe) { if (this.loginForm.rememberMe) {
Cookies.set('username', this.loginForm.username, { expires: 30 }); Cookies.set("username", this.loginForm.username, { expires: 30 });
Cookies.set('password', encrypt(this.loginForm.password), { expires: 30 }); Cookies.set("password", encrypt(this.loginForm.password), { expires: 30 });
Cookies.set('rememberMe', this.loginForm.rememberMe, { expires: 30 }); Cookies.set('rememberMe', this.loginForm.rememberMe, { expires: 30 });
} else { } else {
Cookies.remove('username'); Cookies.remove("username");
Cookies.remove('password'); Cookies.remove("password");
Cookies.remove('rememberMe'); Cookies.remove('rememberMe');
} }
// 2048 RSA
const lines = [];
lines.push('-----BEGIN PUBLIC KEY-----');
for (let i = 0; i < this.a1.length; i += 64) {
lines.push(this.a1.slice(i, i + 64));
}
lines.push('-----END PUBLIC KEY-----');
lines.join('\n')
const publicKey = forge.pki.publicKeyFromPem(lines.join('\n'));
//
var dataBytes = forge.util.encodeUtf8(this.loginForm.password);
//
var encryptedBytes = publicKey.encrypt(dataBytes, 'RSA-OAEP', {
md: forge.md.sha256.create(),
mgf1: {
md: forge.md.sha1.create()
}
});
// Base64
var encryptedBase64 = forge.util.encode64(encryptedBytes);
//
const loginData = { const loginData = {
username: this.loginForm.username, username: this.loginForm.username,
password: this.loginForm.password, password: encryptedBase64,
code: this.loginForm.code, code: this.loginForm.code,
uuid: this.loginForm.uuid, uuid: this.loginForm.uuid,
loginRole: this.activeName === 'first' ? 2 : 1 loginRole: this.activeName === 'first' ? 2 : 1
@ -170,15 +195,15 @@ export default {
} }
console.error('登录失败:', error); console.error('登录失败:', error);
}); });
} }
}); });
}, },
handleGovernmentLogin() { handleGovernmentLogin() {
// window.location.href = 'https://qyt.sipac.gov.cn/'
window.location.href = 'https://qyt.sipac.gov.cn/';
}, },
handleEnterpriseLogin() { handleEnterpriseLogin() {
// //
// window.location.href = 'https://example.com/enterprise-login'; // window.location.href = 'https://example.com/enterprise-login';
} }
} }
@ -314,7 +339,7 @@ export default {
bottom: 0; bottom: 0;
width: 100%; width: 100%;
text-align: center; text-align: center;
color: #fff; color: #333;
font-family: Arial; font-family: Arial;
font-size: 12px; font-size: 12px;
letter-spacing: 1px; letter-spacing: 1px;

@ -0,0 +1,335 @@
<template>
<div class="login">
<div class="loginleft">
</div>
<el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
<img src="@/assets/images/logo@2x.png" alt="">
<div class="title">苏州工业园区工业上楼管理系统</div>
<div class="logintabs">
<el-tabs v-model="activeName" :stretch="true" color="#216CDC">
<el-tab-pane label="企业用户登录" name="first"></el-tab-pane>
<el-tab-pane label="政务人员登录" name="second"></el-tab-pane>
</el-tabs>
</div>
<el-form-item prop="username" class="loginitem" style="margin-top: 1rem;">
<el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号">
<svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
</el-input>
</el-form-item>
<el-form-item prop="password" class="loginitem">
<el-input v-model="loginForm.password" type="password" auto-complete="off" placeholder="密码"
@keyup.enter.native="handleLogin">
<svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
</el-input>
</el-form-item>
<el-form-item prop="code" v-if="captchaEnabled" class="loginitem">
<el-input v-model="loginForm.code" auto-complete="off" placeholder="验证码" style="width: 63%"
@keyup.enter.native="handleLogin">
<svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
</el-input>
<div class="login-code">
<img :src="codeUrl" @click="getCode" class="login-code-img" style="width: 8.56rem;" />
</div>
</el-form-item>
<el-checkbox v-model="loginForm.rememberMe" style="margin:1rem 18.6rem 25px 0px;"></el-checkbox>
<el-form-item style="width:24rem;;margin-top: 1rem;">
<el-button :loading="loading" size="medium" type="primary" style="width:100%;background: #2B62F1;"
@click.native.prevent="handleLogin">
<span v-if="!loading"> </span>
<span v-else> ...</span>
</el-button>
<el-button v-if="showGovernmentLoginButton" size="medium" type="primary" class="tongyidenglu"
style="width:100%;background: #2B62F1;" @click.native.prevent="handleGovernmentLogin">
<span>政务统一身份认证登录</span>
</el-button>
<el-button v-if="showEnterpriseLoginButton" size="medium" type="primary" class="tongyidenglu"
style="width:100%;background: #2B62F1;" @click.native.prevent="handleEnterpriseLogin">
<span>企业统一身份认证登录</span>
</el-button>
</el-form-item>
<div style="font-size: 0.88rem;color: #333;">主办单位苏州工业园区经济发展委员会</div>
</el-form>
<!-- 底部 -->
<div class="el-login-footer">
<span></span>
</div>
</div>
</template>
<script>
import { getCodeImg } from '@/api/login'
import Cookies from 'js-cookie'
import { encrypt, decrypt } from '@/utils/jsencrypt'
export default {
name: 'Login',
data() {
return {
codeUrl: '',
activeName: 'second',
loginForm: {
username: '',
password: '',
rememberMe: false,
code: '',
uuid: '',
loginRole: 2
},
loginRules: {
username: [
{ required: true, trigger: 'blur', message: '请输入您的账号' }
],
password: [
{ required: true, trigger: 'blur', message: '请输入您的密码' }
],
code: [{ required: true, trigger: 'change', message: '请输入验证码' }]
},
loading: false,
//
captchaEnabled: true,
//
register: false,
redirect: undefined
}
},
watch: {
$route(route) {
this.redirect = route.query && route.query.redirect
},
activeName(newVal) {
if (newVal === 'first') {
this.loginForm.loginRole = 2;
} else if (newVal === 'second') {
this.loginForm.loginRole = 1;
}
}
},
computed: {
showGovernmentLoginButton() {
return this.activeName === 'second';
},
showEnterpriseLoginButton() {
return this.activeName === 'first';
}
},
created() {
this.getCode()
this.getCookie()
},
methods: {
getCode() {
getCodeImg().then((res) => {
this.captchaEnabled = res.captchaEnabled === undefined ? true : res.captchaEnabled
if (this.captchaEnabled) {
this.codeUrl = `data:image/gif;base64,${res.img}`
this.loginForm.uuid = res.uuid
}
}).catch((error) => {
console.error('获取验证码失败:', error)
})
},
getCookie() {
const username = Cookies.get('username')
const password = Cookies.get('password')
const rememberMe = Cookies.get('rememberMe')
this.loginForm = {
username: username === undefined ? this.loginForm.username : username,
password: password === undefined ? this.loginForm.password : decrypt(password),
rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
}
},
handleLogin() {
this.$refs.loginForm.validate((valid) => {
if (valid) {
this.loading = true;
if (this.loginForm.rememberMe) {
Cookies.set('username', this.loginForm.username, { expires: 30 });
Cookies.set('password', encrypt(this.loginForm.password), { expires: 30 });
Cookies.set('rememberMe', this.loginForm.rememberMe, { expires: 30 });
} else {
Cookies.remove('username');
Cookies.remove('password');
Cookies.remove('rememberMe');
}
const loginData = {
username: this.loginForm.username,
password: this.loginForm.password,
code: this.loginForm.code,
uuid: this.loginForm.uuid,
loginRole: this.activeName === 'first' ? 2 : 1
};
this.$store.dispatch('Login', loginData)
.then(() => {
this.$router.push({ path: this.redirect || '/' }).catch(() => { });
})
.catch((error) => {
this.loading = false;
if (this.captchaEnabled) {
this.getCode();
}
console.error('登录失败:', error);
});
}
});
},
handleGovernmentLogin() {
//
window.location.href = 'https://qyt.sipac.gov.cn/';
},
handleEnterpriseLogin() {
//
// window.location.href = 'https://example.com/enterprise-login';
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
::v-deep .el-tabs__active-bar {
width: 2rem !important;
margin-left: 3rem;
background-color: #216CDC;
height: 0.21rem;
border-radius: 0.16rem;
}
::v-deep .el-tabs__header {
border-bottom: none !important;
}
::v-deep .el-tabs__item {
font-size: 1rem;
padding: 0 20px;
color: #3D424C;
font-family: Alibaba PuHuiTi;
font-weight: 400;
color: #3D424C;
}
::v-deep .el-tabs__item.is-active {
color: #216CDC;
}
::v-deep .el-tabs__nav-wrap::after {
display: none !important;
}
.tongyidenglu {
margin-top: 1rem;
margin-left: 0rem;
}
.login {
display: flex;
justify-content: center;
align-items: center;
border-radius: 6px 0 0 6px;
height: 100%;
background-image: url('../assets/images/loginbackground.png');
background-size: cover;
}
.loginleft {
width: 35rem;
height: 40rem;
background-image: url('../assets/images/loginleft.png');
background-size: 100% 100%;
background-repeat: no-repeat;
}
.title {
width: 29.13rem;
height: 1.94rem;
font-family: Alibaba PuHuiTi;
font-weight: 500;
font-size: 2rem;
color: #292C33;
line-height: 3.5rem;
text-align: center;
margin-top: 1rem;
}
.loginitem {
width: 24rem;
}
.login-form {
border-radius: 0 6px 6px 0;
background: #ffffff;
width: 50rem;
height: 40rem;
padding: 25px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
img {
width: 6.56rem;
height: 3.56rem;
}
.el-input {
height: 38px;
input {
height: 38px;
}
}
.input-icon {
height: 39px;
width: 14px;
margin-left: 2px;
}
}
.login-tip {
font-size: 13px;
text-align: center;
color: #bfbfbf;
}
.logintabs {
margin-top: 2.88rem;
width: 18rem;
}
.login-code {
width: 35%;
height: 1.8rem;
float: right;
img {
cursor: pointer;
vertical-align: middle;
}
}
.el-login-footer {
height: 40px;
line-height: 40px;
position: fixed;
bottom: 0;
width: 100%;
text-align: center;
color: #333;
font-family: Arial;
font-size: 12px;
letter-spacing: 1px;
}
.login-code-img {
height: 38px;
}
.el-tabs__item.is-active {
color: #216CDC;
position: relative;
padding-bottom: 0.5rem;
}
</style>

@ -87,7 +87,7 @@
</div> </div>
<!-- 月度进展信息 --> <!-- 月度进展信息 -->
<div id="months"> <div id="months">
<Months :action="action" :zwId="projectId"></Months> <Months :action="action" :xmId="projectId"></Months>
</div> </div>
<!-- 企业入驻信息 --> <!-- 企业入驻信息 -->
<div id="companyenter"> <div id="companyenter">

@ -286,7 +286,7 @@ export default {
handleAdd() { handleAdd() {
this.reset(); this.reset();
this.open = true; this.open = true;
this.title = "新增项目知识库"; this.title = "新增目录";
}, },
/** 修改按钮操作 */ /** 修改按钮操作 */
handleUpdate(row) { handleUpdate(row) {
@ -294,7 +294,7 @@ export default {
const catalogId = row.id; const catalogId = row.id;
this.form = { ...row }; this.form = { ...row };
this.open = true; this.open = true;
this.title = "修改项目知识库"; this.title = "编辑目录";
}, },
/** 提交按钮 */ /** 提交按钮 */
submitForm: function () { submitForm: function () {

@ -318,7 +318,7 @@ export default {
const catalogId = row.id; const catalogId = row.id;
this.form = { ...row }; this.form = { ...row };
this.open = true; this.open = true;
this.title = "修改细分产业"; this.title = "编辑细分产业";
}, },
/** 提交按钮 */ /** 提交按钮 */
submitForm: function () { submitForm: function () {

@ -0,0 +1,259 @@
<template>
<div class="dashboard-container">
<!-- 1 -->
<div class="dashboard-row">
<div class="dashboard-col wide">
<div class="allarea">
<AllArea @year-change="handleYearChange" />
</div>
</div>
<div class="dashboard-col narrow">
<div class="itemhead">
<span>消息通知</span>
</div>
<div class="mainarea">
<Message />
</div>
</div>
</div>
<!-- 2-->
<div class="dashboard-rowtwo">
<div class="dashboard-col wide bgcicon">
<MapArea />
</div>
<div class="dashboard-col narrow">
<div class="itemhead" style="margin: .5rem 0 0 0;">
<span>功能区</span>
</div>
<div class="relaitem">
<FunctionArea :years="years" />
</div>
<div class="itemhead" style="margin: 0;">
<span>投资主体</span>
</div>
<div class="relaitem">
<InvestArea :years="years" />
</div>
</div>
</div>
<!-- 3 -->
<div class="dashboard-row">
<div class="dashboard-col">
<div class="itemhead">
<span>产业数据分析</span>
</div>
<div class="relaitem">
<Cyeshuju />
</div>
</div>
<div class="dashboard-col">
<div class="itemhead">
<span>产业导向目录分析</span>
</div>
<div class="relaitem">
<Cydxml />
</div>
</div>
<div class="dashboard-col">
<div class="itemhead">
<span>产业导向细分产业分析</span>
</div>
<div class="relaitem">
<Cydxxfgl />
</div>
</div>
</div>
</div>
</template>
<script>
import AllArea from '@/views/components/analysis/all.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 ProjectList from '@/views/components/analysis/projectList.vue'
import MapArea from '@/views/components/analysis/map.vue'
import Cyeshuju from '@/views/components/analysis/chanyeshuju.vue'
import Cydxml from '@/views/components/analysis/chanyedxml.vue'
import Cydxxfgl from '@/views/components/analysis/chanyexfgl.vue'
import { investall, fungong } from '@/api/ManageApi/index'
export default {
components: {
AllArea,
FunctionArea,
InvestArea,
Message,
ProjectList,
MapArea,
Cyeshuju,
Cydxml,
Cydxxfgl
},
data() {
return {
years: new Date().getFullYear().toString(),
allnumber: {
touzinumber: 0
},
functionnumber: {
functionnumber: 0
}
};
},
methods: {
handleYearChange(years) {
this.years = years;
console.log("index.vue: handleYearChange called with years:", years);
},
async getData() {
const response = await investall();
if (response && response.data) {
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>
<style scoped>
.dashboard-container {
display: flex;
flex-direction: column;
height: 100%;
padding: 0.5rem;
gap: 0.5rem;
box-sizing: border-box;
overflow: auto;
}
.dashboard-row {
display: flex;
flex: 1;
gap: 0.5rem;
}
.dashboard-rowtwo {
display: flex;
height: auto;
gap: 0.5rem;
}
.dashboard-col {
flex: 1;
background-color: #FFFFFF;
border-radius: 0.5rem;
display: flex;
flex-direction: column;
overflow: hidden;
}
.dashboard-col.wide {
flex: 2;
}
.dashboard-col.narrow {
flex: 1;
}
.itemhead {
width: 100%;
border-left: 0.25rem solid #2B62F1;
margin: 0.5rem 0;
margin: 0.5rem 0;
height: 1.25rem;
display: flex;
align-items: center;
}
.relaitem {
flex: 1;
position: relative;
}
.itemsall {
position: absolute;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
top: 33%;
left: 23%;
z-index: 1;
}
.itemsall span:nth-child(1) {
font-family: DINbold;
font-weight: 500;
font-size: 1.25rem;
color: #292C33;
text-align: left;
font-style: normal;
text-transform: none;
}
.itemsall span:nth-child(2) {
font-family: alibold;
font-weight: 400;
font-size: 0.68rem;
color: #9E9E9E;
text-align: left;
font-style: normal;
text-transform: none;
}
.itemhead span {
margin-left: 1rem;
font-family: alibold;
font-weight: 600;
font-size: 1rem;
color: #3D424C;
line-height: 1.69rem;
text-align: left;
font-style: normal;
text-transform: none;
}
.mainarea {
flex: 1;
padding: 0 0 0 .5rem;
overflow: auto;
}
.allarea {
flex: 1;
padding: 0rem 1rem 0 1rem;
display: flex;
flex-direction: column;
}
.bgcicon {
padding: 0 !important;
}
</style>

@ -0,0 +1,295 @@
<template>
<div class="dashboard-container">
<!-- 1 -->
<div class="dashboard-row">
<div class="dashboard-col wide">
<div class="allarea">
<AllArea @year-change="handleYearChange" />
</div>
</div>
<div class="dashboard-col narrow">
<div class="itemhead">
<span>消息通知</span>
</div>
<div class="mainarea">
<Message />
</div>
</div>
</div>
<!-- 2-->
<div class="dashboard-rowtwo">
<div class="dashboard-col wide bgcicon">
<MapArea />
</div>
<div class="dashboard-col narrow">
<div class="itemhead" style="margin: .5rem 0 0 0;">
<span>功能区</span>
</div>
<div class="relaitem">
<FunctionArea :years="years" />
</div>
<div class="itemhead" style="margin: 0;">
<span>投资主体</span>
</div>
<div class="relaitem">
<InvestArea :years="years" />
</div>
</div>
</div>
<!-- 3 -->
<div class="dashboard-row">
<div class="dashboard-col">
<div class="itemhead">
<span>产业数据分析</span>
</div>
<div class="relaitem">
<Cyeshuju />
</div>
</div>
<div class="dashboard-col">
<div class="itemhead">
<span>产业导向目录分析</span>
</div>
<div class="relaitem">
<Cydxml />
</div>
</div>
<div class="dashboard-col" style="height: 11rem;">
<div class="itemhead">
<!-- <span>产业导向细分产业分析</span> -->
<span>年度任务完成情况</span>
</div>
<div class="relaitem" style="height: 9rem;">
<!-- <Cydxxfgl /> -->
<Ndwcqk />
</div>
</div>
</div>
<!-- 4 -->
<div class="dashboard-row">
<div class="dashboard-col">
<div class="itemhead">
<span>储备项目统计分析</span>
</div>
<div class="relaitem">
<Cbxm />
</div>
</div>
<div class="dashboard-col">
<div class="itemhead">
<span>产业导向细分产业分析</span>
<!-- <span>年度任务完成情况</span> -->
</div>
<div class="relaitem">
<Cydxxfgl />
<!-- <Ndwcqk /> -->
</div>
</div>
</div>
</div>
</template>
<script>
import AllArea from '@/views/components/analysis/all.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 ProjectList from '@/views/components/analysis/projectList.vue'
import MapArea from '@/views/components/analysis/map.vue'
import Cyeshuju from '@/views/components/analysis/chanyeshuju.vue'
import Cydxml from '@/views/components/analysis/chanyedxml.vue'
import Cydxxfgl from '@/views/components/analysis/chanyexfgl.vue'
import Cbxm from '@/views/components/analysis/chubeixm.vue'
import Ndwcqk from '@/views/components/analysis/ndwcqk.vue'
import { investall, fungong } from '@/api/ManageApi/index'
export default {
components: {
AllArea,
FunctionArea,
InvestArea,
Message,
ProjectList,
MapArea,
Cyeshuju,
Cydxml,
Cydxxfgl,
Cbxm,
Ndwcqk
},
data() {
return {
years: new Date().getFullYear().toString(),
allnumber: {
touzinumber: 0
},
functionnumber: {
functionnumber: 0
}
};
},
methods: {
handleYearChange(years) {
this.years = years;
console.log("index.vue: handleYearChange called with years:", years);
},
async getData() {
const response = await investall();
if (response && response.data) {
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>
<style scoped>
.dashboard-container {
display: flex;
flex-direction: column;
height: 100%;
padding: 0.5rem;
gap: 0.5rem;
box-sizing: border-box;
overflow: auto;
}
.dashboard-row {
display: flex;
flex: 1;
gap: 0.5rem;
}
.dashboard-rowtwo {
display: flex;
height: auto;
gap: 0.5rem;
}
.dashboard-col {
flex: 1;
background-color: #FFFFFF;
border-radius: 0.5rem;
display: flex;
flex-direction: column;
overflow: hidden;
}
.dashboard-col.wide {
flex: 2;
}
.dashboard-col.narrow {
flex: 1;
}
.itemhead {
width: 100%;
border-left: 0.25rem solid #2B62F1;
margin: 0.5rem 0;
margin: 0.5rem 0;
height: 1.25rem;
display: flex;
align-items: center;
justify-content: space-between;
.top {
width: auto;
display: flex;
margin-bottom: 10px;
font-size: 0.88rem;
color: gray!important;
justify-content: flex-end;
}
}
.relaitem {
flex: 1;
position: relative;
}
.itemsall {
position: absolute;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
top: 33%;
left: 23%;
z-index: 1;
}
.itemsall span:nth-child(1) {
font-family: DINbold;
font-weight: 500;
font-size: 1.25rem;
color: #292C33;
text-align: left;
font-style: normal;
text-transform: none;
}
.itemsall span:nth-child(2) {
font-family: alibold;
font-weight: 400;
font-size: 0.68rem;
color: #9E9E9E;
text-align: left;
font-style: normal;
text-transform: none;
}
.itemhead span {
margin-left: 1rem;
font-family: alibold;
font-weight: 600;
font-size: 1rem;
color: #3D424C;
line-height: 1.69rem;
text-align: left;
font-style: normal;
text-transform: none;
}
.mainarea {
flex: 1;
padding: 0 0 0 .5rem;
overflow: auto;
}
.allarea {
flex: 1;
padding: 0rem 1rem 0 1rem;
display: flex;
flex-direction: column;
}
.bgcicon {
padding: 0 !important;
}
</style>

@ -57,12 +57,36 @@
<Cydxml /> <Cydxml />
</div> </div>
</div> </div>
<div class="dashboard-col" style="height: 11rem;">
<div class="itemhead">
<!-- <span>产业导向细分产业分析</span> -->
<span>年度任务完成情况</span>
</div>
<div class="relaitem" style="height: 9rem;">
<!-- <Cydxxfgl /> -->
<Ndwcqk />
</div>
</div>
</div>
<!-- 4 -->
<div class="dashboard-row">
<div class="dashboard-col">
<div class="itemhead">
<span>储备项目统计分析</span>
</div>
<div class="relaitem">
<Cbxm />
</div>
</div>
<div class="dashboard-col"> <div class="dashboard-col">
<div class="itemhead"> <div class="itemhead">
<span>产业导向细分产业分析</span> <span>产业导向细分产业分析</span>
<!-- <span>年度任务完成情况</span> -->
</div> </div>
<div class="relaitem"> <div class="relaitem">
<Cydxxfgl /> <Cydxxfgl />
<!-- <Ndwcqk /> -->
</div> </div>
</div> </div>
</div> </div>
@ -79,6 +103,8 @@ import MapArea from '@/views/components/analysis/map.vue'
import Cyeshuju from '@/views/components/analysis/chanyeshuju.vue' import Cyeshuju from '@/views/components/analysis/chanyeshuju.vue'
import Cydxml from '@/views/components/analysis/chanyedxml.vue' import Cydxml from '@/views/components/analysis/chanyedxml.vue'
import Cydxxfgl from '@/views/components/analysis/chanyexfgl.vue' import Cydxxfgl from '@/views/components/analysis/chanyexfgl.vue'
import Cbxm from '@/views/components/analysis/chubeixm.vue'
import Ndwcqk from '@/views/components/analysis/ndwcqk.vue'
import { investall, fungong } from '@/api/ManageApi/index' import { investall, fungong } from '@/api/ManageApi/index'
export default { export default {
@ -91,7 +117,9 @@ export default {
MapArea, MapArea,
Cyeshuju, Cyeshuju,
Cydxml, Cydxml,
Cydxxfgl Cydxxfgl,
Cbxm,
Ndwcqk
}, },
data() { data() {
return { return {
@ -188,6 +216,16 @@ export default {
height: 1.25rem; height: 1.25rem;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between;
.top {
width: auto;
display: flex;
margin-bottom: 10px;
font-size: 0.88rem;
color: gray!important;
justify-content: flex-end;
}
} }
.relaitem { .relaitem {
@ -254,6 +292,4 @@ export default {
.bgcicon { .bgcicon {
padding: 0 !important; padding: 0 !important;
} }
</style> </style>

@ -46,7 +46,7 @@ module.exports = {
proxy: { proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy // detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: { [process.env.VUE_APP_BASE_API]: {
target: `http://192.168.0.111:7071/`, target: `http://192.168.0.105:7071/`,
// target: `http://39.101.188.84:7071/`, // target: `http://39.101.188.84:7071/`,
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {

Loading…
Cancel
Save