package proto import ( "encoding/json" "fmt" "gorm.io/gorm" "log" mrand "math/rand" "os" "sync" ) var Config ConfigStruct var SigningKey = []byte{} var Url_map = map[string]bool{"/login": true, "/register": true, "/uuid": true, "/gqr": true, "/cid/callback": true, "/tool/monitor": true, "/user/sync": true, "/tool/file/": true, "/user/reset": true} // 不需要token验证的url var Per_menu_map = map[string]int{"/video/": 1, "/device/": 2, "/cid/": 3} var File_Type = map[string]int{"im": 1, "avatar": 2, "file": 3, "config": 4} // 文件类型 // 配置读写锁 var ConfigRWLock = &sync.RWMutex{} var SigningKeyRWLock = &sync.RWMutex{} var SyncSecretReqLog int64 var CurrentConfigPath string var SigningKeyIsValid = true // 是否有效的签名密钥 const ( MYSQL_USER = "video_t2" MYSQL_DB = "video_t2" MYSQL_PASSWORD = "2t2SKHmWEYj2xFKF" MYSQL_PORT = "3306" MYSQL_HOST = "127.0.0.1" MYSQL_DSN = MYSQL_USER + ":" + MYSQL_PASSWORD + "@tcp(" + MYSQL_HOST + ":" + MYSQL_PORT + ")/" + MYSQL_DB + "?charset=utf8mb4&parseTime=True&loc=Local" REDIS_ADDR = "127.0.0.1:6379" REDIS_PASSWORD = "lj502138" REIDS_DB = 2 TOKEN_SECRET = "mfjurnc_32ndj9dfhj" // 以下是持续集成、部署的配置 CID_BASE_DIR = "/home/lijun/cid/" // 以下是文件上传的配置 FILE_BASE_DIR = "/home/lijun/file/" ) const ( // 以下是消息类型 MSG_TYPE_SIMPLE = 1 // 单聊 MSG_TYPE_GROUP = 2 // 群聊 MSG_TYPE_SYSTEM = 3 // 系统消息 MSG_TYPE_FRIEND = 4 // 好友请求 MSG_TYPE_GROUP_ADD = 5 // 加入群聊请求 MSG_TYPE_GROUP_INVI = 6 // 邀请加入群聊 // 以下是消息状态 MSG_STATUS_READ = 1 // 已读 MSG_STATUS_UNREAD = 0 // 未读 ) const ( //文件上传类型 File_TYPE = 1 // 通用文件 //用于视频解析 Video_TYPE = 2 // 视频文件 ) type User struct { gorm.Model Name string `gorm:"column:name"` Age int `gorm:"column:age"` Email string `gorm:"column:email"` Gender string `gorm:"column:gender"` } type StructValue struct { Value string `json:"value" form:"value"` } type ConfigStruct struct { DB int `json:"db"` // 0: mysql, 1: pg MYSQL_DSN string `json:"mysql_dsn"` PG_DSN string `json:"pg_dsn"` REDIS_ADDR string `json:"redis_addr"` TOKEN_USE_REDIS bool `json:"token_use_redis"` REDIS_User_PW bool `json:"redis_user_pw"` // 是否使用密码 REDIS_PASSWORD string `json:"redis_password"` REDIS_DB int `json:"redis_db"` TOKEN_SECRET string `json:"token_secret"` CID_BASE_DIR string `json:"cid_base_dir"` FILE_BASE_DIR string `json:"file_base_dir"` MONITOR bool `json:"monitor"` // 状态监控及邮件通知 SERVER_SQL_LOG bool `json:"server_sql_log"` // 服务器sql日志 SERVER_PORT string `json:"server_port"` // 服务端口 LOG_SAVE_DAYS int `json:"log_save_days"` // 日志保存天数,-1表示不保存,0表示永久保存 SERVER_USER_TYPE string `json:"user_type"` // 服务器用户类型,master: 主服务器,slave: 从服务器,从服务器会定时同步数据 MASTER_SERVER_DOMAIN string `json:"master_server_domain"` // 主服务器域名 USER_SYNC_TIME int `json:"user_sync_time"` // 用户数据同步时间,单位秒 SERVER_NAME string `json:"server_name"` // 服务器名称,用于区分不同服务器 MONITOR_SERVER_TOKEN string `json:"monitor_server_token"` // 监控服务器token,用于状态监控及邮件通知 APP_ID string `json:"app_id"` // 应用ID,用于标识不同应用 MONITOR_MAIL []StructValue `json:"monitor_mail"` // 设备监控邮件通知配置 } func WriteConfigToFile() { configData, err := json.MarshalIndent(Config, "", " ") if err != nil { log.Println("WriteConfigToFile json marshal error:", err) return } err = os.WriteFile(CurrentConfigPath, configData, 0644) if err != nil { log.Println("WriteConfigToFile write file error:", err) return } log.Println("WriteConfigToFile write config to file success") } // 读取配置文件 func ReadConfig(path string) error { //查看配置文件是否存在,不存在则创建 CurrentConfigPath = path _, err := os.Stat(path) if err != nil { fmt.Println("Config file not found!") //创建默认配置 DefaultConfig() //写入json文件 file, err := os.Create(path) if err != nil { fmt.Println("Error creating config file") return err } defer file.Close() encoder := json.NewEncoder(file) configData, err2 := json.MarshalIndent(Config, "", " ") if err2 != nil { log.Println("WriteConfigToFile json marshal error:", err) return err2 } err = encoder.Encode(string(configData)) if err != nil { fmt.Println("Error encoding config") } return err } //读json文件 file, err := os.Open(path) if err != nil { fmt.Println("Error opening config file") return err } defer file.Close() decoder := json.NewDecoder(file) err = decoder.Decode(&Config) if err != nil { fmt.Println("Error decoding config") } else { if Config.SERVER_PORT == "" { Config.SERVER_PORT = "8083" // 默认端口 } } SigningKey = []byte(Config.TOKEN_SECRET) if Config.APP_ID == "" { Config.APP_ID = GetRandomString(8) log.Println("ReadConfig generated APP_ID:", Config.APP_ID) go WriteConfigToFile() } return err } func GetRandomString(l int) string { str := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" bytes := []byte(str) var result []byte for i := 0; i < l; i++ { result = append(result, bytes[mrand.Intn(len(bytes))]) } return string(result) } // 默认配置 func DefaultConfig() { Config.DB = 2 Config.MYSQL_DSN = MYSQL_DSN Config.PG_DSN = "" Config.REDIS_ADDR = REDIS_ADDR Config.TOKEN_USE_REDIS = false Config.REDIS_User_PW = false Config.REDIS_PASSWORD = REDIS_PASSWORD Config.REDIS_DB = REIDS_DB Config.TOKEN_SECRET = TOKEN_SECRET Config.CID_BASE_DIR = CID_BASE_DIR Config.FILE_BASE_DIR = FILE_BASE_DIR Config.MONITOR = false Config.SERVER_SQL_LOG = false Config.SERVER_PORT = "8083" Config.LOG_SAVE_DAYS = 7 Config.SERVER_USER_TYPE = "master" Config.MASTER_SERVER_DOMAIN = "" Config.USER_SYNC_TIME = 86400 Config.SERVER_NAME = "default" }