502 lines
18 KiB
HTML
502 lines
18 KiB
HTML
|
|
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>IDMCC : Intelligent Design of Microbial Culture Conditions</title>
|
|
<link rel="icon" href="/public/assets/images/logo.png" type="image/png">
|
|
<link rel="stylesheet" href="/public/css/Browse.css">
|
|
<link rel="stylesheet" href="/public/css/base.css">
|
|
<link rel="stylesheet" href="/public/css/layout.css">
|
|
<link rel="stylesheet" href="/public/assets/iconfont/iconfont.css">
|
|
<script src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js"></script>
|
|
<style>
|
|
.header .logo .title p {
|
|
color: #B3B3B3;
|
|
}
|
|
/* 桑基图容器样式 */
|
|
.sankey-container {
|
|
position: relative;
|
|
background: #fff;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.sankey-controls {
|
|
display: flex;
|
|
gap: 10px;
|
|
align-items: center;
|
|
position: absolute;
|
|
right: 35%;
|
|
top: 3%;
|
|
}
|
|
|
|
.history-btn {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 5px;
|
|
padding: 8px 16px;
|
|
background: linear-gradient(135deg, #3f7179, #2f545b);
|
|
color: white;
|
|
border: none;
|
|
border-radius: 4px;
|
|
cursor: pointer;
|
|
font-size: 14px;
|
|
transition: all 0.3s ease;
|
|
box-shadow: 0 2px 8px rgba(63, 113, 121, 0.3);
|
|
}
|
|
|
|
.history-btn:hover:not(:disabled) {
|
|
background: linear-gradient(135deg, #2f545b, #234651);
|
|
transform: translateY(-1px);
|
|
box-shadow: 0 4px 12px rgba(63, 113, 121, 0.4);
|
|
}
|
|
|
|
.history-btn:disabled {
|
|
background: #ccc;
|
|
cursor: not-allowed;
|
|
box-shadow: none;
|
|
}
|
|
|
|
.history-btn i {
|
|
font-size: 14px;
|
|
}
|
|
|
|
.filter-info {
|
|
padding: 10px 20px;
|
|
background: #f8f9fa;
|
|
border-top: 1px solid #dee2e6;
|
|
font-size: 14px;
|
|
color: #495057;
|
|
min-height: 20px;
|
|
}
|
|
|
|
.filter-info strong {
|
|
color: #2E5A61;
|
|
font-weight: 600;
|
|
}
|
|
|
|
.sankey-chart {
|
|
width: 100%;
|
|
height: 500px;
|
|
padding: 0 20px;
|
|
cursor: pointer;
|
|
}
|
|
|
|
/* 节点hover提示样式 */
|
|
.sankey-chart:hover {
|
|
cursor: pointer;
|
|
}
|
|
|
|
/* 统一的基础样式 */
|
|
* {
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
/* 统一的自适应设计 */
|
|
|
|
/* 大屏幕 (1400px+) */
|
|
@media (min-width: 1400px) {
|
|
.wrapper {
|
|
max-width: 1400px;
|
|
}
|
|
}
|
|
|
|
/* 中等屏幕 (992px - 1399px) */
|
|
@media (max-width: 1399px) {
|
|
.wrapper {
|
|
width: 95%;
|
|
}
|
|
|
|
.sankey-controls {
|
|
right: 30%;
|
|
}
|
|
}
|
|
|
|
/* 平板 (768px - 991px) */
|
|
@media (max-width: 991px) {
|
|
.wrapper {
|
|
width: 98%;
|
|
}
|
|
|
|
.sankey-controls {
|
|
right: 20%;
|
|
top: 2%;
|
|
}
|
|
|
|
.sankey-chart {
|
|
height: 450px;
|
|
padding: 0 15px;
|
|
}
|
|
}
|
|
|
|
/* 移动设备 (最大768px) */
|
|
@media (max-width: 768px) {
|
|
.wrapper {
|
|
width: 100%;
|
|
padding: 0 10px;
|
|
}
|
|
|
|
.sankey-header {
|
|
flex-direction: column;
|
|
gap: 10px;
|
|
align-items: flex-start;
|
|
}
|
|
|
|
.sankey-controls {
|
|
position: static;
|
|
right: auto;
|
|
top: auto;
|
|
width: 100%;
|
|
justify-content: flex-start;
|
|
margin-bottom: 10px;
|
|
}
|
|
|
|
.sankey-chart {
|
|
height: 400px;
|
|
padding: 0 10px;
|
|
}
|
|
|
|
.filter-info {
|
|
padding: 8px 15px;
|
|
font-size: 13px;
|
|
}
|
|
}
|
|
|
|
/* 小屏幕移动设备 (最大480px) */
|
|
@media (max-width: 480px) {
|
|
.wrapper {
|
|
padding: 0 5px;
|
|
}
|
|
|
|
.sankey-chart {
|
|
height: 300px;
|
|
padding: 0 5px;
|
|
}
|
|
|
|
.filter-info {
|
|
padding: 6px 10px;
|
|
font-size: 12px;
|
|
}
|
|
|
|
.history-btn {
|
|
padding: 6px 12px;
|
|
font-size: 12px;
|
|
}
|
|
}
|
|
|
|
/* 超小屏幕 (最大360px) */
|
|
@media (max-width: 360px) {
|
|
.sankey-chart {
|
|
height: 250px;
|
|
}
|
|
|
|
.history-btn {
|
|
padding: 5px 10px;
|
|
font-size: 11px;
|
|
}
|
|
}
|
|
|
|
/* 统一的标题样式 - 美化各个区域标题 */
|
|
.section-header {
|
|
display: flex;
|
|
padding: 10px 20px;
|
|
border-radius: 8px 8px 0 0;
|
|
}
|
|
|
|
/* 标题文字样式 */
|
|
.section-title {
|
|
font-size: 120%;
|
|
font-weight: 700;
|
|
color: #2E5A61;
|
|
}
|
|
|
|
/* 为各个容器添加边框和阴影 */
|
|
.filter, .statistics, .sankey-container, .table-container {
|
|
background: white;
|
|
overflow: hidden;
|
|
}
|
|
|
|
/* 刷新按钮样式优化 */
|
|
.refresh-btn {
|
|
background: linear-gradient(135deg, #3f7179, #2f545b);
|
|
box-shadow: 0 2px 8px rgba(63, 113, 121, 0.3);
|
|
}
|
|
|
|
.refresh-btn:hover {
|
|
background: linear-gradient(135deg, #2f545b, #234651);
|
|
box-shadow: 0 4px 12px rgba(63, 113, 121, 0.4);
|
|
}
|
|
|
|
/* 表格排序样式 */
|
|
.sortable-header {
|
|
cursor: pointer;
|
|
user-select: none;
|
|
position: relative;
|
|
padding-right: 20px !important;
|
|
transition: background-color 0.2s ease;
|
|
}
|
|
|
|
.sortable-header:hover {
|
|
background-color: #f8f9fa;
|
|
}
|
|
|
|
.sort-icon {
|
|
position: absolute;
|
|
right: 5px;
|
|
top: 50%;
|
|
transform: translateY(-50%);
|
|
font-size: 12px;
|
|
color: #999;
|
|
transition: color 0.2s ease;
|
|
}
|
|
|
|
.sortable-header.sort-asc .sort-icon:before {
|
|
content: '▲';
|
|
color: #28a745;
|
|
font-weight: bold;
|
|
}
|
|
|
|
.sortable-header.sort-desc .sort-icon:before {
|
|
content: '▼';
|
|
color: #dc3545;
|
|
font-weight: bold;
|
|
}
|
|
|
|
.sortable-header:not(.sort-asc):not(.sort-desc) .sort-icon:before {
|
|
content: '▲▼';
|
|
font-size: 10px;
|
|
color: #6c757d;
|
|
letter-spacing: -2px;
|
|
}
|
|
|
|
.sortable-header.sort-asc,
|
|
.sortable-header.sort-desc {
|
|
background-color: #e7f3ff;
|
|
}
|
|
|
|
/* 响应式设计 */
|
|
@media (max-width: 768px) {
|
|
.section-header {
|
|
padding: 12px 15px;
|
|
gap: 10px;
|
|
}
|
|
|
|
.section-title {
|
|
font-size: 18px;
|
|
}
|
|
|
|
.sortable-header {
|
|
padding-right: 15px !important;
|
|
}
|
|
|
|
.sort-icon {
|
|
right: 3px;
|
|
font-size: 10px;
|
|
}
|
|
}
|
|
</style>
|
|
|
|
</head>
|
|
<body>
|
|
<!-- 头部模块占位符 -->
|
|
<div id="header-placeholder"></div>
|
|
|
|
<!-- 内容 -->
|
|
<div class="content">
|
|
<div class="wrapper">
|
|
<div class="result">
|
|
<!-- 筛选工具栏 -->
|
|
<div class="filter">
|
|
<div class="section-header">
|
|
<h2 class="section-title">Browse Cultured Microbial Data</h2>
|
|
</div>
|
|
<div class="introduction">
|
|
<p>On this page, you can customize multiple filtering criteria to precisely retrieve microbial data stored in the database. The available filtering dimensions include:
|
|
Taxonomic Rank Filtering: Supports targeted searches by classification levels such as kingdom, phylum, class, order, family, genus, and species.
|
|
Cultivation pH Range Filtering: Enables selection of microorganisms within specific pH ranges (e.g., acidic, neutral, alkaline).
|
|
Cultivation Temperature Filtering: Allows filtering by temperature zones (e.g., psychrophilic, mesophilic, thermophilic).
|
|
Respiration Type Filtering: Differentiates metabolic characteristics including aerobic, anaerobic, and facultative anaerobic types.
|
|
This multi-dimensional filtering system empowers users to rapidly identify microbial resources tailored to experimental or research requirements.
|
|
</p>
|
|
</div>
|
|
|
|
<div class="filters-toolbar">
|
|
<div class="filter-group taxonomy-group">
|
|
<label for="taxonomy-filter">Taxonomy:</label>
|
|
<select id="taxonomy-filter" class="filter-select">
|
|
<option value="">All</option>
|
|
<option value="Domain">Domain</option>
|
|
<option value="Phylum">Phylum</option>
|
|
<option value="Class">Class</option>
|
|
<option value="Order">Order</option>
|
|
<option value="Family">Family</option>
|
|
<option value="Genus">Genus</option>
|
|
<option value="Species">Species</option>
|
|
</select>
|
|
</div>
|
|
<div class="filter-group microbial-group">
|
|
<label for="microbial-filter">Microbial:</label>
|
|
<div class="search-input-wrapper">
|
|
<input type="text" id="microbial-filter" placeholder="Search Microbial Name" class="filter-input">
|
|
</div>
|
|
</div>
|
|
|
|
<div class="filter-group ph-group">
|
|
<label for="ph-filter">pH:</label>
|
|
<input type="text" id="ph-filter" placeholder="e.g., 6.5-7.5" class="filter-input">
|
|
</div>
|
|
|
|
<div class="filter-group temp-group">
|
|
<label for="temp-filter">Temperature:</label>
|
|
<select id="temp-filter" class="filter-select">
|
|
<option value="">All</option>
|
|
<option value="mesophilic">Mesophilic</option>
|
|
<option value="thermophilic">Thermophilic</option>
|
|
<option value="psychrophilic">Psychrophilic</option>
|
|
</select>
|
|
</div>
|
|
|
|
<div class="filter-group o2-group">
|
|
<label for="o2-filter">O2 Type:</label>
|
|
<select id="o2-filter" class="filter-select">
|
|
<option value="">All Types</option>
|
|
<option value="aerobe">Aerobic</option>
|
|
<option value="anaerobe">Anaerobic</option>
|
|
<option value="facultative">Facultative</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- 桑基图容器 -->
|
|
<div class="sankey-container">
|
|
<div class="section-header">
|
|
<div class="header-content">
|
|
<h2 class="section-title">Distribution of Microbial Taxonomic Levels</h2>
|
|
</div>
|
|
<div class="sankey-controls">
|
|
<button id="history-back" class="history-btn" disabled>
|
|
<i class="iconfont icon-jiantou_shang" style="transform: rotate(-90deg);"></i>
|
|
Back
|
|
</button>
|
|
<button id="history-forward" class="history-btn" disabled>
|
|
Forward
|
|
<i class="iconfont icon-jiantou_shang" style="transform: rotate(90deg);"></i>
|
|
</button>
|
|
<button id="reset-filter" class="history-btn">
|
|
<i class="iconfont icon-shuaxin"></i>
|
|
Reset
|
|
</button>
|
|
</div>
|
|
</div>
|
|
<div id="sankey-chart" class="sankey-chart"></div>
|
|
<div id="current-filter-info" class="filter-info"></div>
|
|
</div>
|
|
<!-- 信息统计 -->
|
|
<div class="statistics">
|
|
<!-- 图表容器 - 水平排列 -->
|
|
<div class="charts-container">
|
|
<!-- 旭日图容器 -->
|
|
<div class="chart-wrapper">
|
|
<h3 class="taxonomy-title">Physical and chemical properties Distribution</h3>
|
|
<div id="sunburst-chart" style="width: 100%; height: 570px;"></div>
|
|
</div>
|
|
<!-- 营养图表容器 -->
|
|
<div class="chart-wrapper">
|
|
<div class="nutrition-container">
|
|
<h3 class="taxonomy-title">Nutrition utilization</h3>
|
|
<div class="taxonomy-chart-container">
|
|
<div class="taxonomy-total-badge" id="nutrition-total-badge">Total count: 0</div>
|
|
<div class="nutrition-grid-lines" id="nutrition-grid-lines"></div>
|
|
<div class="taxonomy-chart-content" id="nutrition-chart-content"></div>
|
|
<div class="taxonomy-x-axis">
|
|
<div class="nutrition-x-axis-labels" id="nutrition-x-axis-labels"></div>
|
|
<div class="count_x_axis">
|
|
<p>number of species</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- 详细信息 -->
|
|
<div class="table-container">
|
|
<div class="section-header">
|
|
<h2 class="section-title">Microbial Data Table</h2>
|
|
</div>
|
|
|
|
<table>
|
|
<thead>
|
|
<tr style="font-weight: 700; font-size: 100%;">
|
|
<th class="sortable-header" data-column="number">
|
|
Number
|
|
<span class="sort-icon"></span>
|
|
</th>
|
|
<th class="sortable-header" data-column="microbial">
|
|
Microbial
|
|
<span class="sort-icon"></span>
|
|
</th>
|
|
<th class="sortable-header" data-column="nutrition">
|
|
Nutritional combination
|
|
<span class="sort-icon"></span>
|
|
</th>
|
|
<th class="sortable-header" data-column="domain">
|
|
Taxo
|
|
<span class="sort-icon"></span>
|
|
</th>
|
|
<th class="sortable-header" data-column="ph">
|
|
pH
|
|
<span class="sort-icon"></span>
|
|
</th>
|
|
<th class="sortable-header" data-column="temperature">
|
|
Temperature
|
|
<span class="sort-icon"></span>
|
|
</th>
|
|
<th class="sortable-header" data-column="o2">
|
|
O2
|
|
<span class="sort-icon"></span>
|
|
</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody></tbody>
|
|
</table>
|
|
|
|
<!-- 表格底部控制区 -->
|
|
<div class="table-footer">
|
|
<div class="left-controls">
|
|
<span id="showing-text">Showing 1 to 20 of 155 entries.</span>
|
|
<div class="rows-control">
|
|
<label>Rows per page</label>
|
|
<select name="per_page" id="per_page">
|
|
<option value="10">10</option>
|
|
<option value="20" selected>20</option>
|
|
<option value="50">50</option>
|
|
<option value="100">100</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="pagination">
|
|
<button id="prev-btn" class="page-btn">Previous</button>
|
|
<span id="page-numbers" class="page-numbers">
|
|
<button class="page-num active">1</button>
|
|
</span>
|
|
<button id="next-btn" class="page-btn">Next</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 底部模块占位符 -->
|
|
<div id="footer-placeholder"></div>
|
|
|
|
<!-- 引入模块加载脚本 -->
|
|
<script src="/public/js/module-loader.js"></script>
|
|
<script src="/public/js/browse.js"></script>
|
|
</body>
|
|
</html>
|