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 _utils=require("../../utils/utils");function _typeof(t){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},_typeof(t)}function ownKeys(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);e&&(o=o.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,o)}return r}function _objectSpread(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?ownKeys(Object(r),!0).forEach(function(e){_defineProperty(t,e,r[e])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):ownKeys(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))})}return t}function _defineProperty(t,e,r){return(e=_toPropertyKey(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function _toPropertyKey(t){var e=_toPrimitive(t,"string");return"symbol"===_typeof(e)?e:String(e)}function _toPrimitive(t,e){if("object"!==_typeof(t)||null===t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var o=r.call(t,e||"default");if("object"!==_typeof(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}var formatProgramTime=function(t){var e=1e3*normalizeSeconds(t);if(!e)return"";var r=new Date(e),o=String(r.getHours()).padStart(2,"0"),n=String(r.getMinutes()).padStart(2,"0");return"".concat(o,":").concat(n)},normalizeSeconds=function(t){var e=Number(t||0);return e?e>1e11?Math.floor(e/1e3):Math.floor(e):0},getProgramEndTime=function(t,e){var r=normalizeSeconds((null==t?void 0:t.PlayEndTime)||(null==t?void 0:t.EndTime)||(null==t?void 0:t.AutoEndTime));if(r)return r;var o=normalizeSeconds(null==t?void 0:t.PlayStartTime),n=normalizeSeconds(null==e?void 0:e.PlayStartTime);if(n>o)return n;var i=Number((null==t?void 0:t.VideoTime)||(null==t?void 0:t.Duration)||(null==t?void 0:t.MediaDuration)||0);return o&&i>0?Math.floor(o+i):0};Component({properties:{sdkInstance:{type:Object,value:null},themeColor:{type:Object,value:null}},data:{programList:[]},observers:{sdkInstance:function(t){var e=this;t&&("function"==typeof this.unsub&&this.unsub(),this.unsub=null,this.sdkInstance=t,this.store=t.store,this.unsub=this.store.get({liveInfo:function(t){var r,o,n=(null===(r=e.store)||void 0===r||null===(o=r.get)||void 0===o?void 0:o.call(r,"PullStreamUrl"))||(null==t?void 0:t.PullStreamUrl)||[],i=(0,_utils.getCurrentLoopVideoProgram)(t,n),u=Array.isArray(null==i?void 0:i.LoopVideos)?i.LoopVideos:[],l=u.map(function(t,e){return _objectSpread(_objectSpread({},t),{},{startTimeText:formatProgramTime(null==t?void 0:t.PlayStartTime),endTimeText:formatProgramTime(getProgramEndTime(t,u[e+1])),videoNameText:(0,_utils.getBySplit)(null==t?void 0:t.VideoName)})});JSON.stringify(e.data.programList)!==JSON.stringify(l)&&e.setData({programList:l})}}))}},lifetimes:{detached:function(){"function"==typeof this.unsub&&this.unsub(),this.unsub=null}}});
@@ -0,0 +1 @@
{"component":true}
@@ -0,0 +1,27 @@
<view class="program-list">
<view wx:if="{{!programList.length}}" class="program-empty">暂无节目单</view>
<!-- 节目单条目可能超过横屏 tab 高度,使用 scroll-view 保证真机内列表独立滚动。 -->
<scroll-view wx:else class="program-scroll" scroll-y enhanced show-scrollbar="{{false}}">
<view
wx:for="{{programList}}"
wx:key="index"
wx:for-item="item"
class="program-card"
>
<view class="program-time {{item.IsPlay === 1 ? 'program-text-active' : ''}}">
<view>{{item.startTimeText}}</view>
<view class="program-time-line"></view>
<view>{{item.endTimeText}}</view>
</view>
<view class="program-cover-wrapper">
<image class="program-cover" mode="aspectFill" src="{{item.VideoCoverImage}}" />
<view wx:if="{{item.IsPlay === 1}}" class="program-playing-mask">
<image class="program-playing-icon" src="../../assets/program_playing.svg" />
</view>
</view>
<view class="program-name {{item.IsPlay === 1 ? 'program-text-active' : ''}}">
{{item.videoNameText}}
</view>
</view>
</scroll-view>
</view>
@@ -0,0 +1 @@
.program-list{height:100%;box-sizing:border-box;background:#fff;color:#1d2129}.program-scroll{height:100%;padding:20rpx 32rpx 32rpx;box-sizing:border-box}.program-empty{padding-top:96rpx;color:#86909c;font-size:calc(28rpx + .5 * (1rem - 16px));text-align:center}.program-card{display:flex;align-items:center;padding:20rpx 0}.program-card+.program-card{margin-top:20rpx}.program-time{width:104rpx;flex-shrink:0;margin-right:20rpx;font-size:calc(24rpx + .5 * (1rem - 16px));line-height:calc(34rpx + .5 * (1rem - 16px));color:#86909c;text-align:center}.program-time-line{width:1px;height:16rpx;margin:2rpx auto;background:#c9cdd4}.program-cover-wrapper{position:relative;width:168rpx;height:94rpx;flex-shrink:0;margin-right:28rpx;border-radius:8rpx;overflow:hidden;background:#f2f3f5}.program-cover{width:100%;height:100%}.program-playing-mask{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center}.program-playing-icon{width:60rpx;height:60rpx}.program-name{flex:1;min-width:0;font-size:calc(28rpx + .5 * (1rem - 16px));line-height:calc(40rpx + .5 * (1rem - 16px));color:#4e5969;word-break:break-all}.program-text-active{color:#1d2129}