1214 lines
31 KiB
Go
1214 lines
31 KiB
Go
|
|
package service
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"context"
|
|||
|
|
"fmt"
|
|||
|
|
"strings"
|
|||
|
|
"time"
|
|||
|
|
|
|||
|
|
"github.com/gogf/gf/v2/errors/gerror"
|
|||
|
|
"github.com/gogf/gf/v2/frame/g"
|
|||
|
|
"github.com/gogf/gf/v2/net/ghttp"
|
|||
|
|
"github.com/gogf/gf/v2/os/gtime"
|
|||
|
|
"github.com/gogf/gf/v2/util/gconv"
|
|||
|
|
|
|||
|
|
"nl-video-api/internal/dao"
|
|||
|
|
"nl-video-api/internal/model/entity"
|
|||
|
|
"nl-video-api/utility/response"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// AttachmentService 附件管理服务
|
|||
|
|
type AttachmentService struct{}
|
|||
|
|
|
|||
|
|
// NewAttachmentService 创建附件管理服务实例
|
|||
|
|
func NewAttachmentService() *AttachmentService {
|
|||
|
|
return &AttachmentService{}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 定义请求和响应结构体,避免循环导入
|
|||
|
|
type AttachmentListReq struct {
|
|||
|
|
Page int `json:"page"`
|
|||
|
|
Size int `json:"size"`
|
|||
|
|
Type string `json:"type"`
|
|||
|
|
Category string `json:"category"`
|
|||
|
|
Keyword string `json:"keyword"`
|
|||
|
|
StartDate string `json:"start_date"`
|
|||
|
|
EndDate string `json:"end_date"`
|
|||
|
|
MinSize int64 `json:"min_size"`
|
|||
|
|
MaxSize int64 `json:"max_size"`
|
|||
|
|
UserId uint `json:"user_id"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentListRes struct {
|
|||
|
|
List []AttachmentItem `json:"list"`
|
|||
|
|
Total int `json:"total"`
|
|||
|
|
Page int `json:"page"`
|
|||
|
|
Size int `json:"size"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentItem struct {
|
|||
|
|
Id uint `json:"id"`
|
|||
|
|
Filename string `json:"filename"`
|
|||
|
|
OriginalName string `json:"original_name"`
|
|||
|
|
Url string `json:"url"`
|
|||
|
|
Size int64 `json:"size"`
|
|||
|
|
Type string `json:"type"`
|
|||
|
|
Category string `json:"category"`
|
|||
|
|
Description string `json:"description"`
|
|||
|
|
UserId uint `json:"user_id"`
|
|||
|
|
Username string `json:"username"`
|
|||
|
|
CreatedAt int64 `json:"created_at"`
|
|||
|
|
UpdatedAt int64 `json:"updated_at"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentDetailReq struct {
|
|||
|
|
Id uint `json:"id"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentDetailRes struct {
|
|||
|
|
Attachment AttachmentDetail `json:"attachment"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentDetail struct {
|
|||
|
|
Id uint `json:"id"`
|
|||
|
|
Filename string `json:"filename"`
|
|||
|
|
OriginalName string `json:"original_name"`
|
|||
|
|
Url string `json:"url"`
|
|||
|
|
Size int64 `json:"size"`
|
|||
|
|
Type string `json:"type"`
|
|||
|
|
Category string `json:"category"`
|
|||
|
|
Description string `json:"description"`
|
|||
|
|
UserId uint `json:"user_id"`
|
|||
|
|
Username string `json:"username"`
|
|||
|
|
DownloadCount int `json:"download_count"`
|
|||
|
|
CreatedAt int64 `json:"created_at"`
|
|||
|
|
UpdatedAt int64 `json:"updated_at"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentUpdateReq struct {
|
|||
|
|
Id uint `json:"id"`
|
|||
|
|
Category string `json:"category"`
|
|||
|
|
Description string `json:"description"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentDeleteReq struct {
|
|||
|
|
Id uint `json:"id"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentBatchDeleteReq struct {
|
|||
|
|
Ids []uint `json:"ids"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentDownloadReq struct {
|
|||
|
|
Id uint `json:"id"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentDownloadRes struct {
|
|||
|
|
Url string `json:"url"`
|
|||
|
|
Filename string `json:"filename"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentCategoryListReq struct {
|
|||
|
|
Type string `json:"type"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentCategoryListRes struct {
|
|||
|
|
Categories []AttachmentCategoryItem `json:"categories"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentCategoryItem struct {
|
|||
|
|
Category string `json:"category"`
|
|||
|
|
Count int `json:"count"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentStatisticsReq struct {
|
|||
|
|
StartDate string `json:"start_date"`
|
|||
|
|
EndDate string `json:"end_date"`
|
|||
|
|
Type string `json:"type"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentStatisticsRes struct {
|
|||
|
|
TotalCount int `json:"total_count"`
|
|||
|
|
TotalSize int64 `json:"total_size"`
|
|||
|
|
TypeStats []AttachmentTypeStatItem `json:"type_stats"`
|
|||
|
|
CategoryStats []AttachmentCategoryStatItem `json:"category_stats"`
|
|||
|
|
UploadChart []AttachmentUploadChartItem `json:"upload_chart"`
|
|||
|
|
SizeChart []AttachmentSizeChartItem `json:"size_chart"`
|
|||
|
|
PopularFiles []AttachmentPopularItem `json:"popular_files"`
|
|||
|
|
RecentUploads []AttachmentRecentItem `json:"recent_uploads"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentTypeStatItem struct {
|
|||
|
|
Type string `json:"type"`
|
|||
|
|
Count int `json:"count"`
|
|||
|
|
Size int64 `json:"size"`
|
|||
|
|
Percentage string `json:"percentage"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentCategoryStatItem struct {
|
|||
|
|
Category string `json:"category"`
|
|||
|
|
Count int `json:"count"`
|
|||
|
|
Size int64 `json:"size"`
|
|||
|
|
Percentage string `json:"percentage"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentUploadChartItem struct {
|
|||
|
|
Date string `json:"date"`
|
|||
|
|
Count int `json:"count"`
|
|||
|
|
Size int64 `json:"size"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentSizeChartItem struct {
|
|||
|
|
SizeRange string `json:"size_range"`
|
|||
|
|
Count int `json:"count"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentPopularItem struct {
|
|||
|
|
Id uint `json:"id"`
|
|||
|
|
Filename string `json:"filename"`
|
|||
|
|
Type string `json:"type"`
|
|||
|
|
Size int64 `json:"size"`
|
|||
|
|
DownloadCount int `json:"download_count"`
|
|||
|
|
CreatedAt int64 `json:"created_at"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentRecentItem struct {
|
|||
|
|
Id uint `json:"id"`
|
|||
|
|
Filename string `json:"filename"`
|
|||
|
|
OriginalName string `json:"original_name"`
|
|||
|
|
Type string `json:"type"`
|
|||
|
|
Size int64 `json:"size"`
|
|||
|
|
UserId uint `json:"user_id"`
|
|||
|
|
Username string `json:"username"`
|
|||
|
|
CreatedAt int64 `json:"created_at"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentMoveReq struct {
|
|||
|
|
Ids []uint `json:"ids"`
|
|||
|
|
NewCategory string `json:"new_category"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentCopyReq struct {
|
|||
|
|
Id uint `json:"id"`
|
|||
|
|
NewCategory string `json:"new_category"`
|
|||
|
|
Description string `json:"description"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentCopyRes struct {
|
|||
|
|
Id uint `json:"id"`
|
|||
|
|
Filename string `json:"filename"`
|
|||
|
|
Url string `json:"url"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentRenameReq struct {
|
|||
|
|
Id uint `json:"id"`
|
|||
|
|
Filename string `json:"filename"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentSearchReq struct {
|
|||
|
|
Query string `json:"query"`
|
|||
|
|
Type string `json:"type"`
|
|||
|
|
Category string `json:"category"`
|
|||
|
|
Page int `json:"page"`
|
|||
|
|
Size int `json:"size"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentSearchRes struct {
|
|||
|
|
List []AttachmentItem `json:"list"`
|
|||
|
|
Total int `json:"total"`
|
|||
|
|
Page int `json:"page"`
|
|||
|
|
Size int `json:"size"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentUserListReq struct {
|
|||
|
|
Page int `json:"page"`
|
|||
|
|
Size int `json:"size"`
|
|||
|
|
Type string `json:"type"`
|
|||
|
|
Category string `json:"category"`
|
|||
|
|
Keyword string `json:"keyword"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentUserListRes struct {
|
|||
|
|
List []AttachmentUserItem `json:"list"`
|
|||
|
|
Total int `json:"total"`
|
|||
|
|
Page int `json:"page"`
|
|||
|
|
Size int `json:"size"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type AttachmentUserItem struct {
|
|||
|
|
Id uint `json:"id"`
|
|||
|
|
Filename string `json:"filename"`
|
|||
|
|
OriginalName string `json:"original_name"`
|
|||
|
|
Url string `json:"url"`
|
|||
|
|
Size int64 `json:"size"`
|
|||
|
|
Type string `json:"type"`
|
|||
|
|
Category string `json:"category"`
|
|||
|
|
Description string `json:"description"`
|
|||
|
|
CreatedAt int64 `json:"created_at"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Upload 上传附件
|
|||
|
|
func (s *AttachmentService) Upload(r *ghttp.Request) {
|
|||
|
|
// 获取请求参数
|
|||
|
|
attachmentType := r.Get("type").String()
|
|||
|
|
category := r.Get("category").String()
|
|||
|
|
description := r.Get("description").String()
|
|||
|
|
_ = description // 避免未使用变量错误
|
|||
|
|
|
|||
|
|
// 获取当前用户ID
|
|||
|
|
userId := uint(1) // 临时设置,实际应该从请求中获取
|
|||
|
|
if userId == 0 {
|
|||
|
|
response.Error(r, response.CodeUnauthorized, "用户未登录")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 这里应该处理文件上传逻辑
|
|||
|
|
// 由于这是API结构设计,暂时模拟文件上传结果
|
|||
|
|
filename := fmt.Sprintf("%s_%d.%s", attachmentType, time.Now().Unix(), "jpg")
|
|||
|
|
url := fmt.Sprintf("/uploads/%s/%s", category, filename)
|
|||
|
|
size := int64(1024 * 100) // 模拟文件大小
|
|||
|
|
|
|||
|
|
// 保存附件信息到数据库
|
|||
|
|
data := &entity.Attachment{
|
|||
|
|
Name: filename,
|
|||
|
|
Path: url, // 使用URL作为路径
|
|||
|
|
Url: url,
|
|||
|
|
Size: size,
|
|||
|
|
MimeType: attachmentType,
|
|||
|
|
Extension: "jpg", // 从文件名提取扩展名
|
|||
|
|
UserId: int(userId),
|
|||
|
|
Status: 1, // 默认启用
|
|||
|
|
CreatedAt: gtime.Now(),
|
|||
|
|
UpdatedAt: gtime.Now(),
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
id, err := dao.Attachment.Ctx(r.Context()).Data(data).InsertAndGetId()
|
|||
|
|
if err != nil {
|
|||
|
|
response.Error(r, response.CodeInternalError, "保存附件信息失败")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
response.Success(r, g.Map{
|
|||
|
|
"id": uint(id),
|
|||
|
|
"name": filename,
|
|||
|
|
"url": url,
|
|||
|
|
"size": size,
|
|||
|
|
"type": attachmentType,
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// List 获取附件列表
|
|||
|
|
func (s *AttachmentService) List(ctx context.Context, req *AttachmentListReq) (*AttachmentListRes, error) {
|
|||
|
|
// 设置默认值
|
|||
|
|
if req.Page <= 0 {
|
|||
|
|
req.Page = 1
|
|||
|
|
}
|
|||
|
|
if req.Size <= 0 {
|
|||
|
|
req.Size = 10
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 构建查询条件
|
|||
|
|
query := dao.Attachment.Ctx(ctx)
|
|||
|
|
|
|||
|
|
// 类型筛选
|
|||
|
|
if req.Type != "" {
|
|||
|
|
query = query.Where("mime_type", req.Type)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 关键词搜索
|
|||
|
|
if req.Keyword != "" {
|
|||
|
|
keyword := "%" + req.Keyword + "%"
|
|||
|
|
query = query.Where("name LIKE ?", keyword)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 日期范围筛选
|
|||
|
|
if req.StartDate != "" {
|
|||
|
|
query = query.Where("created_at >= ?", req.StartDate+" 00:00:00")
|
|||
|
|
}
|
|||
|
|
if req.EndDate != "" {
|
|||
|
|
query = query.Where("created_at <= ?", req.EndDate+" 23:59:59")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 文件大小筛选
|
|||
|
|
if req.MinSize > 0 {
|
|||
|
|
query = query.Where("size >= ?", req.MinSize)
|
|||
|
|
}
|
|||
|
|
if req.MaxSize > 0 {
|
|||
|
|
query = query.Where("size <= ?", req.MaxSize)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 用户筛选
|
|||
|
|
if req.UserId > 0 {
|
|||
|
|
query = query.Where("user_id", req.UserId)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取总数
|
|||
|
|
total, err := query.Count()
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, gerror.New("获取附件总数失败")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取列表数据
|
|||
|
|
var attachments []entity.Attachment
|
|||
|
|
err = query.Order("id DESC").
|
|||
|
|
Limit((req.Page-1)*req.Size, req.Size).
|
|||
|
|
Scan(&attachments)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, gerror.New("获取附件列表失败")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取用户信息
|
|||
|
|
userIds := make([]int, 0, len(attachments))
|
|||
|
|
for _, attachment := range attachments {
|
|||
|
|
userIds = append(userIds, attachment.UserId)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
userMap := make(map[int]string)
|
|||
|
|
if len(userIds) > 0 {
|
|||
|
|
var users []entity.NlUser
|
|||
|
|
g.DB().Model("nl_user").WhereIn("id", userIds).Fields("id, username").Scan(&users)
|
|||
|
|
for _, user := range users {
|
|||
|
|
userMap[int(user.Id)] = user.Username
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 转换为响应格式
|
|||
|
|
list := make([]AttachmentItem, 0, len(attachments))
|
|||
|
|
for _, attachment := range attachments {
|
|||
|
|
username := userMap[attachment.UserId]
|
|||
|
|
list = append(list, AttachmentItem{
|
|||
|
|
Id: attachment.Id,
|
|||
|
|
Filename: attachment.Name,
|
|||
|
|
OriginalName: attachment.Name, // 使用Name作为原始名称
|
|||
|
|
Url: attachment.Url,
|
|||
|
|
Size: attachment.Size,
|
|||
|
|
Type: attachment.MimeType,
|
|||
|
|
Category: "default", // 默认分类
|
|||
|
|
Description: "", // 默认描述
|
|||
|
|
UserId: uint(attachment.UserId),
|
|||
|
|
Username: username,
|
|||
|
|
CreatedAt: attachment.CreatedAt.Unix(),
|
|||
|
|
UpdatedAt: attachment.UpdatedAt.Unix(),
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return &AttachmentListRes{
|
|||
|
|
List: list,
|
|||
|
|
Total: total,
|
|||
|
|
Page: req.Page,
|
|||
|
|
Size: req.Size,
|
|||
|
|
}, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Detail 获取附件详情
|
|||
|
|
func (s *AttachmentService) Detail(ctx context.Context, req *AttachmentDetailReq) (*AttachmentDetailRes, error) {
|
|||
|
|
var attachment entity.Attachment
|
|||
|
|
err := dao.Attachment.Ctx(ctx).Where("id", req.Id).Scan(&attachment)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, gerror.New("获取附件详情失败")
|
|||
|
|
}
|
|||
|
|
if attachment.Id == 0 {
|
|||
|
|
return nil, gerror.New("附件不存在")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取用户信息
|
|||
|
|
var user entity.NlUser
|
|||
|
|
g.DB().Model("nl_user").Where("id", attachment.UserId).Fields("username").Scan(&user)
|
|||
|
|
|
|||
|
|
return &AttachmentDetailRes{
|
|||
|
|
Attachment: AttachmentDetail{
|
|||
|
|
Id: attachment.Id,
|
|||
|
|
Filename: attachment.Name,
|
|||
|
|
OriginalName: attachment.Name,
|
|||
|
|
Url: attachment.Url,
|
|||
|
|
Size: attachment.Size,
|
|||
|
|
Type: attachment.MimeType,
|
|||
|
|
Category: "default",
|
|||
|
|
Description: "",
|
|||
|
|
UserId: uint(attachment.UserId),
|
|||
|
|
Username: user.Username,
|
|||
|
|
DownloadCount: 0, // 实体中没有此字段,设为0
|
|||
|
|
CreatedAt: attachment.CreatedAt.Unix(),
|
|||
|
|
UpdatedAt: attachment.UpdatedAt.Unix(),
|
|||
|
|
},
|
|||
|
|
}, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Update 更新附件
|
|||
|
|
func (s *AttachmentService) Update(ctx context.Context, req *AttachmentUpdateReq) error {
|
|||
|
|
// 检查附件是否存在
|
|||
|
|
count, err := dao.Attachment.Ctx(ctx).Where("id", req.Id).Count()
|
|||
|
|
if err != nil {
|
|||
|
|
return gerror.New("检查附件失败")
|
|||
|
|
}
|
|||
|
|
if count == 0 {
|
|||
|
|
return gerror.New("附件不存在")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 更新附件信息(实体中没有category和description字段,只更新状态)
|
|||
|
|
data := g.Map{
|
|||
|
|
"status": 1, // 保持启用状态
|
|||
|
|
"updated_at": gtime.Now(),
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
_, err = dao.Attachment.Ctx(ctx).Where("id", req.Id).Data(data).Update()
|
|||
|
|
if err != nil {
|
|||
|
|
return gerror.New("更新附件失败")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Delete 删除附件
|
|||
|
|
func (s *AttachmentService) Delete(ctx context.Context, req *AttachmentDeleteReq) error {
|
|||
|
|
// 获取附件信息
|
|||
|
|
var attachment entity.Attachment
|
|||
|
|
err := dao.Attachment.Ctx(ctx).Where("id", req.Id).Scan(&attachment)
|
|||
|
|
if err != nil {
|
|||
|
|
return gerror.New("获取附件信息失败")
|
|||
|
|
}
|
|||
|
|
if attachment.Id == 0 {
|
|||
|
|
return gerror.New("附件不存在")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 删除数据库记录
|
|||
|
|
_, err = dao.Attachment.Ctx(ctx).Where("id", req.Id).Delete()
|
|||
|
|
if err != nil {
|
|||
|
|
return gerror.New("删除附件记录失败")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 删除物理文件(这里应该根据实际存储方式处理)
|
|||
|
|
// 例如:os.Remove(attachment.Url)
|
|||
|
|
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// BatchDelete 批量删除附件
|
|||
|
|
func (s *AttachmentService) BatchDelete(ctx context.Context, req *AttachmentBatchDeleteReq) error {
|
|||
|
|
if len(req.Ids) == 0 {
|
|||
|
|
return gerror.New("请选择要删除的附件")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取附件信息
|
|||
|
|
var attachments []entity.Attachment
|
|||
|
|
err := dao.Attachment.Ctx(ctx).WhereIn("id", req.Ids).Scan(&attachments)
|
|||
|
|
if err != nil {
|
|||
|
|
return gerror.New("获取附件信息失败")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 删除数据库记录
|
|||
|
|
_, err = dao.Attachment.Ctx(ctx).WhereIn("id", req.Ids).Delete()
|
|||
|
|
if err != nil {
|
|||
|
|
return gerror.New("批量删除附件记录失败")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 删除物理文件
|
|||
|
|
for _, attachment := range attachments {
|
|||
|
|
// 这里应该根据实际存储方式处理
|
|||
|
|
// 例如:os.Remove(attachment.Url)
|
|||
|
|
_ = attachment // 避免未使用变量错误
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Download 下载附件
|
|||
|
|
func (s *AttachmentService) Download(ctx context.Context, req *AttachmentDownloadReq) (*AttachmentDownloadRes, error) {
|
|||
|
|
// 获取附件信息
|
|||
|
|
var attachment entity.Attachment
|
|||
|
|
err := dao.Attachment.Ctx(ctx).Where("id", req.Id).Scan(&attachment)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, gerror.New("获取附件信息失败")
|
|||
|
|
}
|
|||
|
|
if attachment.Id == 0 {
|
|||
|
|
return nil, gerror.New("附件不存在")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 这里可以更新下载次数,但实体中没有download_count字段,所以跳过
|
|||
|
|
|
|||
|
|
return &AttachmentDownloadRes{
|
|||
|
|
Url: attachment.Url,
|
|||
|
|
Filename: attachment.Name,
|
|||
|
|
}, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetCategoryList 获取附件分类列表
|
|||
|
|
func (s *AttachmentService) GetCategoryList(ctx context.Context, req *AttachmentCategoryListReq) (*AttachmentCategoryListRes, error) {
|
|||
|
|
query := dao.Attachment.Ctx(ctx).Fields("mime_type as category, COUNT(*) as count")
|
|||
|
|
|
|||
|
|
// 类型筛选
|
|||
|
|
if req.Type != "" {
|
|||
|
|
query = query.Where("mime_type", req.Type)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var categories []g.Map
|
|||
|
|
err := query.Group("mime_type").Order("count DESC").Scan(&categories)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, gerror.New("获取分类列表失败")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 转换为响应格式
|
|||
|
|
list := make([]AttachmentCategoryItem, 0, len(categories))
|
|||
|
|
for _, category := range categories {
|
|||
|
|
list = append(list, AttachmentCategoryItem{
|
|||
|
|
Category: gconv.String(category["category"]),
|
|||
|
|
Count: gconv.Int(category["count"]),
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return &AttachmentCategoryListRes{
|
|||
|
|
Categories: list,
|
|||
|
|
}, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetStatistics 获取附件统计
|
|||
|
|
func (s *AttachmentService) GetStatistics(ctx context.Context, req *AttachmentStatisticsReq) (*AttachmentStatisticsRes, error) {
|
|||
|
|
// 构建查询条件
|
|||
|
|
query := dao.Attachment.Ctx(ctx)
|
|||
|
|
if req.StartDate != "" {
|
|||
|
|
query = query.Where("created_at >= ?", req.StartDate+" 00:00:00")
|
|||
|
|
}
|
|||
|
|
if req.EndDate != "" {
|
|||
|
|
query = query.Where("created_at <= ?", req.EndDate+" 23:59:59")
|
|||
|
|
}
|
|||
|
|
if req.Type != "" {
|
|||
|
|
query = query.Where("mime_type", req.Type)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取基础统计
|
|||
|
|
var totalCount int
|
|||
|
|
var totalSize int64
|
|||
|
|
query.Fields("COUNT(*) as total_count, COALESCE(SUM(size), 0) as total_size").
|
|||
|
|
Scan(&g.Map{
|
|||
|
|
"total_count": &totalCount,
|
|||
|
|
"total_size": &totalSize,
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
// 获取类型统计
|
|||
|
|
typeStats := make([]AttachmentTypeStatItem, 0)
|
|||
|
|
var typeStatsData []g.Map
|
|||
|
|
dao.Attachment.Ctx(ctx).Fields("mime_type as type, COUNT(*) as count, COALESCE(SUM(size), 0) as size").
|
|||
|
|
Group("mime_type").Order("count DESC").Scan(&typeStatsData)
|
|||
|
|
|
|||
|
|
for _, stat := range typeStatsData {
|
|||
|
|
count := gconv.Int(stat["count"])
|
|||
|
|
size := gconv.Int64(stat["size"])
|
|||
|
|
percentage := "0.00"
|
|||
|
|
if totalCount > 0 {
|
|||
|
|
percentage = fmt.Sprintf("%.2f", float64(count)/float64(totalCount)*100)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
typeStats = append(typeStats, AttachmentTypeStatItem{
|
|||
|
|
Type: gconv.String(stat["type"]),
|
|||
|
|
Count: count,
|
|||
|
|
Size: size,
|
|||
|
|
Percentage: percentage,
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取分类统计(使用mime_type作为分类)
|
|||
|
|
categoryStats := make([]AttachmentCategoryStatItem, 0)
|
|||
|
|
var categoryStatsData []g.Map
|
|||
|
|
dao.Attachment.Ctx(ctx).Fields("mime_type as category, COUNT(*) as count, COALESCE(SUM(size), 0) as size").
|
|||
|
|
Group("mime_type").Order("count DESC").Limit(10).Scan(&categoryStatsData)
|
|||
|
|
|
|||
|
|
for _, stat := range categoryStatsData {
|
|||
|
|
count := gconv.Int(stat["count"])
|
|||
|
|
size := gconv.Int64(stat["size"])
|
|||
|
|
percentage := "0.00"
|
|||
|
|
if totalCount > 0 {
|
|||
|
|
percentage = fmt.Sprintf("%.2f", float64(count)/float64(totalCount)*100)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
categoryStats = append(categoryStats, AttachmentCategoryStatItem{
|
|||
|
|
Category: gconv.String(stat["category"]),
|
|||
|
|
Count: count,
|
|||
|
|
Size: size,
|
|||
|
|
Percentage: percentage,
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取上传图表数据(简化处理)
|
|||
|
|
uploadChart := make([]AttachmentUploadChartItem, 0)
|
|||
|
|
if req.StartDate != "" && req.EndDate != "" {
|
|||
|
|
uploadChart = append(uploadChart, AttachmentUploadChartItem{
|
|||
|
|
Date: req.StartDate,
|
|||
|
|
Count: totalCount,
|
|||
|
|
Size: totalSize,
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取大小图表数据
|
|||
|
|
sizeChart := []AttachmentSizeChartItem{
|
|||
|
|
{SizeRange: "0-1MB", Count: 0},
|
|||
|
|
{SizeRange: "1-10MB", Count: 0},
|
|||
|
|
{SizeRange: "10-100MB", Count: 0},
|
|||
|
|
{SizeRange: "100MB+", Count: 0},
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取热门文件
|
|||
|
|
popularFiles := make([]AttachmentPopularItem, 0)
|
|||
|
|
var popularData []entity.Attachment
|
|||
|
|
dao.Attachment.Ctx(ctx).Order("created_at DESC").Limit(10).Scan(&popularData)
|
|||
|
|
|
|||
|
|
for _, file := range popularData {
|
|||
|
|
popularFiles = append(popularFiles, AttachmentPopularItem{
|
|||
|
|
Id: file.Id,
|
|||
|
|
Filename: file.Name,
|
|||
|
|
Type: file.MimeType,
|
|||
|
|
Size: file.Size,
|
|||
|
|
DownloadCount: 0, // 实体中没有此字段
|
|||
|
|
CreatedAt: file.CreatedAt.Unix(),
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取最近上传
|
|||
|
|
recentUploads := make([]AttachmentRecentItem, 0)
|
|||
|
|
var recentData []entity.Attachment
|
|||
|
|
dao.Attachment.Ctx(ctx).Order("created_at DESC").Limit(10).Scan(&recentData)
|
|||
|
|
|
|||
|
|
// 获取用户信息
|
|||
|
|
userIds := make([]int, 0, len(recentData))
|
|||
|
|
for _, file := range recentData {
|
|||
|
|
userIds = append(userIds, file.UserId)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
userMap := make(map[int]string)
|
|||
|
|
if len(userIds) > 0 {
|
|||
|
|
var users []entity.NlUser
|
|||
|
|
g.DB().Model("nl_user").WhereIn("id", userIds).Fields("id, username").Scan(&users)
|
|||
|
|
for _, user := range users {
|
|||
|
|
userMap[int(user.Id)] = user.Username
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for _, file := range recentData {
|
|||
|
|
username := userMap[file.UserId]
|
|||
|
|
recentUploads = append(recentUploads, AttachmentRecentItem{
|
|||
|
|
Id: file.Id,
|
|||
|
|
Filename: file.Name,
|
|||
|
|
OriginalName: file.Name,
|
|||
|
|
Type: file.MimeType,
|
|||
|
|
Size: file.Size,
|
|||
|
|
UserId: uint(file.UserId),
|
|||
|
|
Username: username,
|
|||
|
|
CreatedAt: file.CreatedAt.Unix(),
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return &AttachmentStatisticsRes{
|
|||
|
|
TotalCount: totalCount,
|
|||
|
|
TotalSize: totalSize,
|
|||
|
|
TypeStats: typeStats,
|
|||
|
|
CategoryStats: categoryStats,
|
|||
|
|
UploadChart: uploadChart,
|
|||
|
|
SizeChart: sizeChart,
|
|||
|
|
PopularFiles: popularFiles,
|
|||
|
|
RecentUploads: recentUploads,
|
|||
|
|
}, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Move 移动附件
|
|||
|
|
func (s *AttachmentService) Move(ctx context.Context, req *AttachmentMoveReq) error {
|
|||
|
|
if len(req.Ids) == 0 {
|
|||
|
|
return gerror.New("请选择要移动的附件")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 更新状态(实体中没有category字段,只能更新状态)
|
|||
|
|
_, err := dao.Attachment.Ctx(ctx).WhereIn("id", req.Ids).Data(g.Map{
|
|||
|
|
"status": 1,
|
|||
|
|
"updated_at": gtime.Now(),
|
|||
|
|
}).Update()
|
|||
|
|
if err != nil {
|
|||
|
|
return gerror.New("移动附件失败")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Copy 复制附件
|
|||
|
|
func (s *AttachmentService) Copy(ctx context.Context, req *AttachmentCopyReq) (*AttachmentCopyRes, error) {
|
|||
|
|
// 获取源附件信息
|
|||
|
|
var sourceAttachment entity.Attachment
|
|||
|
|
err := dao.Attachment.Ctx(ctx).Where("id", req.Id).Scan(&sourceAttachment)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, gerror.New("获取源附件信息失败")
|
|||
|
|
}
|
|||
|
|
if sourceAttachment.Id == 0 {
|
|||
|
|
return nil, gerror.New("源附件不存在")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取当前用户ID
|
|||
|
|
userId := GetUserIdFromContext(ctx)
|
|||
|
|
if userId == 0 {
|
|||
|
|
return nil, gerror.New("用户未登录")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 生成新文件名
|
|||
|
|
newFilename := fmt.Sprintf("copy_%d_%s", time.Now().Unix(), sourceAttachment.Name)
|
|||
|
|
newUrl := strings.Replace(sourceAttachment.Url, sourceAttachment.Name, newFilename, 1)
|
|||
|
|
|
|||
|
|
// 创建新附件记录
|
|||
|
|
data := &entity.Attachment{
|
|||
|
|
Name: newFilename,
|
|||
|
|
Path: newUrl,
|
|||
|
|
Url: newUrl,
|
|||
|
|
Size: sourceAttachment.Size,
|
|||
|
|
MimeType: sourceAttachment.MimeType,
|
|||
|
|
Extension: sourceAttachment.Extension,
|
|||
|
|
UserId: int(userId),
|
|||
|
|
Status: 1,
|
|||
|
|
CreatedAt: gtime.Now(),
|
|||
|
|
UpdatedAt: gtime.Now(),
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
id, err := dao.Attachment.Ctx(ctx).Data(data).InsertAndGetId()
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, gerror.New("复制附件失败")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 这里应该复制物理文件
|
|||
|
|
|
|||
|
|
return &AttachmentCopyRes{
|
|||
|
|
Id: uint(id),
|
|||
|
|
Filename: newFilename,
|
|||
|
|
Url: newUrl,
|
|||
|
|
}, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Rename 重命名附件
|
|||
|
|
func (s *AttachmentService) Rename(ctx context.Context, req *AttachmentRenameReq) error {
|
|||
|
|
// 检查附件是否存在
|
|||
|
|
count, err := dao.Attachment.Ctx(ctx).Where("id", req.Id).Count()
|
|||
|
|
if err != nil {
|
|||
|
|
return gerror.New("检查附件失败")
|
|||
|
|
}
|
|||
|
|
if count == 0 {
|
|||
|
|
return gerror.New("附件不存在")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 更新文件名
|
|||
|
|
_, err = dao.Attachment.Ctx(ctx).Where("id", req.Id).Data(g.Map{
|
|||
|
|
"name": req.Filename,
|
|||
|
|
"updated_at": gtime.Now(),
|
|||
|
|
}).Update()
|
|||
|
|
if err != nil {
|
|||
|
|
return gerror.New("重命名附件失败")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Search 搜索附件
|
|||
|
|
func (s *AttachmentService) Search(ctx context.Context, req *AttachmentSearchReq) (*AttachmentSearchRes, error) {
|
|||
|
|
// 设置默认值
|
|||
|
|
if req.Page <= 0 {
|
|||
|
|
req.Page = 1
|
|||
|
|
}
|
|||
|
|
if req.Size <= 0 {
|
|||
|
|
req.Size = 10
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 构建查询条件
|
|||
|
|
query := dao.Attachment.Ctx(ctx)
|
|||
|
|
|
|||
|
|
// 关键词搜索
|
|||
|
|
if req.Query != "" {
|
|||
|
|
keyword := "%" + req.Query + "%"
|
|||
|
|
query = query.Where("name LIKE ?", keyword)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 类型筛选
|
|||
|
|
if req.Type != "" {
|
|||
|
|
query = query.Where("mime_type", req.Type)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取总数
|
|||
|
|
total, err := query.Count()
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, gerror.New("获取搜索结果总数失败")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取列表数据
|
|||
|
|
var attachments []entity.Attachment
|
|||
|
|
err = query.Order("id DESC").
|
|||
|
|
Limit((req.Page-1)*req.Size, req.Size).
|
|||
|
|
Scan(&attachments)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, gerror.New("获取搜索结果失败")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 转换为响应格式
|
|||
|
|
list := make([]AttachmentItem, 0, len(attachments))
|
|||
|
|
for _, attachment := range attachments {
|
|||
|
|
list = append(list, AttachmentItem{
|
|||
|
|
Id: attachment.Id,
|
|||
|
|
Filename: attachment.Name,
|
|||
|
|
OriginalName: attachment.Name,
|
|||
|
|
Url: attachment.Url,
|
|||
|
|
Size: attachment.Size,
|
|||
|
|
Type: attachment.MimeType,
|
|||
|
|
Category: "default",
|
|||
|
|
Description: "",
|
|||
|
|
UserId: uint(attachment.UserId),
|
|||
|
|
CreatedAt: attachment.CreatedAt.Unix(),
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return &AttachmentSearchRes{
|
|||
|
|
List: list,
|
|||
|
|
Total: total,
|
|||
|
|
Page: req.Page,
|
|||
|
|
Size: req.Size,
|
|||
|
|
}, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// UserList 用户获取附件列表
|
|||
|
|
func (s *AttachmentService) UserList(ctx context.Context, req *AttachmentUserListReq) (*AttachmentUserListRes, error) {
|
|||
|
|
// 设置默认值
|
|||
|
|
if req.Page <= 0 {
|
|||
|
|
req.Page = 1
|
|||
|
|
}
|
|||
|
|
if req.Size <= 0 {
|
|||
|
|
req.Size = 10
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取当前用户ID
|
|||
|
|
userId := GetUserIdFromContext(ctx)
|
|||
|
|
if userId == 0 {
|
|||
|
|
return nil, gerror.New("用户未登录")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 构建查询条件
|
|||
|
|
query := dao.Attachment.Ctx(ctx).Where("user_id", userId)
|
|||
|
|
|
|||
|
|
// 类型筛选
|
|||
|
|
if req.Type != "" {
|
|||
|
|
query = query.Where("mime_type", req.Type)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 关键词搜索
|
|||
|
|
if req.Keyword != "" {
|
|||
|
|
keyword := "%" + req.Keyword + "%"
|
|||
|
|
query = query.Where("name LIKE ?", keyword)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取总数
|
|||
|
|
total, err := query.Count()
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, gerror.New("获取附件总数失败")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取列表数据
|
|||
|
|
var attachments []entity.Attachment
|
|||
|
|
err = query.Order("id DESC").
|
|||
|
|
Limit((req.Page-1)*req.Size, req.Size).
|
|||
|
|
Scan(&attachments)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, gerror.New("获取附件列表失败")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 转换为响应格式
|
|||
|
|
list := make([]AttachmentUserItem, 0, len(attachments))
|
|||
|
|
for _, attachment := range attachments {
|
|||
|
|
list = append(list, AttachmentUserItem{
|
|||
|
|
Id: attachment.Id,
|
|||
|
|
Filename: attachment.Name,
|
|||
|
|
OriginalName: attachment.Name,
|
|||
|
|
Url: attachment.Url,
|
|||
|
|
Size: attachment.Size,
|
|||
|
|
Type: attachment.MimeType,
|
|||
|
|
Category: "default",
|
|||
|
|
Description: "",
|
|||
|
|
CreatedAt: attachment.CreatedAt.Unix(),
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return &AttachmentUserListRes{
|
|||
|
|
List: list,
|
|||
|
|
Total: total,
|
|||
|
|
Page: req.Page,
|
|||
|
|
Size: req.Size,
|
|||
|
|
}, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetUserIdFromContext 从上下文获取用户ID
|
|||
|
|
func GetUserIdFromContext(ctx context.Context) uint {
|
|||
|
|
// 这里应该从JWT token或session中获取用户ID
|
|||
|
|
// 临时返回固定值
|
|||
|
|
return 1
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// UserUpload 用户上传附件
|
|||
|
|
func (s *AttachmentService) UserUpload(r *ghttp.Request) {
|
|||
|
|
s.Upload(r)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// UserGetList 用户获取附件列表
|
|||
|
|
func (s *AttachmentService) UserGetList(r *ghttp.Request) {
|
|||
|
|
// 获取请求参数并转换为内部请求结构
|
|||
|
|
req := &AttachmentUserListReq{
|
|||
|
|
Page: r.Get("page", 1).Int(),
|
|||
|
|
Size: r.Get("size", 10).Int(),
|
|||
|
|
Type: r.Get("type").String(),
|
|||
|
|
Category: r.Get("category").String(),
|
|||
|
|
Keyword: r.Get("keyword").String(),
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 调用服务方法
|
|||
|
|
res, err := s.UserList(r.Context(), req)
|
|||
|
|
if err != nil {
|
|||
|
|
response.Error(r, response.CodeInternalError, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
response.Success(r, res)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// UserGetDetail 用户获取附件详情
|
|||
|
|
func (s *AttachmentService) UserGetDetail(r *ghttp.Request) {
|
|||
|
|
req := &AttachmentDetailReq{
|
|||
|
|
Id: uint(r.Get("id").Int()),
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
res, err := s.Detail(r.Context(), req)
|
|||
|
|
if err != nil {
|
|||
|
|
response.Error(r, response.CodeInternalError, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
response.Success(r, res)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// UserUpdate 用户更新附件
|
|||
|
|
func (s *AttachmentService) UserUpdate(r *ghttp.Request) {
|
|||
|
|
req := &AttachmentUpdateReq{
|
|||
|
|
Id: uint(r.Get("id").Int()),
|
|||
|
|
Category: r.Get("category").String(),
|
|||
|
|
Description: r.Get("description").String(),
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
err := s.Update(r.Context(), req)
|
|||
|
|
if err != nil {
|
|||
|
|
response.Error(r, response.CodeInternalError, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
response.Success(r, "更新成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// UserDelete 用户删除附件
|
|||
|
|
func (s *AttachmentService) UserDelete(r *ghttp.Request) {
|
|||
|
|
req := &AttachmentDeleteReq{
|
|||
|
|
Id: uint(r.Get("id").Int()),
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
err := s.Delete(r.Context(), req)
|
|||
|
|
if err != nil {
|
|||
|
|
response.Error(r, response.CodeInternalError, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
response.Success(r, "删除成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// UserDownload 用户下载附件
|
|||
|
|
func (s *AttachmentService) UserDownload(r *ghttp.Request) {
|
|||
|
|
req := &AttachmentDownloadReq{
|
|||
|
|
Id: uint(r.Get("id").Int()),
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
res, err := s.Download(r.Context(), req)
|
|||
|
|
if err != nil {
|
|||
|
|
response.Error(r, response.CodeInternalError, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
response.Success(r, res)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// UserCopy 用户复制附件
|
|||
|
|
func (s *AttachmentService) UserCopy(r *ghttp.Request) {
|
|||
|
|
req := &AttachmentCopyReq{
|
|||
|
|
Id: uint(r.Get("id").Int()),
|
|||
|
|
NewCategory: r.Get("new_category").String(),
|
|||
|
|
Description: r.Get("description").String(),
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
res, err := s.Copy(r.Context(), req)
|
|||
|
|
if err != nil {
|
|||
|
|
response.Error(r, response.CodeInternalError, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
response.Success(r, res)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// UserRename 用户重命名附件
|
|||
|
|
func (s *AttachmentService) UserRename(r *ghttp.Request) {
|
|||
|
|
req := &AttachmentRenameReq{
|
|||
|
|
Id: uint(r.Get("id").Int()),
|
|||
|
|
Filename: r.Get("filename").String(),
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
err := s.Rename(r.Context(), req)
|
|||
|
|
if err != nil {
|
|||
|
|
response.Error(r, response.CodeInternalError, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
response.Success(r, "重命名成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// UserSearch 用户搜索附件
|
|||
|
|
func (s *AttachmentService) UserSearch(r *ghttp.Request) {
|
|||
|
|
req := &AttachmentSearchReq{
|
|||
|
|
Query: r.Get("query").String(),
|
|||
|
|
Type: r.Get("type").String(),
|
|||
|
|
Category: r.Get("category").String(),
|
|||
|
|
Page: r.Get("page", 1).Int(),
|
|||
|
|
Size: r.Get("size", 10).Int(),
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
res, err := s.Search(r.Context(), req)
|
|||
|
|
if err != nil {
|
|||
|
|
response.Error(r, response.CodeInternalError, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
response.Success(r, res)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// UserGetCategoryList 用户获取附件分类列表
|
|||
|
|
func (s *AttachmentService) UserGetCategoryList(r *ghttp.Request) {
|
|||
|
|
req := &AttachmentCategoryListReq{
|
|||
|
|
Type: r.Get("type").String(),
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
res, err := s.GetCategoryList(r.Context(), req)
|
|||
|
|
if err != nil {
|
|||
|
|
response.Error(r, response.CodeInternalError, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
response.Success(r, res)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// AdminGetList 管理员获取附件列表
|
|||
|
|
func (s *AttachmentService) AdminGetList(r *ghttp.Request) {
|
|||
|
|
req := &AttachmentListReq{
|
|||
|
|
Page: r.Get("page", 1).Int(),
|
|||
|
|
Size: r.Get("size", 10).Int(),
|
|||
|
|
Type: r.Get("type").String(),
|
|||
|
|
Category: r.Get("category").String(),
|
|||
|
|
Keyword: r.Get("keyword").String(),
|
|||
|
|
StartDate: r.Get("start_date").String(),
|
|||
|
|
EndDate: r.Get("end_date").String(),
|
|||
|
|
MinSize: r.Get("min_size").Int64(),
|
|||
|
|
MaxSize: r.Get("max_size").Int64(),
|
|||
|
|
UserId: uint(r.Get("user_id").Int()),
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
res, err := s.List(r.Context(), req)
|
|||
|
|
if err != nil {
|
|||
|
|
response.Error(r, response.CodeInternalError, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
response.Success(r, res)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// AdminGetDetail 管理员获取附件详情
|
|||
|
|
func (s *AttachmentService) AdminGetDetail(r *ghttp.Request) {
|
|||
|
|
s.UserGetDetail(r)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// AdminUpdate 管理员更新附件
|
|||
|
|
func (s *AttachmentService) AdminUpdate(r *ghttp.Request) {
|
|||
|
|
s.UserUpdate(r)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// AdminDelete 管理员删除附件
|
|||
|
|
func (s *AttachmentService) AdminDelete(r *ghttp.Request) {
|
|||
|
|
s.UserDelete(r)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// AdminBatchDelete 管理员批量删除附件
|
|||
|
|
func (s *AttachmentService) AdminBatchDelete(r *ghttp.Request) {
|
|||
|
|
var ids []uint
|
|||
|
|
r.Parse(&ids)
|
|||
|
|
|
|||
|
|
req := &AttachmentBatchDeleteReq{
|
|||
|
|
Ids: ids,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
err := s.BatchDelete(r.Context(), req)
|
|||
|
|
if err != nil {
|
|||
|
|
response.Error(r, response.CodeInternalError, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
response.Success(r, "批量删除成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// AdminDownload 管理员下载附件
|
|||
|
|
func (s *AttachmentService) AdminDownload(r *ghttp.Request) {
|
|||
|
|
s.UserDownload(r)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// AdminMove 管理员移动附件
|
|||
|
|
func (s *AttachmentService) AdminMove(r *ghttp.Request) {
|
|||
|
|
var ids []uint
|
|||
|
|
r.Parse(&ids)
|
|||
|
|
|
|||
|
|
req := &AttachmentMoveReq{
|
|||
|
|
Ids: ids,
|
|||
|
|
NewCategory: r.Get("new_category").String(),
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
err := s.Move(r.Context(), req)
|
|||
|
|
if err != nil {
|
|||
|
|
response.Error(r, response.CodeInternalError, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
response.Success(r, "移动成功")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// AdminCopy 管理员复制附件
|
|||
|
|
func (s *AttachmentService) AdminCopy(r *ghttp.Request) {
|
|||
|
|
s.UserCopy(r)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// AdminRename 管理员重命名附件
|
|||
|
|
func (s *AttachmentService) AdminRename(r *ghttp.Request) {
|
|||
|
|
s.UserRename(r)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// AdminSearch 管理员搜索附件
|
|||
|
|
func (s *AttachmentService) AdminSearch(r *ghttp.Request) {
|
|||
|
|
s.UserSearch(r)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// AdminGetCategoryList 管理员获取附件分类列表
|
|||
|
|
func (s *AttachmentService) AdminGetCategoryList(r *ghttp.Request) {
|
|||
|
|
s.UserGetCategoryList(r)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// AdminGetStatistics 管理员获取附件统计
|
|||
|
|
func (s *AttachmentService) AdminGetStatistics(r *ghttp.Request) {
|
|||
|
|
req := &AttachmentStatisticsReq{
|
|||
|
|
StartDate: r.Get("start_date").String(),
|
|||
|
|
EndDate: r.Get("end_date").String(),
|
|||
|
|
Type: r.Get("type").String(),
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
res, err := s.GetStatistics(r.Context(), req)
|
|||
|
|
if err != nil {
|
|||
|
|
response.Error(r, response.CodeInternalError, err.Error())
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
response.Success(r, res)
|
|||
|
|
}
|