|
<!DOCTYPE html> |
|
<html lang="zh-CN"> |
|
<head> |
|
<meta charset="UTF-8"> |
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
<title>订阅转换星空工坊 - 隐私保护版</title> |
|
<link rel="stylesheet" href="{{ url_for('static', filename='styles.css') }}"> |
|
<link href="https://fonts.googleapis.com/css2?family=Quicksand:wght@400;500;600&display=swap" rel="stylesheet"> |
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css"> |
|
</head> |
|
<body> |
|
<div class="stars"></div> |
|
<div class="twinkling"></div> |
|
|
|
<div class="container"> |
|
<header> |
|
<div class="title-container"> |
|
<h1>✨ 订阅转换星空工坊 ✨</h1> |
|
<p>🚀 支持Clash全协议转换 🚀</p> |
|
<div class="privacy-badge"> |
|
<i class="fas fa-shield-alt"></i> 隐私保护版 - 本地缓存转换结果 |
|
</div> |
|
</div> |
|
<div class="user-actions"> |
|
<span>欢迎, {{ current_user.username }}</span> |
|
<a href="{{ url_for('logout') }}" class="btn-logout">登出 <i class="fas fa-sign-out-alt"></i></a> |
|
</div> |
|
</header> |
|
|
|
<main> |
|
<div class="card"> |
|
<form id="convertForm"> |
|
<div class="form-group"> |
|
<label for="backend_url"> |
|
<i class="fas fa-server"></i> 后端配置地址 |
|
</label> |
|
<input type="text" id="backend_url" name="backend_url" |
|
placeholder="默认: https://raw.githubusercontent.com/yuanwangokk-1/subscribe/refs/heads/main/ACL4SSR/ACL4SSR.ini" |
|
value="https://raw.githubusercontent.com/yuanwangokk-1/subscribe/refs/heads/main/ACL4SSR/ACL4SSR.ini"> |
|
</div> |
|
|
|
<div class="form-group"> |
|
<label for="target"> |
|
<i class="fas fa-desktop"></i> 远程终端类型 |
|
</label> |
|
<select id="target" name="target"> |
|
<option value="clash" selected>Clash</option> |
|
<option value="clashr">ClashR</option> |
|
<option value="surge">Surge</option> |
|
<option value="quan">Quantumult</option> |
|
<option value="quanx">Quantumult X</option> |
|
<option value="loon">Loon</option> |
|
<option value="ss">Shadowsocks</option> |
|
<option value="ssr">SSR</option> |
|
<option value="v2ray">V2Ray</option> |
|
<option value="sip002">SIP002</option> |
|
</select> |
|
</div> |
|
|
|
<div class="form-group"> |
|
<label for="original_url"> |
|
<i class="fas fa-link"></i> 订阅链接 |
|
</label> |
|
<textarea id="original_url" name="original_url" |
|
placeholder="请输入需要转换的订阅链接" required></textarea> |
|
</div> |
|
|
|
<button type="submit" class="btn-convert"> |
|
<i class="fas fa-magic"></i> 开始转换 |
|
</button> |
|
</form> |
|
</div> |
|
|
|
<div class="card result-card" id="resultCard" style="display: none;"> |
|
<h2><i class="fas fa-check-circle"></i> 转换成功!</h2> |
|
<div class="result-container"> |
|
<textarea id="convertResult" readonly></textarea> |
|
<button id="copyBtn" class="btn-copy"> |
|
<i class="fas fa-copy"></i> 复制 |
|
</button> |
|
</div> |
|
<div class="privacy-info"> |
|
<i class="fas fa-shield-alt"></i> |
|
<span> |
|
当前模式: {{ conversion_mode }} |
|
<br> |
|
通过本地缓存加速转换并提高隐私保护 (命中率: {{ cache_hit_ratio }}) |
|
</span> |
|
</div> |
|
<div class="tip"> |
|
<p>⭐️ 星空不灭,网络自由永存 ⭐️</p> |
|
</div> |
|
</div> |
|
|
|
<div class="admin-actions"> |
|
<button id="clearCacheBtn" class="btn-admin"> |
|
<i class="fas fa-trash"></i> 清除缓存 |
|
</button> |
|
</div> |
|
</main> |
|
|
|
<footer> |
|
<p>订阅转换星空工坊 - 隐私保护版 © 2023</p> |
|
</footer> |
|
</div> |
|
|
|
<div id="toast" class="toast"></div> |
|
|
|
<script src="{{ url_for('static', filename='script.js') }}"></script> |
|
<script> |
|
|
|
document.getElementById('clearCacheBtn').addEventListener('click', function() { |
|
if (confirm('确定要清除所有转换缓存吗?')) { |
|
fetch('/clear-cache', { |
|
method: 'POST' |
|
}) |
|
.then(response => response.json()) |
|
.then(data => { |
|
if (data.status === 'success') { |
|
showToast('缓存已清除', 'success'); |
|
} else { |
|
showToast(data.message, 'error'); |
|
} |
|
}) |
|
.catch(error => { |
|
showToast('请求失败: ' + error, 'error'); |
|
}); |
|
} |
|
}); |
|
|
|
|
|
function showToast(message, type = 'info') { |
|
const toast = document.getElementById('toast'); |
|
let icon = ''; |
|
if (type === 'success') icon = '<i class="fas fa-check-circle"></i> '; |
|
else if (type === 'error') icon = '<i class="fas fa-exclamation-circle"></i> '; |
|
else icon = '<i class="fas fa-info-circle"></i> '; |
|
|
|
toast.innerHTML = icon + message; |
|
toast.className = 'toast show ' + type; |
|
|
|
setTimeout(function() { |
|
toast.className = 'toast'; |
|
}, 3000); |
|
} |
|
</script> |
|
</body> |
|
</html> |
|
|