码桶
发现社区成员的开源项目
option.js12.5 KB
(function () {
'use strict';
var FIELD_TABS = {
'logoUrl': 'basic',
'siteSubtitle': 'basic',
'footerPowered': 'basic',
'footerAbout': 'basic',
'icp': 'basic',
'pageSize': 'display',
'sidebarNum': 'display',
'recEnable': 'display',
'recNum': 'display',
'recExcludeCats': 'display',
'filterEnable': 'display',
'listStyle': 'display',
'commentInfoEnable': 'display',
'commentInfoOptions': 'display',
'enableDownloadCount': 'function',
'enableRating': 'function',
'icp': 'beian',
'icpUrl': 'beian',
'govIc': 'beian',
'govIcUrl': 'beian',
'analyticsCode': 'other',
'lb_mail_switch': 'mail',
'lb_mail_host': 'mail',
'lb_mail_port': 'mail',
'lb_mail_user': 'mail',
'lb_mail_pass': 'mail',
'lb_mail_from_name': 'mail',
'lb_mail_admin': 'mail',
'lb_notify_feishu': 'mail',
'lb_feishu_webhook': 'mail',
'lb_notify_wecom': 'mail',
'lb_wecom_webhook': 'mail',
'lb_notify_dingtalk': 'mail',
'lb_dingtalk_webhook': 'mail',
'lb_notify_pushplus': 'mail',
'lb_pushplus_token': 'mail',
};
function init() {
moveLbWrapIntoForm();
moveFieldsToPanels();
bindTabEvents();
enhanceSaveButton();
addMailTestButtons();
handleSuccessMessage();
}
function moveLbWrapIntoForm() {
var form = document.querySelector('form');
var lbWrap = document.querySelector('.lb-wrap');
var submitLi = document.querySelector('.typecho-option-submit');
if (form && lbWrap && submitLi) {
form.insertBefore(lbWrap, submitLi);
}
}
function moveFieldsToPanels() {
var options = document.querySelectorAll('.typecho-option');
var panels = {
basic: document.querySelector('.lb-panel[data-panel="basic"]'),
display: document.querySelector('.lb-panel[data-panel="display"]'),
beian: document.querySelector('.lb-panel[data-panel="beian"]'),
function: document.querySelector('.lb-panel[data-panel="function"]'),
mail: document.querySelector('.lb-panel[data-panel="mail"]'),
other: document.querySelector('.lb-panel[data-panel="other"]')
};
var defaultPanel = panels.basic;
options.forEach(function (option, index) {
if (option.classList.contains('typecho-option-submit')) return;
var fieldName = null;
var input = option.querySelector('input[name], select[name], textarea[name]');
if (input) {
fieldName = input.name;
}
var tabKey = FIELD_TABS[fieldName] || 'other';
var targetPanel = panels[tabKey] || defaultPanel;
if (targetPanel) {
option.style.animationDelay = (index * 0.03) + 's';
targetPanel.appendChild(option);
}
});
Object.keys(panels).forEach(function (key) {
var panel = panels[key];
if (panel && panel.children.length === 0) {
panel.innerHTML = '<div style="padding:40px;text-align:center;color:#9ca3af;">该分类下暂无设置项</div>';
}
});
}
function bindTabEvents() {
var tabs = document.querySelectorAll('.lb-tab');
var panels = document.querySelectorAll('.lb-panel');
tabs.forEach(function (tab) {
tab.addEventListener('click', function () {
var targetTab = tab.getAttribute('data-tab');
if (!targetTab) return;
tabs.forEach(function (t) { t.classList.remove('active'); });
tab.classList.add('active');
panels.forEach(function (p) {
if (p.getAttribute('data-panel') === targetTab) {
p.classList.add('active');
} else {
p.classList.remove('active');
}
});
try {
localStorage.setItem('lb_admin_active_tab', targetTab);
} catch (e) {}
});
});
try {
var savedTab = localStorage.getItem('lb_admin_active_tab');
if (savedTab) {
var targetTabBtn = document.querySelector('.lb-tab[data-tab="' + savedTab + '"]');
if (targetTabBtn) {
targetTabBtn.click();
}
}
} catch (e) {}
}
function addMailTestButtons() {
var mailPanel = document.querySelector('.lb-panel[data-panel="mail"]');
if (!mailPanel) return;
var mailIcon = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="4" width="20" height="16" rx="2"/><polyline points="22,6 12,13 2,6"/></svg>';
var feishuIcon = '<svg viewBox="0 0 24 24" fill="currentColor"><path d="M3.4 20.4l17.45-7.48a1 1 0 000-1.84L3.4 3.6a.993.993 0 00-1.39.91L2 9.12c0 .5.37.93.87.99L17 12 2.87 13.88c-.5.07-.87.5-.87 1l.01 4.61c0 .71.73 1.2 1.39.91z"/></svg>';
var wecomIcon = '<svg viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M32.8 18.003 32.5 18C25.732 18 20 22.798 20 29c0 1.007.151 1.976.433 2.894A18 18 0 0 1 18.5 32c-1.809 0-3.54-.274-5.137-.775-.394-.123-1.828.696-3.039 1.389-.927.53-1.724.986-1.824.886-.094-.094.169-.718.476-1.448.446-1.06.986-2.346.664-2.552C6.21 27.305 4 23.866 4 20c0-6.627 6.492-12 14.5-12 7.186 0 13.151 4.326 14.3 10.003M16 16a2 2 0 1 1-4 0 2 2 0 0 1 4 0m7 2a2 2 0 1 0 0-4 2 2 0 0 0 0 4" fill="#ffffff"/><path fill-rule="evenodd" clip-rule="evenodd" d="M44 29c0 3.362-1.908 6.336-4.833 8.149-.13.08.169.858.446 1.583.237.618.459 1.196.387 1.268-.075.075-.802-.327-1.571-.752-.829-.458-1.706-.942-1.871-.888-1.262.413-2.63.64-4.058.64C26.149 39 21 34.523 21 29s5.149-10 11.5-10S44 23.477 44 29m-6-3.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0M28.5 27a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3" fill="#ffffff"/></svg>';
var dingtalkIcon = '<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M849.92 51.2H174.08c-67.8656 0-122.88 55.0144-122.88 122.88v675.84c0 67.8656 55.0144 122.88 122.88 122.88h675.84c67.8656 0 122.88-55.0144 122.88-122.88V174.08c0-67.8656-55.0144-122.88-122.88-122.88z m-97.17248 383.4112c-1.00352 4.61824-3.61472 10.84928-7.22944 19.18976l-0.50688 0.50176c-21.69856 46.01344-77.66016 136.13568-77.66016 136.13568l-0.50688-0.50176-16.57344 28.43136h79.17056L578.33472 819.2l34.16064-136.63744h-62.09024l21.69856-90.624c-17.58208 4.1216-38.28224 9.85088-62.592 18.08384 0 0-33.15712 19.18976-95.24736-37.26848 0 0-41.89696-37.2736-17.58208-46.01344 10.34752-4.1216 50.23232-8.84736 81.78176-12.95872 42.3936-5.72928 68.81792-8.84736 68.81792-8.84736s-130.90816 2.10944-161.95584-3.10784c-31.04256-4.62336-70.4256-56.97024-78.6688-102.48192 0 0-12.95872-24.81664 27.9296-12.95872 40.39168 11.8528 210.18112 46.01344 210.18112 46.01344S324.2496 365.2864 309.78048 348.70784c-14.46912-16.57856-42.99776-90.01984-39.38304-135.13216 0 0 1.50528-11.35104 12.95872-8.23808 0 0 162.55488 74.5472 273.77664 114.93376 111.8208 41.40032 208.57344 62.09536 195.61472 114.33984z" fill="#3296FA"/></svg>';
var pushplusIcon = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor"><path d="M205.3 174.6c0 21.1-14.2 38.1-31.7 38.1-7.1 0-12.8-1.2-17.2-3.7v-68c4.4-2.7 10.1-4.2 17.2-4.2 17.5 0 31.7 16.9 31.7 37.8zm52.6 67c-7.1 0-12.8 1.5-17.2 4.2v68c4.4 2.5 10.1 3.7 17.2 3.7 17.4 0 31.7-16.9 31.7-37.8 0-21.1-14.3-38.1-31.7-38.1zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zM185 255.1c41 0 74.2-35.6 74.2-79.6 0-44-33.2-79.6-74.2-79.6-12 0-24.1 3.2-34.6 8.8h-45.7V311l51.8-10.1v-50.6c8.6 3.1 18.1 4.8 28.5 4.8zm158.4 25.3c0-44-33.2-79.6-73.9-79.6-3.2 0-6.4.2-9.6.7-3.7 12.5-10.1 23.8-19.2 33.4-13.8 15-32.2 23.8-51.8 24.8V416l51.8-10.1v-50.6c8.6 3.2 18.2 4.7 28.7 4.7 40.8 0 74-35.6 74-79.6z"/></svg>';
var buttons = [
{ channel: 'mail', icon: mailIcon, label: '测试邮件' },
{ channel: 'feishu', icon: feishuIcon, label: '测试飞书' },
{ channel: 'wecom', icon: wecomIcon, label: '测试企业微信' },
{ channel: 'dingtalk', icon: dingtalkIcon, label: '测试钉钉' },
{ channel: 'pushplus', icon: pushplusIcon, label: '测试PushPlus' }
];
var wrap = document.createElement('div');
wrap.className = 'lb-test-actions';
var html = '<div class="lb-test-hint">测试通知发送(请先保存配置)</div>';
buttons.forEach(function (b) {
html += '<button type="button" class="lb-test-btn" data-channel="' + b.channel + '">' + b.icon + '<span>' + b.label + '</span></button> ';
});
html += '<span class="lb-test-result"></span>';
wrap.innerHTML = html;
mailPanel.appendChild(wrap);
wrap.querySelectorAll('.lb-test-btn').forEach(function (btn) {
btn.addEventListener('click', function () {
var channel = btn.getAttribute('data-channel');
var resultEl = wrap.querySelector('.lb-test-result');
btn.disabled = true;
resultEl.className = 'lb-test-result';
resultEl.textContent = '发送中…';
var url = (window.LB_SITE_URL || '') + '?lb_action=lb_test_notify&channel=' + channel;
fetch(url)
.then(function (r) { return r.text(); })
.then(function (text) {
var data = null;
try {
data = JSON.parse(text);
} catch (e) {
btn.disabled = false;
resultEl.className = 'lb-test-result err';
resultEl.textContent = '响应异常(' + text.slice(0, 60) + '…)';
return;
}
btn.disabled = false;
resultEl.className = 'lb-test-result ' + (data.ok ? 'ok' : 'err');
resultEl.textContent = data.msg || '发送完成';
})
.catch(function () {
btn.disabled = false;
resultEl.className = 'lb-test-result err';
resultEl.textContent = '请求失败,请检查网络或登录状态';
});
});
});
}
function enhanceSaveButton() {
var saveBtn = document.querySelector('.lb-tab-save');
if (!saveBtn) return;
var form = saveBtn.closest('form') || document.querySelector('.typecho-option-submit').closest('form');
if (!form) return;
form.addEventListener('submit', function () {
saveBtn.disabled = true;
saveBtn.style.opacity = '0.7';
saveBtn.style.cursor = 'not-allowed';
var originalText = saveBtn.querySelector('span:last-child');
if (originalText) {
originalText.textContent = '保存中...';
}
});
saveBtn.addEventListener('click', function (e) {
e.preventDefault();
if (saveBtn.disabled) return;
form.submit();
});
}
function handleSuccessMessage() {
var successMsg = document.querySelector('.success, .notice-success, .typecho-success');
if (successMsg) {
successMsg.style.display = 'none';
showTip('设置保存成功', 'success');
}
}
function showTip(message, type) {
var tip = document.createElement('div');
tip.className = 'lb-success-tip';
tip.style.background = type === 'success' ? 'var(--lb-success)' : 'var(--lb-danger)';
tip.textContent = message;
document.body.appendChild(tip);
setTimeout(function () {
tip.style.opacity = '0';
tip.style.transform = 'translateX(-50%) translateY(-10px)';
tip.style.transition = 'all 0.3s ease';
setTimeout(function () {
if (tip.parentNode) tip.parentNode.removeChild(tip);
}, 300);
}, 2500);
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();