初始化

This commit is contained in:
2026-07-03 15:58:29 +08:00
parent 3a942c882e
commit dc90e889e1
77 changed files with 12912 additions and 0 deletions

View File

@@ -0,0 +1,72 @@
package repository
import (
"seeyon-filesystem/config"
"seeyon-filesystem/model"
)
// DepartmentRepository 部门数据访问
type DepartmentRepository struct{}
func NewDepartmentRepository() *DepartmentRepository {
return &DepartmentRepository{}
}
// Create 创建部门
func (r *DepartmentRepository) Create(dept *model.Department) error {
return config.DB.Create(dept).Error
}
// FindByID 根据ID查找部门
func (r *DepartmentRepository) FindByID(id uint64) (*model.Department, error) {
var dept model.Department
err := config.DB.First(&dept, id).Error
if err != nil {
return nil, err
}
return &dept, nil
}
// List 查询所有部门
func (r *DepartmentRepository) List() ([]model.Department, error) {
var depts []model.Department
err := config.DB.Order("sort_order ASC, id ASC").Find(&depts).Error
return depts, err
}
// ListByParent 查询子部门
func (r *DepartmentRepository) ListByParent(parentID uint64) ([]model.Department, error) {
var depts []model.Department
err := config.DB.Where("parent_id = ?", parentID).Order("sort_order ASC, id ASC").Find(&depts).Error
return depts, err
}
// Update 更新部门
func (r *DepartmentRepository) Update(dept *model.Department) error {
return config.DB.Save(dept).Error
}
// Delete 删除部门
func (r *DepartmentRepository) Delete(id uint64) error {
// 检查是否有子部门
var count int64
config.DB.Model(&model.Department{}).Where("parent_id = ?", id).Count(&count)
if count > 0 {
return nil // 有子部门不允许删除, 由service层处理错误
}
return config.DB.Delete(&model.Department{}, id).Error
}
// HasChildren 检查是否有子部门
func (r *DepartmentRepository) HasChildren(id uint64) (bool, error) {
var count int64
err := config.DB.Model(&model.Department{}).Where("parent_id = ?", id).Count(&count).Error
return count > 0, err
}
// CountUsers 统计部门下的用户数
func (r *DepartmentRepository) CountUsers(deptID uint64) (int64, error) {
var count int64
err := config.DB.Model(&model.User{}).Where("dept_id = ?", deptID).Count(&count).Error
return count, err
}

View File

