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