@ -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; |