Browse Source

errors handled

pull/300/head v1.14.1
yedf2 4 years ago
parent
commit
f220d4c75a
  1. 1
      admin/src/components.d.ts
  2. 24
      admin/src/layout/components/content.vue
  3. 20
      admin/src/main.ts
  4. 4
      admin/src/store/modules/layout.ts
  5. 1
      admin/src/type/store/layout.ts
  6. 8
      admin/src/utils/util.ts

1
admin/src/components.d.ts

@ -5,6 +5,7 @@ import '@vue/runtime-core'
declare module '@vue/runtime-core' { declare module '@vue/runtime-core' {
export interface GlobalComponents { export interface GlobalComponents {
AAlert: typeof import('ant-design-vue/es')['Alert']
ABreadcrumb: typeof import('ant-design-vue/es')['Breadcrumb'] ABreadcrumb: typeof import('ant-design-vue/es')['Breadcrumb']
ABreadcrumbItem: typeof import('ant-design-vue/es')['BreadcrumbItem'] ABreadcrumbItem: typeof import('ant-design-vue/es')['BreadcrumbItem']
AButton: typeof import('ant-design-vue/es')['Button'] AButton: typeof import('ant-design-vue/es')['Button']

24
admin/src/layout/components/content.vue

@ -2,7 +2,19 @@
<router-view v-slot="{Component}"> <router-view v-slot="{Component}">
<transition name="fade-transform" mode="out-in"> <transition name="fade-transform" mode="out-in">
<keep-alive> <keep-alive>
<component :is="Component" :key="key" /> <div>
<a-alert
v-if="errLines[0]"
type="error"
closable
@close="onClose"
>
<template v-slot:description>
<span v-for="ln of errLines">{{ln}} <br/> </span>
</template>
</a-alert>
<component :is="Component" :key="key" />
</div>
</keep-alive> </keep-alive>
</transition> </transition>
</router-view> </router-view>
@ -10,8 +22,18 @@
<script setup lang='ts'> <script setup lang='ts'>
import { computed } from 'vue' import { computed } from 'vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
import { sleep } from '/@/utils/util'
import { useLayoutStore } from '/@/store/modules/layout'
const route = useRoute() const route = useRoute()
const key = computed(() => route.path) const key = computed(() => route.path)
const layoutStore = useLayoutStore()
const errLines = computed(() => layoutStore.globalError.split("\n"))
const onClose = async (e: MouseEvent) => {
await sleep(1000)
layoutStore.setGlobalError("")
}
</script> </script>

20
admin/src/main.ts

@ -2,6 +2,7 @@ import { createApp } from 'vue'
import App from './App.vue' import App from './App.vue'
import router from '/@/router/index' import router from '/@/router/index'
import { pinia } from '/@/store' import { pinia } from '/@/store'
import { useLayoutStore } from '/@/store/modules/layout'
import '/@/permission' import '/@/permission'
import '/@/assets/css/index.css' import '/@/assets/css/index.css'
@ -11,3 +12,22 @@ const app = createApp(App)
app.use(router) app.use(router)
app.use(pinia) app.use(pinia)
app.mount('#app') app.mount('#app')
window.onunhandledrejection = (ev: PromiseRejectionEvent) => {
showAlert(ev.reason.stack || ev.reason.message)
}
window.onerror = err => {
if (typeof err === "string") {
return showAlert(err)
}
showAlert(JSON.stringify(err))
}
function showAlert(msg: string) {
let layout = useLayoutStore()
if (!layout.globalError) {
layout.setGlobalError(msg)
}
}

4
admin/src/store/modules/layout.ts

@ -13,6 +13,7 @@ export const useLayoutStore = defineStore({
isLoading: false isLoading: false
}, },
dtmVersion: "", dtmVersion: "",
globalError: "",
}), }),
getters: { getters: {
getMenubar(): IMenubar { getMenubar(): IMenubar {
@ -26,6 +27,9 @@ export const useLayoutStore = defineStore({
setRoutes(data: Array<IMenubarList>): void { setRoutes(data: Array<IMenubarList>): void {
this.menubar.menuList = data this.menubar.menuList = data
}, },
setGlobalError(err: string) {
this.globalError = err
},
concatAllowRoutes(): void { concatAllowRoutes(): void {
allowRouter.reverse().forEach(v => this.menubar.menuList.unshift(v)) allowRouter.reverse().forEach(v => this.menubar.menuList.unshift(v))
}, },

1
admin/src/type/store/layout.ts

@ -6,6 +6,7 @@ export interface ILayout {
menubar: IMenubar menubar: IMenubar
status: IStatus status: IStatus
dtmVersion: string dtmVersion: string
globalError: string
} }
export interface IStatus { export interface IStatus {

8
admin/src/utils/util.ts

@ -1,9 +1,9 @@
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
import { IMenubarList } from '../type/store/layout'; import { IMenubarList } from '../type/store/layout';
export const findCurrentMenubar = (menuList: IMenubarList[], root?:boolean) => { export const findCurrentMenubar = (menuList: IMenubarList[], root?: boolean) => {
const route = useRoute() const route = useRoute()
let arr:IMenubarList[] | IMenubarList = [] let arr: IMenubarList[] | IMenubarList = []
for (let i = 0; i < menuList.length; i++) { for (let i = 0; i < menuList.length; i++) {
const v = menuList[i]; const v = menuList[i];
const usePath = v.meta.activeMenu || v.redirect || v.path; const usePath = v.meta.activeMenu || v.redirect || v.path;
@ -21,3 +21,7 @@ export const findCurrentMenubar = (menuList: IMenubarList[], root?:boolean) => {
return arr return arr
} }
export const sleep = async (ms: number) => {
return new Promise(resolve => setTimeout(resolve, ms))
}
Loading…
Cancel
Save