src/app/templates/index.html (148 lines of code) (raw):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>LucaProt: Virus RdRP Identification</title>
<style>
body { font-family: Arial, sans-serif; margin: 2em; }
label { display: block; margin-bottom: 0.5em; }
textarea {
margin-top: 0em;
width: 100%;
height: auto; /* 使高度自适应 */
min-height: 100px; /* 设置一个最小高度 */
font-size: 16px;
padding: 10px;
border: 1px solid #ddd;
border-radius: 5px;
overflow: hidden; /* 隐藏滚动条 */
}
button {
margin-top: 1em; /* 与其他元素保持间距 */
padding: 10px 20px;
font-size: 16px;
color: white;
background-color: green; /* 绿色 */
border: none;
border-radius: 5px;
cursor: pointer;
display: block; /* 确保按钮是块级元素, 在新行显示 */
width: 100%; /* 可选: 按钮宽度适应输入框宽度 */
}
button:hover {
background-color: darkgreen; /* 悬停变深绿色 */
}
#output {
margin-top: 1em;
display: none; /* 初始隐藏 */
}
input[type="number"] {
margin-top: 0em;
width: 100px; /* 设置为更窄的宽度,例如 100px */
font-size: 16px;
padding: 10px;
border: 1px solid #ddd;
border-radius: 5px;
}
button:disabled {
background-color: gray; /* 灰色 */
cursor: not-allowed; /* 禁用状态的光标 */
}
select {
margin-top: 0em;
font-size: 16px;
padding: 10px;
border: 1px solid #ddd;
border-radius: 5px;
flex-grow: 1; /* 让选择框填充剩余空间 */
}
.fasta {
font-family: monospace; /* 使用等宽字体 */
white-space: pre; /* 保留空白和换行 */
line-height: 1.5; /* 行高 */
}
</style>
</head>
<body>
<h1>LucaProt: Virus RdRP Identification</h1>
<label for="inputFasta">Enter Protein Fasta:</label>
<textarea id="inputFasta" placeholder="e.g.
>prot_01
MSSFRWLLRSGWNPQRTPRHGRSVSKPSSRTHVPCGLLKPGLARLPFSLPMPLDGPTWSC
PAYGLLDRGTLTAVVSRLSRKWHRLRESVFSRVPCDSPQSHVKGQLHMFWSARLDEAVEH
RETYKLVQSLPETDRIRMAWKYLNRRKAQAAKARDDSSGSHLPRVQAAALWLVLDDFSLT
PARATVLAHAEYRRKRFEKPERKIRTTEWVGGAPNPIALTSERQVSTKWKRAQSNAERLA
ALCDDAPFPPTAVARLDGRLELPSGCRPQKFVLPGGPALEFIRERRPSLLKWLGPSDACV
GGSWDTSKWSFEVACQPNKGSGHAGDLYRALSSGYKDLKLGRLPQPSIRALECVKVNGRA
YPGIFSSRIGNNRKTAYGACVEIAKQHYLDARERFEPDLSLWACGGRGKPSQMVQVGDRL
KSRLILMPETPSALLESAFAQPFTAMLSAVRGDIMIGASMTDRGFRRVLSPVEDAHHVKA
FDWSGFDSRVREDMIVTAFGIVRACFKGDDAWLDNVFLRFISHFLVKRVVTPGGWLYTLA
NGVPSGSPFTSIIDSLVNWLVITDLEICMGGLSAPTKNRRRVYGDDFMQAFFAPCLERDA
YIALAFERWGFVAKPSAALEGVACANTADASLPFLSFRFPFGLPARPIQDALKIGLLPQK
ARYSYSAQAARVCYLDHFAPYDPETIEYHREYFNWLQTKIPGMTWADGRPQPDLVSPWIH
KAMVNFVAAGFAPGVVSLGEWFRQEDPRRWPDRWVPRRCGRLVPRAAWSQGKLQSALSTL
RWGNCAESTFARLRWKTL
>prot_02
MLTLKSALASIRFDIVDGTGSKKRKRTLFSRFFVGTLRSMLDSEEHALQLTSLGRALPVG
TAAVSKKALQRHKEAYRSDSDTPEHLVEACYEFVDDWIRAYCPPNTSEISFPSTSGAAIG
YPRKKGGLAAYTHEVSSFVQQVRAPDQLLSAVQGPLVSGIGPDMTFSRRIGRARDVVLQT
AVRENLFSRLSLLSEPYRAEVIPIAERGCKARVVTKSPPELVASSHYVRTVLFRGILRDP
RTSEALQGDRTKAVLGLLRGYQPPGHWQVLSSDLTAASDLLPSDLIQAVVEAIVDSEILP
PSFEPALRASVGVMKLVYPDGEEILSRRGILMGLPTTWTILSLIHLFIIEQAFNEVAFVG
PRLYRICGDDLVAIAPKKVIDSYHRIASACGVKFSAGKHFVSHRYAVFTEVIAKVNRSVT
DHRNLLGDDVYEKFVKQKRHRRLLLVRRADKGEVISSLSLVRYIPLKGLVKPDLIGGSFD
PCPWWVSLGPSAASIAEQSRSPGRVRNIVKALFPFAWHWFASRGIPPNLPRELGGGGLPS
KSGNPNRCYVDRWCRPAVRHYLYGRSFLSTSDLELPWVSLGSSGGPWALASQMADQRAVP
RLMRVTGPKGSVRMKLIQQLVPVRSSKSMASPAVNYGGWRKAFREHIVATARKHFSSVGF
RPGGGLLTSKPTRIASAWKRAVRHAPSWFRRDQGKRSFLRQEILDILTQQNNKRNLYWVT
CYDKSDDLESIMDALGWLSSRDSQRAPRSE"></textarea>
<label for="inputThreshold">Threshold:</label>
<input type="number" id="inputThreshold" min=0 max=1 step=0.05 placeholder=0.5 value=0.5>
<button id="generateButton" onclick="virusRdRPIdentification()">Run</button>
<div id="output">
<h2 >Results:</h2>
<label id="results" class="fasta"></label>
</div>
<script>
async function virusRdRPIdentification() {
const inputFasta = document.getElementById("inputFasta").value;
const inputThreshold = document.getElementById("inputThreshold").value;
const generateButton = document.getElementById("generateButton");
// 检查输入框和选择项是否有效
if (!inputFasta) {
alert("请输入蛋白Fasta!");
return;
}
// 禁用按钮
generateButton.disabled = true;
// 改变按钮文本
generateButton.textContent = "Running...";
// 隐藏输出区域
document.getElementById("output").style.display = 'none';
try {
const response = await fetch("/generate", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({input_fasta: inputFasta, threshold: inputThreshold})
});
const data = await response.json();
document.getElementById("results").innerHTML = data.results;
// 显示输出区域
document.getElementById("output").style.display = 'block';
} catch (error) {
console.error('Error:', error);
alert("Error, please retry.");
} finally {
// 恢复按钮状态
// 启用按钮
generateButton.disabled = false;
// 恢复原始文本
generateButton.textContent = "Run";
}
}
</script>
</body>
</html>