index.tsx 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. import { View, Text, Button, Image } from '@tarojs/components'
  2. import { useLoad, useDidShow } from '@tarojs/taro'
  3. import { useState } from 'react'
  4. import Taro from '@tarojs/taro'
  5. import { authManager, User } from '../../utils/auth'
  6. import './index.css'
  7. export default function Index() {
  8. const [user, setUser] = useState<User | null>(null)
  9. const [loading, setLoading] = useState(false)
  10. useLoad(() => {
  11. console.log('Index Page loaded.')
  12. checkLoginStatus()
  13. })
  14. useDidShow(() => {
  15. checkLoginStatus()
  16. })
  17. const checkLoginStatus = async () => {
  18. if (authManager.isLoggedIn()) {
  19. const userInfo = authManager.getUserInfo()
  20. setUser(userInfo)
  21. } else {
  22. setUser(null)
  23. }
  24. }
  25. const handleLogin = () => {
  26. Taro.navigateTo({ url: '/pages/login/index' })
  27. }
  28. const handleLogout = async () => {
  29. setLoading(true)
  30. try {
  31. await authManager.logout()
  32. setUser(null)
  33. Taro.showToast({
  34. title: '退出成功',
  35. icon: 'success'
  36. })
  37. } catch (error) {
  38. console.error('Logout error:', error)
  39. } finally {
  40. setLoading(false)
  41. }
  42. }
  43. const handleProfile = () => {
  44. Taro.navigateTo({ url: '/pages/profile/index' })
  45. }
  46. const goToRegister = () => {
  47. Taro.navigateTo({ url: '/pages/register/index' })
  48. }
  49. return (
  50. <View className="index-container">
  51. {user ? (
  52. <View className="user-welcome">
  53. <View className="user-card">
  54. <View className="user-header">
  55. <View className="user-avatar">
  56. <Image
  57. className="avatar-image"
  58. src={user.avatar || 'https://via.placeholder.com/160x160'}
  59. mode="aspectFill"
  60. />
  61. </View>
  62. <View className="user-greeting">
  63. <Text className="welcome-text">欢迎回来</Text>
  64. <Text className="username">{user.username}</Text>
  65. </View>
  66. </View>
  67. <View className="user-info">
  68. <View className="info-item">
  69. <Text className="info-label">用户ID</Text>
  70. <Text className="info-value">{user.id}</Text>
  71. </View>
  72. {user.email && (
  73. <View className="info-item">
  74. <Text className="info-label">邮箱</Text>
  75. <Text className="info-value">{user.email}</Text>
  76. </View>
  77. )}
  78. <View className="info-item">
  79. <Text className="info-label">注册时间</Text>
  80. <Text className="info-value">{new Date(user.createdAt).toLocaleDateString()}</Text>
  81. </View>
  82. </View>
  83. <View className="action-buttons">
  84. <Button className="action-button primary" type="primary" onClick={handleProfile}>
  85. 查看资料
  86. </Button>
  87. <Button
  88. className="action-button secondary"
  89. loading={loading}
  90. onClick={handleLogout}
  91. >
  92. 退出登录
  93. </Button>
  94. </View>
  95. </View>
  96. <View className="stats-section">
  97. <View className="stat-card">
  98. <Text className="stat-number">1</Text>
  99. <Text className="stat-label">今日访问</Text>
  100. </View>
  101. <View className="stat-card">
  102. <Text className="stat-number">7</Text>
  103. <Text className="stat-label">本周活跃</Text>
  104. </View>
  105. <View className="stat-card">
  106. <Text className="stat-number">30</Text>
  107. <Text className="stat-label">本月使用</Text>
  108. </View>
  109. </View>
  110. </View>
  111. ) : (
  112. <View className="login-prompt">
  113. <View className="welcome-header">
  114. <Image
  115. className="welcome-icon"
  116. src="https://via.placeholder.com/192x192/1890ff/ffffff?text=LOGO"
  117. mode="aspectFit"
  118. />
  119. <Text className="welcome-title">欢迎使用小程序</Text>
  120. <Text className="welcome-subtitle">请先登录以使用完整功能</Text>
  121. </View>
  122. <View className="login-card">
  123. <View className="login-buttons">
  124. <Button
  125. className="login-button primary"
  126. type="primary"
  127. onClick={handleLogin}
  128. >
  129. 立即登录
  130. </Button>
  131. <Button
  132. className="login-button secondary"
  133. plain
  134. onClick={goToRegister}
  135. >
  136. 注册新账号
  137. </Button>
  138. </View>
  139. </View>
  140. <View className="features-section">
  141. <Text className="features-title">功能特色</Text>
  142. <View className="features-grid">
  143. <View className="feature-card">
  144. <View className="feature-icon">🔒</View>
  145. <Text className="feature-title">安全认证</Text>
  146. <Text className="feature-desc">多重加密保护账户安全</Text>
  147. </View>
  148. <View className="feature-card">
  149. <View className="feature-icon">👤</View>
  150. <Text className="feature-title">用户管理</Text>
  151. <Text className="feature-desc">完整的用户信息管理</Text>
  152. </View>
  153. <View className="feature-card">
  154. <View className="feature-icon">📱</View>
  155. <Text className="feature-title">响应式设计</Text>
  156. <Text className="feature-desc">完美适配各种设备</Text>
  157. </View>
  158. <View className="feature-card">
  159. <View className="feature-icon">⚡</View>
  160. <Text className="feature-title">实时同步</Text>
  161. <Text className="feature-desc">数据实时更新同步</Text>
  162. </View>
  163. </View>
  164. </View>
  165. </View>
  166. )}
  167. </View>
  168. )
  169. }