From 69acd7a4bbb4130887480125df1847c2629bd474 Mon Sep 17 00:00:00 2001 From: lq Date: Wed, 24 Dec 2025 16:05:41 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=82=A3=E8=80=85?= =?UTF-8?q?=E5=B0=B1=E8=AF=8A=E5=8E=86=E5=8F=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- manifest.json | 1 + request/api/request.js | 4 +- static/chat/send.png | Bin 0 -> 6404 bytes static/chat/send2.png | Bin 0 -> 5236 bytes subPackages/chat/chat.vue | 137 +++++++++++++++++++------ subPackages/doctor/doctor-userinfo.vue | 70 ++++++++----- subPackages/my/mycollection.vue | 22 +++- subPackages/product/symptoms.vue | 51 +++++++-- utils/ws/websocket.js | 3 +- 9 files changed, 217 insertions(+), 71 deletions(-) create mode 100644 static/chat/send.png create mode 100644 static/chat/send2.png diff --git a/manifest.json b/manifest.json index 38b8f1e..f97c660 100644 --- a/manifest.json +++ b/manifest.json @@ -66,6 +66,7 @@ /* 小程序特有相关 */ "mp-weixin" : { "appid" : "wx1eb90a487ca945d2", + "__usePrivacyCheck__" : true, "setting" : { "urlCheck" : false, "es6" : true, diff --git a/request/api/request.js b/request/api/request.js index 76a3bea..498876e 100644 --- a/request/api/request.js +++ b/request/api/request.js @@ -26,7 +26,9 @@ function request(url, params, method = 0) { // let baseURL = "http://127.0.0.1:18000/member" if (url.split('/').indexOf('imApi') !== -1) { // baseURL = "http://127.0.0.1:12080/api" - baseURL = isDev === true? 'http://127.0.0.1:12080/api': "http://im.xiaokang88.com/api" + // baseURL = isDev === true? 'http://127.0.0.1:12080/api': "http://im.xiaokang88.com/api" + // baseURL = isDev === true? 'http://127.0.0.1:12080/api': "https://api.ws.g.xiaokang88.com/api" + baseURL = "https://api.ws.g.xiaokang88.com/api" } if (url.split('/').indexOf('newApi') !== -1) { baseURL = isDev === true? 'http://127.0.0.1:18018/member': "https://shop.xiaokang88.com/member" diff --git a/static/chat/send.png b/static/chat/send.png new file mode 100644 index 0000000000000000000000000000000000000000..d229a194c0a9d976e0a34ba147fd87c3845a792f GIT binary patch literal 6404 zcmXw8cQ_nh)ZSf-)pzx75fag&6U36$B5H^rO4R5i$`T2yMDM+A{PYr?=)Feo60BaM zM_38s+kDUW{V_B5x#xY(nS0KenfJaEuA`+&LCQ=D001b|)sTAl>)^iwLWDn;zo@_f z08oHBQc)iTJjfiSZT1OhRPI{(YU7GnU`+0sH|0;AvnXj(!5#QKT&8zl%J46*qP4t9V-(K7+u zMZp0O_ z5_iDed~tD|bYeZ)c<^7xd+aDR1bChECEvqqFcQAj@o^m;iXX6dC+Gfy=y_7u7((=^ zp=kZ7IA=~BW&9K&(kleP1B9vZP<*Ec8Q{?d2Jxk={o62K<%!k2YvDqhq$~aI zQwYFq;O4b}t+AnIMh-fND~`xQUGJD=WbELfIOc0Mz0{eJ3y(_klQ>lnP1qxFn6PUv z2z=S-vfch&4fCUpE6#!Iza^@M$!e#+hs`p6@tEo(zO^GelG6cjT~b@dKy_chr$`%> zM^jFmTyeHv)!Pg4zBg&AqmtK!CMd2cZUv~ZggK@F$bf|D>++~wzb|up#yd!O{qCTQ zA!Ovwae3(8_a!BE)z5QcP0l=b$Y7$76Gea=t(;jSrlEJ_T4q$A8)W}6V>3MkAs}{5 ziLDb_M^&CF&5I#WY_Z%#0QaN1ba}NLU|UJLr80a}CsEE{+2Y~{jJrLfMU!d&u0RAf zY#}>q7Zh{bDFRvZ9A)Ih`!l|~mELW5L%Q!KZ}t9#)LX}OBYyKYS*$Wk&PvkBwX9huaHH!+MxF=c7=lSs{T*y2-oazn@n$=?R)TCO1TXnarX)&q3 zy)U8QKVcSG5_1?!oc~ z)*8`2^aIL$G@)M_`CGF(%d>J>1fRBy<-u!XJV_9$6E1)$Pps%s|F-0sBz7qr77 zv>byO{({>rtPk60@Dx)xK+HeqYEDoPUvkcU@$K5af4PV9h#D8)L>rNK~U^aeO2HM}&(A$2xvdF47qCtl3gcxF$@Jg!7_J3|AeN9sT^T z+-IEHexnz^Po0il$|rW1NxjYU`%m&`=bvG@7*r_LtZF`~L&>=gG_A#0-AM|~Ju+Y= z@Nv2+F*(BR+Q8{XP32T7v z0M@UeEp&|2WE)d~;BCtpD>b=9*$9(R?S0#$0r%;JEvOTM3*+3qvHw-ro|(&yCCjmO zLMKL@T7$un`ko8hL%%~x`4qNCLCV#}QstV#jp-(#!@v`9%%@KjH7L~pHEh)8<0Z{8C)~BC3j}H~C5?N*=5X||gZxbofRG-IJ>AS5JCzU4pB~J4*D?x4q|be1T8PS)t1=rGL?+Y3uT|2pKTfjZ?#wH0ox2!xAMDKv^t@)j2 z#l&Bb*>v7)FE8SrNcoBfiUEVg6jNfjR_iXubrZWtlM!a;Y)6vmbGd2hErEomfR$Jj z7$yop5dm6L@`7V{0<@|XCVd3MeDAy*-yWN2 zaJ>n9VhdT~A|lKN-~?1i3EnpNzA6$HRFgaVrd$2g1&*n2ue3XhEyGE|Rt>-ZhdX^A zo_cB=2z`wKbZd^rhTV~g{{Xnc7*B~svxB7CT zqxfkx!`o>la%i2<@X4HG{d^_P2a15Vc_qJlXfoMv>`Msunx-D24y z1h%T;b$rgsP4lfNx{8|Z1ZA%dw;GO$24B*|Iw!5O@C01af~*zuaIm#_u-lV7W$>f6 zNa4`3Ek_NIE+LH!!>MmnUa%yMh3*n%#+N0&L-{ez!_d{$Q9pr6+giC2Gj7)+?_re& zfw*dqm7tet)FhR6>d>7oh)YRedqwVe@Ab&? z0*;vG`%s%I`PY8LgSxIvr+%bbvkY5m07K46CE4#+xW2m6`pKErH3$EV$J}>iOild( zIWn_5Turf6Fu#{C8NzC?S~zn}wW6OFwX8hiDi$;#%(&p`WM5Kse%w(DJJi00YyJB* z+&;$j=Jc!6$rWRw4pwcYbhfp$B<UlxcEb-T?B2seCytx2iI|tH-;1`Bl^%{$^8DIY`6j> zw)lOxoH5{%1o-|SPM%n}YPx@@y5NkxG*m;|>xwm-cmtAy$^95(0-2>^`u*d}4oG)7 zilTk(lqr{gU9RuTA1nAs|LOV7N%)!B?T+uO-j5$wDkr7K^(V7@ z&yWwYE3y22;|%EH2rnU@*-r;a?ySWtTROxK?=D9Lf10qpVC=KD?AxvR-QhUnDW7>O z;IJ^xGRjc?>sMB`*5yNl;k6%4Sm{$`SuBoy;nt&MA=+W{yX-ZutT(GaU)D>tyX{iG zb54)?Rhh~C&RhlkOI|Kmd>Q0X?W7QtnYFfEAkJuf+|QdVmG1R%DBw-=^~ z5=HJUw=A7-x@;@#BJBA+hO$qabJlv2$FpXW`wEcGbYVZcw0Ki$)n?xL&blzJKcrae zwVXm}h$LUmjagf!ny3tnt_jmjP`D&Bq`!eKi2l{NUJ!!XfFn0S>|sKNi|8n%N%DI+ zUNM7xNSy{~&wnx6K^ym^$ut(B|8Sgp+@*ZoWq3fovbdVGLSJ6gRqj66A`SOa^WD^qo2`&g@(*?=-HXx_x}wFOBMA_@D$Hm=a#)nM_1 z%AHFlnK5E~?X5X&uI=1&a5%HMO1qy$+#d3Gg4~OnPEg}#sXeoza5s={e~i%KjcJK~ z264c6P!U=5PvT$e)H<%5&RKe_2e>VT*_q4};GQa`nLfUIK>qqL))z{s2Om1Y4sW}L zy8B9aD`1{qRj8adl67&(&Pru&{BC*ne(|MXhsrBo$qvd*%}WUgn{?m&U!X$eC_016 zson@qOrGvE{AeEau|>8L5IAsGc4f6%0l4mOk2O}HYFx1@ir!})S<(Ax_~AHKIJFC9 z1@W0GEZ?BAan2#kCD)Hv7bi7G|v1uMLiF=8>f=FVEZHcABa?gG9 zmRt;znY!AFv*FEJ1;hT8=&x^Ibx4rat0~s7m07dAFH}f<4yE(gzcVAh_A*Pu2B@+e z$5Y7rO*XW`Fj#+w-kJ##q|89jK>_&*HA4Cr|9ar)#ujTY%*Lja1v`g@R$}vqEm}QK zz!}H4^3v(E|IvoM2{wtKTgrGjH`q~L>SxyfLh|IX5Xa-TV4ZO!w`&0Ws08|qc)nK5653$k-#0CKP_Wj zN$PMMg+nUAK5FkxWB>q2`9Cc{Fv#7zk{u*xdU67sR4GrU&)2mC zWbwI%r5z>ze2OQH;*9Sq>a^S_GkmE07r$DxDtb-x+|5}m)Y#bZfvE-6ZOAdsH(LbZ zivu>ad-JB5K%~t?(h#i2t2FY!b zyH`~!xP}JpooI+PsggTWl(u4jUeBZ3I^#C8Fa$4W!LWrN_5EdbE-nnyuP-sSPZ-ep zc#4OjgLZh~JP93q8xFoeHkGO6zYD(2m1p#yoP<|Ej|7Eq7ZMty&4Qp;Z)k$tGpZGd zHpufR&=8PR8=0^W7nF$8yPrvkCFo-T;u^PV4MD;ab>po*P@`(%vN($I&6SOhgI5<; zNZcAEtFZipkMY@4bBacgHHGVdr$7o{nLR;bi?~IO^BjE2*`Flz^Mkw>?O3!?28}FR z5s0Ondp6?A0mm5P=63~I)aZMp)Qd_v8f5*$YYsBPpb}-(F&}jcRr!wd-2&iwk|3xg zG$G$T8!=%v_8=KA5|j)Mx@(hIAUIqry^O(nn#hayoB^v#n;Oc3&$&SMupDdGKtMNJ zi1jT;#^ByNdRW-;V1W{(f4arf6arH-O}i7H31$uGe3bR#un3Z$5q9uSbM>@3$-QMh zxzV5<(kqytro2L$K4M!9Qz|)AzuT*-HWx4E+F1@)zosIzY9ESjRDU*vw12 z(!=+Nqi44W(wkbQVn?6QZ;)(2H{IqfgN!6u`#ZFuyR>EGB4_~MIZG@(FkKCU!Bl6 zEqPwFW_L-wbs$rQKdZH0B?o{o=1-Z;2~z1XzaM^zYhTrKcjhB{eEG{o;vP&*BHs3b zMCg7#b%p;1L*n}tc%X+EFCiz@_^Wy~ecL}JF=Y?F`4a@@9VH*Umh+Z<6O23Z;St1(c+r0vgd3iPkI#Q< z4N0OiGKy<()2In+F)_JMN$f^*EB82v0x16Z6<&U$;M!0;i<1|jShP?{O<*9p`b#B# z{eS_-5~E1L;>}Cb66o-f+bbNwoD+g5^O?*J|dm z^7qtx)g0#~69=|C7yX%;ISX;FP2AOfH=qax!Aw-1^+z+WDuCASAL(HSPtBW5>ZPMx zYOv~7YDU+i0|26GHdA#C92R42toHLPEzJ znoYc8&Vo;_;~nj9QxS-6uRgiDhPWT&aG6iV4G~HUmwIjXJsDbH>N)8;&o9}U#W%!^Qnlc#JvWvo@vDa8Cnf5wJMRw!8n{tqb<>XHBe literal 0 HcmV?d00001 diff --git a/static/chat/send2.png b/static/chat/send2.png new file mode 100644 index 0000000000000000000000000000000000000000..be31d832e4b325bc542fbfcf57ac01396734307a GIT binary patch literal 5236 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 Z1gK*Ld=bIS=F?UHS{i!lm8y0T{{y0DbY1`e literal 0 HcmV?d00001 diff --git a/subPackages/chat/chat.vue b/subPackages/chat/chat.vue index 278b4bc..7c0e712 100644 --- a/subPackages/chat/chat.vue +++ b/subPackages/chat/chat.vue @@ -442,25 +442,25 @@ 相册 - - - - 拍摄 - - - - - 视频 - + + + + + + + + + + - - - + + + @@ -489,11 +489,13 @@ - - - - - + + + + + + + @@ -716,6 +718,32 @@ export default { }, methods: { + /** + * 检查隐私授权 + * 微信小程序从2023年9月起要求在使用敏感API前获取用户隐私授权 + */ + checkPrivacyAuthorize() { + return new Promise((resolve, reject) => { + // #ifdef MP-WEIXIN + if (typeof uni.requirePrivacyAuthorize === 'function') { + uni.requirePrivacyAuthorize({ + success: () => resolve(), + fail: () => { + uni.showToast({ title: '需要同意隐私协议才能使用此功能', icon: 'none' }); + reject(new Error('隐私授权被拒绝')); + } + }); + } else { + // 低版本基础库不需要隐私授权 + resolve(); + } + // #endif + // #ifndef MP-WEIXIN + resolve(); + // #endif + }); + }, + /** * 计算并设置 scroll-view 的明确高度 * 根据 uni-app 文档,scroll-view 需要明确的高度才能正常滚动 @@ -1152,9 +1180,16 @@ export default { this.newMessage = ''; }, - startVoiceRecording() { + async startVoiceRecording() { if (this.recording) return; + // 先检查隐私授权 + try { + await this.checkPrivacyAuthorize(); + } catch (e) { + return; // 用户拒绝隐私授权 + } + // 检查录音权限 uni.getSetting({ success: (res) => { @@ -1214,8 +1249,16 @@ export default { return this.currentPlayingAudio === msg.id; }, - openMediaPicker(type) { + async openMediaPicker(type) { this.showMoreActions = false; + + // 先检查隐私授权 + try { + await this.checkPrivacyAuthorize(); + } catch (e) { + return; // 用户拒绝隐私授权 + } + if (type === 'image') { uni.chooseImage({ count: 9, @@ -1277,7 +1320,14 @@ export default { }); }, - openCamera() { + async openCamera() { + // 先检查隐私授权 + try { + await this.checkPrivacyAuthorize(); + } catch (e) { + return; // 用户拒绝隐私授权 + } + uni.chooseImage({ count: 1, sourceType: ['camera'], @@ -1295,26 +1345,45 @@ export default { }); }, - toggleVoiceInput() { + async toggleVoiceInput() { if (!this.voiceInputActive) { - // 切换到语音前检查权限 + // 先检查隐私授权 + try { + await this.checkPrivacyAuthorize(); + } catch (e) { + return; // 用户拒绝隐私授权 + } + + // 切换到语音前检查并请求录音权限 uni.getSetting({ success: (res) => { if (res.authSetting['scope.record']) { + // 已有权限,直接切换 this.hasRecordPermission = true; this.voiceInputActive = true; } else { - this.hasRecordPermission = false; - uni.showModal({ - title: '录音权限', - content: '需要录音权限才能使用语音输入', - showCancel: true, - cancelText: '取消', - confirmText: '去设置', - success: (modalRes) => { - if (modalRes.confirm) { - uni.openSetting(); - } + // 没有权限,请求授权(和图片一样的授权方式) + uni.authorize({ + scope: 'scope.record', + success: () => { + this.hasRecordPermission = true; + this.voiceInputActive = true; + }, + fail: () => { + // 用户拒绝了授权,这时才需要引导去设置 + this.hasRecordPermission = false; + uni.showModal({ + title: '录音权限', + content: '需要录音权限才能使用语音输入,请在设置中开启', + showCancel: true, + cancelText: '取消', + confirmText: '去设置', + success: (modalRes) => { + if (modalRes.confirm) { + uni.openSetting(); + } + } + }); } }); } diff --git a/subPackages/doctor/doctor-userinfo.vue b/subPackages/doctor/doctor-userinfo.vue index 372eeea..1d9969f 100644 --- a/subPackages/doctor/doctor-userinfo.vue +++ b/subPackages/doctor/doctor-userinfo.vue @@ -134,6 +134,7 @@ import { } from '@/request/api/api.js' import {checkDev} from "@/utils/utils"; import {genOrderApi, saveRegisterInfoApi} from "@/request/api/order"; +import request from "@/request/api/request"; export default { data() { return { @@ -353,31 +354,54 @@ export default { // this.rInfo 在 onLoad 中已经解析为对象,直接使用 let params = typeof this.rInfo === 'string' ? JSON.parse(this.rInfo) : this.rInfo; - // 保存病患信息 - saveRegisterInfoApi({ - register_id: this.register_id, - doctor_id: params.doctor_id || this.Did, - drug_id: params.drug_id || params.id, - has_visited: params.has_visited || params.hasVisited, - has_used_drug: params.has_used_drug || params.hasUsedDrug, - illnessInfo: params.illness_info || params.illnessInfo, - type: params.type, - number: params.number, - store_id: uni.getStorageSync('store_id') || '11001', - }).then(() => { - // 跳转到挂号页面,让用户确认挂号并支付 - // 将 rInfo 对象转换为 JSON 字符串并 URL 编码 - const rInfoStr = typeof this.rInfo === 'string' ? this.rInfo : JSON.stringify(this.rInfo); - uni.navigateTo({ - url: `/subPackages/register/register?id=${this.register_id}&doctor_id=${this.Did}&r_info=${encodeURIComponent(rInfoStr)}` - }); - }).catch((error) => { - console.error('保存患者就诊信息失败:', error); - // 即使保存失败,也跳转到挂号页面 + // 如果有 info_id,使用新接口更新关联;否则用旧接口保存 + if (params.info_id) { + // 新流程:更新已创建的 RegisterInfo 的 register_id + request('/xkApi/order/update-register-info-register-id', { + method: 'POST', + data: { + info_id: params.info_id, + register_id: this.register_id, + } + }).then(() => { + // 跳转到挂号页面,让用户确认挂号并支付 + const rInfoStr = typeof this.rInfo === 'string' ? this.rInfo : JSON.stringify(this.rInfo); uni.navigateTo({ - url: `/subPackages/register/register?id=${this.register_id}&doctor_id=${this.Did}&r_info=${this.rInfo}` + url: `/subPackages/register/register?id=${this.register_id}&doctor_id=${this.Did}&r_info=${encodeURIComponent(rInfoStr)}` + }); + }).catch((error) => { + console.error('更新就诊信息关联失败:', error); + // 即使更新失败,也跳转到挂号页面 + uni.navigateTo({ + url: `/subPackages/register/register?id=${this.register_id}&doctor_id=${this.Did}&r_info=${encodeURIComponent(typeof this.rInfo === 'string' ? this.rInfo : JSON.stringify(this.rInfo))}` + }); }); - }); + } else { + // 旧流程:保存病患信息(兼容没有 info_id 的情况) + saveRegisterInfoApi({ + register_id: this.register_id, + doctor_id: params.doctor_id || this.Did, + drug_id: params.drug_id || params.id, + has_visited: params.has_visited || params.hasVisited, + has_used_drug: params.has_used_drug || params.hasUsedDrug, + illnessInfo: params.illness_info || params.illnessInfo, + type: params.type, + number: params.number, + store_id: uni.getStorageSync('store_id') || '11001', + }).then(() => { + // 跳转到挂号页面,让用户确认挂号并支付 + const rInfoStr = typeof this.rInfo === 'string' ? this.rInfo : JSON.stringify(this.rInfo); + uni.navigateTo({ + url: `/subPackages/register/register?id=${this.register_id}&doctor_id=${this.Did}&r_info=${encodeURIComponent(rInfoStr)}` + }); + }).catch((error) => { + console.error('保存患者就诊信息失败:', error); + // 即使保存失败,也跳转到挂号页面 + uni.navigateTo({ + url: `/subPackages/register/register?id=${this.register_id}&doctor_id=${this.Did}&r_info=${this.rInfo}` + }); + }); + } return; } uni.setStorageSync('register_id', this.register_id) diff --git a/subPackages/my/mycollection.vue b/subPackages/my/mycollection.vue index c67ef8a..4813baa 100644 --- a/subPackages/my/mycollection.vue +++ b/subPackages/my/mycollection.vue @@ -91,8 +91,28 @@ }, // 点击头像触发click事件 changeUserPhoto - changeUserPhoto() { + async changeUserPhoto() { console.log('进入更新头像的功能') + + // 先检查隐私授权 + // #ifdef MP-WEIXIN + if (typeof uni.requirePrivacyAuthorize === 'function') { + try { + await new Promise((resolve, reject) => { + uni.requirePrivacyAuthorize({ + success: () => resolve(), + fail: () => { + uni.showToast({ title: '需要同意隐私协议才能使用此功能', icon: 'none' }); + reject(new Error('隐私授权被拒绝')); + } + }); + }); + } catch (e) { + return; // 用户拒绝隐私授权 + } + } + // #endif + uni.chooseImage({ count: 1, //默认9 sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有 diff --git a/subPackages/product/symptoms.vue b/subPackages/product/symptoms.vue index 04b2aac..a3387b2 100644 --- a/subPackages/product/symptoms.vue +++ b/subPackages/product/symptoms.vue @@ -263,11 +263,11 @@ - + @@ -515,6 +515,15 @@ export default { }); return; } + + // 先保存表单数据到局部变量(因为 closePrescriptionFormPopup 会清空表单) + const formData = { + hasVisited: this.prescriptionFormData.hasVisited, + hasUsedDrug: this.prescriptionFormData.hasUsedDrug, + illnessInfo: this.prescriptionFormData.illnessInfo, + }; + const quantity = this.prescriptionQuantity; + this.submitted = true; this.closePrescriptionFormPopup(); @@ -523,21 +532,41 @@ export default { const doctorRes = await this.getDefaultDoctorId(); const doctorId = doctorRes.data.result?.doctor_id || '39'; - // 2. 准备患者就诊信息 - const rInfo = { - has_visited: this.prescriptionFormData.hasVisited, - has_used_drug: this.prescriptionFormData.hasUsedDrug, - illness_info: this.prescriptionFormData.illnessInfo, - drug_name: this.productDetail.drug_name, + // 2. 先调用后端API保存就诊信息,获取info_id + const createRes = await request('/xkApi/order/create-register-info', { + method: 'POST', + data: { + doctor_id: doctorId, + drug_id: this.productDetail.id, + has_visited: formData.hasVisited, + has_used_drug: formData.hasUsedDrug, + illnessInfo: formData.illnessInfo, + type: this.productDetail.type || 2, + number: quantity, + } + }, 1); + + const infoId = createRes.data?.result?.info_id || createRes.data?.info_id; + if (!infoId) { + throw new Error('创建就诊信息失败'); + } + + // 3. 准备患者就诊信息(包含info_id,用于后续更新register_id) + const rInfo = { + info_id: infoId, // 新增:用于挂号后更新关联 + has_visited: formData.hasVisited, + has_used_drug: formData.hasUsedDrug, + illness_info: formData.illnessInfo, + drug_name: this.productDetail.drug_name, drug_id: this.productDetail.id, - number: this.prescriptionQuantity, + number: quantity, type: this.productDetail.type || 2, // 2=西药,3=保健食品 created_at: new Date().toLocaleString('zh-CN') }; - // 3. 跳转到就诊人选择页面,传递 register_type=3 和患者就诊信息 + // 4. 跳转到就诊人选择页面,传递 register_type=3 和患者就诊信息 // 用户选择就诊人后,会创建挂号记录并跳转到 register.vue - uni.navigateTo({ + uni.navigateTo({ url: `/subPackages/doctor/doctor-userinfo?id=${doctorId}&r_type=3&r_info=${encodeURIComponent(JSON.stringify(rInfo))}` }); } catch (error) { diff --git a/utils/ws/websocket.js b/utils/ws/websocket.js index e7eddcd..1196cd4 100644 --- a/utils/ws/websocket.js +++ b/utils/ws/websocket.js @@ -204,4 +204,5 @@ export class WebSocketManager { } // 全局WebSocket实例 -export const webSocketManager = new WebSocketManager('ws://127.0.0.1:12080/ws'); \ No newline at end of file +// export const webSocketManager = new WebSocketManager('ws://127.0.0.1:12080/ws'); +export const webSocketManager = new WebSocketManager('wss://api.ws.g.xiaokang88.com/ws'); \ No newline at end of file