From 07f018c28075f4bb3b96fc143de58a2b69d87baf Mon Sep 17 00:00:00 2001 From: KIMI Date: Sun, 9 Aug 2026 00:54:52 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=A1=E7=90=86=E9=A1=B5=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=EF=BC=9A=E5=91=98=E5=B7=A5=E5=88=A0=E9=99=A4=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=20+=20=E7=9B=B4=E6=8E=A5=E9=80=89=E6=8B=A9=20CSV=20=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=AF=BC=E5=85=A5=EF=BC=88=E4=B8=8D=E7=94=A8=E5=A4=8D?= =?UTF-8?q?=E5=88=B6=E7=B2=98=E8=B4=B4=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - server.js 新增 POST /api/admin/delete:移除本地账号并逐平台 force_logout - admin.html 员工行新增删除按钮(带确认);导入区新增选择文件导入,自动去 BOM --- account-service/README.md | 1 + account-service/admin.html | 27 +++++++++++++++++++++++++++ account-service/server.js | 11 +++++++++++ account-service/t-data/e.json | 1 + account-service/t-srv.log | 0 5 files changed, 40 insertions(+) create mode 100644 account-service/t-data/e.json create mode 100644 account-service/t-srv.log diff --git a/account-service/README.md b/account-service/README.md index fb5c90f..e07e18f 100644 --- a/account-service/README.md +++ b/account-service/README.md @@ -39,6 +39,7 @@ POST /api/login | POST | `/api/admin/disable` | 停用 `{staffNo}`,立即无法登录并被踢下线 | | POST | `/api/admin/enable` | 启用 `{staffNo}` | | POST | `/api/admin/reset_password` | 重置密码 `{staffNo, password}` | +| POST | `/api/admin/delete` | 删除 `{staffNo}`,立即无法登录并被踢下线(OpenIM 侧同名用户保留但本服务不再为其签发令牌,等于不可用) | 管理页:浏览器打开 `http://<服务器IP>:10010/`,输入管理口令即可操作,无需写接口。 diff --git a/account-service/admin.html b/account-service/admin.html index f564735..dda615c 100644 --- a/account-service/admin.html +++ b/account-service/admin.html @@ -54,7 +54,9 @@
支持逗号或 Tab 分隔(Excel 复制出来直接粘贴即可);重复工号会覆盖原账号(姓名与密码重置、状态恢复为启用)。
+ +
@@ -110,6 +112,7 @@ async function loadList() { ? `` : ``} + `).join('') || '暂无员工,请先导入'; } catch (e) { show(e.message, false); } @@ -151,6 +154,30 @@ async function doImport() { } catch (e) { show(e.message, false); } } +// 直接选择模板 CSV 文件导入,不用复制粘贴 +async function importFile(input) { + const file = input.files[0]; + input.value = ''; + if (!file) return; + try { + let text = await file.text(); + if (text.charCodeAt(0) === 0xFEFF) text = text.slice(1); // 去 BOM + const d = await api('/api/admin/import', { csv: text }); + const bad = d.results.filter(r => !r.ok); + show('文件「' + file.name + '」导入完成:成功 ' + d.imported + ' / ' + d.total + (bad.length ? '\n失败明细:\n' + bad.map(b => b.line + ' → ' + b.msg).join('\n') : ''), bad.length === 0); + loadList(); + } catch (e) { show(e.message, false); } +} + +async function deleteEmp(staffNo) { + if (!confirm('确定删除 ' + staffNo + ' 吗?删除后该员工立即无法登录,需要重新添加才能恢复。')) return; + try { + await api('/api/admin/delete', { staffNo }); + show('已删除 ' + staffNo, true); + loadList(); + } catch (e) { show(e.message, false); } +} + // 下载 CSV 导入模板(加 BOM 让 Excel 正确识别中文) function downloadTemplate() { const csv = '\uFEFF工号,姓名,初始密码\n10001,张三,abc123456\n10002,李四,abc123456\n'; diff --git a/account-service/server.js b/account-service/server.js index 7435fa6..6cb61e9 100644 --- a/account-service/server.js +++ b/account-service/server.js @@ -260,6 +260,17 @@ const routes = { ok(res, publicView(emp, body.staffNo)); }, + // 删除员工:本地账号直接移除(立即无法再登录并被踢下线)。 + // 注意:OpenIM 侧的同名用户不删(其公开 API 不提供删除),但删除后本服务不再为其签发令牌,等于不可用。 + 'POST /api/admin/delete': async (req, res, body) => { + const emp = employees[body.staffNo]; + if (!emp) return fail(res, '员工不存在'); + delete employees[body.staffNo]; + saveStore(); + forceLogoutAll(body.staffNo); // 异步踢下线,不等结果 + ok(res, { staffNo: body.staffNo, deleted: true }); + }, + 'POST /api/admin/reset_password': async (req, res, body) => { const emp = employees[body.staffNo]; if (!emp) return fail(res, '员工不存在'); diff --git a/account-service/t-data/e.json b/account-service/t-data/e.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/account-service/t-data/e.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/account-service/t-srv.log b/account-service/t-srv.log new file mode 100644 index 0000000..e69de29