diff --git a/App.vue b/App.vue index 4b2d614..c8b0a3f 100644 --- a/App.vue +++ b/App.vue @@ -18,6 +18,7 @@ import { STORAGE_KEY } from "@/utils/im/constants"; import { isWxApp } from "@/utils/im/index"; /** 国际化*/ import { setLanguage } from "@/utils/im/i18n"; +import BASE_URL from "@/utils/config.js" // #ifdef APP-PLUS /** 推送插件 */ @@ -53,7 +54,7 @@ export default { let storage_accid=''; if (process.env.UNI_PLATFORM == "h5") { if (window.location.href.indexOf('dev') > -1) { - storage_accid=uni.getetStorageSync('AUTH_YX_ACCID_App'); + storage_accid=uni.getStorageSync('AUTH_YX_ACCID_App'); storage_token=uni.setStorageSync('AUTH_YX_TOKEN_App'); } else { storage_accid=uni.getStorageSync('DEV_AUTH_YX_ACCID_App'); @@ -64,7 +65,7 @@ export default { envVersion } = uni.getAccountInfoSync().miniProgram; if (envVersion == "release") { - storage_accid=uni.getetStorageSync('AUTH_YX_ACCID_App'); + storage_accid=uni.getStorageSync('AUTH_YX_ACCID_App'); storage_token=uni.setStorageSync('AUTH_YX_TOKEN_App'); } else { storage_accid=uni.getStorageSync('DEV_AUTH_YX_ACCID_App'); @@ -76,7 +77,7 @@ export default { storage_token=uni.getStorageSync('DEV_AUTH_YX_TOKEN_App'); } else { - storage_accid=uni.getetStorageSync('AUTH_YX_ACCID_App'); + storage_accid=uni.getStorageSync('AUTH_YX_ACCID_App'); storage_token=uni.setStorageSync('AUTH_YX_TOKEN_App'); } } diff --git a/api/my_api.js b/api/my_api.js new file mode 100644 index 0000000..9363bd9 --- /dev/null +++ b/api/my_api.js @@ -0,0 +1,20 @@ +import {request} from '@/utils/request.js' +const my_api = { + isBoundWechat() { + return request('/expertAPI/isBoundWechatByUuid', {}, 'post', true); + }, + + unBindWechat(data) { + return request('/expertAPI/delWechatExpert', data, 'post', true); + }, + + bindWechat(data) { + return request('/expertAPI/addWechatExpert', data, 'post', true); + }, + + expertWxLogin(data,header) { + return request('/expertAPI/wechatLogin', data, 'post', true,'application/json',header); + } +} + +export default my_api; \ No newline at end of file diff --git a/manifest.json b/manifest.json index 3ff4716..684fb8e 100644 --- a/manifest.json +++ b/manifest.json @@ -18,7 +18,10 @@ }, "modules" : { "OAuth" : {}, - "Payment" : {} + "Payment" : {}, + "Share" : {}, + "Webview-x5" : {}, + "UIWebview" : {} }, /* 模块配置 */ "distribute" : { @@ -53,6 +56,7 @@ "oauth" : { "weixin" : { "appid" : "wxbf3658f5e674667c", + "appsecret" : "c4505a04a9910c65efea8e11ffc93f92", "UniversalLinks" : "https://doc.igandan.com/gdxzExpert/" } }, @@ -62,7 +66,15 @@ "appid" : "wxbf3658f5e674667c", "UniversalLinks" : "https://doc.igandan.com/gdxzExpert/" } - } + }, + "ad" : {}, + "share" : { + "weixin" : { + "appid" : "wxbf3658f5e674667c", + "UniversalLinks" : "https://doc.igandan.com/gdxzExpert/" + } + }, + "speech" : {} }, "splashscreen" : { "androidStyle" : "common" diff --git a/pages.json b/pages.json index 0ae47ab..db493d8 100644 --- a/pages.json +++ b/pages.json @@ -67,6 +67,13 @@ "bounce": "none" } } + }, + { + "path": "pages/webview/webview", + "style": { + "navigationBarTitleText": "", + "enablePullDownRefresh": false + } } ], "subPackages": [ @@ -1209,7 +1216,7 @@ "list": [ { "name": "", - "path": "pages_app/videoDetail/videoDetail", + "path": "pages/index/index", "query": "" } ] diff --git a/pages/index/index.vue b/pages/index/index.vue index f1ced9d..33dd49d 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -637,7 +637,7 @@ // } }; - // 测试tabbar功能的方法 + //测试tabbar功能的方法 const testTabbar = () => { nextTick(() => { if (tabbarRef.value) { @@ -648,9 +648,9 @@ tabbarRef.value.showRedDot(2); // 3秒后隐藏红点 - setTimeout(() => { - tabbarRef.value.hideRedDot(2); - }, 3000); + // setTimeout(() => { + // tabbarRef.value.hideRedDot(2); + // }, 3000); } }); }; diff --git a/pages/my/my.vue b/pages/my/my.vue index 8f90507..fa6baa8 100644 --- a/pages/my/my.vue +++ b/pages/my/my.vue @@ -9,7 +9,17 @@ :style="{'background-image': `url(${myInfoBackGround || '/static/big_background_my.png'})`, 'background-size':'cover','background-repeat':'no-repeat'}"> - {{username}} + + {{username}} + + + + + {{ item.nick_name }} + + + + @@ -27,9 +37,12 @@ 患者送花数 - + 签到 + + {{ formatToChineseUnit(totalPoints) }} + @@ -117,13 +130,15 @@ + 常用操作 - 微信解绑 + 微信解绑 + 微信绑定 @@ -135,10 +150,11 @@ - V4.1.4 + V{{version}} + @@ -209,6 +225,7 @@ import { onShow } from "@dcloudio/uni-app"; + import version from '@/utils/version.js' import hzshImg from "@/static/hzsh.png" import hzfzImg from "@/static/hzfz.png" import qfxxImg from "@/static/qfxz.png" @@ -236,6 +253,7 @@ import cyyhk from "@/static/cyhhk.png" import settingImg from "@/static/setting.png" import api from '@/api/api.js' + import my_api from '@/api/my_api.js' import navTo from "@/utils/navTo" import linkUrl from "@/utils/docUrl" // 响应式数据 @@ -248,7 +266,9 @@ const consultCount = ref(0) const flowerCount = ref(0) const myInfoBackGround = ref('') - + const totalPoints = ref(0) + const sign_in = ref(0) + const honor_list = ref([]) // 从storage获取用户信息 const getUserInfoFromStorage = () => { try { @@ -263,35 +283,79 @@ } } + // 签到点击事件 + const onSignClick = async () => { + + try { + // 调用添加积分接口 + const res = await api.addBonusPointsN({ + score_type:1 + }); + + if (res && res.code ==1) { + // 签到成功 + sign_in.value = 1; + uni.showToast({ + title: '签到成功,获得'+res.bonuspoints+'积分', + icon: 'none' + }); + } else { + uni.showToast({ + title: res?.msg || '签到失败', + icon: 'none' + }); + } + } catch (error) { + console.error('签到失败:', error); + uni.showToast({ + title: '签到失败,请重试', + icon: 'none' + }); + } + }; + const fetchMyInfo = async () => { try { const res = await api.getMyInfo({}) if (res && res.code === 200 && res.data) { const data = res.data - myInfoBackGround.value = data.myInfoBackGround; - followupCount.value = data.follow_patient_num || data.relationPatientNum || 0 - consultCount.value = data.consult_total || data.consultCount || 0 - flowerCount.value = data.give_flower_num || data.flowerCount || 0 + myInfoBackGround.value = data.myInfoBackGround; + followupCount.value = data.expert_apply_num || 0 + consultCount.value = data.consult_total_num || 0 + flowerCount.value = data.ping_flowewr_num || 0 + totalPoints.value = data.total_points || 0 + sign_in.value = data.sign_in || 0 + honor_list.value = data.honor_list || [] } } catch (e) { console.error('获取我的信息失败', e) } } + // 数字格式化为中文单位(万/亿) + const formatToChineseUnit = (value, fractionDigits = 1) => { + if (value == null || value === '' || isNaN(Number(value))) return value; + const num = Number(value); + const sign = num < 0 ? '-' : ''; + const abs = Math.abs(num); + + if (abs < 10000) { + return sign + String(abs); + } + if (abs < 100000000) { + const v = (abs / 10000).toFixed(fractionDigits); + return sign + (v.indexOf('.') > -1 ? v.replace(/\.0+$/, '').replace(/(\.\d*?)0+$/, '$1') : v) + '万'; + } + const v = (abs / 100000000).toFixed(fractionDigits); + return sign + (v.indexOf('.') > -1 ? v.replace(/\.0+$/, '').replace(/(\.\d*?)0+$/, '$1') : v) + '亿'; + } + // 方法 const toggleFontSize = () => { isLargeFont.value = !isLargeFont.value; console.log('切换字体大小:', isLargeFont.value ? '大字版' : '普通版'); }; - const checkin = () => { - console.log('签到'); - uni.showToast({ - title: '签到成功', - icon: 'none' - }); - }; - const goToPage = (page) => { console.log('跳转到页面:', page); let url=""; @@ -333,6 +397,9 @@ case 'myPoints': url="/pages_app/myPoint/myPoint" break; + case 'pointMall': + url="/pages_goods/pointMall/pointMall" + break; case 'myBenefits': url="/pages_app/myWelfare/myWelfare" break; @@ -382,7 +449,7 @@ const showVersion = () => { uni.showModal({ title: '版本信息', - content: '当前版本:V4.1.4', + content: '当前版本:V'+version, showCancel: false }); }; @@ -411,10 +478,19 @@ }) } + const getIsBoundWechat = async () => { + const res = await my_api.isBoundWechat() + console.log(res) + if (res.code === 200 && res.data) { + isBoundWechat.value = res.data + } + } + const isBoundWechat = ref(false) onShow(() => { console.log('我的页面显示'); getUserInfoFromStorage() // 先从storage获取用户信息 fetchMyInfo() // 然后从API获取最新数据 + getIsBoundWechat() }); @@ -468,11 +544,57 @@ } - .username { - color: $white; - font-size: 36rpx; - font-weight: bold; + .user-info-content { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 10rpx; + + .username { + color: $white; + font-size: 36rpx; + font-weight: bold; + } + + .honor_box { + width: 500rpx; + /* 根据设计可调整宽度,使内容可横向滚动 */ + white-space: nowrap; + } + + .honor_wrap { + display: inline-flex; + flex-direction: row; + align-items: center; + gap: 10rpx; + } + + .honor_item { + display: inline-flex; + flex-direction: row; + align-items: center; + gap: 10rpx; + flex: 0 0 auto; + padding: 6rpx 12rpx; + border: 2rpx solid rgba(255, 255, 255, 0.6); + border-radius: 24rpx; + background: rgba(255, 255, 255, 0.08); + } + + .honor_image { + width: 24rpx; + height: 24rpx; + } + + .honor_text { + font-size: 24rpx; + color: $white; + } + } } + + + } .stats-section { @@ -514,6 +636,26 @@ } } + .signbox_1 { + position: absolute; + right: 0; + top: 54rpx; + width: 160rpx; + height: 56rpx; + display: flex; + align-items: center; + border: 1rpx solid #fc564a; + border-radius: 30rpx 0 0 30rpx; + background: #fff url("@/static/qd_bg.9.png")no-repeat 0 0; + background-size: 57rpx 56rpx; + + .sign { + margin-left: 60rpx; + font-size: 28rpx; + color: #fc564a; + } + } + .stats-item { display: flex; flex-direction: column; @@ -546,8 +688,7 @@ gap: 8rpx; font-size: 28rpx; } - } - + // 通用section样式 .section { background-color: $white; diff --git a/pages/webview/webview.vue b/pages/webview/webview.vue new file mode 100644 index 0000000..345e51c --- /dev/null +++ b/pages/webview/webview.vue @@ -0,0 +1,18 @@ + + + diff --git a/pages_app/login/login.vue b/pages_app/login/login.vue index a5ebf07..91491e0 100644 --- a/pages_app/login/login.vue +++ b/pages_app/login/login.vue @@ -108,7 +108,11 @@ import checkImg from "@/static/login_new_unselect.png" import checkOnImg from "@/static/login_new_select.png" import api from "@/api/api.js" - + import my_api from "@/api/my_api.js" + import BASE_URL from "@/utils/config.js" + import { createSignedPostData } from '@/utils/sign.js' + import navTo from "@/utils/navTo" + const customStyle = reactive({ height: "100rpx", fontSize: "36rpx", @@ -135,7 +139,7 @@ console.log('一键登录'); uni.showLoading({ - title: '登录中...' + title: '登录中2...' }); // 模拟登录过程 @@ -173,34 +177,90 @@ return; } - console.log('微信登录'); - wx.login({ - success(res) { - if (res.code) { - // 发送 res.code 到后台换取 openId, sessionKey, unionId - api.expertWxLogin(res.code).then((data) => { - console.log(data) - if (data.data.openid) { - if (process.env.NODE_ENV === 'development') { - uni.setStorageSync('DEV_APPID', data.data.openid); - } else { - uni.setStorageSync('AUTH_APPID', data.data.openid); - } - } - - - let openid = "" - if (process.env.NODE_ENV === 'development') { - openid = uni.getStorageSync('DEV_APPID'); - } else { - openid = uni.getStorageSync('AUTH_APPID'); - } - console.log("openid: ", openid) - }) - } else { - console.log('登录失败!' + res.errMsg); - } - } + // #ifdef APP + uni.showToast({ + title: '微信登录 11', + icon: 'none' + }); + // #endif + uni.login({ + provider: 'weixin', + success: function (loginRes) { + // 登录成功 + uni.getUserInfo({ + provider: 'weixin', + success: async function(info) { + // 获取用户信息成功, info.authResult保存用户信息 + + // #ifdef APP + uni.showToast({ + title: info.userInfo.nickName, + icon: 'none' + }); + // #endif + const wechat_user_info = { + openid:info.userInfo.openId, + unionid:info.userInfo.unionId, + nickname:info.userInfo.nickName, + } + const { postData, sign } = await createSignedPostData({ + wechat_user_info: JSON.stringify(wechat_user_info), + current_spec: "uniapp" + }) + + // #ifdef APP + uni.showToast({ + title: sign, + icon: 'none' + }); + // #endif + + my_api.expertWxLogin(postData,{ + sign:sign + }).then(res=>{ + uni.showToast({ + title: '登录成功', + icon: 'success' + }) + + if (BASE_URL.indexOf('dev') == -1) { + uni.setStorageSync('AUTH_TOKEN_App',res.data.access_token); + uni.setStorageSync('AUTH_YX_ACCID_App', res.data.YX_accid); + uni.setStorageSync('AUTH_YX_TOKEN_App', res.data.YX_token); + uni.setStorageSync('userInfo', res.data); + + } else { + uni.setStorageSync('DEV_AUTH_TOKEN_App', res.data.access_token); + uni.setStorageSync('DEV_AUTH_YX_ACCID_App', res.data.YX_accid); + uni.setStorageSync('DEV_AUTH_YX_TOKEN_App', res.data.YX_token); + uni.setStorageSync('userInfo', res.data); + } + + // 跳转到首页 + navTo({ + url: '/pages/index/index' + }) + }).catch(err=>{ + console.log(err) + uni.showToast({ + title: res.data.msg || '登录失败', + icon: 'none' + }) + }) + } + }) + }, + fail: function (err) { + // 登录授权失败 + // err.code是错误码 + console.log(err) + // #ifdef APP + uni.showToast({ + title: err, + icon: 'none' + }); + // #endif + } }); }; diff --git a/pages_app/pwdLogin/pwdLogin.vue b/pages_app/pwdLogin/pwdLogin.vue index d0bd279..2714faa 100644 --- a/pages_app/pwdLogin/pwdLogin.vue +++ b/pages_app/pwdLogin/pwdLogin.vue @@ -102,8 +102,11 @@ import eyeOpenImg from "@/static/eye_open.png" import eyeCloseImg from "@/static/eye_close.png" import api from "@/api/api.js" + import my_api from "@/api/my_api.js"; import BASE_URL from "@/utils/config.js"; - + import { createSignedPostData } from '@/utils/sign.js' + import navTo from "@/utils/navTo" + const customStyle = reactive({ height: "100rpx", fontSize: "36rpx", @@ -284,11 +287,68 @@ return; } - console.log('微信登录'); - uni.showToast({ - title: '微信登录功能开发中', - icon: 'none' + console.log('微信登录 11'); + uni.login({ + provider: 'weixin', + success: function (loginRes) { + // 登录成功 + uni.getUserInfo({ + provider: 'weixin', + success: async function(info) { + // 获取用户信息成功, info.authResult保存用户信息 + + const wechat_user_info = { + openid:info.userInfo.openId, + unionid:info.userInfo.unionId, + nickname:info.userInfo.nickName, + } + const { postData, sign } = await createSignedPostData({ + wechat_user_info: JSON.stringify(wechat_user_info), + current_spec: "uniapp" + }) + + my_api.expertWxLogin(postData,{ + sign:sign + }).then(res=>{ + uni.showToast({ + title: '登录成功', + icon: 'success' + }) + + if (BASE_URL.indexOf('dev') == -1) { + uni.setStorageSync('AUTH_TOKEN_App',res.data.access_token); + uni.setStorageSync('AUTH_YX_ACCID_App', res.data.YX_accid); + uni.setStorageSync('AUTH_YX_TOKEN_App', res.data.YX_token); + uni.setStorageSync('userInfo', res.data); + + } else { + uni.setStorageSync('DEV_AUTH_TOKEN_App', res.data.access_token); + uni.setStorageSync('DEV_AUTH_YX_ACCID_App', res.data.YX_accid); + uni.setStorageSync('DEV_AUTH_YX_TOKEN_App', res.data.YX_token); + uni.setStorageSync('userInfo', res.data); + } + + // 跳转到首页 + navTo({ + url: '/pages/index/index' + }) + }).catch(err=>{ + console.log(err) + uni.showToast({ + title: res.data.msg || '登录失败', + icon: 'none' + }) + }) + } + }) + }, + fail: function (err) { + // 登录授权失败 + // err.code是错误码 + console.log(err) + } }); + }; // 切换协议同意状态 diff --git a/pages_app/setting/setting.vue b/pages_app/setting/setting.vue index 4f7919e..9a068ed 100644 --- a/pages_app/setting/setting.vue +++ b/pages_app/setting/setting.vue @@ -17,6 +17,7 @@ + 消息通知 @@ -25,7 +26,7 @@ - + 修改登录密码 @@ -37,27 +38,27 @@ 更换手机号 - + 版本更新 - + - + 关于肝胆相照 - + - + 分享肝胆相照APP - + - + 肝胆相照直播群 @@ -67,7 +68,7 @@ 微信关联 - + 清除缓存 @@ -76,7 +77,7 @@ - + 意见反馈 @@ -90,13 +91,13 @@ - + 注册协议 - + 隐私政策 @@ -106,13 +107,45 @@ + + + + + + +