feat: 支持绑定外部 bt_toxin 数据库 (2025-11-04 更新)

- docker_client.py: run_bttoxin_digger() 新增 bttoxin_db_dir 参数,支持挂载外部数据库
- run_single_fna_pipeline.py: 新增 --bttoxin_db_dir 参数,自动检测 external_dbs/bt_toxin
- README.md: 添加 bttoxin_db 更新说明和 Docker 绑定文档
- external_dbs/bt_toxin: 添加 2025-11-04 版本数据库文件

测试验证: HAN055 样本毒素命名版本号变化 (Cry2Aa9→22, Cry2Ab35→41, Cry1Ia40→42, Vip3Aa7→79)
This commit is contained in:
2026-01-04 14:37:49 +08:00
parent 5883e13c56
commit 1c0e8f90a5
40 changed files with 166422 additions and 194 deletions

View File

@@ -1,41 +0,0 @@
<template>
<n-config-provider :theme="darkTheme">
<n-layout>
<n-layout-header bordered>
<n-space align="center" justify="space-between" style="padding: 16px">
<n-h2>BtToxin Pipeline</n-h2>
<n-menu mode="horizontal" :options="menuOptions" />
</n-space>
</n-layout-header>
<n-layout-content style="padding: 24px">
<router-view />
</n-layout-content>
<n-layout-footer bordered style="padding: 16px; text-align: center">
BtToxin Pipeline © 2025
</n-layout-footer>
</n-layout>
</n-config-provider>
</template>
<script setup>
import { darkTheme } from 'naive-ui'
import { h } from 'vue'
import { RouterLink } from 'vue-router'
const menuOptions = [
{
label: () => h(RouterLink, { to: '/' }, { default: () => 'Home' }),
key: 'home'
},
{
label: () => h(RouterLink, { to: '/upload' }, { default: () => 'Upload' }),
key: 'upload'
},
{
label: () => h(RouterLink, { to: '/jobs' }, { default: () => 'Jobs' }),
key: 'jobs'
}
]
</script>

View File

@@ -1,14 +0,0 @@
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import naive from 'naive-ui'
import App from './App.vue'
import router from './router'
const app = createApp(App)
const pinia = createPinia()
app.use(pinia)
app.use(router)
app.use(naive)
app.mount('#app')

View File

@@ -1,31 +0,0 @@
import { createRouter, createWebHistory } from 'vue-router'
const routes = [
{
path: '/',
name: 'Home',
component: () => import('./views/Home.vue')
},
{
path: '/upload',
name: 'Upload',
component: () => import('./views/Upload.vue')
},
{
path: '/jobs',
name: 'Jobs',
component: () => import('./views/Jobs.vue')
},
{
path: '/jobs/:id',
name: 'JobDetail',
component: () => import('./views/JobDetail.vue')
}
]
const router = createRouter({
history: createWebHistory(),
routes
})
export default router

View File

@@ -1,22 +0,0 @@
import axios from 'axios'
const api = axios.create({
baseURL: '/api/v1',
timeout: 30000
})
export default {
createJob(formData) {
return api.post('/jobs/create', formData, {
headers: { 'Content-Type': 'multipart/form-data' }
})
},
getJob(jobId) {
return api.get(`/jobs/${jobId}`)
},
getJobProgress(jobId) {
return api.get(`/jobs/${jobId}/progress`)
}
}

View File

@@ -1,7 +0,0 @@
<template>
<n-space vertical size="large">
<n-card title="Welcome to BtToxin Pipeline">
<p>Automated Bacillus thuringiensis toxin mining system</p>
</n-card>
</n-space>
</template>

View File

@@ -1,5 +0,0 @@
<template>
<n-card title="Job Details">
<p>Job ID: {{ $route.params.id }}</p>
</n-card>
</template>

View File

@@ -1,5 +0,0 @@
<template>
<n-card title="Job List">
<n-empty description="No jobs yet" />
</n-card>
</template>

View File

@@ -1,7 +0,0 @@
<template>
<n-card title="Upload Genome Files">
<n-upload multiple>
<n-button>Select Files</n-button>
</n-upload>
</n-card>
</template>