@@ -0,0 +1,288 @@
package repository
import (
"seeyon-filesystem/config"
"seeyon-filesystem/model"
)
// FileRepository 文件数据访问
type FileRepository struct{}
// NewFileRepository 创建文件Repository实例
func NewFileRepository() *FileRepository {
return &FileRepository{}
}
// Create 创建文件记录
func (r *FileRepository) Create(file *model.File) error {
return config.DB.Create(file).Error
}
// FindByID 根据ID查找文件
func (r *FileRepository) FindByID(id uint64) (*model.File, error) {
var file model.File
err := config.DB.First(&file, id).Error
if err != nil {
return nil, err
}
return &file, nil
}
// FindByMD5 根据MD5查找文件(用于秒传)
func (r *FileRepository) FindByMD5(md5 string) (*model.File, error) {
var file model.File
err := config.DB.Where("md5 = ? AND status = 1", md5).First(&file).Error
if err != nil {
return nil, err
}
return &file, nil
}
// ListByFolder 查询文件夹下的文件列表(基于权限)
// 使用 LEFT JOIN 一次性查出, 避免子查询
func (r *FileRepository) ListByFolder(folderID uint64, userID uint64, roleIDs []uint64) ([]model.File, error) {
var files []model.File
// 构建权限条件: 自己的 OR 直接授权 OR 角色授权
permCond := "f.owner_id = ?"
args := []interface{}{userID}
// 直接授权
permCond += " OR fp_user.user_id = ?"
args = append(args, userID)
// 角色授权
if len(roleIDs) > 0 {
permCond += " OR fp_role.role_id IN ?"
args = append(args, roleIDs)
}
query := config.DB.Table("fs_file f").
Select("DISTINCT f.*").
Joins("LEFT JOIN fs_file_permission fp_user ON fp_user.file_id = f.id AND fp_user.user_id = ?", userID)
if len(roleIDs) > 0 {
query = query.Joins("LEFT JOIN fs_file_permission fp_role ON fp_role.file_id = f.id AND fp_role.role_id IN ?", roleIDs)
}
query = query.Where("f.folder_id = ? AND f.status = 1 AND ("+permCond+")", append([]interface{}{folderID}, args...)...).
Order("f.name ASC")
err := query.Find(&files).Error
return files, err
}
// ListByOwner 查询用户的所有文件(仅自己的)
func (r *FileRepository) ListByOwner(ownerID uint64) ([]model.File, error) {
var files []model.File
err := config.DB.Where("owner_id = ? AND status = 1", ownerID).
Order("created_at DESC").Find(&files).Error
return files, err
}
// SearchByName 按文件名搜索(基于权限, 使用JOIN优化)
func (r *FileRepository) SearchByName(userID uint64, roleIDs []uint64, keyword string) ([]model.File, error) {
var files []model.File
// 权限条件
permCond := "f.owner_id = ? OR fp_user.user_id = ?"
args := []interface{}{userID, userID}
if len(roleIDs) > 0 {
permCond += " OR fp_role.role_id IN ?"
args = append(args, roleIDs)
}
query := config.DB.Table("fs_file f").
Select("DISTINCT f.*").
Joins("LEFT JOIN fs_file_permission fp_user ON fp_user.file_id = f.id AND fp_user.user_id = ?", userID)
if len(roleIDs) > 0 {
query = query.Joins("LEFT JOIN fs_file_permission fp_role ON fp_role.file_id = f.id AND fp_role.role_id IN ?", roleIDs)
}
query = query.Where("f.status = 1 AND ("+permCond+")", args...)
// 多关键词: 用|分隔, OR匹配
if keyword != "" {
keywords := splitKeywords(keyword)
if len(keywords) > 1 {
conditions := make([]string, 0, len(keywords))
args := make([]interface{}, 0, len(keywords))
for _, kw := range keywords {
conditions = append(conditions, "name LIKE ?")
args = append(args, "%"+kw+"%")
}
query = query.Where("("+joinStrings(conditions, " OR ")+")", args...)
} else {
query = query.Where("name LIKE ?", "%"+keywords[0]+"%")
}
}
err := query.Order("created_at DESC").Limit(200).Find(&files).Error
return files, err
}
// SearchByType 按文件类型搜索
func (r *FileRepository) SearchByType(ownerID uint64, extensions []string) ([]model.File, error) {
var files []model.File
err := config.DB.Where("owner_id = ? AND status = 1 AND extension IN ?", ownerID, extensions).
Order("created_at DESC").Limit(200).Find(&files).Error
return files, err
}
// SearchByPolicy 按存储策略搜索(管理员用)
func (r *FileRepository) SearchByPolicy(policyID uint64) ([]model.File, error) {
var files []model.File
err := config.DB.Where("storage_policy_id = ? AND status = 1", policyID).
Order("created_at DESC").Limit(500).Find(&files).Error
return files, err
}
func splitKeywords(s string) []string {
var result []string
for _, kw := range splitByChar(s, '|') {
kw = trimSpace(kw)
if kw != "" {
result = append(result, kw)
}
}
if len(result) == 0 {
result = []string{s}
}
return result
}
func splitByChar(s string, sep byte) []string {
var result []string
start := 0
for i := 0; i < len(s); i++ {
if s[i] == sep {
result = append(result, s[start:i])
start = i + 1
}
}
result = append(result, s[start:])
return result
}
func trimSpace(s string) string {
start, end := 0, len(s)
for start < end && s[start] == ' ' {
start++
}
for end > start && s[end-1] == ' ' {
end--
}
return s[start:end]
}
func joinStrings(strs []string, sep string) string {
if len(strs) == 0 {
return ""
}
result := strs[0]
for i := 1; i < len(strs); i++ {
result += sep + strs[i]
}
return result
}
// ListTrashed 查询回收站文件
func (r *FileRepository) ListTrashed(ownerID uint64) ([]model.File, error) {
var files []model.File
err := config.DB.Where("owner_id = ? AND status = 0", ownerID).
Order("updated_at DESC").Find(&files).Error
return files, err
}
// Update 更新文件信息
func (r *FileRepository) Update(file *model.File) error {
return config.DB.Save(file).Error
}
// SoftDelete 软删除(移入回收站)
func (r *FileRepository) SoftDelete(id uint64) error {
return config.DB.Model(&model.File{}).Where("id = ?", id).Update("status", 0).Error
}
// Restore 从回收站恢复
func (r *FileRepository) Restore(id uint64) error {
return config.DB.Model(&model.File{}).Where("id = ?", id).Update("status", 1).Error
}
// HardDelete 永久删除
func (r *FileRepository) HardDelete(id uint64) error {
return config.DB.Unscoped().Delete(&model.File{}, id).Error
}
// IncrementDownloadCount 增加下载次数
func (r *FileRepository) IncrementDownloadCount(id uint64) error {
return config.DB.Model(&model.File{}).Where("id = ?", id).
Update("download_count", config.DB.Raw("download_count + 1")).Error
}
// CountByOwner 统计用户文件数
func (r *FileRepository) CountByOwner(ownerID uint64) (int64, error) {
var count int64
err := config.DB.Model(&model.File{}).Where("owner_id = ? AND status = 1", ownerID).Count(&count).Error
return count, err
}
// SumSizeByOwner 统计用户文件总大小
func (r *FileRepository) SumSizeByOwner(ownerID uint64) (int64, error) {
var total int64
err := config.DB.Model(&model.File{}).Where("owner_id = ? AND status = 1", ownerID).
Select("COALESCE(SUM(size), 0)").Scan(&total).Error
return total, err
}
// PolicyStats 存储策略统计
type PolicyStats struct {
PolicyID uint64 `json:"policy_id"`
PolicyName string `json:"policy_name"`
PolicyType string `json:"policy_type"`
FileCount int64 `json:"file_count"`
TotalSize int64 `json:"total_size"`
UserCount int64 `json:"user_count"`
}
// GetPolicyStats 获取所有存储策略的使用统计
func (r *FileRepository) GetPolicyStats() ([]PolicyStats, error) {
var stats []PolicyStats
err := config.DB.Raw(`
SELECT
f.storage_policy_id as policy_id,
COALESCE(sp.name, '未知') as policy_name,
COALESCE(sp.policy_type, '') as policy_type,
COUNT(*) as file_count,
COALESCE(SUM(f.size), 0) as total_size,
COUNT(DISTINCT f.owner_id) as user_count
FROM fs_file f
LEFT JOIN fs_storage_policy sp ON sp.id = f.storage_policy_id
WHERE f.status = 1
GROUP BY f.storage_policy_id, sp.name, sp.policy_type
ORDER BY total_size DESC
`).Scan(&stats).Error
return stats, err
}
// GetGlobalStats 获取全局统计
func (r *FileRepository) GetGlobalStats() (map[string]interface{}, error) {
var totalFiles int64
var totalSize int64
var totalUsers int64
config.DB.Model(&model.File{}).Where("status = 1").Count(&totalFiles)
config.DB.Model(&model.File{}).Where("status = 1").Select("COALESCE(SUM(size), 0)").Scan(&totalSize)
config.DB.Model(&model.File{}).Where("status = 1").Distinct("owner_id").Count(&totalUsers)
var totalFolders int64
config.DB.Model(&model.Folder{}).Where("status = 1").Count(&totalFolders)
return map[string]interface{}{
"total_files": totalFiles,
"total_size": totalSize,
"total_folders": totalFolders,
"total_users": totalUsers,
}, nil
}

