From c8c30132eb08f421ded0afa9c769eee6364a6585 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Tue, 2 Jul 2024 09:36:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20ne=5Fconfig=E5=8F=82=E6=95=B0=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6=E6=95=B0=E6=8D=AE=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ne_config_parse_tool/README.md | 8 +++ ne_config_parse_tool/main.go | 101 ++++++++++++++++++++++++++++ ne_config_parse_tool/ne_config.go | 40 +++++++++++ ne_config_parse_tool/utils.go | 108 ++++++++++++++++++++++++++++++ 4 files changed, 257 insertions(+) create mode 100644 ne_config_parse_tool/README.md create mode 100644 ne_config_parse_tool/main.go create mode 100644 ne_config_parse_tool/ne_config.go create mode 100644 ne_config_parse_tool/utils.go diff --git a/ne_config_parse_tool/README.md b/ne_config_parse_tool/README.md new file mode 100644 index 00000000..69bf3118 --- /dev/null +++ b/ne_config_parse_tool/README.md @@ -0,0 +1,8 @@ +# ne_config参数配置文件数据解析工具说明 + +manin文件配置数据库连接,解开选择读取文件 + +```sh +# 进入main文件所在目录 +go run . +``` \ No newline at end of file diff --git a/ne_config_parse_tool/main.go b/ne_config_parse_tool/main.go new file mode 100644 index 00000000..859d4658 --- /dev/null +++ b/ne_config_parse_tool/main.go @@ -0,0 +1,101 @@ +package main + +import ( + "log" + "path/filepath" + "sort" + "strconv" +) + +const ( + DbHost = "192.168.5.59" + DbPort = 3306 + DbUser = "root" + DbPassswd = "root@1234" + DbName = "omc_pt" + + configParamDir = "../config/param" + configParamFile = "*" // 目录下全部更新 + // configParamFile = "upf_param_config.yaml" // 单文件更新 +) + +func init() { + +} + +func main() { + fileNameList, err := getDirFileNameList(configParamDir) + if err != nil { + log.Fatal(err) + return + } + + if configParamFile == "*" { + for _, v := range fileNameList { + params := parseData(filepath.Join(configParamDir, v)) + if params == nil { + return + } + saveData(params) + } + } else { + params := parseData(filepath.Join(configParamDir, configParamFile)) + if params == nil { + return + } + saveData(params) + } + +} + +// parseData 文件转map数据 +func parseData(filePaht string) []map[string]string { + data, err := parseStrToMap(filePaht) + if err != nil { + log.Printf("parseStrToMap => %s", err.Error()) + return nil + } + params, err := parseParamConfig(data) + if err != nil { + log.Printf("parseParamConfig => %s", err.Error()) + return nil + } + return params +} + +// saveData 保存数据 +func saveData(params []map[string]string) { + // 定义排序函数 + sort.Slice(params, func(i, j int) bool { + paramSortI := params[i]["paramSort"] + if len(paramSortI) == 0 || paramSortI == "" { + paramSortI = "0" + } + paramSortJ := params[j]["paramSort"] + if len(paramSortJ) == 0 || paramSortJ == "" { + paramSortJ = "0" + } + // 将 age 字段转换为整数进行比较 + si, _ := strconv.Atoi(paramSortI) + sj, _ := strconv.Atoi(paramSortJ) + return si < sj + }) + // 遍历插入 + for _, v := range params { + paramSort := v["paramSort"] + if len(paramSort) == 0 || paramSort == "" { + paramSort = "0" + } + neConfig := NeConfig{ + NeType: v["neType"], + ParamName: v["paramName"], + ParamDisplay: v["paramDisplay"], + ParamType: v["paramType"], + ParamJson: v["paramJson"], + ParamPerms: v["paramPerms"], + ParamSort: paramSort, + } + neConfig.Save() + log.Println(neConfig.ID, neConfig.NeType, neConfig.ParamDisplay) + } +} diff --git a/ne_config_parse_tool/ne_config.go b/ne_config_parse_tool/ne_config.go new file mode 100644 index 00000000..b976f656 --- /dev/null +++ b/ne_config_parse_tool/ne_config.go @@ -0,0 +1,40 @@ +package main + +import ( + "time" +) + +// NeConfig 网元_参数配置可用属性值 +type NeConfig struct { + ID string `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + NeType string `gorm:"ne_type"` // 网元类型 + ParamName string `gorm:"param_name"` // 参数名 + ParamDisplay string `gorm:"param_display"` // 参数显示名 + ParamType string `gorm:"param_type"` // 参数类型 list列表单层 array数组多层 + ParamJson string `gorm:"param_json"` // accesss属性控制:只读read-only/read/ro 读写read-write + ParamSort string `gorm:"param_sort"` // 参数排序 + ParamPerms string `gorm:"param_perms"` // 操作权限 get只读 put可编辑 delete可删除 post可新增 + UpdateTime int64 `gorm:"update_time"` // 更新时间 +} + +// TableName 表名称 +func (*NeConfig) TableName() string { + return "ne_config" +} + +// Save 表插入或更新 +func (s *NeConfig) Save() string { + db := connDB() + // 检查是否存在 + var id string + db.Raw("SELECT id FROM ne_config WHERE ne_type = ? AND param_name = ?", s.NeType, s.ParamName).Scan(&id) + // 更新时间 + s.UpdateTime = time.Now().UnixMilli() + if id != "" { + s.ID = id + db.Save(s) + } else { + db.Create(s) + } + return s.ID +} diff --git a/ne_config_parse_tool/utils.go b/ne_config_parse_tool/utils.go new file mode 100644 index 00000000..c4c91ebb --- /dev/null +++ b/ne_config_parse_tool/utils.go @@ -0,0 +1,108 @@ +package main + +import ( + "encoding/json" + "fmt" + "log" + "os" + "strings" + "time" + + "gopkg.in/yaml.v3" + "gorm.io/driver/mysql" + "gorm.io/gorm" + "gorm.io/gorm/logger" +) + +var gdb *gorm.DB + +// connDB 连接到数据库 +func connDB() *gorm.DB { + if gdb != nil { + return gdb + } + + dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", DbUser, DbPassswd, DbHost, DbPort, DbName) + newLogger := logger.New( + log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer + logger.Config{ + SlowThreshold: time.Minute, // Slow SQL threshold + LogLevel: logger.Error, // Log level + IgnoreRecordNotFoundError: true, // Ignore ErrRecordNotFound error for logger + ParameterizedQueries: true, // Don't include params in the SQL log + Colorful: false, // Disable color + }, + ) + db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: newLogger}) + if err != nil { + log.Fatalln(err) + } + gdb = db + return gdb +} + +// getDirFileNameList 获取文件目录下所有文件名称,不含目录名称 +func getDirFileNameList(dirPath string) ([]string, error) { + fileNames := []string{} + + dir, err := os.Open(dirPath) + if err != nil { + return fileNames, nil + } + defer dir.Close() + + fileInfos, err := dir.Readdir(-1) + if err != nil { + return fileNames, err + } + + for _, fileInfo := range fileInfos { + if fileInfo.Mode().IsRegular() { + fileNames = append(fileNames, fileInfo.Name()) + } + } + + return fileNames, nil +} + +// parseStrToMap 解析内容string到map +func parseStrToMap(filePath string) (map[string]any, error) { + // 读取文件内容 + bytes, err := os.ReadFile(filePath) + if err != nil { + return nil, err + } + content := string(bytes) + var configMap map[string]any + err = yaml.Unmarshal([]byte(content), &configMap) + + return configMap, err +} + +// parseParamConfig 解析内容文件数据 +func parseParamConfig(data map[string]any) ([]map[string]string, error) { + paramMapArr := make([]map[string]string, 0) + for k, v := range data { + for ik, iv := range v.(map[string]any) { + itemMap := make(map[string]string) + itemMap["neType"] = strings.ToUpper(k) + itemMap["paramName"] = ik + for iik, iiv := range iv.(map[string]any) { + switch iik { + case "display": + itemMap["paramDisplay"] = iiv.(string) + case "sort": + itemMap["paramSort"] = fmt.Sprint(iiv) + case "perms", "method": + itemMap["paramPerms"] = iiv.(string) + case "data", "list", "array": + itemMap["paramType"] = iik + strByte, _ := json.Marshal(iiv) + itemMap["paramJson"] = string(strByte) + } + } + paramMapArr = append(paramMapArr, itemMap) + } + } + return paramMapArr, nil +}