zzc 3 months ago
parent
commit
fd4ece36ee
  1. 2
      acupuncture-前台/.env.development
  2. 4
      acupuncture-前台/.env.production
  3. 4
      acupuncture-前台/.env.staging
  4. 3
      acupuncture-前台/package.json
  5. 52
      acupuncture-前台/public/index.html
  6. BIN
      acupuncture-前台/public/zj.png
  7. 8
      acupuncture-前台/src/App.vue
  8. 17
      acupuncture-前台/src/api/followupFile.js
  9. 21
      acupuncture-前台/src/api/indexCom.js
  10. BIN
      acupuncture-前台/src/assets/images/dangan_n@1x.png
  11. BIN
      acupuncture-前台/src/assets/images/dangan_s@1x.png
  12. BIN
      acupuncture-前台/src/assets/images/home_N@1x.png
  13. BIN
      acupuncture-前台/src/assets/images/home_S@1x.png
  14. BIN
      acupuncture-前台/src/assets/images/logo@1x.png
  15. BIN
      acupuncture-前台/src/assets/images/me_n@1x.png
  16. BIN
      acupuncture-前台/src/assets/images/me_s@1x.png
  17. BIN
      acupuncture-前台/src/assets/images/suifang_n@1x.png
  18. BIN
      acupuncture-前台/src/assets/images/suifang_s@1x.png
  19. BIN
      acupuncture-前台/src/assets/images/zhenliao_n@1x.png
  20. BIN
      acupuncture-前台/src/assets/images/zhenliao_s@1x.png
  21. BIN
      acupuncture-前台/src/assets/images/zj.png
  22. 4
      acupuncture-前台/src/assets/styles/common.css
  23. 4
      acupuncture-前台/src/assets/styles/element-variables.scss
  24. 66
      acupuncture-前台/src/assets/styles/sidebar.scss
  25. 34
      acupuncture-前台/src/assets/styles/variables.scss
  26. 77
      acupuncture-前台/src/components/TopNav/index.vue
  27. 28
      acupuncture-前台/src/layout/components/AppMain.vue
  28. 34
      acupuncture-前台/src/layout/components/Navbar.vue
  29. 30
      acupuncture-前台/src/layout/components/Sidebar/Item.vue
  30. 70
      acupuncture-前台/src/layout/components/Sidebar/Logo.vue
  31. 184
      acupuncture-前台/src/layout/components/Sidebar/SidebarItem.vue
  32. 118
      acupuncture-前台/src/layout/components/Sidebar/index.vue
  33. 143
      acupuncture-前台/src/layout/index.vue
  34. 5
      acupuncture-前台/src/main.js
  35. 26
      acupuncture-前台/src/router/index.js
  36. 62
      acupuncture-前台/src/store/modules/app.js
  37. 4
      acupuncture-前台/src/store/modules/permission.js
  38. 57
      acupuncture-前台/src/store/modules/settings.js
  39. 1
      acupuncture-前台/src/store/modules/user.js
  40. 33
      acupuncture-前台/src/utils/request.js
  41. BIN
      acupuncture-前台/src/views/bg.png
  42. 67
      acupuncture-前台/src/views/followFile/index.vue
  43. 685
      acupuncture-前台/src/views/followFile/subjects.vue
  44. 293
      acupuncture-前台/src/views/followFile/work.vue
  45. 27
      acupuncture-前台/src/views/index.vue
  46. 698
      acupuncture-前台/src/views/indexCom/JM.vue
  47. 430
      acupuncture-前台/src/views/indexCom/XGZL.vue
  48. 261
      acupuncture-前台/src/views/indexCom/follow.vue
  49. BIN
      acupuncture-前台/src/views/indexCom/image.png
  50. 959
      acupuncture-前台/src/views/indexCom/index.js
  51. 646
      acupuncture-前台/src/views/indexCom/patient.vue
  52. 8
      acupuncture-前台/src/views/indexCom/query.vue
  53. 235
      acupuncture-前台/src/views/login.vue
  54. 374
      acupuncture-前台/src/views/medicalFile/components/anxiety/HAMD.vue
  55. 323
      acupuncture-前台/src/views/medicalFile/components/anxiety/SAS.vue
  56. 202
      acupuncture-前台/src/views/medicalFile/components/posture/PHQ-9.vue
  57. 171
      acupuncture-前台/src/views/medicalFile/components/posture/PSQI.vue
  58. 191
      acupuncture-前台/src/views/medicalFile/components/posture/epworth.vue
  59. 1224
      acupuncture-前台/src/views/medicalFile/details.vue
  60. 745
      acupuncture-前台/src/views/medicalFile/index.vue
  61. 177
      acupuncture-前台/src/views/patientFile/index.vue
  62. 2
      acupuncture-前台/src/views/register.vue
  63. 73
      acupuncture-前台/src/views/system/user/profile/index.vue
  64. 5
      acupuncture-前台/vue.config.js
  65. 2
      acupuncture-后台/.env.development
  66. 4
      acupuncture-后台/.env.production
  67. 4
      acupuncture-后台/.env.staging
  68. 5
      acupuncture-后台/package.json
  69. 52
      acupuncture-后台/public/index.html
  70. BIN
      acupuncture-后台/public/zj.png
  71. 8
      acupuncture-后台/src/App.vue
  72. 26
      acupuncture-后台/src/api/followupFile.js
  73. 146
      acupuncture-后台/src/api/indexCom.js
  74. 14
      acupuncture-后台/src/api/medicalFile.js
  75. 106
      acupuncture-后台/src/api/member.js
  76. 8
      acupuncture-后台/src/api/patientFile.js
  77. 64
      acupuncture-后台/src/api/report.js
  78. BIN
      acupuncture-后台/src/assets/images/zj.png
  79. 2
      acupuncture-后台/src/assets/styles/common.css
  80. 4
      acupuncture-后台/src/assets/styles/element-variables.scss
  81. 32
      acupuncture-后台/src/assets/styles/variables.scss
  82. 8
      acupuncture-后台/src/layout/components/Navbar.vue
  83. 67
      acupuncture-后台/src/layout/components/Sidebar/Logo.vue
  84. 5
      acupuncture-后台/src/main.js
  85. 104
      acupuncture-后台/src/router/index.js
  86. 57
      acupuncture-后台/src/store/modules/settings.js
  87. 33
      acupuncture-后台/src/utils/request.js
  88. BIN
      acupuncture-后台/src/views/bg.png
  89. 95
      acupuncture-后台/src/views/followFile/index.vue
  90. 141
      acupuncture-后台/src/views/followFile/subjects.vue
  91. 317
      acupuncture-后台/src/views/followFile/work.vue
  92. 1188
      acupuncture-后台/src/views/index.vue
  93. 420
      acupuncture-后台/src/views/indexCom/JM.vue
  94. 388
      acupuncture-后台/src/views/indexCom/XGZL.vue
  95. 261
      acupuncture-后台/src/views/indexCom/follow.vue
  96. BIN
      acupuncture-后台/src/views/indexCom/image.png
  97. 955
      acupuncture-后台/src/views/indexCom/index.js
  98. 373
      acupuncture-后台/src/views/indexCom/patient.vue
  99. 179
      acupuncture-后台/src/views/indexCom/query.vue
  100. 235
      acupuncture-后台/src/views/login.vue

2
acupuncture-前台/.env.development

@ -1,5 +1,5 @@
# 页面标题 # 页面标题
VUE_APP_TITLE = 针灸管理系统 VUE_APP_TITLE = 朱琏针灸联盟数据系统
# 开发环境配置 # 开发环境配置
ENV = 'development' ENV = 'development'

4
acupuncture-前台/.env.production

@ -1,5 +1,5 @@
# 页面标题 # 页面标题
VUE_APP_TITLE = 针灸管理系统 VUE_APP_TITLE = 朱琏针灸联盟数据系统
# 生产环境配置 # 生产环境配置
NODE_ENV = 'production' NODE_ENV = 'production'
@ -8,4 +8,4 @@ VUE_APP_BASE_API = 'https://test.tall.wiki/acupuncture'
VUE_APP_API_QZURL = 'https://test.tall.wiki/' VUE_APP_API_QZURL = 'https://test.tall.wiki/'
# 访问路径 # 访问路径
VUE_APP_PUBLIC_PATH = '/acupunctureClient/' VUE_APP_PUBLIC_PATH = '/acupunctureClient/'

4
acupuncture-前台/.env.staging

@ -1,5 +1,5 @@
# 页面标题 # 页面标题
VUE_APP_TITLE = 针灸管理系统 VUE_APP_TITLE = 朱琏针灸联盟数据系统
BABEL_ENV = production BABEL_ENV = production
@ -8,5 +8,5 @@ NODE_ENV = production
# 测试环境配置 # 测试环境配置
ENV = 'staging' ENV = 'staging'
# 针灸管理系统/测试环境 # 朱琏针灸联盟数据系统/测试环境
VUE_APP_BASE_API = '/stage-api' VUE_APP_BASE_API = '/stage-api'

3
acupuncture-前台/package.json

@ -1,7 +1,7 @@
{ {
"name": "ruoyi", "name": "ruoyi",
"version": "3.8.9", "version": "3.8.9",
"description": "针灸管理系统", "description": "朱琏针灸联盟数据系统",
"author": "若依", "author": "若依",
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {
@ -48,6 +48,7 @@
"js-beautify": "1.13.0", "js-beautify": "1.13.0",
"js-cookie": "3.0.1", "js-cookie": "3.0.1",
"jsencrypt": "3.0.0-rc.1", "jsencrypt": "3.0.0-rc.1",
"moment": "^2.30.1",
"nprogress": "0.2.0", "nprogress": "0.2.0",
"quill": "2.0.2", "quill": "2.0.2",
"screenfull": "5.0.2", "screenfull": "5.0.2",

52
acupuncture-前台/public/index.html

@ -1,14 +1,17 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head>
<meta charset="utf-8"> <head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta charset="utf-8">
<meta name="renderer" content="webkit"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> <meta name="renderer" content="webkit">
<link rel="icon" href="<%= BASE_URL %>favicon.ico"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title><%= webpackConfig.name %></title> <link rel="icon" type="image/x-icon" href="./zj.png">
<!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]--> <title>
<style> <%= webpackConfig.name %>
</title>
<!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
<style>
html, html,
body, body,
#app { #app {
@ -16,6 +19,7 @@
margin: 0px; margin: 0px;
padding: 0px; padding: 0px;
} }
.chromeframe { .chromeframe {
margin: 0.2em 0; margin: 0.2em 0;
background: #ccc; background: #ccc;
@ -92,6 +96,7 @@
-ms-transform: rotate(0deg); -ms-transform: rotate(0deg);
transform: rotate(0deg); transform: rotate(0deg);
} }
100% { 100% {
-webkit-transform: rotate(360deg); -webkit-transform: rotate(360deg);
-ms-transform: rotate(360deg); -ms-transform: rotate(360deg);
@ -105,6 +110,7 @@
-ms-transform: rotate(0deg); -ms-transform: rotate(0deg);
transform: rotate(0deg); transform: rotate(0deg);
} }
100% { 100% {
-webkit-transform: rotate(360deg); -webkit-transform: rotate(360deg);
-ms-transform: rotate(360deg); -ms-transform: rotate(360deg);
@ -118,7 +124,7 @@
top: 0; top: 0;
width: 51%; width: 51%;
height: 100%; height: 100%;
background: #7171C6; background: #70483E;
z-index: 1000; z-index: 1000;
-webkit-transform: translateX(0); -webkit-transform: translateX(0);
-ms-transform: translateX(0); -ms-transform: translateX(0);
@ -194,15 +200,17 @@
opacity: 0.5; opacity: 0.5;
} }
</style> </style>
</head> </head>
<body>
<div id="app"> <body>
<div id="loader-wrapper"> <div id="app">
<div id="loader"></div> <div id="loader-wrapper">
<div class="loader-section section-left"></div> <div id="loader"></div>
<div class="loader-section section-right"></div> <div class="loader-section section-left"></div>
<div class="load_title">正在加载系统资源,请耐心等待</div> <div class="loader-section section-right"></div>
</div> <div class="load_title">正在加载系统资源,请耐心等待</div>
</div> </div>
</body> </div>
</html> </body>
</html>

BIN
acupuncture-前台/public/zj.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

8
acupuncture-前台/src/App.vue

@ -31,6 +31,14 @@ export default {
} }
</style> </style>
<style> <style>
.header-title {
display: -webkit-box !important;
overflow: hidden;
text-overflow: ellipsis;
word-break: break-all;
-webkit-box-orient: vertical;
-webkit-line-clamp: 1;
}
.wj-uploader .el-icon-upload:before { .wj-uploader .el-icon-upload:before {
font-size: 100px; font-size: 100px;
} }

17
acupuncture-前台/src/api/followupFile.js

@ -1,5 +1,12 @@
import request from "@/utils/request"; import request from "@/utils/request";
// 公共队列
export function commonQueue(data) {
return request({
url: "/followup/commonQueue",
method: "post",
data: data,
});
}
// 随访队列 // 随访队列
export function followupQuery(data) { export function followupQuery(data) {
return request({ return request({
@ -72,4 +79,12 @@ export function followPatient(data) {
method: "post", method: "post",
data: data, data: data,
}); });
}
// 修改随访状态
export function followStatus(data) {
return request({
url: "/followup/status",
method: "post",
data: data,
});
} }

21
acupuncture-前台/src/api/indexCom.js

@ -122,4 +122,25 @@ export function zlInfo(data) {
}); });
} }
// 治疗类型 // 治疗类型
export function zlType(data) {
return request({
url: "/statistics/zlType",
method: "post",
data: data,
});
}
// 随访分布 // 随访分布
export function sffb(data) {
return request({
url: "/statistics/sffb",
method: "post",
data: data,
});
}
export function sftj(data) {
return request({
url: "/statistics/sftj",
method: "post",
data: data,
});
}

BIN
acupuncture-前台/src/assets/images/dangan_n@1x.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 874 B

BIN
acupuncture-前台/src/assets/images/dangan_s@1x.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 849 B

BIN
acupuncture-前台/src/assets/images/home_N@1x.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 767 B

BIN
acupuncture-前台/src/assets/images/home_S@1x.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 734 B

BIN
acupuncture-前台/src/assets/images/logo@1x.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1018 B

BIN
acupuncture-前台/src/assets/images/me_n@1x.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 716 B

BIN
acupuncture-前台/src/assets/images/me_s@1x.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 699 B

BIN
acupuncture-前台/src/assets/images/suifang_n@1x.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 860 B

BIN
acupuncture-前台/src/assets/images/suifang_s@1x.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 833 B

BIN
acupuncture-前台/src/assets/images/zhenliao_n@1x.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 787 B

BIN
acupuncture-前台/src/assets/images/zhenliao_s@1x.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 759 B

BIN
acupuncture-前台/src/assets/images/zj.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

4
acupuncture-前台/src/assets/styles/common.css

@ -19,7 +19,7 @@
display: none; display: none;
} }
.popup >>> .el-dialog:not(.is-fullscreen) { .popup >>> .el-dialog:not(.is-fullscreen) {
margin-top: 0 !important; margin: 0 !important;
} }
.popup >>> .popupAdd { .popup >>> .popupAdd {
height: 58px; height: 58px;
@ -73,7 +73,7 @@
display: none; display: none;
} }
>>>.el-dialog__body{ >>>.el-dialog__body{
padding: 0px 20px 0px 20px; padding: 20px;
} }
/* .popup >>> .popupAdd2 .popupleft { /* .popup >>> .popupAdd2 .popupleft {
width: 55px; width: 55px;

4
acupuncture-前台/src/assets/styles/element-variables.scss

@ -4,7 +4,7 @@
**/ **/
/* theme color */ /* theme color */
$--color-primary: #1890ff; $--color-primary: #c6a268;
$--color-success: #13ce66; $--color-success: #13ce66;
$--color-warning: #ffba00; $--color-warning: #ffba00;
$--color-danger: #ff4949; $--color-danger: #ff4949;
@ -20,7 +20,7 @@ $--border-color-lighter: #e6ebf5;
$--table-border: 1px solid #dfe6ec; $--table-border: 1px solid #dfe6ec;
/* icon font path, required */ /* icon font path, required */
$--font-path: '~element-ui/lib/theme-chalk/fonts'; $--font-path: "~element-ui/lib/theme-chalk/fonts";
@import "~element-ui/packages/theme-chalk/src/index"; @import "~element-ui/packages/theme-chalk/src/index";

66
acupuncture-前台/src/assets/styles/sidebar.scss

@ -1,18 +1,17 @@
#app { #app {
.main-container { .main-container {
height: 100%; height: 100%;
transition: margin-left .28s; transition: margin-left 0.28s;
margin-left: $base-sidebar-width; margin-left: $base-sidebar-width;
position: relative; position: relative;
} }
.sidebarHide { .sidebarHide {
margin-left: 0!important; margin-left: 0 !important;
} }
.sidebar-container { .sidebar-container {
-webkit-transition: width .28s; -webkit-transition: width 0.28s;
transition: width 0.28s; transition: width 0.28s;
width: $base-sidebar-width !important; width: $base-sidebar-width !important;
background-color: $base-menu-background; background-color: $base-menu-background;
@ -24,12 +23,17 @@
left: 0; left: 0;
z-index: 1001; z-index: 1001;
overflow: hidden; overflow: hidden;
-webkit-box-shadow: 2px 0 6px rgba(0,21,41,.35); -webkit-box-shadow: 2px 0 6px rgba(0, 21, 41, 0.35);
box-shadow: 2px 0 6px rgba(0,21,41,.35); box-shadow: 2px 0 6px rgba(0, 21, 41, 0.35);
// reset element-ui css // reset element-ui css
.horizontal-collapse-transition { .horizontal-collapse-transition {
transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out; transition: 0s width ease-in-out, 0s padding-left ease-in-out,
0s padding-right ease-in-out;
-webkit-transition: 0s width ease-in-out, 0s padding-left ease-in-out;
-moz-transition: 0s width ease-in-out, 0s padding-left ease-in-out;
-ms-transition: 0s width ease-in-out, 0s padding-left ease-in-out;
-o-transition: 0s width ease-in-out, 0s padding-left ease-in-out;
} }
.scrollbar-wrapper { .scrollbar-wrapper {
@ -70,17 +74,37 @@
width: 100% !important; width: 100% !important;
} }
.el-menu-item, .el-submenu__title { .el-menu-item,
.el-submenu__title {
overflow: hidden !important; overflow: hidden !important;
text-overflow: ellipsis !important; text-overflow: ellipsis !important;
white-space: nowrap !important; white-space: nowrap !important;
} }
.el-menu-item {
height: 90px;
line-height: 26px !important;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
border-radius: 6px;
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
-ms-border-radius: 6px;
-o-border-radius: 6px;
}
// menu hover // menu hover
.submenu-title-noDropdown, .submenu-title-noDropdown,
.el-submenu__title { .el-submenu__title {
&:hover { &:hover {
background-color: rgba(0, 0, 0, 0.06) !important; background-color: rgba(0, 0, 0, 0.2) !important;
color: #fff !important;
.div-img {
display: block;
}
.div-img-gl {
display: none;
}
} }
} }
@ -88,7 +112,7 @@
color: $base-menu-color-active !important; color: $base-menu-color-active !important;
} }
& .nest-menu .el-submenu>.el-submenu__title, & .nest-menu .el-submenu > .el-submenu__title,
& .el-submenu .el-menu-item { & .el-submenu .el-menu-item {
min-width: $base-sidebar-width !important; min-width: $base-sidebar-width !important;
@ -97,7 +121,7 @@
} }
} }
& .theme-dark .nest-menu .el-submenu>.el-submenu__title, & .theme-dark .nest-menu .el-submenu > .el-submenu__title,
& .theme-dark .el-submenu .el-menu-item { & .theme-dark .el-submenu .el-menu-item {
background-color: $base-sub-menu-background !important; background-color: $base-sub-menu-background !important;
@ -132,20 +156,19 @@
.el-submenu { .el-submenu {
overflow: hidden; overflow: hidden;
&>.el-submenu__title { & > .el-submenu__title {
padding: 0 !important; padding: 0 !important;
.svg-icon { .svg-icon {
margin-left: 20px; margin-left: 20px;
} }
} }
} }
.el-menu--collapse { .el-menu--collapse {
.el-submenu { .el-submenu {
&>.el-submenu__title { & > .el-submenu__title {
&>span { & > span {
height: 0; height: 0;
width: 0; width: 0;
overflow: hidden; overflow: hidden;
@ -164,11 +187,11 @@
// mobile responsive // mobile responsive
.mobile { .mobile {
.main-container { .main-container {
margin-left: 0px; margin-left: $base-sidebar-width;
} }
.sidebar-container { .sidebar-container {
transition: transform .28s; transition: transform 0.28s;
width: $base-sidebar-width !important; width: $base-sidebar-width !important;
} }
@ -182,7 +205,6 @@
} }
.withoutAnimation { .withoutAnimation {
.main-container, .main-container,
.sidebar-container { .sidebar-container {
transition: none; transition: none;
@ -192,13 +214,13 @@
// when menu collapsed // when menu collapsed
.el-menu--vertical { .el-menu--vertical {
&>.el-menu { & > .el-menu {
.svg-icon { .svg-icon {
margin-right: 16px; margin-right: 16px;
} }
} }
.nest-menu .el-submenu>.el-submenu__title, .nest-menu .el-submenu > .el-submenu__title,
.el-menu-item { .el-menu-item {
&:hover { &:hover {
// you can use $subMenuHover // you can use $subMenuHover
@ -207,7 +229,7 @@
} }
// the scroll bar appears when the subMenu is too long // the scroll bar appears when the subMenu is too long
>.el-menu--popup { > .el-menu--popup {
max-height: 100vh; max-height: 100vh;
overflow-y: auto; overflow-y: auto;

34
acupuncture-前台/src/assets/styles/variables.scss

@ -1,25 +1,25 @@
// base color // base color
$blue:#324157; $blue: #324157;
$light-blue:#3A71A8; $light-blue: #3a71a8;
$red:#C03639; $red: #c03639;
$pink: #E65D6E; $pink: #e65d6e;
$green: #30B08F; $green: #30b08f;
$tiffany: #4AB7BD; $tiffany: #4ab7bd;
$yellow:#FEC171; $yellow: #fec171;
$panGreen: #30B08F; $panGreen: #30b08f;
// 默认菜单主题风格 // 默认菜单主题风格
$base-menu-color:#bfcbd9; $base-menu-color: #c7bdb1;
$base-menu-color-active:#f4f4f5; $base-menu-color-active: #f4f4f5;
$base-menu-background:#304156; $base-menu-background: #70483e;
$base-logo-title-color: #ffffff; $base-logo-title-color: #ffffff;
$base-menu-light-color:rgba(0,0,0,.70); $base-menu-light-color: rgba(0, 0, 0, 0.7);
$base-menu-light-background:#ffffff; $base-menu-light-background: #ffffff;
$base-logo-light-title-color: #001529; $base-logo-light-title-color: #001529;
$base-sub-menu-background:#1f2d3d; $base-sub-menu-background: #5a332a;
$base-sub-menu-hover:#001528; $base-sub-menu-hover: rgba(0, 0, 0, 0.2);
// 自定义暗色菜单风格 // 自定义暗色菜单风格
/** /**
@ -36,7 +36,7 @@ $base-sub-menu-background:#000c17;
$base-sub-menu-hover:#001528; $base-sub-menu-hover:#001528;
*/ */
$base-sidebar-width: 200px; $base-sidebar-width: 90px;
// the :export directive is the magic sauce for webpack // the :export directive is the magic sauce for webpack
// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass // https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
@ -50,5 +50,5 @@ $base-sidebar-width: 200px;
subMenuHover: $base-sub-menu-hover; subMenuHover: $base-sub-menu-hover;
sideBarWidth: $base-sidebar-width; sideBarWidth: $base-sidebar-width;
logoTitleColor: $base-logo-title-color; logoTitleColor: $base-logo-title-color;
logoLightTitleColor: $base-logo-light-title-color logoLightTitleColor: $base-logo-light-title-color;
} }

77
acupuncture-前台/src/components/TopNav/index.vue

@ -5,25 +5,38 @@
@select="handleSelect" @select="handleSelect"
> >
<template v-for="(item, index) in topMenus"> <template v-for="(item, index) in topMenus">
<el-menu-item :style="{'--theme': theme}" :index="item.path" :key="index" v-if="index < visibleNumber"> <el-menu-item
:style="{ '--theme': theme }"
:index="item.path"
:key="index"
v-if="index < visibleNumber"
>
<svg-icon <svg-icon
v-if="item.meta && item.meta.icon && item.meta.icon !== '#'" v-if="item.meta && item.meta.icon && item.meta.icon !== '#'"
:icon-class="item.meta.icon"/> :icon-class="item.meta.icon"
/>
{{ item.meta.title }} {{ item.meta.title }}
</el-menu-item> </el-menu-item>
</template> </template>
<!-- 顶部菜单超出数量折叠 --> <!-- 顶部菜单超出数量折叠 -->
<el-submenu :style="{'--theme': theme}" index="more" :key="visibleNumber" v-if="topMenus.length > visibleNumber"> <el-submenu
:style="{ '--theme': theme }"
index="more"
:key="visibleNumber"
v-if="topMenus.length > visibleNumber"
>
<template slot="title">更多菜单</template> <template slot="title">更多菜单</template>
<template v-for="(item, index) in topMenus"> <template v-for="(item, index) in topMenus">
<el-menu-item <el-menu-item
:index="item.path" :index="item.path"
:key="index" :key="index"
v-if="index >= visibleNumber"> v-if="index >= visibleNumber"
>
<svg-icon <svg-icon
v-if="item.meta && item.meta.icon && item.meta.icon !== '#'" v-if="item.meta && item.meta.icon && item.meta.icon !== '#'"
:icon-class="item.meta.icon"/> :icon-class="item.meta.icon"
/>
{{ item.meta.title }} {{ item.meta.title }}
</el-menu-item> </el-menu-item>
</template> </template>
@ -36,7 +49,7 @@ import { constantRoutes } from "@/router";
import { isHttp } from "@/utils/validate"; import { isHttp } from "@/utils/validate";
// //
const hideList = ['/index', '/user/profile']; const hideList = ["/index", "/user/profile"];
export default { export default {
data() { data() {
@ -44,7 +57,7 @@ export default {
// //
visibleNumber: 5, visibleNumber: 5,
// index // index
currentIndex: undefined currentIndex: undefined,
}; };
}, },
computed: { computed: {
@ -76,11 +89,12 @@ export default {
this.routers.map((router) => { this.routers.map((router) => {
for (var item in router.children) { for (var item in router.children) {
if (router.children[item].parentPath === undefined) { if (router.children[item].parentPath === undefined) {
if(router.path === "/") { if (router.path === "/") {
router.children[item].path = "/" + router.children[item].path; router.children[item].path = "/" + router.children[item].path;
} else { } else {
if(!isHttp(router.children[item].path)) { if (!isHttp(router.children[item].path)) {
router.children[item].path = router.path + "/" + router.children[item].path; router.children[item].path =
router.path + "/" + router.children[item].path;
} }
} }
router.children[item].parentPath = router.path; router.children[item].parentPath = router.path;
@ -94,25 +108,29 @@ export default {
activeMenu() { activeMenu() {
const path = this.$route.path; const path = this.$route.path;
let activePath = path; let activePath = path;
if (path !== undefined && path.lastIndexOf("/") > 0 && hideList.indexOf(path) === -1) { if (
path !== undefined &&
path.lastIndexOf("/") > 0 &&
hideList.indexOf(path) === -1
) {
const tmpPath = path.substring(1, path.length); const tmpPath = path.substring(1, path.length);
if (!this.$route.meta.link) { if (!this.$route.meta.link) {
activePath = "/" + tmpPath.substring(0, tmpPath.indexOf("/")); activePath = "/" + tmpPath.substring(0, tmpPath.indexOf("/"));
this.$store.dispatch('app/toggleSideBarHide', false); this.$store.dispatch("app/toggleSideBarHide", false);
} }
} else if(!this.$route.children) { } else if (!this.$route.children) {
activePath = path; activePath = path;
this.$store.dispatch('app/toggleSideBarHide', true); this.$store.dispatch("app/toggleSideBarHide", true);
} }
this.activeRoutes(activePath); this.activeRoutes(activePath);
return activePath; return activePath;
}, },
}, },
beforeMount() { beforeMount() {
window.addEventListener('resize', this.setVisibleNumber) window.addEventListener("resize", this.setVisibleNumber);
}, },
beforeDestroy() { beforeDestroy() {
window.removeEventListener('resize', this.setVisibleNumber) window.removeEventListener("resize", this.setVisibleNumber);
}, },
mounted() { mounted() {
this.setVisibleNumber(); this.setVisibleNumber();
@ -126,24 +144,24 @@ export default {
// //
handleSelect(key, keyPath) { handleSelect(key, keyPath) {
this.currentIndex = key; this.currentIndex = key;
const route = this.routers.find(item => item.path === key); const route = this.routers.find((item) => item.path === key);
if (isHttp(key)) { if (isHttp(key)) {
// http(s):// // http(s)://
window.open(key, "_blank"); window.open(key, "_blank");
} else if (!route || !route.children) { } else if (!route || !route.children) {
// //
const routeMenu = this.childrenMenus.find(item => item.path === key); const routeMenu = this.childrenMenus.find((item) => item.path === key);
if (routeMenu && routeMenu.query) { if (routeMenu && routeMenu.query) {
let query = JSON.parse(routeMenu.query); let query = JSON.parse(routeMenu.query);
this.$router.push({ path: key, query: query }); this.$router.push({ path: key, query: query });
} else { } else {
this.$router.push({ path: key }); this.$router.push({ path: key });
} }
this.$store.dispatch('app/toggleSideBarHide', true); this.$store.dispatch("app/toggleSideBarHide", true);
} else { } else {
// //
this.activeRoutes(key); this.activeRoutes(key);
this.$store.dispatch('app/toggleSideBarHide', false); this.$store.dispatch("app/toggleSideBarHide", false);
} }
}, },
// //
@ -156,36 +174,35 @@ export default {
} }
}); });
} }
if(routes.length > 0) { if (routes.length > 0) {
this.$store.commit("SET_SIDEBAR_ROUTERS", routes); this.$store.commit("SET_SIDEBAR_ROUTERS", routes);
} else { } else {
this.$store.dispatch('app/toggleSideBarHide', true); this.$store.dispatch("app/toggleSideBarHide", true);
} }
} },
}, },
}; };
</script> </script>
<style lang="scss"> <style lang="scss">
.topmenu-container.el-menu--horizontal > .el-menu-item { .topmenu-container.el-menu--horizontal > .el-menu-item {
line-height: 26px !important;
float: left; float: left;
height: 50px !important;
line-height: 50px !important;
color: #999093 !important; color: #999093 !important;
padding: 0 5px !important; padding: 0 5px !important;
margin: 0 10px !important; margin: 0 10px !important;
} }
.topmenu-container.el-menu--horizontal > .el-menu-item.is-active, .el-menu--horizontal > .el-submenu.is-active .el-submenu__title { .topmenu-container.el-menu--horizontal > .el-menu-item.is-active,
border-bottom: 2px solid #{'var(--theme)'} !important; .el-menu--horizontal > .el-submenu.is-active .el-submenu__title {
border-bottom: 2px solid #{"var(--theme)"} !important;
color: #303133; color: #303133;
} }
/* submenu item */ /* submenu item */
.topmenu-container.el-menu--horizontal > .el-submenu .el-submenu__title { .topmenu-container.el-menu--horizontal > .el-submenu .el-submenu__title {
float: left; float: left;
height: 50px !important; line-height: 26px !important;
line-height: 50px !important;
color: #999093 !important; color: #999093 !important;
padding: 0 5px !important; padding: 0 5px !important;
margin: 0 10px !important; margin: 0 10px !important;

28
acupuncture-前台/src/layout/components/AppMain.vue

@ -10,36 +10,36 @@
</template> </template>
<script> <script>
import iframeToggle from "./IframeToggle/index" import iframeToggle from "./IframeToggle/index";
export default { export default {
name: 'AppMain', name: "AppMain",
components: { iframeToggle }, components: { iframeToggle },
computed: { computed: {
cachedViews() { cachedViews() {
return this.$store.state.tagsView.cachedViews return this.$store.state.tagsView.cachedViews;
}, },
key() { key() {
return this.$route.path return this.$route.path;
} },
}, },
watch: { watch: {
$route() { $route() {
this.addIframe() this.addIframe();
} },
}, },
mounted() { mounted() {
this.addIframe() this.addIframe();
}, },
methods: { methods: {
addIframe() { addIframe() {
const {name} = this.$route const { name } = this.$route;
if (name && this.$route.meta.link) { if (name && this.$route.meta.link) {
this.$store.dispatch('tagsView/addIframeView', this.$route) this.$store.dispatch("tagsView/addIframeView", this.$route);
} }
} },
} },
} };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@ -58,7 +58,7 @@ export default {
.hasTagsView { .hasTagsView {
.app-main { .app-main {
/* 84 = navbar + tags-view = 50 + 34 */ /* 84 = navbar + tags-view = 50 + 34 */
min-height: calc(100vh - 84px); min-height: calc(100vh - 50px);
} }
.fixed-header + .app-main { .fixed-header + .app-main {

34
acupuncture-前台/src/layout/components/Navbar.vue

@ -1,6 +1,6 @@
<template> <template>
<div class="navbar"> <div class="navbar">
<hamburger <!-- <hamburger
id="hamburger-container" id="hamburger-container"
:is-active="sidebar.opened" :is-active="sidebar.opened"
class="hamburger-container" class="hamburger-container"
@ -11,11 +11,14 @@
id="breadcrumb-container" id="breadcrumb-container"
class="breadcrumb-container" class="breadcrumb-container"
v-if="!topNav" v-if="!topNav"
/> /> -->
<div class="logo-title">
朱琏针灸联盟数据系统{{ userInfo.tenantName }}
</div>
<top-nav id="topmenu-container" class="topmenu-container" v-if="topNav" /> <top-nav id="topmenu-container" class="topmenu-container" v-if="topNav" />
<div class="right-menu"> <div class="right-menu">
<template v-if="device !== 'mobile'"> <!-- <template v-if="device !== 'mobile'">
<search id="header-search" class="right-menu-item" /> <search id="header-search" class="right-menu-item" />
<el-tooltip content="源码地址" effect="dark" placement="bottom"> <el-tooltip content="源码地址" effect="dark" placement="bottom">
@ -31,9 +34,8 @@
<el-tooltip content="布局大小" effect="dark" placement="bottom"> <el-tooltip content="布局大小" effect="dark" placement="bottom">
<size-select id="size-select" class="right-menu-item hover-effect" /> <size-select id="size-select" class="right-menu-item hover-effect" />
</el-tooltip> </el-tooltip>
</template> </template> -->
<!-- <el-dropdown
<el-dropdown
class="avatar-container right-menu-item hover-effect" class="avatar-container right-menu-item hover-effect"
trigger="click" trigger="click"
> >
@ -52,7 +54,7 @@
<span>退出登录</span> <span>退出登录</span>
</el-dropdown-item> </el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
</el-dropdown> </el-dropdown> -->
</div> </div>
</div> </div>
</template> </template>
@ -79,6 +81,11 @@ export default {
RuoYiGit, RuoYiGit,
RuoYiDoc, RuoYiDoc,
}, },
data() {
return {
userInfo: {},
};
},
computed: { computed: {
...mapGetters(["sidebar", "avatar", "device"]), ...mapGetters(["sidebar", "avatar", "device"]),
setting: { setting: {
@ -116,11 +123,24 @@ export default {
.catch(() => {}); .catch(() => {});
}, },
}, },
created() {
let userInfo = localStorage.getItem("user");
this.userInfo = userInfo ? JSON.parse(userInfo) : {};
console.log("this.userInfo ", this.userInfo);
},
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.logo-title {
font-size: 20px;
color: #70483e;
line-height: 50px;
margin-left: 20px;
font-weight: 600;
}
.navbar { .navbar {
display: flex;
height: 50px; height: 50px;
overflow: hidden; overflow: hidden;
position: relative; position: relative;

30
acupuncture-前台/src/layout/components/Sidebar/Item.vue

@ -1,33 +1,27 @@
<script> <script>
export default { export default {
name: 'MenuItem', name: "MenuItem",
functional: true, functional: true,
props: { props: {
icon: { icon: {
type: String, type: String,
default: '' default: "",
}, },
title: { title: {
type: String, type: String,
default: '' default: "",
} },
}, },
render(h, context) {
const { icon, title } = context.props
const vnodes = []
if (icon) { render(h, context) {
vnodes.push(<svg-icon icon-class={icon}/>) const { icon, title } = context.props;
} const vnodes = [];
if (title) { if (title) {
if (title.length > 5) { vnodes.push(<span slot="title">{title}</span>);
vnodes.push(<span slot='title' title={(title)}>{(title)}</span>)
} else {
vnodes.push(<span slot='title'>{(title)}</span>)
}
} }
return vnodes
} return vnodes;
} },
};
</script> </script>

70
acupuncture-前台/src/layout/components/Sidebar/Logo.vue

@ -1,45 +1,38 @@
<template> <template>
<div class="sidebar-logo-container" :class="{'collapse':collapse}" :style="{ backgroundColor: sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground }"> <div class="sidebar-logo-container" :class="{ collapse: collapse }">
<transition name="sidebarLogoFade"> <transition name="sidebarLogoFade">
<router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/"> <img v-if="logo" :src="logo" class="sidebar-logo" />
<img v-if="logo" :src="logo" class="sidebar-logo" />
<h1 v-else class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1>
</router-link>
<router-link v-else key="expand" class="sidebar-logo-link" to="/">
<img v-if="logo" :src="logo" class="sidebar-logo" />
<h1 class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1>
</router-link>
</transition> </transition>
</div> </div>
</template> </template>
<script> <script>
import logoImg from '@/assets/logo/logo.png' import logoImg from "@/assets/images/zj.png";
import variables from '@/assets/styles/variables.scss' import variables from "@/assets/styles/variables.scss";
export default { export default {
name: 'SidebarLogo', name: "SidebarLogo",
props: { props: {
collapse: { collapse: {
type: Boolean, type: Boolean,
required: true required: true,
} },
}, },
computed: { computed: {
variables() { variables() {
return variables; return variables;
}, },
sideTheme() { sideTheme() {
return this.$store.state.settings.sideTheme return this.$store.state.settings.sideTheme;
} },
}, },
data() { data() {
return { return {
title: process.env.VUE_APP_TITLE, title: process.env.VUE_APP_TITLE,
logo: logoImg logo: logoImg,
} };
} },
} };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@ -51,37 +44,16 @@ export default {
.sidebarLogoFade-leave-to { .sidebarLogoFade-leave-to {
opacity: 0; opacity: 0;
} }
.sidebar-logo-container { .sidebar-logo-container {
margin-top: 10px;
position: relative; position: relative;
width: 100%; border-radius: 4px;
height: 50px; display: flex;
line-height: 50px; justify-content: center;
background: #2b2f3a; align-items: center;
text-align: center; img {
overflow: hidden; width: 40px;
height: 40px;
& .sidebar-logo-link {
height: 100%;
width: 100%;
& .sidebar-logo {
width: 32px;
height: 32px;
vertical-align: middle;
margin-right: 12px;
}
& .sidebar-title {
display: inline-block;
margin: 0;
color: #fff;
font-weight: 600;
line-height: 50px;
font-size: 14px;
font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;
vertical-align: middle;
}
} }
&.collapse { &.collapse {

184
acupuncture-前台/src/layout/components/Sidebar/SidebarItem.vue

@ -1,16 +1,54 @@
<template> <template>
<div v-if="!item.hidden"> <div v-if="!item.hidden">
<template v-if="hasOneShowingChild(item.children,item) && (!onlyOneChild.children||onlyOneChild.noShowingChildren)&&!item.alwaysShow"> <template
<app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path, onlyOneChild.query)"> v-if="
<el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{'submenu-title-noDropdown':!isNest}"> hasOneShowingChild(item.children, item) &&
<item :icon="onlyOneChild.meta.icon||(item.meta&&item.meta.icon)" :title="onlyOneChild.meta.title" /> (!onlyOneChild.children || onlyOneChild.noShowingChildren) &&
!item.alwaysShow
"
>
<app-link
v-if="onlyOneChild.meta"
:to="resolvePath(onlyOneChild.path, onlyOneChild.query)"
>
<el-menu-item
:index="resolvePath(onlyOneChild.path)"
:class="{ 'submenu-title-noDropdown': !isNest }"
>
<div v-if="itmeIcon[onlyOneChild.meta.title]" class="div-img">
<img :src="itmeIcon[onlyOneChild.meta.title]" alt="" />
</div>
<div v-if="itmeIcon[onlyOneChild.meta.title]" class="div-img-gl">
<img :src="itmeIcon1[onlyOneChild.meta.title]" alt="" />
</div>
<item
:icon="onlyOneChild.meta.icon || (item.meta && item.meta.icon)"
:title="onlyOneChild.meta.title"
/>
</el-menu-item> </el-menu-item>
</app-link> </app-link>
</template> </template>
<el-submenu v-else ref="subMenu" :index="resolvePath(item.path)" popper-append-to-body> <el-submenu
v-else
ref="subMenu"
:index="resolvePath(item.path)"
popper-append-to-body
>
<template slot="title"> <template slot="title">
<item v-if="item.meta" :icon="item.meta && item.meta.icon" :title="item.meta.title" /> <div class="header">
<div v-if="itmeIcon[item.meta.title]" class="div-img">
<img :src="itmeIcon[item.meta.title]" alt="" />
</div>
<div v-if="itmeIcon1[item.meta.title]" class="div-img-gl">
<img :src="itmeIcon[item.meta.title]" alt="" />
</div>
<item
v-if="item.meta"
:icon="item.meta && item.meta.icon"
:title="item.meta.title"
/>
</div>
</template> </template>
<sidebar-item <sidebar-item
v-for="(child, index) in item.children" v-for="(child, index) in item.children"
@ -25,75 +63,151 @@
</template> </template>
<script> <script>
import path from 'path' import path from "path";
import { isExternal } from '@/utils/validate' import { isExternal } from "@/utils/validate";
import Item from './Item' import Item from "./Item";
import AppLink from './Link' import AppLink from "./Link";
import FixiOSBug from './FixiOSBug' import FixiOSBug from "./FixiOSBug";
export default { export default {
name: 'SidebarItem', name: "SidebarItem",
components: { Item, AppLink }, components: { Item, AppLink },
mixins: [FixiOSBug], mixins: [FixiOSBug],
props: { props: {
// route object // route object
item: { item: {
type: Object, type: Object,
required: true required: true,
}, },
isNest: { isNest: {
type: Boolean, type: Boolean,
default: false default: false,
}, },
basePath: { basePath: {
type: String, type: String,
default: '' default: "",
} },
sideTheme: {},
}, },
data() { data() {
this.onlyOneChild = null this.onlyOneChild = null;
return {} return {
itmeIcon: {
首页: require("@/assets/images/home_N@1x.png"),
患者档案: require("@/assets/images/dangan_n@1x.png"),
诊疗档案: require("@/assets/images/zhenliao_n@1x.png"),
随访档案: require("@/assets/images/suifang_n@1x.png"),
我的: require("@/assets/images/me_n@1x.png"),
},
itmeIcon1: {
首页: require("@/assets/images/home_S@1x.png"),
患者档案: require("@/assets/images/dangan_s@1x.png"),
诊疗档案: require("@/assets/images/zhenliao_s@1x.png"),
随访档案: require("@/assets/images/suifang_s@1x.png"),
我的: require("@/assets/images/me_s@1x.png"),
},
};
}, },
methods: { methods: {
hasOneShowingChild(children = [], parent) { hasOneShowingChild(children = [], parent) {
if (!children) { if (!children) {
children = []; children = [];
} }
const showingChildren = children.filter(item => { const showingChildren = children.filter((item) => {
if (item.hidden) { if (item.hidden) {
return false return false;
} }
// Temp set(will be used if only has one showing child) // Temp set(will be used if only has one showing child)
this.onlyOneChild = item this.onlyOneChild = item;
return true return true;
}) });
// When there is only one child router, the child router is displayed by default // When there is only one child router, the child router is displayed by default
if (showingChildren.length === 1) { if (showingChildren.length === 1) {
return true return true;
} }
// Show parent if there are no child router to display // Show parent if there are no child router to display
if (showingChildren.length === 0) { if (showingChildren.length === 0) {
this.onlyOneChild = { ... parent, path: '', noShowingChildren: true } this.onlyOneChild = { ...parent, path: "", noShowingChildren: true };
return true return true;
} }
return false return false;
}, },
resolvePath(routePath, routeQuery) { resolvePath(routePath, routeQuery) {
if (isExternal(routePath)) { if (isExternal(routePath)) {
return routePath return routePath;
} }
if (isExternal(this.basePath)) { if (isExternal(this.basePath)) {
return this.basePath return this.basePath;
} }
if (routeQuery) { if (routeQuery) {
let query = JSON.parse(routeQuery); let query = JSON.parse(routeQuery);
return { path: path.resolve(this.basePath, routePath), query: query } return { path: path.resolve(this.basePath, routePath), query: query };
} }
return path.resolve(this.basePath, routePath) return path.resolve(this.basePath, routePath);
} },
} },
} };
</script> </script>
<style scoped>
.div-img-gl {
display: none;
}
.nest-menu .el-menu-item {
height: 40px !important;
line-height: 40px !important;
margin-bottom: 5px;
}
#app .sidebar-container .nest-menu .is-active {
background-color: #fff !important;
}
#app .sidebar-container .nest-menu .el-menu-item {
padding: 0 !important;
min-width: 60px !important;
}
#app .sidebar-container .nest-menu .is-active:hover {
color: #fff !important;
}
>>> .el-submenu__title {
padding: 0 !important;
height: 90px !important;
line-height: 26px !important;
}
>>> .el-submenu.is-active .el-submenu__title .header {
border-radius: 6px;
color: #fff;
}
>>> .el-submenu .el-submenu__title .header {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
>>> .el-submenu .el-submenu__title .el-icon-arrow-down {
display: none;
}
</style>
<style>
#app .sidebar-container .theme-dark .is-active > .el-submenu__title {
color: #70483e !important;
background-color: #70483e !important;
}
#app .sidebar-container .theme-dark .is-active {
background-color: #5a332a;
}
#app .sidebar-container .el-menu {
box-sizing: border-box;
padding: 6px !important;
}
#app .sidebar-container .el-submenu .el-menu--inline {
padding: 0px !important;
background-color: #5a332a;
}
#app .sidebar-container .el-submenu__title:hover .header {
background-color: #5a3a32 !important;
}
</style>

118
acupuncture-前台/src/layout/components/Sidebar/index.vue

@ -1,26 +1,42 @@
<template> <template>
<div :class="{'has-logo':showLogo}" :style="{ backgroundColor: settings.sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground }"> <div
<logo v-if="showLogo" :collapse="isCollapse" /> :class="{ 'has-logo': showLogo }"
<el-scrollbar :class="settings.sideTheme" wrap-class="scrollbar-wrapper"> :style="{
<el-menu backgroundColor:
:default-active="activeMenu" settings.sideTheme === 'theme-dark'
:collapse="isCollapse" ? variables.menuBackground
:background-color="settings.sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground" : variables.menuLightBackground,
:text-color="settings.sideTheme === 'theme-dark' ? variables.menuColor : variables.menuLightColor" }"
:unique-opened="true" >
:active-text-color="settings.theme" <logo v-if="showLogo" :collapse="isCollapse" />
:collapse-transition="false" <el-scrollbar :class="settings.sideTheme" wrap-class="scrollbar-wrapper">
mode="vertical" <el-menu
> :default-active="activeMenu"
<sidebar-item :collapse="isCollapse"
v-for="(route, index) in sidebarRouters" :background-color="
:key="route.path + index" settings.sideTheme === 'theme-dark'
:item="route" ? variables.menuBackground
:base-path="route.path" : variables.menuLightBackground
/> "
</el-menu> :text-color="
</el-scrollbar> settings.sideTheme === 'theme-dark'
</div> ? variables.menuColor
: variables.menuLightColor
"
:unique-opened="true"
:active-text-color="settings.theme"
:collapse-transition="false"
mode="vertical"
>
<sidebar-item
v-for="(route, index) in sidebarRouters"
:key="route.path + index"
:item="route"
:base-path="route.path"
/>
</el-menu>
</el-scrollbar>
</div>
</template> </template>
<script> <script>
@ -30,28 +46,40 @@ import SidebarItem from "./SidebarItem";
import variables from "@/assets/styles/variables.scss"; import variables from "@/assets/styles/variables.scss";
export default { export default {
components: { SidebarItem, Logo }, components: { SidebarItem, Logo },
computed: { computed: {
...mapState(["settings"]), ...mapState(["settings"]),
...mapGetters(["sidebarRouters", "sidebar"]), ...mapGetters(["sidebarRouters", "sidebar"]),
activeMenu() { activeMenu() {
const route = this.$route; const route = this.$route;
const { meta, path } = route; const { meta, path } = route;
// if set path, the sidebar will highlight the path you set // if set path, the sidebar will highlight the path you set
if (meta.activeMenu) { if (meta.activeMenu) {
return meta.activeMenu; return meta.activeMenu;
} }
return path; return path;
}, },
showLogo() { showLogo() {
return this.$store.state.settings.sidebarLogo; return this.$store.state.settings.sidebarLogo;
}, },
variables() { variables() {
return variables; return variables;
}, },
isCollapse() { isCollapse() {
return !this.sidebar.opened; return !this.sidebar.opened;
} },
} },
}; };
</script> </script>
<style scoped>
>>> .is-active {
border-radius: 6px;
background-color: #fff !important;
}
>>> .is-active .div-img {
display: none;
}
>>> .is-active .div-img-gl {
display: block;
}
</style>

143
acupuncture-前台/src/layout/index.vue

@ -1,111 +1,122 @@
<template> <template>
<div :class="classObj" class="app-wrapper" :style="{'--current-color': theme}"> <div
<div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside"/> :class="classObj"
<sidebar v-if="!sidebar.hide" class="sidebar-container"/> class="app-wrapper"
<div :class="{hasTagsView:needTagsView,sidebarHide:sidebar.hide}" class="main-container"> :style="{ '--current-color': theme }"
<div :class="{'fixed-header':fixedHeader}"> >
<navbar/> <!-- <div
<tags-view v-if="needTagsView"/> v-if="device === 'mobile' && sidebar.opened"
class="drawer-bg"
@click="handleClickOutside"
/> -->
<sidebar v-if="!sidebar.hide" class="sidebar-container" />
<div
:class="{ hasTagsView: needTagsView, sidebarHide: sidebar.hide }"
class="main-container"
>
<div :class="{ 'fixed-header': fixedHeader }">
<navbar />
<!-- <tags-view v-if="needTagsView"/> -->
</div> </div>
<app-main/> <app-main />
<right-panel> <right-panel>
<settings/> <settings />
</right-panel> </right-panel>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import RightPanel from '@/components/RightPanel' import RightPanel from "@/components/RightPanel";
import { AppMain, Navbar, Settings, Sidebar, TagsView } from './components' import { AppMain, Navbar, Settings, Sidebar, TagsView } from "./components";
import ResizeMixin from './mixin/ResizeHandler' import ResizeMixin from "./mixin/ResizeHandler";
import { mapState } from 'vuex' import { mapState } from "vuex";
import variables from '@/assets/styles/variables.scss' import variables from "@/assets/styles/variables.scss";
export default { export default {
name: 'Layout', name: "Layout",
components: { components: {
AppMain, AppMain,
Navbar, Navbar,
RightPanel, RightPanel,
Settings, Settings,
Sidebar, Sidebar,
TagsView TagsView,
}, },
mixins: [ResizeMixin], mixins: [ResizeMixin],
computed: { computed: {
...mapState({ ...mapState({
theme: state => state.settings.theme, theme: (state) => state.settings.theme,
sideTheme: state => state.settings.sideTheme, sideTheme: (state) => state.settings.sideTheme,
sidebar: state => state.app.sidebar, sidebar: (state) => state.app.sidebar,
device: state => state.app.device, device: (state) => state.app.device,
needTagsView: state => state.settings.tagsView, needTagsView: (state) => state.settings.tagsView,
fixedHeader: state => state.settings.fixedHeader fixedHeader: (state) => state.settings.fixedHeader,
}), }),
classObj() { classObj() {
return { return {
hideSidebar: !this.sidebar.opened, hideSidebar: !this.sidebar.opened,
openSidebar: this.sidebar.opened, openSidebar: this.sidebar.opened,
withoutAnimation: this.sidebar.withoutAnimation, withoutAnimation: this.sidebar.withoutAnimation,
mobile: this.device === 'mobile' mobile: this.device === "mobile",
} };
}, },
variables() { variables() {
return variables; return variables;
} },
}, },
methods: { methods: {
handleClickOutside() { handleClickOutside() {
this.$store.dispatch('app/closeSideBar', { withoutAnimation: false }) this.$store.dispatch("app/closeSideBar", { withoutAnimation: false });
} },
} },
} };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "~@/assets/styles/mixin.scss"; @import "~@/assets/styles/mixin.scss";
@import "~@/assets/styles/variables.scss"; @import "~@/assets/styles/variables.scss";
.app-wrapper { .app-wrapper {
@include clearfix; @include clearfix;
position: relative; position: relative;
height: 100%; height: 100%;
width: 100%; width: 100%;
&.mobile.openSidebar { &.mobile.openSidebar {
position: fixed;
top: 0;
}
}
.drawer-bg {
background: #000;
opacity: 0.3;
width: 100%;
top: 0;
height: 100%;
position: absolute;
z-index: 999;
}
.fixed-header {
position: fixed; position: fixed;
top: 0; top: 0;
right: 0;
z-index: 9;
width: calc(100% - #{$base-sidebar-width});
transition: width 0.28s;
} }
}
.hideSidebar .fixed-header { .drawer-bg {
width: calc(100% - 54px); background: #000;
} opacity: 0.3;
width: 100%;
top: 0;
height: 100%;
position: absolute;
z-index: 999;
}
.sidebarHide .fixed-header { .fixed-header {
width: 100%; position: fixed;
} top: 0;
right: 0;
z-index: 9;
width: calc(100% - #{$base-sidebar-width});
transition: width 0.28s;
}
.mobile .fixed-header { .hideSidebar .fixed-header {
width: 100%; width: calc(100% - 54px);
} }
.sidebarHide .fixed-header {
width: 100%;
}
.mobile .fixed-header {
width: 100%;
}
</style> </style>

5
acupuncture-前台/src/main.js

@ -12,7 +12,8 @@ import store from './store'
import router from './router' import router from './router'
import directive from './directive' // directive import directive from './directive' // directive
import plugins from './plugins' // plugins import plugins from './plugins' // plugins
import { download } from '@/utils/request' import { download, download1} from '@/utils/request'
import moment from 'moment';
import './assets/icons' // icon import './assets/icons' // icon
import './permission' // permission control import './permission' // permission control
@ -47,7 +48,9 @@ Vue.prototype.addDateRange = addDateRange
Vue.prototype.selectDictLabel = selectDictLabel Vue.prototype.selectDictLabel = selectDictLabel
Vue.prototype.selectDictLabels = selectDictLabels Vue.prototype.selectDictLabels = selectDictLabels
Vue.prototype.download = download Vue.prototype.download = download
Vue.prototype.download1 = download1
Vue.prototype.handleTree = handleTree Vue.prototype.handleTree = handleTree
Vue.prototype.$moment = moment
// 全局组件挂载 // 全局组件挂载
Vue.component('DictTag', DictTag) Vue.component('DictTag', DictTag)

26
acupuncture-前台/src/router/index.js

@ -77,13 +77,13 @@ export const constantRoutes = [
{ {
path: "/patientFile", path: "/patientFile",
component: Layout, component: Layout,
redirect: "index", redirect: "patientFile",
children: [ children: [
{ {
path: "/patientIndex", path: "/patientIndex",
component: () => import("@/views/patientFile/index"), component: () => import("@/views/patientFile/index"),
name: "Index", name: "patientIndex",
meta: { title: "患者档案", icon: "dashboard", }, meta: { title: "患者档案", icon: "dashboard" },
}, },
], ],
}, },
@ -96,13 +96,20 @@ export const constantRoutes = [
path: "/medicalIndex", path: "/medicalIndex",
component: () => import("@/views/medicalFile/index"), component: () => import("@/views/medicalFile/index"),
name: "medicalIndex", name: "medicalIndex",
meta: { title: "诊疗档案", icon: "dashboard", }, meta: { title: "诊疗档案", icon: "dashboard" },
},
{
path: "/medicalDetails",
component: () => import("@/views/medicalFile/details"),
name: "medicalDetails",
hidden: true,
meta: { title: "诊疗信息", icon: "dashboard" },
}, },
], ],
}, },
{ {
path: "/followFile", path: "/followFile",
meta: { title: "随访档案", icon: "dashboard", }, meta: { title: "随访档案", icon: "dashboard" },
component: Layout, component: Layout,
redirect: "followFile", redirect: "followFile",
children: [ children: [
@ -110,33 +117,32 @@ export const constantRoutes = [
path: "/followIndex", path: "/followIndex",
component: () => import("@/views/followFile/index"), component: () => import("@/views/followFile/index"),
name: "followIndex", name: "followIndex",
meta: { title: "随访队列", icon: "dashboard", }, meta: { title: "随访队列", icon: "dashboard" },
}, },
{ {
path: "/followSubjects", path: "/followSubjects",
component: () => import("@/views/followFile/subjects"), component: () => import("@/views/followFile/subjects"),
name: "followSubjects", name: "followSubjects",
meta: { title: "随访对象", icon: "dashboard", }, meta: { title: "随访对象", icon: "dashboard" },
}, },
{ {
path: "/followWork", path: "/followWork",
component: () => import("@/views/followFile/work"), component: () => import("@/views/followFile/work"),
name: "followWork", name: "followWork",
meta: { title: "随访工单", icon: "dashboard", }, meta: { title: "随访工单", icon: "dashboard" },
}, },
], ],
}, },
{ {
path: "/user", path: "/user",
component: Layout, component: Layout,
hidden: true,
redirect: "noredirect", redirect: "noredirect",
children: [ children: [
{ {
path: "profile", path: "profile",
component: () => import("@/views/system/user/profile/index"), component: () => import("@/views/system/user/profile/index"),
name: "Profile", name: "Profile",
meta: { title: "个人中心", icon: "user" }, meta: { title: "我的", icon: "user" },
}, },
], ],
}, },

62
acupuncture-前台/src/store/modules/app.js

@ -1,66 +1,68 @@
import Cookies from 'js-cookie' import Cookies from "js-cookie";
const state = { const state = {
sidebar: { sidebar: {
opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true, opened: Cookies.get("sidebarStatus")
? !!+Cookies.get("sidebarStatus")
: true,
withoutAnimation: false, withoutAnimation: false,
hide: false hide: false,
}, },
device: 'desktop', device: "desktop",
size: Cookies.get('size') || 'medium' size: Cookies.get("size") || "medium",
} };
const mutations = { const mutations = {
TOGGLE_SIDEBAR: state => { TOGGLE_SIDEBAR: (state) => {
if (state.sidebar.hide) { if (state.sidebar.hide) {
return false; return true;
} }
state.sidebar.opened = !state.sidebar.opened state.sidebar.opened = true;
state.sidebar.withoutAnimation = false state.sidebar.withoutAnimation = true;
if (state.sidebar.opened) { if (state.sidebar.opened) {
Cookies.set('sidebarStatus', 1) Cookies.set("sidebarStatus", 1);
} else { } else {
Cookies.set('sidebarStatus', 0) Cookies.set("sidebarStatus", 1);
} }
}, },
CLOSE_SIDEBAR: (state, withoutAnimation) => { CLOSE_SIDEBAR: (state, withoutAnimation) => {
Cookies.set('sidebarStatus', 0) Cookies.set("sidebarStatus", 1);
state.sidebar.opened = false state.sidebar.opened = true;
state.sidebar.withoutAnimation = withoutAnimation state.sidebar.withoutAnimation = false;
}, },
TOGGLE_DEVICE: (state, device) => { TOGGLE_DEVICE: (state, device) => {
state.device = device state.device = device;
}, },
SET_SIZE: (state, size) => { SET_SIZE: (state, size) => {
state.size = size state.size = size;
Cookies.set('size', size) Cookies.set("size", size);
}, },
SET_SIDEBAR_HIDE: (state, status) => { SET_SIDEBAR_HIDE: (state, status) => {
state.sidebar.hide = status state.sidebar.hide = status;
} },
} };
const actions = { const actions = {
toggleSideBar({ commit }) { toggleSideBar({ commit }) {
commit('TOGGLE_SIDEBAR') commit("TOGGLE_SIDEBAR");
}, },
closeSideBar({ commit }, { withoutAnimation }) { closeSideBar({ commit }, { withoutAnimation }) {
commit('CLOSE_SIDEBAR', withoutAnimation) commit("CLOSE_SIDEBAR", withoutAnimation);
}, },
toggleDevice({ commit }, device) { toggleDevice({ commit }, device) {
commit('TOGGLE_DEVICE', device) commit("TOGGLE_DEVICE", device);
}, },
setSize({ commit }, size) { setSize({ commit }, size) {
commit('SET_SIZE', size) commit("SET_SIZE", size);
}, },
toggleSideBarHide({ commit }, status) { toggleSideBarHide({ commit }, status) {
commit('SET_SIDEBAR_HIDE', status) commit("SET_SIDEBAR_HIDE", status);
} },
} };
export default { export default {
namespaced: true, namespaced: true,
state, state,
mutations, mutations,
actions actions,
} };

4
acupuncture-前台/src/store/modules/permission.js

@ -34,8 +34,8 @@ const permission = {
return new Promise((resolve) => { return new Promise((resolve) => {
// 向后端请求路由数据 // 向后端请求路由数据
getRouters().then((res) => { getRouters().then((res) => {
const sdata = JSON.parse(JSON.stringify(res.data)); const sdata = JSON.parse(JSON.stringify([]));
const rdata = JSON.parse(JSON.stringify(res.data)); const rdata = JSON.parse(JSON.stringify([]));
const sidebarRoutes = filterAsyncRouter(sdata); const sidebarRoutes = filterAsyncRouter(sdata);
const rewriteRoutes = filterAsyncRouter(rdata, false, true); const rewriteRoutes = filterAsyncRouter(rdata, false, true);
const asyncRoutes = filterDynamicRoutes(dynamicRoutes); const asyncRoutes = filterDynamicRoutes(dynamicRoutes);

57
acupuncture-前台/src/store/modules/settings.js

@ -1,42 +1,59 @@
import defaultSettings from '@/settings' import defaultSettings from "@/settings";
const { sideTheme, showSettings, topNav, tagsView, fixedHeader, sidebarLogo, dynamicTitle } = defaultSettings const {
sideTheme,
showSettings,
topNav,
tagsView,
fixedHeader,
sidebarLogo,
dynamicTitle,
} = defaultSettings;
const storageSetting = JSON.parse(localStorage.getItem('layout-setting')) || '' const storageSetting = JSON.parse(localStorage.getItem("layout-setting")) || "";
const state = { const state = {
title: '', title: "",
theme: storageSetting.theme || '#409EFF', theme: "#70483E",
sideTheme: storageSetting.sideTheme || sideTheme, sideTheme: storageSetting.sideTheme || sideTheme,
showSettings: showSettings, showSettings: showSettings,
topNav: storageSetting.topNav === undefined ? topNav : storageSetting.topNav, topNav: storageSetting.topNav === undefined ? topNav : storageSetting.topNav,
tagsView: storageSetting.tagsView === undefined ? tagsView : storageSetting.tagsView, tagsView:
fixedHeader: storageSetting.fixedHeader === undefined ? fixedHeader : storageSetting.fixedHeader, storageSetting.tagsView === undefined ? tagsView : storageSetting.tagsView,
sidebarLogo: storageSetting.sidebarLogo === undefined ? sidebarLogo : storageSetting.sidebarLogo, fixedHeader:
dynamicTitle: storageSetting.dynamicTitle === undefined ? dynamicTitle : storageSetting.dynamicTitle storageSetting.fixedHeader === undefined
} ? fixedHeader
: storageSetting.fixedHeader,
sidebarLogo:
storageSetting.sidebarLogo === undefined
? sidebarLogo
: storageSetting.sidebarLogo,
dynamicTitle:
storageSetting.dynamicTitle === undefined
? dynamicTitle
: storageSetting.dynamicTitle,
};
const mutations = { const mutations = {
CHANGE_SETTING: (state, { key, value }) => { CHANGE_SETTING: (state, { key, value }) => {
if (state.hasOwnProperty(key)) { if (state.hasOwnProperty(key)) {
state[key] = value state[key] = value;
} }
} },
} };
const actions = { const actions = {
// 修改布局设置 // 修改布局设置
changeSetting({ commit }, data) { changeSetting({ commit }, data) {
commit('CHANGE_SETTING', data) commit("CHANGE_SETTING", data);
}, },
// 设置网页标题 // 设置网页标题
setTitle({ commit }, title) { setTitle({ commit }, title) {
state.title = title state.title = title;
} },
} };
export default { export default {
namespaced: true, namespaced: true,
state, state,
mutations, mutations,
actions actions,
} };

1
acupuncture-前台/src/store/modules/user.js

@ -57,6 +57,7 @@ const user = {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
getInfo().then(res => { getInfo().then(res => {
const user = res.user const user = res.user
localStorage.setItem("user", JSON.stringify(user))
let avatar = user.avatar || "" let avatar = user.avatar || ""
if (!isHttp(avatar)) { if (!isHttp(avatar)) {
avatar = (isEmpty(avatar)) ? defAva : process.env.VUE_APP_BASE_API + avatar avatar = (isEmpty(avatar)) ? defAva : process.env.VUE_APP_BASE_API + avatar

33
acupuncture-前台/src/utils/request.js

@ -148,5 +148,38 @@ export function download(url, params, filename, config) {
downloadLoadingInstance.close(); downloadLoadingInstance.close();
}) })
} }
// 通用下载方法
export function download1(url, params, filename, config) {
downloadLoadingInstance = Loading.service({
text: "正在下载数据,请稍候",
spinner: "el-icon-loading",
background: "rgba(0, 0, 0, 0.7)",
});
return service
.post(url, params, {
headers: { "Content-Type": "application/json;charset=utf-8" },
responseType: "blob",
})
.then(async (data) => {
const isBlob = blobValidate(data);
if (isBlob) {
const blob = new Blob([data]);
saveAs(blob, filename);
} else {
const resText = await data.text();
const rspObj = JSON.parse(resText);
const errMsg =
errorCode[rspObj.code] || rspObj.msg || errorCode["default"];
Message.error(errMsg);
}
downloadLoadingInstance.close();
})
.catch((r) => {
console.error(r);
Message.error("下载文件出现错误,请联系管理员!");
downloadLoadingInstance.close();
});
}
export default service export default service

BIN
acupuncture-前台/src/views/bg.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 983 KiB

67
acupuncture-前台/src/views/followFile/index.vue

@ -70,6 +70,7 @@
align="center" align="center"
prop="name" prop="name"
min-width="130" min-width="130"
fixed
/> />
<el-table-column <el-table-column
label="随访方式" label="随访方式"
@ -110,6 +111,20 @@
show-overflow-tooltip show-overflow-tooltip
min-width="100" min-width="100"
/> />
<el-table-column
label="临近提醒时间(天)"
align="center"
prop="remindTime"
show-overflow-tooltip
min-width="130"
/>
<el-table-column
label="窗口期"
align="center"
prop="followWindowAdys"
show-overflow-tooltip
min-width="100"
/>
<el-table-column <el-table-column
label="状态" label="状态"
align="center" align="center"
@ -118,14 +133,27 @@
min-width="100" min-width="100"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.status == 0" style="color: red">禁用</span> <span v-if="scope.row.status == 0" style="color: #f56c6c">禁用</span>
<span v-if="scope.row.status == 1" style="color: green">启用</span> <span v-else style="color: #67c23a">启用</span>
</template>
</el-table-column>
<el-table-column
label="类型"
align="center"
show-overflow-tooltip
min-width="100"
>
<template slot-scope="scope">
<span v-if="scope.row.type == 1">公共队列</span>
<span v-else-if="scope.row.status == 1" style="color: #67c23a"
>本院队列</span
>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
label="创建人/创建时间" label="创建人/创建时间"
align="center" align="center"
min-width="130" min-width="140"
fixed="right" fixed="right"
> >
<template slot-scope="scope"> <template slot-scope="scope">
@ -142,6 +170,7 @@
type="text" type="text"
icon="el-icon-edit" icon="el-icon-edit"
@click="handleUpdate(scope.row)" @click="handleUpdate(scope.row)"
:disabled="scope.row.type == 1"
>修改</el-button >修改</el-button
> >
<el-button <el-button
@ -149,6 +178,7 @@
type="text" type="text"
icon="el-icon-delete" icon="el-icon-delete"
@click="handleDelete(scope.row)" @click="handleDelete(scope.row)"
:disabled="scope.row.type == 1"
>删除</el-button >删除</el-button
> >
</template> </template>
@ -176,7 +206,7 @@
ref="form" ref="form"
:model="form" :model="form"
:rules="rules" :rules="rules"
label-width="90px" label-width="130px"
> >
<el-form-item label="队列名称" prop="name"> <el-form-item label="队列名称" prop="name">
<el-input v-model="form.name" placeholder="请输入" /> <el-input v-model="form.name" placeholder="请输入" />
@ -212,6 +242,12 @@
<el-form-item label="总月数" prop="followupMonth"> <el-form-item label="总月数" prop="followupMonth">
<el-input v-model="form.followupMonth" placeholder="请输入" /> <el-input v-model="form.followupMonth" placeholder="请输入" />
</el-form-item> </el-form-item>
<el-form-item label="临近提醒时间(天)" prop="remindTime">
<el-input v-model="form.remindTime" placeholder="请输入" />
</el-form-item>
<el-form-item label="窗口期" prop="followWindowAdys">
<el-input v-model="form.followWindowAdys" placeholder="请输入" />
</el-form-item>
<el-form-item label="状态" prop="status"> <el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status"> <el-radio-group v-model="form.status">
<el-radio :label="1">启用</el-radio> <el-radio :label="1">启用</el-radio>
@ -247,6 +283,7 @@ import {
followupAdd, followupAdd,
followupUpd, followupUpd,
followupDel, followupDel,
commonQueue,
} from "@/api/followupFile"; } from "@/api/followupFile";
export default { export default {
name: "Notice", name: "Notice",
@ -274,12 +311,17 @@ export default {
label: "台湾居民来往大陆通行证", label: "台湾居民来往大陆通行证",
value: 3, value: 3,
}, },
{
label: "其他",
value: 4,
},
], ],
idCardTypeValue: { idCardTypeValue: {
0: "身份证", 0: "身份证",
1: "护照或外国人永居证", 1: "护照或外国人永居证",
2: "港澳居民来往内地通行", 2: "港澳居民来往内地通行",
3: "台湾居民来往大陆通行证", 3: "台湾居民来往大陆通行证",
4: "其他",
}, },
loading: false, // loading: false, //
ids: [], // ids: [], //
@ -317,6 +359,18 @@ export default {
frequency: [ frequency: [
{ required: true, message: "随访频次不能为空", trigger: "blur" }, { required: true, message: "随访频次不能为空", trigger: "blur" },
], ],
followupMonth: [
{ required: true, message: "总月数不能为空", trigger: "blur" },
],
followWindowAdys: [
{ required: true, message: "窗口期不能为空", trigger: "blur" },
],
remindTime: [
{ required: true, message: "临近提醒时间不能为空", trigger: "blur" },
],
frequency: [
{ required: true, message: "随访频次不能为空", trigger: "blur" },
],
status: [{ required: true, message: "状态不能为空", trigger: "blur" }], status: [{ required: true, message: "状态不能为空", trigger: "blur" }],
}, },
}; };
@ -334,11 +388,16 @@ export default {
crontabFill(value) { crontabFill(value) {
this.form.frequency = value; this.form.frequency = value;
}, },
/** 查询公告列表 */ /** 查询公告列表 */
getList() { getList() {
this.loading = true; this.loading = true;
followupQuery(this.queryParams).then((res) => { followupQuery(this.queryParams).then((res) => {
let commonQueue = JSON.parse(localStorage.getItem("commonQueue"));
this.listDat = res.data.list; this.listDat = res.data.list;
commonQueue?.forEach((i) => {
this.listDat.unshift(i);
});
this.total = res.data.total; this.total = res.data.total;
this.loading = false; this.loading = false;
}); });

685
acupuncture-前台/src/views/followFile/subjects.vue

@ -1,397 +1,326 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch"
:model="queryParams" label-width="68px">
ref="queryForm" <el-form-item label="随访队列" prop="queueId">
size="small" <el-select v-model="queryParams.param.queueId" clearable placeholder="请选择">
:inline="true" <el-option v-for="item in followupList" :key="item.id" :label="item.name" :value="item.id">
v-show="showSearch" </el-option>
label-width="68px" </el-select>
> </el-form-item>
<el-form-item label="随访队列" prop="queueId"> <el-form-item label="" prop="queueId">
<el-select v-model="queryParams.param.queueId" placeholder="请选择"> <el-checkbox-group v-model="haveQueue">
<el-option <el-checkbox >未参加队列人员</el-checkbox>
v-for="item in followupList" </el-checkbox-group>
:key="item.id" </el-form-item>
:label="item.name" <el-form-item>
:value="item.id" <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
> <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">
</el-option> 重置
</el-select> </el-button>
</el-form-item> </el-form-item>
<el-form-item> </el-form>
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>搜索</el-button
>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">
重置
</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<right-toolbar <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
:showSearch.sync="showSearch" </el-row>
@queryTable="getList"
></right-toolbar>
</el-row>
<el-table <el-table v-loading="loading" :data="listDat" @selection-change="handleSelectionChange" max-height="600">
v-loading="loading" <el-table-column type="selection" width="55" align="center" />
:data="listDat" <el-table-column label="姓名" align="center" prop="name" width="100" fixed />
@selection-change="handleSelectionChange" <el-table-column fixed label="性别" align="center" prop="gender" show-overflow-tooltip min-width="100">
max-height="600" <template slot-scope="scope">
> <span v-if="scope.row.gender == 0"></span>
<el-table-column type="selection" width="55" align="center" /> <span v-if="scope.row.gender == 1"></span>
<el-table-column label="姓名" align="center" prop="name" width="100" /> </template>
<el-table-column </el-table-column>
label="性别"
align="center"
prop="gender"
show-overflow-tooltip
width="100"
>
<template slot-scope="scope">
<span v-if="scope.row.gender == 0"></span>
<span v-if="scope.row.gender == 1"></span>
</template>
</el-table-column>
<el-table-column <el-table-column fixed label="出生日期" align="center" prop="birthDate" show-overflow-tooltip min-width="150">
label="出生日期" <template slot-scope="scope">
align="center" {{ parseTime(scope.row.createTime, "{y}-{m}-{d}") }}
prop="birthDate" </template>
show-overflow-tooltip </el-table-column>
width="150" <el-table-column label="民族" align="center" prop="ethnicity" show-overflow-tooltip min-width="100" />
> <el-table-column label="受教育年限" align="center" prop="educationYears" show-overflow-tooltip min-width="100" />
<template slot-scope="scope"> <el-table-column label="手机号码" align="center" prop="phone" show-overflow-tooltip min-width="150" />
{{ parseTime(scope.row.createTime, "{y}-{m}-{d}") }} <el-table-column label="证件类型" align="center" prop="idCardType" show-overflow-tooltip min-width="200">
</template> <template slot-scope="scope">
</el-table-column> {{ idCardTypeValue[scope.row.idCardType] }}
<el-table-column </template>
label="民族" </el-table-column>
align="center" <el-table-column label="证件号码" align="center" prop="idCard" show-overflow-tooltip min-width="180" />
prop="ethnicity" <el-table-column fixed="right" label="随访队列" align="center" prop="queueList" show-overflow-tooltip
show-overflow-tooltip min-width="180">
width="100" <template slot-scope="scope">
/> <div v-if="scope.row.queueList && scope.row.queueList.length">
<el-table-column {{ scope.row.queueList.map((i) => i.queueName).join(",") }}
label="受教育年限" </div>
align="center" </template>
prop="educationYears" </el-table-column>
show-overflow-tooltip <el-table-column label="创建人/创建时间" align="center" width="140" fixed="right">
width="100" <template slot-scope="scope">
/> <div>{{ scope.row.createBy }}</div>
<el-table-column <span>{{
label="手机号码"
align="center"
prop="phone"
show-overflow-tooltip
width="150"
/>
<el-table-column
label="证件类型"
align="center"
prop="idCardType"
show-overflow-tooltip
width="200"
>
<template slot-scope="scope">
{{ idCardTypeValue[scope.row.idCardType] }}
</template>
</el-table-column>
<el-table-column
label="证件号码"
align="center"
prop="idCard"
show-overflow-tooltip
width="180"
/>
<el-table-column
fixed="right"
label="随访队列"
align="center"
prop="queueList"
show-overflow-tooltip
width="180"
>
<template slot-scope="scope">
<div v-if="scope.row.queueList && scope.row.queueList.length">
{{ scope.row.queueList.map((i) => i.queueName).join(",") }}
</div>
</template>
</el-table-column>
<el-table-column
label="创建人/创建时间"
align="center"
width="130"
fixed="right"
>
<template slot-scope="scope">
<div>{{ scope.row.createBy }}</div>
<span>{{
parseTime(scope.row.createTime, "{y}-{m}-{d} {h}:{i}") parseTime(scope.row.createTime, "{y}-{m}-{d} {h}:{i}")
}}</span> }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column fixed="right" label="操作" align="center" width="200"> <el-table-column fixed="right" label="操作" align="center" width="200">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button size="mini" type="text" icon="el-icon-edit"
size="mini" @click="handleUpdate(scope.row)">队列管理</el-button>
type="text" <el-button size="mini" type="text" icon="el-icon-tickets"
icon="el-icon-edit" @click="handlePatient(scope.row)">患者档案</el-button>
@click="handleUpdate(scope.row)" <el-button size="mini" type="text" icon="el-icon-notebook-2"
>队列管理</el-button @click="handleMedical(scope.row)">诊疗档案</el-button>
> </template>
<el-button </el-table-column>
size="mini" </el-table>
type="text"
icon="el-icon-tickets"
@click="handlePatient(scope.row)"
>患者档案</el-button
>
<el-button
size="mini"
type="text"
icon="el-icon-notebook-2"
@click="handleMedical(scope.row)"
>诊疗档案</el-button
>
</template>
</el-table-column>
</el-table>
<pagination <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
v-show="total > 0" :limit.sync="queryParams.pageSize" @pagination="getList" />
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改公告对话框 --> <!-- 添加或修改公告对话框 -->
<el-dialog <el-dialog class="popup" :title="title" :visible.sync="open" width="780px" append-to-body>
class="popup" <el-form class="formStep" ref="form" :model="form" :rules="rules" label-width="90px">
:title="title" <el-form-item label="随访队列" prop="queueIdList">
:visible.sync="open" <el-select v-model="form.queueIdList" multiple placeholder="请选择">
width="780px" <el-option v-for="item in followupList" :key="item.id" :label="item.name" :value="item.id">
append-to-body </el-option>
> </el-select>
<el-form </el-form-item>
class="formStep" </el-form>
ref="form" <div slot="footer" class="dialog-footer">
:model="form" <el-button type="primary" @click="submitForm"> </el-button>
:rules="rules" <el-button @click="cancel"> </el-button>
label-width="90px" </div>
> </el-dialog>
<el-form-item label="随访队列" prop="queueIdList"> </div>
<el-select v-model="form.queueIdList" multiple placeholder="请选择">
<el-option
v-for="item in followupList"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template> </template>
<script> <script>
import { queryPatient, followupQuery, updPatient } from "@/api/followupFile"; import {
export default { queryPatient,
name: "Notice", followupQuery,
data() { updPatient
return { } from "@/api/followupFile";
fileList: [], export default {
idCardType: [ name: "Notice",
{ data() {
label: "身份证", return {
value: 0, fileList: [],
}, idCardType: [{
{ label: "身份证",
label: "护照或外国人永居证", value: 0,
value: 1, },
}, {
{ label: "护照或外国人永居证",
label: "港澳居民来往内地通行", value: 1,
value: 2, },
}, {
{ label: "港澳居民来往内地通行",
label: "台湾居民来往大陆通行证", value: 2,
value: 3, },
}, {
], label: "台湾居民来往大陆通行证",
idCardTypeValue: { value: 3,
0: "身份证", },
1: "护照或外国人永居证", {
2: "港澳居民来往内地通行", label: "其他",
3: "台湾居民来往大陆通行证", value: 4,
}, },
loading: false, // ],
ids: [], // idCardTypeValue: {
single: true, // 0: "身份证",
multiple: true, // 1: "护照或外国人永居证",
showSearch: true, // 2: "港澳居民来往内地通行",
total: 0, // 3: "台湾居民来往大陆通行证",
listDat: [{}], // 4: "其他",
title: "", // },
open: false, // loading: false, //
importOpen: false, // ids: [], //
// single: true, //
queryParams: { multiple: true, //
pageNum: 1, showSearch: true, //
pageSize: 10, total: 0, //
param: {}, listDat: [{}], //
}, title: "", //
formDisabled: false, open: false, //
importform: {}, importOpen: false, //
// //
form: {}, queryParams: {
// pageNum: 1,
rules: { pageSize: 10,
queueIdList: [ param: {
{ required: true, message: "随访队列不能为空", trigger: "change" }, queueId: ''
], },
}, },
followupList: [], // 访 haveQueue:'',
}; formDisabled: false,
}, importform: {},
created() { //
this.getList(); form: {},
this.getFollowupQuery(); //
}, rules: {
methods: { queueIdList: [{
// 访 required: true,
getFollowupQuery() { message: "随访队列不能为空",
followupQuery({ trigger: "change"
pageNum: -1, }, ],
param: {}, },
}).then((res) => { followupList: [], // 访
this.followupList = res.data.list; };
}); },
}, created() {
this.getList();
this.getFollowupQuery();
},
methods: {
// 访
getFollowupQuery() {
followupQuery({
pageNum: -1,
param: {
status: 1
},
}).then((res) => {
this.followupList = res.data.list;
let commonQueue = JSON.parse(localStorage.getItem('commonQueue'))
commonQueue?.forEach(i => {
this.followupList.unshift(i)
})
});
},
/** 查询公告列表 */ /** 查询公告列表 */
getList() { getList() {
this.loading = true; this.loading = true;
queryPatient(this.queryParams).then((res) => { queryPatient(this.queryParams).then((res) => {
this.listDat = res.data.list; this.listDat = res.data.list;
this.total = res.data.total; this.total = res.data.total;
this.loading = false; this.loading = false;
}); });
}, },
// //
cancel() { cancel() {
this.open = false; this.open = false;
this.reset(); this.reset();
}, },
// //
reset() { reset() {
this.form = {}; this.form = {};
this.resetForm("form"); this.resetForm("form");
}, },
/** 搜索按钮操作 */ /** 搜索按钮操作 */
handleQuery() { handleQuery() {
this.queryParams.pageNum = 1; this.queryParams.param.haveQueue = ''
this.getList(); if(this.haveQueue){
}, this.queryParams.param.haveQueue = 0
/** 重置按钮操作 */ }
resetQuery() { this.queryParams.pageNum = 1;
this.resetForm("queryForm"); this.getList();
this.handleQuery(); },
}, /** 重置按钮操作 */
// resetQuery() {
handleSelectionChange(selection) { this.queryParams = {
this.ids = selection.map((item) => item.id); param: {
this.single = selection.length != 1; queueId: ''
this.multiple = !selection.length; },
}, },
/** 修改按钮操作 */ this.haveQueue = ''
handleUpdate(row) { this.handleQuery();
this.open = true; },
this.title = "队列管理"; //
let queueList = row.queueList.map((item) => item.queueId); handleSelectionChange(selection) {
this.form = JSON.parse( this.ids = selection.map((item) => item.id);
JSON.stringify({ this.single = selection.length != 1;
...row, this.multiple = !selection.length;
patientId: row.id, },
queueIdList: queueList, /** 修改按钮操作 */
}) handleUpdate(row) {
); this.open = true;
}, this.title = "队列管理";
/** 跳转患者档案 */ let queueList = row.queueList?.map((item) => item.queueId) || [];
handlePatient(row) {}, this.form = JSON.parse(
/** 诊疗档案 */ JSON.stringify({
handleMedical(row) {}, ...row,
/** 提交按钮 */ patientId: row.id,
submitForm: function () { queueIdList: queueList,
this.$refs["form"].validate((valid) => { })
if (valid) { );
updPatient(this.form).then((response) => { },
this.$modal.msgSuccess("修改成功"); /** 跳转患者档案 */
this.open = false; handlePatient(row) {
this.getList(); this.$router.push({
}); path: `/patientIndex?idCard=${row.idCard}`
} })
}); },
}, /** 诊疗档案 */
handleMedical(row) {
this.$router.push({
path: `/medicalIndex?idCard=${row.idCard}`
})
},
/** 提交按钮 */
submitForm: function() {
this.$refs["form"].validate((valid) => {
if (valid) {
updPatient(this.form).then((response) => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
}
});
},
/** 删除按钮操作 */ /** 删除按钮操作 */
handleDelete(row) { handleDelete(row) {
const idList = row.id ? [row.id] : this.ids; const idList = row.id ? [row.id] : this.ids;
this.$modal this.$modal
.confirm("是否确认删除当前选择的数据?") .confirm("是否确认删除当前选择的数据?")
.then(function () { .then(function() {
return patientDel({ idList: idList }); return patientDel({
}) idList: idList
.then(() => { });
this.getList(); })
this.$modal.msgSuccess("删除成功"); .then(() => {
}) this.getList();
.catch(() => {}); this.$modal.msgSuccess("删除成功");
}, })
/** 导出按钮操作 */ .catch(() => {});
handleExport() { },
this.download( /** 导出按钮操作 */
"system/user/export", handleExport() {
{ this.download(
...this.queryParams.params, "system/user/export", {
}, ...this.queryParams.params,
`患者档案.xlsx` },
); `患者档案.xlsx`
}, );
/** 导入按钮操作 */ },
handleImport() { /** 导入按钮操作 */
this.upload.title = "用户导入"; handleImport() {
this.upload.open = true; this.upload.title = "用户导入";
}, this.upload.open = true;
}, },
}; },
};
</script> </script>
<style scoped src="@/assets/styles/common.css"></style> <style scoped src="@/assets/styles/common.css"></style>
<style scoped> <style scoped>
.form-item-age { .form-item-age {
display: flex; display: flex;
align-items: center; align-items: center;
} }
.form-item-age span {
margin: 0 10px; .form-item-age span {
} margin: 0 10px;
.form-item-age >>> .el-input { }
width: 100px;
} .form-item-age>>>.el-input {
width: 100px;
}
</style> </style>
<!-- >>> .el-input__inner { <!-- >>> .el-input__inner {
padding: 0 15px !important; padding: 0 15px !important;

293
acupuncture-前台/src/views/followFile/work.vue

@ -1,6 +1,51 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
v-show="showSearch"
label-width="68px"
>
<el-form-item label="" prop="keywords">
<el-input
style="width: 300px"
placeholder="姓名、全拼、简拼、手机号码、证件号码"
v-model="queryParams.param.keywords"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="状态" prop="childStatus">
<el-select
v-model="queryParams.param.childStatus"
clearable
placeholder="请选择"
>
<el-option
v-for="item in childStatusList[queryParams.param.status]"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>搜索</el-button
>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">
重置
</el-button>
</el-form-item>
</el-form>
<right-toolbar <right-toolbar
:showSearch.sync="showSearch" :showSearch.sync="showSearch"
@queryTable="getList" @queryTable="getList"
@ -19,30 +64,33 @@
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column <el-table-column
label="工单id" label="工单id"
fixed
show-overflow-tooltip show-overflow-tooltip
align="center" align="center"
prop="" prop="id"
width="100" min-width="200"
/> />
<el-table-column <el-table-column
fixed
label="随访队列" label="随访队列"
show-overflow-tooltip show-overflow-tooltip
align="" align="center"
prop="name" prop="queueName"
width="100" min-width="150"
/> />
<el-table-column <el-table-column
fixed
label="患者姓名" label="患者姓名"
align="center" align="center"
prop="name" prop="name"
width="100" min-width="100"
/> />
<el-table-column <el-table-column
label="性别" label="性别"
align="center" align="center"
prop="gender" prop="gender"
show-overflow-tooltip show-overflow-tooltip
width="100" min-width="60"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.gender == 0"></span> <span v-if="scope.row.gender == 0"></span>
@ -55,43 +103,53 @@
align="center" align="center"
prop="age" prop="age"
show-overflow-tooltip show-overflow-tooltip
width="150" min-width="60"
/> />
<el-table-column <el-table-column
label="证件号码" label="证件号码"
align="center" align="center"
prop="idCard" prop="idCard"
show-overflow-tooltip show-overflow-tooltip
width="180" min-width="180"
/> />
<el-table-column <el-table-column
label="手机号码" label="手机号码"
align="center" align="center"
prop="phone" prop="phone"
show-overflow-tooltip show-overflow-tooltip
width="150" min-width="150"
/> />
<el-table-column <el-table-column
label="随访序号" label="随访次数"
align="center" align="center"
prop="phone" prop="times"
show-overflow-tooltip show-overflow-tooltip
width="150" min-width="150"
/> />
<el-table-column <el-table-column
label="开始时间" label="开始时间"
align="center" align="center"
prop="startTime" prop="startTime"
show-overflow-tooltip show-overflow-tooltip
width="150" min-width="150"
/> >
<template slot-scope="scope">
<span>{{
parseTime(scope.row.startTime, "{y}-{m}-{d} {h}:{i}")
}}</span>
</template>
</el-table-column>
<el-table-column <el-table-column
label="结束时间" label="结束时间"
align="center" align="center"
prop="endTime" prop="endTime"
show-overflow-tooltip show-overflow-tooltip
width="150" min-width="150"
/> >
<template slot-scope="scope">
<span>{{ parseTime(scope.row.endTime, "{y}-{m}-{d} {h}:{i}") }}</span>
</template>
</el-table-column>
<!--待随访 随访状态待随访/即将超期/超期 --> <!--待随访 随访状态待随访/即将超期/超期 -->
<!--已随访 随访状态已随访/超随访期 --> <!--已随访 随访状态已随访/超随访期 -->
<!--待随访 随访状态待随访 --> <!--待随访 随访状态待随访 -->
@ -100,47 +158,63 @@
align="center" align="center"
prop="phone" prop="phone"
show-overflow-tooltip show-overflow-tooltip
width="150" min-width="150"
fixed="right"
> >
<template slot-scope="scope"> <template slot-scope="scope">
{{ status[scope.row.status] }} <span :class="classStatus[scope.row.status]">{{
status[scope.row.status]
}}</span>
</template> </template>
</el-table-column> </el-table-column>
<!-- <el-table-column
label="失访状态"
align="center"
prop="phone"
show-overflow-tooltip
width="150"
/> -->
<el-table-column <el-table-column
v-if="queryParams.param.status == 2"
label="失访原因" label="失访原因"
align="center" align="center"
prop="reason" prop="reason"
show-overflow-tooltip show-overflow-tooltip
width="150" width="200"
/> />
<el-table-column fixed="right" label="操作" align="center" width="180">
<el-table-column fixed="right" label="操作" align="center" width="150">
<template slot-scope="scope"> <template slot-scope="scope">
<!-- :disabled="scope.row.status !== '0'" --> <!-- 待随访 -->
<div v-if="queryParams.param.status == 0">
<el-button
size="mini"
type="text"
icon="el-icon-s-check"
@click="handleFollow(scope.row)"
>
去随访
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-s-release"
@click="handleLossFollow(scope.row)"
>
标记失访
</el-button>
</div>
<!-- 随访 -->
<el-button <el-button
:disabled="scope.row.status !== '0'" v-if="queryParams.param.status == 1"
size="mini" size="mini"
type="text" type="text"
icon="el-icon-s-check" icon="el-icon-s-check"
@click="handleFollow(scope.row)" @click="handleDetails(scope.row)"
> >
随访 查看详情
</el-button> </el-button>
<!-- 失访 -->
<el-button <el-button
:disabled="scope.row.status !== '0'" v-if="queryParams.param.status == 2"
size="mini" size="mini"
type="text" type="text"
icon="el-icon-s-release" icon="el-icon-s-check"
@click="handleLossFollow(scope.row)" @click="handleBeFollow(scope.row)"
> >
失访 标记待随访
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
@ -157,7 +231,7 @@
<!-- 失访 --> <!-- 失访 -->
<el-dialog <el-dialog
class="popup" class="popup"
title="失访" title="标记失访"
:visible.sync="open" :visible.sync="open"
width="780px" width="780px"
append-to-body append-to-body
@ -169,9 +243,9 @@
:rules="rules" :rules="rules"
label-width="90px" label-width="90px"
> >
<el-form-item label="随访次数" prop="times"> <!-- <el-form-item label="随访次数" prop="times">
<el-input v-model="form.times" placeholder="请输入" /> <el-input v-model="form.times" placeholder="请输入" />
</el-form-item> </el-form-item> -->
<el-form-item label="失访原因" prop="reason"> <el-form-item label="失访原因" prop="reason">
<el-select v-model="form.reason" placeholder="请选择"> <el-select v-model="form.reason" placeholder="请选择">
<el-option-group <el-option-group
@ -211,10 +285,15 @@
label-width="90px" label-width="90px"
> >
<el-form-item label="随访人" prop="followuper"> <el-form-item label="随访人" prop="followuper">
<el-input v-model="form.followuper" placeholder="请输入" /> <el-input
:disabled="open1Disabled"
v-model="form.followuper"
placeholder="请输入"
/>
</el-form-item> </el-form-item>
<el-form-item label="随访时间" prop="followupTime"> <el-form-item label="随访时间" prop="followupTime">
<el-date-picker <el-date-picker
:disabled="open1Disabled"
format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss"
v-model="form.followupTime" v-model="form.followupTime"
@ -223,15 +302,22 @@
> >
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="随访次数" prop="times"> <!-- <el-form-item label="随访次数" prop="times">
<el-input v-model="form.times" placeholder="请输入" /> <el-input v-model="form.times" placeholder="请输入" />
</el-form-item> </el-form-item> -->
<el-form-item label="随访内容" prop="followupText"> <el-form-item label="随访内容" prop="followupText">
<el-input v-model="form.followupText" placeholder="请输入" /> <el-input
:disabled="open1Disabled"
type="textarea"
v-model="form.followupText"
placeholder="请输入"
/>
</el-form-item> </el-form-item>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm1"> </el-button> <el-button type="primary" @click="submitForm1" v-if="!open1Disabled"
> </el-button
>
<el-button @click="open1 = false"> </el-button> <el-button @click="open1 = false"> </el-button>
</div> </div>
</el-dialog> </el-dialog>
@ -239,7 +325,12 @@
</template> </template>
<script> <script>
import { queryTask, updStatus, followPatient } from "@/api/followupFile"; import {
queryTask,
updStatus,
followPatient,
followStatus,
} from "@/api/followupFile";
export default { export default {
name: "Notice", name: "Notice",
data() { data() {
@ -303,6 +394,29 @@ export default {
4: "超期未随访", 4: "超期未随访",
5: "超期已随访", 5: "超期已随访",
}, },
classStatus: {
3: "status3",
4: "status4",
5: "status4",
},
childStatusList: {
0: [
{
label: "即将超期",
value: 1,
},
{
label: "超期未随访",
value: 2,
},
],
1: [
{
label: "超期已随访",
value: 2,
},
],
},
idCardType: [ idCardType: [
{ {
label: "身份证", label: "身份证",
@ -320,12 +434,17 @@ export default {
label: "台湾居民来往大陆通行证", label: "台湾居民来往大陆通行证",
value: 3, value: 3,
}, },
{
label: "其他",
value: 4,
},
], ],
idCardTypeValue: { idCardTypeValue: {
0: "身份证", 0: "身份证",
1: "护照或外国人永居证", 1: "护照或外国人永居证",
2: "港澳居民来往内地通行", 2: "港澳居民来往内地通行",
3: "台湾居民来往大陆通行证", 3: "台湾居民来往大陆通行证",
4: "其他",
}, },
loading: false, // loading: false, //
ids: [], // ids: [], //
@ -337,6 +456,7 @@ export default {
title: "", // title: "", //
open: false, // open: false, //
open1: false, // open1: false, //
open1Disabled: false,
importOpen: false, // importOpen: false, //
// //
queryParams: { queryParams: {
@ -344,6 +464,8 @@ export default {
pageSize: 10, pageSize: 10,
param: { param: {
status: "0", status: "0",
childStatus: "",
keywords: "",
}, },
}, },
formDisabled: false, formDisabled: false,
@ -353,29 +475,52 @@ export default {
// //
rules: { rules: {
followuper: [ followuper: [
{ required: true, message: "随访人不能为空", trigger: "blur" }, {
required: true,
message: "随访人不能为空",
trigger: "blur",
},
], ],
followupTime: [ followupTime: [
{ required: true, message: "随访时间不能为空", trigger: "change" }, {
required: true,
message: "随访时间不能为空",
trigger: "change",
},
], ],
followupText: [ followupText: [
{ required: true, message: "随访内容不能为空", trigger: "blur" }, {
required: true,
message: "随访内容不能为空",
trigger: "blur",
},
], ],
times: [ times: [
{ required: true, message: "随访次数不能为空", trigger: "blur" }, {
required: true,
message: "随访次数不能为空",
trigger: "blur",
},
], ],
reason: [ reason: [
{ required: true, message: "失访原因不能为空", trigger: "change" }, {
required: true,
message: "失访原因不能为空",
trigger: "change",
},
], ],
}, },
}; };
}, },
created() { created() {
let idCard = this.$route.query.idCard;
this.queryParams.param.keywords = idCard || "";
this.getList(); this.getList();
}, },
methods: { methods: {
handleClick(tab, event) { handleClick(tab, event) {
this.queryParams.param.childStatus = "";
this.getList(); this.getList();
}, },
/** 查询公告列表 */ /** 查询公告列表 */
@ -404,7 +549,8 @@ export default {
}, },
/** 重置按钮操作 */ /** 重置按钮操作 */
resetQuery() { resetQuery() {
this.resetForm("queryForm"); this.queryParams.param.keywords = "";
this.queryParams.param.childStatus = "";
this.handleQuery(); this.handleQuery();
}, },
// //
@ -421,6 +567,7 @@ export default {
/** 随访 */ /** 随访 */
handleFollow(row) { handleFollow(row) {
this.open1 = true; this.open1 = true;
this.open1Disabled = false;
this.form = { this.form = {
id: row.id, id: row.id,
followuper: "", followuper: "",
@ -429,12 +576,36 @@ export default {
followupText: "", followupText: "",
}; };
}, },
/** 失访 */ /** 标记失访 */
handleLossFollow(row) { handleLossFollow(row) {
this.open = true; this.open = true;
this.form = JSON.parse(JSON.stringify(row)); this.form = JSON.parse(JSON.stringify(row));
this.form.status = 2; this.form.status = 2;
}, },
handleDetails(row) {
this.open1 = true;
this.open1Disabled = true;
this.form = JSON.parse(JSON.stringify(row));
},
// 访
handleBeFollow(row) {
let data = {
id: row.id,
status: 0,
};
this.$modal
.confirm(`是否确认将该患者(${row.name})标记为待随访?`)
.then(function () {
return followStatus(data);
})
.then(() => {
this.getList();
this.$modal.msgSuccess("操作成功");
})
.catch((err) => {
console.log("err", err);
});
},
/** 提交按钮 */ /** 提交按钮 */
submitForm: function () { submitForm: function () {
this.$refs["form"].validate((valid) => { this.$refs["form"].validate((valid) => {
@ -485,7 +656,9 @@ export default {
this.$modal this.$modal
.confirm("是否确认删除当前选择的数据?") .confirm("是否确认删除当前选择的数据?")
.then(function () { .then(function () {
return patientDel({ idList: idList }); return patientDel({
idList: idList,
});
}) })
.then(() => { .then(() => {
this.getList(); this.getList();
@ -513,13 +686,21 @@ export default {
</script> </script>
<style scoped src="@/assets/styles/common.css"></style> <style scoped src="@/assets/styles/common.css"></style>
<style scoped> <style scoped>
.status3 {
color: orange;
}
.status4 {
color: red;
}
.form-item-age { .form-item-age {
display: flex; display: flex;
align-items: center; align-items: center;
} }
.form-item-age span { .form-item-age span {
margin: 0 10px; margin: 0 10px;
} }
.form-item-age >>> .el-input { .form-item-age >>> .el-input {
width: 100px; width: 100px;
} }

27
acupuncture-前台/src/views/index.vue

@ -4,7 +4,6 @@
<div> <div>
<el-card shadow="always"> <el-card shadow="always">
<search <search
@radio-change="radioChange"
@picker-change="pickerChage" @picker-change="pickerChage"
title="患者信息统计" title="患者信息统计"
type="1" type="1"
@ -15,7 +14,6 @@
<div> <div>
<el-card shadow="always"> <el-card shadow="always">
<search <search
@radio-change="radioChange"
@picker-change="pickerChage" @picker-change="pickerChage"
title="诊疗信息统计" title="诊疗信息统计"
type="2" type="2"
@ -23,17 +21,22 @@
</el-card> </el-card>
<JM ref="JM"></JM> <JM ref="JM"></JM>
</div> </div>
<!-- <div> <div>
<el-card shadow="always"> <el-card shadow="always">
<search <search
@radio-change="radioChange"
@picker-change="pickerChage" @picker-change="pickerChage"
title="血管内治疗统计" title="治疗类型统计"
type="3" type="3"
></search> ></search>
</el-card> </el-card>
<XGZL ref="XGZL"></XGZL> <XGZL ref="XGZL"></XGZL>
</div> --> </div>
<div>
<el-card shadow="always">
<search @picker-change="pickerChage" title="随访统计" type="4"></search>
</el-card>
<follow ref="follow"></follow>
</div>
</div> </div>
</template> </template>
@ -43,6 +46,7 @@ import search from "@/views/indexCom/query";
import patient from "@/views/indexCom/patient"; import patient from "@/views/indexCom/patient";
import JM from "@/views/indexCom/JM"; import JM from "@/views/indexCom/JM";
import XGZL from "@/views/indexCom/XGZL"; import XGZL from "@/views/indexCom/XGZL";
import follow from "@/views/indexCom/follow";
export default { export default {
name: "Index", name: "Index",
components: { components: {
@ -50,6 +54,7 @@ export default {
patient, patient,
JM, JM,
XGZL, XGZL,
follow,
}, },
data() { data() {
return {}; return {};
@ -69,9 +74,11 @@ export default {
}, },
methods: { methods: {
resize() { resize() {
console.log(111);
// this.$refs.patient.getRenew(); // this.$refs.patient.getRenew();
// this.$refs.JM.getRenew(); // this.$refs.JM.getRenew();
// this.$refs.XGZL.getRenew(); // this.$refs.XGZL.getRenew();
// this.$refs.follow.getRenew();
}, },
// //
radioChange(_data, _type, _timeType) { radioChange(_data, _type, _timeType) {
@ -92,6 +99,9 @@ export default {
if (_type == 3) { if (_type == 3) {
this.$refs.XGZL.statistics(_data, param); this.$refs.XGZL.statistics(_data, param);
} }
if (_type == 4) {
this.$refs.follow.statistics(_data, param);
}
}, },
}, },
directives: { directives: {
@ -102,6 +112,7 @@ export default {
// elbinding // elbinding
let width = "", let width = "",
height = ""; height = "";
function isReize() { function isReize() {
const style = document.defaultView.getComputedStyle(el); const style = document.defaultView.getComputedStyle(el);
if (width !== style.width) { if (width !== style.width) {
@ -124,6 +135,7 @@ export default {
background: #f3f5f9; background: #f3f5f9;
min-height: 100vh; min-height: 100vh;
} }
.home { .home {
blockquote { blockquote {
padding: 10px 20px; padding: 10px 20px;
@ -131,12 +143,14 @@ export default {
font-size: 17.5px; font-size: 17.5px;
border-left: 5px solid #eee; border-left: 5px solid #eee;
} }
hr { hr {
margin-top: 20px; margin-top: 20px;
margin-bottom: 20px; margin-bottom: 20px;
border: 0; border: 0;
border-top: 1px solid #eee; border-top: 1px solid #eee;
} }
.col-item { .col-item {
margin-bottom: 20px; margin-bottom: 20px;
} }
@ -190,6 +204,7 @@ export default {
>>> .el-card { >>> .el-card {
margin-bottom: 16px; margin-bottom: 16px;
} }
>>> .el-card__body { >>> .el-card__body {
padding: 10px 20px; padding: 10px 20px;
} }

698
acupuncture-前台/src/views/indexCom/JM.vue

@ -1,60 +1,76 @@
<template> <template>
<div> <div>
<div class="app-container"> <div class="app-container">
<div class="dis" style="width: 100%"> <div class="dis" style="width: 100%">
<div style="flex: 1; margin-right: 20px"> <div style="flex: 1; margin-right: 20px">
<el-card shadow="always"> <el-card shadow="always">
<div class="dis title-box"> <div class="dis title-box">
<span class="header-title">病种排名</span> <span class="header-title">病种排名</span>
<div class="dis"></div> <div class="dis"></div>
</div> </div>
<div style="height: 300px" v-loading="loading"> <div style="height: 300px" v-loading="loading">
<div id="diagnose" style="width: 100%"></div> <div id="diagnose" style="width: 100%"></div>
</div> </div>
</el-card> </el-card>
</div> </div>
<div style="flex: 1"> <div style="flex: 1; margin-right: 20px">
<el-card shadow="always"> <el-card shadow="always">
<div class="dis title-box"> <div class="dis title-box">
<span class="header-title">体系分布</span> <span class="header-title">体型分布</span>
<div class="dis"> <div class="dis"></div>
</div> </div>
</div> <div style="height: 300px" v-loading="loading">
<div style="height: 300px" v-loading="loading"> <div id="system" style="width: 100%"></div>
<div id="system" style="width: 100%"></div> </div>
</div> </el-card>
</el-card> </div>
</div> <div style="flex: 1; margin-right: 20px">
</div> <el-card shadow="always">
</div> <div class="dis title-box">
<div class="app-container"> <span class="header-title">体质分布</span>
<div class="dis" style="width: 100%"> <div class="dis"></div>
<div style="flex: 1; margin-right: 20px"> </div>
<el-card shadow="always"> <div style="height: 300px" v-loading="loading">
<div class="dis title-box"> <div id="physique" style="width: 100%"></div>
<span class="header-title">体质分布</span> </div>
<div class="dis"></div> </el-card>
</div> </div>
<div style="height: 300px" v-loading="loading"> <div style="flex: 1; margin-right: 20px">
<div id="physique" style="width: 100%"></div> <el-card shadow="always">
</div> <div class="dis title-box">
</el-card> <span class="header-title">体态评估TAPS</span>
</div> <div class="dis"></div>
<div style="flex: 1"> </div>
<el-card shadow="always"> <div style="height: 300px" v-loading="loading">
<div class="dis title-box"> <div id="posture" style="width: 100%"></div>
<span class="header-title">体态评估TAPS</span> </div>
<div class="dis"> </el-card>
</div> </div>
</div> <div style="flex: 1; margin-right: 20px">
<div style="height: 300px" v-loading="loading"> <el-card shadow="always">
<div id="posture" style="width: 100%"></div> <div class="dis title-box">
</div> <span class="header-title">失眠评估PHQ-9</span>
</el-card> <div class="dis"></div>
</div> </div>
</div> <div style="height: 300px" v-loading="loading">
</div> <div id="agrypnia" style="width: 100%"></div>
<div class="app-container"> </div>
</el-card>
</div>
<div style="flex: 1">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">焦虑HAMD-24</span>
<div class="dis"></div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="anxiety" style="width: 100%"></div>
</div>
</el-card>
</div>
</div>
</div>
<!-- <div class="app-container">
<div class="dis" style="width: 100%"> <div class="dis" style="width: 100%">
<div style="flex: 1; margin-right: 20px"> <div style="flex: 1; margin-right: 20px">
<el-card shadow="always"> <el-card shadow="always">
@ -71,8 +87,7 @@
<el-card shadow="always"> <el-card shadow="always">
<div class="dis title-box"> <div class="dis title-box">
<span class="header-title">焦虑HAMD-24</span> <span class="header-title">焦虑HAMD-24</span>
<div class="dis"> <div class="dis"></div>
</div>
</div> </div>
<div style="height: 300px" v-loading="loading"> <div style="height: 300px" v-loading="loading">
<div id="anxiety" style="width: 100%"></div> <div id="anxiety" style="width: 100%"></div>
@ -80,283 +95,326 @@
</el-card> </el-card>
</div> </div>
</div> </div>
</div> </div> -->
</div> </div>
</template> </template>
<script> <script>
import * as echarts from "echarts"; import * as echarts from "echarts";
require("echarts/theme/macarons"); // echarts theme require("echarts/theme/macarons"); // echarts theme
import resize from "@/views/dashboard/mixins/resize"; import resize from "@/views/dashboard/mixins/resize";
import { import { zlInfo } from "@/api/indexCom.js";
zlInfo import {
} from "@/api/indexCom.js"; diagnoseEcharts,
import { systemEcharts,
diagnoseEcharts, physiqueEcharts,
systemEcharts, postureEcharts,
physiqueEcharts, agrypniaEcharts,
postureEcharts anxietyEcharts,
} from "./index"; } from "./index";
export default { export default {
name: "Post", name: "Post",
props: ["title"], props: ["title"],
mixins: [resize], mixins: [resize],
data() { data() {
return { return {
queryParams: { queryParams: {
param: { param: {
startTime: "", startTime: "",
endTime: "", endTime: "",
}, },
}, },
loading: false,
diagnoseValue: null, // loading: false,
systemValue: null, // diagnoseValue: null, //
physiqueValue: null, // systemValue: null, //
postureValue:null, // physiqueValue: null, //
postureValue: null, //
// agrypniaValue: null, //
systemObj: { anxietyValue: null, //
"yxfpz": "隐形肥胖型", // //
"zfgdx": "脂肪过多型", // systemObj: {
"fpx": "肥胖型", // yxfpz: "隐形肥胖型", //
"jrbzx": "肌肉不足型", // zfgdx: "脂肪过多型", //
"jkjcx": "健康匀称型", // fpx: "肥胖型", //
"czjrx": "超重肌肉型", // jrbzx: "肌肉不足型", //
"xsx": "消瘦型", // jkjcx: "健康匀称型", //
"dzfx": "低脂肪型", // czjrx: "超重肌肉型", //
"ydyx": "运动员型", // xsx: "消瘦型", //
}, dzfx: "低脂肪型", //
// ydyx: "运动员型", //
physiqueObj: { },
"phz": "平和质", // //
"qxz": "气虚质", // physiqueObj: {
"yangxz": "阳虚质", // phz: "平和质", //
"yinxz": "阴虚质", // qxz: "气虚质", //
"tsz": "痰湿质", //湿 yangxz: "阳虚质", //
"srz": "湿热质", //湿 yinxz: "阴虚质", //
"xyz": "血瘀质", // tsz: "痰湿质", //湿
"qyz": "气郁质", // srz: "湿热质", //湿
"tlz": "特禀质", // xyz: "血瘀质", //
}, qyz: "气郁质", //
}; tlz: "特禀质", //
}, },
created() { };
// this.Linepatient(); },
this.getData(); created() {
}, // this.Linepatient();
methods: { this.getData();
statistics(_data, _type) { },
this.initial(_data, _type); // methods: {
this.loading = true; statistics(_data, _type) {
this.getData(); // this.initial(_data, _type); //
}, this.loading = true;
// this.getData(); //
async getData() { },
try { //
await zlInfo(this.queryParams).then((res) => { async getData() {
const { try {
jlfb, await zlInfo(this.queryParams).then((res) => {
smfb, const { jlfb, smfb, sort, ttfb, txfb, zytz } = res.data;
sort, //
ttfb, this.diagnoseValue = sort?.sort((a, b) => a.total - b.total);
txfb, this.handleDiagnose();
zytz //
} = res.data this.systemValue = [];
// delete txfb?.total;
this.diagnoseValue = sort.sort((a, b) => a.total - b.total) for (let key in txfb) {
this.handleDiagnose() let data = {
// name: this.systemObj[key],
this.systemValue = [] value: txfb[key] || 0,
delete txfb.total };
for (let key in txfb) { this.systemValue.push(data);
let data = { }
name: this.systemObj[key], this.handleSystem();
value: txfb[key] //
} this.physiqueValue = [];
this.systemValue.push(data) delete zytz?.total;
} for (let key in zytz) {
this.handleSystem() let data = {
// name: this.physiqueObj[key],
this.physiqueValue = [] value: zytz[key] || 0,
delete zytz.total };
for (let key in zytz) { this.physiqueValue.push(data);
let data = { }
name: this.physiqueObj[key], this.handlePhysique();
value: zytz[key], //
} this.postureValue = [
this.physiqueValue.push(data) {
} value: ttfb?.score1 || 0,
this.handlePhysique() name: "1分",
// },
this.postureValue = [{ {
value: ttfb.score1, value: ttfb?.score2 || 0,
name: "1分" name: "2分",
},{ },
value: ttfb.score2, {
name: "2分" value: ttfb?.score3 || 0,
},{ name: "3分",
value: ttfb.score3, },
name: "3分" {
},{ value: ttfb?.score4 || 0,
value: ttfb.score4, name: "4分",
name: "4分" },
},{ {
value: ttfb.score5, value: ttfb?.score5 || 0,
name: "5分" name: "5分",
}] },
this.handlePosture() ];
}); this.handlePosture();
this.loading = false; // PHQ-9
} catch (e) {} this.agrypniaValue = [];
}, for (let key in smfb) {
// this.agrypniaValue.push(smfb[key]);
handleDiagnose() { }
diagnoseEcharts.series[0].data = this.diagnoseValue?.map((item) => { this.handleAgrypnia();
return item.total; //
}); this.anxietyValue = [];
diagnoseEcharts.yAxis.data = this.diagnoseValue?.map((item) => { for (let key in jlfb) {
return item.type; this.anxietyValue.push(jlfb[key]);
}); }
this.$nextTick(() => { this.handleAnxiety();
var myChart = echarts.init(document.getElementById("diagnose"), null, { this.loading = false;
height: 300, });
}); } catch (e) {
myChart.setOption(diagnoseEcharts, true); console.log("诊疗信息", e);
myChart.resize(); }
window.onresize = myChart.resize; },
}); //
}, handleDiagnose() {
// diagnoseEcharts.series[0].data = this.diagnoseValue?.map((item) => {
handleSystem() { return item.total;
systemEcharts.series[0].data = this.systemValue?.map((item) => { });
return item.value; diagnoseEcharts.yAxis.data = this.diagnoseValue?.map((item) => {
}); return item.diseaseName;
systemEcharts.xAxis.data = this.systemValue?.map((item) => { });
return item.name; this.$nextTick(() => {
}); var myChart = echarts.init(document.getElementById("diagnose"), null, {
this.$nextTick(() => { height: 300,
var myChart = echarts.init(document.getElementById("system"), null, { });
height: 300, myChart.setOption(diagnoseEcharts, true);
}); myChart.resize();
myChart.setOption(systemEcharts, true); window.onresize = myChart.resize;
myChart.resize(); });
window.onresize = myChart.resize; },
}); //
}, handleSystem() {
// systemEcharts.series[0].data = this.systemValue?.map((item) => {
handlePhysique() { return item.value;
physiqueEcharts.series[0].data = this.physiqueValue?.map((item) => { });
return item.value; systemEcharts.xAxis.data = this.systemValue?.map((item) => {
}); return item.name;
physiqueEcharts.xAxis.data = this.physiqueValue?.map((item) => { });
return item.name; this.$nextTick(() => {
}); var myChart = echarts.init(document.getElementById("system"), null, {
this.$nextTick(() => { height: 300,
var myChart = echarts.init(document.getElementById("physique"), null, { });
height: 300, myChart.setOption(systemEcharts, true);
}); myChart.resize();
myChart.setOption(physiqueEcharts, true); window.onresize = myChart.resize;
myChart.resize(); });
window.onresize = myChart.resize; },
}); //
}, handlePhysique() {
// physiqueEcharts.series[0].data = this.physiqueValue?.map((item) => {
handlePosture() { return item.value;
postureEcharts.series[0].data = this.postureValue });
this.$nextTick(() => { physiqueEcharts.xAxis.data = this.physiqueValue?.map((item) => {
var myChart = echarts.init(document.getElementById("posture"), null, { return item.name;
height: 300, });
}); this.$nextTick(() => {
myChart.setOption(postureEcharts, true); var myChart = echarts.init(document.getElementById("physique"), null, {
myChart.resize(); height: 300,
window.onresize = myChart.resize; });
}); myChart.setOption(physiqueEcharts, true);
}, myChart.resize();
// window.onresize = myChart.resize;
initial(_data, _type) { });
_data[0] = this.$moment(_data[0]).format("YYYY-MM-DD"); },
_data[1] = this.$moment(_data[1]).format("YYYY-MM-DD"); //
this.queryParams.param = { handlePosture() {
startTime: _data[0] + " " + "00:00:00", postureEcharts.series[0].data = this.postureValue;
endTime: _data[1] + " " + "23:59:59", this.$nextTick(() => {
}; var myChart = echarts.init(document.getElementById("posture"), null, {
}, height: 300,
// });
getRenew() { myChart.setOption(postureEcharts, true);
this.Linepatient(); myChart.resize();
this.columnar(); window.onresize = myChart.resize;
}, });
}, },
}; //
initial(_data, _type) {
_data[0] = this.$moment(_data[0]).format("YYYY-MM-DD");
_data[1] = this.$moment(_data[1]).format("YYYY-MM-DD");
this.queryParams.param = {
startTime: _data[0] + " " + "00:00:00",
endTime: _data[1] + " " + "23:59:59",
};
},
//
handleAgrypnia() {
agrypniaEcharts.series[0].data = this.agrypniaValue;
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("agrypnia"), null, {
height: 300,
});
myChart.setOption(agrypniaEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
handleAnxiety() {
anxietyEcharts.series[0].data = this.anxietyValue;
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("anxiety"), null, {
height: 300,
});
myChart.setOption(anxietyEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
getRenew() {
this.handleDiagnose();
this.handleSystem();
this.handlePhysique();
this.handlePosture();
this.handleAgrypnia();
this.handleAnxiety();
},
},
};
</script> </script>
<style scoped src="@/assets/styles/common.css"></style> <style scoped src="@/assets/styles/common.css"></style>
<style scoped> <style scoped>
>>>.el-card__body { >>> .el-card__body {
padding: 10px 0 !important; padding: 10px 0 !important;
} }
.dis { .dis {
display: flex; display: flex;
} }
.header-title { .header-title {
font-size: 18px; font-size: 18px;
} }
.title-box { .title-box {
padding: 10px 20px; padding: 10px 20px;
border-bottom: 1px solid #dfe6ec; border-bottom: 1px solid #dfe6ec;
} }
.dian-box { .dian-box {
align-items: center; align-items: center;
} }
.dian { .dian {
display: inline-block; display: inline-block;
width: 16px; width: 16px;
height: 16px; height: 16px;
border-radius: 50%; border-radius: 50%;
margin: 0 10px; margin: 0 10px;
} }
.title-box { .title-box {
justify-content: space-between; justify-content: space-between;
} }
.>>>.el-radio--small.is-bordered { . >>> .el-radio--small.is-bordered {
margin-right: 20px !important; margin-right: 20px !important;
margin-left: 0 !important; margin-left: 0 !important;
} }
>>>.el-radio__input { >>> .el-radio__input {
display: none; display: none;
} }
>>>.el-radio__label { >>> .el-radio__label {
padding-left: 5px; padding-left: 5px;
} }
.app-container { .app-container {
padding: 0; padding: 0;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
} }
.title { .title {
display: flex; display: flex;
align-items: center; align-items: center;
font-size: 20px; font-size: 20px;
font-weight: 600; font-weight: 600;
} }
.title-bor { .title-bor {
display: inline-block; display: inline-block;
height: 20px; height: 20px;
width: 6px; width: 6px;
background: #4f8bff; background: #4f8bff;
margin-right: 10px; margin-right: 10px;
border-radius: 8px; border-radius: 8px;
} }
</style> </style>

430
acupuncture-前台/src/views/indexCom/XGZL.vue

@ -1,87 +1,139 @@
<template> <template>
<div class="app-container"> <div>
<!-- 静脉溶栓 数据对比 --> <div class="app-container">
<div class="dis" style="width: 100%"> <div class="dis" style="width: 100%">
<div style="flex: 1"> <div style="flex: 1; margin-right: 20px">
<el-card shadow="always"> <el-card shadow="always">
<div class="dis title-box"> <div class="dis title-box">
<span class="header-title">血管内治疗率 </span> <span class="header-title">治疗类型分布</span>
</div> <div class="dis">
<!-- 统计图 --> <div class="dian-box dis">
<div style="height: 300px" v-loading="loading"> <div class="dian-box dis">
<div id="XGZL" style="width: 100%"></div> <span class="dian" style="background: #c6a268"></span>
</div> 中西医结合
</el-card> </div>
</div> <span class="dian" style="background: #d8d8d8"></span>
<div style="flex: 1; margin-left: 20px"> 纯中医
<el-card shadow="always"> </div>
<div class="dis title-box">
<span class="header-title">数据对比</span>
<div class="dis">
<div class="dian-box dis">
<span class="dian" style="background: #00d1a1"></span>
桥接治疗人数
</div>
<div class="dian-box dis">
<span class="dian" style="background: #4f8bff"></span>
非桥接治疗人数
</div> </div>
</div> </div>
</div> <div style="height: 300px" v-loading="loading">
<!-- 统计图 --> <div id="healType" style="width: 100%"></div>
<div style="height: 300px" v-loading="loading">
<div id="SJDB" style="width: 100%"></div>
</div>
</el-card>
</div>
</div>
<!-- DNT分布 sICH发生率 -->
<div class="dis" style="width: 100%">
<div style="flex: 1">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">DPT</span>
<div class="dis">
<div class="dian-box dis">
<span class="dian" style="background: #00d1a1"></span> 60 min
</div>
<div class="dian-box dis">
<span class="dian" style="background: #ffcd6c"></span> 90 min
</div>
<div class="dian-box dis">
<span class="dian" style="background: #a794fe"></span> >90 min
</div>
</div> </div>
</div> </el-card>
<!-- 统计图 --> </div>
<div style="height: 300px" v-loading="loading"> <!-- <div style="flex: 1; margin-right: 20px">
<div id="DPT" style="width: 100%"></div> <el-card shadow="always">
</div> <div class="dis title-box">
</el-card> <span class="header-title">病种方法分布</span>
</div> <div class="dis"></div>
<div style="flex: 1; margin-left: 20px"> </div>
<el-card shadow="always"> <div style="height: 300px" v-loading="loading">
<div class="dis title-box"> <div id="diseaseMethod" style="width: 100%"></div>
<span class="header-title">PRT</span> </div>
<div class="dis"> </el-card>
<div class="dian-box dis"> </div>
<span class="dian" style="background: #a794fe"></span> 60 min <div style="flex: 1;">
</div> <el-card shadow="always">
<div class="dian-box dis"> <div class="dis title-box">
<span class="dian" style="background: #4f8bff"></span> 90 min <span class="header-title">病种穴位分布</span>
</div> <div class="dis">
<div class="dian-box dis"> </div>
<span class="dian" style="background: #ffcd6c"></span> >90 min </div>
<div style="height: 300px" v-loading="loading">
<div id="acupoint" style="width: 100%"></div>
</div>
</el-card>
</div> -->
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">治疗效果</span>
<div class="dis">
<div class="dian-box dis">
<div class="dian-box dis">
<span class="dian" style="background: #c6a268"></span>
治愈
</div>
<div class="dian-box dis">
<span class="dian" style="background: #906c4a"></span>
显效
</div>
<div class="dian-box dis">
<span class="dian" style="background: #70483e"></span>
好转
</div>
<div class="dian-box dis">
<span class="dian" style="background: #c7bdb1"></span>
无效
</div>
</div>
</div> </div>
</div> </div>
</div> <div style="height: 300px" v-loading="loading">
<!-- 统计图 --> <div id="effect" style="width: 100%"></div>
<div style="height: 300px" v-loading="loading"> </div>
<div id="RPT" style="width: 100%"></div> </el-card>
</div> </div>
</el-card> <div style="flex: 1">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">诊疗费用分布</span>
<div class="dis"></div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="cost" style="width: 100%"></div>
</div>
</el-card>
</div>
</div> </div>
</div> </div>
<!-- <div class="app-container">
<div class="dis" style="width: 100%">
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">治疗效果</span>
<div class="dis">
<div class="dian-box dis">
<div class="dian-box dis">
<span class="dian" style="background: #5C7BD9"></span>
治愈
</div>
<div class="dian-box dis">
<span class="dian" style="background: #91CC75"></span>
显效
</div>
<div class="dian-box dis">
<span class="dian" style="background: #FAC858"></span>
好转
</div>
<div class="dian-box dis">
<span class="dian" style="background: #EE6666"></span>
无效
</div>
</div>
</div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="effect" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">诊疗费用分布</span>
<div class="dis">
</div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="cost" style="width: 100%"></div>
</div>
</el-card>
</div>
</div>
</div> -->
</div> </div>
</template> </template>
@ -89,35 +141,41 @@
import * as echarts from "echarts"; import * as echarts from "echarts";
require("echarts/theme/macarons"); // echarts theme require("echarts/theme/macarons"); // echarts theme
import resize from "@/views/dashboard/mixins/resize"; import resize from "@/views/dashboard/mixins/resize";
import { zlType } from "@/api/indexCom.js";
import { import {
queryDptResult, healTypeEcharts,
queryRptResult, diseaseMethodEcharts,
dataComparison, effectEcharts,
queryXgzlLv, costEcharts,
} from "@/api/indexCom.js"; } from "./index";
import { XGZL, XGSJDB, DPT, RPT } from "./index";
export default { export default {
name: "Post", name: "Post",
props: ["title"], props: ["title"],
mixins: [resize], mixins: [resize],
data() { data() {
return { return {
loading: false,
DPTvalue: null,
RPTvalue: null,
SJDBvalue: null,
XGZLvalue: null,
queryParams: { queryParams: {
param: { param: {
timeType: 4,
startTime: "", startTime: "",
endTime: "", endTime: "",
}, },
}, },
loading: false,
healTypeValue: null, //
diseaseMethod: null, //
effectValue: null, //
costValue: null, //
effectObj: {
zy: "治愈", //
xx: "显效", //
hz: "好转", //
wx: "无效", //
},
}; };
}, },
created() { created() {
// this.getData(); // this.Linepatient();
this.getData();
}, },
methods: { methods: {
statistics(_data, _type) { statistics(_data, _type) {
@ -125,123 +183,117 @@ export default {
this.loading = true; this.loading = true;
this.getData(); // this.getData(); //
}, },
// //
async getData() { async getData() {
try { try {
// /DNT await zlType(this.queryParams).then((res) => {
await queryDptResult(this.queryParams).then((res) => { const { bzfffb, bzxwfb, zlfy, zllxtj, zlxwfb } = res.data;
this.DPTvalue = res.data; //
console.log("this.DPTvalue: ", this.DPTvalue); this.healTypeValue = [
this.DPT(); {
}); value: zllxtj?.zxyjh || 0,
//RPT name: "中西医结合",
await queryRptResult(this.queryParams).then((res) => { },
this.RPTvalue = res.data; {
this.RPT(); value: zllxtj?.czy || 0,
}); name: "纯中医",
// },
// await dataComparison(this.queryParams).then((res) => { ];
// console.log("dataComparison: ", dataComparison); this.handleHealType();
// this.SJDBvalue = res.date; //
// this.SJDB(); // let diseaseMethod = []
// }); // let index = 0
await dataComparison(this.queryParams).then((res) => { // for(let i in bzfffb){
console.log("res1111: ", res); // for(let k in bzfffb[i]){
this.SJDBvalue = res.data; // console.log(bzfffb[i][k])
this.SJDB(); // }
}); // index ++
await queryXgzlLv(this.queryParams).then((res) => { // }
this.XGZLvalue = res.data; // this.handleDiseaseMethod()
this.XGZL();
//
this.effectValue = [
{
name: "治愈",
value: zlxwfb?.zy || 0,
},
{
name: "显效",
value: zlxwfb?.xx || 0,
},
{
name: "好转",
value: zlxwfb?.hz || 0,
},
{
name: "无效",
value: zlxwfb?.wx || 0,
},
];
this.handleEffect();
//
this.costValue = [
zlfy?.score1 || 0,
zlfy?.score2 || 0,
zlfy?.score3 || 0,
zlfy?.score4 || 0,
zlfy?.score5 || 0,
];
this.handleCost();
this.loading = false;
}); });
this.loading = false;
} catch (e) { } catch (e) {
console.log(e, "e"); console.log("治疗类型", e);
} }
}, },
// //
SJDB(_statData) { handleHealType() {
XGSJDB.series[0].data = this.SJDBvalue?.map((item) => { healTypeEcharts.series[0].data = this.healTypeValue;
return item.qiaojie; //
});
XGSJDB.series[1].data = this.SJDBvalue?.map((item) => {
return item.falseQiaojie; //
});
XGSJDB.xAxis[0].data = this.SJDBvalue?.map((item) => {
return item.date; //X
});
this.$nextTick(() => { this.$nextTick(() => {
// domecharts var myChart = echarts.init(document.getElementById("healType"), null, {
var myChart = echarts.init(document.getElementById("SJDB"), null, {
height: 300, height: 300,
}); });
myChart.setOption(XGSJDB, true); myChart.setOption(healTypeEcharts, true);
myChart.resize(); myChart.resize();
window.onresize = myChart.resize; window.onresize = myChart.resize;
}); });
}, },
// //
XGZL() { handleDiseaseMethod() {
XGZL.series[0].data = this.XGZLvalue?.map((item) => { // diseaseMethodEcharts.series[0].data = this.diseaseMethod
return item.decimal; //
});
XGZL.xAxis.data = this.XGZLvalue?.map((item) => {
return item.date; //X
});
this.$nextTick(() => { this.$nextTick(() => {
// domecharts var myChart = echarts.init(
var myChart = echarts.init(document.getElementById("XGZL"), null, { document.getElementById("diseaseMethod"),
height: 300, null,
}); {
myChart.setOption(XGZL, true); height: 300,
}
);
myChart.setOption(diseaseMethodEcharts, true);
myChart.resize(); myChart.resize();
window.onresize = myChart.resize; window.onresize = myChart.resize;
}); });
}, },
// DPT //
DPT() { handleEffect() {
DPT.series[0].data = this.DPTvalue?.map((item) => { effectEcharts.series[0].data = this.effectValue;
return item.dy60; //<= 60
});
DPT.series[1].data = this.DPTvalue?.map((item) => {
return item.dy90; //<= 90
});
DPT.series[2].data = this.DPTvalue?.map((item) => {
return item.other; //<= 90
});
DPT.xAxis[0].data = this.DPTvalue?.map((item) => {
return item.date; //X
});
this.$nextTick(() => { this.$nextTick(() => {
// domecharts var myChart = echarts.init(document.getElementById("effect"), null, {
var myChart = echarts.init(document.getElementById("DPT"), null, {
height: 300, height: 300,
}); });
myChart.setOption(DPT, true); myChart.setOption(effectEcharts, true);
myChart.resize(); myChart.resize();
window.onresize = myChart.resize; window.onresize = myChart.resize;
}); });
}, },
// RPT //
RPT(_statData) { handleCost() {
RPT.series[0].data = this.RPTvalue?.map((item) => { costEcharts.series[0].data = this.costValue;
return item.dy60; //<= 60
});
RPT.series[1].data = this.RPTvalue?.map((item) => {
return item.dy90; //<= 90
});
RPT.series[2].data = this.RPTvalue?.map((item) => {
return item.other; //> 90
});
RPT.xAxis[0].data = this.RPTvalue?.map((item) => {
return item.date; //X
});
this.$nextTick(() => { this.$nextTick(() => {
// domecharts var myChart = echarts.init(document.getElementById("cost"), null, {
var myChart = echarts.init(document.getElementById("RPT"), null, {
height: 300, height: 300,
}); });
myChart.setOption(RPT, true); myChart.setOption(costEcharts, true);
myChart.resize(); myChart.resize();
window.onresize = myChart.resize; window.onresize = myChart.resize;
}); });
@ -251,17 +303,15 @@ export default {
_data[0] = this.$moment(_data[0]).format("YYYY-MM-DD"); _data[0] = this.$moment(_data[0]).format("YYYY-MM-DD");
_data[1] = this.$moment(_data[1]).format("YYYY-MM-DD"); _data[1] = this.$moment(_data[1]).format("YYYY-MM-DD");
this.queryParams.param = { this.queryParams.param = {
timeType: _type,
startTime: _data[0] + " " + "00:00:00", startTime: _data[0] + " " + "00:00:00",
endTime: _data[1] + " " + "23:59:59", endTime: _data[1] + " " + "23:59:59",
}; };
}, },
// //
getRenew() { getRenew() {
this.SJDB(); // this.handleHealType();
this.XGZL(); // this.handleEffect();
this.DPT(); this.handleCost();
this.RPT();
}, },
}, },
}; };
@ -271,19 +321,24 @@ export default {
>>> .el-card__body { >>> .el-card__body {
padding: 10px 0 !important; padding: 10px 0 !important;
} }
.dis { .dis {
display: flex; display: flex;
} }
.header-title { .header-title {
font-size: 18px; font-size: 18px;
} }
.title-box { .title-box {
padding: 10px 20px; padding: 10px 20px;
border-bottom: 1px solid #dfe6ec; border-bottom: 1px solid #dfe6ec;
} }
.dian-box { .dian-box {
align-items: center; align-items: center;
} }
.dian { .dian {
display: inline-block; display: inline-block;
width: 16px; width: 16px;
@ -291,28 +346,37 @@ export default {
border-radius: 50%; border-radius: 50%;
margin: 0 10px; margin: 0 10px;
} }
.title-box { .title-box {
justify-content: space-between; justify-content: space-between;
} }
. >>> .el-radio--small.is-bordered { . >>> .el-radio--small.is-bordered {
margin-right: 20px !important; margin-right: 20px !important;
margin-left: 0 !important; margin-left: 0 !important;
} }
>>> .el-radio__input { >>> .el-radio__input {
display: none; display: none;
} }
>>> .el-radio__label { >>> .el-radio__label {
padding-left: 5px; padding-left: 5px;
} }
.app-container { .app-container {
padding: 0; padding: 0;
display: flex;
justify-content: space-between;
} }
.title { .title {
display: flex; display: flex;
align-items: center; align-items: center;
font-size: 20px; font-size: 20px;
font-weight: 600; font-weight: 600;
} }
.title-bor { .title-bor {
display: inline-block; display: inline-block;
height: 20px; height: 20px;

261
acupuncture-前台/src/views/indexCom/follow.vue

@ -0,0 +1,261 @@
<template>
<div>
<div class="app-container">
<div class="dis" style="width: 100%">
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">随访队列分布</span>
<div class="dis"></div>
</div>
<!-- 患者总数统计图 -->
<div style="height: 300px" v-loading="loading">
<div id="follow" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">失访原因分布</span>
<div class="dis"></div>
</div>
<!-- 患者总数统计图 -->
<div style="height: 300px" v-loading="loading">
<div id="lossFollow" style="width: 100%"></div>
</div>
</el-card>
</div>
</div>
</div>
</div>
</template>
<script>
import * as echarts from "echarts";
require("echarts/theme/macarons"); // echarts theme
import resize from "@/views/dashboard/mixins/resize";
import { sffb, sftj } from "@/api/indexCom.js";
import { followEcharts, lossFollowEcharts } from "./index";
export default {
name: "Post",
props: ["title"],
mixins: [resize],
data() {
return {
loading: false,
followValue: [], //
lossFollowValue: [], //
queryParams: {
param: {
startTime: "",
endTime: "",
},
},
};
},
created() {
// this.Linepatient()
this.getData();
},
methods: {
statistics(_data, _type) {
this.initial(_data, _type); //
this.loading = true;
this.getData(); //
},
//
async getData() {
try {
this.followValue = {};
await sffb(this.queryParams).then((res) => {
res.data.forEach((i) => {
let data = [i.dsf, i.ljsf, i.cqsf, i.zc];
this.followValue[i.queueName] = data;
});
this.handleFollow();
});
await sftj(this.queryParams).then((res) => {
this.lossFollowValue = res.data;
this.handleLossFollow();
});
this.loading = false;
} catch (e) {
console.log("随访", e);
}
},
//
handleFollow() {
followEcharts.series = [];
let colorArr = [
"#C7BDB1",
"#C6A268",
"#906C4A",
"#70483E",
"#582518",
"#C7BDB1",
"#C6A268",
"#906C4A",
"#70483E",
"#582518",
"#C7BDB1",
"#C6A268",
"#906C4A",
"#70483E",
"#582518",
"#C7BDB1",
"#C6A268",
"#906C4A",
"#70483E",
"#582518",
"#C7BDB1",
"#C6A268",
"#906C4A",
"#70483E",
"#582518",
"#C7BDB1",
"#C6A268",
"#906C4A",
"#70483E",
"#582518",
"#C7BDB1",
"#C6A268",
"#906C4A",
"#70483E",
"#582518",
"#C7BDB1",
"#C6A268",
"#906C4A",
"#70483E",
"#582518",
];
let index = 0;
for (let key in this.followValue) {
let series = {
name: key,
data: this.followValue[key],
type: "bar",
barMaxWidth: 24, //
color: colorArr[index],
};
followEcharts.series.push(series);
index++;
}
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("follow"), null, {
height: 300,
});
myChart.setOption(followEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
// 访
handleLossFollow() {
lossFollowEcharts.series[0].data = this.lossFollowValue?.map((item) => {
return item.num;
});
lossFollowEcharts.xAxis.data = this.lossFollowValue?.map((item) => {
return item.reason;
});
this.$nextTick(() => {
var myChart = echarts.init(
document.getElementById("lossFollow"),
null,
{
height: 300,
}
);
myChart.setOption(lossFollowEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
initial(_data, _type) {
_data[0] = this.$moment(_data[0]).format("YYYY-MM-DD");
_data[1] = this.$moment(_data[1]).format("YYYY-MM-DD");
this.queryParams.param = {
startTime: _data[0] + " " + "00:00:00",
endTime: _data[1] + " " + "23:59:59",
};
},
//
getRenew() {
this.handleFollow();
this.handleLossFollow();
},
},
};
</script>
<style scoped src="@/assets/styles/common.css"></style>
<style scoped>
>>> .el-card__body {
padding: 10px 0 !important;
}
.dis {
display: flex;
}
.header-title {
font-size: 18px;
}
.title-box {
padding: 10px 20px;
border-bottom: 1px solid #dfe6ec;
}
.dian-box {
align-items: center;
}
.dian {
display: inline-block;
width: 16px;
height: 16px;
border-radius: 50%;
margin: 0 10px;
}
.title-box {
justify-content: space-between;
}
. >>> .el-radio--small.is-bordered {
margin-right: 20px !important;
margin-left: 0 !important;
}
>>> .el-radio__input {
display: none;
}
>>> .el-radio__label {
padding-left: 5px;
}
.app-container {
padding: 0;
display: flex;
justify-content: space-between;
}
.title {
display: flex;
align-items: center;
font-size: 20px;
font-weight: 600;
}
.title-bor {
display: inline-block;
height: 20px;
width: 6px;
background: #4f8bff;
margin-right: 10px;
border-radius: 8px;
}
</style>

BIN
acupuncture-前台/src/views/indexCom/image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

959
acupuncture-前台/src/views/indexCom/index.js

File diff suppressed because it is too large

646
acupuncture-前台/src/views/indexCom/patient.vue

@ -1,62 +1,78 @@
<template> <template>
<div> <div>
<div class="app-container"> <div class="app-container">
<div class="dis" style="width: 100%"> <div class="dis" style="width: 100%">
<div style="flex: 1; margin-right: 20px"> <div style="flex: 1; margin-right: 20px">
<el-card shadow="always"> <el-card shadow="always">
<div class="dis title-box"> <div class="dis title-box">
<span class="header-title">患者总数</span> <span class="header-title">患者总数</span>
<div class="dis"></div> <div class="dis"></div>
</div> </div>
<!-- 患者总数统计图 --> <!-- 患者总数统计图 -->
<div style="height: 300px" v-loading="loading"> <div
<div id="patienty" style="width: 100%"></div> style="
</div> height: 300px;
</el-card> display: flex;
</div> align-items: center;
<div style="flex: 1"> justify-content: center;
<el-card shadow="always"> "
<div class="dis title-box"> v-loading="loading"
<span class="header-title">性别数量</span> >
<div class="dis"> <div class="div-hz">
<div class="dian-box dis"> <div class="div-hz-icon">
<div class="dian-box dis"> <img src="./image.png" alt="" width="60px" height="60px" />
<span class="dian" style="background: #4f8bff"></span> </div>
<div class="div-hz-num">
</div> <div class="">
<span class="dian" style="background: #fe4943"></span> {{ HZXXvalue[0].value || 0 }}<span></span>
</div>
</div> <div class="hz-num-title">患者总数</div>
</div> </div>
</div> </div>
<!-- 性别统计图 -->
<div style="height: 300px" v-loading="loading"> <!-- <div id="patienty" style="width: 100%"></div> -->
<div id="gender" style="width: 100%"></div> </div>
</div> </el-card>
</el-card> </div>
</div> <div style="flex: 1; margin-right: 20px">
</div> <el-card shadow="always">
</div> <div class="dis title-box">
<div class="app-container"> <span class="header-title">性别数量</span>
<div class="dis" style="width: 100%"> <div class="dis">
<div style="flex: 1; margin-right: 20px"> <div class="dian-box dis">
<el-card shadow="always"> <div class="dian-box dis">
<div class="dis title-box"> <span class="dian" style="background: #70483e"></span>
<span class="header-title">年龄分布</span>
<div class="dis"></div> </div>
</div> <span class="dian" style="background: #c7bdb1"></span>
<!-- 患者总数统计图 -->
<div style="height: 300px" v-loading="loading"> </div>
<div id="age" style="width: 100%"></div> </div>
</div> </div>
</el-card> <!-- 性别统计图 -->
</div> <div style="height: 300px" v-loading="loading">
<div style="flex: 1"> <div id="gender" style="width: 100%"></div>
<el-card shadow="always"> </div>
<div class="dis title-box"> </el-card>
<span class="header-title">既往病种分布</span> </div>
<div class="dis"> <div style="flex: 1; margin-right: 20px">
<!-- <div class="dian-box dis"> <el-card shadow="always">
<div class="dis title-box">
<span class="header-title">年龄分布</span>
<div class="dis"></div>
</div>
<!-- 患者总数统计图 -->
<div style="height: 300px" v-loading="loading">
<div id="age" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">既往病种分布</span>
<div class="dis">
<!-- <div class="dian-box dis">
<div class="dian-box dis"> <div class="dian-box dis">
<span class="dian" style="background: #4f8bff"></span> <span class="dian" style="background: #4f8bff"></span>
@ -64,264 +80,294 @@
<span class="dian" style="background: #ffcd6c"></span> <span class="dian" style="background: #ffcd6c"></span>
</div> --> </div> -->
</div> </div>
</div> </div>
<!-- 既往病种分布 --> <!-- 既往病种分布 -->
<div style="height: 300px" v-loading="loading"> <div style="height: 300px" v-loading="loading">
<div id="disease" style="width: 100%"></div> <div id="disease" style="width: 100%"></div>
</div> </div>
</el-card> </el-card>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import * as echarts from "echarts"; import * as echarts from "echarts";
require("echarts/theme/macarons"); // echarts theme require("echarts/theme/macarons"); // echarts theme
import resize from "@/views/dashboard/mixins/resize"; import resize from "@/views/dashboard/mixins/resize";
import { import { patientTotal, queryByDatePatient } from "@/api/indexCom.js";
patientTotal, import { HZXX, HZXXSJFX, gende, ageEcharts, diseaseEcharts } from "./index";
queryByDatePatient export default {
} from "@/api/indexCom.js"; name: "Post",
import { props: ["title"],
HZXX, mixins: [resize],
HZXXSJFX, data() {
gende, return {
ageEcharts, loading: false,
diseaseEcharts HZXXvalue: null, //
} from "./index"; gendeValue: null, //
export default { ageValue: null, //
name: "Post", diseaseValue: null, //
props: ["title"], queryParams: {
mixins: [resize], param: {
data() { startTime: "",
return { endTime: "",
loading: false, },
HZXXvalue: null, // },
gendeValue: null, // jwbzObj: {
ageValue: null, // gxy: "高血压", //
diseaseValue: null, // nxgb: "脑血管病", //
queryParams: { exzl: "恶性肿瘤", //
param: { gxb: "冠心病", //
startTime: "", jsjb: "精神疾病", //
endTime: "", whsezcky: "胃和十二指肠溃疡", //
}, fpz: "肥胖症", //
}, gzssz: "骨质疏松症", //
jwbzObj: { ycxXtxjb: "遗传性、先天性疾病", //
"gxy": "高血压", // tnb: "糖尿病", //尿
"nxgb": "脑血管病", // mxfxjb: "慢性肺系疾病", //
"exzl": "恶性肿瘤", // gzxz: "高脂血症", //
"gxb": "冠心病", // gzjb: "肝脏疾病", //
"jsjb": "精神疾病", // gmxjb: "过敏性疾病", //
"whsezcky": "胃和十二指肠溃疡", // gjy: "关节炎", //
"fpz": "肥胖症", // tf: "痛风", //
"gzssz": "骨质疏松症", // sySb: "肾炎、肾病", //
"ycxXtxjb": "遗传性、先天性疾病", // other: "其他", //
"tnb": "糖尿病", //尿 },
"mxfxjb": "慢性肺系疾病", // };
"gzxz": "高脂血症", // },
"gzjb": "肝脏疾病", // created() {
"gmxjb": "过敏性疾病", // // this.Linepatient()
"gjy": "关节炎", // this.getData();
"tf": "痛风", // },
"sySb": "肾炎、肾病", // methods: {
"other": "其他" // statistics(_data, _type) {
} this.initial(_data, _type); //
}; this.loading = true;
}, this.getData(); //
created() { },
// this.Linepatient() //
this.getData(); async getData() {
}, try {
methods: { await patientTotal(this.queryParams).then((res) => {
statistics(_data, _type) { //
this.initial(_data, _type); // this.HZXXvalue = [
this.loading = true; {
this.getData(); // value: res.data.totalPatients,
}, name: "患者总数",
// },
async getData() { ];
try { //
await patientTotal(this.queryParams).then((res) => { this.gendeValue = [
// {
this.HZXXvalue = [{ value: res.data.gender.male,
value: res.data.totalPatients, name: "男",
name: "患者总数" },
}, ]; {
// value: res.data.gender.female,
this.gendeValue = [{ name: "女",
value: res.data.totalPatients, },
name: "男" ];
}, //
{ let ageValue = res.data.age || {};
value: res.data.totalPatients, this.ageValue = [
name: "女" ageValue.num1 || 0,
} ageValue.num2 || 0,
]; ageValue.num3 || 0,
// ageValue.num4 || 0,
let ageValue = res.data.age ageValue.num5 || 0,
this.ageValue = [ageValue.num1, ageValue.num2, ageValue.num2, ageValue.num4, ageValue ageValue.num6 || 0,
.num5, ageValue.num6 ];
] //
// let diseaseValue = res.data.jwbz || {};
let diseaseValue = res.data.jwbz this.diseaseValue = [];
this.diseaseValue = [] for (let key in diseaseValue) {
for (let key in diseaseValue) { let data = {
let data = { name: this.jwbzObj[key],
name: this.jwbzObj[key], value: diseaseValue[key] || 0,
value: diseaseValue[key] };
} this.diseaseValue.push(data);
this.diseaseValue.push(data) }
} // this.Linepatient(); //
this.Linepatient(); // this.handleAge(); //
this.handleAge(); // this.columnar(); //
this.columnar(); // this.handleDisease(); //
this.handleDisease(); // });
}); this.loading = false;
this.loading = false; } catch (e) {
} catch (e) {} console.log("患者统计", e);
}, }
},
// //
Linepatient() { Linepatient() {
HZXX.title.text = this.HZXXvalue[0].value; HZXX.title.text = this.HZXXvalue[0].value;
HZXX.series[0].data = this.HZXXvalue; HZXX.series[0].data = this.HZXXvalue;
this.$nextTick(() => { this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("patienty"), null, { var myChart = echarts.init(document.getElementById("patienty"), null, {
height: 300, height: 300,
}); });
myChart.setOption(HZXX, true); myChart.setOption(HZXX, true);
myChart.resize(); myChart.resize();
window.onresize = myChart.resize; window.onresize = myChart.resize;
}); });
}, },
// //
columnar() { columnar() {
gende.series[0].data = this.gendeValue; gende.series[0].data = this.gendeValue;
this.$nextTick(() => { this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("gender"), null, { var myChart = echarts.init(document.getElementById("gender"), null, {
height: 300, height: 300,
}); });
myChart.setOption(gende, true); myChart.setOption(gende, true);
myChart.resize(); myChart.resize();
window.onresize = myChart.resize; window.onresize = myChart.resize;
}); });
}, },
// //
handleAge() { handleAge() {
ageEcharts.series[0].data = this.ageValue ageEcharts.series[0].data = this.ageValue;
this.$nextTick(() => { this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("age"), null, { var myChart = echarts.init(document.getElementById("age"), null, {
height: 300, height: 300,
}); });
myChart.setOption(ageEcharts, true); myChart.setOption(ageEcharts, true);
myChart.resize(); myChart.resize();
window.onresize = myChart.resize; window.onresize = myChart.resize;
}); });
}, },
// //
handleDisease() { handleDisease() {
diseaseEcharts.series[0].data = this.diseaseValue?.map((item) => { diseaseEcharts.series[0].data = this.diseaseValue?.map((item) => {
return item.value; return item.value;
}); });
diseaseEcharts.xAxis.data = this.diseaseValue?.map((item) => { diseaseEcharts.xAxis.data = this.diseaseValue?.map((item) => {
return item.name; return item.name;
}); });
this.$nextTick(() => { this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("disease"), null, { var myChart = echarts.init(document.getElementById("disease"), null, {
height: 300, height: 300,
}); });
myChart.setOption(diseaseEcharts, true); myChart.setOption(diseaseEcharts, true);
myChart.resize(); myChart.resize();
window.onresize = myChart.resize; window.onresize = myChart.resize;
}); });
}, },
// //
initial(_data, _type) { initial(_data, _type) {
_data[0] = this.$moment(_data[0]).format("YYYY-MM-DD"); _data[0] = this.$moment(_data[0]).format("YYYY-MM-DD");
_data[1] = this.$moment(_data[1]).format("YYYY-MM-DD"); _data[1] = this.$moment(_data[1]).format("YYYY-MM-DD");
this.queryParams.param = { this.queryParams.param = {
startTime: _data[0] + " " + "00:00:00", startTime: _data[0] + " " + "00:00:00",
endTime: _data[1] + " " + "23:59:59", endTime: _data[1] + " " + "23:59:59",
}; };
}, },
// //
getRenew() { getRenew() {
// this.Linepatient(); this.Linepatient(); //
// this.columnar(); this.handleAge(); //
}, this.columnar(); //
}, this.handleDisease(); //
}; },
},
};
</script> </script>
<style scoped src="@/assets/styles/common.css"></style> <style scoped src="@/assets/styles/common.css"></style>
<style scoped> <style scoped>
>>>.el-card__body { .div-hz {
padding: 10px 0 !important; background: #c6a268;
} width: 80%;
height: 70%;
border-radius: 10px;
display: flex;
flex-direction: column;
box-sizing: border-box;
padding: 24px;
}
.div-hz-icon {
flex: 1;
}
.div-hz-num {
flex: 1;
font-size: 50px;
color: #ffffff;
text-align: right;
}
.div-hz-num span {
font-size: 24px;
color: #ffffff;
}
.hz-num-title {
font-size: 22px;
color: #ffffff;
}
>>> .el-card__body {
padding: 10px 0 !important;
}
.dis { .dis {
display: flex; display: flex;
} }
.header-title { .header-title {
font-size: 18px; font-size: 18px;
} }
.title-box { .title-box {
padding: 10px 20px; padding: 10px 20px;
border-bottom: 1px solid #dfe6ec; border-bottom: 1px solid #dfe6ec;
} }
.dian-box { .dian-box {
align-items: center; align-items: center;
} }
.dian { .dian {
display: inline-block; display: inline-block;
width: 16px; width: 16px;
height: 16px; height: 16px;
border-radius: 50%; border-radius: 50%;
margin: 0 10px; margin: 0 10px;
} }
.title-box { .title-box {
justify-content: space-between; justify-content: space-between;
} }
.>>>.el-radio--small.is-bordered { . >>> .el-radio--small.is-bordered {
margin-right: 20px !important; margin-right: 20px !important;
margin-left: 0 !important; margin-left: 0 !important;
} }
>>>.el-radio__input { >>> .el-radio__input {
display: none; display: none;
} }
>>>.el-radio__label { >>> .el-radio__label {
padding-left: 5px; padding-left: 5px;
} }
.app-container { .app-container {
padding: 0; padding: 0;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
} }
.title { .title {
display: flex; display: flex;
align-items: center; align-items: center;
font-size: 20px; font-size: 20px;
font-weight: 600; font-weight: 600;
} }
.title-bor { .title-bor {
display: inline-block; display: inline-block;
height: 20px; height: 20px;
width: 6px; width: 6px;
background: #4f8bff; background: #4f8bff;
margin-right: 10px; margin-right: 10px;
border-radius: 8px; border-radius: 8px;
} }
</style> </style>

8
acupuncture-前台/src/views/indexCom/query.vue

@ -6,7 +6,7 @@
</div> </div>
<div> <div>
<div> <div>
<el-radio-group <!-- <el-radio-group
v-model="radioValue" v-model="radioValue"
size="small" size="small"
style="height: 36px" style="height: 36px"
@ -16,11 +16,7 @@
<el-radio label="1" border style="margin: 0 20px 0 0"></el-radio> <el-radio label="1" border style="margin: 0 20px 0 0"></el-radio>
<el-radio label="2" border style="margin: 0 20px 0 0"></el-radio> <el-radio label="2" border style="margin: 0 20px 0 0"></el-radio>
<el-radio label="3" border style="margin: 0 20px 0 0"></el-radio> <el-radio label="3" border style="margin: 0 20px 0 0"></el-radio>
<!-- <el-radio label="4" border style="margin: 0 20px 0 0"></el-radio> </el-radio-group> -->
<el-radio label="4" border style="margin: 0 20px 0 0"></el-radio>
<el-radio label="1" border style="margin: 0 20px 0 0"></el-radio>
<el-radio label="1" border style="margin: 0 20px 0 0"></el-radio> -->
</el-radio-group>
<el-date-picker <el-date-picker
v-model="pickerValue" v-model="pickerValue"
type="daterange" type="daterange"

235
acupuncture-前台/src/views/login.vue

@ -1,85 +1,88 @@
<template> <template>
<div class="login"> <div class="login">
<el-form <div class="login-left"></div>
ref="loginForm" <div class="login-right">
:model="loginForm" <el-form
:rules="loginRules" ref="loginForm"
class="login-form" :model="loginForm"
> :rules="loginRules"
<h3 class="title">针灸后台管理系统</h3> class="login-form"
<el-form-item prop="username">
<el-input
v-model="loginForm.username"
type="text"
auto-complete="off"
placeholder="账号"
>
<svg-icon
slot="prefix"
icon-class="user"
class="el-input__icon input-icon"
/>
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input
v-model="loginForm.password"
type="password"
auto-complete="off"
placeholder="密码"
@keyup.enter.native="handleLogin"
>
<svg-icon
slot="prefix"
icon-class="password"
class="el-input__icon input-icon"
/>
</el-input>
</el-form-item>
<el-form-item prop="code" v-if="captchaEnabled">
<el-input
v-model="loginForm.code"
auto-complete="off"
placeholder="验证码"
style="width: 63%"
@keyup.enter.native="handleLogin"
>
<svg-icon
slot="prefix"
icon-class="validCode"
class="el-input__icon input-icon"
/>
</el-input>
<div class="login-code">
<img :src="codeUrl" @click="getCode" class="login-code-img" />
</div>
</el-form-item>
<el-checkbox
v-model="loginForm.rememberMe"
style="margin: 0px 0px 25px 0px"
>记住密码</el-checkbox
> >
<el-form-item style="width: 100%"> <h3 class="title">
<el-button 登录到
:loading="loading" <br />
size="medium" 朱琏针灸联盟数据系统
type="primary" </h3>
style="width: 100%" <el-form-item prop="username">
@click.native.prevent="handleLogin" <el-input
v-model="loginForm.username"
type="text"
auto-complete="off"
placeholder="账号"
>
<svg-icon
slot="prefix"
icon-class="user"
class="el-input__icon input-icon"
/>
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input
v-model="loginForm.password"
type="password"
auto-complete="off"
placeholder="密码"
@keyup.enter.native="handleLogin"
>
<svg-icon
slot="prefix"
icon-class="password"
class="el-input__icon input-icon"
/>
</el-input>
</el-form-item>
<el-form-item prop="code" v-if="captchaEnabled">
<el-input
v-model="loginForm.code"
auto-complete="off"
placeholder="验证码"
style="width: 63%"
@keyup.enter.native="handleLogin"
>
<svg-icon
slot="prefix"
icon-class="validCode"
class="el-input__icon input-icon"
/>
</el-input>
<div class="login-code">
<img :src="codeUrl" @click="getCode" class="login-code-img" />
</div>
</el-form-item>
<el-checkbox
v-model="loginForm.rememberMe"
style="margin: 0px 0px 25px 0px; color: #fff"
>记住密码</el-checkbox
> >
<span v-if="!loading"> </span> <el-form-item style="width: 100%">
<span v-else> 中...</span> <el-button
</el-button> :loading="loading"
<div style="float: right" v-if="register"> size="medium"
<router-link class="link-type" :to="'/register'" type="primary"
>立即注册</router-link style="width: 100%"
@click.native.prevent="handleLogin"
> >
</div> <span v-if="!loading"> </span>
</el-form-item> <span v-else> 中...</span>
</el-form> </el-button>
<!-- 底部 --> <div style="float: right" v-if="register">
<div class="el-login-footer"> <router-link class="link-type" :to="'/register'"
<span>Copyright © 2018-2025 ruoyi.vip All Rights Reserved.</span> >立即注册</router-link
>
</div>
</el-form-item>
</el-form>
</div> </div>
</div> </div>
</template> </template>
@ -88,27 +91,41 @@
import { getCodeImg } from "@/api/login"; import { getCodeImg } from "@/api/login";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { encrypt, decrypt } from "@/utils/jsencrypt"; import { encrypt, decrypt } from "@/utils/jsencrypt";
import { commonQueue } from "@/api/followupFile";
export default { export default {
name: "Login", name: "Login",
data() { data() {
return { return {
codeUrl: "", codeUrl: "",
loginForm: { loginForm: {
username: "admin", username: "",
password: "admin123", password: "",
rememberMe: false, rememberMe: false,
code: "", code: "",
uuid: "", uuid: "",
}, },
loginRules: { loginRules: {
username: [ username: [
{ required: true, trigger: "blur", message: "请输入您的账号" }, {
required: true,
trigger: "blur",
message: "请输入您的账号",
},
], ],
password: [ password: [
{ required: true, trigger: "blur", message: "请输入您的密码" }, {
required: true,
trigger: "blur",
message: "请输入您的密码",
},
],
code: [
{
required: true,
trigger: "change",
message: "请输入验证码",
},
], ],
code: [{ required: true, trigger: "change", message: "请输入验证码" }],
}, },
loading: false, loading: false,
// //
@ -157,7 +174,9 @@ export default {
if (valid) { if (valid) {
this.loading = true; this.loading = true;
if (this.loginForm.rememberMe) { if (this.loginForm.rememberMe) {
Cookies.set("username", this.loginForm.username, { expires: 30 }); Cookies.set("username", this.loginForm.username, {
expires: 30,
});
Cookies.set("password", encrypt(this.loginForm.password), { Cookies.set("password", encrypt(this.loginForm.password), {
expires: 30, expires: 30,
}); });
@ -172,7 +191,12 @@ export default {
this.$store this.$store
.dispatch("Login", this.loginForm) .dispatch("Login", this.loginForm)
.then(() => { .then(() => {
this.$router.push({ path: this.redirect || "/" }).catch(() => {}); this.$router
.push({
path: this.redirect || "/",
})
.catch(() => {});
this.getCommonQueue();
}) })
.catch(() => { .catch(() => {
this.loading = false; this.loading = false;
@ -183,6 +207,20 @@ export default {
} }
}); });
}, },
//
getCommonQueue() {
commonQueue({
pageNum: -1,
param: {
status: 1,
},
}).then((res) => {
res.data.list.forEach((i) => {
i.type = 1;
});
localStorage.setItem("commonQueue", JSON.stringify(res.data.list));
});
},
}, },
}; };
</script> </script>
@ -193,46 +231,64 @@ export default {
justify-content: center; justify-content: center;
align-items: center; align-items: center;
height: 100%; height: 100%;
background-image: url("../assets/images/login-background.jpg"); background-image: url("./bg.png");
background-size: cover; background-size: cover;
display: flex;
.login-left {
flex: 1.5;
}
.login-right {
flex: 1;
}
} }
.title { .title {
font-size: 26 px;
margin: 0px auto 30px auto; margin: 0px auto 30px auto;
text-align: center; text-align: left;
color: #707070; color: #fff;
line-height: 28px;
} }
.login-form { .login-form {
border-radius: 6px; border-radius: 6px;
background: #ffffff; // background: #ffffff;
width: 400px; width: 400px;
padding: 25px 25px 5px 25px; padding: 25px 25px 5px 25px;
.el-input { .el-input {
height: 38px; height: 38px;
input { input {
height: 38px; height: 38px;
} }
} }
.input-icon { .input-icon {
height: 39px; height: 39px;
width: 14px; width: 14px;
margin-left: 2px; margin-left: 2px;
} }
} }
.login-tip { .login-tip {
font-size: 13px; font-size: 13px;
text-align: center; text-align: center;
color: #bfbfbf; color: #bfbfbf;
} }
.login-code { .login-code {
width: 33%; width: 33%;
height: 38px; height: 38px;
float: right; float: right;
img { img {
cursor: pointer; cursor: pointer;
vertical-align: middle; vertical-align: middle;
} }
} }
.el-login-footer { .el-login-footer {
height: 40px; height: 40px;
line-height: 40px; line-height: 40px;
@ -245,6 +301,7 @@ export default {
font-size: 12px; font-size: 12px;
letter-spacing: 1px; letter-spacing: 1px;
} }
.login-code-img { .login-code-img {
height: 38px; height: 38px;
} }

374
acupuncture-前台/src/views/medicalFile/components/anxiety/HAMD.vue

@ -0,0 +1,374 @@
<template>
<div>
<!--
1 抑郁情绪 01只在问到时才诉述2在访谈中自发地表达3从表情姿势声音中流露4几乎完全表现为这种情绪
2 有罪感 01责备自己感到连累他人2认为自己犯了罪3认为疾病是惩罚4罪恶妄想伴有幻觉
3 自杀 01觉得活着没有意义2希望死去3有自杀念头4有自杀行为
4 入睡困难 01有时入睡困难2每晚入睡困难
5 睡眠不深 01睡眠浅多恶梦2半夜醒来
6 早醒 01早醒但能重新入睡2早醒后无法重新入睡
7 工作和兴趣 0无困难1提问时才诉述2自发表达对活动失去兴趣3病室劳动或娱乐不满3小时4停止工作或无法完成日常事务
8 迟缓 01提问时才诉述2自发表达迟缓3明显迟缓4完全迟缓
9 激越 01有些心神不宁2明显心神不宁3不能静坐4严重激越
10 精神性焦虑 01问时诉述2自发表达3明显忧虑4明显惊恐
11 躯体性焦虑 01轻度2中度3重度4严重影响生活
12 胃肠道症状 01食欲减退2进食需他人催促3需用泻药或助消化药
13 全身症状 01轻度2明显
14 性症状 01轻度2重度3不适合或不能肯定
15 疑病 01对身体过分关注2反复考虑健康问题3有疑病妄想4伴有幻觉的疑病妄想
16 体重减轻 01可能有体重减轻2肯定体重减轻
17 自知力 0知道自己有病1归咎于其他原因2完全否认有病
18 认知障碍 01轻度2中度3重度4极重度
19 日夜变化 01有日夜变化
20 人格解体 01轻度2中度3重度4极重度
21 偏执症状 01轻度2中度3重度4极重度
22 强迫症状 01轻度2中度3重度4极重度
23 躯体化症状 01轻度2中度3重度4极重度
24 社交退缩 01轻度2中度3重度4极重度
-->
<div>
<div
class="item-container"
v-for="(item, index) in questions"
:key="index"
>
<div class="item-title">{{ item.index }}. {{ item.question }}</div>
<div class="item-radio-box">
<el-radio-group v-model="form[`topic${item.index}`]">
<el-radio
v-for="(criteria, index) in item.criteria"
:key="index"
:label="criteria.value"
>{{ criteria.label }}
</el-radio>
</el-radio-group>
</div>
</div>
<div class="submit-box">
<el-button type="primary" class="submit-box-but" @click="submitForm"
>提交</el-button
>
</div>
</div>
</div>
</template>
<script>
export default {
name: "phq",
props: ["scaleCode"],
data() {
return {
form: {},
questions: [
{
index: 1,
question: "抑郁情绪",
criteria: [
{ label: "无", value: 0 },
{ label: "只在问到时才诉述", value: 1 },
{ label: "在访谈中自发地表达", value: 2 },
{ label: "从表情、姿势、声音中流露", value: 3 },
{ label: "几乎完全表现为这种情绪", value: 4 },
],
},
{
index: 2,
question: "有罪感",
criteria: [
{ label: "无", value: 0 },
{ label: "责备自己,感到连累他人", value: 1 },
{ label: "认为自己犯了罪", value: 2 },
{ label: "认为疾病是惩罚", value: 3 },
{ label: "罪恶妄想伴有幻觉", value: 4 },
],
},
{
index: 3,
question: "自杀",
criteria: [
{ label: "无", value: 0 },
{ label: "觉得活着没有意义", value: 1 },
{ label: "希望死去", value: 2 },
{ label: "有自杀念头", value: 3 },
{ label: "有自杀行为", value: 4 },
],
},
{
index: 4,
question: "入睡困难",
criteria: [
{ label: "无", value: 0 },
{ label: "有时入睡困难", value: 1 },
{ label: "每晚入睡困难", value: 2 },
],
},
{
index: 5,
question: "睡眠不深",
criteria: [
{ label: "无", value: 0 },
{ label: "睡眠浅多恶梦", value: 1 },
{ label: "半夜醒来", value: 2 },
],
},
{
index: 6,
question: "早醒",
criteria: [
{ label: "无", value: 0 },
{ label: "早醒但能重新入睡", value: 1 },
{ label: "早醒后无法重新入睡", value: 2 },
],
},
{
index: 7,
question: "工作和兴趣",
criteria: [
{ label: "无困难", value: 0 },
{ label: "提问时才诉述", value: 1 },
{ label: "自发表达对活动失去兴趣", value: 2 },
{ label: "病室劳动或娱乐不满3小时", value: 3 },
{ label: "停止工作或无法完成日常事务", value: 4 },
],
},
{
index: 8,
question: "迟缓",
criteria: [
{ label: "无", value: 0 },
{ label: "提问时才诉述", value: 1 },
{ label: "自发表达迟缓", value: 2 },
{ label: "明显迟缓", value: 3 },
{ label: "完全迟缓", value: 4 },
],
},
{
index: 9,
question: "激越",
criteria: [
{ label: "无", value: 0 },
{ label: "有些心神不宁", value: 1 },
{ label: "明显心神不宁", value: 2 },
{ label: "不能静坐", value: 3 },
{ label: "严重激越", value: 4 },
],
},
{
index: 10,
question: "精神性焦虑",
criteria: [
{ label: "无", value: 0 },
{ label: "问时诉述", value: 1 },
{ label: "自发表达", value: 2 },
{ label: "明显忧虑", value: 3 },
{ label: "明显惊恐", value: 4 },
],
},
{
index: 11,
question: "躯体性焦虑",
criteria: [
{ label: "无", value: 0 },
{ label: "轻度", value: 1 },
{ label: "中度", value: 2 },
{ label: "重度", value: 3 },
{ label: "严重影响生活", value: 4 },
],
},
{
index: 12,
question: "胃肠道症状",
criteria: [
{ label: "无", value: 0 },
{ label: "食欲减退", value: 1 },
{ label: "进食需他人催促", value: 2 },
{ label: "需用泻药或助消化药", value: 3 },
],
},
{
index: 13,
question: "全身症状",
criteria: [
{ label: "无", value: 0 },
{ label: "轻度", value: 1 },
{ label: "明显", value: 2 },
],
},
{
index: 14,
question: "性症状",
criteria: [
{ label: "无", value: 0 },
{ label: "轻度", value: 1 },
{ label: "重度", value: 2 },
{ label: "不适合或不能肯定", value: 3 },
],
},
{
index: 15,
question: "疑病",
criteria: [
{ label: "无", value: 0 },
{ label: "对身体过分关注", value: 1 },
{ label: "反复考虑健康问题", value: 2 },
{ label: "有疑病妄想", value: 3 },
{ label: "伴有幻觉的疑病妄想", value: 4 },
],
},
{
index: 16,
question: "体重减轻",
criteria: [
{ label: "无", value: 0 },
{ label: "可能有体重减轻", value: 1 },
{ label: "肯定体重减轻", value: 2 },
],
},
{
index: 17,
question: "自知力",
criteria: [
{ label: "知道自己有病", value: 0 },
{ label: "归咎于其他原因", value: 1 },
{ label: "完全否认有病", value: 2 },
],
},
{
index: 18,
question: "认知障碍",
criteria: [
{ label: "无", value: 0 },
{ label: "轻度", value: 1 },
{ label: "中度", value: 2 },
{ label: "重度", value: 3 },
{ label: "极重度", value: 4 },
],
},
{
index: 19,
question: "日夜变化",
criteria: [
{ label: "无", value: 0 },
{ label: "有日夜变化", value: 1 },
],
},
{
index: 20,
question: "人格解体",
criteria: [
{ label: "无", value: 0 },
{ label: "轻度", value: 1 },
{ label: "中度", value: 2 },
{ label: "重度", value: 3 },
{ label: "极重度", value: 4 },
],
},
{
index: 21,
question: "偏执症状",
criteria: [
{ label: "无", value: 0 },
{ label: "轻度", value: 1 },
{ label: "中度", value: 2 },
{ label: "重度", value: 3 },
{ label: "极重度", value: 4 },
],
},
{
index: 22,
question: "强迫症状",
criteria: [
{ label: "无", value: 0 },
{ label: "轻度", value: 1 },
{ label: "中度", value: 2 },
{ label: "重度", value: 3 },
{ label: "极重度", value: 4 },
],
},
{
index: 23,
question: "躯体化症状",
criteria: [
{ label: "无", value: 0 },
{ label: "轻度", value: 1 },
{ label: "中度", value: 2 },
{ label: "重度", value: 3 },
{ label: "极重度", value: 4 },
],
},
{
index: 24,
question: "社交退缩",
criteria: [
{ label: "无", value: 0 },
{ label: "轻度", value: 1 },
{ label: "中度", value: 2 },
{ label: "重度", value: 3 },
{ label: "极重度", value: 4 },
],
},
],
scaleData: {},
};
},
created() {
this.treatmentId = this.$route.query.treatmentId; // id
let scaleData = localStorage.getItem("scaleData"); //
// scaleData
this.scaleData = scaleData
? JSON.parse(scaleData)
: {
[this.treatmentId]: {},
};
// scaleData[this.treatmentId]
if (!this.scaleData[this.treatmentId]) {
this.scaleData[this.treatmentId] = {};
}
this.form = this.scaleData[this.treatmentId][this.scaleCode] || {}; // form
},
methods: {
submitForm() {
let score = 0;
// , topic${i}
for (let i = 1; i <= 24; i++) {
if (this.form[`topic${i}`] !== undefined) {
score += this.form[`topic${i}`];
}
}
//
this.scaleData[this.treatmentId][this.scaleCode] = this.form;
localStorage.setItem("scaleData", JSON.stringify(this.scaleData));
//
this.$emit("getScaleResult", score, this.scaleCode);
},
},
};
</script>
<style scoped src="@/assets/styles/common.css"></style>
<style scoped>
.item-title {
font-size: 20px;
font-weight: bold;
color: #3d3d3d;
line-height: 26px;
}
.item-radio-box {
margin: 16px 0px;
}
>>> .el-radio__label {
font-size: 18px;
color: #555555;
line-height: 20px;
}
.submit-box {
display: flex;
justify-content: center;
align-items: center;
.submit-box-but {
width: 200px;
}
}
</style>

323
acupuncture-前台/src/views/medicalFile/components/anxiety/SAS.vue

@ -0,0 +1,323 @@
<template>
<div>
<!--
1 我觉得比平常容易紧张和着急焦虑 1没有或很少时间2小部分时间3相当多时间4绝大部分或全部时间
2 我无缘无故地感到害怕害怕 1没有或很少时间2小部分时间3相当多时间4绝大部分或全部时间
3 我容易心里烦乱或觉得惊恐惊恐 1没有或很少时间2小部分时间3相当多时间4绝大部分或全部时间
4 我觉得我可能将要发疯发疯感 1没有或很少时间2小部分时间3相当多时间4绝大部分或全部时间
5 我觉得一切都很好也不会发生什么不幸不幸预感 4没有或很少时间3小部分时间2相当多时间1绝大部分或全部时间
6 我手脚发抖打颤手足颤抖 1没有或很少时间2小部分时间3相当多时间4绝大部分或全部时间
7 我因为头痛头颈痛和背痛而苦恼躯体疼痛 1没有或很少时间2小部分时间3相当多时间4绝大部分或全部时间
8 我感觉容易衰弱和疲乏乏力 1没有或很少时间2小部分时间3相当多时间4绝大部分或全部时间
9 我觉得心平气和并且容易安静坐着静坐不能 4没有或很少时间3小部分时间2相当多时间1绝大部分或全部时间
10 我觉得心跳得很快心悸 1没有或很少时间2小部分时间3相当多时间4绝大部分或全部时间
11 我因为一阵阵头晕而苦恼头晕 1没有或很少时间2小部分时间3相当多时间4绝大部分或全部时间
12 我有晕倒发作或觉得要晕倒似的晕厥感 1没有或很少时间2小部分时间3相当多时间4绝大部分或全部时间
13 我呼气吸气都感到很容易呼吸困难 4没有或很少时间3小部分时间2相当多时间1绝大部分或全部时间
14 我手脚麻木和刺痛手足刺痛 1没有或很少时间2小部分时间3相当多时间4绝大部分或全部时间
15 我因为胃痛和消化不良而苦恼胃痛消化不良 1没有或很少时间2小部分时间3相当多时间4绝大部分或全部时间
16 我常常要小便尿意频数 1没有或很少时间2小部分时间3相当多时间4绝大部分或全部时间
17 我的手常常是干燥温暖的多汗 4没有或很少时间3小部分时间2相当多时间1绝大部分或全部时间
18 我脸红发热面部潮红 1没有或很少时间2小部分时间3相当多时间4绝大部分或全部时间
19 我容易入睡并且一夜睡得很好睡眠障碍 4没有或很少时间3小部分时间2相当多时间1绝大部分或全部时间
20 我做噩梦噩梦 1没有或很少时间2小部分时间3相当多时间4绝大部分或全部时间
-->
<div>
<div
class="item-container"
v-for="(item, index) in questions"
:key="index"
>
<div class="item-title">{{ item.index }}. {{ item.question }}</div>
<div class="item-radio-box">
<el-radio-group v-model="form[`topic${item.index}`]">
<el-radio
v-for="(criteria, index) in item.criteria"
:key="index"
:label="criteria.value"
>{{ criteria.label }}
</el-radio>
</el-radio-group>
</div>
</div>
<div class="submit-box">
<el-button type="primary" class="submit-box-but" @click="submitForm"
>提交</el-button
>
</div>
</div>
</div>
</template>
<script>
export default {
name: "phq",
props: ["scaleCode"],
data() {
return {
form: {},
questions: [
{
index: 1,
question: "我觉得比平常容易紧张和着急(焦虑)",
criteria: [
{ label: "没有或很少时间", value: 1 },
{ label: "小部分时间", value: 2 },
{ label: "相当多时间", value: 3 },
{ label: "绝大部分或全部时间", value: 4 },
],
},
{
index: 2,
question: "我无缘无故地感到害怕(害怕)",
criteria: [
{ label: "没有或很少时间", value: 1 },
{ label: "小部分时间", value: 2 },
{ label: "相当多时间", value: 3 },
{ label: "绝大部分或全部时间", value: 4 },
],
},
{
index: 3,
question: "我容易心里烦乱或觉得惊恐(惊恐)",
criteria: [
{ label: "没有或很少时间", value: 1 },
{ label: "小部分时间", value: 2 },
{ label: "相当多时间", value: 3 },
{ label: "绝大部分或全部时间", value: 4 },
],
},
{
index: 4,
question: "我觉得我可能将要发疯(发疯感)",
criteria: [
{ label: "没有或很少时间", value: 1 },
{ label: "小部分时间", value: 2 },
{ label: "相当多时间", value: 3 },
{ label: "绝大部分或全部时间", value: 4 },
],
},
{
index: 5,
question: "我觉得一切都很好,也不会发生什么不幸(不幸预感)",
criteria: [
{ label: "没有或很少时间", value: 4 },
{ label: "小部分时间", value: 3 },
{ label: "相当多时间", value: 2 },
{ label: "绝大部分或全部时间", value: 1 },
],
},
{
index: 6,
question: "我手脚发抖打颤(手足颤抖)",
criteria: [
{ label: "没有或很少时间", value: 1 },
{ label: "小部分时间", value: 2 },
{ label: "相当多时间", value: 3 },
{ label: "绝大部分或全部时间", value: 4 },
],
},
{
index: 7,
question: "我因为头痛、头颈痛和背痛而苦恼(躯体疼痛)",
criteria: [
{ label: "没有或很少时间", value: 1 },
{ label: "小部分时间", value: 2 },
{ label: "相当多时间", value: 3 },
{ label: "绝大部分或全部时间", value: 4 },
],
},
{
index: 8,
question: "我感觉容易衰弱和疲乏(乏力)",
criteria: [
{ label: "没有或很少时间", value: 1 },
{ label: "小部分时间", value: 2 },
{ label: "相当多时间", value: 3 },
{ label: "绝大部分或全部时间", value: 4 },
],
},
{
index: 9,
question: "我觉得心平气和,并且容易安静坐着(静坐不能)",
criteria: [
{ label: "没有或很少时间", value: 4 },
{ label: "小部分时间", value: 3 },
{ label: "相当多时间", value: 2 },
{ label: "绝大部分或全部时间", value: 1 },
],
},
{
index: 10,
question: "我觉得心跳得很快(心悸)",
criteria: [
{ label: "没有或很少时间", value: 1 },
{ label: "小部分时间", value: 2 },
{ label: "相当多时间", value: 3 },
{ label: "绝大部分或全部时间", value: 4 },
],
},
{
index: 11,
question: "我因为一阵阵头晕而苦恼(头晕)",
criteria: [
{ label: "没有或很少时间", value: 1 },
{ label: "小部分时间", value: 2 },
{ label: "相当多时间", value: 3 },
{ label: "绝大部分或全部时间", value: 4 },
],
},
{
index: 12,
question: "我有晕倒发作或觉得要晕倒似的(晕厥感)",
criteria: [
{ label: "没有或很少时间", value: 1 },
{ label: "小部分时间", value: 2 },
{ label: "相当多时间", value: 3 },
{ label: "绝大部分或全部时间", value: 4 },
],
},
{
index: 13,
question: "我呼气、吸气都感到很容易(呼吸困难)",
criteria: [
{ label: "没有或很少时间", value: 4 },
{ label: "小部分时间", value: 3 },
{ label: "相当多时间", value: 2 },
{ label: "绝大部分或全部时间", value: 1 },
],
},
{
index: 14,
question: "我手脚麻木和刺痛(手足刺痛)",
criteria: [
{ label: "没有或很少时间", value: 1 },
{ label: "小部分时间", value: 2 },
{ label: "相当多时间", value: 3 },
{ label: "绝大部分或全部时间", value: 4 },
],
},
{
index: 15,
question: "我因为胃痛和消化不良而苦恼(胃痛,消化不良)",
criteria: [
{ label: "没有或很少时间", value: 1 },
{ label: "小部分时间", value: 2 },
{ label: "相当多时间", value: 3 },
{ label: "绝大部分或全部时间", value: 4 },
],
},
{
index: 16,
question: "我常常要小便(尿意频数)",
criteria: [
{ label: "没有或很少时间", value: 1 },
{ label: "小部分时间", value: 2 },
{ label: "相当多时间", value: 3 },
{ label: "绝大部分或全部时间", value: 4 },
],
},
{
index: 17,
question: "我的手常常是干燥温暖的(多汗)",
criteria: [
{ label: "没有或很少时间", value: 4 },
{ label: "小部分时间", value: 3 },
{ label: "相当多时间", value: 2 },
{ label: "绝大部分或全部时间", value: 1 },
],
},
{
index: 18,
question: "我脸红发热(面部潮红)",
criteria: [
{ label: "没有或很少时间", value: 1 },
{ label: "小部分时间", value: 2 },
{ label: "相当多时间", value: 3 },
{ label: "绝大部分或全部时间", value: 4 },
],
},
{
index: 19,
question: "我容易入睡,并且一夜睡得很好(睡眠障碍)",
criteria: [
{ label: "没有或很少时间", value: 4 },
{ label: "小部分时间", value: 3 },
{ label: "相当多时间", value: 2 },
{ label: "绝大部分或全部时间", value: 1 },
],
},
{
index: 20,
question: "我做噩梦(噩梦)",
criteria: [
{ label: "没有或很少时间", value: 1 },
{ label: "小部分时间", value: 2 },
{ label: "相当多时间", value: 3 },
{ label: "绝大部分或全部时间", value: 4 },
],
},
],
scaleData: {},
};
},
created() {
this.treatmentId = this.$route.query.treatmentId; // id
let scaleData = localStorage.getItem("scaleData"); //
// scaleData
this.scaleData = scaleData
? JSON.parse(scaleData)
: {
[this.treatmentId]: {},
};
// scaleData[this.treatmentId]
if (!this.scaleData[this.treatmentId]) {
this.scaleData[this.treatmentId] = {};
}
this.form = this.scaleData[this.treatmentId][this.scaleCode] || {}; // form
},
methods: {
submitForm() {
let score = 0;
// , topic${i}
for (let i = 1; i <= 20; i++) {
if (this.form[`topic${i}`] !== undefined) {
score += this.form[`topic${i}`];
}
}
//
this.scaleData[this.treatmentId][this.scaleCode] = this.form;
localStorage.setItem("scaleData", JSON.stringify(this.scaleData));
//
this.$emit("getScaleResult", score, this.scaleCode);
},
},
};
</script>
<style scoped src="@/assets/styles/common.css"></style>
<style scoped>
.item-title {
font-size: 20px;
font-weight: bold;
color: #3d3d3d;
line-height: 26px;
}
.item-radio-box {
margin: 16px 0px;
}
>>> .el-radio__label {
font-size: 18px;
color: #555555;
line-height: 20px;
}
.submit-box {
display: flex;
justify-content: center;
align-items: center;
.submit-box-but {
width: 200px;
}
}
</style>

202
acupuncture-前台/src/views/medicalFile/components/posture/PHQ-9.vue

@ -0,0 +1,202 @@
<template>
<div>
<!--
分值范围
评分方法每个条目根据症状频率评分0分表示完全没有1分表示有几天2分表示七天以上3分表示接近每天总分范围为0~27
分值意义
0~4无或极轻微的抑郁症状
5~9轻度抑郁
10~14中度抑郁
15~19中重度抑郁
20~27重度抑郁
-->
<div>
<div
class="item-container"
v-for="(item, index) in questions"
:key="index"
>
<div class="item-title">{{ item.index }}. {{ item.question }}</div>
<div class="item-radio-box">
<el-radio-group v-model="form[`topic${item.index}`]">
<el-radio
v-for="(criteria, index) in item.criteria"
:key="index"
:label="criteria.value"
>{{ criteria.label }}
</el-radio>
</el-radio-group>
</div>
</div>
<div class="submit-box">
<el-button class="submit-box-but" type="primary" @click="submitForm"
>提交</el-button
>
</div>
</div>
</div>
</template>
<script>
export default {
name: "PHQ9",
props: ["scaleCode"],
data() {
return {
form: {},
questions: [
{
index: 1,
question: "做任何事都觉得沉闷或者根本不想做任何事",
criteria: [
{ label: "完全没有", value: 0 },
{ label: "有几天", value: 1 },
{ label: "七天以上", value: 2 },
{ label: "接近每天", value: 3 },
],
},
{
index: 2,
question: "情绪低落、忧郁或绝望",
criteria: [
{ label: "完全没有", value: 0 },
{ label: "有几天", value: 1 },
{ label: "七天以上", value: 2 },
{ label: "接近每天", value: 3 },
],
},
{
index: 3,
question: "难于入睡、半夜会醒,或相反,睡觉时间过多",
criteria: [
{ label: "完全没有", value: 0 },
{ label: "有几天", value: 1 },
{ label: "七天以上", value: 2 },
{ label: "接近每天", value: 3 },
],
},
{
index: 4,
question: "觉得疲倦或没有精力",
criteria: [
{ label: "完全没有", value: 0 },
{ label: "有几天", value: 1 },
{ label: "七天以上", value: 2 },
{ label: "接近每天", value: 3 },
],
},
{
index: 5,
question: "胃口不好或饮食过量",
criteria: [
{ label: "完全没有", value: 0 },
{ label: "有几天", value: 1 },
{ label: "七天以上", value: 2 },
{ label: "接近每天", value: 3 },
],
},
{
index: 6,
question: "觉得自己做得不好、对自己失望或有负家人期望",
criteria: [
{ label: "完全没有", value: 0 },
{ label: "有几天", value: 1 },
{ label: "七天以上", value: 2 },
{ label: "接近每天", value: 3 },
],
},
{
index: 7,
question: "难于集中精神做事,例如看报纸或看电视",
criteria: [
{ label: "完全没有", value: 0 },
{ label: "有几天", value: 1 },
{ label: "七天以上", value: 2 },
{ label: "接近每天", value: 3 },
],
},
{
index: 8,
question:
"其它人可能会注意到您在动或说话的时候比平时慢;或者相反,您坐立不安,比起平时有多余的身体动作",
criteria: [
{ label: "完全没有", value: 0 },
{ label: "有几天", value: 1 },
{ label: "七天以上", value: 2 },
{ label: "接近每天", value: 3 },
],
},
{
index: 9,
question: "想到自己不如死了算了,或者有自残的念头",
criteria: [
{ label: "完全没有", value: 0 },
{ label: "有几天", value: 1 },
{ label: "七天以上", value: 2 },
{ label: "接近每天", value: 3 },
],
},
],
scaleData: {},
};
},
created() {
this.treatmentId = this.$route.query.treatmentId; // id
let scaleData = localStorage.getItem("scaleData"); //
// scaleData
this.scaleData = scaleData
? JSON.parse(scaleData)
: {
[this.treatmentId]: {},
};
// scaleData[this.treatmentId]
if (!this.scaleData[this.treatmentId]) {
this.scaleData[this.treatmentId] = {};
}
this.form = this.scaleData[this.treatmentId][this.scaleCode] || {}; // form
},
methods: {
submitForm() {
let score = 0;
// , topic${i}
for (let i = 1; i <= 9; i++) {
if (this.form[`topic${i}`] !== undefined) {
score += this.form[`topic${i}`];
}
}
//
this.scaleData[this.treatmentId][this.scaleCode] = this.form;
localStorage.setItem("scaleData", JSON.stringify(this.scaleData));
//
this.$emit("getScaleResult", score, this.scaleCode);
},
},
};
</script>
<style scoped src="@/assets/styles/common.css"></style>
<style scoped>
.item-title {
font-size: 20px;
font-weight: bold;
color: #3d3d3d;
line-height: 26px;
}
.item-radio-box {
margin: 16px 0px;
}
>>> .el-radio__label {
font-size: 18px;
color: #555555;
line-height: 20px;
}
.submit-box {
display: flex;
justify-content: center;
align-items: center;
.submit-box-but {
width: 200px;
}
}
</style>

171
acupuncture-前台/src/views/medicalFile/components/posture/PSQI.vue

@ -0,0 +1,171 @@
<template>
<div>
<div>
<div
class="item-container"
v-for="(item, index) in questions"
:key="index"
>
<div class="item-title">{{ item.index }}. {{ item.question }}</div>
<div class="item-radio-box">
<el-radio-group v-model="form[`topic${item.index}`]">
<el-radio
v-for="(criteria, index) in item.criteria"
:key="index"
:label="criteria.value"
>{{ criteria.label }}
</el-radio>
</el-radio-group>
</div>
</div>
<div class="submit-box">
<el-button class="submit-box-but" type="primary" @click="submitForm"
>提交</el-button
>
</div>
</div>
</div>
</template>
<script>
export default {
name: "PHQ9",
props: ["scaleCode"],
data() {
return {
form: {},
questions: [
{
index: 1,
question: "睡眠质量-总体评价睡眠质量",
criteria: [
{ label: "很好", value: 0 },
{ label: "较好", value: 1 },
{ label: "较差", value: 2 },
{ label: "很差", value: 3 },
],
},
{
index: 2,
question: "入睡时间-从上床到入睡的时间",
criteria: [
{ label: "≤15分钟", value: 0 },
{ label: "16~30分钟", value: 1 },
{ label: "31~60分钟", value: 2 },
{ label: "≥60分钟", value: 3 },
],
},
{
index: 3,
question: "睡眠时间-每晚实际睡眠时间",
criteria: [
{ label: ">7小时", value: 0 },
{ label: "6~7小时", value: 1 },
{ label: "5~6小时", value: 2 },
{ label: "<5小时", value: 3 },
],
},
{
index: 4,
question: "睡眠效率-睡眠时间与床上时间的比例",
criteria: [
{ label: ">85%", value: 0 },
{ label: "75%~84%", value: 1 },
{ label: "65%~74%", value: 2 },
{ label: "<65%", value: 3 },
],
},
{
index: 5,
question: "睡眠障碍-夜间醒来、呼吸困难、噩梦等",
criteria: [
{ label: "每项无", value: 0 },
{ label: "<1次/周", value: 1 },
{ label: "1~2次/周", value: 2 },
{ label: "≥3次/周", value: 3 },
],
},
{
index: 6,
question: "催眠药物-使用催眠药物的频率",
criteria: [
{ label: "无", value: 0 },
{ label: "<1次/周", value: 1 },
{ label: "1~2次/周", value: 2 },
{ label: "≥3次/周", value: 3 },
],
},
{
index: 7,
question: "日间功能障碍-白天困倦、注意力不集中等",
criteria: [
{ label: "无", value: 0 },
{ label: "<1次/周", value: 1 },
{ label: "1~2次/周", value: 2 },
{ label: "≥3次/周", value: 3 },
],
},
],
scaleData: {},
};
},
created() {
this.treatmentId = this.$route.query.treatmentId; // id
let scaleData = localStorage.getItem("scaleData"); //
// scaleData
this.scaleData = scaleData
? JSON.parse(scaleData)
: {
[this.treatmentId]: {},
};
// scaleData[this.treatmentId]
if (!this.scaleData[this.treatmentId]) {
this.scaleData[this.treatmentId] = {};
}
this.form = this.scaleData[this.treatmentId][this.scaleCode] || {}; // form
},
methods: {
submitForm() {
let score = 0;
// , topic${i}
for (let i = 1; i <= 7; i++) {
if (this.form[`topic${i}`] !== undefined) {
score += this.form[`topic${i}`];
}
}
//
this.scaleData[this.treatmentId][this.scaleCode] = this.form;
localStorage.setItem("scaleData", JSON.stringify(this.scaleData));
//
this.$emit("getScaleResult", score, this.scaleCode);
},
},
};
</script>
<style scoped src="@/assets/styles/common.css"></style>
<style scoped>
.item-title {
font-size: 20px;
font-weight: bold;
color: #3d3d3d;
line-height: 26px;
}
.item-radio-box {
margin: 16px 0px;
}
>>> .el-radio__label {
font-size: 18px;
color: #555555;
line-height: 20px;
}
.submit-box {
display: flex;
justify-content: center;
align-items: center;
.submit-box-but {
width: 200px;
}
}
</style>

191
acupuncture-前台/src/views/medicalFile/components/posture/epworth.vue

@ -0,0 +1,191 @@
<template>
<div>
<!--
1 坐着阅读书刊 0从不打瞌睡1轻度可能2中度可能3很可能打瞌睡
2 看电视 0从不打瞌睡1轻度可能2中度可能3很可能打瞌睡
3 在公共场所坐着不活动如剧院或会议 0从不打瞌睡1轻度可能2中度可能3很可能打瞌睡
4 作为乘客在车内乘坐一小时以上 0从不打瞌睡1轻度可能2中度可能3很可能打瞌睡
5 午间静卧休息 0从不打瞌睡1轻度可能2中度可能3很可能打瞌睡
6 坐着和别人交谈 0从不打瞌睡1轻度可能2中度可能3很可能打瞌睡
7 午餐后静坐不饮酒 0从不打瞌睡1轻度可能2中度可能3很可能打瞌睡
8 坐在车内当车辆因交通拥堵而停下时 0从不打瞌睡1轻度可能2中度可能3很可能打瞌睡
-->
<div>
<div
class="item-container"
v-for="(item, index) in questions"
:key="index"
>
<div class="item-title">{{ item.index }}. {{ item.question }}</div>
<div class="item-radio-box">
<el-radio-group v-model="form[`topic${item.index}`]">
<el-radio
v-for="(criteria, index) in item.criteria"
:key="index"
:label="criteria.value"
>{{ criteria.label }}
</el-radio>
</el-radio-group>
</div>
</div>
<div class="submit-box">
<el-button class="submit-box-but" type="primary" @click="submitForm"
>提交</el-button
>
</div>
</div>
</div>
</template>
<script>
export default {
name: "phq",
props: ["scaleCode"],
data() {
return {
form: {},
questions: [
{
index: 1,
question: "坐着阅读书刊",
criteria: [
{ label: "从不打瞌睡", value: 0 },
{ label: "轻度可能", value: 1 },
{ label: "中度可能", value: 2 },
{ label: "很可能打瞌睡", value: 3 },
],
},
{
index: 2,
question: "看电视",
criteria: [
{ label: "从不打瞌睡", value: 0 },
{ label: "轻度可能", value: 1 },
{ label: "中度可能", value: 2 },
{ label: "很可能打瞌睡", value: 3 },
],
},
{
index: 3,
question: "在公共场所坐着不活动(如剧院或会议)",
criteria: [
{ label: "从不打瞌睡", value: 0 },
{ label: "轻度可能", value: 1 },
{ label: "中度可能", value: 2 },
{ label: "很可能打瞌睡", value: 3 },
],
},
{
index: 4,
question: "作为乘客在车内乘坐一小时以上",
criteria: [
{ label: "从不打瞌睡", value: 0 },
{ label: "轻度可能", value: 1 },
{ label: "中度可能", value: 2 },
{ label: "很可能打瞌睡", value: 3 },
],
},
{
index: 5,
question: "午间静卧休息",
criteria: [
{ label: "从不打瞌睡", value: 0 },
{ label: "轻度可能", value: 1 },
{ label: "中度可能", value: 2 },
{ label: "很可能打瞌睡", value: 3 },
],
},
{
index: 6,
question: "坐着和别人交谈",
criteria: [
{ label: "从不打瞌睡", value: 0 },
{ label: "轻度可能", value: 1 },
{ label: "中度可能", value: 2 },
{ label: "很可能打瞌睡", value: 3 },
],
},
{
index: 7,
question: "午餐后静坐(不饮酒)",
criteria: [
{ label: "从不打瞌睡", value: 0 },
{ label: "轻度可能", value: 1 },
{ label: "中度可能", value: 2 },
{ label: "很可能打瞌睡", value: 3 },
],
},
{
index: 8,
question: "坐在车内,当车辆因交通拥堵而停下时",
criteria: [
{ label: "从不打瞌睡", value: 0 },
{ label: "轻度可能", value: 1 },
{ label: "中度可能", value: 2 },
{ label: "很可能打瞌睡", value: 3 },
],
},
],
scaleData: {},
};
},
created() {
this.treatmentId = this.$route.query.treatmentId; // id
let scaleData = localStorage.getItem("scaleData"); //
// scaleData
this.scaleData = scaleData
? JSON.parse(scaleData)
: {
[this.treatmentId]: {},
};
// scaleData[this.treatmentId]
if (!this.scaleData[this.treatmentId]) {
this.scaleData[this.treatmentId] = {};
}
this.form = this.scaleData[this.treatmentId][this.scaleCode] || {}; // form
},
methods: {
submitForm() {
let score = 0;
// , topic${i}
for (let i = 1; i <= 8; i++) {
if (this.form[`topic${i}`] !== undefined) {
score += this.form[`topic${i}`];
}
}
//
this.scaleData[this.treatmentId][this.scaleCode] = this.form;
localStorage.setItem("scaleData", JSON.stringify(this.scaleData));
//
this.$emit("getScaleResult", score, this.scaleCode);
},
},
};
</script>
<style scoped src="@/assets/styles/common.css"></style>
<style scoped>
.item-title {
font-size: 20px;
font-weight: bold;
color: #3d3d3d;
line-height: 26px;
}
.item-radio-box {
margin: 16px 0px;
}
>>> .el-radio__label {
font-size: 18px;
color: #555555;
line-height: 20px;
}
.submit-box {
display: flex;
justify-content: center;
align-items: center;
.submit-box-but {
width: 200px;
}
}
</style>

1224
acupuncture-前台/src/views/medicalFile/details.vue

File diff suppressed because it is too large

745
acupuncture-前台/src/views/medicalFile/index.vue

File diff suppressed because it is too large

177
acupuncture-前台/src/views/patientFile/index.vue

@ -10,8 +10,9 @@
> >
<el-form-item label="" prop="noticeTitle"> <el-form-item label="" prop="noticeTitle">
<el-input <el-input
style="width: 300px"
v-model="queryParams.param.keywords" v-model="queryParams.param.keywords"
placeholder="支持姓名、全拼、简拼、手机号、证件号码" placeholder="支持姓名、全拼、简拼、手机号、证件号码"
clearable clearable
@keyup.enter.native="handleQuery" @keyup.enter.native="handleQuery"
/> />
@ -33,7 +34,7 @@
/> />
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="建档组织" prop="tenantId"> <!-- <el-form-item label="建档组织" prop="tenantId">
<el-select <el-select
v-model="queryParams.param.tenantId" v-model="queryParams.param.tenantId"
placeholder="请选择" placeholder="请选择"
@ -41,7 +42,7 @@
> >
<el-option label="dict.label" value="dict.value" /> <el-option label="dict.label" value="dict.value" />
</el-select> </el-select>
</el-form-item> </el-form-item> -->
<el-form-item label="数据来源" prop="sourceId"> <el-form-item label="数据来源" prop="sourceId">
<el-select <el-select
v-model="queryParams.param.sourceId" v-model="queryParams.param.sourceId"
@ -95,8 +96,7 @@
plain plain
icon="el-icon-bottom" icon="el-icon-bottom"
size="mini" size="mini"
:disabled="multiple" @click="handleDownload"
@click="handleDelete"
>下载模版</el-button >下载模版</el-button
> >
</el-col> </el-col>
@ -133,13 +133,20 @@
max-height="600" max-height="600"
> >
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="姓名" align="center" prop="name" width="100" /> <el-table-column
label="姓名"
align="center"
prop="name"
min-width="100"
fixed
/>
<el-table-column <el-table-column
label="性别" label="性别"
align="center" align="center"
prop="gender" prop="gender"
show-overflow-tooltip show-overflow-tooltip
width="100" min-width="100"
fixed
> >
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.gender == 0"></span> <span v-if="scope.row.gender == 0"></span>
@ -152,35 +159,36 @@
align="center" align="center"
prop="birthDate" prop="birthDate"
show-overflow-tooltip show-overflow-tooltip
width="150" min-width="150"
fixed
/> />
<el-table-column <el-table-column
label="民族" label="民族"
align="center" align="center"
prop="ethnicity" prop="ethnicity"
show-overflow-tooltip show-overflow-tooltip
width="100" min-width="100"
/> />
<el-table-column <el-table-column
label="受教育年限" label="受教育年限"
align="center" align="center"
prop="educationYears" prop="educationYears"
show-overflow-tooltip show-overflow-tooltip
width="100" min-width="100"
/> />
<el-table-column <el-table-column
label="手机号码" label="手机号码"
align="center" align="center"
prop="phone" prop="phone"
show-overflow-tooltip show-overflow-tooltip
width="150" min-width="150"
/> />
<el-table-column <el-table-column
label="证件类型" label="证件类型"
align="center" align="center"
prop="idCardType" prop="idCardType"
show-overflow-tooltip show-overflow-tooltip
width="200" min-width="200"
> >
<template slot-scope="scope"> <template slot-scope="scope">
{{ idCardTypeValue[scope.row.idCardType] }} {{ idCardTypeValue[scope.row.idCardType] }}
@ -191,7 +199,7 @@
align="center" align="center"
prop="idCard" prop="idCard"
show-overflow-tooltip show-overflow-tooltip
width="180" min-width="180"
/> />
<el-table-column <el-table-column
@ -199,16 +207,16 @@
align="center" align="center"
prop="createBy" prop="createBy"
show-overflow-tooltip show-overflow-tooltip
width="100" min-width="100"
/> />
<el-table-column <el-table-column
label="建档组织(医院名称)" label="建档组织(医院名称)"
align="center" align="center"
prop="organization" prop="tenantName"
show-overflow-tooltip show-overflow-tooltip
width="150" min-width="150"
/> />
<el-table-column label="建档日期" align="center" width="130"> <el-table-column label="建档日期" align="center" min-width="140">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ <span>{{
parseTime(scope.row.createTime, "{y}-{m}-{d} {h}:{i}") parseTime(scope.row.createTime, "{y}-{m}-{d} {h}:{i}")
@ -221,12 +229,12 @@
align="center" align="center"
prop="source" prop="source"
show-overflow-tooltip show-overflow-tooltip
width="100" min-width="100"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.gender == 0">筛查</span> <span v-if="scope.row.source == 0">筛查</span>
<span v-if="scope.row.gender == 1">录入</span> <span v-if="scope.row.source == 1">录入</span>
<span v-if="scope.row.gender == 2">HIS</span> <span v-if="scope.row.source == 2">HIS</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column fixed="right" label="操作" align="center" width="150"> <el-table-column fixed="right" label="操作" align="center" width="150">
@ -255,8 +263,8 @@
<el-button <el-button
size="mini" size="mini"
type="text" type="text"
icon="el-icon-notebook-2" icon="el-icon-notebook-1"
@click="handleDelete(scope.row)" @click="handleArchives(scope.row)"
>诊疗档案</el-button >诊疗档案</el-button
> >
</template> </template>
@ -284,7 +292,7 @@
ref="form" ref="form"
:model="form" :model="form"
:rules="rules" :rules="rules"
label-width="90px" label-width="100px"
> >
<el-form-item label="姓名" prop="name"> <el-form-item label="姓名" prop="name">
<el-input <el-input
@ -299,7 +307,7 @@
<el-radio :label="1"></el-radio> <el-radio :label="1"></el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="出生年月" prop="birthDate"> <el-form-item label="出生日期" prop="birthDate">
<el-date-picker <el-date-picker
:disabled="formDisabled" :disabled="formDisabled"
format="yyyy-MM-dd" format="yyyy-MM-dd"
@ -353,7 +361,7 @@
:disabled="formDisabled" :disabled="formDisabled"
/> />
</el-form-item> </el-form-item>
<el-form-item label="现病史" prop="currentIllnessHistory"> <el-form-item label="现病史" prop="">
<el-checkbox-group <el-checkbox-group
v-model="form.currentIllnessHistory" v-model="form.currentIllnessHistory"
:disabled="formDisabled" :disabled="formDisabled"
@ -362,7 +370,7 @@
</el-checkbox> </el-checkbox>
</el-checkbox-group> </el-checkbox-group>
<el-input <el-input
v-model="form.currentIllnessHistoryQT" v-model="form.currentIllnessHistoryQt"
placeholder="其他" placeholder="其他"
:disabled="formDisabled" :disabled="formDisabled"
/> />
@ -380,7 +388,7 @@
width="640px" width="640px"
append-to-body append-to-body
> >
<el-form ref="form" :model="importform"> <el-form ref="importform" :model="importform">
<el-form-item prop="accessUrl"> <el-form-item prop="accessUrl">
<el-upload <el-upload
:limit="1" :limit="1"
@ -422,7 +430,8 @@ export default {
Authorization: "Bearer " + getToken(), Authorization: "Bearer " + getToken(),
deptId: localStorage.getItem("hospitalId"), deptId: localStorage.getItem("hospitalId"),
}, },
uploadFileUrl1: process.env.VUE_APP_BASE_API + "/pms/importTjbgZip", // uploadFileUrl1:
process.env.VUE_APP_API_QZURL + "/acupuncture/patient/import", //
fileList: [], fileList: [],
// //
medicalHistory: [ medicalHistory: [
@ -462,12 +471,17 @@ export default {
label: "台湾居民来往大陆通行证", label: "台湾居民来往大陆通行证",
value: 3, value: 3,
}, },
{
label: "其他",
value: 4,
},
], ],
idCardTypeValue: { idCardTypeValue: {
0: "身份证", 0: "身份证",
1: "护照或外国人永居证", 1: "护照或外国人永居证",
2: "港澳居民来往内地通行", 2: "港澳居民来往内地通行",
3: "台湾居民来往大陆通行证", 3: "台湾居民来往大陆通行证",
4: "其他",
}, },
loading: false, // loading: false, //
ids: [], // ids: [], //
@ -499,22 +513,65 @@ export default {
// //
rules: { rules: {
name: [ name: [
{ required: true, message: "患者姓名不能为空", trigger: "blur" }, {
required: true,
message: "患者姓名不能为空",
trigger: "blur",
},
], ],
gender: [ gender: [
{ required: true, message: "性别不能为空", trigger: "change" }, {
required: true,
message: "性别不能为空",
trigger: "change",
},
],
birthDate: [
{
required: true,
message: "出生日期不能为空",
trigger: "change",
},
], ],
phone: [ phone: [
{ required: true, message: "手机号码不能为空", trigger: "blur" }, {
required: true,
message: "手机号码不能为空",
trigger: "blur",
},
{
pattern: /^1[3456789]\d{9}$/,
message: "手机号码格式不正确",
trigger: "blur",
},
], ],
ethnicity: [ ethnicity: [
{ required: true, message: "民族不能为空", trigger: "blur" }, {
required: true,
message: "民族不能为空",
trigger: "blur",
},
], ],
idCardType: [ idCardType: [
{ required: true, message: "证件类型不能为空", trigger: "blur" }, {
required: true,
message: "证件类型不能为空",
trigger: "blur",
},
], ],
idCard: [ idCard: [
{ required: true, message: "证件号码不能为空", trigger: "blur" }, {
required: true,
message: "证件号码不能为空",
trigger: "blur",
},
],
educationYears: [
{
required: true,
message: "受教育年限不能为空",
trigger: "blur",
},
], ],
currentIllnessHistory: [ currentIllnessHistory: [
{ {
@ -527,13 +584,15 @@ export default {
}; };
}, },
created() { created() {
let idCard = this.$route.query.idCard;
this.queryParams.param.keywords = idCard || "";
this.getList(); this.getList();
}, },
methods: { methods: {
// - pdg // - pdg
handleUploadPdfAdd1(res) { handleUploadPdfAdd1(res) {
if (res.code == 200) { if (res.code == 200) {
this.physicaOpen = false; this.importOpen = false;
this.getList(); this.getList();
this.$modal.msgSuccess("导入成功"); this.$modal.msgSuccess("导入成功");
} else { } else {
@ -584,8 +643,9 @@ export default {
phone: "", // phone: "", //
idCardType: "", // idCardType: "", //
idCard: "", // idCard: "", //
source: 1,
currentIllnessHistory: [], // currentIllnessHistory: [], //
currentIllnessHistoryQT: "", // currentIllnessHistoryQt: "", //
}; };
this.resetForm("form"); this.resetForm("form");
}, },
@ -596,6 +656,14 @@ export default {
}, },
/** 重置按钮操作 */ /** 重置按钮操作 */
resetQuery() { resetQuery() {
this.queryParams.param = {
keywords: "", //
startAge: "", //
endAge: "", //
tenantId: "", //
createBy: "", //
sourceId: "", //
};
this.handleQuery(); this.handleQuery();
}, },
// //
@ -619,7 +687,7 @@ export default {
this.form = JSON.parse(JSON.stringify(row)); this.form = JSON.parse(JSON.stringify(row));
// //
this.form.currentIllnessHistory = this.form.currentIllnessHistory =
this.form.currentIllnessHistory.split(","); this.form.currentIllnessHistory?.split(",") || [];
}, },
/** 详情按钮操作 */ /** 详情按钮操作 */
handleDetails(row) { handleDetails(row) {
@ -627,6 +695,15 @@ export default {
this.title = "患者档案详情"; this.title = "患者档案详情";
this.formDisabled = true; this.formDisabled = true;
this.form = JSON.parse(JSON.stringify(row)); this.form = JSON.parse(JSON.stringify(row));
//
this.form.currentIllnessHistory =
this.form.currentIllnessHistory?.split(",") || [];
},
/** 诊疗档案 */
handleArchives(row) {
this.$router.push({
path: `/medicalIndex?idCard=${row.idCard}`,
});
}, },
/** 提交按钮 */ /** 提交按钮 */
submitForm: function () { submitForm: function () {
@ -655,7 +732,9 @@ export default {
this.$modal this.$modal
.confirm("是否确认删除当前选择的数据?") .confirm("是否确认删除当前选择的数据?")
.then(function () { .then(function () {
return patientDel({ idList: idList }); return patientDel({
idList: idList,
});
}) })
.then(() => { .then(() => {
this.getList(); this.getList();
@ -665,18 +744,28 @@ export default {
}, },
/** 导出按钮操作 */ /** 导出按钮操作 */
handleExport() { handleExport() {
this.download( this.download1(
"system/user/export", "/patient/export",
{ {
...this.queryParams.params, ...this.queryParams.params,
}, },
`患者档案.xlsx` `患者档案.xlsx`
); );
}, },
/** 下载按钮操作 */
handleDownload() {
window.open(
`${process.env.VUE_APP_API_QZURL}/acupuncture/profile/PatientTemplate.xlsx`
);
// this.download1(
// "/patient/export", {},
// `.xlsx`
// );
},
/** 导入按钮操作 */ /** 导入按钮操作 */
handleImport() { handleImport() {
this.upload.title = "用户导入"; this.fileList = [];
this.upload.open = true; this.importOpen = true;
}, },
}, },
}; };
@ -687,9 +776,11 @@ export default {
display: flex; display: flex;
align-items: center; align-items: center;
} }
.form-item-age span { .form-item-age span {
margin: 0 10px; margin: 0 10px;
} }
.form-item-age >>> .el-input { .form-item-age >>> .el-input {
width: 100px; width: 100px;
} }

2
acupuncture-前台/src/views/register.vue

@ -6,7 +6,7 @@
:rules="registerRules" :rules="registerRules"
class="register-form" class="register-form"
> >
<h3 class="title">针灸后台管理系统</h3> <h3 class="title">朱琏针灸联盟数据系统</h3>
<el-form-item prop="username"> <el-form-item prop="username">
<el-input <el-input
v-model="registerForm.username" v-model="registerForm.username"

73
acupuncture-前台/src/views/system/user/profile/index.vue

@ -1,14 +1,18 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="6" :xs="24"> <el-col :span="6" :xs="24" style="height: 400px; border-radius: 4px">
<el-card class="box-card"> <el-card style="height: 410px" class="box-card">
<div slot="header" class="clearfix"> <div slot="header" class="clearfix">
<span>个人信息</span> <span>个人信息</span>
</div> </div>
<div> <div>
<div class="text-center"> <div class="text-center">
<userAvatar /> <img
src="@/assets/images/zj.png"
alt=""
style="border-radius: 50%"
/>
</div> </div>
<ul class="list-group list-group-striped"> <ul class="list-group list-group-striped">
<li class="list-group-item"> <li class="list-group-item">
@ -17,40 +21,42 @@
</li> </li>
<li class="list-group-item"> <li class="list-group-item">
<svg-icon icon-class="phone" />手机号码 <svg-icon icon-class="phone" />手机号码
<div class="pull-right">{{ user.phonenumber }}</div> <div class="pull-right">{{ userInfo.tenantPhone }}</div>
</li>
<li class="list-group-item">
<svg-icon icon-class="email" />用户邮箱
<div class="pull-right">{{ user.email }}</div>
</li> </li>
<li class="list-group-item"> <li class="list-group-item">
<svg-icon icon-class="tree" />所属部门 <svg-icon icon-class="tree" />所属部门
<div class="pull-right" v-if="user.dept">{{ user.dept.deptName }} / {{ postGroup }}</div> <div class="pull-right">
{{ userInfo.tenantName }}
</div>
</li> </li>
<li class="list-group-item">
<!-- <li class="list-group-item">
<svg-icon icon-class="peoples" />所属角色 <svg-icon icon-class="peoples" />所属角色
<div class="pull-right">{{ roleGroup }}</div> <div class="pull-right">{{ roleGroup }}</div>
</li> </li> -->
<li class="list-group-item"> <!-- <li class="list-group-item">
<svg-icon icon-class="date" />创建日期 <svg-icon icon-class="date" />创建日期
<div class="pull-right">{{ user.createTime }}</div> <div class="pull-right">{{ user.createTime }}</div>
</li> </li> -->
</ul> </ul>
<el-button
type="primary"
size="mini"
@click="logout"
style="width: 100%; height: 48px; font-size: 16px"
>
退出登录
</el-button>
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
<el-col :span="18" :xs="24"> <el-col :span="18" :xs="24">
<el-card> <el-card style="height: 410px">
<div slot="header" class="clearfix"> <div slot="header" class="clearfix">
<span>基本资料</span> <span>修改密码</span>
</div> </div>
<el-tabs v-model="activeTab"> <el-tabs v-model="activeTab">
<el-tab-pane label="基本资料" name="userinfo"> <resetPwd />
<userInfo :user="user" />
</el-tab-pane>
<el-tab-pane label="修改密码" name="resetPwd">
<resetPwd />
</el-tab-pane>
</el-tabs> </el-tabs>
</el-card> </el-card>
</el-col> </el-col>
@ -70,22 +76,39 @@ export default {
data() { data() {
return { return {
user: {}, user: {},
userInfo: {},
roleGroup: {}, roleGroup: {},
postGroup: {}, postGroup: {},
activeTab: "userinfo" activeTab: "resetPwd",
}; };
}, },
created() { created() {
let userInfo = localStorage.getItem("user");
this.userInfo = userInfo ? JSON.parse(userInfo) : {};
this.getUser(); this.getUser();
}, },
methods: { methods: {
async logout() {
this.$confirm("确定注销并退出系统吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
this.$store.dispatch("LogOut").then(() => {
location.href = process.env.VUE_APP_PUBLIC_PATH;
});
})
.catch(() => {});
},
getUser() { getUser() {
getUserProfile().then(response => { getUserProfile().then((response) => {
this.user = response.data; this.user = response.data;
this.roleGroup = response.roleGroup; this.roleGroup = response.roleGroup;
this.postGroup = response.postGroup; this.postGroup = response.postGroup;
}); });
} },
} },
}; };
</script> </script>

5
acupuncture-前台/vue.config.js

@ -7,7 +7,7 @@ function resolve(dir) {
const CompressionPlugin = require("compression-webpack-plugin"); const CompressionPlugin = require("compression-webpack-plugin");
const name = process.env.VUE_APP_TITLE || "针灸管理系统"; // 网页标题 const name = process.env.VUE_APP_TITLE || "朱琏针灸联盟数据系统"; // 网页标题
const port = process.env.port || process.env.npm_config_port || 80; // 端口 const port = process.env.port || process.env.npm_config_port || 80; // 端口
@ -18,7 +18,8 @@ module.exports = {
// 部署生产环境和开发环境下的URL。 // 部署生产环境和开发环境下的URL。
// 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上 // 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上
// 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。 // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
publicPath: process.env.NODE_ENV === "production" ? "/acupunctureClient/" : "/", publicPath:
process.env.NODE_ENV === "production" ? "/acupunctureClient/" : "/",
// 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist) // 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist)
outputDir: "dist", outputDir: "dist",
// 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下) // 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下)

2
acupuncture-后台/.env.development

@ -1,5 +1,5 @@
# 页面标题 # 页面标题
VUE_APP_TITLE = 针灸管理系统 VUE_APP_TITLE = 朱琏针灸联盟数据系统
# 开发环境配置 # 开发环境配置
ENV = 'development' ENV = 'development'

4
acupuncture-后台/.env.production

@ -1,5 +1,5 @@
# 页面标题 # 页面标题
VUE_APP_TITLE = 针灸管理系统 VUE_APP_TITLE = 朱琏针灸联盟数据系统
# 生产环境配置 # 生产环境配置
NODE_ENV = 'production' NODE_ENV = 'production'
@ -8,4 +8,4 @@ VUE_APP_BASE_API = 'https://test.tall.wiki/acupuncture'
VUE_APP_API_QZURL = 'https://test.tall.wiki/' VUE_APP_API_QZURL = 'https://test.tall.wiki/'
# 访问路径 # 访问路径
VUE_APP_PUBLIC_PATH = '/acupunctureClient/' VUE_APP_PUBLIC_PATH = '/acupunctureAdmin/'

4
acupuncture-后台/.env.staging

@ -1,5 +1,5 @@
# 页面标题 # 页面标题
VUE_APP_TITLE = 针灸管理系统 VUE_APP_TITLE = 朱琏针灸联盟数据系统
BABEL_ENV = production BABEL_ENV = production
@ -8,5 +8,5 @@ NODE_ENV = production
# 测试环境配置 # 测试环境配置
ENV = 'staging' ENV = 'staging'
# 针灸管理系统/测试环境 # 朱琏针灸联盟数据系统/测试环境
VUE_APP_BASE_API = '/stage-api' VUE_APP_BASE_API = '/stage-api'

5
acupuncture-后台/package.json

@ -1,7 +1,7 @@
{ {
"name": "ruoyi", "name": "ruoyi",
"version": "3.8.9", "version": "3.8.9",
"description": "针灸管理系统", "description": "朱琏针灸联盟数据系统",
"author": "若依", "author": "若依",
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {
@ -40,7 +40,7 @@
"axios": "0.28.1", "axios": "0.28.1",
"clipboard": "2.0.8", "clipboard": "2.0.8",
"core-js": "3.37.1", "core-js": "3.37.1",
"echarts": "5.4.0", "echarts": "^5.4.0",
"element-ui": "^2.15.14", "element-ui": "^2.15.14",
"file-saver": "2.0.5", "file-saver": "2.0.5",
"fuse.js": "6.4.3", "fuse.js": "6.4.3",
@ -48,6 +48,7 @@
"js-beautify": "1.13.0", "js-beautify": "1.13.0",
"js-cookie": "3.0.1", "js-cookie": "3.0.1",
"jsencrypt": "3.0.0-rc.1", "jsencrypt": "3.0.0-rc.1",
"moment": "^2.30.1",
"nprogress": "0.2.0", "nprogress": "0.2.0",
"quill": "2.0.2", "quill": "2.0.2",
"screenfull": "5.0.2", "screenfull": "5.0.2",

52
acupuncture-后台/public/index.html

@ -1,14 +1,17 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head>
<meta charset="utf-8"> <head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta charset="utf-8">
<meta name="renderer" content="webkit"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> <meta name="renderer" content="webkit">
<link rel="icon" href="<%= BASE_URL %>favicon.ico"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title><%= webpackConfig.name %></title> <link rel="icon" type="image/x-icon" href="./zj.png">
<!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]--> <title>
<style> <%= webpackConfig.name %>
</title>
<!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
<style>
html, html,
body, body,
#app { #app {
@ -16,6 +19,7 @@
margin: 0px; margin: 0px;
padding: 0px; padding: 0px;
} }
.chromeframe { .chromeframe {
margin: 0.2em 0; margin: 0.2em 0;
background: #ccc; background: #ccc;
@ -92,6 +96,7 @@
-ms-transform: rotate(0deg); -ms-transform: rotate(0deg);
transform: rotate(0deg); transform: rotate(0deg);
} }
100% { 100% {
-webkit-transform: rotate(360deg); -webkit-transform: rotate(360deg);
-ms-transform: rotate(360deg); -ms-transform: rotate(360deg);
@ -105,6 +110,7 @@
-ms-transform: rotate(0deg); -ms-transform: rotate(0deg);
transform: rotate(0deg); transform: rotate(0deg);
} }
100% { 100% {
-webkit-transform: rotate(360deg); -webkit-transform: rotate(360deg);
-ms-transform: rotate(360deg); -ms-transform: rotate(360deg);
@ -118,7 +124,7 @@
top: 0; top: 0;
width: 51%; width: 51%;
height: 100%; height: 100%;
background: #7171C6; background: #70483E;
z-index: 1000; z-index: 1000;
-webkit-transform: translateX(0); -webkit-transform: translateX(0);
-ms-transform: translateX(0); -ms-transform: translateX(0);
@ -194,15 +200,17 @@
opacity: 0.5; opacity: 0.5;
} }
</style> </style>
</head> </head>
<body>
<div id="app"> <body>
<div id="loader-wrapper"> <div id="app">
<div id="loader"></div> <div id="loader-wrapper">
<div class="loader-section section-left"></div> <div id="loader"></div>
<div class="loader-section section-right"></div> <div class="loader-section section-left"></div>
<div class="load_title">正在加载系统资源,请耐心等待</div> <div class="loader-section section-right"></div>
</div> <div class="load_title">正在加载系统资源,请耐心等待</div>
</div> </div>
</body> </div>
</html> </body>
</html>

BIN
acupuncture-后台/public/zj.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

8
acupuncture-后台/src/App.vue

@ -31,6 +31,14 @@ export default {
} }
</style> </style>
<style> <style>
.header-title {
display: -webkit-box !important;
overflow: hidden;
text-overflow: ellipsis;
word-break: break-all;
-webkit-box-orient: vertical;
-webkit-line-clamp: 1;
}
.wj-uploader .el-icon-upload:before { .wj-uploader .el-icon-upload:before {
font-size: 100px; font-size: 100px;
} }

26
acupuncture-后台/src/api/followupFile.js

@ -3,7 +3,7 @@ import request from "@/utils/request";
// 随访队列 // 随访队列
export function followupQuery(data) { export function followupQuery(data) {
return request({ return request({
url: "/followup/query", url: "/admin/followup/query",
method: "post", method: "post",
data: data, data: data,
}); });
@ -11,7 +11,7 @@ export function followupQuery(data) {
// 新增随访队列 // 新增随访队列
export function followupAdd(data) { export function followupAdd(data) {
return request({ return request({
url: "/followup/add", url: "/admin/followup/add",
method: "post", method: "post",
data: data, data: data,
}); });
@ -19,7 +19,7 @@ export function followupAdd(data) {
// 新增随访队列 // 新增随访队列
export function followupUpd(data) { export function followupUpd(data) {
return request({ return request({
url: "/followup/upd", url: "/admin/followup/upd",
method: "post", method: "post",
data: data, data: data,
}); });
@ -27,7 +27,7 @@ export function followupUpd(data) {
// 新增随访队列 // 新增随访队列
export function followupDel(data) { export function followupDel(data) {
return request({ return request({
url: "/followup/del", url: "/admin/followup/del",
method: "post", method: "post",
data: data, data: data,
}); });
@ -36,7 +36,7 @@ export function followupDel(data) {
// 查看随访对象 // 查看随访对象
export function queryPatient(data) { export function queryPatient(data) {
return request({ return request({
url: "/followup/queryPatient", url: "/admin/followup/queryPatient",
method: "post", method: "post",
data: data, data: data,
}); });
@ -44,7 +44,7 @@ export function queryPatient(data) {
// 修改随访对象 队列信息 // 修改随访对象 队列信息
export function updPatient(data) { export function updPatient(data) {
return request({ return request({
url: "/followup/updPatient", url: "/admin/followup/updPatient",
method: "post", method: "post",
data: data, data: data,
}); });
@ -52,7 +52,7 @@ export function updPatient(data) {
// 随访工单 // 随访工单
export function queryTask(data) { export function queryTask(data) {
return request({ return request({
url: "/followup/queryTask", url: "/admin/followup/queryTask",
method: "post", method: "post",
data: data, data: data,
}); });
@ -60,7 +60,7 @@ export function queryTask(data) {
// 失访 // 失访
export function updStatus(data) { export function updStatus(data) {
return request({ return request({
url: "/followup/updStatus", url: "/admin/followup/updStatus",
method: "post", method: "post",
data: data, data: data,
}); });
@ -68,7 +68,15 @@ export function updStatus(data) {
// 患者随访 // 患者随访
export function followPatient(data) { export function followPatient(data) {
return request({ return request({
url: "/followup/followPatient", url: "/admin/followup/followPatient",
method: "post",
data: data,
});
}
// 修改随访状态
export function followStatus(data) {
return request({
url: "/admin/followup/status",
method: "post", method: "post",
data: data, data: data,
}); });

146
acupuncture-后台/src/api/indexCom.js

@ -0,0 +1,146 @@
import request from "@/utils/request";
// 患者统计 - 饼状
export function queryPatient(data) {
return request({
url: "/admin/qualityControl/home/queryPatient",
method: "post",
data: data,
});
}
// 患者统计 - 柱状图
export function queryByDatePatient(data) {
return request({
url: "/admin/qualityControl/home/queryByDatePatient",
method: "post",
data: data,
});
}
// 静脉溶栓率 - 统计
export function queryJmrs(data) {
return request({
url: "/admin/qualityControl/home/queryJmrs",
method: "post",
data: data,
});
}
// 静脉溶栓率 - 数据对比
// 静脉溶栓率 - DNT
export function queryDntResult(data) {
return request({
url: "/admin/qualityControl/home/queryDntResult",
method: "post",
data: data,
});
}
// 静脉溶栓率 - Sich
export function querySichResult(data) {
return request({
url: "/admin/qualityControl/home/querySichResult",
method: "post",
data: data,
});
}
// 血管治疗 - DPT
export function queryDptResult(data) {
return request({
url: "/admin/qualityControl/home/queryDptResult",
method: "post",
data: data,
});
}
// 血管治疗 - Rpt
export function queryRptResult(data) {
return request({
url: "/admin/qualityControl/home/queryRptResult",
method: "post",
data: data,
});
}
// 血管治疗 - SJDB
// export function selectXgzl(data) {
// return request({
// url: "/qualityControl/home/selectXgzl",
// method: "post",
// data: data,
// });
// }
export function dataComparison(data) {
return request({
url: "/admin/qualityControl/home/selectXgzl",
method: "post",
data: data,
});
}
// 血管治疗统计
export function queryXgzlLv(data) {
return request({
url: "/admin/qualityControl/home/queryXgzlLv",
method: "post",
data: data,
});
}
// 大屏急救数量统计
export function queryPatientList(data) {
return request({
url: "/admin/qualityControl/home/queryPatientList",
method: "post",
data: data,
});
}
// 大屏急救时长分析
export function queryFirstAidTime(data) {
return request({
url: "/admin/qualityControl/home/queryFirstAidTime",
method: "post",
data: data,
});
}
// 大屏智慧平车面板数据
export function queryData(data) {
return request({
url: "/admin/qualityControl/home/queryData",
method: "post",
data: data,
});
}
// 患者信息
export function patientTotal(data) {
return request({
url: "/admin/statistics/patientTotal",
method: "post",
data: data,
});
}
// 诊疗信息
export function zlInfo(data) {
return request({
url: "/admin/statistics/zlInfo",
method: "post",
data: data,
});
}
// 治疗类型
export function zlType(data) {
return request({
url: "/admin/statistics/zlType",
method: "post",
data: data,
});
}
// 随访分布
export function sffb(data) {
return request({
url: "/admin/statistics/sffb",
method: "post",
data: data,
});
}
export function sftj(data) {
return request({
url: "/admin/statistics/sftj",
method: "post",
data: data,
});
}

14
acupuncture-后台/src/api/medicalFile.js

@ -3,7 +3,7 @@ import request from "@/utils/request";
// 获取列表 // 获取列表
export function treatmentQuery(data) { export function treatmentQuery(data) {
return request({ return request({
url: "/treatment/list", url: "/admin/treatment/list",
method: "post", method: "post",
data: data, data: data,
}); });
@ -11,7 +11,7 @@ export function treatmentQuery(data) {
// 添加患者档案 // 添加患者档案
export function treatmentAdd(data) { export function treatmentAdd(data) {
return request({ return request({
url: "/treatment/add", url: "/admin/treatment/add",
method: "post", method: "post",
data: data, data: data,
}); });
@ -19,7 +19,7 @@ export function treatmentAdd(data) {
// 修改患者档案 // 修改患者档案
export function treatmentUpd(data) { export function treatmentUpd(data) {
return request({ return request({
url: "/treatment/upd", url: "/admin/treatment/upd",
method: "post", method: "post",
data: data, data: data,
}); });
@ -27,7 +27,7 @@ export function treatmentUpd(data) {
// 删除患者档案 // 删除患者档案
export function treatmentDel(data) { export function treatmentDel(data) {
return request({ return request({
url: "/treatment/del", url: "/admin/treatment/del",
method: "post", method: "post",
data: data, data: data,
}); });
@ -35,14 +35,14 @@ export function treatmentDel(data) {
// 档案详情 // 档案详情
export function queryRecord(data) { export function queryRecord(data) {
return request({ return request({
url: "/treatment/queryRecord", url: "/admin/treatment/queryRecord",
method: "post", method: "post",
data: data, data: data,
}); });
}// 档案详情 }// 档案详情
export function saveAidRecord(data) { export function saveAidRecord(data) {
return request({ return request({
url: "/treatment/saveAidRecord", url: "/admin/treatment/saveAidRecord",
method: "post", method: "post",
data: data, data: data,
}); });
@ -51,7 +51,7 @@ export function saveAidRecord(data) {
export function queueAdd(data) { export function queueAdd(data) {
return request({ return request({
url: "/patientQueueRelation/add", url: "/admin/patientQueueRelation/add",
method: "post", method: "post",
data: data, data: data,
}); });

106
acupuncture-后台/src/api/member.js

@ -0,0 +1,106 @@
import request from "@/utils/request";
// 获取租户列表
export function tenantsList(data) {
return request({
url: "/tenants/list",
method: "post",
data: data,
});
}
// 新增租户
export function tenantsAdd(data) {
return request({
url: "/tenants/add",
method: "post",
data: data,
});
}
// 修改租户
export function tenantsUpd(data) {
return request({
url: "/tenants/upd",
method: "post",
data: data,
});
}
// 删除租户
export function tenantsDel(data) {
return request({
url: "/tenants/del",
method: "post",
data: data,
});
}
// ------ 数据源 ------
// 获取数据源列表
export function dataSourcesList(data) {
return request({
url: "/dataSources/list",
method: "post",
data: data,
});
}// 新增数据源
export function dataSourcesAdd(data) {
return request({
url: "/dataSources/add",
method: "post",
data: data,
});
}
// 修改数据源
export function dataSourcesUpd(data) {
return request({
url: "/dataSources/upd",
method: "post",
data: data,
});
}
// 删除数据源
export function dataSourcesDel(data) {
return request({
url: "/dataSources/del",
method: "post",
data: data,
});
}
// ------ 用户 ------
export function tenantUsersList(data) {
return request({
url: "/tenantUsers/list",
method: "post",
data: data,
});
}// 新增数据源
export function tenantUsersAdd(data) {
return request({
url: "/tenantUsers/add",
method: "post",
data: data,
});
}
// 修改数据源
export function tenantUsersUpd(data) {
return request({
url: "/tenantUsers/upd",
method: "post",
data: data,
});
}
// 删除数据源
export function tenantUsersDel(data) {
return request({
url: "/tenantUsers/del",
method: "post",
data: data,
});
}
//
export function resetPwd(data) {
return request({
url: "/web/resetPwd",
method: "put",
data: data,
});
}

8
acupuncture-后台/src/api/patientFile.js

@ -3,7 +3,7 @@ import request from "@/utils/request";
// 获取列表 // 获取列表
export function queryPatient(data) { export function queryPatient(data) {
return request({ return request({
url: "/patient/list", url: "/admin/patient/list",
method: "post", method: "post",
data: data, data: data,
}); });
@ -11,7 +11,7 @@ export function queryPatient(data) {
// 添加患者档案 // 添加患者档案
export function patientAdd(data) { export function patientAdd(data) {
return request({ return request({
url: "/patient/add", url: "/admin/patient/add",
method: "post", method: "post",
data: data, data: data,
}); });
@ -19,7 +19,7 @@ export function patientAdd(data) {
// 修改患者档案 // 修改患者档案
export function patientUpd(data) { export function patientUpd(data) {
return request({ return request({
url: "/patient/upd", url: "/admin/patient/upd",
method: "post", method: "post",
data: data, data: data,
}); });
@ -27,7 +27,7 @@ export function patientUpd(data) {
// 删除患者档案 // 删除患者档案
export function patientDel(data) { export function patientDel(data) {
return request({ return request({
url: "/patient/del", url: "/admin/patient/del",
method: "post", method: "post",
data: data, data: data,
}); });

64
acupuncture-后台/src/api/report.js

@ -0,0 +1,64 @@
import request from "@/utils/request";
// ------ 上报类型 ------
// 查询类型
export function reportList(data) {
return request({
url: "/report/list",
method: "post",
data: data,
});
}
export function reportAdd(data) {
return request({
url: "/report/add",
method: "post",
data: data,
});
}
export function reportUpd(data) {
return request({
url: "/report/upd",
method: "post",
data: data,
});
}
export function reportDel(data) {
return request({
url: "/report/del",
method: "post",
data: data,
});
}
// ------ 上报管理 ------
export function managerQuery(data) {
return request({
url: "/report/queryManager",
method: "post",
data: data,
});
}
export function managerAdd(data) {
return request({
url: "/report/addManager",
method: "post",
data: data,
});
}
export function managerUpd(data) {
return request({
url: "/report/updManager",
method: "post",
data: data,
});
}
export function managerDel(data) {
return request({
url: "/report/delManager",
method: "post",
data: data,
});
}

BIN
acupuncture-后台/src/assets/images/zj.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

2
acupuncture-后台/src/assets/styles/common.css

@ -73,7 +73,7 @@
display: none; display: none;
} }
>>>.el-dialog__body{ >>>.el-dialog__body{
padding: 0px 20px 0px 20px; padding: 20px;
} }
/* .popup >>> .popupAdd2 .popupleft { /* .popup >>> .popupAdd2 .popupleft {
width: 55px; width: 55px;

4
acupuncture-后台/src/assets/styles/element-variables.scss

@ -4,7 +4,7 @@
**/ **/
/* theme color */ /* theme color */
$--color-primary: #1890ff; $--color-primary: #c6a268;
$--color-success: #13ce66; $--color-success: #13ce66;
$--color-warning: #ffba00; $--color-warning: #ffba00;
$--color-danger: #ff4949; $--color-danger: #ff4949;
@ -20,7 +20,7 @@ $--border-color-lighter: #e6ebf5;
$--table-border: 1px solid #dfe6ec; $--table-border: 1px solid #dfe6ec;
/* icon font path, required */ /* icon font path, required */
$--font-path: '~element-ui/lib/theme-chalk/fonts'; $--font-path: "~element-ui/lib/theme-chalk/fonts";
@import "~element-ui/packages/theme-chalk/src/index"; @import "~element-ui/packages/theme-chalk/src/index";

32
acupuncture-后台/src/assets/styles/variables.scss

@ -1,25 +1,25 @@
// base color // base color
$blue:#324157; $blue: #324157;
$light-blue:#3A71A8; $light-blue: #3a71a8;
$red:#C03639; $red: #c03639;
$pink: #E65D6E; $pink: #e65d6e;
$green: #30B08F; $green: #30b08f;
$tiffany: #4AB7BD; $tiffany: #4ab7bd;
$yellow:#FEC171; $yellow: #fec171;
$panGreen: #30B08F; $panGreen: #30b08f;
// 默认菜单主题风格 // 默认菜单主题风格
$base-menu-color:#bfcbd9; $base-menu-color: #fff;
$base-menu-color-active:#f4f4f5; $base-menu-color-active: #f4f4f5;
$base-menu-background:#304156; $base-menu-background: #70483e;
$base-logo-title-color: #ffffff; $base-logo-title-color: #ffffff;
$base-menu-light-color:rgba(0,0,0,.70); $base-menu-light-color: rgba(0, 0, 0, 0.7);
$base-menu-light-background:#ffffff; $base-menu-light-background: #ffffff;
$base-logo-light-title-color: #001529; $base-logo-light-title-color: #001529;
$base-sub-menu-background:#1f2d3d; $base-sub-menu-background: #70483e;
$base-sub-menu-hover:#001528; $base-sub-menu-hover: #69443a;
// 自定义暗色菜单风格 // 自定义暗色菜单风格
/** /**
@ -50,5 +50,5 @@ $base-sidebar-width: 200px;
subMenuHover: $base-sub-menu-hover; subMenuHover: $base-sub-menu-hover;
sideBarWidth: $base-sidebar-width; sideBarWidth: $base-sidebar-width;
logoTitleColor: $base-logo-title-color; logoTitleColor: $base-logo-title-color;
logoLightTitleColor: $base-logo-light-title-color logoLightTitleColor: $base-logo-light-title-color;
} }

8
acupuncture-后台/src/layout/components/Navbar.vue

@ -15,7 +15,7 @@
<top-nav id="topmenu-container" class="topmenu-container" v-if="topNav" /> <top-nav id="topmenu-container" class="topmenu-container" v-if="topNav" />
<div class="right-menu"> <div class="right-menu">
<template v-if="device !== 'mobile'"> <!-- <template v-if="device !== 'mobile'">
<search id="header-search" class="right-menu-item" /> <search id="header-search" class="right-menu-item" />
<el-tooltip content="源码地址" effect="dark" placement="bottom"> <el-tooltip content="源码地址" effect="dark" placement="bottom">
@ -31,7 +31,7 @@
<el-tooltip content="布局大小" effect="dark" placement="bottom"> <el-tooltip content="布局大小" effect="dark" placement="bottom">
<size-select id="size-select" class="right-menu-item hover-effect" /> <size-select id="size-select" class="right-menu-item hover-effect" />
</el-tooltip> </el-tooltip>
</template> </template> -->
<el-dropdown <el-dropdown
class="avatar-container right-menu-item hover-effect" class="avatar-container right-menu-item hover-effect"
@ -45,9 +45,9 @@
<router-link to="/user/profile"> <router-link to="/user/profile">
<el-dropdown-item>个人中心</el-dropdown-item> <el-dropdown-item>个人中心</el-dropdown-item>
</router-link> </router-link>
<el-dropdown-item @click.native="setting = true"> <!-- <el-dropdown-item @click.native="setting = true">
<span>布局设置</span> <span>布局设置</span>
</el-dropdown-item> </el-dropdown-item> -->
<el-dropdown-item divided @click.native="logout"> <el-dropdown-item divided @click.native="logout">
<span>退出登录</span> <span>退出登录</span>
</el-dropdown-item> </el-dropdown-item>

67
acupuncture-后台/src/layout/components/Sidebar/Logo.vue

@ -1,45 +1,80 @@
<template> <template>
<div class="sidebar-logo-container" :class="{'collapse':collapse}" :style="{ backgroundColor: sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground }"> <div
class="sidebar-logo-container"
:class="{ collapse: collapse }"
:style="{
backgroundColor:
sideTheme === 'theme-dark'
? variables.menuBackground
: variables.menuLightBackground,
}"
>
<transition name="sidebarLogoFade"> <transition name="sidebarLogoFade">
<router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/"> <router-link
v-if="collapse"
key="collapse"
class="sidebar-logo-link"
to="/"
>
<img v-if="logo" :src="logo" class="sidebar-logo" /> <img v-if="logo" :src="logo" class="sidebar-logo" />
<h1 v-else class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1> <h1
v-else
class="sidebar-title"
:style="{
color:
sideTheme === 'theme-dark'
? variables.logoTitleColor
: variables.logoLightTitleColor,
}"
>
{{ title }}
</h1>
</router-link> </router-link>
<router-link v-else key="expand" class="sidebar-logo-link" to="/"> <router-link v-else key="expand" class="sidebar-logo-link" to="/">
<img v-if="logo" :src="logo" class="sidebar-logo" /> <img v-if="logo" :src="logo" class="sidebar-logo" />
<h1 class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1> <h1
class="sidebar-title"
:style="{
color:
sideTheme === 'theme-dark'
? variables.logoTitleColor
: variables.logoLightTitleColor,
}"
>
{{ title }}
</h1>
</router-link> </router-link>
</transition> </transition>
</div> </div>
</template> </template>
<script> <script>
import logoImg from '@/assets/logo/logo.png' import logoImg from "@/assets/images/zj.png";
import variables from '@/assets/styles/variables.scss' import variables from "@/assets/styles/variables.scss";
export default { export default {
name: 'SidebarLogo', name: "SidebarLogo",
props: { props: {
collapse: { collapse: {
type: Boolean, type: Boolean,
required: true required: true,
} },
}, },
computed: { computed: {
variables() { variables() {
return variables; return variables;
}, },
sideTheme() { sideTheme() {
return this.$store.state.settings.sideTheme return this.$store.state.settings.sideTheme;
} },
}, },
data() { data() {
return { return {
title: process.env.VUE_APP_TITLE, title: process.env.VUE_APP_TITLE,
logo: logoImg logo: logoImg,
} };
} },
} };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@ -69,7 +104,7 @@ export default {
width: 32px; width: 32px;
height: 32px; height: 32px;
vertical-align: middle; vertical-align: middle;
margin-right: 12px; margin-right: 2px;
} }
& .sidebar-title { & .sidebar-title {

5
acupuncture-后台/src/main.js

@ -12,7 +12,8 @@ import store from './store'
import router from './router' import router from './router'
import directive from './directive' // directive import directive from './directive' // directive
import plugins from './plugins' // plugins import plugins from './plugins' // plugins
import { download } from '@/utils/request' import { download, download1} from '@/utils/request'
import moment from 'moment';
import './assets/icons' // icon import './assets/icons' // icon
import './permission' // permission control import './permission' // permission control
@ -47,7 +48,9 @@ Vue.prototype.addDateRange = addDateRange
Vue.prototype.selectDictLabel = selectDictLabel Vue.prototype.selectDictLabel = selectDictLabel
Vue.prototype.selectDictLabels = selectDictLabels Vue.prototype.selectDictLabels = selectDictLabels
Vue.prototype.download = download Vue.prototype.download = download
Vue.prototype.download1 = download1
Vue.prototype.handleTree = handleTree Vue.prototype.handleTree = handleTree
Vue.prototype.$moment = moment
// 全局组件挂载 // 全局组件挂载
Vue.component('DictTag', DictTag) Vue.component('DictTag', DictTag)

104
acupuncture-后台/src/router/index.js

@ -74,58 +74,58 @@ export const constantRoutes = [
}, },
], ],
}, },
{ // {
path: "/patientFile", // path: "/patientFile",
component: Layout, // component: Layout,
redirect: "index", // redirect: "patientFile",
children: [ // children: [
{ // {
path: "/patientIndex", // path: "/patientIndex",
component: () => import("@/views/patientFile/index"), // component: () => import("@/views/patientFile/index"),
name: "Index", // name: "patientIndex",
meta: { title: "患者档案", icon: "dashboard", }, // meta: { title: "患者档案", icon: "dashboard", },
}, // },
], // ],
}, // },
{ // {
path: "/medicalFile", // path: "/medicalFile",
component: Layout, // component: Layout,
redirect: "medicalFile", // redirect: "medicalFile",
children: [ // children: [
{ // {
path: "/medicalIndex", // path: "/medicalIndex",
component: () => import("@/views/medicalFile/index"), // component: () => import("@/views/medicalFile/index"),
name: "medicalIndex", // name: "medicalIndex",
meta: { title: "诊疗档案", icon: "dashboard", }, // meta: { title: "诊疗档案", icon: "dashboard", },
}, // },
], // ],
}, // },
{ // {
path: "/followFile", // path: "/followFile",
meta: { title: "随访档案", icon: "dashboard", }, // meta: { title: "随访档案", icon: "dashboard", },
component: Layout, // component: Layout,
redirect: "followFile", // redirect: "followFile",
children: [ // children: [
{ // {
path: "/followIndex", // path: "/followIndex",
component: () => import("@/views/followFile/index"), // component: () => import("@/views/followFile/index"),
name: "followIndex", // name: "followIndex",
meta: { title: "随访队列", icon: "dashboard", }, // meta: { title: "随访队列", icon: "dashboard", },
}, // },
{ // {
path: "/followSubjects", // path: "/followSubjects",
component: () => import("@/views/followFile/subjects"), // component: () => import("@/views/followFile/subjects"),
name: "followSubjects", // name: "followSubjects",
meta: { title: "随访对象", icon: "dashboard", }, // meta: { title: "随访对象", icon: "dashboard", },
}, // },
{ // {
path: "/followWork", // path: "/followWork",
component: () => import("@/views/followFile/work"), // component: () => import("@/views/followFile/work"),
name: "followWork", // name: "followWork",
meta: { title: "随访工单", icon: "dashboard", }, // meta: { title: "随访工单", icon: "dashboard", },
}, // },
], // ],
}, // },
{ {
path: "/user", path: "/user",
component: Layout, component: Layout,

57
acupuncture-后台/src/store/modules/settings.js

@ -1,42 +1,59 @@
import defaultSettings from '@/settings' import defaultSettings from "@/settings";
const { sideTheme, showSettings, topNav, tagsView, fixedHeader, sidebarLogo, dynamicTitle } = defaultSettings const {
sideTheme,
showSettings,
topNav,
tagsView,
fixedHeader,
sidebarLogo,
dynamicTitle,
} = defaultSettings;
const storageSetting = JSON.parse(localStorage.getItem('layout-setting')) || '' const storageSetting = JSON.parse(localStorage.getItem("layout-setting")) || "";
const state = { const state = {
title: '', title: "",
theme: storageSetting.theme || '#409EFF', theme: storageSetting.theme || "#C6A268",
sideTheme: storageSetting.sideTheme || sideTheme, sideTheme: storageSetting.sideTheme || sideTheme,
showSettings: showSettings, showSettings: showSettings,
topNav: storageSetting.topNav === undefined ? topNav : storageSetting.topNav, topNav: storageSetting.topNav === undefined ? topNav : storageSetting.topNav,
tagsView: storageSetting.tagsView === undefined ? tagsView : storageSetting.tagsView, tagsView:
fixedHeader: storageSetting.fixedHeader === undefined ? fixedHeader : storageSetting.fixedHeader, storageSetting.tagsView === undefined ? tagsView : storageSetting.tagsView,
sidebarLogo: storageSetting.sidebarLogo === undefined ? sidebarLogo : storageSetting.sidebarLogo, fixedHeader:
dynamicTitle: storageSetting.dynamicTitle === undefined ? dynamicTitle : storageSetting.dynamicTitle storageSetting.fixedHeader === undefined
} ? fixedHeader
: storageSetting.fixedHeader,
sidebarLogo:
storageSetting.sidebarLogo === undefined
? sidebarLogo
: storageSetting.sidebarLogo,
dynamicTitle:
storageSetting.dynamicTitle === undefined
? dynamicTitle
: storageSetting.dynamicTitle,
};
const mutations = { const mutations = {
CHANGE_SETTING: (state, { key, value }) => { CHANGE_SETTING: (state, { key, value }) => {
if (state.hasOwnProperty(key)) { if (state.hasOwnProperty(key)) {
state[key] = value state[key] = value;
} }
} },
} };
const actions = { const actions = {
// 修改布局设置 // 修改布局设置
changeSetting({ commit }, data) { changeSetting({ commit }, data) {
commit('CHANGE_SETTING', data) commit("CHANGE_SETTING", data);
}, },
// 设置网页标题 // 设置网页标题
setTitle({ commit }, title) { setTitle({ commit }, title) {
state.title = title state.title = title;
} },
} };
export default { export default {
namespaced: true, namespaced: true,
state, state,
mutations, mutations,
actions actions,
} };

33
acupuncture-后台/src/utils/request.js

@ -148,5 +148,38 @@ export function download(url, params, filename, config) {
downloadLoadingInstance.close(); downloadLoadingInstance.close();
}) })
} }
// 通用下载方法
export function download1(url, params, filename, config) {
downloadLoadingInstance = Loading.service({
text: "正在下载数据,请稍候",
spinner: "el-icon-loading",
background: "rgba(0, 0, 0, 0.7)",
});
return service
.post(url, params, {
headers: { "Content-Type": "application/json;charset=utf-8" },
responseType: "blob",
})
.then(async (data) => {
const isBlob = blobValidate(data);
if (isBlob) {
const blob = new Blob([data]);
saveAs(blob, filename);
} else {
const resText = await data.text();
const rspObj = JSON.parse(resText);
const errMsg =
errorCode[rspObj.code] || rspObj.msg || errorCode["default"];
Message.error(errMsg);
}
downloadLoadingInstance.close();
})
.catch((r) => {
console.error(r);
Message.error("下载文件出现错误,请联系管理员!");
downloadLoadingInstance.close();
});
}
export default service export default service

BIN
acupuncture-后台/src/views/bg.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

95
acupuncture-后台/src/views/followFile/index.vue

@ -16,6 +16,21 @@
@keyup.enter.native="handleQuery" @keyup.enter.native="handleQuery"
/> />
</el-form-item> </el-form-item>
<el-form-item label="组织" prop="tenantId">
<el-select
v-model="queryParams.param.tenantId"
placeholder="请选择"
clearable
filterable
>
<el-option
v-for="(item, index) in tenantsListData"
:label="item.name"
:value="item.id"
:key="index"
/>
</el-select>
</el-form-item>
<el-form-item> <el-form-item>
<el-button <el-button
type="primary" type="primary"
@ -70,6 +85,7 @@
align="center" align="center"
prop="name" prop="name"
min-width="130" min-width="130"
fixed
/> />
<el-table-column <el-table-column
label="随访方式" label="随访方式"
@ -111,23 +127,47 @@
min-width="100" min-width="100"
/> />
<el-table-column <el-table-column
label="状态" label="临近提醒时间(天)"
align="center" align="center"
prop="status" prop="remindTime"
show-overflow-tooltip
min-width="130"
/>
<el-table-column
label="窗口期"
align="center"
prop="followWindowAdys"
show-overflow-tooltip show-overflow-tooltip
min-width="100" min-width="100"
/>
<el-table-column
fixed="right"
label="组织"
align="center"
show-overflow-tooltip
min-width="130"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.status == 0" style="color: red">禁用</span> <span v-if="scope.row.type == 0">公共队列</span>
<span v-if="scope.row.status == 1" style="color: green">启用</span> <span v-else-if="scope.row.type == 1">{{
scope.row.tenantName
}}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
label="创建人/创建时间" label="状态"
align="center" align="center"
min-width="130" prop="status"
show-overflow-tooltip
min-width="80"
fixed="right" fixed="right"
> >
<template slot-scope="scope">
<span v-if="scope.row.status == 0" style="color: #f56c6c">禁用</span>
<span v-else style="color: #67c23a">启用</span>
</template>
</el-table-column>
<el-table-column label="创建人/创建时间" align="center" min-width="140">
<template slot-scope="scope"> <template slot-scope="scope">
<div>{{ scope.row.createBy }}</div> <div>{{ scope.row.createBy }}</div>
<span>{{ <span>{{
@ -142,6 +182,7 @@
type="text" type="text"
icon="el-icon-edit" icon="el-icon-edit"
@click="handleUpdate(scope.row)" @click="handleUpdate(scope.row)"
:disabled="scope.row.type != 0"
>修改</el-button >修改</el-button
> >
<el-button <el-button
@ -149,6 +190,7 @@
type="text" type="text"
icon="el-icon-delete" icon="el-icon-delete"
@click="handleDelete(scope.row)" @click="handleDelete(scope.row)"
:disabled="scope.row.type != 0"
>删除</el-button >删除</el-button
> >
</template> </template>
@ -176,7 +218,7 @@
ref="form" ref="form"
:model="form" :model="form"
:rules="rules" :rules="rules"
label-width="90px" label-width="130px"
> >
<el-form-item label="队列名称" prop="name"> <el-form-item label="队列名称" prop="name">
<el-input v-model="form.name" placeholder="请输入" /> <el-input v-model="form.name" placeholder="请输入" />
@ -212,6 +254,12 @@
<el-form-item label="总月数" prop="followupMonth"> <el-form-item label="总月数" prop="followupMonth">
<el-input v-model="form.followupMonth" placeholder="请输入" /> <el-input v-model="form.followupMonth" placeholder="请输入" />
</el-form-item> </el-form-item>
<el-form-item label="临近提醒时间(天)" prop="remindTime">
<el-input v-model="form.remindTime" placeholder="请输入" />
</el-form-item>
<el-form-item label="窗口期" prop="followWindowAdys">
<el-input v-model="form.followWindowAdys" placeholder="请输入" />
</el-form-item>
<el-form-item label="状态" prop="status"> <el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status"> <el-radio-group v-model="form.status">
<el-radio :label="1">启用</el-radio> <el-radio :label="1">启用</el-radio>
@ -247,12 +295,15 @@ import {
followupAdd, followupAdd,
followupUpd, followupUpd,
followupDel, followupDel,
commonQueue,
} from "@/api/followupFile"; } from "@/api/followupFile";
import { tenantsList } from "@/api/member";
export default { export default {
name: "Notice", name: "Notice",
components: { Crontab }, components: { Crontab },
data() { data() {
return { return {
tenantsListData: [], //
// Cron // Cron
openCron: false, openCron: false,
// //
@ -274,12 +325,17 @@ export default {
label: "台湾居民来往大陆通行证", label: "台湾居民来往大陆通行证",
value: 3, value: 3,
}, },
{
label: "其他",
value: 4,
},
], ],
idCardTypeValue: { idCardTypeValue: {
0: "身份证", 0: "身份证",
1: "护照或外国人永居证", 1: "护照或外国人永居证",
2: "港澳居民来往内地通行", 2: "港澳居民来往内地通行",
3: "台湾居民来往大陆通行证", 3: "台湾居民来往大陆通行证",
4: "其他",
}, },
loading: false, // loading: false, //
ids: [], // ids: [], //
@ -296,6 +352,7 @@ export default {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
param: { param: {
tenantId: "", // id
name: "", // name: "", //
}, },
}, },
@ -317,14 +374,36 @@ export default {
frequency: [ frequency: [
{ required: true, message: "随访频次不能为空", trigger: "blur" }, { required: true, message: "随访频次不能为空", trigger: "blur" },
], ],
followupMonth: [
{ required: true, message: "总月数不能为空", trigger: "blur" },
],
followWindowAdys: [
{ required: true, message: "窗口期不能为空", trigger: "blur" },
],
remindTime: [
{ required: true, message: "临近提醒时间不能为空", trigger: "blur" },
],
frequency: [
{ required: true, message: "随访频次不能为空", trigger: "blur" },
],
status: [{ required: true, message: "状态不能为空", trigger: "blur" }], status: [{ required: true, message: "状态不能为空", trigger: "blur" }],
}, },
}; };
}, },
created() { created() {
this.getList(); this.getList();
this.getTenantsList(); //
}, },
methods: { methods: {
//
getTenantsList() {
tenantsList({
pageNum: -1,
param: {},
}).then((res) => {
this.tenantsListData = res.data.list;
});
},
/** cron表达式按钮操作 */ /** cron表达式按钮操作 */
handleShowCron() { handleShowCron() {
this.expression = this.form.cronExpression; this.expression = this.form.cronExpression;
@ -334,6 +413,7 @@ export default {
crontabFill(value) { crontabFill(value) {
this.form.frequency = value; this.form.frequency = value;
}, },
/** 查询公告列表 */ /** 查询公告列表 */
getList() { getList() {
this.loading = true; this.loading = true;
@ -372,6 +452,7 @@ export default {
pageSize: 10, pageSize: 10,
param: { param: {
name: "", name: "",
tenantId: "",
}, },
}; };
this.handleQuery(); this.handleQuery();

141
acupuncture-后台/src/views/followFile/subjects.vue

@ -9,7 +9,11 @@
label-width="68px" label-width="68px"
> >
<el-form-item label="随访队列" prop="queueId"> <el-form-item label="随访队列" prop="queueId">
<el-select v-model="queryParams.param.queueId" placeholder="请选择"> <el-select
v-model="queryParams.param.queueId"
clearable
placeholder="请选择"
>
<el-option <el-option
v-for="item in followupList" v-for="item in followupList"
:key="item.id" :key="item.id"
@ -19,6 +23,26 @@
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="组织" prop="tenantId">
<el-select
v-model="queryParams.param.tenantId"
placeholder="请选择"
clearable
filterable
>
<el-option
v-for="(item, index) in tenantsListData"
:label="item.name"
:value="item.id"
:key="index"
/>
</el-select>
</el-form-item>
<el-form-item label="" prop="queueId">
<el-checkbox-group v-model="haveQueue">
<el-checkbox>未参加队列人员</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item> <el-form-item>
<el-button <el-button
type="primary" type="primary"
@ -32,7 +56,6 @@
</el-button> </el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<right-toolbar <right-toolbar
:showSearch.sync="showSearch" :showSearch.sync="showSearch"
@ -47,13 +70,20 @@
max-height="600" max-height="600"
> >
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="姓名" align="center" prop="name" width="100" />
<el-table-column <el-table-column
label="姓名"
align="center"
prop="name"
width="100"
fixed
/>
<el-table-column
fixed
label="性别" label="性别"
align="center" align="center"
prop="gender" prop="gender"
show-overflow-tooltip show-overflow-tooltip
width="100" min-width="100"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.gender == 0"></span> <span v-if="scope.row.gender == 0"></span>
@ -62,11 +92,12 @@
</el-table-column> </el-table-column>
<el-table-column <el-table-column
fixed
label="出生日期" label="出生日期"
align="center" align="center"
prop="birthDate" prop="birthDate"
show-overflow-tooltip show-overflow-tooltip
width="150" min-width="150"
> >
<template slot-scope="scope"> <template slot-scope="scope">
{{ parseTime(scope.row.createTime, "{y}-{m}-{d}") }} {{ parseTime(scope.row.createTime, "{y}-{m}-{d}") }}
@ -77,28 +108,28 @@
align="center" align="center"
prop="ethnicity" prop="ethnicity"
show-overflow-tooltip show-overflow-tooltip
width="100" min-width="100"
/> />
<el-table-column <el-table-column
label="受教育年限" label="受教育年限"
align="center" align="center"
prop="educationYears" prop="educationYears"
show-overflow-tooltip show-overflow-tooltip
width="100" min-width="100"
/> />
<el-table-column <el-table-column
label="手机号码" label="手机号码"
align="center" align="center"
prop="phone" prop="phone"
show-overflow-tooltip show-overflow-tooltip
width="150" min-width="150"
/> />
<el-table-column <el-table-column
label="证件类型" label="证件类型"
align="center" align="center"
prop="idCardType" prop="idCardType"
show-overflow-tooltip show-overflow-tooltip
width="200" min-width="200"
> >
<template slot-scope="scope"> <template slot-scope="scope">
{{ idCardTypeValue[scope.row.idCardType] }} {{ idCardTypeValue[scope.row.idCardType] }}
@ -109,7 +140,7 @@
align="center" align="center"
prop="idCard" prop="idCard"
show-overflow-tooltip show-overflow-tooltip
width="180" min-width="180"
/> />
<el-table-column <el-table-column
fixed="right" fixed="right"
@ -117,7 +148,7 @@
align="center" align="center"
prop="queueList" prop="queueList"
show-overflow-tooltip show-overflow-tooltip
width="180" min-width="180"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<div v-if="scope.row.queueList && scope.row.queueList.length"> <div v-if="scope.row.queueList && scope.row.queueList.length">
@ -125,10 +156,18 @@
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column
fixed="right"
prop="tenantName"
label="组织"
align="center"
show-overflow-tooltip
min-width="150"
/>
<el-table-column <el-table-column
label="创建人/创建时间" label="创建人/创建时间"
align="center" align="center"
width="130" width="140"
fixed="right" fixed="right"
> >
<template slot-scope="scope"> <template slot-scope="scope">
@ -140,13 +179,8 @@
</el-table-column> </el-table-column>
<el-table-column fixed="right" label="操作" align="center" width="200"> <el-table-column fixed="right" label="操作" align="center" width="200">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <!-- <el-button size="mini" type="text" icon="el-icon-edit"
size="mini" @click="handleUpdate(scope.row)">队列管理</el-button> -->
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
>队列管理</el-button
>
<el-button <el-button
size="mini" size="mini"
type="text" type="text"
@ -210,6 +244,7 @@
<script> <script>
import { queryPatient, followupQuery, updPatient } from "@/api/followupFile"; import { queryPatient, followupQuery, updPatient } from "@/api/followupFile";
import { tenantsList } from "@/api/member";
export default { export default {
name: "Notice", name: "Notice",
data() { data() {
@ -232,12 +267,17 @@ export default {
label: "台湾居民来往大陆通行证", label: "台湾居民来往大陆通行证",
value: 3, value: 3,
}, },
{
label: "其他",
value: 4,
},
], ],
idCardTypeValue: { idCardTypeValue: {
0: "身份证", 0: "身份证",
1: "护照或外国人永居证", 1: "护照或外国人永居证",
2: "港澳居民来往内地通行", 2: "港澳居民来往内地通行",
3: "台湾居民来往大陆通行证", 3: "台湾居民来往大陆通行证",
4: "其他",
}, },
loading: false, // loading: false, //
ids: [], // ids: [], //
@ -249,12 +289,17 @@ export default {
title: "", // title: "", //
open: false, // open: false, //
importOpen: false, // importOpen: false, //
tenantsListData: [],
// //
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
param: {}, param: {
tenantId: "",
queueId: "",
},
}, },
haveQueue: "",
formDisabled: false, formDisabled: false,
importform: {}, importform: {},
// //
@ -262,7 +307,11 @@ export default {
// //
rules: { rules: {
queueIdList: [ queueIdList: [
{ required: true, message: "随访队列不能为空", trigger: "change" }, {
required: true,
message: "随访队列不能为空",
trigger: "change",
},
], ],
}, },
followupList: [], // 访 followupList: [], // 访
@ -271,15 +320,31 @@ export default {
created() { created() {
this.getList(); this.getList();
this.getFollowupQuery(); this.getFollowupQuery();
this.getTenantsList(); //
}, },
methods: { methods: {
//
getTenantsList() {
tenantsList({
pageNum: -1,
param: {},
}).then((res) => {
this.tenantsListData = res.data.list;
});
},
// 访 // 访
getFollowupQuery() { getFollowupQuery() {
followupQuery({ followupQuery({
pageNum: -1, pageNum: -1,
param: {}, param: {
status: 1,
},
}).then((res) => { }).then((res) => {
this.followupList = res.data.list; this.followupList = res.data.list;
let commonQueue = JSON.parse(localStorage.getItem("commonQueue"));
commonQueue?.forEach((i) => {
this.followupList.unshift(i);
});
}); });
}, },
@ -304,12 +369,22 @@ export default {
}, },
/** 搜索按钮操作 */ /** 搜索按钮操作 */
handleQuery() { handleQuery() {
this.queryParams.param.haveQueue = "";
if (this.haveQueue) {
this.queryParams.param.haveQueue = 0;
}
this.queryParams.pageNum = 1; this.queryParams.pageNum = 1;
this.getList(); this.getList();
}, },
/** 重置按钮操作 */ /** 重置按钮操作 */
resetQuery() { resetQuery() {
this.resetForm("queryForm"); this.queryParams = {
param: {
tenantId: "",
queueId: "",
},
};
this.haveQueue = "";
this.handleQuery(); this.handleQuery();
}, },
// //
@ -322,7 +397,7 @@ export default {
handleUpdate(row) { handleUpdate(row) {
this.open = true; this.open = true;
this.title = "队列管理"; this.title = "队列管理";
let queueList = row.queueList.map((item) => item.queueId); let queueList = row.queueList?.map((item) => item.queueId) || [];
this.form = JSON.parse( this.form = JSON.parse(
JSON.stringify({ JSON.stringify({
...row, ...row,
@ -332,9 +407,17 @@ export default {
); );
}, },
/** 跳转患者档案 */ /** 跳转患者档案 */
handlePatient(row) {}, handlePatient(row) {
this.$router.push({
path: `/patientFile/index?idCard=${row.idCard}`,
});
},
/** 诊疗档案 */ /** 诊疗档案 */
handleMedical(row) {}, handleMedical(row) {
this.$router.push({
path: `/medicalFile/index?idCard=${row.idCard}`,
});
},
/** 提交按钮 */ /** 提交按钮 */
submitForm: function () { submitForm: function () {
this.$refs["form"].validate((valid) => { this.$refs["form"].validate((valid) => {
@ -354,7 +437,9 @@ export default {
this.$modal this.$modal
.confirm("是否确认删除当前选择的数据?") .confirm("是否确认删除当前选择的数据?")
.then(function () { .then(function () {
return patientDel({ idList: idList }); return patientDel({
idList: idList,
});
}) })
.then(() => { .then(() => {
this.getList(); this.getList();
@ -386,9 +471,11 @@ export default {
display: flex; display: flex;
align-items: center; align-items: center;
} }
.form-item-age span { .form-item-age span {
margin: 0 10px; margin: 0 10px;
} }
.form-item-age >>> .el-input { .form-item-age >>> .el-input {
width: 100px; width: 100px;
} }

317
acupuncture-后台/src/views/followFile/work.vue

@ -1,6 +1,66 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
v-show="showSearch"
label-width="68px"
>
<el-form-item label="" prop="keywords">
<el-input
style="width: 300px"
placeholder="姓名、全拼、简拼、手机号码、证件号码"
v-model="queryParams.param.keywords"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="状态" prop="childStatus">
<el-select
v-model="queryParams.param.childStatus"
clearable
placeholder="请选择"
>
<el-option
v-for="item in childStatusList[queryParams.param.status]"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="组织" prop="tenantId">
<el-select
v-model="queryParams.param.tenantId"
placeholder="请选择"
clearable
filterable
>
<el-option
v-for="(item, index) in tenantsListData"
:label="item.name"
:value="item.id"
:key="index"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>搜索</el-button
>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">
重置
</el-button>
</el-form-item>
</el-form>
<right-toolbar <right-toolbar
:showSearch.sync="showSearch" :showSearch.sync="showSearch"
@queryTable="getList" @queryTable="getList"
@ -19,30 +79,33 @@
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column <el-table-column
label="工单id" label="工单id"
fixed
show-overflow-tooltip show-overflow-tooltip
align="center" align="center"
prop="" prop="id"
width="100" min-width="200"
/> />
<el-table-column <el-table-column
fixed
label="随访队列" label="随访队列"
show-overflow-tooltip show-overflow-tooltip
align="" align="center"
prop="name" prop="queueName"
width="100" min-width="150"
/> />
<el-table-column <el-table-column
fixed
label="患者姓名" label="患者姓名"
align="center" align="center"
prop="name" prop="name"
width="100" min-width="100"
/> />
<el-table-column <el-table-column
label="性别" label="性别"
align="center" align="center"
prop="gender" prop="gender"
show-overflow-tooltip show-overflow-tooltip
width="100" min-width="60"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.gender == 0"></span> <span v-if="scope.row.gender == 0"></span>
@ -55,43 +118,53 @@
align="center" align="center"
prop="age" prop="age"
show-overflow-tooltip show-overflow-tooltip
width="150" min-width="60"
/> />
<el-table-column <el-table-column
label="证件号码" label="证件号码"
align="center" align="center"
prop="idCard" prop="idCard"
show-overflow-tooltip show-overflow-tooltip
width="180" min-width="180"
/> />
<el-table-column <el-table-column
label="手机号码" label="手机号码"
align="center" align="center"
prop="phone" prop="phone"
show-overflow-tooltip show-overflow-tooltip
width="150" min-width="150"
/> />
<el-table-column <el-table-column
label="随访序号" label="随访次数"
align="center" align="center"
prop="phone" prop="times"
show-overflow-tooltip show-overflow-tooltip
width="150" min-width="150"
/> />
<el-table-column <el-table-column
label="开始时间" label="开始时间"
align="center" align="center"
prop="startTime" prop="startTime"
show-overflow-tooltip show-overflow-tooltip
width="150" min-width="150"
/> >
<template slot-scope="scope">
<span>{{
parseTime(scope.row.startTime, "{y}-{m}-{d} {h}:{i}")
}}</span>
</template>
</el-table-column>
<el-table-column <el-table-column
label="结束时间" label="结束时间"
align="center" align="center"
prop="endTime" prop="endTime"
show-overflow-tooltip show-overflow-tooltip
width="150" min-width="150"
/> >
<template slot-scope="scope">
<span>{{ parseTime(scope.row.endTime, "{y}-{m}-{d} {h}:{i}") }}</span>
</template>
</el-table-column>
<!--待随访 随访状态待随访/即将超期/超期 --> <!--待随访 随访状态待随访/即将超期/超期 -->
<!--已随访 随访状态已随访/超随访期 --> <!--已随访 随访状态已随访/超随访期 -->
<!--待随访 随访状态待随访 --> <!--待随访 随访状态待随访 -->
@ -100,48 +173,59 @@
align="center" align="center"
prop="phone" prop="phone"
show-overflow-tooltip show-overflow-tooltip
width="150" min-width="100"
fixed="right"
> >
<template slot-scope="scope"> <template slot-scope="scope">
{{ status[scope.row.status] }} <span :class="classStatus[scope.row.status]">{{
status[scope.row.status]
}}</span>
</template> </template>
</el-table-column> </el-table-column>
<!-- <el-table-column <el-table-column
label="失访状态" fixed="right"
prop="tenantName"
label="组织"
align="center" align="center"
prop="phone"
show-overflow-tooltip show-overflow-tooltip
width="150" min-width="150"
/> --> />
<el-table-column <el-table-column
v-if="queryParams.param.status == 2"
label="失访原因" label="失访原因"
align="center" align="center"
prop="reason" prop="reason"
show-overflow-tooltip show-overflow-tooltip
width="150" width="200"
/> />
<el-table-column fixed="right" label="操作" align="center" width="100">
<el-table-column fixed="right" label="操作" align="center" width="150">
<template slot-scope="scope"> <template slot-scope="scope">
<!-- :disabled="scope.row.status !== '0'" --> <!-- 待随访 -->
<!-- <div v-if="queryParams.param.status == 0">
<el-button size="mini" type="text" icon="el-icon-s-check"
@click="handleFollow(scope.row)">
去随访
</el-button>
<el-button size="mini" type="text" icon="el-icon-s-release"
@click="handleLossFollow(scope.row)">
标记失访
</el-button>
</div> -->
<!-- 随访 -->
<el-button <el-button
:disabled="scope.row.status !== '0'" v-if="queryParams.param.status == 1"
size="mini" size="mini"
type="text" type="text"
icon="el-icon-s-check" icon="el-icon-s-check"
@click="handleFollow(scope.row)" @click="handleDetails(scope.row)"
> >
随访 查看详情
</el-button>
<el-button
:disabled="scope.row.status !== '0'"
size="mini"
type="text"
icon="el-icon-s-release"
@click="handleLossFollow(scope.row)"
>
失访
</el-button> </el-button>
<!-- 失访 -->
<!-- <el-button v-if="queryParams.param.status == 2" size="mini" type="text" icon="el-icon-s-check"
@click="handleBeFollow(scope.row)">
标记待随访
</el-button> -->
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -157,7 +241,7 @@
<!-- 失访 --> <!-- 失访 -->
<el-dialog <el-dialog
class="popup" class="popup"
title="失访" title="标记失访"
:visible.sync="open" :visible.sync="open"
width="780px" width="780px"
append-to-body append-to-body
@ -169,9 +253,6 @@
:rules="rules" :rules="rules"
label-width="90px" label-width="90px"
> >
<el-form-item label="随访次数" prop="times">
<el-input v-model="form.times" placeholder="请输入" />
</el-form-item>
<el-form-item label="失访原因" prop="reason"> <el-form-item label="失访原因" prop="reason">
<el-select v-model="form.reason" placeholder="请选择"> <el-select v-model="form.reason" placeholder="请选择">
<el-option-group <el-option-group
@ -211,10 +292,15 @@
label-width="90px" label-width="90px"
> >
<el-form-item label="随访人" prop="followuper"> <el-form-item label="随访人" prop="followuper">
<el-input v-model="form.followuper" placeholder="请输入" /> <el-input
:disabled="open1Disabled"
v-model="form.followuper"
placeholder="请输入"
/>
</el-form-item> </el-form-item>
<el-form-item label="随访时间" prop="followupTime"> <el-form-item label="随访时间" prop="followupTime">
<el-date-picker <el-date-picker
:disabled="open1Disabled"
format="yyyy-MM-dd HH:mm:ss" format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss"
v-model="form.followupTime" v-model="form.followupTime"
@ -223,15 +309,19 @@
> >
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="随访次数" prop="times">
<el-input v-model="form.times" placeholder="请输入" />
</el-form-item>
<el-form-item label="随访内容" prop="followupText"> <el-form-item label="随访内容" prop="followupText">
<el-input v-model="form.followupText" placeholder="请输入" /> <el-input
:disabled="open1Disabled"
type="textarea"
v-model="form.followupText"
placeholder="请输入"
/>
</el-form-item> </el-form-item>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm1"> </el-button> <el-button type="primary" @click="submitForm1" v-if="!open1Disabled"
> </el-button
>
<el-button @click="open1 = false"> </el-button> <el-button @click="open1 = false"> </el-button>
</div> </div>
</el-dialog> </el-dialog>
@ -239,7 +329,13 @@
</template> </template>
<script> <script>
import { queryTask, updStatus, followPatient } from "@/api/followupFile"; import {
queryTask,
updStatus,
followPatient,
followStatus,
} from "@/api/followupFile";
import { tenantsList } from "@/api/member";
export default { export default {
name: "Notice", name: "Notice",
data() { data() {
@ -303,6 +399,29 @@ export default {
4: "超期未随访", 4: "超期未随访",
5: "超期已随访", 5: "超期已随访",
}, },
classStatus: {
3: "status3",
4: "status4",
5: "status4",
},
childStatusList: {
0: [
{
label: "即将超期",
value: 1,
},
{
label: "超期未随访",
value: 2,
},
],
1: [
{
label: "超期已随访",
value: 2,
},
],
},
idCardType: [ idCardType: [
{ {
label: "身份证", label: "身份证",
@ -320,12 +439,17 @@ export default {
label: "台湾居民来往大陆通行证", label: "台湾居民来往大陆通行证",
value: 3, value: 3,
}, },
{
label: "其他",
value: 4,
},
], ],
idCardTypeValue: { idCardTypeValue: {
0: "身份证", 0: "身份证",
1: "护照或外国人永居证", 1: "护照或外国人永居证",
2: "港澳居民来往内地通行", 2: "港澳居民来往内地通行",
3: "台湾居民来往大陆通行证", 3: "台湾居民来往大陆通行证",
4: "其他",
}, },
loading: false, // loading: false, //
ids: [], // ids: [], //
@ -337,6 +461,7 @@ export default {
title: "", // title: "", //
open: false, // open: false, //
open1: false, // open1: false, //
open1Disabled: false,
importOpen: false, // importOpen: false, //
// //
queryParams: { queryParams: {
@ -344,8 +469,12 @@ export default {
pageSize: 10, pageSize: 10,
param: { param: {
status: "0", status: "0",
childStatus: "",
keywords: "",
tenantId: "",
}, },
}, },
tenantsListData: [], //
formDisabled: false, formDisabled: false,
importform: {}, importform: {},
// //
@ -353,29 +482,62 @@ export default {
// //
rules: { rules: {
followuper: [ followuper: [
{ required: true, message: "随访人不能为空", trigger: "blur" }, {
required: true,
message: "随访人不能为空",
trigger: "blur",
},
], ],
followupTime: [ followupTime: [
{ required: true, message: "随访时间不能为空", trigger: "change" }, {
required: true,
message: "随访时间不能为空",
trigger: "change",
},
], ],
followupText: [ followupText: [
{ required: true, message: "随访内容不能为空", trigger: "blur" }, {
required: true,
message: "随访内容不能为空",
trigger: "blur",
},
], ],
times: [ times: [
{ required: true, message: "随访次数不能为空", trigger: "blur" }, {
required: true,
message: "随访次数不能为空",
trigger: "blur",
},
], ],
reason: [ reason: [
{ required: true, message: "失访原因不能为空", trigger: "change" }, {
required: true,
message: "失访原因不能为空",
trigger: "change",
},
], ],
}, },
}; };
}, },
created() { created() {
let idCard = this.$route.query.idCard;
this.queryParams.param.keywords = idCard || "";
this.getList(); this.getList();
this.getTenantsList(); //
}, },
methods: { methods: {
//
getTenantsList() {
tenantsList({
pageNum: -1,
param: {},
}).then((res) => {
this.tenantsListData = res.data.list;
});
},
handleClick(tab, event) { handleClick(tab, event) {
this.queryParams.param.childStatus = "";
this.getList(); this.getList();
}, },
/** 查询公告列表 */ /** 查询公告列表 */
@ -404,7 +566,9 @@ export default {
}, },
/** 重置按钮操作 */ /** 重置按钮操作 */
resetQuery() { resetQuery() {
this.resetForm("queryForm"); this.queryParams.param.keywords = "";
this.queryParams.param.childStatus = "";
this.queryParams.param.tenantId = "";
this.handleQuery(); this.handleQuery();
}, },
// //
@ -421,6 +585,7 @@ export default {
/** 随访 */ /** 随访 */
handleFollow(row) { handleFollow(row) {
this.open1 = true; this.open1 = true;
this.open1Disabled = false;
this.form = { this.form = {
id: row.id, id: row.id,
followuper: "", followuper: "",
@ -429,12 +594,36 @@ export default {
followupText: "", followupText: "",
}; };
}, },
/** 失访 */ /** 标记失访 */
handleLossFollow(row) { handleLossFollow(row) {
this.open = true; this.open = true;
this.form = JSON.parse(JSON.stringify(row)); this.form = JSON.parse(JSON.stringify(row));
this.form.status = 2; this.form.status = 2;
}, },
handleDetails(row) {
this.open1 = true;
this.open1Disabled = true;
this.form = JSON.parse(JSON.stringify(row));
},
// 访
handleBeFollow(row) {
let data = {
id: row.id,
status: 0,
};
this.$modal
.confirm(`是否确认将该患者(${row.name})标记为待随访?`)
.then(function () {
return followStatus(data);
})
.then(() => {
this.getList();
this.$modal.msgSuccess("操作成功");
})
.catch((err) => {
console.log("err", err);
});
},
/** 提交按钮 */ /** 提交按钮 */
submitForm: function () { submitForm: function () {
this.$refs["form"].validate((valid) => { this.$refs["form"].validate((valid) => {
@ -485,7 +674,9 @@ export default {
this.$modal this.$modal
.confirm("是否确认删除当前选择的数据?") .confirm("是否确认删除当前选择的数据?")
.then(function () { .then(function () {
return patientDel({ idList: idList }); return patientDel({
idList: idList,
});
}) })
.then(() => { .then(() => {
this.getList(); this.getList();
@ -513,13 +704,21 @@ export default {
</script> </script>
<style scoped src="@/assets/styles/common.css"></style> <style scoped src="@/assets/styles/common.css"></style>
<style scoped> <style scoped>
.status3 {
color: orange;
}
.status4 {
color: red;
}
.form-item-age { .form-item-age {
display: flex; display: flex;
align-items: center; align-items: center;
} }
.form-item-age span { .form-item-age span {
margin: 0 10px; margin: 0 10px;
} }
.form-item-age >>> .el-input { .form-item-age >>> .el-input {
width: 100px; width: 100px;
} }

1188
acupuncture-后台/src/views/index.vue

File diff suppressed because it is too large

420
acupuncture-后台/src/views/indexCom/JM.vue

@ -0,0 +1,420 @@
<template>
<div>
<div class="app-container">
<div class="dis" style="width: 100%">
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">病种排名</span>
<div class="dis"></div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="diagnose" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">体型分布</span>
<div class="dis"></div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="system" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">体质分布</span>
<div class="dis"></div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="physique" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">体态评估TAPS</span>
<div class="dis"></div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="posture" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">失眠评估PHQ-9</span>
<div class="dis"></div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="agrypnia" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">焦虑HAMD-24</span>
<div class="dis"></div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="anxiety" style="width: 100%"></div>
</div>
</el-card>
</div>
</div>
</div>
<!-- <div class="app-container">
<div class="dis" style="width: 100%">
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">失眠评估PHQ-9</span>
<div class="dis"></div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="agrypnia" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">焦虑HAMD-24</span>
<div class="dis"></div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="anxiety" style="width: 100%"></div>
</div>
</el-card>
</div>
</div>
</div> -->
</div>
</template>
<script>
import * as echarts from "echarts";
require("echarts/theme/macarons"); // echarts theme
import resize from "@/views/dashboard/mixins/resize";
import { zlInfo } from "@/api/indexCom.js";
import {
diagnoseEcharts,
systemEcharts,
physiqueEcharts,
postureEcharts,
agrypniaEcharts,
anxietyEcharts,
} from "./index";
export default {
name: "Post",
props: ["title"],
mixins: [resize],
data() {
return {
queryParams: {
param: {
startTime: "",
endTime: "",
},
},
loading: false,
diagnoseValue: null, //
systemValue: null, //
physiqueValue: null, //
postureValue: null, //
agrypniaValue: null, //
anxietyValue: null, //
//
systemObj: {
yxfpz: "隐形肥胖型", //
zfgdx: "脂肪过多型", //
fpx: "肥胖型", //
jrbzx: "肌肉不足型", //
jkjcx: "健康匀称型", //
czjrx: "超重肌肉型", //
xsx: "消瘦型", //
dzfx: "低脂肪型", //
ydyx: "运动员型", //
},
//
physiqueObj: {
phz: "平和质", //
qxz: "气虚质", //
yangxz: "阳虚质", //
yinxz: "阴虚质", //
tsz: "痰湿质", //湿
srz: "湿热质", //湿
xyz: "血瘀质", //
qyz: "气郁质", //
tlz: "特禀质", //
},
};
},
created() {
// this.Linepatient();
this.getData();
},
methods: {
statistics(_data, _type) {
this.initial(_data, _type); //
this.loading = true;
this.getData(); //
},
//
async getData() {
try {
await zlInfo(this.queryParams).then((res) => {
const { jlfb, smfb, sort, ttfb, txfb, zytz } = res.data;
//
this.diagnoseValue = sort?.sort((a, b) => a.total - b.total);
this.handleDiagnose();
//
this.systemValue = [];
delete txfb?.total;
for (let key in txfb) {
let data = {
name: this.systemObj[key],
value: txfb[key] || 0,
};
this.systemValue.push(data);
}
this.handleSystem();
//
this.physiqueValue = [];
delete zytz?.total;
for (let key in zytz) {
let data = {
name: this.physiqueObj[key],
value: zytz[key] || 0,
};
this.physiqueValue.push(data);
}
this.handlePhysique();
//
this.postureValue = [
{
value: ttfb?.score1 || 0,
name: "1分",
},
{
value: ttfb?.score2 || 0,
name: "2分",
},
{
value: ttfb?.score3 || 0,
name: "3分",
},
{
value: ttfb?.score4 || 0,
name: "4分",
},
{
value: ttfb?.score5 || 0,
name: "5分",
},
];
this.handlePosture();
// PHQ-9
this.agrypniaValue = [];
for (let key in smfb) {
this.agrypniaValue.push(smfb[key]);
}
this.handleAgrypnia();
//
this.anxietyValue = [];
for (let key in jlfb) {
this.anxietyValue.push(jlfb[key]);
}
this.handleAnxiety();
this.loading = false;
});
} catch (e) {
console.log("诊疗信息", e);
}
},
//
handleDiagnose() {
diagnoseEcharts.series[0].data = this.diagnoseValue?.map((item) => {
return item.total;
});
diagnoseEcharts.yAxis.data = this.diagnoseValue?.map((item) => {
return item.diseaseName;
});
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("diagnose"), null, {
height: 300,
});
myChart.setOption(diagnoseEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
handleSystem() {
systemEcharts.series[0].data = this.systemValue?.map((item) => {
return item.value;
});
systemEcharts.xAxis.data = this.systemValue?.map((item) => {
return item.name;
});
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("system"), null, {
height: 300,
});
myChart.setOption(systemEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
handlePhysique() {
physiqueEcharts.series[0].data = this.physiqueValue?.map((item) => {
return item.value;
});
physiqueEcharts.xAxis.data = this.physiqueValue?.map((item) => {
return item.name;
});
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("physique"), null, {
height: 300,
});
myChart.setOption(physiqueEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
handlePosture() {
postureEcharts.series[0].data = this.postureValue;
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("posture"), null, {
height: 300,
});
myChart.setOption(postureEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
initial(_data, _type) {
_data[0] = this.$moment(_data[0]).format("YYYY-MM-DD");
_data[1] = this.$moment(_data[1]).format("YYYY-MM-DD");
this.queryParams.param = {
startTime: _data[0] + " " + "00:00:00",
endTime: _data[1] + " " + "23:59:59",
};
},
//
handleAgrypnia() {
agrypniaEcharts.series[0].data = this.agrypniaValue;
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("agrypnia"), null, {
height: 300,
});
myChart.setOption(agrypniaEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
handleAnxiety() {
anxietyEcharts.series[0].data = this.anxietyValue;
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("anxiety"), null, {
height: 300,
});
myChart.setOption(anxietyEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
getRenew() {
this.handleDiagnose();
this.handleSystem();
this.handlePhysique();
this.handlePosture();
this.handleAgrypnia();
this.handleAnxiety();
},
},
};
</script>
<style scoped src="@/assets/styles/common.css"></style>
<style scoped>
>>> .el-card__body {
padding: 10px 0 !important;
}
.dis {
display: flex;
}
.header-title {
font-size: 18px;
}
.title-box {
padding: 10px 20px;
border-bottom: 1px solid #dfe6ec;
}
.dian-box {
align-items: center;
}
.dian {
display: inline-block;
width: 16px;
height: 16px;
border-radius: 50%;
margin: 0 10px;
}
.title-box {
justify-content: space-between;
}
. >>> .el-radio--small.is-bordered {
margin-right: 20px !important;
margin-left: 0 !important;
}
>>> .el-radio__input {
display: none;
}
>>> .el-radio__label {
padding-left: 5px;
}
.app-container {
padding: 0;
display: flex;
justify-content: space-between;
}
.title {
display: flex;
align-items: center;
font-size: 20px;
font-weight: 600;
}
.title-bor {
display: inline-block;
height: 20px;
width: 6px;
background: #4f8bff;
margin-right: 10px;
border-radius: 8px;
}
</style>

388
acupuncture-后台/src/views/indexCom/XGZL.vue

@ -0,0 +1,388 @@
<template>
<div>
<div class="app-container">
<div class="dis" style="width: 100%">
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">治疗类型分布</span>
<div class="dis">
<div class="dian-box dis">
<div class="dian-box dis">
<span class="dian" style="background: #c6a268"></span>
中西医结合
</div>
<span class="dian" style="background: #d8d8d8"></span>
纯中医
</div>
</div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="healType" style="width: 100%"></div>
</div>
</el-card>
</div>
<!-- <div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">病种方法分布</span>
<div class="dis"></div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="diseaseMethod" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1;">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">病种穴位分布</span>
<div class="dis">
</div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="acupoint" style="width: 100%"></div>
</div>
</el-card>
</div> -->
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">治疗效果</span>
<div class="dis">
<div class="dian-box dis">
<div class="dian-box dis">
<span class="dian" style="background: #c6a268"></span>
治愈
</div>
<div class="dian-box dis">
<span class="dian" style="background: #906c4a"></span>
显效
</div>
<div class="dian-box dis">
<span class="dian" style="background: #70483e"></span>
好转
</div>
<div class="dian-box dis">
<span class="dian" style="background: #c7bdb1"></span>
无效
</div>
</div>
</div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="effect" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">诊疗费用分布</span>
<div class="dis"></div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="cost" style="width: 100%"></div>
</div>
</el-card>
</div>
</div>
</div>
<!-- <div class="app-container">
<div class="dis" style="width: 100%">
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">治疗效果</span>
<div class="dis">
<div class="dian-box dis">
<div class="dian-box dis">
<span class="dian" style="background: #5C7BD9"></span>
治愈
</div>
<div class="dian-box dis">
<span class="dian" style="background: #91CC75"></span>
显效
</div>
<div class="dian-box dis">
<span class="dian" style="background: #FAC858"></span>
好转
</div>
<div class="dian-box dis">
<span class="dian" style="background: #EE6666"></span>
无效
</div>
</div>
</div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="effect" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">诊疗费用分布</span>
<div class="dis">
</div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="cost" style="width: 100%"></div>
</div>
</el-card>
</div>
</div>
</div> -->
</div>
</template>
<script>
import * as echarts from "echarts";
require("echarts/theme/macarons"); // echarts theme
import resize from "@/views/dashboard/mixins/resize";
import { zlType } from "@/api/indexCom.js";
import {
healTypeEcharts,
diseaseMethodEcharts,
effectEcharts,
costEcharts,
} from "./index";
export default {
name: "Post",
props: ["title"],
mixins: [resize],
data() {
return {
queryParams: {
param: {
startTime: "",
endTime: "",
},
},
loading: false,
healTypeValue: null, //
diseaseMethod: null, //
effectValue: null, //
costValue: null, //
effectObj: {
zy: "治愈", //
xx: "显效", //
hz: "好转", //
wx: "无效", //
},
};
},
created() {
// this.Linepatient();
this.getData();
},
methods: {
statistics(_data, _type) {
this.initial(_data, _type); //
this.loading = true;
this.getData(); //
},
//
async getData() {
try {
await zlType(this.queryParams).then((res) => {
const { bzfffb, bzxwfb, zlfy, zllxtj, zlxwfb } = res.data;
//
this.healTypeValue = [
{
value: zllxtj?.zxyjh || 0,
name: "中西医结合",
},
{
value: zllxtj?.czy || 0,
name: "纯中医",
},
];
this.handleHealType();
//
// let diseaseMethod = []
// let index = 0
// for(let i in bzfffb){
// for(let k in bzfffb[i]){
// console.log(bzfffb[i][k])
// }
// index ++
// }
// this.handleDiseaseMethod()
//
this.effectValue = [
{
name: "治愈",
value: zlxwfb?.zy || 0,
},
{
name: "显效",
value: zlxwfb?.xx || 0,
},
{
name: "好转",
value: zlxwfb?.hz || 0,
},
{
name: "无效",
value: zlxwfb?.wx || 0,
},
];
this.handleEffect();
//
this.costValue = [
zlfy?.score1 || 0,
zlfy?.score2 || 0,
zlfy?.score3 || 0,
zlfy?.score4 || 0,
zlfy?.score5 || 0,
];
this.handleCost();
this.loading = false;
});
} catch (e) {
console.log("治疗类型", e);
}
},
//
handleHealType() {
healTypeEcharts.series[0].data = this.healTypeValue;
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("healType"), null, {
height: 300,
});
myChart.setOption(healTypeEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
handleDiseaseMethod() {
// diseaseMethodEcharts.series[0].data = this.diseaseMethod
this.$nextTick(() => {
var myChart = echarts.init(
document.getElementById("diseaseMethod"),
null,
{
height: 300,
}
);
myChart.setOption(diseaseMethodEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
handleEffect() {
effectEcharts.series[0].data = this.effectValue;
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("effect"), null, {
height: 300,
});
myChart.setOption(effectEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
handleCost() {
costEcharts.series[0].data = this.costValue;
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("cost"), null, {
height: 300,
});
myChart.setOption(costEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
initial(_data, _type) {
_data[0] = this.$moment(_data[0]).format("YYYY-MM-DD");
_data[1] = this.$moment(_data[1]).format("YYYY-MM-DD");
this.queryParams.param = {
startTime: _data[0] + " " + "00:00:00",
endTime: _data[1] + " " + "23:59:59",
};
},
//
getRenew() {
this.handleHealType();
this.handleEffect();
this.handleCost();
},
},
};
</script>
<style scoped src="@/assets/styles/common.css"></style>
<style scoped>
>>> .el-card__body {
padding: 10px 0 !important;
}
.dis {
display: flex;
}
.header-title {
font-size: 18px;
}
.title-box {
padding: 10px 20px;
border-bottom: 1px solid #dfe6ec;
}
.dian-box {
align-items: center;
}
.dian {
display: inline-block;
width: 16px;
height: 16px;
border-radius: 50%;
margin: 0 10px;
}
.title-box {
justify-content: space-between;
}
. >>> .el-radio--small.is-bordered {
margin-right: 20px !important;
margin-left: 0 !important;
}
>>> .el-radio__input {
display: none;
}
>>> .el-radio__label {
padding-left: 5px;
}
.app-container {
padding: 0;
display: flex;
justify-content: space-between;
}
.title {
display: flex;
align-items: center;
font-size: 20px;
font-weight: 600;
}
.title-bor {
display: inline-block;
height: 20px;
width: 6px;
background: #4f8bff;
margin-right: 10px;
border-radius: 8px;
}
</style>

261
acupuncture-后台/src/views/indexCom/follow.vue

@ -0,0 +1,261 @@
<template>
<div>
<div class="app-container">
<div class="dis" style="width: 100%">
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">随访队列分布</span>
<div class="dis"></div>
</div>
<!-- 患者总数统计图 -->
<div style="height: 300px" v-loading="loading">
<div id="follow" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">失访原因分布</span>
<div class="dis"></div>
</div>
<!-- 患者总数统计图 -->
<div style="height: 300px" v-loading="loading">
<div id="lossFollow" style="width: 100%"></div>
</div>
</el-card>
</div>
</div>
</div>
</div>
</template>
<script>
import * as echarts from "echarts";
require("echarts/theme/macarons"); // echarts theme
import resize from "@/views/dashboard/mixins/resize";
import { sffb, sftj } from "@/api/indexCom.js";
import { followEcharts, lossFollowEcharts } from "./index";
export default {
name: "Post",
props: ["title"],
mixins: [resize],
data() {
return {
loading: false,
followValue: [], //
lossFollowValue: [], //
queryParams: {
param: {
startTime: "",
endTime: "",
},
},
};
},
created() {
// this.Linepatient()
this.getData();
},
methods: {
statistics(_data, _type) {
this.initial(_data, _type); //
this.loading = true;
this.getData(); //
},
//
async getData() {
try {
this.followValue = {};
await sffb(this.queryParams).then((res) => {
res.data.forEach((i) => {
let data = [i.dsf, i.ljsf, i.cqsf, i.zc];
this.followValue[i.queueName] = data;
});
this.handleFollow();
});
await sftj(this.queryParams).then((res) => {
this.lossFollowValue = res.data;
this.handleLossFollow();
});
this.loading = false;
} catch (e) {
console.log("随访", e);
}
},
//
handleFollow() {
followEcharts.series = [];
let colorArr = [
"#C7BDB1",
"#C6A268",
"#906C4A",
"#70483E",
"#582518",
"#C7BDB1",
"#C6A268",
"#906C4A",
"#70483E",
"#582518",
"#C7BDB1",
"#C6A268",
"#906C4A",
"#70483E",
"#582518",
"#C7BDB1",
"#C6A268",
"#906C4A",
"#70483E",
"#582518",
"#C7BDB1",
"#C6A268",
"#906C4A",
"#70483E",
"#582518",
"#C7BDB1",
"#C6A268",
"#906C4A",
"#70483E",
"#582518",
"#C7BDB1",
"#C6A268",
"#906C4A",
"#70483E",
"#582518",
"#C7BDB1",
"#C6A268",
"#906C4A",
"#70483E",
"#582518",
];
let index = 0;
for (let key in this.followValue) {
let series = {
name: key,
data: this.followValue[key],
type: "bar",
barMaxWidth: 24, //
color: colorArr[index],
};
followEcharts.series.push(series);
index++;
}
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("follow"), null, {
height: 300,
});
myChart.setOption(followEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
// 访
handleLossFollow() {
lossFollowEcharts.series[0].data = this.lossFollowValue?.map((item) => {
return item.num;
});
lossFollowEcharts.xAxis.data = this.lossFollowValue?.map((item) => {
return item.reason;
});
this.$nextTick(() => {
var myChart = echarts.init(
document.getElementById("lossFollow"),
null,
{
height: 300,
}
);
myChart.setOption(lossFollowEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
initial(_data, _type) {
_data[0] = this.$moment(_data[0]).format("YYYY-MM-DD");
_data[1] = this.$moment(_data[1]).format("YYYY-MM-DD");
this.queryParams.param = {
startTime: _data[0] + " " + "00:00:00",
endTime: _data[1] + " " + "23:59:59",
};
},
//
getRenew() {
this.handleFollow();
this.handleLossFollow();
},
},
};
</script>
<style scoped src="@/assets/styles/common.css"></style>
<style scoped>
>>> .el-card__body {
padding: 10px 0 !important;
}
.dis {
display: flex;
}
.header-title {
font-size: 18px;
}
.title-box {
padding: 10px 20px;
border-bottom: 1px solid #dfe6ec;
}
.dian-box {
align-items: center;
}
.dian {
display: inline-block;
width: 16px;
height: 16px;
border-radius: 50%;
margin: 0 10px;
}
.title-box {
justify-content: space-between;
}
. >>> .el-radio--small.is-bordered {
margin-right: 20px !important;
margin-left: 0 !important;
}
>>> .el-radio__input {
display: none;
}
>>> .el-radio__label {
padding-left: 5px;
}
.app-container {
padding: 0;
display: flex;
justify-content: space-between;
}
.title {
display: flex;
align-items: center;
font-size: 20px;
font-weight: 600;
}
.title-bor {
display: inline-block;
height: 20px;
width: 6px;
background: #4f8bff;
margin-right: 10px;
border-radius: 8px;
}
</style>

BIN
acupuncture-后台/src/views/indexCom/image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

955
acupuncture-后台/src/views/indexCom/index.js

@ -0,0 +1,955 @@
import * as echarts from "echarts";
// -------- 患者信息统计 --------
// 患者总数
export const HZXX = {
tooltip: {
trigger: "item",
},
title: {
text: "100",
left: "center",
top: "40%",
textStyle: {
textAlign: "center",
color: "#393D4E",
fontSize: 40,
fontWeight: 600,
},
},
grid: {
top: "0%",
left: "0",
right: "0%",
bottom: "0%",
containLabel: true,
},
color: ["#C6A268"],
graphic: {
type: "text",
left: "center",
top: "56%",
style: {
text: "患者总数",
color: "#70798C",
textAlign: "center",
fill: "#999999",
fontSize: 18,
width: "50px",
},
},
series: [
{
type: "pie",
radius: ["60%", "80%"],
avoidLabelOverlap: false,
label: {
show: false,
position: "center",
},
labelLine: {
show: false,
},
data: [],
},
],
};
// 患者性别
export const gende = {
tooltip: {
trigger: "item",
},
title: {
text: "",
left: "center",
top: "40%",
textStyle: {
textAlign: "center",
color: "#393D4E",
fontSize: 40,
fontWeight: 600,
},
},
grid: {
top: "0%",
left: "0",
right: "0%",
bottom: "0%",
containLabel: true,
},
color: ["#70483E", "#C7BDB1"],
series: [
{
type: "pie",
radius: "80%",
avoidLabelOverlap: false,
label: {
show: false,
position: "center",
normal: {
show: true,
position: "inner",
formatter: "{b}:{c}个",
textStyle: {
color: "#fff",
},
},
},
labelLine: {
show: false,
},
data: [],
},
],
};
// 年龄分布
export const ageEcharts = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985",
},
},
formatter: function (params) {
let res1 = params[0].name;
for (var i = 0, l = params.length; i < l; i++) {
res1 +=
"<br/>" +
`<span style="background:${params[i].color};width:12px;display:inline-block;height:12px;border-radius:50%;margin-right:5px;"></span>` +
params[i].seriesName +
" : " +
params[i].value +
"个";
}
return res1;
},
},
xAxis: {
type: "category",
data: ["<40岁", "41-50岁", "51-60岁", "61-70岁", "71-80岁", ">80岁"],
},
grid: {
top: "12%",
left: "4%",
right: "4%",
bottom: "0%",
containLabel: true,
},
yAxis: {
name: "数量( 个 )",
type: "value",
minInterval: 1,
nameTextStyle: {
padding: [0, 0, 0, 20],
},
splitLine: {
show: true,
lineStyle: {
type: "dashed",
},
},
},
series: [
{
name: "数量:",
data: [],
type: "bar",
barMaxWidth: 24, //柱图宽度
color: "#C6A268",
// itemStyle: {
// normal: {
// //这里设置柱形图圆角 [左上角,右上角,右下角,左下角]
// barBorderRadius: [50, 50, 0, 0],
// color: function (params) {
// var colorList = [
// "#C6A268",
// ];
// return colorList[params.dataIndex];
// },
// },
// },
},
],
};
// 病种分布
export const diseaseEcharts = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985",
},
},
formatter: function (params) {
let res1 = params[0].name;
for (var i = 0, l = params.length; i < l; i++) {
res1 +=
"<br/>" +
`<span style="background:${params[i].color};width:12px;display:inline-block;height:12px;border-radius:50%;margin-right:5px;"></span>` +
params[i].seriesName +
" : " +
params[i].value +
"个";
}
return res1;
},
},
xAxis: {
type: "category",
data: ["<40岁", "41-50岁", "51-60岁", "61-70岁", "71-80岁", ">80岁"],
},
grid: {
top: "12%",
left: "6%",
right: "4%",
bottom: "0%",
containLabel: true,
},
yAxis: {
name: "数量( 个 )",
type: "value",
minInterval: 1,
nameTextStyle: {
padding: [0, 0, 0, 30],
},
splitLine: {
show: true,
lineStyle: {
type: "dashed",
},
},
},
series: [
{
name: "数量:",
data: [],
type: "bar",
barMaxWidth: 24, //柱图宽度
color: "#70483E",
},
],
};
// -------- 诊疗信息统计 --------
// 病种排名
export const diagnoseEcharts = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985",
},
},
formatter: function (params) {
let res1 = params[0].name;
for (var i = 0, l = params.length; i < l; i++) {
res1 +=
"<br/>" +
`<span style="background:${params[i].color};width:12px;display:inline-block;height:12px;border-radius:50%;margin-right:5px;"></span>` +
params[i].seriesName +
" : " +
params[i].value +
"个";
}
return res1;
},
},
xAxis: {
type: "value",
minInterval: 1,
splitLine: {
show: true,
lineStyle: {
type: "dashed",
},
},
},
grid: {
top: "4%",
left: "4%",
right: "6%",
bottom: "0%",
containLabel: true,
},
yAxis: {
type: "category",
data: [],
splitLine: {
show: true,
lineStyle: {
type: "dashed",
},
},
},
series: [
{
name: "数量:",
data: [],
type: "bar",
barMaxWidth: 24, //柱图宽度
color: "#906C4A",
},
],
};
// 体型
export const systemEcharts = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985",
},
},
formatter: function (params) {
let res1 = params[0].name;
for (var i = 0, l = params.length; i < l; i++) {
res1 +=
"<br/>" +
`<span style="background:${params[i].color};width:12px;display:inline-block;height:12px;border-radius:50%;margin-right:5px;"></span>` +
params[i].seriesName +
" : " +
params[i].value +
"个";
}
return res1;
},
},
xAxis: {
type: "category",
data: [],
},
grid: {
top: "12%",
left: "6%",
right: "4%",
bottom: "0%",
containLabel: true,
},
yAxis: {
name: "数量( 个 )",
type: "value",
minInterval: 1,
nameTextStyle: {
padding: [0, 0, 0, 34],
},
splitLine: {
show: true,
lineStyle: {
type: "dashed",
},
},
},
series: [
{
name: "数量:",
data: [],
type: "bar",
barMaxWidth: 24, //柱图宽度
color: "#C6A268",
// itemStyle: {
// normal: {
// //这里设置柱形图圆角 [左上角,右上角,右下角,左下角]
// barBorderRadius: [50, 50, 0, 0],
// },
// },
},
],
};
// 体质
export const physiqueEcharts = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985",
},
},
formatter: function (params) {
let res1 = params[0].name;
for (var i = 0, l = params.length; i < l; i++) {
res1 +=
"<br/>" +
`<span style="background:${params[i].color};width:12px;display:inline-block;height:12px;border-radius:50%;margin-right:5px;"></span>` +
params[i].seriesName +
" : " +
params[i].value +
"个";
}
return res1;
},
},
xAxis: {
type: "category",
data: [],
},
grid: {
top: "12%",
left: "4%",
right: "4%",
bottom: "0%",
containLabel: true,
},
yAxis: {
name: "数量( 个 )",
type: "value",
minInterval: 1,
nameTextStyle: {
padding: [0, 0, 0, 20],
},
splitLine: {
show: true,
lineStyle: {
type: "dashed",
},
},
},
series: [
{
name: "数量:",
data: [],
type: "bar",
barMaxWidth: 24, //柱图宽度
color: "#70483E",
// itemStyle: {
// normal: {
// //这里设置柱形图圆角 [左上角,右上角,右下角,左下角]
// barBorderRadius: [50, 50, 0, 0],
// },
// },
},
],
};
// 体态
export const postureEcharts = {
tooltip: {
trigger: "item",
},
title: {
text: "",
left: "center",
top: "40%",
textStyle: {
textAlign: "center",
color: "#393D4E",
fontSize: 40,
fontWeight: 600,
},
},
grid: {
top: "0%",
left: "0",
right: "0%",
bottom: "0%",
containLabel: true,
},
color: ["#C7BDB1", "#C6A268", "#906C4A", "#70483E", "#582518"],
series: [
{
type: "pie",
radius: "80%",
avoidLabelOverlap: false,
label: {
show: false,
position: "center",
normal: {
show: true,
position: "inner",
formatter: "{b}:{c}个",
textStyle: {
color: "#fff",
},
},
},
labelLine: {
show: false,
},
data: [],
},
],
};
// 失眠评估
export const agrypniaEcharts = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985",
},
},
formatter: function (params) {
let res1 = params[0].name;
for (var i = 0, l = params.length; i < l; i++) {
res1 +=
"<br/>" +
`<span style="background:${params[i].color};width:12px;display:inline-block;height:12px;border-radius:50%;margin-right:5px;"></span>` +
params[i].seriesName +
" : " +
params[i].value +
"个";
}
return res1;
},
},
xAxis: {
type: "category",
data: ["0~4分", "5~9分", "10~14分", "15~19分", "20~27分"],
},
grid: {
top: "12%",
left: "5%",
right: "5%",
bottom: "0%",
containLabel: true,
},
yAxis: {
name: "数量( 个 )",
type: "value",
minInterval: 1,
nameTextStyle: {
padding: [0, 0, 0, 20],
},
splitLine: {
show: true,
lineStyle: {
type: "dashed",
},
},
},
series: [
{
name: "数量:",
data: [],
type: "bar",
barMaxWidth: 24, //柱图宽度
color: "#C6A268",
// itemStyle: {
// normal: {
// //这里设置柱形图圆角 [左上角,右上角,右下角,左下角]
// barBorderRadius: [50, 50, 0, 0],
// },
// },
},
],
};
// 焦虑度
export const anxietyEcharts = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985",
},
},
formatter: function (params) {
let res1 = params[0].name;
for (var i = 0, l = params.length; i < l; i++) {
res1 +=
"<br/>" +
`<span style="background:${params[i].color};width:12px;display:inline-block;height:12px;border-radius:50%;margin-right:5px;"></span>` +
params[i].seriesName +
" : " +
params[i].value +
"个";
}
return res1;
},
},
xAxis: {
type: "category",
data: ["<8分", "8~20分", "21~35分", ">35分"],
},
grid: {
top: "12%",
left: "5%",
right: "5%",
bottom: "0%",
containLabel: true,
},
yAxis: {
name: "数量( 个 )",
type: "value",
minInterval: 1,
nameTextStyle: {
padding: [0, 0, 0, 20],
},
splitLine: {
show: true,
lineStyle: {
type: "dashed",
},
},
},
series: [
{
name: "数量:",
data: [],
type: "bar",
barMaxWidth: 24, //柱图宽度
color: "#70483E",
// itemStyle: {
// normal: {
// //这里设置柱形图圆角 [左上角,右上角,右下角,左下角]
// barBorderRadius: [50, 50, 0, 0],
// },
// },
},
],
};
// -------- 治疗类型 --------
// 治疗类型
export const healTypeEcharts = {
tooltip: {
trigger: "item",
},
title: {
text: "",
left: "center",
top: "40%",
textStyle: {
textAlign: "center",
color: "#393D4E",
fontSize: 40,
fontWeight: 600,
},
},
grid: {
top: "0%",
left: "0",
right: "0%",
bottom: "0%",
containLabel: true,
},
color: ["#C6A268", "#D8D8D8"],
series: [
{
type: "pie",
radius: "80%",
avoidLabelOverlap: false,
label: {
show: false,
position: "center",
normal: {
show: true,
position: "inner",
formatter: "{b}:{c}个",
textStyle: {
color: "#fff",
},
},
},
labelLine: {
show: false,
},
data: [],
},
],
};
// 病种方法
export const diseaseMethodEcharts = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985",
},
},
formatter: function (params) {
let res1 = params[0].name;
for (var i = 0, l = params.length; i < l; i++) {
res1 +=
"<br/>" +
`<span style="background:${params[i].color};width:12px;display:inline-block;height:12px;border-radius:50%;margin-right:5px;"></span>` +
params[i].seriesName +
" : " +
params[i].value +
"个";
}
return res1;
},
},
xAxis: {
type: "category",
data: ["肥胖症", "失眠症", "其他"],
},
grid: {
top: "12%",
left: "5%",
right: "2%",
bottom: "0%",
containLabel: true,
},
yAxis: {
name: "数量( 个 )",
type: "value",
minInterval: 1,
splitLine: {
show: true,
lineStyle: {
type: "dashed",
},
},
},
series: [
{
name: "数量1:",
data: [1, 2],
type: "bar",
barMaxWidth: 24, //柱图宽度
itemStyle: {
normal: {
//这里设置柱形图圆角 [左上角,右上角,右下角,左下角]
barBorderRadius: [50, 50, 0, 0],
},
},
},
{
name: "数量2:",
data: [1, 3],
type: "bar",
barMaxWidth: 24, //柱图宽度
itemStyle: {
normal: {
//这里设置柱形图圆角 [左上角,右上角,右下角,左下角]
barBorderRadius: [50, 50, 0, 0],
},
},
},
],
};
// 治疗效果
export const effectEcharts = {
tooltip: {
trigger: "item",
},
title: {
text: "",
left: "center",
top: "40%",
textStyle: {
textAlign: "center",
color: "#393D4E",
fontSize: 40,
fontWeight: 600,
},
},
grid: {
top: "0%",
left: "0",
right: "0%",
bottom: "0%",
containLabel: true,
},
color: ["#C6A268", "#906C4A", "#70483E", "#C7BDB1"],
series: [
{
type: "pie",
radius: "80%",
avoidLabelOverlap: false,
label: {
show: false,
position: "center",
normal: {
show: true,
position: "inner",
formatter: "{b}:{c}个",
textStyle: {
color: "#fff",
},
},
},
labelLine: {
show: false,
},
data: [],
},
],
};
// 诊疗费用
export const costEcharts = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985",
},
},
formatter: function (params) {
let res1 = params[0].name;
for (var i = 0, l = params.length; i < l; i++) {
res1 +=
"<br/>" +
`<span style="background:${params[i].color};width:12px;display:inline-block;height:12px;border-radius:50%;margin-right:5px;"></span>` +
params[i].seriesName +
" : " +
params[i].value +
"个";
}
return res1;
},
},
xAxis: {
type: "category",
data: ["<300元", "300 ~ 900元", "900 ~ 2000元", "2000 ~ 5000元", ">5000元"],
},
grid: {
top: "12%",
left: "4%",
right: "4%",
bottom: "0%",
containLabel: true,
},
yAxis: {
name: "数量( 个 )",
type: "value",
minInterval: 1,
nameTextStyle: {
padding: [0, 0, 0, 20],
},
splitLine: {
show: true,
lineStyle: {
type: "dashed",
},
},
},
series: [
{
name: "数量:",
data: [],
type: "bar",
barMaxWidth: 24, //柱图宽度
color: "#C6A268",
// itemStyle: {
// normal: {
// //这里设置柱形图圆角 [左上角,右上角,右下角,左下角]
// barBorderRadius: [50, 50, 0, 0],
// },
// },
},
],
};
// -------- 随访 --------
export const followEcharts = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985",
},
},
formatter: function (params) {
let res1 = params[0].name;
for (var i = 0, l = params.length; i < l; i++) {
res1 +=
"<br/>" +
`<span style="background:${params[i].color};width:12px;display:inline-block;height:12px;border-radius:50%;margin-right:5px;"></span>` +
params[i].seriesName +
" : " +
params[i].value +
"个";
}
return res1;
},
},
xAxis: {
type: "category",
data: ["待随访", "临近随访", "超期随访", "正常随访"],
},
grid: {
top: "12%",
left: "4%",
right: "4%",
bottom: "0%",
containLabel: true,
},
yAxis: {
name: "数量( 个 )",
type: "value",
minInterval: 1,
nameTextStyle: {
padding: [0, 0, 0, 20],
},
splitLine: {
show: true,
lineStyle: {
type: "dashed",
},
},
},
series: [],
};
// 失访原因
export const lossFollowEcharts = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985",
},
},
formatter: function (params) {
let res1 = params[0].name;
for (var i = 0, l = params.length; i < l; i++) {
res1 +=
"<br/>" +
`<span style="background:${params[i].color};width:12px;display:inline-block;height:12px;border-radius:50%;margin-right:5px;"></span>` +
params[i].seriesName +
" : " +
params[i].value +
"个";
}
return res1;
},
},
xAxis: {
type: "category",
data: [],
},
grid: {
top: "12%",
left: "4%",
right: "4%",
bottom: "0%",
containLabel: true,
},
yAxis: {
name: "数量( 个 )",
type: "value",
minInterval: 1,
nameTextStyle: {
padding: [0, 0, 0, 20],
},
splitLine: {
show: true,
lineStyle: {
type: "dashed",
},
},
},
series: [
{
name: "数量:",
data: [],
type: "bar",
barMaxWidth: 24, //柱图宽度
color: "#70483E",
// itemStyle: {
// normal: {
// //这里设置柱形图圆角 [左上角,右上角,右下角,左下角]
// barBorderRadius: [50, 50, 0, 0],
// },
// },
},
],
};

373
acupuncture-后台/src/views/indexCom/patient.vue

@ -0,0 +1,373 @@
<template>
<div>
<div class="app-container">
<div class="dis" style="width: 100%">
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">患者总数</span>
<div class="dis"></div>
</div>
<!-- 患者总数统计图 -->
<div
style="
height: 300px;
display: flex;
align-items: center;
justify-content: center;
"
v-loading="loading"
>
<div class="div-hz">
<div class="div-hz-icon">
<img src="./image.png" alt="" width="60px" height="60px" />
</div>
<div class="div-hz-num">
<div class="">
{{ HZXXvalue[0].value || 0 }}<span></span>
</div>
<div class="hz-num-title">患者总数</div>
</div>
</div>
<!-- <div id="patienty" style="width: 100%"></div> -->
</div>
</el-card>
</div>
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">性别数量</span>
<div class="dis">
<div class="dian-box dis">
<div class="dian-box dis">
<span class="dian" style="background: #70483e"></span>
</div>
<span class="dian" style="background: #c7bdb1"></span>
</div>
</div>
</div>
<!-- 性别统计图 -->
<div style="height: 300px" v-loading="loading">
<div id="gender" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">年龄分布</span>
<div class="dis"></div>
</div>
<!-- 患者总数统计图 -->
<div style="height: 300px" v-loading="loading">
<div id="age" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">既往病种分布</span>
<div class="dis">
<!-- <div class="dian-box dis">
<div class="dian-box dis">
<span class="dian" style="background: #4f8bff"></span>
</div>
<span class="dian" style="background: #ffcd6c"></span>
</div> -->
</div>
</div>
<!-- 既往病种分布 -->
<div style="height: 300px" v-loading="loading">
<div id="disease" style="width: 100%"></div>
</div>
</el-card>
</div>
</div>
</div>
</div>
</template>
<script>
import * as echarts from "echarts";
require("echarts/theme/macarons"); // echarts theme
import resize from "@/views/dashboard/mixins/resize";
import { patientTotal, queryByDatePatient } from "@/api/indexCom.js";
import { HZXX, HZXXSJFX, gende, ageEcharts, diseaseEcharts } from "./index";
export default {
name: "Post",
props: ["title"],
mixins: [resize],
data() {
return {
loading: false,
HZXXvalue: null, //
gendeValue: null, //
ageValue: null, //
diseaseValue: null, //
queryParams: {
param: {
startTime: "",
endTime: "",
},
},
jwbzObj: {
gxy: "高血压", //
nxgb: "脑血管病", //
exzl: "恶性肿瘤", //
gxb: "冠心病", //
jsjb: "精神疾病", //
whsezcky: "胃和十二指肠溃疡", //
fpz: "肥胖症", //
gzssz: "骨质疏松症", //
ycxXtxjb: "遗传性、先天性疾病", //
tnb: "糖尿病", //尿
mxfxjb: "慢性肺系疾病", //
gzxz: "高脂血症", //
gzjb: "肝脏疾病", //
gmxjb: "过敏性疾病", //
gjy: "关节炎", //
tf: "痛风", //
sySb: "肾炎、肾病", //
other: "其他", //
},
};
},
created() {
// this.Linepatient()
this.getData();
},
methods: {
statistics(_data, _type) {
this.initial(_data, _type); //
this.loading = true;
this.getData(); //
},
//
async getData() {
try {
await patientTotal(this.queryParams).then((res) => {
//
this.HZXXvalue = [
{
value: res.data.totalPatients,
name: "患者总数",
},
];
//
this.gendeValue = [
{
value: res.data.gender.male,
name: "男",
},
{
value: res.data.gender.female,
name: "女",
},
];
//
let ageValue = res.data.age || {};
this.ageValue = [
ageValue.num1 || 0,
ageValue.num2 || 0,
ageValue.num3 || 0,
ageValue.num4 || 0,
ageValue.num5 || 0,
ageValue.num6 || 0,
];
//
let diseaseValue = res.data.jwbz || {};
this.diseaseValue = [];
for (let key in diseaseValue) {
let data = {
name: this.jwbzObj[key],
value: diseaseValue[key] || 0,
};
this.diseaseValue.push(data);
}
// this.Linepatient(); //
this.handleAge(); //
this.columnar(); //
this.handleDisease(); //
});
this.loading = false;
} catch (e) {
console.log("患者统计", e);
}
},
//
Linepatient() {
HZXX.title.text = this.HZXXvalue[0].value;
HZXX.series[0].data = this.HZXXvalue;
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("patienty"), null, {
height: 300,
});
myChart.setOption(HZXX, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
columnar() {
gende.series[0].data = this.gendeValue;
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("gender"), null, {
height: 300,
});
myChart.setOption(gende, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
handleAge() {
ageEcharts.series[0].data = this.ageValue;
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("age"), null, {
height: 300,
});
myChart.setOption(ageEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
handleDisease() {
diseaseEcharts.series[0].data = this.diseaseValue?.map((item) => {
return item.value;
});
diseaseEcharts.xAxis.data = this.diseaseValue?.map((item) => {
return item.name;
});
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("disease"), null, {
height: 300,
});
myChart.setOption(diseaseEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
initial(_data, _type) {
_data[0] = this.$moment(_data[0]).format("YYYY-MM-DD");
_data[1] = this.$moment(_data[1]).format("YYYY-MM-DD");
this.queryParams.param = {
startTime: _data[0] + " " + "00:00:00",
endTime: _data[1] + " " + "23:59:59",
};
},
//
getRenew() {
this.Linepatient(); //
this.handleAge(); //
this.columnar(); //
this.handleDisease(); //
},
},
};
</script>
<style scoped src="@/assets/styles/common.css"></style>
<style scoped>
.div-hz {
background: #c6a268;
width: 80%;
height: 70%;
border-radius: 10px;
display: flex;
flex-direction: column;
box-sizing: border-box;
padding: 24px;
}
.div-hz-icon {
flex: 1;
}
.div-hz-num {
flex: 1;
font-size: 50px;
color: #ffffff;
text-align: right;
}
.div-hz-num span {
font-size: 24px;
color: #ffffff;
}
.hz-num-title {
font-size: 22px;
color: #ffffff;
}
>>> .el-card__body {
padding: 10px 0 !important;
}
.dis {
display: flex;
}
.header-title {
font-size: 18px;
}
.title-box {
padding: 10px 20px;
border-bottom: 1px solid #dfe6ec;
}
.dian-box {
align-items: center;
}
.dian {
display: inline-block;
width: 16px;
height: 16px;
border-radius: 50%;
margin: 0 10px;
}
.title-box {
justify-content: space-between;
}
. >>> .el-radio--small.is-bordered {
margin-right: 20px !important;
margin-left: 0 !important;
}
>>> .el-radio__input {
display: none;
}
>>> .el-radio__label {
padding-left: 5px;
}
.app-container {
padding: 0;
display: flex;
justify-content: space-between;
}
.title {
display: flex;
align-items: center;
font-size: 20px;
font-weight: 600;
}
.title-bor {
display: inline-block;
height: 20px;
width: 6px;
background: #4f8bff;
margin-right: 10px;
border-radius: 8px;
}
</style>

179
acupuncture-后台/src/views/indexCom/query.vue

@ -0,0 +1,179 @@
<template>
<div class="app-container">
<div class="title1">
<span class="title-bor"></span>
{{ title }}
</div>
<div>
<div>
<!-- <el-radio-group
v-model="radioValue"
size="small"
style="height: 36px"
@change="radioChange"
>
<el-radio label="0" border style="margin: 0 20px 0 0"></el-radio>
<el-radio label="1" border style="margin: 0 20px 0 0"></el-radio>
<el-radio label="2" border style="margin: 0 20px 0 0"></el-radio>
<el-radio label="3" border style="margin: 0 20px 0 0"></el-radio>
</el-radio-group> -->
<el-date-picker
v-model="pickerValue"
type="daterange"
align="right"
unlink-panels
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd"
@change="pickerChage"
>
</el-date-picker>
</div>
</div>
</div>
</template>
<script>
// import { deviceType } from "./index.js";
// this.$store.commit('headerFun', data)
export default {
name: "Post",
props: ["title", "type"],
data() {
return {
radioValue: "1",
radioTime: [],
pickerValue: null,
pickerOptions: {
shortcuts: [
{
text: "最近一周",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
picker.$emit("pick", [start, end]);
},
},
{
text: "最近一个月",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
picker.$emit("pick", [start, end]);
},
},
{
text: "最近三个月",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
picker.$emit("pick", [start, end]);
},
},
],
},
};
},
created() {
console.log(this.pickerValue, 222);
},
methods: {
radioChange() {
const start = new Date();
const end = new Date();
this.timeType = 4;
if (this.radioValue == 0) {
this.timeType = 4;
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
this.radioTime = [start, end];
}
if (this.radioValue == 1) {
this.timeType = 4;
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
this.radioTime = [start, end];
}
if (this.radioValue == 2) {
this.timeType = 1;
const now = new Date(); //
const nowYear = now.getFullYear(); //
const nowMonth = now.getMonth(); //
const nowDay = now.getDate(); //
const nowDayOfWeek = now.getDay(); //
const jd = Math.ceil((nowMonth + 1) / 3); //
const startDate = new Date(nowYear, (jd - 1) * 3, 1);
const endDate = new Date(nowYear, jd * 3, 0);
this.radioTime = [startDate, endDate];
}
if (this.radioValue == 3) {
this.timeType = 1;
end.setTime(start.getTime());
start.setTime(start.getTime() - 3600 * 1000 * 24 * 365);
this.radioTime = [start, end];
}
this.$emit(
"radio-change",
this.pickerValue || this.radioTime,
this.type,
this.timeType
);
},
pickerChage() {
if (!this.pickerValue) {
this.radioChange();
}
console.log(this.pickerValue, 111);
this.radioTime = [];
this.timeType = 4;
if (this.radioValue == 0) {
this.timeType = 4;
}
if (this.radioValue == 1) {
this.timeType = 4;
}
if (this.radioValue == 2) {
this.timeType = 1;
}
if (this.radioValue == 3) {
this.timeType = 1;
}
this.$emit("picker-change", this.pickerValue, this.type, this.timeType);
},
},
};
</script>
<style scoped src="@/assets/styles/common.css"></style>
<style scoped>
. >>> .el-radio--small.is-bordered {
margin-right: 20px !important;
margin-left: 0 !important;
}
>>> .el-radio__input {
display: none;
}
>>> .el-radio__label {
padding-left: 5px;
}
.app-container {
padding: 0;
display: flex;
justify-content: space-between;
}
.title1 {
display: flex;
align-items: center;
font-size: 20px;
font-weight: 600;
}
.title-bor {
display: inline-block;
height: 20px;
width: 6px;
background: #4f8bff;
margin-right: 10px;
border-radius: 8px;
}
</style>

235
acupuncture-后台/src/views/login.vue

@ -1,85 +1,88 @@
<template> <template>
<div class="login"> <div class="login">
<el-form <div class="login-left"></div>
ref="loginForm" <div class="login-right">
:model="loginForm" <el-form
:rules="loginRules" ref="loginForm"
class="login-form" :model="loginForm"
> :rules="loginRules"
<h3 class="title">针灸后台管理系统</h3> class="login-form"
<el-form-item prop="username">
<el-input
v-model="loginForm.username"
type="text"
auto-complete="off"
placeholder="账号"
>
<svg-icon
slot="prefix"
icon-class="user"
class="el-input__icon input-icon"
/>
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input
v-model="loginForm.password"
type="password"
auto-complete="off"
placeholder="密码"
@keyup.enter.native="handleLogin"
>
<svg-icon
slot="prefix"
icon-class="password"
class="el-input__icon input-icon"
/>
</el-input>
</el-form-item>
<el-form-item prop="code" v-if="captchaEnabled">
<el-input
v-model="loginForm.code"
auto-complete="off"
placeholder="验证码"
style="width: 63%"
@keyup.enter.native="handleLogin"
>
<svg-icon
slot="prefix"
icon-class="validCode"
class="el-input__icon input-icon"
/>
</el-input>
<div class="login-code">
<img :src="codeUrl" @click="getCode" class="login-code-img" />
</div>
</el-form-item>
<el-checkbox
v-model="loginForm.rememberMe"
style="margin: 0px 0px 25px 0px"
>记住密码</el-checkbox
> >
<el-form-item style="width: 100%"> <h3 class="title">
<el-button 登录到
:loading="loading" <br />
size="medium" 朱琏针灸联盟数据系统
type="primary" </h3>
style="width: 100%" <el-form-item prop="username">
@click.native.prevent="handleLogin" <el-input
v-model="loginForm.username"
type="text"
auto-complete="off"
placeholder="账号"
>
<svg-icon
slot="prefix"
icon-class="user"
class="el-input__icon input-icon"
/>
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input
v-model="loginForm.password"
type="password"
auto-complete="off"
placeholder="密码"
@keyup.enter.native="handleLogin"
>
<svg-icon
slot="prefix"
icon-class="password"
class="el-input__icon input-icon"
/>
</el-input>
</el-form-item>
<el-form-item prop="code" v-if="captchaEnabled">
<el-input
v-model="loginForm.code"
auto-complete="off"
placeholder="验证码"
style="width: 63%"
@keyup.enter.native="handleLogin"
>
<svg-icon
slot="prefix"
icon-class="validCode"
class="el-input__icon input-icon"
/>
</el-input>
<div class="login-code">
<img :src="codeUrl" @click="getCode" class="login-code-img" />
</div>
</el-form-item>
<el-checkbox
v-model="loginForm.rememberMe"
style="margin: 0px 0px 25px 0px; color: #fff"
>记住密码</el-checkbox
> >
<span v-if="!loading"> </span> <el-form-item style="width: 100%">
<span v-else> 中...</span> <el-button
</el-button> :loading="loading"
<div style="float: right" v-if="register"> size="medium"
<router-link class="link-type" :to="'/register'" type="primary"
>立即注册</router-link style="width: 100%"
@click.native.prevent="handleLogin"
> >
</div> <span v-if="!loading"> </span>
</el-form-item> <span v-else> 中...</span>
</el-form> </el-button>
<!-- 底部 --> <div style="float: right" v-if="register">
<div class="el-login-footer"> <router-link class="link-type" :to="'/register'"
<span>Copyright © 2018-2025 ruoyi.vip All Rights Reserved.</span> >立即注册</router-link
>
</div>
</el-form-item>
</el-form>
</div> </div>
</div> </div>
</template> </template>
@ -88,27 +91,41 @@
import { getCodeImg } from "@/api/login"; import { getCodeImg } from "@/api/login";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { encrypt, decrypt } from "@/utils/jsencrypt"; import { encrypt, decrypt } from "@/utils/jsencrypt";
import { commonQueue } from "@/api/followupFile";
export default { export default {
name: "Login", name: "Login",
data() { data() {
return { return {
codeUrl: "", codeUrl: "",
loginForm: { loginForm: {
username: "admin", username: "",
password: "admin123", password: "",
rememberMe: false, rememberMe: false,
code: "", code: "",
uuid: "", uuid: "",
}, },
loginRules: { loginRules: {
username: [ username: [
{ required: true, trigger: "blur", message: "请输入您的账号" }, {
required: true,
trigger: "blur",
message: "请输入您的账号",
},
], ],
password: [ password: [
{ required: true, trigger: "blur", message: "请输入您的密码" }, {
required: true,
trigger: "blur",
message: "请输入您的密码",
},
],
code: [
{
required: true,
trigger: "change",
message: "请输入验证码",
},
], ],
code: [{ required: true, trigger: "change", message: "请输入验证码" }],
}, },
loading: false, loading: false,
// //
@ -157,7 +174,9 @@ export default {
if (valid) { if (valid) {
this.loading = true; this.loading = true;
if (this.loginForm.rememberMe) { if (this.loginForm.rememberMe) {
Cookies.set("username", this.loginForm.username, { expires: 30 }); Cookies.set("username", this.loginForm.username, {
expires: 30,
});
Cookies.set("password", encrypt(this.loginForm.password), { Cookies.set("password", encrypt(this.loginForm.password), {
expires: 30, expires: 30,
}); });
@ -172,7 +191,12 @@ export default {
this.$store this.$store
.dispatch("Login", this.loginForm) .dispatch("Login", this.loginForm)
.then(() => { .then(() => {
this.$router.push({ path: this.redirect || "/" }).catch(() => {}); this.$router
.push({
path: this.redirect || "/",
})
.catch(() => {});
this.getCommonQueue();
}) })
.catch(() => { .catch(() => {
this.loading = false; this.loading = false;
@ -183,6 +207,20 @@ export default {
} }
}); });
}, },
//
getCommonQueue() {
commonQueue({
pageNum: -1,
param: {
status: 1,
},
}).then((res) => {
res.data.list.forEach((i) => {
i.type = 1;
});
localStorage.setItem("commonQueue", JSON.stringify(res.data.list));
});
},
}, },
}; };
</script> </script>
@ -193,46 +231,64 @@ export default {
justify-content: center; justify-content: center;
align-items: center; align-items: center;
height: 100%; height: 100%;
background-image: url("../assets/images/login-background.jpg"); background-image: url("./bg.png");
background-size: cover; background-size: cover;
display: flex;
.login-left {
flex: 1.5;
}
.login-right {
flex: 1;
}
} }
.title { .title {
font-size: 26 px;
margin: 0px auto 30px auto; margin: 0px auto 30px auto;
text-align: center; text-align: left;
color: #707070; color: #fff;
line-height: 28px;
} }
.login-form { .login-form {
border-radius: 6px; border-radius: 6px;
background: #ffffff; // background: #ffffff;
width: 400px; width: 400px;
padding: 25px 25px 5px 25px; padding: 25px 25px 5px 25px;
.el-input { .el-input {
height: 38px; height: 38px;
input { input {
height: 38px; height: 38px;
} }
} }
.input-icon { .input-icon {
height: 39px; height: 39px;
width: 14px; width: 14px;
margin-left: 2px; margin-left: 2px;
} }
} }
.login-tip { .login-tip {
font-size: 13px; font-size: 13px;
text-align: center; text-align: center;
color: #bfbfbf; color: #bfbfbf;
} }
.login-code { .login-code {
width: 33%; width: 33%;
height: 38px; height: 38px;
float: right; float: right;
img { img {
cursor: pointer; cursor: pointer;
vertical-align: middle; vertical-align: middle;
} }
} }
.el-login-footer { .el-login-footer {
height: 40px; height: 40px;
line-height: 40px; line-height: 40px;
@ -245,6 +301,7 @@ export default {
font-size: 12px; font-size: 12px;
letter-spacing: 1px; letter-spacing: 1px;
} }
.login-code-img { .login-code-img {
height: 38px; height: 38px;
} }

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

Loading…
Cancel
Save