From e7fb59da8d21c804a543b5f734ae592168785db1 Mon Sep 17 00:00:00 2001 From: zhengkunwang223 <31820853+zhengkunwang223@users.noreply.github.com> Date: Wed, 24 Aug 2022 17:34:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=87=E4=BB=B6=E5=A4=B9=E6=A0=91?= =?UTF-8?q?=E5=BD=A2=E5=88=97=E8=A1=A8=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/api/v1/file.go | 14 ++ backend/app/dto/file.go | 6 + backend/app/service/file.go | 21 +++ backend/router/ro_file.go | 1 + frontend/src/api/index.ts | 8 +- frontend/src/api/interface/file.ts | 7 + frontend/src/api/modules/files.ts | 4 + frontend/src/views/file-management/index.vue | 133 +++++++++---------- 8 files changed, 121 insertions(+), 73 deletions(-) diff --git a/backend/app/api/v1/file.go b/backend/app/api/v1/file.go index 136605c02..040d69627 100644 --- a/backend/app/api/v1/file.go +++ b/backend/app/api/v1/file.go @@ -20,3 +20,17 @@ func (b *BaseApi) ListFiles(c *gin.Context) { } helper.SuccessWithData(c, files) } + +func (b *BaseApi) GetFileTree(c *gin.Context) { + var req dto.FileOption + if err := c.ShouldBindJSON(&req); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err) + return + } + tree, err := fileService.GetFileTree(req) + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, tree) +} diff --git a/backend/app/dto/file.go b/backend/app/dto/file.go index b6312764d..5a3850841 100644 --- a/backend/app/dto/file.go +++ b/backend/app/dto/file.go @@ -9,3 +9,9 @@ type FileOption struct { type FileInfo struct { files.FileInfo } + +type FileTree struct { + Name string `json:"name"` + Path string `json:"path"` + Children []FileTree `json:"children"` +} diff --git a/backend/app/service/file.go b/backend/app/service/file.go index cc9b5d0fb..ee16acc66 100644 --- a/backend/app/service/file.go +++ b/backend/app/service/file.go @@ -25,3 +25,24 @@ func (f FileService) GetFileList(op dto.FileOption) (dto.FileInfo, error) { fileInfo.FileInfo = *info return fileInfo, nil } + +func (f FileService) GetFileTree(op dto.FileOption) ([]dto.FileTree, error) { + var treeArray []dto.FileTree + info, err := files.NewFileInfo(op.FileOption) + if err != nil { + return nil, err + } + node := dto.FileTree{ + Name: info.Name, + Path: info.Path, + } + for _, v := range info.Items { + if v.IsDir { + node.Children = append(node.Children, dto.FileTree{ + Name: v.Name, + Path: v.Path, + }) + } + } + return append(treeArray, node), nil +} diff --git a/backend/router/ro_file.go b/backend/router/ro_file.go index 71fe5b51d..447fd3894 100644 --- a/backend/router/ro_file.go +++ b/backend/router/ro_file.go @@ -16,6 +16,7 @@ func (f *FileRouter) InitFileRouter(Router *gin.RouterGroup) { baseApi := v1.ApiGroupApp.BaseApi { fileRouter.POST("/search", baseApi.ListFiles) + fileRouter.POST("/tree", baseApi.GetFileTree) } } diff --git a/frontend/src/api/index.ts b/frontend/src/api/index.ts index f091df17f..1b8882ffc 100644 --- a/frontend/src/api/index.ts +++ b/frontend/src/api/index.ts @@ -1,5 +1,5 @@ import axios, { AxiosInstance, AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios'; -import { showFullScreenLoading, tryHideFullScreenLoading } from '@/config/service-loading'; +// import { showFullScreenLoading, tryHideFullScreenLoading } from '@/config/service-loading'; import { AxiosCanceler } from './helper/axios-cancel'; import { ResultData } from '@/api/interface'; import { ResultEnum } from '@/enums/http-enum'; @@ -31,7 +31,7 @@ class RequestHttp { }; } axiosCanceler.addPending(config); - config.headers!.noLoading || showFullScreenLoading(); + // config.headers!.noLoading || showFullScreenLoading(); return { ...config, }; @@ -48,7 +48,7 @@ class RequestHttp { globalStore.setCsrfToken(response.headers['x-csrf-token']); } axiosCanceler.removePending(config); - tryHideFullScreenLoading(); + // tryHideFullScreenLoading(); if (data.code == ResultEnum.OVERDUE || data.code == ResultEnum.FORBIDDEN) { ElMessage.error(data.msg); router.replace({ @@ -64,7 +64,7 @@ class RequestHttp { }, async (error: AxiosError) => { const { response } = error; - tryHideFullScreenLoading(); + // tryHideFullScreenLoading(); if (error.message.indexOf('timeout') !== -1) ElMessage.error('请求超时!请您稍后重试'); if (response) checkStatus(response.status); if (!window.navigator.onLine) router.replace({ path: '/500' }); diff --git a/frontend/src/api/interface/file.ts b/frontend/src/api/interface/file.ts index 40ef77a6a..292e855e9 100644 --- a/frontend/src/api/interface/file.ts +++ b/frontend/src/api/interface/file.ts @@ -21,4 +21,11 @@ export namespace File { search?: string; expand: boolean; } + + export interface FileTree { + name: string; + isDir: Boolean; + path: string; + children?: FileTree[]; + } } diff --git a/frontend/src/api/modules/files.ts b/frontend/src/api/modules/files.ts index b85fde2aa..38062f08c 100644 --- a/frontend/src/api/modules/files.ts +++ b/frontend/src/api/modules/files.ts @@ -4,3 +4,7 @@ import http from '@/api'; export const GetFilesList = (params: File.ReqFile) => { return http.post('files/search', params); }; + +export const GetFilesTree = (params: File.ReqFile) => { + return http.post('files/tree', params); +}; diff --git a/frontend/src/views/file-management/index.vue b/frontend/src/views/file-management/index.vue index 6d0a86cfb..8a0306462 100644 --- a/frontend/src/views/file-management/index.vue +++ b/frontend/src/views/file-management/index.vue @@ -1,19 +1,28 @@