⚝
One Hat Cyber Team
⚝
Your IP:
216.73.216.124
Server IP:
50.28.103.30
Server:
Linux host.jcukjv-lwsites.com 4.18.0-553.22.1.el8_10.x86_64 #1 SMP Tue Sep 24 05:16:59 EDT 2024 x86_64
Server Software:
nginx/1.28.0
PHP Version:
8.3.12
Buat File
|
Buat Folder
Eksekusi
Dir :
~
/
proc
/
1856814
/
cwd
/
BTPanel
/
templates
/
default
/
View File Name :
unsubscribe.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Unsubscribe</title> <style> body { font-family: Arial, sans-serif; background-color: #f4f4f4; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; } .unsubscribe-container { background-color: #fff; padding: 40px; border-radius: 10px; box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1); width: 350px; } h2 { font-size: 24px; margin-bottom: 20px; color: #444; } .options { margin: 20px 0; } .options label { display: flex; align-items: center; margin: 15px 0; font-size: 16px; } input[type="checkbox"] { margin-right: 10px; width: 18px; height: 18px; border-radius: 50%; accent-color:#20a53a; } button { padding: 12px 0px; background-color: #20a53a; color: white; border: none; border-radius: 5px; cursor: pointer; font-size: 16px; transition: background-color 0.3s ease; width: 100%; } button:hover { background-color: #25b942; } /* loading效果 */ .loading { position: absolute; display: none; align-items: center; background-color: white; padding: 10px 40px; border-radius: 10px; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1); } .spinner { border: 8px solid rgba(0, 0, 0, 0.1); border-left-color: #3498db; border-radius: 50%; width: 20px; height: 20px; margin-right: 15px; animation: spin 1s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } .icon { font-size: 20px; margin-right: 10px; } </style> </head> <body> <div id="loading" class="loading"> <div class="spinner"></div> <p>Loading...</p> </div> <div id="success-message" class="loading"> <div class="icon">✔️</div> <p id="tips_success"></p> </div> <div id="error-message" class="loading"> <div class="icon">❌</div> <p id="tips_error"></p> </div> <div class="unsubscribe-container" id="container"> <h2>Are you sure to unsubscribe?</h2> <div class="options" id="reasonOptions"> <label><input type="checkbox" id="selectAll">Select All</label> </div> <button onclick="confirmUnsubscribe()">Sure</button> </div> <script> // 维护用原生写法(Network reasons:不引入jq\layer) function showSuccess(value) { const successBox = document.getElementById('success-message'); const containerBox = document.getElementById('container'); const tips = document.getElementById('tips_success') tips.textContent = value containerBox.style.display = 'none'; successBox.style.display = 'flex'; } function showError(value) { const errorBox = document.getElementById('error-message'); const tips = document.getElementById('tips_error') tips.textContent = value errorBox.style.display = 'flex'; setTimeout(() => { errorBox.style.display = 'none'; }, 2000); } // 获取页面传参 function getQueryParams() { const params = {}; const queryString = window.location.search.substring(1); const regex = /([^&=]+)=([^&]*)/g; let m; while (m = regex.exec(queryString)) { params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]); } return params; } var params; // 参数 window.onload = function() { params = getQueryParams(); requestType({email:this.params.email}); } // 渲染页面类型 function renderType(data) { const reasonOptionsDiv = document.getElementById('reasonOptions'); data.forEach(reason => { const label = document.createElement('label'); const checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.name = 'reason'; checkbox.value = reason.id; label.appendChild(checkbox); label.appendChild(document.createTextNode(reason.mail_type)); reasonOptionsDiv.appendChild(label); }); // 绑定全选复选框事件 const selectAllCheckbox = document.getElementById('selectAll'); selectAllCheckbox.addEventListener('change', () => { const checkboxes = document.querySelectorAll('input[name="reason"]'); checkboxes.forEach(checkbox => { checkbox.checked = selectAllCheckbox.checked; // 同步选中状态 }); }); // 监测其他复选框的选中状态 reasonOptionsDiv.addEventListener('change', () => { const checkboxes = document.querySelectorAll('input[name="reason"]'); const allChecked = Array.from(checkboxes).every(checkbox => checkbox.checked); selectAllCheckbox.checked = allChecked; // 更新全选复选框的状态 }); } // 请求取消订阅类型 function requestType(reqData) { document.getElementById('loading').style.display = 'flex'; fetch(params.url_type, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams(reqData).toString() }) .then(response => response.json()) .then(data => { if (data.status){ this.renderType(data.msg); }else{ this.showError(data.msg) } }) .catch((err) => { this.showError(err) }) .finally(() => { document.getElementById('loading').style.display = 'none'; }); } // 请求取消订阅 function requestApi(value) { document.getElementById('loading').style.display = 'flex'; const data = { jwt: params.jwt, id: value }; fetch(params.url_unsubscribe, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams(data).toString() }) .then(response => { if (!response.ok) { throw new Error('Network response was not ok'); } return response.json(); }) .then((res) => { if(res.status){ this.showSuccess(res.msg) }else{ this.showError(res.msg) } }) .catch((err) => { this.showError(err) }) .finally(() => { document.getElementById('loading').style.display = 'none'; }); } // 确认取消事件 function confirmUnsubscribe() { const selectedReasons = Array.from(document.querySelectorAll('input[name="reason"]:checked')) .map(checkbox => checkbox.value) .join(','); if (!selectedReasons) { this.showError('Please select at least one') return; } requestApi(selectedReasons); } </script> </body> </html>