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,35 @@
package repositories
import (
"fmt"
"time"
)
// FormatTimeFlexible 灵活格式化时间字符串
// 支持输入格式: "2006", "2006-01", "2006-01-02"
// 输出格式按照指定的格式进行输出
func (r *UserRepository) FormatTimeFlexible(timeStr string, outputFormat string) (string, error) {
// 修正:使用正确的格式模板
inputFormats := []string{
"2006-01-02", // 年-月-日(正确格式)
"2006-01", // 年-月
"2006", // 年
}
var parsedTime time.Time
var err error
// 尝试解析不同格式
for _, format := range inputFormats {
parsedTime, err = time.Parse(format, timeStr)
if err == nil {
break
}
}
if err != nil {
return "", fmt.Errorf("无法解析时间字符串 '%s'", timeStr)
}
return parsedTime.Format(outputFormat), nil
}

View File

@@ -0,0 +1,54 @@
package repositories
import (
"Quincy_admin/schemas"
"github.com/jmoiron/sqlx"
)
type CommonRepository struct {
db *sqlx.DB
}
func NewCommonRepository(db *sqlx.DB) *CommonRepository {
return &CommonRepository{db: db}
}
// GetLoginLogList 获取登录日志列表
func (r *CommonRepository) 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.location, 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
}

View File

