Browse Source

标签页

master
luobinjie 4 months ago
parent
commit
3067b27c3b
  1. 243
      src/components/common/CommonTab.vue
  2. 8
      src/components/common/LocalConfig.vue
  3. 10
      src/main.js
  4. 36
      src/router/index.js
  5. 30
      src/store/index.js
  6. 24
      src/views/Home.vue

243
src/components/common/CommonTab.vue

@ -0,0 +1,243 @@
<template>
<div class="tags-list" ref="totalLists">
<div
class="arrow-icon"
@click="arrowBack"
style="position: fixed; left: 4px"
>
<el-button
size="medium"
icon="el-icon-arrow-left"
:disabled="isLeftDisabled"
></el-button>
</div>
<div class="tag-style" ref="tagBox">
<div class="scrollWrapper" ref="scrollWrapper" id="nav">
<el-tag
:key="tag.displayName"
size="medium"
v-for="(tag, index) in tags"
:closable="true"
:disable-transitions="false"
@close="handleClose(tag, index)"
@click="changeMenu(tag)"
:effect="$route.name === tag.displayName ? 'dark' : 'plain'"
>
{{ tag.displayName }}
</el-tag>
</div>
</div>
<div
class="arrow-icon"
@click="arrowForward"
style="position: fixed; right: 4px"
>
<el-button
size="medium"
icon="el-icon-arrow-right"
:disabled="isRightDisabled"
></el-button>
</div>
</div>
</template>
<script>
import { mapState, mapMutations } from "vuex";
export default {
data() {
return {
scrollWrapper: null,
isLeftDisabled: false,
isRightDisabled: false,
};
},
computed: {
...mapState({
tags: (state) => state.tabsList,
}),
},
watch: {
$route: {
handler(val) {
this.updateButtonStates();
this.scrollToActiveTag();
},
//
deep: true,
},
},
mounted() {
this.scrollWrapper = this.$refs.scrollWrapper;
this.$nextTick(() => {
this.updateButtonStates();
});
this.scrollWrapper.addEventListener("scroll", this.handleScroll);
window.addEventListener("resize", this.updateButtonStates);
},
beforeDestroy() {
//
if (this.scrollWrapper) {
this.scrollWrapper.removeEventListener("scroll", this.handleScroll);
}
window.removeEventListener("resize", this.updateButtonStates);
},
methods: {
...mapMutations({
close: "closeTab",
}),
handleScroll() {
// 使 setTimeout
setTimeout(() => {
this.updateButtonStates();
}, 50);
},
//
arrowBack() {
this.$refs.scrollWrapper.scrollBy({ left: -300, behavior: "smooth" });
},
//
arrowForward() {
this.$refs.scrollWrapper.scrollBy({ left: 300, behavior: "smooth" });
},
updateButtonStates() {
const { scrollLeft, scrollWidth, clientWidth } = this.scrollWrapper;
this.isLeftDisabled = scrollLeft <= 0;
this.isRightDisabled = scrollLeft + clientWidth >= scrollWidth - 1;
},
scrollToActiveTag() {
this.$nextTick(() => {
// effect'dark'
const scrollWrapper = this.$refs.scrollWrapper;
const tagElements = scrollWrapper.querySelectorAll('.el-tag');
//
let activeTag = null;
for (let i = 0; i < tagElements.length; i++) {
const tagElement = tagElements[i];
//
const tagText = tagElement.textContent ? tagElement.textContent.trim() : '';
//
if (tagText === this.$route.name) {
activeTag = tagElement;
break;
}
}
if (activeTag) {
const tagPosition = activeTag.offsetLeft;
const tagWidth = activeTag.offsetWidth;
// 使
const scrollTo = tagPosition - (scrollWrapper.clientWidth - tagWidth) / 2;
scrollWrapper.scrollTo({
left: scrollTo,
behavior: 'smooth'
});
//
setTimeout(() => {
this.updateButtonStates();
}, 150);
}
});
},
handleClose(tag, index) {
let length = this.tags.length - 1;
this.close(tag);
//
if (tag.displayName !== this.$route.name) {
this.handleScroll();
return;
}
//
if (index === length) {
if (this.tags[index - 1]) {
this.$router.push({ path: this.tags[index - 1].routeUrl });
} else {
this.$router.push({ path: "/home" });
}
} else {
//
this.$router.push({ path: this.tags[index].routeUrl });
}
this.handleScroll();
},
changeMenu(item) {
if (item.displayName !== this.$route.name) {
this.$router.push({ path: item.routeUrl });
} else {
// this.$message({
// message: '',
// type: 'error'
// });
}
this.$nextTick(() => {
this.scrollToActiveTag();
});
},
async clearControlLabel() {
await this.$store.commit("clearMenuTab");
this.$router.push({ path: "/home" });
},
},
};
</script>
<style scoped lang="scss">
@import '../../assets/css/global_button.css';
.tags-list {
display: flex;
align-items: center;
position: fixed;
top: 50px;
width: 100%;
height: 36px;
background: #fff;
border-bottom: 1px solid #d8dce5;
box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12), 0 0 3px 0 rgba(0, 0, 0, 0.04);
padding-bottom: 0;
}
.tag-style {
display: flex;
align-items: center;
overflow: hidden;
pointer-events: all;
cursor: pointer;
position: relative;
margin: 0 64px;
}
.scrollWrapper {
display: flex;
align-items: center;
overflow-x: auto;
transition: all 500ms linear;
}
.scrollWrapper::-webkit-scrollbar {
height: 0;
}
.el-tag {
margin: 0 5px;
cursor: pointer;
padding: 0 0px 0 10px;
}
.el-tag .el-tag--info {
background: #fff;
}
::v-deep .el-tag .el-icon-close {
right: 0px;
}
.arrow-icon {
pointer-events: all;
cursor: pointer;
}
.arrow-style {
font-size: 16px;
padding: 0 8px;
position: relative;
top: 8px;
}
.arrow-icon .el-button {
padding: 0px 5px;
height: 28px;
}
</style>

