diff --git a/app/http/controllers/file_controller.go b/app/http/controllers/file_controller.go index d63347b4..1d3913f3 100644 --- a/app/http/controllers/file_controller.go +++ b/app/http/controllers/file_controller.go @@ -1,11 +1,457 @@ package controllers +import ( + "os" + "path/filepath" + "strings" + + "github.com/goravel/framework/contracts/http" + + requests "panel/app/http/requests/file" + "panel/pkg/tools" +) + type FileController struct { - // Dependent services } func NewFileController() *FileController { - return &FileController{ - // Inject services - } + return &FileController{} +} + +// Create +// +// @Summary 创建文件/目录 +// @Description 创建文件/目录到给定路径 +// @Tags 文件管理 +// @Accept json +// @Produce json +// @Security BearerToken +// @Param data body requests.NotExist true "request" +// @Success 200 {object} SuccessResponse +// @Router /panel/file/create [post] +func (r *FileController) Create(ctx http.Context) http.Response { + var request requests.NotExist + sanitize := Sanitize(ctx, &request) + if sanitize != nil { + return sanitize + } + + isDir := ctx.Request().InputBool("dir") + if !isDir { + if out, err := tools.Exec("touch " + request.Path); err != nil { + return Error(ctx, http.StatusInternalServerError, out) + } + } else { + if err := tools.Mkdir(request.Path, 0755); err != nil { + return Error(ctx, http.StatusInternalServerError, err.Error()) + } + } + + if err := tools.Chmod(request.Path, 0755); err != nil { + return Error(ctx, http.StatusInternalServerError, err.Error()) + } + if err := tools.Chown(request.Path, "www", "www"); err != nil { + return Error(ctx, http.StatusInternalServerError, err.Error()) + } + + return Success(ctx, nil) +} + +// Content +// +// @Summary 获取文件内容 +// @Description 获取给定路径的文件内容 +// @Tags 文件管理 +// @Accept json +// @Produce json +// @Security BearerToken +// @Param data query requests.Exist true "request" +// @Success 200 {object} SuccessResponse +// @Router /panel/file/content [get] +func (r *FileController) Content(ctx http.Context) http.Response { + var request requests.Exist + sanitize := Sanitize(ctx, &request) + if sanitize != nil { + return sanitize + } + + content, err := tools.Read(request.Path) + if err != nil { + return Error(ctx, http.StatusInternalServerError, err.Error()) + } + + return Success(ctx, content) +} + +// Save +// +// @Summary 保存文件内容 +// @Description 保存给定路径的文件内容 +// @Tags 文件管理 +// @Accept json +// @Produce json +// @Security BearerToken +// @Param data body requests.Exist true "request" +// @Param content body string true "content" +// @Success 200 {object} SuccessResponse +// @Router /panel/file/save [post] +func (r *FileController) Save(ctx http.Context) http.Response { + var request requests.Exist + sanitize := Sanitize(ctx, &request) + if sanitize != nil { + return sanitize + } + + content := ctx.Request().Input("content") + + fileInfo, err := tools.FileInfo(request.Path) + if err != nil { + return Error(ctx, http.StatusInternalServerError, err.Error()) + } + if err = tools.Write(request.Path, content, fileInfo.Mode()); err != nil { + return Error(ctx, http.StatusInternalServerError, err.Error()) + } + + return Success(ctx, nil) +} + +// Delete +// +// @Summary 删除文件/目录 +// @Description 删除给定路径的文件/目录 +// @Tags 文件管理 +// @Accept json +// @Produce json +// @Security BearerToken +// @Param data body requests.Exist true "request" +// @Success 200 {object} SuccessResponse +// @Router /panel/file/delete [post] +func (r *FileController) Delete(ctx http.Context) http.Response { + var request requests.Exist + sanitize := Sanitize(ctx, &request) + if sanitize != nil { + return sanitize + } + + if err := tools.Remove(request.Path); err != nil { + return Error(ctx, http.StatusInternalServerError, err.Error()) + } + + return Success(ctx, nil) +} + +// Upload +// +// @Summary 上传文件 +// @Description 上传文件到给定路径 +// @Tags 文件管理 +// @Accept json +// @Produce json +// @Security BearerToken +// @Param data body requests.NotExist true "request" +// @Param file formData file true "file" +// @Success 200 {object} SuccessResponse +// @Router /panel/file/upload [post] +func (r *FileController) Upload(ctx http.Context) http.Response { + var request requests.NotExist + sanitize := Sanitize(ctx, &request) + if sanitize != nil { + return sanitize + } + + pathInfo, err := tools.FileInfo(request.Path) + if err != nil { + return Error(ctx, http.StatusInternalServerError, err.Error()) + } + if !pathInfo.IsDir() { + return Error(ctx, http.StatusInternalServerError, "目标路径不是目录") + } + + file, err := ctx.Request().File("file") + if err != nil { + return Error(ctx, http.StatusInternalServerError, "上传文件失败") + } + + _, err = file.Store(request.Path) + if err != nil { + return Error(ctx, http.StatusInternalServerError, err.Error()) + } + + return Success(ctx, nil) +} + +// Move +// +// @Summary 移动文件/目录 +// @Description 移动文件/目录到给定路径,等效于重命名 +// @Tags 文件管理 +// @Accept json +// @Produce json +// @Security BearerToken +// @Param data body requests.Move true "request" +// @Success 200 {object} SuccessResponse +// @Router /panel/file/move [post] +func (r *FileController) Move(ctx http.Context) http.Response { + var request requests.Move + sanitize := Sanitize(ctx, &request) + if sanitize != nil { + return sanitize + } + + if tools.Exists(request.New) && !ctx.Request().InputBool("force") { + return Error(ctx, http.StatusInternalServerError, "目标路径已存在,是否覆盖?") + } + + if err := tools.Mv(request.Old, request.New); err != nil { + return Error(ctx, http.StatusInternalServerError, err.Error()) + } + + return Success(ctx, nil) +} + +// Copy +// +// @Summary 复制文件/目录 +// @Description 复制文件/目录到给定路径 +// @Tags 文件管理 +// @Accept json +// @Produce json +// @Security BearerToken +// @Param data body requests.Copy true "request" +// @Success 200 {object} SuccessResponse +// @Router /panel/file/copy [post] +func (r *FileController) Copy(ctx http.Context) http.Response { + var request requests.Copy + sanitize := Sanitize(ctx, &request) + if sanitize != nil { + return sanitize + } + + if tools.Exists(request.New) && !ctx.Request().InputBool("force") { + return Error(ctx, http.StatusInternalServerError, "目标路径已存在,是否覆盖?") + } + + if err := tools.Cp(request.Old, request.New); err != nil { + return Error(ctx, http.StatusInternalServerError, err.Error()) + } + + return Success(ctx, nil) +} + +// Download +// +// @Summary 下载文件 +// @Description 下载给定路径的文件 +// @Tags 文件管理 +// @Accept json +// @Produce json +// @Security BearerToken +// @Param data query requests.NotExist true "request" +// @Success 200 {object} SuccessResponse +// @Router /panel/file/download [get] +func (r *FileController) Download(ctx http.Context) http.Response { + var request requests.NotExist + sanitize := Sanitize(ctx, &request) + if sanitize != nil { + return sanitize + } + + info, err := tools.FileInfo(request.Path) + if err != nil { + return Error(ctx, http.StatusInternalServerError, err.Error()) + } + if info.IsDir() { + return Error(ctx, http.StatusInternalServerError, "不能下载目录") + } + + return ctx.Response().Download(request.Path, info.Name()) +} + +// RemoteDownload +// +// @Summary 下载远程文件 +// @Description 下载远程文件到给定路径 +// @Tags 文件管理 +// @Accept json +// @Produce json +// @Security BearerToken +// @Param data body requests.NotExist true "request" +// @Success 200 {object} SuccessResponse +// @Router /panel/file/remoteDownload [post] +func (r *FileController) RemoteDownload(ctx http.Context) http.Response { + var request requests.NotExist + sanitize := Sanitize(ctx, &request) + if sanitize != nil { + return sanitize + } + + // TODO 使用异步任务下载文件 + return nil +} + +// Info +// +// @Summary 获取文件/目录信息 +// @Description 获取给定路径的文件/目录信息 +// @Tags 文件管理 +// @Accept json +// @Produce json +// @Security BearerToken +// @Param data query requests.Exist true "request" +// @Success 200 {object} SuccessResponse +// @Router /panel/file/info [get] +func (r *FileController) Info(ctx http.Context) http.Response { + var request requests.Exist + sanitize := Sanitize(ctx, &request) + if sanitize != nil { + return sanitize + } + + fileInfo, err := tools.FileInfo(request.Path) + if err != nil { + return Error(ctx, http.StatusInternalServerError, err.Error()) + } + + return Success(ctx, fileInfo) +} + +// Permission +// +// @Summary 修改文件/目录权限 +// @Description 修改给定路径的文件/目录权限 +// @Tags 文件管理 +// @Accept json +// @Produce json +// @Security BearerToken +// @Param data body requests.Permission true "request" +// @Success 200 {object} SuccessResponse +// @Router /panel/file/permission [post] +func (r *FileController) Permission(ctx http.Context) http.Response { + var request requests.Permission + sanitize := Sanitize(ctx, &request) + if sanitize != nil { + return sanitize + } + + if err := tools.Chmod(request.Path, os.FileMode(request.Mode)); err != nil { + return Error(ctx, http.StatusInternalServerError, err.Error()) + } + + return Success(ctx, nil) +} + +// Archive +// +// @Summary 压缩文件/目录 +// @Description 压缩文件/目录到给定路径 +// @Tags 文件管理 +// @Accept json +// @Produce json +// @Security BearerToken +// @Param data body requests.Archive true "request" +// @Success 200 {object} SuccessResponse +// @Router /panel/file/archive [post] +func (r *FileController) Archive(ctx http.Context) http.Response { + var request requests.Archive + sanitize := Sanitize(ctx, &request) + if sanitize != nil { + return sanitize + } + + if err := tools.Archive(request.Paths, request.File); err != nil { + return Error(ctx, http.StatusInternalServerError, err.Error()) + } + + return Success(ctx, nil) +} + +// UnArchive +// +// @Summary 解压文件/目录 +// @Description 解压文件/目录到给定路径 +// @Tags 文件管理 +// @Accept json +// @Produce json +// @Security BearerToken +// @Param data body requests.UnArchive true "request" +// @Success 200 {object} SuccessResponse +// @Router /panel/file/unArchive [post] +func (r *FileController) UnArchive(ctx http.Context) http.Response { + var request requests.UnArchive + sanitize := Sanitize(ctx, &request) + if sanitize != nil { + return sanitize + } + + if err := tools.UnArchive(request.File, request.Path); err != nil { + return Error(ctx, http.StatusInternalServerError, err.Error()) + } + + return Success(ctx, nil) +} + +// Search +// +// @Summary 搜索文件/目录 +// @Description 通过关键词搜索给定路径的文件/目录 +// @Tags 文件管理 +// @Accept json +// @Produce json +// @Param data body requests.Search true "request" +// @Success 200 {object} SuccessResponse +// @Router /panel/file/search [post] +func (r *FileController) Search(ctx http.Context) http.Response { + var request requests.Search + sanitize := Sanitize(ctx, &request) + if sanitize != nil { + return sanitize + } + + paths := make(map[string]os.FileInfo) + err := filepath.Walk(request.Path, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if strings.Contains(info.Name(), request.KeyWord) { + paths[path] = info + } + return nil + }) + if err != nil { + return Error(ctx, http.StatusInternalServerError, err.Error()) + } + + return Success(ctx, paths) +} + +// List +// +// @Summary 获取文件/目录列表 +// @Description 获取给定路径的文件/目录列表 +// @Tags 文件管理 +// @Accept json +// @Produce json +// @Param data query requests.Exist true "request" +// @Success 200 {object} SuccessResponse +// @Router /panel/file/list [get] +func (r *FileController) List(ctx http.Context) http.Response { + var request requests.Exist + sanitize := Sanitize(ctx, &request) + if sanitize != nil { + return sanitize + } + + paths := make(map[string]os.FileInfo) + err := filepath.Walk(request.Path, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + paths[path] = info + return nil + }) + if err != nil { + return Error(ctx, http.StatusInternalServerError, err.Error()) + } + + return Success(ctx, paths) } diff --git a/app/http/requests/file/archive.go b/app/http/requests/file/archive.go new file mode 100644 index 00000000..6fd5d445 --- /dev/null +++ b/app/http/requests/file/archive.go @@ -0,0 +1,35 @@ +package requests + +import ( + "github.com/goravel/framework/contracts/http" + "github.com/goravel/framework/contracts/validation" +) + +type Archive struct { + Paths []string `form:"paths" json:"paths"` + File string `form:"file" json:"file"` +} + +func (r *Archive) Authorize(ctx http.Context) error { + return nil +} + +func (r *Archive) Rules(ctx http.Context) map[string]string { + return map[string]string{ + "paths": "array", + "paths.*": "regex:^/[a-zA-Z0-9_-]+(\\/[a-zA-Z0-9_-]+)*$|path_exists", + "file": "regex:^/[a-zA-Z0-9_-]+(\\/[a-zA-Z0-9_-]+)*$|path_not_exists", + } +} + +func (r *Archive) Messages(ctx http.Context) map[string]string { + return map[string]string{} +} + +func (r *Archive) Attributes(ctx http.Context) map[string]string { + return map[string]string{} +} + +func (r *Archive) PrepareForValidation(ctx http.Context, data validation.Data) error { + return nil +} diff --git a/app/http/requests/file/copy.go b/app/http/requests/file/copy.go new file mode 100644 index 00000000..994d19ba --- /dev/null +++ b/app/http/requests/file/copy.go @@ -0,0 +1,34 @@ +package requests + +import ( + "github.com/goravel/framework/contracts/http" + "github.com/goravel/framework/contracts/validation" +) + +type Copy struct { + Old string `form:"old" json:"old"` + New string `form:"new" json:"new"` +} + +func (r *Copy) Authorize(ctx http.Context) error { + return nil +} + +func (r *Copy) Rules(ctx http.Context) map[string]string { + return map[string]string{ + "old": "regex:^/[a-zA-Z0-9_-]+(\\/[a-zA-Z0-9_-]+)*$|path_exists", + "new": "regex:^/[a-zA-Z0-9_-]+(\\/[a-zA-Z0-9_-]+)*$", + } +} + +func (r *Copy) Messages(ctx http.Context) map[string]string { + return map[string]string{} +} + +func (r *Copy) Attributes(ctx http.Context) map[string]string { + return map[string]string{} +} + +func (r *Copy) PrepareForValidation(ctx http.Context, data validation.Data) error { + return nil +} diff --git a/app/http/requests/file/exist.go b/app/http/requests/file/exist.go new file mode 100644 index 00000000..b9e4e0f5 --- /dev/null +++ b/app/http/requests/file/exist.go @@ -0,0 +1,32 @@ +package requests + +import ( + "github.com/goravel/framework/contracts/http" + "github.com/goravel/framework/contracts/validation" +) + +type Exist struct { + Path string `form:"path" json:"path"` +} + +func (r *Exist) Authorize(ctx http.Context) error { + return nil +} + +func (r *Exist) Rules(ctx http.Context) map[string]string { + return map[string]string{ + "path": "regex:^/[a-zA-Z0-9_-]+(\\/[a-zA-Z0-9_-]+)*$|path_exists", + } +} + +func (r *Exist) Messages(ctx http.Context) map[string]string { + return map[string]string{} +} + +func (r *Exist) Attributes(ctx http.Context) map[string]string { + return map[string]string{} +} + +func (r *Exist) PrepareForValidation(ctx http.Context, data validation.Data) error { + return nil +} diff --git a/app/http/requests/file/move.go b/app/http/requests/file/move.go new file mode 100644 index 00000000..3dfb85b7 --- /dev/null +++ b/app/http/requests/file/move.go @@ -0,0 +1,34 @@ +package requests + +import ( + "github.com/goravel/framework/contracts/http" + "github.com/goravel/framework/contracts/validation" +) + +type Move struct { + Old string `form:"old" json:"old"` + New string `form:"new" json:"new"` +} + +func (r *Move) Authorize(ctx http.Context) error { + return nil +} + +func (r *Move) Rules(ctx http.Context) map[string]string { + return map[string]string{ + "old": "regex:^/[a-zA-Z0-9_-]+(\\/[a-zA-Z0-9_-]+)*$|path_exists", + "new": "regex:^/[a-zA-Z0-9_-]+(\\/[a-zA-Z0-9_-]+)*$|path_not_exists", + } +} + +func (r *Move) Messages(ctx http.Context) map[string]string { + return map[string]string{} +} + +func (r *Move) Attributes(ctx http.Context) map[string]string { + return map[string]string{} +} + +func (r *Move) PrepareForValidation(ctx http.Context, data validation.Data) error { + return nil +} diff --git a/app/http/requests/file/not_exist.go b/app/http/requests/file/not_exist.go new file mode 100644 index 00000000..3696af1d --- /dev/null +++ b/app/http/requests/file/not_exist.go @@ -0,0 +1,32 @@ +package requests + +import ( + "github.com/goravel/framework/contracts/http" + "github.com/goravel/framework/contracts/validation" +) + +type NotExist struct { + Path string `form:"path" json:"path"` +} + +func (r *NotExist) Authorize(ctx http.Context) error { + return nil +} + +func (r *NotExist) Rules(ctx http.Context) map[string]string { + return map[string]string{ + "path": "regex:^/[a-zA-Z0-9_-]+(\\/[a-zA-Z0-9_-]+)*$|path_not_exists", + } +} + +func (r *NotExist) Messages(ctx http.Context) map[string]string { + return map[string]string{} +} + +func (r *NotExist) Attributes(ctx http.Context) map[string]string { + return map[string]string{} +} + +func (r *NotExist) PrepareForValidation(ctx http.Context, data validation.Data) error { + return nil +} diff --git a/app/http/requests/file/permission.go b/app/http/requests/file/permission.go new file mode 100644 index 00000000..78847817 --- /dev/null +++ b/app/http/requests/file/permission.go @@ -0,0 +1,38 @@ +package requests + +import ( + "github.com/goravel/framework/contracts/http" + "github.com/goravel/framework/contracts/validation" +) + +type Permission struct { + Path string `form:"path" json:"path"` + Mode uint `form:"mode" json:"mode" filter:"uint"` + Owner string `form:"owner" json:"owner"` + Group string `form:"group" json:"group"` +} + +func (r *Permission) Authorize(ctx http.Context) error { + return nil +} + +func (r *Permission) Rules(ctx http.Context) map[string]string { + return map[string]string{ + "path": "regex:^/[a-zA-Z0-9_-]+(\\/[a-zA-Z0-9_-]+)*$|path_exists", + "mode": "regex:^[0-7]{3}$|uint", + "owner": "regex:^[a-zA-Z0-9_-]+$", + "group": "regex:^[a-zA-Z0-9_-]+$", + } +} + +func (r *Permission) Messages(ctx http.Context) map[string]string { + return map[string]string{} +} + +func (r *Permission) Attributes(ctx http.Context) map[string]string { + return map[string]string{} +} + +func (r *Permission) PrepareForValidation(ctx http.Context, data validation.Data) error { + return nil +} diff --git a/app/http/requests/file/search.go b/app/http/requests/file/search.go new file mode 100644 index 00000000..8b6526d5 --- /dev/null +++ b/app/http/requests/file/search.go @@ -0,0 +1,34 @@ +package requests + +import ( + "github.com/goravel/framework/contracts/http" + "github.com/goravel/framework/contracts/validation" +) + +type Search struct { + Path string `form:"path" json:"path"` + KeyWord string `form:"keyword" json:"keyword"` +} + +func (r *Search) Authorize(ctx http.Context) error { + return nil +} + +func (r *Search) Rules(ctx http.Context) map[string]string { + return map[string]string{ + "path": "regex:^/[a-zA-Z0-9_-]+(\\/[a-zA-Z0-9_-]+)*$|path_exists", + "keyword": "required|string", + } +} + +func (r *Search) Messages(ctx http.Context) map[string]string { + return map[string]string{} +} + +func (r *Search) Attributes(ctx http.Context) map[string]string { + return map[string]string{} +} + +func (r *Search) PrepareForValidation(ctx http.Context, data validation.Data) error { + return nil +} diff --git a/app/http/requests/file/un_archive.go b/app/http/requests/file/un_archive.go new file mode 100644 index 00000000..b509226b --- /dev/null +++ b/app/http/requests/file/un_archive.go @@ -0,0 +1,34 @@ +package requests + +import ( + "github.com/goravel/framework/contracts/http" + "github.com/goravel/framework/contracts/validation" +) + +type UnArchive struct { + File string `form:"file" json:"file"` + Path string `form:"path" json:"path"` +} + +func (r *UnArchive) Authorize(ctx http.Context) error { + return nil +} + +func (r *UnArchive) Rules(ctx http.Context) map[string]string { + return map[string]string{ + "file": "regex:^/[a-zA-Z0-9_-]+(\\/[a-zA-Z0-9_-]+)*$|path_exists", + "path": "regex:^/[a-zA-Z0-9_-]+(\\/[a-zA-Z0-9_-]+)*$|path_not_exists", + } +} + +func (r *UnArchive) Messages(ctx http.Context) map[string]string { + return map[string]string{} +} + +func (r *UnArchive) Attributes(ctx http.Context) map[string]string { + return map[string]string{} +} + +func (r *UnArchive) PrepareForValidation(ctx http.Context, data validation.Data) error { + return nil +} diff --git a/app/providers/validation_service_provider.go b/app/providers/validation_service_provider.go index 43b11d3b..db7c738c 100644 --- a/app/providers/validation_service_provider.go +++ b/app/providers/validation_service_provider.go @@ -26,5 +26,7 @@ func (receiver *ValidationServiceProvider) rules() []validation.Rule { &rules.Exists{}, &rules.NotExists{}, &rules.Captcha{}, + &rules.PathExists{}, + &rules.PathNotExists{}, } } diff --git a/app/rules/path_exist.go b/app/rules/path_exist.go new file mode 100644 index 00000000..d8b4428c --- /dev/null +++ b/app/rules/path_exist.go @@ -0,0 +1,36 @@ +package rules + +import ( + "github.com/goravel/framework/contracts/validation" + "github.com/spf13/cast" + "panel/pkg/tools" +) + +type PathExists struct { +} + +// Signature The name of the rule. +func (receiver *PathExists) Signature() string { + return "path_exists" +} + +// Passes Determine if the validation rule passes. +func (receiver *PathExists) Passes(_ validation.Data, val any, options ...any) bool { + // 用户请求过来的数据 + requestValue, err := cast.ToStringE(val) + if err != nil { + return false + } + + // 判断是否为空 + if len(requestValue) == 0 { + return false + } + + return tools.Exists(requestValue) +} + +// Message Get the validation error message. +func (receiver *PathExists) Message() string { + return "路径 %v 不存在" +} diff --git a/app/rules/path_not_exist.go b/app/rules/path_not_exist.go new file mode 100644 index 00000000..78ee918f --- /dev/null +++ b/app/rules/path_not_exist.go @@ -0,0 +1,36 @@ +package rules + +import ( + "github.com/goravel/framework/contracts/validation" + "github.com/spf13/cast" + "panel/pkg/tools" +) + +type PathNotExists struct { +} + +// Signature The name of the rule. +func (receiver *PathNotExists) Signature() string { + return "path_exists" +} + +// Passes Determine if the validation rule passes. +func (receiver *PathNotExists) Passes(_ validation.Data, val any, options ...any) bool { + // 用户请求过来的数据 + requestValue, err := cast.ToStringE(val) + if err != nil { + return false + } + + // 判断是否为空 + if len(requestValue) == 0 { + return false + } + + return !tools.Exists(requestValue) +} + +// Message Get the validation error message. +func (receiver *PathNotExists) Message() string { + return "路径 %v 已存在" +} diff --git a/docs/docs.go b/docs/docs.go index da1eecb4..f027cc03 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -858,6 +858,581 @@ const docTemplate = `{ } } }, + "/panel/file/archive": { + "post": { + "security": [ + { + "BearerToken": [] + } + ], + "description": "压缩文件/目录到给定路径", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "压缩文件/目录", + "parameters": [ + { + "description": "request", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/requests.Archive" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/content": { + "get": { + "security": [ + { + "BearerToken": [] + } + ], + "description": "获取给定路径的文件内容", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "获取文件内容", + "parameters": [ + { + "type": "string", + "name": "path", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/copy": { + "post": { + "security": [ + { + "BearerToken": [] + } + ], + "description": "复制文件/目录到给定路径", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "复制文件/目录", + "parameters": [ + { + "description": "request", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/requests.Copy" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/create": { + "post": { + "security": [ + { + "BearerToken": [] + } + ], + "description": "创建文件/目录到给定路径", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "创建文件/目录", + "parameters": [ + { + "description": "request", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/requests.NotExist" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/delete": { + "post": { + "security": [ + { + "BearerToken": [] + } + ], + "description": "删除给定路径的文件/目录", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "删除文件/目录", + "parameters": [ + { + "description": "request", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/requests.Exist" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/download": { + "get": { + "security": [ + { + "BearerToken": [] + } + ], + "description": "下载给定路径的文件", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "下载文件", + "parameters": [ + { + "type": "string", + "name": "path", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/info": { + "get": { + "security": [ + { + "BearerToken": [] + } + ], + "description": "获取给定路径的文件/目录信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "获取文件/目录信息", + "parameters": [ + { + "type": "string", + "name": "path", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/list": { + "get": { + "description": "获取给定路径的文件/目录列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "获取文件/目录列表", + "parameters": [ + { + "type": "string", + "name": "path", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/move": { + "post": { + "security": [ + { + "BearerToken": [] + } + ], + "description": "移动文件/目录到给定路径,等效于重命名", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "移动文件/目录", + "parameters": [ + { + "description": "request", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/requests.Move" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/permission": { + "post": { + "security": [ + { + "BearerToken": [] + } + ], + "description": "修改给定路径的文件/目录权限", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "修改文件/目录权限", + "parameters": [ + { + "description": "request", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/requests.Permission" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/remoteDownload": { + "post": { + "security": [ + { + "BearerToken": [] + } + ], + "description": "下载远程文件到给定路径", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "下载远程文件", + "parameters": [ + { + "description": "request", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/requests.NotExist" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/save": { + "post": { + "security": [ + { + "BearerToken": [] + } + ], + "description": "保存给定路径的文件内容", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "保存文件内容", + "parameters": [ + { + "description": "request", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/requests.Exist" + } + }, + { + "description": "content", + "name": "content", + "in": "body", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/search": { + "post": { + "description": "通过关键词搜索给定路径的文件/目录", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "搜索文件/目录", + "parameters": [ + { + "description": "request", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/requests.Search" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/unArchive": { + "post": { + "security": [ + { + "BearerToken": [] + } + ], + "description": "解压文件/目录到给定路径", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "解压文件/目录", + "parameters": [ + { + "description": "request", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/requests.UnArchive" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/upload": { + "post": { + "security": [ + { + "BearerToken": [] + } + ], + "description": "上传文件到给定路径", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "上传文件", + "parameters": [ + { + "description": "request", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/requests.NotExist" + } + }, + { + "type": "file", + "description": "file", + "name": "file", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, "/panel/setting/list": { "get": { "security": [ @@ -2302,6 +2877,20 @@ const docTemplate = `{ } } }, + "requests.Archive": { + "type": "object", + "properties": { + "file": { + "type": "string" + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, "requests.CertStore": { "type": "object", "properties": { @@ -2357,6 +2946,17 @@ const docTemplate = `{ } } }, + "requests.Copy": { + "type": "object", + "properties": { + "new": { + "type": "string" + }, + "old": { + "type": "string" + } + } + }, "requests.Create": { "type": "object", "properties": { @@ -2419,6 +3019,14 @@ const docTemplate = `{ } } }, + "requests.Exist": { + "type": "object", + "properties": { + "path": { + "type": "string" + } + } + }, "requests.Login": { "type": "object", "properties": { @@ -2430,6 +3038,25 @@ const docTemplate = `{ } } }, + "requests.Move": { + "type": "object", + "properties": { + "new": { + "type": "string" + }, + "old": { + "type": "string" + } + } + }, + "requests.NotExist": { + "type": "object", + "properties": { + "path": { + "type": "string" + } + } + }, "requests.Obtain": { "type": "object", "properties": { @@ -2438,6 +3065,23 @@ const docTemplate = `{ } } }, + "requests.Permission": { + "type": "object", + "properties": { + "group": { + "type": "string" + }, + "mode": { + "type": "integer" + }, + "owner": { + "type": "string" + }, + "path": { + "type": "string" + } + } + }, "requests.Renew": { "type": "object", "properties": { @@ -2514,6 +3158,28 @@ const docTemplate = `{ } } }, + "requests.Search": { + "type": "object", + "properties": { + "keyword": { + "type": "string" + }, + "path": { + "type": "string" + } + } + }, + "requests.UnArchive": { + "type": "object", + "properties": { + "file": { + "type": "string" + }, + "path": { + "type": "string" + } + } + }, "requests.UpdateConfig": { "type": "object", "properties": { diff --git a/docs/swagger.json b/docs/swagger.json index ecfc576e..c501d1d0 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -851,6 +851,581 @@ } } }, + "/panel/file/archive": { + "post": { + "security": [ + { + "BearerToken": [] + } + ], + "description": "压缩文件/目录到给定路径", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "压缩文件/目录", + "parameters": [ + { + "description": "request", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/requests.Archive" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/content": { + "get": { + "security": [ + { + "BearerToken": [] + } + ], + "description": "获取给定路径的文件内容", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "获取文件内容", + "parameters": [ + { + "type": "string", + "name": "path", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/copy": { + "post": { + "security": [ + { + "BearerToken": [] + } + ], + "description": "复制文件/目录到给定路径", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "复制文件/目录", + "parameters": [ + { + "description": "request", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/requests.Copy" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/create": { + "post": { + "security": [ + { + "BearerToken": [] + } + ], + "description": "创建文件/目录到给定路径", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "创建文件/目录", + "parameters": [ + { + "description": "request", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/requests.NotExist" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/delete": { + "post": { + "security": [ + { + "BearerToken": [] + } + ], + "description": "删除给定路径的文件/目录", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "删除文件/目录", + "parameters": [ + { + "description": "request", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/requests.Exist" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/download": { + "get": { + "security": [ + { + "BearerToken": [] + } + ], + "description": "下载给定路径的文件", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "下载文件", + "parameters": [ + { + "type": "string", + "name": "path", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/info": { + "get": { + "security": [ + { + "BearerToken": [] + } + ], + "description": "获取给定路径的文件/目录信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "获取文件/目录信息", + "parameters": [ + { + "type": "string", + "name": "path", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/list": { + "get": { + "description": "获取给定路径的文件/目录列表", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "获取文件/目录列表", + "parameters": [ + { + "type": "string", + "name": "path", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/move": { + "post": { + "security": [ + { + "BearerToken": [] + } + ], + "description": "移动文件/目录到给定路径,等效于重命名", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "移动文件/目录", + "parameters": [ + { + "description": "request", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/requests.Move" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/permission": { + "post": { + "security": [ + { + "BearerToken": [] + } + ], + "description": "修改给定路径的文件/目录权限", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "修改文件/目录权限", + "parameters": [ + { + "description": "request", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/requests.Permission" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/remoteDownload": { + "post": { + "security": [ + { + "BearerToken": [] + } + ], + "description": "下载远程文件到给定路径", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "下载远程文件", + "parameters": [ + { + "description": "request", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/requests.NotExist" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/save": { + "post": { + "security": [ + { + "BearerToken": [] + } + ], + "description": "保存给定路径的文件内容", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "保存文件内容", + "parameters": [ + { + "description": "request", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/requests.Exist" + } + }, + { + "description": "content", + "name": "content", + "in": "body", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/search": { + "post": { + "description": "通过关键词搜索给定路径的文件/目录", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "搜索文件/目录", + "parameters": [ + { + "description": "request", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/requests.Search" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/unArchive": { + "post": { + "security": [ + { + "BearerToken": [] + } + ], + "description": "解压文件/目录到给定路径", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "解压文件/目录", + "parameters": [ + { + "description": "request", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/requests.UnArchive" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, + "/panel/file/upload": { + "post": { + "security": [ + { + "BearerToken": [] + } + ], + "description": "上传文件到给定路径", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "文件管理" + ], + "summary": "上传文件", + "parameters": [ + { + "description": "request", + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/requests.NotExist" + } + }, + { + "type": "file", + "description": "file", + "name": "file", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/controllers.SuccessResponse" + } + } + } + } + }, "/panel/setting/list": { "get": { "security": [ @@ -2295,6 +2870,20 @@ } } }, + "requests.Archive": { + "type": "object", + "properties": { + "file": { + "type": "string" + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, "requests.CertStore": { "type": "object", "properties": { @@ -2350,6 +2939,17 @@ } } }, + "requests.Copy": { + "type": "object", + "properties": { + "new": { + "type": "string" + }, + "old": { + "type": "string" + } + } + }, "requests.Create": { "type": "object", "properties": { @@ -2412,6 +3012,14 @@ } } }, + "requests.Exist": { + "type": "object", + "properties": { + "path": { + "type": "string" + } + } + }, "requests.Login": { "type": "object", "properties": { @@ -2423,6 +3031,25 @@ } } }, + "requests.Move": { + "type": "object", + "properties": { + "new": { + "type": "string" + }, + "old": { + "type": "string" + } + } + }, + "requests.NotExist": { + "type": "object", + "properties": { + "path": { + "type": "string" + } + } + }, "requests.Obtain": { "type": "object", "properties": { @@ -2431,6 +3058,23 @@ } } }, + "requests.Permission": { + "type": "object", + "properties": { + "group": { + "type": "string" + }, + "mode": { + "type": "integer" + }, + "owner": { + "type": "string" + }, + "path": { + "type": "string" + } + } + }, "requests.Renew": { "type": "object", "properties": { @@ -2507,6 +3151,28 @@ } } }, + "requests.Search": { + "type": "object", + "properties": { + "keyword": { + "type": "string" + }, + "path": { + "type": "string" + } + } + }, + "requests.UnArchive": { + "type": "object", + "properties": { + "file": { + "type": "string" + }, + "path": { + "type": "string" + } + } + }, "requests.UpdateConfig": { "type": "object", "properties": { diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 2417ae78..019c8473 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -212,6 +212,15 @@ definitions: type: integer type: array type: object + requests.Archive: + properties: + file: + type: string + paths: + items: + type: string + type: array + type: object requests.CertStore: properties: auto_renew: @@ -248,6 +257,13 @@ definitions: website_id: type: integer type: object + requests.Copy: + properties: + new: + type: string + old: + type: string + type: object requests.Create: properties: auth_user: @@ -288,6 +304,11 @@ definitions: name: type: string type: object + requests.Exist: + properties: + path: + type: string + type: object requests.Login: properties: password: @@ -295,11 +316,34 @@ definitions: username: type: string type: object + requests.Move: + properties: + new: + type: string + old: + type: string + type: object + requests.NotExist: + properties: + path: + type: string + type: object requests.Obtain: properties: id: type: integer type: object + requests.Permission: + properties: + group: + type: string + mode: + type: integer + owner: + type: string + path: + type: string + type: object requests.Renew: properties: id: @@ -350,6 +394,20 @@ definitions: waf_mode: type: string type: object + requests.Search: + properties: + keyword: + type: string + path: + type: string + type: object + requests.UnArchive: + properties: + file: + type: string + path: + type: string + type: object requests.UpdateConfig: properties: config: @@ -994,6 +1052,361 @@ paths: summary: 更新 ACME 用户 tags: - 证书管理 + /panel/file/archive: + post: + consumes: + - application/json + description: 压缩文件/目录到给定路径 + parameters: + - description: request + in: body + name: data + required: true + schema: + $ref: '#/definitions/requests.Archive' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/controllers.SuccessResponse' + security: + - BearerToken: [] + summary: 压缩文件/目录 + tags: + - 文件管理 + /panel/file/content: + get: + consumes: + - application/json + description: 获取给定路径的文件内容 + parameters: + - in: query + name: path + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/controllers.SuccessResponse' + security: + - BearerToken: [] + summary: 获取文件内容 + tags: + - 文件管理 + /panel/file/copy: + post: + consumes: + - application/json + description: 复制文件/目录到给定路径 + parameters: + - description: request + in: body + name: data + required: true + schema: + $ref: '#/definitions/requests.Copy' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/controllers.SuccessResponse' + security: + - BearerToken: [] + summary: 复制文件/目录 + tags: + - 文件管理 + /panel/file/create: + post: + consumes: + - application/json + description: 创建文件/目录到给定路径 + parameters: + - description: request + in: body + name: data + required: true + schema: + $ref: '#/definitions/requests.NotExist' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/controllers.SuccessResponse' + security: + - BearerToken: [] + summary: 创建文件/目录 + tags: + - 文件管理 + /panel/file/delete: + post: + consumes: + - application/json + description: 删除给定路径的文件/目录 + parameters: + - description: request + in: body + name: data + required: true + schema: + $ref: '#/definitions/requests.Exist' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/controllers.SuccessResponse' + security: + - BearerToken: [] + summary: 删除文件/目录 + tags: + - 文件管理 + /panel/file/download: + get: + consumes: + - application/json + description: 下载给定路径的文件 + parameters: + - in: query + name: path + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/controllers.SuccessResponse' + security: + - BearerToken: [] + summary: 下载文件 + tags: + - 文件管理 + /panel/file/info: + get: + consumes: + - application/json + description: 获取给定路径的文件/目录信息 + parameters: + - in: query + name: path + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/controllers.SuccessResponse' + security: + - BearerToken: [] + summary: 获取文件/目录信息 + tags: + - 文件管理 + /panel/file/list: + get: + consumes: + - application/json + description: 获取给定路径的文件/目录列表 + parameters: + - in: query + name: path + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/controllers.SuccessResponse' + summary: 获取文件/目录列表 + tags: + - 文件管理 + /panel/file/move: + post: + consumes: + - application/json + description: 移动文件/目录到给定路径,等效于重命名 + parameters: + - description: request + in: body + name: data + required: true + schema: + $ref: '#/definitions/requests.Move' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/controllers.SuccessResponse' + security: + - BearerToken: [] + summary: 移动文件/目录 + tags: + - 文件管理 + /panel/file/permission: + post: + consumes: + - application/json + description: 修改给定路径的文件/目录权限 + parameters: + - description: request + in: body + name: data + required: true + schema: + $ref: '#/definitions/requests.Permission' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/controllers.SuccessResponse' + security: + - BearerToken: [] + summary: 修改文件/目录权限 + tags: + - 文件管理 + /panel/file/remoteDownload: + post: + consumes: + - application/json + description: 下载远程文件到给定路径 + parameters: + - description: request + in: body + name: data + required: true + schema: + $ref: '#/definitions/requests.NotExist' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/controllers.SuccessResponse' + security: + - BearerToken: [] + summary: 下载远程文件 + tags: + - 文件管理 + /panel/file/save: + post: + consumes: + - application/json + description: 保存给定路径的文件内容 + parameters: + - description: request + in: body + name: data + required: true + schema: + $ref: '#/definitions/requests.Exist' + - description: content + in: body + name: content + required: true + schema: + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/controllers.SuccessResponse' + security: + - BearerToken: [] + summary: 保存文件内容 + tags: + - 文件管理 + /panel/file/search: + post: + consumes: + - application/json + description: 通过关键词搜索给定路径的文件/目录 + parameters: + - description: request + in: body + name: data + required: true + schema: + $ref: '#/definitions/requests.Search' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/controllers.SuccessResponse' + summary: 搜索文件/目录 + tags: + - 文件管理 + /panel/file/unArchive: + post: + consumes: + - application/json + description: 解压文件/目录到给定路径 + parameters: + - description: request + in: body + name: data + required: true + schema: + $ref: '#/definitions/requests.UnArchive' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/controllers.SuccessResponse' + security: + - BearerToken: [] + summary: 解压文件/目录 + tags: + - 文件管理 + /panel/file/upload: + post: + consumes: + - application/json + description: 上传文件到给定路径 + parameters: + - description: request + in: body + name: data + required: true + schema: + $ref: '#/definitions/requests.NotExist' + - description: file + in: formData + name: file + required: true + type: file + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/controllers.SuccessResponse' + security: + - BearerToken: [] + summary: 上传文件 + tags: + - 文件管理 /panel/setting/list: get: description: 获取面板设置列表 diff --git a/routes/api.go b/routes/api.go index 3b53fc66..e752ec19 100644 --- a/routes/api.go +++ b/routes/api.go @@ -113,6 +113,24 @@ func Api() { r.Get("pingStatus", safeController.GetPingStatus) r.Post("pingStatus", safeController.SetPingStatus) }) + r.Prefix("file").Middleware(middleware.Jwt()).Group(func(r route.Router) { + fileController := controllers.NewFileController() + r.Post("create", fileController.Create) + r.Get("content", fileController.Content) + r.Post("save", fileController.Save) + r.Post("delete", fileController.Delete) + r.Post("upload", fileController.Upload) + r.Post("move", fileController.Move) + r.Post("copy", fileController.Copy) + r.Get("download", fileController.Download) + r.Post("remoteDownload", fileController.RemoteDownload) + r.Get("info", fileController.Info) + r.Post("permission", fileController.Permission) + r.Post("archive", fileController.Archive) + r.Post("unArchive", fileController.UnArchive) + r.Post("search", fileController.Search) + r.Post("list", fileController.List) + }) r.Prefix("monitor").Middleware(middleware.Jwt()).Group(func(r route.Router) { monitorController := controllers.NewMonitorController() r.Post("switch", monitorController.Switch)