1 line
13 KiB
Plaintext
1 line
13 KiB
Plaintext
{"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/images/default-product.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":";;;;;;;;;;;;;;;AA8EA,OAAuB,0BAAmB,CAAjC,UAAA;;;+BA+GH,aAAA;;;;;;;;;;YA/FN,IAAM,UAAU,IAAI,cAAoB,IAAI;YAC5C,IAAM,YAAY,IAAI,eAIjB,cAHH,YAAW,CAAC,EACZ,SAAQ,CAAC,EACT,SAAQ,CAAC;YAEX,IAAM,gBAAgB,IAAI,MAAM,EAAE;YAClC,IAAM,aAAa,IAAI,MAAM,EAAE;YAE/B,IAAM,iBAAiB,OAAI,IAAI,CAAG;gBAChC,IAAI,cAAc,KAAK,CAAA,GAAA,CAAK,SAAS;oBACnC,cAAc,KAAK,GAAG;kBACjB,IAEN,CAFM;oBACL,cAAc,KAAK,GAAG;;+CAGtB,QAAO,SACP,OAAM;YAEV;YAEA,IAAM,cAAc,OAAU,WAAQ,IAAI,EAAI;gBAAA,OAAA,eAAA;wBAC5C,IAAI;4BACF,IAAM,MAAM,MAAM,gBAAgB,cAAc;4BAChD,IAAI,IAAG,EAAA,CAAI,IAAI,EAAE;gCACf,IAAM,cAAc,IAAG,EAAA,CAAI;gCAC3B,IAAM,GAAG,cAKJ,YAJH,KAAI,YAAY,SAAS,CAAC,MAAK,EAAA,CAAI,IACnC,WAAU,YAAY,SAAS,CAAC,aAChC,QAAO,YAAY,SAAS,CAAC,UAC7B,aAAY,YAAY,SAAS,CAAC;gCAEpC,QAAQ,KAAK,GAAG;gCAEhB,IAAI,EAAE,UAAU,CAAA,EAAA,CAAI,IAAI,CAAA,EAAA,CAAI,EAAE,UAAU,CAAA,EAAA,CAAI,IAAI;oCAC9C,WAAW,KAAK,GAAG,EAAE,UAAU;;;;yBAGnC,OAAO,cAAG;4BACV,QAAQ,KAAK,CAAC,aAAa,GAAA;;iBAE9B;YAAD;YAEA,IAAM,gBAAgB,OAAI,IAAI,CAAG;gBAC/B,UAAU,KAAK,GAIV,cAHH,YAAW,EAAE,EACb,SAAQ,GAAG,EACX,SAAQ,CAAC;YAEb;YAEA,IAAM,oBAAoB,OAAI,IAAI,CAAG;iDAEjC,MAAK;YAET;YAEA,IAAM,aAAa,IAAC,KAAK,MAAM,GAAG,IAAI,CAAG;gBACvC,IAAM,mBAAkC;oBAAC;iBAAsB,CAAA,GAAvC,SAAM,MAAM;gBACpC,IAAI,QAAQ,KAAK;oBACjB;oBAAK,IAAI,GAAG,MAAM,GAAG,CAAC;oBAAtB,MAAwB,EAAC,CAAA,CAAG,iBAAiB,MAAM;wBACjD,IAAI,gBAAgB,CAAC,EAAE,CAAA,EAAA,CAAI,KAAK;4BAC9B,QAAQ,IAAI;4BACZ,KAAK;;wBAH4C;;;gBAOrD,IAAI,OAAO;qDACQ,MAAK;kBACjB,IAKN,CALM;mDAEH,QAAO,SACP,OAAM;;YAGZ;YAEA,IAAM,eAAe,OAAI,IAAI,CAAG;sCACR;sCACA;sCACA;+CAGpB,QAAO,SACP,OAAM;gBAGR,WAAW,KAAK;iDAEZ,MAAK;gBAET;kBAAG,IAAI;YACT;YAEA,IAAM,oBAAoB,OAAI,IAAI,CAAG;gBAC/B,+BACF,QAAO,MACP,UAAS,aACT,UAAS,IAAC,IAAO;oBACf,IAAI,IAAI,OAAO,EAAE;wBACf;;gBAEJ;;YAEJ;YAEA,UAAO,KAAK;gBACV;gBACA;YACF;;;uBA1ME,IAwEO,QAAA,IAxED,WAAM,iBAAc;oBACxB,IAMO,QAAA,IAND,WAAM,gBAAa;wBACvB,IAIO,QAAA,IAJD,WAAM,oBAAiB;4BAC3B,IAES,UAAA,IAFD,WAAM,gBAAgB,aAAO,qBAChC,IAAA,cAAA,KAAa,CAAA,GAAA,CAAA,SAAA;gCAAA;4BAAA,EAAA,IAAA,CAAA;gCAAA;4BAAA;4BAAA,GAAA,CAAA;;;oBAKtB,IA8DO,QAAA,IA9DD,WAAM,iBAAc;wBACxB,IA4Dc,eAAA,IA5DD,eAAU,YAAW,WAAM;4BACtC,IA4BO,QAAA,IA5BD,WAAM,gBAAa;gCACvB,IASO,QAAA,IATD,WAAM,cAAW;oCACrB,IAAuE,SAAA,IAAhE,WAAM,eAAe,SAAK,WAAA,KAAU,EAAE,UAAK;;;oCAClD,IAMO,QAAA,IAND,WAAM,iBAAc;wCACxB,IAA6G,QAAA,IAAvG,WAAM,cAAW,IAAI,IAAA,QAAA,KAAO,CAAA,EAAA,CAAA,IAAA,CAAA,EAAA,CAAY,QAAA,KAAO,GAAC,QAAQ,CAAA,EAAA,CAAA,IAAA,EAAW;4CAAA,QAAA,KAAO,GAAC,QAAQ;wCAAR,EAAQ,IAAA,CAAA;4CAAA;wCAAA;wCAAA,GAAA,CAAA;wCACzF,IAGO,QAAA,IAHD,WAAM,qBAAqB,aAAO;4CACtC,IAAmC,QAAA,IAA7B,WAAM,cAAY;4CACxB,IAAiC,QAAA,IAA3B,WAAM,cAAY;;;;gCAK9B,IAeO,QAAA,IAfD,WAAM,oBAAiB;oCAC3B,IAGO,QAAA,IAHD,WAAM,cAAW;wCACrB,IAAyD,QAAA,IAAnD,WAAM,eAAY,IAAI,UAAA,KAAS,CAAC,SAAS,GAAA,CAAA;wCAC/C,IAAkC,QAAA,IAA5B,WAAM,eAAa;;oCAE3B,IAAkC,QAAA,IAA5B,WAAM;oCACZ,IAGO,QAAA,IAHD,WAAM,cAAW;wCACrB,IAAsD,QAAA,IAAhD,WAAM,eAAY,IAAI,UAAA,KAAS,CAAC,MAAM,GAAA,CAAA;wCAC5C,IAAkC,QAAA,IAA5B,WAAM,eAAa;;oCAE3B,IAAkC,QAAA,IAA5B,WAAM;oCACZ,IAGO,QAAA,IAHD,WAAM,cAAW;wCACrB,IAAsD,QAAA,IAAhD,WAAM,eAAY,IAAI,UAAA,KAAS,CAAC,MAAM,GAAA,CAAA;wCAC5C,IAAkC,QAAA,IAA5B,WAAM,eAAa;;;;4BAK/B,IA0BO,QAAA,IA1BD,WAAM,kBAAe;gCACzB,IAwBO,QAAA,IAxBD,WAAM,iBAAc;oCACxB,IAEO,QAAA,IAFD,WAAM,mBAAgB;wCAC1B,IAAqC,QAAA,IAA/B,WAAM,kBAAgB;;oCAG9B,IAkBO,QAAA,IAlBD,WAAM,kBAAe;wCACzB,IAIO,QAAA,IAJD,WAAM,aAAa,aAAK,KAAA;4CAAE,WAAU;wCAAA;;4CACxC,IAA8C,QAAA,IAAxC,WAAM,2BAAyB;4CACrC,IAAmC,QAAA,IAA7B,WAAM,cAAY;4CACxB,IAAiC,QAAA,IAA3B,WAAM,eAAa;;;;wCAG3B,IAIO,QAAA,IAJD,WAAM,aAAa,aAAK,KAAA;4CAAE,WAAU;wCAAA;;4CACxC,IAAuC,QAAA,IAAjC,WAAM,oBAAkB;4CAC9B,IAAiC,QAAA,IAA3B,WAAM,cAAY;4CACxB,IAAiC,QAAA,IAA3B,WAAM,eAAa;;;;wCAG3B,IAIO,QAAA,IAJD,WAAM,aAAa,aAAK,KAAA;4CAAE,WAAU;wCAAA;;4CACxC,IAA+C,QAAA,IAAzC,WAAM,4BAA0B;4CACtC,IAAiC,QAAA,IAA3B,WAAM,cAAY;4CACxB,IAAiC,QAAA,IAA3B,WAAM,eAAa;;;;;;;4BAMjC,IAAsE,UAAA,IAA9D,WAAM,iBAAiB,aAAO,oBAAmB"} |