feat: 打包
This commit is contained in:
+17
-2
@@ -58,11 +58,11 @@ function readErrorMessage(data: unknown, fallback: string) {
|
||||
return fallback
|
||||
}
|
||||
|
||||
function request<T>(url: string, data: unknown): Promise<T> {
|
||||
function request<T>(url: string, data: unknown, method: 'POST' | 'GET' = 'POST'): Promise<T> {
|
||||
return new Promise((resolve, reject) => {
|
||||
uni.request({
|
||||
url: `${API_BASE_URL}${url}`,
|
||||
method: 'POST',
|
||||
method,
|
||||
timeout: 10000,
|
||||
header: {
|
||||
'Content-Type': 'application/json'
|
||||
@@ -103,6 +103,21 @@ export function sendLoginCode(phone: string, scene: SendCodePayload['scene'] = '
|
||||
})
|
||||
}
|
||||
|
||||
export type InstitutionRecord = {
|
||||
id: number
|
||||
code: string
|
||||
name: string
|
||||
type: string
|
||||
level: string
|
||||
province: string
|
||||
city: string
|
||||
is_trial: boolean
|
||||
}
|
||||
|
||||
export function fetchInstitutions(): Promise<InstitutionRecord[]> {
|
||||
return request<InstitutionRecord[]>('/user/institution_list/', null, 'GET')
|
||||
}
|
||||
|
||||
export function loginWithCode(payload: LoginCodePayload): Promise<LoginResponse> {
|
||||
return request<LoginResponse>('/user/auth/login-code/', payload).then(response => {
|
||||
if (isLoginResponse(response)) return response
|
||||
|
||||
Vendored
-1
File diff suppressed because one or more lines are too long
Vendored
+1
File diff suppressed because one or more lines are too long
Vendored
+1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Vendored
-1
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
import{M as o,J as n}from"./index-CO9MSRh5.js";const r=""+new URL("config-doctor-BPF7WOJm.png",import.meta.url).href;function e(r){var e;const i=n(),p=Boolean(null==(e=null==i?void 0:i.vnode.props)?void 0:e.onOpenProfile);return function(){p?r("open-profile"):o({url:"/pages/profile/profile"})}}export{r as _,e as c};
|
||||
import{M as o,J as n}from"./index-B3vBMebU.js";const r=""+new URL("config-doctor-BPF7WOJm.png",import.meta.url).href;function e(r){var e;const i=n(),p=Boolean(null==(e=null==i?void 0:i.vnode.props)?void 0:e.onOpenProfile);return function(){p?r("open-profile"):o({url:"/pages/profile/profile"})}}export{r as _,e as c};
|
||||
@@ -1 +0,0 @@
|
||||
import{d as a,b as s,o as l,e,f as t,w as c,i as o,C as n,j as r,l as u,L as d,m as i,F as f,t as _,n as b,q as m,y as p,z as g,x as h,u as v,S as y,E as k}from"./index-CO9MSRh5.js";import{c as x,_ as w}from"./navigation.CR32hNeX.js";import{_ as C}from"./_plugin-vue_export-helper.BCo6x5W8.js";const j=C(a({__name:"assessment",emits:["open-settings","open-profile","go-home"],setup(a,{emit:C}){const j=C,T=x(j),F=[{label:"病史采集",score:92},{label:"体格检查",score:85},{label:"临床思维",score:90},{label:"诊断准确性",score:88},{label:"治疗方案",score:82}],q=s(""),z=s(!1);let B=null;return l((()=>{B&&clearTimeout(B)})),(a,s)=>{const l=p,x=g,C=h,E=v,I=y;return e(),t(l,{class:"assessment-page"},{default:c((()=>[o(l,{class:"top-nav"},{default:c((()=>[o(x,{class:"icon-button","aria-label":"设置",onClick:s[0]||(s[0]=a=>j("open-settings"))},{default:c((()=>[o(l,{class:"settings-icon"})])),_:1}),o(x,{class:"icon-button home-button","aria-label":"首页",onClick:s[1]||(s[1]=a=>j("go-home"))},{default:c((()=>[o(l,{class:"home-icon"})])),_:1}),o(l,{class:"nav-spacer"}),o(x,{class:"icon-button","aria-label":"个人中心",onClick:n(T)},{default:c((()=>[o(l,{class:"account-icon"})])),_:1},8,["onClick"])])),_:1}),o(I,{class:"assessment-content","scroll-y":""},{default:c((()=>[o(l,{class:"score-section"},{default:c((()=>[o(l,{class:"score-gauge"},{default:c((()=>[o(l,{class:"gauge-bg"}),o(l,{class:"gauge-fill"}),o(l,{class:"score-center"},{default:c((()=>[o(C,{class:"score-value"},{default:c((()=>[r("88")])),_:1}),o(C,{class:"score-label"},{default:c((()=>[r("总分/100")])),_:1})])),_:1})])),_:1}),o(l,{class:"score-copy"},{default:c((()=>[o(C,{class:"score-title"},{default:c((()=>[r("本次考核评价:优良")])),_:1}),o(C,{class:"score-subtitle"},{default:c((()=>[r("临床思维严谨,诊疗流程规范")])),_:1})])),_:1})])),_:1}),o(l,{class:"dimension-card"},{default:c((()=>[o(l,{class:"section-title"},{default:c((()=>[o(l,{class:"insights-icon"}),o(C,null,{default:c((()=>[r("临床能力维度评估")])),_:1})])),_:1}),o(l,{class:"radar-wrap"},{default:c((()=>[(e(),u("svg",{class:"radar-svg",viewBox:"0 0 200 200"},[d("polygon",{fill:"none",points:"100,20 176,76 147,166 53,166 24,76",stroke:"#c2c6d4","stroke-width":"0.5"}),d("polygon",{fill:"none",points:"100,40 160,84 137,152 63,152 40,84",stroke:"#c2c6d4","stroke-width":"0.5"}),d("polygon",{fill:"none",points:"100,60 144,92 127,138 73,138 56,92",stroke:"#c2c6d4","stroke-width":"0.5"}),d("polygon",{fill:"rgba(0, 71, 141, 0.2)",points:"100,30 165,80 135,155 75,145 45,70",stroke:"#00478d","stroke-width":"2"}),o(C,{class:"radar-label","text-anchor":"middle",x:"100",y:"15"},{default:c((()=>[r("病史采集")])),_:1}),o(C,{class:"radar-label","text-anchor":"start",x:"180",y:"75"},{default:c((()=>[r("体格检查")])),_:1}),o(C,{class:"radar-label","text-anchor":"start",x:"150",y:"180"},{default:c((()=>[r("临床思维")])),_:1}),o(C,{class:"radar-label","text-anchor":"end",x:"50",y:"180"},{default:c((()=>[r("诊断准确性")])),_:1}),o(C,{class:"radar-label","text-anchor":"end",x:"20",y:"75"},{default:c((()=>[r("治疗方案")])),_:1})]))])),_:1}),o(l,{class:"mentor-review"},{default:c((()=>[o(l,{class:"mentor-head"},{default:c((()=>[o(l,{class:"mentor-avatar"},{default:c((()=>[o(E,{src:w,mode:"aspectFill"})])),_:1}),o(l,null,{default:c((()=>[o(C,{class:"mentor-name"},{default:c((()=>[r("王主任点评")])),_:1}),o(C,{class:"mentor-role"},{default:c((()=>[r("资深临床导师")])),_:1})])),_:1})])),_:1}),o(l,{class:"mentor-bubble"},{default:c((()=>[o(l,{class:"bubble-tail"}),o(C,null,{default:c((()=>[r("你在病史采集环节表现出色,逻辑清晰;但在鉴别诊断方面稍欠全面,建议加强对心血管急症鉴别诊断的学习。")])),_:1})])),_:1})])),_:1}),o(l,{class:"bar-list"},{default:c((()=>[(e(),u(f,null,i(F,(a=>o(l,{key:a.label,class:"bar-item"},{default:c((()=>[o(l,{class:"bar-head"},{default:c((()=>[o(C,null,{default:c((()=>[r(_(a.label),1)])),_:2},1024),o(C,{class:"bar-score"},{default:c((()=>[r(_(a.score)+"/100",1)])),_:2},1024)])),_:2},1024),o(l,{class:"bar-track"},{default:c((()=>[o(l,{class:"bar-fill",style:k({width:`${a.score}%`})},null,8,["style"])])),_:2},1024)])),_:2},1024))),64))])),_:1})])),_:1}),o(l,{class:"action-area"},{default:c((()=>[o(x,{class:"primary-action",onClick:s[2]||(s[2]=a=>{return s="病例详情暂未开放",B&&clearTimeout(B),q.value=s,z.value=!0,m({title:s,icon:"none"}),void(B=setTimeout((()=>{z.value=!1}),2200));var s})},{default:c((()=>[o(l,{class:"description-icon"}),o(C,null,{default:c((()=>[r("查看病例详情")])),_:1})])),_:1}),o(x,{class:"secondary-action",onClick:s[3]||(s[3]=a=>j("go-home"))},{default:c((()=>[o(l,{class:"map-icon"}),o(C,null,{default:c((()=>[r("返回路径")])),_:1})])),_:1})])),_:1})])),_:1}),o(l,{class:b(["toast",{visible:z.value}])},{default:c((()=>[r(_(q.value),1)])),_:1},8,["class"])])),_:1})}}}),[["__scopeId","data-v-2b17d3ff"]]);export{j as default};
|
||||
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
+1
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
+1
-1
@@ -1 +1 @@
|
||||
import{d as s,a as e,b as a,B as t,o as l,e as i,f as n,C as o,w as c,i as r,j as u,t as d,g,n as m,s as p,y as f,z as b,x as _,u as h}from"./index-CO9MSRh5.js";import{c as v,_ as j}from"./navigation.CR32hNeX.js";import k from"./pages-matching-matching.Ct5sJvnH.js";import{_ as w}from"./_plugin-vue_export-helper.BCo6x5W8.js";import"./pages-cases-cases.BoP2qVQz.js";import"./scenario.BukjTHcC.js";import"./chat.8vobffxZ.js";import"./pages-diagnosis-diagnosis.66q0uZui.js";import"./pages-treatment-treatment.D0F-ACWL.js";import"./pages-assessment-assessment.C4j7M_zU.js";import"./pages-teaching-teaching.B-cSP3tJ.js";const y=w(s({__name:"home",emits:["open-settings","open-profile"],setup(s,{emit:w}){const y=w,C=v(y),O=e({greeting:"下午好,医生。",highlight:"让我们继续提升您的临床思维能力吧。",remainingModules:3,doctorName:"王主任"}),x=a(!1),P=a(""),I=a(!1),M=a(!1);function S(){x.value||(x.value=!0,Promise.resolve({sessionId:`mock-session-${Date.now()}`,startedAt:(new Date).toISOString()}).then((s=>{p("clinical-thinking-session",s),M.value=!0})).finally((()=>{setTimeout((()=>{x.value=!1}),600)})))}return t((function(){Promise.resolve({greeting:"下午好,医生。",highlight:"让我们继续提升您的临床思维能力吧。",remainingModules:3,doctorName:"王主任"}).then((s=>{Object.assign(O,s)}))})),l((()=>{})),(s,e)=>{const a=f,t=b,l=_,p=h;return M.value?(i(),n(k,{key:0,onOpenSettings:e[0]||(e[0]=s=>y("open-settings")),onOpenProfile:o(C),onGoHome:e[1]||(e[1]=s=>M.value=!1)},null,8,["onOpenProfile"])):(i(),n(a,{key:1,class:"home-page"},{default:c((()=>[r(a,{class:"home-shell"},{default:c((()=>[r(a,{class:"top-bar"},{default:c((()=>[r(t,{class:"icon-button","aria-label":"配置",onClick:e[2]||(e[2]=s=>y("open-settings"))},{default:c((()=>[r(a,{class:"settings-icon"})])),_:1}),r(a,{class:"top-spacer"}),r(t,{class:"icon-button","aria-label":"个人中心",onClick:o(C)},{default:c((()=>[r(a,{class:"account-icon"})])),_:1},8,["onClick"])])),_:1}),r(a,{class:"home-main"},{default:c((()=>[r(a,{class:"speech-bubble"},{default:c((()=>[r(l,{class:"bubble-line"},{default:c((()=>[u(d(O.greeting),1)])),_:1}),r(a,{class:"bubble-line-wrap"},{default:c((()=>[r(l,{class:"bubble-line"},{default:c((()=>[u("让我们继续提升您的")])),_:1}),r(l,{class:"bubble-highlight"},{default:c((()=>[u("临床思维能力吧")])),_:1}),r(l,{class:"bubble-line"},{default:c((()=>[u("。")])),_:1})])),_:1})])),_:1}),r(a,{class:"doctor-stage"},{default:c((()=>[r(a,{class:"doctor-shadow"}),r(p,{class:"director-image",src:j,mode:"aspectFit"})])),_:1}),r(a,{class:"action-area"},{default:c((()=>[r(t,{class:"start-button",disabled:x.value,onClick:S},{default:c((()=>[x.value?(i(),n(a,{key:0,class:"spinner"})):g("",!0),r(l,null,{default:c((()=>[u(d(x.value?"正在进入...":"开始训练"),1)])),_:1})])),_:1},8,["disabled"]),r(l,{class:"remaining"},{default:c((()=>[u("今日剩余:"+d(O.remainingModules)+"个模块",1)])),_:1})])),_:1})])),_:1})])),_:1}),r(a,{class:m(["toast",{visible:I.value}])},{default:c((()=>[u(d(P.value),1)])),_:1},8,["class"])])),_:1}))}}}),[["__scopeId","data-v-cbbdf43f"]]);export{y as default};
|
||||
import{d as s,b as e,a,o as t,e as l,f as i,g as n,C as o,w as c,j as r,k as u,t as d,h as g,n as m,s as p,z as f,A as b,y as h,x as _}from"./index-B3vBMebU.js";import{c as v,_ as j}from"./navigation.BZVu_wSx.js";import k from"./pages-matching-matching.DVF4k08c.js";import{_ as w}from"./_plugin-vue_export-helper.BCo6x5W8.js";import"./pages-cases-cases.CPeRGYhy.js";import"./scenario.wlxg83eB.js";import"./chat.BWayzdx3.js";import"./pages-diagnosis-diagnosis.DLNbZbUH.js";import"./pages-treatment-treatment.Dv8qpMaV.js";import"./pages-assessment-assessment.CEMOFUPF.js";import"./pages-teaching-teaching.CtcKGapx.js";const y=w(s({__name:"home",emits:["open-settings","open-profile"],setup(s,{emit:w}){const y=w,C=v(y),O=e({greeting:"下午好,医生。",highlight:"让我们继续提升您的临床思维能力吧。",remainingModules:3,doctorName:"王主任"}),x=a(!1),P=a(""),I=a(!1),M=a(!1);function S(){x.value||(x.value=!0,Promise.resolve({sessionId:`mock-session-${Date.now()}`,startedAt:(new Date).toISOString()}).then((s=>{p("clinical-thinking-session",s),M.value=!0})).finally((()=>{setTimeout((()=>{x.value=!1}),600)})))}return t((function(){Promise.resolve({greeting:"下午好,医生。",highlight:"让我们继续提升您的临床思维能力吧。",remainingModules:3,doctorName:"王主任"}).then((s=>{Object.assign(O,s)}))})),l((()=>{})),(s,e)=>{const a=f,t=b,l=h,p=_;return M.value?(i(),n(k,{key:0,onOpenSettings:e[0]||(e[0]=s=>y("open-settings")),onOpenProfile:o(C),onGoHome:e[1]||(e[1]=s=>M.value=!1)},null,8,["onOpenProfile"])):(i(),n(a,{key:1,class:"home-page"},{default:c((()=>[r(a,{class:"home-shell"},{default:c((()=>[r(a,{class:"top-bar"},{default:c((()=>[r(t,{class:"icon-button","aria-label":"配置",onClick:e[2]||(e[2]=s=>y("open-settings"))},{default:c((()=>[r(a,{class:"settings-icon"})])),_:1}),r(a,{class:"top-spacer"}),r(t,{class:"icon-button","aria-label":"个人中心",onClick:o(C)},{default:c((()=>[r(a,{class:"account-icon"})])),_:1},8,["onClick"])])),_:1}),r(a,{class:"home-main"},{default:c((()=>[r(a,{class:"speech-bubble"},{default:c((()=>[r(l,{class:"bubble-line"},{default:c((()=>[u(d(O.greeting),1)])),_:1}),r(a,{class:"bubble-line-wrap"},{default:c((()=>[r(l,{class:"bubble-line"},{default:c((()=>[u("让我们继续提升您的")])),_:1}),r(l,{class:"bubble-highlight"},{default:c((()=>[u("临床思维能力吧")])),_:1}),r(l,{class:"bubble-line"},{default:c((()=>[u("。")])),_:1})])),_:1})])),_:1}),r(a,{class:"doctor-stage"},{default:c((()=>[r(a,{class:"doctor-shadow"}),r(p,{class:"director-image",src:j,mode:"aspectFit"})])),_:1}),r(a,{class:"action-area"},{default:c((()=>[r(t,{class:"start-button",disabled:x.value,onClick:S},{default:c((()=>[x.value?(i(),n(a,{key:0,class:"spinner"})):g("",!0),r(l,null,{default:c((()=>[u(d(x.value?"正在进入...":"开始训练"),1)])),_:1})])),_:1},8,["disabled"]),r(l,{class:"remaining"},{default:c((()=>[u("今日剩余:"+d(O.remainingModules)+"个模块",1)])),_:1})])),_:1})])),_:1})])),_:1}),r(a,{class:m(["toast",{visible:I.value}])},{default:c((()=>[u(d(P.value),1)])),_:1},8,["class"])])),_:1}))}}}),[["__scopeId","data-v-cbbdf43f"]]);export{y as default};
|
||||
+1
File diff suppressed because one or more lines are too long
-1
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
import{d as s,a as e,b as a,B as t,o as l,e as n,f as r,C as o,w as i,i as c,l as u,m as g,F as p,j as d,t as m,E as f,y as b,x as v,u as _,n as h}from"./index-CO9MSRh5.js";import{c as y,_ as j}from"./navigation.CR32hNeX.js";import x from"./pages-cases-cases.BoP2qVQz.js";import{_ as $}from"./_plugin-vue_export-helper.BCo6x5W8.js";import"./scenario.BukjTHcC.js";import"./chat.8vobffxZ.js";import"./pages-diagnosis-diagnosis.66q0uZui.js";import"./pages-treatment-treatment.D0F-ACWL.js";import"./pages-assessment-assessment.C4j7M_zU.js";import"./pages-teaching-teaching.B-cSP3tJ.js";const I=$(s({__name:"matching",emits:["open-settings","open-profile","go-home"],setup(s,{emit:$}){const I=$,M=y(I),k=e({message:"王主任正在为您智能匹配病例",subtitle:"正在通过大模型计算最适合您的临床案例库...",progressTarget:92,tags:[]}),T=a([]),w=a(0),O=a(!1);let P=0,F=null,B=null;function C(){Promise.resolve({message:"王主任正在为您智能匹配病例",subtitle:"正在通过大模型计算最适合您的临床案例库...",progressTarget:92,tags:[{label:"薄弱环节",tone:"secondary"},{label:"主治医级别",tone:"primary"},{label:"高匹配度",tone:"tertiary"},{label:"基于历史偏好",tone:"neutral"}]}).then((s=>{Object.assign(k,s),function(){B&&clearInterval(B);w.value=0,B=setInterval((()=>{if(w.value>=k.progressTarget)return B&&clearInterval(B),B=null,void setTimeout((()=>{O.value=!0}),700);w.value=Math.min(k.progressTarget,w.value+3*Math.random())}),600)}()}))}function D(){const s=P++,e=256*Math.random(),a=256*Math.random(),t=150*(Math.random()-.5),l=150*(Math.random()-.5),n=2+3*Math.random();T.value.push({id:s,style:{left:`${e}px`,top:`${a}px`,"--particle-x":`${t}px`,"--particle-y":`${l}px`,animationDuration:`${n}s`}}),setTimeout((()=>{T.value=T.value.filter((e=>e.id!==s))}),1e3*n)}return t((()=>{C(),function(){for(let s=0;s<12;s+=1)D();F=setInterval(D,300)}()})),l((()=>{F&&clearInterval(F),B&&clearInterval(B)})),(s,e)=>{const a=b,t=v,l=_;return O.value?(n(),r(x,{key:0,onOpenSettings:e[0]||(e[0]=s=>I("open-settings")),onOpenProfile:o(M),onGoHome:e[1]||(e[1]=s=>I("go-home"))},null,8,["onOpenProfile"])):(n(),r(a,{key:1,class:"matching-page"},{default:i((()=>[c(a,{class:"matching-shell"},{default:i((()=>[c(a,{class:"top-visual"},{default:i((()=>[c(a,{class:"network"},{default:i((()=>[c(a,{class:"ring ring-large"}),c(a,{class:"ring ring-middle"}),c(a,{class:"ring ring-small"}),c(a,{class:"node node-top"}),c(a,{class:"node node-left"}),c(a,{class:"node node-right"}),(n(!0),u(p,null,g(T.value,(s=>(n(),r(a,{key:s.id,class:"particle",style:f(s.style)},null,8,["style"])))),128))])),_:1})])),_:1}),c(a,{class:"middle-visual"},{default:i((()=>[c(a,{class:"match-bubble"},{default:i((()=>[c(t,null,{default:i((()=>[d(m(k.message),1)])),_:1}),c(t,{class:"typing-dots"}),c(a,{class:"bubble-tail"})])),_:1}),c(a,{class:"director-card"},{default:i((()=>[c(l,{class:"director-image",src:j,mode:"aspectFit"})])),_:1}),c(a,{class:"intelligence-area"},{default:i((()=>[c(a,{class:"scan-circle"},{default:i((()=>[c(a,{class:"pulse-ring ring-one"}),c(a,{class:"pulse-ring ring-two"}),c(a,{class:"brain-core"},{default:i((()=>[c(a,{class:"scan-bar"}),c(a,{class:"brain-icon"})])),_:1})])),_:1}),(n(!0),u(p,null,g(k.tags,((s,e)=>(n(),r(a,{key:s.label,class:h(["float-tag",[`tag-${s.tone}`,`tag-pos-${e}`]])},{default:i((()=>[c(t,null,{default:i((()=>[d(m(s.label),1)])),_:2},1024)])),_:2},1032,["class"])))),128))])),_:1})])),_:1}),c(a,{class:"bottom-progress"},{default:i((()=>[c(a,{class:"progress-track"},{default:i((()=>[c(a,{class:"progress-fill",style:f({width:`${w.value}%`})},null,8,["style"])])),_:1}),c(t,{class:"progress-subtitle"},{default:i((()=>[d(m(k.subtitle),1)])),_:1}),c(a,{class:"security-icon"})])),_:1})])),_:1})])),_:1}))}}}),[["__scopeId","data-v-deb9eb1c"]]);export{I as default};
|
||||
@@ -0,0 +1 @@
|
||||
import{d as s,b as e,a,o as t,e as l,f as n,g as r,C as o,w as i,j as c,m as u,p as g,F as p,k as d,t as m,E as f,z as b,y as v,x as _,n as h}from"./index-B3vBMebU.js";import{c as y,_ as j}from"./navigation.BZVu_wSx.js";import x from"./pages-cases-cases.CPeRGYhy.js";import{_ as $}from"./_plugin-vue_export-helper.BCo6x5W8.js";import"./scenario.wlxg83eB.js";import"./chat.BWayzdx3.js";import"./pages-diagnosis-diagnosis.DLNbZbUH.js";import"./pages-treatment-treatment.Dv8qpMaV.js";import"./pages-assessment-assessment.CEMOFUPF.js";import"./pages-teaching-teaching.CtcKGapx.js";const k=$(s({__name:"matching",emits:["open-settings","open-profile","go-home"],setup(s,{emit:$}){const k=$,I=y(k),M=e({message:"王主任正在为您智能匹配病例",subtitle:"正在通过大模型计算最适合您的临床案例库...",progressTarget:92,tags:[]}),T=a([]),w=a(0),O=a(!1);let P=0,F=null,z=null;function C(){Promise.resolve({message:"王主任正在为您智能匹配病例",subtitle:"正在通过大模型计算最适合您的临床案例库...",progressTarget:92,tags:[{label:"薄弱环节",tone:"secondary"},{label:"主治医级别",tone:"primary"},{label:"高匹配度",tone:"tertiary"},{label:"基于历史偏好",tone:"neutral"}]}).then((s=>{Object.assign(M,s),function(){z&&clearInterval(z);w.value=0,z=setInterval((()=>{if(w.value>=M.progressTarget)return z&&clearInterval(z),z=null,void setTimeout((()=>{O.value=!0}),700);w.value=Math.min(M.progressTarget,w.value+3*Math.random())}),600)}()}))}function D(){const s=P++,e=256*Math.random(),a=256*Math.random(),t=150*(Math.random()-.5),l=150*(Math.random()-.5),n=2+3*Math.random();T.value.push({id:s,style:{left:`${e}px`,top:`${a}px`,"--particle-x":`${t}px`,"--particle-y":`${l}px`,animationDuration:`${n}s`}}),setTimeout((()=>{T.value=T.value.filter((e=>e.id!==s))}),1e3*n)}return t((()=>{C(),function(){for(let s=0;s<12;s+=1)D();F=setInterval(D,300)}()})),l((()=>{F&&clearInterval(F),z&&clearInterval(z)})),(s,e)=>{const a=b,t=v,l=_;return O.value?(n(),r(x,{key:0,onOpenSettings:e[0]||(e[0]=s=>k("open-settings")),onOpenProfile:o(I),onGoHome:e[1]||(e[1]=s=>k("go-home"))},null,8,["onOpenProfile"])):(n(),r(a,{key:1,class:"matching-page"},{default:i((()=>[c(a,{class:"matching-shell"},{default:i((()=>[c(a,{class:"top-visual"},{default:i((()=>[c(a,{class:"network"},{default:i((()=>[c(a,{class:"ring ring-large"}),c(a,{class:"ring ring-middle"}),c(a,{class:"ring ring-small"}),c(a,{class:"node node-top"}),c(a,{class:"node node-left"}),c(a,{class:"node node-right"}),(n(!0),u(p,null,g(T.value,(s=>(n(),r(a,{key:s.id,class:"particle",style:f(s.style)},null,8,["style"])))),128))])),_:1})])),_:1}),c(a,{class:"middle-visual"},{default:i((()=>[c(a,{class:"match-bubble"},{default:i((()=>[c(t,null,{default:i((()=>[d(m(M.message),1)])),_:1}),c(t,{class:"typing-dots"}),c(a,{class:"bubble-tail"})])),_:1}),c(a,{class:"director-card"},{default:i((()=>[c(l,{class:"director-image",src:j,mode:"aspectFit"})])),_:1}),c(a,{class:"intelligence-area"},{default:i((()=>[c(a,{class:"scan-circle"},{default:i((()=>[c(a,{class:"pulse-ring ring-one"}),c(a,{class:"pulse-ring ring-two"}),c(a,{class:"brain-core"},{default:i((()=>[c(a,{class:"scan-bar"}),c(a,{class:"brain-icon"})])),_:1})])),_:1}),(n(!0),u(p,null,g(M.tags,((s,e)=>(n(),r(a,{key:s.label,class:h(["float-tag",[`tag-${s.tone}`,`tag-pos-${e}`]])},{default:i((()=>[c(t,null,{default:i((()=>[d(m(s.label),1)])),_:2},1024)])),_:2},1032,["class"])))),128))])),_:1})])),_:1}),c(a,{class:"bottom-progress"},{default:i((()=>[c(a,{class:"progress-track"},{default:i((()=>[c(a,{class:"progress-fill",style:f({width:`${w.value}%`})},null,8,["style"])])),_:1}),c(t,{class:"progress-subtitle"},{default:i((()=>[d(m(M.subtitle),1)])),_:1}),c(a,{class:"security-icon"})])),_:1})])),_:1})])),_:1}))}}}),[["__scopeId","data-v-deb9eb1c"]]);export{k as default};
|
||||
Vendored
+1
-1
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
File diff suppressed because one or more lines are too long
Vendored
-1
File diff suppressed because one or more lines are too long
Vendored
+1
File diff suppressed because one or more lines are too long
Vendored
+1
-1
@@ -14,7 +14,7 @@
|
||||
<title>AI思维临床训练</title>
|
||||
<!--preload-links-->
|
||||
<!--app-context-->
|
||||
<script type="module" crossorigin src="./assets/index-CO9MSRh5.js"></script>
|
||||
<script type="module" crossorigin src="./assets/index-B3vBMebU.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="./assets/index-C7PPi8dw.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
+52
-10
@@ -112,7 +112,10 @@
|
||||
<text class="picker-close" @click="institutionPickerVisible = false">关闭</text>
|
||||
</view>
|
||||
<scroll-view class="institution-list" scroll-y>
|
||||
<view v-if="institutionLoading" class="institution-empty">机构列表加载中...</view>
|
||||
<view v-else-if="institutions.length === 0" class="institution-empty">暂无可选机构</view>
|
||||
<view
|
||||
v-else
|
||||
v-for="institution in institutions"
|
||||
:key="institution.id"
|
||||
class="institution-item"
|
||||
@@ -133,8 +136,8 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { computed, nextTick, onUnmounted, reactive, ref } from 'vue'
|
||||
import { ApiRequestError, loginWithCode, sendLoginCode } from '../../api/auth'
|
||||
import { computed, nextTick, onMounted, onUnmounted, reactive, ref } from 'vue'
|
||||
import { ApiRequestError, fetchInstitutions, loginWithCode, sendLoginCode, type InstitutionRecord } from '../../api/auth'
|
||||
import ConfigPage from '../config/config.vue'
|
||||
import ProfilePage from '../profile/profile.vue'
|
||||
|
||||
@@ -146,13 +149,7 @@ type Institution = {
|
||||
typeName: string
|
||||
}
|
||||
|
||||
const institutions: Institution[] = [
|
||||
{ id: 'H001', code: 'H001', name: '协和医学院', city: '北京', typeName: '医学院校' },
|
||||
{ id: 'H002', code: 'H002', name: '四川大学华西医院', city: '成都', typeName: '三甲医院' },
|
||||
{ id: 'H003', code: 'H003', name: '复旦大学附属中山医院', city: '上海', typeName: '三甲医院' },
|
||||
{ id: 'H004', code: 'H004', name: '中山大学孙逸仙纪念医院', city: '广州', typeName: '三甲医院' },
|
||||
{ id: 'OTHER', code: 'OTHER', name: '其他机构', city: '其他', typeName: '手动登记' }
|
||||
]
|
||||
const institutions = ref<Institution[]>([])
|
||||
|
||||
const form = reactive({
|
||||
phone: '',
|
||||
@@ -171,12 +168,14 @@ const toastVisible = ref(false)
|
||||
const showConfigPage = ref(false)
|
||||
const showProfilePage = ref(false)
|
||||
const institutionPickerVisible = ref(false)
|
||||
const institutionLoading = ref(false)
|
||||
const institutionLoaded = ref(false)
|
||||
|
||||
let countdownTimer: ReturnType<typeof setInterval> | null = null
|
||||
let toastTimer: ReturnType<typeof setTimeout> | null = null
|
||||
|
||||
const selectedInstitution = computed(() => {
|
||||
return institutions.find(item => item.id === form.institutionId)
|
||||
return institutions.value.find(item => item.id === form.institutionId)
|
||||
})
|
||||
|
||||
const isCounting = computed(() => countdown.value > 0)
|
||||
@@ -191,6 +190,37 @@ function chooseInstitution(institution: Institution) {
|
||||
institutionPickerVisible.value = false
|
||||
}
|
||||
|
||||
function normalizeInstitution(item: InstitutionRecord): Institution {
|
||||
const typeNameMap: Record<string, string> = {
|
||||
hospital: '医院',
|
||||
college: '医学院校',
|
||||
school: '学校',
|
||||
clinic: '诊所'
|
||||
}
|
||||
const region = [item.province, item.city].filter(Boolean).join(' · ')
|
||||
return {
|
||||
id: String(item.id),
|
||||
code: item.code,
|
||||
name: item.name,
|
||||
city: region || '其他',
|
||||
typeName: typeNameMap[item.type] || '机构'
|
||||
}
|
||||
}
|
||||
|
||||
async function loadInstitutions() {
|
||||
institutionLoading.value = true
|
||||
try {
|
||||
const result = await fetchInstitutions()
|
||||
institutions.value = result.map(normalizeInstitution)
|
||||
} catch (error) {
|
||||
showToast(error instanceof Error ? error.message : '机构列表加载失败')
|
||||
institutions.value = []
|
||||
} finally {
|
||||
institutionLoading.value = false
|
||||
institutionLoaded.value = true
|
||||
}
|
||||
}
|
||||
|
||||
function toggleAgreement() {
|
||||
agreed.value = !agreed.value
|
||||
}
|
||||
@@ -220,6 +250,10 @@ async function handleSendCode() {
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
void loadInstitutions()
|
||||
})
|
||||
|
||||
function handleLogin() {
|
||||
if (submitting.value) return
|
||||
if (!validatePhone()) return
|
||||
@@ -727,6 +761,14 @@ page {
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.institution-empty {
|
||||
padding: 20px 4px;
|
||||
color: #727783;
|
||||
font-size: 14px;
|
||||
line-height: 20px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.institution-item {
|
||||
box-sizing: border-box;
|
||||
min-height: 64px;
|
||||
|
||||
Reference in New Issue
Block a user