bea288e414
== 已部署上线 (9项) == - 代办事项真实数据源集成 (企微审批API 8bug修复链) - H5/坐席端 Logo样式统一+绿色背景 - 视频引导页修复 (localStorage key v2) - 坐席端 v9 Vue版本修复 (ElMessage._context) - 截图按钮 v10 修复 (getDisplayMedia user gesture) - 扫码样式恢复+H5扫码登录跳转修复 - H5截图快捷键提示 == 代码完成待部署 (3项) == - 知识迭代3Bug修复 (#8 POST端点/#7 MERGE幂等/#6 过期检查) - 会议室预定-小鱼易联终端 (40文件, 40/40测试通过) - IT资产升级审批推送 (asset_service.py) == 需求文档 (2项) == - 坐席端AI辅助消息框-PRD (4项新功能确认) - 坐席端布局优化建议 v2.0 (7天计划) == 新增文档 == - 日报-2026-07-11.md - 知识迭代Bug修复报告-20260711.md - 会议室预定-部署指南.md - CHANGELOG.md 更新 == 测试 == - test_todo_integration.py: 40/40 - test_meetingroom.py: 40/40 - test_bugfix_ki_suggestions.py: 21/21
5 lines
6.1 KiB
JavaScript
5 lines
6.1 KiB
JavaScript
import{d as L,o as W,b as r,c,e as n,f as o,W as q,j as w,ab as P,w as l,a8 as B,t as p,V as A,n as z,r as T,v as O,S as U,E as M,i as m,a2 as G,g as y,T as J,U as Q,h as X,Y as Z}from"./index-CcYCuTIa.js";import{a as N}from"./index-CPDTx6RU.js";import{_ as ee}from"./_plugin-vue_export-helper-DlAUqK2U.js";async function te(k={}){return await N.get("/auth/otp-admin-users",{params:k})}async function ae(k){return await N.post(`/auth/otp-admin-reset/${encodeURIComponent(k)}`)}const se={class:"mfa-manage-page"},ne={class:"filter-bar"},oe={class:"stat-cards"},le={class:"stat-card"},ie={class:"stat-value"},de={class:"stat-card stat-card--success"},re={class:"stat-value"},ue={class:"stat-card stat-card--info"},ce={class:"stat-value"},pe={class:"data-table-wrapper"},_e={key:0},me={key:1,class:"text-muted"},fe={key:0,class:"text-muted"},ge={key:0},ve={key:1,class:"text-muted"},ye={key:0},be={key:1,class:"text-muted"},he={key:1,class:"text-muted"},ke={class:"pagination-bar"},xe=L({__name:"MfaManage",setup(k){const b=T(!1),h=T([]),x=T(""),u=O({keyword:"",bound:""}),i=O({page:1,pageSize:20,total:0}),D=U(()=>h.value.filter(s=>s.mfa_enabled).length),E=U(()=>h.value.filter(s=>!s.mfa_enabled).length);async function f(){var s,e;b.value=!0;try{const a={page:i.page,page_size:i.pageSize};u.keyword.trim()&&(a.keyword=u.keyword.trim()),u.bound&&(a.bound=u.bound);const d=await te(a);h.value=d.items||[],i.total=d.total||0}catch(a){h.value=[],i.total=0;const d=((e=(s=a==null?void 0:a.response)==null?void 0:s.data)==null?void 0:e.message)||(a==null?void 0:a.message)||"加载用户 OTP 列表失败";M.error(d)}finally{b.value=!1}}function S(){i.page=1,f()}function R(){u.keyword="",u.bound="",i.page=1,f()}function I(){i.page=1,f()}async function j(s){var a,d;const e=s.name||s.employee_id;try{await Z.confirm(`确认清除 OTP 绑定?
|
|
|
|
坐席「${e} (${s.employee_id})」的 OTP 二次验证将被清除。
|
|
该坐席下次登录时需重新绑定。`,"清除 OTP 绑定确认",{type:"warning",confirmButtonText:"确认清除",cancelButtonText:"取消",confirmButtonClass:"el-button--danger"})}catch{return}x.value=s.employee_id;try{await ae(s.employee_id),M.success(`已清除 ${e} 的 OTP 绑定`),await f()}catch(_){const v=((d=(a=_==null?void 0:_.response)==null?void 0:a.data)==null?void 0:d.message)||(_==null?void 0:_.message)||"清除失败";M.error(v)}finally{x.value=""}}function V(s){if(!s)return"—";const e=new Date(s);if(isNaN(e.getTime()))return s;const a=d=>String(d).padStart(2,"0");return`${e.getFullYear()}-${a(e.getMonth()+1)}-${a(e.getDate())} ${a(e.getHours())}:${a(e.getMinutes())}`}function F(s){return{user:"info",agent:"success",admin:"danger"}[s]||"info"}return W(()=>{f()}),(s,e)=>{const a=m("el-input"),d=m("el-option"),_=m("el-select"),v=m("el-button"),g=m("el-table-column"),$=m("el-tag"),K=m("el-table"),Y=m("el-pagination"),H=G("loading");return r(),c("div",se,[e[10]||(e[10]=n("div",{class:"page-header"},[n("div",null,[n("div",{class:"page-title"},"OTP 管理"),n("div",{class:"page-desc"},"管理所有用户的动态令牌(OTP)绑定状态,丢手机兜底清除")])],-1)),n("div",ne,[o(a,{modelValue:u.keyword,"onUpdate:modelValue":e[0]||(e[0]=t=>u.keyword=t),placeholder:"搜索员工姓名 / 员工账号","prefix-icon":w(P),clearable:"",style:{width:"260px"},onKeyup:q(S,["enter"])},null,8,["modelValue","prefix-icon"]),o(_,{modelValue:u.bound,"onUpdate:modelValue":e[1]||(e[1]=t=>u.bound=t),placeholder:"绑定状态",clearable:"",style:{width:"140px"}},{default:l(()=>[o(d,{label:"全部",value:""}),o(d,{label:"已绑定",value:"true"}),o(d,{label:"未绑定",value:"false"})]),_:1},8,["modelValue"]),o(v,{type:"primary",icon:w(P),onClick:S},{default:l(()=>[...e[4]||(e[4]=[y("搜索",-1)])]),_:1},8,["icon"]),o(v,{icon:w(B),onClick:R},{default:l(()=>[...e[5]||(e[5]=[y("重置",-1)])]),_:1},8,["icon"]),o(v,{icon:w(B),onClick:f},{default:l(()=>[...e[6]||(e[6]=[y("刷新",-1)])]),_:1},8,["icon"])]),n("div",oe,[n("div",le,[e[7]||(e[7]=n("div",{class:"stat-label"},"总用户数",-1)),n("div",ie,p(i.total),1)]),n("div",de,[e[8]||(e[8]=n("div",{class:"stat-label"},"已绑定",-1)),n("div",re,p(D.value),1)]),n("div",ue,[e[9]||(e[9]=n("div",{class:"stat-label"},"未绑定",-1)),n("div",ce,p(E.value),1)])]),n("div",pe,[A((r(),z(K,{data:h.value,stripe:"",size:"small","empty-text":"暂无用户记录"},{default:l(()=>[o(g,{prop:"employee_id",label:"员工账号","min-width":"140"}),o(g,{prop:"name",label:"姓名","min-width":"100"},{default:l(({row:t})=>[t.name?(r(),c("span",_e,p(t.name),1)):(r(),c("span",me,"—"))]),_:1}),o(g,{prop:"roles",label:"角色","min-width":"120"},{default:l(({row:t})=>[(r(!0),c(J,null,Q(t.roles||[],C=>(r(),z($,{key:C,size:"small",type:F(C),class:"role-tag"},{default:l(()=>[y(p(C),1)]),_:2},1032,["type"]))),128)),!t.roles||t.roles.length===0?(r(),c("span",fe,"—")):X("",!0)]),_:1}),o(g,{label:"OTP 状态","min-width":"100"},{default:l(({row:t})=>[o($,{type:t.mfa_enabled?"success":"info",size:"small"},{default:l(()=>[y(p(t.mfa_enabled?"已绑定":"未绑定"),1)]),_:2},1032,["type"])]),_:1}),o(g,{prop:"mfa_bound_at",label:"首次绑定时间","min-width":"160"},{default:l(({row:t})=>[t.mfa_bound_at?(r(),c("span",ge,p(V(t.mfa_bound_at)),1)):(r(),c("span",ve,"—"))]),_:1}),o(g,{prop:"last_verified_at",label:"最近验证时间","min-width":"160"},{default:l(({row:t})=>[t.last_verified_at?(r(),c("span",ye,p(V(t.last_verified_at)),1)):(r(),c("span",be,"—"))]),_:1}),o(g,{label:"操作",width:"140",fixed:"right"},{default:l(({row:t})=>[t.mfa_enabled?(r(),z(v,{key:0,type:"danger",size:"small",link:"",disabled:x.value===t.employee_id,onClick:C=>j(t)},{default:l(()=>[y(p(x.value===t.employee_id?"清除中...":"清除绑定"),1)]),_:2},1032,["disabled","onClick"])):(r(),c("span",he,"无需操作"))]),_:1})]),_:1},8,["data"])),[[H,b.value]])]),n("div",ke,[o(Y,{"current-page":i.page,"onUpdate:currentPage":e[2]||(e[2]=t=>i.page=t),"page-size":i.pageSize,"onUpdate:pageSize":e[3]||(e[3]=t=>i.pageSize=t),total:i.total,"page-sizes":[10,20,50,100],layout:"total, sizes, prev, pager, next, jumper",onCurrentChange:f,onSizeChange:I},null,8,["current-page","page-size","total"])])])}}}),Te=ee(xe,[["__scopeId","data-v-28b977a1"]]);export{Te as default};
|