View File

@@ -0,0 +1,94 @@
package repository
import (
"seeyon-filesystem/config"
"seeyon-filesystem/model"
)
// FolderRepository 文件夹数据访问
type FolderRepository struct{}
// NewFolderRepository 创建文件夹Repository实例
func NewFolderRepository() *FolderRepository {
return &FolderRepository{}
}
// Create 创建文件夹
func (r *FolderRepository) Create(folder *model.Folder) error {
return config.DB.Create(folder).Error
}
// FindByID 根据ID查找文件夹
func (r *FolderRepository) FindByID(id uint64) (*model.Folder, error) {
var folder model.Folder
err := config.DB.First(&folder, id).Error
if err != nil {
return nil, err
}
return &folder, nil
}
// ListByParent 查询子文件夹列表
func (r *FolderRepository) ListByParent(parentID uint64, ownerID uint64) ([]model.Folder, error) {
var folders []model.Folder
err := config.DB.Where("parent_id = ? AND owner_id = ? AND status = 1", parentID, ownerID).
Order("name ASC").Find(&folders).Error
return folders, err
}
// FindByPath 根据路径查找文件夹
func (r *FolderRepository) FindByPath(path string, ownerID uint64) (*model.Folder, error) {
var folder model.Folder
err := config.DB.Where("path = ? AND owner_id = ? AND status = 1", path, ownerID).First(&folder).Error
if err != nil {
return nil, err
}
return &folder, nil
}
// FindByNameAndParent 根据名称和父文件夹查找(用于判断重名)
func (r *FolderRepository) FindByNameAndParent(name string, parentID uint64, ownerID uint64) (*model.Folder, error) {
var folder model.Folder
err := config.DB.Where("name = ? AND parent_id = ? AND owner_id = ? AND status = 1",
name, parentID, ownerID).First(&folder).Error
if err != nil {
return nil, err
}
return &folder, nil
}
// ListTrashed 查询回收站文件夹
func (r *FolderRepository) ListTrashed(ownerID uint64) ([]model.Folder, error) {
var folders []model.Folder
err := config.DB.Where("owner_id = ? AND status = 0", ownerID).
Order("updated_at DESC").Find(&folders).Error
return folders, err
}
// Update 更新文件夹
func (r *FolderRepository) Update(folder *model.Folder) error {
return config.DB.Save(folder).Error
}
// SoftDelete 软删除
func (r *FolderRepository) SoftDelete(id uint64) error {
return config.DB.Model(&model.Folder{}).Where("id = ?", id).Update("status", 0).Error
}
// Restore 从回收站恢复
func (r *FolderRepository) Restore(id uint64) error {
return config.DB.Model(&model.Folder{}).Where("id = ?", id).Update("status", 1).Error
}
// HardDelete 永久删除
func (r *FolderRepository) HardDelete(id uint64) error {
return config.DB.Unscoped().Delete(&model.Folder{}, id).Error
}
// GetChildrenPath 获取所有子孙文件夹的路径前缀(用于级联操作)
func (r *FolderRepository) GetChildrenByPath(pathPrefix string, ownerID uint64) ([]model.Folder, error) {
var folders []model.Folder
err := config.DB.Where("path LIKE ? AND owner_id = ?",
pathPrefix+"%", ownerID).Find(&folders).Error
return folders, err
}

