first commit

This commit is contained in:
何昌清
2026-03-26 22:13:03 +08:00
parent bbe1faa363
commit a2685f7f1e
51 changed files with 11244 additions and 0 deletions

View File

@@ -0,0 +1,429 @@
package repositories
import (
"Quincy_admin/schemas"
"fmt"
"time"
"github.com/jmoiron/sqlx"
)
type UserRepository struct {
db *sqlx.DB
}
func NewUserRepository(db *sqlx.DB) *UserRepository {
return &UserRepository{db: db}
}
// Create 创建用户
func (r *UserRepository) Create(user *schemas.CreateUser) error {
query := `
INSERT INTO admin_user (
rolecode, sessioncode, username, password, nickname,
email, avatar, status, register_time, last_login_time
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
`
now := time.Now()
_, err := r.db.Exec(query, user.RoleCode, user.SessionCode, user.Username, user.Password, user.Nickname, user.Email, user.Avatar, user.Status, now, now)
if err != nil {
return err
}
user.RegisterTime = schemas.NewCustomTime(&now)
user.LastLoginTime = schemas.NewCustomTime(&now)
return nil
}
// IsUserCodeExists 检查用户编码是否已存在
func (r *UserRepository) IsUserCodeExists(scode string) (int, error) {
var count int
query := `SELECT COUNT(*) FROM admin_user WHERE sessioncode = ?`
err := r.db.Get(&count, query, scode)
return count, err
}
// IsEmailExists 检查邮箱是否已存在
func (r *UserRepository) IsEmailExists(email string) (int, error) {
var count int
query := `SELECT COUNT(*) FROM admin_user WHERE email = ?`
err := r.db.Get(&count, query, email)
return count, err
}
// IsUsernameExists 检查用户名是否已存在
func (r *UserRepository) IsUsernameExists(username string) (int, error) {
var count int
query := `SELECT COUNT(*) FROM admin_user WHERE username = ?`
err := r.db.Get(&count, query, username)
return count, err
}
// UpdateLastLoginTime 更新用户最后登录时间
func (r *UserRepository) UpdateLastLoginTime(scode string, loginTime time.Time) error {
query := `UPDATE admin_user SET last_login_time = ? WHERE sessioncode = ?`
_, err := r.db.Exec(query, loginTime, scode)
return err
}
// FindByID 通过用户ID查找用户
func (r *UserRepository) FindByID(scode string) (*schemas.UserInfo, error) {
query := `
SELECT
tb1.id,
COALESCE(tb2.role_id, 0) AS rolecode,
tb1.sessioncode,
tb1.username,
tb1.password,
tb1.nickname,
tb1.email,
tb1.avatar,
tb1.status,
tb1.register_time,
tb1.last_login_time
FROM
admin_user tb1
LEFT JOIN admin_user_role tb2 ON tb1.id = tb2.user_id
WHERE
sessioncode = ?
AND tb1.STATUS != 0
ORDER BY
tb1.id
LIMIT 1;
`
user := &schemas.UserInfo{}
err := r.db.Get(user, query, scode)
if err != nil {
return nil, err
}
return user, nil
}
// FindByUsername 通过用户名查找用户
func (r *UserRepository) FindByUsername(username string) (*schemas.UserInfo, error) {
query := `
SELECT
tb1.id,
tb1.sessioncode,
COALESCE(tb2.role_id, 0) AS rolecode,
tb1.username,
tb1.password,
tb1.nickname,
tb1.email,
tb1.avatar,
tb1.status,
tb1.register_time,
tb1.last_login_time
FROM
admin_user tb1
LEFT JOIN admin_user_role tb2 ON tb1.id = tb2.user_id
WHERE
username = ?
ORDER BY
tb1.id DESC
LIMIT 1;
`
user := &schemas.UserInfo{}
err := r.db.Get(user, query, username)
if err != nil {
return nil, err
}
return user, nil
}
// Update 更新用户
func (r *UserRepository) Update(user *schemas.UpdateUser) (int, error) {
// 检查 sessioncode 是否为空
if user.ID == 0 {
return 0, fmt.Errorf("用户编码不能为空")
}
// 构建动态更新语句
setClause := ""
args := map[string]interface{}{
"id": user.ID,
}
if user.Password != "" && len(user.Password) > 0 {
setClause += "password=:password, "
args["password"] = user.Password
}
if user.Nickname != "" {
setClause += "nickname=:nickname, "
args["nickname"] = user.Nickname
}
if user.Email != "" {
setClause += "email=:email, "
args["email"] = user.Email
}
if user.Avatar != "" {
setClause += "avatar=:avatar, "
args["avatar"] = user.Avatar
}
// 如果没有要更新的字段,直接返回
if setClause == "" {
return user.ID, nil
}
// 构建完整查询语句
query := "UPDATE admin_user SET " + setClause[:len(setClause)-2] + " WHERE id=:id"
_, err := r.db.NamedExec(query, args)
if err != nil {
return user.ID, err
}
return user.ID, nil
}
// UpdateStatus 禁用用户
func (r *UserRepository) UpdateStatus(id int, status int) error {
query := `
UPDATE admin_user SET status = ? WHERE id = ?
`
_, err := r.db.Exec(query, status, id)
if err != nil {
return err
}
return nil
}
// UpdateRoleStatus 启用/禁用角色
func (r *UserRepository) UpdateRoleStatus(id int, status int) error {
query := `
UPDATE admin_role SET status = ? WHERE id = ?
`
_, err := r.db.Exec(query, status, id)
if err != nil {
return err
}
return nil
}
// GetUserList 用户列表
func (r *UserRepository) GetUserList(req *schemas.UserListRequest) ([]*schemas.UserInfo, int64, error) {
offset := (req.PageIndex - 1) * req.PageSize
// 查询总数
countQuery := `SELECT COUNT(*) FROM admin_user WHERE (nickname LIKE ? OR ? = '') AND (? IS NULL OR register_time >= ?) AND (? IS NULL OR register_time < ?)`
var total int64
err := r.db.QueryRow(countQuery, "%"+req.NickName+"%", req.NickName, req.StartDate, req.StartDate, req.EndDate, req.EndDate).Scan(&total)
if err != nil {
return nil, 0, err
}
// 查询列表 - 使用sqlx的Select方法直接映射到结构体切片
query := `
SELECT
tb1.id as id,
COALESCE(tb3.id, 0) AS rolecode,
COALESCE(tb3.name, '') AS rolename,
tb1.sessioncode as sessioncode,
tb1.username as username,
tb1.password as password,
tb1.nickname as nickname,
tb1.email as email,
tb1.avatar as avatar,
tb1.status as status,
tb1.register_time as register_time,
tb1.last_login_time as last_login_time
FROM
admin_user tb1
LEFT JOIN admin_user_role tb2 ON tb1.id = tb2.user_id
LEFT JOIN admin_role tb3 ON tb2.role_id = tb3.id
WHERE
(tb1.nickname LIKE ? OR ? = '')
AND (? IS NULL OR tb1.register_time >= ?)
AND (? IS NULL OR tb1.register_time < ?)
ORDER BY
id
LIMIT ? OFFSET ?
`
var users []*schemas.UserInfo
err = r.db.Select(&users, query, "%"+req.NickName+"%", req.NickName, req.StartDate, req.StartDate, req.EndDate, req.EndDate, req.PageSize, offset)
if err != nil {
return nil, 0, err
}
return users, total, nil
}
// GetRoleList 角色列表
func (r *UserRepository) GetRoleList(req *schemas.RoleListRequest) ([]*schemas.RoleResponseList, int64, error) {
offset := (req.PageIndex - 1) * req.PageSize
// 查询总数
countQuery := `SELECT COUNT(*) FROM admin_role WHERE (? IS NULL OR create_time >= ?) AND (? IS NULL OR create_time < ?)`
var total int64
err := r.db.QueryRow(countQuery, req.StartDate, req.StartDate, req.EndDate, req.EndDate).Scan(&total)
if err != nil {
return nil, 0, err
}
// 查询列表 - 使用sqlx的Select方法直接映射到结构体切片
query := `
SELECT
id, name, description, status, create_time
FROM admin_role
WHERE (? IS NULL OR create_time >= ?) AND (? IS NULL OR create_time < ?)
ORDER BY id
LIMIT ? OFFSET ?
`
var items []*schemas.RoleResponseList
err = r.db.Select(&items, query, req.StartDate, req.StartDate, req.EndDate, req.EndDate, req.PageSize, offset)
if err != nil {
return nil, 0, err
}
return items, total, nil
}
// RecordLoginLog 记录登录日志
func (r *UserRepository) RecordLoginLog(log *schemas.LoginLog) error {
query := `
INSERT INTO admin_login_logs (
user_id, username, ip_address, location, user_agent, login_time,
status, failure_reason, create_time
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
`
now := time.Now()
_, err := r.db.Exec(query,
log.UserID,
log.Username,
log.IPAddress,
log.Location,
log.UserAgent,
log.LoginTime,
log.Status,
log.FailureReason,
now,
)
if err != nil {
return err
}
return nil
}
// GetLoginLogList 获取登录日志列表
func (r *UserRepository) GetLoginLogList(req *schemas.LoginLogListRequest) ([]*schemas.LoginLog, int64, error) {
offset := (req.PageIndex - 1) * req.PageSize
// 查询总数
countQuery := `
SELECT COUNT(*) FROM admin_login_logs WHERE isdel = 0 AND (? IS NULL OR create_time >= ?) AND (? IS NULL OR create_time < ?)
`
var total int64
err := r.db.QueryRow(countQuery, req.StartDate.Time, req.StartDate.Time, req.EndDate.Time, req.EndDate.Time).Scan(&total)
if err != nil {
return nil, 0, err
}
query := `
SELECT
tb1.id, tb1.username, tb1.user_id, tb1.ip_address, tb1.user_agent, tb1.status, tb1.failure_reason, tb1.login_time
FROM
admin_login_logs tb1
WHERE
tb1.isdel = 0
AND (? IS NULL OR tb1.create_time >= ?)
AND (? IS NULL OR tb1.create_time < ?)
ORDER BY
id DESC
LIMIT ? OFFSET ?
`
var items []*schemas.LoginLog
err = r.db.Select(&items, query, req.StartDate.Time, req.StartDate.Time, req.EndDate.Time, req.EndDate.Time, req.PageSize, offset)
if err != nil {
return nil, 0, err
}
return items, total, nil
}
// AssignRoleExists 检查用户是否已分配角色
func (r *UserRepository) AssignRoleExists(userIdValue int) (bool, error) {
var count int
query := `SELECT COUNT(1) FROM admin_user_role WHERE user_id = ?`
err := r.db.Get(&count, query, userIdValue)
if err != nil {
return false, err
}
return count > 0, nil
}
// AssignRole 角色分配
func (r *UserRepository) AssignRole(userIdValue int, roleIdValue int) error {
query := `
INSERT INTO admin_user_role (user_id, role_id) VALUES (?, ?)
`
_, err := r.db.Exec(query, userIdValue, roleIdValue)
if err != nil {
return err
}
return nil
}
// UpdateAssignRole 更新角色分配
func (r *UserRepository) UpdateAssignRole(userIdValue int, roleIdValue int) error {
query := `
UPDATE admin_user_role SET Role_id = ? WHERE user_id = ?
`
_, err := r.db.Exec(query, roleIdValue, userIdValue)
if err != nil {
return err
}
return nil
}
// CreateRole 创建角色
func (r *UserRepository) CreateRole(req *schemas.CreateRole) error {
query := `
INSERT INTO admin_role (name, description) VALUES (?, ?)
`
_, err := r.db.Exec(query, req.Name, req.Description)
if err != nil {
return err
}
return nil
}
// UpdateRole 更新角色
func (r *UserRepository) UpdateRole(req *schemas.CreateRole) error {
query := `
UPDATE admin_role SET name = ?, description = ? WHERE id = ?
`
_, err := r.db.Exec(query, req.Name, req.Description, req.ID)
if err != nil {
return err
}
return nil
}