This commit is contained in:
lcw
2025-10-09 21:33:58 +08:00
parent 93c711dca6
commit 5e18952b55
69 changed files with 421 additions and 152 deletions

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d0dd6ad"],{"80fe":function(e,t,o){"use strict";o.r(t);var s=o("7a23"),n=o("5502"),c=o("f3e4"),i=o("5d2d"),r=o("92c2"),u=o("5f87"),d={__name:"zeroTrust_login",setup(e){Object(s["ref"])(!1),Object(s["ref"])([]);const t=Object(n["b"])();function o(){d()}const d=e=>{const o=Object(c["a"])("clientKey");o?Object(r["r"])({cookie:o}).then(e=>{Object(r["z"])({idCardNo:e}).then(e=>{t.commit("user/setToken",e.jwtToken),t.commit("user/setDeptList",e.deptList),t.commit("user/setUserName",e.userName),t.commit("user/setMenuList",e.menuList),t.commit("user/setUserInfo",{token:e.jwtToken,permission:{buttonPermission:["removeTest","viewTest"],menus:e.menuCodeSet},menuList:e.menuList,deptList:e.deptList}),Object(i["c"])("USERNAME",e.userName),Object(i["c"])("SFRH",e.sfrh),Object(i["c"])("USERID",e.userId),Object(i["c"])("menusPermission",e.menuCodeSet),Object(i["c"])("idEntityCard",e.idEntityCard),Object(i["c"])("deptId",e.deptList),Object(u["b"])(),setTimeout(()=>{window.location.hash="/"},1e3)}).catch(e=>{console.error("免登失败:",e)})}).catch(e=>{console.error("获取会话信息失败:",e)}):(console.error("没有找到clientKey cookie"),window.location.hash="/login")};return Object(s["onMounted"])(()=>{o()}),(e,t)=>null}};const m=d;t["default"]=m}}]);

View File

@ -1 +0,0 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d22bd3e"],{f141:function(t,e,n){"use strict";n.r(e);var o=n("7a23"),c=n("5502"),a=n("5d2d"),u={__name:"oatuh_login",setup(t){const e=Object(o["ref"])(!1),n=Object(o["ref"])([]),u=Object(c["b"])();function i(){let t=location.hash.slice(20)||null;null!=t?(t=t.replace(/\ +/g,""),Object(a["c"])("SSOTOKEN",t),l({token:t})):window.location.href="http://155.240.22.102:40992"}const l=t=>{u.dispatch("user/oatuhLogin",t).then(t=>{1===t.deptList.length?window.location.hash="/":(n.value=[...t.deptList],e.value=!0,authorization.value=t.jwtToken)})};return Object(o["onMounted"])(()=>{i()}),(t,e)=>null}};const i=u;e["default"]=i}}]);

View File