View File

@@ -0,0 +1,82 @@
package repository
import (
"seeyon-filesystem/config"
"seeyon-filesystem/model"
"gorm.io/gorm"
)
// PermissionRepository 权限数据访问
type PermissionRepository struct{}
func NewPermissionRepository() *PermissionRepository {
return &PermissionRepository{}
}
// FindByID 根据ID查找权限
func (r *PermissionRepository) FindByID(id uint64) (*model.Permission, error) {
var perm model.Permission
err := config.DB.First(&perm, id).Error
if err != nil {
return nil, err
}
return &perm, nil
}
// FindByCode 根据权限标识查找
func (r *PermissionRepository) FindByCode(code string) (*model.Permission, error) {
var perm model.Permission
err := config.DB.Where("code = ?", code).First(&perm).Error
if err != nil {
return nil, err
}
return &perm, nil
}
// List 查询所有权限
func (r *PermissionRepository) List() ([]model.Permission, error) {
var perms []model.Permission
err := config.DB.Order("resource ASC, action ASC").Find(&perms).Error
return perms, err
}
// ListByResource 按资源类型查询权限
func (r *PermissionRepository) ListByResource(resource string) ([]model.Permission, error) {
var perms []model.Permission
err := config.DB.Where("resource = ?", resource).Order("action ASC").Find(&perms).Error
return perms, err
}
// GetUserPermissionCodes 获取用户的所有权限标识(通过角色)
func (r *PermissionRepository) GetUserPermissionCodes(userID uint64) ([]string, error) {
var codes []string
err := config.DB.Table("fs_permission p").
Select("DISTINCT p.code").
Joins("JOIN fs_role_permission rp ON rp.permission_id = p.id").
Joins("JOIN fs_user_role ur ON ur.role_id = rp.role_id").
Where("ur.user_id = ?", userID).
Pluck("p.code", &codes).Error
return codes, err
}
// Create 创建权限
func (r *PermissionRepository) Create(perm *model.Permission) error {
return config.DB.Create(perm).Error
}
// Update 更新权限
func (r *PermissionRepository) Update(perm *model.Permission) error {
return config.DB.Save(perm).Error
}
// Delete 删除权限
func (r *PermissionRepository) Delete(id uint64) error {
return config.DB.Transaction(func(tx *gorm.DB) error {
// 删除角色-权限关联
if err := tx.Where("permission_id = ?", id).Delete(&model.RolePermission{}).Error; err != nil {
return err
}
return tx.Delete(&model.Permission{}, id).Error
})
}

