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 _constant=require("../../../utils/constant"),_productCardUtils=require("../../../utils/product-card-utils"),_jump=require("../../../utils/jump");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 n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}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 n=r.call(t,e||"default");if("object"!==_typeof(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}Component({properties:{sdkInstance:{type:Object,value:null}},data:{showFloatCard:!1,closedByUser:!1,card:{},lastExplainCardIds:[]},observers:{sdkInstance:function(t){if(t){this.sdkInstance=t,this.store=t.store;var e=this;"function"==typeof this.unsub&&this.unsub(),this.unsub=null,this.unsub=this.store.get({liveInfo:function(t){if(null!=t&&t.Menus){var r=t.Menus.ProductV2,n=[];Object.values(r).forEach(function(t){n=n.concat(t.Product?t.Product.map(function(e){return _objectSpread(_objectSpread({},(0,_productCardUtils.withProductReminderText)(e)),{},{UAInfos:t.UAInfos})}):[])});var i=n.filter(function(t){return 1===t.FloatingStatus||1===t.ExplainStatus}),o=i.map(function(t){return t.Id}).sort(),s=JSON.stringify(o)!==JSON.stringify(e.data.lastExplainCardIds);if(i.length){var a,d,l=i[0],u=l.Id!==(null===(a=e.data.card)||void 0===a?void 0:a.Id)||s,c=!!u||!e.data.closedByUser,p=e.data.showFloatCard;e.setData({card:l,showFloatCard:c,closedByUser:!u&&e.data.closedByUser,lastExplainCardIds:o}),p!==c&&(null===(d=e.sdkInstance)||void 0===d||d.emitEvent(e.sdkInstance.EVENTS.card.explainStatusChange,_objectSpread({displayStatus:c},c?l:{})),e.triggerEvent("visibilityChange",{visible:c}))}else{var f,y=e.data.showFloatCard;(y||e.data.lastExplainCardIds.length>0)&&(null===(f=e.sdkInstance)||void 0===f||f.emitEvent(e.sdkInstance.EVENTS.card.explainStatusChange,{displayStatus:!1})),e.setData({card:{},showFloatCard:!1,closedByUser:!1,lastExplainCardIds:[]}),y&&e.triggerEvent("visibilityChange",{visible:!1})}}}})}}},lifetimes:{detached:function(){"function"==typeof this.unsub&&this.unsub(),this.unsub=null}},methods:{handleCardClick:function(){var t,e,r,n=this.data.card||{};1!==Number(n.OutOfStock)&&1!==Number(n.PriceHidden)&&(null===(t=this.sdkInstance)||void 0===t||t.emitEvent(_constant.EVENTS.PUBLIC.floatingCard.click,_objectSpread(_objectSpread({},n||{}),{},{text:null==n?void 0:n.Title,url:null==n?void 0:n.RedirectUrl})),null===(e=this.sdkInstance)||void 0===e||e.reportLogger("mini_sdk_product_card_click",_objectSpread({},n)),(0,_productCardUtils.reportProductMessage)(this.sdkInstance,null==n?void 0:n.Id),null===(r=this.sdkInstance)||void 0===r||r.reportBusiness("view_ad",{AdType:4,AdId:null==n?void 0:n.Id,AdTitle:null==n?void 0:n.Title,AdContent:null==n?void 0:n.RedirectImage,AdLink:null==n?void 0:n.RedirectUrl}),(0,_jump.navigateToConfiguredWebview)(this.sdkInstance,_jump.JUMP_FEATURES.FLOATING_CARD,null==n?void 0:n.RedirectUrl))},hideFloatCard:function(){this.setData({showFloatCard:!1,closedByUser:!0}),this.triggerEvent("visibilityChange",{visible:!1})}}});
@@ -0,0 +1 @@
{"component":true,"usingComponents":{"mp-icon":"weui-miniprogram/icon/icon"}}
@@ -0,0 +1,34 @@
<view wx:if="{{showFloatCard}}" class="floatCard" bind:tap="handleCardClick">
<view
wx:if="{{card._reminderText_ && card.OutOfStock !== 1 && card.PriceHidden !== 1}}"
class="product-reminder-tag product-reminder-tag-float {{card._reminderType_ === 2 ? 'product-reminder-tag-stock' : 'product-reminder-tag-hot'}}"
>
<image wx:if="{{card._reminderType_ === 2}}" class="product-reminder-icon" src="../assets/iconStock.svg" mode="aspectFit"></image>
<image wx:else class="product-reminder-icon product-reminder-icon-hot" src="../assets/iconHot.svg" mode="aspectFit"></image>
<text>{{card._reminderText_}}</text>
</view>
<view class="floatCardBody">
<view class="closeIcon" catchtap="hideFloatCard">
<mp-icon class="icon-mp" icon="close" color="#fff" size="{{16}}"></mp-icon>
</view>
<view class="imgWrapper">
<image class="shoppingCartImage" src="{{card.IntroduceImage}}" mode="aspectFill"></image>
<view class="soldout-mask" wx:if="{{card.OutOfStock === 1}}">已抢光</view>
<view class="explain-status" wx:if="{{card.FloatingStatus === 1 || card.ExplainStatus === 1}}">
<view class="explain-status-dot"></view>
<text>讲解中</text>
</view>
</view>
<view>
<view class="cardTitle ellipsis-2">{{card.Title}}</view>
<view class="highlightarea {{(card.OutOfStock === 1 || card.PriceHidden === 1) ? 'highlightarea-disabled' : ''}}">
<view class="hightlight textEllipsis">
<block wx:if="{{card.PriceHidden === 1}}">待开价¥<text class="char">???</text></block>
<block wx:elif="{{card.OutOfStock === 1}}">去看看</block>
<block wx:else>{{card.Highlight}}</block>
</view>
<image class="goImg {{(card.OutOfStock === 1 || card.PriceHidden === 1) ? 'goImg-disabled' : ''}}" src="../assets/go.svg" />
</view>
</view>
</view>
</view>
@@ -0,0 +1 @@
page{--radius--:8rpx}.floatCard{--radius--:8rpx;--float-card-width:202rpx;--float-card-image-size:198rpx;--float-card-highlight-height:44rpx;box-sizing:border-box;position:relative;display:flex;flex-direction:column;overflow:visible;font-size:calc(24rpx + .5 * (1rem - 16px));width:var(--float-card-width);flex:0 0 auto;transition:all .5s;height:auto}.floatCardBody{position:relative;border-radius:var(--radius--);overflow:hidden;box-shadow:rgba(0,0,0,.12) 4rpx 4rpx 10rpx 1rpx;background-color:#fff;padding:2rpx}.imgWrapper{position:relative;overflow:hidden;border-top-left-radius:var(--radius--);border-top-right-radius:var(--radius--)}.soldout-mask{position:absolute;top:0;left:0;width:100%;height:var(--float-card-image-size);border-top-left-radius:var(--radius--);border-top-right-radius:var(--radius--);background:rgba(0,0,0,.55);color:#fff;display:flex;align-items:center;justify-content:center;font-size:calc(28rpx + .5 * (1rem - 16px));font-weight:500}.explain-status{position:absolute;left:0;top:0;height:calc(36rpx + .5 * (1rem - 16px));padding:0 12rpx;border-top-left-radius:var(--radius--);border-bottom-right-radius:var(--radius--);background:rgba(0,0,0,.55);color:#fff;font-size:calc(20rpx + .5 * (1rem - 16px));line-height:calc(36rpx + .5 * (1rem - 16px));display:flex;align-items:center;justify-content:center;box-sizing:border-box;z-index:2}.explain-status-dot{flex:0 0 auto;width:8rpx;height:8rpx;margin-right:8rpx;border-radius:50%;background:#fff}.product-reminder-tag{display:flex;align-items:center;box-sizing:border-box;padding:8rpx 12rpx;border-radius:999rpx;background:linear-gradient(90deg,rgba(254,180,0,.96) 0,rgba(254,180,0,.82) 70%,rgba(254,180,0,0) 100%);color:#fff;font-size:calc(24rpx + .5 * (1rem - 16px));line-height:calc(32rpx + .5 * (1rem - 16px));font-weight:600;font-style:italic;white-space:nowrap;text-shadow:1rpx 1rpx 2rpx rgba(0,0,0,.25)}.product-reminder-tag text{flex:0 0 auto}.product-reminder-tag-float{align-self:flex-end;max-width:none;margin-bottom:16rpx;padding-left:16rpx;padding-right:28rpx}.product-reminder-tag-stock{background:linear-gradient(90deg,rgba(255,76,19,.96) 0,rgba(255,76,19,.82) 70%,rgba(255,76,19,0) 100%)}.product-reminder-icon{flex:0 0 auto;width:24rpx;height:24rpx;margin-right:6rpx}.product-reminder-icon-hot{width:18rpx}.shoppingCartImage{display:block;height:var(--float-card-image-size);width:100%;border-top-left-radius:var(--radius--);border-top-right-radius:var(--radius--)}.cardTitle{box-sizing:border-box;font-size:calc(22rpx + .5 * (1rem - 16px));line-height:calc(26rpx + .5 * (1rem - 16px));min-height:calc(52rpx + .5 * (1rem - 16px));margin:7rpx 11rpx;word-break:break-all}.highlightarea{display:flex;align-items:center;justify-content:space-between;background:#fe2c55;border-radius:4rpx;color:#fff;font-weight:500;line-height:var(--float-card-highlight-height);min-height:var(--float-card-highlight-height);margin:6rpx 8rpx 8rpx;padding:0 0 0 4rpx;box-sizing:border-box;overflow:hidden}.highlightarea-disabled{background:#c9cdd4;color:#fff}.ellipsis-2{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden}.textEllipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hightlight{flex:1 1;min-width:0;font-size:calc(25rpx + .5 * (1rem - 16px))}.goImg{flex:0 0 auto;height:var(--float-card-highlight-height);width:61rpx}.goImg-disabled{opacity:.5;filter:grayscale(100%)}.char{font-weight:600;letter-spacing:2rpx}.closeIcon{position:absolute;top:0;right:0;background-color:rgba(0,0,0,.4);border-top-right-radius:var(--radius--);border-bottom-left-radius:var(--radius--);z-index:100}.icon-mp{display:flex;align-items:center;justify-content:center}