码桶

发现社区成员的开源项目

飞扬 / LB_Down 公开
main
LB_Down/admin/option.js
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();
    }

})();