
创建redis文件夹、创建dadeRedis.go
javascript
package redis
import (
"context"
"github.com/go-redis/redis/v8"
"log"
"time"
)
var (
client *redis.Client
ctx = 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()初始化
javascript
package main
import (
"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中
javascript
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": "验证成功",
})
}
随机数,多点登录
javascript
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" 的 key
key := fmt.Sprintf("user_%d", timestamp)
//使用redis
client := 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": "验证成功",
})
}