Browse Source

init

master
nicky 5 months ago
parent
commit
b61b5a739f
  1. 23
      .gitignore
  2. 36
      README.en.md
  3. 19
      README.md
  4. 1
      README.txt
  5. 5
      babel.config.js
  6. 34255
      package-lock.json
  7. 42
      package.json
  8. 22
      postcss.config.js
  9. 30
      public/index.html
  10. BIN
      public/logo.jpg
  11. 1
      public/uni.webview.1.5.4.js
  12. 10
      public/vconsole.js
  13. 368
      src/App.vue
  14. 333
      src/api/index.js
  15. 14
      src/api/login.js
  16. BIN
      src/assets/images/100.png
  17. BIN
      src/assets/images/adverse.png
  18. BIN
      src/assets/images/aspect.png
  19. BIN
      src/assets/images/camera.png
  20. BIN
      src/assets/images/ctbefore.png
  21. BIN
      src/assets/images/cting.png
  22. BIN
      src/assets/images/dose.png
  23. BIN
      src/assets/images/emergency.png
  24. BIN
      src/assets/images/hzgl.png
  25. BIN
      src/assets/images/hzlb.png
  26. BIN
      src/assets/images/icon-design-34.png
  27. BIN
      src/assets/images/image.png
  28. BIN
      src/assets/images/informed.png
  29. BIN
      src/assets/images/inspect.png
  30. BIN
      src/assets/images/jr.png
  31. BIN
      src/assets/images/login-bg.png
  32. BIN
      src/assets/images/login-bg2.png
  33. BIN
      src/assets/images/logo.jpg
  34. BIN
      src/assets/images/medical.png
  35. BIN
      src/assets/images/min.png
  36. BIN
      src/assets/images/mrii.png
  37. BIN
      src/assets/images/operativeNote.png
  38. BIN
      src/assets/images/pc-01.png
  39. BIN
      src/assets/images/pc-02.png
  40. BIN
      src/assets/images/pc-03.png
  41. BIN
      src/assets/images/pc-04.png
  42. BIN
      src/assets/images/pc.png
  43. BIN
      src/assets/images/plus-white.png
  44. BIN
      src/assets/images/plus.png
  45. BIN
      src/assets/images/record.png
  46. BIN
      src/assets/images/rs-q.png
  47. BIN
      src/assets/images/rs-z.png
  48. BIN
      src/assets/images/slice/empty.png
  49. BIN
      src/assets/images/slice/icon01.png
  50. BIN
      src/assets/images/slice/icon01H.png
  51. BIN
      src/assets/images/slice/icon02.png
  52. BIN
      src/assets/images/slice/icon02H.png
  53. BIN
      src/assets/images/slice/icon03.png
  54. BIN
      src/assets/images/slice/icon03H.png
  55. BIN
      src/assets/images/slice/icon04.png
  56. BIN
      src/assets/images/slice/icon04H.png
  57. BIN
      src/assets/images/slice/title-line.png
  58. BIN
      src/assets/images/video.png
  59. BIN
      src/assets/images/xfyz.png
  60. BIN
      src/assets/images/xz.png
  61. BIN
      src/assets/images/ys.png
  62. BIN
      src/assets/images/导航状态_slices/Slice 10.png
  63. BIN
      src/assets/images/导航状态_slices/Slice 10@2x.png
  64. BIN
      src/assets/images/导航状态_slices/Slice 7.png
  65. BIN
      src/assets/images/导航状态_slices/Slice 7@2x.png
  66. BIN
      src/assets/images/导航状态_slices/Slice 8.png
  67. BIN
      src/assets/images/导航状态_slices/Slice 8@2x.png
  68. BIN
      src/assets/images/导航状态_slices/Slice 9(1).png
  69. BIN
      src/assets/images/导航状态_slices/Slice 9(2).png
  70. BIN
      src/assets/images/导航状态_slices/Slice 9(3).png
  71. BIN
      src/assets/images/导航状态_slices/Slice 9(4).png
  72. BIN
      src/assets/images/导航状态_slices/Slice 9.png
  73. BIN
      src/assets/images/导航状态_slices/Slice 9@2x(1).png
  74. BIN
      src/assets/images/导航状态_slices/Slice 9@2x(2).png
  75. BIN
      src/assets/images/导航状态_slices/Slice 9@2x(3).png
  76. BIN
      src/assets/images/导航状态_slices/Slice 9@2x(4).png
  77. BIN
      src/assets/images/导航状态_slices/Slice 9@2x.png
  78. BIN
      src/assets/images/探针.png
  79. BIN
      src/assets/images/矩形标记.png
  80. BIN
      src/assets/images/长度测量直尺.png
  81. BIN
      src/assets/images/阴影.png
  82. 315
      src/assets/less/common.css
  83. 819
      src/assets/less/common.less
  84. 274
      src/assets/portrait.styl
  85. 161
      src/components/Nav.vue
  86. 115
      src/components/count.vue
  87. 80
      src/components/dragger.vue
  88. 546
      src/components/keyboard.vue
  89. 4
      src/components/signature/fontSize.css
  90. 104
      src/components/signature/signature.vue
  91. BIN
      src/components/signature/仿宋字体.ttf
  92. 288
      src/components/yuanzhen-dcmView/dcmview.vue
  93. 16022
      src/components/yuanzhen-dcmView/dist/cornerstone.js
  94. 3
      src/components/yuanzhen-dcmView/dist/cornerstoneMath.min.js
  95. 38419
      src/components/yuanzhen-dcmView/dist/cornerstoneTools.js
  96. 2
      src/components/yuanzhen-dcmView/dist/cornerstoneWADOImageLoader.bundle.min.js
  97. 2
      src/components/yuanzhen-dcmView/dist/cornerstoneWADOImageLoader.bundleCopy.min.js
  98. 3
      src/components/yuanzhen-dcmView/dist/cornerstoneWebImageLoader.min.js
  99. 3942
      src/components/yuanzhen-dcmView/dist/dicomParser.min.js
  100. 1256
      src/components/yuanzhen-dcmView/dist/hammer.js

