个人案例
- 卓正医疗医生端
wepy编写的客户端
卓正医疗医生端扫码体验
- 卓正医疗丨约门诊问医生健康科普
wepy迁移uni实现客户端
卓正医疗扫码体验
- 小程序应该要原生支持SSE了吧?2024年了AI需求越来越多
是否原生增加新api支持SSE,现在用chunked痛点是,返回的json是分段的,要自己拼接。还有可能是两个json只有一半。渲染出来就好像卡了一样一下三个字以下8个字,而且内容长了还会断
2024-10-28 - android 偶现部分元素不渲染,如何定位?
问题视频:https://dstatic.distinctclinic.com/normal%20video.mp4 微信号:lin_xiao11(微信日志已上传) 布局如下代码,再不分安卓设备上底部class:bottomButton的按钮不渲染,重新进入就渲染了。不知道是那里渲染有问题,是什么style冲突了吗? <template> <block> <view> <!--医生基本信息--> <view class="doctorInfoBlock"> <image :src="imagesCfg.doctor_detail_top" class="topBackground" /> <view class="doctorCard weui-flex-col" style="margin-top: 70px"> <view class="baseInfo weui-flex"> <image :src=" baseInfo.doctor.imageUrl ? baseInfo.doctor.imageUrl : imagesCfg.distinct_doctor_common " class="doctorImg" /> <view class="weui-flex-col rightView"> <text class="doctorName">{{ baseInfo.doctor.name }}</text> </view> </view> <view class="weui-flex briefIntroduction subScription"> <text style="margin-left: 20rpx"> 我为您的本次就诊提供了免费随访服务,如您希望与我沟通您的健康情况,可向我发起随访咨询 </text> </view> </view> </view> <!--医生提醒信息--> <view v-if=" baseInfo.doctorReminder && baseInfo.doctorReminder.content.length > 0 " class="doctorReminderBlock" > <view class="weui-flex reminderTopContainer"> <view class="weui-flex weui-flex-center"> <image :src="imagesCfg.icon_tips" class="icon-tips" /> <text class="zz-text__first_title">医生提醒</text> </view> <text class="time">{{ baseInfo.doctorReminder.datetime }}</text> </view> <text class="reminderTips">{{ baseInfo.doctorReminder.content }}</text> </view> <!--就诊信息--> <view class="blockInfoBox"> <view class="itemTitle zz-text__first_title"> <view class="vline" /> 就诊信息 </view> <view class="itemInfo"> <text class="zz-secondary__description">就诊时间</text> <text class="zz-main__text paddingItem orangeText"> {{ baseInfo.appointment.appointmentDate }} </text> </view> <view class="itemInfo" style="padding-bottom: 30rpx"> <text class="zz-secondary__description">门诊诊所</text> <text class="zz-main__text paddingItem"> {{ baseInfo.appointment.storeName }} </text> </view> <view class="seperateLine" /> </view> <!--随访信息--> <view class="blockInfoBox"> <view class="itemTitle zz-text__first_title"> <view class="vline" /> 随访信息 </view> <view class="itemInfo"> <text class="zz-secondary__description" style="min-width: 104rpx; text-align: right" > 随访人 </text> <text class="zz-main__text paddingItem"> {{ baseInfo.patient.name }} </text> </view> <view class="itemInfo"> <text class="zz-secondary__description" style="min-width: 104rpx; text-align: right" > 档案号 </text> <text class="zz-main__text paddingItem"> {{ baseInfo.patient.patientNo }} </text> </view> <view class="itemInfo" style="padding-bottom: 30rpx"> <text class="zz-secondary__description">随访时间</text> <text class="zz-main__text paddingItem"> 剩余{{ consultTools.timeDifference( baseInfo.followUp.remainingTimestamp || 0, ) }} </text> </view> <view class="seperateLine" :style="{ height: followUpStatus === 'pending_get' ? '10px' : '0rpx', }" /> </view> <!--转发--> <view v-if="followUpStatus === 'pending_get'" class="blockInfoBox"> <view class="weui-flex transferBlock weui-flex-between"> <view class="weui-flex" style="align-items: center"> <image class="transferImg" :src="imagesCfg.icon_transfer" /> <text>可转发页面链接给家人,由家人领取并发起随访咨询</text> </view> <button class="transferButton" open-type="share">转发</button> </view> </view> <!-- 介绍文章 --> <image :src="imagesCfg.follow_up_mini_banner" class="bottomBannerImg" @tap="lookDetailAction" /> <!--底部按钮--> <view class="bottomStatusView"> <view class="statusTips" :style="{ backgroundColor: tipColor.background, color: tipColor.color, }" v-if="showTip" > {{ statusTipsText }} </view> <view class="bottomButton" :style="{ 'padding-bottom': isIpx ? '45rpx' : '15rpx' }" @tap.stop="followUpHandler" > <view class="zz-fixed-bottom-button_full" style="width: auto" :class="{ disabledButton: btnDisabled, }" > {{ buttonText }} </view> </view> </view> </view> <birthday-verify-popup :isShowPop.sync="isShowPop" :showDate.sync="showDate" :selectDate.sync="selectDate" :patient.sync="baseInfo.patient" @cancel="cancelVerifyPop" @confirmClick="confirmClick" /> </block> </template> <script module="consultTools" lang="wxs" src="@/wxs/consultTools.wxs"></script> <script module="followupTools" lang="wxs" src="@/wxs/followupTools.wxs" ></script> <script> import config from '@/config'; import imagesConfig from '@/config/ImagesConfig.js'; import common from '@/vendor/common'; import moment from 'moment'; export default { data() { return { opt: {}, imagesCfg: { doctor_detail_top: imagesConfig.doctor_detail_top, icon_tips: imagesConfig.icon_tips, icon_transfer: imagesConfig.icon_transfer, follow_up_mini_banner: imagesConfig.follow_up_mini_banner, distinct_doctor_common: imagesConfig.distinct_doctor_common, }, isIpx: false, followUpStatus: 'pending_get', baseInfo: {}, // 随访相关信息 // 生日校验弹框 isShowPop: false, showDate: '', selectDate: '', validateBirthday: null, aboutUrl: '', doctorInitiativeFlag: false, receivedDatetime: null, relationshipPopup: { visible: false, value: '', }, }; }, computed: { locale() { return this.$i18n.locale; }, relationshipList() { const list = []; return list; }, showTip() { return this.doctorInitiativeFlag; }, tipColor() { let background = '#FFDDDA'; let color = '#BC4B4A'; return { background, color, }; }, btnDisabled() { return true; }, buttonText() { return '立即领取'; }, statusTipsText() { return '请领取随访后,查看医生回复'; }, }, async onLoad(options) { this.opt = options; if (this.locale != 'zh-CN') { uni.showModal({ title: 'tips', content: 'This feature is only available in the Chinese version', showCancel: false, confirmText: 'Switch', confirmColor: '#006d82', success: (res) => { if (res.confirm) { // uni.navigateTo({ url: '/otherBusiness/settingLanguage' }); common.switchLanguage({ lang: 'zh-CN' }); } }, }); } this.isIpx = config.isIpx; // 初始化弹窗日期 this.showDate = moment().format( this.$t('consultation.get_follow_up_code.date_format'), ); this.selectDate = moment().format('YYYY-MM-DD'); }, onShow() { this.getFollowUpInfoByIdOrQrcode(); }, onShareAppMessage() { return { title: this.baseInfo.doctor.name + ' 诊后随访', success: (res) => { console.log('转发成功', res); }, fail: (res) => { console.log('转发失败', res); }, }; }, methods: { getFollowUpLandingPageStatus(status, validation) { return 'pending_get'; }, // 根据followUpId来获取随访信息 async getFollowUpInfoByIdOrQrcode() { // 通过随访id获取信息 this.baseInfo = { doctor: { name: 11 }, followUp: {}, patient: {}, appointment: {}, doctorReminder: {}, }; this.baseInfo.appointment.appointmentDate = moment( this.baseInfo.appointment?.appointmentTimestamp, ) .utc() .add(8, 'h') .format('MM月DD日 HH:mm'); this.followUpStatus = this.getFollowUpLandingPageStatus( this.baseInfo?.followUp?.status, this.baseInfo?.validation, ); this.doctorInitiativeFlag = true; this.receivedDatetime = ''; }, onCancelRelationship() { this.relationshipPopup.visible = false; }, // 领取随访 async receiveFollowUpService() {}, handleErrStatus(msg) { uni.showToast({ title: msg, icon: 'none', }); }, // 根据随访状态处理业务类型 followUpHandler() {}, cancelVerifyPop() { this.isShowPop = false; }, confirmClick(birthday) {}, lookDetailAction() { uni.navigateTo({ url: '/pages/webView?type=article&link=' + encodeURIComponent(this.aboutUrl), }); }, }, }; </script> <style lang="less"> page { background-color: #fff; } .subScription { font-size: 24rpx; color: #849ca0; } .seperateLine { height: 10px; background-color: #f5f7f7; } .blockInfoBox { display: flex; flex-direction: column; background-color: #fff; .itemTitle { display: flex; align-items: center; font-size: 36rpx; color: #0a434d; padding: 30rpx; .vline { width: 6rpx; height: 30rpx; border-radius: 4rpx; background-color: #006f83; margin-right: 20rpx; } } .itemInfo { padding: 0rpx 0rpx 20rpx 60rpx; display: flex; align-items: center; .paddingItem { margin-left: 40rpx; } .orangeText { font-size: 30rpx; color: #ffaf27; } } .itemAlignRight { justify-content: space-between; padding-right: 30rpx; } } .transferBlock { display: flex; flex-direction: row; background-color: #fff; padding: 30rpx; font-size: 22rpx; color: #0a434d; .transferImg { width: 40rpx; height: 40rpx; margin-right: 10rpx; } .transferButton { background-color: #006f83; border-radius: 8rpx; color: #fff; font-size: 24rpx; margin-right: 0rpx; } } .doctorInfoBlock { // background: #fff; .topBackground { position: absolute; width: 100%; top: 0; left: 0; right: 0; height: 340rpx; z-index: -1; } .doctorCard { background: #fff; margin: 174rpx 30rpx 30rpx 30rpx; border-radius: 30rpx 30rpx 8rpx 8rpx; border: 1px solid rgba(0, 111, 131, 0.1); box-shadow: 0 6rpx 26rpx rgba(53, 109, 119, 0.1); .baseInfo { .doctorImg { border-radius: 100%; width: 160rpx; height: 160rpx; margin-top: -86rpx; margin-left: 64rpx; } .rightView { padding: 24rpx 38rpx 20rpx 22rpx; flex: 1; .doctorName { font-size: 36rpx; color: #0a434d; } } } .briefIntroduction { padding: 20rpx 30rpx 30rpx 30rpx; } } } .doctorReminderBlock { background: #fff; margin: 30rpx; padding: 30rpx; border-radius: 8rpx; border: 1px solid rgba(0, 111, 131, 0.1); box-shadow: 0 6rpx 26rpx rgba(53, 109, 119, 0.1); .reminderTopContainer { justify-content: space-between; align-items: center; padding-bottom: 20rpx; } .icon-tips { width: 26rpx; height: 26rpx; margin-right: 20rpx; } .time { font-size: 22rpx; color: #aab5b6; } .reminderTips { font-size: 30rpx; color: #849ca0; } } .bottomStatusView { background: #fff; position: fixed; bottom: 0; left: 0; right: 0; } .bottomButton { padding: 15rpx 0rpx; align-items: center; } .disabledButton { background-color: #d5d5d5; border-color: transparent; } .statusTips { display: flex; align-items: flex-start; padding: 15rpx 30rpx; background-color: #ffddda; // #fff7e9; font-size: 22rpx; color: #bc4b4a; // #ffaf27; } .bottomBannerImg { width: 100%; height: 172rpx; margin-bottom: 300rpx; } .popup-block { .select-item { position: relative; padding: 30rpx 30rpx 30rpx 60rpx; } .cancel-btn { flex: 1; align-items: center; justify-content: center; border: 1px solid #006f83; border-radius: 8rpx; height: 80rpx; color: #006f83; font-size: 30rpx; text-align: center; line-height: 80rpx; } } .zz-fixed-bottom-button_full { width: 100%; margin-left: 30rpx; margin-right: 30rpx; display: flex; align-items: center; justify-content: center; border: 1px solid #006f83; border-radius: 8rpx; height: 80rpx; color: #fff; background-color: #006f83; font-size: 30rpx; } </style> 设备信息 [图片]
2024-10-18 - 同屏幕大小、同基础库、同小程序、同微信、系统字体大小设置,但是界面呈现整体偏小
同屏幕大小、同基础库、同小程序、同版本微信、同样系统和微信字体大小设置,但是界面呈现整体偏小。这是啥原因呢。 大众点评的小程序也是这样,同样屏幕大小,分辨率的情况下,有什么设置会影响渲染大小? iphone15 ios17.&17.6(升级了也一样) 字体正常 [图片][图片][图片] [图片][图片] 同样字号但是占位可以看出大小不一致(占宽度73.516) iphone15 pro ios 18.0.1 字体偏小 [图片][图片][图片] [图片] [图片] 同样字号但是占位可以看出大小不一致(占宽度69.094)
2024-10-16 - 小程序修改介绍失败?
您好,我们提交了小程序介绍修改,只是相比于原来增加了服务。但是一直提示冒充,我们就是官方呢,要如何处理? 提示:不能含有虚假的、冒充、利用他人名义的、容易构成混淆、误认的、法律、法规和政策禁止的内容 AppID(小程序ID):wx255d1cc18d96aadf 原介绍:卓正医疗官方小程序。为客户提供在线预约、线上问诊、家庭健康档案、专业科普及课程等便捷丰富的线上服务。 修改的介绍:卓正医疗官方小程序。为客户提供门诊预约、线上问诊、视频心理咨询、家庭档案管理、健康测评量表、退热药剂量查询、抑郁焦虑自测、自闭症多动症测评、专业科普及课程等丰富的线上服务。 我们是命中哪一条规则,麻烦沟通联系
2024-07-29 - wx.setVisualEffectOnCapture 设置截屏/录屏时屏幕表现,iOS设备不生效
测试了基础库3.3.0到3.3.4都测试了,微信8.0.45和8.0.46都测试了,截图功能都是正常可以截图的,看文档是说基础库3.3.0+ ios16就支持。目前测试的手机是ios17.2和ios17.0.03都能复现 https://developers.weixin.qq.com/miniprogram/dev/api/device/screen/wx.setVisualEffectOnCapture.html 也有别的用户反馈:https://developers.weixin.qq.com/community/develop/doc/00006400c58e285332f09632a61400?highLine=setVisualEffectOnCapture onLoad() { this.setDisableCapture(); // 录屏、截屏时黑屏 }, onShow() { this.setDisableCapture(); }, onHide() { this.closeDisableCapture(); }, onUnload() { this.closeDisableCapture(); }, methods: { setDisableCapture() { wx.setVisualEffectOnCapture({ visualEffect: 'hidden', }); }, closeDisableCapture() { wx.setVisualEffectOnCapture({ visualEffect: 'none', }); }, }
2024-02-05 - 小程序白屏,vconsole打不开
https://app-release.distinctclinic.com/SVID_20240110_134910_1.mp4 如图,用户进入小程序白屏,且无法打开vconsole,监听了wx.onERROR打印到wxlog。wxlog也没有error的日志 怀疑是框架、环境加载出了问题。该用户个两天就会出现一次。白屏用户已经上传日志,微信号可发私信. openid:oTNa94v_CkRvgNmO6Tx4Opo6DpkQ appid:wx7a8f0af0c6dde125 [图片]
2024-01-12 - 小程序白屏,是加载分包出现问题还是渲染进程出现问题?这个如何定位。怎么查问题?
收到客户反馈,上一秒还在浏览小程序的其他页面。退出后再从模板消息进入另外一个页面出现白屏,重新进了好几次都是。重启微信几次才正常打开。(也有部分客户反馈点开模板消息就是空白) 已排查请求异常:查看服务端ng日志,请求返回都是0.3秒-0.6秒,小程序后台日志都是请求正常返回了。 已排查非页面无数据渲染:当页面无数据返回,请求异常时至少顶部tab会进行渲染,不至于白屏。 已排查非请求和数据返回的渲染问题,待排查: 测试手机及本机,没有复现。遇到这种白屏问题,是wxs问题,还是分包加载问题,还是渲染问题?问题如何定位? 关键信息: 用户设备:HUAWEI OCE-AN10 网络类型:WIFI openid:oTNa94ue-qdZ7Kqgr_AShgd78mzQ 小程序appid:wx7a8f0af0c6dde125 用户前一秒在使用的是主包页面,然后退出,点击模板消息进入分包页面,该分包页面中有应用主包中的wxs的方法,这个会有影响吗? [图片] 如下,无数据应该会有基础tab在,用户操作路径如下 [图片][图片]
2023-12-12 - recordMange.start,stop偶发报错 fail recorder not start
代码如下,当recordManger.onStart的时候recordClicked = true 记录开始录音。 当用户点击停止的时候触发recordManger.stop()停止录音,我们在onStop的时候,把标志recordClicked = false,记录完成录音,提示发送按钮。 但是目前有部分用户反馈,开始录音后无法停止,查看日志,发现日志反馈onError:{"errMsg":"operateRecorder:fail recorder not start"}。 我们是在onstart之后才开放停止按钮的,而且用户录音都是10秒以上的不存在1秒以内时间太多的情况。这个应该不存在异步还没开始的问题呢。 设备型号 iPhone 12 Pro<iPhone13,3> const recordManger = wx.getRecorderManager(); this.remainingTime = RECORD_DURATION; recordManger.onStop((res) => { this.recordClicked = false; this.recordPaused = false; this.tempRecordFilePath = res.tempFilePath; this.audioDuration = Math.round(res.duration); this.recordFileSize = res.fileSize; InnerAudioContext2.src = res.tempFilePath; this.recordDuration = parseInt(RECORD_DURATION - this.remainingTime); this.remindPlayTime = this.recordDuration; this.remainingTime = RECORD_DURATION; clearInterval(this.interver); }); recordManger.onStart(() => { this.recordFileSize = 0; this.recordClicked = true; clearInterval(this.interver); // this.remainingTime = RECORD_DURATION this.interver = setInterval(() => { !this.recordPaused && this.remainingTime--; if (this.remainingTime === 0) { clearInterval(this.interver); recordManger.stop(); this.recordClicked = false; this.recordPaused = false; } }, 1000); }); // 错误回调 recordManger.onError((res) => { onlineConsultationHook.emit( 'recorderErrMsg', this.consultItem, JSON.stringify(res) ); }); // 开始录音 startRecordVoice() { checkRecordPermission( () => { this.initPlugin(); recordManger && recordManger.start({ format: 'mp3', duration: RECORD_DURATION * 1000 }); }, () => {} ); }, // 暂停录音 pauseRecordVoice() { this.recordPaused = true; recordManger && recordManger.pause(); }, // 继续录音 resumeRecordVoice() { this.recordPaused = false; recordManger && recordManger.resume(); }, // 停止录音 stopRecordVoice() { recordManger && recordManger.stop(); },
2023-12-11 - 小程序白屏,是加载分包出现问题还是渲染进程出现问题?这个如何定位。we分析中有白屏统计,怎么查问题
[图片] 收到客户反馈,上一秒还在浏览小程序的其他页面。退出后再从模板消息进入另外一个页面出现白屏,重新进了好几次都是。重启微信几次才正常打开。(也有部分客户反馈点开模板消息就是空白,也没有分包加载的加载圈圈) 已排查请求异常:查看服务端ng日志,请求返回都是0.3秒-0.6秒,小程序后台日志都是请求正常返回了。 已排查非页面无数据渲染:当页面无数据返回,请求异常时至少顶部tab会进行渲染,不至于白屏。 [图片] 用户前一秒在使用的是主包页面,然后退出,点击模板消息进入分包页面,该分包页面中有应用wxs的方法。 用户操作行为: [图片] 关键信息: 用户设备:HUAWEI OCE-AN10 网络类型:WIFI openid:oTNa94ue-qdZ7Kqgr_AShgd78mzQ 小程序appid:wx7a8f0af0c6dde125 1、测试手机及本机,没有复现。遇到这种白屏问题,是wxs问题,还是分包加载问题,还是渲染问题?问题如何定位? 2、we分析中查看到查看到有白屏统计,这部分用户支持查找定位问题吗?如何定位白屏问题~ [图片]
2023-12-07 - text的selectable选中交互,与微信、钉钉App常规交互不一致,交互应该统一
更新到了最新版,发现问题1已修复,但是选中的蓝色框层级应该是去到最高了,可以保持可text的层级一致吗? [图片] ------------------------------------------------ 问题1、text的selectable选中交互和别的apps有点不一样,微信聊天、微信公众号、钉钉光标左滑出文本区域不会全选,还是保持单行。 目前小程序的光标选中时,光标如果左移动至文本外的区域,将全选文本。与其他APPs的交互不一致。 复现),支持文本复制的(text的selectable为true)选中多行文本中的一行,然后做光标左滑动至文本区域以外,就会自动选中全部文本 [图片]
2023-10-10