Files
EasyGoAdmin_GoFrame_EleVue/internal/logic/file_template.go
T
2026-10-20 11:37:25 +08:00

145 lines
4.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package logic
import (
"context"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/errors/gerror"
"easygoadmin/api/v1"
"easygoadmin/internal/consts"
"easygoadmin/internal/dao"
"easygoadmin/internal/service"
"easygoadmin/utility/upload"
)
// ============================== 文件模板业务实现 ==============================
// sFileTemplate 文件模板业务实现
// 实现 service.IFileTemplate 接口,承载文件模板模块的业务逻辑
type sFileTemplate struct{}
// fileTemplateSpec 文件模板模块声明
// ByCode 为特有方法,保留手写实现
var fileTemplateSpec = ModuleSpec[v1.FileTemplateItem, v1.FileTemplateItem, v1.FileTemplateDetailRes]{
Model: dao.FileTemplate.Ctx,
LikeFields: []string{"name", "code"},
OrderBy: "sort, id",
FileFields: []string{"filePath"}, // 读侧自动补域名(file.domainUrl)
FileSaveDir: "file_template",
}
func init() {
service.RegisterFileTemplate(&sFileTemplate{})
}
// Page 文件模板分页
// 按查询条件分页返回文件模板列表
func (s *sFileTemplate) Page(ctx context.Context, req *v1.FileTemplatePageReq) (res *v1.FileTemplatePageRes, err error) {
list, total, err := fileTemplateSpec.Page(ctx, req, req.GetPageNo(), req.GetPageSize())
if err != nil {
return nil, err
}
return v1.NewPageData(req.GetPageNo(), req.GetPageSize(), total, derefSlice(list)), nil
}
// List 文件模板全量列表
// 按关键词返回文件模板列表
func (s *sFileTemplate) List(ctx context.Context, req *v1.FileTemplateListReq) (res v1.FileTemplateListRes, err error) {
list, err := fileTemplateSpec.List(ctx, req)
if err != nil {
return nil, err
}
return derefSlice(list), nil
}
// Detail 文件模板详情
// 按模板ID查询详情
func (s *sFileTemplate) Detail(ctx context.Context, req *v1.FileTemplateDetailReq) (res *v1.FileTemplateDetailRes, err error) {
return fileTemplateSpec.Detail(ctx, req.Id, req)
}
// Add 新增文件模板
// 校验模板编码唯一后新增,文件路径由临时目录转正,返回新记录ID
func (s *sFileTemplate) Add(ctx context.Context, req *v1.FileTemplateAddReq) (res *v1.IdRes, err error) {
if err = CheckUnique(ctx, dao.FileTemplate.Ctx(ctx), "code", req.Code, 0, "模板编码"); err != nil {
return nil, err
}
result, err := dao.FileTemplate.Ctx(ctx).Data(map[string]any{
"name": req.Name,
"code": req.Code,
"file_name": req.FileName,
"file_path": SaveFileField(ctx, req.FilePath, "file_template"),
"note": req.Note,
"sort": req.Sort,
}).Insert()
if err != nil {
return nil, err
}
idv, _ := result.LastInsertId()
return &v1.IdRes{Id: idv}, nil
}
// Update 修改文件模板
// 按模板ID更新记录,文件路径由临时目录转正
func (s *sFileTemplate) Update(ctx context.Context, req *v1.FileTemplateUpdateReq) (res *v1.FileTemplateUpdateRes, err error) {
if _, err = dao.FileTemplate.Ctx(ctx).Where("id", req.Id).Data(map[string]any{
"name": req.Name,
"code": req.Code,
"file_name": req.FileName,
"file_path": SaveFileField(ctx, req.FilePath, "file_template"),
"note": req.Note,
"sort": req.Sort,
}).Update(); err != nil {
return nil, err
}
return &v1.FileTemplateUpdateRes{}, nil
}
// Delete 删除文件模板
// 按模板ID删除单条记录
func (s *sFileTemplate) Delete(ctx context.Context, req *v1.FileTemplateDeleteReq) (res *v1.FileTemplateDeleteRes, err error) {
if err = fileTemplateSpec.Delete(ctx, req.Id); err != nil {
return nil, err
}
return &v1.FileTemplateDeleteRes{}, nil
}
// BatchDelete 批量删除文件模板
// 按模板ID列表批量删除记录
func (s *sFileTemplate) BatchDelete(ctx context.Context, req *v1.FileTemplateBatchDeleteReq) (res *v1.FileTemplateBatchDeleteRes, err error) {
if err = fileTemplateSpec.BatchDelete(ctx, req.Ids); err != nil {
return nil, err
}
return &v1.FileTemplateBatchDeleteRes{}, nil
}
// ByCode 按编码查询模板
// 登录用户即可访问,按模板编码查询模板详情
func (s *sFileTemplate) ByCode(ctx context.Context, req *v1.FileTemplateByCodeReq) (res *v1.FileTemplateByCodeRes, err error) {
one, err := dao.FileTemplate.Ctx(ctx).Where("code", req.Code).One()
if err != nil {
return nil, err
}
if len(one) == 0 {
return nil, gerror.NewCode(consts.CodeRecordNotFound)
}
return &v1.FileTemplateByCodeRes{FileTemplateItem: s.toItem(ctx, one)}, nil
}
// toItem 数据库记录转换为文件模板行数据
// 文件路径补全为可访问的URL
func (s *sFileTemplate) toItem(ctx context.Context, r gdb.Record) v1.FileTemplateItem {
return v1.FileTemplateItem{
Id: r["id"].Int64(),
Name: r["name"].String(),
Code: r["code"].String(),
FileName: r["file_name"].String(),
FilePath: upload.GetFileUrl(ctx, r["file_path"].String()),
Note: r["note"].String(),
Sort: r["sort"].Int(),
CreateUser: r["create_user"].String(),
CreateTime: r["create_time"].GTime(),
}
}