feat: 电子药箱小程序 - 4Tab药品管理

- 电子药箱: 药品库存管理 + 手动录入 + 今日用药打卡
- 药品百科: 搜索 + 分类筛选 + 20种药品静态数据
- 惠教中心: 4条药品使用指南课程
- 我的: 家庭成员信息管理
- 自定义TabBar + navigation-bar组件
- SVG药品分类插图
This commit is contained in:
陈誉午
2026-07-29 11:20:52 +08:00
commit 994b267f5c
683 changed files with 43849 additions and 0 deletions
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"component":true,"usingComponents":{"mp-icon":"weui-miniprogram/icon/icon","dialog":"../../pubComponents/dialog/dialog"}}
@@ -0,0 +1,68 @@
<dialog
visible="{{visible}}"
showMask="{{true}}"
maskClosable="{{true}}"
zIndex="{{12000}}"
containerStyle="overflow: visible; background: transparent; border-radius: 24rpx;"
bind:close="onClose"
>
<view class="reservation-content {{isDarkTheme ? 'reservation-content-dark' : ''}}">
<view class="title">预约直播</view>
<!-- 手机号输入行 -->
<view class="input-group">
<view class="input-box phone-box">
<input
class="input"
type="number"
placeholder="请输入手机号"
placeholder-class="input-placeholder"
value="{{tel}}"
bindinput="onTelInput"
maxlength="11"
/>
</view>
</view>
<!-- 验证码输入行 -->
<view class="input-group">
<view class="input-box code-box">
<input
class="input"
type="number"
placeholder="请输入验证码"
placeholder-class="input-placeholder"
value="{{verifyCode}}"
bindinput="onCodeInput"
maxlength="6"
/>
<view class="divider"></view>
<view
class="code-btn {{countdown > 0 ? 'disabled' : ''}}"
catchtap="onSendCode"
>
{{countdown > 0 ? '重新发送(' + countdown + ')' : '获取验证码'}}
</view>
</view>
</view>
<!-- 错误提示 -->
<view wx:if="{{errMsg}}" class="reservation-error-msg">{{errMsg}}</view>
<!-- 提交按钮 -->
<button
class="submit-btn"
hover-class="submit-btn-hover"
bindtap="onSubmit"
disabled="{{submitting || !tel || !verifyCode}}"
loading="{{submitting}}"
>
预约
</button>
</view>
<!-- 关闭按钮 (放在容器外) -->
<view class="close-btn" catchtap="onClose">
<image src="../../assets/icon_close_btn.svg" class="close-icon" />
</view>
</dialog>
@@ -0,0 +1 @@
.reservation-content{padding:48rpx 40rpx 40rpx;background:#fff;border-radius:24rpx;box-sizing:border-box}.reservation-content-dark{background:#202124}.title{font-size:calc(34rpx + .5 * (1rem - 16px));font-weight:500;color:#1d2129;text-align:center;margin-bottom:48rpx;line-height:calc(48rpx + .5 * (1rem - 16px))}.reservation-content-dark .title{color:#fff}.input-group{display:flex;margin-bottom:24rpx;width:100%}.input-box{flex:1;height:88rpx;background:#f7f8fa;border-radius:8rpx;padding:0 24rpx;display:flex;align-items:center;box-sizing:border-box}.reservation-content-dark .input-box{background:#37383a}.input{flex:1;height:100%;font-size:calc(30rpx + .5 * (1rem - 16px));color:#1d2129;min-width:0}.reservation-content-dark .input{color:#d2d3d3}.input-placeholder{color:#c9cdd4}.reservation-content-dark .input-placeholder{color:#909090}.divider{width:2rpx;height:32rpx;background:#e5e6eb;margin:0 24rpx}.reservation-content-dark .divider{background:#343434}.code-btn{font-size:calc(30rpx + .5 * (1rem - 16px));color:#1664ff;white-space:nowrap;font-feature-settings:'tnum';font-variant-numeric:tabular-nums}.code-btn.disabled{color:#c9cdd4}.reservation-error-msg{font-size:calc(24rpx + .5 * (1rem - 16px));color:#f53f3f;margin-bottom:24rpx;min-height:calc(34rpx + .5 * (1rem - 16px));line-height:calc(34rpx + .5 * (1rem - 16px))}.submit-btn{width:100%!important;height:calc(88rpx + .5 * (1rem - 16px));background:#1664ff;border-radius:44rpx;color:#fff;font-size:calc(32rpx + .5 * (1rem - 16px));display:flex;align-items:center;justify-content:center;padding:0;margin-top:16rpx}.submit-btn-hover{opacity:.8}.submit-btn[disabled]{background:#94bfff!important;color:rgba(255,255,255,.6)!important}.close-btn{position:absolute;left:50%;bottom:-110rpx;transform:translateX(-50%);width:60rpx;height:60rpx;display:flex;align-items:center;justify-content:center;z-index:10}.close-icon{width:60rpx;height:60rpx}