cluntop upload /.github/Toos/静态页/FinalShell激活码生成/FinalShell完整版/finalshell/index.html
This commit is contained in:
@@ -0,0 +1,917 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh-CN">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>FinalShell激活码生成工具</title>
|
||||||
|
<link rel="icon" href="https://cloudflare.panell.top/file/1752220700680_finalshell.png" type="image/png">
|
||||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
--primary: #3b82f6;
|
||||||
|
--primary-hover: #2563eb;
|
||||||
|
--success: #10b981;
|
||||||
|
--success-hover: #059669;
|
||||||
|
--warning: #f59e0b;
|
||||||
|
--warning-hover: #d97706;
|
||||||
|
--pink: #ec4899;
|
||||||
|
--pink-hover: #db2777;
|
||||||
|
--green: #7DDA58;
|
||||||
|
--gray-100: #f9fafb;
|
||||||
|
--gray-200: #f3f4f6;
|
||||||
|
--gray-300: #e5e7eb;
|
||||||
|
--gray-500: #6b7280;
|
||||||
|
--gray-700: #374151;
|
||||||
|
--gray-900: #111827;
|
||||||
|
--shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
|
||||||
|
--border-radius: 10px;
|
||||||
|
--transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: 'Segoe UI', 'Microsoft YaHei', sans-serif;
|
||||||
|
background: linear-gradient(135deg, #f0f9ff 0%, #e6f7ff 100%);
|
||||||
|
color: var(--gray-900);
|
||||||
|
line-height: 1.6;
|
||||||
|
min-height: 100vh;
|
||||||
|
padding: 20px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
max-width: 800px;
|
||||||
|
width: 100%;
|
||||||
|
background: white;
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
box-shadow: var(--shadow);
|
||||||
|
overflow: hidden;
|
||||||
|
position: relative;
|
||||||
|
animation: fadeIn 0.8s ease-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fadeIn {
|
||||||
|
from { opacity: 0; transform: translateY(20px); }
|
||||||
|
to { opacity: 1; transform: translateY(0); }
|
||||||
|
}
|
||||||
|
|
||||||
|
.header {
|
||||||
|
background: linear-gradient(135deg, var(--primary) 0%, #1d4ed8 100%);
|
||||||
|
color: white;
|
||||||
|
padding: 1.8rem 2rem;
|
||||||
|
text-align: center;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: -50%;
|
||||||
|
left: -50%;
|
||||||
|
width: 200%;
|
||||||
|
height: 200%;
|
||||||
|
background: radial-gradient(circle, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0) 70%);
|
||||||
|
transform: rotate(30deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.header h1 {
|
||||||
|
font-size: 1.8rem;
|
||||||
|
font-weight: 700;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
position: relative;
|
||||||
|
z-index: 2;
|
||||||
|
text-shadow: 0 2px 4px rgba(0,0,0,0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.header p {
|
||||||
|
font-size: 1rem;
|
||||||
|
opacity: 0.9;
|
||||||
|
max-width: 600px;
|
||||||
|
margin: 0 auto;
|
||||||
|
position: relative;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
padding: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card {
|
||||||
|
background: white;
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
|
||||||
|
padding: 1.8rem;
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
border: 1px solid rgba(59, 130, 246, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 1.4rem;
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
color: var(--gray-900);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
position: relative;
|
||||||
|
padding-bottom: 0.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2::after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 60px;
|
||||||
|
height: 3px;
|
||||||
|
background: var(--primary);
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-group {
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 0.6rem;
|
||||||
|
font-weight: 500;
|
||||||
|
color: var(--gray-700);
|
||||||
|
font-size: 0.95rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="text"], select {
|
||||||
|
width: 100%;
|
||||||
|
padding: 0.9rem 1.2rem;
|
||||||
|
border: 1px solid var(--gray-300);
|
||||||
|
border-radius: 8px;
|
||||||
|
font-size: 1rem;
|
||||||
|
transition: var(--transition);
|
||||||
|
background: #fafcff;
|
||||||
|
box-shadow: inset 0 1px 2px rgba(0,0,0,0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="text"]:focus, select:focus {
|
||||||
|
outline: none;
|
||||||
|
border-color: var(--primary);
|
||||||
|
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.15), inset 0 1px 2px rgba(0,0,0,0.05);
|
||||||
|
background: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.copyright-notice {
|
||||||
|
background: #fffbeb;
|
||||||
|
border-left: 4px solid #f59e0b;
|
||||||
|
padding: 0.8rem 1rem;
|
||||||
|
text-align: center;
|
||||||
|
font-weight: 500;
|
||||||
|
color: #b45309;
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
border-radius: 8px;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-row {
|
||||||
|
display: flex;
|
||||||
|
gap: 1.2rem;
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-col {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
padding: 0.9rem;
|
||||||
|
border: none;
|
||||||
|
border-radius: 8px;
|
||||||
|
font-size: 1.05rem;
|
||||||
|
font-weight: 600;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: var(--transition);
|
||||||
|
text-align: center;
|
||||||
|
box-shadow: 0 4px 6px rgba(59, 130, 246, 0.2);
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn::after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: rgba(255, 255, 255, 0.2);
|
||||||
|
transform: translateX(-100%);
|
||||||
|
transition: transform 0.4s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn:hover::after {
|
||||||
|
transform: translateX(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-primary {
|
||||||
|
background: var(--primary);
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-primary:hover {
|
||||||
|
background: var(--primary-hover);
|
||||||
|
box-shadow: 0 6px 8px rgba(59, 130, 246, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-success {
|
||||||
|
background: var(--success);
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-success:hover {
|
||||||
|
background: var(--success-hover);
|
||||||
|
box-shadow: 0 6px 8px rgba(16, 185, 129, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-pink {
|
||||||
|
background: var(--pink);
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-pink:hover {
|
||||||
|
background: var(--pink-hover);
|
||||||
|
box-shadow: 0 6px 8px rgba(236, 72, 153, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.result-container {
|
||||||
|
display: none;
|
||||||
|
margin-top: 1.8rem;
|
||||||
|
animation: fadeInUp 0.5s ease-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fadeInUp {
|
||||||
|
from { opacity: 0; transform: translateY(10px); }
|
||||||
|
to { opacity: 1; transform: translateY(0); }
|
||||||
|
}
|
||||||
|
|
||||||
|
.result-label {
|
||||||
|
font-size: 0.95rem;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--gray-700);
|
||||||
|
margin-bottom: 0.6rem;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.result-label i {
|
||||||
|
margin-right: 8px;
|
||||||
|
color: var(--success);
|
||||||
|
}
|
||||||
|
|
||||||
|
.result {
|
||||||
|
background: var(--gray-100);
|
||||||
|
border: 1px dashed var(--gray-300);
|
||||||
|
padding: 1.3rem;
|
||||||
|
font-family: 'Courier New', monospace;
|
||||||
|
font-size: 1.15rem;
|
||||||
|
border-radius: 8px;
|
||||||
|
color: var(--gray-900);
|
||||||
|
text-align: center;
|
||||||
|
word-break: break-all;
|
||||||
|
font-weight: bold;
|
||||||
|
box-shadow: inset 0 2px 4px rgba(0,0,0,0.03);
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.result.active {
|
||||||
|
color: #10b981;
|
||||||
|
border-color: #10b981;
|
||||||
|
background: rgba(16, 185, 129, 0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
.result.error {
|
||||||
|
color: #ef4444;
|
||||||
|
border-color: #ef4444;
|
||||||
|
background: rgba(239, 68, 68, 0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
.copy-btn-container {
|
||||||
|
display: none;
|
||||||
|
gap: 0.8rem;
|
||||||
|
margin-top: 1.2rem;
|
||||||
|
animation: fadeIn 0.5s ease-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.copy-btn-container .btn {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.collapse {
|
||||||
|
margin-top: 1.8rem;
|
||||||
|
border: 1px solid var(--gray-200);
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
overflow: hidden;
|
||||||
|
box-shadow: 0 2px 8px rgba(0,0,0,0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
.collapse-header {
|
||||||
|
background: var(--gray-100);
|
||||||
|
padding: 1.1rem 1.6rem;
|
||||||
|
font-weight: 600;
|
||||||
|
cursor: pointer;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
transition: var(--transition);
|
||||||
|
}
|
||||||
|
|
||||||
|
.collapse-header:hover {
|
||||||
|
background: var(--gray-200);
|
||||||
|
}
|
||||||
|
|
||||||
|
.collapse-content {
|
||||||
|
padding: 1.6rem;
|
||||||
|
background: white;
|
||||||
|
border-top: 1px solid var(--gray-200);
|
||||||
|
}
|
||||||
|
|
||||||
|
.version-comparison {
|
||||||
|
display: flex;
|
||||||
|
gap: 1.8rem;
|
||||||
|
margin-top: 1.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.version-card {
|
||||||
|
flex: 1;
|
||||||
|
border: 1px solid var(--gray-300);
|
||||||
|
border-radius: 8px;
|
||||||
|
overflow: hidden;
|
||||||
|
transition: var(--transition);
|
||||||
|
background: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.version-card:hover {
|
||||||
|
transform: translateY(-5px);
|
||||||
|
box-shadow: var(--shadow);
|
||||||
|
}
|
||||||
|
|
||||||
|
.version-card.pro {
|
||||||
|
border-top: 4px solid var(--primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.version-card.adv {
|
||||||
|
border-top: 4px solid var(--success);
|
||||||
|
}
|
||||||
|
|
||||||
|
.version-header {
|
||||||
|
background: linear-gradient(to right, rgba(59, 130, 246, 0.05), rgba(16, 185, 129, 0.05));
|
||||||
|
padding: 1.2rem;
|
||||||
|
text-align: center;
|
||||||
|
font-weight: 700;
|
||||||
|
color: var(--gray-900);
|
||||||
|
}
|
||||||
|
|
||||||
|
.version-body {
|
||||||
|
padding: 1.6rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feature-list {
|
||||||
|
list-style-type: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feature-list li {
|
||||||
|
padding: 0.6rem 0;
|
||||||
|
position: relative;
|
||||||
|
padding-left: 1.8rem;
|
||||||
|
font-size: 0.95rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feature-list li:before {
|
||||||
|
content: "✓";
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
color: var(--success);
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 1.1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.recommended-badge {
|
||||||
|
background: var(--success);
|
||||||
|
color: white;
|
||||||
|
padding: 0.3rem 0.7rem;
|
||||||
|
border-radius: 20px;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
margin-left: 0.7rem;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pro-badge {
|
||||||
|
background: var(--primary);
|
||||||
|
color: white;
|
||||||
|
padding: 0.3rem 0.7rem;
|
||||||
|
border-radius: 20px;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
margin-left: 0.7rem;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tutorial-list {
|
||||||
|
padding-left: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tutorial-list li {
|
||||||
|
margin-bottom: 0.9rem;
|
||||||
|
padding-left: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tip {
|
||||||
|
background: #fff9db;
|
||||||
|
border-left: 4px solid #ffd43b;
|
||||||
|
padding: 1.1rem;
|
||||||
|
margin-top: 1.2rem;
|
||||||
|
border-radius: 0 8px 8px 0;
|
||||||
|
font-size: 0.95rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.iframe-container {
|
||||||
|
margin-top: 1.5rem;
|
||||||
|
border-radius: 8px;
|
||||||
|
overflow: hidden;
|
||||||
|
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.iframe-container iframe {
|
||||||
|
width: 100%;
|
||||||
|
height: 450px;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.copy-success {
|
||||||
|
position: fixed;
|
||||||
|
top: 20px;
|
||||||
|
right: 20px;
|
||||||
|
background-color: var(--success);
|
||||||
|
color: white;
|
||||||
|
padding: 15px 25px;
|
||||||
|
border-radius: 8px;
|
||||||
|
box-shadow: 0 5px 15px rgba(0,0,0,0.2);
|
||||||
|
z-index: 1000;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
transform: translateX(110%);
|
||||||
|
transition: transform 0.5s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.copy-success.show {
|
||||||
|
transform: translateX(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
.copy-success i {
|
||||||
|
font-size: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spinner {
|
||||||
|
border: 4px solid rgba(0, 0, 0, 0.1);
|
||||||
|
border-radius: 50%;
|
||||||
|
border-top: 4px solid var(--primary);
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
animation: spin 1s linear infinite;
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes spin {
|
||||||
|
0% { transform: rotate(0deg); }
|
||||||
|
100% { transform: rotate(360deg); }
|
||||||
|
}
|
||||||
|
|
||||||
|
.api-loading {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 10px;
|
||||||
|
color: var(--gray-700);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.version-comparison {
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-row {
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header h1 {
|
||||||
|
font-size: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
padding: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header {
|
||||||
|
padding: 1.5rem 1.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.iframe-container iframe {
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="header">
|
||||||
|
<h1>FinalShell 激活码在线生成工具</h1>
|
||||||
|
<p>支持 FinalShell 3.9.6、4.5、4.6 等多个版本离线激活</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="content">
|
||||||
|
<form id="activationForm">
|
||||||
|
<div class="card">
|
||||||
|
<h2>生成激活码</h2>
|
||||||
|
|
||||||
|
<div class="input-group">
|
||||||
|
<label for="machineCode">机器码</label>
|
||||||
|
<input id="machineCode" type="text" placeholder="请从FinalShell激活窗口中复制机器码..." />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="copyright-notice">
|
||||||
|
<i class="fas fa-exclamation-circle"></i> 本工具仅用于学习和研究目的,请支持正版软件。
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-row">
|
||||||
|
<div class="form-col">
|
||||||
|
<label for="versionSelect">软件版本</label>
|
||||||
|
<select id="versionSelect" name="version">
|
||||||
|
<option value="lt_396">FinalShell < 3.9.6</option>
|
||||||
|
<option value="gt_396">FinalShell ≥ 3.9.6</option>
|
||||||
|
<option value="45">FinalShell 4.5</option>
|
||||||
|
<option value="46">FinalShell 4.6</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-col">
|
||||||
|
<label for="typeSelect">版本类型</label>
|
||||||
|
<select id="typeSelect" name="type">
|
||||||
|
<option value="advanced">高级版</option>
|
||||||
|
<option value="pro">专业版</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button type="button" class="btn btn-primary" id="generateBtn">
|
||||||
|
<i class="fas fa-key"></i> 生成激活码
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div class="result-container" id="resultContainer">
|
||||||
|
<div class="result-label">
|
||||||
|
<i class="fas fa-lock"></i> 生成的激活码:
|
||||||
|
</div>
|
||||||
|
<div class="result" id="output">等待生成...</div>
|
||||||
|
|
||||||
|
<div class="copy-btn-container" id="buttonContainer">
|
||||||
|
<button class="btn btn-success" id="copyButton">
|
||||||
|
<i class="fas fa-copy"></i> 复制激活码
|
||||||
|
</button>
|
||||||
|
<button type="button" class="btn" id="clearButton">
|
||||||
|
<i class="fas fa-trash-alt"></i> 清空
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<div class="collapse">
|
||||||
|
<div class="collapse-header" onclick="toggleCollapse('featureComparison')">
|
||||||
|
<span><i class="fas fa-list"></i> 版本功能对比</span>
|
||||||
|
<span id="featureComparisonIcon">▼</span>
|
||||||
|
</div>
|
||||||
|
<div class="collapse-content" id="featureComparison" style="display: none;">
|
||||||
|
<p style="margin-bottom: 1.2rem; color: var(--gray-700);">
|
||||||
|
<i class="fas fa-info-circle"></i> 根据您的需求选择合适的版本,专业版包含高级版所有功能
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="version-comparison">
|
||||||
|
<div class="version-card adv">
|
||||||
|
<div class="version-header">
|
||||||
|
高级版功能
|
||||||
|
<span class="recommended-badge">推荐</span>
|
||||||
|
</div>
|
||||||
|
<div class="version-body">
|
||||||
|
<ul class="feature-list">
|
||||||
|
<li>网络监控可选择接口,同时监控多个网络接口速度</li>
|
||||||
|
<li>打包传输,自动压缩解压,适合传输大量文件,文件夹和文本文件</li>
|
||||||
|
<li>高级网络监控,监控每个进程监听的端口,以及网络连接状态</li>
|
||||||
|
<li>高级进程管理,详细显示进程信息</li>
|
||||||
|
<li>无限制的终端命令历史,路径历史,可快速输入命令,切换路径</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="version-card pro">
|
||||||
|
<div class="version-header">
|
||||||
|
专业版功能
|
||||||
|
<span class="pro-badge">高级用户</span>
|
||||||
|
</div>
|
||||||
|
<div class="version-body">
|
||||||
|
<ul class="feature-list">
|
||||||
|
<li>包含所有高级版功能</li>
|
||||||
|
<li>查看系统信息</li>
|
||||||
|
<li>设置本机图片为终端背景</li>
|
||||||
|
<li>历史命令左右键选择字段输入功能(命令输入框)</li>
|
||||||
|
<li>快速输入路径功能,可在窗口显示并选择系统的目录和文件(终端命令输入框)</li>
|
||||||
|
<li>快速输入命令名称功能(命令输入框)</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="collapse">
|
||||||
|
<div class="collapse-header" onclick="toggleCollapse('tutorial')">
|
||||||
|
<span><i class="fas fa-book"></i> 使用教程</span>
|
||||||
|
<span id="tutorialIcon">▼</span>
|
||||||
|
</div>
|
||||||
|
<div class="collapse-content" id="tutorial" style="display: none;">
|
||||||
|
<ol class="tutorial-list">
|
||||||
|
<li>下载并安装FinalShell软件</li>
|
||||||
|
<li>打开FinalShell,点击右下角的「激活/升级」</li>
|
||||||
|
<li>任意输入用户名和密码,点击离线激活</li>
|
||||||
|
<li>在弹出的离线激活窗口中,找到「机器码」并复制</li>
|
||||||
|
<li>将机器码粘贴到本页面的输入框中,选择版本和类型</li>
|
||||||
|
<li>点击「生成激活码」按钮</li>
|
||||||
|
<li>将激活码复制到FinalShell的注册窗口中,点击「确定」完成激活</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<div class="tip">
|
||||||
|
<strong><i class="fas fa-lightbulb"></i> 提示:</strong>如果激活失败,请尝试使用其他版本的激活码或下载对应版本的FinalShell客户端
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="collapse">
|
||||||
|
<div class="collapse-header" onclick="toggleCollapse('preventFree')">
|
||||||
|
<span><i class="fas fa-shield-alt"></i> 防止变回免费版</span>
|
||||||
|
<span id="preventFreeIcon">▼</span>
|
||||||
|
</div>
|
||||||
|
<div class="collapse-content" id="preventFree" style="display: none;">
|
||||||
|
<p>激活后如何防止软件变回免费版?请遵循以下步骤:</p>
|
||||||
|
|
||||||
|
<div class="tip">
|
||||||
|
<strong><i class="fas fa-lightbulb"></i> 重要提示:</strong>
|
||||||
|
以下指南将帮助您确保激活状态持久有效,避免软件意外恢复为免费版。
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<ol class="tutorial-list">
|
||||||
|
<li>完成激活后不要更新软件到最新版本</li>
|
||||||
|
<li>在防火墙中阻止FinalShell访问互联网</li>
|
||||||
|
<li>定期检查激活状态,确保未变回免费版</li>
|
||||||
|
<li>使用专业工具屏蔽激活验证服务器</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<p>详细教程请查看以下页面:</p>
|
||||||
|
<a href="rede/index.html" target="_blank">如果没显示点击我!</a>
|
||||||
|
|
||||||
|
<div class="iframe-container">
|
||||||
|
<iframe src="rede/index.html" title="防止FinalShell变回免费版指南"></iframe>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tip" style="margin-top: 1.5rem;">
|
||||||
|
<strong><i class="fas fa-exclamation-triangle"></i> 注意:</strong>
|
||||||
|
这些方法仅供学习和研究使用,请遵守软件许可协议。
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="copy-success" id="copySuccess">
|
||||||
|
<i class="fas fa-check-circle"></i>
|
||||||
|
<span>✅ 激活码已复制到剪贴板!</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// 全局变量存储激活码
|
||||||
|
let lastActivationCode = '';
|
||||||
|
|
||||||
|
// 初始化页面
|
||||||
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
const generateBtn = document.getElementById('generateBtn');
|
||||||
|
const copyButton = document.getElementById('copyButton');
|
||||||
|
const clearButton = document.getElementById('clearButton');
|
||||||
|
const activationForm = document.getElementById('activationForm');
|
||||||
|
const machineCodeInput = document.getElementById('machineCode');
|
||||||
|
const versionSelect = document.getElementById('versionSelect');
|
||||||
|
const typeSelect = document.getElementById('typeSelect');
|
||||||
|
|
||||||
|
// 添加表单提交处理
|
||||||
|
activationForm.addEventListener('submit', function(e) {
|
||||||
|
e.preventDefault(); // 阻止表单默认提交行为
|
||||||
|
generateActivationCode();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 机器码输入框支持Enter键
|
||||||
|
machineCodeInput.addEventListener('keydown', function(e) {
|
||||||
|
if (e.key === 'Enter') {
|
||||||
|
e.preventDefault(); // 阻止默认行为
|
||||||
|
generateActivationCode();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
generateBtn.addEventListener('click', generateActivationCode);
|
||||||
|
copyButton.addEventListener('click', copyActivationCode);
|
||||||
|
clearButton.addEventListener('click', clearAll);
|
||||||
|
|
||||||
|
// 默认隐藏结果区域
|
||||||
|
document.getElementById('resultContainer').style.display = 'none';
|
||||||
|
document.getElementById('buttonContainer').style.display = 'none';
|
||||||
|
});
|
||||||
|
|
||||||
|
// 生成激活码的逻辑
|
||||||
|
function md5(str) {return CryptoJS.MD5(str).toString();}
|
||||||
|
function keccak384(str) {return CryptoJS.SHA3(str, { outputLength: 384}).toString();}
|
||||||
|
|
||||||
|
function generateActivationCode() {
|
||||||
|
const machineCode = document.getElementById('machineCode').value.trim();
|
||||||
|
const version = document.getElementById('versionSelect').value;
|
||||||
|
const type = document.getElementById('typeSelect').value;
|
||||||
|
const resultContainer = document.getElementById('resultContainer');
|
||||||
|
const buttonContainer = document.getElementById('buttonContainer');
|
||||||
|
const output = document.getElementById('output');
|
||||||
|
const generateBtn = document.getElementById('generateBtn');
|
||||||
|
|
||||||
|
// 验证机器码
|
||||||
|
if (!machineCode) {
|
||||||
|
output.textContent = '❌ 请输入机器码';
|
||||||
|
output.className = 'result error';
|
||||||
|
resultContainer.style.display = 'block';
|
||||||
|
buttonContainer.style.display = 'none';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let generatedCode = '';
|
||||||
|
|
||||||
|
if (version === 'lt_396') {
|
||||||
|
if (type === 'advanced') {
|
||||||
|
generatedCode = md5('61305' + machineCode + '8552').slice(8, 24);
|
||||||
|
} else if (type === 'pro') {
|
||||||
|
generatedCode = md5('2356' + machineCode + '13593').slice(8, 24);
|
||||||
|
}
|
||||||
|
} else if (version === 'gt_396') {
|
||||||
|
if (type === 'advanced') {
|
||||||
|
generatedCode = keccak384(machineCode + 'hSf(78cvVlS5E').slice(12, 28);
|
||||||
|
} else if (type === 'pro') {
|
||||||
|
generatedCode = keccak384(machineCode + 'FF3Go(*Xvbb5s2').slice(12, 28);
|
||||||
|
}
|
||||||
|
} else if (version === '45') {
|
||||||
|
if (type === 'advanced') {
|
||||||
|
generatedCode = keccak384(machineCode + 'wcegS3gzA$').slice(12, 28);
|
||||||
|
} else if (type === 'pro') {
|
||||||
|
generatedCode = keccak384(machineCode + 'b(xxkHn%z);x').slice(12, 28);
|
||||||
|
}
|
||||||
|
} else if (version === '46') {
|
||||||
|
if (type === 'advanced') {
|
||||||
|
generatedCode = keccak384(machineCode + 'csSf5*xlkgYSX,y').slice(12, 28);
|
||||||
|
} else if (type === 'pro') {
|
||||||
|
generatedCode = keccak384(machineCode + 'Scfg*ZkvJZc,s,Y').slice(12, 28);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
output.textContent = '❌ 请选择正确的版本和类型';
|
||||||
|
output.className = 'result error';
|
||||||
|
resultContainer.style.display = 'block';
|
||||||
|
buttonContainer.style.display = 'none';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 显示加载状态
|
||||||
|
output.textContent = '⏳ 正在生成激活码...';
|
||||||
|
output.className = 'result';
|
||||||
|
resultContainer.style.display = 'block';
|
||||||
|
buttonContainer.style.display = 'none';
|
||||||
|
|
||||||
|
// 禁用生成按钮防止多次点击
|
||||||
|
generateBtn.disabled = true;
|
||||||
|
const originalBtnText = generateBtn.innerHTML;
|
||||||
|
generateBtn.innerHTML = '<i class="fas fa-spinner fa-spin"></i> 生成中...';
|
||||||
|
|
||||||
|
// 模拟异步操作
|
||||||
|
setTimeout(() => {
|
||||||
|
lastActivationCode = generatedCode;
|
||||||
|
output.textContent = generatedCode;
|
||||||
|
output.className = 'result active';
|
||||||
|
buttonContainer.style.display = 'flex';
|
||||||
|
|
||||||
|
// 恢复生成按钮状态
|
||||||
|
generateBtn.disabled = false;
|
||||||
|
generateBtn.innerHTML = originalBtnText;
|
||||||
|
}, 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
function copyActivationCode() {
|
||||||
|
const output = document.getElementById('output');
|
||||||
|
const copyButton = document.getElementById('copyButton');
|
||||||
|
|
||||||
|
if (!lastActivationCode) {
|
||||||
|
output.textContent = '❌ 请先生成激活码!';
|
||||||
|
output.className = 'result error';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 禁用按钮防止多次点击
|
||||||
|
copyButton.disabled = true;
|
||||||
|
const originalText = copyButton.innerHTML;
|
||||||
|
copyButton.innerHTML = '<i class="fas fa-spinner fa-spin"></i> 复制中...';
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 创建临时textarea元素用于复制
|
||||||
|
const tempTextArea = document.createElement('textarea');
|
||||||
|
tempTextArea.value = lastActivationCode;
|
||||||
|
tempTextArea.setAttribute('readonly', '');
|
||||||
|
tempTextArea.style.position = 'absolute';
|
||||||
|
tempTextArea.style.left = '-9999px';
|
||||||
|
document.body.appendChild(tempTextArea);
|
||||||
|
tempTextArea.select();
|
||||||
|
|
||||||
|
// 尝试使用execCommand复制
|
||||||
|
const copyResult = document.execCommand('copy');
|
||||||
|
document.body.removeChild(tempTextArea);
|
||||||
|
|
||||||
|
if (copyResult) {
|
||||||
|
// 显示浮动提示
|
||||||
|
const copySuccess = document.getElementById('copySuccess');
|
||||||
|
copySuccess.classList.add('show');
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
copySuccess.classList.remove('show');
|
||||||
|
}, 2000);
|
||||||
|
} else {
|
||||||
|
// 如果execCommand失败,尝试使用Clipboard API
|
||||||
|
navigator.clipboard.writeText(lastActivationCode)
|
||||||
|
.then(() => {
|
||||||
|
const copySuccess = document.getElementById('copySuccess');
|
||||||
|
copySuccess.classList.add('show');
|
||||||
|
setTimeout(() => copySuccess.classList.remove('show'), 2000);
|
||||||
|
})
|
||||||
|
.catch(err => {
|
||||||
|
console.error('复制失败:', err);
|
||||||
|
output.textContent = '❌ 复制失败,请手动复制';
|
||||||
|
output.className = 'result error';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error('复制操作失败:', err);
|
||||||
|
output.textContent = '❌ 复制失败,请手动复制';
|
||||||
|
output.className = 'result error';
|
||||||
|
} finally {
|
||||||
|
// 恢复按钮状态
|
||||||
|
setTimeout(() => {
|
||||||
|
copyButton.disabled = false;
|
||||||
|
copyButton.innerHTML = originalText;
|
||||||
|
}, 1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function clearAll() {
|
||||||
|
document.getElementById('machineCode').value = '';
|
||||||
|
|
||||||
|
const resultContainer = document.getElementById('resultContainer');
|
||||||
|
const buttonContainer = document.getElementById('buttonContainer');
|
||||||
|
const output = document.getElementById('output');
|
||||||
|
|
||||||
|
output.textContent = '等待生成...';
|
||||||
|
output.className = 'result';
|
||||||
|
resultContainer.style.display = 'none';
|
||||||
|
buttonContainer.style.display = 'none';
|
||||||
|
lastActivationCode = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
function toggleCollapse(id) {
|
||||||
|
const element = document.getElementById(id);
|
||||||
|
const icon = document.getElementById(id + 'Icon');
|
||||||
|
|
||||||
|
if (element.style.display === 'none') {
|
||||||
|
element.style.display = 'block';
|
||||||
|
icon.textContent = '▲';
|
||||||
|
} else {
|
||||||
|
element.style.display = 'none';
|
||||||
|
icon.textContent = '▼';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Reference in New Issue
Block a user