8
src/components/common/LocalConfig.vue

@ -7,11 +7,16 @@
<el-tab-pane label="常规设置"> <el-tab-pane label="常规设置">
<el-form label-width="140px" size="size"> <el-form label-width="140px" size="size">
<el-row> <el-row>
<el-col :span="12">
<el-col :span="6">
<el-form-item label="显示调试工具"> <el-form-item label="显示调试工具">
<el-checkbox v-model="LocalConfig.normal.isDevTool" size="small" /> <el-checkbox v-model="LocalConfig.normal.isDevTool" size="small" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6">
<el-form-item label="显示标签页">
<el-checkbox v-model="LocalConfig.normal.displayTab" size="small" />
</el-form-item>
</el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="分页时单页记录数"> <el-form-item label="分页时单页记录数">
<el-input type="number" v-model="LocalConfig.normal.maxResultCount" size="small" /> <el-input type="number" v-model="LocalConfig.normal.maxResultCount" size="small" />
@ -248,6 +253,7 @@ export default {
maxResultCount: 100, // maxResultCount: 100, //
PatientRegisterEdit: 'standard', //standard/qztl PatientRegisterEdit: 'standard', //standard/qztl
PatientRegisterEditHeight: 0, // PatientRegisterEditHeight: 0, //
displayTab:false //
}, },
patientRegister: { patientRegister: {
edit: 'standard', //standard/qztl edit: 'standard', //standard/qztl

10
src/main.js

@ -111,8 +111,16 @@ new Vue({
window.addEventListener('resize', onResize); window.addEventListener('resize', onResize);
function onResize() { function onResize() {
//console.log(document.body.clientHeight,'-document.body.clientHeight-',window.innerHeight)
let LocalConfig = JSON.parse(window.localStorage.getItem("LocalConfig")) || null
try {
if(LocalConfig.normal.displayTab){
store.commit('setData', { key: 'window.pageHeight', value: window.innerHeight-36 })
}else{
store.commit('setData', { key: 'window.pageHeight', value: window.innerHeight }) store.commit('setData', { key: 'window.pageHeight', value: window.innerHeight })
}
} catch (error) {
console.log('window.localStorage.getItem("LocalConfig")', error)
}
store.commit('setData', { key: 'window.pageWidth', value: window.innerWidth }) store.commit('setData', { key: 'window.pageWidth', value: window.innerWidth })
} }
onResize(); onResize();

36
src/router/index.js

@ -1,6 +1,7 @@
import Vue from "vue"; import Vue from "vue";
import VueRouter from "vue-router"; import VueRouter from "vue-router";
import vuex from "vuex" import vuex from "vuex"
import store from "../store";
// import HomeView from "../views/HomeView.vue"; // import HomeView from "../views/HomeView.vue";
import login from "@/views/login/Login.vue"; import login from "@/views/login/Login.vue";
@ -293,7 +294,7 @@ const routes = [{
}, },
{ {
path: "/cardBill", path: "/cardBill",
name: "会员卡记账",
name: "会员卡记账记录",
component: () => component: () =>
import ("../views/fee-settings/cardBill.vue"), import ("../views/fee-settings/cardBill.vue"),
}, },
@ -423,7 +424,7 @@ const routes = [{
}, },
{ {
path: "/customerOrgGroup", path: "/customerOrgGroup",
name: "单位分组设置",
name: "体检单位分组",
component: () => component: () =>
import ("../views/customerOrg/customerOrgGroup.vue"), import ("../views/customerOrg/customerOrgGroup.vue"),
}, },
@ -441,7 +442,7 @@ const routes = [{
}, },
{ {
path: "/patientRegisterBatch", path: "/patientRegisterBatch",
name: "人员批量登记",
name: "人员批量登记",
component: () => component: () =>
import ("../views/customerOrg/patientRegisterImport.vue"), //../views/doctorCheck/personnelBatch.vue import ("../views/customerOrg/patientRegisterImport.vue"), //../views/doctorCheck/personnelBatch.vue
}, },
@ -471,7 +472,7 @@ const routes = [{
}, },
{ {
path: "/patientLis", path: "/patientLis",
name: "检验条码打印",
name: "条码打印",
component: () => component: () =>
import ("../views/customerOrg/patientLis.vue"), import ("../views/customerOrg/patientLis.vue"),
}, },
@ -583,7 +584,7 @@ const routes = [{
}, },
{ {
path: "/recoverQuery", path: "/recoverQuery",
name: "回收表查询",
name: "回收表查询",
component: () => component: () =>
import ("../components/patientRegister/patientRegisterRecoverListQuery.vue"), import ("../components/patientRegister/patientRegisterRecoverListQuery.vue"),
}, },
@ -612,7 +613,7 @@ const routes = [{
}, },
{ {
path: "/positiveResultsList", path: "/positiveResultsList",
name: "阳性结果清单",
name: "阳性结果人员",
component: () => component: () =>
import ("../views/customerReport/positiveResultsList.vue"), import ("../views/customerReport/positiveResultsList.vue"),
}, },
@ -654,7 +655,7 @@ const routes = [{
}, },
{ {
path: "/unitStatistics", path: "/unitStatistics",
name: "单位体检统计",
name: "单位费用汇总",
component: () => component: () =>
import ("../views/customerReport/unitStatistics.vue") import ("../views/customerReport/unitStatistics.vue")
}, },
@ -667,49 +668,49 @@ const routes = [{
//---------------------- 工作量登记 ---------------------- //---------------------- 工作量登记 ----------------------
{ {
path: "/registrar", path: "/registrar",
name: "登记员工作量",
name: "登记员工作量统计",
component: () => component: () =>
import ("../views/workload/registrar.vue"), import ("../views/workload/registrar.vue"),
}, },
{ {
path: "/doctorstaionworkload", path: "/doctorstaionworkload",
name: "医生工作量",
name: "医生工作量统计",
component: () => component: () =>
import ("../views/workload/doctorstaionworkload.vue"), import ("../views/workload/doctorstaionworkload.vue"),
}, },
{ {
path: "/directordoctor", path: "/directordoctor",
name: "总检医生工作量",
name: "总检医生工作量统计",
component: () => component: () =>
import ("../views/workload/directordoctor.vue"), import ("../views/workload/directordoctor.vue"),
}, },
{ {
path: "/examinedoctor", path: "/examinedoctor",
name: "审核医生工作量",
name: "审核医生工作量统计",
component: () => component: () =>
import ("../views/workload/examinedoctor.vue"), import ("../views/workload/examinedoctor.vue"),
}, },
{ {
path: "/peisworkload", path: "/peisworkload",
name: "体检工作量",
name: "体检工作量统计",
component: () => component: () =>
import ("../views/workload/peisworkload.vue"), import ("../views/workload/peisworkload.vue"),
}, },
{ {
path: "/deskwork", path: "/deskwork",
name: "科室工作量",
name: "科室工作量统计",
component: () => component: () =>
import ("../views/workload/deskwork.vue"), import ("../views/workload/deskwork.vue"),
}, },
{ {
path: "/collectionbloodnurse", path: "/collectionbloodnurse",
name: "采血护士工作量",
name: "采血护士工作量统计",
component: () => component: () =>
import ("../views/workload/collectionbloodnurse.vue"), import ("../views/workload/collectionbloodnurse.vue"),
}, },
{ {
path: "/tollcollector", path: "/tollcollector",
name: "收费员",
name: "收费员报表",
component: () => component: () =>
import ("../views/workload/tollcollector.vue"), import ("../views/workload/tollcollector.vue"),
}, },
@ -751,7 +752,7 @@ const routes = [{
}, },
{ {
path: "/membershipcard", path: "/membershipcard",
name: "会员卡分类统计",
name: "会员卡收费统计",
component: () => component: () =>
import ("../views/workload/membershipcard.vue"), import ("../views/workload/membershipcard.vue"),
}, },
@ -771,7 +772,7 @@ const routes = [{
}, },
{ {
path: "/ResultTemplate", path: "/ResultTemplate",
name: "词条模",
name: "词条模",
component: () => component: () =>
import ("../views/fee-settings/BigtextResultTemplate.vue"), import ("../views/fee-settings/BigtextResultTemplate.vue"),
}, },
@ -792,6 +793,7 @@ const router = new VueRouter({
}); });
router.beforeEach((to, from, next) => { router.beforeEach((to, from, next) => {
store.commit('getMenu')
let token = window.sessionStorage.getItem("token"); let token = window.sessionStorage.getItem("token");
let tokentype = window.sessionStorage.getItem("tokentype"); let tokentype = window.sessionStorage.getItem("tokentype");
if (to.path == "/login") { if (to.path == "/login") {

30
src/store/index.js

@ -7,6 +7,8 @@ Vue.use(Vuex);
export default new Vuex.Store({ export default new Vuex.Store({
state: { state: {
tabsList: [
],
sysConfig: { apiurl: '' }, // sysConfig: { apiurl: '' }, //
pickerOptions: { pickerOptions: {
disabledDate(time) { disabledDate(time) {
@ -213,7 +215,6 @@ export default new Vuex.Store({
patientName: '', //姓名 patientName: '', //姓名
sex: '', //性别 sex: '', //性别
idCardNo: '', //身份证号 idCardNo: '', //身份证号
phone:'', // 手机号
isReportPrint:'', // 报告是否打印 isReportPrint:'', // 报告是否打印
isSeries: 'N', isSeries: 'N',
isSmsComplete: "N", isSmsComplete: "N",
@ -550,8 +551,6 @@ export default new Vuex.Store({
asbItemAll: [], //所有未选组合项目 asbItemAll: [], //所有未选组合项目
}, },
copyGroupAsbitem:[], //单位设置 复制/粘贴 用
doctorCutPics:[], // 医生诊台剪切图片用 doctorCutPics:[], // 医生诊台剪切图片用
sumCutRows:[], // 总检剪切诊断用 sumCutRows:[], // 总检剪切诊断用
@ -648,6 +647,27 @@ export default new Vuex.Store({
patientId: '', //人员档案ID patientId: '', //人员档案ID
} //人员体检登记显示基本信息 } //人员体检登记显示基本信息
}, },
selectMenu(state, val) {
let result = state.tabsList.findIndex(item => item.displayName === val.displayName)
result === -1 ? state.tabsList.push(val) : ''
sessionStorage.setItem('tagList', JSON.stringify(state.tabsList))
},
closeTab(state, val) {
let result = state.tabsList.findIndex(item => item.displayName === val.displayName)
state.tabsList.splice(result, 1)
sessionStorage.setItem('tagList', JSON.stringify(state.tabsList))
},
getMenu(state) {
if (sessionStorage.getItem('tagList')) {
let tagList = JSON.parse(sessionStorage.getItem('tagList'))
state.tabsList = tagList
}
},
clearMenuTab(state) {
//清除标签
state.tabsList = []
sessionStorage.removeItem('tagList')
},
}, },
actions: { actions: {
@ -718,5 +738,7 @@ export default new Vuex.Store({
// }); // });
// }, // },
}, },
modules: {},
modules: {
},
}); });

24
src/views/Home.vue

@ -143,8 +143,16 @@
<el-button type="primary" @click="determine"> </el-button> <el-button type="primary" @click="determine"> </el-button>
</span> </span>
</el-dialog> </el-dialog>
<el-container>
<el-main>
<el-container v-if="LocalConfig.normal.displayTab">
<common-tab></common-tab>
<el-main style="margin-top: 84px;">
<keep-alive>
<router-view></router-view>
</keep-alive>
</el-main>
</el-container>
<el-container v-else>
<el-main style="margin-top: 50px;">
<router-view></router-view> <router-view></router-view>
</el-main> </el-main>
</el-container> </el-container>
@ -169,10 +177,12 @@ import { getTreeNode, madeTree } from "../utlis/tree";
import { deepCopy } from "@/utlis/proFunc"; import { deepCopy } from "@/utlis/proFunc";
import LocalConfig from "../components/common/LocalConfig.vue";; import LocalConfig from "../components/common/LocalConfig.vue";;
import { setDBCom, getDBCom, clearDBCom } from "../utlis/indexedDB"; import { setDBCom, getDBCom, clearDBCom } from "../utlis/indexedDB";
import CommonTab from '../components/common/CommonTab.vue'
export default { export default {
components: { components: {
LocalConfig, LocalConfig,
CommonTab
}, },
data() { data() {
return { return {
@ -200,6 +210,7 @@ export default {
LocalConfig: { LocalConfig: {
normal: { // normal: { //
isDevTool: false, // isDevTool: false, //
displayTab:false//
} }
}, },
LocalConfigInit: {}, LocalConfigInit: {},
@ -267,7 +278,10 @@ export default {
// console.log(key, keyPath); // console.log(key, keyPath);
// tree: any, childNodeName: any, idName: any, idVal: any // tree: any, childNodeName: any, idName: any, idVal: any
let node = getTreeNode(this.menuPriv, "treeChildren", "id", key); let node = getTreeNode(this.menuPriv, "treeChildren", "id", key);
if (node && this.$route.path !== '/' + node.routeUrl) this.$router.push({ path: node.routeUrl });
if (node && this.$route.path !== '/' + node.routeUrl){
this.$store.commit('selectMenu', node)
this.$router.push({ path: node.routeUrl });
}
}, },
// //
getUserAllPriv() { getUserAllPriv() {
@ -582,6 +596,7 @@ export default {
.el-container { .el-container {
/* position: fixed; */ /* position: fixed; */
width: 100%; width: 100%;
flex-direction: column;
} }
.el-menu { .el-menu {
@ -638,8 +653,7 @@ export default {
} }
.el-main { .el-main {
margin-top: 50px;
height: calc(100vh, -70px);
height: calc(100vh -200px);
} }
.el-menu-vertical-demo .el-menu { .el-menu-vertical-demo .el-menu {

Loading…
Cancel
Save