23
.gitignore

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

36
README.en.md

@ -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/)

19
README.md

@ -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/).

1
README.txt

@ -0,0 +1 @@
CARBASICS2023-WEB-PAD

5
babel.config.js

@ -0,0 +1,5 @@
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
]
}

34255
package-lock.json

File diff suppressed because it is too large

42
package.json

@ -0,0 +1,42 @@
{
"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",
"install": "^0.13.0",
"npm": "^11.1.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",
"vuex-persistedstate": "^4.1.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"
}
}

22
postcss.config.js

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

30
public/index.html

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

BIN
public/logo.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

1
public/uni.webview.1.5.4.js

File diff suppressed because one or more lines are too long

10
public/vconsole.js

File diff suppressed because one or more lines are too long

368
src/App.vue

@ -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>
<!-- 全局计时 $route.name !== 'PatientList' && -->
<Dragger v-if="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>

333
src/api/index.js

@ -0,0 +1,333 @@
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);
//根据id,查询患者信息,回写患者信息
export const queryById = (params) =>
axios.post(`${proxyUrl1}/firstAid/queryById`, params);
// 编辑患者
export const eduitPatient = (params) =>
axios.post(`${proxyUrl1}//firstAid/eduitPatient`, 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
});
// 介入手术记录/总报告/DNT时间表
export const operationLog = (params) =>
axios.post(`${proxyUrl1}/interfere/operationLog`, {
...params
});
// 介入手术记录/总报告/DNT时间表
export const operationLogEx = (params) =>
axios.post(`${proxyUrl1}//export/operationLog`, {
...params
});
// 创建急救
export const createFirstAid = (params) =>
axios.post(`${proxyUrl1}/firstAid/createFirstAid`, {
...params
});
export const createPatient = (params) =>
axios.post(`${proxyUrl1}/firstAid/createPatient`, {
...params
});
// export const eduitPatient = (params) =>
// axios.post(`${proxyUrl1}/firstAid/eduitPatient`, {
// ...params
// });

14
src/api/login.js

@ -0,0 +1,14 @@
import axios from 'axios';
let {
proxyUrl
} = require('@/config/setting');
let proxyUrl1 = proxyUrl + '/workstation';
// 登录
export const Login = (params) =>
axios.post(`${proxyUrl}/auth/pad/login`, params);
export const Loginnew = (params) =>
axios.post(`${proxyUrl}/auth/login`, params);
// 登录
export const queryUser = (params) =>
axios.post(`${proxyUrl1}/sys/queryUsername`, params);

