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 _notification=require("../../../utils/notification"),_utils=require("../../../utils/utils"),_bottomIcon=require("../../../utils/icons/bottom-icon"),_liveMenuIcon=require("../../../utils/icons/live-menu-icon");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 _defineProperty(t,n,o){return(n=_toPropertyKey(n))in t?Object.defineProperty(t,n,{value:o,enumerable:!0,configurable:!0,writable:!0}):t[n]=o,t}function _toPropertyKey(t){var n=_toPrimitive(t,"string");return"symbol"===_typeof(n)?n:String(n)}function _toPrimitive(t,n){if("object"!==_typeof(t)||null===t)return t;var o=t[Symbol.toPrimitive];if(void 0!==o){var i=o.call(t,n||"default");if("object"!==_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(t)}Component({properties:{sdkInstance:{type:Object,value:null}},observers:{sdkInstance:function(t){if(t){var n=t.store;this.store=n,this.sdkInstance=t;var o=this;"function"==typeof this._unsub&&this._unsub(),this._unsub=null,this._unsub=n.get({iconList:function(t){o.syncIconList(t)},liveInfo:function(){o.syncIconSources()},"reportInfo.videoType":function(){o.syncIconSources()},"notification.isNotificationOpen":function(t){(0,_utils.setDataIfChanged)(o,{isNotificationOpen:!1!==t}),o.syncIconSources()},"notification.isShowNotificationButton":function(){o.syncIconSources()},imageTextInfo:function(t){var n=t.countUnreadImageTextLive||0;(0,_utils.setDataIfChanged)(o,{countUnreadImageTextLive:n>=100?"99+":n})}})}}},lifetimes:{detached:function(){"function"==typeof this._unsub&&this._unsub(),this._unsub=null}},data:{outerIconList:[],innerIconList:[],countUnreadImageTextLive:0,isNotificationOpen:!0},methods:{findIconByKey:function(t,n){return(Array.isArray(t)?t:[]).find(function(t){return t.key===n})},syncIconSources:function(){(0,_liveMenuIcon.syncLiveRoomBottomIconSourcesFromStore)(this.sdkInstance)},syncIconList:function(t){var n=(0,_bottomIcon.buildBottomIconViewModel)(this.sdkInstance,_bottomIcon.BOTTOM_ICON_ROOM_TYPE.PORTRAIT,{defaultMaxVisibleCount:2,sourceIconList:t}),o={outerIconList:n.outerIconList,innerIconList:n.innerIconList};(0,_utils.isSmallPlainDataEqual)(this._iconListData,o)||(this._iconListData=o,this.setData(o))},openDrawer:function(){this.selectComponent("#volc-more-button-drawer").showFrame()},iconClick:function(t){var n=this.findIconByKey(this.data.outerIconList,t.currentTarget.dataset.key);this.dispatchIconClick(n,this.getIconHandlers())},innerIconClick:function(t){var n=this.findIconByKey(this.data.innerIconList,t.currentTarget.dataset.key);n&&((null==n?void 0:n.key)!==_bottomIcon.BOTTOM_ICON_KEY.NOTIFICATION_SWITCH?(this.selectComponent("#volc-more-button-drawer").hideFrame(),this.dispatchIconClick(n,this.getIconHandlers())):this.dispatchIconClick(n,this.getIconHandlers()))},getIconHandlers:function(){var t=this;return _defineProperty({},_bottomIcon.BOTTOM_ICON_KEY.NOTIFICATION_SWITCH,function(){return(0,_notification.toggleNotificationStateWithToast)(t.store)})},dispatchIconClick:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};(0,_bottomIcon.dispatchBottomIconClick)({sdkInstance:this.sdkInstance,icon:t,roomType:_bottomIcon.BOTTOM_ICON_ROOM_TYPE.PORTRAIT,handlers:n})}}});
@@ -0,0 +1 @@
{"component":true,"usingComponents":{"Drawer":"../../../pubComponents/drawer/drawer","mp-icon":"weui-miniprogram/icon/icon","mp-badge":"weui-miniprogram/badge/badge"}}
@@ -0,0 +1,29 @@
<view wx:if="{{outerIconList.length > 0 || innerIconList.length > 0}}" class="volc-outer-box">
<view class="volc-more-button" style="{{item.containerStyle}}" wx:for="{{outerIconList}}" wx:for-item="item" wx:key="key" data-key="{{item.key}}" bindtap="iconClick">
<view class="volc-more-button-item-badge" wx:if="{{item.key === 'IMAGE_TEXT_LIVE' && countUnreadImageTextLive}}">
<mp-badge content="{{countUnreadImageTextLive}}"/>
</view>
<view class="volc-more-button-icon">
<image wx:if="{{item.iconUrl || item.src}}" src="{{item.iconUrl || item.src}}" style="{{item.style}}" />
<mp-icon wx:if="{{item.mpIcon}}" icon="{{item.mpIcon.icon}}" color="{{item.mpIcon.color}}" size="{{item.mpIcon.size}}"></mp-icon>
</view>
</view>
<view wx:if="{{innerIconList.length > 0}}" class="volc-more-button" bindtap="openDrawer">
<view class="volc-more-button-icon volc-more-button-icon-more">
<mp-icon icon="more" color="#fff" size="{{25}}" />
</view>
</view>
</view>
<Drawer id='volc-more-button-drawer' needCancel="{{true}}">
<view class="volc-more-button-box">
<view class="volc-icon-box" style="{{item.containerStyle}}" wx:for="{{innerIconList}}" wx:for-item="item" wx:key="key" data-key="{{item.key}}" bindtap="innerIconClick">
<view class="volc-icon">
<view class="volc-icon-inner">
<image wx:if="{{item.iconUrl || item.src}}" src="{{item.iconUrl || item.src}}" style="{{item.style}}" />
<mp-icon wx:if="{{item.mpIcon}}" icon="{{item.mpIcon.icon}}" color="{{item.mpIcon.color}}" size="{{item.mpIcon.size}}"></mp-icon>
</view>
</view>
<view class="volc-name">{{item.title || item.name}}</view>
</view>
</view>
</Drawer>
@@ -0,0 +1 @@
.volc-outer-box{display:flex}.volc-more-button{display:flex;height:calc(72rpx + .5 * (1rem - 16px));width:calc(72rpx + .5 * (1rem - 16px));min-width:calc(72rpx + .5 * (1rem - 16px));border-radius:50%;justify-content:center;background-color:rgba(0,0,0,.14);font-size:calc(25px + .5 * (1rem - 16px));color:#fff;align-items:center;margin-left:12px;position:relative}.volc-icon-inner,.volc-more-button-icon{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.volc-more-button-icon-more{transform:scale(1.1)}.volc-more-button-item-badge{position:absolute;top:-18px;right:-8px}.volc-more-button image{width:40rpx;height:40rpx;object-fit:contain}.volc-more-button mp-icon{display:flex;align-items:center;justify-content:center}.volc-more-button-box{display:flex;flex-wrap:wrap;align-content:flex-start;width:100%;overflow-x:hidden;overflow-y:auto;max-height:calc(50vh - 56px - .5 * (1rem - 16px));padding:21px 15px 5px;box-sizing:border-box;-webkit-overflow-scrolling:touch}.volc-more-button-box .volc-icon-box{display:flex;flex:0 0 calc(58px + 0.5 * (1rem - 16px));flex-direction:column;align-items:center;margin-right:18px;margin-bottom:16px}.volc-icon-box .volc-icon{display:flex;align-items:center;justify-content:center;background-color:#2c2d30;height:calc(34px + .5 * (1rem - 16px));width:calc(34px + .5 * (1rem - 16px));border-radius:50%;color:#fff}.volc-icon image{width:22px;height:22px;object-fit:contain}.volc-icon-box .volc-name{display:block;width:100%;margin-top:8px;font-size:calc(12px + .5 * (1rem - 16px));line-height:calc(18px + .5 * (1rem - 16px));color:#d2d3d3;text-align:center;white-space:normal;word-break:break-all;overflow-wrap:break-word}