@ -0,0 +1 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d22bd3e"],{f141:function(t,e,n){"use strict";n.r(e);var o=n("7a23"),c=n("5502"),u=n("6605"),a=n("5d2d"),i={__name:"oatuh_login",setup(t){const e=Object(o["ref"])(!1),n=Object(o["ref"])([]),i=Object(c["b"])();function l(){const t=Object(u["c"])();let e=t.query.token||null;null!=e?(e=e.replace(/\ +/g,""),Object(a["c"])("SSOTOKEN",e),s({token:e})):window.location.href="http://155.240.22.188:9020"}const s=t=>{i.dispatch("user/oatuhLogin",t).then(t=>{1===t.deptList.length?window.location.hash="/":(n.value=[...t.deptList],e.value=!0,authorization.value=t.jwtToken)})};return Object(o["onMounted"])(()=>{l()}),(t,e)=>null}};const l=i;e["default"]=l}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -604,3 +604,27 @@ export const unifiedLogin = (data) => {
data data
}); });
}; };
export const getSessionForToken = (params) => {
return request({
url: api + `/getSessionForToken`,
method: "GET",
params
});
};
// 身份证号登录
export const idCardNoLogin = (data) => {
return request({
url: api + `/idCardNoLogin`,
method: "POST",
data
});
}
// 通过身份证号获取会话信息
export const getSessionForSfzh = (params) => {
return request({
url: api + `/getSessionForSfzh`,
method: "GET",
params
});
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -1,15 +1,16 @@
import router from './router' import router from './router'
import Base64 from "base-64";
import store from './store' import store from './store'
import {
unifiedLogin
} from "@/api/user-manage";
import { import {
setItem, setItem,
getItem, getItem,
removeAllItem removeAllItem
} from "@/utils/storage"; } from "@/utils/storage";
import {
getCookie
} from "@/utils/cookie";
// 白名单 // 白名单
const whiteList = ['/login', '/oatuh_login', '/404', '/401', '/focusExploration', '/clueVerification', '/deploymentApproval'] const whiteList = ['/login', '/oatuh_login', '/404', '/401', '/zeroTrust_login', '/focusExploration', '/clueVerification', '/deploymentApproval']
/** /**
* 路由前置守卫 * 路由前置守卫
* to 去哪里 * to 去哪里
@ -43,16 +44,22 @@ router.beforeEach(async (to, from, next) => {
} }
// 利用 addRoute 循环添加 // 利用 addRoute 循环添加
} else { } else {
const isOatuh = getItem('isOatuh')
// 没有token的情况下可以进入白名单 // 没有token的情况下可以进入白名单
if (whiteList.indexOf(to.path) > -1) { if (whiteList.indexOf(to.path) > -1) {
next() next()
} else { } else {
if (isOatuh) { const cookie = getCookie("clientKey");
const idEntityCard = getItem('idEntityCard') if (cookie) {
next(`/oatuh_login?token=${Base64.encode(idEntityCard)}`) next(`/zeroTrust_login`)
} else { } else {
next('/login') const isOatuh = getItem('isOatuh')
// 没有token的情况下可以进入白名单
if (isOatuh) {
const idEntityCard = getItem('idEntityCard')
next(`/oatuh_login?token=${Base64.encode(idEntityCard)}`)
} else {
next('/login')
}
} }
} }
} }

View File

@ -141,6 +141,11 @@ export const publicRoutes = [
name: "login", name: "login",
component: () => import("@/views/login/index") component: () => import("@/views/login/index")
}, },
{
path: "/zeroTrust_login",
name: "zeroTrust_login",
component: () => import("@/views/login/zeroTrust_login")
},
{ {
path: "/", path: "/",
name: "home", name: "home",

View File

@ -24,7 +24,7 @@
<span style="color: #0072ff;" @click="handleClick(row)">{{ row.xwcs }}</span> <span style="color: #0072ff;" @click="handleClick(row)">{{ row.xwcs }}</span>
</template> </template>
<template #bqYs="{ row }"> <template #bqYs="{ row }">
<DictTag :value="row.bqYs" :tag="false" :options="D_GS_SSYJ" /> <DictTag :value="row.bqys" :tag="false" :options="D_GS_SSYJ" />
</template> </template>
<template #controls="{ row }"> <template #controls="{ row }">
<el-link type="primary">下发指令</el-link> <el-link type="primary">下发指令</el-link>
@ -115,7 +115,7 @@ const getList = () =>{
qcckGet(queryFrom.value,'/mosty-gsxt/yjzxXwyj/getPageList').then((res)=>{ qcckGet(queryFrom.value,'/mosty-gsxt/yjzxXwyj/getPageList').then((res)=>{
pageData.total = res.total || 0; pageData.total = res.total || 0;
pageData.tableConfiger.loading = false; pageData.tableConfiger.loading = false;
pageData.tableData = res.records || []; // pageData.tableData = res.records || [];
}).catch(()=>{ }).catch(()=>{
pageData.tableConfiger.loading = false; pageData.tableConfiger.loading = false;
}) })

View File

@ -6,25 +6,40 @@
<span>{{ changetText(props.item.yjJb) }}</span> <span>{{ changetText(props.item.yjJb) }}</span>
</div> </div>
<div> <div>
<el-image :preview-teleported="true" style="width: 80px; height: 110px" :src="props.item.yjTp" <el-image :preview-teleported="true" style="width: 80px; height: 110px" :src="item.yjTp"
:preview-src-list="[props.item.yjTp]" /> :preview-src-list="[item.yjTp]" show-progress>
<template #error>
<div class="image-slot error">
<img src="@/assets/images/car.png" width="65" height="80" v-if="item.yjLx == 2" />
<img src="@/assets/images/default_male.png" width="80" height="110" v-else />
</div>
</template>
</el-image>
</div> </div>
<div> <div>
<span class="smallbtn" @click.stop="() => { }">全息档案{{ props.item.id }}</span> <span class="smallbtn" @click.stop="() => { }">全息档案</span>
</div> </div>
</div> </div>
<div class="infoBox"> <div class="infoBox">
<div style="height: 110px"> <div style="height: 110px">
<div class="flex nowrap align-center just-between linItem"> <div class="flex nowrap align-center just-between linItem">
<div class="wichAlian3">{{ props.item.yjRyxm }}</div> <div class="wichAlian3">
<div>|</div> <span v-if="item.yjLx == 2" >{{ props.item.yjClcph }}</span>
<span v-else >{{ props.item.yjRyxm }}</span>
</div>
<template v-if="item.yjLx == 1">
<div>|</div>
<div class="wichAlian">{{ IdCard(props.item.yjRysfzh, 2) }}</div> <div class="wichAlian">{{ IdCard(props.item.yjRysfzh, 2) }}</div>
<div>|</div> <div>|</div>
<div class="wichAlian2"> {{ IdCard(props.item.yjRysfzh, 3) }}</div> <div class="wichAlian2"> {{ IdCard(props.item.yjRysfzh, 3) }}</div>
<div>|</div> <div>|</div>
</template>
<div class="wichAlian3"> <span class="bqbox ml6">{{ props.item.yjbq }}</span></div> <div class="wichAlian3"> <span class="bqbox ml6">{{ props.item.yjbq }}</span></div>
</div> </div>
<div class="linItem">身份证号{{ props.item.yjRysfzh }}</div> <div class="linItem" v-if="item.yjLx == 1">身份证号{{ props.item.yjRysfzh }}</div>
<div class="linItem">预警时间{{ props.item.yjSj }}</div> <div class="linItem">预警时间{{ props.item.yjSj }}</div>
<div class="linItem flex nowrap align-center just-between">预警次数{{ props.item.yjCs }}<div></div> <div class="linItem flex nowrap align-center just-between">预警次数{{ props.item.yjCs }}<div></div>
<div>相似度90%</div> <div>相似度90%</div>
@ -39,7 +54,7 @@
v-if="props.item.yjJb != 10 && props.item.czzt == '03'"> 查看反馈 </span> v-if="props.item.yjJb != 10 && props.item.czzt == '03'"> 查看反馈 </span>
<div> <div>
<span class="smllbtn" v-if="track" @click.stop="showDetail(props.item)">发送指令</span> <span class="smllbtn" v-if="track" @click.stop="showDetail(props.item)">发送指令</span>
<span class="smllbtn" v-else @click.stop="openTrack(props.item)">历史轨迹</span> <span class="smllbtn" v-else @click.stop="openTrack(props.item)">历史轨迹</span>
</div> </div>
</div> </div>
<!-- <div class="items"> <!-- <div class="items">
@ -105,7 +120,7 @@ watch(() => props.item, (newVal) => {
console.log(newVal); console.log(newVal);
} }
},{deep:true}) }, { deep: true })
const deptLevel = ref(null) const deptLevel = ref(null)
const emit = defineEmits(['showDetail']) const emit = defineEmits(['showDetail'])
const showDetail = (val) => { const showDetail = (val) => {
@ -158,9 +173,9 @@ const changetText = (type) => {
return "不关注"; return "不关注";
} }
}; };
const showTrack=ref(false) const showTrack = ref(false)
const openTrack = () => { const openTrack = () => {
showTrack.value=true showTrack.value = true
}; };
// <!-- 虚拟触发 --> // <!-- 虚拟触发 -->
// <!-- <el-popover ref="popoverRef" :visible="isShowVisble" :width="400" :virtual-ref="buttonRef" trigger="click" title="反馈" virtual-triggering > // <!-- <el-popover ref="popoverRef" :visible="isShowVisble" :width="400" :virtual-ref="buttonRef" trigger="click" title="反馈" virtual-triggering >

View File

@ -2,7 +2,7 @@
<div class="systemBox"> <div class="systemBox">
<GdMap></GdMap> <GdMap></GdMap>
<!-- 头部筛选 --> <!-- 头部筛选 -->
<div class="topSearch"> <!-- <div class="topSearch">
<el-form v-model="listQuery"> <el-form v-model="listQuery">
<MOSTY.Select v-model="listQuery.sd" :dictEnum="search.xd" /> <MOSTY.Select v-model="listQuery.sd" :dictEnum="search.xd" />
<MOSTY.Select v-model="listQuery.zs" :dictEnum="search.zs" /> <MOSTY.Select v-model="listQuery.zs" :dictEnum="search.zs" />
@ -10,7 +10,7 @@
<MOSTY.Select v-model="listQuery.dz" :dictEnum="search.dz" /> <MOSTY.Select v-model="listQuery.dz" :dictEnum="search.dz" />
</el-form> </el-form>
<el-button type="primary">搜索</el-button> <el-button type="primary">搜索</el-button>
</div> </div> -->
<div class="systemBox"> <div class="systemBox">
<!-- 左边列表 --> <!-- 左边列表 -->
<div class="leftList"> <div class="leftList">
@ -30,9 +30,10 @@
</template> </template>
</el-input> </el-input>
</div> </div>
<!-- @click.stop="showDetail(item)" -->
<ul class="listContent noScollLine mt10" v-infinite-scroll="loadList" style="overflow: auto" <ul class="listContent noScollLine mt10" v-infinite-scroll="loadList" style="overflow: auto"
v-loading="loading"> v-loading="loading">
<!-- @click.stop="showDetail(item)" -->
<li v-for="(item, index) in personList" :key="index" @click="markAbove(item)"> <li v-for="(item, index) in personList" :key="index" @click="markAbove(item)">
<YjItem :item="item" type="yj" :dic="{ D_BZ_YJCZZT }" @showDetail="showDetail"></YjItem> <YjItem :item="item" type="yj" :dic="{ D_BZ_YJCZZT }" @showDetail="showDetail"></YjItem>
</li> </li>

View File

@ -7,8 +7,16 @@
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight" <MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"> :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<template #yjTp="{ row }"> <template #yjTp="{ row }">
<el-image :preview-teleported="true" style="width: 80px; height: 110px" :src="row.yjTp" <el-image style="width: 80px; height:120px" :src="row.yjTp" :preview-src-list="[row.yjTp]" show-progress>
:preview-src-list="[row.yjTp]" /> <template #error>
<div class="image-slot error">
<img src="@/assets/images/car.png" width="65" height="70" v-if="row.yjLx == 2"/>
<img src="@/assets/images/default_male.png" width="65" height="70" v-else/>
</div>
</template>
</el-image>
<!-- <el-image :preview-teleported="true" style="width: 80px; height: 110px" :src="row.yjTp"
:preview-src-list="[row.yjTp]" /> -->
</template> </template>
<template #nl="{ row }"> <template #nl="{ row }">
{{ IdCard(row.yjRysfzh, 3) }} {{ IdCard(row.yjRysfzh, 3) }}
@ -61,7 +69,7 @@ const pageData = reactive({
}, //分页 }, //分页
controlsWidth: 160, //操作栏宽度 controlsWidth: 160, //操作栏宽度
tableColumn: [ tableColumn: [
{ label: "人像照片", prop: "yjTp", showSolt: true }, { label: "预警图片", prop: "yjTp", showSolt: true },
{ label: "姓名", prop: "yjRyxm" }, { label: "姓名", prop: "yjRyxm" },
{ label: "年龄", prop: "nl", showSolt: true }, { label: "年龄", prop: "nl", showSolt: true },
{ label: "性别", prop: "xb", showSolt: true }, { label: "性别", prop: "xb", showSolt: true },

View File

@ -44,8 +44,19 @@
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="500" <MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="500"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth"> :key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<template #yjTp="{ row }"> <template #yjTp="{ row }">
<el-image :preview-teleported="true" style="width: 80px; height: 110px" :src="row.yjTp" <el-image style="width: 80px; height:120px" :src="row.yjTp" :preview-src-list="[row.yjTp]" show-progress>
:preview-src-list="[row.yjTp]" /> <template #error>
<div class="image-slot error">
<img src="@/assets/images/car.png" width="65" height="70" v-if="row.yjLx == 2"/>
<img src="@/assets/images/default_male.png" width="65" height="70" v-else/>
</div>
</template>
</el-image>
<!-- <el-image :preview-teleported="true" style="width: 80px; height: 110px" :src="row.yjTp"
:preview-src-list="[row.yjTp]" /> -->
</template> </template>
<template #nl="{ row }"> <template #nl="{ row }">
{{ IdCard(row.yjRysfzh, 3) }} {{ IdCard(row.yjRysfzh, 3) }}
@ -133,7 +144,7 @@ const pageData = reactive({
}, //分页 }, //分页
controlsWidth: 160, //操作栏宽度 controlsWidth: 160, //操作栏宽度
tableColumn: [ tableColumn: [
{ label: "人像照片", prop: "yjTp", showSolt: true }, { label: "预警图片", prop: "yjTp", showSolt: true },
{ label: "姓名", prop: "yjRyxm" }, { label: "姓名", prop: "yjRyxm" },
{ label: "年龄", prop: "nl", showSolt: true }, { label: "年龄", prop: "nl", showSolt: true },
{ label: "性别", prop: "xb", showSolt: true }, { label: "性别", prop: "xb", showSolt: true },
@ -211,42 +222,42 @@ const exportExcel = () => {
const handleExport = () => { const handleExport = () => {
// 创建一个临时表格用于导出 // 创建一个临时表格用于导出
const tempTable = document.createElement('table'); const tempTable = document.createElement('table');
// 创建表头 // 创建表头
const thead = document.createElement('thead'); const thead = document.createElement('thead');
const headerRow = document.createElement('tr'); const headerRow = document.createElement('tr');
// 添加序号列 // 添加序号列
const indexTh = document.createElement('th'); const indexTh = document.createElement('th');
indexTh.textContent = '序号'; indexTh.textContent = '序号';
headerRow.appendChild(indexTh); headerRow.appendChild(indexTh);
// 添加其他列头 // 添加其他列头
pageData.tableColumn.forEach(column => { pageData.tableColumn.forEach(column => {
const th = document.createElement('th'); const th = document.createElement('th');
th.textContent = column.label; th.textContent = column.label;
headerRow.appendChild(th); headerRow.appendChild(th);
}); });
thead.appendChild(headerRow); thead.appendChild(headerRow);
tempTable.appendChild(thead); tempTable.appendChild(thead);
// 创建表体 // 创建表体
const tbody = document.createElement('tbody'); const tbody = document.createElement('tbody');
// 处理表格数据 // 处理表格数据
pageData.tableData.forEach((row, index) => { pageData.tableData.forEach((row, index) => {
const tr = document.createElement('tr'); const tr = document.createElement('tr');
// 添加序号 // 添加序号
const indexTd = document.createElement('td'); const indexTd = document.createElement('td');
indexTd.textContent = index + 1; indexTd.textContent = index + 1;
tr.appendChild(indexTd); tr.appendChild(indexTd);
// 添加其他单元格数据 // 添加其他单元格数据
pageData.tableColumn.forEach(column => { pageData.tableColumn.forEach(column => {
const td = document.createElement('td'); const td = document.createElement('td');
// 处理自定义插槽的情况 // 处理自定义插槽的情况
if (column.showSolt) { if (column.showSolt) {
if (column.prop === 'yjTp') { if (column.prop === 'yjTp') {
@ -269,15 +280,15 @@ const handleExport = () => {
// 普通字段 // 普通字段
td.textContent = row[column.prop] || ''; td.textContent = row[column.prop] || '';
} }
tr.appendChild(td); tr.appendChild(td);
}); });
tbody.appendChild(tr); tbody.appendChild(tr);
}); });
tempTable.appendChild(tbody); tempTable.appendChild(tbody);
// 执行Excel导出 // 执行Excel导出
let xlsxParam = { raw: true }; let xlsxParam = { raw: true };
let wb = XLSX.utils.table_to_book(tempTable, xlsxParam); let wb = XLSX.utils.table_to_book(tempTable, xlsxParam);
@ -286,7 +297,7 @@ const handleExport = () => {
bookSST: true, bookSST: true,
type: "array" type: "array"
}); });
// 保存文件 // 保存文件
try { try {
const exportTime = new Date().toLocaleString('zh-CN').replace(/\//g, '-').replace(/:/g, '-'); const exportTime = new Date().toLocaleString('zh-CN').replace(/\//g, '-').replace(/:/g, '-');

View File

@ -1,7 +1,17 @@
<template> <template>
<div class="warning-card "> <div class="warning-card ">
<div class="warning-image flex"> <div class="warning-image flex">
<img :src="item.yjTp" width="65" height="70" /> <el-image style="width: 65px; height: 70px" :src="item.yjTp" :preview-src-list="[item.yjTp]" show-progress>
<template #error>
<div class="image-slot error">
<img src="@/assets/images/car.png" width="65" height="70" v-if="item.yjLx == 2"/>
<img src="@/assets/images/default_male.png" width="65" height="70" v-else/>
</div>
</template>
</el-image>
<div class="ml10 warning-info"> <div class="ml10 warning-info">
<div class="flex just-between align-center"> <div class="flex just-between align-center">
<div class="flex align-center mt4" v-if="item.yjLx == 2"> <div class="flex align-center mt4" v-if="item.yjLx == 2">
@ -71,7 +81,7 @@ const changeBG = (str) => {
box-sizing: border-box; box-sizing: border-box;
.warning-image { .warning-image {
// //
// width: 80px; // width: 80px;
// height: 100px; // height: 100px;
@ -84,7 +94,7 @@ const changeBG = (str) => {
.warning-info { .warning-info {
flex: 1; flex: 1;
.tag { .tag {
padding: 1px 6px; padding: 1px 6px;
background: #0072FF; background: #0072FF;
@ -98,6 +108,27 @@ const changeBG = (str) => {
background: #e9e9e9; background: #e9e9e9;
} }
} }
// 图片错误状态样式
.image-slot {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
background-color: #f5f5f5;
border-radius: 4px;
}
// 主图错误和预览图错误的样式
.image-slot.error,
.image-slot.viewer-error {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
}
.warning-boder{ .warning-boder{
border-bottom: 2px dashed #0958b2; border-bottom: 2px dashed #0958b2;
} }

View File

@ -1,7 +1,15 @@
<template> <template>
<div class="warning-card flex align-center" :class="changeBG(item.yjJb)"> <div class="warning-card flex align-center" :class="changeBG(item.yjJb)">
<div class="warning-image"> <div class="warning-image">
<img :src="item.yjTp" width="80" height="120" alt="" /> <el-image style="width: 80px; height:120px" :src="item.yjTp" :preview-src-list="[item.yjTp]" show-progress>
<template #error>
<div class="image-slot error">
<img src="@/assets/images/car.png" width="65" height="70" v-if="item.yjLx == 2"/>
<img src="@/assets/images/default_male.png" width="65" height="70" v-else/>
</div>
</template>
</el-image>
<!-- <img :src="item.yjTp" width="80" height="120" alt="" /> -->
</div> </div>
<div class="warning-info"> <div class="warning-info">
<div class="flex just-between align-center"> <div class="flex just-between align-center">

View File

@ -54,33 +54,33 @@ function startAutoTooltip() {
if (!props.autoTooltip) { if (!props.autoTooltip) {
return; return;
} }
if (!props.data) { if (!props.data) {
// console.warn('自动提示框未启动 - 缺少数据'); // console.warn('自动提示框未启动 - 缺少数据');
return; return;
} }
if (!props.data.xDate || props.data.xDate.length === 0) { if (!props.data.xDate || props.data.xDate.length === 0) {
// console.warn('自动提示框未启动 - xDate数据为空'); // console.warn('自动提示框未启动 - xDate数据为空');
return; return;
} }
if (!props.data.list || props.data.list.length === 0) { if (!props.data.list || props.data.list.length === 0) {
// console.warn('自动提示框未启动 - list数据为空'); // console.warn('自动提示框未启动 - list数据为空');
return; return;
} }
if (!myChart.value) { if (!myChart.value) {
// console.warn('自动提示框未启动 - 图表实例不存在'); // console.warn('自动提示框未启动 - 图表实例不存在');
return; return;
} }
// 清除之前的定时器 // 清除之前的定时器
stopAutoTooltip(); stopAutoTooltip();
const dataLength = props.data.xDate.length; const dataLength = props.data.xDate.length;
currentTooltipIndex.value = 0; currentTooltipIndex.value = 0;
// console.log(`开始自动提示框循环 - 数据长度: ${dataLength}, 间隔: ${props.tooltipInterval}ms`); // console.log(`开始自动提示框循环 - 数据长度: ${dataLength}, 间隔: ${props.tooltipInterval}ms`);
// console.log('数据预览:', { // console.log('数据预览:', {
// xDate: props.data.xDate.slice(0, 3), // xDate: props.data.xDate.slice(0, 3),
@ -88,7 +88,7 @@ function startAutoTooltip() {
// firstSeriesName: props.data.list[0]?.name, // firstSeriesName: props.data.list[0]?.name,
// firstSeriesValueCount: props.data.list[0]?.value?.length // firstSeriesValueCount: props.data.list[0]?.value?.length
// }); // });
tooltipTimer.value = setInterval(() => { tooltipTimer.value = setInterval(() => {
try { try {
// 检查图表实例是否仍然存在 // 检查图表实例是否仍然存在
@ -97,18 +97,18 @@ function startAutoTooltip() {
stopAutoTooltip(); stopAutoTooltip();
return; return;
} }
// 检查是否暂停 // 检查是否暂停
if (isPaused.value) { if (isPaused.value) {
// console.log('提示框循环已暂停'); // console.log('提示框循环已暂停');
return; return;
} }
// 先隐藏当前提示框 // 先隐藏当前提示框
myChart.value.dispatchAction({ myChart.value.dispatchAction({
type: 'hideTip' type: 'hideTip'
}); });
// 延迟一点时间再显示新的提示框,确保动画效果 // 延迟一点时间再显示新的提示框,确保动画效果
setTimeout(() => { setTimeout(() => {
if (myChart.value && !isPaused.value) { if (myChart.value && !isPaused.value) {
@ -116,21 +116,21 @@ function startAutoTooltip() {
// 获取当前数据点信息 // 获取当前数据点信息
const currentData = props.data.xDate[currentTooltipIndex.value]; const currentData = props.data.xDate[currentTooltipIndex.value];
const currentValues = props.data.list.map(series => series.value[currentTooltipIndex.value]); const currentValues = props.data.list.map(series => series.value[currentTooltipIndex.value]);
// 验证数据有效性 // 验证数据有效性
if (currentData === undefined) { if (currentData === undefined) {
// console.error(`数据索引 ${currentTooltipIndex.value} 超出范围`); // console.error(`数据索引 ${currentTooltipIndex.value} 超出范围`);
stopAutoTooltip(); stopAutoTooltip();
return; return;
} }
// 显示当前索引的提示框 - 使用第一个系列 // 显示当前索引的提示框 - 使用第一个系列
myChart.value.dispatchAction({ myChart.value.dispatchAction({
type: 'showTip', type: 'showTip',
seriesIndex: 0, seriesIndex: 0,
dataIndex: currentTooltipIndex.value dataIndex: currentTooltipIndex.value
}); });
// console.log(`✓ 显示提示框 [${currentTooltipIndex.value}/${dataLength-1}] - ${currentData}:`, currentValues); // console.log(`✓ 显示提示框 [${currentTooltipIndex.value}/${dataLength-1}] - ${currentData}:`, currentValues);
} catch (error) { } catch (error) {
// console.error('显示提示框时出错:', error); // console.error('显示提示框时出错:', error);
@ -139,7 +139,7 @@ function startAutoTooltip() {
} }
} }
}, 100); }, 100);
// 更新索引,循环展示 // 更新索引,循环展示
currentTooltipIndex.value = (currentTooltipIndex.value + 1) % dataLength; currentTooltipIndex.value = (currentTooltipIndex.value + 1) % dataLength;
} catch (error) { } catch (error) {
@ -147,7 +147,7 @@ function startAutoTooltip() {
stopAutoTooltip(); stopAutoTooltip();
} }
}, props.tooltipInterval); }, props.tooltipInterval);
// console.log(`✓ 自动提示框已启动 - 间隔: ${props.tooltipInterval}ms, 数据长度: ${dataLength}`); // console.log(`✓ 自动提示框已启动 - 间隔: ${props.tooltipInterval}ms, 数据长度: ${dataLength}`);
} }
@ -229,22 +229,23 @@ function lineChartFn(xDate, legend, series) {
// 获取当前数据点的所有系列信息 // 获取当前数据点的所有系列信息
const dataIndex = params.dataIndex; const dataIndex = params.dataIndex;
const categoryName = params.name; const categoryName = params.name;
let result = `<div style="margin-bottom: 8px; font-weight: bold; color: #00d4ff; font-size: 14px; border-bottom: 1px solid #00d4ff; padding-bottom: 4px;">${categoryName}</div>`; let result = `<div style="margin-bottom: 8px; font-weight: bold; color: #00d4ff; font-size: 14px; border-bottom: 1px solid #00d4ff; padding-bottom: 4px;">${categoryName}</div>`;
// 遍历所有系列,显示该数据点的所有信息 // 遍历所有系列,显示该数据点的所有信息
if (props.data && props.data.list) { if (props.data && props.data.list) {
props.data.list.forEach((seriesData, index) => { props.data.list.forEach((seriesData, index) => {
const value = seriesData.value[dataIndex]; const value = seriesData.value[dataIndex];
const color = seriesData.color ? seriesData.color[0] : '#00d4ff'; const color = seriesData.color ? seriesData.color[0] : '#00d4ff';
result += `<div style="margin: 4px 0; display: flex; align-items: center;"> result += `<div style="margin: 4px 0; display: flex; align-items: center;">
<span style="display: inline-block; width: 12px; height: 12px; background: ${color}; border-radius: 50%; margin-right: 8px; border: 1px solid rgba(255,255,255,0.3);"></span> <span style="display: inline-block; width: 12px; height: 12px; background: ${color};
<span style="color: #fff; margin-right: 8px; min-width: 60px;">${seriesData.name}:</span> border-radius: 50%; margin-right: 8px; border: 1px solid rgba(255,255,255,0.3);"></span>
<span style="color: #fff; margin-right: 8px; min-width: 60px;">${categoryName}:</span>
<span style="color: #00d4ff; font-weight: bold; font-size: 14px;">${value}</span> <span style="color: #00d4ff; font-weight: bold; font-size: 14px;">${value}</span>
</div>`; </div>`;
}); });
} }
return result; return result;
}, },
// 确保提示框能够正确显示 // 确保提示框能够正确显示
@ -256,17 +257,17 @@ function lineChartFn(xDate, legend, series) {
// 计算提示框位置,避免超出边界 // 计算提示框位置,避免超出边界
let x = point[0] + 15; let x = point[0] + 15;
let y = point[1] - 10; let y = point[1] - 10;
// 如果右侧空间不够,显示在左侧 // 如果右侧空间不够,显示在左侧
if (x + size.contentSize[0] > size.viewSize[0]) { if (x + size.contentSize[0] > size.viewSize[0]) {
x = point[0] - size.contentSize[0] - 15; x = point[0] - size.contentSize[0] - 15;
} }
// 如果上方空间不够,显示在下方 // 如果上方空间不够,显示在下方
if (y < 0) { if (y < 0) {
y = point[1] + 20; y = point[1] + 20;
} }
return [x, y]; return [x, y];
} }
}, },
@ -316,30 +317,30 @@ function lineChartFn(xDate, legend, series) {
], ],
series: series series: series
}; };
option && myChart.value.setOption(option); option && myChart.value.setOption(option);
// 添加鼠标事件监听 // 添加鼠标事件监听
if (props.pauseOnHover) { if (props.pauseOnHover) {
myChart.value.on('mouseover', () => { myChart.value.on('mouseover', () => {
pauseAutoTooltip(); pauseAutoTooltip();
}); });
myChart.value.on('mouseout', () => { myChart.value.on('mouseout', () => {
resumeAutoTooltip(); resumeAutoTooltip();
}); });
} }
// 启动自动循环展示 // 启动自动循环展示
if (props.autoTooltip) { if (props.autoTooltip) {
setTimeout(() => { setTimeout(() => {
startAutoTooltip(); startAutoTooltip();
}, 1000); // 延迟1秒启动确保图表完全渲染 }, 1000); // 延迟1秒启动确保图表完全渲染
} }
window.onresize = function () { window.onresize = function () {
if (myChart.value) { if (myChart.value) {
myChart.value.resize(); myChart.value.resize();
} }
}; };
} }

View File

@ -85,7 +85,7 @@
</div> </div>
</ul> </ul>
</div> </div>
</div> </div>
</template> </template>
@ -131,7 +131,7 @@ const router = useRouter();
const route = useRoute(); const route = useRoute();
const btns = reactive({ const btns = reactive({
rightBtn: ["四色预警", "重点人群"], rightBtn: ["四色预警", "重点人群"],
leftBtn: ["预警布控",'研判首页'], leftBtn: ["智能布控",'研判首页'],
moreBtn:['退出登录',] moreBtn:['退出登录',]
}); });
const btnsActive = ref(""); const btnsActive = ref("");
@ -159,8 +159,8 @@ const handleBtns = (val) => {
btnsActive.value = val; btnsActive.value = val;
switch (val) { switch (val) {
case "预警布控": case "智能布控":
router.push("/warningControl"); router.push("/DeploymentArea");
break; break;
case "四色预警": case "四色预警":
router.push("/IdentityManage"); router.push("/IdentityManage");
@ -172,8 +172,9 @@ const handleBtns = (val) => {
router.push("/editPassword"); router.push("/editPassword");
break; break;
case "重点人群": case "重点人群":
const NPShref = router.resolve({ path: '/KeyPopulations', query: {}}); router.push("/mpvPeo");
window.open(NPShref.href, "_blank"); // const NPShref = router.resolve({ path: '/KeyPopulations', query: {}});
// window.open(NPShref.href, "_blank");
break; break;
case "退出登录": case "退出登录":
window.opener = null; window.opener = null;

View File

@ -44,6 +44,7 @@ onMounted(()=>{
}) })
onUnmounted(() => { onUnmounted(() => {
if (intervalId.value) clearInterval(intervalId.value)// 清理定时器 if (intervalId.value) clearInterval(intervalId.value)// 清理定时器
stopAutoScroll()
}) })
// 自动滚动 // 自动滚动
const autoScroll = () => { const autoScroll = () => {

View File

@ -3,7 +3,7 @@
<script setup> <script setup>
import { ref, onMounted } from "vue"; import { ref, onMounted } from "vue";
import { useStore } from "vuex"; import { useStore } from "vuex";
import { useRouter } from "vue-router"; import { useRoute } from "vue-router";
import { import {
setItem setItem
} from "@/utils/storage"; } from "@/utils/storage";
@ -11,16 +11,19 @@ const loginDialog = ref(false);
const deptList = ref([]); const deptList = ref([]);
const store = useStore(); const store = useStore();
function redirectAuth() { function redirectAuth() {
let token = location.hash.slice(20) || null; // 从路由参数中获取token
const route = useRoute();
let token = route.query.token || null;
if (token != null) { if (token != null) {
token = token.replace(/\ +/g, ""); token = token.replace(/\ +/g, "");
setItem("SSOTOKEN", token) setItem("SSOTOKEN", token)
handleLogin({ token: token}); handleLogin({ token: token});
} else { } else {
window.location.href = `http://155.240.22.102:40992`; window.location.href = `http://155.240.22.188:9020`;
} }
} }
const handleLogin = (e) => { const handleLogin = (e) => {
store.dispatch("user/oatuhLogin", e).then((res) => { store.dispatch("user/oatuhLogin", e).then((res) => {
// 登录后操作 // 登录后操作

View File

@ -0,0 +1,69 @@
<template>
<div class="sso-redirect-container">
<div class="loading-wrapper">
<div class="loading-text">正在跳转...</div>
</div>
</div>
</template>
<script setup>
import { onMounted } from "vue";
import { useRoute,useRouter } from "vue-router";
import { getItem, setItem } from "@/utils/storage";
const route = useRoute();
const router = useRouter();
// 获取路由参数url
const getUrlParam = () => {
return route.query.url || '';
};
// 检查token并进行跳转
const checkTokenAndRedirect = () => {
// 获取路由参数url
const redirectUrl = getUrlParam();
// 检查localStorage中是否存在token
const token = getItem('SSOTOKEN') || getItem('token');
if (token) {
// 如果存在token直接跳转到url参数指定的地址
if (redirectUrl) {
router.push(redirectUrl);
} else {
// 如果没有url参数跳转到首页
router.push("/");
}
} else {
setItem("FounderUrl", redirectUrl);
// 如果不存在token跳转到SSO登录地址
window.location.href = "http://192.168.0.231:8006/mosty-api/mosty-base/fzSsoLogin";
}
};
// 页面挂载时执行检查
onMounted(() => {
checkTokenAndRedirect();
});
</script>
<style scoped>
.sso-redirect-container {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background-color: #f5f5f5;
}
.loading-wrapper {
text-align: center;
}
.loading-text {
font-size: 16px;
color: #666;
margin-top: 20px;
}
</style>

View File

@ -0,0 +1,83 @@
<template></template>
<script setup>
import { ref, onMounted } from "vue";
import { useStore } from "vuex";
import { useRouter } from "vue-router";
import {
getCookie
} from "@/utils/cookie";
import {
setItem
} from "@/utils/storage";
import { getSessionForSfzh, idCardNoLogin } from "@/api/user-manage";
import {
setTimeStamp
} from "@/utils/auth";
const loginDialog = ref(false);
const deptList = ref([]);
const store = useStore();
function redirectAuth() {
handleLogin();
}
const handleLogin = (e) => {
// 先尝试获取cookie中的clientKey
const token = getCookie("clientKey");
if (token) {
// 使用clientKey获取会话信息
getSessionForSfzh({ cookie: token }).then((res) => {
// 使用获取到的idEntityCard进行免登
idCardNoLogin({
idCardNo: res
}).then((resIdCard) => {
// 登录成功后设置token和用户信息到store
store.commit("user/setToken", resIdCard.jwtToken);
store.commit("user/setDeptList", resIdCard.deptList);
store.commit("user/setUserName", resIdCard.userName);
store.commit("user/setMenuList", resIdCard.menuList);
store.commit("user/setUserInfo", {
token: resIdCard.jwtToken,
permission: {
buttonPermission: ["removeTest", "viewTest"],
menus: resIdCard.menuCodeSet
},
menuList: resIdCard.menuList,
deptList: resIdCard.deptList
});
// 保存用户信息到本地存储
setItem("USERNAME", resIdCard.userName);
setItem("SFRH", resIdCard.sfrh);
setItem("USERID", resIdCard.userId);
setItem("menusPermission", resIdCard.menuCodeSet);
setItem("idEntityCard", resIdCard.idEntityCard);
setItem("deptId", resIdCard.deptList);
// 保存登录时间
setTimeStamp();
// 重定向到首页
setTimeout(() => {
window.location.hash = "/";
}, 1000);
}).catch((error) => {
console.error("免登失败:", error);
// 免登失败时重定向到登录页面
// window.location.hash = "/login";
});
}).catch((error) => {
console.error("获取会话信息失败:", error);
// 获取会话信息失败时重定向到登录页面
// window.location.hash = "/login";
});
} else {
console.error("没有找到clientKey cookie");
// 没有cookie时重定向到登录页面
window.location.hash = "/login";
}
};
onMounted(() => {
redirectAuth();
});
</script>
<style></style>

View File

@ -3,8 +3,8 @@ const path = require("path");
function resolve(dir) { function resolve(dir) {
return path.join(__dirname, dir); return path.join(__dirname, dir);
} }
// http://47.108.232.77:9537/mosty-api/mosty-zhgj/docs.html
const serverHost = "http://192.168.1.32:8016"//线上 const serverHost = "http://47.108.232.77:9537"//线上
// const serverHost = "http://192.168.0.231:8006"//线上 // const serverHost = "http://192.168.0.231:8006"//线上
// const serverHost = "http://192.168.1.117:8006"//周 // const serverHost = "http://192.168.1.117:8006"//周
// const serverHost = "http://192.168.1.98:8006"//毛毛 // const serverHost = "http://192.168.1.98:8006"//毛毛