明树Git Lab

Commit f89eef28 authored by zhanghan's avatar zhanghan

1

parent 6c6712a9
Pipeline #108703 passed with stage
in 20 seconds
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
<img src="@/assets/images/logo.png" alt="" /> <img src="@/assets/images/logo.png" alt="" />
<div class="Split"></div> <div class="Split"></div>
<div class="header_subtitle">投资决策分析系统</div> <div class="header_subtitle">投资决策分析系统</div>
<!-- <span class="city-name">123123</span> -->
</div> </div>
<div class="header-right"> <div class="header-right">
<div class="message-wrap" @click="toMessagePage"> <div class="message-wrap" @click="toMessagePage">
...@@ -22,8 +21,8 @@ ...@@ -22,8 +21,8 @@
</div> </div>
<div class="Split"></div> <div class="Split"></div>
<span class="avatar"> <span class="avatar">
<el-icon size="20"><Avatar /></el-icon <el-icon size="20"><Avatar /></el-icon>
></span> </span>
<el-dropdown @visible-change="changeVisible"> <el-dropdown @visible-change="changeVisible">
<span class="username"> <span class="username">
{{ userInfo.name }} {{ userInfo.name }}
...@@ -85,7 +84,9 @@ import { useRouter, useRoute } from "vue-router"; ...@@ -85,7 +84,9 @@ import { useRouter, useRoute } from "vue-router";
import { useUserStore } from "@/stores/user.js"; import { useUserStore } from "@/stores/user.js";
import windowConfig from "@/window"; import windowConfig from "@/window";
import LeftMenu from "./leftMenu.vue"; import LeftMenu from "./leftMenu.vue";
import axios from "axios"; // watch中使用proxy会有warning import axios from "axios";
import { Bell, Avatar, ArrowUp, ArrowDown } from "@element-plus/icons-vue"; // 补充导入图标
const userStore = useUserStore(); const userStore = useUserStore();
const proxyRef = ref(null); const proxyRef = ref(null);
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
...@@ -95,7 +96,8 @@ const isIcon = ref(false); ...@@ -95,7 +96,8 @@ const isIcon = ref(false);
const changeVisible = (bool) => { const changeVisible = (bool) => {
isIcon.value = Boolean(bool); isIcon.value = Boolean(bool);
}; };
// 2. 判断是否包含目标路由的核心方法
// 判断是否包含目标路由的核心方法
const isExcludeRoute = (path) => { const isExcludeRoute = (path) => {
return !excludeTabs.includes(path); return !excludeTabs.includes(path);
}; };
...@@ -105,11 +107,13 @@ const instance = getCurrentInstance(); ...@@ -105,11 +107,13 @@ const instance = getCurrentInstance();
if (instance) { if (instance) {
proxyRef.value = instance.proxy; proxyRef.value = instance.proxy;
} }
let userInfo = ref( let userInfo = ref(
sessionStorage.getItem("userInfo") sessionStorage.getItem("userInfo")
? JSON.parse(sessionStorage.getItem("userInfo")) ? JSON.parse(sessionStorage.getItem("userInfo"))
: [], : {}, // 修改为空对象更合理,用户信息不是数组
); );
const router = useRouter(); const router = useRouter();
const route = useRoute(); const route = useRoute();
...@@ -168,29 +172,43 @@ const handleTabClick = (tab) => { ...@@ -168,29 +172,43 @@ const handleTabClick = (tab) => {
} }
}; };
// 关闭标签(逻辑调整:删除同路径的所有记录) // 修复后的关闭标签方法
const handleTabRemove = (targetFullPath) => { const handleTabRemove = (targetFullPath) => {
const targetView = visitedViews.value.find( // 1. 找到要删除的标签索引
const index = visitedViews.value.findIndex(
(v) => v.fullPath === targetFullPath, (v) => v.fullPath === targetFullPath,
); );
if (!targetView) return;
// 如果没找到,直接返回
// 根据基础路径删除(确保同路径的标签只删一次) if (index === -1) return;
const index = visitedViews.value.findIndex((v) => v.path === targetView.path);
if (index !== -1) { // 2. 获取要删除的视图
// 跳转逻辑保持不变 const targetView = visitedViews.value[index];
if (targetFullPath === route.fullPath) {
if (visitedViews.value.length > 0) { // 3. 删除该标签
const nextView = visitedViews.value.splice(index, 1);
visitedViews.value[index] || visitedViews.value[index - 1];
if (nextView) { // 4. 如果删除的是当前激活的标签,需要跳转到其他标签
router.push(nextView.fullPath); if (targetFullPath === route.fullPath) {
} // 优先跳转到下一个标签,如果没有则跳转到上一个
} else { const nextIndex = index < visitedViews.value.length ? index : index - 1;
router.push("/");
} if (nextIndex >= 0 && visitedViews.value[nextIndex]) {
// 跳转到下一个/上一个标签
router.push(visitedViews.value[nextIndex].fullPath);
} else {
// 如果没有剩余标签,跳转到首页
router.push("/");
} }
} }
// 5. 更新激活的标签路径
if (visitedViews.value.length > 0) {
activePath.value =
visitedViews.value[visitedViews.value.length - 1].fullPath;
} else {
activePath.value = "";
}
}; };
// ========== 路由标签页相关结束 ========== // ========== 路由标签页相关结束 ==========
...@@ -200,45 +218,66 @@ const getResourceData = () => { ...@@ -200,45 +218,66 @@ const getResourceData = () => {
.post(windowConfig.baseUrl + "/api/resource/listResourceAll", {}) .post(windowConfig.baseUrl + "/api/resource/listResourceAll", {})
.then((res) => { .then((res) => {
sessionStorage.setItem("resourceData", JSON.stringify(res.data)); sessionStorage.setItem("resourceData", JSON.stringify(res.data));
}); })
.catch((err) => console.error("获取资源库数据失败:", err)); // 增加错误处理
}; };
// 获取未读消息数量 // 获取未读消息数量
let messageCount = ref(0); let messageCount = ref(0);
const getMessageCount = () => { const getMessageCount = () => {
axios axios
.post(windowConfig.baseUrl + "/api/message/getMesCount", {}) .post(windowConfig.baseUrl + "/api/message/getMesCount", {})
.then((res) => { .then((res) => {
messageCount.value = res.data.count; messageCount.value = res.data.count || 0; // 增加默认值
}); })
.catch((err) => console.error("获取消息数量失败:", err)); // 增加错误处理
}; };
// 跳转消息列表页 // 跳转消息列表页
const toMessagePage = () => { const toMessagePage = () => {
router.push("/message"); router.push("/message");
}; };
onMounted(() => { onMounted(() => {
getResourceData(); getResourceData();
getMessageCount(); getMessageCount();
addView(route); // 初始化时添加当前路由 addView(route); // 初始化时添加当前路由
}); });
// 优化watch:监听完整的route变化,而不只是path
watch( watch(
() => route.path, () => route,
() => { (newRoute) => {
getMessageCount(); getMessageCount();
addView(route); // 路由变化时添加到标签页 addView(newRoute); // 路由变化时添加到标签页
}, },
{ immediate: false, deep: true }, // 深度监听路由对象
); );
// 处理退出登录 // 处理退出登录
const handleLogout = () => { const handleLogout = () => {
// 清除登录状态 // 优先使用axios,避免依赖proxy
proxy.$post({ axios
url: "/api/user/logout", .post(windowConfig.baseUrl + "/api/user/logout", {})
data: {}, .then(() => {
callback: (data) => {
userStore.clearUserInfo(); userStore.clearUserInfo();
sessionStorage.removeItem("userInfo"); // 清除本地存储
router.replace("/login"); router.replace("/login");
}, })
}); .catch((err) => console.error("退出登录失败:", err));
// // 如果需要保留proxy方式,使用下面的代码
// if (proxy) {
// proxy.$post({
// url: "/api/user/logout",
// data: {},
// callback: (data) => {
// userStore.clearUserInfo();
// sessionStorage.removeItem("userInfo");
// router.replace("/login");
// },
// });
// }
}; };
</script> </script>
...@@ -282,7 +321,6 @@ const handleLogout = () => { ...@@ -282,7 +321,6 @@ const handleLogout = () => {
/* 子菜单被激活时,父菜单也高亮 */ /* 子菜单被激活时,父菜单也高亮 */
:deep(.el-sub-menu.is-active > .el-sub-menu__title) { :deep(.el-sub-menu.is-active > .el-sub-menu__title) {
color: #0084ff !important; color: #0084ff !important;
// background-color: #b3d7ff !important;
} }
/* 完全去掉系统管理子菜单的背景色 */ /* 完全去掉系统管理子菜单的背景色 */
...@@ -306,7 +344,6 @@ const handleLogout = () => { ...@@ -306,7 +344,6 @@ const handleLogout = () => {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
padding: 0 24px; padding: 0 24px;
.Split { .Split {
......
...@@ -608,7 +608,7 @@ ...@@ -608,7 +608,7 @@
<el-col :span="8"> <el-col :span="8">
<el-form-item label="项目总投资(万元)"> <el-form-item label="项目总投资(万元)">
<el-input-number <el-input-number
v-model="formData.nd_zjxx_xmztz" v-model="formData.xmztz"
:min="0" :min="0"
:precision="2" :precision="2"
controls-position="right" controls-position="right"
...@@ -618,7 +618,7 @@ ...@@ -618,7 +618,7 @@
<el-col :span="8"> <el-col :span="8">
<el-form-item label="建安费(万元)"> <el-form-item label="建安费(万元)">
<el-input-number <el-input-number
v-model="formData.nd_zjxx_jaf" v-model="formData.jaf"
:min="0" :min="0"
:precision="2" :precision="2"
controls-position="right" controls-position="right"
...@@ -628,7 +628,7 @@ ...@@ -628,7 +628,7 @@
<el-col :span="8"> <el-col :span="8">
<el-form-item label="设备及工具购置费(万元)"> <el-form-item label="设备及工具购置费(万元)">
<el-input-number <el-input-number
v-model="formData.nd_zjxx_sbgzgzf" v-model="formData.sbjgjgzf"
:min="0" :min="0"
:precision="2" :precision="2"
controls-position="right" controls-position="right"
...@@ -638,7 +638,7 @@ ...@@ -638,7 +638,7 @@
<el-col :span="8"> <el-col :span="8">
<el-form-item label="土地相关费用(万元)"> <el-form-item label="土地相关费用(万元)">
<el-input-number <el-input-number
v-model="formData.nd_zjxx_tdxgfy" v-model="formData.tdxgfy"
:min="0" :min="0"
:precision="2" :precision="2"
controls-position="right" controls-position="right"
...@@ -648,7 +648,7 @@ ...@@ -648,7 +648,7 @@
<el-col :span="8"> <el-col :span="8">
<el-form-item label="建设单位管理费(万元)"> <el-form-item label="建设单位管理费(万元)">
<el-input-number <el-input-number
v-model="formData.nd_zjxx_jsdwglf" v-model="formData.jsdwglf"
:min="0" :min="0"
:precision="2" :precision="2"
controls-position="right" controls-position="right"
...@@ -658,7 +658,7 @@ ...@@ -658,7 +658,7 @@
<el-col :span="8"> <el-col :span="8">
<el-form-item label="其他建设项目管理费(万元)"> <el-form-item label="其他建设项目管理费(万元)">
<el-input-number <el-input-number
v-model="formData.nd_zjxx_qtjsxmglf" v-model="formData.qtjsxmglf"
:min="0" :min="0"
:precision="2" :precision="2"
controls-position="right" controls-position="right"
...@@ -668,7 +668,7 @@ ...@@ -668,7 +668,7 @@
<el-col :span="8"> <el-col :span="8">
<el-form-item label="其他费用(万元)"> <el-form-item label="其他费用(万元)">
<el-input-number <el-input-number
v-model="formData.nd_zjxx_qtfy" v-model="formData.qtfy"
:min="0" :min="0"
:precision="2" :precision="2"
controls-position="right" controls-position="right"
...@@ -678,7 +678,7 @@ ...@@ -678,7 +678,7 @@
<el-col :span="8"> <el-col :span="8">
<el-form-item label="能建方建安费(万元)"> <el-form-item label="能建方建安费(万元)">
<el-input-number <el-input-number
v-model="formData.nd_zjxx_njfjaf" v-model="formData.njfjaf"
:min="0" :min="0"
:precision="2" :precision="2"
controls-position="right" controls-position="right"
...@@ -688,7 +688,7 @@ ...@@ -688,7 +688,7 @@
<el-col :span="8"> <el-col :span="8">
<el-form-item label="建设期利息(万元)"> <el-form-item label="建设期利息(万元)">
<el-input-number <el-input-number
v-model="formData.nd_zjxx_jsqlx" v-model="formData.jsqlx"
:min="0" :min="0"
:precision="2" :precision="2"
controls-position="right" controls-position="right"
...@@ -699,7 +699,10 @@ ...@@ -699,7 +699,10 @@
</el-collapse-item> </el-collapse-item>
<!-- 运营期目标责任书 --> <!-- 运营期目标责任书 -->
<el-collapse-item title="运营期目标责任书" name="运营期目标责任书"> <el-collapse-item
title="运营期目标责任书"
name="运营期目标责任书"
>
<div class="collapse-title">投融资与运营指标(万元)</div> <div class="collapse-title">投融资与运营指标(万元)</div>
<div class="tab-handle" style="margin-bottom: 10px"> <div class="tab-handle" style="margin-bottom: 10px">
<el-button <el-button
...@@ -716,7 +719,11 @@ ...@@ -716,7 +719,11 @@
border border
> >
<el-table-column type="index" label="序号" width="60" /> <el-table-column type="index" label="序号" width="60" />
<el-table-column prop="zbmc" label="指标名称" width="260"> <el-table-column
prop="zbmc"
label="指标名称"
width="260"
>
<template #default="scope"> <template #default="scope">
<el-input <el-input
v-model="scope.row.zbmc" v-model="scope.row.zbmc"
...@@ -724,7 +731,11 @@ ...@@ -724,7 +731,11 @@
/> />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="sfkh" label="是否考核" width="100"> <el-table-column
prop="sfkh"
label="是否考核"
width="100"
>
<template #default="scope"> <template #default="scope">
<el-select <el-select
v-model="scope.row.sfkh" v-model="scope.row.sfkh"
...@@ -735,7 +746,11 @@ ...@@ -735,7 +746,11 @@
</el-select> </el-select>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="zrmzb" label="责任目标值" width="140"> <el-table-column
prop="zrmzb"
label="责任目标值"
width="140"
>
<template #default="scope"> <template #default="scope">
<el-input-number <el-input-number
v-model="scope.row.zrmzb" v-model="scope.row.zrmzb"
...@@ -745,7 +760,11 @@ ...@@ -745,7 +760,11 @@
/> />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="khjzf" label="考核基准分" width="120"> <el-table-column
prop="khjzf"
label="考核基准分"
width="120"
>
<template #default="scope"> <template #default="scope">
<el-input-number <el-input-number
v-model="scope.row.khjzf" v-model="scope.row.khjzf"
...@@ -779,7 +798,10 @@ ...@@ -779,7 +798,10 @@
</el-collapse-item> </el-collapse-item>
<!-- 其他对项目决策与实施有颠覆性影响的边界条件 --> <!-- 其他对项目决策与实施有颠覆性影响的边界条件 -->
<el-collapse-item title="其他对项目决策与实施有颠覆性影响的边界条件" name="边界条件"> <el-collapse-item
title="其他对项目决策与实施有颠覆性影响的边界条件"
name="边界条件"
>
<div class="tab-handle" style="margin-bottom: 10px"> <div class="tab-handle" style="margin-bottom: 10px">
<el-button <el-button
type="primary" type="primary"
...@@ -803,7 +825,11 @@ ...@@ -803,7 +825,11 @@
/> />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="khjzf" label="考核基准分" width="180"> <el-table-column
prop="khjzf"
label="考核基准分"
width="180"
>
<template #default="scope"> <template #default="scope">
<el-input-number <el-input-number
v-model="scope.row.khjzf" v-model="scope.row.khjzf"
...@@ -837,7 +863,10 @@ ...@@ -837,7 +863,10 @@
</el-collapse-item> </el-collapse-item>
<!-- 项目实施过程中其他提高项目投资收益或带动公司市场开拓的情况 --> <!-- 项目实施过程中其他提高项目投资收益或带动公司市场开拓的情况 -->
<el-collapse-item title="项目实施过程中其他提高项目投资收益或带动公司市场开拓的情况" name="市场开拓"> <el-collapse-item
title="项目实施过程中其他提高项目投资收益或带动公司市场开拓的情况"
name="市场开拓"
>
<div class="tab-handle" style="margin-bottom: 10px"> <div class="tab-handle" style="margin-bottom: 10px">
<el-button <el-button
type="primary" type="primary"
...@@ -861,7 +890,11 @@ ...@@ -861,7 +890,11 @@
/> />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="khjzf" label="考核基准分" width="180"> <el-table-column
prop="khjzf"
label="考核基准分"
width="180"
>
<template #default="scope"> <template #default="scope">
<el-input-number <el-input-number
v-model="scope.row.khjzf" v-model="scope.row.khjzf"
...@@ -927,9 +960,13 @@ ...@@ -927,9 +960,13 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="已盖章签字的运营阶段目标责任书附件"> <el-form-item
label="已盖章签字的运营阶段目标责任书附件"
>
<el-upload <el-upload
:action="windowConfig.baseUrl + '/api/file/upload'" :action="
windowConfig.baseUrl + '/api/file/upload'
"
:headers="{ Authorization: token }" :headers="{ Authorization: token }"
:show-file-list="false" :show-file-list="false"
multiple multiple
...@@ -1523,11 +1560,11 @@ const deleteRowFile = (row, index) => { ...@@ -1523,11 +1560,11 @@ const deleteRowFile = (row, index) => {
// 投融资与运营指标 // 投融资与运营指标
const addTrzRow = () => { const addTrzRow = () => {
trzData.value.push({ trzData.value.push({
zbmc: '', zbmc: "",
sfkh: '1', sfkh: "1",
zrmzb: 0, zrmzb: 0,
khjzf: 0, khjzf: 0,
jfxz: '' jfxz: "",
}); });
}; };
const deleteTrzRow = (index) => { const deleteTrzRow = (index) => {
...@@ -1544,9 +1581,9 @@ const deleteTrzRow = (index) => { ...@@ -1544,9 +1581,9 @@ const deleteTrzRow = (index) => {
// 边界条件 // 边界条件
const addBjtjRow = () => { const addBjtjRow = () => {
bjtjData.value.push({ bjtjData.value.push({
zbmc: '', zbmc: "",
khjzf: 0, khjzf: 0,
jfxz: '' jfxz: "",
}); });
}; };
const deleteBjtjRow = (index) => { const deleteBjtjRow = (index) => {
...@@ -1563,9 +1600,9 @@ const deleteBjtjRow = (index) => { ...@@ -1563,9 +1600,9 @@ const deleteBjtjRow = (index) => {
// 市场开拓 // 市场开拓
const addScktRow = () => { const addScktRow = () => {
scktData.value.push({ scktData.value.push({
zbmc: '', zbmc: "",
khjzf: 0, khjzf: 0,
jfxz: '' jfxz: "",
}); });
}; };
const deleteScktRow = (index) => { const deleteScktRow = (index) => {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment