卡厄思
梦
境
菜单
首页
回到首页
WIKI工具
全站样式
全站JS
修改导航栏
测试
沙盒
可视化管理器
战斗员管理器
卡牌管理器
伙伴管理器
装备管理器
词典管理器
图鉴
战斗员
伙伴
装备
怪物卡牌
中立卡牌
词典
小工具
配队模拟器
节奏榜生成器
搜索
链入页面
相关更改
特殊页面
页面信息
最近更改
登录
微件
查看“︁BatchCreateEquipment”︁的源代码
←
微件:BatchCreateEquipment
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您没有权限编辑
微件
命名空间内的页面。
您可以查看和复制此页面的源代码。
<noinclude> 这是一个用于批量创建装备页面的Widget。 使用方法:在任何页面中添加 {{#widget:BatchCreateEquipment}} </noinclude> <includeonly> <div id="batch-create-equipment"> <style> #equipment-creator { border: 1px solid #ccc; padding: 20px; margin: 20px 0; background: #f9f9f9; border-radius: 5px; } #equipment-list { width: 100%; min-height: 150px; margin: 10px 0; padding: 10px; border: 1px solid #ddd; border-radius: 3px; font-family: monospace; } .create-btn { background: #36c; color: white; padding: 10px 20px; border: none; border-radius: 3px; cursor: pointer; font-size: 14px; margin-right: 10px; } .create-btn:hover { background: #2a52be; } .create-btn:disabled { background: #ccc; cursor: not-allowed; } #create-log { margin-top: 20px; padding: 10px; border: 1px solid #ddd; background: white; max-height: 300px; overflow-y: auto; display: none; border-radius: 3px; } .log-success { color: green; } .log-error { color: red; } .log-info { color: blue; } #progress-bar { width: 100%; height: 20px; border: 1px solid #ddd; border-radius: 3px; margin: 10px 0; display: none; background: white; } #progress-fill { height: 100%; background: #36c; border-radius: 3px; transition: width 0.3s; width: 0; } </style> <div id="equipment-creator"> <h3>批量创建装备页面</h3> <div> <label for="equipment-list"> <strong>装备名称列表</strong>(每行一个装备名称): </label> <textarea id="equipment-list" placeholder="装备名称1 装备名称2 装备名称3"></textarea> </div> <div style="margin: 10px 0;"> <label> <input type="checkbox" id="skip-existing" checked> 跳过已存在的页面 </label> </div> <div style="margin: 10px 0;"> <label> 创建延迟(毫秒): <input type="number" id="create-delay" value="1000" min="500" max="5000" style="width: 80px;"> </label> <small>(建议设置1000ms以上,避免请求过快)</small> </div> <div> <button class="create-btn" id="start-create">开始创建</button> <button class="create-btn" id="stop-create" style="display:none; background: #d33;">停止创建</button> <button class="create-btn" id="clear-log" style="background: #666;">清空日志</button> </div> <div id="progress-bar"> <div id="progress-fill"></div> </div> <div id="create-log"></div> </div> <script> // 等待MediaWiki模块加载 (function() { // 确保MediaWiki API可用 function initBatchCreator() { if (typeof mw === 'undefined' || !mw.Api) { setTimeout(initBatchCreator, 100); return; } var isCreating = false; var stopRequested = false; var api = new mw.Api(); var editToken = null; // 页面内容模板 function getPageContent(pageName) { return '{{面包屑|装备图鉴}}\n' + '<div style="display:flex;justify-content:center;align-items:center;flex-wrap:wrap;gap:5px">\n' + '{{#invoke:装备|displaypopup|{{PAGENAME}}|1}} {{#invoke:装备|displaypopup|{{PAGENAME}}|2}} {{#invoke:装备|displaypopup|{{PAGENAME}}|3}}{{#invoke:装备|displaypopup|{{PAGENAME}}|4}} {{#invoke:装备|displaypopup|{{PAGENAME}}|5}}\n' + '</div>\n' + '[[分类:装备]]'; } function addLog(message, type) { var logDiv = document.getElementById('create-log'); if (!logDiv) return; logDiv.style.display = 'block'; var logEntry = document.createElement('div'); logEntry.className = 'log-' + type; var timestamp = new Date().toLocaleTimeString(); logEntry.textContent = '[' + timestamp + '] ' + message; logDiv.appendChild(logEntry); logDiv.scrollTop = logDiv.scrollHeight; } function updateProgress(current, total) { var progressBar = document.getElementById('progress-bar'); var progressFill = document.getElementById('progress-fill'); if (!progressBar || !progressFill) return; progressBar.style.display = 'block'; var percentage = (current / total) * 100; progressFill.style.width = percentage + '%'; } function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } // 获取编辑令牌 async function getEditToken() { if (editToken) return editToken; try { var result = await api.get({ action: 'query', meta: 'tokens', type: 'csrf', format: 'json' }); editToken = result.query.tokens.csrftoken; return editToken; } catch (error) { console.error('获取编辑令牌失败:', error); throw error; } } async function checkPageExists(title) { try { var result = await api.get({ action: 'query', titles: title, format: 'json' }); var pages = result.query.pages; for (var pageId in pages) { return pageId !== '-1' && !pages[pageId].missing; } return false; } catch (error) { console.error('检查页面存在性失败:', error); return false; } } async function createPage(title, content) { try { var token = await getEditToken(); var result = await api.post({ action: 'edit', title: title, text: content, summary: '批量创建装备页面', createonly: true, token: token, format: 'json' }); return { success: true, result: result }; } catch (error) { return { success: false, error: error }; } } async function startBatchCreate() { if (isCreating) return; var equipmentList = document.getElementById('equipment-list').value.trim(); if (!equipmentList) { alert('请输入装备名称列表'); return; } var equipments = equipmentList.split('\n') .map(name => name.trim()) .filter(name => name); if (equipments.length === 0) { alert('没有有效的装备名称'); return; } isCreating = true; stopRequested = false; editToken = null; // 重置令牌 document.getElementById('start-create').style.display = 'none'; document.getElementById('stop-create').style.display = 'inline-block'; document.getElementById('stop-create').disabled = false; document.getElementById('stop-create').textContent = '停止创建'; document.getElementById('equipment-list').disabled = true; var skipExisting = document.getElementById('skip-existing').checked; var delay = parseInt(document.getElementById('create-delay').value) || 1000; addLog('开始批量创建装备页面,共 ' + equipments.length + ' 个', 'info'); var successCount = 0; var skipCount = 0; var errorCount = 0; for (var i = 0; i < equipments.length; i++) { if (stopRequested) { addLog('用户停止了创建过程', 'info'); break; } var equipmentName = equipments[i]; updateProgress(i + 1, equipments.length); try { // 检查页面是否存在 if (skipExisting) { var exists = await checkPageExists(equipmentName); if (exists) { addLog('页面 "' + equipmentName + '" 已存在,跳过', 'info'); skipCount++; await sleep(Math.min(delay / 2, 500)); continue; } } // 创建页面 var content = getPageContent(equipmentName); var result = await createPage(equipmentName, content); if (result.success) { addLog('成功创建页面: ' + equipmentName, 'success'); successCount++; } else { if (result.error && result.error.code === 'articleexists') { addLog('页面 "' + equipmentName + '" 已存在', 'info'); skipCount++; } else { var errorMsg = result.error ? (result.error.info || result.error.code || '未知错误') : '未知错误'; addLog('创建页面 "' + equipmentName + '" 失败: ' + errorMsg, 'error'); errorCount++; } } } catch (error) { addLog('处理页面 "' + equipmentName + '" 时出错: ' + error.message, 'error'); errorCount++; } // 延迟下一次请求 if (i < equipments.length - 1 && !stopRequested) { await sleep(delay); } } addLog('批量创建完成!成功: ' + successCount + ', 跳过: ' + skipCount + ', 失败: ' + errorCount, 'info'); isCreating = false; document.getElementById('start-create').style.display = 'inline-block'; document.getElementById('stop-create').style.display = 'none'; document.getElementById('equipment-list').disabled = false; } // 绑定事件 var startBtn = document.getElementById('start-create'); if (startBtn) { startBtn.addEventListener('click', startBatchCreate); } var stopBtn = document.getElementById('stop-create'); if (stopBtn) { stopBtn.addEventListener('click', function() { stopRequested = true; this.disabled = true; this.textContent = '正在停止...'; }); } var clearBtn = document.getElementById('clear-log'); if (clearBtn) { clearBtn.addEventListener('click', function() { var log = document.getElementById('create-log'); var progressBar = document.getElementById('progress-bar'); var progressFill = document.getElementById('progress-fill'); if (log) { log.innerHTML = ''; log.style.display = 'none'; } if (progressBar) { progressBar.style.display = 'none'; } if (progressFill) { progressFill.style.width = '0'; } }); } addLog('装备批量创建工具已就绪', 'info'); } // 开始初始化 if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initBatchCreator); } else { initBatchCreator(); } })(); </script> </div> </includeonly>
返回
微件:BatchCreateEquipment
。