Files
arcticnewone/app/stores/user.ts
T
陈春 f4684f694e feat: 完成所有页面功能和用户认证系统
 新增功能:
- Work 和 News 页面实现筛选功能
- Contact 页面联系表单提交功能(加载状态、成功/失败反馈)
- Newsletter 订阅功能(邮箱验证、状态反馈)
- 移动端汉堡菜单功能(全屏菜单、动画效果)
- 用户登录/注册系统(支持账号/邮箱/手机号三合一)
- 用户状态管理(Pinia store + localStorage 持久化)
- 登录和注册弹窗组件(表单验证、错误提示)
- 用户头像和下拉菜单(桌面端和移动端)

🎨 优化改进:
- Footer 显示问题修复(多重备用机制)
- 联系信息更新(邮箱改为 chenchun@virtheart.com,手机改为微信)
- 完整的国际化支持(中英文双语)
- 响应式设计优化

🔧 技术实现:
- GSAP 动画系统
- 表单验证和反馈
- 状态持久化
- 自动生成用户头像

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 19:03:57 +08:00

122 lines
3.3 KiB
TypeScript

import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
export interface User {
id: string
name: string
email: string
avatar?: string
}
export const useUserStore = defineStore('user', () => {
const user = ref<User | null>(null)
const isAuthenticated = computed(() => user.value !== null)
// 登录
const login = async (account: string, password: string) => {
try {
// 模拟 API 调用 - 你需要替换为真实的登录 API
// const response = await $fetch('/api/auth/login', {
// method: 'POST',
// body: { account, password }
// })
// 模拟延迟
await new Promise(resolve => setTimeout(resolve, 1000))
// 判断账号类型并提取用户名
let username = account
if (account.includes('@')) {
// 邮箱:使用 @ 前面的部分
username = account.split('@')[0]
} else if (/^1[3-9]\d{9}$/.test(account)) {
// 手机号:使用后4位
username = 'User_' + account.slice(-4)
}
// 其他情况:直接使用账号作为用户名
// 模拟成功登录
user.value = {
id: '1',
name: username,
email: account.includes('@') ? account : `${account}@example.com`,
avatar: `https://ui-avatars.com/api/?name=${encodeURIComponent(username)}&background=000&color=fff&size=128`
}
// 保存到 localStorage
if (typeof window !== 'undefined') {
localStorage.setItem('user', JSON.stringify(user.value))
}
return { success: true }
} catch (error) {
console.error('Login error:', error)
return { success: false, error: 'Login failed' }
}
}
// 登出
const logout = () => {
user.value = null
if (typeof window !== 'undefined') {
localStorage.removeItem('user')
}
}
// 注册
const register = async (data: { username: string; email: string; phone?: string; password: string }) => {
try {
// 模拟 API 调用 - 你需要替换为真实的注册 API
// const response = await $fetch('/api/auth/register', {
// method: 'POST',
// body: data
// })
// 模拟延迟
await new Promise(resolve => setTimeout(resolve, 1000))
// 模拟成功注册并自动登录
user.value = {
id: Date.now().toString(),
name: data.username,
email: data.email,
avatar: `https://ui-avatars.com/api/?name=${encodeURIComponent(data.username)}&background=000&color=fff&size=128`
}
// 保存到 localStorage
if (typeof window !== 'undefined') {
localStorage.setItem('user', JSON.stringify(user.value))
}
return { success: true }
} catch (error) {
console.error('Register error:', error)
return { success: false, error: 'Registration failed' }
}
}
// 从 localStorage 恢复用户状态
const restoreUser = () => {
if (typeof window !== 'undefined') {
const savedUser = localStorage.getItem('user')
if (savedUser) {
try {
user.value = JSON.parse(savedUser)
} catch (error) {
console.error('Failed to restore user:', error)
localStorage.removeItem('user')
}
}
}
}
return {
user,
isAuthenticated,
login,
logout,
register,
restoreUser,
}
})