...
 
Commits (24)
NODE_ENV = 'production' NODE_ENV = 'production'
VUE_APP_BASE_API = '/disease-api/' VUE_APP_BASE_API = '/geca-api/'
This diff is collapsed.
...@@ -40,9 +40,6 @@ ...@@ -40,9 +40,6 @@
:disabled="propNotEdit" :disabled="propNotEdit"
></el-input> ></el-input>
</el-form-item> </el-form-item>
<el-form-item label="数据库">
<el-input :value="data.tableCode" clearable disabled></el-input>
</el-form-item>
<el-form-item label="标题"> <el-form-item label="标题">
<el-input <el-input
v-model="data.label" v-model="data.label"
......
<template>
<div>
<span
v-if="item.type == 'title'"
:style="item.styles"
style="margin-left: 5px"
>
{{ item.value }}
</span>
<component
v-else
:is="getComponent(item.type, item.component)"
v-bind="
Object.assign(deepClone(item), params, { size: item.size || 'small' })
"
:multiple="false"
:placeholder="item.placeholder || getPlaceholder(item)"
:dic="item.dicData"
:value="
['time', 'timerange', 'checkbox'].includes(item.type)
? item.dicData
: undefined
"
>
<span v-if="params.html" v-html="params.html"></span>
</component>
</div>
</template>
<script>
export default {
name: "widget-form-item",
props: {
item: {
type: Object,
default: () => {
return {}
},
},
params: {
type: Object,
default: () => {
return {}
},
},
},
data() {
return {
form: {},
}
},
methods: {
getComponent(type, component) {
let KEY_COMPONENT_NAME = "avue-"
let result = "input"
if (component) return component
else if (["array", "img", "url"].includes(type)) result = "array"
else if (type === "select") result = "select"
else if (type === "radio") result = "radio"
else if (type === "checkbox") result = "checkbox"
else if (["time", "timerange"].includes(type)) result = "time"
else if (
[
"dates",
"date",
"datetime",
"datetimerange",
"daterange",
"week",
"month",
"year",
].includes(type)
)
result = "date"
else if (type === "cascader") result = "cascader"
else if (type === "number") result = "input-number"
else if (type === "password") result = "input"
else if (type === "switch") result = "switch"
else if (type === "rate") result = "rate"
else if (type === "upload") result = "upload"
else if (type === "slider") result = "slider"
else if (type === "dynamic") result = "dynamic"
else if (type === "icon") result = "input-icon"
else if (type === "color") result = "input-color"
else if (type === "map") result = "input-map"
return KEY_COMPONENT_NAME + result
},
getPlaceholder(item) {
const label = item.label
if (
[
"select",
"checkbox",
"radio",
"tree",
"color",
"dates",
"date",
"datetime",
"datetimerange",
"daterange",
"week",
"month",
"year",
"map",
"icon",
].includes(item.type)
)
return `请选择 ${label}`
else return `请输入 ${label}`
},
},
}
</script>
...@@ -224,6 +224,9 @@ export default { ...@@ -224,6 +224,9 @@ export default {
if (data.type === "dynamic") { if (data.type === "dynamic") {
data.prop = "fixed_field" data.prop = "fixed_field"
} }
if (data.type == "title") {
delete data.label
}
data.cType = column.children.type === "form" ? "form" : "table" data.cType = column.children.type === "form" ? "form" : "table"
data.subfield = true data.subfield = true
delete data.icon delete data.icon
......
...@@ -4,12 +4,12 @@ module.exports = { ...@@ -4,12 +4,12 @@ module.exports = {
useTabs: false, useTabs: false,
semi: false, semi: false,
singleQuote: false, singleQuote: false,
quoteProps: 'as-needed', quoteProps: "as-needed",
jsxSingleQuote: false, jsxSingleQuote: false,
trailingComma: 'es5', trailingComma: "es5",
bracketSpacing: true, bracketSpacing: true,
jsxBracketSameLine: false, jsxBracketSameLine: false,
arrowParens: 'always', arrowParens: "always",
vueIndentScriptAndStyle: false, vueIndentScriptAndStyle: false,
endOfLine: 'lf', endOfLine: "auto",
} }
...@@ -18,6 +18,8 @@ export default { ...@@ -18,6 +18,8 @@ export default {
} }
#vue-admin-beautiful { #vue-admin-beautiful {
height: 100vh;
overflow: auto;
margin-right: calc(100% - 100vw); margin-right: calc(100% - 100vw);
} }
</style> </style>
...@@ -341,7 +341,7 @@ export function getQualityDetail(patientId) { ...@@ -341,7 +341,7 @@ export function getQualityDetail(patientId) {
// 协作组参数配置新增/修改 // 协作组参数配置新增/修改
export function setParamConfig(data) { export function setParamConfig(data) {
return request({ return request({
url: `/disease-data/sys/paramConfig/addOrUpdate`, url: `/disease-data/param/config`,
method: "post", method: "post",
data, data,
}) })
...@@ -350,7 +350,7 @@ export function setParamConfig(data) { ...@@ -350,7 +350,7 @@ export function setParamConfig(data) {
// 协作组参数配置列表 // 协作组参数配置列表
export function getParamConfigList(params) { export function getParamConfigList(params) {
return request({ return request({
url: `/disease-data/sys/paramConfig/list`, url: `/disease-data/param/config/page`,
method: "get", method: "get",
params, params,
}) })
...@@ -359,7 +359,7 @@ export function getParamConfigList(params) { ...@@ -359,7 +359,7 @@ export function getParamConfigList(params) {
// 删除配置 // 删除配置
export function delParamConfig(id) { export function delParamConfig(id) {
return request({ return request({
url: `/disease-data/sys/paramConfig/${id}`, url: `/disease-data/param/config?id=${id}`,
method: "delete", method: "delete",
}) })
} }
import request from "@/utils/request"
import { add } from "lodash"
/* 数据库管理 */
export function getDbPage(params = {}) {
return request({
url: "/cloud-upms/sys/db/info/page",
method: "get",
params,
})
}
export function getDbList(params = {}) {
return request({
url: "/cloud-upms/sys/db/info/list",
method: "get",
params,
})
}
export function addDb(data = {}) {
return request({
url: "/cloud-upms/sys/db/info",
method: "post",
data,
})
}
// 测试连接
export function testDb(data = {}) {
return request({
url: "/cloud-upms/sys/db/info/test/connection",
method: "post",
data,
})
}
// 根据数据库id 查数据表
export function getTableList(id) {
return request({
url: `/cloud-upms/sys/table/list?dbId=${id}`,
method: "get",
})
}
// 新增数据表
export function addDbTable(data = {}) {
return request({
url: "/cloud-upms/sys/table",
method: "post",
data,
})
}
import request from "@/utils/request"
export function getEncryptList(params = {}) {
return request({
url: `/disease-data/data/patient/page/encrypted/test`,
method: "get",
params,
})
}
...@@ -12,6 +12,7 @@ export function getFieldPage(params = {}) { ...@@ -12,6 +12,7 @@ export function getFieldPage(params = {}) {
params, params,
}) })
} }
export function delField(id) { export function delField(id) {
return request({ return request({
url: `/cloud-upms/field/dict/${id}`, url: `/cloud-upms/field/dict/${id}`,
...@@ -84,7 +85,7 @@ export function copyForm(data = {}) { ...@@ -84,7 +85,7 @@ export function copyForm(data = {}) {
// 获取 // 获取
export function getFormDetail(id) { export function getFormDetail(id) {
return request({ return request({
url: `/cloud-upms//org/form/${id}`, url: `/cloud-upms/org/form/${id}`,
method: "get", method: "get",
}) })
} }
......
import request from "@/utils/request"
/* 患者数据 */
export function getPatientPage(params = {}) {
let url = "/disease-data/data/patient/page?"
let keys = Object.keys(params)
for (let key of keys) {
url += `${encodeURIComponent(key)}=${params[key]}&`
}
url = url.substring(0, url.length - 1)
return request({
url: url,
method: "get",
})
}
// 随访分页
export function getPatientFollowPage(params = {}) {
let url = "/disease-data/data/patient/follow/page?"
let keys = Object.keys(params)
for (let key of keys) {
url += `${encodeURIComponent(key)}=${params[key]}&`
}
url = url.substring(0, url.length - 1)
return request({
url: url,
method: "get",
})
}
export function delPatient(id) {
return request({
url: `/cloud-upms/sys/menu/${id}`,
method: "delete",
})
}
// 填报
export function addPatient(data = {}, type = "") {
return request({
url: `/disease-data/data/patient/${type}`,
method: "post",
data,
})
}
/* 患者数据详情 */
export function getPatientDetail(params = {}) {
return request({
url: "/disease-data/data/patient/info",
method: "get",
params,
})
}
/* 获取表单填报记录list*/
export function getRecordList(params = {}) {
return request({
url: "/disease-data/data/patient/form/record/list",
method: "get",
params,
})
}
// 患者质控列表 分页查询
export function getQcPage(params = {}) {
return request({
url: "/disease-data/data/qc/page",
method: "get",
params,
})
}
// 质控
export function qcPatient(data = {}, type = "") {
return request({
url: `/disease-data/data/qc`,
method: "post",
data,
})
}
// 获取九院口腔癌患者信息(同屏对照使用)
export function getJYpatientInfo(params = {}) {
return request({
url: "/jiuyuan-gather/patient/kqa/info",
method: "get",
params,
})
}
// 获取九院口腔癌随访表(同屏对照使用)
export function getJYFollowInfo(params = {}) {
return request({
url: "/jiuyuan-gather/patient/kqa/follow/info",
method: "get",
params,
})
}
// 获取同济口腔 牙周病(yzb) | 口腔癌(kqa) 患者信息(同屏对照使用)
export function getTJpatientInfo(params = {}, diseases = "yzb") {
return request({
url: `/tjkq-gather/patient/${diseases}/info`,
method: "get",
params,
})
}
// 获取九院牙周炎患者信息(同屏对照使用)
export function getJYyzyPatientInfo(params = {}) {
return request({
url: "/jiuyuan-gather/patient/yzy/info",
method: "get",
params,
})
}
// 获取急性胰腺炎患者信息/检查信息/术治疗(同屏对照使用)
export function getJxyzyPatientInfo(type, params = {}) {
return request({
url: `/changhai-gather/patient/${type}/info`,
method: "get",
params,
})
}
// 获取中山医院病历/检查信息/治疗(同屏对照使用)
export function getZsyzyPatientInfo(params = {}) {
return request({
url: "/zsyzy-gather/patient/yzb/info",
method: "get",
params,
})
}
// 急性胰腺炎-评分表
// 评分表新增修改
export function saveApScore(data = {}) {
return request({
url: `disease-data/ap/score`,
method: "post",
data,
})
}
// 根据patientId查询评分表数据
export function getApScore(patientId) {
return request({
url: `/disease-data/ap/score/list?patientId=${patientId}`,
method: "get",
})
}
// 根据patientId+type查询(评分趋势图用)
export function getApScoreTypeList(params = {}) {
return request({
url: "disease-data/ap/score/type/list",
method: "get",
params,
})
}
// 根据patientId, scoreId查询detailList
export function getApScoreDetailList(params = {}) {
return request({
url: "/disease-data/ap/score/detail/list",
method: "get",
params,
})
}
...@@ -141,25 +141,21 @@ export function ssoLogin(token) { ...@@ -141,25 +141,21 @@ export function ssoLogin(token) {
}) })
} }
//异常反馈 //异常反馈
export function getAbnormalList(params) { export function getAbnormalList(params) {
return request({ return request({
url: `/disease-data/sys/message/exception/feedBack/select/all/msg`, url: `/disease-data/sys/message/exception/feedBack/select/all/msg`,
method: "get", method: "get",
params params,
}) })
} }
// 修改系统信息-点击单条消息(进行已读操作) // 修改系统信息-点击单条消息(进行已读操作)
export function setAbnormalStatus(params) { export function setAbnormalStatus(params) {
return request({ return request({
url: `/disease-data/sys/message/exception/feedBack/do/read`, url: `/disease-data/sys/message/exception/feedBack/do/read`,
method: "get", method: "get",
params params,
}) })
} }
...@@ -171,3 +167,11 @@ export function getFeedBackNumber(id) { ...@@ -171,3 +167,11 @@ export function getFeedBackNumber(id) {
}) })
} }
// 获取B端日志
export function getLogPage(params = {}) {
return request({
url: "/cloud-upms/sys/log/page",
method: "get",
params,
})
}
This diff is collapsed.
@charset "UTF-8";
/*针对英文单词,强制让单词换行,break-word不拆分单词, break-all拆分单词*/
* {
word-wrap: break-word; /*word-break: break-all;*/
}
html {
//font-size: calc(100vw / 7.5); /*1rem = 100px*/
}
body {
font-family: "Helvetica", "Tahoma", "Arial", "PingFang SC", "Microsoft Yahei",
"SimSun", "SimHei", "sans-serif";
color: #666;
background: #fff;
font-size: 14px;
}
.break-all {
word-break: break-all;
}
/*对齐方式*/
.text-left {
text-align: left;
}
.text-right {
text-align: right;
}
.text-center {
text-align: center;
}
/*图片居左、右、中*/
.img-left {
display: inline;
float: left;
}
.img-right {
display: inline;
float: right;
}
.img-center {
clear: both;
display: block;
margin: auto;
}
/*父容器要清除浮动*/
/*隐藏文字*/
.text-indent {
text-indent: -9999em;
}
.seo-text {
font-size: 0;
line-height: 0;
overflow: hidden;
}
/*图片控制尺寸*/
.img-overflow {
width: 100%;
height: 100%;
overflow: hidden;
}
/*img自适应*/
.img-responsive {
max-width: 100%;
height: auto;
display: block;
}
img {
border: none;
}
/*清除浮动*/
.fl {
float: left;
_display: inline;
*zoom: 1;
}
.fr {
float: right;
_display: inline;
*zoom: 1;
}
.clearfix {
*zoom: 1;
}
.clearfix:before,
.clearfix:after {
display: table;
line-height: 0;
content: "";
}
.clearfix:after {
clear: both;
}
/*外边距px*/
.margin-auto {
margin-left: auto;
margin-right: auto;
}
.mb30 {
margin-bottom: 30px;
}
/*字体加粗*/
.bold {
font-weight: bold;
}
/*1行显示省略号*/
.ellipsis {
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
display: block;
}
/*默认2行显示省略号 只适用于webkit内核*/
.ellipses-line2 {
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.ellipses-line4 {
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 4;
-webkit-box-orient: vertical;
}
/*placeholder重置字体颜色*/
input::-webkit-input-placeholder,
textarea::-webkit-input-placeholder {
color: #999 !important;
font-size: 12px;
}
input:-moz-placeholder,
textarea:-moz-placeholder {
color: #999 !important;
font-size: 12px;
}
input:-ms-input-placeholder,
textarea:-ms-input-placeholder {
color: #999 !important;
font-size: 12px;
}
// 美化滚动条
::-webkit-scrollbar-track-piece {
background-color: #fff;
-webkit-border-radius: 0;
opacity: 0.5;
}
::-webkit-scrollbar {
width: 6px;
height: 10px;
}
::-webkit-scrollbar-thumb {
height: 30px;
background-color: #b8b8b8;
-webkit-border-radius: 6px;
outline: 1px solid transparent;
outline-offset: -2px;
border: 1px solid transparent;
filter: alpha(opacity = 30);
-moz-opacity: .5;
opacity: .5;
}
::-webkit-scrollbar-thumb:hover {
height: 30px;
background-color: #878987;
-webkit-border-radius: 6px;
}
/*隐藏*/
.hidden {
display: none;
}
.visible {
display: block;
}
/*将dcss容器里的所有元素设为默认值*/
.dcss html,
.dcss address,
.dcss blockquote,
.dcss body,
.dcss dd,
.dcss div,
.dcss dl,
.dcss dt,
.dcss fieldset,
.dcss form,
.dcss frame,
.dcss frameset,
.dcss h1,
.dcss h2,
.dcss h3,
.dcss h4,
.dcss h5,
.dcss h6,
.dcss noframes,
.dcss ol,
.dcss p,
.dcss ul,
.dcss center,
.dcss dir,
.dcss hr,
.dcss menu,
.dcss pre {
display: block;
}
.dcss li {
display: list-item;
}
.dcss head {
display: none;
}
.dcss table {
display: table;
}
.dcss tr {
display: table-row;
}
.dcss thead {
display: table-header-group;
}
.dcss tbody {
display: table-row-group;
}
.dcss tfoot {
display: table-footer-group;
}
.dcss col {
display: table-column;
}
.dcss colgroup {
display: table-column-group;
}
.dcss td,
.dcss th {
display: table-cell;
}
.dcss caption {
display: table-caption;
}
.dcss th {
font-weight: bolder;
text-align: center;
}
.dcss caption {
text-align: center;
}
.dcss body {
margin: 8px;
line-height: 1.12;
}
.dcss h1 {
font-size: 2em;
margin: 0.67em 0;
line-height: 1.5em;
}
.dcss h2 {
font-size: 1.5em;
margin: 0.75em 0;
line-height: 1.5em;
}
.dcss h3 {
font-size: 1.17em;
margin: 0.83em 0;
line-height: 1.5em;
}
.dcss h4 {
font-size: 1.09em;
margin: 1.12em 0;
line-height: 1.5em;
}
.dcss h4,
.dcss p,
.dcss blockquote,
.dcss ul,
.dcss fieldset,
.dcss form,
.dcss ol,
.dcss dl,
.dcss dir,
.dcss menu {
margin: 1.12em 0;
}
.dcss h5 {
font-size: 0.83em;
margin: 1.5em 0;
line-height: 1.5em;
}
.dcss h6 {
font-size: 0.75em;
margin: 1.67em 0;
line-height: 1.5em;
}
.dcss h1,
.dcss h2,
.dcss h3,
.dcss h4,
.dcss h5,
.dcss h6,
.dcss b,
.dcss strong {
font-weight: bolder;
}
.dcss blockquote {
margin-left: 40px;
margin-right: 40px;
}
.dcss i,
.dcss cite,
.dcss em,
.dcss var,
.dcss address {
font-style: italic;
}
.dcss pre,
.dcss tt,
.dcss code,
.dcss kbd,
.dcss samp {
font-family: monospace;
}
.dcss pre {
white-space: pre;
}
.dcss button,
.dcss textarea,
.dcss input,
.dcss object,
.dcss select {
display: inline-block;
}
.dcss big {
font-size: 1.17em;
}
.dcss small,
.dcss sub,
.dcss sup {
font-size: 0.83em;
}
.dcss sub {
vertical-align: sub;
}
.dcss sup {
vertical-align: super;
}
.dcss table {
border-spacing: 2px;
}
.dcss thead,
.dcss tbody,
.dcss tfoot {
vertical-align: middle;
}
.dcss td,
.dcss th {
vertical-align: inherit;
}
.dcss s,
.dcss strike,
.dcss del {
text-decoration: line-through;
}
.dcss hr {
border: 1px inset;
}
.dcss ol,
.dcss ul,
.dcss dir,
.dcss menu,
.dcss dd {
margin-left: 40px;
}
.dcss ol,
.dcss ul,
.dcss li {
list-style-type: decimal;
}
.dcss ol ul,
.dcss ul ol,
.dcss ul ul,
.dcss ol ol {
margin-top: 0;
margin-bottom: 0;
}
.dcss u,
.dcss ins {
text-decoration: underline;
}
.dcss br:before {
content: "A";
}
.dcss :before,
.dcss :after {
white-space: pre-line;
}
.dcss center {
text-align: center;
}
.dcss abbr,
.dcss acronym {
font-variant: small-caps;
letter-spacing: 0.1em;
}
.dcss :link,
.dcss :visited {
text-decoration: underline;
}
.dcss :focus {
outline: thin dotted invert;
}
.dcss BDO[DIR="ltr"] {
direction: ltr;
unicode-bidi: bidi-override;
}
.dcss BDO[DIR="rtl"] {
direction: rtl;
unicode-bidi: bidi-override;
}
.dcss *[DIR="ltr"] {
direction: ltr;
unicode-bidi: embed;
}
.dcss *[DIR="rtl"] {
direction: rtl;
unicode-bidi: embed;
}
@media print {
.dcss h1 {
page-break-before: always;
}
.dcss h1,
.dcss h2,
.dcss h3,
.dcss h4,
.dcss h5,
.dcss h6 {
page-break-after: avoid;
}
.dcss ul,
.dcss ol,
.dcss dl {
page-break-before: avoid;
}
}
//间距
$size-map: (
-2: -2px,
4: 4px,
5: 5px,
8: 8px,
10: 10px,
12: 12px,
15: 15px,
16: 16px,
20: 20px,
24: 24px,
25: 25px,
30: 30px,
32: 32px,
40: 40px,
50: 50px,
80: 80px,
140: 140px
);
@each $name in map-keys($size-map) {
$value: map-get($size-map, $name);
.mt-#{$name} {
margin-top: $value;
}
.mr-#{$name} {
margin-right: $value;
}
.mb-#{$name} {
margin-bottom: $value;
}
.ml-#{$name} {
margin-left: $value;
}
.margin-#{$name} {
margin: $value;
}
.pt-#{$name} {
padding-top: $value !important;
}
.pr-#{$name} {
padding-right: $value;
}
.pb-#{$name} {
padding-bottom: $value;
}
.pl-#{$name} {
padding-left: $value;
}
.pd-#{$name} {
padding: $value;
}
}
//字号
$font-map: (
10: 10px,
11: 11px,
14: 14px,
15: 15px,
18: 18px,
20: 20px,
24: 24px,
25: 25px,
30: 30px,
36: 36px,
40: 40px,
50: 50px,
80: 80px,
140: 140px
);
@each $size in map-keys($font-map) {
$value: map-get($font-map, $size);
.font-#{$size} {
font-size: $value;
}
}
@charset "UTF-8";
/*防止用户自定义背景颜色对网页的影响,添加让用户可以自定义字体 */
html {
-webkit-text-size-adjust: 100%; /*禁用Webkit内核浏览器的文字大小调整功能,默认是auto;*/
-ms-text-size-adjust: 100%; /*禁用IE内核浏览器的文字大小调整功能,默认是auto;*/
font-family: sans-serif;
-webkit-font-smoothing: antialiased;
height: 100%;
touch-action: manipulation; /*取消移动端click300ms的延迟*/
}
body {
height: 100%;
}
*,
*::before,
*::after {
margin: 0;
padding: 0;
box-sizing: border-box;
-webkit-tap-highlight-color: transparent;
}
/*此处增加dt,label针对bootstrap的加粗定义*/
dt,
label {
font-weight: normal;
font-size: 100%;
}
input,
button,
textarea,
select,
optgroup,
option {
font-size: 100%;
font-weight: normal;
outline: none;
}
h1,h2,h3,h4,h5{
padding: 0;
margin: 0;
font-weight: normal;
}
input,
button,
textarea {
-webkit-appearance: none;
}
/*去除ios按钮内阴影、圆角,对单选框、复选框有影响*/
input[type="checkbox"] {
-webkit-appearance: checkbox;
}
input[type="radio"] {
-webkit-appearance: radio;
}
input::-webkit-input-safebox-button {
display: none;
}
/*解决搜狗浏览器密码框自带安全键盘*/
input:focus,
textarea:focus {
outline: none;
}
th,
td,
button,
input,
select,
textarea {
-webkit-font-smoothing: antialiased;
-moz-font-smoothing: antialiased;
}
/*页面的字体抗锯齿,字体会更清晰圆滑*/
textarea {
resize: none;
border: 1px solid #ddd;
padding: 5px;
width: 100%;
border-radius: 0;
}
address, caption, cite, code, dfn, th, var, /*em,*/ i {
font-style: normal;
font-weight: normal;
}
sub,
sup {
vertical-align: baseline;
}
button {
overflow: visible;
vertical-align: middle;
outline: none;
height: auto;
}
/*去掉列表标签的默认样式*/
ul,
ol,
li {
list-style-type: none;
}
/*重置table样式*/
table {
border-collapse: collapse;
border-spacing: 0; /*table-layout: fixed;*/
}
/*table-layout: fixed; 表格布局尺寸固定(默认等分表格),表格的宽度不再由单元格的内容多少而决定,可自定义宽度(给th,td不起作用)*/
/*border-collapse: separate(独立边框); border-spacing:20px 20px(边框单元格间距离);*/
button {
cursor: pointer;
}
fieldset,
img {
border: 0;
}
/*a链接*/
a {
outline: none;
text-decoration: none;
color: #848484;
cursor: pointer;
}
a:focus {
outline: none;
text-decoration: none;
color: inherit;
}
a:hover {
outline: none;
color: #157df1;
text-decoration: none;
}
input::-webkit-inner-spin-button {
display: none;
}
@charset "utf-8";
// 全局
@import "reset";
@import "base";
//@import "reset-iview";
@import "index";
@function bvw($vw) {
@return $vw / 1440 * 100vw;
}
@function bvh($vh) {
@return $vh / 1024 * 100vh;
}
\ No newline at end of file
@charset "utf-8";
// 通用 全局
<template>
<el-row class="el-table-self">
<el-table
:max-height="maxHeight || maxTableHeight"
:height="tableHeight"
ref="selftab"
v-loading="listLoading"
:data="tableData"
:show-overflow-tooltip="true"
:highlight-current-row="highLight"
:header-row-class-name="headerClass"
style="width: 100%"
>
<template v-for="(column, index) in columns">
<template v-if="!column.type && !column.operType">
<el-table-column
:key="column.value"
:show-overflow-tooltip="true"
:fixed="column.fixed"
:prop="column.value"
:label="column.label"
:width="column.width"
:min-width="column.minWidth"
align="center"
:sortable="column.sortable"
:formatter="column.formatter"
:class-name="column.className"
:label-class-name="column.labelClassName"
>
<!-- 表头插槽 -->
<template slot="header" slot-scope="scope">
<span :style="{ fontSize: fontSize[fontIndex] }">{{
column.label
}}</span>
</template>
<!-- 表内容插槽 -->
<template slot-scope="scope">
<span :style="{ fontSize: fontSize[fontIndex] }">
{{ scope.row[column.value] }}</span
>
</template>
</el-table-column>
</template>
<template v-else>
<el-table-column
:key="index"
:fixed="column.fixed"
:prop="column.value"
:label="column.label"
:sortable="column.sortable"
:width="column.width"
:min-width="column.minWidth"
align="center"
>
<!-- 表头插槽 -->
<template slot="header" slot-scope="scope">
<span :style="{ fontSize: fontSize[fontIndex] }">{{
column.label
}}</span>
</template>
<!-- 表内容插槽 -->
<template slot-scope="scope">
<!-- 按钮 -->
<template
v-if="column.type === 'button' || column.operType === 'button'"
>
<!-- 按钮数组 -->
<template v-for="(op, opIndex) in column.operations">
<el-button
:key="opIndex"
:disabled="
op.formatter ? op.formatter(scope.row).disabled : false
"
:style="[{ fontSize: fontSize[fontIndex] }, op.style]"
:type="
op.formatter
? op.formatter(scope.row).type
: op.type || ''
"
:icon="op.icon"
@click="op.func(scope.row, scope.$index)"
>
{{
op.formatter
? op.formatter(scope.row).label
: op.label
? op.label
: scope.row[column.value]
}}
</el-button>
</template>
</template>
<!-- html -->
<template v-if="column.type === 'html'">
<div v-html="scope.row[column.value]" class="highlight"></div>
</template>
<!-- switch切换 启用 -->
<template v-if="column.type === 'switch'">
<el-switch
v-model="scope.row[column.value]"
@change="column.func(scope.row, scope.$index)"
>
</el-switch>
</template>
</template>
</el-table-column>
</template>
</template>
</el-table>
<!-- 分页 -->
<div v-if="pageSize && totalCounts > 0" class="pagination-footer">
<!-- <span class="description">{{ description }}</span> -->
<el-pagination
background
:current-page="currentPage"
:page-sizes="pageSizes"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalCounts"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
></el-pagination>
</div>
</el-row>
</template>
<script>
import resize from "../TabComponents/resize.js"
import { mapGetters } from "vuex"
export default {
props: {
tableHeight: Number, // 表格的高度
maxHeight: Number, // 表格的最大高度
listLoading: Boolean, // table 加载层
pageSizes: Array, // 决定每页显示的条数[10,15,20,25]
pageSize: Number,
totalCount: [Number, String], // 表格数据总数
currentPage: { type: Number, default: 1 },
highLight: { type: Boolean, default: true },
headerClass: { type: String, default: "default" }, // 头部背景色Class名称,默认default
columns: Array, // 表格列配置数据,{vlaue:对应数据对象中的属性,label:对应的是标题文字,fixed:列是否固定,width:列宽, sortable:是否可排序,formatter:列格式化, className:对应的是列的样式类名}
tableData: Array, // 表格数据
},
mixins: [resize],
data() {
return {
fontSize: ["12px", "14px", "16px"],
}
},
computed: {
...mapGetters({
fontIndex: "table/fontIndex",
}),
totalCounts() {
return this.totalCount - 0
},
},
watch: {},
mounted() {},
methods: {
// 切换页面显示条数
handleSizeChange(val) {
this.$emit("pageSizeChange", val)
},
// 跳转页码
handleCurrentChange(val) {
this.$emit("currentPageChange", val)
},
},
}
</script>
<style lang="scss" scoped>
.el-table__empty-block {
position: relative;
min-height: 60px;
text-align: center;
width: 100%;
height: 100%;
}
.el-table__empty-text {
position: absolute;
left: 50%;
width: 110px;
height: 110px;
top: 50%;
line-height: 220px;
-ms-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
color: #5e7382;
background-position: center center;
background-repeat: no-repeat;
background-size: cover;
}
::v-deep {
.el-table {
thead {
.newHeader {
height: 60px;
background: #f6f6f6;
}
}
}
}
</style>
...@@ -272,7 +272,7 @@ ...@@ -272,7 +272,7 @@
</div> </div>
<div slot="footer"> <div slot="footer">
<el-button size="medium" v-if="btnCancel" @click="visible = false" <el-button size="medium" v-if="btnCancel" @click="visible = false"
>取消</el-button > </el-button
> >
<el-button <el-button
size="medium" size="medium"
...@@ -281,6 +281,7 @@ ...@@ -281,6 +281,7 @@
@click="handleConfirm" @click="handleConfirm"
>{{ confirmText }}</el-button >{{ confirmText }}</el-button
> >
<slot name="otherButton" :form="form"></slot>
</div> </div>
</el-dialog> </el-dialog>
</template> </template>
...@@ -301,7 +302,7 @@ export default { ...@@ -301,7 +302,7 @@ export default {
props: { props: {
confirmText: { confirmText: {
type: String, type: String,
default: "确认", default: " ",
}, },
appendToBody: { appendToBody: {
type: Boolean, type: Boolean,
...@@ -489,9 +490,6 @@ export default { ...@@ -489,9 +490,6 @@ export default {
text-align: center; text-align: center;
} }
} }
.el-input-group__prepend {
padding: 0;
}
.input-with-input { .input-with-input {
.el-input-group__prepend { .el-input-group__prepend {
background-color: #ffffff; background-color: #ffffff;
......
...@@ -67,7 +67,19 @@ ...@@ -67,7 +67,19 @@
:is-show-important="isShowImportant" :is-show-important="isShowImportant"
></form-dynamic> ></form-dynamic>
</div> </div>
<el-col
v-else-if="c.type === 'title'"
:xs="c.xs || 24"
:sm="c.sm || 24"
:md="c.md || 24"
:lg="c.span || 12"
:key="columnIndex"
v-show="c.display"
>
<div class="form_title" :style="c.styles">
<span>{{ c.value }}</span>
</div>
</el-col>
<el-col <el-col
:xs="c.xs || 24" :xs="c.xs || 24"
:sm="c.sm || 24" :sm="c.sm || 24"
......
...@@ -19,8 +19,15 @@ ...@@ -19,8 +19,15 @@
> >
<div class="flex"> <div class="flex">
<div> <div>
<el-upload-self
v-if="item.type === 'upload'"
v-bind="item"
:upload-query="{ formId, patientId, prefix: item.prop }"
v-model="form[item.prop]"
:disabled="item.disabled"
></el-upload-self>
<!-- 表单改文本 --> <!-- 表单改文本 -->
<template v-if="vwForm.detail"> <template v-else-if="vwForm.detail">
<form-item-text :item="item" :form="form"></form-item-text> <form-item-text :item="item" :form="form"></form-item-text>
</template> </template>
<template v-else> <template v-else>
...@@ -342,12 +349,6 @@ ...@@ -342,12 +349,6 @@
> >
</el-date-picker> </el-date-picker>
</template> </template>
<el-upload-self
v-if="item.type === 'upload'"
v-bind="item"
v-model="form[item.prop]"
:disabled="item.disabled"
></el-upload-self>
</div> </div>
<span <span
class="important_field" class="important_field"
...@@ -385,6 +386,11 @@ export default { ...@@ -385,6 +386,11 @@ export default {
vwForm: { vwForm: {
default: {}, default: {},
}, },
formId: {},
getPatientId: {
type: Function,
default: () => {},
},
getDefectsSet: { getDefectsSet: {
type: Function, type: Function,
default: () => {}, default: () => {},
...@@ -428,6 +434,9 @@ export default { ...@@ -428,6 +434,9 @@ export default {
defectsSet() { defectsSet() {
return this.getDefectsSet ? this.getDefectsSet() : [] return this.getDefectsSet ? this.getDefectsSet() : []
}, },
patientId() {
return this.getPatientId ? this.getPatientId() : ""
},
}, },
methods: { methods: {
scrollToView() { scrollToView() {
......
This diff is collapsed.
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
</template> </template>
<template v-else> <template v-else>
<el-button size="small" type="primary">点击上传</el-button> <el-button size="middle" :type="btnType">点击上传</el-button>
</template> </template>
<div slot="tip" class="el-upload__tip">{{ tip }}</div> <div slot="tip" class="el-upload__tip">{{ tip }}</div>
</el-upload> </el-upload>
...@@ -54,7 +54,12 @@ export default { ...@@ -54,7 +54,12 @@ export default {
type: Boolean, type: Boolean,
default: false, default: false,
}, },
bucketName: { type: String }, //后端上传文件路径(参数) uploadQuery: {
type: Object,
default: () => {
return {}
},
}, //后端上传文件路径(参数)
listType: String, listType: String,
tip: String, tip: String,
multiple: Boolean, multiple: Boolean,
...@@ -72,7 +77,11 @@ export default { ...@@ -72,7 +77,11 @@ export default {
type: Boolean, type: Boolean,
default: false, default: false,
}, },
value: Array,//上传文件数组 绑定数组 btnType: {
type: String,
default: "primary",
},
value: Array, //上传文件数组 绑定数组
}, },
data() { data() {
return { return {
...@@ -91,13 +100,8 @@ export default { ...@@ -91,13 +100,8 @@ export default {
if (newValue === oldValue) return if (newValue === oldValue) return
this.fileList = newValue.map((_) => { this.fileList = newValue.map((_) => {
return { return {
name: _.fileName, name: _.file_name,
url: url: `${this.httpPrefix}/disease-data/file/info/${_.bucket_name}/${_.prefix}-${_.uuid_name}`,
this.httpPrefix +
"/disease-data/file/" +
_.bucketName +
"-" +
_.uuidName,
} }
}) })
}, },
...@@ -113,8 +117,7 @@ export default { ...@@ -113,8 +117,7 @@ export default {
action() { action() {
return ( return (
this.httpPrefix + this.httpPrefix +
"/disease-data/file/upload?bucketName=" + `/disease-data/file/upload?formId=${this.uploadQuery.formId}&patientId=${this.uploadQuery.patientId}&prefix=${this.uploadQuery.prefix}`
this.bucketName
) )
}, },
// 预览list // 预览list
...@@ -123,11 +126,7 @@ export default { ...@@ -123,11 +126,7 @@ export default {
return this.value.map((_) => { return this.value.map((_) => {
return ( return (
_.url || _.url ||
this.httpPrefix + `${this.httpPrefix}/disease-data/file/info/${_.bucket_name}/${_.prefix}-${_.uuid_name}`
"/disease-data/file/" +
_.bucketName +
"-" +
_.uuidName
) )
}) })
}, },
...@@ -163,27 +162,43 @@ export default { ...@@ -163,27 +162,43 @@ export default {
// 移除提醒 // 移除提醒
beforeRemove(file, fileList) { beforeRemove(file, fileList) {
return this.$confirm(`确定移除 ${file.fileName || file.name}?`) return this.$confirm(`确定移除 ${file.file_name || file.name}?`)
}, },
// 移除 // 移除
handleRemove({ url }, fileList) { handleRemove({ url }, fileList) {
const i = this.value.findIndex((_) => url.endsWith(_.uuidName)) const i = this.value.findIndex((_) => url.endsWith(_.uuid_name))
if (i > -1) this.value.splice(i, 1)// 静态移除 if (i > -1) this.value.splice(i, 1) // 静态移除
}, },
// 查看 // 查看
handlePreview(file) { handlePreview(file) {
const name = file.fileName || file.name const name = file.fileName || file.name
this.title = name this.title = name
if (name.match(/\.(png|jpg|jpeg)/)) { let responseUrl
this.imgUrl = file.url if (file.response) {
this.$refs.image.clickHandler() const _ = file.response.data
} else { responseUrl = `${this.httpPrefix}/disease-data/file/info/${_.bucket_name}/${_.prefix}-${_.uuid_name}`
}
try {
if (name.match(/\.(png|jpg|jpeg)/)) {
this.imgUrl = file.url || responseUrl
this.$refs.image.clickHandler()
} else {
const elink = document.createElement("a")
elink.download = name
elink.style.display = "none"
elink.href = file.url || responseUrl
document.body.appendChild(elink)
elink.click()
URL.revokeObjectURL(elink.href) // 释放URL 对象
document.body.removeChild(elink)
}
} catch {
const elink = document.createElement("a") const elink = document.createElement("a")
elink.download = name elink.download = name
elink.style.display = "none" elink.style.display = "none"
elink.href = file.url elink.href = file.url || responseUrl
document.body.appendChild(elink) document.body.appendChild(elink)
elink.click() elink.click()
URL.revokeObjectURL(elink.href) // 释放URL 对象 URL.revokeObjectURL(elink.href) // 释放URL 对象
...@@ -204,6 +219,5 @@ export default { ...@@ -204,6 +219,5 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.el-upload-self { .el-upload-self {
font-size: 14px; font-size: 14px;
margin-bottom: 15px;
} }
</style> </style>
<template>
<div style="min-width: 1440px; overflow: overlay">
<header class="layout-header">
<div class="logotitle">
<div class="leftLogo"></div>
<div class="rightText">
国家消化道早癌防治中心联盟 <br />早期胃癌筛查项目
</div>
</div>
<div v-if="!allianceToken" class="login">
<div class="login_title text-center">
筛查随访数据库登录
<el-form
ref="form"
label-position="top"
:model="form"
label-suffix=":"
label-width="100%"
:rules="rules"
>
<el-form-item prop="username" label="登录名">
<el-input
v-model="form.username"
placeholder="请输入登录名"
></el-input>
</el-form-item>
<el-form-item prop="password" label="密码">
<el-input
v-model="form.password"
type="password"
placeholder="请输入密码"
></el-input>
</el-form-item>
<el-form-item>
<el-button
type="primary"
class="login_button"
:loading="loading"
@click="handleSubmit('form')"
>登录</el-button
>
</el-form-item>
</el-form>
</div>
</div>
<div v-if="allianceToken" class="userInfo">
<div class="white"></div>
<div class="text">欢迎,{{ userInfo.name }}</div>
<div class="exit" @click="logout">退出</div>
</div>
</header>
<div class="sider">
<el-menu
mode="horizontal"
:default-active="currentRoute"
class="siderMenu"
router
>
<el-menu-item
v-for="(item, index) in menuList"
:key="index"
:index="item.route"
style="width: 10%; text-align: center; min-width: 120px"
>
{{ item.name }}
</el-menu-item>
</el-menu>
</div>
<section style="overflow: hidden; padding: 32px 10%; background: #f3f3f3">
<transition name="fade-transform" mode="out-in">
<router-view></router-view>
</transition>
</section>
<footer class="layout-footer-center text-center">
copyright@ 联盟信息等
</footer>
</div>
</template>
<script>
import { loginRSA } from "@/config/settings"
import { getAccessToken } from "@/utils/accessToken"
import { encrypt, decrypt } from "@/utils/encryption"
export default {
data() {
return {
form: {
username: "",
password: "",
},
menuList: [
{
route: "/home",
name: "首页",
},
{
route: "/allianceintroduction",
name: "联盟介绍",
},
{
route: "/healthpopularization",
name: "健康科普",
},
{
route: "/scientificresearch",
name: "科学研究",
},
{
route: "/casesharing",
name: "案例分享",
},
],
loading: false,
rules: {
username: [
{ required: true, message: "请输入用户名", trigger: "blur" },
],
password: [
{ required: true, message: "请输入密码", trigger: "blur" },
{
type: "string",
min: 6,
message: "The password length cannot be less than 6 bits",
trigger: "blur",
},
],
},
allianceToken: getAccessToken(),
currentRoute: this.$route.path,
userInfo: {},
}
},
watch: {
$route: {
handler(v) {
this.currentRoute = this.$route.path
},
deep: true,
},
},
mounted() {
// if (localStorage.getItem('allianceToken')) {
// this.$router.push('/datacenter/home')
// }
this.userInfo = JSON.parse(localStorage.getItem("userInfo"))
},
methods: {
handleSubmit(name) {
this.$refs[name].validate((valid) => {
if (valid) {
this.loading = true
const data = Object.assign({}, this.form)
if (loginRSA) {
data.password = encodeURIComponent(encrypt(data.password))
data.userName = encodeURIComponent(encrypt(data.username))
}
this.$store
.dispatch("user/login", data)
.then(() => {
const routerPath =
!this.redirect || this.redirect === "/404" ? "/" : this.redirect
this.$router.push({ path: routerPath }).catch((e) => {})
this.loading = false
})
.catch((e) => {
this.loading = false
})
}
})
},
logout() {
const h = this.$createElement
this.$msgbox({
title: "提示",
message: h("p", null, [h("span", null, "是否确认退出登录?")]),
showCancelButton: true,
confirmButtonText: "确定",
cancelButtonText: "取消",
beforeClose: (action, instance, done) => {
if (action === "confirm") {
instance.confirmButtonLoading = true
instance.confirmButtonText = "执行中..."
this.$store.dispatch("user/logout").then(() => {
this.allianceToken = ""
done()
instance.confirmButtonLoading = false
})
} else {
done()
}
},
}).then((action) => {
// this.$message({
// type: "info",
// message: "action: " + action,
// })
})
},
},
}
</script>
<style lang="scss" scoped>
.layout-header {
height: 400px;
width: 100%;
background: url("~@/assets/img/Home/homeheaderbg.png") no-repeat;
background-position: center;
background-size: cover;
display: flex;
padding: 0 10% 0 5%;
justify-content: space-between;
align-items: center;
.logotitle {
height: 220px;
display: flex;
.leftLogo {
width: 72px;
height: 72px;
background: url("~@/assets/img/Home/stomach.png") no-repeat;
background-position: center;
background-size: cover;
}
.rightText {
min-width: 570px;
font-size: 42px;
font-family: AlibabaPuHuiTiB;
color: #ffffff;
margin-left: 14px;
}
}
.login {
width: 23%;
min-width: 334px;
height: 326px;
background: rgba(255, 255, 255, 0.96);
box-shadow: 0px 12px 36px 0px rgba(26, 35, 87, 0.4);
border-radius: 8px;
padding: 18px 40px;
.login_title {
height: 26px;
font-size: 22px;
font-family: AlibabaPuHuiTiM;
color: #4e68ff;
// line-height: 60px;
}
.login_button {
width: 100%;
height: 40px;
margin-top: 20px;
background: #4e68ff;
}
}
.userInfo {
height: 160px;
display: flex;
flex-direction: column;
align-items: flex-end;
.white {
width: 32px;
height: 4px;
background: #ffffff;
}
.text {
font-size: 20px;
font-family: AlibabaPuHuiTiM;
color: #ffffff;
margin: 10px 0;
}
.exit {
font-size: 16px;
cursor: pointer;
font-family: AlibabaPuHuiTiR;
text-decoration: underline;
color: rgba(255, 255, 255, 0.8);
line-height: 16px;
&:active {
color: #4e68ff;
}
}
}
}
.siderMenu {
padding: 0 10%;
background: #edefff;
}
.layout-footer-center {
width: 100%;
height: 108px;
background: #efefef;
line-height: 108px;
}
.el-menu--horizontal > .el-menu-item:not(.is-disabled):hover,
.el-menu--horizontal > .el-menu-item:not(.is-disabled):focus {
background-color: transparent;
}
.el-form-item {
text-align: left;
}
/* fade-transform */
.fade-transform-leave-active,
.fade-transform-enter-active {
transition: all 0.3s;
}
.fade-transform-enter {
opacity: 0;
transform: translateX(-30px);
}
.fade-transform-leave-to {
opacity: 0;
transform: translateX(30px);
}
</style>
...@@ -27,16 +27,16 @@ router.beforeResolve(async (to, from, next) => { ...@@ -27,16 +27,16 @@ router.beforeResolve(async (to, from, next) => {
let hasToken = store.getters["user/accessToken"] let hasToken = store.getters["user/accessToken"]
if (!loginInterception) hasToken = true if (!loginInterception) hasToken = true
if (hasToken) { if (hasToken) {
if (to.path === "/login") { if (to.path === "/home") {
next({ next()
path: "/", // { path: "/" }
})
if (progressBar) VabProgress.done() if (progressBar) VabProgress.done()
} else if (routesWhiteList.indexOf(to.path) !== -1) { } else if (routesWhiteList.indexOf(to.path) !== -1) {
next() next()
} else { } else {
const userInfo = store.getters["user/userInfo"] const userInfo = store.getters["user/userInfo"]
if (userInfo) { if (userInfo) {
console.log(to.path)
next() next()
} else { } else {
try { try {
...@@ -48,6 +48,7 @@ router.beforeResolve(async (to, from, next) => { ...@@ -48,6 +48,7 @@ router.beforeResolve(async (to, from, next) => {
accessRoutes = await store.dispatch("routes/setAllRoutes", menulist) accessRoutes = await store.dispatch("routes/setAllRoutes", menulist)
} }
router.addRoutes(accessRoutes) router.addRoutes(accessRoutes)
console.log(router)
if (accessRoutes.length === 1) { if (accessRoutes.length === 1) {
Message({ Message({
message: "暂无菜单权限,请联系管理员", message: "暂无菜单权限,请联系管理员",
...@@ -56,7 +57,7 @@ router.beforeResolve(async (to, from, next) => { ...@@ -56,7 +57,7 @@ router.beforeResolve(async (to, from, next) => {
}) })
await store.dispatch("user/resetAccessToken") await store.dispatch("user/resetAccessToken")
await resetRouter() await resetRouter()
next(`/login`) next(`/home`)
if (progressBar) VabProgress.done() if (progressBar) VabProgress.done()
} else { } else {
store.dispatch("dict/getDictData") //字典获取 store.dispatch("dict/getDictData") //字典获取
...@@ -67,7 +68,7 @@ router.beforeResolve(async (to, from, next) => { ...@@ -67,7 +68,7 @@ router.beforeResolve(async (to, from, next) => {
} }
} catch (error) { } catch (error) {
await store.dispatch("user/resetAccessToken") await store.dispatch("user/resetAccessToken")
next(`/login?redirect=${to.path}`) next(`/home?redirect=${to.path}`)
if (progressBar) VabProgress.done() if (progressBar) VabProgress.done()
} }
} }
...@@ -76,7 +77,7 @@ router.beforeResolve(async (to, from, next) => { ...@@ -76,7 +77,7 @@ router.beforeResolve(async (to, from, next) => {
if (routesWhiteList.indexOf(to.path) !== -1) { if (routesWhiteList.indexOf(to.path) !== -1) {
next() next()
} else { } else {
next(`/login?redirect=${to.path}`) next(`/home?redirect=${to.path}`)
if (progressBar) VabProgress.done() if (progressBar) VabProgress.done()
} }
} }
......
...@@ -24,7 +24,18 @@ module.exports = { ...@@ -24,7 +24,18 @@ module.exports = {
// 路由模式,可选值为 history 或 hash // 路由模式,可选值为 history 或 hash
routerMode: "hash", routerMode: "hash",
//不经过token校验的路由 //不经过token校验的路由
routesWhiteList: ["/login", "/404", "/401", "/sso", "/test"], routesWhiteList: [
// "/login",
"/404",
"/401",
"/sso",
"/test",
"/home",
"/allianceintroduction",
"/casesharing",
"/scientificresearch",
"/healthpopularization",
],
//加载时显示文字 //加载时显示文字
loadingText: "正在加载中...", loadingText: "正在加载中...",
//token名称 //token名称
...@@ -33,6 +44,8 @@ module.exports = { ...@@ -33,6 +44,8 @@ module.exports = {
tokenTableName: "agcs", tokenTableName: "agcs",
//token存储位置localStorage sessionStorage cookie //token存储位置localStorage sessionStorage cookie
storage: "localStorage", storage: "localStorage",
// 前缀名
storagePrefixName: "agcs",
//是否显示logo //是否显示logo
logo: true, logo: true,
//是否国定头部 固定fixed 不固定noFixed //是否国定头部 固定fixed 不固定noFixed
......
...@@ -58,14 +58,14 @@ export default { ...@@ -58,14 +58,14 @@ export default {
}, },
}, },
watch: { watch: {
// $route: { $route: {
// handler(route) { handler(route) {
// if ("mobile" === this.device) { if ("mobile" === this.device) {
// this.$store.dispatch("settings/foldSideBar") this.$store.dispatch("settings/foldSideBar")
// } }
// }, },
// immediate: true, immediate: true,
// }, },
}, },
created() { created() {
//重载所有路由 //重载所有路由
......
...@@ -53,7 +53,7 @@ export default { ...@@ -53,7 +53,7 @@ export default {
async () => { async () => {
const fullPath = this.$route.fullPath const fullPath = this.$route.fullPath
await this.$store.dispatch("user/logout") await this.$store.dispatch("user/logout")
this.$router.push(`/login?redirect=${fullPath}`) this.$router.push(`/home?redirect=${fullPath}`)
} }
) )
}, },
......
...@@ -4,9 +4,40 @@ ...@@ -4,9 +4,40 @@
<vab-remix-icon class="logo" icon-class="logo" /> <vab-remix-icon class="logo" icon-class="logo" />
<span class="hidden-xs-only">无症状人群胃癌筛查随访数据中心</span> <span class="hidden-xs-only">无症状人群胃癌筛查随访数据中心</span>
</div> </div>
<div class="right-panel"> <div class="userInfo">
<error-log></error-log> <error-log></error-log>
<avatar></avatar> <!-- <avatar></avatar> -->
<div class="fontSelect">
<div
v-for="(item, index) in fontList"
:key="index"
:class="['font', index == fontIndex ? 'active' : '']"
@click="changeFont(index)"
>
<div class="label">{{ item.label }}</div>
</div>
</div>
<div
v-show="curSelectedIndex != -1"
class="community"
@click="openModalFlag"
>
<img src="~@/assets/img/DataCenter/shift.png" alt />
{{
curSelectedIndex != -1 ? screeningList[curSelectedIndex].title : ""
}}
</div>
<div class="user">
<img src="~@/assets/img/DataCenter/user.png" alt />
<avatar></avatar>
</div>
<el-badge :value="messageCount" :class-name="'badge'">
<div class="user">
<img src="~@/assets/img/DataCenter/message.png" alt />
消息
</div>
</el-badge>
</div> </div>
</div> </div>
</template> </template>
...@@ -31,10 +62,37 @@ export default { ...@@ -31,10 +62,37 @@ export default {
FullScreenBar, FullScreenBar,
ThemeBar, ThemeBar,
}, },
props: {
curSelectedIndex: {
type: Number,
default: -1,
},
},
data() { data() {
return { return {
pulse: false, pulse: false,
isDot: true, isDot: true,
messageCount: 10,
screeningList: [
{
title: "社区筛查",
src: require("@/assets/img/DataCenter/shequ.png"),
},
{
title: "医院筛查",
src: require("@/assets/img/DataCenter/yiyuan.png"),
},
{
title: "体检筛查",
src: require("@/assets/img/DataCenter/tijian.png"),
},
],
fontList: [
{ fontSize: "12px", label: "A-" },
{ fontSize: "14px", label: "A" },
{ fontSize: "16px", label: "A+" },
],
fontIndex: localStorage.getItem("fontIndex") || 1,
} }
}, },
computed: { computed: {
...@@ -46,6 +104,8 @@ export default { ...@@ -46,6 +104,8 @@ export default {
feedBackNumber: "user/feedBackNumber", feedBackNumber: "user/feedBackNumber",
}), }),
}, },
created() {},
mounted() {},
methods: { methods: {
handleCollapse() { handleCollapse() {
this.$store.dispatch("settings/changeCollapse") this.$store.dispatch("settings/changeCollapse")
...@@ -60,6 +120,14 @@ export default { ...@@ -60,6 +120,14 @@ export default {
this.pulse = false this.pulse = false
}, 1000) }, 1000)
}, },
openModalFlag() {
this.$emit("openModalFlag")
},
changeFont(i) {
this.fontIndex = i
this.$store.commit("table/setFontIndex", i)
localStorage.setItem("fontIndex", i)
},
}, },
} }
</script> </script>
...@@ -75,6 +143,7 @@ export default { ...@@ -75,6 +143,7 @@ export default {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
color: #fff; color: #fff;
border-radius: 0px 0px 4px 4px;
.left-panel { .left-panel {
display: flex; display: flex;
align-items: center; align-items: center;
...@@ -104,61 +173,65 @@ export default { ...@@ -104,61 +173,65 @@ export default {
} }
} }
} }
.userInfo {
.right-panel {
display: flex; display: flex;
align-content: center;
align-items: center; align-items: center;
justify-content: flex-end; padding-right: 40px;
height: 74px; .fontSelect {
display: flex;
::v-deep { margin-right: 20px;
.user-avatar { .font {
margin-top: 2px; width: 40px;
margin-right: 5px; height: 40px;
font-weight: 600; background: #4e68ff;
cursor: pointer; border-radius: 4px;
} border: 1px solid #ffffff;
text-align: center;
.user-name { line-height: 40px;
position: relative;
margin-right: 35px;
margin-left: 5px;
font-weight: 600;
cursor: pointer;
}
.user-name + i {
position: absolute;
top: 4px;
right: 15px;
}
svg {
width: 1em;
height: 1em;
margin-right: 20px;
font-size: $base-font-size-big;
color: $base-color-gray;
cursor: pointer; cursor: pointer;
fill: $base-color-gray; margin-left: 20px;
} }
.active {
button { box-sizing: border-box;
svg { background: #ffffff;
margin-right: 0; height: 40px;
color: $base-color-white; color: #4e68ff;
cursor: pointer; padding: 1px;
fill: $base-color-white; .label {
height: 36px;
border: 1px solid #4e68ff;
} }
} }
}
.el-badge { .community {
margin-right: 20px; width: 106px;
padding: 0 5px; height: 30px;
svg { white-space: nowrap;
margin-right: 0px; background: rgba(255, 255, 255, 0.1);
} color: #fff;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
img {
margin-right: 4px;
width: 18px;
height: 18px;
}
}
.user {
white-space: nowrap;
margin-left: 40px;
height: 30px;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
color: #fff;
img {
margin-right: 4px;
width: 18px;
height: 18px;
} }
} }
} }
......
...@@ -32,7 +32,10 @@ ...@@ -32,7 +32,10 @@
}" }"
> >
<div :class="header === 'fixed' ? 'fixed-header' : ''"> <div :class="header === 'fixed' ? 'fixed-header' : ''">
<nav-bar></nav-bar> <nav-bar
:cur-selected-index="curSelectedIndex"
@openModalFlag="openModalFlag"
></nav-bar>
</div> </div>
<side-bar></side-bar> <side-bar></side-bar>
<div class="vab-main" :class="collapse ? 'is-collapse-main' : ''"> <div class="vab-main" :class="collapse ? 'is-collapse-main' : ''">
...@@ -40,6 +43,52 @@ ...@@ -40,6 +43,52 @@
</div> </div>
</div> </div>
<back-to-top transition-name="fade"></back-to-top> <back-to-top transition-name="fade"></back-to-top>
<el-dialog
custom-class="homeDialog"
:title="''"
:visible="modalFlag"
:close-on-click-modal="false"
:close-on-press-escape="false"
:show-close="false"
width="70%"
>
<div class="modalContent">
<div class="title">请选择您的筛查填报场景</div>
<ul class="list">
<li
v-for="(item, index) in screeningList"
:key="index"
@click="selectedIndex = index"
>
<div class="screeningItem">
<div class="circle">
<img
v-if="selectedIndex !== index"
src="~@/assets/img/DataCenter/circle.png"
alt
srcset
/>
<img
v-if="selectedIndex == index"
src="~@/assets/img/DataCenter/selected.png"
alt
srcset
/>
</div>
<div class="itemTitle">{{ item.title }}</div>
</div>
<div class="ItemIamge">
<img :src="item.src" alt />
</div>
</li>
</ul>
<div class="submit">
<el-button type="primary" class="btn" @click="setSelectedIndex"
>保存</el-button
>
</div>
</div>
</el-dialog>
</div> </div>
</template> </template>
...@@ -68,7 +117,25 @@ export default { ...@@ -68,7 +117,25 @@ export default {
}, },
mixins: [Media], mixins: [Media],
data() { data() {
return {} return {
modalFlag: false,
screeningList: [
{
title: "社区筛查",
src: require("@/assets/img/DataCenter/shequ.png"),
},
{
title: "医院筛查",
src: require("@/assets/img/DataCenter/yiyuan.png"),
},
{
title: "体检筛查",
src: require("@/assets/img/DataCenter/tijian.png"),
},
],
selectedIndex: 0,
curSelectedIndex: "",
}
}, },
computed: { computed: {
...mapGetters({ ...mapGetters({
...@@ -84,7 +151,24 @@ export default { ...@@ -84,7 +151,24 @@ export default {
} }
}, },
}, },
created() {
this.selectedIndex = localStorage.getItem("selectedIndex") || ""
this.curSelectedIndex = String(this.selectedIndex)
? this.selectedIndex - 0
: -1
},
mounted() { mounted() {
if (!this.selectedIndex) {
this.modalFlag = true
this.selectedIndex = 0
} else {
this.selectedIndex = this.selectedIndex - 0
this.curSelectedIndex = String(this.selectedIndex)
? this.selectedIndex
: -1
}
// console.log(this.curSelectedIndex)
this.$nextTick(() => { this.$nextTick(() => {
window.addEventListener( window.addEventListener(
"storage", "storage",
...@@ -100,6 +184,15 @@ export default { ...@@ -100,6 +184,15 @@ export default {
...mapActions({ ...mapActions({
handleFoldSideBar: "settings/foldSideBar", handleFoldSideBar: "settings/foldSideBar",
}), }),
setSelectedIndex() {
console.log(this.selectedIndex)
this.curSelectedIndex = this.selectedIndex
localStorage.setItem("selectedIndex", this.selectedIndex)
this.modalFlag = false
},
openModalFlag() {
this.modalFlag = true
},
}, },
} }
</script> </script>
...@@ -128,7 +221,7 @@ export default { ...@@ -128,7 +221,7 @@ export default {
} }
&.fixed.no-tags-bar { &.fixed.no-tags-bar {
padding-top: 56px; // padding-top: 56px;
} }
::v-deep { ::v-deep {
...@@ -190,7 +283,7 @@ export default { ...@@ -190,7 +283,7 @@ export default {
} }
&.fixed.no-tags-bar { &.fixed.no-tags-bar {
padding-top: 56px; // padding-top: 56px;
} }
.vab-main { .vab-main {
...@@ -236,6 +329,67 @@ export default { ...@@ -236,6 +329,67 @@ export default {
.side-bar-container { .side-bar-container {
top: 90px; top: 90px;
height: calc(100vh - 90px); height: calc(100vh - 90px);
border-radius: 0px 4px 4px 0px;
box-shadow: none;
}
}
::v-deep .homeDialog .el-dialog__header {
display: none;
}
.modalContent {
padding: 60px;
.title {
text-align: center;
height: 30px;
font-size: 24px;
font-family: AlibabaPuHuiTiM;
color: #333333;
line-height: 30px;
margin-bottom: 60px;
}
.list {
display: flex;
justify-content: space-between;
li {
cursor: pointer;
}
.screeningItem {
display: flex;
.circle {
width: 26px;
height: 26px;
margin-right: 12px;
img {
width: 100%;
height: 100%;
}
}
.itemTitle {
height: 24px;
font-size: 18px;
font-family: AlibabaPuHuiTiM;
color: #333333;
font-weight: bold;
line-height: 24px;
}
}
.ItemIamge {
width: 90%;
// height: 180px;
margin-top: 14px;
img {
width: 100%;
height: 100%;
}
}
}
.submit {
margin-top: 60px;
text-align: center;
.btn {
width: 100px;
height: 32px;
}
} }
} }
</style> </style>
...@@ -6,10 +6,9 @@ import store from "./store" ...@@ -6,10 +6,9 @@ import store from "./store"
import router from "./router" import router from "./router"
import "./plugins" import "./plugins"
import "./mixins" import "./mixins"
import "@/assets/style/common.scss"
// const { mockXHR } = require("../mock/static") // const { mockXHR } = require("../mock/static")
// mockXHR() // mockXHR()
Vue.config.productionTip = false Vue.config.productionTip = false
new Vue({ new Vue({
......
import Vue from "vue" import Vue from "vue"
import VueRouter from "vue-router" import VueRouter from "vue-router"
import Layout from "@/layouts" import Layout from "@/layouts"
import layout from "@/components/layout"
import EmptyLayout from "@/layouts/EmptyLayout" import EmptyLayout from "@/layouts/EmptyLayout"
Vue.use(VueRouter) Vue.use(VueRouter)
export const constantRoutes = [ export const constantRoutes = [
{ {
path: "/login", path: "/home",
component: () => import("@/views/login/index"), name: "Home",
hidden: true, // redirect: "/home",
name: "login", component: layout,
children: [
{
path: "/home",
component: () => import("@/views/Home/index"),
},
{
path: "/allianceintroduction",
component: () => import("@/views/Home/AllianceIntroduction/index"),
},
{
path: "/casesharing",
component: () => import("@/views/Home/CaseSharing/index"),
},
{
path: "/scientificresearch",
component: () => import("@/views/Home/ScientificResearch/index"),
},
{
path: "/healthpopularization",
component: () => import("@/views/Home/HealthPopularization/index"),
},
],
}, },
// {
// path: "/login",
// component: () => import("@/views/login/index"),
// hidden: true,
// name: "login",
// },
{ {
path: "/401", path: "/401",
name: "401", name: "401",
......
...@@ -3,10 +3,10 @@ ...@@ -3,10 +3,10 @@
* @description 所有全局配置的状态管理,如无必要请勿修改 * @description 所有全局配置的状态管理,如无必要请勿修改
*/ */
import defaultSettings from "@/config/settings"; import defaultSettings from "@/config/settings"
const { tagsBar, logo, layout, header, themeBar, skeleton } = defaultSettings; const { tagsBar, logo, layout, header, themeBar, skeleton } = defaultSettings
const theme = JSON.parse(localStorage.getItem("BYUI-VUE-THEME")) || ""; const theme = JSON.parse(localStorage.getItem("BYUI-VUE-THEME")) || ""
const state = { const state = {
tagsBar: theme.tagsBar || tagsBar, tagsBar: theme.tagsBar || tagsBar,
logo, logo,
...@@ -16,7 +16,7 @@ const state = { ...@@ -16,7 +16,7 @@ const state = {
skeleton, skeleton,
device: "desktop", device: "desktop",
themeBar, themeBar,
}; }
const getters = { const getters = {
collapse: (state) => state.collapse, collapse: (state) => state.collapse,
device: (state) => state.device, device: (state) => state.device,
...@@ -26,51 +26,51 @@ const getters = { ...@@ -26,51 +26,51 @@ const getters = {
tagsBar: (state) => state.tagsBar, tagsBar: (state) => state.tagsBar,
themeBar: (state) => state.themeBar, themeBar: (state) => state.themeBar,
skeleton: (state) => state.skeleton, skeleton: (state) => state.skeleton,
}; }
const mutations = { const mutations = {
changeLayout: (state, layout) => { changeLayout: (state, layout) => {
if (layout) state.layout = layout; if (layout) state.layout = layout
}, },
changeHeader: (state, header) => { changeHeader: (state, header) => {
if (header) state.header = header; if (header) state.header = header
}, },
changeTagsBar: (state, tagsBar) => { changeTagsBar: (state, tagsBar) => {
if (tagsBar) state.tagsBar = tagsBar; if (tagsBar) state.tagsBar = tagsBar
}, },
changeCollapse: (state) => { changeCollapse: (state) => {
state.collapse = !state.collapse; state.collapse = !state.collapse
}, },
foldSideBar: (state) => { foldSideBar: (state) => {
state.collapse = true; // state.collapse = true;
}, },
openSideBar: (state) => { openSideBar: (state) => {
state.collapse = false; state.collapse = false
}, },
toggleDevice: (state, device) => { toggleDevice: (state, device) => {
state.device = device; state.device = device
}, },
}; }
const actions = { const actions = {
changeLayout({ commit }, layout) { changeLayout({ commit }, layout) {
commit("changeLayout", layout); commit("changeLayout", layout)
}, },
changeHeader({ commit }, header) { changeHeader({ commit }, header) {
commit("changeHeader", header); commit("changeHeader", header)
}, },
changeTagsBar({ commit }, tagsBar) { changeTagsBar({ commit }, tagsBar) {
commit("changeTagsBar", tagsBar); commit("changeTagsBar", tagsBar)
}, },
changeCollapse({ commit }) { changeCollapse({ commit }) {
commit("changeCollapse"); commit("changeCollapse")
}, },
foldSideBar({ commit }) { foldSideBar({ commit }) {
commit("foldSideBar"); commit("foldSideBar")
}, },
openSideBar({ commit }) { openSideBar({ commit }) {
commit("openSideBar"); commit("openSideBar")
}, },
toggleDevice({ commit }, device) { toggleDevice({ commit }, device) {
commit("toggleDevice", device); commit("toggleDevice", device)
}, },
}; }
export default { state, getters, mutations, actions }; export default { state, getters, mutations, actions }
const state = {
fontIndex: localStorage.getItem("fontIndex") || 1,
}
const getters = {
fontIndex: (state) => state.fontIndex,
}
const mutations = {
setFontIndex(state, fontIndex) {
state.fontIndex = fontIndex
},
}
const actions = {}
export default {
state,
getters,
mutations,
actions,
}
...@@ -35,6 +35,7 @@ const mutations = { ...@@ -35,6 +35,7 @@ const mutations = {
setAccessToken(accessToken) setAccessToken(accessToken)
}, },
setUserInfo(state, userInfo) { setUserInfo(state, userInfo) {
localStorage.setItem("userInfo", JSON.stringify(userInfo))
state.userInfo = userInfo state.userInfo = userInfo
}, },
setGroup(state, group) { setGroup(state, group) {
...@@ -82,7 +83,7 @@ const actions = { ...@@ -82,7 +83,7 @@ const actions = {
} }
let { menuList, user, roleList, group } = data let { menuList, user, roleList, group } = data
if (menuList && user) { if (menuList && user) {
dispatch("getFeedBackNumber", user.id) // dispatch("getFeedBackNumber", user.id)
commit("setMenuList", menuList) commit("setMenuList", menuList)
commit("setUserInfo", user) commit("setUserInfo", user)
commit("setRoles", roleList) commit("setRoles", roleList)
......
...@@ -8,9 +8,9 @@ ...@@ -8,9 +8,9 @@
$base-color-default: #4e68ff; $base-color-default: #4e68ff;
$base-z-index: 999; $base-z-index: 999;
$base-menu-background: #08203d; $base-menu-background: #252C49;
$base-menu-children-background: #08203d; $base-menu-children-background: #252C49;
$base-menu-background-active: #164884; $base-menu-background-active: #546184;
$base-menu-color: hsla(0, 0%, 100%, 0.95); $base-menu-color: hsla(0, 0%, 100%, 0.95);
$base-menu-color-active: hsla(0, 0%, 100%, 0.95); $base-menu-color-active: hsla(0, 0%, 100%, 0.95);
$base-title-color: #fff; $base-title-color: #fff;
...@@ -30,7 +30,7 @@ $base-color-orange: #ff6700; ...@@ -30,7 +30,7 @@ $base-color-orange: #ff6700;
$base-color-red: #ff4d4f; $base-color-red: #ff4d4f;
$base-color-gray: rgba(0, 0, 0, 0.65); $base-color-gray: rgba(0, 0, 0, 0.65);
$base-main-width: 1279px; $base-main-width: 1279px;
$base-border-radius: 2px; $base-border-radius: 4px;
$base-border-color: #dcdfe6; $base-border-color: #dcdfe6;
$base-form-width: 600px; $base-form-width: 600px;
$base-input-height: 32px; $base-input-height: 32px;
......
const ls = window.localStorage const ls = window.localStorage
const ss = window.sessionStorage const ss = window.sessionStorage
import { storagePrefixName } from "@/config/settings"
export const Local = { export const Local = {
get(key, def) { get(key, def) {
let value = null let value = null
try { try {
value = JSON.parse(ls.getItem(key)) value = JSON.parse(ls.getItem(storagePrefixName + "-" + key))
} catch (e) { } catch (e) {
console.log(" ") console.log(" ")
} }
...@@ -19,14 +20,14 @@ export const Local = { ...@@ -19,14 +20,14 @@ export const Local = {
ls.setItem(i, JSON.stringify(setting[i])) ls.setItem(i, JSON.stringify(setting[i]))
} }
} else { } else {
ls.setItem(key, JSON.stringify(val)) ls.setItem(storagePrefixName + "-" + key, JSON.stringify(val))
} }
} catch (e) { } catch (e) {
console.log("'") console.log("'")
} }
}, },
remove(key) { remove(key) {
ls.removeItem(key) ls.removeItem(storagePrefixName + "-" + key)
}, },
clear() { clear() {
ls.clear() ls.clear()
...@@ -36,7 +37,7 @@ export const Local = { ...@@ -36,7 +37,7 @@ export const Local = {
export const Session = { export const Session = {
get(key) { get(key) {
try { try {
return JSON.parse(ss.getItem(key)) return JSON.parse(ss.getItem(storagePrefixName + "-" + key))
} catch (e) { } catch (e) {
return null return null
} }
...@@ -48,11 +49,11 @@ export const Session = { ...@@ -48,11 +49,11 @@ export const Session = {
ss.setItem(i, JSON.stringify(setting[i])) ss.setItem(i, JSON.stringify(setting[i]))
} }
} else { } else {
ss.setItem(key, JSON.stringify(val)) ss.setItem(storagePrefixName + "-" + key, JSON.stringify(val))
} }
}, },
remove(key) { remove(key) {
ss.removeItem(key) ss.removeItem(storagePrefixName + "-" + key)
}, },
clear() { clear() {
ss.clear() ss.clear()
......
<template>
<div>联盟介绍</div>
</template>
<script>
export default {
data () {
return {}
},
methods: {},
mounted () { },
watch: {}
}
</script>
<style lang="scss" scoped>
</style>
\ No newline at end of file
<template>
<div>案例分享</div>
</template>
<script>
export default {
data () {
return {}
},
methods: {},
mounted () { },
watch: {}
}
</script>
<style lang="scss" scoped>
</style>
\ No newline at end of file
<template>
<div class="commonList">
<ul class="left_bar">
<li
v-for="(item, index) in leftBar"
:key="index"
:class="index == activeBar ? 'activeBar' : ''"
@click="changeActive(index)"
>
{{ item.name }}
</li>
</ul>
<div v-if="!showText" class="right_list">
<div class="list_title">
{{ leftBar[activeBar].name }}
</div>
<ul class="list">
<li v-for="(item, index) in leftBar[activeBar].list" :key="index">
<div class="leftImg">
<img src="~@/assets/img/Home/shenghuo.png" alt="" />
</div>
<div class="rightCon">
<div class="top">
<div class="rc_title">{{ item.title }}</div>
<div class="rc_date">{{ item.time }}</div>
</div>
<div class="bottom" @click="viewDetail(index)">查看</div>
</div>
</li>
</ul>
</div>
<div v-if="showText" class="right_content">
<div class="breadcum">
<div
v-for="(item, index) in showTitle"
:key="index"
:class="[index != showTitle.length - 1 ? 'before' : 'now']"
@click="back(index)"
>
{{ item }}<span v-if="index != showTitle.length - 1"> / </span>
</div>
</div>
{{ showText }}
</div>
</div>
</template>
<script>
export default {
data() {
return {
activeBar: 0,
leftBar: [
{
name: "筛查",
list: [
{
id: 1,
title: "筛查数据的科学性",
text: "123",
time: "2022/06-30",
},
{
id: 2,
title: "筛查数据的科学性",
text: "1",
time: "2022/06-30",
},
],
},
{
name: "生活",
},
{
name: "医学知识",
},
{
name: "其他",
},
],
showText: "",
showTitle: [],
}
},
mounted() {
console.log(this.$route)
if (this.$route.query.tabIndex) {
this.activeBar = this.$route.query.tabIndex
}
},
methods: {
changeActive(i) {
this.activeBar = i
this.showText = ""
},
viewDetail(i) {
this.showText = this.leftBar[this.activeBar].list[i].text
this.showTitle[0] = this.leftBar[this.activeBar].name
this.showTitle[1] = this.leftBar[this.activeBar].list[i].title
console.log(this.showText)
},
back(index) {
if (index == 0) {
this.showText = ""
}
},
},
}
</script>
<style lang="scss" scoped>
.commonList {
display: flex;
justify-content: space-between;
.left_bar {
width: 188px;
height: 760px;
background: #ffffff;
border-radius: 4px;
padding: 20px 0;
li {
width: 188px;
height: 52px;
font-size: 16px;
font-family: AlibabaPuHuiTiM;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
// background: rgba(78, 104, 255, 0.1);
}
.activeBar {
color: #4e68ff;
background: rgba(78, 104, 255, 0.1);
}
}
.right_list {
width: calc(100% - 208px);
height: 760px;
background: #ffffff;
border-radius: 4px;
padding: 32px;
.list_title {
height: 37px;
font-size: 16px;
font-family: AlibabaPuHuiTiR;
color: rgba(0, 0, 0, 0.8);
border-bottom: 1px solid #efefef;
}
.list {
li {
display: flex;
align-items: center;
margin-top: 20px;
.leftImg {
width: 132px;
height: 98px;
border-radius: 4px;
margin-right: 20px;
img {
width: 100%;
height: 100%;
}
}
.rightCon {
display: flex;
flex-direction: column;
justify-content: space-between;
height: 98px;
.rc_title {
font-size: 16px;
font-family: AlibabaPuHuiTiR;
color: #333333;
}
.rc_date {
font-size: 14px;
font-family: Roboto-Regular, Roboto;
font-weight: 400;
color: #999999;
}
.bottom {
cursor: pointer;
width: 68px;
height: 28px;
background: rgba(78, 104, 255, 0.1);
border-radius: 16px;
text-align: center;
font-size: 14px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #4e68ff;
line-height: 28px;
&:hover {
background: rgba(78, 104, 255, 0.2);
}
}
}
}
}
}
.right_content {
width: calc(100% - 208px);
height: 760px;
background: #ffffff;
border-radius: 4px;
padding: 32px;
}
}
.breadcum {
display: flex;
.before {
font-size: 16px;
font-family: AlibabaPuHuiTiR;
color: rgba(0, 0, 0, 0.4);
cursor: pointer;
&:hover {
color: #4e68ff;
}
}
.now {
margin-left: 5px;
font-size: 16px;
font-family: AlibabaPuHuiTiR;
}
}
</style>
<template>
<div class="commonList">
<ul class="left_bar">
<li
v-for="(item, index) in leftBar"
:key="index"
:class="index == activeBar ? 'activeBar' : ''"
@click="changeActive(index)"
>
{{ item.name }}
</li>
</ul>
<div class="right_list">
<div class="list_title">
{{ leftBar[activeBar].name }}
</div>
<ul class="list">
<li v-for="(item, index) in leftBar[activeBar].list" :key="index">
<div class="left_text">
<div class="circle"></div>
<div class="title">{{ item.title }}</div>
</div>
<div class="rig_date">
{{ item.time }}
</div>
</li>
</ul>
</div>
</div>
</template>
<script>
export default {
data() {
return {
activeBar: 0,
leftBar: [
{
name: "筛查技术方案",
list: [
{
title: "筛查数据的科学性",
text: "",
time: "2022/06-30",
},
{
title: "筛查数据的科学性",
text: "",
time: "2022/06-30",
},
],
},
{
name: "筛查指南",
},
{
name: "学术成果",
},
{
name: "项目进展与成果",
},
],
}
},
watch: {},
mounted() {
if (this.$route.query.tabIndex) {
this.activeBar = this.$route.query.tabIndex
}
},
methods: {
changeActive(i) {
this.activeBar = i
// this.$router.replace("/scientificresearch")
},
},
}
</script>
<style lang="scss" scoped>
.commonList {
display: flex;
justify-content: space-between;
.left_bar {
width: 188px;
height: 760px;
background: #ffffff;
border-radius: 4px;
padding: 20px 0;
li {
width: 188px;
height: 52px;
font-size: 16px;
font-family: AlibabaPuHuiTiM;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
// background: rgba(78, 104, 255, 0.1);
}
.activeBar {
color: #4e68ff;
background: rgba(78, 104, 255, 0.1);
}
}
.right_list {
width: calc(100% - 208px);
height: 760px;
background: #ffffff;
border-radius: 4px;
padding: 32px;
.list_title {
height: 37px;
font-size: 16px;
font-family: AlibabaPuHuiTiR;
color: rgba(0, 0, 0, 0.8);
border-bottom: 1px solid #efefef;
}
.list {
li {
height: 22px;
font-size: 16px;
font-family: AlibabaPuHuiTiR;
color: #333333;
line-height: 22px;
margin-top: 20px;
display: flex;
justify-content: space-between;
align-items: center;
cursor: pointer;
.left_text {
display: flex;
align-items: center;
.circle {
width: 6px;
height: 6px;
background: #4e68ff;
border-radius: 50%;
margin-right: 8px;
}
}
.rig_date {
font-size: 14px;
font-family: Roboto-Regular, Roboto;
font-weight: 400;
color: #999999;
}
}
}
}
}
</style>
This diff is collapsed.
<template>
<div class="audit-qualitycontrol">
<div class="aq-top-tab">
<el-tabs v-model="type" @tab-click="handleClick">
<el-tab-pane label="筛查病例数据" name="0"></el-tab-pane>
<el-tab-pane label="随访病例数据" name="1"></el-tab-pane>
</el-tabs>
</div>
<div class="aq-bot-table">
<div class="table-top-tab">
<el-tabs v-model="auditStatus" type="card" @tab-click="handleClick">
<el-tab-pane label="待审核" name="0"></el-tab-pane>
<el-tab-pane label="已审核" name="1"></el-tab-pane>
</el-tabs>
<div v-show="auditStatus == 1" class="keyExplain">
字段说明<img src="~@/assets/img/DataCenter/question.png" alt="" />
</div>
</div>
<div class="bot-table">
<customs-table
ref="table"
:table-data="tableData"
:columns="columns"
:header-class="'newHeader'"
:list-loading="listLoading"
:current-page="pageIndex"
:total-count="total"
:page-sizes="pageSizes"
:page-size="pageSize"
@pageSizeChange="handleSizeChange"
@currentPageChange="handleCurrentChange"
/>
</div>
</div>
</div>
</template>
<script>
import CustomsTable from "@/components/CustomsTable"
import paginationMixin from "@/components/TabComponents/mixin"
export default {
components: {
CustomsTable,
},
mixins: [paginationMixin],
data() {
return {
type: "0",
auditStatus: "0",
listLoading: false,
columns: [
{
label: "医联体",
minWidth: 120,
value: "title",
},
{
label: "已审核(例)",
minWidth: 120,
value: "file",
},
{
label: "待审核(例)备份",
minWidth: 120,
value: "uploadTime",
},
{
label: "最新上报时间",
minWidth: 120,
value: "editTime",
},
{
label: "操作",
width: 220,
fixed: "right",
operType: "button",
operations: [
{
func: this.auditHandle,
label: "审核",
type: "text",
},
],
},
],
tableData: [
{
title: "第一个",
isOpen: true,
},
],
}
},
watch: {},
mounted() {},
methods: {
handleClick() {
console.log("type:" + this.type, "auditStatus" + this.auditStatus)
if (this.auditStatus == 1) {
this.columns[this.columns.length - 1].operations[0].label =
"修改审核意见"
} else {
this.columns[this.columns.length - 1].operations[0].label = "审核"
}
},
auditHandle(data, i) {
console.log(data, i)
},
},
}
</script>
<style lang="scss" scoped>
.audit-qualitycontrol {
padding: 20px 0;
.table-top-tab {
margin-bottom: 15px;
position: relative;
.keyExplain {
position: absolute;
display: flex;
align-items: center;
right: 0;
top: 10%;
font-size: 16px;
font-family: AlibabaPuHuiTiR;
color: #999999;
img {
width: 18px;
height: 18px;
margin-left: 5px;
transform: translateY(1px);
}
}
}
.aq-bot-table {
padding: 20px;
::v-deep {
.el-tabs__nav {
border: none;
}
.el-tabs__item {
margin-right: 10px;
border: 1px solid #e4e7ed;
border-radius: 5px 5px 0 0;
}
.is-active {
background: #4e68ff;
color: #fff;
}
}
}
}
::v-deep {
.el-tabs__item {
padding-left: 20px !important;
font-size: 18px;
font-family: AlibabaPuHuiTiM;
}
.is-active {
color: #4e68ff;
}
}
</style>
<template>
<div>体检</div>
</template>
<script>
export default {
data() {
return {}
},
methods: {},
mounted() {},
watch: {},
}
</script>
<style lang="scss" scoped></style>
<template>
<div>医院质控</div>
</template>
<script>
export default {
data() {
return {}
},
methods: {},
mounted() {},
watch: {},
}
</script>
<style lang="scss" scoped></style>
<template>
<div class="dataCenter">
<div class="header">
<div
v-for="(item, index) in headList"
:key="index"
:class="['btn', selectedIndex == index ? 'active' : '']"
@click="setSelectedIndex(index)"
>
{{ item }}
</div>
</div>
<customs-table
ref="table"
:table-data="tableData"
:columns="columns"
:header-class="'newHeader'"
:list-loading="listLoading"
:current-page="pageIndex"
:total-count="total"
:page-sizes="pageSizes"
:page-size="pageSize"
@pageSizeChange="handleSizeChange"
@currentPageChange="handleCurrentChange"
/>
</div>
</template>
<script>
import CustomsTable from "@/components/CustomsTable"
import paginationMixin from "@/components/TabComponents/mixin"
export default {
// 数据概览
name: "",
components: {
CustomsTable,
},
mixins: [paginationMixin],
data() {
return {
listLoading: false,
selectedIndex: sessionStorage.getItem("homeSelectedIndex") - 0 || 0,
headList: ["社区筛查", "医院筛查", "体检筛查"],
columns: [
{
label: "医联体",
minWidth: 120,
value: "name",
},
{
label: "累计上报量",
minWidth: 120,
value: "1",
},
{
label: "最近一季度上报量",
minWidth: 120,
value: "2",
},
{
label: "累计审核合格量",
minWidth: 120,
value: "3",
},
{
label: "高风险",
minWidth: 120,
value: "4",
},
{
label: "中风险",
minWidth: 120,
value: "5",
},
{
label: "低风险",
minWidth: 120,
value: "6",
},
{
label: "胃癌",
minWidth: 120,
value: "7",
},
{
label: "早期胃癌",
minWidth: 120,
value: "8",
},
{
label: "食道癌",
minWidth: 120,
value: "9",
},
],
tableData: [
{
name: "1",
1: 2,
},
],
}
},
watch: {},
mounted() {},
methods: {
setSelectedIndex(i) {
console.log(this.selectedIndex)
this.selectedIndex = i
sessionStorage.setItem("homeSelectedIndex", this.selectedIndex)
},
},
}
</script>
<style lang="scss" scoped>
.dataCenter {
padding: 24px;
height: 100%;
display: flex;
flex-direction: column;
.header {
display: flex;
margin-bottom: 20px;
.btn {
cursor: pointer;
width: 112px;
height: 48px;
background: #ffffff;
border-radius: 4px;
border: 1px solid #dddddd;
font-size: 16px;
font-family: AlibabaPuHuiTiM;
color: #000;
text-align: center;
line-height: 48px;
margin-right: 24px;
}
.active {
background: #4e68ff;
border: none;
color: #ffffff;
}
}
}
</style>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<template>
<div>2222</div>
</template>
<template>
<div>草稿箱</div>
</template>
<script>
export default {
data() {
return {}
},
methods: {},
mounted() {},
watch: {},
}
</script>
<style lang="scss" scoped></style>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<template>
<div>学术动态</div>
</template>
<script>
export default {
data() {
return {}
},
methods: {},
mounted() {},
watch: {},
}
</script>
<style lang="scss" scoped></style>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.