2025-04-12 17:39:38 +08:00

192 lines
4.6 KiB
Vue

<template>
<div class="flex flex-col">
<Header class="bg-white">
<div
class="flex w-full flex-col gap-2 md:flex-row md:items-center md:justify-between"
>
<div class="flex flex-row items-center gap-2">
<!-- 标题 -->
<Breadcrumbs
:items="[
{ label: '开发工具', route: { name: 'Log Browser' } }, // Dev tools has no seperate page as its own, so it doesn't need a different route
{ label: '日志浏览器', route: { name: 'Log Browser' } }
]"
/>
</div>
<div class="flex flex-row gap-2">
<FormControl
class="w-20"
type="select"
:options="[
{
label: '选择模式',
disabled: true
},
{
label: '工作台',
value: 'bench'
},
{
label: '站点',
value: 'site'
}
]"
:modelValue="mode"
@update:modelValue="
e => $router.push({ name: 'Log Browser', params: { mode: e } })
"
/>
<LinkControl
v-show="mode === 'site'"
:options="{
pagetype: 'Site',
filters: { status: 'Active' },
initialData: [{ label: site, value: site }]
}"
placeholder="选择一个站点"
:modelValue="site"
@update:modelValue="
site => {
this.site = site;
$router.push({
name: 'Log Browser',
params: { mode: 'site', docName: site }
});
}
"
/>
<LinkControl
class="w-52"
v-show="mode === 'bench'"
:options="{
pagetype: 'Bench',
filters: { status: 'Active' },
initialData: [
{
label: bench,
value: bench
}
]
}"
placeholder="选择一个工作台"
:modelValue="bench"
@update:modelValue="
bench => {
this.bench = bench;
$router.push({
name: 'Log Browser',
params: { mode: 'bench', docName: bench }
});
}
"
/>
<Tooltip text="这是一个实验性功能">
<div class="rounded-md bg-purple-100 p-1.5">
<i-lucide-flask-conical class="h-4 w-4 text-purple-500" />
</div>
</Tooltip>
<Button
link="https://jingrow.com/docs/devtools/log-browser"
target="_blank"
>
<i-lucide-help-circle class="h-4 w-4" />
</Button>
</div>
</div>
</Header>
<div class="flex">
<div
v-if="(mode === 'bench' && !bench) || (mode === 'site' && !site)"
class="w-full"
>
<p
class="flex h-full min-h-[80vh] w-full items-center justify-center gap-2 text-gray-700"
>
选择一个{{ mode }}以查看日志
</p>
</div>
<div v-else-if="mode" class="flex h-full w-full">
<LogList :mode="mode" :docName="docName" />
<div class="m-4 flex h-full w-3/4 flex-col">
<div
v-if="$resources.log.loading"
class="flex h-full min-h-[90vh] w-full items-center justify-center gap-2 text-gray-700"
>
<Spinner class="h-4 w-4" />
<span> 正在获取日志... </span>
</div>
<ErrorMessage
v-else-if="$resources.log.error"
:message="$resources.log.error"
/>
<LogViewer v-else-if="logId" :log="log" />
<div
v-else
class="flex h-full min-h-[90vh] w-full items-center justify-center gap-2 text-gray-700"
>
选择一个日志以查看
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import Header from '../../../components/Header.vue';
import LinkControl from '../../../components/LinkControl.vue';
import LogList from './LogList.vue';
import LogViewer from './LogViewer.vue';
import { Breadcrumbs } from 'jingrow-ui';
export default {
components: {
Header,
LogList,
LogViewer,
LinkControl,
Breadcrumbs
},
props: {
mode: String,
logId: String,
docName: String
},
mounted() {
if (!this.mode) {
this.$router.push({ name: '日志浏览器', params: { mode: 'bench' } });
}
},
updated() {
if (!this.mode) {
this.$router.push({ name: '日志浏览器', params: { mode: 'bench' } });
}
},
data() {
return {
site: this.mode === 'site' ? this.docName : null || null,
bench: this.mode === 'bench' ? this.docName : null || null,
searchLogQuery: ''
};
},
resources: {
log() {
return {
url: 'jcloud.api.log_browser.get_log',
params: {
log_type: this.mode,
pg_name: this.docName,
log_name: this.logId
},
initialData: [],
auto: this.logId
};
}
},
computed: {
log() {
return this.$resources.log?.data;
}
}
};
</script>