add: list and download log&cdr export file
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package features
|
||||
|
||||
import (
|
||||
"be.ems/features/lm"
|
||||
"be.ems/features/pm"
|
||||
"be.ems/lib/log"
|
||||
"github.com/gin-gonic/gin"
|
||||
@@ -10,8 +11,9 @@ func InitServiceEngine(r *gin.Engine) {
|
||||
log.Info("======init feature group gin.Engine")
|
||||
|
||||
// featuresGroup := r.Group("/")
|
||||
// 注册 PM 模块的路由
|
||||
// 注册 各个features 模块的路由
|
||||
pm.InitSubServiceRoute(r)
|
||||
lm.InitSubServiceRoute(r)
|
||||
|
||||
// return featuresGroup
|
||||
}
|
||||
|
||||
124
features/lm/file_export/controller.go
Normal file
124
features/lm/file_export/controller.go
Normal file
@@ -0,0 +1,124 @@
|
||||
package file_export
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"be.ems/lib/file"
|
||||
"be.ems/lib/log"
|
||||
"be.ems/lib/services"
|
||||
"be.ems/src/framework/datasource"
|
||||
"be.ems/src/framework/i18n"
|
||||
"be.ems/src/framework/utils/ctx"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
type SysJobResponse struct {
|
||||
SysJob
|
||||
TableName string `json:"tableName"`
|
||||
TableDisplay string `json:"tableDisplay"`
|
||||
FilePath string `json:"filePath"`
|
||||
}
|
||||
|
||||
type TargetParams struct {
|
||||
Duration int `json:"duration"`
|
||||
TableName string `json:"tableName"`
|
||||
Columns string `json:"columns"` // exported column name of time string
|
||||
TimeCol string `json:"timeCol"` // time stamp of column name
|
||||
TimeUnit string `json:"timeUnit"` // timestamp unit: second/micro/milli
|
||||
Extras string `json:"extras"` // extras condition for where
|
||||
FilePath string `json:"filePath"` // file path
|
||||
}
|
||||
|
||||
func (m *SysJob) GetFileExportTable(c *gin.Context) {
|
||||
var results []SysJob
|
||||
|
||||
err := datasource.DefaultDB().Table(m.TableName()).Where("invoke_target=? and status=1", INVOKE_FILE_EXPORT).
|
||||
Find(&results).Error
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error()))
|
||||
return
|
||||
}
|
||||
language := ctx.AcceptLanguage(c)
|
||||
var response []SysJobResponse
|
||||
for _, job := range results {
|
||||
var params TargetParams
|
||||
if err := json.Unmarshal(job.TargetParams, ¶ms); err != nil {
|
||||
c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error()))
|
||||
return
|
||||
}
|
||||
TableDisplay := i18n.TKey(language, "table."+params.TableName)
|
||||
if TableDisplay == "" {
|
||||
TableDisplay = params.TableName
|
||||
}
|
||||
response = append(response, SysJobResponse{
|
||||
SysJob: job,
|
||||
TableName: params.TableName,
|
||||
TableDisplay: TableDisplay,
|
||||
FilePath: params.FilePath,
|
||||
})
|
||||
}
|
||||
c.JSON(http.StatusOK, services.DataResp(response))
|
||||
}
|
||||
|
||||
func (m *FileExport) GetFileList(c *gin.Context) {
|
||||
dir := c.Query("path")
|
||||
suffix := c.Query("suffix")
|
||||
|
||||
files, err := file.GetFileInfo(dir, suffix)
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error()))
|
||||
}
|
||||
total := int64(len(files))
|
||||
c.JSON(http.StatusOK, services.TotalDataResp(files, total))
|
||||
}
|
||||
|
||||
func (m *FileExport) Total(c *gin.Context) {
|
||||
dir := c.Query("path")
|
||||
|
||||
fileCount, dirCount, err := file.GetFileAndDirCount(dir)
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error()))
|
||||
return
|
||||
}
|
||||
total := fileCount + dirCount
|
||||
c.JSON(http.StatusOK, services.TotalResp(int64(total)))
|
||||
}
|
||||
|
||||
func (m *FileExport) DownloadHandler(c *gin.Context) {
|
||||
dir := c.Query("path")
|
||||
fileName := c.Param("fileName")
|
||||
filePath := filepath.Join(dir, fileName)
|
||||
|
||||
file, err := os.Open(filePath)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error()))
|
||||
return
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
if _, err := os.Stat(filePath); os.IsNotExist(err) {
|
||||
c.JSON(http.StatusNotFound, services.ErrResp(err.Error()))
|
||||
return
|
||||
}
|
||||
|
||||
c.Header("Content-Disposition", "attachment; filename="+fileName)
|
||||
c.Header("Content-Type", "application/octet-stream")
|
||||
c.File(filePath)
|
||||
}
|
||||
|
||||
func (m *FileExport) Delete(c *gin.Context) {
|
||||
fileName := c.Param("fileName")
|
||||
dir := c.Query("path")
|
||||
filePath := filepath.Join(dir, fileName)
|
||||
|
||||
if err := os.Remove(filePath); err != nil {
|
||||
c.JSON(http.StatusInternalServerError, services.ErrResp(err.Error()))
|
||||
return
|
||||
}
|
||||
c.JSON(http.StatusNoContent, nil) // 204 No Content
|
||||
}
|
||||
34
features/lm/file_export/model.go
Normal file
34
features/lm/file_export/model.go
Normal file
@@ -0,0 +1,34 @@
|
||||
package file_export
|
||||
|
||||
import (
|
||||
"gorm.io/datatypes"
|
||||
)
|
||||
|
||||
const (
|
||||
INVOKE_FILE_EXPORT = "exportTable"
|
||||
)
|
||||
|
||||
type SysJob struct {
|
||||
JobID int64 `gorm:"column:job_id;primary_key;auto_increment" json:"job_id"` //任务ID
|
||||
InvokeTarget string `gorm:"column:invoke_target" json:"invoke_target"` //调用目标字符串
|
||||
TargetParams datatypes.JSON `gorm:"column:target_params;type:json" json:"target_params,omitempty"` //调用目标传入参数
|
||||
}
|
||||
|
||||
func (m *SysJob) TableName() string {
|
||||
return "sys_job"
|
||||
}
|
||||
|
||||
type FileExport struct {
|
||||
FileType string `json:"fileType"` // 文件类型
|
||||
FileMode string `json:"fileMode"` // 文件的权限
|
||||
LinkCount int64 `json:"linkCount"` // 硬链接数目
|
||||
Owner string `json:"owner"` // 所属用户
|
||||
Group string `json:"group"` // 所属组
|
||||
Size int64 `json:"size"` // 文件的大小
|
||||
ModifiedTime int64 `json:"modifiedTime"` // 最后修改时间,单位为秒
|
||||
FileName string `json:"fileName"` // 文件的名称
|
||||
}
|
||||
|
||||
func (m *FileExport) TableName() string {
|
||||
return "file_export"
|
||||
}
|
||||
40
features/lm/file_export/route.go
Normal file
40
features/lm/file_export/route.go
Normal file
@@ -0,0 +1,40 @@
|
||||
package file_export
|
||||
|
||||
import (
|
||||
"be.ems/src/framework/middleware"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
// Register Routes for file_export
|
||||
func Register(r *gin.RouterGroup) {
|
||||
|
||||
lmTable := r.Group("/table")
|
||||
{
|
||||
var m *SysJob
|
||||
lmTable.GET("/list",
|
||||
middleware.PreAuthorize(nil),
|
||||
m.GetFileExportTable,
|
||||
)
|
||||
|
||||
}
|
||||
lmFile := r.Group("/file")
|
||||
{
|
||||
var f *FileExport
|
||||
lmFile.GET("/list",
|
||||
middleware.PreAuthorize(nil),
|
||||
f.GetFileList,
|
||||
)
|
||||
lmFile.GET("/total",
|
||||
middleware.PreAuthorize(nil),
|
||||
f.Total,
|
||||
)
|
||||
lmFile.GET("/:fileName",
|
||||
middleware.PreAuthorize(nil),
|
||||
f.DownloadHandler,
|
||||
)
|
||||
lmFile.DELETE("/:fileName",
|
||||
middleware.PreAuthorize(nil),
|
||||
f.Delete,
|
||||
)
|
||||
}
|
||||
}
|
||||
17
features/lm/service.go
Normal file
17
features/lm/service.go
Normal file
@@ -0,0 +1,17 @@
|
||||
// log management package
|
||||
|
||||
package lm
|
||||
|
||||
import (
|
||||
"be.ems/features/lm/file_export"
|
||||
"be.ems/lib/log"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func InitSubServiceRoute(r *gin.Engine) {
|
||||
log.Info("======init Log management group gin.Engine")
|
||||
|
||||
lmGroup := r.Group("/lm")
|
||||
// register sub modules routes
|
||||
file_export.Register(lmGroup)
|
||||
}
|
||||
Reference in New Issue
Block a user