小草口腔诊所_H5/app.js · 约 3086 字符
1// 小草口腔诊所 · 逻辑层
2const $=s=>document.querySelector(s), $$=s=>document.querySelectorAll(s);
3const store={
4 get orders(){return JSON.parse(localStorage.getItem('dt_orders')||'[]')},
5 set orders(v){localStorage.setItem('dt_orders',JSON.stringify(v))},
6 get coupons(){return JSON.parse(localStorage.getItem('dt_coupons')||'3')},
7 set coupons(v){localStorage.setItem('dt_coupons',v)}
8};
9function fmt(n){return n>=10000?(n/10000).toFixed(1)+'万':n}
10function toast(msg){const t=document.createElement('div');t.textContent=msg;t.style.cssText='position:fixed;top:20%;left:50%;transform:translateX(-50%);background:rgba(0,0,0,.78);color:#fff;padding:10px 20px;border-radius:20px;font-size:13px;z-index:999;transition:opacity .3s';document.body.appendChild(t);setTimeout(()=>{t.style.opacity='0';setTimeout(()=>t.remove(),300)},1200)}
11/* 预约 */
12let BK={svc:null,time:null,doc:null};
13function renderSvc(){
14 $('#svc-list').innerHTML=PROJECTS.map((s,i)=>`
15 <div class="project-card">
16 <div class="pc-emoji">${s.emoji}</div>
17 <div class="pc-body">
18 <div class="pc-name">${s.name} ${s.tag==='hot'?'<span class="badge badge-hot">热门</span>':s.tag==='new'?'<span class="badge badge-new">新项目</span>':''}</div>
19 <div class="pc-desc">${s.desc}</div>
20 <div class="pc-meta">⏱️ ${s.time}</div>
21 <div class="pc-foot"><span class="pc-price"><em>¥</em>${fmt(s.price)}</span>
22 <span class="pc-add" onclick="BK.svc=${i};$$('.pc-add').forEach(x=>{x.style.background='var(--primary-light)';x.style.color='var(--primary-dark)';x.textContent='预约'});this.style.background='var(--primary)';this.style.color='#fff';this.textContent='已选';toast('已选择「${s.name}」')">预约</span></div>
23 </div>
24 </div>`).join('');
25}
26function renderTimes(){
27 $('#time-grid').innerHTML=TIMES.map(t=>{
28 const full=FULL_TIMES.includes(t);
29 return '<div class="time-cell'+(full?' full':'')+'" onclick="'+(full?"toast('该时段号源已满')":"BK.time='"+t+"';$$('.time-cell').forEach(x=>x.classList.remove('sel'));this.classList.add('sel')")+'">'+t+'</div>';
30 }).join('');
31}
32function submitBook(){
33 if(BK.svc===null){toast('请先选择就诊项目');return}
34 if(!BK.time){toast('请选择就诊时段');return}
35 const svc=PROJECTS[BK.svc];
36 const o={id:'DT'+Date.now().toString().slice(-8),project:svc.name,emoji:svc.emoji,time:BK.time+' · 明天',doc:BK.doc||'系统分配医生',date:new Date().toLocaleString('zh-CN',{month:'numeric',day:'numeric'}),status:'待就诊'};
37 store.orders=[o,...store.orders];
38 store.coupons=Math.max(0,store.coupons-1);
39 toast('预约成功,就诊提醒已开启');
40 setTimeout(()=>location.href='records.html',800);
41}
42function renderMine(){
43 $('#u-name').textContent=USER.name;$('#u-level').textContent=USER.level+' · 就诊 '+USER.visits+' 次';
44 $('#m-points').textContent=USER.points;$('#m-coupons').textContent=USER.coupons+store.coupons;
45 $('#m-visits').textContent=USER.visits;$('#m-balance').textContent=USER.balance;
46}
47