This commit is contained in:
2025-07-08 09:14:22 +08:00
parent aa71fd5c7e
commit 01f3339833
10 changed files with 122 additions and 31 deletions
+21
View File
@@ -0,0 +1,21 @@
FROM nginx
MAINTAINER jeecgos@163.com
VOLUME /tmp
ENV LANG en_US.UTF-8
RUN echo "server { \
#解决Router(mode: 'history')模式下,刷新路由地址不能找到页面的问题 \
location / { \
root /var/www/html/; \
index index.html index.htm; \
if (!-e \$request_filename) { \
rewrite ^(.*)\$ /index.html?s=\$1 last; \
break; \
} \
} \
access_log /var/log/nginx/access.log ; \
} " > /etc/nginx/conf.d/default.conf \
&& mkdir -p /var/www \
&& mkdir -p /var/www/html
ADD dist/ /var/www/html/
EXPOSE 3101
+1 -1
View File
@@ -21,7 +21,7 @@
onMounted(async () => { onMounted(async () => {
try { try {
if (userStore.getToken && getBaseLogin() === '/centralScreenLogin') { if (userStore.getToken) {
const { result } = await getEmergencyCenterApi(); const { result } = await getEmergencyCenterApi();
if (result?.screenPath) { if (result?.screenPath) {
router.replace(result?.screenPath); router.replace(result?.screenPath);
@@ -52,6 +52,7 @@
showTotal: (total) => `${total}`, showTotal: (total) => `${total}`,
onChange: pageChange, onChange: pageChange,
}); });
const emit = defineEmits(['tableLoad']);
function pageChange(page, pageS) { function pageChange(page, pageS) {
current.value = page; current.value = page;
@@ -74,6 +75,7 @@
async function getRecords() { async function getRecords() {
try { try {
tableLoading.value = true; tableLoading.value = true;
emit('tableLoad', true);
const { code, result } = await props.api({ ...props.apiParams, pageSize: pageSize.value, pageNo: current.value }); const { code, result } = await props.api({ ...props.apiParams, pageSize: pageSize.value, pageNo: current.value });
if (code == 200) { if (code == 200) {
if (props.afterFetch && isFunction(props.afterFetch)) { if (props.afterFetch && isFunction(props.afterFetch)) {
@@ -86,9 +88,9 @@
} }
} catch (e) { } catch (e) {
dataSource.value = []; dataSource.value = [];
tableLoading.value = false;
} finally { } finally {
tableLoading.value = false; tableLoading.value = false;
emit('tableLoad', false);
} }
} }
+6 -5
View File
@@ -48,17 +48,18 @@ const router: Router = createRouter({
history: createWebHistory('/'), history: createWebHistory('/'),
routes: [...routes], routes: [...routes],
}); });
const xian = ['/home', '/secondScreen', '/transfer'];
const yinchuan = ['/yinChuanHome', '/yinChuanTest', '/transfer'];
router.beforeEach((to, from, next) => { router.beforeEach((to, from, next) => {
if (to.path !== '/login' && to.path !== '/home') { if (to.path == '/login') {
setCurrentPath(to.path); next();
} } else {
const flag = getAuthCache('flag3'); const flag = getAuthCache('flag3');
const token = getAuthCache(TOKEN_KEY); const token = getAuthCache(TOKEN_KEY);
if (!flag || !token) { if (!flag || !token) {
return next({ path: '/login' }); return next({ path: '/login' });
} else {
next();
}
} }
next(); next();
+3 -1
View File
@@ -1,5 +1,6 @@
<template> <template>
<div class="sun-screen-box"> <div class="sun-screen-box">
<login-out-button out-url="login" />
<div class="sun-screen-title"> <div class="sun-screen-title">
<div class="sun-title-left">2025年06月14日 12:21:21</div> <div class="sun-title-left">2025年06月14日 12:21:21</div>
<div class="sun-title-center">应急就医服务中心</div> <div class="sun-title-center">应急就医服务中心</div>
@@ -35,7 +36,7 @@
</div> </div>
</div> </div>
<PhoneDialog ref="phoneDialogRef" :title="phoneDialogTitle" :useForm="true" :setting="setting" :phoneType="phoneType" /> <PhoneDialog ref="phoneDialogRef" :title="phoneDialogTitle" :useForm="true" :setting="setting" :phoneType="phoneType" />
<IndexModal ref="indexModalRef" :title="indexModalTitle" :useForm="true" :column="indexColumn" :firstForm="firstFormOne"> </IndexModal> <IndexModal ref="indexModalRef" :title="indexModalTitle" :useForm="true" :column="indexColumn" :firstForm="firstFormOne" />
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
// import threeL from '/@/views/indexSun/threeL.vue'; // import threeL from '/@/views/indexSun/threeL.vue';
@@ -52,6 +53,7 @@
import PhoneDialog from '/@/views/components/phoneDialog/phoneDialog.vue'; import PhoneDialog from '/@/views/components/phoneDialog/phoneDialog.vue';
import { DataType, getSettings } from '/@/utils/settings.ts'; import { DataType, getSettings } from '/@/utils/settings.ts';
import IndexModal from '/@/views/indexSun/indexModal.vue'; import IndexModal from '/@/views/indexSun/indexModal.vue';
import LoginOutButton from '/@/views/components/loginOutButton.vue';
import router from '/@/router'; import router from '/@/router';
import { getAuthCache } from '/@/utils/auth.ts'; import { getAuthCache } from '/@/utils/auth.ts';
//0:处置 1:处理 2:呼入 3:全部 //0:处置 1:处理 2:呼入 3:全部
+32 -3
View File
@@ -37,7 +37,7 @@
</div> </div>
</div> </div>
<div class="map"> <div class="map">
<div style="flex: 1; overflow: hidden; margin: 0 0 10px"> <div style="flex: 1; overflow: hidden">
<div id="xianmapContainer" class="xianmapContainer"></div> <div id="xianmapContainer" class="xianmapContainer"></div>
</div> </div>
</div> </div>
@@ -62,8 +62,8 @@
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, onMounted } from 'vue'; import { onMounted, ref } from 'vue';
import { tabList, legendList, infoContent } from '/@/views/indexSun/indexSun.ts'; import { infoContent, legendList, tabList } from '/@/views/indexSun/indexSun.ts';
import { message } from 'ant-design-vue'; import { message } from 'ant-design-vue';
import { innerLineLight, outerLineOption } from '/@/assets/mapUtils/mapConstant.ts'; import { innerLineLight, outerLineOption } from '/@/assets/mapUtils/mapConstant.ts';
import { Map } from '/@/assets/mapUtils/map.ts'; import { Map } from '/@/assets/mapUtils/map.ts';
@@ -120,15 +120,18 @@
} }
}); });
}); });
function setLevel() { function setLevel() {
//获取当前地图级别 //获取当前地图级别
level.value = Map.map.getZoom(); level.value = Map.map.getZoom();
} }
function removeInput() { function removeInput() {
formState.value.start = ''; formState.value.start = '';
formState.value.end = ''; formState.value.end = '';
searchFlag.value = false; searchFlag.value = false;
} }
function changeTab(item, i: number) { function changeTab(item, i: number) {
currentIndex.value = i; currentIndex.value = i;
Map.clearActiveHospital(); Map.clearActiveHospital();
@@ -150,6 +153,7 @@
getMapData(item.type, { type: item.type }); getMapData(item.type, { type: item.type });
} }
} }
function searchRoute(callback: ((this: MediaQueryList, ev: MediaQueryListEvent) => any) | null) { function searchRoute(callback: ((this: MediaQueryList, ev: MediaQueryListEvent) => any) | null) {
showRoutePanel.value = false; showRoutePanel.value = false;
panelTitle.value = ''; panelTitle.value = '';
@@ -197,6 +201,7 @@
} }
}); });
} }
async function getMapData(type, params = { type: '' }) { async function getMapData(type, params = { type: '' }) {
try { try {
console.log(type, params, 'asghujis'); console.log(type, params, 'asghujis');
@@ -234,6 +239,7 @@
console.warn(e); console.warn(e);
} }
} }
function closeDrivingElement() { function closeDrivingElement() {
Map.clearNavigationElements(); Map.clearNavigationElements();
formState.value.start = ''; formState.value.start = '';
@@ -241,20 +247,24 @@
showDrivingPanel.value = false; showDrivingPanel.value = false;
emits('clearHospitalList'); emits('clearHospitalList');
} }
function handleClcikDetail(res) { function handleClcikDetail(res) {
console.log(res); console.log(res);
} }
function setTitle({ time, distance }) { function setTitle({ time, distance }) {
let str = '全程'; let str = '全程';
str += getTimeStr(time); str += getTimeStr(time);
str += getKmStr(distance); str += getKmStr(distance);
panelTitle.value = str; panelTitle.value = str;
} }
function outClick() { function outClick() {
showRoutePanel.value = false; showRoutePanel.value = false;
} }
const currentCityCode = ref(''); const currentCityCode = ref('');
function logMapinfo() { function logMapinfo() {
Map.map.getCity(function (info) { Map.map.getCity(function (info) {
const { citycode } = info; const { citycode } = info;
@@ -264,6 +274,7 @@
} }
}); });
} }
function drawMarker(data: any) { function drawMarker(data: any) {
console.log(data); console.log(data);
const { lon, lat } = data; const { lon, lat } = data;
@@ -283,17 +294,20 @@
flex-direction: column; flex-direction: column;
align-content: space-between; align-content: space-between;
position: relative; position: relative;
.map-box { .map-box {
flex: 1; flex: 1;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
position: relative; position: relative;
.tab-list { .tab-list {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
justify-content: space-around; justify-content: space-around;
font-size: 16px; font-size: 16px;
letter-spacing: 1px; letter-spacing: 1px;
.tab { .tab {
width: calc(100% / 8); width: calc(100% / 8);
height: 40px; height: 40px;
@@ -313,6 +327,7 @@
} }
} }
} }
.route-navigation { .route-navigation {
--fontColor: #607ddb; --fontColor: #607ddb;
margin: 12px 0; margin: 12px 0;
@@ -445,15 +460,18 @@
} }
} }
} }
.map { .map {
display: flex; display: flex;
flex: 1; flex: 1;
.xianmapContainer { .xianmapContainer {
flex: 1; flex: 1;
height: calc(100% + 22px); height: calc(100% + 22px);
margin: 10px 0; margin: 10px 0;
} }
} }
.map-legend { .map-legend {
position: absolute; position: absolute;
bottom: 20px; bottom: 20px;
@@ -470,6 +488,7 @@
margin: 5px 0; margin: 5px 0;
color: #607ddb; color: #607ddb;
letter-spacing: 2px; letter-spacing: 2px;
.legend-img { .legend-img {
width: 20px; width: 20px;
margin-right: 5px; margin-right: 5px;
@@ -477,6 +496,7 @@
} }
} }
} }
.center-footer { .center-footer {
position: absolute; position: absolute;
left: 50%; left: 50%;
@@ -486,17 +506,20 @@
justify-content: center; justify-content: center;
margin-bottom: 10px; margin-bottom: 10px;
gap: 20px; gap: 20px;
> :nth-child(1) { > :nth-child(1) {
background: url('/@/assets/indexSun/footerBlue.png') no-repeat; background: url('/@/assets/indexSun/footerBlue.png') no-repeat;
background-size: 100% 100%; background-size: 100% 100%;
color: #22e8ff; color: #22e8ff;
margin-right: 80px; margin-right: 80px;
} }
> :nth-child(2) { > :nth-child(2) {
background: url('/@/assets/indexSun/footerGreen.png') no-repeat; background: url('/@/assets/indexSun/footerGreen.png') no-repeat;
background-size: 100% 100%; background-size: 100% 100%;
color: #45ffa1; color: #45ffa1;
} }
.count-item { .count-item {
width: 240px; width: 240px;
height: 120px; height: 120px;
@@ -518,6 +541,7 @@
} }
} }
} }
:deep(.modal-box) { :deep(.modal-box) {
width: 330px; width: 330px;
height: 220px; height: 220px;
@@ -525,19 +549,24 @@
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: space-around; justify-content: space-around;
.modal-item { .modal-item {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
.item-one { .item-one {
width: 50%; width: 50%;
} }
.item-two { .item-two {
color: #00ccff; color: #00ccff;
} }
} }
.modal-btn { .modal-btn {
display: flex; display: flex;
justify-content: center; justify-content: center;
.view-btn { .view-btn {
padding: 5px; padding: 5px;
width: 60%; width: 60%;
+25 -8
View File
@@ -2,7 +2,7 @@
<Dialog class="index-modal" :openVis="visible" width="60%" :title="dialogTitle" @close="closeDialog" :maskClosable="false"> <Dialog class="index-modal" :openVis="visible" width="60%" :title="dialogTitle" @close="closeDialog" :maskClosable="false">
<template #container> <template #container>
<div v-if="useForm" class="form-container"> <div v-if="useForm" class="form-container">
<Form :model="formRecord" :label-width="100" v-bind="formItemLayout"> <Form :model="formRecord" v-bind="formItemLayout">
<slot name="searchFirst"></slot> <slot name="searchFirst"></slot>
<a-form-item v-for="(item, index) in firstForm" :label="item.label" :key="index"> <a-form-item v-for="(item, index) in firstForm" :label="item.label" :key="index">
<a-input :placeholder="item.placeholder" v-if="item.type == 'input'" v-model:value="formRecord[item.field]" /> <a-input :placeholder="item.placeholder" v-if="item.type == 'input'" v-model:value="formRecord[item.field]" />
@@ -22,11 +22,17 @@
<slot name="searchSecond"></slot> <slot name="searchSecond"></slot>
</Form> </Form>
<div class="form-btn"> <div class="form-btn">
<a-button @click="handleClicksearch">搜索</a-button> <a-button @click="handleClicksearch" style="border-color: #00ccff">重置</a-button>
<a-button @click="handleClicksearch" style="margin-left: 10px">重置</a-button> <a-button
@click="handleClicksearch"
:loading="loading"
style="margin-left: 10px; background: #00ccff; border-color: #00ccff; color: #ffffff"
>
搜索
</a-button>
</div> </div>
</div> </div>
<BasicTable ref="registerTable" class="table-container" :key="visible" :columns="column" :apiParams="formState" /> <BasicTable @table-load="tableLoad" ref="registerTable" class="table-container" :key="visible" :columns="column" :apiParams="formState" />
</template> </template>
</Dialog> </Dialog>
</template> </template>
@@ -58,6 +64,7 @@
default: () => [], default: () => [],
}, },
}); });
const loading = ref<boolean>(false);
const formState = ref(); const formState = ref();
const dialogTitle = ref(''); const dialogTitle = ref('');
const formRecord = ref({ const formRecord = ref({
@@ -83,6 +90,10 @@
getField(); getField();
}); });
function tableLoad(b: boolean) {
loading.value = b;
}
function getField() { function getField() {
let result = {}; let result = {};
props.firstForm.map((item) => { props.firstForm.map((item) => {
@@ -114,7 +125,7 @@
background: red !important; background: red !important;
} }
.form-container { .form-container {
margin: 10px 0; margin: 10px;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
:deep(.ant-form-item-label > label) { :deep(.ant-form-item-label > label) {
@@ -135,19 +146,25 @@
} }
.form-btn { .form-btn {
flex: 1; flex: 1;
text-align: right; padding-left: 20px;
padding-right: 20px;
:deep(.ant-btn) { :deep(.ant-btn) {
background: #082147; background: #082147;
border: 1px solid #00ccff; border: 1px solid #00ccff;
color: #fff; color: #fff;
border-radius: 4px; border-radius: 4px;
} }
//margin: 0 15px;
} }
} }
.table-container { .table-container {
margin: 0 10px; margin: 0 10px;
} }
} }
:deep(.ant-form-item-label) {
width: auto !important;
}
:deep(.ant-form-item-control) {
margin-right: 20px !important;
}
</style> </style>
-1
View File
@@ -51,7 +51,6 @@ export function getClassCharts(dx, dy) {
}, },
interval: 25, // 步长 interval: 25, // 步长
min: 0, // 起始 - 设置y轴刻度的最小值 min: 0, // 起始 - 设置y轴刻度的最小值
max: 100, // 终止 - 设置y轴刻度的最大值
axisLabel: { axisLabel: {
color: '#65C6E7', color: '#65C6E7',
formatter: function (value, index) { formatter: function (value, index) {
+23 -3
View File
@@ -31,14 +31,14 @@
@click="handleClick(item)" @click="handleClick(item)"
> >
<span>{{ item?.name }}</span> <span>{{ item?.name }}</span>
<span>{{ item?.value }}</span> <span :style="{ color: index > 1 ? '' : '#22e8ff' }">{{ item?.value || 0 }}</span>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</template> </template>6+
<script setup lang="ts"> <script setup lang="ts">
import { computed, ref, watch } from 'vue'; import { ref, watch } from 'vue';
import { useStatistics } from '/@/components/body-d-left/bodyLeftHooks.ts'; import { useStatistics } from '/@/components/body-d-left/bodyLeftHooks.ts';
import { statisticsNewApi } from '/@/views/indexSun/indexSun.api.ts'; import { statisticsNewApi } from '/@/views/indexSun/indexSun.api.ts';
import { caching, useSession } from '/@/hooks/autoRefresh/caching.ts'; import { caching, useSession } from '/@/hooks/autoRefresh/caching.ts';
@@ -67,6 +67,7 @@
getOneLeftInfo(); getOneLeftInfo();
} }
); );
async function getOneLeftInfo() { async function getOneLeftInfo() {
const params = { const params = {
condition: chooseType.value, condition: chooseType.value,
@@ -81,6 +82,7 @@
setValue(res.result); setValue(res.result);
}); });
} }
function setValue(result) { function setValue(result) {
let { alerdyreceive = '', totalacceptance = '' } = result; let { alerdyreceive = '', totalacceptance = '' } = result;
setStatistics(result); setStatistics(result);
@@ -89,10 +91,12 @@
useDetail.setTotalacceptance(totalacceptance); useDetail.setTotalacceptance(totalacceptance);
} }
} }
function clickChooseType(index) { function clickChooseType(index) {
if (chooseType.value === index) return; if (chooseType.value === index) return;
chooseType.value = index; chooseType.value = index;
} }
function handleClick(item) { function handleClick(item) {
emit('handleClick', item); emit('handleClick', item);
} }
@@ -100,6 +104,7 @@
<style lang="less" scoped> <style lang="less" scoped>
.one-l-box { .one-l-box {
background: rgba(8, 75, 100, 0.2); background: rgba(8, 75, 100, 0.2);
.title { .title {
height: 40px; height: 40px;
border-radius: 14px 14px 0 0; border-radius: 14px 14px 0 0;
@@ -111,14 +116,17 @@
padding: 0 20px; padding: 0 20px;
background: linear-gradient(to right, rgba(8, 75, 100, 0.5) 0%, rgba(255, 255, 255, 0) 100%); background: linear-gradient(to right, rgba(8, 75, 100, 0.5) 0%, rgba(255, 255, 255, 0) 100%);
} }
.content { .content {
height: calc(100% - 40px); height: calc(100% - 40px);
display: flex; display: flex;
flex-direction: column; flex-direction: column;
.type-time { .type-time {
padding-top: 10px; padding-top: 10px;
margin-right: 10px; margin-right: 10px;
font-size: 14px; font-size: 14px;
> div { > div {
cursor: pointer; cursor: pointer;
padding: 3px 15px; padding: 3px 15px;
@@ -126,10 +134,12 @@
display: flex; display: flex;
align-items: center; align-items: center;
} }
.selected { .selected {
color: #00ccff; color: #00ccff;
background: rgba(0, 204, 255, 0.2); background: rgba(0, 204, 255, 0.2);
position: relative; position: relative;
&:before { &:before {
content: ''; content: '';
position: absolute; position: absolute;
@@ -151,6 +161,7 @@
border-bottom: 3px solid #00ccff; /* 顶部线条 */ border-bottom: 3px solid #00ccff; /* 顶部线条 */
border-right: 3px solid #00ccff; /* 左侧线条 */ border-right: 3px solid #00ccff; /* 左侧线条 */
} }
> div { > div {
position: absolute; position: absolute;
width: 100%; width: 100%;
@@ -181,10 +192,12 @@
} }
} }
} }
.no-selected { .no-selected {
color: #b6b6b6; color: #b6b6b6;
background: rgba(26, 69, 126, 0.2); background: rgba(26, 69, 126, 0.2);
position: relative; position: relative;
&:before { &:before {
content: ''; content: '';
position: absolute; position: absolute;
@@ -206,6 +219,7 @@
border-bottom: 3px solid #1a457e; /* 顶部线条 */ border-bottom: 3px solid #1a457e; /* 顶部线条 */
border-right: 3px solid #1a457e; /* 左侧线条 */ border-right: 3px solid #1a457e; /* 左侧线条 */
} }
> div { > div {
position: absolute; position: absolute;
width: 100%; width: 100%;
@@ -236,6 +250,7 @@
} }
} }
} }
.triangle { .triangle {
position: absolute; position: absolute;
left: 50%; left: 50%;
@@ -248,6 +263,7 @@
border-bottom: 6px solid #00ccff; /* 底部为黑色,形成三角形 */ border-bottom: 6px solid #00ccff; /* 底部为黑色,形成三角形 */
} }
} }
.server-container { .server-container {
color: #fff; color: #fff;
flex: 1; flex: 1;
@@ -261,18 +277,22 @@
letter-spacing: 2px; letter-spacing: 2px;
margin-top: 10px; margin-top: 10px;
padding-bottom: 10px; padding-bottom: 10px;
.spin { .spin {
position: absolute; position: absolute;
left: 50%; left: 50%;
top: 50%; top: 50%;
} }
} }
.server-item { .server-item {
// font-size: 16px; // font-size: 16px;
padding: 3px 3% 3px 5%; padding: 3px 3% 3px 5%;
&.hasCursor { &.hasCursor {
cursor: pointer; cursor: pointer;
} }
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
} }
+2 -2
View File
@@ -59,8 +59,8 @@
function initChart() { function initChart() {
myChart.value = echarts.init(newChart.value!); myChart.value = echarts.init(newChart.value!);
const dx = ['120', '应急就医', '急救联动']; const dx = ['120', '应急就医'];
const dy = [46, 39, 18]; const dy = [46, 39];
let option = getClassCharts(dx, dy); let option = getClassCharts(dx, dy);
myChart.value.setOption(option); myChart.value.setOption(option);
window.addEventListener('resize', () => { window.addEventListener('resize', () => {