294 lines
5.7 KiB
Go
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:]
|
|
}
|