View File

@@ -0,0 +1,86 @@
package repository
import (
"seeyon-filesystem/config"
"seeyon-filesystem/model"
"gorm.io/gorm"
)
// RoleRepository 角色数据访问
type RoleRepository struct{}
func NewRoleRepository() *RoleRepository {
return &RoleRepository{}
}
// Create 创建角色
func (r *RoleRepository) Create(role *model.Role) error {
return config.DB.Create(role).Error
}
// FindByID 根据ID查找角色(含权限)
func (r *RoleRepository) FindByID(id uint64) (*model.Role, error) {
var role model.Role
err := config.DB.Preload("Permissions").First(&role, id).Error
if err != nil {
return nil, err
}
return &role, nil
}
// FindByName 根据标识查找角色
func (r *RoleRepository) FindByName(name string) (*model.Role, error) {
var role model.Role
err := config.DB.Where("name = ?", name).First(&role).Error
if err != nil {
return nil, err
}
return &role, nil
}
// List 查询所有角色
func (r *RoleRepository) List() ([]model.Role, error) {
var roles []model.Role
err := config.DB.Preload("Permissions").Order("id ASC").Find(&roles).Error
return roles, err
}
// Update 更新角色
func (r *RoleRepository) Update(role *model.Role) error {
return config.DB.Save(role).Error
}
// Delete 删除角色(仅非系统角色)
func (r *RoleRepository) Delete(id uint64) error {
return config.DB.Transaction(func(tx *gorm.DB) error {
// 删除角色-权限关联
if err := tx.Where("role_id = ?", id).Delete(&model.RolePermission{}).Error; err != nil {
return err
}
// 删除用户-角色关联
if err := tx.Where("role_id = ?", id).Delete(&model.UserRole{}).Error; err != nil {
return err
}
// 删除角色
return tx.Delete(&model.Role{}, id).Error
})
}
// SetPermissions 设置角色权限(全量替换)
func (r *RoleRepository) SetPermissions(roleID uint64, permissionIDs []uint64) error {
return config.DB.Transaction(func(tx *gorm.DB) error {
// 先删除旧关联
if err := tx.Where("role_id = ?", roleID).Delete(&model.RolePermission{}).Error; err != nil {
return err
}
// 插入新关联
for _, pid := range permissionIDs {
rp := model.RolePermission{RoleID: roleID, PermissionID: pid}
if err := tx.Create(&rp).Error; err != nil {
return err
}
}
return nil
})
}

View File

@@ -0,0 +1,63 @@
package repository
import (
"seeyon-filesystem/config"
"seeyon-filesystem/model"
)
// ShareRepository 分享数据访问
type ShareRepository struct{}
// NewShareRepository 创建分享Repository实例
func NewShareRepository() *ShareRepository {
return &ShareRepository{}
}
// Create 创建分享记录
func (r *ShareRepository) Create(share *model.Share) error {
return config.DB.Create(share).Error
}
// FindByShareCode 根据分享码查找
func (r *ShareRepository) FindByShareCode(code string) (*model.Share, error) {
var share model.Share
err := config.DB.Where("share_code = ? AND status = 1", code).First(&share).Error
if err != nil {
return nil, err
}
return &share, nil
}
// FindByID 根据ID查找
func (r *ShareRepository) FindByID(id uint64) (*model.Share, error) {
var share model.Share
err := config.DB.First(&share, id).Error
if err != nil {
return nil, err
}
return &share, nil
}
// ListByOwner 查询用户的分享列表
func (r *ShareRepository) ListByOwner(ownerID uint64) ([]model.Share, error) {
var shares []model.Share
err := config.DB.Where("owner_id = ? AND status = 1", ownerID).
Order("created_at DESC").Find(&shares).Error
return shares, err
}
// IncrementDownloadCount 增加下载次数
func (r *ShareRepository) IncrementDownloadCount(id uint64) error {
return config.DB.Model(&model.Share{}).Where("id = ?", id).
Update("download_count", config.DB.Raw("download_count + 1")).Error
}
// Cancel 取消分享
func (r *ShareRepository) Cancel(id uint64) error {
return config.DB.Model(&model.Share{}).Where("id = ?", id).Update("status", 0).Error
}
// Delete 永久删除
func (r *ShareRepository) Delete(id uint64) error {
return config.DB.Unscoped().Delete(&model.Share{}, id).Error
}

