package handlers import ( "net/http" "strconv" "strings" panutils "github.com/ctwj/panResManage/common" "github.com/ctwj/panResManage/db/converter" "github.com/ctwj/panResManage/db/dto" "github.com/ctwj/panResManage/db/entity" "github.com/gin-gonic/gin" ) // GetCks 获取Cookie列表 func GetCks(c *gin.Context) { cks, err := repoManager.CksRepository.FindAll() if err != nil { ErrorResponse(c, err.Error(), http.StatusInternalServerError) return } responses := converter.ToCksResponseList(cks) SuccessResponse(c, responses) } // CreateCks 创建Cookie func CreateCks(c *gin.Context) { var req dto.CreateCksRequest if err := c.ShouldBindJSON(&req); err != nil { ErrorResponse(c, err.Error(), http.StatusBadRequest) return } // 获取平台信息以确定服务类型 pan, err := repoManager.PanRepository.FindByID(req.PanID) if err != nil { ErrorResponse(c, "平台不存在", http.StatusBadRequest) return } // 根据平台名称确定服务类型 var serviceType panutils.ServiceType switch pan.Name { case "quark": serviceType = panutils.Quark case "alipan": serviceType = panutils.Alipan case "baidu": serviceType = panutils.BaiduPan case "uc": serviceType = panutils.UC default: ErrorResponse(c, "不支持的平台类型", http.StatusBadRequest) return } // 创建网盘服务实例 factory := panutils.GetInstance() service, err := factory.CreatePanServiceByType(serviceType, &panutils.PanConfig{}) if err != nil { ErrorResponse(c, "创建网盘服务失败: "+err.Error(), http.StatusInternalServerError) return } // 获取用户信息 userInfo, err := service.GetUserInfo(req.Ck) if err != nil { ErrorResponse(c, "无法获取用户信息,账号创建失败: "+err.Error(), http.StatusBadRequest) return } leftSpaceBytes := userInfo.TotalSpace - userInfo.UsedSpace // 创建Cks实体 cks := &entity.Cks{ PanID: req.PanID, Idx: req.Idx, Ck: req.Ck, IsValid: userInfo.VIPStatus, // 根据VIP状态设置有效性 Space: userInfo.TotalSpace, LeftSpace: leftSpaceBytes, UsedSpace: userInfo.UsedSpace, Username: userInfo.Username, VipStatus: userInfo.VIPStatus, ServiceType: userInfo.ServiceType, Remark: req.Remark, } err = repoManager.CksRepository.Create(cks) if err != nil { ErrorResponse(c, err.Error(), http.StatusInternalServerError) return } SuccessResponse(c, gin.H{ "message": "账号创建成功", "cks": converter.ToCksResponse(cks), }) } // parseCapacityToBytes 将容量字符串转换为字节数 func parseCapacityToBytes(capacity string) int64 { if capacity == "未知" || capacity == "" { return 0 } // 移除空格并转换为小写 capacity = strings.TrimSpace(strings.ToLower(capacity)) var multiplier int64 = 1 if strings.Contains(capacity, "gb") { multiplier = 1024 * 1024 * 1024 capacity = strings.Replace(capacity, "gb", "", -1) } else if strings.Contains(capacity, "mb") { multiplier = 1024 * 1024 capacity = strings.Replace(capacity, "mb", "", -1) } else if strings.Contains(capacity, "kb") { multiplier = 1024 capacity = strings.Replace(capacity, "kb", "", -1) } else if strings.Contains(capacity, "b") { capacity = strings.Replace(capacity, "b", "", -1) } // 解析数字 capacity = strings.TrimSpace(capacity) if capacity == "" { return 0 } // 尝试解析浮点数 if strings.Contains(capacity, ".") { if val, err := strconv.ParseFloat(capacity, 64); err == nil { return int64(val * float64(multiplier)) } } else { if val, err := strconv.ParseInt(capacity, 10, 64); err == nil { return val * multiplier } } return 0 } // GetCksByID 根据ID获取Cookie详情 func GetCksByID(c *gin.Context) { idStr := c.Param("id") id, err := strconv.ParseUint(idStr, 10, 32) if err != nil { ErrorResponse(c, "无效的ID", http.StatusBadRequest) return } cks, err := repoManager.CksRepository.FindByID(uint(id)) if err != nil { ErrorResponse(c, "Cookie不存在", http.StatusNotFound) return } response := converter.ToCksResponse(cks) SuccessResponse(c, response) } // UpdateCks 更新Cookie func UpdateCks(c *gin.Context) { idStr := c.Param("id") id, err := strconv.ParseUint(idStr, 10, 32) if err != nil { ErrorResponse(c, "无效的ID", http.StatusBadRequest) return } var req dto.UpdateCksRequest if err := c.ShouldBindJSON(&req); err != nil { ErrorResponse(c, err.Error(), http.StatusBadRequest) return } cks, err := repoManager.CksRepository.FindByID(uint(id)) if err != nil { ErrorResponse(c, "Cookie不存在", http.StatusNotFound) return } if req.PanID != 0 { cks.PanID = req.PanID } if req.Idx != 0 { cks.Idx = req.Idx } if req.Ck != "" { cks.Ck = req.Ck } cks.IsValid = req.IsValid if req.LeftSpace != 0 { cks.LeftSpace = req.LeftSpace } if req.UsedSpace != 0 { cks.UsedSpace = req.UsedSpace } if req.Username != "" { cks.Username = req.Username } cks.VipStatus = req.VipStatus if req.ServiceType != "" { cks.ServiceType = req.ServiceType } if req.Remark != "" { cks.Remark = req.Remark } err = repoManager.CksRepository.Update(cks) if err != nil { ErrorResponse(c, err.Error(), http.StatusInternalServerError) return } SuccessResponse(c, gin.H{"message": "Cookie更新成功"}) } // DeleteCks 删除Cookie func DeleteCks(c *gin.Context) { idStr := c.Param("id") id, err := strconv.ParseUint(idStr, 10, 32) if err != nil { ErrorResponse(c, "无效的ID", http.StatusBadRequest) return } err = repoManager.CksRepository.Delete(uint(id)) if err != nil { ErrorResponse(c, err.Error(), http.StatusInternalServerError) return } SuccessResponse(c, gin.H{"message": "Cookie删除成功"}) } // GetCksByID 根据ID获取Cookie详情(使用全局repoManager) func GetCksByIDGlobal(c *gin.Context) { idStr := c.Param("id") id, err := strconv.ParseUint(idStr, 10, 32) if err != nil { ErrorResponse(c, "无效的ID", http.StatusBadRequest) return } cks, err := repoManager.CksRepository.FindByID(uint(id)) if err != nil { ErrorResponse(c, "Cookie不存在", http.StatusNotFound) return } response := converter.ToCksResponse(cks) SuccessResponse(c, response) } // RefreshCapacity 刷新账号容量信息 func RefreshCapacity(c *gin.Context) { idStr := c.Param("id") id, err := strconv.ParseUint(idStr, 10, 32) if err != nil { ErrorResponse(c, "无效的ID", http.StatusBadRequest) return } // 获取账号信息 cks, err := repoManager.CksRepository.FindByID(uint(id)) if err != nil { ErrorResponse(c, "账号不存在", http.StatusNotFound) return } // 获取平台信息以确定服务类型 pan, err := repoManager.PanRepository.FindByID(cks.PanID) if err != nil { ErrorResponse(c, "平台不存在", http.StatusBadRequest) return } // 根据平台名称确定服务类型 var serviceType panutils.ServiceType switch pan.Name { case "quark": serviceType = panutils.Quark case "alipan": serviceType = panutils.Alipan case "baidu": serviceType = panutils.BaiduPan case "uc": serviceType = panutils.UC default: ErrorResponse(c, "不支持的平台类型", http.StatusBadRequest) return } // 创建网盘服务实例 factory := panutils.GetInstance() service, err := factory.CreatePanServiceByType(serviceType, &panutils.PanConfig{}) if err != nil { ErrorResponse(c, "创建网盘服务失败: "+err.Error(), http.StatusInternalServerError) return } // 获取最新的用户信息 userInfo, err := service.GetUserInfo(cks.Ck) if err != nil { ErrorResponse(c, "无法获取用户信息,刷新失败: "+err.Error(), http.StatusBadRequest) return } leftSpaceBytes := userInfo.TotalSpace - userInfo.UsedSpace // 更新账号信息 cks.Username = userInfo.Username cks.VipStatus = userInfo.VIPStatus cks.ServiceType = userInfo.ServiceType cks.Space = userInfo.TotalSpace cks.LeftSpace = leftSpaceBytes cks.UsedSpace = userInfo.UsedSpace cks.IsValid = userInfo.VIPStatus // 根据VIP状态更新有效性 err = repoManager.CksRepository.Update(cks) if err != nil { ErrorResponse(c, err.Error(), http.StatusInternalServerError) return } SuccessResponse(c, gin.H{ "message": "容量信息刷新成功", "cks": converter.ToCksResponse(cks), }) }