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,12 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>BtToxin Pipeline</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>

View File

@@ -1,22 +0,0 @@
{
"name": "bttoxin-frontend",
"version": "1.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"vue": "^3.5.13",
"vue-router": "^4.5.0",
"pinia": "^2.3.0",
"axios": "^1.7.9",
"naive-ui": "^2.40.1",
"@vicons/ionicons5": "^0.12.0"
},
"devDependencies": {
"@vitejs/plugin-vue": "^5.2.1",
"vite": "^6.0.5"
}
}

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>

View File

@@ -1,21 +0,0 @@
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { fileURLToPath, URL } from 'node:url'
export default defineConfig({
plugins: [vue()],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
}
},
server: {
port: 3000,
proxy: {
'/api': {
target: 'http://localhost:8000',
changeOrigin: true
}
}
}
})