feat: server 一次性离职确认端点 + WebUI 重构

- 确认端点单元测试:有效/复用/过期/串用/乱写 token 各测一遍,token 即凭证不经 Auth
- WebUI 重建:对齐新 API 的操作类型(含 delete_user)、用户生命周期状态视图、
  概览含离职待确认列表与被跳过告警、「立即快照」与「立即物化」触发按钮、
  部门分组展示 groupId;重编译 app.css/app.js 并提交产物
- 界面文案改指 LLDAP(不再提 OpenLDAP),确认弹窗说明离职才物理删除
This commit is contained in:
2026-09-29 23:56:30 +08:00
parent 0fffdd5ccb
commit e187369821
6 changed files with 346 additions and 127 deletions
+28 -8
View File
@@ -16,7 +16,7 @@
<span class="inline-block size-3 rounded-full bg-primary"></span>
<h1 class="card-title text-lg m-0">idsync</h1>
</div>
<p class="text-sm text-base-content/60 mb-4">飞书通讯录 → OpenLDAP 同步</p>
<p class="text-sm text-base-content/60 mb-4">飞书通讯录 → LLDAP 同步</p>
<div id="loginError" class="alert alert-error text-sm mb-3 hidden"></div>
@@ -37,7 +37,7 @@
<div class="flex-1 flex items-center gap-2">
<span class="inline-block size-3 rounded-full bg-primary"></span>
<span class="text-lg font-semibold">idsync</span>
<span class="hidden sm:inline text-sm text-base-content/50">飞书通讯录 → OpenLDAP</span>
<span class="hidden sm:inline text-sm text-base-content/50">飞书通讯录 → LLDAP</span>
</div>
<div class="flex-none flex items-center gap-2">
<button id="themeToggle" class="btn btn-sm btn-ghost" title="切换明暗主题">主题</button>
@@ -68,8 +68,8 @@
</div>
<div class="card bg-base-100 shadow-sm">
<div class="card-body">
<span class="text-sm text-base-content/60">离职账号</span>
<span id="statInactive" class="text-3xl font-semibold">–</span>
<span class="text-sm text-base-content/60">在飞书可见/待确认离职</span>
<span id="statPending" class="text-3xl font-semibold">–</span>
</div>
</div>
<div class="card bg-base-100 shadow-sm">
@@ -85,15 +85,33 @@
<div class="card-body">
<h2 class="card-title text-base">服务状态</h2>
<div id="connStatus" class="space-y-2 text-sm"></div>
<div id="skippedStatusWrap" class="hidden mt-2 text-sm rounded-lg bg-warning/10 px-3 py-2">
有 <span id="skippedStatus" class="font-semibold"></span> 名用户因缺少企业邮箱被跳过,
请到用户页查看并处理,避免他们一直没被同步。
</div>
</div>
</div>
<div class="card bg-base-100 shadow-sm">
<div class="card-body">
<h2 class="card-title text-base">上次同步</h2>
<h2 class="card-title text-base">上次物化</h2>
<div id="lastRunInfo" class="text-sm text-base-content/70">暂无记录</div>
</div>
</div>
</div>
<!-- 离职待确认 -->
<div class="card bg-base-100 shadow-sm mt-4">
<div class="card-body">
<div class="flex items-center justify-between mb-1">
<h2 class="card-title text-base">离职待确认</h2>
<button id="refreshPending" class="btn btn-sm btn-outline">刷新</button>
</div>
<p class="text-sm text-base-content/60 mb-2">
这些用户已在飞书确认离职并收到确认卡片,等待人工点击确认后才会被删除。
</p>
<ul id="pendingRows" class="divide-y divide-base-200"></ul>
</div>
</div>
</section>
<!-- 用户 -->
@@ -153,6 +171,7 @@
</p>
</div>
<div class="flex gap-2">
<button id="snapshotBtn" class="btn btn-sm btn-neutral">立即快照</button>
<button id="previewBtn" class="btn btn-sm btn-outline">重新计算</button>
<button id="applyBtn" class="btn btn-sm btn-primary">应用变更</button>
</div>
@@ -212,9 +231,10 @@
<dialog id="applyModal" class="modal">
<div class="modal-box">
<h3 class="text-lg font-semibold mb-2">确认应用变更</h3>
<p class="text-sm text-base-content/70 mb-4">
将对 OpenLDAP 执行下列变更。用户密码不会被修改,Authelia 重置的密码不受影响。
</p>
<p class="text-sm text-base-content/70 mb-4">
将对 LLDAP 执行下列变更。密码由 LLDAP 独占并交给 Authelia 管理,程序绝不写入;
仅标记「已确认离职」的用户会被物理删除。
</p>
<div id="applyModalBody" class="text-sm mb-4"></div>
<div class="modal-action">
<button id="applyCancel" class="btn btn-ghost">取消</button>