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":{"Drawer":"../../../pubComponents/drawer/drawer","mp-loading":"weui-miniprogram/loading/loading","count-down":"../count-down/count-down","mp-icon":"weui-miniprogram/icon/icon"}}
@@ -0,0 +1,64 @@
<Drawer id='check-in-drawer' class="check-in-drawer" needCancel="{{false}}" bind:myCancel="myCancel">
<view wx:if="{{visible && data}}" class="check-in-drawer-wrap {{useDarkTheme ? 'check-in-drawer-wrap-dark' : ''}}">
<mp-icon bindtap="closeCheckInDrawer" icon="close" color="#939aa3" size="{{20}}" class="close drawer-close-shadow" />
<view wx:if="{{isSubmitSuccess}}" class="check-in-result">
<image src="../../../assets/success.svg" />
<view class="check-in-result-title">签到成功</view>
<view class="check-in-result-subtitle">感谢你的参与</view>
</view>
<view wx:else>
<!-- 标题 -->
<view class="check-in-title">{{data.CheckInName}}</view>
<!-- 倒计时 -->
<count-down
type="check-in"
wx:if="{{data.StartTime}}"
sendTime="{{data.StartTime}}"
deadLine="{{data.Deadline}}"
deadLineSecond="{{data.DeadlineSecond}}"
forceZero="{{isDeadline}}"
useDarkTheme="{{useDarkTheme}}"
bind:onCountDown="onCountDown"
/>
<!-- 提交 -->
<view class="check-in-content">
<view class="check-in-over" style="opacity: {{isDeadline ? 1 : 0}}">
签到已结束
</view>
<view wx:if="{{data.ShowKickoutTip && !isDeadline}}" class="check-in-secondary-tip">
为避免暂停观看直播,请尽快完成签到
</view>
<button
wx:if="{{data.IsChecked || isDeadline}}"
disabled="{{true}}"
class="check-in-footer-button check-in-footer-button-disabled"
type="primary"
bindtap="formSubmit"
>{{data.IsChecked ? '已签到' : '未签到'}}</button>
<view wx:elif="{{data.NeedPersonInfo}}" class="check-in-footer">
<input
class="check-in-footer-input"
bindinput="valueChange"
value="{{checkValue}}"
maxlength="{{20}}"
placeholder="{{data.CheckInInfo}}"
/>
<button
class="check-in-footer-button"
type="primary"
bindtap="formSubmit"
>立即签到</button>
</view>
<button
wx:else
class="check-in-footer-button"
type="primary"
bindtap="formSubmit"
>点击签到</button>
<view class="error-msg" style="display: {{!errMsg ? 'none' : 'block'}}">
{{errMsg === 'empty' ? '输入项不能为空' : errMsg }}
</view>
</view>
</view>
</view>
</Drawer>
@@ -0,0 +1 @@
.check-in-drawer .drawer{z-index:1001!important}.check-in-drawer-wrap{text-align:center;background-color:#fff;padding-top:60rpx;padding-left:40rpx;padding-right:40rpx;padding-bottom:constant(safe-area-inset-bottom);padding-bottom:env(safe-area-inset-bottom)}.close{position:absolute;top:20rpx;right:40rpx}.drawer-close-shadow{background:0 0;box-shadow:none}.check-in-result{text-align:center;padding-bottom:48rpx}.check-in-result image{width:160rpx;height:160rpx;margin-bottom:16rpx}.check-in-result-title{font-size:calc(34rpx + .5 * (1rem - 16px));color:#1d2129;font-weight:500}.check-in-result-subtitle{font-size:calc(28rpx + .5 * (1rem - 16px));color:#4e5969}.check-in-title{font-weight:500;font-size:calc(36rpx + .5 * (1rem - 16px));color:#3370ff;line-height:calc(52rpx + .5 * (1rem - 16px))}.check-in-content{position:relative;color:#323b47;display:flex;flex-direction:column;align-items:center;font-size:calc(32rpx + .5 * (1rem - 16px));margin-top:40rpx}.check-in-over{padding-bottom:10rpx;font-size:calc(24rpx + .5 * (1rem - 16px));color:#86909c;height:calc(50rpx + .5 * (1rem - 16px))}.check-in-secondary-tip{width:100%;margin-bottom:16rpx;font-size:calc(24rpx + .5 * (1rem - 16px));line-height:calc(34rpx + .5 * (1rem - 16px));color:#86909c;text-align:center}.check-in-footer-button{width:100%!important;height:calc(80rpx + .5 * (1rem - 16px));border-radius:16rpx;font-size:calc(32rpx + .5 * (1rem - 16px));margin-bottom:48rpx;font-weight:400!important;color:#fff!important;background-color:#3370ff!important}.check-in-footer-button-disabled{background-color:#94bfff!important}.check-in-footer{display:flex;flex-direction:row;width:100%}.check-in-footer .check-in-footer-button{height:calc(80rpx + .5 * (1rem - 16px));line-height:calc(80rpx + .5 * (1rem - 16px));width:20%!important;border-radius:0 16rpx 16rpx 0;padding:0;font-size:calc(28rpx + .5 * (1rem - 16px))}.check-in-footer .check-in-footer-input{height:calc(80rpx + .5 * (1rem - 16px));width:80%;border-radius:16rpx 0 0 16rpx;background:#f2f3f8;border-color:transparent;color:#323b47;box-shadow:none!important;border:none;text-overflow:ellipsis;white-space:nowrap;font-size:calc(28rpx + .5 * (1rem - 16px));padding:0 20rpx;text-align:left}.error-msg{color:red;font-size:calc(24rpx + .5 * (1rem - 16px));position:absolute;left:0;bottom:136rpx}.check-in-drawer-wrap-dark{background-color:#202124}.check-in-drawer-wrap-dark .check-in-content{color:#d2d3d3}.check-in-drawer-wrap-dark .check-in-over{color:#757577}.check-in-drawer-wrap-dark .check-in-secondary-tip{color:#757577}.check-in-drawer-wrap-dark .check-in-footer .check-in-footer-input{background:#37383a;color:#d2d3d3}.check-in-drawer-wrap-dark .check-in-result-title{color:#ffffffe6}.check-in-drawer-wrap-dark .check-in-result-subtitle{color:#ffffffb3}