From 7049ce6a1774896b6f149c25b453cb4120aa38af Mon Sep 17 00:00:00 2001 From: Default User Date: Wed, 4 Feb 2026 16:35:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=8C=E7=BB=B4=E7=A0=81?= =?UTF-8?q?=E5=90=88=E9=9B=86=E9=A1=B5=E9=9D=A2=E7=9A=84=E7=AD=9B=E9=80=89?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=8C=E5=B0=86=E4=BB=96=E4=BA=BA=E4=BA=8C?= =?UTF-8?q?=E7=BB=B4=E7=A0=81=E6=94=B9=E4=B8=BA=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E4=B8=AD=E5=AE=9E=E9=99=85=E5=AD=98=E5=9C=A8=E7=9A=84=E4=BA=BA?= =?UTF-8?q?=E7=9A=84=E5=90=8D=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- qr-collection.html | 108 +++++++++++++++++++++++++++------------------ server.js | 12 ++++- 2 files changed, 76 insertions(+), 44 deletions(-) diff --git a/qr-collection.html b/qr-collection.html index 395dafc..f7186aa 100644 --- a/qr-collection.html +++ b/qr-collection.html @@ -296,16 +296,32 @@ const response = await fetch(apiUrl); const data = await response.json(); - if (data.success && data.qrCodes && data.qrCodes.length > 0) { - // 渲染二维码合集 - renderQrCollection(data.qrCodes, user, data.isAdmin); + if (data.success) { + // 动态生成筛选按钮 + if (data.isAdmin && data.invitees && data.invitees.length > 0) { + generateFilterButtons(data.invitees, user); + } + + if (data.qrCodes && data.qrCodes.length > 0) { + // 渲染二维码合集 + renderQrCollection(data.qrCodes, user, data.isAdmin); + } else { + // 显示空状态 + qrCollectionElement.innerHTML = ` +
+ 空状态 +

暂无二维码

+

请先生成邀请二维码

+
+ `; + } } else { - // 显示空状态 + // 显示错误状态 qrCollectionElement.innerHTML = `
- 空状态 -

暂无二维码

-

请先生成邀请二维码

+ 错误状态 +

加载失败

+

请稍后重试

`; } @@ -320,6 +336,43 @@ `; } } + + // 动态生成筛选按钮 + function generateFilterButtons(invitees, currentUser) { + const filterButtonsContainer = document.querySelector('.filter-buttons'); + if (!filterButtonsContainer) return; + + // 清空现有按钮,保留"全部"和"我的二维码" + filterButtonsContainer.innerHTML = ` + + + `; + + // 添加每个邀请者的筛选按钮 + invitees.forEach(invitee => { + // 跳过当前用户自己 + if (invitee.inviter && invitee.inviter !== (currentUser.name || currentUser.userName)) { + const button = document.createElement('button'); + button.className = 'filter-btn'; + button.dataset.filter = `invitee_${encodeURIComponent(invitee.inviter)}`; + button.dataset.inviter = invitee.inviter; + button.textContent = invitee.inviter; + filterButtonsContainer.appendChild(button); + } + }); + + // 默认选中"全部" + document.querySelector('.filter-btn[data-filter="all"]').classList.add('active'); + + // 绑定筛选按钮事件 + document.querySelectorAll('.filter-btn').forEach(btn => { + btn.addEventListener('click', function() { + if (!this.disabled) { + filterQrCodes(this.dataset.filter, this.dataset.inviter); + } + }); + }); + } // 渲染二维码合集 function renderQrCollection(qrCodes, currentUser, isAdmin) { @@ -372,7 +425,7 @@ } // 筛选二维码 - function filterQrCodes(filter) { + function filterQrCodes(filter, inviterName) { const user = loadUserInfo(); const qrCollectionElement = document.getElementById('qrCollection'); @@ -398,13 +451,14 @@ let filteredQrCodes = data.qrCodes; if (filter === 'me' && user) { + // 筛选当前用户自己的二维码 filteredQrCodes = data.qrCodes.filter(qrCode => qrCode.inviter === (user.name || user.userName) ); - } else if (filter === 'others' && user && data.isAdmin) { - // 只有管理员可以查看他人二维码 + } else if (filter.startsWith('invitee_') && inviterName) { + // 筛选特定邀请者的二维码 filteredQrCodes = data.qrCodes.filter(qrCode => - qrCode.inviter !== (user.name || user.userName) + qrCode.inviter === inviterName ); } @@ -427,39 +481,7 @@ // 页面加载时加载二维码合集 window.onload = function() { - const user = loadUserInfo(); - - // 根据用户角色调整筛选按钮 - if (user) { - // 判断用户角色 - const isAdmin = user.projectName && (user.projectName.includes('管理员') || user.projectName.includes('Admin')); - - if (!isAdmin) { - // 非管理员用户,只保留"我的二维码"按钮 - document.querySelectorAll('.filter-btn').forEach(btn => { - if (btn.dataset.filter !== 'me') { - btn.disabled = true; - btn.style.opacity = '0.5'; - btn.style.cursor = 'not-allowed'; - } - }); - - // 默认选中"我的二维码" - document.querySelector('.filter-btn[data-filter="me"]').classList.add('active'); - document.querySelector('.filter-btn[data-filter="all"]').classList.remove('active'); - } - } - loadQrCollection(); - - // 绑定筛选按钮事件 - document.querySelectorAll('.filter-btn').forEach(btn => { - btn.addEventListener('click', function() { - if (!this.disabled) { - filterQrCodes(this.dataset.filter); - } - }); - }); }; diff --git a/server.js b/server.js index d3d06c8..9c0e99f 100644 --- a/server.js +++ b/server.js @@ -269,6 +269,15 @@ const server = http.createServer(async (req, res) => { console.log('获取二维码合集成功,数量:', qrCodes.length); + // 获取所有邀请者列表(仅管理员) + let invitees = []; + if (isAdmin) { + const [inviteeRows] = await pool.execute( + 'SELECT DISTINCT inviter, inviter_phone as inviterPhone, projectName as inviterProjectName FROM certificate WHERE inviter IS NOT NULL AND qrCodeUrl IS NOT NULL' + ); + invitees = inviteeRows; + } + res.writeHead(200, { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*', @@ -278,7 +287,8 @@ const server = http.createServer(async (req, res) => { res.end(JSON.stringify({ success: true, qrCodes: qrCodes, - isAdmin: isAdmin + isAdmin: isAdmin, + invitees: invitees })); } catch (error) { console.error('获取二维码合集失败:', error.message);