Home.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. <template>
  2. <div class="about">
  3. <v-header />
  4. <v-sidetree />
  5. <div class="content-box" :class="{ 'content-collapse': collapse }">
  6. <el-tabs type="card" v-model="activeTab" closable class="tabWrap" @tab-remove="removeTabHandle">
  7. <el-tab-pane v-for="(item, index) in menuTabs" :key="item.name" :label="item.title" :name="item.name">
  8. <transition name="fade">
  9. <component :is="item.content"/>
  10. </transition>
  11. </el-tab-pane>
  12. </el-tabs>
  13. </div>
  14. </div>
  15. </template>
  16. <script setup>
  17. import { watch,ref,markRaw,h} from "vue"
  18. import vHeader from "../components/Header.vue"
  19. import vSidetree from "../components/Sidetree.vue"
  20. import { storeToRefs } from 'pinia'
  21. import { useHomeStore } from "../store/home.js"
  22. import app from '../utils/app.js'
  23. import {ElMessageBox,ElMessage} from 'element-plus'
  24. import loginAPI from "../api/login.js"
  25. const store=useHomeStore()
  26. const { collapse ,currentMenu,menuTabs,activeTab} = storeToRefs(store)
  27. const removeTabHandle=(tabId)=>{
  28. store.closeTab(tabId)
  29. }
  30. watch(currentMenu,async(newMenu,oldMenu) => {
  31. if(!newMenu||!newMenu.menuLink){
  32. return
  33. }
  34. loadMenuPage(newMenu.menuLink).then(component => {
  35. newMenu["content"]=markRaw(component.default)
  36. store.addTab(newMenu)
  37. }).catch(e=>{
  38. console.log(e)
  39. })
  40. })
  41. const loadMenuPage=(val)=>import(/* @vite-ignore */`/src/pages/${val}`)
  42. watch(
  43. ()=>store.connStatus
  44. ,(newVal,oldVal)=>{
  45. if(newVal!=401){
  46. return
  47. }
  48. openRelogin()
  49. })
  50. const openRelogin=()=>{
  51. return ElMessageBox.prompt('登录已失效,请重新登录',null,{
  52. showCancelButton:false,
  53. showInput:true,
  54. inputType:'password',
  55. inputPlaceholder:'请输入密码',
  56. inputPattern:/\S+/,
  57. inputErrorMessage:'密码不能为空',
  58. closeOnClickModal:false,
  59. beforeClose: async (action, instance, done) => {
  60. //console.log(action)
  61. //console.log(instance.inputValue)
  62. instance.confirmButtonLoading = true
  63. try{
  64. let resp=await loginAPI.checkLogin({loginId:app.takeSetting('loginId'),pwd:instance.inputValue})
  65. done()
  66. }
  67. catch(err){
  68. instance.confirmButtonLoading=false
  69. ElMessage.error(err);
  70. console.log(err)
  71. }
  72. }
  73. })
  74. }
  75. </script>
  76. <style scoped>
  77. .tabWrap{
  78. height:100%;
  79. }
  80. .tabWrap:deep(.el-tabs__content){
  81. height: calc(100% - 58px);
  82. overflow:auto;
  83. }
  84. .tabWrap:deep(.el-tabs__content .el-tab-pane){
  85. height:100%;
  86. }
  87. .content-box:deep(.el-tabs--card>.el-tabs__header .el-tabs__item .is-icon-close){
  88. top:-10px !important;
  89. right:-10px !important;
  90. /* width:14px; */
  91. /* visibility: hidden; */
  92. }
  93. /* .content-box:deep(.el-tabs--card>.el-tabs__header .el-tabs__item:hover){
  94. padding:0 20px;
  95. } */
  96. </style>