Files
golang/golang-learning/10-projects/03-web-server/models/user.go
2025-08-24 13:01:09 +08:00

294 lines
5.7 KiB
Go

/*
user.go - 用户数据模型
定义了用户的数据结构和相关操作
*/
package models
import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
"strings"
"time"
)
// User 用户结构体
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email"`
Age int `json:"age"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
// UserStorage 用户存储
type UserStorage struct {
users []User
nextID int
filePath string
}
var storage *UserStorage
// init 初始化用户存储
func init() {
storage = &UserStorage{
users: make([]User, 0),
nextID: 1,
filePath: "data/users.json",
}
// 创建数据目录
os.MkdirAll("data", 0755)
// 加载现有数据
storage.load()
}
// Validate 验证用户数据
func (u *User) Validate() error {
if strings.TrimSpace(u.Name) == "" {
return fmt.Errorf("用户名不能为空")
}
if len(u.Name) > 50 {
return fmt.Errorf("用户名长度不能超过50个字符")
}
if strings.TrimSpace(u.Email) == "" {
return fmt.Errorf("邮箱不能为空")
}
if !isValidEmail(u.Email) {
return fmt.Errorf("邮箱格式无效")
}
if u.Age < 0 || u.Age > 150 {
return fmt.Errorf("年龄必须在0-150之间")
}
return nil
}
// isValidEmail 简单的邮箱格式验证
func isValidEmail(email string) bool {
return strings.Contains(email, "@") && strings.Contains(email, ".")
}
// GetAllUsers 获取所有用户
func GetAllUsers() ([]User, error) {
return storage.users, nil
}
// GetUserByID 根据ID获取用户
func GetUserByID(id int) (*User, error) {
for _, user := range storage.users {
if user.ID == id {
return &user, nil
}
}
return nil, fmt.Errorf("用户不存在")
}
// CreateUser 创建新用户
func CreateUser(user User) (*User, error) {
// 检查邮箱是否已存在
for _, existingUser := range storage.users {
if existingUser.Email == user.Email {
return nil, fmt.Errorf("邮箱已存在")
}
}
// 设置用户信息
user.ID = storage.nextID
user.CreatedAt = time.Now()
user.UpdatedAt = time.Now()
// 添加到存储
storage.users = append(storage.users, user)
storage.nextID++
// 保存到文件
if err := storage.save(); err != nil {
return nil, err
}
return &user, nil
}
// UpdateUser 更新用户信息
func UpdateUser(user User) (*User, error) {
// 查找用户
for i, existingUser := range storage.users {
if existingUser.ID == user.ID {
// 检查邮箱是否被其他用户使用
for _, otherUser := range storage.users {
if otherUser.ID != user.ID && otherUser.Email == user.Email {
return nil, fmt.Errorf("邮箱已被其他用户使用")
}
}
// 保留创建时间,更新其他信息
user.CreatedAt = existingUser.CreatedAt
user.UpdatedAt = time.Now()
// 更新用户
storage.users[i] = user
// 保存到文件
if err := storage.save(); err != nil {
return nil, err
}
return &user, nil
}
}
return nil, fmt.Errorf("用户不存在")
}
// DeleteUser 删除用户
func DeleteUser(id int) error {
// 查找并删除用户
for i, user := range storage.users {
if user.ID == id {
// 从切片中删除用户
storage.users = append(storage.users[:i], storage.users[i+1:]...)
// 保存到文件
return storage.save()
}
}
return fmt.Errorf("用户不存在")
}
// load 从文件加载用户数据
func (s *UserStorage) load() error {
// 检查文件是否存在
if _, err := os.Stat(s.filePath); os.IsNotExist(err) {
// 文件不存在,创建示例数据
s.createSampleData()
return s.save()
}
// 读取文件
data, err := ioutil.ReadFile(s.filePath)
if err != nil {
return err
}
// 解析JSON
if err := json.Unmarshal(data, &s.users); err != nil {
return err
}
// 更新下一个ID
maxID := 0
for _, user := range s.users {
if user.ID > maxID {
maxID = user.ID
}
}
s.nextID = maxID + 1
return nil
}
// save 保存用户数据到文件
func (s *UserStorage) save() error {
data, err := json.MarshalIndent(s.users, "", " ")
if err != nil {
return err
}
return ioutil.WriteFile(s.filePath, data, 0644)
}
// createSampleData 创建示例数据
func (s *UserStorage) createSampleData() {
now := time.Now()
sampleUsers := []User{
{
ID: 1,
Name: "张三",
Email: "zhangsan@example.com",
Age: 25,
CreatedAt: now,
UpdatedAt: now,
},
{
ID: 2,
Name: "李四",
Email: "lisi@example.com",
Age: 30,
CreatedAt: now,
UpdatedAt: now,
},
{
ID: 3,
Name: "王五",
Email: "wangwu@example.com",
Age: 28,
CreatedAt: now,
UpdatedAt: now,
},
}
s.users = sampleUsers
s.nextID = 4
}
// GetUserCount 获取用户总数
func GetUserCount() int {
return len(storage.users)
}
// SearchUsers 搜索用户
func SearchUsers(keyword string) []User {
var results []User
keyword = strings.ToLower(keyword)
for _, user := range storage.users {
if strings.Contains(strings.ToLower(user.Name), keyword) ||
strings.Contains(strings.ToLower(user.Email), keyword) {
results = append(results, user)
}
}
return results
}
// GetUsersByAge 根据年龄范围获取用户
func GetUsersByAge(minAge, maxAge int) []User {
var results []User
for _, user := range storage.users {
if user.Age >= minAge && user.Age <= maxAge {
results = append(results, user)
}
}
return results
}
// GetRecentUsers 获取最近创建的用户
func GetRecentUsers(limit int) []User {
if limit <= 0 || limit > len(storage.users) {
limit = len(storage.users)
}
// 简单实现:返回最后创建的用户
// 实际应用中应该按创建时间排序
start := len(storage.users) - limit
if start < 0 {
start = 0
}
return storage.users[start:]
}