BIN
src/assets/images/100.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

BIN
src/assets/images/adverse.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

BIN
src/assets/images/aspect.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
src/assets/images/camera.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
src/assets/images/ctbefore.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
src/assets/images/cting.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
src/assets/images/dose.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

BIN
src/assets/images/emergency.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

BIN
src/assets/images/hzgl.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
src/assets/images/hzlb.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
src/assets/images/icon-design-34.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

BIN
src/assets/images/image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

BIN
src/assets/images/informed.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

BIN
src/assets/images/inspect.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

BIN
src/assets/images/jr.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

BIN
src/assets/images/login-bg.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 KiB

BIN
src/assets/images/login-bg2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 888 KiB

BIN
src/assets/images/logo.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

BIN
src/assets/images/medical.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

BIN
src/assets/images/min.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

BIN
src/assets/images/mrii.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
src/assets/images/operativeNote.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

BIN
src/assets/images/pc-01.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 446 B

BIN
src/assets/images/pc-02.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 512 B

BIN
src/assets/images/pc-03.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 551 B

BIN
src/assets/images/pc-04.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 B

BIN
src/assets/images/pc.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

BIN
src/assets/images/plus-white.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 894 B

BIN
src/assets/images/plus.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
src/assets/images/record.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

BIN
src/assets/images/rs-q.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

BIN
src/assets/images/rs-z.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 KiB

BIN
src/assets/images/slice/empty.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
src/assets/images/slice/icon01.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
src/assets/images/slice/icon01H.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
src/assets/images/slice/icon02.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 978 B

BIN
src/assets/images/slice/icon02H.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
src/assets/images/slice/icon03.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
src/assets/images/slice/icon03H.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
src/assets/images/slice/icon04.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
src/assets/images/slice/icon04H.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
src/assets/images/slice/title-line.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 B

BIN
src/assets/images/video.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

BIN
src/assets/images/xfyz.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
src/assets/images/xz.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

BIN
src/assets/images/ys.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
src/assets/images/导航状态_slices/Slice 10.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 746 B

BIN
src/assets/images/导航状态_slices/Slice 10@2x.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
src/assets/images/导航状态_slices/Slice 7.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 567 B

BIN
src/assets/images/导航状态_slices/Slice 7@2x.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
src/assets/images/导航状态_slices/Slice 8.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 580 B

BIN
src/assets/images/导航状态_slices/Slice 8@2x.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
src/assets/images/导航状态_slices/Slice 9(1).png

Binary file not shown.

After

Width:  |  Height:  |  Size: 655 B

BIN
src/assets/images/导航状态_slices/Slice 9(2).png

Binary file not shown.

After

Width:  |  Height:  |  Size: 482 B

BIN
src/assets/images/导航状态_slices/Slice 9(3).png

Binary file not shown.

After

Width:  |  Height:  |  Size: 524 B

BIN
src/assets/images/导航状态_slices/Slice 9(4).png

Binary file not shown.

After

Width:  |  Height:  |  Size: 631 B

BIN
src/assets/images/导航状态_slices/Slice 9.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 613 B

BIN
src/assets/images/导航状态_slices/Slice 9@2x(1).png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
src/assets/images/导航状态_slices/Slice 9@2x(2).png

Binary file not shown.

After

Width:  |  Height:  |  Size: 978 B

BIN
src/assets/images/导航状态_slices/Slice 9@2x(3).png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
src/assets/images/导航状态_slices/Slice 9@2x(4).png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
src/assets/images/导航状态_slices/Slice 9@2x.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
src/assets/images/探针.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
src/assets/images/矩形标记.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
src/assets/images/长度测量直尺.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

BIN
src/assets/images/阴影.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

315
src/assets/less/common.css

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

819
src/assets/less/common.less

@ -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 {
min-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%;
}
}
}
}

274
src/assets/portrait.styl

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

161
src/components/Nav.vue

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

115
src/components/count.vue

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

80
src/components/dragger.vue

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

546
src/components/keyboard.vue

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

4
src/components/signature/fontSize.css