View File

@@ -0,0 +1,94 @@
package repository
import (
"seeyon-filesystem/config"
"seeyon-filesystem/model"
"gorm.io/gorm"
)
// SSORepository SSO数据访问
type SSORepository struct{}
func NewSSORepository() *SSORepository {
return &SSORepository{}
}
// ========== SSO 提供商 ==========
// CreateProvider 创建SSO提供商
func (r *SSORepository) CreateProvider(provider *model.SSOProvider) error {
return config.DB.Create(provider).Error
}
// FindProviderByID 根据ID查找提供商
func (r *SSORepository) FindProviderByID(id uint64) (*model.SSOProvider, error) {
var provider model.SSOProvider
err := config.DB.First(&provider, id).Error
if err != nil {
return nil, err
}
return &provider, nil
}
// ListProviders 查询所有启用的提供商
func (r *SSORepository) ListProviders() ([]model.SSOProvider, error) {
var providers []model.SSOProvider
err := config.DB.Where("status = 1").Order("sort_order ASC, id ASC").Find(&providers).Error
return providers, err
}
// ListAllProviders 查询所有提供商(含禁用)
func (r *SSORepository) ListAllProviders() ([]model.SSOProvider, error) {
var providers []model.SSOProvider
err := config.DB.Order("sort_order ASC, id ASC").Find(&providers).Error
return providers, err
}
// UpdateProvider 更新提供商
func (r *SSORepository) UpdateProvider(provider *model.SSOProvider) error {
return config.DB.Save(provider).Error
}
// DeleteProvider 删除提供商
func (r *SSORepository) DeleteProvider(id uint64) error {
return config.DB.Transaction(func(tx *gorm.DB) error {
if err := tx.Where("provider_id = ?", id).Delete(&model.SSOSession{}).Error; err != nil {
return err
}
return tx.Delete(&model.SSOProvider{}, id).Error
})
}
// ========== SSO 会话 ==========
// CreateSession 创建SSO会话
func (r *SSORepository) CreateSession(session *model.SSOSession) error {
return config.DB.Create(session).Error
}
// FindSessionByExternalID 根据外部用户ID查找会话
func (r *SSORepository) FindSessionByExternalID(providerID uint64, externalID string) (*model.SSOSession, error) {
var session model.SSOSession
err := config.DB.Where("provider_id = ? AND external_id = ?", providerID, externalID).
First(&session).Error
if err != nil {
return nil, err
}
return &session, nil
}
// FindSessionByUserID 根据本地用户ID查找SSO会话
func (r *SSORepository) FindSessionByUserID(userID uint64) (*model.SSOSession, error) {
var session model.SSOSession
err := config.DB.Where("user_id = ?", userID).Order("last_login_at DESC").First(&session).Error
if err != nil {
return nil, err
}
return &session, nil
}
// UpdateSession 更新会话
func (r *SSORepository) UpdateSession(session *model.SSOSession) error {
return config.DB.Save(session).Error
}

View File

@@ -0,0 +1,45 @@
package repository
import (
"seeyon-filesystem/config"
"seeyon-filesystem/model"
)
// StoragePolicyRepository 存储策略数据访问
type StoragePolicyRepository struct{}
func NewStoragePolicyRepository() *StoragePolicyRepository {
return &StoragePolicyRepository{}
}
// Create 创建存储策略
func (r *StoragePolicyRepository) Create(policy *model.StoragePolicy) error {
return config.DB.Create(policy).Error
}
// FindByID 根据ID查找
func (r *StoragePolicyRepository) FindByID(id uint64) (*model.StoragePolicy, error) {
var policy model.StoragePolicy
err := config.DB.First(&policy, id).Error
if err != nil {
return nil, err
}
return &policy, nil
}
// List 查询所有存储策略
func (r *StoragePolicyRepository) List() ([]model.StoragePolicy, error) {
var policies []model.StoragePolicy
err := config.DB.Order("id ASC").Find(&policies).Error
return policies, err
}
// Update 更新存储策略
func (r *StoragePolicyRepository) Update(policy *model.StoragePolicy) error {
return config.DB.Save(policy).Error
}
// Delete 删除存储策略
func (r *StoragePolicyRepository) Delete(id uint64) error {
return config.DB.Delete(&model.StoragePolicy{}, id).Error
}

