創建redis文件夾、創建dadeRedis.go
package redisimport ("context""github.com/go-redis/redis/v8""log""time"
)var (client *redis.Clientctx = context.Background()
)// 初始化Redis連接(建議在程序啟動時調用)
func Init() error {client = redis.NewClient(&redis.Options{Addr: "localhost:6379",Password: "",DB: 0,DialTimeout: 10 * time.Second, // 連接超時(首次連接)ReadTimeout: 30 * time.Second, // 讀超時WriteTimeout: 30 * time.Second, // 寫超時PoolSize: 100, // 連接池大小MinIdleConns: 10, // 最小空閑連接數MaxRetries: 5, // 命令執行失敗時的最大重試次數MinRetryBackoff: 8 * time.Millisecond, // 重試最小等待時間MaxRetryBackoff: 512 * time.Millisecond, // 重試最大等待時間})// 測試連接_, err := client.Ping(ctx).Result()if err != nil {log.Fatalf("Redis連接初始化失敗: %v", err)return err}log.Println("Redis連接初始化成功")return nil
}// 獲取Redis客戶端(所有文件共享此實例)
func GetClient() *redis.Client {return client
}// 關閉連接(程序退出時調用)
func Close() error {return client.Close()
}
2、在app.go的main()初始化
package mainimport ("github.com/gin-contrib/cors""github.com/gin-gonic/gin""goDocker/controller""goDocker/redis""log""net/http""time"
)func main() {// 初始化Redis連接(僅執行一次)if err := redis.Init(); err != nil {log.Fatalf("程序啟動失敗: Redis連接初始化錯誤 - %v", err)}// 程序退出時關閉連接,defer函數是main退出執行defer redis.Close()//redis在這里初始化完成,并且連接完成,全局使用router := gin.Default()// 配置CORS中間件config := cors.DefaultConfig()// 允許的域名,* 表示所有config.AllowOrigins = []string{"*"}// 是否允許攜帶憑證config.AllowCredentials = true// 允許的請求方法config.AllowMethods = []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}// 允許的請求頭config.AllowHeaders = []string{"Origin", "Content-Type", "Accept", "Authorization", "Token", "User"}// 預檢請求的有效期config.MaxAge = 12 * time.Hour// 全局使用CORS中間件router.Use(cors.New(config))router.GET("/", func(c *gin.Context) {c.String(http.StatusOK, "你好,我是docker管理")})v1 := router.Group("/index"){v1.POST("/login", controller.Login)v1.POST("/select", controller.CostingSelect)v1.POST("/selectDocker", controller.CostingDocker)v1.POST("/fileShUpdate", controller.FileShUpdate)}//調用定時任務router.Run("0.0.0.0:40090")
}
3、在其它文件使用index.go中
package controller// /home/cs/goDocker
import ("bytes""context""encoding/json""fmt""github.com/gin-gonic/gin""goDocker/redis""io/ioutil""log""os""os/exec""strings""time"
)func Login(c *gin.Context) {//獲得post請求參數b, _ := c.GetRawData()// 定義map或結構體var req map[string]interface{}// 反序列化_ = json.Unmarshal(b, &req)pwds, _ := req["pwd"].(string)if pwds != "wbrj131369" {c.JSON(200, gin.H{"code": 2001,"data": req,"message": "驗證失敗",})return}client := redis.GetClient() // 獲取全局共享的Redis客戶端ctx := context.Background()// 使用Redis客戶端err := client.Set(ctx, "user", "admin", 10*time.Minute).Err()if err != nil {c.JSON(500, gin.H{"error": "Redis操作失敗"})return}//讀取val, err := client.Get(ctx, "user").Result()if err != nil {log.Fatalf("獲取值失敗: %v", err)}// 返回 JSON 響應c.JSON(200, gin.H{"code": 2000,"data": req,"message": "驗證成功",})
}
隨機數,多點登錄
func Login(c *gin.Context) {//獲得post請求參數b, _ := c.GetRawData()// 定義map或結構體var req map[string]interface{}// 反序列化_ = json.Unmarshal(b, &req)pwds, _ := req["pwd"].(string)if pwds != "wbrj131369" {c.JSON(200, gin.H{"code": 2001,"data": req,"message": "驗證失敗",})return}//md5加密now := time.Now()timestamp := now.Unix()timestampKey := now.UnixNano() // 納秒級時間戳hash := md5.Sum([]byte(fmt.Sprintf("%d", timestampKey)))md5Str := hex.EncodeToString(hash[:])//生成key值// 生成格式為 "user_1697342400" 的 keykey := fmt.Sprintf("user_%d", timestamp)//使用redisclient := redis.GetClient() // 獲取全局共享的Redis客戶端ctx := context.Background()// 使用Redis客戶端err := client.Set(ctx, key, md5Str, 600*time.Minute).Err()if err != nil {c.JSON(500, gin.H{"error": "Redis操作失敗"})return}//讀取val, err := client.Get(ctx, key).Result()if err != nil {log.Fatalf("獲取值失敗: %v", err)}log.Printf("獲取到的值: %s", val)// 返回 JSON 響應c.JSON(200, gin.H{"code": 2000,"data": req,"key": key,"tokey": md5Str,"message": "驗證成功",})
}