- 覆盖颗粒度只在 3 个入口: router targets / module routes / field registry - 框架内 .vue 之间互相引用全部硬编码静态 import,resolveVue/defineAsyncComponent 退出 .vue 文件 - 修 components/fields/FieldRelativeTime.vue 的 ../VueAdmin → ../../VueAdmin (移动后未跟改)
68 lines
1.5 KiB
Vue
68 lines
1.5 KiB
Vue
<template>
|
|
<div class="op-log-page">
|
|
<div v-if="user" class="page-header">
|
|
<span class="page-subtitle">{{ user.nickname || user.username }}</span>
|
|
</div>
|
|
<div class="page-body">
|
|
<ShrimpTable v-if="userId" :key="userId" moduleKey="operationLog" />
|
|
<el-empty v-else :description="t('base.notFound')" />
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script lang="ts" setup>
|
|
import { ref, computed, onMounted, watch } from 'vue'
|
|
import { useRoute } from 'vue-router'
|
|
import { useI18n } from 'vue-i18n'
|
|
import { vueAdmin } from '../../VueAdmin'
|
|
import ShrimpTable from '../../components/ShrimpTable.vue'
|
|
|
|
const route = useRoute()
|
|
const { t } = useI18n()
|
|
|
|
const userId = computed(() => route.query.id as string)
|
|
const user = ref<any>(null)
|
|
|
|
async function loadUser() {
|
|
if (!userId.value) {
|
|
user.value = null
|
|
return
|
|
}
|
|
try {
|
|
const api = vueAdmin.getModule<any>('user')
|
|
user.value = await api.get(userId.value)
|
|
} catch (e: any) {
|
|
console.warn('[operationLog] load user failed', e?.message || e)
|
|
}
|
|
}
|
|
|
|
watch(userId, loadUser)
|
|
onMounted(loadUser)
|
|
</script>
|
|
|
|
<style scoped>
|
|
.op-log-page {
|
|
display: flex;
|
|
flex-direction: column;
|
|
height: 100%;
|
|
width: 100%;
|
|
}
|
|
|
|
.page-header {
|
|
padding: 8px 16px;
|
|
border-bottom: 1px solid var(--el-border-color-lighter);
|
|
background: var(--el-bg-color);
|
|
}
|
|
|
|
.page-subtitle {
|
|
color: var(--el-text-color-secondary);
|
|
font-size: 13px;
|
|
}
|
|
|
|
.page-body {
|
|
flex: 1;
|
|
overflow: auto;
|
|
min-height: 0;
|
|
}
|
|
</style>
|