Ver Fonte

优化:我的页面分享数据接口联调;全局分享功能优化

haiyang há 2 semanas atrás
pai
commit
da5d5eb6a6

+ 6 - 2
src/api/home.ts

@@ -25,8 +25,12 @@ export function getAccountCount() {
  *
  * @returns 获取首页优惠券领取情况
  */
-export function getCouponSituation() {
-    return http.Get<CouponSituation>('/couponCenter/APP/couponUserAsset/queryBySendUserId')
+export function getCouponSituation(params = {}) {
+    return http.Get<CouponSituation>('/couponCenter/APP/couponUserAsset/queryBySendUserId', {
+        params: {
+            ...params,
+        }
+    })
 }
 
 /**

+ 1 - 1
src/api/login.ts

@@ -38,7 +38,7 @@ export function refreshToken(refreshToken: string) {
  * 获取用户信息
  */
 export function getUserInfo() {
-    return http.Get<IUserInfoRes>('/user/info')
+    return http.Get<IUserInfoRes>('/couponCenter/APP/couponCenterUser/queryInformationAndStatus')
 }
 
 /**

+ 7 - 1
src/api/me.ts

@@ -1,6 +1,7 @@
 import type {
     couponIssuerApplyByAddResponse,
-    CouponIssuerApplyByIdResponse
+    CouponIssuerApplyByIdResponse,
+    ShareStateResponse
 } from '@/api/types/me'
 import { http } from '@/http/alova'
 
@@ -25,3 +26,8 @@ export function couponIssuerApplyByAdd(couponIssuerApplyByAddForm: CouponIssuerA
 export function updateUserInfo(userInfo) {
     return http.Post('/couponCenter/couponCenterUser/updateInformation', userInfo)
 }
+
+// 获取我的页面中分享统计数据,包括今日分享数、累计分享数、累计团员数
+export function getShareState() {
+    return http.Get<ShareStateResponse>('/couponCenter/APP/mine/getShareStats')
+}

+ 6 - 0
src/api/types/me.ts

@@ -12,3 +12,9 @@ export interface couponIssuerApplyByAddResponse {
     name: string
     phone: string
 }
+
+export interface ShareStateResponse {
+    todayShareCount: number
+    totalShareCount: number
+    totalTeamMemberCount: number
+}

+ 18 - 10
src/hooks/useShare.ts

@@ -1,5 +1,6 @@
 import { getIssuerDetail, getShareInfo } from '@/api/home'
 import { useTokenStore } from '@/store/token'
+import { useUserStore } from '@/store/user'
 import { getImageUrl } from '@/utils/imageUtil'
 
 /**
@@ -41,15 +42,17 @@ const defaultOptions: Required<ShareOptions> = {
  */
 export function useShare(initOptions: ShareOptions = {}) {
     /**
-       * 获取分享配置 - 可以直接在onShareAppMessage中调用
-       * @returns 完整的分享配置
-       */
+               * 获取分享配置 - 可以直接在onShareAppMessage中调用
+               * @returns 完整的分享配置
+               */
     const getShareConfig = async (customOption?: ShareOptions, extraParams?): Promise<WechatMiniprogram.Page.ICustomShareContent | {}> => {
         // 合并默认配置和自定义配置
         const options = { ...defaultOptions, ...initOptions, ...customOption }
 
         // 检查用户是否已登录
         const tokenStore = useTokenStore()
+        const userStore = useUserStore()
+
         if (!tokenStore.hasLogin) {
             uni.showToast({
                 title: '请先登录后再分享',
@@ -64,9 +67,8 @@ export function useShare(initOptions: ShareOptions = {}) {
                     mask: true,
                 })
             }
-            const IssuerResult = await getIssuerDetail()
-            console.log(IssuerResult, 'IssuerResult')
-            if (!IssuerResult || (IssuerResult?.status && IssuerResult?.status !== '1')) {
+
+            if (!userStore.isPassIssuer()) {
                 throw new Error('当前用户不是发券人,无法发放优惠券')
             }
             const params: ShareInfo = {
@@ -105,6 +107,9 @@ export function useShare(initOptions: ShareOptions = {}) {
                     title: options.title,
                     path: sharePath,
                     imageUrl,
+                    success: (res) => {
+                        console.log('分享成功', res)
+                    },
                 }
             }
             else {
@@ -128,15 +133,18 @@ export function useShare(initOptions: ShareOptions = {}) {
     }
 
     /**
-       * 获取朋友圈分享配置 - 可以直接在onShareTimeline中调用
-       * @returns 完整的朋友圈分享配置
-       */
-    const getTimelineShareConfig = async (): Promise<WechatMiniprogram.Page.ICustomShareTimelineContent | {}> => {
+               * 获取朋友圈分享配置 - 可以直接在onShareTimeline中调用
+               * @returns 完整的朋友圈分享配置
+               */
+    const getTimelineShareConfig = async (): Promise<WechatMiniprogram.Page.ICustomTimelineContent | {}> => {
         const config = await getShareConfig() as WechatMiniprogram.Page.ICustomShareContent
         return {
             title: config.title,
             path: config.path,
             imageUrl: config.imageUrl,
+            success: (res) => {
+                console.log('分享到朋友圈成功', res)
+            },
         }
     }
 

+ 0 - 18
src/pages-A/discountcouponList/index.vue

@@ -64,24 +64,6 @@ const { getShareConfig: getShareCouponConfig } = useShare({
     pathParamKey: 'couponShareRecordId',
 })
 
-// #ifdef MP-WEIXIN
-// 分享功能实现
-// 分享生命周期函数
-onShareAppMessage(async (options) => {
-    console.log(options)
-    if (options.from === 'button' && options.target.dataset.shareType === 'coupon') {
-        const couponId = options.target.dataset.couponId
-        const couponinfo = await getCouponDetail({ templateId: couponId })
-        return await getShareCouponConfig({
-            imageUrl: couponinfo?.imageUrl,
-        }, {
-            shareContentId: couponId,
-        })
-    }
-    return null
-})
-// #endif
-
 function handleShareClick(shareLink, hooks) {
     console.log(hooks)
     shareHooks.value = hooks

+ 0 - 17
src/pages-A/sharePage/index.vue

@@ -754,23 +754,6 @@ function handleLongPressImage() {
         }
     })
 }
-
-// 微信分享配置
-// onShareAppMessage(() => {
-//     return {
-//         title: null,
-//         path: null,
-//         imageUrl: shareImageUrl.value,
-//     }
-// })
-
-// onShareTimeline(() => {
-//     return {
-//         title: null,
-//         query: null,
-//         imageUrl: shareImageUrl.value,
-//     }
-// })
 </script>
 
 <style lang="scss" scoped>

+ 0 - 24
src/pages-A/spendAndSaveCouponList/index.vue

@@ -38,30 +38,6 @@ const {
     pageSize: 7,
 })
 
-// const { getShareConfig: getShareCouponConfig } = useShare({
-//     shareType: 'COUPON',
-//     imageSource: 'REMOTE',
-//     path: '/pages/receiveCoupon/index',
-//     pathParamKey: 'couponShareRecordId',
-// })
-
-// #ifdef MP-WEIXIN
-// 分享功能实现
-// 分享生命周期函数
-// onShareAppMessage(async (options) => {
-//     if (options.from === 'button' && options.target.dataset.shareType === 'coupon') {
-//         const couponId = options.target.dataset.couponId
-//         const couponinfo = await getCouponDetail({ templateId: couponId })
-//         return await getShareCouponConfig({
-//             imageUrl: couponinfo?.imageUrl,
-//         }, {
-//             shareContentId: couponId,
-//         })
-//     }
-//     return null
-// })
-// #endif
-
 // 计算底部安全区高度
 const safeBottomHeight = computed(() => {
     return safeAreaInsets?.bottom || 0

+ 19 - 34
src/pages/home/home.vue

@@ -8,6 +8,7 @@ import SpendAndSaveCoupon from '@/components/SpendAndSaveCoupon.vue'
 import { useShare } from '@/hooks/useShare'
 import { useCouponStore } from '@/store/coupon'
 import { useTokenStore } from '@/store/token'
+import { useUserStore } from '@/store/user'
 import { getImageUrl } from '@/utils/imageUtil'
 import { toLoginPage } from '@/utils/toLoginPage'
 
@@ -26,6 +27,7 @@ definePage({
 
 const tokenStore = useTokenStore()
 const { hasLogin } = storeToRefs(tokenStore)
+const userStore = useUserStore()
 
 const refreshing = ref(false)
 
@@ -50,10 +52,20 @@ const { send: getCouponSituationRequest, data: couponSituationData } = useReques
     dependencies: [],
 })
 
-// onLoad(async () => {
-//     // 获取优惠券
-//     couponStore.getCouponListByType()
-// })
+// 创建分享hook实例
+const { getShareConfig, getTimelineShareConfig } = useShare()
+
+// #ifdef MP-WEIXIN
+// 分享给好友生命周期函数
+onShareAppMessage(async (options) => {
+    return await getShareConfig()
+})
+
+// 分享到朋友圈生命周期函数
+onShareTimeline(async () => {
+    return await getTimelineShareConfig()
+})
+// #endif
 
 onShow((options) => {
     couponStore.getCouponListByType()
@@ -107,38 +119,11 @@ function toCouponRedemptionList(state) {
     })
 }
 
-// 创建分享hook实例
-const { getShareConfig } = useShare()
-const { getShareConfig: getShareCouponConfig } = useShare({
-    shareType: 'COUPON',
-    imageSource: 'REMOTE',
-    path: '/pages/receiveCoupon/index',
-    pathParamKey: 'couponShareRecordId',
-})
-
-// #ifdef MP-WEIXIN
-// 分享功能实现
-// 分享生命周期函数
-onShareAppMessage(async (options) => {
-    console.log(options)
-    if (options.from === 'button' && options.target.dataset.shareType === 'coupon') {
-        const couponId = options.target.dataset.couponId
-        const couponinfo = await getCouponDetail({ templateId: couponId })
-        return await getShareCouponConfig({
-            imageUrl: couponinfo?.imageUrl,
-        }, {
-            shareContentId: couponId,
-        })
-    }
-    else {
-        return await getShareConfig()
-    }
-})
-// #endif
-
 async function onRefresh() {
     refreshing.value = true
-    couponStore.getCouponListByType()
+    await userStore.fetchUserInfo()
+    await couponStore.getCouponListByType()
+
     setTimeout(() => {
         refreshing.value = false
     }, 1000)

+ 17 - 2
src/pages/income/income.vue

@@ -6,8 +6,7 @@ import { computed, ref, watch } from 'vue'
 import { getAccountCount } from '@/api/home'
 import { getAccountDetailTotalAmount, getCouponIssuerAccountByPageMap } from '@/api/income'
 import { useScroll } from '@/hooks/useScroll'
-
-import { LOGIN_PAGE } from '@/router/config'
+import { useShare } from '@/hooks/useShare'
 import { useUserStore } from '@/store'
 import { useTokenStore } from '@/store/token'
 import { changtime, menuButtonInfo, safeAreaInsets, systemInfo } from '@/utils'
@@ -136,6 +135,22 @@ onShow(async () => {
         // 数据会在useScroll的onMounted中自动加载,这里不需要额外调用
     }
 })
+
+// 创建分享hook实例
+const { getShareConfig, getTimelineShareConfig } = useShare()
+
+// #ifdef MP-WEIXIN
+// 分享给好友生命周期函数
+onShareAppMessage(async (options) => {
+    return await getShareConfig()
+})
+
+// 分享到朋友圈生命周期函数
+onShareTimeline(async () => {
+    return await getTimelineShareConfig()
+})
+// #endif
+
 const isUnlock = computed(() => accountCountData && accountCountData?.status === 0)
 
 watch(() => accountCountData, (newVal) => {

+ 174 - 214
src/pages/my/my.vue

@@ -3,8 +3,8 @@ import { useRequest } from 'alova/client'
 import { storeToRefs } from 'pinia'
 import { computed, ref } from 'vue'
 import { getCouponSituation } from '@/api/home'
-import { getCouponIssuerApplyById } from '@/api/me'
-import { LOGIN_PAGE } from '@/router/config'
+import { getCouponIssuerApplyById, getShareState } from '@/api/me'
+import { useShare } from '@/hooks/useShare'
 import { useUserStore } from '@/store'
 import { useTokenStore } from '@/store/token'
 import { changtime } from '@/utils'
@@ -25,29 +25,27 @@ const { hasLogin } = storeToRefs(tokenStore)
 const deadline = ref(Date.now())
 
 // 用户优惠券统计数据
-const { send: getCouponSituationRequest, data: couponSituationData } = useRequest(getCouponSituation, {
+const { send: getCouponSituationRequest, data: couponSituationData, loading: couponSituationLoading } = useRequest(getCouponSituation, {
     immediate: false,
 })
+const { send: getShareStateRequest, data: shareStateData, loading: shareStateLoading } = useRequest(getShareState, {
+    immediate: false,
+})
+
 // 发卷人查询审核状态
 const { send: getCouponIssuerApplyByIdRequest, data: couponIssuerApplyByIdData } = useRequest(getCouponIssuerApplyById, {
     immediate: false,
 })
 // 昵称输入值
 const nicknameInput = ref('')
-onShow(() => {
+onShow(async () => {
     console.log('登录判断:', hasLogin.value)
     // 登录后查询收益数据
     if (hasLogin.value) {
-        // 获取用户信息
-        userStore.fetchUserInfo().then((data) => {
-            // #ifdef MP-WEIXIN
-            // 初始化昵称输入框
-            console.log('用户信息:', data)
-            nicknameInput.value = data?.userInfo.nickname || ''
-            // #endif
-        })
-        getCouponSituationRequest()
-        getCouponIssuerApplyByIdRequest()
+        await getCouponSituationRequest({ logo: 'time' })
+        await getShareStateRequest()
+        deadline.value = Date.now()
+        await getCouponIssuerApplyByIdRequest()
         if (couponIssuerApplyByIdData.value?.status === '0') {
             console.log('优惠券统计数据:', couponSituationData.value)
             // open()
@@ -55,20 +53,6 @@ onShow(() => {
     }
 })
 
-// 微信小程序下登录
-async function handleLogin() {
-    // #ifdef MP-WEIXIN
-    // 微信登录
-    await tokenStore.wxLogin()
-
-    // #endif
-    // #ifndef MP-WEIXIN
-    uni.navigateTo({
-        url: `${LOGIN_PAGE}`,
-    })
-    // #endif
-}
-
 function handleLogout() {
     uni.showModal({
         title: '提示',
@@ -119,65 +103,10 @@ function getNavigationBarHeight() {
     })
 }
 getNavigationBarHeight()
-
-// 处理点击头像获取用户头像
-async function handleGetAvatar(e) {
-    const { avatarUrl } = e.detail
-    if (avatarUrl) {
-        userStore.setUserAvatar(avatarUrl)
-        uni.showToast({
-            title: '头像获取成功',
-            icon: 'success',
-        })
-        // 验证本地存储是否已更新
-        const updatedUser = uni.getStorageSync('user')
-        console.log('验证本地存储头像更新:', updatedUser?.avatar)
-    }
-}
-
-// 保存昵称
-function saveNickname(e: any) {
-    console.log('保存昵称:', e.detail)
-    // 直接使用nicknameInput.value,因为input已经通过v-model绑定
-    const nickname = nicknameInput.value.trim()
-    if (nickname) {
-        try {
-            // 更新用户信息到store
-            userStore.setUserInfo({
-                ...userInfo.value,
-                nickname,
-            })
-
-            uni.showToast({
-                title: '昵称保存成功',
-                icon: 'success',
-                duration: 1500,
-            })
-
-            // 验证本地存储是否已更新
-            const updatedUser = uni.getStorageSync('user')
-            console.log('本地存储昵称已更新:', updatedUser?.nickname)
-        }
-        catch (error) {
-            console.error('保存昵称失败:', error)
-            uni.showToast({
-                title: '保存失败,请重试',
-                icon: 'error',
-                duration: 1500,
-            })
-        }
-    }
-    else {
-        uni.showToast({
-            title: '昵称不能为空',
-            icon: 'none',
-            duration: 1500,
-        })
-    }
-}
 // #endif
 
 const show = ref(false)
+const refreshing = ref(false)
 function close() {
     show.value = false
 }
@@ -193,169 +122,197 @@ function menuClick(page) {
         url: `/pages-A/${page}/index?couponSituation=${JSON.stringify(couponSituationData.value)}`,
     })
 }
+
+async function onRefresh() {
+    refreshing.value = true
+    await userStore.fetchUserInfo()
+    await getCouponSituationRequest({ logo: 'time' })
+    await getShareStateRequest()
+    deadline.value = Date.now()
+    refreshing.value = false
+}
+
+// 创建分享hook实例
+const { getShareConfig, getTimelineShareConfig } = useShare()
+
+// #ifdef MP-WEIXIN
+// 分享给好友生命周期函数
+onShareAppMessage(async (options) => {
+    return await getShareConfig()
+})
+
+// 分享到朋友圈生命周期函数
+onShareTimeline(async () => {
+    return await getTimelineShareConfig()
+})
+// #endif
 </script>
 
 <template>
     <view class="profile-container">
-        <!-- 顶部区域 -->
-        <view class="me-header"
-            :style="{ background: `url(${getImageUrl('@img/me/me-bg.png')})`, backgroundSize: 'cover', backgroundRepeat: 'no-repeat', backgroundPosition: 'center center' }">
-            <!-- <view class="me-header-avatar-info" :style="{ paddingTop: `calc(${navigationBarHeight}px + 23rpx)` }"> -->
-            <view class="me-header-avatar-info" :style="{ paddingTop: `23rpx` }">
-                <!-- <button class="me-header-avatar" @click="handleGetAvatar">
-                    <image :src="avatarDisplay" mode="aspectFill" />
-                </button> -->
-                <up-image :src="avatarDisplay" width="128rpx" height="128rpx" shape="circle" />
-                <view class="me-header-info">
-                    <view class="me-header-name">
-                        <!-- #ifdef MP-WEIXIN -->
-                        <input v-model="nicknameInput" type="nickname" :disabled="true" placeholder="用户昵称"
-                            placeholder-style="color: #fff; opacity: 0.7;" class="nickname-input">
-                        <!-- #endif -->
-                        <!-- #ifndef MP-WEIXIN -->
-                        {{ userInfo.value?.nickname || '用户' }}
-                        <!-- #endif -->
-                    </view>
-                </view>
-            </view>
-            <view class="me-header-tips">
-                <view class="me-header-tips-row header-data-time">
-                    <view class="desc-time">
-                        <up-icon name="info-circle" size="23rpx" color="#fff" />
-                        <view class="desc-text">
-                            数据截止到&nbsp;&nbsp;{{ changtime(deadline, 'YYYY-MM-DD HH:mm:ss') }}
+        <up-pull-refresh :refreshing="refreshing" :threshold="60" @refresh="onRefresh">
+            <!-- 顶部区域 -->
+            <view class="me-header"
+                :style="{ background: `url(${getImageUrl('@img/me/me-bg.png')})`, backgroundSize: 'cover', backgroundRepeat: 'no-repeat', backgroundPosition: 'center center' }">
+                <view class="me-header-avatar-info" :style="{ paddingTop: `23rpx` }">
+                    <up-image :src="avatarDisplay" width="128rpx" height="128rpx" shape="circle" />
+                    <view class="me-header-info">
+                        <view class="me-header-name">
+                            <!-- #ifdef MP-WEIXIN -->
+                            <!-- <input v-model="userInfo.value.nickname" type="nickname" :disabled="true" placeholder="用户昵称"
+                                placeholder-style="color: #fff; opacity: 0.7;" class="nickname-input"> -->
+                            <text class="nickname-input">{{ userInfo.nickname || '用户' }}</text>
+                            <!-- #endif -->
+                            <!-- #ifndef MP-WEIXIN -->
+                            {{ userInfo.value?.nickname || '用户' }}
+                            <!-- #endif -->
                         </view>
                     </view>
                 </view>
-                <view class="me-header-tips-row header-data-info">
-                    <view class="me-header-tips-item">
-                        <view class="me-header-tips-item-num">
-                            {{ couponSituationData?.quantityForComplimentary || 0 }}
-                        </view>
-                        <view class="me-header-tips-item-des">
-                            今日邀请
+                <view class="me-header-tips">
+                    <view class="me-header-tips-row header-data-time">
+                        <view class="desc-time">
+                            <up-loading-icon v-if="couponSituationLoading || shareStateLoading" size="23rpx"
+                                :loading="couponSituationLoading || shareStateLoading" color="#fff" />
+                            <up-icon v-else name="info-circle" size="23rpx" color="#fff" />
+                            <view v-if="couponSituationLoading || shareStateLoading" class="desc-text">
+                                数据加载中...
+                            </view>
+                            <view v-else class="desc-text">
+                                数据截止到&nbsp;&nbsp;{{ changtime(deadline, 'YYYY-MM-DD HH:mm:ss') }}
+                            </view>
                         </view>
                     </view>
-                    <view class="me-header-tips-item">
-                        <view class="me-header-tips-item-num">
-                            {{ couponSituationData?.usedQuantity || 0 }}
+                    <view class="me-header-tips-row header-data-info">
+                        <view class="me-header-tips-item">
+                            <view class="me-header-tips-item-num">
+                                {{ shareStateData?.todayShareCount || 0 }}
+                            </view>
+                            <view class="me-header-tips-item-des">
+                                今日邀请
+                            </view>
                         </view>
-                        <view class="me-header-tips-item-des">
-                            累计邀请
+                        <view class="me-header-tips-item">
+                            <view class="me-header-tips-item-num">
+                                {{ shareStateData?.totalShareCount || 0 }}
+                            </view>
+                            <view class="me-header-tips-item-des">
+                                累计邀请
+                            </view>
+                        </view>
+                        <view class="me-header-tips-item">
+                            <view class="me-header-tips-item-num">
+                                {{ shareStateData?.totalTeamMemberCount || 0 }}
+                            </view>
+                            <view class="me-header-tips-item-des">
+                                累计团员
+                            </view>
+                            <view class="me-header-tips-item-icon">
+                                <up-icon name="arrow-right" size="21rpx" color="#FFFFFF" />
+                            </view>
                         </view>
                     </view>
-                    <view class="me-header-tips-item">
-                        <view class="me-header-tips-item-num">
-                            {{ couponSituationData?.expired || 0 }}
+                    <view class="me-header-tips-row header-data-info">
+                        <view class="me-header-tips-item">
+                            <view class="me-header-tips-item-num">
+                                {{ couponSituationData?.quantityForComplimentary || 0 }}
+                            </view>
+                            <view class="me-header-tips-item-des">
+                                今日发券
+                            </view>
                         </view>
-                        <view class="me-header-tips-item-des">
-                            累计团员
+                        <view class="me-header-tips-item">
+                            <view class="me-header-tips-item-num">
+                                {{ couponSituationData?.quantityToBeUsed || 0 }}
+                            </view>
+                            <view class="me-header-tips-item-des">
+                                今日领取
+                            </view>
                         </view>
-                        <view class="me-header-tips-item-icon">
-                            <up-icon name="arrow-right" size="21rpx" color="#FFFFFF" />
+                        <view class="me-header-tips-item">
+                            <view class="me-header-tips-item-num">
+                                {{ couponSituationData?.usedQuantity || 0 }}
+                            </view>
+                            <view class="me-header-tips-item-des">
+                                今日使用
+                            </view>
+                            <view class="me-header-tips-item-icon">
+                                <up-icon name="arrow-right" size="21rpx" color="#FFFFFF" />
+                            </view>
                         </view>
                     </view>
                 </view>
-                <view class="me-header-tips-row header-data-info">
-                    <view class="me-header-tips-item">
-                        <view class="me-header-tips-item-num">
-                            {{ couponSituationData?.quantityForComplimentary || 0 }}
-                        </view>
-                        <view class="me-header-tips-item-des">
-                            今日发券
+            </view>
+            <!-- 菜单 -->
+            <view class="me-header-menu">
+                <view class="me-header-menu-item" @click="menuClick('applyForm')">
+                    <view class="me-header-menu-icon">
+                        <image :src="getImageUrl('@img/me/coupon-need.png')" mode="aspectFill" />
+                        <view class="me-header-menu-text">
+                            申请发券人
                         </view>
                     </view>
-                    <view class="me-header-tips-item">
-                        <view class="me-header-tips-item-num">
-                            {{ couponSituationData?.usedQuantity || 0 }}
-                        </view>
-                        <view class="me-header-tips-item-des">
-                            今日领取
-                        </view>
+                    <view class="me-header-menu-left">
+                        <up-icon name="arrow-right" color="#979797" size="12" />
                     </view>
-                    <view class="me-header-tips-item">
-                        <view class="me-header-tips-item-num">
-                            {{ couponSituationData?.expired || 0 }}
-                        </view>
-                        <view class="me-header-tips-item-des">
-                            今日使用
-                        </view>
-                        <view class="me-header-tips-item-icon">
-                            <up-icon name="arrow-right" size="21rpx" color="#FFFFFF" />
+                </view>
+                <view class="me-header-menu-item" @click="menuClick('applyForm')">
+                    <view class="me-header-menu-icon">
+                        <image :src="getImageUrl('@img/me/invite.png')" mode="aspectFill" />
+                        <view class="me-header-menu-text">
+                            我的邀请
                         </view>
                     </view>
-                </view>
-            </view>
-        </view>
-        <!-- 菜单 -->
-        <view class="me-header-menu">
-            <view class="me-header-menu-item" @click="menuClick('applyForm')">
-                <view class="me-header-menu-icon">
-                    <image :src="getImageUrl('@img/me/coupon-need.png')" mode="aspectFill" />
-                    <view class="me-header-menu-text">
-                        申请发券人
+                    <view class="me-header-menu-left">
+                        <up-icon name="arrow-right" color="#979797" size="12" />
                     </view>
                 </view>
-                <view class="me-header-menu-left">
-                    <up-icon name="arrow-right" color="#979797" size="12" />
-                </view>
-            </view>
-            <view class="me-header-menu-item" @click="menuClick('applyForm')">
-                <view class="me-header-menu-icon">
-                    <image :src="getImageUrl('@img/me/invite.png')" mode="aspectFill" />
-                    <view class="me-header-menu-text">
-                        我的邀请
+                <view class="me-header-menu-item" @click="menuClick('applyForm')">
+                    <view class="me-header-menu-icon">
+                        <image :src="getImageUrl('@img/me/inviter.png')" mode="aspectFill" />
+                        <view class="me-header-menu-text">
+                            我的邀请人
+                        </view>
                     </view>
-                </view>
-                <view class="me-header-menu-left">
-                    <up-icon name="arrow-right" color="#979797" size="12" />
-                </view>
-            </view>
-            <view class="me-header-menu-item" @click="menuClick('applyForm')">
-                <view class="me-header-menu-icon">
-                    <image :src="getImageUrl('@img/me/inviter.png')" mode="aspectFill" />
-                    <view class="me-header-menu-text">
-                        我的邀请人
+                    <view class="me-header-menu-left">
+                        <up-icon name="arrow-right" color="#979797" size="12" />
                     </view>
                 </view>
-                <view class="me-header-menu-left">
-                    <up-icon name="arrow-right" color="#979797" size="12" />
-                </view>
-            </view>
-            <view class="me-header-menu-item" @click="menuClick('shareFriend')">
-                <view class="me-header-menu-icon">
-                    <image :src="getImageUrl('@img/me/share.png')" mode="aspectFill" />
-                    <view class="me-header-menu-text">
-                        邀请好友
+                <view class="me-header-menu-item" @click="menuClick('shareFriend')">
+                    <view class="me-header-menu-icon">
+                        <image :src="getImageUrl('@img/me/share.png')" mode="aspectFill" />
+                        <view class="me-header-menu-text">
+                            邀请好友
+                        </view>
                     </view>
-                </view>
-                <view class="me-header-menu-left">
-                    <up-icon name="arrow-right" color="#979797" size="12" />
-                </view>
-            </view>
-            <view class="me-header-menu-item" @click="menuClick('settingPage')">
-                <view class="me-header-menu-icon">
-                    <image :src="getImageUrl('@img/me/setting.png')" mode="aspectFill" />
-                    <view class="me-header-menu-text">
-                        设置
+                    <view class="me-header-menu-left">
+                        <up-icon name="arrow-right" color="#979797" size="12" />
                     </view>
                 </view>
-                <view class="me-header-menu-left">
-                    <up-icon name="arrow-right" color="#979797" size="12" />
-                </view>
-            </view>
-            <view class="me-header-menu-item" @click="handleLogout">
-                <view class="me-header-menu-icon">
-                    <image :src="getImageUrl('@img/me/loginOut.png')" mode="aspectFill" />
-                    <view class="me-header-menu-text">
-                        退出登录
+                <view class="me-header-menu-item" @click="menuClick('settingPage')">
+                    <view class="me-header-menu-icon">
+                        <image :src="getImageUrl('@img/me/setting.png')" mode="aspectFill" />
+                        <view class="me-header-menu-text">
+                            设置
+                        </view>
+                    </view>
+                    <view class="me-header-menu-left">
+                        <up-icon name="arrow-right" color="#979797" size="12" />
                     </view>
                 </view>
-                <view class="me-header-menu-left">
-                    <up-icon name="arrow-right" color="#979797" size="12" />
+                <view class="me-header-menu-item" @click="handleLogout">
+                    <view class="me-header-menu-icon">
+                        <image :src="getImageUrl('@img/me/loginOut.png')" mode="aspectFill" />
+                        <view class="me-header-menu-text">
+                            退出登录
+                        </view>
+                    </view>
+                    <view class="me-header-menu-left">
+                        <up-icon name="arrow-right" color="#979797" size="12" />
+                    </view>
                 </view>
             </view>
-        </view>
+        </up-pull-refresh>
         <!-- 申请中的提示框 -->
         <up-modal content="您已提交申请,请耐心等待!" title="提示" :show="show">
             <template #confirmButton>
@@ -410,6 +367,9 @@ function menuClick(page) {
 }
 
 .profile-container {
+    height: calc(100vh - 100rpx);
+    background-color: #f8f8fa;
+
     .me-header {
         height: 746rpx;
         display: flex;
@@ -531,7 +491,7 @@ function menuClick(page) {
 
     .me-header-menu {
         background: #ffffff;
-        border-radius: 10rpx 10rpx 0rpx 0rpx;
+        border-radius: 10rpx;
         margin: -50rpx 24rpx 0;
         padding: 0 20rpx;
 

+ 46 - 58
src/store/token.ts

@@ -61,8 +61,8 @@ export const useTokenStore = defineStore(
         }
 
         /**
-                                                                                                                                                     * 判断token是否过期
-                                                                                                                                                     */
+                                                                 * 判断token是否过期
+                                                                 */
         const isTokenExpired = computed(() => {
             if (!tokenInfo.value) {
                 return true
@@ -77,8 +77,8 @@ export const useTokenStore = defineStore(
         })
 
         /**
-                                                                                                                                                     * 判断refreshToken是否过期
-                                                                                                                                                     */
+                                                                 * 判断refreshToken是否过期
+                                                                 */
         const isRefreshTokenExpired = computed(() => {
             if (!isDoubleTokenMode)
                 return true
@@ -92,22 +92,30 @@ export const useTokenStore = defineStore(
         })
 
         /**
-                                                                                                                                                     * 登录成功后处理逻辑
-                                                                                                                                                     * @param tokenInfo 登录返回的token信息
-                                                                                                                                                     */
+                                                                 * 登录成功后处理逻辑
+                                                                 * @param tokenInfo 登录返回的token信息
+                                                                 */
         async function _postLogin(tokenInfo: IAuthLoginRes) {
             setTokenInfo(tokenInfo)
-            // const userStore = useUserStore()
-            // await userStore.fetchUserInfo()
+            const userStore = useUserStore()
+            await userStore.fetchUserInfo()
+        }
+
+        const cleanToken = () => {
+            uni.removeStorageSync('accessTokenExpireTime')
+            uni.removeStorageSync('refreshTokenExpireTime')
+            console.log('退出登录-清除用户信息')
+            tokenInfo.value = { ...tokenInfoState }
+            uni.removeStorageSync('token')
         }
 
         /**
-                                                                                                                                                     * 用户登录
-                                                                                                                                                     * 有的时候后端会用一个接口返回token和用户信息,有的时候会分开2个接口,一个获取token,一个获取用户信息
-                                                                                                                                                     * (各有利弊,看业务场景和系统复杂度),这里使用2个接口返回的来模拟
-                                                                                                                                                     * @param loginForm 登录参数
-                                                                                                                                                     * @returns 登录结果
-                                                                                                                                                     */
+                                                                 * 用户登录
+                                                                 * 有的时候后端会用一个接口返回token和用户信息,有的时候会分开2个接口,一个获取token,一个获取用户信息
+                                                                 * (各有利弊,看业务场景和系统复杂度),这里使用2个接口返回的来模拟
+                                                                 * @param loginForm 登录参数
+                                                                 * @returns 登录结果
+                                                                 */
         const login = async (loginForm: ILoginForm) => {
             try {
                 const res = await _login(loginForm)
@@ -121,6 +129,7 @@ export const useTokenStore = defineStore(
             }
             catch (error) {
                 console.error('登录失败:', error)
+                cleanToken()
                 uni.showToast({
                     title: '登录失败,请重试',
                     icon: 'error',
@@ -130,33 +139,20 @@ export const useTokenStore = defineStore(
         }
 
         /**
-                                                                                                                                                     * 微信登录
-                                                                                                                                                     * 有的时候后端会用一个接口返回token和用户信息,有的时候会分开2个接口,一个获取token,一个获取用户信息
-                                                                                                                                                     * (各有利弊,看业务场景和系统复杂度),这里使用2个接口返回的来模拟
-                                                                                                                                                     * @returns 登录结果
-                                                                                                                                                     */
+                                                                                                                                                                                                             * 微信登录
+                                                                                                                                                                                                             * 有的时候后端会用一个接口返回token和用户信息,有的时候会分开2个接口,一个获取token,一个获取用户信息
+                                                                                                                                                                                                             * (各有利弊,看业务场景和系统复杂度),这里使用2个接口返回的来模拟
+                                                                                                                                                                                                             * @returns 登录结果
+                                                                                                                                                                                                             */
         const wxLogin = async () => {
             try {
-                // 获取用户信息
-                const profile = await getUserProfile()
-                console.log('微信登录-profile: ', profile)
                 // 获取微信小程序登录的code
                 const code = await getWxCode()
                 console.log('微信登录-code: ', code.code)
                 const res = await _wxLogin(code.code)
-                console.log('微信登录分享登录 ', isShareEnter.value)
                 console.log('微信登录-res: ', res)
                 await _postLogin(res)
-                // 将微信用户信息转换为系统要求的格式
-                const userStore = useUserStore()
-                const systemUserInfo = {
-                    userId: -1, // 初始值,后续可由后端更新
-                    username: '', // 微信登录可能没有用户名,使用空字符串
-                    nickname: profile.userInfo.nickName,
-                    avatar: profile.userInfo.avatarUrl,
-                }
-                // 存储系统格式的用户信息
-                userStore.setUserInfo(systemUserInfo)
+                console.log('微信登录分享登录 ', isShareEnter.value)
                 if (isShareEnter.value) {
                     console.log('微信登录分享登录-params: ', JSON.parse(uni.getStorageSync('shareParams')))
                     await addInviteConversion(JSON.parse(uni.getStorageSync('shareParams')))
@@ -178,8 +174,8 @@ export const useTokenStore = defineStore(
         }
 
         /**
-                                                                                                                                                     * 退出登录 并 删除用户信息
-                                                                                                                                                     */
+                                                                                                                                                                                                             * 退出登录 并 删除用户信息
+                                                                                                                                                                                                             */
         const logout = async () => {
             try {
                 // TODO 实现自己的退出登录逻辑
@@ -201,18 +197,10 @@ export const useTokenStore = defineStore(
             }
         }
 
-        const cleanToken = () => {
-            uni.removeStorageSync('accessTokenExpireTime')
-            uni.removeStorageSync('refreshTokenExpireTime')
-            console.log('退出登录-清除用户信息')
-            tokenInfo.value = { ...tokenInfoState }
-            uni.removeStorageSync('token')
-        }
-
         /**
-                                                                                                                                                     * 刷新token
-                                                                                                                                                     * @returns 刷新结果
-                                                                                                                                                     */
+                                                                                                                                                                                                             * 刷新token
+                                                                                                                                                                                                             * @returns 刷新结果
+                                                                                                                                                                                                             */
         const refreshToken = async () => {
             if (!isDoubleTokenMode) {
                 console.error('单token模式不支持刷新token')
@@ -238,10 +226,10 @@ export const useTokenStore = defineStore(
         }
 
         /**
-                                                                                                                                                     * 获取有效的token
-                                                                                                                                                     * 注意:在computed中不直接调用异步函数,只做状态判断
-                                                                                                                                                     * 实际的刷新操作应由调用方处理
-                                                                                                                                                     */
+                                                                                                                                                                                                             * 获取有效的token
+                                                                                                                                                                                                             * 注意:在computed中不直接调用异步函数,只做状态判断
+                                                                                                                                                                                                             * 实际的刷新操作应由调用方处理
+                                                                                                                                                                                                             */
         const getValidToken = computed(() => {
             // token已过期,返回空
             if (isTokenExpired.value) {
@@ -257,8 +245,8 @@ export const useTokenStore = defineStore(
         })
 
         /**
-                                                                                                                                                     * 检查是否有登录信息(不考虑token是否过期)
-                                                                                                                                                     */
+                                                                                                                                                                                                             * 检查是否有登录信息(不考虑token是否过期)
+                                                                                                                                                                                                             */
         const hasLoginInfo = computed(() => {
             if (!tokenInfo.value) {
                 return false
@@ -272,17 +260,17 @@ export const useTokenStore = defineStore(
         })
 
         /**
-                                                                                                     * 检查是否已登录且token有效
-                                                                                                     */
+                                                                                                                                                             * 检查是否已登录且token有效
+                                                                                                                                                             */
         const hasValidLogin = computed(() => {
             console.log('hasValidLogin', hasLoginInfo.value && !isTokenExpired.value, hasLoginInfo.value, !isTokenExpired.value)
             return hasLoginInfo.value && !isTokenExpired.value
         })
 
         /**
-                                                                                                 * 尝试获取有效的token,如果过期且可刷新,则刷新token
-                                                                                                 * @returns 有效的token或空字符串
-                                                                                                 */
+                                                                                                                                                         * 尝试获取有效的token,如果过期且可刷新,则刷新token
+                                                                                                                                                         * @returns 有效的token或空字符串
+                                                                                                                                                         */
         const tryGetValidToken = async (): Promise<string> => {
             if (!getValidToken.value && isDoubleTokenMode && !isRefreshTokenExpired.value) {
                 try {

+ 36 - 9
src/store/user.ts

@@ -10,7 +10,10 @@ const userInfoState: IUserInfoRes = {
     userId: -1,
     username: '',
     nickname: '',
-    avatar: '/static/images/default-avatar.png',
+    avatar: '',
+    phone: '',
+    openId: '',
+    status: '0', // 是否是发券人  1-通过,0-待审核,2-拒绝
 }
 
 export const useUserStore = defineStore(
@@ -27,10 +30,8 @@ export const useUserStore = defineStore(
             }
             userInfo.value = val
             // 直接更新本地存储(无论本地是否已有用户信息)
-            const currentUser = uni.getStorageSync('user')
-            const updatedUser = currentUser ? { ...currentUser, ...val } : val
-            uni.setStorageSync('user', updatedUser)
-            console.log('本地存储用户信息已更新', updatedUser)
+            uni.setStorageSync('user', val)
+            console.log('本地存储用户信息已更新', val)
         }
         const setUserAvatar = (avatar: string) => {
             userInfo.value.avatar = avatar
@@ -59,11 +60,36 @@ export const useUserStore = defineStore(
         }
 
         /**
-                                     * 获取用户信息
-                                     */
+                                                                         * 获取用户信息
+                                                                         */
         const fetchUserInfo = async () => {
-            const res = JSON.parse(uni.getStorageSync('user'))
-            return res
+            try {
+                const userInfo = await getUserInfo()
+                const systemUserInfo = {
+                    userId: userInfo.userId,
+                    username: userInfo.nickname,
+                    nickname: userInfo.nickname,
+                    avatar: userInfo.avatarUrl,
+                    phone: userInfo.phoneNumber,
+                    openId: userInfo.openid,
+                    status: userInfo.status, // 是否是发券人
+                }
+                setUserInfo(systemUserInfo)
+                return systemUserInfo
+            }
+            catch (error) {
+                console.error('获取用户信息失败:', error)
+                throw new Error('获取用户信息失败')
+            }
+        }
+
+        /**
+             * 判断当前登录用户是否通过发券人申请
+             * @returns {boolean} 是否通过申请
+             */
+        const isPassIssuer = () => {
+            const currentUserStatus = userInfo.value.status
+            return currentUserStatus === '1'
         }
 
         return {
@@ -73,6 +99,7 @@ export const useUserStore = defineStore(
             setUserInfo,
             setUserAvatar,
             setUserNickName,
+            isPassIssuer
         }
     },
     {