@ -0,0 +1,23 @@ |
|||
node_modules |
|||
/dist |
|||
test.zip |
|||
api.zip |
|||
dist.zip |
|||
.DS_Store |
|||
|
|||
|
|||
# local env files |
|||
.env.local |
|||
.env.*.local |
|||
|
|||
# Log files |
|||
npm-debug.log* |
|||
|
|||
# Editor directories and files |
|||
.idea |
|||
.vscode |
|||
*.suo |
|||
*.ntvs* |
|||
*.njsproj |
|||
*.sln |
|||
*.sw? |
@ -0,0 +1,36 @@ |
|||
# Bfy_Pad_v4 |
|||
|
|||
#### Description |
|||
{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**} |
|||
|
|||
#### Software Architecture |
|||
Software architecture description |
|||
|
|||
#### Installation |
|||
|
|||
1. xxxx |
|||
2. xxxx |
|||
3. xxxx |
|||
|
|||
#### Instructions |
|||
|
|||
1. xxxx |
|||
2. xxxx |
|||
3. xxxx |
|||
|
|||
#### Contribution |
|||
|
|||
1. Fork the repository |
|||
2. Create Feat_xxx branch |
|||
3. Commit your code |
|||
4. Create Pull Request |
|||
|
|||
|
|||
#### Gitee Feature |
|||
|
|||
1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md |
|||
2. Gitee blog [blog.gitee.com](https://blog.gitee.com) |
|||
3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) |
|||
4. The most valuable open source project [GVP](https://gitee.com/gvp) |
|||
5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) |
|||
6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) |
@ -0,0 +1,19 @@ |
|||
# ht-ageing |
|||
|
|||
## Project setup |
|||
``` |
|||
npm install |
|||
``` |
|||
|
|||
### Compiles and hot-reloads for development |
|||
``` |
|||
npm run serve |
|||
``` |
|||
|
|||
### Compiles and minifies for production |
|||
``` |
|||
npm run build |
|||
``` |
|||
|
|||
### Customize configuration |
|||
See [Configuration Reference](https://cli.vuejs.org/config/). |
@ -0,0 +1 @@ |
|||
CARBASICS2023-WEB-PAD |
@ -0,0 +1,5 @@ |
|||
module.exports = { |
|||
presets: [ |
|||
'@vue/cli-plugin-babel/preset' |
|||
] |
|||
} |
@ -0,0 +1,39 @@ |
|||
{ |
|||
"name": "storm-pad", |
|||
"version": "2.0.0", |
|||
"private": true, |
|||
"scripts": { |
|||
"serve": "vue-cli-service serve", |
|||
"test": "vue-cli-service build --mode test", |
|||
"build": "vue-cli-service build" |
|||
}, |
|||
"dependencies": { |
|||
"@nutui/nutui-jdl": "^1.0.5", |
|||
"ant-design-vue": "^1.7.2", |
|||
"axios": "^1.4.0", |
|||
"core-js": "^3.6.5", |
|||
"dayjs": "^1.11.9", |
|||
"echarts": "^5.6.0", |
|||
"reqwest": "^2.0.5", |
|||
"scss": "^0.2.4", |
|||
"scss-loader": "^0.0.1", |
|||
"stylus-loader": "^3.0.2", |
|||
"vant": "^2.12.54", |
|||
"vue": "^2.6.11", |
|||
"vue-esign": "^1.1.4", |
|||
"vue-infinite-scroll": "^2.0.2", |
|||
"vue-quill-editor": "^3.0.6", |
|||
"vue-router": "^3.2.0", |
|||
"vuex": "^3.4.0" |
|||
}, |
|||
"devDependencies": { |
|||
"@vue/cli-plugin-babel": "~4.5.19", |
|||
"@vue/cli-plugin-router": "~4.5.19", |
|||
"@vue/cli-plugin-vuex": "~4.5.19", |
|||
"@vue/cli-service": "~4.5.19", |
|||
"less": "^3.0.4", |
|||
"less-loader": "^5.0.0", |
|||
"postcss-px-to-viewport": "^1.1.1", |
|||
"vue-template-compiler": "^2.6.11" |
|||
} |
|||
} |
@ -0,0 +1,22 @@ |
|||
module.exports = { |
|||
plugins: { |
|||
'postcss-px-to-viewport': { |
|||
// options
|
|||
unitToConvert: 'px', |
|||
viewportWidth: 1100, |
|||
unitPrecision: 2, |
|||
propList: ['*'], |
|||
viewportUnit: 'vw', |
|||
fontViewportUnit: 'vw', |
|||
selectorBlackList: [], |
|||
minPixelValue: 1, |
|||
mediaQuery: false, |
|||
replace: true, |
|||
exclude: undefined, |
|||
include: undefined, |
|||
landscape: false, |
|||
landscapeUnit: 'vw', |
|||
landscapeWidth: 700 |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,30 @@ |
|||
<!DOCTYPE html> |
|||
<html lang=""> |
|||
|
|||
<head> |
|||
<meta charset="utf-8"> |
|||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
|||
<meta name="viewport" |
|||
content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"> |
|||
<link rel="icon" href="<%= BASE_URL %>logo.jpg"> |
|||
<title>绿道质控</title> |
|||
<meta http-equiv="Pragma" content="no-cache"> |
|||
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"> |
|||
<meta http-equiv="Expires" content="0"> |
|||
</head> |
|||
|
|||
<body> |
|||
<noscript> |
|||
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. |
|||
Please enable it to continue.</strong> |
|||
</noscript> |
|||
<div id="app"></div> |
|||
<!-- built files will be auto injected --> |
|||
<!-- <script type="text/javascript" src="./vconsole.js"></script> --> |
|||
<script type="text/javascript" src="./uni.webview.1.5.4.js"></script> |
|||
<script> |
|||
// var vConsole = new VConsole() |
|||
</script> |
|||
</body> |
|||
|
|||
</html> |
After Width: | Height: | Size: 9.9 KiB |
@ -0,0 +1,368 @@ |
|||
<!-- |
|||
* @Author: gaowenya |
|||
* @email: gaowenya_a@163.com |
|||
* @Date: 2023-06-19 09:38:10 |
|||
* @LastEditors: |
|||
* @LastEditTime: |
|||
--> |
|||
<template> |
|||
<a-config-provider :locale="locale"> |
|||
<div id="app" class="storm"> |
|||
<a-spin tip="正在请求..." class="zhezhao" :spinning="spinning"> |
|||
<div class="storm-container"> |
|||
<!-- <Nav /> --> |
|||
<div class="storm-content"> |
|||
<router-view /> |
|||
</div> |
|||
</div> |
|||
</a-spin> |
|||
<!-- 全局计时 --> |
|||
<Dragger v-if="$route.name !== 'PatientList' && getCount" ref="timer" class="count-container"> |
|||
<div class="count-name">静脉溶栓</div> |
|||
<!-- <van-count-down :time="getCount" format="mm:ss" /> --> |
|||
<Count /> |
|||
</Dragger> |
|||
<!-- 测评提示信息弹窗 --> |
|||
<a-modal class="patient-create patient-form" :width="518" :maskClosable="false" :closable="false" |
|||
:destroyOnClose="true" v-model="tip.visible" title="提示" @ok="tipConfirm" okText="去测评" cancelText="忽略"> |
|||
<div class="modal-content"> |
|||
{{ tip.content }} |
|||
</div> |
|||
</a-modal> |
|||
<!-- --> |
|||
<a-modal class="patient-create patient-form" :width="518" :maskClosable="false" :closable="false" |
|||
:destroyOnClose="true" v-model="tip.Lnspect" title="提示" @ok="LnspectConfirm" @cancel="LnspectCancel" |
|||
okText="查看" cancelText="忽略"> |
|||
<div class="modal-content">检验结果已完成, 请前往查看</div> |
|||
</a-modal> |
|||
</div> |
|||
</a-config-provider> |
|||
</template> |
|||
<script> |
|||
import zhCN from 'ant-design-vue/es/locale/zh_CN'; // 引入中文语言包 |
|||
import Dragger from './components/dragger.vue'; |
|||
import Count from './components/count.vue'; |
|||
import { |
|||
messageQuery |
|||
} from 'api'; |
|||
import { |
|||
mapMutations, |
|||
mapState |
|||
} from 'vuex'; |
|||
import Nav from 'components/Nav.vue'; |
|||
export default { |
|||
components: { |
|||
Nav, |
|||
Dragger, |
|||
Count, |
|||
}, |
|||
data() { |
|||
return { |
|||
locale: zhCN, // 设置为中文 |
|||
routeName: '', |
|||
tip: { |
|||
// 提示信息 |
|||
visible: false, //测评 |
|||
Lnspect: false, //检验 |
|||
content: '', |
|||
k: null, |
|||
}, |
|||
request: 0, |
|||
pushRouter: { |
|||
0: 'Inspect', |
|||
1: 'Image', |
|||
2: 'Min', |
|||
}, |
|||
titleForm: { |
|||
'0min': 'JMRS-Q-NIHSS', |
|||
'15min': 'JMRS-15-NIHSS', |
|||
'30min': 'JMRS-30-NIHSS', |
|||
'45min': 'JMRS-45-NIHSS', |
|||
'60min': 'JMRS-60-NIHSS', |
|||
}, |
|||
}; |
|||
}, |
|||
computed: { |
|||
...mapState('storm', ['spinning', 'showNav']), |
|||
...mapState('patient', ['patientData', 'timerData', 'overviewType']), |
|||
getCount() { |
|||
const { |
|||
timerData, |
|||
patientData |
|||
} = this; |
|||
if (!timerData && !patientData) return null; |
|||
if (timerData.firstAidId !== patientData.firstAidId) return null; |
|||
const { |
|||
countdown |
|||
} = timerData; |
|||
if (!countdown) return null; |
|||
// const totalSeconds = countdown; |
|||
// // ?️ 获取完整分钟数 |
|||
// const minutes = Math.floor(totalSeconds / 60); |
|||
// // ?️ 获得剩余的秒数 |
|||
// const seconds = totalSeconds % 60; |
|||
// // ✅ 格式化为 MM:SS |
|||
// const result = `${this.padTo2Digits(minutes)}:${this.padTo2Digits(seconds)}`; |
|||
// console.log(result); // ?️ "09:25" |
|||
return parseInt(countdown) * 1000; |
|||
}, |
|||
}, |
|||
watch: { |
|||
overviewType: { |
|||
deep: true, |
|||
handler(n, o) { |
|||
if (n === 'overview' || n === 'info') { |
|||
this.queryMessage(); |
|||
} |
|||
}, |
|||
}, |
|||
$route: { |
|||
deep: true, |
|||
handler(n, o) { |
|||
if (n.name === 'PatientList') { |
|||
this.setTimerData({}); |
|||
} |
|||
if (n.name === 'PatientDetails') { |
|||
// this.request = 0; |
|||
} |
|||
if ( |
|||
n.path !== '/' && |
|||
n.name !== 'PatientList' && |
|||
n.name !== 'Min' |
|||
) { |
|||
this.init(); |
|||
} |
|||
}, |
|||
}, |
|||
}, |
|||
methods: { |
|||
...mapMutations('patient', ['setTimerData']), |
|||
padTo2Digits(num) { |
|||
return num.toString().padStart(2, '0'); |
|||
}, |
|||
async init() { |
|||
const { |
|||
firstAidId |
|||
} = this.patientData; |
|||
if (!firstAidId) return; |
|||
// this.queryMessage(); |
|||
await this.handMessageQuery(); |
|||
console.log('init', this.$route.name); |
|||
this.request = 0; |
|||
this.utils.AnimationFrame.create( |
|||
'timerTask', |
|||
10000, |
|||
true, |
|||
(min) => { |
|||
this.getMessageQuery(min); |
|||
} |
|||
); |
|||
}, |
|||
async queryMessage() { |
|||
const { |
|||
firstAidId |
|||
} = this.patientData; |
|||
const res = await messageQuery(firstAidId); |
|||
const { |
|||
code, |
|||
msg |
|||
} = res; |
|||
if (code === 200) { |
|||
this.setTimerData(res.data); |
|||
} |
|||
}, |
|||
// 测评确认 |
|||
tipConfirm() { |
|||
this.tip.visible = false; |
|||
const name = this.pushRouter[this.tip.k]; |
|||
console.log('name: ', name); |
|||
this.$router.push({ |
|||
name, |
|||
}); |
|||
}, |
|||
// 检验调取确认 |
|||
LnspectConfirm() { |
|||
this.LnspectCancel(); |
|||
this.$router.push({ |
|||
name: 'Inspect', |
|||
}); |
|||
}, |
|||
LnspectCancel() { |
|||
this.tip.Lnspect = false; |
|||
this.$forceUpdate(); |
|||
}, |
|||
// 消息提示 |
|||
async handMessageQuery() { |
|||
// 异步 |
|||
const { |
|||
firstAidId |
|||
} = this.patientData; |
|||
if (firstAidId) { |
|||
const res = await messageQuery(firstAidId); |
|||
const { |
|||
code, |
|||
msg |
|||
} = res; |
|||
if (code === 200) { |
|||
this.setTimerData(res.data); |
|||
const { |
|||
map, |
|||
haveFlagInspect |
|||
} = res.data; |
|||
console.log('firstAidInspectDataDtos: ', haveFlagInspect); |
|||
for (let k in map) { |
|||
if (map[k]) { |
|||
this.taskList = { |
|||
text: map[k], |
|||
status: false, |
|||
}; |
|||
} |
|||
if (map[k] && this.taskList.status === false) { |
|||
// 记录不重复弹窗 |
|||
if (this.taskList.text === map[k]) { |
|||
this.taskList.status = true; |
|||
} |
|||
if ( |
|||
this.$route.name !== 'Min' && |
|||
this.$route.name !== 'PatientList' |
|||
) { |
|||
this.tip = { |
|||
visible: true, |
|||
k, |
|||
content: map[k], |
|||
}; |
|||
} |
|||
} |
|||
} |
|||
// 检验调取 判断是否有急诊号 1 弹窗, 0 不弹窗 |
|||
if (haveFlagInspect) { |
|||
if ( |
|||
this.$route.name !== 'Inspect' && |
|||
this.$route.name !== 'PatientList' |
|||
) { |
|||
this.tip.Lnspect = true; |
|||
} |
|||
} |
|||
} else { |
|||
this.$message.error(msg); |
|||
} |
|||
} |
|||
}, |
|||
async getMessageQuery(min, firstAidId) { |
|||
const n = min; |
|||
if (this.request === n) { |
|||
// 符合轮训条件 |
|||
console.log('十秒'); |
|||
this.request = n + 1; |
|||
await this.handMessageQuery(); |
|||
} |
|||
}, |
|||
}, |
|||
}; |
|||
</script> |
|||
<style lang="less"> |
|||
.zhezhao { |
|||
position: fixed; |
|||
left: 0; |
|||
top: 0; |
|||
width: 100vw; |
|||
height: 100vh; |
|||
z-index: 999; |
|||
} |
|||
|
|||
#app { |
|||
font-family: Avenir, Helvetica, Arial, sans-serif; |
|||
-webkit-font-smoothing: antialiased; |
|||
-moz-osx-font-smoothing: grayscale; |
|||
// text-align: center; |
|||
color: #2c3e50; |
|||
background: #f6f8fa; |
|||
height: 100%; |
|||
position: relative; |
|||
|
|||
::-webkit-scrollbar { |
|||
display: none; |
|||
} |
|||
} |
|||
|
|||
// .count-container { |
|||
// width: 200px; |
|||
// background: rgba(255, 255, 255, 0.1); |
|||
// border: 1px solid #ffffff; |
|||
// box-shadow: 0px 6px 10px 0px rgba(0, 59, 172, 0.2); |
|||
// border-radius: 4px; |
|||
// overflow: hidden; |
|||
// backdrop-filter: blur(4px); |
|||
// text-align: center; |
|||
// display: flex; |
|||
// flex-direction: column; |
|||
// align-items: center; |
|||
// padding: 16px 0; |
|||
// z-index: 999; |
|||
|
|||
// .count-name { |
|||
// font-size: 26px; |
|||
// font-family: Source Han Sans CN, Source Han Sans CN-Bold; |
|||
// font-weight: 700; |
|||
// color: #393d4e; |
|||
// line-height: 26px; |
|||
// padding-bottom: 7px; |
|||
// } |
|||
|
|||
// .van-count-down { |
|||
// font-size: 44px; |
|||
// font-family: Source Han Sans CN, Source Han Sans CN-Bold; |
|||
// font-weight: 700; |
|||
// color: #393d4e; |
|||
// line-height: 44px; |
|||
// } |
|||
// } |
|||
</style> |
|||
<style lang="stylus"> |
|||
// @import './assets/portrait.styl'; |
|||
@import './assets/less/common.less'; |
|||
|
|||
html { |
|||
overflow: hidden !important; |
|||
} |
|||
|
|||
html, |
|||
body, |
|||
#app { |
|||
width: 100%; |
|||
height: 100%; |
|||
font-size: 1.2rem |
|||
} |
|||
|
|||
.zhezhao .ant-spin-container { |
|||
height: 100% |
|||
} |
|||
|
|||
.ant-modal div[aria-hidden="true"]{ |
|||
display: none !important; |
|||
} |
|||
|
|||
.storm { |
|||
display: flex; |
|||
flex: 1; |
|||
|
|||
.storm-container { |
|||
display: flex; |
|||
flex-direction: column; |
|||
height: 100%; |
|||
background: linear-gradient(180deg, #dbeaff, #fbfdff); |
|||
|
|||
.header { |
|||
// height: 88px; |
|||
} |
|||
|
|||
.storm-content { |
|||
flex: 1; |
|||
width: 100%; |
|||
height: 100%; |
|||
overflow-y: auto; |
|||
display: flex; |
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,226 @@ |
|||
import axios from 'axios'; |
|||
let { proxyUrl } = require('@/config/setting'); |
|||
let proxyUrl1 = proxyUrl + '/workstation'; |
|||
//查询民族列表
|
|||
export const getNation = () => axios.post(`${proxyUrl1}/sys/nation/list`); |
|||
// 查询菜单
|
|||
export const getRouters = (params) => |
|||
axios.get(`${proxyUrl1}/getRouters`, params); |
|||
|
|||
// 查询平车、平板设备列表
|
|||
export const selectList = (params) => |
|||
axios.post(`${proxyUrl1}/remoteDevice/selectList `, params); |
|||
|
|||
// 查询患者列表
|
|||
export const getList = (params) => |
|||
axios.post(`${proxyUrl1}/firstAid/list`, params); |
|||
|
|||
// 查询分诊患者列表
|
|||
export const queryTriageList = (params) => |
|||
axios.post(`${proxyUrl1}/firstAid/queryTriageList`, params); |
|||
|
|||
// 创建患者
|
|||
export const create = (params) => |
|||
axios.post(`${proxyUrl1}/firstAid/create`, params); |
|||
|
|||
// 查病历数据
|
|||
export const queryAidRecord = (firstAidId, codeList) => |
|||
axios.post(`${proxyUrl1}/firstAid/queryAidRecord`, { |
|||
param: { firstAidId, codeList }, |
|||
}); |
|||
|
|||
// 更新急救code信息
|
|||
export const saveAidRecord = (param) => |
|||
axios.post(`${proxyUrl1}/firstAid/saveAidRecord`, { param }); |
|||
|
|||
// 更新急救基本信息
|
|||
export const updateAidBase = (param) => |
|||
axios.post(`${proxyUrl1}/firstAid/update`, { param }); |
|||
|
|||
//溶栓记录
|
|||
export const queryLog = (param) => |
|||
axios.post(`${proxyUrl1}/firstAid/queryLog`, { param }); |
|||
|
|||
//医嘱查询
|
|||
export const adviceQuery = (param) => |
|||
axios.post(`${proxyUrl1}/advice/query`, { param }); |
|||
|
|||
//下发医嘱
|
|||
export const adviceAdd = (params) => |
|||
axios.post(`${proxyUrl1}/advice/add`, { ...params }); |
|||
|
|||
//推送结果
|
|||
export const messageQuery = (firstAidId) => |
|||
axios.post(`${proxyUrl1}/message/query`, { firstAidId }); |
|||
|
|||
export function uploadIdcard(data) { |
|||
return axios({ |
|||
url: `${proxyUrl1}/sys/ocr/idcardInfo`, |
|||
method: 'POST', |
|||
data: data, |
|||
headers: { |
|||
'Content-Type': 'multipart/form-data', |
|||
}, |
|||
}); |
|||
} |
|||
export const idcardInfo = `${proxyUrl1}/sys/ocr/idcardInfo`; |
|||
|
|||
// 创建急救身份证扫描
|
|||
|
|||
export const idcardInfoBase64 = (picBase64) => |
|||
axios.post(`${proxyUrl1}/sys/ocr/idcardInfoBase64`, { picBase64 }); |
|||
|
|||
//知情同意新增
|
|||
export const saveInformedConsent = (params) => |
|||
axios.post(`${proxyUrl1}/informed/saveInformedConsent`, { ...params }); |
|||
|
|||
// 查询是否有进行中的急救
|
|||
export const queryFree = (params) => |
|||
axios.post(`${proxyUrl1}/firstAid/queryFree`, { ...params }); |
|||
|
|||
export const endFirstAid = (params) => |
|||
axios.post(`${proxyUrl1}/firstAid/endFirstAid `, {}); |
|||
//知情同意查询
|
|||
export const queryConsentResult = (params) => |
|||
axios.post(`${proxyUrl1}/informed/queryConsentResult`, { |
|||
param: { ...params }, |
|||
}); |
|||
|
|||
//查看知情同意时添加谈话时间
|
|||
export const thTime = (params) => |
|||
axios.post(`${proxyUrl1}/firstAid/thTime`, { ...params }); |
|||
|
|||
// 上传文件
|
|||
export function uploadfile(data) { |
|||
return axios({ |
|||
url: `${proxyUrl}/file/upload`, |
|||
method: 'POST', |
|||
data: data, |
|||
headers: { |
|||
'Content-Type': 'multipart/form-data', |
|||
}, |
|||
}); |
|||
} |
|||
|
|||
// 上传文件
|
|||
export function uploadBase64(data) { |
|||
return axios({ |
|||
url: `${proxyUrl}/file/uploadBase64`, |
|||
method: 'POST', |
|||
data: data, |
|||
headers: { |
|||
'Content-Type': 'multipart/form-data', |
|||
}, |
|||
}); |
|||
} |
|||
// 查询平车状态
|
|||
export const queryByPadNo = (params) => |
|||
axios.post(`${proxyUrl1}/car/queryByPadNo`, { param: { ...params } }); |
|||
// 血样报告
|
|||
export const queryFirstAidInspectData = (params) => |
|||
axios.post(`${proxyUrl1}/firstAid/queryFirstAidInspectData`, { |
|||
...params, |
|||
}); |
|||
// 查询下一个节点
|
|||
export const getNextNode = (params) => |
|||
axios.post(`${proxyUrl1}/firstAid/next`, { param: { ...params } }); |
|||
|
|||
//导出急救记录
|
|||
export const exportFirstAid = (params) => |
|||
axios.post(`${proxyUrl1}/firstAid/export`, { param: { ...params } }); |
|||
|
|||
// 溶栓介入视频
|
|||
export const queryVideo = (param) => |
|||
axios.post(`${proxyUrl1}/video/query`, { param: { ...param } }); |
|||
|
|||
// 溶栓介入视频
|
|||
export const queryBook = (param) => |
|||
axios.post(`${proxyUrl1}/informed/queryConsentTemplate`, { |
|||
param: { ...param }, |
|||
}); |
|||
|
|||
// 溶栓介入视频
|
|||
export const queryWeight = (firstAidId) => |
|||
axios.post(`${proxyUrl1}/firstAid/weight`, { |
|||
firstAidId: firstAidId, |
|||
}); |
|||
|
|||
// 修改急救信息
|
|||
export const updateFirstAid = (params) => |
|||
axios.post(`${proxyUrl1}/firstAid/update`, { param: { ...params } }); |
|||
|
|||
// ------------平车相关操作------------
|
|||
// 授权
|
|||
export const remoteAuth = (params) => |
|||
axios.post(`${proxyUrl1}/mqtt/remoteAuth`, { ...params }); |
|||
|
|||
// 电池容量
|
|||
export const remoteKljCapacity = (params) => |
|||
axios.post(`${proxyUrl1}/mqtt/remoteKljCapacity`, { ...params }); |
|||
// 设备重启
|
|||
export const remoteReboot = (params) => |
|||
axios.post( |
|||
`${proxyUrl1}/mqtt/remoteReboot
|
|||
`,
|
|||
{ ...params } |
|||
); |
|||
// 发送远程rfid消息
|
|||
export const remoteRfid = (params) => |
|||
axios.post( |
|||
`${proxyUrl1}/mqtt/remoteRfid
|
|||
`,
|
|||
{ ...params } |
|||
); |
|||
// 发送远程设备心跳(校时)消息
|
|||
export const remoteTime = (params) => |
|||
axios.post( |
|||
`${proxyUrl1}/mqtt/remoteTime
|
|||
`,
|
|||
{ ...params } |
|||
); |
|||
// 称重校准
|
|||
export const remoteWeightCalibration = (params) => |
|||
axios.post( |
|||
`${proxyUrl1}/mqtt/remoteWeightCalibration
|
|||
`,
|
|||
{ ...params } |
|||
); |
|||
|
|||
// 病例统计
|
|||
export const getCtInfoPath = (params) => |
|||
axios.post(`${proxyUrl1}/firstAid/getCtInfoPath`, { ...params }); |
|||
|
|||
|
|||
// 我的
|
|||
export const loginInfo = (params) => |
|||
axios.post(`${proxyUrl1}/home/loginInfo`, { ...params } ); |
|||
|
|||
// RPT统计
|
|||
export const queryRptResult = (params) => |
|||
axios.post(`${proxyUrl1}/home/queryRptResult`, { ...params }); |
|||
// DPT统计 / 血管内治疗率
|
|||
export const queryDptResult = (params) => |
|||
axios.post(`${proxyUrl1}/home/queryDptResult`, { ...params }); |
|||
// 血管内治疗数据对比
|
|||
export const selectXgzl = (params) => |
|||
axios.post(`${proxyUrl1}/home/selectXgzl`, { ...params }); |
|||
// SICH发生率
|
|||
export const querySichResult = (params) => |
|||
axios.post(`${proxyUrl1}/home/querySichResult`, { ...params }); |
|||
// SICHDNT分布
|
|||
export const queryDntResult = (params) => |
|||
axios.post(`${proxyUrl1}/home/queryDntResult`, { ...params }); |
|||
// 静脉溶栓数据对比 / 静脉溶栓率
|
|||
export const queryJmrs = (params) => |
|||
axios.post(`${proxyUrl1}/home/queryJmrs`, { ...params }); |
|||
// 病例统计数据分析
|
|||
export const queryByDatePatient = (params) => |
|||
axios.post(`${proxyUrl1}/home/queryByDatePatient`, { ...params }); |
|||
// 病例统计
|
|||
export const queryPatient = (params) => |
|||
axios.post(`${proxyUrl1}/home/queryPatient`, { ...params }); |
|||
// 介入手术记录/总报告
|
|||
export const operationLog = (params) => |
|||
axios.post(`${proxyUrl1}/interfere/operationLog`, { ...params }); |
|||
|
|||
|
@ -0,0 +1,5 @@ |
|||
import axios from 'axios'; |
|||
let { proxyUrl } = require('@/config/setting'); |
|||
// 登录
|
|||
export const Login = (params) => |
|||
axios.post(`${proxyUrl}/auth/pad/login`, params); |
After Width: | Height: | Size: 76 KiB |
After Width: | Height: | Size: 70 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 37 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 70 KiB |
After Width: | Height: | Size: 90 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 108 KiB |
After Width: | Height: | Size: 75 KiB |
After Width: | Height: | Size: 99 KiB |
After Width: | Height: | Size: 200 KiB |
After Width: | Height: | Size: 69 KiB |
After Width: | Height: | Size: 72 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 72 KiB |
After Width: | Height: | Size: 446 B |
After Width: | Height: | Size: 512 B |
After Width: | Height: | Size: 551 B |
After Width: | Height: | Size: 360 B |
After Width: | Height: | Size: 6.1 KiB |
After Width: | Height: | Size: 894 B |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 71 KiB |
After Width: | Height: | Size: 198 KiB |
After Width: | Height: | Size: 230 KiB |
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 978 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 145 B |
After Width: | Height: | Size: 65 KiB |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 746 B |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 567 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 580 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 655 B |
After Width: | Height: | Size: 482 B |
After Width: | Height: | Size: 524 B |
After Width: | Height: | Size: 631 B |
After Width: | Height: | Size: 613 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 978 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.2 KiB |
@ -0,0 +1,315 @@ |
|||
.border-b { |
|||
border-bottom: 1px solid #ccc; |
|||
} |
|||
|
|||
.relative { |
|||
position: relative; |
|||
} |
|||
|
|||
.absolute { |
|||
position: absolute; |
|||
} |
|||
|
|||
.d-flex { |
|||
display: flex; |
|||
} |
|||
|
|||
.flex-wrap { |
|||
flex-wrap: wrap; |
|||
} |
|||
|
|||
.flex-nowrap { |
|||
flex-wrap: nowrap; |
|||
} |
|||
|
|||
.flex-column { |
|||
flex-direction: column; |
|||
} |
|||
|
|||
.flex-column-reverse { |
|||
flex-direction: column-reverse; |
|||
} |
|||
|
|||
.flex-row { |
|||
flex-direction: row; |
|||
} |
|||
|
|||
.flex-row-reverse { |
|||
flex-direction: row-reverse; |
|||
} |
|||
|
|||
.justify-center { |
|||
justify-content: center; |
|||
} |
|||
|
|||
.justify-space-between { |
|||
justify-content: space-between; |
|||
} |
|||
|
|||
.align-center { |
|||
align-items: center; |
|||
} |
|||
|
|||
.flex-1 { |
|||
display: flex; |
|||
flex: 1; |
|||
} |
|||
|
|||
.flex-2 { |
|||
display: flex; |
|||
flex: 2; |
|||
} |
|||
|
|||
.flex-3 { |
|||
display: flex; |
|||
flex: 3; |
|||
} |
|||
|
|||
.pointer { |
|||
cursor: pointer; |
|||
} |
|||
|
|||
.ellipsis-2 { |
|||
overflow: hidden; |
|||
text-overflow: ellipsis; |
|||
display: -webkit-box; |
|||
-webkit-line-clamp: 2; |
|||
-webkit-box-orient: vertical; |
|||
} |
|||
|
|||
.ellipsis-3 { |
|||
overflow: hidden; |
|||
text-overflow: ellipsis; |
|||
display: -webkit-box; |
|||
-webkit-line-clamp: 3; |
|||
-webkit-box-orient: vertical; |
|||
} |
|||
|
|||
.fz22 { |
|||
font-size: 30px; |
|||
} |
|||
|
|||
.border-bottom { |
|||
border-bottom: 1px solid #dfe6ec; |
|||
} |
|||
|
|||
.borderNone { |
|||
border-bottom: none; |
|||
} |
|||
|
|||
.common-picker { |
|||
position: absolute; |
|||
bottom: 0; |
|||
left: 0; |
|||
right: 0; |
|||
z-index: 999; |
|||
} |
|||
|
|||
.common-button { |
|||
width: 200px; |
|||
margin: 0 auto; |
|||
margin-bottom: 20px; |
|||
} |
|||
|
|||
.common-slider { |
|||
width: 90%; |
|||
display: flex; |
|||
align-items: center; |
|||
flex-direction: column; |
|||
position: relative; |
|||
margin: 40px 0 20px; |
|||
} |
|||
|
|||
.common-slider .van-stepper--round { |
|||
width: 100%; |
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: space-between; |
|||
position: relative; |
|||
} |
|||
|
|||
.common-slider .van-stepper--round .van-stepper__minus { |
|||
width: 30px; |
|||
height: 30px; |
|||
color: #7690e5; |
|||
border-color: #7690e5; |
|||
} |
|||
|
|||
.common-slider .van-stepper--round .van-stepper__plus { |
|||
width: 30px; |
|||
height: 30px; |
|||
background-color: #7690e5; |
|||
} |
|||
|
|||
.common-slider .van-stepper--round .van-stepper__input { |
|||
position: absolute; |
|||
left: 50%; |
|||
right: 50%; |
|||
transform: translate(-50%, -50%); |
|||
bottom: 5px; |
|||
background: #7690e5; |
|||
border-radius: 6px; |
|||
font-size: 24px; |
|||
font-family: OPPOSans, OPPOSans-Bold; |
|||
font-weight: 700; |
|||
text-align: center; |
|||
color: #ffffff; |
|||
padding: 10px 0; |
|||
width: 100px; |
|||
margin-bottom: 10px; |
|||
display: none; |
|||
} |
|||
|
|||
.common-slider .common-slider-slider { |
|||
width: 80%; |
|||
position: absolute; |
|||
bottom: 6px; |
|||
height: 16px; |
|||
background: #e4edff; |
|||
border-radius: 8px; |
|||
} |
|||
|
|||
.common-slider .common-slider-slider .van-slider__button-wrapper { |
|||
width: 30px; |
|||
height: 30px; |
|||
background: #7690e5; |
|||
border-radius: 50%; |
|||
box-shadow: 0 2px 0 rgba(0, 0, 0, 0.1); |
|||
} |
|||
|
|||
.common-slider .common-slider-slider .ant-input-number { |
|||
position: absolute; |
|||
left: 50%; |
|||
right: 50%; |
|||
bottom: 20px; |
|||
transform: translate(-50%, -50%); |
|||
font-size: 24px; |
|||
font-family: OPPOSans, OPPOSans-Bold; |
|||
font-weight: 700; |
|||
height: auto; |
|||
padding: 4px 0; |
|||
text-align: center; |
|||
background: #7690e5; |
|||
border-radius: 6px; |
|||
color: #fff; |
|||
} |
|||
|
|||
.common-slider .common-slider-slider .ant-input-number .ant-input-number-input { |
|||
text-align: center; |
|||
} |
|||
|
|||
.common-slider .common-slider-slider .ant-input-number .ant-input-number-handler-wrap { |
|||
display: none; |
|||
} |
|||
|
|||
.common-slider .common-slider-slider .slider-icon { |
|||
position: absolute; |
|||
top: -23px; |
|||
left: 2px; |
|||
color: #7690e5; |
|||
font-size: 26px; |
|||
} |
|||
|
|||
.ant-form .ant-form-item-label { |
|||
text-align: left; |
|||
} |
|||
|
|||
.ant-form label { |
|||
font-size: 26px !important; |
|||
font-weight: 500; |
|||
color: #565e6f; |
|||
} |
|||
|
|||
.ant-form .ant-form-item { |
|||
margin-bottom: 18px !important; |
|||
box-sizing: border-box; |
|||
} |
|||
|
|||
.ant-form .ant-form-item:not(:last-child) { |
|||
border-bottom: 1px solid #dfe6ec; |
|||
padding-bottom: 18px; |
|||
} |
|||
|
|||
.ant-form .dose-item { |
|||
margin-bottom: 40px !important; |
|||
} |
|||
|
|||
.ant-form .mb0 { |
|||
margin-bottom: 0px !important; |
|||
} |
|||
|
|||
.ant-form .borderNone { |
|||
border-bottom: none !important; |
|||
} |
|||
|
|||
.ant-form .ant-radio-button-wrapper { |
|||
padding: 0 18px; |
|||
height: 40px; |
|||
line-height: 40px; |
|||
font-size: 18px !important; |
|||
margin-right: 20px; |
|||
margin-bottom: 10px; |
|||
background: #f8f8f9; |
|||
border: 0.5px solid #a3acbf; |
|||
border-radius: 6px; |
|||
vertical-align: middle; |
|||
} |
|||
|
|||
.ant-form .ant-radio-button-wrapper:before, |
|||
.ant-form .ant-radio-button-wrapper .ant-radio-button-wrapper-checked:before { |
|||
display: none !important; |
|||
} |
|||
|
|||
.ant-form .ant-radio-button-wrapper:first-child, |
|||
.ant-form .ant-radio-button-wrapper:last-child { |
|||
border-radius: 6px !important; |
|||
} |
|||
|
|||
.ant-form .ant-radio-button-wrapper:last-child { |
|||
margin-right: 0; |
|||
} |
|||
|
|||
.ant-form .ant-form-item-control { |
|||
text-align: left; |
|||
margin-left: 10px; |
|||
} |
|||
|
|||
.solid .ant-checkbox-wrapper { |
|||
background: #f8f8f9; |
|||
border: 0.5px solid #a3acbf; |
|||
border-radius: 6px; |
|||
vertical-align: middle; |
|||
margin-right: 20px; |
|||
margin-bottom: 10px; |
|||
font-size: 1.2vw !important; |
|||
line-height: 40px; |
|||
padding: 0 18px; |
|||
height: 40px; |
|||
} |
|||
|
|||
.solid .ant-checkbox-wrapper.ant-checkbox-wrapper-checked { |
|||
background: #7690e5; |
|||
color: #fff; |
|||
} |
|||
|
|||
.solid .ant-checkbox-wrapper .ant-checkbox { |
|||
display: none; |
|||
} |
|||
|
|||
.ant-tabs-nav-container .ant-tabs-tab { |
|||
font-size: 20px; |
|||
font-family: Source Han Sans CN, Source Han Sans CN-Medium; |
|||
font-weight: 500; |
|||
text-align: left; |
|||
color: #70798c; |
|||
} |
|||
|
|||
.ant-tabs-nav-container .ant-tabs-tab-active { |
|||
font-weight: 700; |
|||
font-family: Source Han Sans CN, Source Han Sans CN-Bold; |
|||
color: #393d4e !important; |
|||
} |
|||
|
|||
.ant-tabs-nav-container .ant-tabs-ink-bar { |
|||
background: #7690e5 !important; |
|||
} |
@ -0,0 +1,819 @@ |
|||
.border-b { |
|||
border-bottom: 1px solid #ccc; |
|||
} |
|||
|
|||
// position |
|||
.relative { |
|||
position: relative; |
|||
} |
|||
.absolute { |
|||
position: absolute; |
|||
} |
|||
|
|||
// flex |
|||
.d-flex{ |
|||
display: flex; |
|||
} |
|||
|
|||
.flex-wrap{ |
|||
flex-wrap: wrap; |
|||
} |
|||
|
|||
.flex-nowrap{ |
|||
flex-wrap: nowrap; |
|||
} |
|||
|
|||
.flex-column{ |
|||
flex-direction: column; |
|||
} |
|||
|
|||
.flex-column-reverse{ |
|||
flex-direction: column-reverse; |
|||
} |
|||
|
|||
.flex-row{ |
|||
flex-direction: row; |
|||
} |
|||
|
|||
.flex-row-reverse{ |
|||
flex-direction: row-reverse; |
|||
} |
|||
|
|||
.justify-center{ |
|||
justify-content: center; |
|||
} |
|||
|
|||
.justify-space-between{ |
|||
justify-content: space-between; |
|||
} |
|||
|
|||
.align-center{ |
|||
align-items: center; |
|||
} |
|||
|
|||
.flex-1{ |
|||
display: flex; |
|||
flex: 1; |
|||
} |
|||
|
|||
.flex-2{ |
|||
display: flex; |
|||
flex: 2; |
|||
} |
|||
.flex-3{ |
|||
display: flex; |
|||
flex: 3; |
|||
} |
|||
|
|||
// other |
|||
.pointer{ |
|||
cursor:pointer; |
|||
} |
|||
.ellipsis-2 { |
|||
overflow: hidden; |
|||
text-overflow: ellipsis; |
|||
display: -webkit-box; |
|||
-webkit-line-clamp: 2; |
|||
-webkit-box-orient: vertical; |
|||
} |
|||
.ellipsis-3 { |
|||
overflow: hidden; |
|||
text-overflow: ellipsis; |
|||
display: -webkit-box; |
|||
-webkit-line-clamp: 3; |
|||
-webkit-box-orient: vertical; |
|||
} |
|||
.font-bold{ |
|||
font: bold; |
|||
} |
|||
.text-left{ |
|||
text-align: left; |
|||
} |
|||
.text-right{ |
|||
text-align: right; |
|||
} |
|||
.text-center{ |
|||
text-align: center; |
|||
} |
|||
.fz20{ |
|||
font-size: 20px; |
|||
} |
|||
.fz22{ |
|||
font-size: 30px; |
|||
} |
|||
.fz24{ |
|||
font-size: 24px; |
|||
} |
|||
.border-bottom{ |
|||
border-bottom: 1px solid #dfe6ec; |
|||
} |
|||
.borderNone{ |
|||
border-bottom: none; |
|||
} |
|||
|
|||
.common-picker{ |
|||
position: absolute; |
|||
bottom: 0; |
|||
left: 0; |
|||
right: 0; |
|||
z-index: 999; |
|||
} |
|||
.common-button { |
|||
width: 200px; |
|||
margin: 0 auto; |
|||
margin-bottom: 12px; |
|||
border-radius: 20px; |
|||
} |
|||
.common-slider{ |
|||
width: 100%; |
|||
display: flex; |
|||
align-items: center; |
|||
flex-direction: column; |
|||
position: relative; |
|||
margin: 80px 0 20px; |
|||
.van-stepper--round{ |
|||
width: 90%; |
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: space-between; |
|||
position: relative; |
|||
.van-stepper__input{ |
|||
position: absolute; |
|||
left: 50%; |
|||
right: 50%; |
|||
transform: translate(-50%, -50%); |
|||
bottom: 5px; |
|||
background: #007AFF; |
|||
border-radius: 6px; |
|||
font-size: 24px; |
|||
font-family: OPPOSans, OPPOSans-Bold; |
|||
font-weight: 700; |
|||
text-align: center; |
|||
color: #ffffff; |
|||
padding: 10px 0; |
|||
width: 100px; |
|||
margin-bottom: 10px; |
|||
display: none; |
|||
} |
|||
.van-stepper__minus{ |
|||
width: 30px; |
|||
height: 30px; |
|||
color: #fff; |
|||
color: #007AFF; |
|||
border-color: #007AFF; |
|||
} |
|||
.van-stepper__plus{ |
|||
width: 30px; |
|||
height: 30px; |
|||
background-color: #007AFF; |
|||
} |
|||
&.one{ |
|||
.van-stepper__minus{ |
|||
position: absolute; |
|||
bottom: 0; |
|||
left: 40px; |
|||
width: 30px; |
|||
height: 30px; |
|||
color: #fff; |
|||
border-color: #007AFF; |
|||
// background-color: #007AFF; |
|||
background: linear-gradient(to right, rgba(82, 165, 255, 1), rgba(0, 122, 255, 1)); |
|||
} |
|||
.van-stepper__plus{ |
|||
position: absolute; |
|||
bottom: 0; |
|||
right: 40px; |
|||
width: 30px; |
|||
height: 30px; |
|||
// background-color: #007AFF; |
|||
background: linear-gradient(to right, rgba(82, 165, 255, 1), rgba(0, 122, 255, 1)); |
|||
} |
|||
} |
|||
&.five{ |
|||
.van-stepper__minus{ |
|||
width: 30px; |
|||
height: 30px; |
|||
color: #fff; |
|||
border-color: #007AFF; |
|||
// background-color: #007AFF; |
|||
background: linear-gradient(to right, rgba(82, 165, 255, 1), rgba(0, 122, 255, 1)); |
|||
&::before{ |
|||
content: '-5'; |
|||
font-size: 14px; |
|||
font-weight: bold; |
|||
position: absolute; |
|||
top: 4px; |
|||
left: 13px; |
|||
height: 0; |
|||
} |
|||
} |
|||
.van-stepper__plus{ |
|||
width: 30px; |
|||
height: 30px; |
|||
color: #fff; |
|||
border-color: #007AFF; |
|||
// background-color: #007AFF; |
|||
background: linear-gradient(to right, rgba(82, 165, 255, 1), rgba(0, 122, 255, 1)); |
|||
position: relative; |
|||
&::before{ |
|||
content: '+5'; |
|||
font-size: 14px; |
|||
font-weight: bold; |
|||
position: absolute; |
|||
top: 4px; |
|||
left: 13px; |
|||
height: 0; |
|||
// letter-spacing: -1px; |
|||
} |
|||
&::after{ |
|||
display: none; |
|||
} |
|||
} |
|||
} |
|||
&.ten{ |
|||
.van-stepper__minus{ |
|||
position: absolute; |
|||
top: 0; |
|||
left: -35px; |
|||
width: 30px; |
|||
height: 30px; |
|||
color: #fff; |
|||
border-color: #007AFF; |
|||
// background-color: #007AFF; |
|||
background: linear-gradient(to right, rgba(82, 165, 255, 1), rgba(0, 122, 255, 1)); |
|||
&::before{ |
|||
content: '-10'; |
|||
font-size: 14px; |
|||
font-weight: bold; |
|||
position: absolute; |
|||
top: 4px; |
|||
left: 11px; |
|||
height: 0; |
|||
// letter-spacing: -1px; |
|||
} |
|||
} |
|||
.van-stepper__plus{ |
|||
position: absolute; |
|||
top: 0; |
|||
right: -35px; |
|||
width: 30px; |
|||
height: 30px; |
|||
color: #fff; |
|||
// background-color: #52A5FF; |
|||
background: linear-gradient(to right, rgba(82, 165, 255, 1), rgba(0, 122, 255, 1)); |
|||
&::before{ |
|||
content: '+10'; |
|||
font-size: 14px; |
|||
font-weight: bold; |
|||
position: absolute; |
|||
top: 4px; |
|||
left: 11px; |
|||
height: 0; |
|||
// letter-spacing: -1px; |
|||
} |
|||
&::after{ |
|||
display: none; |
|||
} |
|||
} |
|||
|
|||
} |
|||
} |
|||
.common-slider-slider{ |
|||
width: 68%; |
|||
position: absolute; |
|||
bottom: 6px; |
|||
height: 16px; |
|||
// background: #e4edff; |
|||
background: linear-gradient(to right, #007AFF, #52A5FF); |
|||
border-radius: 8px; |
|||
.van-slider__button-wrapper{ |
|||
width: 30px; |
|||
height: 30px; |
|||
background-color: #007AFF; |
|||
border-radius: 50%; |
|||
box-shadow: 0 2px 0 rgba(0, 0, 0, 0.1); |
|||
|
|||
.inner-circle{ |
|||
width: 15px; |
|||
height: 15px; |
|||
border-radius: 50%; /* 圆形 */ |
|||
background-color: white; /* 白色背景 */ |
|||
position: absolute; /* 绝对定位 */ |
|||
top: 50%; |
|||
left: 50%; |
|||
transform: translate(-50%, -50%); /* 居中 */ |
|||
} |
|||
} |
|||
.ant-input-number{ |
|||
position: absolute; |
|||
left: 50%; |
|||
right: 50%; |
|||
bottom: 18px; |
|||
transform: translate(-50%, -50%); |
|||
font-size: 24px; |
|||
font-family: OPPOSans, OPPOSans-Bold; |
|||
font-weight: 700; |
|||
height: auto; |
|||
padding: 4px 0; |
|||
text-align: center; |
|||
// background: #7690e5; |
|||
background: linear-gradient(to right, rgba(0, 122, 255, 0.7), rgba(0, 122, 255, 1)); |
|||
border-radius: 6px; |
|||
color: #fff; |
|||
.ant-input-number-input{ |
|||
text-align: center; |
|||
} |
|||
.ant-input-number-handler-wrap{ |
|||
display: none; |
|||
} |
|||
} |
|||
.van-slider__bar{ |
|||
background: linear-gradient(to right, #007AFF, #52A5FF); |
|||
// background: linear-gradient(to right, rgba(0, 122, 255, 0.7), rgba(0, 122, 255, 1)); |
|||
} |
|||
.slider-icon{ |
|||
position: absolute; |
|||
top: -20px; |
|||
left: 2px; |
|||
color: #007AFF; |
|||
font-size: 26px; |
|||
} |
|||
|
|||
} |
|||
} |
|||
.ant-form { |
|||
.ant-form-item-label{ |
|||
text-align: left; |
|||
} |
|||
label{ |
|||
font-size: 26px ; |
|||
font-weight: 500; |
|||
color: #565e6f; |
|||
} |
|||
.ant-form-item{ |
|||
&:not(:last-child) { |
|||
border-bottom: 1px solid #dfe6ec; |
|||
} |
|||
box-sizing: border-box; |
|||
} |
|||
.dose-item{ |
|||
margin-bottom: 40px!important; |
|||
} |
|||
.mb0{ |
|||
margin-bottom: 10px!important; |
|||
} |
|||
.borderNone{ |
|||
border-bottom: none!important; |
|||
} |
|||
.ant-radio-button-wrapper{ |
|||
padding: 0 18px; |
|||
height: 40px; |
|||
line-height: 40px; |
|||
font-size: 18px!important; |
|||
margin-right: 20px; |
|||
margin-bottom: 10px; |
|||
background: #f9f9f9; |
|||
border: 0.5px solid #a3acbf; |
|||
border-radius: 6px; |
|||
vertical-align: middle; |
|||
&:before, .ant-radio-button-wrapper-checked:before{ |
|||
display: none!important; |
|||
} |
|||
&:first-child, &:last-child{ |
|||
border-radius: 6px!important; |
|||
} |
|||
&:last-child{ |
|||
margin-right: 0; |
|||
} |
|||
} |
|||
.ant-form-item-control{ |
|||
text-align: left; |
|||
margin-left: 10px; |
|||
} |
|||
} |
|||
// .solid{ |
|||
// .ant-checkbox-wrapper { |
|||
// background: #f9f9f9; |
|||
// border: 0.5px solid #a3acbf; |
|||
// border-radius: 6px; |
|||
// vertical-align: middle; |
|||
// margin-right: 20px; |
|||
// margin-bottom: 10px; |
|||
// font-size: 18px!important; |
|||
// line-height: 40px; |
|||
// padding: 0 18px; |
|||
// height: 40px; |
|||
// min-width: 0!important; |
|||
// &.ant-checkbox-wrapper-checked{ |
|||
// background: #7690e5; |
|||
// color: #fff; |
|||
// } |
|||
// .ant-checkbox{ |
|||
// display: none; |
|||
// } |
|||
// } |
|||
// } |
|||
.ant-tabs-nav-container{ |
|||
.ant-tabs-tab{ |
|||
// font-size: 20px; |
|||
// font-family: Source Han Sans CN, Source Han Sans CN-Medium; |
|||
// font-weight: 500; |
|||
// text-align: left; |
|||
// color: #70798c; |
|||
} |
|||
.ant-tabs-tab-active{ |
|||
// // font-weight: 700; |
|||
// font-family: Source Han Sans CN, Source Han Sans CN-Bold; |
|||
// color: #393d4e!important; |
|||
} |
|||
.ant-tabs-ink-bar{ |
|||
// background: #7690e5 !important; |
|||
border-bottom: 3px solid transparent; /* 设置透明的底部边框 */ |
|||
border-image: linear-gradient(to right, #fff, #007AFF) 1; /* 使用渐变色填充边框 */ |
|||
border-radius: 10px; /* 设置圆角 */ |
|||
} |
|||
} |
|||
.ant-modal-wrap { |
|||
display: flex; |
|||
justify-content: center; |
|||
align-items: center; |
|||
.ant-modal{ |
|||
top: 0; |
|||
padding-bottom: 0; |
|||
.ant-modal-body { |
|||
padding: 26px 26px 20px !important; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.container-left-header { |
|||
display: flex; |
|||
margin-top: 20px; |
|||
margin-bottom: 20px; |
|||
span { |
|||
width: 12px; |
|||
height: 32px; |
|||
display: inline-block; |
|||
border-radius: 12px; |
|||
background: #8FB3FB; |
|||
margin-right: 16px; |
|||
} |
|||
|
|||
p { |
|||
line-height: 32px; |
|||
font-size: 32px; |
|||
font-weight: 600; |
|||
margin: 0; |
|||
} |
|||
} |
|||
|
|||
//急诊溶栓记录 |
|||
.basic-btn { |
|||
height: 72px; |
|||
background: linear-gradient(180deg, #b1caff, #83aafa); |
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: center; |
|||
border-radius: 36px; |
|||
margin: 60px 20px 0 20px; |
|||
|
|||
.basic-ico { |
|||
margin-right: 10px; |
|||
} |
|||
|
|||
p { |
|||
line-height: 72px; |
|||
font-weight: 600; |
|||
color: #fff; |
|||
font-size: 24px; |
|||
} |
|||
} |
|||
|
|||
.container-left-basic { |
|||
min-height: 80px; |
|||
background: #7690E5; |
|||
border-radius: 12px; |
|||
margin-bottom: 24px; |
|||
color: #70798c; |
|||
// 下一节点 |
|||
.container-basic-node { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
padding: 0 24px; |
|||
|
|||
.basic-p { |
|||
font-size: 24px; |
|||
color: #fff; |
|||
font-weight: 600; |
|||
text-align: left; |
|||
line-height: 62px; |
|||
margin: 0; |
|||
max-width: 74%; |
|||
white-space: nowrap; |
|||
overflow: hidden; |
|||
text-overflow: ellipsis; |
|||
} |
|||
|
|||
// 节点倒计时 |
|||
.basic-node-time { |
|||
display: flex; |
|||
align-items: center; |
|||
|
|||
p { |
|||
margin: 0; |
|||
background: #fff; |
|||
padding: 2px 6px; |
|||
color: #758FE4; |
|||
font-weight: 600; |
|||
font-size: 18px; |
|||
border-radius: 6px; |
|||
|
|||
} |
|||
|
|||
span { |
|||
font-weight: 600; |
|||
font-size: 30px; |
|||
color: #fff; |
|||
margin: 0 8px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.leftbasic-centbox { |
|||
height: 80px; |
|||
background: #fff; |
|||
margin-left: 6px; |
|||
border-radius: 12px; |
|||
display: flex; |
|||
justify-content: space-between; |
|||
padding: 0 16px; |
|||
} |
|||
|
|||
.leftbasic-centbox-title { |
|||
font-size: 24px; |
|||
font-weight: 600; |
|||
line-height: 80px; |
|||
} |
|||
|
|||
.leftbasic-centbox-ico { |
|||
margin-top: 32px; |
|||
} |
|||
&.active{ |
|||
background: #fff; |
|||
.leftbasic-centbox{ |
|||
background: #7690E5; |
|||
color: #fff; |
|||
} |
|||
} |
|||
} |
|||
.container-left-header { |
|||
display: flex; |
|||
span { |
|||
width: 12px; |
|||
height: 32px; |
|||
display: inline-block; |
|||
border-radius: 12px; |
|||
background: #8FB3FB; |
|||
margin-right: 16px; |
|||
} |
|||
|
|||
p { |
|||
line-height: 32px; |
|||
font-size: 32px; |
|||
font-weight: 600; |
|||
margin: 0; |
|||
} |
|||
} |
|||
.basicr-back { |
|||
border-radius: 12px; |
|||
background: #fff; |
|||
padding: 0 28px; |
|||
box-shadow: 0 2px 12px 0 rgba(52, 52, 52, .1); |
|||
} |
|||
.container { |
|||
flex: 1; |
|||
display: flex; |
|||
justify-content: space-between; |
|||
|
|||
.container-left { |
|||
flex: 1; |
|||
padding-left: 20px; |
|||
margin-top: 24px; |
|||
} |
|||
.container-right{ |
|||
flex: 2; |
|||
overflow-y: auto; |
|||
display: flex; |
|||
padding-right: 20px; |
|||
border-left: 1px solid #C9D1DF; |
|||
padding-left: 20px; |
|||
margin-left: 20px; |
|||
margin-top: 24px; |
|||
margin-bottom: 24px; |
|||
} |
|||
} |
|||
.ant-select-dropdown{ |
|||
.ant-select-dropdown-menu-item{ |
|||
font-size: 16px; |
|||
} |
|||
} |
|||
.detail-form { |
|||
.detail-form-control{ |
|||
display: flex; |
|||
align-items: center; |
|||
} |
|||
.ant-form-item { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
padding: 12px 0 !important; |
|||
margin-bottom: 0 !important; |
|||
|
|||
.ant-form-item-label { |
|||
display: flex; |
|||
align-items: center; |
|||
|
|||
label { |
|||
font-size: 24px !important; |
|||
} |
|||
} |
|||
|
|||
.ant-radio-wrapper { |
|||
height: 30px !important; |
|||
font-size: 20px !important; |
|||
} |
|||
} |
|||
.ant-select{ |
|||
min-width: 300px; |
|||
display: flex; |
|||
justify-content: flex-end; |
|||
} |
|||
.ant-select-selection-selected-value{ |
|||
padding-right: 10px; |
|||
} |
|||
.ant-select-selection__rendered{ |
|||
line-height: 40px; |
|||
max-width: 300px; |
|||
} |
|||
.ant-form-item-control-wrapper { |
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: flex-end; |
|||
text-align: right; |
|||
} |
|||
|
|||
} |
|||
.Overviewbasicr { |
|||
flex: 1; |
|||
display: flex; |
|||
flex-direction: column; |
|||
margin-bottom: 20px; |
|||
} |
|||
// 复选框 |
|||
.ant-checkbox-group{ |
|||
display: flex!important; |
|||
flex-wrap: wrap; |
|||
.ant-checkbox-wrapper{ |
|||
min-width: 30%; |
|||
} |
|||
.ant-checkbox-checked{ |
|||
.ant-checkbox-inner{ |
|||
background-color: #7690e5!important; |
|||
border-color: #7690e5!important; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// 详情form-item |
|||
.jmrs-form-item { |
|||
.jmrs-form-item-con { |
|||
|
|||
&.checkbox { |
|||
flex-direction: column; |
|||
.content-right{ |
|||
margin-top: 10px; |
|||
|
|||
} |
|||
} |
|||
.content-right{ |
|||
display: flex; |
|||
align-items: center; |
|||
} |
|||
.operate { |
|||
font-size: 24px; |
|||
color: #000000; |
|||
padding-right: 12px; |
|||
} |
|||
.label-info{ |
|||
color: #000000; |
|||
font-size: 20px; |
|||
} |
|||
} |
|||
} |
|||
// 折叠面板 |
|||
// .collapse-content{ |
|||
// display: flex; |
|||
// justify-content: space-between; |
|||
// padding: 5px 0; |
|||
// } |
|||
// .ant-collapse-arrow, .ant-select-arrow{ |
|||
// font-size: 20px!important; |
|||
// color: #70798C!important; |
|||
// } |
|||
|
|||
// 知情同意 |
|||
.Informed-container { |
|||
// padding: 0 0 30px; |
|||
|
|||
.mt2 { |
|||
margin-top: 20px; |
|||
} |
|||
|
|||
.informed-info { |
|||
font-size: 1.2rem; |
|||
font-weight: bold; |
|||
text-align: left; |
|||
line-height: 36px; |
|||
&.indent { |
|||
text-indent: 2em; |
|||
} |
|||
&.pl{ |
|||
padding-left: 20px; |
|||
} |
|||
|
|||
&.informed-info-sky{ |
|||
color: #007AFF; |
|||
} |
|||
} |
|||
|
|||
.informed-list { |
|||
display: flex; |
|||
// flex-wrap: wrap; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
margin-top: 20px; |
|||
|
|||
.informed-item { |
|||
flex: 1; |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
margin-bottom: 15px; |
|||
margin-right: 10px; |
|||
|
|||
// margin: 0 10px 20px; |
|||
>span { |
|||
font-size: 16px; |
|||
} |
|||
|
|||
.item-input { |
|||
width: 45%; |
|||
} |
|||
|
|||
.item-sign { |
|||
width: 50%; |
|||
} |
|||
|
|||
.item-btn { |
|||
color: #7690e5; |
|||
border: 1px solid #7690e5; |
|||
box-sizing: border-box; |
|||
} |
|||
|
|||
.item-img { |
|||
// width: 120px; |
|||
flex: 1; |
|||
height: 40px; |
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: center; |
|||
box-sizing: border-box; |
|||
margin: 0 5px; |
|||
img { |
|||
width: 100%; |
|||
height: 100%; |
|||
} |
|||
&.item-img-black{ |
|||
background-color: black; |
|||
color: #fff; |
|||
} |
|||
} |
|||
.item-img-non { |
|||
|
|||
} |
|||
} |
|||
.informed-item1{ |
|||
width: 40%; |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
margin-bottom: 15px; |
|||
|
|||
.item-input { |
|||
width: 60%; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
|
@ -0,0 +1,274 @@ |
|||
.white--text{ |
|||
color: #fff; |
|||
} |
|||
|
|||
.text-left { |
|||
text-align: left !important; |
|||
} |
|||
|
|||
// padding |
|||
.pa-3 { |
|||
padding: 12px; |
|||
} |
|||
|
|||
.px-2{ |
|||
padding-left: 8px; |
|||
padding-right: 8px; |
|||
} |
|||
|
|||
.px-3{ |
|||
padding-left: 12px; |
|||
padding-right: 12px; |
|||
} |
|||
|
|||
.px-10{ |
|||
padding-left: 30px; |
|||
padding-right: 30px; |
|||
} |
|||
|
|||
.pb-2 { |
|||
padding-bottom: 8px; |
|||
} |
|||
|
|||
.pb-3 { |
|||
padding-bottom: 12px; |
|||
} |
|||
|
|||
.pb-4 { |
|||
padding-bottom: 16px; |
|||
} |
|||
|
|||
.pb-5 { |
|||
padding-bottom: 20px; |
|||
} |
|||
|
|||
.pb-10 { |
|||
padding-bottom: 40px; |
|||
} |
|||
.pr-1 { |
|||
padding-right: 4px; |
|||
} |
|||
.pr-2 { |
|||
padding-right: 8px; |
|||
} |
|||
.pr-3 { |
|||
padding-right: 12px; |
|||
} |
|||
.pr-4 { |
|||
padding-right: 18px; |
|||
} |
|||
.pr-5 { |
|||
padding-right: 20px; |
|||
} |
|||
|
|||
|
|||
// margin |
|||
.ma-2 { |
|||
margin: 8px; |
|||
} |
|||
|
|||
.ma-3 { |
|||
margin: 12px; |
|||
} |
|||
|
|||
.mx-2{ |
|||
margin-left: 8px; |
|||
margin-right: 8px; |
|||
} |
|||
|
|||
.my-2{ |
|||
margin-top: 8px; |
|||
margin-bottom: 8px; |
|||
} |
|||
|
|||
.my-3{ |
|||
margin-top: 12px; |
|||
margin-bottom: 12px; |
|||
} |
|||
|
|||
.my-4{ |
|||
margin-top: 16px; |
|||
margin-bottom: 16px; |
|||
} |
|||
|
|||
.my-6{ |
|||
margin-top: 24px; |
|||
margin-bottom: 24px; |
|||
} |
|||
|
|||
.mt-1{ |
|||
margin-top: 4px; |
|||
} |
|||
|
|||
.mt-2{ |
|||
margin-top: 8px; |
|||
} |
|||
|
|||
.mt-3{ |
|||
margin-top: 12px; |
|||
} |
|||
|
|||
.mt-4{ |
|||
margin-top: 16px; |
|||
} |
|||
|
|||
.mb-1{ |
|||
margin-bottom: 4px; |
|||
} |
|||
|
|||
.mb-2{ |
|||
margin-bottom: 8px; |
|||
} |
|||
|
|||
.mb-3{ |
|||
margin-bottom: 12px; |
|||
} |
|||
|
|||
.mb-4{ |
|||
margin-bottom: 16px; |
|||
} |
|||
|
|||
.mb-5{ |
|||
margin-bottom: 20px; |
|||
} |
|||
|
|||
.mb-6{ |
|||
margin-bottom: 24px; |
|||
} |
|||
|
|||
.ml-2{ |
|||
margin-left: 8px; |
|||
} |
|||
|
|||
.ml-3{ |
|||
margin-left: 12px; |
|||
} |
|||
|
|||
.ml-4{ |
|||
margin-left: 16px; |
|||
} |
|||
|
|||
.ml-5{ |
|||
margin-left: 20px; |
|||
} |
|||
|
|||
.ml-6{ |
|||
margin-left: 24px; |
|||
} |
|||
|
|||
.ml-7{ |
|||
margin-left: 28px; |
|||
} |
|||
|
|||
.ml-8{ |
|||
margin-left: 32px; |
|||
} |
|||
|
|||
.mr-1{ |
|||
margin-right: 4px; |
|||
} |
|||
|
|||
.mr-2{ |
|||
margin-right: 8px; |
|||
} |
|||
|
|||
.mr-3{ |
|||
margin-right: 12px; |
|||
} |
|||
|
|||
.mr-4{ |
|||
margin-right: 16px; |
|||
} |
|||
|
|||
.mr-5{ |
|||
margin-right: 20px; |
|||
} |
|||
|
|||
.mr-6{ |
|||
margin-right: 24px; |
|||
} |
|||
|
|||
// background |
|||
.white { |
|||
background: white; |
|||
} |
|||
|
|||
// font |
|||
.font-bold-24{ |
|||
font-size: 24px; |
|||
font-weight: bold; |
|||
} |
|||
|
|||
.font-24{ |
|||
font-size: 24px; |
|||
} |
|||
|
|||
.font-bold-16{ |
|||
font-size: 16px; |
|||
font-weight: bold; |
|||
} |
|||
|
|||
.font-16{ |
|||
font-size: 16px; |
|||
} |
|||
|
|||
.font-bold-14{ |
|||
font-size: 14px; |
|||
font-weight: bold; |
|||
} |
|||
|
|||
.font-14{ |
|||
font-size: 14px; |
|||
} |
|||
|
|||
.font-18{ |
|||
font-size: 18px; |
|||
} |
|||
|
|||
|
|||
.icon-size{ |
|||
font-size: 20px; |
|||
} |
|||
|
|||
h2{ |
|||
font-size: 24px; |
|||
font-weight: bold; |
|||
color: rgba(0,0,0,.85) |
|||
} |
|||
|
|||
.textColor{ |
|||
color: rgba(0,0,0,.65) |
|||
} |
|||
|
|||
.baseColor{ |
|||
color: #7690e5 |
|||
} |
|||
|
|||
.bg{ |
|||
background: #F5F5F5 |
|||
} |
|||
|
|||
.ant-btn-primary, .ant-radio-button-wrapper-checked{ |
|||
background-color: #017aff!important; |
|||
border-color: #017aff!important; |
|||
} |
|||
.ant-radio-checked{ |
|||
border-color: #7690e5!important; |
|||
} |
|||
.ant-radio-inner{ |
|||
border-color: #7690e5!important; |
|||
} |
|||
.ant-radio-inner:after{ |
|||
background-color: #7690e5!important; |
|||
} |
|||
.ant-btn-link:hover, .ant-btn-link:focus{ |
|||
color: #7690e5!important; |
|||
} |
|||
|
|||
.fill-width{ |
|||
width:100%; |
|||
} |
|||
|
|||
.fill-height{ |
|||
height:100%; |
|||
} |
@ -0,0 +1,161 @@ |
|||
<!-- |
|||
* @desc: 导航 |
|||
* @Author: gaowenya |
|||
* @Date: 2023-06-21 11:00 |
|||
* @LastEditors: |
|||
* @LastEditTime: |
|||
--> |
|||
<template> |
|||
<header class="header" :class="getPatient === false ? 'mt' : ''"> |
|||
<div class="header-content" v-if="getChangeText.title || getPatient"> |
|||
<div class="header-back" v-if="isBack" @click="toBack"> |
|||
<a-icon type="left" />返回 |
|||
</div> |
|||
<div class="header-title"> |
|||
<span v-if="getChangeText.title"> |
|||
{{ getChangeText.title }} |
|||
</span> |
|||
<p v-else class="caret-top"> |
|||
姓名: |
|||
<span> {{ patientData.patientName || '暂无' }} </span> |
|||
性别: |
|||
<span> |
|||
{{ sex[patientData.patientGender] || '暂无' }} |
|||
</span> |
|||
年龄: |
|||
<span> {{ patientData.patientAge || '暂无' }} </span> |
|||
证件号: |
|||
<span> {{ patientData.jzh || '暂无' }} </span> |
|||
急诊号: |
|||
<span> 暂无 </span> |
|||
</p> |
|||
</div> |
|||
<div class="header-right" v-if="isMore" @click="changeOverviewType"> |
|||
{{ getChangeText.text }}<a-icon type="swap" /> |
|||
</div> |
|||
</div> |
|||
</header> |
|||
</template> |
|||
|
|||
<script> |
|||
import { mapMutations, mapState } from 'vuex'; |
|||
export default { |
|||
data() { |
|||
return { |
|||
sex: { |
|||
0: '男', |
|||
1: '女', |
|||
}, |
|||
overview: { |
|||
title: '', |
|||
text: '', |
|||
}, |
|||
}; |
|||
}, |
|||
computed: { |
|||
...mapState('patient', ['patientData', 'overviewType']), |
|||
...mapState('storm', ['isBack', 'isMore']), |
|||
getChangeText() { |
|||
if (this.overviewType === 'info') { |
|||
return { |
|||
title: '患者信息', |
|||
text: '切换至概览', |
|||
}; |
|||
} else if (this.overviewType === 'overview') { |
|||
return { |
|||
title: '患者概览', |
|||
text: '切换至详情', |
|||
}; |
|||
} |
|||
return { |
|||
title: '', |
|||
text: '', |
|||
}; |
|||
}, |
|||
getPatient() { |
|||
if (!this.patientData) return false; |
|||
const { patientName, patientGender, patientAge, patientIdCardNo } = |
|||
this.patientData; |
|||
console.log(' this.patientData: ', this.patientData); |
|||
let sex = { |
|||
0: '男', |
|||
1: '女', |
|||
}; |
|||
if (!patientName) return false; |
|||
return `姓名: ${patientName} 性别: ${sex[patientGender]} 年龄: ${ |
|||
patientAge || '' |
|||
} 证件号: ${patientIdCardNo} 急诊号: 暂无`; |
|||
}, |
|||
}, |
|||
methods: { |
|||
...mapMutations('patient', ['setOverviewType']), |
|||
toBack() { |
|||
window.history.go(-1); |
|||
}, |
|||
changeOverviewType() { |
|||
if (this.overviewType === 'info') { |
|||
this.overview = { |
|||
title: '患者概览', |
|||
text: '切换至概览', |
|||
}; |
|||
this.setOverviewType('overview'); |
|||
} else if (this.overviewType === 'overview') { |
|||
this.overview = { |
|||
title: '患者信息', |
|||
text: '切换至详情', |
|||
}; |
|||
this.setOverviewType('info'); |
|||
} |
|||
}, |
|||
}, |
|||
}; |
|||
</script> |
|||
|
|||
<style scoped lang="less"> |
|||
.header { |
|||
width: 100%; |
|||
display: flex; |
|||
background: linear-gradient(180deg, #dbeaff, #fbfdff 50%); |
|||
box-shadow: 0px 0.25px 0px 0px rgba(0, 0, 0, 0.2); |
|||
.caret-top { |
|||
margin: 0; |
|||
span { |
|||
color: #70798c; |
|||
margin-right: 5px; |
|||
} |
|||
} |
|||
&.mt { |
|||
margin-top: 10px; |
|||
} |
|||
.header-content { |
|||
flex: 1; |
|||
height: 60px; |
|||
display: flex; |
|||
position: relative; |
|||
align-items: center; |
|||
} |
|||
.header-back { |
|||
position: absolute; |
|||
top: 16px; |
|||
left: 24px; |
|||
font-size: 24px; |
|||
} |
|||
.header-right { |
|||
position: absolute; |
|||
top: 16px; |
|||
right: 24px; |
|||
font-size: 24px; |
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: center; |
|||
} |
|||
|
|||
.header-title { |
|||
flex: 1; |
|||
font-size: 24px; |
|||
font-family: Source Han Sans CN, Source Han Sans CN-Bold; |
|||
font-weight: 700; |
|||
text-align: center; |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,115 @@ |
|||
<template> |
|||
<div class="count">{{ time }}{{ markerList.runTime }}</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import { mapState } from 'vuex'; |
|||
export default { |
|||
data() { |
|||
return { |
|||
markerList: { |
|||
runTotal: '3600', |
|||
runTime: '00:00', |
|||
}, |
|||
minute: 0, |
|||
second: 0, |
|||
requestCount: 0, |
|||
lastTime: 0, |
|||
currentTime: 0, |
|||
}; |
|||
}, |
|||
computed: { |
|||
...mapState('patient', ['patientData', 'timerData']), |
|||
time() { |
|||
const { timerData, patientData } = this; |
|||
if (!timerData && !patientData) return null; |
|||
if (timerData.firstAidId !== patientData.firstAidId) return null; |
|||
const { countdown } = timerData; |
|||
if (countdown === null && !countdown) return null; |
|||
const totalSeconds = countdown; |
|||
// ?️ 获取完整分钟数 |
|||
const minutes = Math.floor(totalSeconds / 60); |
|||
this.minute = minutes; |
|||
// ?️ 获得剩余的秒数 |
|||
const seconds = totalSeconds % 60; |
|||
this.second = seconds; |
|||
// ✅ 格式化为 MM:SS |
|||
const result = `${this.padTo2Digits(minutes)}:${this.padTo2Digits( |
|||
seconds |
|||
)}`; |
|||
this.markerList.runTime = result; |
|||
if (this.markerList.runTotal === countdown) { |
|||
this.utils.AnimationFrame.done('countTask'); |
|||
} else { |
|||
this.utils.AnimationFrame.create( |
|||
'countTask', |
|||
1000, |
|||
true, |
|||
(min) => { |
|||
this.runStart(min); |
|||
} |
|||
); |
|||
} |
|||
}, |
|||
}, |
|||
methods: { |
|||
padTo2Digits(num) { |
|||
return num.toString().padStart(2, '0'); |
|||
}, |
|||
runStart(min) { |
|||
// 改版 防抖 |
|||
// 当前定时器一直在执行,并非隔一秒才执行, 而是每隔一秒1 |
|||
// 通过防抖来限制该函数一秒内只执行一次 |
|||
this.currentTime = new Date().getTime(); |
|||
if (this.currentTime - this.lastTime > 1000) { |
|||
this.lastTime = this.currentTime; |
|||
// //开始计时 |
|||
this.second = this.second + 1; |
|||
if (this.second >= 60) { |
|||
this.second = 0; |
|||
this.minute = this.minute + 1; |
|||
} |
|||
// console.log(this.minute) |
|||
if (this.minute >= 60) { |
|||
this.minute = 60; |
|||
this.second = 0; |
|||
} |
|||
this.markerList.runTime = |
|||
this.Zero(this.minute) + ':' + this.Zero(this.second); |
|||
} |
|||
// 窗口小化定时器校验无法进入, requestCount 的值停留在了窗口小化那一瞬间 |
|||
// if (this.requestCount === n) { |
|||
// console.log('countTask::', n); |
|||
// this.requestCount = n + 1; |
|||
// //开始计时 |
|||
// this.second = this.second + 1; |
|||
// if (this.second >= 60) { |
|||
// this.second = 0; |
|||
// this.minute = this.minute + 1; |
|||
// } |
|||
// // console.log(this.minute) |
|||
// if (this.minute >= 60) { |
|||
// this.minute = 60; |
|||
// this.second = 0; |
|||
// } |
|||
// this.markerList.runTime = |
|||
// this.Zero(this.minute) + ':' + this.Zero(this.second); |
|||
// } |
|||
}, |
|||
//补零 |
|||
Zero(n) { |
|||
return n < 10 ? '0' + n : '' + n; |
|||
}, |
|||
}, |
|||
}; |
|||
</script> |
|||
|
|||
<style lang="less" scoped> |
|||
.count { |
|||
font-size: 44px; |
|||
font-family: Source Han Sans CN, Source Han Sans CN-Bold; |
|||
font-weight: 700; |
|||
color: #393d4e; |
|||
line-height: 44px; |
|||
} |
|||
</style> |
@ -0,0 +1,80 @@ |
|||
<!-- |
|||
* @desc: 拖拽 |
|||
* @Author: gaowenya |
|||
* @Date: 2023-07-06 11:00 |
|||
* @LastEditors: |
|||
* @LastEditTime: |
|||
--> |
|||
<template> |
|||
<div |
|||
@touchstart="onTouchStart" |
|||
@touchmove="onTouchMove" |
|||
@touchend="onTouchEnd" |
|||
ref="floatWindow" |
|||
:style="{ right: right + 'px', top: top + 'px' }" |
|||
class="dragger" |
|||
> |
|||
<slot> </slot> |
|||
</div> |
|||
</template> |
|||
<script> |
|||
import { mapState } from 'vuex'; |
|||
export default { |
|||
props: {}, |
|||
data() { |
|||
return { |
|||
startX: 0, |
|||
startY: 0, |
|||
offsetX: 0, |
|||
offsetY: 0, |
|||
right: 0, |
|||
top: 300, |
|||
isScrolling: false, |
|||
}; |
|||
}, |
|||
computed: {}, |
|||
methods: { |
|||
onTouchStart(e) { |
|||
this.startX = e.touches[0].clientX; |
|||
this.startY = e.touches[0].clientY; |
|||
this.offsetX = this.right; |
|||
this.offsetY = this.top; |
|||
this.isScrolling = false; |
|||
}, |
|||
onTouchMove(e) { |
|||
const x = this.startX - e.touches[0].clientX + this.offsetX; |
|||
const y = e.touches[0].clientY - this.startY + this.offsetY; |
|||
const maxX = window.innerWidth - this.$refs.floatWindow.offsetWidth; |
|||
const maxY = |
|||
window.innerHeight - this.$refs.floatWindow.offsetHeight; |
|||
this.right = x < 0 ? 0 : x > maxX ? maxX : x; |
|||
this.top = y < 0 ? 0 : y > maxY ? maxY : y; |
|||
if ( |
|||
Math.abs(this.startX - e.touches[0].clientX) > 5 || |
|||
Math.abs(e.touches[0].clientY - this.startY) > 5 |
|||
) { |
|||
this.isScrolling = true; |
|||
} |
|||
}, |
|||
onTouchEnd(e) { |
|||
if (!this.isScrolling) { |
|||
if (e.changedTouches[0].clientX > window.innerWidth / 2) { |
|||
this.right = 0; |
|||
} else { |
|||
this.right = |
|||
window.innerWidth - this.$refs.floatWindow.offsetWidth; |
|||
} |
|||
} |
|||
}, |
|||
}, |
|||
}; |
|||
</script> |
|||
<style scoped lang="less"> |
|||
.dragger { |
|||
position: fixed; |
|||
right: 0; |
|||
top: 0; |
|||
transform: translate3d(0, 0, 0); |
|||
transition: right 0.3s ease-out; |
|||
} |
|||
</style> |
@ -0,0 +1,546 @@ |
|||
<template> |
|||
<div class="myKeyboard" @click.stop="handleFocus" @blur="handleBlur" tabindex="0"> |
|||
<div class="input-container"> |
|||
<div class="input-top"> |
|||
<div class="input-label" :style="labelStyle" :class="labelClass"> |
|||
{{ inputLabel }} |
|||
</div> |
|||
<div class="inputText" id="inputText" :style="inputStyle" :class="inputClass"> |
|||
<span class="cursor"> |
|||
<span class="holder showWhite">|</span> |
|||
</span> |
|||
<span class="place-holder">{{ placeHolder }}</span> |
|||
<span class="right-space" :style="{ color: zcolor }" @click="moveCursor"> </span> |
|||
<span class="right-btn"> |
|||
<a-icon class="clear" v-if="clearShow" type="close-circle" @click="handleClear" /> |
|||
<slot></slot> |
|||
</span> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="error" :style="errorStyle" v-if="errorShow"> |
|||
{{ errorMessage }} |
|||
</div> |
|||
<div class="errorSpace" v-else></div> |
|||
</div> |
|||
<div class="number hidden" :class="numberClass" :style="numberStyle"> |
|||
<div class="mybtn" @click.stop="handleBlur"> |
|||
<a-icon type="down" /> |
|||
</div> |
|||
<div class="mynum"> |
|||
<div class="num" @click="handleNum('1')">1</div> |
|||
<div class="num" @click="handleNum('2')">2</div> |
|||
<div class="num" @click="handleNum('3')">3</div> |
|||
<div class="num" @click="handleNum('4')">4</div> |
|||
<div class="num" @click="handleNum('5')">5</div> |
|||
<div class="num" @click="handleNum('6')">6</div> |
|||
<div class="num" @click="handleNum('7')">7</div> |
|||
<div class="num" @click="handleNum('8')">8</div> |
|||
<div class="num" @click="handleNum('9')">9</div> |
|||
<div class="num" @click="handleNum('0')">0</div> |
|||
<div v-if="keyboard == 'card'" class="num" @click="handleNum('X')"> |
|||
X |
|||
</div> |
|||
<div v-if="keyboard == 'tel'" class="num" @click="handleNum('0')"> |
|||
0 |
|||
</div> |
|||
<div class="num" @click.stop="handleDelete" @touchstart="gtouchstart" @touchend="gtouchend" |
|||
@touchmove="gtouchmove"> |
|||
<a-icon type="close-circle" /> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
props: { |
|||
// inputS: { |
|||
// type: String, |
|||
// default: '', |
|||
// }, |
|||
// inputH: { |
|||
// type: String, |
|||
// default: '2.5rem', |
|||
// }, |
|||
// inputB: { |
|||
// type: String, |
|||
// default: 'none', |
|||
// }, |
|||
// inputW: { |
|||
// type: String, |
|||
// default: '', |
|||
// }, |
|||
// inputBgc: { |
|||
// type: String, |
|||
// default: '#fff', |
|||
// }, |
|||
// labelS: { |
|||
// type: String, |
|||
// default: '', |
|||
// }, |
|||
// labelC: { |
|||
// type: String, |
|||
// default: '', |
|||
// }, |
|||
// labelW: { |
|||
// type: String, |
|||
// default: '', |
|||
// }, |
|||
// 输入框索引(必填字段) |
|||
indexNum: { |
|||
type: Number, |
|||
default: 0, |
|||
}, |
|||
// 是否聚焦(true:不聚焦,false:聚焦) |
|||
numberDis: { |
|||
type: Boolean, |
|||
default: false, |
|||
}, |
|||
// 是否必填(true:出现红星,false:不出现) |
|||
required: { |
|||
type: Boolean, |
|||
default: false, |
|||
}, |
|||
// 键盘类型(card:身份证,tel:数字) |
|||
keyboard: { |
|||
type: String, |
|||
default: 'card', |
|||
}, |
|||
// 父组件存的值 |
|||
oldValue: { |
|||
type: String, |
|||
default: '', |
|||
}, |
|||
// 占位符颜色(建议设置和输入框背景同色) |
|||
zcolor: { |
|||
type: String, |
|||
default: 'transparent', |
|||
}, |
|||
// label文字 |
|||
inputLabel: { |
|||
type: String, |
|||
default: '', |
|||
}, |
|||
// 当输入框内无文字时显示 |
|||
placeHolder: { |
|||
type: String, |
|||
default: '请输入', |
|||
}, |
|||
// 错误提示信息 |
|||
errorMessage: { |
|||
type: String, |
|||
default: '请输入正确的信息', |
|||
}, |
|||
// 是否显示错误提示信息 |
|||
errorShow: { |
|||
type: Boolean, |
|||
default: false, |
|||
}, |
|||
// 错误提示信息样式 |
|||
errorStyle: { |
|||
type: Object, |
|||
default: function() { |
|||
return {} |
|||
}, |
|||
}, |
|||
// 是否显示清除键 |
|||
clearShow: { |
|||
type: Boolean, |
|||
default: false, |
|||
}, |
|||
// label动态类名 |
|||
labelClass: { |
|||
type: String, |
|||
default: '', |
|||
}, |
|||
// label样式 |
|||
labelStyle: { |
|||
type: Object, |
|||
default: function() { |
|||
return {} |
|||
}, |
|||
}, |
|||
// input动态类名 |
|||
inputClass: { |
|||
type: String, |
|||
default: '', |
|||
}, |
|||
// input样式 |
|||
inputStyle: { |
|||
type: Object, |
|||
default: function() { |
|||
return {} |
|||
}, |
|||
}, |
|||
// number类名 |
|||
numberClass: { |
|||
type: String, |
|||
default: '', |
|||
}, |
|||
// number样式 |
|||
numberStyle: { |
|||
type: Object, |
|||
default: function() { |
|||
return {} |
|||
}, |
|||
}, |
|||
}, |
|||
data() { |
|||
return { |
|||
inputArea: '', |
|||
stop: false, |
|||
clickNum: false, |
|||
show: false, |
|||
value: '', |
|||
inputValue: '', |
|||
} |
|||
}, |
|||
watch: { |
|||
oldValue(val) { |
|||
if (val != this.inputValue) { |
|||
this.handleClear() |
|||
this.handleOld() |
|||
} |
|||
}, |
|||
required(val) { |
|||
this.handleRequired(val) |
|||
}, |
|||
}, |
|||
created() { |
|||
this.$toast.clear() |
|||
}, |
|||
mounted() { |
|||
this.handleRequired(this.required) |
|||
this.handleOld() |
|||
}, |
|||
methods: { |
|||
// 是否必填 |
|||
handleRequired(val) { |
|||
const inputLabel = |
|||
document.getElementsByClassName('input-label')[this.indexNum] |
|||
if (val) { |
|||
inputLabel.className = 'input-label required' |
|||
} else { |
|||
inputLabel.className = 'input-label' |
|||
} |
|||
}, |
|||
// 父组件改变值 |
|||
handleOld() { |
|||
// 获取父组件存的值后画数字 |
|||
if (this.oldValue != '') { |
|||
for (const item of this.oldValue) { |
|||
const span = document.createElement('span') //创建包含值的元素 |
|||
span.className = 'val' |
|||
span.innerText = item |
|||
const space = document.createElement('span') |
|||
space.className = 'space' |
|||
space.innerText = '' |
|||
span.addEventListener('click', this.moveCursor) |
|||
const cursor = |
|||
document.getElementsByClassName('cursor')[this.indexNum] |
|||
const inputArea = |
|||
document.getElementsByClassName('inputText')[this.indexNum] |
|||
inputArea.insertBefore(space, cursor) //插入空列 |
|||
inputArea.insertBefore(span, cursor) //插入值 |
|||
} |
|||
} |
|||
const placeHolder = |
|||
document.getElementsByClassName('place-holder')[this.indexNum] |
|||
|
|||
if (this.oldValue == '') { |
|||
placeHolder.className = 'place-holder' |
|||
} else { |
|||
placeHolder.className = 'place-holder hidden' |
|||
} |
|||
this.inputValue = this.oldValue |
|||
this.$emit('keyboard-input', this.inputValue) |
|||
}, |
|||
// 聚焦 |
|||
handleFocus(event) { |
|||
if (!this.numberDis) { |
|||
this.$emit('indexNum', this.indexNum) |
|||
const number = document.getElementsByClassName('number')[this.indexNum] |
|||
number.className = 'number' |
|||
this.setCursorFlash() |
|||
this.handleValue() |
|||
} |
|||
}, |
|||
//字符插入,在光标前插入字符 |
|||
handleNum(value) { |
|||
const number = document.getElementsByClassName('number')[this.indexNum] |
|||
number.className = 'number' |
|||
const span = document.createElement('span') //创建包含值的元素 |
|||
span.className = 'val' |
|||
span.innerText = value |
|||
|
|||
const space = document.createElement('span') |
|||
space.className = 'space' |
|||
space.innerText = '' |
|||
span.addEventListener('click', this.moveCursor) |
|||
const cursor = document.getElementsByClassName('cursor')[this.indexNum] |
|||
const inputArea = |
|||
document.getElementsByClassName('inputText')[this.indexNum] |
|||
inputArea.insertBefore(space, cursor) //插入空列 |
|||
inputArea.insertBefore(span, cursor) //插入值 |
|||
this.handleValue() |
|||
}, |
|||
// 失焦 |
|||
handleBlur(e) { |
|||
clearInterval(this.intervalId) |
|||
const placeHolder = |
|||
document.getElementsByClassName('holder')[this.indexNum] |
|||
placeHolder.className = 'holder showWhite' |
|||
const number = document.getElementsByClassName('number')[this.indexNum] |
|||
number.className = 'number hidden' |
|||
const inputText = |
|||
document.getElementsByClassName('inputText')[this.indexNum] |
|||
inputText.className = 'inputText' |
|||
this.handleValue() |
|||
const inputArea = |
|||
document.getElementsByClassName('inputText')[this.indexNum] |
|||
const reset = |
|||
document.getElementsByClassName('place-holder')[this.indexNum] |
|||
const cursor = document.getElementsByClassName('cursor')[this.indexNum] //获取光标 |
|||
const ele = inputArea.replaceChild(reset.previousSibling, cursor) |
|||
inputArea.insertBefore(ele, reset) |
|||
}, |
|||
// 移动光标位置 |
|||
moveCursor(event) { |
|||
const inputArea = |
|||
document.getElementsByClassName('inputText')[this.indexNum] |
|||
const cursor = document.getElementsByClassName('cursor')[this.indexNum] //获取光标 |
|||
if (event.currentTarget.className == 'right-space') { |
|||
const ele = inputArea.replaceChild( |
|||
event.currentTarget.previousSibling.previousSibling, |
|||
cursor, |
|||
) |
|||
inputArea.insertBefore(ele, event.currentTarget.previousSibling) |
|||
} else { |
|||
const tempEle = event.currentTarget |
|||
const nodeName = event.currentTarget.nextSibling.nodeName |
|||
const temp = event.currentTarget.previousSibling |
|||
const ele = inputArea.replaceChild(temp, cursor) //把光标替换成当前元素 |
|||
inputArea.insertBefore(ele, event.currentTarget) |
|||
} |
|||
}, |
|||
// 删除 |
|||
handleDelete() { |
|||
const inputArea = |
|||
document.getElementsByClassName('inputText')[this.indexNum] |
|||
// this.setCursorFlash() |
|||
const cursor = document.getElementsByClassName('cursor')[this.indexNum] |
|||
let n = 2 //两个删除动作 |
|||
while (cursor.previousSibling && n > 0) { |
|||
inputArea.removeChild(cursor.previousSibling) |
|||
n-- |
|||
} |
|||
this.handleValue() |
|||
}, |
|||
//开始按 |
|||
gtouchstart(e) { |
|||
this.timeOutEvent = setTimeout(() => { |
|||
this.longPress() |
|||
}, 500) |
|||
return false |
|||
}, |
|||
gtouchend() { |
|||
clearTimeout(this.timeOutEvent) |
|||
clearInterval(this.press) |
|||
if (this.timeOutEvent != 0) { |
|||
// alert('你这是点击,不是长按') |
|||
} |
|||
return false |
|||
}, |
|||
gtouchmove() { |
|||
clearTimeout(this.timeOutEvent) |
|||
clearInterval(this.press) |
|||
this.timeOutEvent = 0 |
|||
}, |
|||
longPress() { |
|||
this.timeOutEvent = 0 |
|||
this.press = setInterval(() => { |
|||
this.handleDelete() |
|||
}, 300) |
|||
}, |
|||
//设置光标定时任务 |
|||
setCursorFlash() { |
|||
const placeHolder = |
|||
document.getElementsByClassName('holder')[this.indexNum] |
|||
let isShowCursor = false |
|||
if (this.intervalId) { |
|||
clearInterval(this.intervalId) |
|||
} |
|||
this.intervalId = setInterval(function() { |
|||
isShowCursor = !isShowCursor |
|||
if (isShowCursor) { |
|||
placeHolder.className = 'holder' |
|||
} else { |
|||
placeHolder.className = 'holder showWhite' |
|||
} |
|||
}, 500) |
|||
}, |
|||
// 全清 |
|||
handleClear() { |
|||
const father = document.getElementsByClassName('inputText')[this.indexNum] |
|||
const child = |
|||
document.getElementsByClassName('inputText')[this.indexNum].childNodes |
|||
for (let i = child.length - 1; i >= 0; i--) { |
|||
if (child[i].className == 'val' || child[i].className == 'space') { |
|||
father.removeChild(child[i]) |
|||
} |
|||
} |
|||
}, |
|||
// 获取值 |
|||
handleValue() { |
|||
const val = document |
|||
.getElementsByClassName('inputText')[this.indexNum].querySelectorAll('.val') |
|||
const arr = [] |
|||
arr[this.indexNum] = [] |
|||
for (let i = 0; i < val.length; i++) { |
|||
arr[this.indexNum].push(val[i].innerHTML) |
|||
} |
|||
this.inputValue = arr[this.indexNum].toString() |
|||
this.inputValue = this.inputValue.split(',').join('') |
|||
this.$emit('keyboard-input', this.inputValue) |
|||
const placeHolder = |
|||
document.getElementsByClassName('place-holder')[this.indexNum] |
|||
|
|||
if (this.inputValue == '') { |
|||
placeHolder.className = 'place-holder' |
|||
} else { |
|||
placeHolder.className = 'place-holder hidden' |
|||
} |
|||
}, |
|||
}, |
|||
} |
|||
</script> |
|||
|
|||
<style scoped lang="less"> |
|||
.myKeyboard{ |
|||
padding-top: 0.15vw; |
|||
} |
|||
.myKeyboard:focus { |
|||
outline: none; |
|||
} |
|||
|
|||
.input-container { |
|||
display: flex; |
|||
// align-items: center; |
|||
flex-direction: column; |
|||
box-sizing: border-box; |
|||
width: 100%; |
|||
font-size: 1rem; |
|||
border: 1px solid #d9d9d9; |
|||
background: #f9f9f9; |
|||
padding-left: 12px; |
|||
border-radius: .3rem; |
|||
box-sizing: border-box; |
|||
.acitve { |
|||
border: 1px solid #2e8fff !important; |
|||
} |
|||
|
|||
.input-top { |
|||
display: flex; |
|||
align-items: center; |
|||
box-sizing: border-box; |
|||
width: 100%; |
|||
} |
|||
|
|||
.error { |
|||
color: #ee0a24; |
|||
font-size: 18px; |
|||
} |
|||
|
|||
.errorSpace {} |
|||
|
|||
.required::before { |
|||
position: absolute; |
|||
left: 6px; |
|||
color: #ee0a24; |
|||
content: '*'; |
|||
font-size: 22px; |
|||
} |
|||
|
|||
.inputText { |
|||
position: relative; |
|||
flex: 1; |
|||
width: 80%; |
|||
border: none; |
|||
height: 2.91vw; |
|||
} |
|||
|
|||
.right-btn { |
|||
position: absolute; |
|||
right: 2%; |
|||
|
|||
.clear { |
|||
width: 1.5rem; |
|||
} |
|||
|
|||
// :nth-child(1) { |
|||
// width: 1.5rem; |
|||
// } |
|||
:nth-child(2) {} |
|||
} |
|||
|
|||
.right-space { |
|||
// color: #fff; |
|||
} |
|||
|
|||
.place-holder { |
|||
color: #c8c8c8; |
|||
} |
|||
} |
|||
|
|||
.number { |
|||
position: fixed; |
|||
left: 0; |
|||
right: 0; |
|||
bottom: 0; |
|||
z-index: 999999; |
|||
width: 100%; |
|||
background-color: #f0f0f0; |
|||
font-size: 24px; |
|||
|
|||
.mybtn { |
|||
padding: 5px 0; |
|||
text-align: center; |
|||
line-height: 24px; |
|||
|
|||
img { |
|||
height: 100%; |
|||
} |
|||
} |
|||
|
|||
.mynum { |
|||
display: flex; |
|||
flex-wrap: wrap; |
|||
padding-bottom: 10px; |
|||
.num { |
|||
display: flex; |
|||
align-items: center; |
|||
flex: 1 0 25%; |
|||
justify-content: center; |
|||
padding: 5px 0; |
|||
border-top: 1px solid #eee; |
|||
border-left: 1px solid #eee; |
|||
background-color: #fff; |
|||
text-align: center; |
|||
|
|||
&:active { |
|||
background-color: rgb(202, 202, 202); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.hidden { |
|||
display: none; |
|||
} |
|||
|
|||
.showWhite { |
|||
color: transparent; |
|||
} |
|||
</style> |
@ -0,0 +1,4 @@ |
|||
@font-face { |
|||
font-family: SONG; |
|||
src: url(./仿宋字体.ttf); |
|||
} |
@ -0,0 +1,104 @@ |
|||
<template> |
|||
<div class="canvaspanel-conntainer"> |
|||
<div class="canvaspanel"> |
|||
<div class="canvasborder"> |
|||
<vue-esign |
|||
ref="esign" |
|||
:width="width" |
|||
:height="300" |
|||
:isCrop="isCrop" |
|||
:lineWidth="lineWidth" |
|||
:lineColor="lineColor" |
|||
:bgColor.sync="bgColor" |
|||
style="width: 100% !important" |
|||
/> |
|||
</div> |
|||
<div class="buttongroup"> |
|||
<a-button type="gray" size="large" @click="handleReset" icon="delete"> 清除 </a-button> |
|||
<a-button type="link" size="large" @click="handleGenerate" icon="check-circle"> 保存 </a-button> |
|||
</div> |
|||
</div> |
|||
<img :src="resultImg" alt="" v-show="false" /> |
|||
</div> |
|||
</template> |
|||
<script> |
|||
export default { |
|||
name: 'esign', |
|||
components: {}, |
|||
data() { |
|||
return { |
|||
title: '手写签名', |
|||
width: 0, |
|||
lineWidth: 10, |
|||
lineColor: '#000000', |
|||
bgColor: '', |
|||
resultImg: '', |
|||
isCrop: false, |
|||
}; |
|||
}, |
|||
created() { |
|||
this.width = window.innerWidth - 16*2 - 16*2; |
|||
}, |
|||
methods: { |
|||
handleReset() { |
|||
this.$refs['esign'].reset(); //清空画布 |
|||
this.$emit('reset'); |
|||
}, |
|||
handleGenerate() { |
|||
this.$refs['esign'] |
|||
.generate() |
|||
.then(res => { |
|||
this.resultImg = res; // 得到了签字生成的base64图片 |
|||
this.base64ImgtoFile(this.resultImg); |
|||
let data = this.base64ImgtoFile(this.resultImg); |
|||
//调用接口 |
|||
this.$emit('close', data); |
|||
}) |
|||
.catch(err => { |
|||
this.$message.error('请签名后再保存'); |
|||
}); |
|||
}, |
|||
// 将base64,转换成图片 |
|||
base64ImgtoFile(dataurl, filename = 'file') { |
|||
const arr = dataurl.split(','); |
|||
const mime = arr[0].match(/:(.*?);/)[1]; |
|||
const suffix = mime.split('/')[1]; |
|||
const bstr = atob(arr[1]); |
|||
let n = bstr.length; |
|||
const u8arr = new Uint8Array(n); |
|||
while (n--) { |
|||
u8arr[n] = bstr.charCodeAt(n); |
|||
} |
|||
return new File([u8arr], `${filename}.${suffix}`, { |
|||
type: mime, |
|||
}); |
|||
}, |
|||
}, |
|||
}; |
|||
</script> |
|||
<style lang="less" scope> |
|||
.canvasborder { |
|||
background: #efefef; |
|||
border-radius: 8px; |
|||
width: 100%; |
|||
|
|||
} |
|||
.canvaspanel { |
|||
display: flex; |
|||
position: relative; |
|||
margin: 16px 0; |
|||
} |
|||
|
|||
.buttongroup { |
|||
position: absolute; |
|||
right: 16px; |
|||
bottom: 16px; |
|||
} |
|||
|
|||
.autograph { |
|||
margin-left: 20px; |
|||
} |
|||
.clos { |
|||
width: 88px; |
|||
} |
|||
</style> |
@ -0,0 +1,144 @@ |
|||
'use strict'; |
|||
|
|||
import Vue from 'vue'; |
|||
import axios from 'axios'; |
|||
import router from '../router/index'; |
|||
import store from '../store/index'; |
|||
import { message } from 'ant-design-vue'; |
|||
let { proxyUrl } = require('@/config/setting'); |
|||
let config = { |
|||
timeout: 10000, // Timeout
|
|||
}; |
|||
|
|||
const _axios = axios.create(config); |
|||
axios.interceptors.request.use( |
|||
(config) => { |
|||
if ( |
|||
config.url !== `${proxyUrl}/message/query` && |
|||
config.url !== `${proxyUrl}/firstAid/next` |
|||
) { |
|||
store.commit('storm/setSpinning', true); |
|||
} |
|||
config.timeout = 30000; |
|||
config.reTry = config.reTry || 0; |
|||
let token = localStorage.getItem('anyringToken'); |
|||
if (token && token !== 'null') { |
|||
config.headers.Authorization = `Bearer ${token}`; |
|||
} |
|||
return config; |
|||
}, |
|||
(error) => { |
|||
// Do something with request error
|
|||
store.commit('storm/setSpinning', false); |
|||
return Promise.reject(error); |
|||
} |
|||
); |
|||
|
|||
// Add a response interceptor
|
|||
axios.interceptors.response.use( |
|||
async (res) => { |
|||
store.commit('storm/setSpinning', false); |
|||
const { code, msg, data } = res.data; |
|||
if (code === 200) { |
|||
return res.data; |
|||
} else if (code === 401) { |
|||
localStorage.setItem('anyringToken', null); |
|||
let [err, data] = await store.dispatch('storm/toLogin', { |
|||
padNo: store.state.storm.padNo, |
|||
}); |
|||
let token = data.access_token; |
|||
const config = res.config; |
|||
let reTry = config.reTry + 1; |
|||
let cfg = Object.assign({}, config); |
|||
cfg.reTry = reTry; |
|||
cfg.headers['Authorization'] = `Bearer ${token}`; |
|||
// console.log('token222: ', token);
|
|||
let resNew; |
|||
if (reTry < 3 && token) { |
|||
resNew = await axios(cfg); |
|||
} |
|||
return Promise.resolve(resNew || res.data); |
|||
} else { |
|||
message.error(msg || '请求发生错误'); |
|||
return Promise.resolve(res.data); |
|||
} |
|||
}, |
|||
(error) => { |
|||
//异常关闭loading
|
|||
store.commit('storm/setSpinning', false); |
|||
// Do something with response error
|
|||
if (error && error.response) { |
|||
switch (error.response.status) { |
|||
case 400: |
|||
error.message = '请求错误'; |
|||
break; |
|||
case 401: |
|||
error.message = ''; |
|||
// executeSkip();
|
|||
break; |
|||
case 403: |
|||
error.message = '拒绝访问'; |
|||
break; |
|||
case 404: |
|||
error.message = '请求出错'; |
|||
break; |
|||
case 408: |
|||
error.message = '请求超时'; |
|||
break; |
|||
case 500: |
|||
error.message = '请求错误,请稍后重试'; |
|||
//设置响应后加载状态
|
|||
break; |
|||
case 501: |
|||
error.message = '服务未实现'; |
|||
break; |
|||
case 502: |
|||
error.message = '网络错误'; |
|||
break; |
|||
case 503: |
|||
error.message = '服务不可用'; |
|||
break; |
|||
case 504: |
|||
error.message = '网络超时'; |
|||
break; |
|||
case 505: |
|||
error.message = 'HTTP版本不受支持'; |
|||
break; |
|||
default: |
|||
error.message = '连接出错'; |
|||
} |
|||
} else { |
|||
error.message = '网络异常,请稍后重试'; |
|||
} |
|||
if (error.message) { |
|||
message.error(error.message); |
|||
} |
|||
return Promise.reject(error); |
|||
} |
|||
); |
|||
|
|||
Plugin.install = function (Vue) { |
|||
Vue.axios = _axios; |
|||
window.axios = _axios; |
|||
Object.defineProperties(Vue.prototype, { |
|||
axios: { |
|||
get() { |
|||
return _axios; |
|||
}, |
|||
}, |
|||
$axios: { |
|||
get() { |
|||
return _axios; |
|||
}, |
|||
}, |
|||
$http: { |
|||
get() { |
|||
return _axios; |
|||
}, |
|||
}, |
|||
}); |
|||
}; |
|||
|
|||
Vue.use(Plugin); |
|||
|
|||
export default Plugin; |
@ -0,0 +1,7 @@ |
|||
// 疑似诊断
|
|||
export const FIRSTAIDZLTYPE_DICT = { |
|||
0: 'AS急性脑卒中', |
|||
1: 'AMI急性心肌梗死', |
|||
2: 'ATI急性创伤', |
|||
3: 'AGB急性消化道出血' |
|||
} |
@ -0,0 +1,61 @@ |
|||
import store from '../store/index'; |
|||
import { getRouters, saveAidRecord, queryAidRecord, queryWeight } from 'api'; |
|||
import router from '../router'; |
|||
import { message } from 'ant-design-vue'; |
|||
|
|||
async function updateAidCode(param, type) { |
|||
const { firstAidId } = store.state.patient.patientData; |
|||
if (!firstAidId) { |
|||
message.error('缺少急救'); |
|||
return; |
|||
} |
|||
param['firstAidId'] = firstAidId; |
|||
let res = await saveAidRecord(param); |
|||
const { code, data, msg } = res; |
|||
if (code === 200) { |
|||
// message.success('更新成功')
|
|||
queryAid(firstAidId, type); |
|||
} else { |
|||
message.error(msg); |
|||
} |
|||
} |
|||
|
|||
async function queryWei(firstAidId) { |
|||
if (!firstAidId) { |
|||
message.error('缺少急救'); |
|||
return; |
|||
} |
|||
const res = await queryWeight(firstAidId); |
|||
} |
|||
async function queryAid(firstAidId, type = true) { |
|||
if (!firstAidId) { |
|||
message.error('缺少急救'); |
|||
return; |
|||
} |
|||
const res = await queryAidRecord(firstAidId); |
|||
const { data } = res; |
|||
if (!data) return; |
|||
// console.log('data: ', data);
|
|||
store.commit('patient/setPatientData', data); |
|||
const writeAble = data.writeAble; |
|||
store.commit('patient/setWriteAble', writeAble === false); |
|||
if (type) router.go(-1); |
|||
} |
|||
|
|||
// 获取菜单
|
|||
async function getRouter(id) { |
|||
const res = await getRouters(); |
|||
const { code, msg, data } = res; |
|||
if (code === 200) { |
|||
store.commit('storm/setRoute', data); |
|||
} else { |
|||
message.error(msg); |
|||
} |
|||
} |
|||
|
|||
export default { |
|||
getRouter, |
|||
updateAidCode, |
|||
queryAid, |
|||
queryWei, |
|||
}; |
@ -0,0 +1,50 @@ |
|||
const env = process.env.NODE_ENV; |
|||
|
|||
// 首页标题 描述信息的配置
|
|||
const INDEX_SETTINGS = { |
|||
title: '暴风眼', |
|||
description: '暴风眼', |
|||
// production: {
|
|||
// //山大一生产
|
|||
// apiUrl: 'http://116.204.114.73:10050/carbasics2024-gateway/',
|
|||
// proxyUrl: '/carbasics2024-gateway/',
|
|||
// publicPath: '/carbasics2024/pad/v2',
|
|||
// imgUrl: 'http://116.204.114.73:9300',
|
|||
// },
|
|||
production: { |
|||
//因孚生产
|
|||
apiUrl: 'http://116.204.114.73:10050/carbasics2024-yf-gateway/', |
|||
proxyUrl: '/carbasics2024-yf-gateway/', |
|||
publicPath: '/carbasics2024-yf/pad/v2', |
|||
imgUrl: 'http://116.204.114.73:20007', |
|||
}, |
|||
test: { |
|||
//测试环境
|
|||
apiUrl: 'https://test.tall.wiki/carbasics2024-gateway/', |
|||
proxyUrl: '/carbasics2024-gateway/', |
|||
publicPath: '/carbasics2024/pad/v2', |
|||
imgUrl: 'http://test.tall.wiki:9300', |
|||
}, |
|||
development: { |
|||
//开发环境
|
|||
apiUrl: 'http://116.204.114.73:10050/carbasics2024-yf-gateway/', // apiUrl: 'http://192.168.0.6:9002',
|
|||
proxyUrl: '', |
|||
publicPath: '', |
|||
imgUrl: 'http://116.204.114.73:20007', |
|||
}, |
|||
}; |
|||
|
|||
module.exports = { |
|||
// 首页标题
|
|||
title: INDEX_SETTINGS.title, // 首页描述信息
|
|||
|
|||
description: INDEX_SETTINGS.description, // api基础地址
|
|||
|
|||
apiUrl: INDEX_SETTINGS[env].apiUrl, // api代理地址
|
|||
|
|||
proxyUrl: INDEX_SETTINGS[env].proxyUrl, // 生成文件目录 publicPath
|
|||
|
|||
publicPath: INDEX_SETTINGS[env].publicPath, |
|||
|
|||
imgUrl: INDEX_SETTINGS[env].imgUrl, |
|||
}; |
@ -0,0 +1,215 @@ |
|||
.global-layout{ |
|||
.page-layout{ |
|||
background-color: #f6f6f6; |
|||
width: 100vw; |
|||
height: 100vh; |
|||
.ant-layout-sider{ |
|||
flex: 0 0 120px !important; |
|||
max-width: 120px !important; |
|||
min-width: 120px !important; |
|||
width: 120px !important; |
|||
background-color: #fff; |
|||
.layout-sider-header-row{ |
|||
display: flex; |
|||
padding: .3rem 1rem; |
|||
height: 5vw; |
|||
line-height: 5vw; |
|||
box-sizing: border-box; |
|||
overflow: hidden; |
|||
justify-content: center; |
|||
.layout-sider-header-row-icon{ |
|||
display: flex; |
|||
align-items: center; |
|||
.sider-header-icon{ |
|||
display: inline-block; |
|||
text-align: center; |
|||
width: 1.8rem; |
|||
height: 1.8rem; |
|||
line-height: 1.8rem; |
|||
background-color: #659aff; |
|||
border-radius: 50px; |
|||
overflow: hidden; |
|||
color: #FFFFFF; |
|||
font-size: 1rem; |
|||
} |
|||
|
|||
} |
|||
.layout-sider-header-row-title{ |
|||
flex: 1; |
|||
font-size: .6rem; |
|||
margin-left: 0.2rem; |
|||
} |
|||
|
|||
} |
|||
.layout-sider-menu{ |
|||
padding: 10px; |
|||
user-select: none; /* 禁止文本选择 */ |
|||
-webkit-user-select: none; /* Safari */ |
|||
-moz-user-select: none; /* Firefox */ |
|||
-ms-user-select: none; /* IE */ |
|||
.menus{ |
|||
.menu-item{ |
|||
border-radius: .5rem; |
|||
color: #8a8c8e; |
|||
overflow: hidden; |
|||
display: flex; |
|||
justify-content: flex-start; |
|||
align-items: center; |
|||
padding: .4rem .6rem; |
|||
margin-bottom: .5rem; |
|||
cursor: pointer; |
|||
&.active{ |
|||
color: #0576fe; |
|||
box-shadow: 0 1px 6px rgba(238, 238, 238, 1); |
|||
} |
|||
.menu-item-icon{ |
|||
img{ |
|||
width: 1.6rem; |
|||
height: 1.6rem; |
|||
} |
|||
} |
|||
.menu-item-name{ |
|||
flex: 1; |
|||
text-align: left; |
|||
margin-left: .5rem; |
|||
text-align: center; |
|||
} |
|||
} |
|||
|
|||
} |
|||
|
|||
} |
|||
|
|||
} |
|||
.ant-layout-header{ |
|||
padding: 0 !important; |
|||
height: 5vw !important; |
|||
line-height: 5vw !important; |
|||
background-color: #FFFFFF !important; |
|||
.patient-box{ |
|||
display: flex; |
|||
justify-content: center; |
|||
.patient-info { |
|||
// background-color: #fff; |
|||
// border-radius: 5px; |
|||
// padding: 12px; |
|||
font-size: 1rem; |
|||
|
|||
.lable { |
|||
color: #AAAAAA; |
|||
padding: 0 .5rem 0 1rem; |
|||
|
|||
} |
|||
|
|||
.text { |
|||
color: #000000; |
|||
padding: 0 2rem 0 0; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.layout-sider-header-row-title{ |
|||
background-color: #fff; |
|||
height: 5vw; |
|||
line-height: 5vw; |
|||
flex: 1; |
|||
font-size: 0.75rem; |
|||
margin-left: 0rem; |
|||
padding-left: 20px; |
|||
} |
|||
} |
|||
.ant-layout-content{ |
|||
position: relative; |
|||
|
|||
// box-shadow: -2px 0px 8px rgba(238, 238, 238, 0.6); /* 左边阴影 */ |
|||
|
|||
.global-layout-content{ |
|||
height: calc(100vh - 6vw); |
|||
overflow-y: auto; |
|||
padding: 10px; |
|||
} |
|||
|
|||
.ant-drawer-body{ |
|||
padding: 0; |
|||
} |
|||
.person-drawer{ |
|||
// height: 100vh; |
|||
display: flex; |
|||
flex-direction: column; |
|||
.person-header{ |
|||
height: 10rem; |
|||
width: 100%; |
|||
background: linear-gradient(to right, #87c1ff, #b1d7fb); |
|||
border-radius: 0 0 2rem 2rem; |
|||
display: flex; |
|||
align-items: center; |
|||
padding: 0 2rem; |
|||
box-sizing: border-box; |
|||
.person-header-avatar{ |
|||
height: 3rem; |
|||
width: 3rem; |
|||
border-radius: 2rem; |
|||
border: .2rem solid #FFFFFF; |
|||
img{ |
|||
width: 100%; |
|||
height: 100%; |
|||
} |
|||
} |
|||
.person-header-name{ |
|||
text-align: left; |
|||
flex: 1; |
|||
margin-left: 1rem; |
|||
font-size: 1.4rem; |
|||
color: #FFFFFF; |
|||
font-weight: bold; |
|||
.user-name{ |
|||
margin-right: 1rem; |
|||
} |
|||
|
|||
} |
|||
} |
|||
.person-float-info{ |
|||
position: absolute; |
|||
left: 1.2rem; |
|||
right: 1.2rem; |
|||
top: 8rem; |
|||
padding: .6rem 1rem; |
|||
background-color: #FFFFFF; |
|||
box-shadow: 5px 5px 6px rgba(238, 238, 238, 1); |
|||
border-radius: .6rem; |
|||
line-height: 2rem; |
|||
font-size: .8rem; |
|||
.label{ |
|||
color: #8a8c8e; |
|||
} |
|||
|
|||
} |
|||
.person-content{ |
|||
margin-top: 3.5rem; |
|||
padding: 1.2rem 1rem; |
|||
font-size: .8rem; |
|||
flex: 1; |
|||
.person-content-row{ |
|||
border-bottom: 2px solid #eee; |
|||
padding: 1rem; |
|||
display: flex; |
|||
justify-content: space-between; |
|||
.label{ |
|||
color: #8a8c8e; |
|||
} |
|||
} |
|||
} |
|||
.person-footer{ |
|||
padding: 1rem; |
|||
.person-footer-button { |
|||
|
|||
} |
|||
.person-footer-logout{ |
|||
margin-top: .5rem; |
|||
} |
|||
} |
|||
|
|||
} |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,200 @@ |
|||
<template> |
|||
<div class="global-layout"> |
|||
<a-layout class="page-layout"> |
|||
<a-layout-sider> |
|||
<div class="layout-sider-header"> |
|||
<div class="layout-sider-header-row"> |
|||
<div class="layout-sider-header-row-icon"> |
|||
<span class="sider-header-icon">质</span> |
|||
</div> |
|||
<!-- <div class="layout-sider-header-row-title">质控卒中工作站</div> --> |
|||
</div> |
|||
</div> |
|||
<div class="layout-sider-menu"> |
|||
<div class="menus" v-for="(item, index) in menus" :key="index"> |
|||
<div class="menu-item" :class="{'active': current == index}" |
|||
@click="handleClickMenu(item, index)"> |
|||
<div class="menu-item-icon"> |
|||
<!-- <img src="@/assets/images/plus.png" alt="" /> --> |
|||
<img :src="item.iconactive" alt="" v-if="current == index" /> |
|||
<img :src="item.icon" alt="" v-else /> |
|||
</div> |
|||
<div class="menu-item-name">{{item.name}}</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</a-layout-sider> |
|||
<a-layout> |
|||
<a-layout-header> |
|||
<div class="patient-box"> |
|||
<div class="patient-info"> |
|||
<span class="lable">姓名: </span> |
|||
<span class="text">{{patientData.patientName || '-'}}</span> |
|||
<span class="lable">性别: </span> |
|||
<span class="text">{{patientData.patientGender == 1 ? '女' : patientData.patientGender == 0 ? '男' : '-'}}</span> |
|||
<span class="lable">年龄: </span> |
|||
<span class="text">{{patientData.patientAge || '-'}}</span> |
|||
<span class="lable">证件号: </span> |
|||
<span |
|||
class="text">{{patientData.patientIdCardNo ? utils.maskIDCard(patientData.patientIdCardNo) : '-'}}</span> |
|||
<span class="lable">门急诊号: </span> |
|||
<span class="text">{{patientData.servialNo || '-'}}</span> |
|||
</div> |
|||
</div> |
|||
</a-layout-header> |
|||
<a-layout-content ref="layoutContent" id="layoutContent"> |
|||
<div class="global-layout-content" id="globalLayoutContent"> |
|||
<router-view /> |
|||
</div> |
|||
|
|||
<a-drawer placement="left" :visible="visible" width="320" @close="onClose" :getContainer="false" |
|||
:closable="false" :wrap-style="{ position: 'absolute' }"> |
|||
<div class="person-drawer"> |
|||
<div class="person-header"> |
|||
<div class="person-header-avatar"> |
|||
<img src="@/assets/images/ys.png" alt="" /> |
|||
</div> |
|||
<div class="person-header-name"> |
|||
<span class="user-name">{{loginInfo?.name}}</span> |
|||
<a-icon type="woman" /> |
|||
</div> |
|||
</div> |
|||
<div class="person-float-info"> |
|||
<div class="person-float-info-row"><span class="label">职位: </span><span |
|||
class="text">{{loginInfo?.deptName}}</span></div> |
|||
<div class="person-float-info-row"><span class="label">联系方式: </span><span |
|||
class="text">{{loginInfo?.contract}}</span></div> |
|||
</div> |
|||
<div class="person-content"> |
|||
<div class="person-content-row"> |
|||
<span class="label">所属医院: </span> |
|||
<span class="text">{{loginInfo?.hospitalName}}</span> |
|||
</div> |
|||
<div class="person-content-row"> |
|||
<span class="label">所属科室: </span> |
|||
<span class="text">{{loginInfo?.deptName}}</span> |
|||
</div> |
|||
<div class="person-content-row"> |
|||
<span class="label">联系客服: </span> |
|||
<span class="text">{{loginInfo?.customer}}</span> |
|||
</div> |
|||
<div class="person-content-row"> |
|||
<span class="label">当前版本: </span> |
|||
<span class="text">正式版v{{loginInfo?.version}}</span> |
|||
</div> |
|||
</div> |
|||
<div class="person-footer"> |
|||
<a-button class="persion-footer-button person-footer-reset" block>修改密码</a-button> |
|||
<a-button class="persion-footer-button person-footer-logout" type="primary" |
|||
block>退出登录</a-button> |
|||
</div> |
|||
</div> |
|||
</a-drawer> |
|||
</a-layout-content> |
|||
</a-layout> |
|||
|
|||
</a-layout> |
|||
</div> |
|||
|
|||
</template> |
|||
|
|||
<script> |
|||
import { |
|||
mapMutations, |
|||
mapState |
|||
} from 'vuex'; |
|||
import { loginInfo } from 'api'; |
|||
import icon01 from '@/assets/images/slice/icon01.png' |
|||
import icon01H from '@/assets/images/slice/icon01H.png' |
|||
import icon02 from '@/assets/images/slice/icon02.png' |
|||
import icon02H from '@/assets/images/slice/icon02H.png' |
|||
import icon03 from '@/assets/images/slice/icon03.png' |
|||
import icon03H from '@/assets/images/slice/icon03H.png' |
|||
import icon04 from '@/assets/images/slice/icon04.png' |
|||
import icon04H from '@/assets/images/slice/icon04H.png' |
|||
export default { |
|||
name: 'BasicLayout', |
|||
data() { |
|||
return { |
|||
current: 0, |
|||
current_: 0, |
|||
visible: false, |
|||
loginInfo: null, |
|||
menus: [{ |
|||
name: '急救', |
|||
path: '/firstaid/patientList', |
|||
icon: icon01H, |
|||
iconactive: icon01, |
|||
}, { |
|||
name: '档案', |
|||
path: '/document', |
|||
icon: icon02H, |
|||
iconactive: icon02, |
|||
}, { |
|||
name: '统计', |
|||
path: '/statistics', |
|||
icon: icon03H, |
|||
iconactive: icon03, |
|||
}, { |
|||
name: '我的', |
|||
path: 'person', |
|||
icon: icon04H, |
|||
iconactive: icon04, |
|||
}], |
|||
} |
|||
}, |
|||
computed: { |
|||
...mapState('patient', ['patientData']), |
|||
}, |
|||
beforeRouteEnter(to, from, next) { |
|||
next((vm) => { |
|||
if (to.fullPath == '/document') { |
|||
vm.current = 1 |
|||
vm.current_ = 1 |
|||
} else if (to.fullPath == '/statistics') { |
|||
vm.current = 2 |
|||
vm.current_ = 2 |
|||
} else { |
|||
vm.current = 0 |
|||
vm.current_ = 0 |
|||
if (to.fullPath != '/firstaid/patientList') { |
|||
vm.$router.replace('/firstaid/patientList') |
|||
} |
|||
} |
|||
}); |
|||
}, |
|||
methods: { |
|||
handleClickMenu(item, index) { |
|||
if (index != this.current) { |
|||
this.current_ = this.current |
|||
} |
|||
this.current = index |
|||
if (item.path == 'person') { |
|||
if (this.visible) this.onClose() |
|||
else this.showPersion() |
|||
} else { |
|||
this.visible = false; |
|||
this.$router.replace(item.path) |
|||
} |
|||
}, |
|||
async showPersion() { |
|||
this.visible = true; |
|||
document.getElementById('globalLayoutContent').style.overflowY = 'hidden'; |
|||
if(!this.loginInfo){ |
|||
var res = await loginInfo(); |
|||
this.loginInfo = res.data || {} |
|||
} |
|||
this.visible = true; |
|||
}, |
|||
onClose() { |
|||
this.visible = false; |
|||
document.getElementById('globalLayoutContent').style.overflowY = 'auto'; |
|||
this.current = this.current_ |
|||
}, |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="less"> |
|||
@import "./BasicLayout.less"; |
|||
</style> |
@ -0,0 +1,15 @@ |
|||
<template> |
|||
<div> |
|||
<router-view /> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
name: 'BlankLayout' |
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
|
|||
</style> |
@ -0,0 +1,11 @@ |
|||
<template> |
|||
<page-header-wrapper> |
|||
<router-view /> |
|||
</page-header-wrapper> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
name: 'PageView' |
|||
} |
|||
</script> |
@ -0,0 +1,33 @@ |
|||
<script> |
|||
export default { |
|||
name: 'RouteView', |
|||
props: { |
|||
keepAlive: { |
|||
type: Boolean, |
|||
default: true |
|||
} |
|||
}, |
|||
data() { |
|||
return {} |
|||
}, |
|||
render() { |
|||
const { |
|||
$route: { |
|||
meta |
|||
}, |
|||
$store: { |
|||
getters |
|||
} |
|||
} = this |
|||
const inKeep = (<keep-alive> <router-view/> </keep-alive>) |
|||
const notKeep = (<router-view />) |
|||
// 这里增加了 multiTab 的判断,当开启了 multiTab 时 |
|||
// 应当全部组件皆缓存,否则会导致切换页面后页面还原成原始状态 |
|||
// 若确实不需要,可改为 return meta.keepAlive ? inKeep : notKeep |
|||
if (!getters.multiTab && !meta.keepAlive) { |
|||
return notKeep |
|||
} |
|||
return this.keepAlive || getters.multiTab || meta.keepAlive ? inKeep : notKeep |
|||
} |
|||
} |
|||
</script> |
@ -0,0 +1,12 @@ |
|||
// import UserLayout from './UserLayout'
|
|||
import BlankLayout from './BlankLayout' |
|||
import BasicLayout from './BasicLayout' |
|||
import RouteView from './RouteView' |
|||
import PageView from './PageView' |
|||
|
|||
export { |
|||
BasicLayout, |
|||
BlankLayout, |
|||
RouteView, |
|||
PageView |
|||
} |
@ -0,0 +1,73 @@ |
|||
/* |
|||
* Copyright (c) 2023. |
|||
* author: gaowenya |
|||
* email: gaowenya_a@163.com |
|||
*/ |
|||
import Vue from 'vue'; |
|||
import './config/axios'; |
|||
import App from './App.vue'; |
|||
import router from './router'; |
|||
import store from './store'; |
|||
|
|||
import Antd from 'ant-design-vue'; |
|||
import 'ant-design-vue/dist/antd.less'; |
|||
Vue.use(Antd); |
|||
|
|||
import { |
|||
DatetimePicker, |
|||
Slider, |
|||
Stepper, |
|||
Toast, |
|||
CountDown, |
|||
NumberKeyboard, |
|||
} from 'vant'; |
|||
import 'vant/lib/index.css'; |
|||
Vue.use(DatetimePicker); |
|||
Vue.use(Slider); |
|||
Vue.use(Stepper); |
|||
Vue.use(Toast); |
|||
Vue.use(CountDown); |
|||
Vue.use(NumberKeyboard); |
|||
|
|||
import vueEsign from 'vue-esign'; |
|||
Vue.use(vueEsign); |
|||
|
|||
import home from './config/home'; |
|||
import util from './utils'; |
|||
|
|||
Vue.config.productionTip = false; |
|||
Vue.prototype.home = home; |
|||
Vue.prototype.utils = util; |
|||
|
|||
router.beforeEach(async (to, from, next) => { |
|||
const { back, more } = to.meta; |
|||
store.commit('storm/setShowBack', back); |
|||
store.commit('storm/setShowMore', more); |
|||
//患者列表清楚定时器
|
|||
if (to.name === 'PatientList') { |
|||
util.AnimationFrame.done('timerTask'); |
|||
util.AnimationFrame.done('countTask'); |
|||
} |
|||
const { deviceNo } = to.query; |
|||
if (deviceNo) { |
|||
if (deviceNo !== localStorage.getItem('APP_DEVICE_NO')) { |
|||
localStorage.setItem('anyringToken', null); |
|||
} |
|||
store.commit('storm/setPadNo', deviceNo); |
|||
} |
|||
if (!to.meta.route) { |
|||
next(); |
|||
} else { |
|||
next(); |
|||
} |
|||
}); |
|||
document.addEventListener('UniAppJSBridgeReady', function () { |
|||
uni.getEnv(function (res) { |
|||
console.log('当前环境:' + JSON.stringify(res)); |
|||
}); |
|||
new Vue({ |
|||
router, |
|||
store, |
|||
render: (h) => h(App), |
|||
}).$mount('#app'); |
|||
}); |
@ -0,0 +1,75 @@ |
|||
import Vue from 'vue' |
|||
import VueRouter from 'vue-router' |
|||
import { |
|||
BasicLayout, |
|||
BlankLayout |
|||
} from '@/layouts' |
|||
|
|||
Vue.use(VueRouter) |
|||
|
|||
const routes = [{ |
|||
path: '/', |
|||
component: BasicLayout, |
|||
redirect: '/firstaid/patientList', |
|||
hidden: true, |
|||
children: [{ |
|||
path: '/firstaid/patientList', |
|||
name: 'PatientList', |
|||
meta: { |
|||
back: false, |
|||
nav: true |
|||
}, |
|||
component: () => import( /* 急救患者 */ 'views/Patient/index.vue') |
|||
}, { |
|||
path: '/firstaid/thrombolysis', |
|||
name: 'Thrombolysis', |
|||
meta: { |
|||
back: false, |
|||
nav: true |
|||
}, |
|||
component: () => import( /* 溶栓急救 */ 'views/thrombolysis/index.vue'), |
|||
}, |
|||
{ |
|||
path: '/document', |
|||
name: 'Document', |
|||
meta: { |
|||
back: false, |
|||
nav: true |
|||
}, |
|||
component: () => import( /* 档案 */ 'views/document/index.vue'), |
|||
}, |
|||
{ |
|||
path: '/statistics', |
|||
name: 'Statistics', |
|||
meta: { |
|||
back: false, |
|||
nav: true |
|||
}, |
|||
component: () => import( /* 档案 */ 'views/statistics/index.vue'), |
|||
}, |
|||
// {
|
|||
// path: '/doc-report',
|
|||
// name: 'DocReport',
|
|||
// meta: {
|
|||
// back: true,
|
|||
// nav: true
|
|||
// },
|
|||
// component: () => import( /* 档案 */ 'views/document/report.vue'),
|
|||
// }
|
|||
] |
|||
}, |
|||
// {
|
|||
// path: '/404',
|
|||
// component: () => import('@/views/exception/404')
|
|||
// }
|
|||
] |
|||
|
|||
const router = new VueRouter({ |
|||
mode: 'hash', // 去掉url中的#
|
|||
scrollBehavior: () => ({ |
|||
y: 0 |
|||
}), |
|||
routes |
|||
}) |
|||
|
|||
export default router |
@ -0,0 +1,7 @@ |
|||
import Vue from 'vue'; |
|||
import Vuex from 'vuex'; |
|||
import storm from './modules/storm/index'; |
|||
import patient from './modules/patient/index'; |
|||
|
|||
Vue.use(Vuex); |
|||
export default new Vuex.Store({ modules: { storm, patient } }); |
@ -0,0 +1,3 @@ |
|||
const actions = { |
|||
} |
|||
export default actions |
@ -0,0 +1,5 @@ |
|||
const getters = { |
|||
|
|||
}; |
|||
|
|||
export default getters; |
@ -0,0 +1,13 @@ |
|||
/* |
|||
* @Author: gaowenya |
|||
* @email: gaowenya_a@163.com |
|||
* @Date: 2023-06-20 13:11 |
|||
* @LastEditors: |
|||
* @LastEditTime: |
|||
*/ |
|||
import mutations from './mutations'; |
|||
import getters from './getters'; |
|||
import actions from './actions'; |
|||
import state from './state'; |
|||
|
|||
export default { namespaced: true, state, getters, mutations, actions }; |
@ -0,0 +1,50 @@ |
|||
const mutations = { |
|||
/** |
|||
* 当前患者信息 |
|||
* @param { object } state |
|||
* @param { boolean } data |
|||
*/ |
|||
setPatientData(state, data) { |
|||
// 团注, 剂量, 每次进来复制为空
|
|||
if (data.recordValDict) { |
|||
if (!data.recordValDict['JMRS-TZJL']) { |
|||
data.recordValDict['JMRS-TZJL'] = [ |
|||
{ |
|||
questionCode: 'JMRS-TZJL', |
|||
answer: [], |
|||
}, |
|||
]; |
|||
} |
|||
if (!data.recordValDict['JMRS-JDJL']) { |
|||
data.recordValDict['JMRS-JDJL'] = [ |
|||
{ |
|||
questionCode: 'JMRS-JDJL', |
|||
answer: [], |
|||
}, |
|||
]; |
|||
} |
|||
} |
|||
sessionStorage.setItem('patientData', JSON.stringify(data)); |
|||
state.patientData = data; |
|||
}, |
|||
setTimerData(state, data) { |
|||
state.timerData = data; |
|||
}, |
|||
setNextNodeData(state, data) { |
|||
state.nextNodeData = data; |
|||
}, |
|||
setOverviewType(state, data) { |
|||
state.overviewType = data; |
|||
}, |
|||
setVideo(state, data) { |
|||
state.video = data; |
|||
}, |
|||
setBook(state, data) { |
|||
state.book = data; |
|||
}, |
|||
setWriteAble(state, flag) { |
|||
state.writeAble = flag; |
|||
}, |
|||
}; |
|||
|
|||
export default mutations; |