merge: 合并代码20241018
This commit is contained in:
167
lib/dborm/dbgorm.go
Normal file
167
lib/dborm/dbgorm.go
Normal file
@@ -0,0 +1,167 @@
|
||||
package dborm
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"regexp"
|
||||
"time"
|
||||
|
||||
"gorm.io/driver/mysql"
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/logger"
|
||||
)
|
||||
|
||||
// 数据库连接实例
|
||||
var dbgEngine *gorm.DB
|
||||
|
||||
// 载入连接日志配置
|
||||
func loadLogger() logger.Interface {
|
||||
newLogger := logger.New(
|
||||
log.New(os.Stdout, "[GORM] ", log.LstdFlags), // 将日志输出到控制台
|
||||
logger.Config{
|
||||
SlowThreshold: time.Second, // Slow SQL 阈值
|
||||
LogLevel: logger.Info, // 日志级别 Silent不输出任何日志
|
||||
ParameterizedQueries: false, // 参数化查询SQL 用实际值带入?的执行语句
|
||||
Colorful: false, // 彩色日志输出
|
||||
},
|
||||
)
|
||||
return newLogger
|
||||
}
|
||||
|
||||
// 连接数据库实例
|
||||
func InitGormConnect(dbType, dbUser, dbPassword, dbHost, dbPort, dbName, dbParam, dbLogging any) error {
|
||||
var dialector gorm.Dialector
|
||||
switch dbType {
|
||||
case "mysql":
|
||||
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?%s",
|
||||
dbUser,
|
||||
dbPassword,
|
||||
dbHost,
|
||||
dbPort,
|
||||
dbName,
|
||||
dbParam,
|
||||
)
|
||||
dialector = mysql.Open(dsn)
|
||||
default:
|
||||
err := fmt.Errorf("invalid type: %s", dbType)
|
||||
return err
|
||||
}
|
||||
opts := &gorm.Config{}
|
||||
// 是否需要日志输出
|
||||
if dbLogging.(bool) {
|
||||
opts.Logger = loadLogger()
|
||||
}
|
||||
// 创建连接
|
||||
db, err := gorm.Open(dialector, opts)
|
||||
if err != nil {
|
||||
log.Fatalf("failed to open: %s", err)
|
||||
return err
|
||||
}
|
||||
// 获取底层 SQL 数据库连接
|
||||
sqlDB, err := db.DB()
|
||||
if err != nil {
|
||||
log.Fatalf("failed to connect DB pool: %v", err)
|
||||
return err
|
||||
}
|
||||
// 测试数据库连接
|
||||
err = sqlDB.Ping()
|
||||
if err != nil {
|
||||
log.Fatalf("failed to ping database: %v", err)
|
||||
return err
|
||||
}
|
||||
dbgEngine = db
|
||||
return nil
|
||||
}
|
||||
|
||||
// 关闭数据库实例
|
||||
func Close() {
|
||||
sqlDB, err := dbgEngine.DB()
|
||||
if err != nil {
|
||||
log.Fatalf("failed to connect pool: %s", err)
|
||||
}
|
||||
if err := sqlDB.Close(); err != nil {
|
||||
log.Fatalf("failed to close: %s", err)
|
||||
}
|
||||
}
|
||||
|
||||
// default gorm DB
|
||||
func DefaultDB() *gorm.DB {
|
||||
return dbgEngine
|
||||
}
|
||||
|
||||
// get sql DB
|
||||
func GCoreDB() (*sql.DB, error) {
|
||||
return dbgEngine.DB()
|
||||
}
|
||||
|
||||
// RawSQL 原生查询语句
|
||||
func RawSQL(sql string, parameters []any) ([]map[string]any, error) {
|
||||
// 数据源
|
||||
db := DefaultDB()
|
||||
|
||||
// 使用正则表达式替换连续的空白字符为单个空格
|
||||
fmtSql := regexp.MustCompile(`\s+`).ReplaceAllString(sql, " ")
|
||||
|
||||
// logger.Infof("sql=> %v", fmtSql)
|
||||
// logger.Infof("parameters=> %v", parameters)
|
||||
|
||||
// 查询结果
|
||||
var rows []map[string]any
|
||||
res := db.Raw(fmtSql, parameters...).Scan(&rows)
|
||||
if res.Error != nil {
|
||||
return nil, res.Error
|
||||
}
|
||||
return rows, nil
|
||||
}
|
||||
|
||||
// ExecSQL 原生执行语句
|
||||
func ExecSQL(sql string, parameters []any) (int64, error) {
|
||||
// 数据源
|
||||
db := DefaultDB()
|
||||
|
||||
// 使用正则表达式替换连续的空白字符为单个空格
|
||||
fmtSql := regexp.MustCompile(`\s+`).ReplaceAllString(sql, " ")
|
||||
// 执行结果
|
||||
res := db.Exec(fmtSql, parameters...)
|
||||
if res.Error != nil {
|
||||
return 0, res.Error
|
||||
}
|
||||
return res.RowsAffected, nil
|
||||
}
|
||||
|
||||
func CloneTable(srcTable, dstTable string) error {
|
||||
// 获取表 A 的结构信息
|
||||
var columns []gorm.ColumnType
|
||||
dbMigrator := dbgEngine.Migrator()
|
||||
columns, err := dbMigrator.ColumnTypes(srcTable)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to ColumnTypes, %v", err)
|
||||
}
|
||||
|
||||
// 创建表 destination table
|
||||
err = dbMigrator.CreateTable(dstTable)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to CreateTable, %v", err)
|
||||
}
|
||||
// 复制表 src 的字段到表 dst
|
||||
for _, column := range columns {
|
||||
err = dbMigrator.AddColumn(dstTable, column.Name())
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to AddColumn, %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// 复制表 src 的主键和索引到表 dst
|
||||
err = dbMigrator.CreateConstraint(dstTable, "PRIMARY")
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to AddColumn, %v", err)
|
||||
}
|
||||
|
||||
err = dbMigrator.CreateConstraint(dstTable, "INDEX")
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to AddColumn, %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -16,6 +16,7 @@ import (
|
||||
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
"xorm.io/xorm"
|
||||
"xorm.io/xorm/core"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -124,6 +125,14 @@ func XormConnectDatabase(dbType, dbUser, dbPassword, dbHost, dbPort, dbName stri
|
||||
return xEngine, nil
|
||||
}
|
||||
|
||||
func XCoreDB() *core.DB {
|
||||
return xEngine.DB()
|
||||
}
|
||||
|
||||
func XEngDB() *xorm.Engine {
|
||||
return xEngine
|
||||
}
|
||||
|
||||
func ConstructInsertSQL(tableName string, insertData interface{}) (string, []string) {
|
||||
log.Debug("ConstructInsertSQL processing... ")
|
||||
log.Debug("Request insertData:", insertData)
|
||||
@@ -419,68 +428,6 @@ func XormParseResult(body []byte) ([]NeInfo, error) {
|
||||
return neInfo, nil
|
||||
}
|
||||
|
||||
type ParamConfig struct {
|
||||
// Id int `json:"id" xorm:"pk 'id' autoincr"`
|
||||
NeType string `json:"neType"`
|
||||
NeId string `json:"neId"`
|
||||
TopTag string `json:"topTag"`
|
||||
TopDisplay string `json:"topDisplay"`
|
||||
ParamJson string `json:"paramJson"`
|
||||
}
|
||||
|
||||
func XormInsertParamConfig(mapJson *map[string]interface{}) (int64, error) {
|
||||
var affected, a int64
|
||||
var err error
|
||||
paramConfig := new(ParamConfig)
|
||||
for n, d := range *mapJson {
|
||||
if d == nil {
|
||||
break
|
||||
}
|
||||
log.Debugf("n: %s", n)
|
||||
|
||||
for t, p := range d.(map[string]interface{}) {
|
||||
if p == nil {
|
||||
break
|
||||
}
|
||||
log.Debug("t:", t)
|
||||
log.Debug("p:", p)
|
||||
for k, v := range p.(map[string]interface{}) {
|
||||
log.Debug("k, v: ", k, v)
|
||||
if k == "display" {
|
||||
paramConfig.TopDisplay = fmt.Sprintf("%v", v)
|
||||
|
||||
} else {
|
||||
pc, _ := json.Marshal(v)
|
||||
paramConfig.ParamJson = fmt.Sprintf("{\"%v\":%v}", k, string(pc))
|
||||
}
|
||||
}
|
||||
|
||||
paramConfig.NeType = strings.ToUpper(n)
|
||||
paramConfig.NeId = ""
|
||||
paramConfig.TopTag = t
|
||||
// paramConfig.TopDisplay = p["display"]
|
||||
// paramConfig.ParamJson = p.(string)
|
||||
|
||||
log.Debug("paramConfig:", paramConfig)
|
||||
|
||||
xSession := xEngine.NewSession()
|
||||
defer xSession.Close()
|
||||
_, err = xSession.Table("param_config").Where("ne_type = ? and top_tag = ?", paramConfig.NeType, paramConfig.TopTag).Delete()
|
||||
if err != nil {
|
||||
log.Error("Failed to insert param_config:", err)
|
||||
}
|
||||
a, err = xSession.Insert(paramConfig)
|
||||
if err != nil {
|
||||
log.Error("Failed to insert param_config:", err)
|
||||
}
|
||||
affected += a
|
||||
xSession.Commit()
|
||||
}
|
||||
}
|
||||
|
||||
return affected, err
|
||||
}
|
||||
|
||||
func ConstructUpdateSQLArray(tableName string, updateData interface{}, whereCondition string) (string, []string) {
|
||||
log.Debug("ConstructUpdateSQL processing... ")
|
||||
log.Debug("Request updateData:", updateData)
|
||||
|
||||
111
lib/eval/evaluate.go
Normal file
111
lib/eval/evaluate.go
Normal file
@@ -0,0 +1,111 @@
|
||||
package evaluate
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"go/ast"
|
||||
"go/parser"
|
||||
"go/token"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Parse and caculate expression
|
||||
func CalcExpr(expr string, paramValues map[string]any) (float64, error) {
|
||||
// match parameter with ''
|
||||
re := regexp.MustCompile(`'([^']+)'`)
|
||||
matches := re.FindAllStringSubmatch(expr, -1)
|
||||
|
||||
// replace to value
|
||||
for _, match := range matches {
|
||||
paramName := match[1]
|
||||
value, exists := paramValues[paramName]
|
||||
if !exists {
|
||||
return 0, fmt.Errorf("parameter '%s' not found", paramName)
|
||||
}
|
||||
|
||||
expr = strings.Replace(expr, match[0], fmt.Sprintf("%v", value), 1)
|
||||
}
|
||||
|
||||
// expression to evaluate
|
||||
result, err := evalExpr(expr)
|
||||
return result, err
|
||||
}
|
||||
|
||||
// eval 解析和计算表达式
|
||||
func evalExpr(expr string) (float64, error) {
|
||||
//fset := token.NewFileSet()
|
||||
node, err := parser.ParseExpr(expr)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return evalNode(node)
|
||||
}
|
||||
|
||||
// EvaluateExpr 解析并计算给定的表达式
|
||||
func EvalExpr(expr string, values map[string]any) (float64, error) {
|
||||
// 解析表达式
|
||||
node, err := parser.ParseExpr(expr)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
// 遍历 AST 并替换变量
|
||||
ast.Inspect(node, func(n ast.Node) bool {
|
||||
if ident, ok := n.(*ast.Ident); ok {
|
||||
if val, ok := values[ident.Name]; ok {
|
||||
// 替换标识符为对应值
|
||||
ident.Name = fmt.Sprintf("%v", val)
|
||||
}
|
||||
}
|
||||
return true
|
||||
})
|
||||
|
||||
// 计算表达式
|
||||
return evalNode(node)
|
||||
}
|
||||
|
||||
// eval 递归计算 AST 节点
|
||||
func evalNode(node ast.Node) (float64, error) {
|
||||
var result float64
|
||||
|
||||
switch n := node.(type) {
|
||||
case *ast.BinaryExpr:
|
||||
left, err := evalNode(n.X)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
right, err := evalNode(n.Y)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
switch n.Op {
|
||||
case token.ADD:
|
||||
result = left + right
|
||||
case token.SUB:
|
||||
result = left - right
|
||||
case token.MUL:
|
||||
result = left * right
|
||||
case token.QUO:
|
||||
result = left / right
|
||||
}
|
||||
case *ast.BasicLit:
|
||||
var err error
|
||||
result, err = strconv.ParseFloat(n.Value, 64)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
case *ast.Ident:
|
||||
val, err := strconv.ParseFloat(n.Name, 64)
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("unsupported expression: %s", n.Name)
|
||||
}
|
||||
result = val
|
||||
case *ast.ParenExpr:
|
||||
return evalNode(n.X) // 递归评估括号中的表达式
|
||||
default:
|
||||
return 0, fmt.Errorf("unsupported expression: %T", n)
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
170
lib/file/file.go
170
lib/file/file.go
@@ -1,161 +1,27 @@
|
||||
package file
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
// const (
|
||||
// //经过测试,linux下,延时需要大于100ms
|
||||
// TIME_DELAY_AFTER_WRITE = 200
|
||||
// )
|
||||
func GetFileAndDirCount(dir string) (int, int, error) {
|
||||
var fileCount, dirCount int
|
||||
|
||||
// type Response struct {
|
||||
// Data []string `json:"data"`
|
||||
// }
|
||||
err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if path == dir {
|
||||
return nil // 跳过当前目录
|
||||
}
|
||||
if info.IsDir() {
|
||||
dirCount++
|
||||
} else {
|
||||
fileCount++
|
||||
}
|
||||
return nil
|
||||
})
|
||||
|
||||
// type MMLRequest struct {
|
||||
// MML []string `json:"mml"`
|
||||
// }
|
||||
|
||||
// func GetFile(w http.ResponseWriter, r *http.Request) {
|
||||
// log.Debug("PostMMLToNF processing... ")
|
||||
|
||||
// vars := mux.Vars(r)
|
||||
// neType := vars["elementTypeValue"]
|
||||
// params := r.URL.Query()
|
||||
// neId := params["ne_id"]
|
||||
// log.Debug("neType:", neType, "neId", neId)
|
||||
|
||||
// neInfo := new(dborm.NeInfo)
|
||||
// var err error
|
||||
// if len(neId) == 0 {
|
||||
// log.Error("ne_id NOT FOUND")
|
||||
// services.ResponseBadRequest400WrongParamValue(w)
|
||||
// return
|
||||
// }
|
||||
// neInfo, err = dborm.XormGetNeInfo(neType, neId[0])
|
||||
// if err != nil {
|
||||
// log.Error("dborm.XormGetNeInfo is failed:", err)
|
||||
// services.ResponseInternalServerError500DatabaseOperationFailed(w)
|
||||
// return
|
||||
// }
|
||||
|
||||
// var buf [8192]byte
|
||||
// var n int
|
||||
// var mmlResult []string
|
||||
|
||||
// if neInfo != nil {
|
||||
// hostMML := fmt.Sprintf("%s:%d", neInfo.Ip, config.GetYamlConfig().MML.Port)
|
||||
// conn, err := net.Dial("tcp", hostMML)
|
||||
// if err != nil {
|
||||
// errMsg := fmt.Sprintf("Failed to dial %s: %v", hostMML, err)
|
||||
// log.Error(errMsg)
|
||||
// mmlResult = append(mmlResult, errMsg)
|
||||
// response := Response{mmlResult}
|
||||
// services.ResponseWithJson(w, http.StatusOK, response)
|
||||
// return
|
||||
// }
|
||||
|
||||
// loginStr := fmt.Sprintf("%s\n%s\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password)
|
||||
// n, err = conn.Write([]byte(loginStr))
|
||||
// if err != nil {
|
||||
// log.Errorf("Error: %s", err.Error())
|
||||
// return
|
||||
// }
|
||||
|
||||
// time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE)
|
||||
|
||||
// n, err = conn.Read(buf[0:])
|
||||
// if err != nil {
|
||||
// log.Errorf("Error: %s", err.Error())
|
||||
// return
|
||||
// }
|
||||
// log.Debug(string(buf[0:n]))
|
||||
|
||||
// body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen))
|
||||
// if err != nil {
|
||||
// log.Error("io.ReadAll is failed:", err)
|
||||
// services.ResponseNotFound404UriNotExist(w, r)
|
||||
// return
|
||||
// }
|
||||
// log.Debug("Body:", string(body))
|
||||
|
||||
// mmlRequest := new(MMLRequest)
|
||||
// _ = json.Unmarshal(body, mmlRequest)
|
||||
|
||||
// for _, mml := range mmlRequest.MML {
|
||||
// mmlCommand := fmt.Sprintf("%s\n", mml)
|
||||
// log.Debug("mml command:", mmlCommand)
|
||||
// n, err = conn.Write([]byte(mmlCommand))
|
||||
// if err != nil {
|
||||
// log.Errorf("Error: %s", err.Error())
|
||||
// return
|
||||
// }
|
||||
// time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE)
|
||||
|
||||
// n, err = conn.Read(buf[0:])
|
||||
// if err != nil {
|
||||
// log.Errorf("Error: %s", err.Error())
|
||||
// return
|
||||
// }
|
||||
// log.Debug(string(buf[0 : n-len(neType)-2]))
|
||||
// mmlResult = append(mmlResult, string(buf[0:n-len(neType)-2]))
|
||||
// }
|
||||
// }
|
||||
|
||||
// response := Response{mmlResult}
|
||||
// services.ResponseWithJson(w, http.StatusOK, response)
|
||||
// }
|
||||
|
||||
// 格式文件大小单位
|
||||
func FormatFileSize(fileSize float64) (size string) {
|
||||
if fileSize < 1024 {
|
||||
return fmt.Sprintf("%.2fB", fileSize/float64(1))
|
||||
} else if fileSize < (1024 * 1024) {
|
||||
return fmt.Sprintf("%.2fKB", fileSize/float64(1024))
|
||||
} else if fileSize < (1024 * 1024 * 1024) {
|
||||
return fmt.Sprintf("%.2fMB", fileSize/float64(1024*1024))
|
||||
} else if fileSize < (1024 * 1024 * 1024 * 1024) {
|
||||
return fmt.Sprintf("%.2fGB", fileSize/float64(1024*1024*1024))
|
||||
} else if fileSize < (1024 * 1024 * 1024 * 1024 * 1024) {
|
||||
return fmt.Sprintf("%.2fTB", fileSize/float64(1024*1024*1024*1024))
|
||||
} else {
|
||||
return fmt.Sprintf("%.2fEB", fileSize/float64(1024*1024*1024*1024*1024))
|
||||
}
|
||||
}
|
||||
|
||||
func IsSymlink(mode os.FileMode) bool {
|
||||
return mode&os.ModeSymlink != 0
|
||||
}
|
||||
|
||||
const dotCharacter = 46
|
||||
|
||||
func IsHidden(path string) bool {
|
||||
return path[0] == dotCharacter
|
||||
}
|
||||
|
||||
func GetMimeType(path string) string {
|
||||
file, err := os.Open(path)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
buffer := make([]byte, 512)
|
||||
_, err = file.Read(buffer)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
mimeType := http.DetectContentType(buffer)
|
||||
return mimeType
|
||||
}
|
||||
|
||||
func GetSymlink(path string) string {
|
||||
linkPath, err := os.Readlink(path)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
return linkPath
|
||||
return fileCount, dirCount, err
|
||||
}
|
||||
|
||||
80
lib/file/file_linux.go
Normal file
80
lib/file/file_linux.go
Normal file
@@ -0,0 +1,80 @@
|
||||
//go:build linux
|
||||
// +build linux
|
||||
|
||||
package file
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"os/user"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"syscall"
|
||||
|
||||
"github.com/dustin/go-humanize"
|
||||
)
|
||||
|
||||
type FileInfo struct {
|
||||
FileType string `json:"fileType"` // 文件类型
|
||||
FileMode string `json:"fileMode"` // 文件的权限
|
||||
LinkCount int64 `json:"linkCount"` // 硬链接数目
|
||||
Owner string `json:"owner"` // 所属用户
|
||||
Group string `json:"group"` // 所属组
|
||||
Size string `json:"size"` // 文件的大小
|
||||
ModifiedTime int64 `json:"modifiedTime"` // 最后修改时间,单位为秒
|
||||
FileName string `json:"fileName"` // 文件的名称
|
||||
}
|
||||
|
||||
func GetFileInfo(dir, suffix string) ([]FileInfo, error) {
|
||||
var files []FileInfo
|
||||
|
||||
err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if path == dir {
|
||||
return nil // 跳过当前目录
|
||||
}
|
||||
|
||||
fileType := "file"
|
||||
if info.IsDir() {
|
||||
fileType = "directory"
|
||||
} else if info.Mode()&os.ModeSymlink != 0 {
|
||||
fileType = "symlink"
|
||||
}
|
||||
|
||||
// check if match suffix
|
||||
if (suffix != "" && filepath.Ext(path) == suffix) || suffix == "" {
|
||||
stat, ok := info.Sys().(*syscall.Stat_t)
|
||||
if !ok {
|
||||
return fmt.Errorf("not a syscall.Stat_t")
|
||||
}
|
||||
userInfo, err := user.LookupId(fmt.Sprint(stat.Uid))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
groupInfo, err := user.LookupGroupId(fmt.Sprint(stat.Gid))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
humanReadableSize := humanize.Bytes(uint64(info.Size()))
|
||||
fileInfo := FileInfo{
|
||||
FileType: fileType,
|
||||
FileMode: info.Mode().String(),
|
||||
LinkCount: int64(info.Sys().(*syscall.Stat_t).Nlink),
|
||||
Owner: userInfo.Username,
|
||||
Group: groupInfo.Name,
|
||||
Size: strings.ToUpper(humanReadableSize),
|
||||
ModifiedTime: info.ModTime().Unix(),
|
||||
FileName: info.Name(),
|
||||
}
|
||||
files = append(files, fileInfo)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return files, nil
|
||||
}
|
||||
61
lib/file/file_windows.go
Normal file
61
lib/file/file_windows.go
Normal file
@@ -0,0 +1,61 @@
|
||||
//go:build windows
|
||||
// +build windows
|
||||
|
||||
package file
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
type FileInfo 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 GetFileInfo(dir, suffix string) ([]FileInfo, error) {
|
||||
var files []FileInfo
|
||||
|
||||
err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if path == dir {
|
||||
return nil // 跳过当前目录
|
||||
}
|
||||
|
||||
fileType := "file"
|
||||
if info.IsDir() {
|
||||
fileType = "directory"
|
||||
} else if info.Mode()&os.ModeSymlink != 0 {
|
||||
fileType = "symlink"
|
||||
}
|
||||
|
||||
// check if match suffix
|
||||
if (suffix != "" && filepath.Ext(path) == suffix) || suffix == "" {
|
||||
fileInfo := FileInfo{
|
||||
FileType: fileType,
|
||||
FileMode: info.Mode().String(),
|
||||
LinkCount: 0,
|
||||
Owner: "-",
|
||||
Group: "-",
|
||||
Size: info.Size(),
|
||||
ModifiedTime: info.ModTime().Unix(),
|
||||
FileName: info.Name(),
|
||||
}
|
||||
files = append(files, fileInfo)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return files, nil
|
||||
}
|
||||
@@ -46,6 +46,7 @@ type MmlVar struct {
|
||||
Authorization string `josn:"authorization"`
|
||||
HttpUri string `json:"httpUri"`
|
||||
UserAgent string `json:"userAgent"`
|
||||
TagNE string `json:"tagNE"`
|
||||
}
|
||||
|
||||
// func init() {
|
||||
|
||||
@@ -4,7 +4,6 @@ import (
|
||||
"crypto/sha256"
|
||||
"crypto/sha512"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"net/http"
|
||||
"strings"
|
||||
@@ -12,35 +11,9 @@ import (
|
||||
|
||||
"be.ems/lib/log"
|
||||
|
||||
"github.com/dgrijalva/jwt-go"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
)
|
||||
|
||||
// GenToken 生成Token值
|
||||
func GenToken(mapClaims jwt.MapClaims) (string, error) {
|
||||
token := jwt.NewWithClaims(jwt.SigningMethodHS256, mapClaims)
|
||||
var nowDate = time.Now()
|
||||
var secret = fmt.Sprintf("%v%v", nowDate, "xxxx")
|
||||
return token.SignedString([]byte(secret))
|
||||
}
|
||||
|
||||
// GenerateToken 生成Token值
|
||||
func GenerateToken(mapClaims jwt.MapClaims, key string) (string, error) {
|
||||
token := jwt.NewWithClaims(jwt.SigningMethodHS256, mapClaims)
|
||||
return token.SignedString([]byte(key))
|
||||
}
|
||||
|
||||
// ParseToken: "解析token"
|
||||
func ParseToken(token string, secret string) (string, error) {
|
||||
claim, err := jwt.Parse(token, func(token *jwt.Token) (interface{}, error) {
|
||||
return []byte(secret), nil
|
||||
})
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return claim.Claims.(jwt.MapClaims)["cmd"].(string), nil
|
||||
}
|
||||
|
||||
func RandAccessToken(n int) (ret string) {
|
||||
allString := "52661fbd-6b84-4fc2-aa1e-17879a5c6c9b"
|
||||
ret = ""
|
||||
|
||||
@@ -207,13 +207,6 @@ func init() {
|
||||
Register("PUT", cm.CustomUriSoftwareNE, cm.ActiveSoftwareToNF, nil)
|
||||
Register("PATCH", cm.CustomUriSoftwareNE, cm.RollBackSoftwareToNF, nil)
|
||||
|
||||
// License management
|
||||
Register("POST", cm.UriLicense, cm.UploadLicenseFileData, midware.LogOperate(collectlogs.OptionNew("License", collectlogs.BUSINESS_TYPE_INSERT)))
|
||||
Register("POST", cm.UriLicenseExt, cm.UploadLicenseFileData, midware.LogOperate(collectlogs.OptionNew("License", collectlogs.BUSINESS_TYPE_INSERT)))
|
||||
|
||||
Register("POST", cm.CustomUriLicense, cm.UploadLicenseFileData, nil)
|
||||
Register("POST", cm.CustomUriLicenseExt, cm.UploadLicenseFileData, nil)
|
||||
|
||||
// Trace management 跟踪任务
|
||||
Register("POST", trace.UriTraceTask, trace.PostTraceTaskToNF, midware.LogOperate(collectlogs.OptionNew("Trace Task", collectlogs.BUSINESS_TYPE_INSERT)))
|
||||
Register("PUT", trace.UriTraceTask, trace.PutTraceTaskToNF, midware.LogOperate(collectlogs.OptionNew("Trace Task", collectlogs.BUSINESS_TYPE_UPDATE)))
|
||||
@@ -279,24 +272,15 @@ func init() {
|
||||
Register("GET", ue.UriNSSFSubscriptions, ue.GetSubscriptionsFromNSSF, nil)
|
||||
Register("GET", ue.CustomUriNSSFSubscriptions, ue.GetSubscriptionsFromNSSF, nil)
|
||||
|
||||
// ims cdr event
|
||||
Register("POST", cdr.UriIMSCDREvent, cdr.PostCDREventFromIMS, nil)
|
||||
Register("POST", cdr.CustomUriIMSCDREvent, cdr.PostCDREventFromIMS, nil)
|
||||
|
||||
// smf cdr event
|
||||
Register("POST", cdr.UriSMFCDREvent, cdr.PostCDREventFromSMF, nil)
|
||||
Register("POST", cdr.CustomUriSMFCDREvent, cdr.PostCDREventFromSMF, nil)
|
||||
// cdr event
|
||||
Register("POST", cdr.UriCDREvent, cdr.PostCDREventFrom, nil)
|
||||
Register("POST", cdr.CustomUriCDREvent, cdr.PostCDREventFrom, nil)
|
||||
|
||||
// UE event 上报的UE事件
|
||||
Register("POST", event.UriUEEvent, event.PostUEEvent, nil)
|
||||
|
||||
// UE event AMF上报的UE事件, 无前缀给到Gin处理
|
||||
//Register("POST", event.UriUEEvent, event.PostUEEventFromAMF, nil)
|
||||
|
||||
// 文件资源
|
||||
Register("GET", file.UriDiskList, file.DiskList, nil)
|
||||
Register("POST", file.UriListFiles, file.ListFiles, nil)
|
||||
|
||||
// 数据库连接情况
|
||||
Register("GET", dbrest.UriDbConnection, dbrest.DbConnection, nil)
|
||||
Register("GET", dbrest.CustomUriDbConnection, dbrest.DbConnection, nil)
|
||||
|
||||
35
lib/services/response.go
Normal file
35
lib/services/response.go
Normal file
@@ -0,0 +1,35 @@
|
||||
package services
|
||||
|
||||
const (
|
||||
CODE_FAIL = 0
|
||||
CODE_SUCC = 1
|
||||
)
|
||||
|
||||
func ErrResp(msg string) map[string]any {
|
||||
return map[string]any{"code": CODE_FAIL, "msg": msg}
|
||||
}
|
||||
|
||||
func DataResp(data any) map[string]any {
|
||||
return map[string]any{"code": CODE_SUCC, "data": data}
|
||||
}
|
||||
|
||||
func SuccMessageResp() map[string]any {
|
||||
return map[string]any{"code": CODE_SUCC, "msg": "success"}
|
||||
}
|
||||
|
||||
func TotalResp(total int64) map[string]any {
|
||||
return map[string]any{"code": CODE_SUCC, "total": total}
|
||||
}
|
||||
|
||||
func TotalDataResp(data any, total any) map[string]any {
|
||||
return map[string]any{"code": CODE_SUCC, "data": data, "total": total}
|
||||
}
|
||||
|
||||
func SuccResp(va map[string]any) map[string]any {
|
||||
resp := make(map[string]any)
|
||||
resp["code"] = CODE_SUCC
|
||||
for k, v := range va {
|
||||
resp[k] = v
|
||||
}
|
||||
return resp
|
||||
}
|
||||
Reference in New Issue
Block a user