Commit d77eece8 d77eece83c58289ab1177458c3c0132f83e0d97c by 沈秋雨

refactor(auth): 优化审核人身份管理及登出功能

1 parent efb52e78
...@@ -565,7 +565,12 @@ ...@@ -565,7 +565,12 @@
565 565
566 .sync-notice.show { display: block; } 566 .sync-notice.show { display: block; }
567 567
568 #reviewerInput { width: 130px; } 568 #reviewerDisplay {
569 font-weight: 600;
570 color: var(--accent);
571 padding: 0 6px;
572 }
573 #logoutBtn { margin-left: 4px; padding: 2px 10px; font-size: 12px; }
569 574
570 .login-overlay { 575 .login-overlay {
571 position: fixed; 576 position: fixed;
...@@ -650,8 +655,8 @@ ...@@ -650,8 +655,8 @@
650 </select> 655 </select>
651 <button id="exportBtn">导出标注</button> 656 <button id="exportBtn">导出标注</button>
652 <button id="importReviewedBtn">入库审核通过</button> 657 <button id="importReviewedBtn">入库审核通过</button>
653 <label for="reviewerInput">审核人</label> 658 <span>审核人:</span><span id="reviewerDisplay"></span>
654 <input id="reviewerInput" maxlength="64" placeholder="昵称"> 659 <button id="logoutBtn" class="secondary">登出</button>
655 <button id="reloadBtn" class="secondary">刷新</button> 660 <button id="reloadBtn" class="secondary">刷新</button>
656 </div> 661 </div>
657 </header> 662 </header>
...@@ -727,7 +732,8 @@ ...@@ -727,7 +732,8 @@
727 pageSizeSelect: document.getElementById('pageSizeSelect'), 732 pageSizeSelect: document.getElementById('pageSizeSelect'),
728 exportBtn: document.getElementById('exportBtn'), 733 exportBtn: document.getElementById('exportBtn'),
729 importReviewedBtn: document.getElementById('importReviewedBtn'), 734 importReviewedBtn: document.getElementById('importReviewedBtn'),
730 reviewerInput: document.getElementById('reviewerInput'), 735 reviewerDisplay: document.getElementById('reviewerDisplay'),
736 logoutBtn: document.getElementById('logoutBtn'),
731 reloadBtn: document.getElementById('reloadBtn'), 737 reloadBtn: document.getElementById('reloadBtn'),
732 prevPageBtn: document.getElementById('prevPageBtn'), 738 prevPageBtn: document.getElementById('prevPageBtn'),
733 nextPageBtn: document.getElementById('nextPageBtn'), 739 nextPageBtn: document.getElementById('nextPageBtn'),
...@@ -782,7 +788,12 @@ ...@@ -782,7 +788,12 @@
782 } else { 788 } else {
783 localStorage.removeItem('l2AccessCode'); 789 localStorage.removeItem('l2AccessCode');
784 } 790 }
785 els.reviewerInput.value = state.reviewer; 791 els.reviewerDisplay.textContent = state.reviewer;
792 // 恢复该审核人的 clientToken,保证未提交的领取记录可以继续操作
793 const savedToken = localStorage.getItem(`l2ClientToken:${state.reviewer}`);
794 state.clientToken = savedToken || newClientToken();
795 localStorage.setItem(`l2ClientToken:${state.reviewer}`, state.clientToken);
796 sessionStorage.setItem('l2ReviewClientToken', state.clientToken);
786 els.loginAccessCode.value = ''; 797 els.loginAccessCode.value = '';
787 els.loginOverlay.classList.add('hidden'); 798 els.loginOverlay.classList.add('hidden');
788 resolve(); 799 resolve();
...@@ -797,7 +808,8 @@ ...@@ -797,7 +808,8 @@
797 808
798 async function initReviewerIdentity() { 809 async function initReviewerIdentity() {
799 state.reviewer = (localStorage.getItem('l2ReviewerName') || '').trim(); 810 state.reviewer = (localStorage.getItem('l2ReviewerName') || '').trim();
800 state.clientToken = sessionStorage.getItem('l2ReviewClientToken') || newClientToken(); 811 state.clientToken = localStorage.getItem(`l2ClientToken:${state.reviewer}`) || newClientToken();
812 localStorage.setItem(`l2ClientToken:${state.reviewer}`, state.clientToken);
801 sessionStorage.setItem('l2ReviewClientToken', state.clientToken); 813 sessionStorage.setItem('l2ReviewClientToken', state.clientToken);
802 state.authToken = sessionStorage.getItem('l2ReviewAuthToken') || ''; 814 state.authToken = sessionStorage.getItem('l2ReviewAuthToken') || '';
803 els.loginReviewer.value = state.reviewer; 815 els.loginReviewer.value = state.reviewer;
...@@ -814,7 +826,7 @@ ...@@ -814,7 +826,7 @@
814 session_token: state.authToken 826 session_token: state.authToken
815 }); 827 });
816 state.authToken = session.session_token; 828 state.authToken = session.session_token;
817 els.reviewerInput.value = state.reviewer; 829 els.reviewerDisplay.textContent = state.reviewer;
818 els.loginOverlay.classList.add('hidden'); 830 els.loginOverlay.classList.add('hidden');
819 return; 831 return;
820 } catch { 832 } catch {
...@@ -1709,23 +1721,16 @@ ...@@ -1709,23 +1721,16 @@
1709 } 1721 }
1710 1722
1711 els.runSelect.addEventListener('change', () => loadRun(els.runSelect.value)); 1723 els.runSelect.addEventListener('change', () => loadRun(els.runSelect.value));
1712 els.reviewerInput.addEventListener('change', async () => { 1724 els.logoutBtn.addEventListener('click', async () => {
1713 const nextReviewer = els.reviewerInput.value.trim();
1714 if (!nextReviewer) {
1715 els.reviewerInput.value = state.reviewer;
1716 return;
1717 }
1718 if (currentQuery()?.review_claimed_by === state.reviewer) { 1725 if (currentQuery()?.review_claimed_by === state.reviewer) {
1719 alert('请先完成当前审核,或等待领取过期后再切换审核人。'); 1726 if (!confirm('当前还有未提交的审核记录,确认登出?\n登出后领取将自然过期,其他人可重新领取。')) return;
1720 els.reviewerInput.value = state.reviewer;
1721 return;
1722 } 1727 }
1723 els.reviewerInput.value = state.reviewer;
1724 sessionStorage.removeItem('l2ReviewAuthToken'); 1728 sessionStorage.removeItem('l2ReviewAuthToken');
1725 state.authToken = ''; 1729 state.authToken = '';
1726 await showReviewLogin(nextReviewer); 1730 state.reviewer = '';
1727 state.clientToken = newClientToken(); 1731 els.reviewerDisplay.textContent = '';
1728 sessionStorage.setItem('l2ReviewClientToken', state.clientToken); 1732 await showReviewLogin();
1733 // 不重置 clientToken,登出后同名称登录可继续操作已领取的记录
1729 await loadGroups(); 1734 await loadGroups();
1730 renderAll(); 1735 renderAll();
1731 }); 1736 });
......