@ -0,0 +1,4 @@
@font-face {
font-family: SONG;
src: url(./仿宋字体.ttf);
}

104
src/components/signature/signature.vue

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

BIN
src/components/signature/仿宋字体.ttf

Binary file not shown.

288
src/components/yuanzhen-dcmView/dcmview.vue

@ -0,0 +1,288 @@
<template>
<div style="width: 100%; height: 100%">
<div id="dicomImage"></div>
</div>
</template>
<script>
//
import cornerstone from './dist/cornerstone.js';
import cornerstoneTools from './dist/cornerstoneTools';
import cornerstoneWADOImageLoader from './dist/cornerstoneWADOImageLoader.bundle.min';
import Hammer from './dist/hammer';
import dicomParser from './dist/dicomParser.min';
import cornerstoneMath from './dist/cornerstoneMath.min';
export default {
name: 'dcmview',
props: {
currentDcm: {
type: Array,
default: [],
},
imgurl: {
type: String,
default: '',
},
toolType: {
type: String,
default: '',
},
width: {
type: String,
default: '750rpx',
},
height: {
type: String,
default: '1000rpx',
},
},
data() {
return {
imageIds: [],
};
},
watch: {
toolType: {
handler(newVal, lodVal) {
console.log(newVal, lodVal);
this.viewDcm1();
},
},
currentDcm: {
handler(newVal, lodVal) {
console.log('newVal', newVal);
this.handleDcm(newVal);
},
},
},
mounted() {
console.log(11111111, '1212');
this.handleDcm(this.currentDcm);
console.log(11111111, this.currentDcm);
},
methods: {
//
async handleDcm(_Arr) {
let that = this;
this.imageIds = [];
await _Arr.forEach((item) => {
this.imageIds.push('dicomweb:' + item.dcmPath);
});
this.viewDcm();
},
// dcm
viewDcm() {
cornerstoneTools.external.cornerstone = cornerstone;
cornerstoneTools.external.cornerstoneMath = cornerstoneMath;
cornerstoneTools.external.Hammer = Hammer;
cornerstoneWADOImageLoader.external.dicomParser = dicomParser;
cornerstoneWADOImageLoader.external.cornerstone = cornerstone;
cornerstoneWADOImageLoader.webWorkerManager.initialize({
maxWebWorkers: navigator.hardwareConcurrency || 1,
startWebWorkersOnDemand: true,
taskConfiguration: {
decodeTask: {
initializeCodecsOnStartup: false,
},
},
webWorkerPath: './dist/cornerstoneWADOImageLoader.bundleCopy.min.js',
});
cornerstoneTools.init({
mouseEnabled: true, //
touchEnabled: true, //
showSVGCursors: true,
autoResizeViewports: true,
});
const element = document.getElementById('dicomImage');
cornerstone.enable(element);
// const PanTool = cornerstoneTools.PanTool;
const StackScrollTool = cornerstoneTools.StackScrollTool;
const StackScrollMouseWheelTool =
cornerstoneTools.StackScrollMouseWheelTool;
const imageIds = this.imageIds;
const stack = {
currentImageIdIndex: 0,
imageIds: imageIds,
};
console.log('imageIds', imageIds);
element.addEventListener('cornerstonenewimage', (event) => {
console.log('event: ', event);
// console.log(event.detail.oldImage, stack.currentImageIdIndex, 'event')
this.hanldeByValue(stack.currentImageIdIndex);
});
element.addEventListener('cornerstonetap', (event) => {
console.log('cornerstonetap: ', cornerstonetap);
const direction = event.detail.direction;
if (direction === 'LEFT') {
//
stack.currentImageIdIndex++;
} else if (direction === 'RIGHT') {
//
stack.currentImageIdIndex--;
}
//
const imageIds = stack.imageIds;
const newImageIdIndex = stack.currentImageIdIndex;
const newImageId = imageIds[newImageIdIndex];
cornerstone
.loadAndCacheImage(newImageId)
.then((loadedImage) => {
cornerstone.displayImage(element, loadedImage);
});
});
console.log('imageIds,', imageIds)
cornerstone.loadImage(imageIds[0]).then((image) => {
console.log(image, 'image');
cornerstone.displayImage(element, image);
cornerstoneTools.addStackStateManager(element, ['stack']);
cornerstoneTools.addToolState(element, 'stack', stack);
// cornerstoneTools.addTool(PanTool);
cornerstoneTools.addTool(StackScrollTool, {
configuration: {
loop: true,
allowSkipping: true,
},
});
cornerstoneTools.addTool(StackScrollMouseWheelTool, {
configuration: {
loop: true,
allowSkipping: true,
invert: false,
},
});
// cornerstoneTools.setToolActive('Pan', { mouseButtonMask: 1 });
cornerstoneTools.setToolActive('StackScroll', {
mouseButtonMask: 1,
});
cornerstoneTools.setToolActive('StackScrollMouseWheel', {
mouseButtonMask: 4,
});
});
},
// dcm
viewDcm1() {
var element = document.getElementById('dicomImage');
//
console.log('this.toolType: ', this.toolType);
switch (this.toolType) {
case 'ScrollTool':
const StackScrollTool = cornerstoneTools.StackScrollTool;
const StackScrollMouseWheelTool =
cornerstoneTools.StackScrollMouseWheelTool;
cornerstoneTools.addTool(StackScrollTool, {
configuration: {
loop: true,
allowSkipping: true,
},
});
cornerstoneTools.addTool(StackScrollMouseWheelTool, {
configuration: {
loop: true,
allowSkipping: true,
invert: false,
},
});
// cornerstoneTools.setToolActive('Pan', { mouseButtonMask: 1 });
cornerstoneTools.setToolActive('StackScroll', {
mouseButtonMask: 1,
});
cornerstoneTools.setToolActive('StackScrollMouseWheel', {
mouseButtonMask: 4,
});
break;
case 'Wwwc':
// cornerstoneTools,
const WwwcTool = cornerstoneTools.WwwcTool;
//WwwcTool,
cornerstoneTools.addTool(WwwcTool);
//
cornerstoneTools.setToolActive('Wwwc', {
mouseButtonMask: 1,
});
break;
case 'Angle':
//
const AngleTool = cornerstoneTools.AngleTool;
cornerstoneTools.addTool(AngleTool);
cornerstoneTools.setToolActive('Angle', {
mouseButtonMask: 1,
});
break;
case 'RectangleRoi':
// Roi
const RectangleRoiTool = cornerstoneTools.RectangleRoiTool;
cornerstoneTools.addTool(RectangleRoiTool);
cornerstoneTools.setToolActive('RectangleRoi', {
mouseButtonMask: 1,
});
break;
case 'DragProbe':
//
const DragProbeTool = cornerstoneTools.DragProbeTool;
cornerstoneTools.addTool(DragProbeTool);
cornerstoneTools.setToolActive('DragProbe', {
mouseButtonMask: 1,
});
break;
case 'Length':
//
const LengthTool = cornerstoneTools.LengthTool;
cornerstoneTools.addTool(LengthTool);
cornerstoneTools.setToolActive('Length', {
mouseButtonMask: 1,
});
break;
case 'Zoom':
//
const ZoomMouseWheelTool =
cornerstoneTools.ZoomMouseWheelTool;
cornerstoneTools.addTool(ZoomMouseWheelTool);
cornerstoneTools.setToolActive('ZoomMouseWheel', {
mouseButtonMask: 1,
});
break;
case 'eliminate':
//
cornerstoneTools.clearToolState(element, 'Length');
break;
default:
throw new Error('工具参数错误');
break;
}
},
clearAllTool() {
for (let k in this.name) {
cornerstoneTools.clearToolState(this.element, this.name[k]);
}
// tool
cornerstone.updateImage(this.element);
// reset viewport
cornerstone.reset(this.element);
},
//
hanldeByValue(_index) {
this.$emit('byValue', _index);
},
},
};
</script>
<style>
/* 定义图片显示区域div大小 */
#dicomImage {
width: 100%;
height: 100%;
}
.btn {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
}
</style>

