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