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 @@
+
+
+
+
+
+
+