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
@@ -0,0 +1 @@
"use strict";var _times=require("../../../utils/times"),_utils=require("../../../utils/utils");Component({properties:{sendTime:{type:Number,value:null},deadLine:{type:Number,value:null},deadLineSecond:{type:Number,value:null},timeOverText:{type:String,value:""},type:{type:String,value:null},isDownWarn:{type:Boolean,value:!1},useDarkTheme:{type:Boolean,value:!1},awardThemeUrl:{type:String,value:""},forceZero:{type:Boolean,value:!1}},data:{countdownText:""},lifetimes:{attached:function(){},detached:function(){clearInterval(this.timerRef)}},observers:{sendTime:function(){this.syncCountdown()},forceZero:function(){this.syncCountdown()}},methods:{syncCountdown:function(){if(this.timerRef&&clearInterval(this.timerRef),this.data.forceZero)(0,_utils.setDataIfChanged)(this,{countdownText:"00:00"});else if(this.data.sendTime){var e=this.getCountDownText({sendTime:this.data.sendTime,deadLine:this.data.deadLine,deadLineSecond:this.data.deadLineSecond});(0,_utils.setDataIfChanged)(this,{countdownText:e}),"00:00"!==e?this.timerRef=setInterval(this.loop.bind(this),1e3):this.onCountDown()}},loop:function(){if(this.data.forceZero)return(0,_utils.setDataIfChanged)(this,{countdownText:"00:00"}),void clearInterval(this.timerRef);var e=this.getCountDownText({sendTime:this.data.sendTime,deadLine:this.data.deadLine,deadLineSecond:this.data.deadLineSecond});(0,_utils.setDataIfChanged)(this,{countdownText:e});var t=e.split(":");"00"===t[0]&&10===Number(t[1])&&this.onCountDownWarn(),"00:00"===e&&(this.onCountDown(),clearInterval(this.timerRef))},getCountDownText:function(e){var t=e.sendTime,n=e.deadLine,i=e.deadLineSecond;return(0,_times.getCountDownV2)(t,n,i).join(":")},onCountDown:function(){this.triggerEvent("onCountDown")},onCountDownWarn:function(){this.triggerEvent("onCountDownWarn")}}});
@@ -0,0 +1 @@
{"component":true,"usingComponents":{}}
@@ -0,0 +1,38 @@
<wxs module="m1">
var countdownText = function(countdownText) {
return countdownText ? countdownText.split(':') : ['00', '00'];
}
module.exports.countdownText = countdownText;
</wxs>
<view class="status-tip" wx:if="{{countdownText === '00:00' && timeOverText}}">{{timeOverText}}</view>
<!-- 答题倒计时 -->
<view wx:elif="{{type === 'quiz'}}" class="quiz-count-down {{isDownWarn ? 'quiz-count-down-warn' : ''}}" >
<view class="quiz-count-down-item" >
{{m1.countdownText(countdownText)[0]}}
</view>:<view class="quiz-count-down-item" >
{{m1.countdownText(countdownText)[1]}}
</view>
</view>
<!-- 签到倒计时 -->
<view wx:elif="{{type === 'check-in'}}" class="check-in-count-down {{useDarkTheme ? 'check-in-count-down-dark' : ''}}" >
<view class="check-in-count-down-item" >
{{m1.countdownText(countdownText)[0]}}
</view>:<view class="check-in-count-down-item" >
{{m1.countdownText(countdownText)[1]}}
</view>{{m1.countdownText(countdownText).length === 3 ? ':' : ''}}<view wx:if="{{m1.countdownText(countdownText).length === 3}}" class="check-in-count-down-item" >
{{m1.countdownText(countdownText)[2]}}
</view>
</view>
<!-- 抽奖倒计时 -->
<view wx:elif="{{type === 'lottery'}}" class="lottery-detail-countdown {{useDarkTheme ? ' lottery-detail-countdown-dark' : ''}}{{awardThemeUrl === 'lotteryBox' ? ' lottery-detail-countdown-box' : ''}}{{awardThemeUrl === 'slotMachine' ? 'lottery-detail-countdown-machine' : '' }}" >
<view class="lottery-detail-countdown-box" >
{{m1.countdownText(countdownText)[0]}}
</view>:<view class="lottery-detail-countdown-box" >
{{m1.countdownText(countdownText)[1]}}
</view>{{m1.countdownText(countdownText).length === 3 ? ':' : ''}}<view wx:if="{{m1.countdownText(countdownText).length === 3}}" class="lottery-detail-countdown-box" >
{{m1.countdownText(countdownText)[2]}}
</view>
</view>
<view wx:else class="status-tip" wx:else>{{countdownText}}</view>
@@ -0,0 +1 @@
.status-tip{display:inline-block;width:max-content;transform:scale(.75);margin:0 -12rpx}.quiz-count-down{margin-left:6rpx}.quiz-count-down-item{display:inline-block;background-color:#ccdbff;border-radius:4rpx;margin:0 4rpx;padding:0 4rpx;font-size:calc(26rpx + .5 * (1rem - 16px));font-weight:700}.quiz-count-down-warn .quiz-count-down-item{background-color:#facbc5}.check-in-count-down{display:flex;justify-content:center;margin-top:20rpx;color:#3370ff;opacity:.9;font-size:calc(44rpx + .5 * (1rem - 16px));font-weight:400;line-height:calc(80rpx + .5 * (1rem - 16px))}.check-in-count-down-item{width:80rpx;height:80rpx;line-height:80rpx;background-color:#e8f3ff;border-radius:4rpx;margin:0 8rpx}.check-in-count-down-dark .check-in-count-down-item{background-color:#37383a}.lottery-detail-countdown{display:flex;justify-content:center;margin-top:-40rpx;margin-bottom:32rpx}.lottery-detail-countdown .lottery-detail-countdown-box{width:28px;height:28px;margin:0 4px;background:#fafdff;border-radius:4px;box-shadow:0 2px 12px 0 rgba(0,102,255,.02);backdrop-filter:none}.lottery-detail-countdown,.lottery-detail-countdown>view{color:#1664ff;font-size:calc(14px + .5 * (1rem - 16px));font-weight:500;line-height:calc(28px + .5 * (1rem - 16px))}.lottery-detail-countdown-dark .lottery-detail-countdown-box{backdrop-filter:blur(4px);background:#2a2a35;box-shadow:none}.lottery-detail-countdown-dark,.lottery-detail-countdown-dark>view{color:#fff}.lottery-detail-countdown-box .lottery-detail-countdown-box{background:linear-gradient(115.14deg,rgba(6,38,103,.6) 1.82%,rgba(97,7,93,.6) 37.77%,rgba(84,0,8,.6) 81.16%),linear-gradient(98.27deg,rgba(28,45,194,.424) 3.47%,rgba(255,163,111,.232) 43.12%,rgba(84,4,121,.744) 92.24%);box-shadow:none;backdrop-filter:blur(4px)}.lottery-detail-countdown-box,.lottery-detail-countdown-box>view{color:#fff}.lottery-detail-countdown-machine .lottery-detail-countdown-box{background:#fff;box-shadow:0 2px 12px 0 rgba(255,122,0,.02);backdrop-filter:none}.lottery-detail-countdown-machine,.lottery-detail-countdown-machine>view{color:#ff7751}