普通用户也支持新建群聊

This commit is contained in:
2026-07-28 19:02:23 +08:00
parent d4a512bc6e
commit 2e9da6c1ac
6 changed files with 103 additions and 174 deletions

View File

@@ -22,7 +22,7 @@ function renderPurchasePanel(items) {
Object.keys(groups).sort().reverse().forEach(month => {
const monthItems = groups[month];
const monthTotal = monthItems.reduce((s, i) => s + (i.amount||0), 0);
html += '<div class="purchase-month-group"><div class="purchase-month-header"><span>' + month + '</span><span>' + monthTotal + '</span></div>';
html += '<details class="purchase-month-group" open><summary class="purchase-month-header"><span>' + month + '</span><span>' + monthTotal + '</span></summary>';
monthItems.forEach(item => {
const timeShort = item.created_at.split(' ')[1]?.substring(0,5) || '';
const dateShort = item.created_at.split(' ')[0]?.substring(5) || '';
@@ -31,12 +31,12 @@ function renderPurchasePanel(items) {
<div class="item-main"><span class="item-name">${escapeHtml(item.item)}</span><span class="item-amount">${item.amount}</span></div>
<div class="item-meta">
<span>${dateShort} ${timeShort}</span>
<span>${item.quantity} ${item.invoice_type !== '无票' ? '\u00b7 ' + item.invoice_type : ''}</span>
<span>x${item.quantity} ${item.invoice_type !== '无票' ? '· ' + item.invoice_type : ''}</span>
<span class="status-badge ${item.status==='已完成'?'done':''}">${item.status}</span>
</div>
</div>`;
});
html += '</div>';
html += '</details>';
});
container.innerHTML = html;
}
@@ -279,12 +279,17 @@ async function openSummary() {
function closeSummaryModal() { document.getElementById('summary-modal').classList.add('hidden'); }
function openCreateRoom() { document.getElementById('create-modal').classList.remove('hidden'); }
function openCreateRoom() {
document.getElementById('create-modal').classList.remove('hidden');
const isAdmin = localStorage.getItem('isAdmin') === 'true';
document.getElementById('white-list').style.display = isAdmin ? '' : 'none';
}
function closeCreateModal() { document.getElementById('create-modal').classList.add('hidden'); }
async function confirmCreateRoom() {
const name = document.getElementById('new-room-name').value.trim();
if (!name) return alert('\u8bf7\u8f93\u5165\u540d\u79f0');
const whiteList = document.getElementById('white-list').value.trim();
if (!name) return alert('请输入名称');
const isAdmin = localStorage.getItem('isAdmin') === 'true';
const whiteList = isAdmin ? document.getElementById('white-list').value.trim() : localStorage.getItem('currentUser');
const token = Store.getToken();
await fetch('/api/rooms', { method: 'POST', headers: { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' }, body: JSON.stringify({ name, whiteList }) });
closeCreateModal();
@@ -294,9 +299,11 @@ async function confirmCreateRoom() {
function openManageRoom(roomId) {
const room = Store.rooms.find(r => r.id === roomId);
if (!room) return;
document.getElementById('manage-title').textContent = '\u7f16\u8f91\u7fa4\u804a';
const isAdmin = localStorage.getItem('isAdmin') === 'true';
document.getElementById('manage-title').textContent = '编辑群聊';
document.getElementById('manage-room-name').value = room.name;
document.getElementById('manage-white-list').value = room.white_list || '';
document.getElementById('manage-white-list').style.display = isAdmin ? '' : 'none';
document.getElementById('manage-modal').dataset.roomId = roomId;
document.getElementById('manage-modal').classList.remove('hidden');
}
@@ -306,15 +313,16 @@ function closeManageModal() { document.getElementById('manage-modal').classList.
async function saveRoom() {
const roomId = document.getElementById('manage-modal').dataset.roomId;
const name = document.getElementById('manage-room-name').value.trim();
const whiteList = document.getElementById('manage-white-list').value.trim();
if (!name) return alert('\u8bf7\u8f93\u5165\u7fa4\u804a\u540d\u79f0');
const isAdmin = localStorage.getItem('isAdmin') === 'true';
const whiteList = isAdmin ? document.getElementById('manage-white-list').value.trim() : undefined;
if (!name) return alert('请输入群聊名称');
const token = Store.getToken();
const res = await fetch('/api/rooms/' + roomId, {
method: 'PUT', headers: { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' },
body: JSON.stringify({ name, whiteList })
});
if (res.ok) { closeManageModal(); loadRooms(); }
else { const err = await res.json(); alert(err.error || '\u66f4\u65b0\u5931\u8d25'); }
else { const err = await res.json(); alert(err.error || '更新失败'); }
}
async function deleteRoom() {