Fix(pipeline): optimize docker build, fix zip structure, and update UI

- Docker:
  - Explicitly install pixi environments (digger, pipeline, webbackend) during build to prevent runtime network/DNS failures.
  - Optimize pnpm config (copy method) to fix EAGAIN errors.
- Backend:
  - Refactor ZIP bundling: use flat semantic directories (1_Toxin_Mining, etc.).
  - Fix "nested zip" issue by cleaning existing archives before bundling.
  - Exclude raw 'context' directory from final download.
- Frontend:
  - Update TutorialView documentation to match new result structure.
  - Improve TaskMonitor progress bar precision (1 decimal place).
  - Update i18n (en/zh) for new file descriptions.

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
zly
2026-01-21 20:43:28 +08:00
parent 452e15c806
commit e44692600c
10 changed files with 158 additions and 38 deletions

View File

@@ -1,6 +1,4 @@
{
"nav": {
"home": "Home",
{ "nav": { "home": "Home",
"contact": "Contact",
"tool": "Prediction Tool",
"docs": "Documentation"
@@ -111,7 +109,23 @@
},
"output": {
"title": "Output Description",
"desc": "After analysis, you will receive a compressed package containing heatmaps and detailed data, including toxin hit lists, target score matrices, and visualization reports."
"desc": "After analysis, you will receive a compressed package containing heatmaps and detailed data, including toxin hit lists, target score matrices, and visualization reports.",
"structure": {
"title": "Result File Structure",
"desc": "The downloaded zip package contains the following directories:"
},
"files": {
"input_dir": "Original Input Files",
"mining_dir": "BtToxin_Digger Mining Results",
"all_toxins": "Core Result: Predicted Toxin Gene List",
"scoring_dir": "Shoter Toxicity Scoring Results",
"report": "Comprehensive Analysis Report (Markdown)",
"strain_heatmap": "Strain Target Activity Heatmap",
"hit_heatmap": "Single Sequence Activity Heatmap",
"strain_tsv": "Strain Target Score Raw Data",
"toxin_tsv": "Toxin Support Data",
"logs": "Execution Logs"
}
},
"note": {
"title": "About BtToxin_Shoter",

View File

@@ -101,7 +101,23 @@
},
"output": {
"title": "输出说明",
"desc": "分析完成后,您将获得一个包含热图和详细数据的压缩包,包括毒素命中列表、靶标评分矩阵和可视化报告。"
"desc": "分析完成后,您将获得一个包含热图和详细数据的压缩包,包括毒素命中列表、靶标评分矩阵和可视化报告。",
"structure": {
"title": "结果文件结构",
"desc": "下载的压缩包解压后包含以下目录:"
},
"files": {
"input_dir": "原始输入文件目录",
"mining_dir": "BtToxin_Digger 毒素挖掘结果",
"all_toxins": "核心结果:预测到的毒素基因列表",
"scoring_dir": "Shoter 毒性评分结果",
"report": "综合分析报告 (Markdown)",
"strain_heatmap": "菌株靶标活性评分热图",
"hit_heatmap": "单序列活性评分热图",
"strain_tsv": "菌株靶标评分原始数据",
"toxin_tsv": "毒素支持度数据",
"logs": "运行日志目录"
}
},
"note": {
"title": "关于 BtToxin_Shoter",

View File

@@ -62,12 +62,12 @@
<!-- Progress Bar (only for running) -->
<div v-if="taskStatus.status === 'running'" class="progress-section">
<el-progress
:percentage="simulatedProgress"
:percentage="Number(simulatedProgress.toFixed(1))"
:status="getProgressStatus(taskStatus.status)"
:stroke-width="20"
:show-text="true"
/>
<span class="progress-text">{{ $t('status.running.progress', { percent: simulatedProgress }) }}</span>
<span class="progress-text">{{ $t('status.running.progress', { percent: simulatedProgress.toFixed(1) }) }}</span>
</div>
<!-- Estimated Time (only for running) -->

View File

@@ -145,18 +145,19 @@ const { t } = useI18n()
<el-card class="file-tree-card">
<pre class="file-tree">
pipeline_results.zip
<span class="folder">digger/</span>
pipeline_results_{id}.zip
<span class="folder">Input/</span> # {{ t('tutorial.output.files.input_dir') }}
<span class="file">filename.fna</span>
<span class="folder">1_Toxin_Mining/</span> # {{ t('tutorial.output.files.mining_dir') }}
<span class="folder">Results/Toxins/</span>
<span class="file">All_Toxins.txt</span> # {{ t('tutorial.output.files.all_toxins') }}
...
<span class="folder">shotter/</span>
<span class="folder">2_Toxicity_Scoring/</span> # {{ t('tutorial.output.files.scoring_dir') }}
<span class="file">shotter_report.md</span> # {{ t('tutorial.output.files.report') }}
<span class="file">strain_target_scores.png</span> # {{ t('tutorial.output.files.strain_heatmap') }}
<span class="file">per_hit_{id}.png</span> # {{ t('tutorial.output.files.hit_heatmap') }}
<span class="file">shotter_report.md</span> # {{ t('tutorial.output.files.report') }}
<span class="file">strain_target_scores.tsv</span> # {{ t('tutorial.output.files.strain_tsv') }}
<span class="file">toxin_support.tsv</span> # {{ t('tutorial.output.files.toxin_tsv') }}
<span class="folder">logs/</span> # {{ t('tutorial.output.files.logs') }}
...
<span class="folder">Logs/</span> # {{ t('tutorial.output.files.logs') }}
</pre>
</el-card>
</div>