From fe2b697a063ab9898af5ec0b49c30ad20274d56e Mon Sep 17 00:00:00 2001
From: gjj <Ganjj@probim.com.cn>
Date: Tue, 25 Feb 2025 11:42:12 +0800
Subject: [PATCH] 调整样式,接口对接

---
 /dev/null                   |   19 
 src/views/ProjectView.vue   |  384 +++++---
 public/config.js            |   18 
 src/store/modules/common.js |   16 
 src/utils/http.js           |  319 ++-----
 src/Dashboard.vue           |   49 
 src/api/home.js             |   68 
 src/views/Home.vue          |  633 ++++++++-----
 vite.config.js              |   10 
 src/utils/getToken.js       |    4 
 src/views/EquipmentView.vue | 1052 ++++++++++++-----------
 11 files changed, 1,331 insertions(+), 1,241 deletions(-)

diff --git a/public/config.js b/public/config.js
index 298537a..a6ea056 100644
--- a/public/config.js
+++ b/public/config.js
@@ -1,13 +1,19 @@
+/*
+ * @Author: gjj Ganjj@probim.com.cn
+ * @Date: 2025-02-14 14:32:17
+ * @LastEditors: gjj Ganjj@probim.com.cn
+ * @LastEditTime: 2025-02-24 17:41:12
+ * @FilePath: \北京交通大学\public\config.js
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
 window.ProjectConfig = {
     // axiosBaseURL: "http://47.117.124.20:2002/",
-    axiosBaseURL: "https://www.probim.cn:7707",
+    axiosBaseURL: "http://8.140.54.245:5000",
     axiosTimeout: 1000 * 30, //毫秒
-    workflowLoginURL: "http://workflow-newapi.probim.cn/api/User/Home/Login",
-    workflowWebURL: "http://workflow.probim.cn",
-    pid: "71f7a5df-a7e3-42f4-bcea-36d7d2924ddd",
-    mapboxToken: 'pk.eyJ1Ijoiemhlbmd4dWZhbmciLCJhIjoiY2w5ejNiOWJ1MDE0bTN1cnp4MjNmM2dpNCJ9.qy3k-99E6-XSK5ldYUFz-A',
     modelUrl: '//dev.vothing.com/scenemanagerVothing/#/', // 模型预览地址
     panoUrl: '//47.95.223.61:6004', // 全景预览地址
     panoBaseUrl: '//47.95.223.61:6003', // 全景图及文档接口
-    sceneUrl: 'http://dev.vothing.com/#/sceneDetail?linkToken=YjkzMWEyMzItNjQwOC00OTljLTlmOGItY2UxYWI4Mzc5YzQyLDFjMTc5NjE3LWE3ZDktNDI0My1iODEzLTg0ZmE1NWExN2NlNyxjODA0YzAzMS02ZGRmLTRkNmItYTM2ZC0xY2ExZjM4MzJiYTk=', // 场景地址
+    modelUrl: 'http://8.140.54.245:5010/#/modelNewShareLoad/7d242691-e6b2-4fbc-b4df-687883eb1a4c/db0ba482-4eb0-4488-aa3f-10066a85ae7a', // 模型预览地址
+    sceneUrl: 'http://59.64.5.216:9980/#/Home/sceneManagementDetail?shareUrlToken=0C7E4A1E4A9BB7DC9BBDEE6ACFA9B4963972FB01200DF887F404CC7D12A4EF4EF74F69D40F29B08CA2B41A97016084CC5D71C1FFDCDE331EAF8FA0DB7C9708193D65FAAA1A707BBA88B2F459AA065C82', // 场景地址
+    projectId: '7d242691-e6b2-4fbc-b4df-687883eb1a4c', // 项目id
 }
\ No newline at end of file
diff --git a/src/Dashboard.vue b/src/Dashboard.vue
index d9c19bd..3bd3d56 100644
--- a/src/Dashboard.vue
+++ b/src/Dashboard.vue
@@ -2,7 +2,7 @@
  * @Author: gjj Ganjj@probim.com.cn
  * @Date: 2025-02-14 14:32:17
  * @LastEditors: gjj Ganjj@probim.com.cn
- * @LastEditTime: 2025-02-21 16:54:08
+ * @LastEditTime: 2025-02-24 17:30:13
  * @FilePath: \北京交通大学\src\Dashboard.vue
 -->
 <!-- eslint-disable vue/no-textarea-mustache -->
@@ -70,11 +70,11 @@
 import Home from "./views/Home.vue";
 import ProjectView from "./views/ProjectView.vue";
 import { sceneJSON } from "./sceneJSON.js";
-import { AppAPI } from "./api/app";
 import EquipmentView from "./views/EquipmentView.vue";
 import dayjs from "dayjs";
 import "dayjs/locale/zh-cn";
 import relativeTime from "dayjs/plugin/relativeTime";
+import { HomeAPI } from "./api/home";
 dayjs.locale("zh-cn");
 dayjs.extend(relativeTime);
 Vue.prototype.$dayjs = dayjs;
@@ -107,7 +107,7 @@
   watch: {
   },
   mounted() {
-    this.initMultiverse();
+    this.getLoginInfo();
   },
   beforeDestroy() {
     this.resetEngineRelated();
@@ -146,36 +146,23 @@
         }
       }
     },
-    
-
-    //初始化引擎
-    initMultiverse() {
-      // 获取承载场景画布dom
-      const renderDom = document.getElementById("renderDom");
-      if (window.multiverse && renderDom) {
-        // 实例化引擎
-        const multiverse = window.multiverse;
-        const engine = new multiverse.mvCore(renderDom);
-
-        // mapbox地图服务的Token,需申请,如不使用Mapbox地图服务,可不设置
-				engine.token = window.ProjectConfig.mapboxToken;
-        // multiverse.js所在的路径,用于获取静态资源文件
-        engine.path = "https://multiverse.vothing.com/";
-
-        // 初始化场景
-        engine.initialize().then((s) => {
-          window.scene = s;
-          s.fromJSON(sceneJSON);
-          s.load();
-          s.stop();
-          window.underlay = s.findFeature("underlay");
-
-          setTimeout(() => {
-            
-          }, 1000);
-        });
+    getLoginInfo() {
+      const data = {
+        "UserName": "JSC",
+        "Password": "JSC@jsc123",
+        "IfSingleLogin": "",
       }
+      HomeAPI.WhLogin(data).then(res => {
+        console.log(res);
+        if(res.Ret === 1) {
+          const result = res.Data
+          window.localStorage.setItem("token", result.token)
+          console.log(result);
+        }
+        
+      });
     },
+
     //设置字体颜色
     cellStyle(row, _column, _rowIndex, _columnIndex) {
       // console.log("row", row);
diff --git a/src/api/app.js b/src/api/app.js
deleted file mode 100644
index 55265fa..0000000
--- a/src/api/app.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import { http } from "../utils/http";
-export const AppAPI = {
-  getRiskData(data, config = {}) {
-    return http.post("/beh/environment/GetRiskData", data, config);
-  },
-  getRiskDetails(id, config = {}) {
-    return http.post(`/beh/environment/risk/${id}`, null, config);
-  },
-};
diff --git a/src/api/home.js b/src/api/home.js
index ace0a96..989a263 100644
--- a/src/api/home.js
+++ b/src/api/home.js
@@ -1,45 +1,31 @@
+/*
+ * @Author: gjj Ganjj@probim.com.cn
+ * @Date: 2025-02-18 16:45:49
+ * @LastEditors: gjj Ganjj@probim.com.cn
+ * @LastEditTime: 2025-02-24 17:48:55
+ * @FilePath: \北京交通大学\src\api\home.js
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
 import { http } from "../utils/http";
 export const HomeAPI = {
-  getProjectList: (config = {}) => {
-    return http.get("/beh/home/getGisProjectList", config);
-  },
+    GetProject: (data) => {
+        return http.get("/api/User/Project/GetProject", {
+            params: data
+        });
+    },
 
-  getProjectInfo: (data, config = {}) => {
-    return http.post("/beh/summary/getPrjSummary", data, config);
-  },
+    WhLogin: (data, config = {}) => {
+        return http.post("/api//User/Home/WhLogin", data, config);
+    },
 
-  getWorkerCategoryData: (data, config = {}) => {
-    return http.post("/beh/person/workTypeTotal", data, config);
-  },
-
-  getEquipmentCategoryCount: (data, config = {}) => {
-    return http.post("/beh/equipment/total", data, config);
-  },
-
-  getVideoAreaList: (belong, data, config = {}) => {
-    return http.post(`/beh/video/area?belong=${belong}`, data, config);
-  },
-
-  getEnvPointInfo: () => {
-    return http.get("/beh/environment/getPointEnvironmentRealData");
-  },
-
-  getVideoByAreaId: (data, config = {}) => {
-    return http.post("/beh/video", data, config);
-  },
-
-  getTotalGoingData: () => {
-    return http.get("/beh/home/getHomeTotalGoingData");
-  },
-
-  getProjectTypeSummaryData: () => {
-    return http.get("/beh/home/getHomeProjectTypeData");
-  },
-
-  getTradeCategoriesStatisticsData: () => {
-    return http.get("/beh/home/getHomeIndustryCategoryData");
-  },
-  getVideoSourceList() {
-    return http.post("/beh/person/tree");
-  }
-};
+    GetParticipatingList: (data) => {
+        return http.get("/api/User/Home/GetParticipatingList", {
+            params: data
+        });
+    },
+    GetParticipatingNumber: (data) => {
+        return http.get("/api/User/Home/GetParticipatingNumber", {
+            params: data
+        });
+    },
+};
\ No newline at end of file
diff --git a/src/store/modules/common.js b/src/store/modules/common.js
index 9cdbc46..f43fad6 100644
--- a/src/store/modules/common.js
+++ b/src/store/modules/common.js
@@ -1,20 +1,36 @@
+/*
+ * @Author: gjj Ganjj@probim.com.cn
+ * @Date: 2025-02-14 14:32:19
+ * @LastEditors: gjj Ganjj@probim.com.cn
+ * @LastEditTime: 2025-02-24 17:33:32
+ * @FilePath: \北京交通大学\src\store\modules\common.js
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
 export default {
     namespaced: true,
     state: () => ({
         code: null, //用户信息
+        token: null, //token
     }),
 
     mutations: {
         setCode(state, data) {
             state.code = data;
         },
+        setToken(state, data) {
+            state.token = data;
+        },
     },
     actions: {
         setCode(context, data) {
             context.commit("setCode", data);
         },
+        setToken(context, data) {
+            context.commit("setToken", data);
+        },
     },
     getters: {
         code: (state) => state.code,
+        token: (state) => state.token,
     },
 };
\ No newline at end of file
diff --git a/src/utils/getToken.js b/src/utils/getToken.js
index a2fe80d..216e492 100644
--- a/src/utils/getToken.js
+++ b/src/utils/getToken.js
@@ -6,4 +6,8 @@
         token = window.localStorage.getItem("token");
     }
     return token;
+}
+export const getProjectId = () => {
+    let id = window.ProjectConfig.projectId;
+    return id;
 }
\ No newline at end of file
diff --git a/src/utils/getUserProfile.js b/src/utils/getUserProfile.js
deleted file mode 100644
index 83251cc..0000000
--- a/src/utils/getUserProfile.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import store from "../store/index";
-
-export const getUserProfile = () => {
-    let userProfile = store.getters["common/userProfile"];
-    if (!userProfile) {
-        userProfile = JSON.parse(window.localStorage.getItem("userProfile"));
-    }
-    return userProfile;
-}
\ No newline at end of file
diff --git a/src/utils/http.js b/src/utils/http.js
index 8cf3b4d..997d954 100644
--- a/src/utils/http.js
+++ b/src/utils/http.js
@@ -3,237 +3,103 @@
 import { debounce } from "lodash-es";
 import store from "../store/index";
 import { getToken } from "./getToken.js";
-import { toLoginPage, toResetPwdPage } from "./logout";
 
 let axiosBaseURL;
 let axiosTimeout;
-let workflowLoginURL;
-if (import.meta.env.PROD) {
-  //生产环境
-  const ProjectConfig = window.ProjectConfig;
-  
-  axiosBaseURL = ProjectConfig.axiosBaseURL;
-  axiosTimeout = ProjectConfig.axiosTimeout;
-  workflowLoginURL = ProjectConfig.workflowLoginURL;
+if (
+    import.meta.env.PROD) {
+    //生产环境
+    const ProjectConfig = window.ProjectConfig;
+
+    axiosBaseURL = ProjectConfig.axiosBaseURL;
+    axiosTimeout = ProjectConfig.axiosTimeout;
 } else {
-  //非生产环境
-  axiosBaseURL = "/api";
-  axiosTimeout = 1000 * 30;
-  workflowLoginURL = "http://workflow-newapi.probim.cn/api/User/Home/Login";
+    //非生产环境
+    axiosBaseURL = "/api";
+    axiosTimeout = 1000 * 30;
 }
 
 export const http = axios.create({
-  withCredentials: false,
-  baseURL: axiosBaseURL,
-  timeout: axiosTimeout
+    withCredentials: false,
+    baseURL: axiosBaseURL,
+    timeout: axiosTimeout
 });
 
-//loading对象
-let loadingInstance;
 
-//当前正在请求的数量
-let needLoadingRequestCount = 0;
-
-//显示loading
-function showLoading(target) {
-  // 后面这个判断很重要,因为关闭时加了抖动,此时loading对象可能还存在,
-  // 但needLoadingRequestCount已经变成0.避免这种情况下会重新创建个loading
-  if (needLoadingRequestCount === 0 && !loadingInstance) {
-    loadingInstance = Loading.service({
-      target: target || "body",
-      fullscreen: false,
-      lock: true,
-      text: "Loading...",
-      // spinner: "",
-      // background: "",
-      // customClass: "",
-    });
-  }
-  needLoadingRequestCount++;
-}
-
-//隐藏loading
-function hideLoading() {
-  needLoadingRequestCount--;
-  needLoadingRequestCount = Math.max(needLoadingRequestCount, 0); //做个保护
-  if (needLoadingRequestCount === 0) {
-    //关闭loading
-    toHideLoading();
-  }
-}
-
-//防抖:将 300ms 间隔内的关闭 loading 便合并为一次。防止连续请求时, loading闪烁的问题。
-const toHideLoading = debounce(() => {
-  loadingInstance?.close();
-  loadingInstance = null;
-}, 300);
 
 
 //处理响应的结果,返回统一结构
 function handleTheResponse(response) {
-  console.log(`axios包装过的响应${response.config.url}`, response);
-  if (response.config.showLoading === true) {
-    hideLoading();
-  }
-  // {
-  //     // `data` 由服务器提供的响应
-  //     data: {},
-  //     // `status` 来自服务器响应的 HTTP 状态码
-  //     status: 200,
-  //     // `statusText` 来自服务器响应的 HTTP 状态信息
-  //     statusText: 'OK',
-  //     // `headers` 是服务器响应头
-  //     // 所有的 header 名称都是小写,而且可以使用方括号语法访问
-  //     // 例如: `response.headers['content-type']`
-  //     headers: {},
-  //     // `config` 是 `axios` 请求的配置信息
-  //     config: {},
-  //     // `request` 是生成此响应的请求
-  //     // 在node.js中它是最后一个ClientRequest实例 (in redirects),
-  //     // 在浏览器中则是 XMLHttpRequest 实例
-  //     request: {}
-  //   }
+    console.log(`axios包装过的响应${response.config.url}`, response);
 
-  let responseData = response.data;
-  if (response.status === 200) {
-    if (responseData?.code === 40001) {
-      toLoginPage();
-      return;
-    }
-    if(responseData?.code === 40002) {
-      toResetPwdPage();
-      return;
-    }
-    const targetUrl = response.config.url.toLowerCase();
-    if (/^\s*$/g.test("" + responseData)) {
-      responseData = {
-        code: 1,
-        message: "无响应数据",
-        data: null,
-      };
-    } else if (targetUrl === "https://bnah-web-api.biaddti.com/api/video/video/getvideo") {
-      //摄像头视频
-      responseData = {
-        code: responseData?.Ret === 1 ? 0 : 1,
-        message: responseData?.Msg ?? "服务异常",
-        data: responseData?.Data ?? null,
-      };
-    } else if (targetUrl.startsWith(workflowLoginURL.toLowerCase())) {
-      //协同登录,响应结构不一样,需要单独处理
-      responseData = {
-        code: responseData?.Ret === 1 ? 0 : 1,
-        message: responseData?.Msg ?? "协同登录服务异常",
-        data: responseData?.Data ?? null,
-      };
-    } else if (targetUrl.startsWith("https://api.help.bj.cn/apis/weather")) {
-      //   {
-      //     "status": "0",       //反馈代码 0成功
-      //     "msg": "反馈信息",      //反馈信息
-      //     "cityen": "changchun",       //城市名称英文
-      //     "city": "长春",       //城市名称
-      //     "citycode": "101060101",       //城市编码
-      //     "temp": "10",       //实时温度
-      //     "tempf": "50",       //华氏温度
-      //     "wd": "西风",       //风向
-      //     "wden": "W",       //风向英文
-      //     "wdforce": "3级",       //风力
-      //     "wdspd": "<12km/h",       //风速
-      //     "uptime": "12:00",       //更新时间
-      //     "weather": "晴",       //天气状况
-      //     "weatheren": "Sunny",       //天气状况英文
-      //     "weatherimg": "d00",       //天气状况图标
-      //     "stp": "994",       //气压
-      //     "wisib": "35000",       //能见度
-      //     "humidity": "46%",       //湿度
-      //     "prcp": "0",       //降雨
-      //     "prcp24h": "2.2",       //24小时降雨量
-      //     "aqi": "22",       //AQI
-      //     "pm25": "20",       //PM2.5
-      //     "today": "10月17日(星期一)"      //今天日期
-      // }
-      //网上找的天气信息接口,由服务端代理,响应结构不一样,需要单独处理
-      if (responseData?.status === "0") {
-        responseData = {
-          code: 0,
-          message: null,
-          data: responseData,
+    let responseData = response.data;
+    if (response.status === 200) {
+        if (/^\s*$/g.test("" + responseData)) {
+            responseData = {
+                code: 1,
+                message: "无响应数据",
+                data: null,
+            };
+        }
+    } else {
+        return {
+            code: 1,
+            message: responseData ? responseData.message : "服务异常",
+            data: responseData,
         };
-      } else {
-        responseData = {
-          code: 1,
-          message: "天气服务异常",
-          data: null,
-        };
-      }
     }
-  } else {
-    return {
-      code: 1,
-      message: responseData?.message ?? "服务异常",
-      data: responseData,
-    };
-  }
-  if (!responseData || responseData.code !== 0) {
-    Message.error({ message: responseData?.message ?? "服务异常", duration: 1000 * 3 });
-  }
-  return responseData;
+    if (!responseData || responseData.code !== 0) {
+        Message.error({ message: responseData ? responseData.message : "服务异常", duration: 1000 * 3 });
+    }
+    return responseData;
 }
 
 //处理错误,返回统一结构
 function handleTheError(error) {
-  console.log(`axios包装过的错误${error.config.url}`, error);
-  if (error.config?.showLoading === true) {
-    hideLoading();
-  }
-  const responseData = { code: -999, data: null };
-  if (error.response) {
-    const { data, status, statusText } = error.response;
-    if (status === 500 && /^\s*$/gi.test(data + "")) {
-      responseData.message = "服务异常,无响应数据";
+    console.log(`axios包装过的错误${error.config.url}`, error);
+    const responseData = { code: -999, data: null };
+    if (error.response) {
+        const { data, status, statusText } = error.response;
+        if (status === 500 && /^\s*$/gi.test(data + "")) {
+            responseData.message = "服务异常,无响应数据";
+        } else {
+            responseData.data = data;
+            responseData.message = `${statusText ?? "服务异常,请稍后再试"}`;
+        }
+    } else if (error.request) {
+        responseData.message = "未收到服务端响应,请稍后再试";
     } else {
-      responseData.data = data;
-      responseData.message = `${statusText ?? "服务异常,请稍后再试"}`;
+        responseData.message = "未发送请求,请检查请求参数是否正确";
     }
-  } else if (error.request) {
-    responseData.message = "未收到服务端响应,请稍后再试";
-  } else {
-    responseData.message = "未发送请求,请检查请求参数是否正确";
-  }
-  Message.error({ message: responseData.message, duration: 1000 * 3 });
-  return responseData;
+    Message.error({ message: responseData.message, duration: 1000 * 3 });
+    return responseData;
 }
 
 //添加请求拦截器
 http.interceptors.request.use(
-  (config) => {
-    if (config.showLoading === true) {
-      showLoading(config.loadingTarget);
-    }
-    if (config.withProjectId !== false) {
-      config.headers["projectId"] = store.getters["common/currentProjectId"];
-    }
-    if (config.withToken !== false) {
-      config.headers["token"] = getToken();
-    }
-    return config;
-  },
-  (error) => {
-    // console.log("request-error", error);
-    //todo 封装成固定结构 {code,data,message}
-    return handleTheError(error);
-  },
+    (config) => {
+        if (config.withToken !== false) {
+            config.headers["token"] = getToken();
+        }
+        return config;
+    },
+    (error) => {
+        // console.log("request-error", error);
+        //todo 封装成固定结构 {code,data,message}
+        return handleTheError(error);
+    },
 );
 
 //响应拦截器
 http.interceptors.response.use(
-  (response) => {
-    //todo 封装成固定结构 {code,data,message}
-    return handleTheResponse(response);
-  },
-  (error) => {
-    //todo 封装成固定结构 {code,data,message}
-    return handleTheError(error);
-  },
+    (response) => {
+        //todo 封装成固定结构 {code,data,message}
+        return handleTheResponse(response);
+    },
+    (error) => {
+        //todo 封装成固定结构 {code,data,message}
+        return handleTheError(error);
+    },
 );
 // 引擎接口
 let modelaxiosUrl
@@ -241,40 +107,37 @@
 
 modelaxiosUrl = ProjectConfig.modelUrl;
 export const modelhttp = axios.create({
-  withCredentials: false,
-  baseURL: modelaxiosUrl,
-  timeout: axiosTimeout
+    withCredentials: false,
+    baseURL: modelaxiosUrl,
+    timeout: axiosTimeout
 });
 
 //添加请求拦截器
 modelhttp.interceptors.request.use(
-  (config) => {
-    if (config.showLoading === true) {
-      showLoading(config.loadingTarget);
-    }
-    if (config.withProjectId !== false) {
-      config.headers["projectId"] = store.getters["common/currentProjectId"];
-    }
-    if (config.withToken !== false) {
-      config.headers["token"] = getToken();
-    }
-    return config;
-  },
-  (error) => {
-    // console.log("request-error", error);
-    //todo 封装成固定结构 {code,data,message}
-    return handleTheError(error);
-  },
+    (config) => {
+        if (config.withProjectId !== false) {
+            config.headers["projectId"] = store.getters["common/currentProjectId"];
+        }
+        if (config.withToken !== false) {
+            config.headers["token"] = getToken();
+        }
+        return config;
+    },
+    (error) => {
+        // console.log("request-error", error);
+        //todo 封装成固定结构 {code,data,message}
+        return handleTheError(error);
+    },
 );
 
 //响应拦截器
 modelhttp.interceptors.response.use(
-  (response) => {
-    //todo 封装成固定结构 {code,data,message}
-    return handleTheResponse(response);
-  },
-  (error) => {
-    //todo 封装成固定结构 {code,data,message}
-    return handleTheError(error);
-  },
+    (response) => {
+        //todo 封装成固定结构 {code,data,message}
+        return handleTheResponse(response);
+    },
+    (error) => {
+        //todo 封装成固定结构 {code,data,message}
+        return handleTheError(error);
+    },
 );
\ No newline at end of file
diff --git a/src/utils/logout.js b/src/utils/logout.js
deleted file mode 100644
index 29f9c57..0000000
--- a/src/utils/logout.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import store from "../store/index";
-import router from "../router";
-
-const clearAuthenticateInfo = () => {
-    store.commit("common/setToken", "");
-    store.commit("common/setUserProfile", null);
-    window.localStorage.removeItem("token");
-    window.localStorage.removeItem("userProfile");
-}
-
-export const toLoginPage = () => {
-    clearAuthenticateInfo();
-    router.replace("/login");
-}
-
-export const toResetPwdPage = () => {
-    clearAuthenticateInfo();
-    router.replace("/resetpwd");
-}
\ No newline at end of file
diff --git a/src/views/EquipmentView.vue b/src/views/EquipmentView.vue
index a499a46..b036fd5 100644
--- a/src/views/EquipmentView.vue
+++ b/src/views/EquipmentView.vue
@@ -1,618 +1,670 @@
 <template>
-  <div class="equipment-container">
-    <div class="top-section mb-[20px]">
-      <div 
-        class="w-full h-[4vh] mb-[1vh]" 
-        :style="{
+<div class="equipment-container">
+ <div class="top-nav w-full mb-[1vh]" :style="{
           backgroundImage: `url(${titleImage})`,
           backgroundRepeat: 'no-repeat',
           backgroundPosition: 'center center',
           backgroundSize: '100% 100%'
-        }"
-      >
-      </div>
-      <div class="stats-grid"  :style="sectionStyle">
-        <div class="stat-item mb-[10px]">
-          <div class="stat-info">
-            <img class="w-[24px] h-[24px]" src="../assets/images/backgrounds/shishirenshu.png" alt="">
-            <span class="satalabel ml-[8px]">实时人数</span>
-          </div>
-          <div class="value text-[#00FFFF] text-[28px] font-bold">62</div>
-        </div>
-        <div class="stat-item mb-[10px]">
-          <div class="stat-info">
-            <img class="w-[24px] h-[24px]" src="../assets/images/backgrounds/people.png" alt="">
-            <span class="satalabel ml-[8px]">今日累计/人次</span>
-          </div>
-          <div class="value text-[#FFD500] text-[28px] font-bold">62</div>
-        </div>
-        <div class="stat-item">
-          <div class="stat-info">
-            <img class="w-[24px] h-[24px]" src="../assets/images/backgrounds/zaigang.png" alt="">
-            <span class="satalabel ml-[8px]">在岗总数</span>
-          </div>
-          <div class="value text-[#FFD500] text-[28px] font-bold">62</div>
-        </div>
-      </div>
-    </div>
+        }">
+ </div>
+ <div class="bottom-nav">
+  <div class="top-section mb-[20px]">
 
-    <div class="middle-section mb-[20px]">
-      <div 
-        class="w-full h-[4vh] mb-[1vh]" 
-        :style="{
+   <div class="stats-grid" :style="sectionStyle">
+    <div class="stat-item mb-[10px]">
+     <div class="stat-info">
+      <img class="w-[24px] h-[24px]" src="../assets/images/backgrounds/shishirenshu.png" alt="">
+      <span class="satalabel ml-[8px]">实时人数</span>
+     </div>
+     <div class="value text-[#00FFFF] text-[28px] font-bold">62</div>
+    </div>
+    <div class="stat-item mb-[10px]">
+     <div class="stat-info">
+      <img class="w-[24px] h-[24px]" src="../assets/images/backgrounds/people.png" alt="">
+      <span class="satalabel ml-[8px]">今日累计/人次</span>
+     </div>
+     <div class="value text-[#FFD500] text-[28px] font-bold">62</div>
+    </div>
+    <div class="stat-item">
+     <div class="stat-info">
+      <img class="w-[24px] h-[24px]" src="../assets/images/backgrounds/zaigang.png" alt="">
+      <span class="satalabel ml-[8px]">在岗总数</span>
+     </div>
+     <div class="value text-[#FFD500] text-[28px] font-bold">62</div>
+    </div>
+   </div>
+  </div>
+
+  <div class="middle-section mb-[20px]">
+   <div class="w-full h-[4vh] mb-[1vh]" :style="{
           backgroundImage: `url(${middleImage})`,
           backgroundRepeat: 'no-repeat',
           backgroundPosition: 'center center',
           backgroundSize: '100% 100%'
-        }"
-      >
-      </div>
-      <div class="equipment-status"  :style="sectionStyle">
-        <div 
-          class="w-full h-[30px] mb-[10px]" 
-          :style="{
+        }">
+   </div>
+   <div class="equipment-status" :style="sectionStyle">
+    <div class="w-full h-[30px] mb-[10px]" :style="{
             backgroundImage: `url(${bgImage})`,
             backgroundRepeat: 'no-repeat',
             backgroundPosition: 'center center',
             backgroundSize: '100% 100%'
-          }"
-        >
-          <div class="text-white text-[14px] ml-[40px] leading-[35px]">升降机监控</div>
-        </div>
-        <div class="status-circles">
-          <template v-for="item in circleItems">
-            <div class="circle-item flex flex-col items-center justify-center" :key="item.id">
-              <div class="progress-circle">
-                <V2Echarts :idName="item.id" :options="item.options" />
-                <div class="percentage">{{item.percentage}}%</div>
-            </div>
-            <div class="label mt-[5px] flex flex-row items-center justify-center">
-              <div class="text-[12px] text-[#FFFFFF] mr-[12px]">{{item.name}}</div>
-              <div class="text-[24px] text-[#FFD500]">{{item.value}}</div>
-            </div>
-            </div>
-          </template>
-        </div>
-        <div class="control-buttons mt-[30px]">
-          <button class="control-btn" :class="{ 'active': currentTab === '塔吊监控' }" @click="handleControlBtnClick('塔吊监控')">塔吊监控</button>
-          <button class="control-btn" :class="{ 'active': currentTab === '升降机监控' }" @click="handleControlBtnClick('升降机监控')">升降机监控</button>
-        </div>
-        <div class="divider"></div>
-        <div class="progress-bar">
-          <div class="label">运行设备总数</div>
-          <div class="bar flex items-center">
-            <div class="progress relative w-[80%] h-[24px]">
-              <div class="progress-inner" :style="{ width: `${deviceOnline / deviceTotal * 100}%` }"></div>
-              <div class="progress-blocks">
-                <div v-for="n in 28" :key="n" 
-                  class="block"
-                  :class="{ 'active': (n-1)/28 * 100 <= (deviceOnline / deviceTotal * 100) }"
-                ></div>
-              </div>
-            </div>
-            <div class="count-container ml-[25px]">
-              <span class="text-[#FFBF00] text-[24px]">{{deviceOnline}}</span>
-              <span class="text-white text-[24px]">/</span>
-              <span class="text-white text-[24px]">{{deviceTotal}}</span>
-            </div>
-          </div>
-        </div>
-      </div>
+          }">
+     <div class="text-white text-[14px] ml-[40px] leading-[35px]">升降机监控</div>
     </div>
+    <div class="status-circles">
+     <template v-for="item in circleItems">
+      <div class="circle-item flex flex-col items-center justify-center" :key="item.id">
+       <div class="progress-circle">
+        <V2Echarts :idName="item.id" :options="item.options" />
+        <div class="percentage">{{item.percentage}}%</div>
+       </div>
+       <div class="label mt-[5px] flex flex-row items-center justify-center">
+        <div class="text-[12px] text-[#FFFFFF] mr-[12px]">{{item.name}}</div>
+        <div class="text-[24px] text-[#FFD500]">{{item.value}}</div>
+       </div>
+      </div>
+     </template>
+    </div>
+    <div class="control-buttons">
+     <button class="control-btn" :class="{ 'active': currentTab === '塔吊监控' }" @click="handleControlBtnClick('塔吊监控')">塔吊监控</button>
+     <button class="control-btn" :class="{ 'active': currentTab === '升降机监控' }" @click="handleControlBtnClick('升降机监控')">升降机监控</button>
+    </div>
+    <div class="divider"></div>
+    <div class="progress-bar">
+     <div class="label">运行设备总数</div>
+     <div class="bar flex items-center">
+      <div class="progress relative w-[80%] h-[24px]">
+       <div class="progress-inner" :style="{ width: `${deviceOnline / deviceTotal * 100}%` }"></div>
+       <div class="progress-blocks">
+        <div v-for="n in 28" :key="n" class="block" :class="{ 'active': (n-1)/28 * 100 <= (deviceOnline / deviceTotal * 100) }"></div>
+       </div>
+      </div>
+      <div class="count-container ml-[25px]">
+       <span class="text-[#FFBF00] text-[24px]">{{deviceOnline}}</span>
+       <span class="text-white text-[24px]">/</span>
+       <span class="text-white text-[24px]">{{deviceTotal}}</span>
+      </div>
+     </div>
+    </div>
+   </div>
+  </div>
 
-    <div class="bottom-section">
-      <div 
-        class="w-full h-[4vh] mb-[1vh]" 
-        :style="{
+  <div class="bottom-section">
+   <div class="w-full h-[4vh] mb-[1vh]" :style="{
           backgroundImage: `url(${bottomImage})`,
           backgroundRepeat: 'no-repeat',
           backgroundPosition: 'center center',
           backgroundSize: '100% 100%'
-        }"
-      >
-      </div>
-      <div class="environment-grid"  :style="sectionStyle">
-        <div class="env-item">
-          <img class="w-[60px] h-[60px]" src="../assets/images/backgrounds/daqiwendu.png" alt="">
-          <div class="env-info">
-            <span class="envlabel">大气温度</span>
-            <span class="envvalue" :style="enviorStyle">5°C</span>
-          </div>
-        </div>
-        <div class="env-item">
-          <img class="w-[60px] h-[60px]" src="../assets/images/backgrounds/daqishidu.png" alt="">
-          <div class="env-info">
-            <span class="envlabel">大气湿度</span>
-            <span class="envvalue" :style="enviorStyle">22.9%</span>
-          </div>
-        </div>
-        <div class="env-item">
-          <img class="w-[60px] h-[60px]" src="../assets/images/backgrounds/PM2.png" alt="">
-          <div class="env-info">
-            <span class="envlabel">PM2.5</span>
-            <span class="envvalue" :style="enviorStyle">10 μg/m³</span>
-          </div>
-        </div>
-        <div class="env-item">
-          <img class="w-[60px] h-[60px]" src="../assets/images/backgrounds/PM10.png" alt="">
-          <div class="env-info">
-            <span class="envlabel">PM10</span>
-            <span class="envvalue" :style="enviorStyle">13 μg/m³</span>
-          </div>
-        </div>
-        <div class="env-item">
-          <img class="w-[60px] h-[60px]" src="../assets/images/backgrounds/fengli.png" alt="">
-          <div class="env-info">
-            <span class="envlabel">风力</span>
-            <span class="envvalue" :style="enviorStyle">3级</span>
-          </div>
-        </div>
-        <div class="env-item">
-          <img class="w-[60px] h-[60px]" src="../assets/images/backgrounds/fengxiang.png" alt="">
-          <div class="env-info">
-            <span class="envlabel">风向</span>
-            <span class="envvalue" :style="enviorStyle">北风</span>
-          </div>
-        </div>
-      </div>
+        }">
+   </div>
+   <div class="environment-grid" :style="sectionStyle">
+    <div class="env-item">
+     <img class="w-[60px] h-[60px]" src="../assets/images/backgrounds/daqiwendu.png" alt="">
+     <div class="env-info">
+      <span class="envlabel">大气温度</span>
+      <span class="envvalue" :style="enviorStyle">5°C</span>
+     </div>
     </div>
+    <div class="env-item">
+     <img class="w-[60px] h-[60px]" src="../assets/images/backgrounds/daqishidu.png" alt="">
+     <div class="env-info">
+      <span class="envlabel">大气湿度</span>
+      <span class="envvalue" :style="enviorStyle">22.9%</span>
+     </div>
+    </div>
+    <div class="env-item">
+     <img class="w-[60px] h-[60px]" src="../assets/images/backgrounds/PM2.png" alt="">
+     <div class="env-info">
+      <span class="envlabel">PM2.5</span>
+      <span class="envvalue" :style="enviorStyle">10 μg/m³</span>
+     </div>
+    </div>
+    <div class="env-item">
+     <img class="w-[60px] h-[60px]" src="../assets/images/backgrounds/PM10.png" alt="">
+     <div class="env-info">
+      <span class="envlabel">PM10</span>
+      <span class="envvalue" :style="enviorStyle">13 μg/m³</span>
+     </div>
+    </div>
+    <div class="env-item">
+     <img class="w-[60px] h-[60px]" src="../assets/images/backgrounds/fengli.png" alt="">
+     <div class="env-info">
+      <span class="envlabel">风力</span>
+      <span class="envvalue" :style="enviorStyle">3级</span>
+     </div>
+    </div>
+    <div class="env-item">
+     <img class="w-[60px] h-[60px]" src="../assets/images/backgrounds/fengxiang.png" alt="">
+     <div class="env-info">
+      <span class="envlabel">风向</span>
+      <span class="envvalue" :style="enviorStyle">北风</span>
+     </div>
+    </div>
+   </div>
   </div>
+ </div>
+</div>
 </template>
 
 <script>
 import V2Echarts from '@/components/V2Echarts.vue'
 export default {
-  name: 'EquipmentView',
-  components: {
-    V2Echarts
-  },
-  data() {
-    return {
-      backgroundImage: new URL('@/assets/images/backgrounds/cover_bg.png', import.meta.url).href,
-      titleImage: new URL('@/assets/images/titles/renyuan.png', import.meta.url).href,
-      middleImage: new URL('@/assets/images/titles/shebei.png', import.meta.url).href,
-      bottomImage: new URL('@/assets/images/titles/huanjing.png', import.meta.url).href,
-      bgImage: new URL('@/assets/images/titles/title_second.png', import.meta.url).href,
-      enviorImage: new URL('@/assets/images/titles/wendu_bg.png', import.meta.url).href,
-      deviceOnline: 1,
-      deviceTotal: 27,
-      currentTab: '塔吊监控',
-      circleItems: [
-        {
-          id: 'zaixianChartBox',
-          name: '总在线',
-          value: 22,
-          percentage: 81.5,
-          options: {
-            tooltip: {
-              trigger: 'item',
-            },
-            legend: {
-              itemWidth: 8,
-              itemHeight: 8,
-              top: '5%',
-              left: 'center',
-              show: false,
-            },
-            series: [
-              {
-                type: 'pie',
-                radius: ['70%', '80%'],
-                center: ['50%', '50%'],
-                avoidLabelOverlap: false,
-                hoverAnimation: false,
-                startAngle: 90,
-                itemStyle: {
-                  normal: {
-                    label: {
-                      show: false,
-                    },
-                    labelLine: {
-                      show: false,
-                    },
-                    shadowBlur: 40,
-                    borderWidth: 5,
-                    shadowColor: 'rgba(0, 0, 0, 0)', // 边框阴影
-                  },
-                },
-                data: [
-                  { value: 100, name: '', itemStyle: { color: '#234E84' } },
-                ],
-              },
-              {
-                type: 'pie',
-                radius: ['70%', '100%'],
-                center: ['50%', '50%'],
-                avoidLabelOverlap: false,
-                hoverAnimation: false,
-                startAngle: 90,
-                itemStyle: {
-                  normal: {
-                    label: {
-                      show: false,
-                    },
-                    labelLine: {
-                      show: false,
-                    },
-                    shadowBlur: 40,
-                    borderWidth: 10,
-                    shadowColor: 'rgba(0, 0, 0, 0)', // 边框阴影
-                  },
-                },
-                data: [
-                  { value: 20, name: '主隧洞掘进', itemStyle: { color: '#00FFFF' } },
-                  { value: 80, name: '', itemStyle: { color: 'transparent' } },
-                ],
-              },
-              
-            ],
-          }
+ name: 'EquipmentView',
+ components: {
+  V2Echarts
+ },
+ data() {
+  return {
+   backgroundImage: new URL('@/assets/images/backgrounds/cover_bg.png',
+    import.meta.url).href,
+   titleImage: new URL('@/assets/images/titles/renyuan.png',
+    import.meta.url).href,
+   middleImage: new URL('@/assets/images/titles/shebei.png',
+    import.meta.url).href,
+   bottomImage: new URL('@/assets/images/titles/huanjing.png',
+    import.meta.url).href,
+   bgImage: new URL('@/assets/images/titles/title_second.png',
+    import.meta.url).href,
+   enviorImage: new URL('@/assets/images/titles/wendu_bg.png',
+    import.meta.url).href,
+   deviceOnline: 1,
+   deviceTotal: 27,
+   currentTab: '塔吊监控',
+   circleItems: [{
+     id: 'zaixianChartBox',
+     name: '总在线',
+     value: 22,
+     percentage: 81.5,
+     options: {
+      tooltip: {
+       trigger: 'item',
+      },
+      legend: {
+       itemWidth: 8,
+       itemHeight: 8,
+       top: '5%',
+       left: 'center',
+       show: false,
+      },
+      series: [{
+        type: 'pie',
+        radius: ['70%', '80%'],
+        center: ['50%', '50%'],
+        avoidLabelOverlap: false,
+        hoverAnimation: false,
+        startAngle: 90,
+        itemStyle: {
+         normal: {
+          label: {
+           show: false,
+          },
+          labelLine: {
+           show: false,
+          },
+          shadowBlur: 40,
+          borderWidth: 5,
+          shadowColor: 'rgba(0, 0, 0, 0)', // 边框阴影
+         },
         },
-        {
-          id: 'lixianChartBox',
-          name: '总离线',
-          value: 5,
-          percentage: 81.5,
-          options: {
-            tooltip: {
-              trigger: 'item',
-            },
-            legend: {
-              itemWidth: 8,
-              itemHeight: 8,
-              top: '5%',
-              left: 'center',
-              show: false,
-            },
-            series: [
-              {
-                type: 'pie',
-                radius: ['70%', '80%'],
-                center: ['50%', '50%'],
-                avoidLabelOverlap: false,
-                hoverAnimation: false,
-                startAngle: 90,
-                itemStyle: {
-                  normal: {
-                    label: {
-                      show: false,
-                    },
-                    labelLine: {
-                      show: false,
-                    },
-                    shadowBlur: 40,
-                    borderWidth: 5,
-                    shadowColor: 'rgba(0, 0, 0, 0)', // 边框阴影
-                  },
-                },
-                data: [
-                  { value: 100, name: '', itemStyle: { color: '#234E84' } },
-                ],
-              },
-              {
-                type: 'pie',
-                radius: ['70%', '100%'],
-                center: ['50%', '50%'],
-                avoidLabelOverlap: false,
-                hoverAnimation: false,
-                startAngle: 90,
-                itemStyle: {
-                  normal: {
-                    label: {
-                      show: false,
-                    },
-                    labelLine: {
-                      show: false,
-                    },
-                    shadowBlur: 40,
-                    borderWidth: 10,
-                    shadowColor: 'rgba(0, 0, 0, 0)', // 边框阴影
-                  },
-                },
-                data: [
-                  { value: 20, name: '主隧洞掘进', itemStyle: { color: '#00FFFF' } },
-                  { value: 80, name: '', itemStyle: { color: 'transparent' } },
-                ],
-              },
-              
-            ],
-          }
+        data: [{
+         value: 100,
+         name: '',
+         itemStyle: {
+          color: '#234E84'
+         }
+        }, ],
+       },
+       {
+        type: 'pie',
+        radius: ['70%', '100%'],
+        center: ['50%', '50%'],
+        avoidLabelOverlap: false,
+        hoverAnimation: false,
+        startAngle: 90,
+        itemStyle: {
+         normal: {
+          label: {
+           show: false,
+          },
+          labelLine: {
+           show: false,
+          },
+          shadowBlur: 40,
+          borderWidth: 10,
+          shadowColor: 'rgba(0, 0, 0, 0)', // 边框阴影
+         },
         },
-        {
-          id: 'baojingChartBox',
-          name: '总报警',
-          value: 0,
-          percentage: 81.5,
-          options: {
-            tooltip: {
-              trigger: 'item',
-            },
-            legend: {
-              itemWidth: 8,
-              itemHeight: 8,
-              top: '5%',
-              left: 'center',
-              show: false,
-            },
-            series: [
-              {
-                type: 'pie',
-                radius: ['70%', '80%'],
-                center: ['50%', '50%'],
-                avoidLabelOverlap: false,
-                hoverAnimation: false,
-                startAngle: 90,
-                itemStyle: {
-                  normal: {
-                    label: {
-                      show: false,
-                    },
-                    labelLine: {
-                      show: false,
-                    },
-                    shadowBlur: 40,
-                    borderWidth: 5,
-                    shadowColor: 'rgba(0, 0, 0, 0)', // 边框阴影
-                  },
-                },
-                data: [
-                  { value: 100, name: '', itemStyle: { color: '#234E84' } },
-                ],
-              },
-              {
-                type: 'pie',
-                radius: ['70%', '100%'],
-                center: ['50%', '50%'],
-                avoidLabelOverlap: false,
-                hoverAnimation: false,
-                startAngle: 90,
-                itemStyle: {
-                  normal: {
-                    label: {
-                      show: false,
-                    },
-                    labelLine: {
-                      show: false,
-                    },
-                    shadowBlur: 40,
-                    borderWidth: 10,
-                    shadowColor: 'rgba(0, 0, 0, 0)', // 边框阴影
-                  },
-                },
-                data: [
-                  { value: 20, name: '主隧洞掘进', itemStyle: { color: '#00FFFF' } },
-                  { value: 80, name: '', itemStyle: { color: 'transparent' } },
-                ],
-              },
-            ],
+        data: [{
+          value: 20,
+          name: '主隧洞掘进',
+          itemStyle: {
+           color: '#00FFFF'
           }
-        }
-      ]
+         },
+         {
+          value: 80,
+          name: '',
+          itemStyle: {
+           color: 'transparent'
+          }
+         },
+        ],
+       },
+
+      ],
+     }
+    },
+    {
+     id: 'lixianChartBox',
+     name: '总离线',
+     value: 5,
+     percentage: 81.5,
+     options: {
+      tooltip: {
+       trigger: 'item',
+      },
+      legend: {
+       itemWidth: 8,
+       itemHeight: 8,
+       top: '5%',
+       left: 'center',
+       show: false,
+      },
+      series: [{
+        type: 'pie',
+        radius: ['70%', '80%'],
+        center: ['50%', '50%'],
+        avoidLabelOverlap: false,
+        hoverAnimation: false,
+        startAngle: 90,
+        itemStyle: {
+         normal: {
+          label: {
+           show: false,
+          },
+          labelLine: {
+           show: false,
+          },
+          shadowBlur: 40,
+          borderWidth: 5,
+          shadowColor: 'rgba(0, 0, 0, 0)', // 边框阴影
+         },
+        },
+        data: [{
+         value: 100,
+         name: '',
+         itemStyle: {
+          color: '#234E84'
+         }
+        }, ],
+       },
+       {
+        type: 'pie',
+        radius: ['70%', '100%'],
+        center: ['50%', '50%'],
+        avoidLabelOverlap: false,
+        hoverAnimation: false,
+        startAngle: 90,
+        itemStyle: {
+         normal: {
+          label: {
+           show: false,
+          },
+          labelLine: {
+           show: false,
+          },
+          shadowBlur: 40,
+          borderWidth: 10,
+          shadowColor: 'rgba(0, 0, 0, 0)', // 边框阴影
+         },
+        },
+        data: [{
+          value: 20,
+          name: '主隧洞掘进',
+          itemStyle: {
+           color: '#00FFFF'
+          }
+         },
+         {
+          value: 80,
+          name: '',
+          itemStyle: {
+           color: 'transparent'
+          }
+         },
+        ],
+       },
+
+      ],
+     }
+    },
+    {
+     id: 'baojingChartBox',
+     name: '总报警',
+     value: 0,
+     percentage: 81.5,
+     options: {
+      tooltip: {
+       trigger: 'item',
+      },
+      legend: {
+       itemWidth: 8,
+       itemHeight: 8,
+       top: '5%',
+       left: 'center',
+       show: false,
+      },
+      series: [{
+        type: 'pie',
+        radius: ['70%', '80%'],
+        center: ['50%', '50%'],
+        avoidLabelOverlap: false,
+        hoverAnimation: false,
+        startAngle: 90,
+        itemStyle: {
+         normal: {
+          label: {
+           show: false,
+          },
+          labelLine: {
+           show: false,
+          },
+          shadowBlur: 40,
+          borderWidth: 5,
+          shadowColor: 'rgba(0, 0, 0, 0)', // 边框阴影
+         },
+        },
+        data: [{
+         value: 100,
+         name: '',
+         itemStyle: {
+          color: '#234E84'
+         }
+        }, ],
+       },
+       {
+        type: 'pie',
+        radius: ['70%', '100%'],
+        center: ['50%', '50%'],
+        avoidLabelOverlap: false,
+        hoverAnimation: false,
+        startAngle: 90,
+        itemStyle: {
+         normal: {
+          label: {
+           show: false,
+          },
+          labelLine: {
+           show: false,
+          },
+          shadowBlur: 40,
+          borderWidth: 10,
+          shadowColor: 'rgba(0, 0, 0, 0)', // 边框阴影
+         },
+        },
+        data: [{
+          value: 20,
+          name: '主隧洞掘进',
+          itemStyle: {
+           color: '#00FFFF'
+          }
+         },
+         {
+          value: 80,
+          name: '',
+          itemStyle: {
+           color: 'transparent'
+          }
+         },
+        ],
+       },
+      ],
+     }
     }
-  },
-  computed: {
-    sectionStyle() {
-      return {
-        backgroundImage: `url(${this.backgroundImage})`,
-        backgroundRepeat: 'no-repeat',
-        backgroundPosition: 'center center',
-        backgroundSize: '100% 100%'
-      }
-    },
-    enviorStyle() {
-      return {
-        backgroundImage: `url(${this.enviorImage})`,
-        backgroundRepeat: 'no-repeat',
-        backgroundPosition: 'center center',
-        backgroundSize: '100% 100%'
-      }
-    }
-  },
-  methods: {
-    handleControlBtnClick(tab) {
-      this.currentTab = tab;
-    },
-    handleResize() {
-      if (this.myChart) {
-        this.myChart.resize()
-      }
-    },
+   ]
   }
+ },
+ computed: {
+  sectionStyle() {
+   return {
+    backgroundImage: `url(${this.backgroundImage})`,
+    backgroundRepeat: 'no-repeat',
+    backgroundPosition: 'center center',
+    backgroundSize: '100% 100%'
+   }
+  },
+  enviorStyle() {
+   return {
+    backgroundImage: `url(${this.enviorImage})`,
+    backgroundRepeat: 'no-repeat',
+    backgroundPosition: 'center center',
+    backgroundSize: '100% 100%'
+   }
+  }
+ },
+ methods: {
+  handleControlBtnClick(tab) {
+   this.currentTab = tab;
+  },
+  handleResize() {
+   if (this.myChart) {
+    this.myChart.resize()
+   }
+  },
+ }
 }
 </script>
 
 <style scoped>
 .equipment-container {
-  width: 100%;
-  height: calc(100vh - 100px);
-  color: white;
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ height: calc(100vh - 100px);
+ overflow: hidden;
 }
-
+.top-nav{
+  height: 4vh;
+}
+.bottom-nav{
+  flex: 1;
+}
 .section-title {
-  font-size: 18px;
-  margin-bottom: 20px;
-  color: #fff;
+ font-size: 18px;
+ margin-bottom: 20px;
+ color: #fff;
 }
 
 .top-section {
-  width: 100%;
+ width: 100%;
+ height: calc(100% - 80%);
 }
 
 .middle-section {
-  width: 100%;
+ width: 100%;
+ height: 40%;
 }
 
 .bottom-section {
-  width: 100%;
+ width: 100%;
+ height: calc(100% - 20% - 43%);
 }
 
 .stats-grid {
-  width: 100%;
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: center;
-  padding: 20px 10px;
+ width: 100%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding: 20px 10px;
 }
 
-.stat-item{
-  width: 100%;
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-  padding: 20px 14px;
-  height: 52px;
-  background: linear-gradient( 270deg, rgba(48,104,165,0.1) 2%, #3068A5 100%);
-  border-radius: 2px;
-} 
+.stat-item {
+ width: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 20px 14px;
+ height: 52px;
+ background: linear-gradient(270deg, rgba(48, 104, 165, 0.1) 2%, #3068A5 100%);
+ border-radius: 2px;
+}
+
 .env-item {
-  width: 100%;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  padding: 10px 14px;
+ width: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 10px 14px;
 }
 
 .stat-info {
-  display: flex;
-  flex-direction: row;
-  align-items: left;
+ display: flex;
+ flex-direction: row;
+ align-items: left;
 }
+
 .env-info {
-  display: flex;
-  flex-direction: column;
-  width: 70%;
-  height: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ width: 70%;
+ height: 95%;
 }
-.satalabel{
-  font-size: 16px;
-  color: #fff;
+
+.satalabel {
+ font-size: 16px;
+ color: #fff;
 }
+
 .label {
-  font-size: 12px;
-  color: #fff;
+ font-size: 12px;
+ color: #fff;
 }
+
 .envlabel {
-  font-size: 14px;
-  color: #C8C8C8;
-  margin-left: 20px;
+ font-size: 14px;
+ color: #C8C8C8;
 }
 
 .envvalue {
-  font-size: 16px;
-  color: #fff;
-  margin-top: 4px;
-  width: 100%;
-  height: 100%;
-  padding-left: 20px;
+  text-align: center;
+ font-size: 16px;
+ color: #fff;
+ margin-top: 4px;
+ width: 100%;
+ height: 100%;
 }
 
 .equipment-status {
-  padding: 20px 10px;
+ padding: 20px 10px;
+ height: calc(100% - 5vh);
 }
 
 .status-title {
-  font-size: 16px;
-  margin-bottom: 20px;
+ font-size: 16px;
+ margin-bottom: 20px;
 }
 
 .status-circles {
-  display: flex;
-  justify-content: space-around;
-  margin: 20px 0;
+ display: flex;
+ justify-content: space-around;
+ margin: 20px 0;
 }
 
 .progress-circle {
-  width: 80px;
-  height: 80px;
-  border-radius: 50%;
-  border: 4px solid #3068A5;
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: center;
-  position: relative;
+ width: 80px;
+ height: 80px;
+ border-radius: 50%;
+ border: 4px solid #3068A5;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ position: relative;
 }
 
 .percentage {
-  font-size: 12px;
-  color: #00ffff;
-  position: absolute;
-  top: 50%;
-  left: 50%;
-  transform: translate(-50%, -50%);
+ font-size: 12px;
+ color: #00ffff;
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
 }
 
 .environment-grid {
-  display: grid;
-  grid-template-columns: repeat(2, 1fr);
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ height: calc(100% - 5vh);
 }
 
 .control-buttons {
-  display: flex;
-  gap: 10px;
-  justify-content: center;
+ display: flex;
+ gap: 10px;
+ justify-content: center;
 }
 
 .control-btn {
-  padding: 8px 16px;
-  background: rgba(112,119,140,0.3);
-  border-radius: 2px;
-  border: 1px solid rgba(112,124,140,0.6);
-  color: #C8C8C8;
-  cursor: pointer;
+ padding: 8px 16px;
+ background: rgba(112, 119, 140, 0.3);
+ border-radius: 2px;
+ border: 1px solid rgba(112, 124, 140, 0.6);
+ color: #C8C8C8;
+ cursor: pointer;
 }
 
 .control-btn.active {
-  background: rgba(255,191,0,0.2);
-  border-radius: 2px;
-  border: 1px solid #FFBF00;
-  color: #fff;
+ background: rgba(255, 191, 0, 0.2);
+ border-radius: 2px;
+ border: 1px solid #FFBF00;
+ color: #fff;
 }
 
 .divider {
-  width: 100%;
-  height: 1px;
-  background: linear-gradient( 270deg, rgba(94,161,209,0.1) 0%, #4886BC 49%, rgba(48,104,165,0.1) 100%);
-  margin: 20px 0;
+ width: 100%;
+ height: 1px;
+ background: linear-gradient(270deg, rgba(94, 161, 209, 0.1) 0%, #4886BC 49%, rgba(48, 104, 165, 0.1) 100%);
+ margin: 20px 0;
 }
 
-.progress-bar {
-  margin-top: 20px;
-}
+
 
 .bar {
-  width: 100%;
+ width: 100%;
 }
 
 .progress {
-  background: rgba(216,216,216,0.1);
-  border: 1px solid rgba(255,255,255,0.2);
-  overflow: hidden;
+ background: rgba(216, 216, 216, 0.1);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ overflow: hidden;
 }
 
 .progress-blocks {
-  position: absolute;
-  top: 0;
-  left: 0;
-  width: 100%;
-  height: 100%;
-  display: flex;
-  gap: 4px;
-  padding: 2px 4px;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ display: flex;
+ gap: 4px;
+ padding: 2px 4px;
 }
 
 .block {
-  flex: 1;
-  height: 100%;
-  background: rgba(216,216,216,0.1);
+ flex: 1;
+ height: 100%;
+ background: rgba(216, 216, 216, 0.1);
 }
 
 .block.active {
-  background: linear-gradient(180deg, #FFD500 0%, #FF9B00 100%);
+ background: linear-gradient(180deg, #FFD500 0%, #FF9B00 100%);
 }
 
 .progress-inner {
-  display: none;
+ display: none;
 }
 </style>
diff --git a/src/views/Home.vue b/src/views/Home.vue
index da552b2..a2ab897 100644
--- a/src/views/Home.vue
+++ b/src/views/Home.vue
@@ -1,362 +1,491 @@
 <template>
-  <div class="home-container">
-    <!-- 顶部导航 -->
-    <div class="top-nav">
-      <div class="nav-items">
-        <div class="nav-item mr-[8px]" :class="{ active: currentView === 'model' }" @click="handleChange('model')">模型</div>
-        <div class="nav-item mr-[8px]" :class="{ active: currentView === '720' }" @click="handleChange('720')">720全景</div>
-        <div class="nav-item" :class="{ active: currentView === 'project' }" @click="handleChange('project')">项目实况</div>
-      </div>
-      <div class="time-info">
-        <div class="time-info-item">
-          <i class="el-icon-date" style="color: #FFBF00;font-size: 20px;"></i>
-          <div class="text-white text-[16px] ml-[4px]">工程倒计时/天</div>
-          <div class="text-[#FFBF00] text-[24px] font-bold ml-[28px]">175</div>
-        </div>
-        <div class="time-line">
-        </div>
-      </div>
-    </div>
+<div class="home-container">
+ <!-- 顶部导航 -->
+ <div class="top-nav">
+  <div class="nav-items">
+   <div class="nav-item mr-[8px]" :class="{ active: currentView === 'model' }" @click="handleChange('model')">模型</div>
+   <div class="nav-item mr-[8px]" :class="{ active: currentView === '720' }" @click="handleChange('720')">720全景</div>
+   <div class="nav-item" :class="{ active: currentView === 'project' }" @click="handleChange('project')">项目实况</div>
+  </div>
+  <div class="time-info">
+   <div class="time-info-item">
+    <i class="el-icon-date" style="color: #FFBF00;font-size: 20px;"></i>
+    <div class="text-white text-[16px] ml-[4px]">工程倒计时/天</div>
+    <div class="text-[#FFBF00] text-[24px] font-bold ml-[28px]">175</div>
+   </div>
+   <div class="time-line">
+   </div>
+  </div>
+ </div>
+ <div class="bottom-nav">
+  <div class="content-wrapper mb-[20px]">
+   <!-- 720菜单 -->
+   <div class="side-menu" v-if="currentView === '720'">
+    <el-cascader popper-class="custom-dropdown" v-model="panoValue" :options="panoList" @change="handlePanoChange">
+    </el-cascader>
+   </div>
 
-    <div class="content-wrapper mb-[20px]">
-      <!-- 720菜单 -->
-      <div class="side-menu" v-if="currentView === '720'">
-        <div class="menu-dropdown">
-          <select class="menu-select">
-            <option>请选择</option>
-          </select>
-        </div>
-        <div class="menu-list">
-          <div class="menu-item">
-            <span>一期</span>
-            <i class="arrow-icon"></i>
-          </div>
-          <div class="menu-item">
-            <span>二期</span>
-            <i class="arrow-icon"></i>
-          </div>
-          <div class="menu-item">
-            <span>三期</span>
-            <i class="arrow-icon"></i>
-          </div>
-          <div class="menu-item">
-            <span>四期</span>
-            <i class="arrow-icon"></i>
-          </div>
-        </div>
-        <div class="submenu">
-          <div class="submenu-item">1#楼东立面图</div>
-          <div class="submenu-item">1#出入口层立-1</div>
-          <div class="submenu-item">2#出入口层立-2</div>
-          <div class="submenu-item">2#楼东立面图</div>
-          <div class="submenu-item">3#楼东立面图</div>
-          <div class="submenu-item">停车场入口区控制面</div>
-        </div>
-      </div>
-
-      <!-- 主要内容区域 -->
-      <div class="main-content" v-loading="isLoading">
-        <!-- 模型 -->
-        <div class="w-full h-full" v-if="currentView === 'model'" >
-          <iframe id="model-iframe" class="content-frame w-full h-[588px]" src="" frameborder="0"></iframe>
-        </div>
-        <!-- 720 -->
-        <div class="w-full h-full bg-white" v-if="currentView === '720'">
-          <div id="panoviewpreview" class="pano-frame w-full h-[588px]">
-          </div>
-        </div>
-        <!-- 项目 -->
-        <div class="w-full h-full" v-if="currentView === 'project'" >
-          <iframe id="scene-iframe" class="scene-frame w-full h-[588px]" src="" frameborder="0"></iframe>
-        </div>
-      </div>
+   <!-- 主要内容区域 -->
+   <div class="main-content" v-loading="isLoading">
+    <!-- 模型 -->
+    <div class="w-full h-full" v-if="currentView === 'model'">
+     <iframe id="model-iframe" class="content-frame w-full h-full" src="" frameborder="0"></iframe>
     </div>
-    <div class="chart-content">
-      <div 
-        class="w-full h-[4vh] mb-[1vh]" 
-        :style="{
+    <!-- 720 -->
+    <div :style="isFullScreen ? fullScreenStyle : 'width: 100%; height: 100%;'" v-if="currentView === '720'">
+     <div id="panoviewpreview" class="pano-frame w-full h-full" :style="isFullScreen ? fullScreenPanoStyle : ''">
+     </div>
+     <!-- 720全景图版本选择 -->
+     <div class="w-full h-[120px] bg-[rgba(19,40,64,0.8)] absolute bottom-0 left-0 right-0 flex items-center py-[10px]" :style="isFullScreen ? 'z-index: 100; height:' : ''" v-if="currentView === '720'">
+      <div v-for="item in panoVersionList" :key="item.value" :style="isFullScreen ? 'z-index: 100;' : ''">
+       <div class="w-[160px] h-[100px] mr-[10px] ml-[10px] cursor-pointer border-[1px] border-[#3068A5] rounded-[2px]">
+        <img :src="item.img" alt="全景图" class="w-full h-full" />
+       </div>
+      </div>
+     </div>
+
+     <!-- 放大镜 -->
+     <div class="w-[80px] h-[80px] bg-[#008C99] absolute top-[-40px] right-[-40px] rounded-[50%]" v-if="currentView === '720'" @click="handleZoomOut">
+      <img src="../assets/images/backgrounds/zoomout.png" alt="放大" class="w-[16px] h-[16px] mt-[50px] ml-[15px] cursor-pointer" v-if="isFullScreen" />
+      <img src="../assets/images/backgrounds/zoomout.png" alt="缩小" class="w-[16px] h-[16px] mt-[50px] ml-[15px] cursor-pointer" v-else />
+     </div>
+    </div>
+    <!-- 项目 -->
+    <div class="w-full h-full" v-if="currentView === 'project'">
+     <iframe id="scene-iframe" class="scene-frame w-full h-full" src="" frameborder="0"></iframe>
+    </div>
+   </div>
+
+  </div>
+  <div class="chart-content">
+   <div class="w-full h-[4vh] mb-[1vh]" :style="{
           backgroundImage: `url(${bottomImage})`,
           backgroundRepeat: 'no-repeat',
           backgroundPosition: 'center center',
           backgroundSize: '100% 100%'
-        }"
-      >
-      </div>
-      <div class="chart-container">
-        <img src="../assets/images/backgrounds/shigongjinduchart.png" alt="施工进度" class="w-full h-[280px]"/>
-      </div>
-    </div>
+        }">
+   </div>
+   <div class="chart-container" :style="sectionStyle">
+    <img src="../assets/images/backgrounds/shigongjinduchart.png" alt="施工进度" class="w-full h-full" />
+   </div>
   </div>
+ </div>
+
+</div>
 </template>
 
 <script>
-import { nextTick } from 'vue'
+import {
+ nextTick
+} from 'vue'
 export default {
-  name: 'Home',
-  components: {
-  },
-  data() {
-    return {
-      currentView: 'model',
-      chartOptions: {
-        id: 'shigongjinduChart',
-        options: {
-          title: {
-            text: '施工进度'
-          }
-        }
-      },
-      bottomImage: new URL('@/assets/images/titles/shigong.png', import.meta.url).href,
-      isLoading: false
+ name: 'Home',
+ components: {},
+ data() {
+  return {
+   currentView: 'model',
+   chartOptions: {
+    id: 'shigongjinduChart',
+    options: {
+     title: {
+      text: '施工进度'
+     }
     }
+   },
+   bottomImage: new URL('@/assets/images/titles/shigong.png',
+    import.meta.url).href,
+   isLoading: false,
+   panoVersionList: [{
+     value: '1',
+     img: 'http://dev-pano.vothing.com/Panorama/bfb5597e-72cc-7f70-679c-fda46008effe/vtour/panos/7299e0b4-eac5-4c93-9d63-305fa2867f10.tiles/thumb.jpg'
+    },
+    {
+     value: '2',
+     img: 'http://dev-pano.vothing.com/Panorama/bfb5597e-72cc-7f70-679c-fda46008effe/vtour/panos/2e984554-8708-47dd-b8a0-b53e9e727ca2.tiles/thumb.jpg'
+    },
+
+   ],
+   isFullScreen: false,
+   fullScreenStyle: '',
+   fullScreenPanoStyle: '',
+   panoList: [{
+    value: 'zhinan',
+    label: '指南',
+    children: [{
+     value: 'shejiyuanze',
+     label: '设计原则'
+    }, {
+     value: 'daohang',
+     label: '导航'
+    }]
+   }, {
+    value: 'zujian',
+    label: '组件',
+    children: [{
+     value: 'basic',
+     label: 'Basic',
+    }, {
+     value: 'form',
+     label: 'Form',
+    }, {
+     value: 'data',
+     label: 'Data',
+    }, {
+     value: 'notice',
+     label: 'Notice',
+    }, {
+     value: 'navigation',
+     label: 'Navigation',
+    }, {
+     value: 'others',
+     label: 'Others',
+    }],
+   }],
+   panoValue: [],
+   backgroundImage: new URL('@/assets/images/backgrounds/cover_bg.png',
+    import.meta.url).href,
+  }
+ },
+ computed: {
+  sectionStyle() {
+   return {
+    backgroundImage: `url(${this.backgroundImage})`,
+    backgroundRepeat: 'no-repeat',
+    backgroundPosition: 'center center',
+    backgroundSize: '100% 100%'
+   }
+  }
+ },
+
+ methods: {
+  handleZoomOut() {
+   console.log('放大')
+   this.isFullScreen = !this.isFullScreen
+   if (this.isFullScreen) {
+    const clientX = document.documentElement.clientWidth || document.body.clientWidth
+    const clientY = document.documentElement.clientHeight || document.body.clientHeight
+    this.fullScreenPanoStyle = `width: 100%; height: 100%; z-index: 100; `
+    this.fullScreenStyle = `width: ${clientX - 40}px; height: ${clientY - 120}px; margin:20px; position: fixed; top: 80px; left: 0;z-index: 100;background-color: #fff;overflow: hidden;`
+   }
   },
-  methods: {
-    handleChange(view) {
-      this.isLoading = true
-      this.currentView = view
-      if (view === 'model') {
-        removepano('krpanoSWFObject')
-        nextTick(() => {
-          this.modelShow()
-        })
-      } else if (view === '720') {
-        nextTick(() => {
-          this.panoShow()
-        })
-      } else if (view === 'project') {
-        nextTick(() => {
-          this.sceneShow()
-        })
-      }
-    },
-    modelShow() {
-      const iframe = document.getElementById('model-iframe')
-      const token = '08168BBAD572518D1AB6EC233A13C3E2FA9C16340A21C6B6D0F2785DBDF2CB3506A0873877DA22C7E7ADA6CB1012493B4C702FC75B529ABD'
-      const projectId = '1c179617-a7d9-4243-b813-84fa55a17ce7'
-      let ifrSrc = ''
-      console.log('模型中查看')
-      ifrSrc = `${window.ProjectConfig.modelUrl}?token=${token}&projectId=${projectId}&isPreview=1&edit=false`
-      iframe.src = ifrSrc
-      console.log('加载iframe地址', ifrSrc)
-      this.isLoading = false
-    },
-    panoShow(item, scene) {
-      this.isLoading = false
-      const basepath = `${window.ProjectConfig.panoUrl}/Panorama${item.PbUrl}/vtour/`
-      const xmlurl = `${basepath}tour.xml?r=${(Math.random() * 100000 + 1)}`
-      let setting = {}
-      if (scene) {
-        const scenename = 'scene_' + scene.PsScenename
-        setting = { startscene: scenename }
-      }
-      this.$nextTick(() => {
-        embedpano({
-          xml: xmlurl,
-          target: 'panoviewpreview',
-          basepath,
-          vars: setting,
-          html5: 'auto',
-          passQueryParameters: true
-        })
-      })
-    },
-    sceneShow() {
-      const iframe = document.getElementById('scene-iframe')
-      const ifrSrc = window.ProjectConfig.sceneUrl
-      iframe.src = ifrSrc
-      this.isLoading = false
+  handleChange(view) {
+   this.isLoading = true
+   this.currentView = view
+   if (view === 'model') {
+    removepano('krpanoSWFObject')
+    nextTick(() => {
+     this.modelShow()
+    })
+   } else if (view === '720') {
+    nextTick(() => {
+     this.panoShow()
+    })
+   } else if (view === 'project') {
+    nextTick(() => {
+     this.sceneShow()
+    })
+   }
+  },
+  handlePanoChange(value) {
+   console.log('value', value)
+  },
+  modelShow() {
+   const iframe = document.getElementById('model-iframe')
+   const token = '08168BBAD572518D1AB6EC233A13C3E2FA9C16340A21C6B6D0F2785DBDF2CB3506A0873877DA22C7E7ADA6CB1012493B4C702FC75B529ABD'
+   const projectId = '1c179617-a7d9-4243-b813-84fa55a17ce7'
+   let ifrSrc = ''
+   console.log('模型中查看')
+   ifrSrc = `${window.ProjectConfig.modelUrl}?token=${token}&projectId=${projectId}&isPreview=1&edit=false`
+   iframe.src = ifrSrc
+   console.log('加载iframe地址', ifrSrc)
+   this.isLoading = false
+  },
+  panoShow(item, scene) {
+   this.isLoading = false
+   const basepath = `${window.ProjectConfig.panoUrl}/Panorama${item.PbUrl}/vtour/`
+   const xmlurl = `${basepath}tour.xml?r=${(Math.random() * 100000 + 1)}`
+   let setting = {}
+   if (scene) {
+    const scenename = 'scene_' + scene.PsScenename
+    setting = {
+     startscene: scenename
     }
+   }
+   this.$nextTick(() => {
+    embedpano({
+     xml: xmlurl,
+     target: 'panoviewpreview',
+     basepath,
+     vars: setting,
+     html5: 'auto',
+     passQueryParameters: true
+    })
+   })
   },
-  mounted() {
-    this.isLoading = true
-    this.modelShow()
-  },
+  sceneShow() {
+   const iframe = document.getElementById('scene-iframe')
+   const ifrSrc = window.ProjectConfig.sceneUrl
+   iframe.src = ifrSrc
+   this.isLoading = false
+  }
+ },
+ mounted() {
+  this.isLoading = true
+  this.modelShow()
+ },
 }
 </script>
 
-<style scoped lang="scss">
+<style lang="scss" scoped>
 .home-container {
-  display: flex;
-  flex-direction: column;
-  height: 100vh;
+ display: flex;
+ flex-direction: column;
+ height: calc(100vh - 100px);
+ overflow: hidden;
 }
 
 .top-nav {
-  height: 50px;
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  color: white;
+ height: 5vh;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ color: white;
+}
+.bottom-nav{
+  flex: 1;
 }
 
 .nav-items {
-  display: flex;
-  gap: 20px;
+ display: flex;
+ gap: 20px;
 }
 
 .nav-item {
-  background: rgba(112,119,140,0.3);
-  border-radius: 2px;
-  border: 1px solid rgba(112,124,140,0.6);
-  padding: 5px 16px;
-  cursor: pointer;
+ background: rgba(112, 119, 140, 0.3);
+ border-radius: 2px;
+ border: 1px solid rgba(112, 124, 140, 0.6);
+ padding: 5px 16px;
+ cursor: pointer;
 }
 
 .nav-item.active {
-  background: rgba(255,191,0,0.2);
-  border-radius: 2px;
-  border: 1px solid #FFBF00;
+ background: rgba(255, 191, 0, 0.2);
+ border-radius: 2px;
+ border: 1px solid #FFBF00;
 }
 
 .time-info {
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  width: 200px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ width: 200px;
 }
+
 .time-info-item {
-  display: flex;
-  align-items: center;
-  
+ display: flex;
+ align-items: center;
+
 }
+
 .time-line {
-  width: 200px;
-  height: 1px;
-  background: linear-gradient( 270deg, rgba(255,191,0,0) 0%, #FFBF00 100%);
+ width: 200px;
+ height: 1px;
+ background: linear-gradient(270deg, rgba(255, 191, 0, 0) 0%, #FFBF00 100%);
 }
 
 .content-wrapper {
-  display: flex;
-  overflow: hidden;
-  position: relative;
+ display: flex;
+ overflow: hidden;
+ position: relative;
+ height: 52%;
+}
+
+.chart-content {
+ width: 100%;
+ height: calc(100% - 52% - 20px);
 }
 
 .side-menu {
-  width: 250px;
-  background-color: #1e3d6b;
-  color: white;
-  position: absolute;
-  top: 10px;
-  left: 10px;
-  right: auto;
-  bottom: auto;
+ width: 160px;
+ color: white;
+ position: absolute;
+ top: 10px;
+ left: 10px;
+ right: auto;
+ bottom: auto;
+
+ ::v-deep .el-cascader {
+  width: 100%;
+  height: 100%;
+
+  .el-cascader-node__label {
+   color: #fff;
+  }
+
+  .el-input .el-input__inner {
+   background: rgba(33, 72, 115, 0.9);
+  }
+ }
 }
 
 .menu-dropdown {
-  padding: 15px;
+ padding: 15px;
 }
 
 .menu-select {
-  width: 100%;
-  padding: 8px;
-  background-color: #0a1931;
-  color: white;
-  border: 1px solid #2a4d7d;
+ width: 100%;
+ padding: 8px;
+ background-color: #0a1931;
+ color: white;
+ border: 1px solid #2a4d7d;
 }
 
 .menu-list {
-  border-top: 1px solid #2a4d7d;
+ border-top: 1px solid #2a4d7d;
 }
 
 .menu-item {
-  padding: 12px 20px;
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  cursor: pointer;
+ padding: 12px 20px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ cursor: pointer;
 }
 
 .menu-item:hover {
-  background-color: rgba(255, 255, 255, 0.1);
+ background-color: rgba(255, 255, 255, 0.1);
 }
 
 .arrow-icon {
-  border: solid white;
-  border-width: 0 2px 2px 0;
-  display: inline-block;
-  padding: 3px;
-  transform: rotate(-45deg);
+ border: solid white;
+ border-width: 0 2px 2px 0;
+ display: inline-block;
+ padding: 3px;
+ transform: rotate(-45deg);
 }
 
 .submenu {
-  background-color: #152b4a;
+ background-color: #152b4a;
 }
 
 .submenu-item {
-  padding: 10px 30px;
-  font-size: 14px;
-  cursor: pointer;
+ padding: 10px 30px;
+ font-size: 14px;
+ cursor: pointer;
 }
 
 .submenu-item:hover {
-  background-color: rgba(255, 255, 255, 0.1);
+ background-color: rgba(255, 255, 255, 0.1);
 }
 
 .main-content {
-  flex: 1;
-  background-color: #fff;
-  width: 100%;
-  height: 588px;
+ flex: 1;
+ background-color: #fff;
+ width: 100%;
+ height: 100%;
 }
 
 .content-header {
-  color: white;
-  margin-bottom: 20px;
+ color: white;
+ margin-bottom: 20px;
 }
 
 .chart-container {
-  background-color: #1e3d6b;
-  border-radius: 8px;
-  padding: 20px;
-  width: 100%;
-  height: 100%;
+ padding: 20px;
+ width: 100%;
+ height: calc(100% - 5vh);
 }
 
 .chart-legend {
-  display: flex;
-  gap: 20px;
-  margin-bottom: 20px;
-  color: white;
+ display: flex;
+ gap: 20px;
+ margin-bottom: 20px;
+ color: white;
 }
 
 .legend-item {
-  display: flex;
-  align-items: center;
-  gap: 8px;
+ display: flex;
+ align-items: center;
+ gap: 8px;
 }
 
 .dot {
-  width: 10px;
-  height: 10px;
-  border-radius: 50%;
+ width: 10px;
+ height: 10px;
+ border-radius: 50%;
 }
 
 .dot.blue {
-  background-color: #00ffff;
+ background-color: #00ffff;
 }
 
 .dot.yellow {
-  background-color: #ffd700;
+ background-color: #ffd700;
 }
 
 .chart-area {
-  height: 400px;
-  margin-bottom: 20px;
+ height: 400px;
+ margin-bottom: 20px;
 }
 
 .chart-tabs {
-  display: flex;
-  gap: 10px;
+ display: flex;
+ gap: 10px;
 }
 
 .tab {
-  padding: 8px 16px;
-  color: white;
-  cursor: pointer;
-  border-radius: 4px;
+ padding: 8px 16px;
+ color: white;
+ cursor: pointer;
+ border-radius: 4px;
 }
 
 .tab.active {
-  background-color: #2a4d7d;
+ background-color: #2a4d7d;
+}
+</style><style lang="scss">
+.custom-dropdown {
+ background-color: rgba(33, 72, 115, 0.9);
+ border-radius: 2px;
+ border: 1px solid #3068A5;
+
+ .el-cascader-menu {
+  color: #fff;
+
+  .el-cascader-node__label {
+   color: #fff;
+  }
+ }
+
+ .el-cascader .el-input .el-input__inner:focus,
+ .el-cascader .el-input.is-focus .el-input__inner {
+  height: 28px;
+  line-height: 28px;
+ }
+
+ .el-cascader .el-input .el-input__inner {
+  height: 28px;
+  line-height: 28px;
+  background: rgba(33, 72, 115, 0.9);
+ }
+
+ .el-input__icon {
+  line-height: 38px;
+ }
+
+ .el-cascader-node:not(.is-disabled):focus,
+ .el-cascader-node:not(.is-disabled):hover {
+  background: #3068A5;
+ }
+
+ .popper__arrow {
+  display: none;
+ }
+
+ .el-scrollbar__wrap {
+  overflow: hidden;
+  margin-bottom: 0px !important;
+  margin-right: 0px !important;
+ }
 }
 </style>
diff --git a/src/views/ProjectView.vue b/src/views/ProjectView.vue
index f0d31c4..cc1d4b8 100644
--- a/src/views/ProjectView.vue
+++ b/src/views/ProjectView.vue
@@ -22,187 +22,195 @@
         backgroundSize: 'cover'
       }"
     >
-      <!-- 建筑面积 -->
-      <div 
-        class="w-full h-[50px] mb-[10px] flex items-center justify-evenly" 
-        :style="{
-          backgroundImage: `url(${contentImage})`,
-          backgroundRepeat: 'no-repeat',
-          backgroundPosition: 'center center',
-          backgroundSize: '100% 100%'
-        }"
-      >
+      <div class="h-[120px] w-full">
+        <!-- 建筑面积 -->
+        <div 
+          class="w-full h-[50px] mb-[10px] flex items-center justify-evenly" 
+          :style="{
+            backgroundImage: `url(${contentImage})`,
+            backgroundRepeat: 'no-repeat',
+            backgroundPosition: 'center center',
+            backgroundSize: '100% 100%'
+          }"
+        >
+          <img 
+            src="../assets/images/backgrounds/jianzhumianji.png" 
+            alt="" 
+            class="h-[30px] w-[40px]"
+          >
+          <div class="text-white text-[14px]">一期总建筑面积</div>
+          <div class="flex items-center justify-center">
+            <div class="text-[24px] text-[#FFD500] font-bold mr-[8px]">103.18</div>
+            <div class="text-[14px] text-white">万㎡</div>
+          </div>
+        </div>
+
+        <!-- 目标日期 -->
+        <div 
+          class="w-full h-[50px] flex items-center justify-evenly" 
+          :style="{
+            backgroundImage: `url(${contentImage})`,
+            backgroundRepeat: 'no-repeat',
+            backgroundPosition: 'center center',
+            backgroundSize: '100% 100%'
+          }"
+        >
+          <img 
+            src="../assets/images/backgrounds/mubiaowancheng.png" 
+            alt="" 
+            class="h-[30px] w-[40px]"
+          >
+          <div class="text-white text-[14px]">目标完成日期</div>
+          <div class="flex items-center justify-center">
+            <div class="text-[24px] text-[#00FFFF] font-bold">2028-12-01</div>
+          </div>
+        </div>
+      </div>
+      <div class="w-[100%] h-[38%]">
+        <!-- 项目名称 -->
+        <div 
+          class="w-full h-[30px] mt-[20px] mb-[10px]" 
+          :style="{
+            backgroundImage: `url(${bgImage})`,
+            backgroundRepeat: 'no-repeat',
+            backgroundPosition: 'center center',
+            backgroundSize: '100% 100%'
+          }"
+        >
+          <div class="text-white text-[14px] ml-[40px] leading-[35px]">项目名称:北京交通大学雄安校区</div>
+        </div>
+
+        <div class="text-white text-[14px] tracking-[1px] leading-[24px] h-[60px]">
+          北京交通大学雄安校区选址位于河北雄安新区第五组团及启动区。东至规划绿地、城市道路NB6,南至城市道路ED34、城市道路EA2,西至城市道路ND32、城市道路NA11,北至城市道路EA1。
+        </div>
+
         <img 
-          src="../assets/images/backgrounds/jianzhumianji.png" 
+          src="../assets/images/backgrounds/map.png" 
           alt="" 
-          class="h-[30px] w-[40px]"
+          class="w-full h-[196px] mt-[20px]"
         >
-        <div class="text-white text-[14px]">一期总建筑面积</div>
-        <div class="flex items-center justify-center">
-          <div class="text-[24px] text-[#FFD500] font-bold mr-[8px]">103.18</div>
-          <div class="text-[14px] text-white">万㎡</div>
-        </div>
       </div>
-
-      <!-- 目标日期 -->
-      <div 
-        class="w-full h-[50px] flex items-center justify-evenly" 
-        :style="{
-          backgroundImage: `url(${contentImage})`,
-          backgroundRepeat: 'no-repeat',
-          backgroundPosition: 'center center',
-          backgroundSize: '100% 100%'
-        }"
-      >
-        <img 
-          src="../assets/images/backgrounds/mubiaowancheng.png" 
-          alt="" 
-          class="h-[30px] w-[40px]"
+      <div class="w-[100%] h-[15%]">
+        <!-- 参建单位 -->
+        <div 
+          class="w-full h-[30px] mt-[20px] mb-[10px]" 
+          :style="{
+            backgroundImage: `url(${bgImage})`,
+            backgroundRepeat: 'no-repeat',
+            backgroundPosition: 'center center',
+            backgroundSize: '100% 100%'
+          }"
         >
-        <div class="text-white text-[14px]">目标完成日期</div>
-        <div class="flex items-center justify-center">
-          <div class="text-[24px] text-[#00FFFF] font-bold">2028-12-01</div>
+          <div class="text-white text-[14px] ml-[40px] leading-[35px]">参建单位</div>
         </div>
-      </div>
 
-      <!-- 项目名称 -->
-      <div 
-        class="w-full h-[30px] mt-[20px] mb-[10px]" 
-        :style="{
-          backgroundImage: `url(${bgImage})`,
-          backgroundRepeat: 'no-repeat',
-          backgroundPosition: 'center center',
-          backgroundSize: '100% 100%'
-        }"
-      >
-        <div class="text-white text-[14px] ml-[40px] leading-[35px]">项目名称:北京交通大学雄安校区</div>
-      </div>
-
-      <div class="text-white text-[14px] tracking-[1px] leading-[24px]">
-        北京交通大学雄安校区选址位于河北雄安新区第五组团及启动区。东至规划绿地、城市道路NB6,南至城市道路ED34、城市道路EA2,西至城市道路ND32、城市道路NA11,北至城市道路EA1。
-      </div>
-
-      <img 
-        src="../assets/images/backgrounds/map.png" 
-        alt="" 
-        class="w-full h-[196px] mt-[20px]"
-      >
-
-      <!-- 参建单位 -->
-      <div 
-        class="w-full h-[30px] mt-[20px] mb-[10px]" 
-        :style="{
-          backgroundImage: `url(${bgImage})`,
-          backgroundRepeat: 'no-repeat',
-          backgroundPosition: 'center center',
-          backgroundSize: '100% 100%'
-        }"
-      >
-        <div class="text-white text-[14px] ml-[40px] leading-[35px]">参建单位</div>
-      </div>
-
-      <!-- 参建单位统计 -->
-      <div class="flex justify-between mb-[10px]">
-        <div class="w-[48%] h-[50px] px-[12px] flex items-center justify-between mr-[8px] mb-[10px] lineB">
-          <div class="text-white text-[14px] flex flex-col items-center justify-center">
-            <div class="text-[16px] text-[#00FFFF]">3</div>
-            <div class="text-[12px] text-[#ddd]">建设单位</div>
-          </div>
-          <img 
-            src="../assets/images/backgrounds/jianshedanwei.png" 
-            alt="" 
-            class="h-[40px] w-[60px]"
-          >
-        </div>
-        <div class="w-[48%] h-[50px] px-[12px] flex items-center justify-between mb-[10px] lineB">
-          <div class="text-white text-[14px] flex flex-col items-center justify-center">
-            <div class="text-[16px] text-[#00FFFF]">5</div>
-            <div class="text-[12px] text-[#ddd]">施工单位</div>
-          </div>
-          <img 
-            src="../assets/images/backgrounds/shigongdanwei.png" 
-            alt="" 
-            class="h-[40px] w-[60px]"
-          >
-        </div>
-      </div>
-
-      <div class="flex justify-between">
-        <div class="w-[48%] h-[50px] px-[12px] flex items-center justify-between mr-[8px] mb-[10px] lineB">
-          <div class="text-white text-[14px] flex flex-col items-center justify-center">
-            <div class="text-[16px] text-[#00FFFF]">1</div>
-            <div class="text-[12px] text-[#ddd]">监理单位</div>
-          </div>
-          <img 
-            src="../assets/images/backgrounds/jianlidanwei.png" 
-            alt="" 
-            class="h-[40px] w-[60px]"
-          >
-        </div>
-        <div class="w-[48%] h-[50px] px-[12px] flex items-center justify-between mb-[10px] lineB">
-          <div class="text-white text-[14px] flex flex-col items-center justify-center">
-            <div class="text-[16px] text-[#00FFFF]">1</div>
-            <div class="text-[12px] text-[#ddd]">设计单位</div>
-          </div>
-          <img 
-            src="../assets/images/backgrounds/shejidanwei.png" 
-            alt="" 
-            class="h-[40px] w-[60px]"
-          >
-        </div>
-      </div>
-
-      <!-- 表格搜索 -->
-      <div class="w-full flex items-center justify-between mb-[10px] mt-[20px]">
-        <el-input
-          v-model="searchText"
-          placeholder="搜索"
-          class="search-item w-full rounded-[2px]"
-          prefix-icon="el-icon-search"
-        >
-        </el-input>
-      </div>
-
-      <!-- 表格 -->
-      <div 
-        class="w-full min-h-[20vh] px-[8px] py-[10px]" 
-        :style="{
-          backgroundImage: `url(${tableImage})`,
-          backgroundRepeat: 'no-repeat',
-          backgroundPosition: 'center center',
-          backgroundSize: '100% 100%'
-        }"
-      >
-        <table class="w-full text-white text-[14px] overflow-y-auto">
-          <thead>
-            <tr class="table-header">
-              <th class="py-[8px] text-left pl-[12px]">类型</th>
-              <th class="py-[8px] text-left">阶段</th>
-              <th class="py-[8px] text-left">名称</th>
-            </tr>
-          </thead>
-          <tbody>
-            <tr 
-              v-for="item in tableData" 
-              :key="item.id"
-              class="border-b border-[rgba(255,255,255,0.1)]"
+        <!-- 参建单位统计 -->
+        <div class="flex justify-between mb-[10px]">
+          <div class="w-[48%] h-[50px] px-[12px] flex items-center justify-between mr-[8px] mb-[10px] lineB">
+            <div class="text-white text-[14px] flex flex-col items-center justify-center">
+              <div class="text-[16px] text-[#00FFFF]">3</div>
+              <div class="text-[12px] text-[#ddd]">建设单位</div>
+            </div>
+            <img 
+              src="../assets/images/backgrounds/jianshedanwei.png" 
+              alt="" 
+              class="h-[40px] w-[60px]"
             >
-              <td class="py-[8px] pl-[12px]">{{ item.type }}</td>
-              <td class="py-[8px]">{{ item.stage }}</td>
-              <td class="py-[8px]">{{ item.name }}</td>
-            </tr>
-          </tbody>
-        </table>
+          </div>
+          <div class="w-[48%] h-[50px] px-[12px] flex items-center justify-between mb-[10px] lineB">
+            <div class="text-white text-[14px] flex flex-col items-center justify-center">
+              <div class="text-[16px] text-[#00FFFF]">5</div>
+              <div class="text-[12px] text-[#ddd]">施工单位</div>
+            </div>
+            <img 
+              src="../assets/images/backgrounds/shigongdanwei.png" 
+              alt="" 
+              class="h-[40px] w-[60px]"
+            >
+          </div>
+        </div>
+
+        <div class="flex justify-between">
+          <div class="w-[48%] h-[50px] px-[12px] flex items-center justify-between mr-[8px] mb-[10px] lineB">
+            <div class="text-white text-[14px] flex flex-col items-center justify-center">
+              <div class="text-[16px] text-[#00FFFF]">1</div>
+              <div class="text-[12px] text-[#ddd]">监理单位</div>
+            </div>
+            <img 
+              src="../assets/images/backgrounds/jianlidanwei.png" 
+              alt="" 
+              class="h-[40px] w-[60px]"
+            >
+          </div>
+          <div class="w-[48%] h-[50px] px-[12px] flex items-center justify-between mb-[10px] lineB">
+            <div class="text-white text-[14px] flex flex-col items-center justify-center">
+              <div class="text-[16px] text-[#00FFFF]">1</div>
+              <div class="text-[12px] text-[#ddd]">设计单位</div>
+            </div>
+            <img 
+              src="../assets/images/backgrounds/shejidanwei.png" 
+              alt="" 
+              class="h-[40px] w-[60px]"
+            >
+          </div>
+        </div>
+      </div>
+      <div class="chart-container">
+        <!-- 表格搜索 -->
+        <div class="w-full flex items-center justify-between mb-[10px] mt-[20px]">
+          <el-input
+            v-model="searchText"
+            placeholder="搜索"
+            class="search-item w-full rounded-[2px]"
+            prefix-icon="el-icon-search"
+          >
+          </el-input>
+        </div>
+
+        <!-- 表格 -->
+        <div 
+          class="w-full min-h-[20vh] px-[8px] py-[10px]" 
+          :style="{
+            backgroundImage: `url(${tableImage})`,
+            backgroundRepeat: 'no-repeat',
+            backgroundPosition: 'center center',
+            backgroundSize: '100% 100%'
+          }"
+        >
+          <table class="w-full text-white text-[14px] overflow-y-auto">
+            <thead>
+              <tr class="table-header">
+                <th class="py-[8px] text-left pl-[12px]">类型</th>
+                <th class="py-[8px] text-left">阶段</th>
+                <th class="py-[8px] text-left">名称</th>
+              </tr>
+            </thead>
+            <tbody>
+              <tr 
+                v-for="item in tableData" 
+                :key="item.id"
+                class="border-b border-[rgba(255,255,255,0.1)]"
+              >
+                <td class="py-[8px] pl-[12px]">{{ item.type }}</td>
+                <td class="py-[8px]">{{ item.stage }}</td>
+                <td class="py-[8px]">{{ item.name }}</td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
       </div>
     </div>
   </div>
 </template>
 
 <script>
+import { getProjectId, getToken } from "../utils/getToken.js";
+import { HomeAPI } from "../api/home";
 export default {
   name: 'ProjectView',
   data() {
     return {
+      projectId: '',
       searchText: '',
       backgroundImage: new URL('@/assets/images/backgrounds/cover_bg.png', import.meta.url).href,
       titleImage: new URL('@/assets/images/titles/xiangmu.png', import.meta.url).href,
@@ -233,6 +241,52 @@
       ]
     };
   },
+  mounted() {
+    this.getProject();
+    this.getParticipatingList();
+    this.getParticipatingNumber();
+  },
+  methods: {
+    getProject() {
+      this.projectId = getProjectId();
+      const data = {
+        "projectId": this.projectId
+      }
+      HomeAPI.GetProject(data).then(res => {
+        console.log(res);
+        if(res.Ret === 1) {
+          const result = res.Data
+          console.log(result);
+        }
+        
+      });
+    },
+    getParticipatingList() {
+      const data = {
+        "organizeId": this.projectId,
+        name: ''
+      }
+      HomeAPI.GetParticipatingList(data).then(res => {
+        console.log(res);
+        if(res.Ret === 1) {
+          const result = res.Data
+          console.log(result);
+        }
+      });
+    },
+    getParticipatingNumber() {
+      const data = {
+        "organizeId": this.projectId
+      }
+      HomeAPI.GetParticipatingNumber(data).then(res => {
+        console.log(res);
+        if(res.Ret === 1) {
+          const result = res.Data
+          console.log(result);
+        }
+      });
+    }
+  }
 }
 </script>
 
@@ -302,4 +356,8 @@
   background: linear-gradient(180deg, #3068A5 0%, #1E4066 100%);
   box-shadow: inset 0px 1px 0px 0px rgba(255,255,255,0.2);
 }
+.chart-container{
+  width: 100%;
+  height: calc(40% - 180px);
+}
 </style>
diff --git a/vite.config.js b/vite.config.js
index 037f13a..55294e5 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -1,3 +1,11 @@
+/*
+ * @Author: gjj Ganjj@probim.com.cn
+ * @Date: 2025-02-14 14:32:19
+ * @LastEditors: gjj Ganjj@probim.com.cn
+ * @LastEditTime: 2025-02-24 17:26:18
+ * @FilePath: \北京交通大学\vite.config.js
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
 /* eslint-disable no-unused-vars */
 import path from "path";
 import { defineConfig, splitVendorChunkPlugin } from "vite";
@@ -32,7 +40,7 @@
             proxy: {
                 "^/api/": {
                     // target: "http://47.117.124.20:2002/",
-                    target: "https://www.probim.cn:7707",
+                    target: "http://8.140.54.245:5000/",
                     rewrite: (path) => path.replace(/^\/api\//, ""),
                     changeOrigin: true, //通过浏览器查看像是"未生效",实际发送给后端的是更改过的Host(与target的host相同)
                 },

--
Gitblit v1.9.3