feat: 2026-07-11 全量更新 - 代办集成+会议室预定+知识迭代修复+UI统一+Bug修复

== 已部署上线 (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
This commit is contained in:
Simon
2026-07-11 23:13:10 +08:00
parent 3d152fc8eb
commit bea288e414
928 changed files with 85169 additions and 54205 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
import{a6 as M,af as G,ap as j,ag as A,ah as D,s as L,a3 as u,a4 as b,aj as i,a8 as o,ak as n,C as H,aq as C,am as V,al as r,b as J,F as K,an as O,ao as m,ar as P,V as T,a2 as Q}from"./index-DgVr7UP6.js";/* empty css */import{b as F}from"./auth-BQC4UrO8.js";import{C as W}from"./index-C62GQvT9.js";import{R as X,a as Y,F as Z,N as $}from"./index-CrHnzSmN.js";const ee={class:"bind-page"},ae={class:"bind-card"},oe={key:0,class:"wecom-user-info"},ne={key:1,class:"bind-options"},te={key:2,class:"bind-form"},le={class:"form-actions"},se={class:"form-actions"},re=M({__name:"Bind",setup(ue){const k=G(),w=j(),_=A(),s=m(null),c=m("existing"),h=m(!1),d=m(!1),f=m(!1),B=m(""),t=P({employee_no:"",real_name:"",department:"",phone:""});function S(){h.value=!0}function q(){h.value=!1}async function z(){if(!s.value){v("用户信息无效");return}d.value=!0;try{const a=await F({employee_id:s.value.userid,bind_type:"existing",employee_no:t.employee_no});_.setToken(a.token),_.setUserInfo(a.user_info),T("绑定成功"),k.replace({name:"ChatView"})}catch(a){console.error("绑定失败:",a);const e=(a==null?void 0:a.message)||"绑定失败,请重试";v(e)}finally{d.value=!1}}async function E(){if(!s.value){v("用户信息无效");return}d.value=!0;try{const a=await F({employee_id:s.value.userid,bind_type:"new",real_name:t.real_name,department:t.department,phone:t.phone});_.setToken(a.token),_.setUserInfo(a.user_info),T("申请成功"),k.replace({name:"ChatView"})}catch(a){console.error("申请绑定失败:",a);const e=(a==null?void 0:a.message)||"申请失败,请重试";v(e)}finally{d.value=!1}}function v(a){B.value=a,f.value=!0,setTimeout(()=>{f.value=!1},3e3)}return D(()=>{const a=w.query.userid,e=w.query.name,y=w.query.corp_name;a&&e?s.value={userid:a,name:e,corp_name:y}:(L("缺少用户信息,请重新登录"),k.replace({name:"Login"}))}),(a,e)=>{const y=H,x=W,N=X,R=Y,p=J,g=K,U=Z,I=$;return u(),b("div",ee,[i("div",ae,[e[13]||(e[13]=i("div",{class:"bind-header"},[i("div",{class:"bind-icon"},"🔗"),i("h1",{class:"bind-title"},"账号绑定"),i("p",{class:"bind-subtitle"},"请绑定您的企业账号")],-1)),s.value?(u(),b("div",oe,[o(x,{inset:""},{default:n(()=>[o(y,{title:"企业微信",value:s.value.name},null,8,["value"]),s.value.corp_name?(u(),C(y,{key:0,title:"企业",value:s.value.corp_name},null,8,["value"])):V("",!0)]),_:1})])):V("",!0),h.value?(u(),b("div",te,[c.value==="existing"?(u(),C(U,{key:0,onSubmit:z},{default:n(()=>[o(x,{inset:""},{default:n(()=>[o(g,{modelValue:t.employee_no,"onUpdate:modelValue":e[1]||(e[1]=l=>t.employee_no=l),name:"employee_no",label:"员工号",placeholder:"请输入您的员工号",rules:[{required:!0,message:"请输入员工号"}]},null,8,["modelValue"])]),_:1}),i("div",le,[o(p,{size:"large",onClick:q},{default:n(()=>[...e[9]||(e[9]=[r("返回",-1)])]),_:1}),o(p,{type:"primary",size:"large","native-type":"submit",loading:d.value},{default:n(()=>[...e[10]||(e[10]=[r(" 绑定 ",-1)])]),_:1},8,["loading"])])]),_:1})):V("",!0),c.value==="new"?(u(),C(U,{key:1,onSubmit:E},{default:n(()=>[o(x,{inset:""},{default:n(()=>[o(g,{modelValue:t.real_name,"onUpdate:modelValue":e[2]||(e[2]=l=>t.real_name=l),name:"real_name",label:"姓名",placeholder:"请输入您的姓名",rules:[{required:!0,message:"请输入姓名"}]},null,8,["modelValue"]),o(g,{modelValue:t.department,"onUpdate:modelValue":e[3]||(e[3]=l=>t.department=l),name:"department",label:"部门",placeholder:"请输入部门",rules:[{required:!0,message:"请输入部门"}]},null,8,["modelValue"]),o(g,{modelValue:t.phone,"onUpdate:modelValue":e[4]||(e[4]=l=>t.phone=l),name:"phone",type:"tel",label:"手机",placeholder:"请输入手机号",rules:[{required:!0,message:"请输入手机号"}]},null,8,["modelValue"])]),_:1}),i("div",se,[o(p,{size:"large",onClick:q},{default:n(()=>[...e[11]||(e[11]=[r("返回",-1)])]),_:1}),o(p,{type:"primary",size:"large","native-type":"submit",loading:d.value},{default:n(()=>[...e[12]||(e[12]=[r(" 申请绑定 ",-1)])]),_:1},8,["loading"])])]),_:1})):V("",!0)])):(u(),b("div",ne,[o(R,{modelValue:c.value,"onUpdate:modelValue":e[0]||(e[0]=l=>c.value=l)},{default:n(()=>[o(N,{name:"existing",shape:"square"},{default:n(()=>[...e[6]||(e[6]=[r("绑定已有账号",-1)])]),_:1}),o(N,{name:"new",shape:"square"},{default:n(()=>[...e[7]||(e[7]=[r("申请新账号",-1)])]),_:1})]),_:1},8,["modelValue"]),o(p,{type:"primary",block:"",size:"large",class:"next-btn",onClick:S},{default:n(()=>[...e[8]||(e[8]=[r(" 下一步 ",-1)])]),_:1})])),o(I,{show:f.value,"onUpdate:show":e[5]||(e[5]=l=>f.value=l),type:"danger"},{default:n(()=>[r(O(B.value),1)]),_:1},8,["show"])])])}}}),ce=Q(re,[["__scopeId","data-v-c14f302d"]]);export{ce as default};
@@ -0,0 +1 @@
import{a6 as M,af as G,ap as j,ag as A,ah as D,s as L,a3 as u,a4 as b,aj as i,a8 as o,ak as n,C as H,aq as C,am as V,al as r,b as J,F as K,an as O,ao as m,ar as P,V as T,a2 as Q}from"./index-DtOTKM3Z.js";/* empty css */import{b as F}from"./auth-VYNCQSes.js";import{C as W}from"./index-Bt5n-keb.js";import{R as X,a as Y,F as Z,N as $}from"./index-Bq_Sa0hn.js";const ee={class:"bind-page"},ae={class:"bind-card"},oe={key:0,class:"wecom-user-info"},ne={key:1,class:"bind-options"},te={key:2,class:"bind-form"},le={class:"form-actions"},se={class:"form-actions"},re=M({__name:"Bind",setup(ue){const k=G(),w=j(),_=A(),s=m(null),c=m("existing"),h=m(!1),d=m(!1),f=m(!1),B=m(""),t=P({employee_no:"",real_name:"",department:"",phone:""});function S(){h.value=!0}function q(){h.value=!1}async function z(){if(!s.value){v("用户信息无效");return}d.value=!0;try{const a=await F({employee_id:s.value.userid,bind_type:"existing",employee_no:t.employee_no});_.setToken(a.token),_.setUserInfo(a.user_info),T("绑定成功"),k.replace({name:"ChatView"})}catch(a){console.error("绑定失败:",a);const e=(a==null?void 0:a.message)||"绑定失败,请重试";v(e)}finally{d.value=!1}}async function E(){if(!s.value){v("用户信息无效");return}d.value=!0;try{const a=await F({employee_id:s.value.userid,bind_type:"new",real_name:t.real_name,department:t.department,phone:t.phone});_.setToken(a.token),_.setUserInfo(a.user_info),T("申请成功"),k.replace({name:"ChatView"})}catch(a){console.error("申请绑定失败:",a);const e=(a==null?void 0:a.message)||"申请失败,请重试";v(e)}finally{d.value=!1}}function v(a){B.value=a,f.value=!0,setTimeout(()=>{f.value=!1},3e3)}return D(()=>{const a=w.query.userid,e=w.query.name,y=w.query.corp_name;a&&e?s.value={userid:a,name:e,corp_name:y}:(L("缺少用户信息,请重新登录"),k.replace({name:"Login"}))}),(a,e)=>{const y=H,x=W,N=X,R=Y,p=J,g=K,U=Z,I=$;return u(),b("div",ee,[i("div",ae,[e[13]||(e[13]=i("div",{class:"bind-header"},[i("div",{class:"bind-icon"},"🔗"),i("h1",{class:"bind-title"},"账号绑定"),i("p",{class:"bind-subtitle"},"请绑定您的企业账号")],-1)),s.value?(u(),b("div",oe,[o(x,{inset:""},{default:n(()=>[o(y,{title:"企业微信",value:s.value.name},null,8,["value"]),s.value.corp_name?(u(),C(y,{key:0,title:"企业",value:s.value.corp_name},null,8,["value"])):V("",!0)]),_:1})])):V("",!0),h.value?(u(),b("div",te,[c.value==="existing"?(u(),C(U,{key:0,onSubmit:z},{default:n(()=>[o(x,{inset:""},{default:n(()=>[o(g,{modelValue:t.employee_no,"onUpdate:modelValue":e[1]||(e[1]=l=>t.employee_no=l),name:"employee_no",label:"员工号",placeholder:"请输入您的员工号",rules:[{required:!0,message:"请输入员工号"}]},null,8,["modelValue"])]),_:1}),i("div",le,[o(p,{size:"large",onClick:q},{default:n(()=>[...e[9]||(e[9]=[r("返回",-1)])]),_:1}),o(p,{type:"primary",size:"large","native-type":"submit",loading:d.value},{default:n(()=>[...e[10]||(e[10]=[r(" 绑定 ",-1)])]),_:1},8,["loading"])])]),_:1})):V("",!0),c.value==="new"?(u(),C(U,{key:1,onSubmit:E},{default:n(()=>[o(x,{inset:""},{default:n(()=>[o(g,{modelValue:t.real_name,"onUpdate:modelValue":e[2]||(e[2]=l=>t.real_name=l),name:"real_name",label:"姓名",placeholder:"请输入您的姓名",rules:[{required:!0,message:"请输入姓名"}]},null,8,["modelValue"]),o(g,{modelValue:t.department,"onUpdate:modelValue":e[3]||(e[3]=l=>t.department=l),name:"department",label:"部门",placeholder:"请输入部门",rules:[{required:!0,message:"请输入部门"}]},null,8,["modelValue"]),o(g,{modelValue:t.phone,"onUpdate:modelValue":e[4]||(e[4]=l=>t.phone=l),name:"phone",type:"tel",label:"手机",placeholder:"请输入手机号",rules:[{required:!0,message:"请输入手机号"}]},null,8,["modelValue"])]),_:1}),i("div",se,[o(p,{size:"large",onClick:q},{default:n(()=>[...e[11]||(e[11]=[r("返回",-1)])]),_:1}),o(p,{type:"primary",size:"large","native-type":"submit",loading:d.value},{default:n(()=>[...e[12]||(e[12]=[r(" 申请绑定 ",-1)])]),_:1},8,["loading"])])]),_:1})):V("",!0)])):(u(),b("div",ne,[o(R,{modelValue:c.value,"onUpdate:modelValue":e[0]||(e[0]=l=>c.value=l)},{default:n(()=>[o(N,{name:"existing",shape:"square"},{default:n(()=>[...e[6]||(e[6]=[r("绑定已有账号",-1)])]),_:1}),o(N,{name:"new",shape:"square"},{default:n(()=>[...e[7]||(e[7]=[r("申请新账号",-1)])]),_:1})]),_:1},8,["modelValue"]),o(p,{type:"primary",block:"",size:"large",class:"next-btn",onClick:S},{default:n(()=>[...e[8]||(e[8]=[r(" 下一步 ",-1)])]),_:1})])),o(I,{show:f.value,"onUpdate:show":e[5]||(e[5]=l=>f.value=l),type:"danger"},{default:n(()=>[r(O(B.value),1)]),_:1},8,["show"])])])}}}),ce=Q(re,[["__scopeId","data-v-c14f302d"]]);export{ce as default};
@@ -0,0 +1 @@
:root,:host{--van-notify-text-color: var(--van-white);--van-notify-padding: var(--van-padding-xs) var(--van-padding-md);--van-notify-font-size: var(--van-font-size-md);--van-notify-line-height: var(--van-line-height-md);--van-notify-primary-background: var(--van-primary-color);--van-notify-success-background: var(--van-success-color);--van-notify-danger-background: var(--van-danger-color);--van-notify-warning-background: var(--van-warning-color)}.van-notify{display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:var(--van-notify-padding);color:var(--van-notify-text-color);font-size:var(--van-notify-font-size);line-height:var(--van-notify-line-height);white-space:pre-wrap;text-align:center;word-wrap:break-word}.van-notify--primary{background:var(--van-notify-primary-background)}.van-notify--success{background:var(--van-notify-success-background)}.van-notify--danger{background:var(--van-notify-danger-background)}.van-notify--warning{background:var(--van-notify-warning-background)}.van-radio-group--horizontal{display:flex;flex-wrap:wrap}:root,:host{--van-radio-size: 20px;--van-radio-dot-size: 8px;--van-radio-border-color: var(--van-gray-5);--van-radio-duration: var(--van-duration-fast);--van-radio-label-margin: var(--van-padding-xs);--van-radio-label-color: var(--van-text-color);--van-radio-checked-icon-color: var(--van-primary-color);--van-radio-disabled-icon-color: var(--van-gray-5);--van-radio-disabled-label-color: var(--van-text-color-3);--van-radio-disabled-background: var(--van-border-color)}.van-radio{display:flex;align-items:center;overflow:hidden;cursor:pointer;-webkit-user-select:none;user-select:none}.van-radio--disabled{cursor:not-allowed}.van-radio--label-disabled{cursor:default}.van-radio--horizontal{margin-right:var(--van-padding-sm)}.van-radio__icon{flex:none;height:1em;font-size:var(--van-radio-size);line-height:1em;cursor:pointer}.van-radio__icon .van-icon{display:block;box-sizing:border-box;width:1.25em;height:1.25em;color:transparent;font-size:.8em;line-height:1.25;text-align:center;border:1px solid var(--van-radio-border-color);transition-duration:var(--van-radio-duration);transition-property:color,border-color,background-color}.van-radio__icon--round .van-icon{border-radius:100%}.van-radio__icon--dot{position:relative;border-radius:100%;box-sizing:border-box;width:var(--van-radio-size);height:var(--van-radio-size);border:1px solid var(--van-radio-border-color);transition-duration:var(--van-radio-duration);transition-property:border-color}.van-radio__icon--dot__icon{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);border-radius:100%;height:calc(100% - var(--van-radio-dot-size));width:calc(100% - var(--van-radio-dot-size));transition-duration:var(--van-radio-duration);transition-property:background-color}.van-radio__icon--checked .van-icon{color:var(--van-white);background-color:var(--van-radio-checked-icon-color);border-color:var(--van-radio-checked-icon-color)}.van-radio__icon--checked.van-radio__icon--dot{border-color:var(--van-radio-checked-icon-color)}.van-radio__icon--checked.van-radio__icon--dot .van-radio__icon--dot__icon{background:var(--van-radio-checked-icon-color)}.van-radio__icon--disabled{cursor:not-allowed}.van-radio__icon--disabled .van-icon{background-color:var(--van-radio-disabled-background);border-color:var(--van-radio-disabled-icon-color)}.van-radio__icon--disabled.van-radio__icon--checked .van-icon{color:var(--van-radio-disabled-icon-color)}.van-radio__label{margin-left:var(--van-radio-label-margin);color:var(--van-radio-label-color);line-height:var(--van-radio-size)}.van-radio__label--left{margin:0 var(--van-radio-label-margin) 0 0}.van-radio__label--disabled{color:var(--van-radio-disabled-label-color)}.bind-page[data-v-c14f302d]{display:flex;align-items:center;justify-content:center;min-height:100vh;min-height:100dvh;background:linear-gradient(135deg,#667eea,#764ba2);padding:24px}.bind-card[data-v-c14f302d]{width:100%;max-width:400px;background:var(--bg-secondary, #ffffff);border-radius:16px;padding:40px 32px;box-shadow:0 8px 32px #00000026}.bind-header[data-v-c14f302d]{text-align:center;margin-bottom:32px}.bind-icon[data-v-c14f302d]{font-size:48px;margin-bottom:12px}.bind-title[data-v-c14f302d]{font-size:24px;font-weight:700;color:var(--text-primary, #303133);margin:0 0 8px}.bind-subtitle[data-v-c14f302d]{font-size:14px;color:var(--text-tertiary, #909399);margin:0}.wecom-user-info[data-v-c14f302d]{margin-bottom:24px}.bind-options[data-v-c14f302d]{display:flex;flex-direction:column;gap:16px}.bind-options[data-v-c14f302d] .van-radio-group{display:flex;flex-direction:column;gap:12px}.bind-options[data-v-c14f302d] .van-radio{padding:12px;background:var(--bg-tertiary, #f5f5f5);border-radius:8px}.next-btn[data-v-c14f302d]{margin-top:24px}.bind-form[data-v-c14f302d]{margin-top:16px}.form-actions[data-v-c14f302d]{display:flex;gap:12px;margin-top:24px}.form-actions[data-v-c14f302d] .van-button{flex:1}
@@ -0,0 +1 @@
.login-page[data-v-32046e1d]{display:flex;align-items:center;justify-content:center;min-height:100vh;min-height:100dvh;background:linear-gradient(135deg,#667eea,#764ba2);padding:24px}.login-card[data-v-32046e1d]{width:100%;max-width:400px;background:var(--bg-secondary, #ffffff);border-radius:16px;padding:40px 32px;box-shadow:0 8px 32px #00000026}.login-header[data-v-32046e1d]{text-align:center;margin-bottom:32px}.login-icon[data-v-32046e1d]{font-size:48px;margin-bottom:12px}.login-title[data-v-32046e1d]{font-size:24px;font-weight:700;color:var(--text-primary, #303133);margin:0 0 8px}.login-subtitle[data-v-32046e1d]{font-size:14px;color:var(--text-tertiary, #909399);margin:0}.qr-login[data-v-32046e1d]{display:flex;flex-direction:column;align-items:center}.qr-container[data-v-32046e1d]{width:200px;height:200px;display:flex;align-items:center;justify-content:center;background:var(--bg-tertiary, #f5f5f5);border-radius:12px;margin-bottom:16px}.qr-loading[data-v-32046e1d]{display:flex;flex-direction:column;align-items:center;gap:8px;color:var(--text-tertiary, #909399)}.qr-code img[data-v-32046e1d]{width:180px;height:180px}.qr-error[data-v-32046e1d]{text-align:center;color:var(--error-color, #f56c6c)}.qr-hint[data-v-32046e1d]{font-size:14px;color:var(--text-tertiary, #909399);margin:0}.scan-tip[data-v-32046e1d]{display:flex;align-items:center;gap:4px;color:var(--success-color, #07c160);font-size:14px;margin-top:12px}.loading-container[data-v-32046e1d]{display:flex;flex-direction:column;align-items:center;gap:16px;padding:40px 0;color:var(--text-secondary, #606266)}
@@ -0,0 +1 @@
import{a6 as A,af as P,ag as U,ah as N,ai as O,a3 as o,a4 as r,aj as s,a8 as g,L as z,ak as E,al as S,b as Q,I as R,am as q,an as j,ao as l,s as d,V as x,a2 as D}from"./index-DtOTKM3Z.js";import{g as M,h as W,a as $}from"./auth-VYNCQSes.js";const F={class:"login-page"},G={class:"login-card"},H={key:0,class:"qr-login"},I={class:"qr-container"},J={key:0,class:"qr-loading"},K={key:1,class:"qr-code"},X=["src"],Y={key:2,class:"qr-error"},Z={key:0,class:"scan-tip"},ee={key:1,class:"loading-container"},ae=A({__name:"Login",setup(te){const v=P(),i=U(),m=l(!0),h=l(""),y=l(!1),p=l(""),n=l(!1),f=l("请稍候...");let _=null,w="";function C(){return typeof navigator>"u"?!1:/wxwork/i.test(navigator.userAgent)}async function c(){y.value=!0,p.value="waiting";try{const a=await M();h.value=`data:image/png;base64,${a.qrcode_png_base64}`,w=a.ticket,b()}catch(a){console.error("获取二维码失败:",a),d("获取二维码失败,请重试")}finally{y.value=!1}}async function T(){if(w)try{const a=await $(w);a.status==="scanned"?p.value="scanned":a.status==="confirmed"&&a.token?(u(),await L(a.token,a.user_info)):a.status==="expired"?(u(),d("二维码已过期,请重新扫码"),c()):a.status==="cancelled"&&(u(),d("扫码已取消"),p.value="waiting",c())}catch(a){console.warn("轮询扫码状态失败:",a)}}function b(){u(),_=setInterval(T,2e3)}function u(){_&&(clearInterval(_),_=null)}async function L(a,e){n.value=!0,f.value="登录中...";try{if(e!=null&&e.is_new_user){v.push({name:"Bind",query:{userid:e.userid,name:e.name}});return}i.setToken(a),e&&i.setUserInfo(e),x("登录成功"),v.push({name:"ChatView"})}catch(t){console.error("登录失败:",t),d("登录失败,请重试")}finally{n.value=!1}}async function V(a,e){n.value=!0,f.value="授权中...";try{const t=await W(a,e);if(t.is_new_user){v.push({name:"Bind",query:{userid:t.user_info.userid,name:t.user_info.name}});return}i.setToken(t.token),i.setUserInfo(t.user_info),x("登录成功"),v.push({name:"ChatView"})}catch(t){console.error("OAuth回调处理失败:",t),d("授权失败,请重试")}finally{n.value=!1}}return N(async()=>{const a=new URLSearchParams(window.location.search),e=a.get("code"),t=a.get("state");if(e){await V(e,t||void 0);return}if(C()){n.value=!0,f.value="正在跳转企微授权...";try{await i.redirectToOAuth()}catch(k){console.error("跳转授权失败:",k),m.value=!0,c()}finally{n.value=!1}}else m.value=!0,c()}),O(()=>{u()}),(a,e)=>{const t=z,k=Q,B=R;return o(),r("div",F,[s("div",G,[e[5]||(e[5]=s("div",{class:"login-header"},[s("div",{class:"login-icon"},"🛠️"),s("h1",{class:"login-title"},"IT智能服务台"),s("p",{class:"login-subtitle"},"扫码登录")],-1)),m.value?(o(),r("div",H,[s("div",I,[y.value?(o(),r("div",J,[g(t,{type:"spinner",size:"32px"}),e[0]||(e[0]=s("p",null,"加载中...",-1))])):h.value?(o(),r("div",K,[s("img",{src:h.value,alt:"企微扫码登录"},null,8,X)])):(o(),r("div",Y,[e[2]||(e[2]=s("p",null,"获取二维码失败",-1)),g(k,{size:"small",onClick:c},{default:E(()=>[...e[1]||(e[1]=[S("重试",-1)])]),_:1})]))]),e[4]||(e[4]=s("p",{class:"qr-hint"},"请使用企业微信扫码登录",-1)),p.value==="scanned"?(o(),r("p",Z,[g(B,{name:"checked"}),e[3]||(e[3]=S(" 已扫码,请在手机确认 ",-1))])):q("",!0)])):q("",!0),n.value?(o(),r("div",ee,[g(t,{type:"spinner",size:"40px"}),s("p",null,j(f.value),1)])):q("",!0)])])}}}),oe=D(ae,[["__scopeId","data-v-32046e1d"]]);export{oe as default};
@@ -0,0 +1 @@
import{a6 as A,af as P,ag as U,ah as N,ai as O,a3 as o,a4 as r,aj as s,a8 as g,L as z,ak as E,al as S,b as Q,I as R,am as q,an as j,ao as l,s as d,V as x,a2 as D}from"./index-DgVr7UP6.js";import{g as M,h as W,a as $}from"./auth-BQC4UrO8.js";const F={class:"login-page"},G={class:"login-card"},H={key:0,class:"qr-login"},I={class:"qr-container"},J={key:0,class:"qr-loading"},K={key:1,class:"qr-code"},X=["src"],Y={key:2,class:"qr-error"},Z={key:0,class:"scan-tip"},ee={key:1,class:"loading-container"},ae=A({__name:"Login",setup(te){const v=P(),i=U(),m=l(!0),h=l(""),y=l(!1),p=l(""),n=l(!1),f=l("请稍候...");let _=null,w="";function C(){return typeof navigator>"u"?!1:/wxwork/i.test(navigator.userAgent)}async function c(){y.value=!0,p.value="waiting";try{const a=await M();h.value=`data:image/png;base64,${a.qrcode_png_base64}`,w=a.ticket,b()}catch(a){console.error("获取二维码失败:",a),d("获取二维码失败,请重试")}finally{y.value=!1}}async function T(){if(w)try{const a=await $(w);a.status==="scanned"?p.value="scanned":a.status==="confirmed"&&a.token?(u(),await L(a.token,a.user_info)):a.status==="expired"?(u(),d("二维码已过期,请重新扫码"),c()):a.status==="cancelled"&&(u(),d("扫码已取消"),p.value="waiting",c())}catch(a){console.warn("轮询扫码状态失败:",a)}}function b(){u(),_=setInterval(T,2e3)}function u(){_&&(clearInterval(_),_=null)}async function L(a,e){n.value=!0,f.value="登录中...";try{if(e!=null&&e.is_new_user){v.push({name:"Bind",query:{userid:e.userid,name:e.name}});return}i.setToken(a),e&&i.setUserInfo(e),x("登录成功"),v.push({name:"ChatView"})}catch(t){console.error("登录失败:",t),d("登录失败,请重试")}finally{n.value=!1}}async function V(a,e){n.value=!0,f.value="授权中...";try{const t=await W(a,e);if(t.is_new_user){v.push({name:"Bind",query:{userid:t.user_info.userid,name:t.user_info.name}});return}i.setToken(t.token),i.setUserInfo(t.user_info),x("登录成功"),v.push({name:"ChatView"})}catch(t){console.error("OAuth回调处理失败:",t),d("授权失败,请重试")}finally{n.value=!1}}return N(async()=>{const a=new URLSearchParams(window.location.search),e=a.get("code"),t=a.get("state");if(e){await V(e,t||void 0);return}if(C()){n.value=!0,f.value="正在跳转企微授权...";try{await i.redirectToOAuth()}catch(k){console.error("跳转授权失败:",k),m.value=!0,c()}finally{n.value=!1}}else m.value=!0,c()}),O(()=>{u()}),(a,e)=>{const t=z,k=Q,B=R;return o(),r("div",F,[s("div",G,[e[5]||(e[5]=s("div",{class:"login-header"},[s("div",{class:"login-icon"},"🛠️"),s("h1",{class:"login-title"},"IT智能服务台"),s("p",{class:"login-subtitle"},"扫码登录")],-1)),m.value?(o(),r("div",H,[s("div",I,[y.value?(o(),r("div",J,[g(t,{type:"spinner",size:"32px"}),e[0]||(e[0]=s("p",null,"加载中...",-1))])):h.value?(o(),r("div",K,[s("img",{src:h.value,alt:"企微扫码登录"},null,8,X)])):(o(),r("div",Y,[e[2]||(e[2]=s("p",null,"获取二维码失败",-1)),g(k,{size:"small",onClick:c},{default:E(()=>[...e[1]||(e[1]=[S("重试",-1)])]),_:1})]))]),e[4]||(e[4]=s("p",{class:"qr-hint"},"请使用企业微信扫码登录",-1)),p.value==="scanned"?(o(),r("p",Z,[g(B,{name:"checked"}),e[3]||(e[3]=S(" 已扫码,请在手机确认 ",-1))])):q("",!0)])):q("",!0),n.value?(o(),r("div",ee,[g(t,{type:"spinner",size:"40px"}),s("p",null,j(f.value),1)])):q("",!0)])])}}}),oe=D(ae,[["__scopeId","data-v-32046e1d"]]);export{oe as default};
@@ -0,0 +1 @@
.wework-only[data-v-51b0fffc]{display:flex;align-items:center;justify-content:center;min-height:100vh;background:#f5f6f7;padding:24px;box-sizing:border-box}.wework-only__card[data-v-51b0fffc]{text-align:center;background:#fff;border-radius:16px;padding:48px 32px;max-width:360px;width:100%;box-shadow:0 2px 12px #0000000f}.wework-only__icon[data-v-51b0fffc]{margin-bottom:24px}.wework-only__title[data-v-51b0fffc]{font-size:20px;font-weight:600;color:#1a1a1a;margin:0 0 12px}.wework-only__desc[data-v-51b0fffc]{font-size:14px;color:#666;line-height:1.6;margin:0 0 32px}.wework-only__steps[data-v-51b0fffc]{display:flex;flex-direction:column;gap:16px;text-align:left;padding:0 16px}.wework-only__step[data-v-51b0fffc]{display:flex;align-items:center;gap:12px;font-size:14px;color:#333}.wework-only__step-num[data-v-51b0fffc]{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:50%;background:#07c160;color:#fff;font-size:14px;font-weight:600;flex-shrink:0}
@@ -0,0 +1 @@
import{a2 as f,a3 as s,a4 as c,a5 as t}from"./index-DtOTKM3Z.js";const d={},o={class:"wework-only"};function e(n,a){return s(),c("div",o,[...a[0]||(a[0]=[t('<div class="wework-only__card" data-v-51b0fffc><div class="wework-only__icon" data-v-51b0fffc><svg viewBox="0 0 1024 1024" width="80" height="80" data-v-51b0fffc><path d="M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm-32 664c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm64-160c-17.7 0-32-14.3-32-32V416c0-17.7 14.3-32 32-32s32 14.3 32 32v120c0 17.7-14.3 32-32 32z" fill="#07C160" data-v-51b0fffc></path><path d="M685.6 354.4c-9.6-9.6-25.2-9.6-34.8 0L512 493.2 373.2 354.4c-9.6-9.6-25.2-9.6-34.8 0s-9.6 25.2 0 34.8L486.8 537.6c4.8 4.8 11.1 7.2 17.6 7.2s12.8-2.4 17.6-7.2l138.8-148.4c9.5-9.6 9.5-25.2-.2-34.8z" fill="#07C160" opacity="0.6" data-v-51b0fffc></path></svg></div><h2 class="wework-only__title" data-v-51b0fffc>请在企业微信中打开</h2><p class="wework-only__desc" data-v-51b0fffc> IT智能服务台仅支持在企业微信内使用,<br data-v-51b0fffc> 请通过企业微信工作台进入。 </p><div class="wework-only__steps" data-v-51b0fffc><div class="wework-only__step" data-v-51b0fffc><span class="wework-only__step-num" data-v-51b0fffc>1</span><span data-v-51b0fffc>打开企业微信</span></div><div class="wework-only__step" data-v-51b0fffc><span class="wework-only__step-num" data-v-51b0fffc>2</span><span data-v-51b0fffc>进入「工作台」</span></div><div class="wework-only__step" data-v-51b0fffc><span class="wework-only__step-num" data-v-51b0fffc>3</span><span data-v-51b0fffc>找到「IT支持服务」</span></div></div></div>',1)])])}const l=f(d,[["render",e],["__scopeId","data-v-51b0fffc"]]);export{l as default};
@@ -0,0 +1 @@
import{a2 as f,a3 as s,a4 as c,a5 as t}from"./index-DgVr7UP6.js";const d={},o={class:"wework-only"};function e(n,a){return s(),c("div",o,[...a[0]||(a[0]=[t('<div class="wework-only__card" data-v-51b0fffc><div class="wework-only__icon" data-v-51b0fffc><svg viewBox="0 0 1024 1024" width="80" height="80" data-v-51b0fffc><path d="M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm-32 664c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm64-160c-17.7 0-32-14.3-32-32V416c0-17.7 14.3-32 32-32s32 14.3 32 32v120c0 17.7-14.3 32-32 32z" fill="#07C160" data-v-51b0fffc></path><path d="M685.6 354.4c-9.6-9.6-25.2-9.6-34.8 0L512 493.2 373.2 354.4c-9.6-9.6-25.2-9.6-34.8 0s-9.6 25.2 0 34.8L486.8 537.6c4.8 4.8 11.1 7.2 17.6 7.2s12.8-2.4 17.6-7.2l138.8-148.4c9.5-9.6 9.5-25.2-.2-34.8z" fill="#07C160" opacity="0.6" data-v-51b0fffc></path></svg></div><h2 class="wework-only__title" data-v-51b0fffc>请在企业微信中打开</h2><p class="wework-only__desc" data-v-51b0fffc> IT智能服务台仅支持在企业微信内使用,<br data-v-51b0fffc> 请通过企业微信工作台进入。 </p><div class="wework-only__steps" data-v-51b0fffc><div class="wework-only__step" data-v-51b0fffc><span class="wework-only__step-num" data-v-51b0fffc>1</span><span data-v-51b0fffc>打开企业微信</span></div><div class="wework-only__step" data-v-51b0fffc><span class="wework-only__step-num" data-v-51b0fffc>2</span><span data-v-51b0fffc>进入「工作台」</span></div><div class="wework-only__step" data-v-51b0fffc><span class="wework-only__step-num" data-v-51b0fffc>3</span><span data-v-51b0fffc>找到「IT支持服务」</span></div></div></div>',1)])])}const l=f(d,[["render",e],["__scopeId","data-v-51b0fffc"]]);export{l as default};
@@ -0,0 +1 @@
import{a1 as t}from"./index-DgVr7UP6.js";async function u(){return t.get("/auth/qrcode")}async function s(a){return t.get("/auth/scan/status",{params:{ticket:a}})}async function r(a,n){return t.get("/auth/oauth2/callback",{params:{code:a,state:n}})}async function e(a){return t.post("/auth/bind",a)}export{s as a,e as b,u as g,r as h};
@@ -0,0 +1 @@
import{a1 as t}from"./index-DtOTKM3Z.js";async function u(){return t.get("/auth/qrcode")}async function s(a){return t.get("/auth/scan/status",{params:{ticket:a}})}async function r(a,n){return t.get("/auth/oauth2/callback",{params:{code:a,state:n}})}async function e(a){return t.post("/auth/bind",a)}export{s as a,e as b,u as g,r as h};
@@ -0,0 +1 @@
import{a6 as b,a7 as B,a8 as t,aH as $,aG as I,ad as x,aI as T,I as S,ae as P,as as N,aJ as E,aK as L,aL as z,ao as O,au as p,aM as K,aA as H,aN as M,aO as y}from"./index-DtOTKM3Z.js";const[F,D]=x("tag"),G={size:String,mark:Boolean,show:B,type:I("default"),color:String,plain:Boolean,round:Boolean,textColor:String,closeable:Boolean};var J=b({name:F,props:G,emits:["close"],setup(e,{slots:n,emit:a}){const o=r=>{r.stopPropagation(),a("close",r)},c=()=>e.plain?{color:e.textColor||e.color,borderColor:e.color}:{color:e.textColor,background:e.color},l=()=>{var r;const{type:g,mark:C,plain:v,round:s,size:i,closeable:d}=e,h={mark:C,plain:v,round:s};i&&(h[i]=i);const m=d&&t(S,{name:"cross",class:[D("close"),T],onClick:o},null);return t("span",{style:c(),class:D([h,g])},[(r=n.default)==null?void 0:r.call(n),m])};return()=>t($,{name:e.closeable?"van-fade":void 0},{default:()=>[e.show?l():null]})}});const X=P(J),[V,f]=x("nav-bar"),Y={title:String,fixed:Boolean,zIndex:N,border:B,leftText:String,rightText:String,leftDisabled:Boolean,rightDisabled:Boolean,leftArrow:Boolean,placeholder:Boolean,safeAreaInsetTop:Boolean,clickable:B};var Z=b({name:V,props:Y,emits:["clickLeft","clickRight"],setup(e,{emit:n,slots:a}){const o=O(),c=E(o,f),l=s=>{e.leftDisabled||n("clickLeft",s)},r=s=>{e.rightDisabled||n("clickRight",s)},g=()=>a.left?a.left():[e.leftArrow&&t(S,{class:f("arrow"),name:"arrow-left"},null),e.leftText&&t("span",{class:f("text")},[e.leftText])],C=()=>a.right?a.right():t("span",{class:f("text")},[e.rightText]),v=()=>{const{title:s,fixed:i,border:d,zIndex:h}=e,m=z(h),k=e.leftArrow||e.leftText||a.left,A=e.rightText||a.right;return t("div",{ref:o,style:m,class:[f({fixed:i}),{[L]:d,"van-safe-area-top":e.safeAreaInsetTop}]},[t("div",{class:f("content")},[k&&t("div",{class:[f("left",{disabled:e.leftDisabled}),e.clickable&&!e.leftDisabled?T:""],onClick:l},[g()]),t("div",{class:[f("title"),"van-ellipsis"]},[a.title?a.title():s]),A&&t("div",{class:[f("right",{disabled:e.rightDisabled}),e.clickable&&!e.rightDisabled?T:""],onClick:r},[C()])])])};return()=>e.fixed&&e.placeholder?c(v):v()}});const ee=P(Z),[R,w]=x("steps"),j={active:K(0),direction:I("horizontal"),activeIcon:I("checked"),iconPrefix:String,finishIcon:String,activeColor:String,inactiveIcon:String,inactiveColor:String},_=Symbol(R);var q=b({name:R,props:j,emits:["clickStep"],setup(e,{emit:n,slots:a}){const{linkChildren:o}=p(_);return o({props:e,onClickStep:l=>n("clickStep",l)}),()=>{var l;return t("div",{class:w([e.direction])},[t("div",{class:w("items")},[(l=a.default)==null?void 0:l.call(a)])])}}});const[Q,u]=x("step");var U=b({name:Q,setup(e,{slots:n}){const{parent:a,index:o}=H(_);if(!a)return;const c=a.props,l=()=>{const i=+c.active;return o.value<i?"finish":o.value===i?"process":"waiting"},r=()=>l()==="process",g=y(()=>({background:l()==="finish"?c.activeColor:c.inactiveColor})),C=y(()=>{if(r())return{color:c.activeColor};if(l()==="waiting")return{color:c.inactiveColor}}),v=()=>a.onClickStep(o.value),s=()=>{const{iconPrefix:i,finishIcon:d,activeIcon:h,activeColor:m,inactiveIcon:k}=c;return r()?n["active-icon"]?n["active-icon"]():t(S,{class:u("icon","active"),name:h,color:m,classPrefix:i},null):l()==="finish"&&(d||n["finish-icon"])?n["finish-icon"]?n["finish-icon"]():t(S,{class:u("icon","finish"),name:d,color:m,classPrefix:i},null):n["inactive-icon"]?n["inactive-icon"]():k?t(S,{class:u("icon"),name:k,classPrefix:i},null):t("i",{class:u("circle"),style:g.value},null)};return()=>{var i;const d=l();return t("div",{class:[M,u([c.direction,{[d]:d}])]},[t("div",{class:u("title",{active:r()}),style:C.value,onClick:v},[(i=n.default)==null?void 0:i.call(n)]),t("div",{class:u("circle-container"),onClick:v},[s()]),t("div",{class:u("line"),style:g.value},null)])}}});const te=P(U),ne=P(q);export{ee as N,te as S,X as T,ne as a,Y as n,j as s,G as t};
@@ -0,0 +1 @@
import{s as a}from"./index-DtOTKM3Z.js";import{A as p,a as e,B as t,b as P,C as l,c as i,d as c,e as n,f as d,D as m,E as u,F as f,I as b,L as g,g as B,O as h,P as x,R as S,S as w,h as y,i as C,j as T,T as v,k as G,l as I,m as k,n as F,o as N,p as R,q as A,r as D,t as L,u as Z,v as E,w as O,x as j,y as q,z,G as H,H as J,J as K,K as M,M as Q,N as U,Q as V,U as W,V as X,W as Y,X as _,Y as $,Z as ss,_ as as,$ as os,a0 as rs}from"./index-DtOTKM3Z.js";import{C as es,c as ts}from"./index-Bt5n-keb.js";import{F as ls,N as is,R as cs,a as ns,f as ds,n as ms,r as us,b as fs}from"./index-Bq_Sa0hn.js";import{N as gs,S as Bs,a as hs,T as xs,n as Ss,s as ws,t as ys}from"./index-BDaAU9Ak.js";export{p as ActionBar,e as ActionBarButton,t as Badge,P as Button,l as Cell,es as CellGroup,i as Checkbox,c as Collapse,n as CollapseItem,d as ConfigProvider,m as Dialog,u as Empty,f as Field,ls as Form,b as Icon,g as Loading,B as Locale,gs as NavBar,is as Notify,h as Overlay,x as Popup,cs as Radio,ns as RadioGroup,S as Rate,w as Search,Bs as Step,hs as Steps,y as Sticky,C as Swipe,T as SwipeItem,v as Tab,G as Tabs,xs as Tag,I as actionBarButtonProps,k as actionBarProps,F as badgeProps,N as buttonProps,ts as cellGroupProps,R as cellProps,A as checkboxProps,D as collapseItemProps,L as collapseProps,Z as configProviderProps,E as dialogProps,O as emptyProps,j as fieldProps,ds as formProps,q as iconProps,z as loadingProps,Ss as navBarProps,ms as notifyProps,H as overlayProps,J as popupProps,us as radioGroupProps,fs as radioProps,K as rateProps,M as searchProps,Q as setGlobalZIndex,U as showConfirmDialog,V as showDialog,W as showFailToast,X as showSuccessToast,a as showToast,ws as stepsProps,Y as stickyProps,_ as swipeProps,$ as tabProps,ss as tabsProps,ys as tagProps,as as toastProps,os as useAllTabStatus,rs as useGlobalZIndex};
@@ -0,0 +1 @@
import{a6 as c,a7 as k,as as p,at as D,a8 as m,au as y,ad as f,av as G,aw as M,ae as g,ax as B,ay as O,az as q,aA as K,aB as E,aa as $,aC as Y,aD as F,aE as j,P as U,aF as W,aG as w}from"./index-DtOTKM3Z.js";const[H,J]=f("form"),L={colon:Boolean,disabled:Boolean,readonly:Boolean,required:[Boolean,String],showError:Boolean,labelWidth:p,labelAlign:String,inputAlign:String,scrollToError:Boolean,scrollToErrorPosition:String,validateFirst:Boolean,submitOnEnter:k,showErrorMessage:k,errorMessageAlign:String,validateTrigger:{type:[String,Array],default:"onBlur"}};var Q=c({name:H,props:L,emits:["submit","failed"],setup(t,{emit:d,slots:r}){const{children:o,linkChildren:u}=y(G),s=e=>e?o.filter(a=>e.includes(a.name)):o,h=e=>new Promise((a,n)=>{const l=[];s(e).reduce((R,z)=>R.then(()=>{if(!l.length)return z.validate().then(V=>{V&&l.push(V)})}),Promise.resolve()).then(()=>{l.length?n(l):a()})}),C=e=>new Promise((a,n)=>{const l=s(e);Promise.all(l.map(i=>i.validate())).then(i=>{i=i.filter(Boolean),i.length?n(i):a()})}),N=e=>{const a=o.find(n=>n.name===e);return a?new Promise((n,l)=>{a.validate().then(i=>{i?l(i):n()})}):Promise.reject()},v=e=>typeof e=="string"?N(e):t.validateFirst?h(e):C(e),T=e=>{typeof e=="string"&&(e=[e]),s(e).forEach(n=>{n.resetValidation()})},x=()=>o.reduce((e,a)=>(e[a.name]=a.getValidationStatus(),e),{}),S=(e,a)=>{o.some(n=>n.name===e?(n.$el.scrollIntoView(a),!0):!1)},P=()=>o.reduce((e,a)=>(a.name!==void 0&&(e[a.name]=a.formValue.value),e),{}),b=()=>{const e=P();v().then(()=>d("submit",e)).catch(a=>{d("failed",{values:e,errors:a});const{scrollToError:n,scrollToErrorPosition:l}=t;n&&a[0].name&&S(a[0].name,l?{block:l}:void 0)})},I=e=>{M(e),b()};return u({props:t}),D({submit:b,validate:v,getValues:P,scrollToField:S,resetValidation:T,getValidationStatus:x}),()=>{var e;return m("form",{class:J(),onSubmit:I},[(e=r.default)==null?void 0:e.call(r)])}}});const ce=g(Q),[_,X]=f("radio-group"),Z={shape:String,disabled:Boolean,iconSize:p,direction:String,modelValue:B,checkedColor:String},A=Symbol(_);var ee=c({name:_,props:Z,emits:["change","update:modelValue"],setup(t,{emit:d,slots:r}){const{linkChildren:o}=y(A),u=s=>d("update:modelValue",s);return O(()=>t.modelValue,s=>d("change",s)),o({props:t,updateValue:u}),q(()=>t.modelValue),()=>{var s;return m("div",{class:X([t.direction]),role:"radiogroup"},[(s=r.default)==null?void 0:s.call(r)])}}});const me=g(ee),ae=F({},j,{shape:String}),[te,oe]=f("radio");var ne=c({name:te,props:ae,emits:["update:modelValue"],setup(t,{emit:d,slots:r}){const{parent:o}=K(A),u=()=>(o?o.props.modelValue:t.modelValue)===t.name,s=()=>{o?o.updateValue(t.name):d("update:modelValue",t.name)};return()=>m(Y,$({bem:oe,role:"radio",parent:o,checked:u(),onToggle:s},t),E(r,["default","icon"]))}});const fe=g(ne),[se,le]=f("notify"),re=["lockScroll","position","show","teleport","zIndex"],ie=F({},W,{type:w("danger"),color:String,message:p,position:w("top"),className:B,background:String,lockScroll:Boolean});var de=c({name:se,props:ie,emits:["update:show"],setup(t,{emit:d,slots:r}){const o=u=>d("update:show",u);return()=>m(U,$({class:[le([t.type]),t.className],style:{color:t.color,background:t.background},overlay:!1,duration:.2,"onUpdate:show":o},E(t,re)),{default:()=>[r.default?r.default():t.message]})}});const ge=g(de);export{ce as F,ge as N,fe as R,me as a,ae as b,L as f,ie as n,Z as r};
@@ -0,0 +1 @@
import{a6 as c,a7 as o,a8 as a,a9 as u,aa as d,ab as m,ac as f,ad as p,ae as v}from"./index-DtOTKM3Z.js";const[b,i]=p("cell-group"),g={title:String,inset:Boolean,border:o};var O=c({name:b,inheritAttrs:!1,props:g,setup(e,{slots:t,attrs:l}){const r=()=>{var n;return a("div",d({class:[i({inset:e.inset}),{[f]:e.border&&!e.inset}]},l,m()),[(n=t.default)==null?void 0:n.call(t)])},s=()=>a("div",{class:i("title",{inset:e.inset})},[t.title?t.title():e.title]);return()=>e.title||t.title?a(u,null,[s(),r()]):r()}});const T=v(O);export{T as C,g as c};
@@ -0,0 +1 @@
import{a6 as c,a7 as o,a8 as a,a9 as u,aa as d,ab as m,ac as f,ad as p,ae as v}from"./index-DgVr7UP6.js";const[b,i]=p("cell-group"),g={title:String,inset:Boolean,border:o};var O=c({name:b,inheritAttrs:!1,props:g,setup(e,{slots:t,attrs:l}){const r=()=>{var n;return a("div",d({class:[i({inset:e.inset}),{[f]:e.border&&!e.inset}]},l,m()),[(n=t.default)==null?void 0:n.call(t)])},s=()=>a("div",{class:i("title",{inset:e.inset})},[t.title?t.title():e.title]);return()=>e.title||t.title?a(u,null,[s(),r()]):r()}});const T=v(O);export{T as C,g as c};
@@ -0,0 +1 @@
import{s as a}from"./index-DgVr7UP6.js";import{A as p,a as e,B as t,b as P,C as l,c as i,d as c,e as n,f as d,D as m,E as u,F as f,I as b,L as g,g as B,O as h,P as x,R as S,S as w,h as y,i as C,j as T,T as v,k as G,l as I,m as k,n as F,o as N,p as R,q as A,r as D,t as L,u as Z,v as E,w as O,x as j,y as q,z,G as H,H as J,J as K,K as M,M as Q,N as U,Q as V,U as W,V as X,W as Y,X as _,Y as $,Z as ss,_ as as,$ as os,a0 as rs}from"./index-DgVr7UP6.js";import{C as es,c as ts}from"./index-C62GQvT9.js";import{F as ls,N as is,R as cs,a as ns,f as ds,n as ms,r as us,b as fs}from"./index-CrHnzSmN.js";import{N as gs,S as Bs,a as hs,T as xs,n as Ss,s as ws,t as ys}from"./index-a0eWy6gD.js";export{p as ActionBar,e as ActionBarButton,t as Badge,P as Button,l as Cell,es as CellGroup,i as Checkbox,c as Collapse,n as CollapseItem,d as ConfigProvider,m as Dialog,u as Empty,f as Field,ls as Form,b as Icon,g as Loading,B as Locale,gs as NavBar,is as Notify,h as Overlay,x as Popup,cs as Radio,ns as RadioGroup,S as Rate,w as Search,Bs as Step,hs as Steps,y as Sticky,C as Swipe,T as SwipeItem,v as Tab,G as Tabs,xs as Tag,I as actionBarButtonProps,k as actionBarProps,F as badgeProps,N as buttonProps,ts as cellGroupProps,R as cellProps,A as checkboxProps,D as collapseItemProps,L as collapseProps,Z as configProviderProps,E as dialogProps,O as emptyProps,j as fieldProps,ds as formProps,q as iconProps,z as loadingProps,Ss as navBarProps,ms as notifyProps,H as overlayProps,J as popupProps,us as radioGroupProps,fs as radioProps,K as rateProps,M as searchProps,Q as setGlobalZIndex,U as showConfirmDialog,V as showDialog,W as showFailToast,X as showSuccessToast,a as showToast,ws as stepsProps,Y as stickyProps,_ as swipeProps,$ as tabProps,ss as tabsProps,ys as tagProps,as as toastProps,os as useAllTabStatus,rs as useGlobalZIndex};
@@ -0,0 +1 @@
import{a6 as c,a7 as k,as as p,at as D,a8 as m,au as y,ad as f,av as G,aw as M,ae as g,ax as B,ay as O,az as q,aA as K,aB as E,aa as $,aC as Y,aD as F,aE as j,P as U,aF as W,aG as w}from"./index-DgVr7UP6.js";const[H,J]=f("form"),L={colon:Boolean,disabled:Boolean,readonly:Boolean,required:[Boolean,String],showError:Boolean,labelWidth:p,labelAlign:String,inputAlign:String,scrollToError:Boolean,scrollToErrorPosition:String,validateFirst:Boolean,submitOnEnter:k,showErrorMessage:k,errorMessageAlign:String,validateTrigger:{type:[String,Array],default:"onBlur"}};var Q=c({name:H,props:L,emits:["submit","failed"],setup(t,{emit:d,slots:r}){const{children:o,linkChildren:u}=y(G),s=e=>e?o.filter(a=>e.includes(a.name)):o,h=e=>new Promise((a,n)=>{const l=[];s(e).reduce((R,z)=>R.then(()=>{if(!l.length)return z.validate().then(V=>{V&&l.push(V)})}),Promise.resolve()).then(()=>{l.length?n(l):a()})}),C=e=>new Promise((a,n)=>{const l=s(e);Promise.all(l.map(i=>i.validate())).then(i=>{i=i.filter(Boolean),i.length?n(i):a()})}),N=e=>{const a=o.find(n=>n.name===e);return a?new Promise((n,l)=>{a.validate().then(i=>{i?l(i):n()})}):Promise.reject()},v=e=>typeof e=="string"?N(e):t.validateFirst?h(e):C(e),T=e=>{typeof e=="string"&&(e=[e]),s(e).forEach(n=>{n.resetValidation()})},x=()=>o.reduce((e,a)=>(e[a.name]=a.getValidationStatus(),e),{}),S=(e,a)=>{o.some(n=>n.name===e?(n.$el.scrollIntoView(a),!0):!1)},P=()=>o.reduce((e,a)=>(a.name!==void 0&&(e[a.name]=a.formValue.value),e),{}),b=()=>{const e=P();v().then(()=>d("submit",e)).catch(a=>{d("failed",{values:e,errors:a});const{scrollToError:n,scrollToErrorPosition:l}=t;n&&a[0].name&&S(a[0].name,l?{block:l}:void 0)})},I=e=>{M(e),b()};return u({props:t}),D({submit:b,validate:v,getValues:P,scrollToField:S,resetValidation:T,getValidationStatus:x}),()=>{var e;return m("form",{class:J(),onSubmit:I},[(e=r.default)==null?void 0:e.call(r)])}}});const ce=g(Q),[_,X]=f("radio-group"),Z={shape:String,disabled:Boolean,iconSize:p,direction:String,modelValue:B,checkedColor:String},A=Symbol(_);var ee=c({name:_,props:Z,emits:["change","update:modelValue"],setup(t,{emit:d,slots:r}){const{linkChildren:o}=y(A),u=s=>d("update:modelValue",s);return O(()=>t.modelValue,s=>d("change",s)),o({props:t,updateValue:u}),q(()=>t.modelValue),()=>{var s;return m("div",{class:X([t.direction]),role:"radiogroup"},[(s=r.default)==null?void 0:s.call(r)])}}});const me=g(ee),ae=F({},j,{shape:String}),[te,oe]=f("radio");var ne=c({name:te,props:ae,emits:["update:modelValue"],setup(t,{emit:d,slots:r}){const{parent:o}=K(A),u=()=>(o?o.props.modelValue:t.modelValue)===t.name,s=()=>{o?o.updateValue(t.name):d("update:modelValue",t.name)};return()=>m(Y,$({bem:oe,role:"radio",parent:o,checked:u(),onToggle:s},t),E(r,["default","icon"]))}});const fe=g(ne),[se,le]=f("notify"),re=["lockScroll","position","show","teleport","zIndex"],ie=F({},W,{type:w("danger"),color:String,message:p,position:w("top"),className:B,background:String,lockScroll:Boolean});var de=c({name:se,props:ie,emits:["update:show"],setup(t,{emit:d,slots:r}){const o=u=>d("update:show",u);return()=>m(U,$({class:[le([t.type]),t.className],style:{color:t.color,background:t.background},overlay:!1,duration:.2,"onUpdate:show":o},E(t,re)),{default:()=>[r.default?r.default():t.message]})}});const ge=g(de);export{ce as F,ge as N,fe as R,me as a,ae as b,L as f,ie as n,Z as r};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
import{a6 as b,a7 as B,a8 as t,aH as $,aG as I,ad as x,aI as T,I as S,ae as P,as as N,aJ as E,aK as L,aL as z,ao as O,au as p,aM as K,aA as H,aN as M,aO as y}from"./index-DgVr7UP6.js";const[F,D]=x("tag"),G={size:String,mark:Boolean,show:B,type:I("default"),color:String,plain:Boolean,round:Boolean,textColor:String,closeable:Boolean};var J=b({name:F,props:G,emits:["close"],setup(e,{slots:n,emit:a}){const o=r=>{r.stopPropagation(),a("close",r)},c=()=>e.plain?{color:e.textColor||e.color,borderColor:e.color}:{color:e.textColor,background:e.color},l=()=>{var r;const{type:g,mark:C,plain:v,round:s,size:i,closeable:d}=e,h={mark:C,plain:v,round:s};i&&(h[i]=i);const m=d&&t(S,{name:"cross",class:[D("close"),T],onClick:o},null);return t("span",{style:c(),class:D([h,g])},[(r=n.default)==null?void 0:r.call(n),m])};return()=>t($,{name:e.closeable?"van-fade":void 0},{default:()=>[e.show?l():null]})}});const X=P(J),[V,f]=x("nav-bar"),Y={title:String,fixed:Boolean,zIndex:N,border:B,leftText:String,rightText:String,leftDisabled:Boolean,rightDisabled:Boolean,leftArrow:Boolean,placeholder:Boolean,safeAreaInsetTop:Boolean,clickable:B};var Z=b({name:V,props:Y,emits:["clickLeft","clickRight"],setup(e,{emit:n,slots:a}){const o=O(),c=E(o,f),l=s=>{e.leftDisabled||n("clickLeft",s)},r=s=>{e.rightDisabled||n("clickRight",s)},g=()=>a.left?a.left():[e.leftArrow&&t(S,{class:f("arrow"),name:"arrow-left"},null),e.leftText&&t("span",{class:f("text")},[e.leftText])],C=()=>a.right?a.right():t("span",{class:f("text")},[e.rightText]),v=()=>{const{title:s,fixed:i,border:d,zIndex:h}=e,m=z(h),k=e.leftArrow||e.leftText||a.left,A=e.rightText||a.right;return t("div",{ref:o,style:m,class:[f({fixed:i}),{[L]:d,"van-safe-area-top":e.safeAreaInsetTop}]},[t("div",{class:f("content")},[k&&t("div",{class:[f("left",{disabled:e.leftDisabled}),e.clickable&&!e.leftDisabled?T:""],onClick:l},[g()]),t("div",{class:[f("title"),"van-ellipsis"]},[a.title?a.title():s]),A&&t("div",{class:[f("right",{disabled:e.rightDisabled}),e.clickable&&!e.rightDisabled?T:""],onClick:r},[C()])])])};return()=>e.fixed&&e.placeholder?c(v):v()}});const ee=P(Z),[R,w]=x("steps"),j={active:K(0),direction:I("horizontal"),activeIcon:I("checked"),iconPrefix:String,finishIcon:String,activeColor:String,inactiveIcon:String,inactiveColor:String},_=Symbol(R);var q=b({name:R,props:j,emits:["clickStep"],setup(e,{emit:n,slots:a}){const{linkChildren:o}=p(_);return o({props:e,onClickStep:l=>n("clickStep",l)}),()=>{var l;return t("div",{class:w([e.direction])},[t("div",{class:w("items")},[(l=a.default)==null?void 0:l.call(a)])])}}});const[Q,u]=x("step");var U=b({name:Q,setup(e,{slots:n}){const{parent:a,index:o}=H(_);if(!a)return;const c=a.props,l=()=>{const i=+c.active;return o.value<i?"finish":o.value===i?"process":"waiting"},r=()=>l()==="process",g=y(()=>({background:l()==="finish"?c.activeColor:c.inactiveColor})),C=y(()=>{if(r())return{color:c.activeColor};if(l()==="waiting")return{color:c.inactiveColor}}),v=()=>a.onClickStep(o.value),s=()=>{const{iconPrefix:i,finishIcon:d,activeIcon:h,activeColor:m,inactiveIcon:k}=c;return r()?n["active-icon"]?n["active-icon"]():t(S,{class:u("icon","active"),name:h,color:m,classPrefix:i},null):l()==="finish"&&(d||n["finish-icon"])?n["finish-icon"]?n["finish-icon"]():t(S,{class:u("icon","finish"),name:d,color:m,classPrefix:i},null):n["inactive-icon"]?n["inactive-icon"]():k?t(S,{class:u("icon"),name:k,classPrefix:i},null):t("i",{class:u("circle"),style:g.value},null)};return()=>{var i;const d=l();return t("div",{class:[M,u([c.direction,{[d]:d}])]},[t("div",{class:u("title",{active:r()}),style:C.value,onClick:v},[(i=n.default)==null?void 0:i.call(n)]),t("div",{class:u("circle-container"),onClick:v},[s()]),t("div",{class:u("line"),style:g.value},null)])}}});const te=P(U),ne=P(q);export{ee as N,te as S,X as T,ne as a,Y as n,j as s,G as t};
@@ -0,0 +1 @@
:root,:host{--van-cell-group-background: var(--van-background-2);--van-cell-group-title-color: var(--van-text-color-2);--van-cell-group-title-padding: var(--van-padding-md) var(--van-padding-md);--van-cell-group-title-font-size: var(--van-font-size-md);--van-cell-group-title-line-height: 16px;--van-cell-group-inset-padding: 0 var(--van-padding-md);--van-cell-group-inset-radius: var(--van-radius-lg);--van-cell-group-inset-title-padding: var(--van-padding-md) var(--van-padding-md)}.van-cell-group{background:var(--van-cell-group-background)}.van-cell-group--inset{margin:var(--van-cell-group-inset-padding);border-radius:var(--van-cell-group-inset-radius);overflow:hidden}.van-cell-group__title{padding:var(--van-cell-group-title-padding);color:var(--van-cell-group-title-color);font-size:var(--van-cell-group-title-font-size);line-height:var(--van-cell-group-title-line-height)}.van-cell-group__title--inset{padding:var(--van-cell-group-inset-title-padding)}
Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

+71
View File
@@ -0,0 +1,71 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<!-- 移动端视口设置(适配企微 WebView) -->
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<!-- CSP 由 nginx HTTP 头统一管理(移除 meta CSP 避免双 CSP 冲突导致企微 WebView 脚本加载失败) -->
<!-- 企微 JS-SDK(静态引入,确保在 Vue 应用加载前 window.wx 就绪;比动态创建 script 更可靠) -->
<script src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<!-- 页面标题 -->
<title>智能IT支持服务台</title>
<!-- 首屏骨架屏样式 v0.5.2 强化版 -->
<style>
html, body { margin: 0; padding: 0; height: 100%; background: #f7f8fa; }
#app-skeleton {
position: fixed; inset: 0;
display: flex; flex-direction: column;
align-items: center; justify-content: center;
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Helvetica Neue", sans-serif;
color: #969799;
z-index: 9999;
}
#app-skeleton .logo {
width: 64px; height: 64px; border-radius: 16px;
background: linear-gradient(135deg, #1989fa 0%, #1c64f2 100%);
margin-bottom: 20px;
box-shadow: 0 8px 24px rgba(25, 137, 250, 0.3);
animation: pulse 1.5s ease-in-out infinite;
}
#app-skeleton .title { font-size: 18px; font-weight: 600; color: #323233; margin-bottom: 8px; }
#app-skeleton .subtitle { font-size: 14px; color: #969799; margin-bottom: 28px; }
#app-skeleton .spinner {
width: 28px; height: 28px;
border: 3px solid #ebedf0;
border-top-color: #1989fa;
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
@keyframes spin { to { transform: rotate(360deg); } }
@keyframes pulse { 0%,100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.7; transform: scale(0.95); } }
/* v0.5.2 强化:不再依赖 :empty 选择器(部分浏览器/Vue mount 太快会失效) */
/* 改用 body.app-loaded 类名,由 main.ts 挂载后主动添加 */
body.app-loaded #app-skeleton { display: none !important; }
</style>
<script type="module" crossorigin src="/h5/assets/index-DgVr7UP6.js"></script>
<link rel="stylesheet" crossorigin href="/h5/assets/index-Ctdjg3Zn.css">
</head>
<body>
<!-- 非企微环境拦截 -->
<script>
(function(){
var _ok = /^(localhost|127\.0\.0\.1)(:\d+)?$/.test(location.hostname) || navigator.userAgent.toLowerCase().indexOf('wxwork') > -1
if (!_ok) {
document.open()
document.write('<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>仅限企业微信访问</title><style>*{margin:0;padding:0;box-sizing:border-box}body{background:#f7f8fa;display:flex;align-items:center;justify-content:center;min-height:100vh;font-family:-apple-system,BlinkMacSystemFont,PingFang SC,sans-serif;text-align:center;padding:40px}.icon{font-size:60px;margin-bottom:24px}.title{font-size:20px;font-weight:600;color:#323233;margin-bottom:12px}.desc{font-size:14px;color:#969799;line-height:1.8}</style></head><body><div><div class="icon">🔒</div><div class="title">仅限企业微信访问</div><div class="desc">请在<strong>企业微信工作台</strong>中打开<br>「IT支持服务」访问此页面</div></div></body></html>')
document.close()
}
})()
</script>
<!-- Vue 应用挂载点 -->
<div id="app"></div>
<!-- 首屏骨架屏(JS 加载期间显示,挂载后自动隐藏) v0.5.2 -->
<div id="app-skeleton">
<div class="logo"></div>
<div class="title">智能IT支持服务台</div>
<div class="subtitle">正在加载...</div>
<div class="spinner"></div>
</div>
<!-- 入口脚本 -->
</body>
</html>