@@ -0,0 +1,227 @@
// Package repositories/pms_repository.go
package repositories
import (
"Quincy_admin/schemas"
"fmt"
"time"
"github.com/jmoiron/sqlx"
)
type CronRepository struct {
db *sqlx.DB
}
func NewCronRepository(db *sqlx.DB) *CronRepository {
return &CronRepository{db: db}
}
// GetCronList 获取定时任务列表
func (r *CronRepository) GetCronList(req *schemas.CronListRequest) ([]*schemas.CronJob, int64, error) {
offset := (req.PageIndex - 1) * req.PageSize
// 查询总数
countQuery := `
SELECT COUNT(*) FROM admin_cron_jobs WHERE isdel = 0 AND (name LIKE ? OR ? = '') AND (? IS NULL OR create_time >= ?) AND (? IS NULL OR create_time < ?)
`
var total int64
err := r.db.QueryRow(countQuery, "%"+req.Name+"%", req.Name, 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.name, tb1.schedule, tb1.handler, tb1.enabled, tb1.description, tb1.create_time, tb1.update_time
FROM
admin_cron_jobs tb1
WHERE
tb1.isdel = 0
AND (tb1.name LIKE ? OR ? = '')
AND (? IS NULL OR tb1.create_time >= ?)
AND (? IS NULL OR tb1.create_time < ?)
ORDER BY
id
LIMIT ? OFFSET ?
`
var items []*schemas.CronJob
err = r.db.Select(&items, query, "%"+req.Name+"%", req.Name, 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
}
// AddCron 添加定时任务
func (r *CronRepository) AddCron(req *schemas.CronJobUpdateRequest) (int64, error) {
query := `
INSERT INTO admin_cron_jobs (
name, schedule, handler, description, create_time, update_time
) VALUES (?, ?, ?, ?, ?, ?)
`
now := time.Now()
result, err := r.db.Exec(query, req.Name, req.Schedule, req.Handler, req.Description, now, now)
if err != nil {
return 0, err
}
// 获取插入的 ID
id, err := result.LastInsertId()
if err != nil {
return 0, fmt.Errorf("failed to get last insert id: %w", err)
}
return id, nil
}
// UpdateCron 更新定时任务
func (r *CronRepository) UpdateCron(req *schemas.CronJobUpdateRequest) error {
// 构建动态更新语句
setClause := ""
args := map[string]interface{}{
"id": req.ID,
}
// 只有当字段非空时才添加到更新语句中
if req.Name != "" {
setClause += "name=:name, "
args["name"] = req.Name
}
if req.Schedule != "" {
setClause += "schedule=:schedule, "
args["schedule"] = req.Schedule
}
if req.Handler != "" {
setClause += "handler=:handler, "
args["handler"] = req.Handler
}
if req.Description != "" {
setClause += "description=:description, "
args["description"] = req.Description
}
// 如果没有要更新的字段,直接返回
if setClause == "" {
return fmt.Errorf("没有要更新的字段")
}
// 构建完整查询语句确保SET子句格式正确
query := fmt.Sprintf("UPDATE admin_cron_jobs SET %s WHERE id=:id", setClause[:len(setClause)-2])
_, err := r.db.NamedExec(query, args)
if err != nil {
return fmt.Errorf("SQL执行错误: %w", err)
}
return nil
}
// UpdateCronStatus 启用/停用定时任务
func (r *CronRepository) UpdateCronStatus(id int, enable int) error {
query := `
UPDATE admin_cron_jobs SET enabled = ?, update_time = ? WHERE id = ?
`
result, err := r.db.Exec(query, enable, time.Now(), id)
if err != nil {
return err
}
// 检查是否有行被影响,如果没有说明任务不存在
rowsAffected, err := result.RowsAffected()
if err != nil {
return err
}
if rowsAffected == 0 {
return fmt.Errorf("任务不存在")
}
return nil
}
// DeleteCron 删除定时任务
func (r *CronRepository) DeleteCron(id int) error {
query := `
UPDATE admin_cron_jobs SET isdel = 1, update_time = ? WHERE id = ?
`
result, err := r.db.Exec(query, time.Now(), id)
if err != nil {
return err
}
// 检查是否有行被影响,如果没有说明任务不存在
rowsAffected, err := result.RowsAffected()
if err != nil {
return err
}
if rowsAffected == 0 {
return fmt.Errorf("任务不存在")
}
return nil
}
// UpdateAllCronStatus 批量停用定时任务
func (r *CronRepository) UpdateAllCronStatus(enabled int) error {
query := `
UPDATE admin_cron_jobs SET enabled = ?, update_time = ? WHERE enabled != ? AND isdel = 0
`
_, err := r.db.Exec(query, enabled, time.Now(), enabled)
if err != nil {
return err
}
return nil
}
// GetCronLogList 获取定时任务日志列表
func (r *CronRepository) GetCronLogList(req *schemas.CronJobLogListRequest) ([]*schemas.CronJobLog, int64, error) {
offset := (req.PageIndex - 1) * req.PageSize
// 查询总数
countQuery := `
SELECT COUNT(*) FROM admin_cron_job_logs tb1
LEFT JOIN admin_cron_jobs tb2 ON tb1.job_id = tb2.id
WHERE tb1.job_id = ?
AND (? IS NULL OR DATE(tb1.start_time) = DATE(?))
`
var total int64
err := r.db.QueryRow(countQuery, req.Id, req.StartDate, req.StartDate).Scan(&total)
if err != nil {
return nil, 0, err
}
// 主查询
query := `
SELECT
tb1.id, tb2.name AS name, tb1.job_id, tb2.handler, tb2.schedule, tb1.status AS status, tb1.start_time
FROM
admin_cron_job_logs tb1
LEFT JOIN admin_cron_jobs tb2 ON tb1.job_id = tb2.id
WHERE tb1.job_id = ?
AND (? IS NULL OR DATE(tb1.start_time) = DATE(?))
ORDER BY id DESC
LIMIT ? OFFSET ?
`
var items []*schemas.CronJobLog
err = r.db.Select(&items, query, req.Id, req.StartDate, req.StartDate, req.PageSize, offset)
if err != nil {
return nil, 0, err
}
return items, total, nil
}

View File

@@ -0,0 +1,303 @@
// Package repositories/pms_repository.go
package repositories
import (
"Quincy_admin/schemas"
"database/sql"
"errors"
"fmt"
"strings"
"github.com/jmoiron/sqlx"
)
type PermissionRepository struct {
db *sqlx.DB
}
func NewPermissionRepository(db *sqlx.DB) *PermissionRepository {
return &PermissionRepository{db: db}
}
// GetRoleIDByCode 根据scode获取权限角色 ID
func (r *PermissionRepository) GetRoleIDByCode(scode string) (int, error) {
query := `
SELECT
COALESCE(tb2.role_id, 0) AS rolecode
FROM
admin_user tb1
LEFT JOIN admin_user_role tb2 ON tb1.id = tb2.user_id
WHERE
tb1.STATUS != 0
AND tb1.sessioncode = ?
ORDER BY
id
LIMIT 1
`
var rolecode int
err := r.db.QueryRow(query, scode).Scan(&rolecode)
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
return 0, nil
}
return 0, err
}
return rolecode, nil
}
// GetRoutesByID 获取侧边栏菜单权限
func (r *PermissionRepository) GetRoutesByID(roleID int) ([]*schemas.MenuItems, error) {
query := `
SELECT
m.id,
m.parent_id,
m.title,
m.path,
m.component,
m.icon,
m.sort,
m.visible,
m.status
FROM admin_menu m
INNER JOIN admin_role_menu arm ON m.id = arm.menu_id
WHERE arm.role_id = ?
AND m.status = 1
AND m.visible = 1
ORDER BY m.parent_id, m.sort
`
var menuItems []*schemas.MenuItems
err := r.db.Select(&menuItems, query, roleID)
if err != nil {
return nil, err
}
return menuItems, nil
}
// GetRoutes 获取路由权限
func (r *PermissionRepository) GetRoutes() ([]*schemas.MenuItems, error) {
query := `
SELECT
m.id,
m.parent_id,
m.title,
m.path,
m.component,
m.icon,
m.sort,
m.visible,
m.status
FROM admin_menu m
WHERE m.status = 1
AND m.visible = 1
ORDER BY m.parent_id, m.sort
`
var menuItems []*schemas.MenuItems
err := r.db.Select(&menuItems, query)
if err != nil {
return nil, err
}
return menuItems, nil
}
// GetMenuList 获取菜单列表
func (r *PermissionRepository) GetMenuList(page, pageSize int) ([]*schemas.MenuItems, int64, error) {
offset := (page - 1) * pageSize
// 查询总数
countQuery := `SELECT COUNT(*) FROM admin_menu`
var total int64
err := r.db.QueryRow(countQuery).Scan(&total)
if err != nil {
return nil, 0, err
}
query := `
SELECT
m.id,
m.parent_id,
m.title,
m.path,
m.component,
m.icon,
m.sort,
m.visible,
m.status,
m.create_time
FROM admin_menu m
ORDER BY m.parent_id, m.sort
LIMIT ? OFFSET ?
`
var menuItems []*schemas.MenuItems
err = r.db.Select(&menuItems, query, pageSize, offset)
if err != nil {
return nil, 0, err
}
return menuItems, total, nil
}
// UpdateMenuStatus 启用/停用菜单
func (r *PermissionRepository) UpdateMenuStatus(id int, status int) error {
query := `
UPDATE admin_menu SET status = ? WHERE id = ?
`
result, err := r.db.Exec(query, status, id)
if err != nil {
return err
}
// 检查是否有行被影响,如果没有说明数据不存在
rowsAffected, err := result.RowsAffected()
if err != nil {
return err
}
if rowsAffected == 0 {
return fmt.Errorf("数据不存在")
}
return nil
}
// GetPermission 获取权限信息
func (r *PermissionRepository) GetPermission(roleID int, typeStr string) (*[]string, error) {
query := `
SELECT
tb2.name
FROM
admin_role_permission tb1
JOIN admin_permission tb2 ON tb1.permission_id = tb2.id
WHERE
tb1.role_id = ?
AND (? = 'all' OR tb2.type = ?)
AND tb2.status != 0
`
var permissionNames []string
err := r.db.Select(&permissionNames, query, roleID, typeStr, typeStr)
if err != nil {
return nil, err
}
return &permissionNames, nil
}
func (r *PermissionRepository) GetRolePermission(roleID int, typeStr string) (*[]int, error) {
query := `
SELECT
tb2.id
FROM
admin_role_permission tb1
JOIN admin_permission tb2 ON tb1.permission_id = tb2.id
WHERE
tb1.role_id = ?
AND (? = 'all' OR tb2.type = ?)
AND tb2.status != 0
`
var permissionID []int
err := r.db.Select(&permissionID, query, roleID, typeStr, typeStr)
if err != nil {
return nil, err
}
return &permissionID, nil
}
// GetAllPermission 获取全部权限信息
func (r *PermissionRepository) GetAllPermission(typeStr string) (*[]string, error) {
query := `
SELECT
tb1.name
FROM
admin_permission tb1
WHERE (? = 'all' OR tb1.type = ?)
AND tb1.status != 0
`
var permissionNames []string
err := r.db.Select(&permissionNames, query, typeStr, typeStr)
if err != nil {
return nil, err
}
return &permissionNames, nil
}
// GetAllNewPermission 获取全部权限信息
func (r *PermissionRepository) GetAllNewPermission() ([]*schemas.PermissionItems, error) {
query := `
SELECT
id, name, title, path, type, module, action, parent_id, sort, status
FROM admin_permission
WHERE status = 1
ORDER BY parent_id, sort
`
var PermissionItems []*schemas.PermissionItems
err := r.db.Select(&PermissionItems, query)
if err != nil {
return nil, err
}
return PermissionItems, nil
}
// GetRolePermissionIDs 获取角色已有的权限ID列表
func (r *PermissionRepository) GetRolePermissionIDs(roleID int) ([]int, error) {
query := `
SELECT permission_id
FROM admin_role_permission
WHERE role_id = ?
`
var permissionIDs []int
err := r.db.Select(&permissionIDs, query, roleID)
return permissionIDs, err
}
// InsertRolePermissions 批量插入角色权限关联
func (r *PermissionRepository) InsertRolePermissions(roleID int, permissionIDs []int) error {
if len(permissionIDs) == 0 {
return nil
}
// 构造批量插入SQL
query := `
INSERT INTO admin_role_permission (role_id, permission_id)
VALUES (?, ?)
`
// 批量插入
for _, permID := range permissionIDs {
_, err := r.db.Exec(query, roleID, permID)
if err != nil {
return err
}
}
return nil
}
// DeleteRolePermissions 批量删除角色权限关联
func (r *PermissionRepository) DeleteRolePermissions(roleID int, permissionIDs []int) error {
if len(permissionIDs) == 0 {
return nil
}
// 构造IN查询的占位符
placeholders := make([]string, len(permissionIDs))
args := make([]interface{}, 0, len(permissionIDs)+1)
args = append(args, roleID) // role_id
for i, permID := range permissionIDs {
placeholders[i] = "?"
args = append(args, permID)
}
query := "DELETE FROM admin_role_permission WHERE role_id = ? AND permission_id IN (" +
strings.Join(placeholders, ",") + ")"
_, err := r.db.Exec(query, args...)
return err
}

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
}