View File

@@ -0,0 +1,68 @@
// Package repository 提供数据访问层
// 封装GORM的数据库操作, 供Service层调用
package repository
import (
"seeyon-filesystem/config"
"seeyon-filesystem/model"
)
// UserRepository 用户数据访问
type UserRepository struct{}
// NewUserRepository 创建用户Repository实例
func NewUserRepository() *UserRepository {
return &UserRepository{}
}
// Create 创建用户
func (r *UserRepository) Create(user *model.User) error {
return config.DB.Create(user).Error
}
// FindByID 根据ID查找用户
func (r *UserRepository) FindByID(id uint64) (*model.User, error) {
var user model.User
err := config.DB.First(&user, id).Error
if err != nil {
return nil, err
}
return &user, nil
}
// FindByUsername 根据用户名查找用户
func (r *UserRepository) FindByUsername(username string) (*model.User, error) {
var user model.User
err := config.DB.Where("username = ?", username).First(&user).Error
if err != nil {
return nil, err
}
return &user, nil
}
// Update 更新用户信息
func (r *UserRepository) Update(user *model.User) error {
return config.DB.Save(user).Error
}
// UpdateStorageUsed 更新用户已用存储空间
func (r *UserRepository) UpdateStorageUsed(userID uint64, delta int64) error {
return config.DB.Model(&model.User{}).
Where("id = ?", userID).
Update("used_storage", config.DB.Raw("used_storage + ?", delta)).Error
}
// List 分页查询用户列表
func (r *UserRepository) List(page, size int) ([]model.User, int64, error) {
var users []model.User
var total int64
config.DB.Model(&model.User{}).Count(&total)
err := config.DB.Offset((page - 1) * size).Limit(size).Order("id DESC").Find(&users).Error
return users, total, err
}
// Delete 删除用户(软删除)
func (r *UserRepository) Delete(id uint64) error {
return config.DB.Delete(&model.User{}, id).Error
}

View File

@@ -0,0 +1,53 @@
package repository
import (
"seeyon-filesystem/config"
"seeyon-filesystem/model"
"gorm.io/gorm"
)
// UserRoleRepository 用户-角色关联数据访问
type UserRoleRepository struct{}
func NewUserRoleRepository() *UserRoleRepository {
return &UserRoleRepository{}
}
// SetUserRoles 设置用户角色(全量替换)
func (r *UserRoleRepository) SetUserRoles(userID uint64, roleIDs []uint64) error {
return config.DB.Transaction(func(tx *gorm.DB) error {
// 先删除旧关联
if err := tx.Where("user_id = ?", userID).Delete(&model.UserRole{}).Error; err != nil {
return err
}
// 插入新关联
for _, rid := range roleIDs {
ur := model.UserRole{UserID: userID, RoleID: rid}
if err := tx.Create(&ur).Error; err != nil {
return err
}
}
return nil
})
}
// GetUserRoles 获取用户的角色列表
func (r *UserRoleRepository) GetUserRoles(userID uint64) ([]model.Role, error) {
var roles []model.Role
err := config.DB.Table("fs_role ro").
Joins("JOIN fs_user_role ur ON ur.role_id = ro.id").
Where("ur.user_id = ? AND ro.status = 1", userID).
Find(&roles).Error
return roles, err
}
// GetRoleUsers 获取角色下的用户列表
func (r *UserRoleRepository) GetRoleUsers(roleID uint64) ([]model.User, error) {
var users []model.User
err := config.DB.Table("fs_user u").
Joins("JOIN fs_user_role ur ON ur.user_id = u.id").
Where("ur.role_id = ?", roleID).
Find(&users).Error
return users, err
}