16022
src/components/yuanzhen-dcmView/dist/cornerstone.js

File diff suppressed because it is too large

3
src/components/yuanzhen-dcmView/dist/cornerstoneMath.min.js

File diff suppressed because one or more lines are too long

38419
src/components/yuanzhen-dcmView/dist/cornerstoneTools.js

File diff suppressed because it is too large

2
src/components/yuanzhen-dcmView/dist/cornerstoneWADOImageLoader.bundle.min.js

File diff suppressed because one or more lines are too long

2
src/components/yuanzhen-dcmView/dist/cornerstoneWADOImageLoader.bundleCopy.min.js

File diff suppressed because one or more lines are too long

3
src/components/yuanzhen-dcmView/dist/cornerstoneWebImageLoader.min.js

@ -0,0 +1,3 @@
/*! cornerstone-web-image-loader - 2.1.1 - 2018-12-05 | (c) 2016 Chris Hafey | https://github.com/cornerstonejs/cornerstoneWebImageLoader */
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("cornerstoneWebImageLoader",[],t):"object"==typeof exports?exports.cornerstoneWebImageLoader=t():e.cornerstoneWebImageLoader=t()}(window,function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},n.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=5)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.external=void 0;var r,o=n(4),a=(r=o)&&r.__esModule?r:{default:r};var u=void 0,i={set cornerstone(e){u=e,(0,a.default)(u)},get cornerstone(){return u}};t.external=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.loadImage=function(e){var t=r.external.cornerstone,n=new XMLHttpRequest;return n.open("GET",e,!0),n.responseType="arraybuffer",i.beforeSend(n),n.onprogress=function(n){if(n.lengthComputable){var r=n.loaded,o=n.total,a=Math.round(r/o*100),u={imageId:e,loaded:r,total:o,percentComplete:a};t.triggerEvent(t.events,"cornerstoneimageloadprogress",u)}},{promise:new Promise(function(t,r){n.onload=function(){(0,o.default)(this.response).then(function(n){var r=(0,a.default)(n,e);t(r)},r)},n.send()}),cancelFn:function(){n.abort()}}},t.configure=function(e){i=e};var r=n(0),o=u(n(3)),a=u(n(2));function u(e){return e&&e.__esModule?e:{default:e}}var i={beforeSend:function(){}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var n=e.naturalHeight,u=e.naturalWidth;return{imageId:t,minPixelValue:0,maxPixelValue:255,slope:1,intercept:0,windowCenter:128,windowWidth:255,render:r.external.cornerstone.renderWebImage,getPixelData:function(){return(n=void 0,a===t?n=o.getContext("2d"):(o.height=e.naturalHeight,o.width=e.naturalWidth,(n=o.getContext("2d")).drawImage(e,0,0),a=t),n.getImageData(0,0,e.naturalWidth,e.naturalHeight)).data;var n},getCanvas:function(){return a===t?o:(o.height=e.naturalHeight,o.width=e.naturalWidth,o.getContext("2d").drawImage(e,0,0),a=t,o)},getImage:function(){return e},rows:n,columns:u,height:n,width:u,color:!0,rgba:!1,columnPixelSpacing:void 0,rowPixelSpacing:void 0,invert:!1,sizeInBytes:n*u*4}};var r=n(0),o=document.createElement("canvas"),a=void 0},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return new Promise(function(t,n){var r=new Image,o=new Uint8Array(e),a=new Blob([o]),u=window.URL||window.webkitURL,i=u.createObjectURL(a);r.src=i,r.onload=function(){t(r),u.revokeObjectURL(i)},r.onerror=function(e){u.revokeObjectURL(i),n(e)}})}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){e.registerImageLoader("http",r.loadImage),e.registerImageLoader("https",r.loadImage)};var r=n(1)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.external=t.configure=t.loadImage=t.createImage=t.arrayBufferToImage=void 0;var r=i(n(3)),o=i(n(2)),a=n(1),u=n(0);function i(e){return e&&e.__esModule?e:{default:e}}var d={arrayBufferToImage:r.default,createImage:o.default,loadImage:a.loadImage,configure:a.configure,external:u.external};t.arrayBufferToImage=r.default,t.createImage=o.default,t.loadImage=a.loadImage,t.configure=a.configure,t.external=u.external,t.default=d}])});
//# sourceMappingURL=cornerstoneWebImageLoader.min.js.map

3942
src/components/yuanzhen-dcmView/dist/dicomParser.min.js

File diff suppressed because it is too large

1256
src/components/yuanzhen-dcmView/dist/hammer.js

File diff suppressed because it is too large

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save