📝

审稿管理系统

请输入密码进入

📝 审稿管理系统

期刊 / 论文状态截止日期审稿轮次审稿人备注操作
'; } // Round management var _rd = []; function _rb() { var c = document.getElementById('rc'); if (!c) return; c.innerHTML = _rd.map(function(r,i) { return '
'+ 'R'+(r.round||i+1)+''+ ''+ ''+ ''+ ''+ ''+ '
'; }).join(''); } function addR() { _rd.push({round:_rd.length+1, type:'修回', reviewer:'', date:'', notes:''}); _rb(); } // ═══════════ SAVE ═══════════ function save() { var data = load(); // Collect rounds var rounds = []; var divs = document.querySelectorAll('#rc > div'); divs.forEach(function(div, i) { rounds.push({ round: i+1, type: (div.querySelector('.rt')?.value || '修回'), reviewer: (div.querySelector('.rr')?.value || ''), date: (div.querySelector('.rd')?.value || ''), notes: (div.querySelector('.rn')?.value || '') }); }); var entry = { journal: document.getElementById('f_j')?.value || '', manuscriptId: document.getElementById('f_m')?.value || '', title: document.getElementById('f_t')?.value || '', status: document.getElementById('f_s')?.value || 'pending', deadline: document.getElementById('f_d')?.value || '', rounds: rounds, notes: document.getElementById('f_n')?.value || '', updatedAt: new Date().toISOString() }; if (editId) { var idx = data.findIndex(function(r){return r.id===editId;}); if (idx >= 0) { entry.id = editId; entry.createdAt = data[idx].createdAt; data[idx] = entry; } } else { entry.id = 'M' + String(Date.now()).slice(-6); entry.createdAt = new Date().toISOString(); data.push(entry); } save(data); closeModal(); render(); toast('✅ 已保存'); } function del(id) { if (!confirm('确定删除?')) return; var data = load().filter(function(r){return r.id!==id;}); save(data); render(); toast('🗑 已删除'); } // ═══════════ IMPORT / EXPORT ═══════════ function exportData() { var b = new Blob([JSON.stringify(load(),null,2)], {type:'application/json'}); var a = document.createElement('a'); a.href = URL.createObjectURL(b); a.download = 'reviews-'+new Date().toISOString().slice(0,10)+'.json'; a.click(); toast('📥 已导出'); } function importData() { var inp = document.createElement('input'); inp.type = 'file'; inp.accept = '.json'; inp.onchange = function(e) { var f = e.target.files[0]; if (!f) return; var r = new FileReader(); r.onload = function(ev) { try { var d = JSON.parse(ev.target.result); if (!Array.isArray(d)) throw 0; if (!confirm('导入 '+d.length+' 条记录,覆盖当前数据?')) return; save(d); render(); toast('📤 已导入 '+d.length+' 条'); } catch(x) { alert('格式错误'); } }; r.readAsText(f); }; inp.click(); } // ═══════════ TOAST ═══════════ function toast(msg) { var t = document.getElementById('toast'); t.textContent = msg; t.classList.add('on'); setTimeout(function(){ t.classList.remove('on'); }, 2000); } // Init window.addEventListener('DOMContentLoaded', function() { if (sessionStorage.getItem('mr_auth') === '1') render(); });