项洋 4 weeks ago
commit 4d96aaca4c

@ -31,6 +31,7 @@
"admin-template", "admin-template",
"management-system" "management-system"
], ],
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://gitee.com/y_project/RuoYi-Vue.git" "url": "https://gitee.com/y_project/RuoYi-Vue.git"
@ -38,9 +39,12 @@
"dependencies": { "dependencies": {
"@amap/amap-jsapi-loader": "^1.0.1", "@amap/amap-jsapi-loader": "^1.0.1",
"@riophae/vue-treeselect": "0.4.0", "@riophae/vue-treeselect": "0.4.0",
"@vue-office/docx": "^1.6.3",
"@vue/composition-api": "^1.7.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.37.1",
"docx-preview": "^0.3.5",
"echarts": "^5.4.0", "echarts": "^5.4.0",
"element-ui": "^2.15.13", "element-ui": "^2.15.13",
"file-saver": "2.0.5", "file-saver": "2.0.5",
@ -61,6 +65,7 @@
"vue": "2.6.12", "vue": "2.6.12",
"vue-count-to": "1.0.13", "vue-count-to": "1.0.13",
"vue-cropper": "0.5.5", "vue-cropper": "0.5.5",
"vue-demi": "^0.14.10",
"vue-meta": "2.4.0", "vue-meta": "2.4.0",
"vue-quill-editor": "^3.0.6", "vue-quill-editor": "^3.0.6",
"vue-router": "3.4.9", "vue-router": "3.4.9",

@ -0,0 +1,15 @@
XXXXXXX项目单片材料
投资主体简介
该项目位于所属功能区建设地点位于xxxx由xxxx有限公司统一信用代码为xxxxx投资由xxxxx有限公司施工设计单位是xxx有限公司建设起止时间于xxxxxx其重点发展产业为xxxx该项目的项目标签是xxxxx整体的项目由xxx负责联系方式是xxxxxxxxx。
规划信息
该项目总用地面积约XXXX平方米容积率占xx总建筑面积为xxxx万平方米共有xx栋标准建筑面积为xxx平方米建筑密度为x%最高建筑层数xx层最高建筑高度xx米其防火等级为xxx机动车停车位xx辆和非机动车听车辆xx辆。
计划总投资及建设计划
该项目投资主体性质是xx计划投资额度xxx亿元实际总投资额xxxx万人民币。
当前进展情况
目前,该项目属于项目现状,于 xxxx日正式施工截至目前建设进度。
企业运营情况
目前该项目入驻企业数量共xx家入驻企业行业类型为xxxxx人员数量共计xxx人入住率为x%其中已出租面积xxx平方米空置房屋xxx万平方米工业厂房平均租金xx元/平方米*月。
存在困难问题
暂无。

@ -0,0 +1,12 @@
苏州工业园区工业上楼项目总体分析报告
XXXX年
一、总体项目概况
苏州工业园区积极推进工业上楼模式截至xxxx年园区规划工业上楼项目总数共计xx个总建筑面积约xxxx万平方米其中已建项目xx个在建项目xx个拟建项目xx个这些项目广泛分布于城市核心区域及郊区新兴产业片区通过垂直化空间利用提升土地利用效率推进产业升级与集聚发展。
二、当年项目情况
xxxx年苏州工业园区新开工上楼项目总数共计xx个新开工项目总建筑面积达到xxxx万平方米已建项目xx个在建项目xx个拟建项目xx个力求为企业提供优质的生产和办公环境同时在建设标准和质量上提出更高要求。
三、功能区情况分析
截至xxxx年项目总数共xx个其中高端制造与国际贸易区项目数量占xx个独墅湖科教创新区项目数量占xx个阳澄湖半岛旅游度假区项目数量占xx个金鸡湖商务区项目数量占xx个苏相合作区项目数量占xx个。
四、投资主体情况分析
截至xxxx年项目总数共xx个国企投资占xx个民企投资占xx个外企投资占xx个。

@ -0,0 +1,38 @@
// src/api/ManageApi/index.js
import request from "@/utils/request";
// 根据项目ID分页查询所有标签管理
export function getallspan(params) {
return request({
url: "/gysl/bqgl/searchId",
method: "get",
params,
});
}
//新增数据
export function addspan(data) {
return request({
url: "/gysl/bqgl/add",
method: "post",
data,
});
}
// 修改信息
export function updatspan(data) {
return request({
url: "/gysl/bqgl/edit",
method: "post",
data,
});
}
// 删除信息
export function deletespan(idList) {
return request({
url: "/gysl/bqgl/delete",
method: "delete",
params: {
idList: idList.join(","), // 将数组转换为逗号分隔的字符串
},
});
}

@ -1,4 +1,6 @@
import Vue from "vue"; import Vue from "vue";
// 预览docx
import VueCompositionAPI from '@vue/composition-api'
import Cookies from "js-cookie"; import Cookies from "js-cookie";
@ -55,6 +57,8 @@ import DictData from "@/components/DictData";
//echarts //echarts
import * as echarts from "echarts"; import * as echarts from "echarts";
// 全局方法挂载 // 全局方法挂载
Vue.prototype.getDicts = getDicts; Vue.prototype.getDicts = getDicts;
Vue.prototype.getConfigKey = getConfigKey; Vue.prototype.getConfigKey = getConfigKey;
@ -90,6 +94,8 @@ DictData.install();
* Currently MockJs will be used in the production environment, * Currently MockJs will be used in the production environment,
* please remove it before going online! ! ! * please remove it before going online! ! !
*/ */
//预览docx
Vue.use(VueCompositionAPI)
Vue.use(Element, { Vue.use(Element, {
size: Cookies.get("size") || "medium", // set element-ui default size size: Cookies.get("size") || "medium", // set element-ui default size

@ -0,0 +1,3 @@
<template>
<div>项目手册报告</div>
</template>

@ -41,12 +41,18 @@
<el-table-column label="文件名称" align="center" prop="name" /> <el-table-column label="文件名称" align="center" prop="name" />
<el-table-column label="类型" align="center"> <el-table-column label="类型" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
{{ fileTypeMap[scope.row.lx] || scope.row.lx }} <a v-if="scope.row.lx === '3'" :href="scope.row.wz" target="_blank"
style="color: #409EFF; text-decoration: underline;">
{{ fileTypeMap[scope.row.lx] || scope.row.lx }}
</a>
<span v-else>
{{ fileTypeMap[scope.row.lx] || scope.row.lx }}
</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="附件" align="center" prop="fj"> <el-table-column label="附件" align="center" prop="fj">
<template slot-scope="scope"> <template slot-scope="scope">
{{ getFileName(scope.row.fj) }} {{ getFileName(scope.row.fj) || "未上传" }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="上传用户" align="center" prop="scyh" /> <el-table-column label="上传用户" align="center" prop="scyh" />
@ -59,7 +65,7 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" <pagination v-show="total > 0" :total="total" :page.sync="queryParams.current" :limit.sync="queryParams.size"
@pagination="getList" /> @pagination="getList" />
</div> </div>
@ -70,14 +76,22 @@
<el-input v-model="form.name" placeholder="请输入文件名称" /> <el-input v-model="form.name" placeholder="请输入文件名称" />
</el-form-item> </el-form-item>
<el-form-item label="类型" prop="lx"> <el-form-item label="类型" prop="lx">
<el-select v-model="form.lx" placeholder="请选择文件类型" style="width: 100%;"> <el-select v-model="form.lx" placeholder="请选择文件类型" style="width: 100%;" @change="handleTypeChange">
<el-option v-for="dict in dict.type.wjlx" :key="dict.value" :label="dict.label" <el-option v-for="dict in dict.type.wjlx" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option> :value="dict.value"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 如果文件类型是网络信息假设值为 4 --> <!-- 文件类型是网络信息 -->
<el-form-item v-if="form.lx === '3'" label="网址" prop="scyh"> <el-form-item v-if="form.lx === '3'" label="网址" prop="wz">
<el-input v-model="form.scsj" placeholder="请输入网址" /> <el-input v-model="form.wz" placeholder="请输入网址" class="input-with-select">
<template slot="prepend">
<el-select v-model="select" style="width: 5.7rem;" @change="handleProtocolChange">
<el-option label="http" value="http"></el-option>
<el-option label="https" value="https"></el-option>
</el-select>
<span class="wangzhispan">://</span>
</template>
</el-input>
</el-form-item> </el-form-item>
<el-form-item label="上传用户" prop="scyh"> <el-form-item label="上传用户" prop="scyh">
<el-input v-model="form.scyh" placeholder="请输入上传用户" /> <el-input v-model="form.scyh" placeholder="请输入上传用户" />
@ -86,7 +100,10 @@
<el-date-picker v-model="form.scsj" type="date" placeholder="选择日期" value-format="yyyy-MM-dd" <el-date-picker v-model="form.scsj" type="date" placeholder="选择日期" value-format="yyyy-MM-dd"
style="width: 100%;" /> style="width: 100%;" />
</el-form-item> </el-form-item>
<el-form-item label="附件" prop="fj"> <el-form-item v-if="form.lx !== '3'" label="附件" prop="fj" required>
<fileload v-model="form.fj"></fileload>
</el-form-item>
<el-form-item v-if="form.lx === '3'" label="附件" prop="fj">
<fileload v-model="form.fj"></fileload> <fileload v-model="form.fj"></fileload>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -108,8 +125,8 @@
:value="dict.value"></el-option> :value="dict.value"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item v-if="detailForm.lx === '3'" label="网址" prop="scyh"> <el-form-item v-if="detailForm.lx === '3'" label="网址" prop="wz">
<el-input v-model="detailForm.scsj" placeholder="请输入网址" readonly /> <el-input v-model="detailForm.wz" placeholder="wz" readonly />
</el-form-item> </el-form-item>
<el-form-item label="上传用户" prop="scyh"> <el-form-item label="上传用户" prop="scyh">
<el-input v-model="detailForm.scyh" placeholder="请输入上传用户" /> <el-input v-model="detailForm.scyh" placeholder="请输入上传用户" />
@ -164,8 +181,8 @@ export default {
detailOpen: false, detailOpen: false,
// //
queryParams: { queryParams: {
pageNum: 1, current: 1,
pageSize: 10, size: 10,
name: undefined, name: undefined,
lx: undefined lx: undefined
}, },
@ -177,6 +194,7 @@ export default {
fj: undefined, fj: undefined,
scsj: undefined, scsj: undefined,
scyh: undefined, scyh: undefined,
wz: undefined,
createBy: undefined, createBy: undefined,
createId: undefined, createId: undefined,
createTime: undefined, createTime: undefined,
@ -192,6 +210,7 @@ export default {
fj: undefined, fj: undefined,
scsj: undefined, scsj: undefined,
scyh: undefined, scyh: undefined,
wz: undefined,
createBy: undefined, createBy: undefined,
createId: undefined, createId: undefined,
createTime: undefined, createTime: undefined,
@ -207,6 +226,9 @@ export default {
lx: [ lx: [
{ required: true, message: "文件类型不能为空", trigger: "change" } { required: true, message: "文件类型不能为空", trigger: "change" }
], ],
wz: [
{ required: true, message: "网址不能为空", trigger: "change" }
],
scyh: [ scyh: [
{ required: true, message: "上传用户不能为空", trigger: "blur" } { required: true, message: "上传用户不能为空", trigger: "blur" }
], ],
@ -220,14 +242,15 @@ export default {
2: "研究报告", 2: "研究报告",
3: "网络信息", 3: "网络信息",
4: "其他", 4: "其他",
} },
select: 'http' //
}; };
}, },
created() { created() {
this.getList(); this.getList();
}, },
methods: { methods: {
// //
getFileName(filePath) { getFileName(filePath) {
if (filePath) { if (filePath) {
return filePath.split('/').pop(); return filePath.split('/').pop();
@ -237,7 +260,6 @@ export default {
querySearchAsync(queryString, cb) { querySearchAsync(queryString, cb) {
let results = []; let results = [];
// getXmzskPage API
getXmzskPage({ name: queryString }).then(res => { getXmzskPage({ name: queryString }).then(res => {
res.data.records.forEach(item => { res.data.records.forEach(item => {
results.push({ results.push({
@ -274,6 +296,7 @@ export default {
fj: undefined, fj: undefined,
scsj: undefined, scsj: undefined,
scyh: undefined, scyh: undefined,
wz: undefined,
createBy: undefined, createBy: undefined,
createId: undefined, createId: undefined,
createTime: undefined, createTime: undefined,
@ -281,11 +304,12 @@ export default {
updateId: undefined, updateId: undefined,
updateTime: undefined updateTime: undefined
}; };
this.select = 'http'; //
this.resetForm("form"); this.resetForm("form");
}, },
/** 搜索按钮操作 */ /** 搜索按钮操作 */
handleQuery() { handleQuery() {
this.queryParams.pageNum = 1; this.queryParams.current = 1;
this.getList(); this.getList();
}, },
/** 重置按钮操作 */ /** 重置按钮操作 */
@ -310,6 +334,7 @@ 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.open = true; this.open = true;
this.title = "修改项目知识库"; this.title = "修改项目知识库";
}, },
@ -357,6 +382,36 @@ export default {
}).catch(error => { }).catch(error => {
console.error('API Request Error:', error); console.error('API Request Error:', error);
}); });
},
//
setProtocolType(url) {
if (url) {
if (url.startsWith('https://')) {
this.select = 'https';
} else if (url.startsWith('http://')) {
this.select = 'http';
} else {
this.select = 'http';
this.form.wz = 'http://' + url;
}
} else {
this.select = 'http';
}
},
//
handleProtocolChange() {
if (this.form.wz && !this.form.wz.startsWith(this.select + '://')) {
this.form.wz = this.select + '://' + this.form.wz.replace(/(http|https):\/\//, '');
}
},
//
handleTypeChange() {
if (this.form.lx !== '3') {
this.form.wz = undefined;
this.select = 'http';
} else {
this.setProtocolType(this.form.wz);
}
} }
} }
}; };

@ -1,356 +1,163 @@
<template> <template>
<div> <div>
<!-- 表单查询项 --> <!-- 报告管理 -->
<div v-if="!previewMode" class="headerbox"> <!-- 表单查询项 -->
<el-form size="small" :inline="true" label-width="200"> <div v-if="!previewMode" class="headerbox">
<el-row> <el-form size="small" :inline="true" label-width="200">
<el-col :span="5"> <el-row>
<el-form-item label="文件标题" style="width: 100%;"> <el-col :span="5">
<el-input v-model="queryParams.fileTitle" placeholder="请输入模板标题" clearable /> <el-form-item label="文件标题" style="width: 100%;">
</el-form-item> <el-input v-model="queryParams.fileTitle" placeholder="请输入模板标题" clearable />
</el-col> </el-form-item>
<el-col :span="5"> </el-col>
<el-form-item label="发布时间"> <el-col :span="5">
<el-date-picker v-model="queryParams.startTime" type="date" placeholder="选择日期" style="width: 100%;"></el-date-picker> <el-form-item label="发布时间">
</el-form-item> <el-date-picker v-model="queryParams.startTime" type="date" placeholder="选择日期"
</el-col> style="width: 100%;"></el-date-picker>
<el-col :span="8"> </el-form-item>
<el-form-item> </el-col>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button> <el-col :span="8">
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button> <el-form-item>
</el-form-item> <el-button type="primary" icon="el-icon-search" size="mini"
</el-col> @click="handleQuery">查询</el-button>
</el-row> <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form> </el-form-item>
</div> </el-col>
<!-- 表格内容区 --> </el-row>
<div v-if="!previewMode" class="tablebox"> </el-form>
<!-- 按钮行 -->
<div class="tablebtntwo">
<el-button type="primary" icon="el-icon-upload2" size="mini" @click="handleExport"></el-button>
<el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"></el-button>
</div> </div>
<el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /> <!-- 表格内容区 -->
<el-table-column label="序号" align="center" prop="id" /> <div v-if="!previewMode" class="tablebox">
<el-table-column label="文件标题" align="center" prop="title" /> <el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange">
<el-table-column label="发布单位" align="center" prop="unit" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="发布人" align="center" prop="author" /> <el-table-column label="序号" align="center" prop="id" />
<el-table-column label="发布时间" align="center" prop="createTime" /> <el-table-column label="文件标题" align="center" prop="title" />
<el-table-column label="操作" align="center"> <el-table-column label="发布单位" align="center" prop="unit" />
<template slot-scope="scope"> <!-- <el-table-column label="发布人" align="center" prop="author" /> -->
<el-button size="mini" type="text" style="color: gray;" @click="handlePreview(scope.row)"></el-button> <el-table-column label="发布时间" align="center" prop="createTime" />
<el-button size="mini" type="text" @click="handleEdit(scope.row)"></el-button> <el-table-column label="操作" align="center">
<el-button size="mini" type="text" style="color: #F25353;" @click="handleDelete(scope.row)"></el-button> <template slot-scope="scope">
</template> <el-button size="mini" type="text" style="color: gray;"
</el-table-column> @click="handlePreview(scope.row)">预览</el-button>
</el-table> </template>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" </el-table-column>
@pagination="getList" /> </el-table>
</div> <pagination v-show="total > 0" :total="total" :page.sync="queryParams.current"
:limit.sync="queryParams.size" @pagination="getList" />
<!-- 新增/编辑的弹窗 -->
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible">
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="文件标题" prop="fileTitle">
<el-input v-model="form.fileTitle" placeholder="请输入文件标题" />
</el-form-item>
<el-form-item label="发布时间" prop="createTime">
<el-date-picker v-model="form.createTime" type="date" placeholder="选择日期" style="width: 100%;"></el-date-picker>
</el-form-item>
<el-form-item label="发布单位" prop="unit">
<el-input v-model="form.unit" placeholder="请输入发布单位" />
</el-form-item>
<el-form-item label="发布人" prop="createBy">
<el-input v-model="form.createBy" placeholder="请输入发布人" />
</el-form-item>
<el-form-item label="内容" prop="content">
<Editorone v-model="form.content" />
</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>
</div>
</el-dialog>
<!-- 预览的展示区 -->
<div v-if="previewMode" class="previewbox">
<!-- 按钮区域 -->
<div class="previewhead">
<div class="headone">预览</div>
<div class="headtwo">
<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>
<!-- 标题栏 -->
<div class="previewnick">
<h1>{{ previewData.fileTitle }}</h1>
</div>
<!-- 发布信息栏 -->
<div class="previewinfo">
<div class="previewinfoitem">发布时间{{ previewData.createTime }}</div>
<div class="previewinfoitem">发布单位{{ previewData.unit }}</div>
<div class="previewinfoitem">发布人{{ previewData.createBy }}</div>
</div> </div>
<!-- 内容区域 -->
<div class="previewcontent"> <!-- DOCX预览区域 -->
<div v-html="previewData.content"></div> <div v-if="previewMode" class="previewbox">
<div class="previewhead">
<h3>{{ previewData.title }}</h3>
<div class="headtwo">
<el-button size="mini" @click="previewMode = false">返回</el-button>
</div>
</div>
<div class="previewcontent">
<vue-office-docx
:src="docxFileData"
style="width: 100%; height: calc(100vh - 250px); border: 1px solid #eee;"
@rendered="renderedHandler"
/>
</div>
</div> </div>
</div>
</div> </div>
</template> </template>
<script> <script>
import Editorone from '@/components/Editor'; import VueOfficeDocx from '@vue-office/docx'
import { addClgl, deleteClgl, updateClgl, getClglPage, exportToPdf, downloadPdf } from '@/api/ManageApi/index'; import axios from 'axios'
export default { export default {
components: { Editorone }, components: {
'vue-office-docx': VueOfficeDocx
},
data() { data() {
return { return {
loading: false, //
postList: [], queryParams: {
total: 0, current: 1,
queryParams: { size: 10,
pageNum: 1, fileTitle: undefined,
pageSize: 10, startTime: undefined
fileTitle: '', },
startTime: '' //
}, postList: [],
dialogVisible: false, //
dialogTitle: '新增', loading: false,
form: { //
id: undefined, total: 0,
fileTitle: '', //
createTime: '', previewMode: false,
unit: '', //
createBy: '', previewData: {},
content: '' // DOCX
}, docxFileData: null
rules: { }
fileTitle: [
{ required: true, message: '文件标题不能为空', trigger: 'blur' }
],
createTime: [
{ required: true, message: '发布时间不能为空', trigger: 'change' }
],
unit: [
{ required: true, message: '发布单位不能为空', trigger: 'blur' }
],
createBy: [
{ required: true, message: '发布人不能为空', trigger: 'blur' }
],
content: [
{ required: true, message: '内容不能为空', trigger: 'blur' }
]
},
previewMode: false,
previewData: {},
};
}, },
created() { created() {
this.getList(); this.getList()
}, },
methods: { methods: {
// PDF //
async handleExporttwo() { getList() {
try { this.loading = true
this.loading = true; //
setTimeout(() => {
// this.postList = [
if (!this.previewData.fileTitle || !this.previewData.content) { { id: 1, title: 'xxxx项目单体材料模板', unit: '经发委', author: '', createTime: '2024-08-20', fileUrl: 'docx/单体材料模板.docx' },
this.$message.warning('请确保标题和内容不为空'); ]
return; this.total = 1
} this.loading = false
}, 500)
// 1. },
const exportResponse = await exportToPdf({ //
htmlArticleTitle: this.previewData.fileTitle, handleQuery() {
htmlContent: this.previewData.content this.queryParams.current = 1
}); this.getList()
},
console.log('完整的:', exportResponse); //
resetQuery() {
// - data this.queryParams = {
if (!exportResponse?.data || exportResponse.code !== 200) { current: 1,
throw new Error(exportResponse?.msg || '导出PDF失败'); size: 10,
} fileTitle: undefined,
startTime: undefined
const fileData = exportResponse.data;
if (!fileData.fileName || !fileData.url) {
throw new Error('后端未返回有效的文件路径或文件名');
}
// 使
this.handleDownload(fileData);
this.$message.success('PDF导出下载成功');
} catch (error) {
console.error('导出PDF失败:', error);
this.$message.error('导出PDF失败');
} 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();
window.URL.revokeObjectURL(url);
},
//
handleReturn() {
this.previewMode = false;
this.previewData = {};
},
handleAdd() {
this.dialogTitle = '新增';
this.dialogVisible = true;
this.form = { id: undefined, fileTitle: '', createTime: '', unit: '', createBy: '', content: '' };
},
handleEdit(row) {
this.dialogTitle = '编辑';
this.dialogVisible = true;
this.form = { ...row };
},
async handleDelete(row) {
this.$confirm('确定删除该文件吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
try {
this.loading = true;
await deleteClgl([row.id]);
this.postList = this.postList.filter(item => item.id !== row.id);
this.total -= 1;
this.$message({ type: 'success', message: '删除成功!' });
} catch (error) {
console.error('删除失败:', error);
this.$message.error('删除失败');
} finally {
this.loading = false;
}
});
},
handlePreview(row) {
this.previewMode = true;
this.previewData = { ...row };
this.previewData.content = row.content; // HTML
},
async submitForm() {
this.$refs.form.validate(async valid => {
if (valid) {
try {
this.loading = true;
if (this.form.id) {
//
await updateClgl(this.form);
const index = this.postList.findIndex(item => item.id === this.form.id);
this.postList.splice(index, 1, { ...this.form });
this.$message({ type: 'success', message: '编辑成功!' });
} else {
//
const response = await addClgl(this.form);
const newForm = { ...this.form, id: response.data.id };
this.postList.push(newForm);
this.total += 1;
this.$message({ type: 'success', message: '新增成功!' });
}
this.dialogVisible = false;
} catch (error) {
console.error('操作失败:', error);
this.$message.error('操作失败');
} finally {
this.loading = false;
}
}
});
},
cancel() {
this.dialogVisible = false;
},
handleSelectionChange(selection) {
console.log(selection);
},
async handleExport() {
try {
this.loading = true;
const params = {
...this.queryParams
};
const response = await getClglPage(params);
if (response.code === 200) {
const fileData = response.data;
if (!fileData.fileName || !fileData.url) {
throw new Error('后端未返回有效的文件路径或文件名');
} }
this.handleDownload(fileData); this.handleQuery()
this.$message.success('导出成功'); },
} else { //
throw new Error('导出失败'); handleSelectionChange(selection) {
} this.ids = selection.map(item => item.id)
} catch (error) { this.single = selection.length !== 1
console.error('导出失败:', error); this.multiple = !selection.length
this.$message.error('导出失败'); },
} finally { //
this.loading = false; handlePreview(row) {
} this.previewMode = true
}, this.previewData = row
async getList() { this.loadDocxFile(row.fileUrl)
try { },
this.loading = true; // DOCX
const params = { loadDocxFile(url) {
...this.queryParams this.docxFileData = null
}; axios.get(url, { responseType: 'arraybuffer' })
const response = await getClglPage(params); .then(response => {
if (response.code === 200) { this.docxFileData = response.data
this.postList = response.data.records; })
this.total = response.data.total; .catch(error => {
} else { console.error('加载文档失败:', error)
throw new Error('获取数据失败'); this.$message.error('文档加载失败')
} })
} catch (error) { },
console.error('获取数据失败:', error); //
this.$message.error('获取数据失败'); renderedHandler() {
} finally { console.log('文档渲染完成')
this.loading = false;
} }
},
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
resetQuery() {
this.queryParams = {
pageNum: 1,
pageSize: 10,
fileTitle: '',
startTime: ''
};
this.getList();
},
extractTextContent(html) {
const tempDiv = document.createElement('div');
tempDiv.innerHTML = html;
return tempDiv.textContent || tempDiv.innerText || '';
}
} }
}; }
</script> </script>
<style scoped> <style scoped>
@ -379,10 +186,8 @@ export default {
} }
.previewbox { .previewbox {
width: 90%; width: 100%;
height: auto; height: 92rem;
margin-left: 5%;
margin-top: .3rem;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
padding: 1rem; padding: 1rem;
@ -403,17 +208,6 @@ export default {
gap: .5rem; gap: .5rem;
} }
.previewnick {
margin-top: .3rem;
width: 100%;
height: 5rem;
display: flex;
justify-content: center;
align-items: center;
border-bottom: 3px solid #2B62F1;
color: #2B62F1;
}
.previewinfo { .previewinfo {
display: flex; display: flex;
gap: 1rem; gap: 1rem;
@ -423,5 +217,6 @@ export default {
.previewcontent { .previewcontent {
margin-top: 1rem; margin-top: 1rem;
width: 100%;
} }
</style> </style>

@ -0,0 +1,224 @@
<template>
<div>
<!-- 报告管理 -->
<!-- 表单查询项 -->
<div v-if="!previewMode" class="headerbox">
<el-form size="small" :inline="true" label-width="200">
<el-row>
<el-col :span="5">
<el-form-item label="文件标题" style="width: 100%;">
<el-input v-model="queryParams.fileTitle" placeholder="请输入模板标题" clearable />
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="发布时间">
<el-date-picker v-model="queryParams.startTime" type="date" placeholder="选择日期"
style="width: 100%;"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini"
@click="handleQuery">查询</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
<!-- 表格内容区 -->
<div v-if="!previewMode" class="tablebox">
<el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" align="center" prop="id" />
<el-table-column label="文件标题" align="center" prop="title" />
<el-table-column label="发布单位" align="center" prop="unit" />
<!-- <el-table-column label="发布人" align="center" prop="author" /> -->
<el-table-column label="发布时间" align="center" prop="createTime" />
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button size="mini" type="text" style="color: gray;"
@click="handlePreview(scope.row)">预览</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.current"
:limit.sync="queryParams.size" @pagination="getList" />
</div>
<!-- DOCX预览区域 -->
<div v-if="previewMode" class="previewbox">
<div class="previewhead">
<h3>{{ previewData.title }}</h3>
<div class="headtwo">
<el-button size="mini" @click="previewMode = false">返回</el-button>
</div>
</div>
<div class="previewcontent">
<vue-office-docx
:src="docxFileData"
style="width: 100%; height: calc(100vh - 250px); border: 1px solid #eee;"
@rendered="renderedHandler"
/>
</div>
</div>
</div>
</template>
<script>
import VueOfficeDocx from '@vue-office/docx'
import axios from 'axios'
export default {
components: {
'vue-office-docx': VueOfficeDocx
},
data() {
return {
//
queryParams: {
current: 1,
size: 10,
fileTitle: undefined,
startTime: undefined
},
//
postList: [],
//
loading: false,
//
total: 0,
//
previewMode: false,
//
previewData: {},
// DOCX
docxFileData: null
}
},
created() {
this.getList()
},
methods: {
//
getList() {
this.loading = true
//
setTimeout(() => {
this.postList = [
{ id: 1, title: '苏州工业园区总体报告模板', unit: '经发委', author: '', createTime: '2024-08-20', fileUrl: 'docx/苏州工业园区总体报告模板.docx' },
]
this.total = 1
this.loading = false
}, 500)
},
//
handleQuery() {
this.queryParams.current = 1
this.getList()
},
//
resetQuery() {
this.queryParams = {
current: 1,
size: 10,
fileTitle: undefined,
startTime: undefined
}
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length !== 1
this.multiple = !selection.length
},
//
handlePreview(row) {
this.previewMode = true
this.previewData = row
this.loadDocxFile(row.fileUrl)
},
// DOCX
loadDocxFile(url) {
this.docxFileData = null
axios.get(url, { responseType: 'arraybuffer' })
.then(response => {
this.docxFileData = response.data
})
.catch(error => {
console.error('加载文档失败:', error)
this.$message.error('文档加载失败')
})
},
//
renderedHandler() {
console.log('文档渲染完成')
}
}
}
</script>
<style scoped>
.headerbox {
background-color: #fff;
border-radius: .5rem;
padding: 1rem;
margin: .5rem;
border: 1px solid #eee;
}
.tablebox {
background-color: #fff;
border-radius: .5rem;
padding: 1rem;
margin: .5rem;
border: 1px solid #eee;
}
.tablebtntwo {
width: 100%;
display: flex;
justify-content: space-between;
margin-top: 1rem;
margin-bottom: 1rem;
}
.previewbox {
width: 90%;
height: 92rem;
margin-left: 5%;
margin-top: .3rem;
display: flex;
flex-direction: column;
padding: 1rem;
background-color: #fff;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
.previewhead {
width: 100%;
height: 2rem;
display: flex;
align-items: center;
justify-content: space-between;
}
.headtwo {
display: flex;
gap: .5rem;
}
.previewinfo {
display: flex;
gap: 1rem;
justify-content: flex-start;
margin-top: 1rem;
}
.previewcontent {
margin-top: 1rem;
width: 100%;
}
</style>

@ -419,21 +419,18 @@ export default {
}; };
}, },
fetchBuildings() { fetchBuildings() {
console.log('Fetching data for xmId:', this.xmId); // console.log('Fetching data for xmId:', this.xmId);
getjzxxinformationByxmId({ xmId: this.xmId }) getjzxxinformationByxmId({ xmId: this.xmId })
.then(response => { .then(response => {
console.log('API response:', response); // console.log('API response:', response);
if (response.code === 200 && response.data) { if (response.code === 200 && response.data) {
this.buildings = Object.values(response.data); // this.buildings = Object.values(response.data); //
console.log('Buildings data after assignment:', this.buildings); // console.log('Buildings data after assignment:', this.buildings);
// //
if (this.buildings.length > 0) { if (this.buildings.length > 0) {
this.selectedBuilding = this.buildings[0]; this.selectedBuilding = this.buildings[0];
} }
} else { } else {}
console.error('数据格式不正确:', response);
}
}) })
}, },

@ -232,16 +232,14 @@ export default {
size: this.pagination.pageSize size: this.pagination.pageSize
}; };
return getqyBasicInformationPage(params).then(response => { return getqyBasicInformationPage(params).then(response => {
console.log('Fetched Data:', response.data.records); // console.log('Fetched Data:', response.data.records);
this.tableData = response.data.records.map(item => ({ this.tableData = response.data.records.map(item => ({
...item, ...item,
isEditing: false isEditing: false
})); }));
console.log('Table Data:', this.tableData); // console.log('Table Data:', this.tableData);
this.pagination.total = response.data.total; this.pagination.total = response.data.total;
}).catch(error => { }).catch();
console.error('获取数据失败:', error);
});
}, },
// / // /

@ -246,8 +246,7 @@ export default {
}, },
// //
getCurrentUserName() { getCurrentUserName() {
// Vuex store return this.$store.state.user.name;
return this.$store.state.user.name; //
}, },
// //
formatDateTime(dateTime) { formatDateTime(dateTime) {

@ -74,7 +74,7 @@ export default {
], ],
currentPage: 1, currentPage: 1,
pageSize: 10, pageSize: 10,
total: 40, total: 0,
} }
}, },
methods: { methods: {

@ -235,7 +235,7 @@ export default {
// anotherInfo // anotherInfo
this.anotherInfo.push({ this.anotherInfo.push({
id: response.data.id, // ID id: response.data.id,
zdname: this.form.zdname, zdname: this.form.zdname,
zdinfor: this.form.zdinfor zdinfor: this.form.zdinfor
}); });

@ -41,14 +41,7 @@
</div> </div>
</div> </div>
<div class="descriptionsdivtwo"> <div class="descriptionsdivtwo">
<div class="tablehead"> <spanmanage :xmId=this.id></spanmanage>
<img src="@/assets/images/标签管理.png" alt="">
<span style="margin-top: -0.3rem;">标签管理</span>
<!-- <span style="margin-top: .3rem;"></span> -->
</div>
<div class="tablebody">
<div>123</div>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -56,9 +49,14 @@
<script> <script>
import * as echarts from 'echarts'; import * as echarts from 'echarts';
import { getpicture, getpicturelist } from '@/api/ManageApi/index'; import { getpicture, getpicturelist } from '@/api/ManageApi/index';
import spanmanage from '@/views/components/ProjectDetails/spanmanage.vue';
export default { export default {
components: {
spanmanage,
},
props: { props: {
size: { size: {
type: String, type: String,
@ -81,6 +79,7 @@ export default {
}; };
}, },
mounted() { mounted() {
// console.log("" + this.id);
this.fetchData(); this.fetchData();
this.fetchDescriptionData(); this.fetchDescriptionData();
}, },
@ -92,9 +91,7 @@ export default {
this.processData(response.data); this.processData(response.data);
this.initChart(); this.initChart();
}) })
.catch(error => { .catch();
console.error('获取项目画像失败:', error);
});
} }
}, },
fetchDescriptionData() { fetchDescriptionData() {
@ -103,9 +100,7 @@ export default {
.then(response => { .then(response => {
this.processDescriptionData(response.data); this.processDescriptionData(response.data);
}) })
.catch(error => { .catch();
console.error('获取项目画像解释说明失败:', error);
});
} }
}, },
processData(data) { processData(data) {
@ -144,7 +139,7 @@ export default {
const data = elementMap[element]; const data = elementMap[element];
evaluations.push({ evaluations.push({
element: element, element: element,
ranking: data.project // pjpm ranking: data.project
}); });
projectData.push(data.project); projectData.push(data.project);
medianData.push(data.median); medianData.push(data.median);
@ -158,7 +153,6 @@ export default {
}, },
processDescriptionData(data) { processDescriptionData(data) {
// //
// data
this.descriptionData = data; this.descriptionData = data;
}, },
initChart() { initChart() {
@ -196,9 +190,9 @@ export default {
x2: 0, x2: 0,
y2: 1, y2: 1,
colorStops: [{ colorStops: [{
offset: 0, color: 'rgba(43, 98, 241, 0.3)' // offset: 0, color: 'rgba(43, 98, 241, 0.3)' //
}, { }, {
offset: 1, color: 'rgba(43, 98, 241, 0)' // offset: 1, color: 'rgba(43, 98, 241, 0)' //
}] }]
} }
} }
@ -248,6 +242,7 @@ export default {
.content { .content {
padding: 1rem; padding: 1rem;
display: flex; display: flex;
width: 100%;
} }
.containertop { .containertop {
@ -290,12 +285,13 @@ export default {
} }
.descriptionsdiv { .descriptionsdiv {
width: 20rem; width: 24rem;
margin-left: 10rem; margin-left: 5rem;
height: 25.31rem; height: 25.31rem;
} }
.descriptionsdivtwo { .descriptionsdivtwo {
width: 20rem; width: 27rem;
margin-left: 3rem; margin-left: 3rem;
height: 25.31rem; height: 25.31rem;
} }

@ -74,7 +74,7 @@ export default {
// //
onload() { onload() {
console.log('地图加载完成'); // console.log('');
}, },
// //

@ -1,444 +0,0 @@
<template>
<div class="container">
<!-- 顶部信息 -->
<div class="containertop">
<div class="topleft">
<img src="../../../assets/images/detailsicon/1.png" alt="">
<span>建筑信息</span>
</div>
<div class="topright">
<el-button type="primary" size="medium" plain
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;" @click="addBuildingTag">
<img src="../../../assets/images/detailsicon/icon-xz@2x.png" alt="新增"
style="width: 0.6rem; height: 0.6rem; margin-right: 4px;">
新增
</el-button>
<el-button type="primary" size="medium" plain
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;"
@click="handleEdit(selectedBuilding)">
<img src="../../../assets/images/detailsicon/icon-bj@2x.png" alt="编辑"
style="width: 0.6rem; height: 0.6rem; margin-right: 4px;">
编辑
</el-button>
<el-button type="primary" size="medium" plain
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;">
<i class="el-icon-download" style="width: 0.6rem; height: 0.6rem; margin-right: 4px;"></i>
导入
</el-button>
<el-button type="primary" size="medium" plain
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;">
<img src="../../../assets/images/detailsicon/icon-dc@2x.png" alt="导出"
style="width: 0.6rem; height: 0.6rem; margin-right: 4px;">
导出
</el-button>
</div>
</div>
<!-- 栋数楼栋名称 -->
<div class="tagdiv">
<div v-for="building in buildings" :key="building.id" @click="selectBuilding(building.id)"
:class="['tagitem', { 'important-building': building.sfwzyld === 1 }]">
<img src="@/assets/images/detailsicon/icon-楼栋@2x.png" alt="">
<span>{{ building.name }}</span>
<img src="@/assets/images/detailsicon/icon-gb@2x.png" alt="删除" @click.stop="handleDelete(building.id)">
</div>
</div>
<!-- 内容区 -->
<div class="content" v-if="selectedBuilding">
<div class="descriptionsdiv">
<el-descriptions class="margin-top" :column="4" border>
<el-descriptions-item>
<template slot="label">是否为重要楼栋</template>
{{ getTextForBoolean(selectedBuilding.sfwzyld) }}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">层数</template>
{{ selectedBuilding.floor }}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">总建筑高度</template>
{{ selectedBuilding.totalBuildingHeight }}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">首层高度平方米</template>
{{ selectedBuilding.scgd }}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">2至4层层高</template>
{{ selectedBuilding.twoAndFourCg }}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">4层以上层高()</template>
{{ selectedBuilding.fourYscg }}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">首层地面荷载(/)</template>
{{ selectedBuilding.scdmhz }}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">二至三层楼面荷载(/平方米)</template>
{{ selectedBuilding.twoAndThreeLmhz }}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">标准层面积(千平方米)</template>
{{ selectedBuilding.bzcmj }}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">柱距</template>
{{ selectedBuilding.zj }}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">是否有吊装口</template>
{{ getTextForBoolean(selectedBuilding.sfydzk) }}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">是否有汽车盘道</template>
{{ getTextForBoolean(selectedBuilding.sfyqcpd) }}
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">四层及以上楼面荷载(/平方米)</template>
{{ selectedBuilding.fourYslmhz }}
</el-descriptions-item>
</el-descriptions>
</div>
</div>
<!-- 新增楼栋弹窗 -->
<el-dialog title="新增楼栋" :visible.sync="dialogVisible" width="65%">
<el-form :model="buildingForm" label-width="230px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="楼栋名称:">
<el-input v-model="buildingForm.name"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否为重要楼栋:">
<el-select v-model="buildingForm.sfwzyld" placeholder="请选择" style="width: 22.5rem;">
<el-option v-for="dict in dict.type.isno" :key="dict.value" :label="dict.label"
:value="parseInt(dict.value)"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="首层高度(米):">
<el-input v-model="buildingForm.scgd"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="层数:">
<el-input v-model="buildingForm.floor"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="4层以上层高">
<el-input v-model="buildingForm.fourYscg"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="柱距:">
<el-input v-model="buildingForm.zj"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="2至4层层高">
<el-input v-model="buildingForm.twoAndFourCg"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="总建筑高度(米):">
<el-input v-model="buildingForm.totalBuildingHeight"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="首层地面荷载(吨/平方米):">
<el-input v-model="buildingForm.scdmhz"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="二至三层楼面荷载(吨/平方米):">
<el-input v-model="buildingForm.twoAndThreeLmhz"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="标准层面积(千平方米):">
<el-input v-model="buildingForm.bzcmj"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否有汽车盘道:">
<el-select v-model="buildingForm.sfyqcpd" placeholder="请选择" style="width: 22.5rem;">
<el-option v-for="dict in dict.type.isno" :key="dict.value" :label="dict.label"
:value="parseInt(dict.value)"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="是否有吊装口:">
<el-select v-model="buildingForm.sfydzk" placeholder="请选择" style="width: 22.5rem;">
<el-option v-for="dict in dict.type.isno" :key="dict.value" :label="dict.label"
:value="parseInt(dict.value)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="四层及以上楼面荷载(吨/平方米):">
<el-input v-model="buildingForm.fourYslmhz"></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="handleAddBuilding"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
export default {
dicts: ['isno'],
props: {
size: {
type: String,
default: ''
},
buildingInfo: {
type: Array,
required: true
}
},
data() {
return {
dialogVisible: false,
buildings: [],
selectedBuilding: null,
buildingForm: {
bzcmj: 0,
createBy: '',
createId: 0,
createTime: '',
floor: 0,
fourYscg: 0,
fourYslmhz: 0,
id: 0,
name: '',
scdmhz: 0,
scgd: 0,
sfwzyld: 0,
sfydzk: 0,
sfyqcpd: 0,
totalBuildingHeight: 0,
twoAndFourCg: 0,
twoAndThreeLmhz: 0,
updateBy: '',
updateId: 0,
updateTime: '',
xmId: 0,
zj: 0
}
};
},
watch: {
buildingInfo: {
handler(newVal) {
this.buildings = newVal || [];
//
this.selectedBuilding = this.buildings.length > 0
? this.buildings[0]
: null;
},
immediate: true,
deep: true
}
},
methods: {
// 12
getTextForBoolean(value) {
return value === 1 ? '是' : '否';
},
//
getTagItemClass(building) {
return {
'important-building': building.sfwzyld === 1,
};
},
//
addBuildingTag() {
this.dialogVisible = true;
this.buildingForm = {
bzcmj: 0,
createBy: '',
createId: 0,
createTime: '',
floor: 0,
fourYscg: 0,
fourYslmhz: 0,
id: 0,
name: '',
scdmhz: 0,
scgd: 0,
sfwzyld: 0,
sfydzk: 0,
sfyqcpd: 0,
totalBuildingHeight: 0,
twoAndFourCg: 0,
twoAndThreeLmhz: 0,
updateBy: '',
updateId: 0,
updateTime: '',
xmId: this.xmId,
zj: 0
};
},
selectBuilding(id) {
console.log('Selected building ID:', id);
this.selectedBuilding = this.buildings.find(building => building.id === id);
},
handleAddBuilding() {
//
this.$message.success(this.buildingForm.id ? '更新成功' : '新增成功');
this.dialogVisible = false;
// buildings selectedBuilding
if (this.buildingForm.id) {
//
const index = this.buildings.findIndex(building => building.id === this.buildingForm.id);
if (index !== -1) {
this.buildings.splice(index, 1, { ...this.buildingForm });
}
} else {
//
this.buildingForm.id = this.buildings.length + 1; // ID
this.buildings.push({ ...this.buildingForm });
}
this.selectedBuilding = { ...this.buildingForm };
},
handleDelete(id) {
console.log('Deleting building with ID:', id); //
this.$confirm('你确认删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
//
this.$message.success('删除成功');
//
this.buildings = this.buildings.filter(building => building.id !== id);
if (this.selectedBuilding && this.selectedBuilding.id === id) {
this.selectedBuilding = null;
}
}).catch(() => {
this.$message.info('已取消删除');
});
},
handleEdit(building) {
this.dialogVisible = true;
this.buildingForm = { ...building }; //
}
}
};
</script>
<style scoped>
.container {
display: flex;
flex-direction: column;
width: 100%;
background-color: #FFFFFF;
box-shadow: 0rem 0.13rem 0.63rem 0rem rgba(177, 177, 177, 0.1);
border-radius: 0.5rem 0.5rem 0.5rem 0.5rem;
}
.content {
padding: 1rem;
display: flex;
}
.containertop {
height: auto;
display: flex;
justify-content: space-between;
padding: .7rem 0;
padding: .5rem;
border-bottom: 1px solid #E5E5E5;
}
.topleft {
width: 8rem;
display: flex;
gap: 0.4rem;
align-items: center;
}
.topleft img {
width: 0.81rem;
height: 0.81rem;
}
.topleft span {
width: auto;
height: 0.88rem;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 500;
font-size: 0.88rem;
color: #3D424C;
line-height: 0.88rem;
text-align: right;
font-style: normal;
text-transform: none;
}
.descriptionsdiv {
width: 100%;
margin-left: 1rem;
height: auto;
}
.tagdiv {
padding: 1rem 2rem 1rem 2rem;
display: flex;
}
.tagdiv img {
width: 1.4rem;
height: 1.5rem;
}
.tagdiv span {
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 400;
font-size: 0.88rem;
color: #808080;
line-height: 0.88rem;
text-align: right;
font-style: normal;
text-transform: none;
}
.tagitem {
width: 6.25rem;
height: 2rem;
background: #FAFAFA;
border-radius: 2.13rem 2.13rem 2.13rem 2.13rem;
display: flex;
justify-content: space-around;
align-items: center;
cursor: pointer;
}
.important-building {
background-color: rgba(43, 98, 241, 0.1);
}
</style>

@ -1,266 +0,0 @@
<template>
<div class="container">
<!-- 顶部信息 -->
<div class="containertop">
<div class="topleft">
<img src="../../../assets/images/detailsicon/1.png" alt="">
<span>企业入驻信息</span>
</div>
<div class="topright">
<el-button type="primary" size="medium" plain
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;">
<img src="../../../assets/images/detailsicon/icon-bj@2x.png" alt="编辑"
style="width: 0.6rem; height: 0.6rem; margin-right: 4px;">
编辑
</el-button>
<el-button type="primary" size="medium" plain
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;">
<img src="../../../assets/images/detailsicon/icon-dc@2x.png" alt="编辑"
style="width: 0.6rem; height: 0.6rem; margin-right: 4px;">
导出
</el-button>
</div>
</div>
<!-- 内容区上方的表格 -->
<div class="tagdiv">
<div class="descriptionsdiv">
<el-descriptions class="margin-top" :column="4" border>
<el-descriptions-item>
<template slot="label">
入驻企业数
</template>
18100000000
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
入驻企业行业类型
</template>
苏州市
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
人员数量
</template>
kooriookami
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
入住率%
</template>
18100000000
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
已出租面积平方米
</template>
苏州市
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
空置出租面积平方米
</template>
kooriookami
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
工业厂房平均租金/平方米*
</template>
18100000000
</el-descriptions-item>
<el-descriptions-item>
<template slot="label">
工业厂房平均物业费(/平方米*)
</template>
苏州市
</el-descriptions-item>
</el-descriptions>
</div>
</div>
<!-- 内容区 -->
<div class="content">
<div class="descriptionsdiv">
<div class="spandiv" @click="openDialog"><span>新增企业入驻</span></div>
<el-table :data="tableData" style="width: 100%">
<el-table-column prop="address" label="序号" width="200">
</el-table-column>
<el-table-column prop="name" label="企业名称" width="300">
<template slot-scope="scope">
<span style="color: #2B62F1;">{{ scope.row.name }}</span>
</template>
</el-table-column>
<el-table-column prop="number" label="统一社会信用代码" width="300">
</el-table-column>
<el-table-column prop="name" label="所属行业" width="300">
</el-table-column>
<el-table-column prop="data" label='租金价格' width="250">
</el-table-column>
<el-table-column label="操作" width="200" align="center">
<template slot-scope="scope">
<el-button v-if="scope.row.isEditing" size="mini" type="text" icon="el-icon-check" >保存</el-button>
<el-button v-else size="mini" type="text" icon="el-icon-edit" >编辑</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" style="color: #F25353;">删除</el-button>
</template>
</el-table-column>
</el-table>
<div class="block">
<div style="visibility: hidden;"></div>
<el-pagination :current-page="4" :page-sizes="[100, 200, 300, 400]" :page-size="100"
layout="total, prev, pager, next, jumper" :total="400">
</el-pagination>
</div>
</div>
</div>
<!-- 弹窗 -->
<el-dialog title="企业入驻" :visible.sync="dialogVisible" width="400px" append-to-body>
<el-upload>
<i class="el-icon-upload" style="margin-left: 7rem;"></i>
<div class="el-upload__text" style="margin-left: 7rem;"><em>点击上传</em></div>
<div class="el-upload__tip text-center" slot="tip" style="margin-top: -1.5rem; margin-left: 9rem;">
<!-- <div class="el-upload__tip" slot="tip">
<el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的用户数据
</div> -->
<!-- <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"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
export default {
data() {
return {
tableData: [
{
date: '2016-05-02',
name: '大众电脑生成制造基地',
number: 123456,
address: ' 1518 弄',
data: '1000',
status: '在建'
},
{
date: '2016-05-04',
name: '大众电脑生成制造基地',
address: ' 1517 弄',
number: 123456,
data: '1500',
status: '拟建'
},
{
date: '2016-05-01',
name: '大众电脑生成制造基地',
address: ' 1519 弄',
number: 123456,
data: '2000',
status: '已建'
},
{
date: '2016-05-03',
name: '大众电脑生成制造基地',
address: ' 1516 弄',
number: 123456,
data: '2500',
status: '在建'
}
],
dialogVisible: false, //
}
},
methods: {
openDialog() {
this.dialogVisible = true; //
}
}
}
</script>
<style scoped>
.container {
display: flex;
flex-direction: column;
width: 100%;
background-color: #FFFFFF;
box-shadow: 0rem 0.13rem 0.63rem 0rem rgba(177, 177, 177, 0.1);
border-radius: 0.5rem 0.5rem 0.5rem 0.5rem;
}
.content {
padding: 1rem;
display: flex;
}
.containertop {
height: auto;
display: flex;
justify-content: space-between;
padding: .7rem 0;
padding: .5rem;
border-bottom: 1px solid #E5E5E5;
}
.topleft {
width: 8rem;
display: flex;
gap: 0.4rem;
align-items: center;
}
.topleft img {
width: 0.81rem;
height: 0.81rem;
}
.topleft span {
width: auto;
height: 0.88rem;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 500;
font-size: 0.88rem;
color: #3D424C;
line-height: 0.88rem;
text-align: right;
font-style: normal;
text-transform: none;
}
.picturediv {
width: 18.31rem;
height: 25.31rem;
background-color: lightblue;
}
.descriptionsdiv {
width: 100%;
margin-left: 1rem;
height: auto;
}
.two-row-item {
height: 20rem;
}
.tagdiv {
padding: 1rem 3em 1rem 1rem;
}
.block {
width: 100%;
display: flex;
justify-content: space-between;
margin-top: 1rem;
}
.spandiv {
padding: 0 0 1rem 0;
color: #0052D9;
font-size: .8rem;
cursor: pointer;
}
</style>

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

@ -0,0 +1,425 @@
<template>
<div class="descriptionsdivtwo">
<div class="tablehead">
<div class="headleft">
<img style="width: 1.2rem;height: 1.13rem;" src="@/assets/images/标签管理.png" alt="">
<span style="margin-top: -0.1rem;">标签管理</span>
</div>
<div class="headright" @click="showAddTagModal" v-if="(action === 'fill' || !action || action === 'okay') && checkRole(['admin', 'common'])">
添加标签
</div>
</div>
<!-- 按照type分组显示 -->
<div class="type-group" v-for="group in groupedTags" :key="group.type">
<div class="group-title" @click="toggleGroup(group.type)">
<div>
<i :class="isGroupOpen(group.type) ? 'el-icon-arrow-up' : 'el-icon-arrow-down'"></i>
{{ TypeMap[group.type] }}
</div>
<div v-if="(action === 'fill' || !action || action === 'okay') && checkRole(['admin', 'common'])">
<el-button size="mini" type="text" icon="el-icon-delete" style="color: #F25353;"
@click.stop="handleDeleteType(group.type)" :disabled="isSaving">删除</el-button>
</div>
</div>
<div class="tablebody" v-if="isGroupOpen(group.type)">
<el-table :data="group.list" style="width: 100%;" v-loading="loading">
<el-table-column prop="name" label="标签名称" width="260">
<template slot-scope="scope">
<div v-if="!scope.row.editing">{{ scope.row.name }}</div>
<el-input v-else v-model="scope.row.editName" size="small"
@keyup.enter.native="saveEdit(scope.row)" @blur="saveEdit(scope.row)"></el-input>
</template>
</el-table-column>
<el-table-column label="操作" width="155">
<template slot-scope="scope">
<div
v-if="(action === 'fill' || !action || action === 'okay') && checkRole(['admin', 'common'])">
<el-button size="mini" @click="startEdit(scope.row)" v-if="!scope.row.editing"
:disabled="isSaving">编辑</el-button>
<el-button size="mini" type="success" @click="saveEdit(scope.row)" v-else
:loading="isSaving">保存</el-button>
<el-button size="mini" type="danger" @click="handleDelete(scope.row)"
:disabled="scope.row.editing || isSaving">删除</el-button>
</div>
<div v-else style="color: #ccc;">
当前不可操作
</div>
</template>
</el-table-column>
</el-table>
</div>
</div>
<!-- 添加标签弹窗 -->
<el-dialog title="添加标签" :visible.sync="tagModalVisible" width="30%" :close-on-click-modal="false"
@closed="resetForm">
<el-form :model="tagForm" :rules="rules" ref="tagForm" label-width="100px">
<el-form-item label="标签类型" prop="type">
<el-select v-model="tagForm.type" placeholder="请选择标签类型" style="width: 27.2rem;">
<el-option v-for="dict in dict.type.bqlx" :key="dict.value" :label="dict.label"
:value="dict.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="标签名称" prop="name">
<el-input v-model="tagForm.name" placeholder="请输入标签名称" style="width: 27.2rem;"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="tagModalVisible = false"> </el-button>
<el-button type="primary" @click="submitForm"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { getallspan, addspan, updatspan, deletespan } from '@/api/manageApitwo/index';
import { checkPermi, checkRole } from "@/utils/permission";
export default {
dicts: ['bqlx'],
props: {
xmId: {
type: Number,
required: true
},
action: {
type: String,
required: true
}
},
data() {
return {
loading: false,
groupedTags: [],
isSaving: false,
tagModalVisible: false,
tagForm: {
type: '',
name: '',
xmId: this.xmId,
createBy: '',
createTime: '',
createId: 0,
id: 0,
updateBy: '',
updateTime: '',
updateId: 0
},
rules: {
type: [{ required: true, message: '请选择标签类型', trigger: 'change' }],
name: [{ required: true, message: '请输入标签名称', trigger: 'blur' }]
},
//
TypeMap: {
1: "新一代信息技术",
2: "高端装备制造",
3: "生物医药及大健康",
4: "纳米技术应用及新材料",
5: "人工智能及数字产业",
6: "新能源及绿色产业"
},
openGroups: []
}
},
computed: {
//
tagList() {
return this.groupedTags.flatMap(group => group.list);
}
},
watch: {
xmId: {
immediate: true,
handler(newVal) {
if (newVal) {
this.fetchTags();
}
}
}
},
methods: {
checkPermi,
checkRole,
//
isGroupOpen(type) {
return this.openGroups.includes(type);
},
//
toggleGroup(type) {
const index = this.openGroups.indexOf(type);
if (index >= 0) {
this.openGroups.splice(index, 1);
} else {
this.openGroups.push(type);
}
},
//
async fetchTags() {
this.loading = true;
try {
const res = await getallspan({ xmId: this.xmId });
//
this.groupedTags = (res.data || []).map(group => {
return {
...group,
list: group.list.map(item => ({
...item,
editing: false,
editName: item.name
}))
};
});
//
if (this.groupedTags.length > 0 && this.openGroups.length === 0) {
this.openGroups.push(this.groupedTags[0].type);
}
} catch (error) {
console.error('获取标签列表失败:', error);
this.$message.error('获取标签列表失败');
} finally {
this.loading = false;
}
},
showAddTagModal() {
this.tagModalVisible = true;
this.$nextTick(() => {
this.$refs.tagForm && this.$refs.tagForm.clearValidate();
});
},
//
startEdit(row) {
//
if (this.isSaving) return;
//
this.groupedTags.forEach(group => {
group.list.forEach(item => {
if (item.editing && item.id !== row.id) {
item.editing = false;
}
});
});
row.editing = true;
row.editName = row.name;
},
//
async saveEdit(row) {
//
if (this.isSaving) return;
if (!row.editName || row.editName.trim() === '') {
this.$message.warning('标签名称不能为空');
return;
}
if (row.editName === row.name) {
row.editing = false;
return;
}
//
this.isSaving = true;
try {
const now = new Date();
const formattedTime = now.toISOString().replace('T', ' ').substring(0, 19);
const submitData = {
...row,
name: row.editName,
updateTime: formattedTime,
updateBy: this.$store.state.user.name || '',
updateId: this.$store.state.user.id || 0
};
await updatspan(submitData);
this.$message.success('标签更新成功');
//
row.name = row.editName;
row.editing = false;
} catch (error) {
console.error('更新失败:', error);
this.$message.error('标签更新失败');
} finally {
this.isSaving = false;
}
},
submitForm() {
this.$refs.tagForm.validate(async (valid) => {
if (!valid) return;
try {
const now = new Date();
const formattedTime = now.toISOString().replace('T', ' ').substring(0, 19);
const submitData = {
...this.tagForm,
createTime: formattedTime,
updateTime: formattedTime,
createBy: this.$store.state.user.name || '',
updateBy: this.$store.state.user.name || '',
createId: this.$store.state.user.id || 0,
updateId: this.$store.state.user.id || 0
};
await addspan(submitData);
this.$message.success('标签添加成功');
this.tagModalVisible = false;
this.fetchTags();
} catch (error) {
console.error('添加失败:', error);
this.$message.error('标签添加失败');
}
});
},
handleDelete(row) {
this.$confirm('确定要删除该标签吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
try {
await deletespan([row.id]);
this.$message.success('删除成功');
this.fetchTags();
} catch (error) {
console.error('删除失败:', error);
this.$message.error('删除失败');
}
}).catch(() => { });
},
//
async handleDeleteType(type) {
//
const group = this.groupedTags.find(g => g.type === type);
if (!group || group.list.length === 0) {
this.$message.warning('该类型下没有标签');
return;
}
this.$confirm(`确定要删除"${this.TypeMap[type]}"类型及其所有标签吗?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.isSaving = true;
try {
// ID
const tagIds = group.list.map(tag => tag.id);
//
await deletespan(tagIds);
this.$message.success('删除成功');
this.fetchTags(); //
} catch (error) {
console.error('删除失败:', error);
this.$message.error('删除失败');
} finally {
this.isSaving = false;
}
}).catch(() => { });
},
resetForm() {
this.tagForm = {
type: '',
name: '',
xmId: this.xmId,
createBy: '',
createTime: '',
createId: 0,
id: 0,
updateBy: '',
updateTime: '',
updateId: 0
};
this.$refs.tagForm && this.$refs.tagForm.clearValidate();
}
}
}
</script>
<style scoped>
.descriptionsdivtwo {
width: 27rem;
padding: 0 0.5rem 0 0;
margin-left: 3rem;
height: auto;
min-height: 25.31rem;
overflow: auto;
}
.tablehead {
width: 90%;
height: 2.38rem;
display: flex;
align-items: center;
justify-content: space-between;
gap: .3rem;
}
.headleft {
display: flex;
align-items: center;
gap: .2rem;
}
.tablehead img {
width: 1.13rem;
height: 1.13rem;
}
.headright {
margin-top: -0.3rem;
font-size: .8rem;
color: #0052D9;
cursor: pointer;
}
.headright:hover {
text-decoration: underline;
}
.type-group {
margin-bottom: 1.5rem;
}
.group-title {
margin: 1rem 0 0.5rem 0;
/* font-size: 1rem; */
font-family: alimedium;
color: #333;
font-weight: bold;
cursor: pointer;
display: flex;
align-items: center;
gap: 0.5rem;
width: 90%;
justify-content: space-between;
}
.tablebody {
margin-top: 0.5rem;
overflow: hidden;
}
.el-input {
width: 180px;
}
</style>

@ -19,9 +19,9 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div v-if="tableData.length === 0" class="no-data"> <!-- <div v-if="tableData.length === 0" class="no-data">
暂无数据 暂无数据
</div> </div> -->
<!-- 详情弹窗 --> <!-- 详情弹窗 -->
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="40%"> <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="40%">

@ -19,9 +19,9 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div v-if="tableData.length === 0" class="no-data"> <!-- <div v-if="tableData.length === 0" class="no-data">
暂无数据 暂无数据
</div> </div> -->
<!-- 详情弹窗 --> <!-- 详情弹窗 -->
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="40%"> <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="40%">

@ -236,7 +236,6 @@ export default {
checkPermi, checkPermi,
checkRole, checkRole,
loadData() { loadData() {
console.log('Loading data for project ID:', this.projectId);
getzwBasicInformationById(this.projectId).then(response => { getzwBasicInformationById(this.projectId).then(response => {
const data = response.data; const data = response.data;
this.basicInformation = data.basicInformation; this.basicInformation = data.basicInformation;
@ -274,7 +273,7 @@ export default {
} else { } else {
this[dataKey] = updatedData; this[dataKey] = updatedData;
} }
console.log(`接收到 ${dataKey} 更新:`, updatedData); // console.log(` ${dataKey} :`, updatedData);
}, },
isDefault(obj, defaultObj) { isDefault(obj, defaultObj) {
@ -289,7 +288,7 @@ export default {
saveAll() { saveAll() {
this.loading = true; this.loading = true;
const tempData = this.prepareSubmitData(); // const tempData = this.prepareSubmitData(); //
console.log('准备暂存的完整数据:', JSON.stringify(tempData, null, 2)); // // console.log(':', JSON.stringify(tempData, null, 2)); //
tempBasicInformation(tempData) tempBasicInformation(tempData)
.then(response => { .then(response => {
this.$message.success('暂存成功'); this.$message.success('暂存成功');
@ -307,7 +306,7 @@ export default {
submitAll() { submitAll() {
this.loading = true; this.loading = true;
const submitData = this.prepareSubmitData(); const submitData = this.prepareSubmitData();
console.log('准备提交的完整数据:', JSON.stringify(submitData, null, 2)); // // console.log(':', JSON.stringify(submitData, null, 2)); //
fillBasicInformation(submitData) fillBasicInformation(submitData)
.then(response => { .then(response => {
this.$message.success('提交成功'); this.$message.success('提交成功');
@ -326,7 +325,7 @@ export default {
auditBasicInformation(submitData) auditBasicInformation(submitData)
.then(response => { .then(response => {
console.log('提交成功:', response); // console.log(':', response);
this.$message.success('审核通过'); this.$message.success('审核通过');
this.isSubmitted = true; this.isSubmitted = true;
this.$router.push('/manage'); this.$router.push('/manage');
@ -342,7 +341,7 @@ export default {
auditBasicInformation(submitData) auditBasicInformation(submitData)
.then(response => { .then(response => {
console.log('提交成功:', response); // console.log(':', response);
this.$message.success('修改成功'); this.$message.success('修改成功');
this.isSubmitted = true; this.isSubmitted = true;
this.$router.push('/manage'); this.$router.push('/manage');

@ -287,7 +287,7 @@ export default {
saveAll() { saveAll() {
this.loading = true; this.loading = true;
const tempData = this.prepareSubmitData(); // const tempData = this.prepareSubmitData(); //
console.log('准备暂存的完整数据:', JSON.stringify(tempData, null, 2)); // // console.log(':', JSON.stringify(tempData, null, 2)); //
tempBasicInformation(tempData) tempBasicInformation(tempData)
.then(response => { .then(response => {
this.$message.success('暂存成功'); this.$message.success('暂存成功');
@ -316,7 +316,7 @@ export default {
async submitAll() { async submitAll() {
this.loading = true; this.loading = true;
// wysmxInformations null // wysmxInformations
if (this.wysmxInformations.length === 0 || this.wysmxInformations.includes(null)) { if (this.wysmxInformations.length === 0 || this.wysmxInformations.includes(null)) {
this.$message.error('请填写模型管理信息'); this.$message.error('请填写模型管理信息');
this.loading = false; this.loading = false;
@ -331,7 +331,7 @@ export default {
return; return;
} }
// planInformation // planInformation
const planRequiredFields = ['zydmj', 'rjl', 'zjzmj', 'jzds', 'zgjzcs', 'fhdj']; const planRequiredFields = ['zydmj', 'rjl', 'zjzmj', 'jzds', 'zgjzcs', 'fhdj'];
const planMissingFields = planRequiredFields.filter(field => !this.planInformation[field]); const planMissingFields = planRequiredFields.filter(field => !this.planInformation[field]);
if (planMissingFields.length > 0) { if (planMissingFields.length > 0) {
@ -340,7 +340,7 @@ export default {
return; return;
} }
// basicInformation // basicInformation
const basicRequiredFields = ['ssgnq', 'begainTime', 'endTime', 'xzfl', 'jsms']; const basicRequiredFields = ['ssgnq', 'begainTime', 'endTime', 'xzfl', 'jsms'];
const basicMissingFields = basicRequiredFields.filter(field => !this.basicInformation[field]); const basicMissingFields = basicRequiredFields.filter(field => !this.basicInformation[field]);
if (basicMissingFields.length > 0) { if (basicMissingFields.length > 0) {
@ -351,9 +351,9 @@ export default {
// //
const submitData = this.prepareSubmitData(); const submitData = this.prepareSubmitData();
console.log('准备提交的完整数据:', JSON.stringify(submitData, null, 2)); // // console.log(':', JSON.stringify(submitData, null, 2)); //
fillBasicInformation(submitData) fillBasicInformation(submitData)
.then(response => { .then(response => {

@ -155,7 +155,7 @@ export default {
getList() { getList() {
this.loading = true; this.loading = true;
// isFmqd=2 // isFmqd=2
const params = { const params = {
...this.queryParams, ...this.queryParams,
isFmqd: 1 isFmqd: 1

@ -1,6 +1,6 @@
<template> <template>
<div> <div>
<!-- 政务端页面 --> <!-- 产业标签 -->
<!-- 表单查询项 --> <!-- 表单查询项 -->
<div class="headerbox"> <div class="headerbox">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch"
@ -8,25 +8,25 @@
<el-row> <el-row>
<el-col :span="5"> <el-col :span="5">
<el-form-item label="企业名称" style="width: 100%;"> <el-form-item label="企业名称" style="width: 100%;">
<el-input v-model="queryParams.name" placeholder="请输入项目名称" clearable <el-input v-model="queryParams.name" placeholder="请输入企业名称" clearable
@keyup.enter.native="handleQuery" /> @keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="5"> <el-col :span="5">
<el-form-item label="标签代码" style="width: 100%;"> <el-form-item label="标签代码" style="width: 100%;">
<el-input v-model="queryParams.name" placeholder="请输入项目名称" clearable <el-input v-model="queryParams.bqdm" placeholder="请输入标签代码" clearable
@keyup.enter.native="handleQuery" /> @keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="5"> <el-col :span="5">
<el-form-item label="标签状态" style="width: 100%;"> <el-form-item label="标签状态" style="width: 100%;">
<el-input v-model="queryParams.name" placeholder="请输入项目名称" clearable <el-input v-model="queryParams.bqzt" placeholder="请输入标签状态" clearable
@keyup.enter.native="handleQuery" /> @keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="5"> <el-col :span="5">
<el-form-item label="用户类型"> <el-form-item label="用户类型">
<el-input v-model="queryParams.xmfrdwxz" placeholder="请输入项目名称" clearable <el-input v-model="queryParams.yhlx" placeholder="请输入用户类型" clearable
@keyup.enter.native="handleQuery" /> @keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -45,7 +45,6 @@
<!-- 表格内容区 --> <!-- 表格内容区 -->
<div class="tablebox"> <div class="tablebox">
<el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange" stripe> <el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange" stripe>
<!-- <el-table-column type="selection" width="55" align="center" /> -->
<el-table-column label="序号" align="center"> <el-table-column label="序号" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
{{ (scope.$index + 1) + (queryParams.current - 1) * queryParams.size }} {{ (scope.$index + 1) + (queryParams.current - 1) * queryParams.size }}
@ -53,11 +52,11 @@
</el-table-column> </el-table-column>
<el-table-column label="企业名称" align="center" prop="name" width="200" /> <el-table-column label="企业名称" align="center" prop="name" width="200" />
<el-table-column label="统一信用代码" align="center" prop="tyshxydm" width="200" /> <el-table-column label="统一信用代码" align="center" prop="tyshxydm" width="200" />
<el-table-column label="标签代码" align="center" prop="xzfl" /> <el-table-column label="标签代码" align="center" prop="bqdm" />
<el-table-column label="有效状态" align="center" prop="xmfrdwxz" width="200" /> <el-table-column label="有效状态" align="center" prop="state" width="200" />
<el-table-column label="用户类型" align="center" width="130" prop="ztze" /> <el-table-column label="用户类型" align="center" width="130" prop="yhlx" />
<el-table-column label="标签注释" align="center" width="180" prop="zydmj" /> <el-table-column label="标签注释" align="center" width="180" prop="bqzs" />
<el-table-column label="标签状态" align="center" prop="status" /> <el-table-column label="标签状态" align="center" prop="bqzt" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button size="mini" type="text" @click="getAdd(scope.row, 'detail')">详情</el-button> <el-button size="mini" type="text" @click="getAdd(scope.row, 'detail')">详情</el-button>
@ -71,8 +70,9 @@
</template> </template>
<script> <script>
import { getCybqInformationPage} from "@/api/ManageApi/index"; import { getCybqInformationPage } from "@/api/ManageApi/index";
import { checkPermi, checkRole } from "@/utils/permission"; import { checkPermi, checkRole } from "@/utils/permission";
export default { export default {
dicts: ["xzfl"], dicts: ["xzfl"],
data() { data() {
@ -95,9 +95,10 @@ export default {
queryParams: { queryParams: {
current: 1, current: 1,
size: 10, size: 10,
xzfl: undefined, bqdm: undefined,
bqzt: undefined,
yhlx: undefined,
name: undefined, name: undefined,
xmfrdwxz: undefined,
startTime: undefined, startTime: undefined,
endTime: undefined, endTime: undefined,
status: undefined, status: undefined,
@ -114,43 +115,21 @@ export default {
getList() { getList() {
this.loading = true; this.loading = true;
// isFmqd=2 //api
const params = { getCybqInformationPage(this.queryParams).then((response) => {
...this.queryParams,
isFmqd: 1
};
getBasicInformationPage(params).then((response) => {
this.postList = response.data.records; this.postList = response.data.records;
this.total = response.data.total; this.total = response.data.total;
this.loading = false; this.loading = false;
}).catch(error => { }).catch();
console.error('API请求错误:', error);
this.loading = false;
});
}, },
// //
handleSelectionChange(selection) { handleSelectionChange(selection) {
this.ids = selection.map(item => item.id); this.ids = selection.map(item => item.id);
this.single = selection.length !== 1; this.single = selection.length !== 1;
this.multiple = !selection.length; this.multiple = !selection.length;
}, },
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal
.confirm('是否确认删除项目id为"' + ids + '"的数据项?')
.then(() => {
return deleteBasicInformation(ids);
})
.then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
})
.catch(() => { });
},
/** 详情按钮操作 */ /** 详情按钮操作 */
getAdd(row, type) { getAdd(row, type) {
this.$store.commit("SET_CRUMBS", this.$route.meta.title + "新增"); this.$store.commit("SET_CRUMBS", this.$route.meta.title + "新增");
@ -162,13 +141,13 @@ export default {
this.queryParams = { this.queryParams = {
current: 1, current: 1,
size: 10, size: 10,
xzfl: undefined, bqdm: undefined,
bqzt: undefined,
yhlx: undefined,
name: undefined, name: undefined,
xmfrdwxz: undefined,
startTime: undefined, startTime: undefined,
endTime: undefined, endTime: undefined,
status: undefined, status: undefined,
isFmqd: 1
}; };
this.getList(); this.getList();
}, },
@ -181,6 +160,7 @@ export default {
} }
}; };
</script> </script>
<style scoped> <style scoped>
.headerbox { .headerbox {
background-color: #fff; background-color: #fff;

@ -222,7 +222,6 @@ export default {
querySearchAsync(queryString, cb) { querySearchAsync(queryString, cb) {
let results = []; let results = [];
// getAllCatalogs API
getAllCatalogs({ gydl: queryString }).then(res => { getAllCatalogs({ gydl: queryString }).then(res => {
res.data.records.forEach(item => { res.data.records.forEach(item => {
results.push({ results.push({

@ -260,7 +260,6 @@ export default {
querySearchAsync(queryString, cb) { querySearchAsync(queryString, cb) {
let results = []; let results = [];
// getXfcyglPage API
getXfcyglPage({ cyxf: queryString }).then(res => { getXfcyglPage({ cyxf: queryString }).then(res => {
res.data.records.forEach(item => { res.data.records.forEach(item => {
results.push({ results.push({

@ -199,7 +199,7 @@ export default {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
border: 1px solid #ccc; border: 1px solid #ccc;
margin: 0 1rem 0 0; margin: 0 1rem 0.5rem 0;
} }
.itemleft { .itemleft {

@ -15,9 +15,18 @@ const port = process.env.port || process.env.npm_config_port || 80 // 端口
//官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions //官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions
// 这里只列一部分,具体配置参考文档 // 这里只列一部分,具体配置参考文档
module.exports = { module.exports = {
// 预览docx
configureWebpack: {
resolve: {
alias: {
'vue-demi': path.resolve(__dirname, 'node_modules/vue-demi/lib/v2/index.js')
}
}
},
// 部署生产环境和开发环境下的URL。 // 部署生产环境和开发环境下的URL。
// 默认情况下Vue CLI 会假设你的应用是被部署在一个域名的根路径上 // 默认情况下Vue CLI 会假设你的应用是被部署在一个域名的根路径上
// 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。 // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。
// 例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
publicPath: process.env.NODE_ENV === "production" ? "/demo/Gyyq-Upstairs" : "/", publicPath: process.env.NODE_ENV === "production" ? "/demo/Gyyq-Upstairs" : "/",
// 在npm run build 或 yarn build 时 生成文件的目录名称要和baseUrl的生产环境路径一致默认dist // 在npm run build 或 yarn build 时 生成文件的目录名称要和baseUrl的生产环境路径一致默认dist
outputDir: 'dist', outputDir: 'dist',
@ -37,8 +46,8 @@ 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.108:7071/`, target: `http://192.168.0.106:7071/`,
target: `http://39.101.188.84:7071/`, // target: `http://39.101.188.84:7071/`,
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: '' ['^' + process.env.VUE_APP_BASE_API]: ''

Loading…
Cancel
Save