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
@@ -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-Yb6N__5M.js";/* empty css */import{b as F}from"./auth-BDitiLN6.js";import{C as W}from"./index-B0ezQQt8.js";import{R as X,a as Y,F as Z,N as $}from"./index-DDElvLol.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 @@
import{a6 as A,af as N,ag as P,ah as U,ai as O,a3 as n,a4 as o,aj as r,a5 as z,a8 as g,L as E,ak as Q,al as q,b as R,I as j,am as S,an as D,ao as l,s as d,V as T,a2 as I}from"./index-Yb6N__5M.js";import{g as M,h as W,a as $}from"./auth-BDitiLN6.js";const F={class:"login-page"},G={class:"login-card"},H={key:0,class:"qr-login"},J={class:"qr-container"},K={key:0,class:"qr-loading"},X={key:1,class:"qr-code"},Y=["src"],Z={key:2,class:"qr-error"},ee={key:0,class:"scan-tip"},ae={key:1,class:"loading-container"},te=A({__name:"Login",setup(se){const v=N(),i=P(),m=l(!0),h=l(""),y=l(!1),p=l(""),s=l(!1),f=l("请稍候...");let _=null,w="";function x(){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 C(){if(w)try{const a=await $(w);a.status==="scanned"?p.value="scanned":a.status==="confirmed"&&a.token?(u(),await V(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(C,2e3)}function u(){_&&(clearInterval(_),_=null)}async function V(a,e){s.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),T("登录成功"),v.push({name:"ChatView"})}catch(t){console.error("登录失败:",t),d("登录失败,请重试")}finally{s.value=!1}}async function L(a,e){s.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),T("登录成功"),v.push({name:"ChatView"})}catch(t){console.error("OAuth回调处理失败:",t),d("授权失败,请重试")}finally{s.value=!1}}return U(async()=>{const a=new URLSearchParams(window.location.search),e=a.get("code"),t=a.get("state");if(e){await L(e,t||void 0);return}if(x()){s.value=!0,f.value="正在跳转企微授权...";try{await i.redirectToOAuth()}catch(k){console.error("跳转授权失败:",k),m.value=!0,c()}finally{s.value=!1}}else m.value=!0,c()}),O(()=>{u()}),(a,e)=>{const t=E,k=R,B=j;return n(),o("div",F,[r("div",G,[e[5]||(e[5]=z('<div class="login-header" data-v-9ae7a51a><div class="login-logo-row" data-v-9ae7a51a><span class="logo-block" data-v-9ae7a51a>IT</span><h1 class="login-title" data-v-9ae7a51a>智能IT服务</h1></div><p class="login-subtitle" data-v-9ae7a51a>扫码登录</p></div>',1)),m.value?(n(),o("div",H,[r("div",J,[y.value?(n(),o("div",K,[g(t,{type:"spinner",size:"32px"}),e[0]||(e[0]=r("p",null,"加载中...",-1))])):h.value?(n(),o("div",X,[r("img",{src:h.value,alt:"企微扫码登录"},null,8,Y)])):(n(),o("div",Z,[e[2]||(e[2]=r("p",null,"获取二维码失败",-1)),g(k,{size:"small",onClick:c},{default:Q(()=>[...e[1]||(e[1]=[q("重试",-1)])]),_:1})]))]),e[4]||(e[4]=r("p",{class:"qr-hint"},"请使用企业微信扫码登录",-1)),p.value==="scanned"?(n(),o("p",ee,[g(B,{name:"checked"}),e[3]||(e[3]=q(" 已扫码,请在手机确认 ",-1))])):S("",!0)])):S("",!0),s.value?(n(),o("div",ae,[g(t,{type:"spinner",size:"40px"}),r("p",null,D(f.value),1)])):S("",!0)])])}}}),re=I(te,[["__scopeId","data-v-9ae7a51a"]]);export{re as default};
@@ -0,0 +1 @@
.login-page[data-v-9ae7a51a]{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-9ae7a51a]{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-9ae7a51a]{text-align:center;margin-bottom:32px}.login-logo-row[data-v-9ae7a51a]{display:flex;align-items:center;justify-content:center;gap:8px;margin-bottom:8px}.logo-block[data-v-9ae7a51a]{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:7px;background:linear-gradient(135deg,var(--accent),var(--accent));color:var(--bg-secondary, #ffffff);font-size:16px;font-weight:800;letter-spacing:-.5px;flex-shrink:0}.login-title[data-v-9ae7a51a]{font-size:24px;font-weight:700;background:linear-gradient(135deg,var(--accent),var(--accent));-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;margin:0}.login-subtitle[data-v-9ae7a51a]{font-size:14px;color:var(--text-tertiary, #909399);margin:0}.qr-login[data-v-9ae7a51a]{display:flex;flex-direction:column;align-items:center}.qr-container[data-v-9ae7a51a]{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-9ae7a51a]{display:flex;flex-direction:column;align-items:center;gap:8px;color:var(--text-tertiary, #909399)}.qr-code img[data-v-9ae7a51a]{width:180px;height:180px}.qr-error[data-v-9ae7a51a]{text-align:center;color:var(--error-color, #f56c6c)}.qr-hint[data-v-9ae7a51a]{font-size:14px;color:var(--text-tertiary, #909399);margin:0}.scan-tip[data-v-9ae7a51a]{display:flex;align-items:center;gap:4px;color:var(--success-color, #07c160);font-size:14px;margin-top:12px}.loading-container[data-v-9ae7a51a]{display:flex;flex-direction:column;align-items:center;gap:16px;padding:40px 0;color:var(--text-secondary, #606266)}
@@ -0,0 +1 @@
import{a6 as m,af as v,ah as f,ai as _,a3 as s,a4 as i,aj as o,am as u,ao as l,a2 as k}from"./index-Yb6N__5M.js";const y={class:"video-intro"},h={key:0,class:"intro-loading"},b="/h5/video/intro.mp4",C=m({__name:"VideoIntro",setup(I){const c=v(),n=l(null),r=l(!0),d=l(!1);let e=null;function p(){r.value=!1,e=setTimeout(()=>{d.value=!0},3e3)}function a(){localStorage.setItem("h5_video_intro_watched","true"),e&&(clearTimeout(e),e=null),c.replace({name:"ChatView"})}return f(()=>{n.value&&n.value.play().catch(()=>{a()}),e=setTimeout(()=>{a()},15e3)}),_(()=>{e&&(clearTimeout(e),e=null)}),(T,t)=>(s(),i("div",y,[o("video",{ref_key:"videoRef",ref:n,class:"intro-video",autoplay:"",muted:"",playsinline:"","webkit-playsinline":"",poster:"",onEnded:a,onError:a,onCanplay:p},[o("source",{src:b,type:"video/mp4"})],544),r.value?(s(),i("div",h,[...t[0]||(t[0]=[o("div",{class:"loading-spinner"},null,-1),o("p",{class:"loading-text"},"正在加载...",-1)])])):u("",!0),d.value?(s(),i("button",{key:1,class:"skip-btn",onClick:a}," 跳过 > ")):u("",!0),t[1]||(t[1]=o("div",{class:"intro-brand"},[o("span",{class:"brand-name"},"智能IT服务")],-1))]))}}),V=k(C,[["__scopeId","data-v-ab7c8109"]]);export{V as default};
@@ -0,0 +1 @@
.video-intro[data-v-ab7c8109]{position:fixed;top:0;right:0;bottom:0;left:0;background:#000;display:flex;align-items:center;justify-content:center;overflow:hidden;z-index:99999}.intro-video[data-v-ab7c8109]{width:100%;height:100%;object-fit:cover}.intro-loading[data-v-ab7c8109]{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#000}.loading-spinner[data-v-ab7c8109]{width:36px;height:36px;border:3px solid rgba(255,255,255,.2);border-top-color:#07c160;border-radius:50%;animation:spin-ab7c8109 .8s linear infinite}.loading-text[data-v-ab7c8109]{margin-top:12px;font-size:14px;color:#fff9;font-family:-apple-system,BlinkMacSystemFont,PingFang SC,sans-serif}@keyframes spin-ab7c8109{to{transform:rotate(360deg)}}.skip-btn[data-v-ab7c8109]{position:absolute;top:env(safe-area-inset-top,20px);top:max(20px,env(safe-area-inset-top));right:20px;padding:8px 16px;background:#0006;border:1px solid rgba(255,255,255,.3);border-radius:20px;color:#ffffffe6;font-size:14px;font-family:-apple-system,BlinkMacSystemFont,PingFang SC,sans-serif;cursor:pointer;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);transition:background .2s}.skip-btn[data-v-ab7c8109]:active{background:#0009}.intro-brand[data-v-ab7c8109]{position:absolute;bottom:env(safe-area-inset-bottom,40px);bottom:max(40px,env(safe-area-inset-bottom));left:0;right:0;text-align:center}.brand-name[data-v-ab7c8109]{font-size:18px;font-weight:600;color:#ffffffd9;font-family:-apple-system,BlinkMacSystemFont,PingFang SC,sans-serif;letter-spacing:2px}
@@ -0,0 +1 @@
import{a2 as s,a3 as d,a4 as t,a5 as o}from"./index-Yb6N__5M.js";const e={},n={class:"wework-only"};function c(v,a){return d(),t("div",n,[...a[0]||(a[0]=[o('<div class="wework-only__card" data-v-3f90d659><div class="wework-only__icon" data-v-3f90d659><svg viewBox="0 0 1024 1024" width="80" height="80" data-v-3f90d659><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-3f90d659></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-3f90d659></path></svg></div><h2 class="wework-only__title" data-v-3f90d659>请在企业微信中打开</h2><p class="wework-only__desc" data-v-3f90d659> 智能IT服务仅支持在企业微信内使用,<br data-v-3f90d659> 请通过企业微信工作台进入。 </p><div class="wework-only__steps" data-v-3f90d659><div class="wework-only__step" data-v-3f90d659><span class="wework-only__step-num" data-v-3f90d659>1</span><span data-v-3f90d659>打开企业微信</span></div><div class="wework-only__step" data-v-3f90d659><span class="wework-only__step-num" data-v-3f90d659>2</span><span data-v-3f90d659>进入「工作台」</span></div><div class="wework-only__step" data-v-3f90d659><span class="wework-only__step-num" data-v-3f90d659>3</span><span data-v-3f90d659>找到「智能IT服务」</span></div></div></div>',1)])])}const _=s(e,[["render",c],["__scopeId","data-v-3f90d659"]]);export{_ as default};
@@ -0,0 +1 @@
.wework-only[data-v-3f90d659]{display:flex;align-items:center;justify-content:center;min-height:100vh;background:#f5f6f7;padding:24px;box-sizing:border-box}.wework-only__card[data-v-3f90d659]{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-3f90d659]{margin-bottom:24px}.wework-only__title[data-v-3f90d659]{font-size:20px;font-weight:600;color:#1a1a1a;margin:0 0 12px}.wework-only__desc[data-v-3f90d659]{font-size:14px;color:#666;line-height:1.6;margin:0 0 32px}.wework-only__steps[data-v-3f90d659]{display:flex;flex-direction:column;gap:16px;text-align:left;padding:0 16px}.wework-only__step[data-v-3f90d659]{display:flex;align-items:center;gap:12px;font-size:14px;color:#333}.wework-only__step-num[data-v-3f90d659]{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{a1 as t}from"./index-Yb6N__5M.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 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-Yb6N__5M.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-Yb6N__5M.js";import{A as p,a as e,B as t,b as P,C as i,c as l,d as c,e as n,f as d,D as m,E as g,F as u,I as b,L as f,g as B,O as C,P as h,R as x,S,h as w,i as y,j as I,T,k as v,l as G,m as N,n as k,o as F,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-Yb6N__5M.js";import{C as es,I as ts,N as Ps,a as is,S as ls,b as cs,T as ns,c as ds,i as ms,n as gs,d as us,s as bs,t as fs}from"./index-CBTj24VR.js";import{C as Cs,c as hs}from"./index-B0ezQQt8.js";import{F as Ss,N as ws,R as ys,a as Is,f as Ts,n as vs,r as Gs,b as Ns}from"./index-DDElvLol.js";export{p as ActionBar,e as ActionBarButton,t as Badge,P as Button,es as Card,i as Cell,Cs as CellGroup,l as Checkbox,c as Collapse,n as CollapseItem,d as ConfigProvider,m as Dialog,g as Empty,u as Field,Ss as Form,b as Icon,ts as Image,f as Loading,B as Locale,Ps as NavBar,is as NoticeBar,ws as Notify,C as Overlay,h as Popup,ys as Radio,Is as RadioGroup,x as Rate,S as Search,ls as Step,cs as Steps,w as Sticky,y as Swipe,I as SwipeItem,T as Tab,v as Tabs,ns as Tag,G as actionBarButtonProps,N as actionBarProps,k as badgeProps,F as buttonProps,ds as cardProps,hs 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,Ts as formProps,q as iconProps,ms as imageProps,z as loadingProps,gs as navBarProps,us as noticeBarProps,vs as notifyProps,H as overlayProps,J as popupProps,Gs as radioGroupProps,Ns 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,bs as stepsProps,Y as stickyProps,_ as swipeProps,$ as tabProps,ss as tabsProps,fs as tagProps,as as toastProps,os as useAllTabStatus,rs as useGlobalZIndex};
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 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-Yb6N__5M.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
@@ -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

+78
View File
@@ -0,0 +1,78 @@
<!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: 48px; height: 48px; border-radius: 10px;
background: linear-gradient(135deg, #07C160 0%, #07C160 100%);
margin-bottom: 20px;
box-shadow: 0 4px 16px rgba(7, 193, 96, 0.25);
display: flex; align-items: center; justify-content: center;
color: #fff; font-size: 22px; font-weight: 800; letter-spacing: -1px;
animation: pulse 1.5s ease-in-out infinite;
}
#app-skeleton .title {
font-size: 20px; font-weight: 700; margin-bottom: 8px;
background: linear-gradient(135deg, #07C160, #07C160);
-webkit-background-clip: text; -webkit-text-fill-color: transparent;
background-clip: text;
}
#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: #07C160;
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-Yb6N__5M.js"></script>
<link rel="stylesheet" crossorigin href="/h5/assets/index-BL0MmR40.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">IT</div>
<div class="title">智能IT服务</div>
<div class="subtitle">正在加载...</div>
<div class="spinner"></div>
</div>
<!-- 入口脚本 -->
</body>