You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
3.7 KiB
165 lines
3.7 KiB
package db
|
|
|
|
import (
|
|
"database/sql"
|
|
"time"
|
|
)
|
|
|
|
// CreateUserTable 创建用户表
|
|
func CreateUserTable(db *sql.DB) error {
|
|
createTableSQL := `
|
|
CREATE TABLE IF NOT EXISTS sc_user (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
username VARCHAR(50) NOT NULL UNIQUE,
|
|
email VARCHAR(100) NOT NULL UNIQUE,
|
|
password_hash VARCHAR(255) NOT NULL,
|
|
role VARCHAR(20) NOT NULL DEFAULT 'user',
|
|
status VARCHAR(20) NOT NULL DEFAULT 'active',
|
|
created_at DATETIME NOT NULL,
|
|
updated_at DATETIME NOT NULL,
|
|
last_login DATETIME
|
|
);`
|
|
|
|
_, err := db.Exec(createTableSQL)
|
|
return err
|
|
}
|
|
|
|
// AddUser 添加新用户
|
|
func AddUser(user User) (*User, error) {
|
|
// 使用全局数据库连接
|
|
conn := GetSqliteDB()
|
|
if conn == nil {
|
|
return nil, ErrDbNotInit
|
|
}
|
|
|
|
insertSQL := `
|
|
INSERT INTO sc_user (username, email, password_hash, role, status, created_at, updated_at, last_login)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
`
|
|
|
|
result, err := conn.Exec(insertSQL,
|
|
user.Username, user.Email, user.PasswordHash, user.Role,
|
|
user.Status, user.CreatedAt, user.UpdatedAt, user.LastLogin,
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// 获取插入的ID
|
|
id, err := result.LastInsertId()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// 设置ID并返回
|
|
user.ID = int(id)
|
|
return &user, nil
|
|
}
|
|
|
|
// GetUserByUsername 根据用户名获取用户
|
|
func GetUserByUsername(username string) (*User, error) {
|
|
conn := GetSqliteDB()
|
|
if conn == nil {
|
|
return nil, ErrDbNotInit
|
|
}
|
|
|
|
querySQL := `
|
|
SELECT id, username, email, password_hash, role, status, created_at, updated_at, last_login
|
|
FROM sc_user WHERE username = ?
|
|
`
|
|
|
|
var user User
|
|
err := conn.QueryRow(querySQL, username).Scan(
|
|
&user.ID, &user.Username, &user.Email, &user.PasswordHash,
|
|
&user.Role, &user.Status, &user.CreatedAt, &user.UpdatedAt, &user.LastLogin,
|
|
)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &user, nil
|
|
}
|
|
|
|
// GetUserByEmail 根据邮箱获取用户
|
|
func GetUserByEmail(email string) (*User, error) {
|
|
conn := GetSqliteDB()
|
|
if conn == nil {
|
|
return nil, ErrDbNotInit
|
|
}
|
|
|
|
querySQL := `
|
|
SELECT id, username, email, password_hash, role, status, created_at, updated_at, last_login
|
|
FROM sc_user WHERE email = ?
|
|
`
|
|
|
|
var user User
|
|
err := conn.QueryRow(querySQL, email).Scan(
|
|
&user.ID, &user.Username, &user.Email, &user.PasswordHash,
|
|
&user.Role, &user.Status, &user.CreatedAt, &user.UpdatedAt, &user.LastLogin,
|
|
)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &user, nil
|
|
}
|
|
|
|
// CheckUsernameExists 检查用户名是否存在
|
|
func CheckUsernameExists(username string) (bool, error) {
|
|
conn := GetSqliteDB()
|
|
if conn == nil {
|
|
return false, ErrDbNotInit
|
|
}
|
|
|
|
querySQL := "SELECT COUNT(*) FROM sc_user WHERE username = ?"
|
|
var count int
|
|
err := conn.QueryRow(querySQL, username).Scan(&count)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
return count > 0, nil
|
|
}
|
|
|
|
// CheckEmailExists 检查邮箱是否存在
|
|
func CheckEmailExists(email string) (bool, error) {
|
|
conn := GetSqliteDB()
|
|
if conn == nil {
|
|
return false, ErrDbNotInit
|
|
}
|
|
|
|
querySQL := "SELECT COUNT(*) FROM sc_user WHERE email = ?"
|
|
var count int
|
|
err := conn.QueryRow(querySQL, email).Scan(&count)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
return count > 0, nil
|
|
}
|
|
|
|
// UpdateUserPassword 更新用户密码
|
|
func UpdateUserPassword(userID int, passwordHash string, updatedAt time.Time) error {
|
|
conn := GetSqliteDB()
|
|
if conn == nil {
|
|
return ErrDbNotInit
|
|
}
|
|
|
|
updateSQL := "UPDATE sc_user SET password_hash = ?, updated_at = ? WHERE id = ?"
|
|
_, err := conn.Exec(updateSQL, passwordHash, updatedAt, userID)
|
|
return err
|
|
}
|
|
|
|
// UpdateUserLastLogin 更新用户最后登录时间
|
|
func UpdateUserLastLogin(userID int) error {
|
|
conn := GetSqliteDB()
|
|
if conn == nil {
|
|
return ErrDbNotInit
|
|
}
|
|
|
|
updateSQL := "UPDATE sc_user SET last_login = ? WHERE id = ?"
|
|
_, err := conn.Exec(updateSQL, time.Now(), userID)
|
|
return err
|
|
}
|
|
|