Files
medical-mall/unpackage/cache/.app-android/sourcemap/pages/user/center.kt.map

1 line
13 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"version":3,"sources":["pages/user/center.uvue","pages/user/login.uvue","App.uvue","uni_modules/ak-req/ak-req.uts"],"sourcesContent":["<template>\r\n <view class=\"page-wrapper\">\r\n <view class=\"top-section\">\r\n <view class=\"language-switch\">\r\n <button class=\"language-btn\" @click=\"toggleLanguage\">\r\n {{ currentLocale === 'zh-CN' ? 'EN' : '中文' }}\r\n </button>\r\n </view>\r\n </view>\r\n \r\n <view class=\"main-section\">\r\n <scroll-view direction=\"vertical\" class=\"user-center-container\">\r\n <view class=\"user-header\">\r\n <view class=\"user-info\">\r\n <image class=\"user-avatar\" :src=\"userAvatar\" mode=\"aspectFill\"></image>\r\n <view class=\"user-details\">\r\n <text class=\"user-name\">{{ profile != null && profile.username != null ? profile.username : '未命名用户' }}</text>\r\n <view class=\"edit-profile-link\" @click=\"navigateToProfile\">\r\n <text class=\"edit-text\">编辑资料</text>\r\n <text class=\"edit-icon\">✏️</text>\r\n </view>\r\n </view>\r\n </view>\r\n \r\n <view class=\"stats-container\">\r\n <view class=\"stat-item\">\r\n <text class=\"stat-value\">{{ userStats.trainings }}</text>\r\n <text class=\"stat-label\">训练</text>\r\n </view>\r\n <view class=\"stat-divider\"></view>\r\n <view class=\"stat-item\">\r\n <text class=\"stat-value\">{{ userStats.points }}</text>\r\n <text class=\"stat-label\">积分</text>\r\n </view>\r\n <view class=\"stat-divider\"></view>\r\n <view class=\"stat-item\">\r\n <text class=\"stat-value\">{{ userStats.streak }}</text>\r\n <text class=\"stat-label\">连续</text>\r\n </view>\r\n </view>\r\n </view>\r\n \r\n <view class=\"menu-sections\">\r\n <view class=\"menu-section\">\r\n <view class=\"section-header\">\r\n <text class=\"section-title\">设置</text>\r\n </view>\r\n \r\n <view class=\"section-items\">\r\n <view class=\"menu-item\" @click=\"navigateTo('/pages/settings/app')\">\r\n <view class=\"menu-icon app-settings\">⚙️</view>\r\n <text class=\"menu-text\">应用设置</text>\r\n <text class=\"menu-arrow\">></text>\r\n </view>\r\n \r\n <view class=\"menu-item\" @click=\"navigateTo('/pages/settings/about')\">\r\n <view class=\"menu-icon about\"></view>\r\n <text class=\"menu-text\">关于</text>\r\n <text class=\"menu-arrow\">></text>\r\n </view>\r\n \r\n <view class=\"menu-item\" @click=\"navigateTo('/pages/user/notifications')\">\r\n <view class=\"menu-icon notifications\">🔔</view>\r\n <text class=\"menu-text\">通知</text>\r\n <text class=\"menu-arrow\">></text>\r\n </view>\r\n </view>\r\n </view>\r\n </view>\r\n \r\n <button class=\"logout-button\" @click=\"showLogoutConfirm\">退出登录</button>\r\n </scroll-view>\r\n </view>\r\n </view>\r\n</template>\r\n\r\n<script setup lang=\"uts\">\r\nimport { ref } from 'vue'\r\nimport { onShow } from '@dcloudio/uni-app'\r\nimport { supabaseService } from '@/utils/supabaseService.uts'\r\n\r\ntype ProfileType = {\r\n id: string\r\n username: string | null\r\n email: string | null\r\n avatar_url: string | null\r\n}\r\n\r\ntype UserStatsType = {\r\n trainings: number\r\n points: number\r\n streak: number\r\n}\r\n\r\nconst profile = ref<ProfileType | null>(null)\r\nconst userStats = ref<UserStatsType>({\r\n trainings: 0,\r\n points: 0,\r\n streak: 0\r\n} as UserStatsType)\r\nconst currentLocale = ref<string>('zh-CN')\r\nconst userAvatar = ref<string>('/static/default-avatar.png')\r\n\r\nconst toggleLanguage = (): void => {\r\n if (currentLocale.value === 'zh-CN') {\r\n currentLocale.value = 'en-US'\r\n } else {\r\n currentLocale.value = 'zh-CN'\r\n }\r\n uni.showToast({\r\n title: '语言已切换',\r\n icon: 'success'\r\n })\r\n}\r\n\r\nconst loadProfile = async (): Promise<void> => {\r\n try {\r\n const res = await supabaseService.getUserProfile()\r\n if (res != null) {\r\n const profileData = res as UTSJSONObject\r\n const p: ProfileType = {\r\n id: profileData.getString('id') ?? '',\r\n username: profileData.getString('username'),\r\n email: profileData.getString('email'),\r\n avatar_url: profileData.getString('avatar_url')\r\n } as ProfileType\r\n profile.value = p\r\n \r\n if (p.avatar_url != null && p.avatar_url != '') {\r\n userAvatar.value = p.avatar_url\r\n }\r\n }\r\n } catch (e) {\r\n console.error('加载用户资料失败:', e)\r\n }\r\n}\r\n\r\nconst loadUserStats = (): void => {\r\n userStats.value = {\r\n trainings: 12,\r\n points: 480,\r\n streak: 5\r\n } as UserStatsType\r\n}\r\n\r\nconst navigateToProfile = (): void => {\r\n uni.navigateTo({\r\n url: '/pages/user/profile'\r\n })\r\n}\r\n\r\nconst navigateTo = (url: string): void => {\r\n const implementedPages: Array<string> = ['/pages/user/profile']\r\n let found = false\r\n for (let i: number = 0; i < implementedPages.length; i++) {\r\n if (implementedPages[i] == url) {\r\n found = true\r\n break\r\n }\r\n }\r\n \r\n if (found) {\r\n uni.navigateTo({ url: url })\r\n } else {\r\n uni.showToast({\r\n title: '功能开发中',\r\n icon: 'none'\r\n })\r\n }\r\n}\r\n\r\nconst handleLogout = (): void => {\r\n uni.removeStorageSync('userInfo')\r\n uni.removeStorageSync('user_id')\r\n uni.removeStorageSync('access_token')\r\n \r\n uni.showToast({\r\n title: '已退出登录',\r\n icon: 'success'\r\n })\r\n \r\n setTimeout(() => {\r\n uni.reLaunch({\r\n url: '/pages/user/login'\r\n })\r\n }, 1000)\r\n}\r\n\r\nconst showLogoutConfirm = (): void => {\r\n uni.showModal({\r\n title: '提示',\r\n content: '确定要退出登录吗?',\r\n success: (res) => {\r\n if (res.confirm) {\r\n handleLogout()\r\n }\r\n }\r\n })\r\n}\r\n\r\nonShow(() => {\r\n loadProfile()\r\n loadUserStats()\r\n})\r\n</script>\r\n\r\n<style>\r\n.page-wrapper {\r\n flex: 1;\r\n background-color: #f5f5f5;\r\n}\r\n\r\n.top-section {\r\n padding: 10px 15px;\r\n background-color: #fff;\r\n}\r\n\r\n.language-switch {\r\n display: flex;\r\n justify-content: flex-end;\r\n}\r\n\r\n.language-btn {\r\n font-size: 12px;\r\n padding: 5px 15px;\r\n background-color: #f0f0f0;\r\n border-radius: 15px;\r\n}\r\n\r\n.main-section {\r\n flex: 1;\r\n}\r\n\r\n.user-center-container {\r\n flex: 1;\r\n}\r\n\r\n.user-header {\r\n background-color: #fff;\r\n padding: 20px 15px;\r\n margin-bottom: 10px;\r\n}\r\n\r\n.user-info {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n}\r\n\r\n.user-avatar {\r\n width: 60px;\r\n height: 60px;\r\n border-radius: 30px;\r\n background-color: #eee;\r\n}\r\n\r\n.user-details {\r\n margin-left: 15px;\r\n flex: 1;\r\n}\r\n\r\n.user-name {\r\n font-size: 18px;\r\n font-weight: bold;\r\n color: #333;\r\n}\r\n\r\n.edit-profile-link {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n margin-top: 5px;\r\n}\r\n\r\n.edit-text {\r\n font-size: 12px;\r\n color: #007aff;\r\n}\r\n\r\n.edit-icon {\r\n font-size: 12px;\r\n margin-left: 5px;\r\n}\r\n\r\n.stats-container {\r\n display: flex;\r\n flex-direction: row;\r\n justify-content: space-around;\r\n margin-top: 20px;\r\n padding-top: 15px;\r\n border-top: 1px solid #eee;\r\n}\r\n\r\n.stat-item {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n}\r\n\r\n.stat-value {\r\n font-size: 20px;\r\n font-weight: bold;\r\n color: #333;\r\n}\r\n\r\n.stat-label {\r\n font-size: 12px;\r\n color: #999;\r\n margin-top: 5px;\r\n}\r\n\r\n.stat-divider {\r\n width: 1px;\r\n height: 30px;\r\n background-color: #eee;\r\n}\r\n\r\n.menu-sections {\r\n background-color: #fff;\r\n margin-bottom: 10px;\r\n}\r\n\r\n.menu-section {\r\n padding: 15px;\r\n}\r\n\r\n.section-header {\r\n margin-bottom: 10px;\r\n}\r\n\r\n.section-title {\r\n font-size: 14px;\r\n color: #999;\r\n}\r\n\r\n.section-items {\r\n background-color: #fff;\r\n}\r\n\r\n.menu-item {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n padding: 12px 0;\r\n border-bottom: 1px solid #f5f5f5;\r\n}\r\n\r\n.menu-item:last-child {\r\n border-bottom: none;\r\n}\r\n\r\n.menu-icon {\r\n width: 30px;\r\n font-size: 18px;\r\n}\r\n\r\n.menu-text {\r\n flex: 1;\r\n font-size: 14px;\r\n color: #333;\r\n}\r\n\r\n.menu-arrow {\r\n font-size: 14px;\r\n color: #ccc;\r\n}\r\n\r\n.logout-button {\r\n margin: 20px 15px;\r\n background-color: #ff4444;\r\n color: #fff;\r\n font-size: 16px;\r\n padding: 12px;\r\n border-radius: 8px;\r\n text-align: center;\r\n}\r\n</style>\r\n",null,null,null],"names":[],"mappings":"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"}