完成
This commit is contained in:
293
golang-learning/10-projects/03-web-server/models/user.go
Normal file
293
golang-learning/10-projects/03-web-server/models/user.go
Normal file
@@ -0,0 +1,293 @@
|
||||
/*
|
||||
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:]
|
||||
}
|
Reference in New Issue
Block a user