first commit
This commit is contained in:
35
repositories/base_utils.go
Normal file
35
repositories/base_utils.go
Normal 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
|
||||
}
|
||||
54
repositories/com_repositories.go
Normal file
54
repositories/com_repositories.go
Normal 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
|
||||
}
|
||||
227
repositories/cron_repository.go
Normal file
227
repositories/cron_repository.go
Normal 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
|
||||
}
|
||||
303
repositories/pms_repository.go
Normal file
303
repositories/pms_repository.go
Normal 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
|
||||
}
|
||||
429
repositories/user_repositories.go
Normal file
429
repositories/user_repositories.go
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user