Files
2026-02-17 13:06:23 +08:00

242 lines
5.8 KiB
Go

package service
import (
"errors"
"fmt"
"strings"
"time"
"xiawan/wx/api/req"
"xiawan/wx/api/vo"
"xiawan/wx/db"
"xiawan/wx/srv/wxface"
"github.com/gin-gonic/gin"
"github.com/lunny/log"
)
// 检查请求参数 key 对应的 license 是否可用
func CheckKey(queryKey string) (string, error) {
errMsg := fmt.Sprintf("%s 该 key 无效! 请 检查正确性 或 联系管理员生成", queryKey)
if len(strings.TrimSpace(queryKey)) == 0 {
// 请求参数中没有携带 license 或者 license 为空
return "", errors.New(errMsg)
}
has, err := db.HasLicense(queryKey)
if has == nil || err != nil {
// MySQL 数据库没有该 license
return "", errors.New(errMsg)
}
if db.CheckExpiry(has.ExpiryDate, has.Type) {
// MySQL 数据库中的该 license 已过期
return "", fmt.Errorf("%s 该 key 已过期!", queryKey)
}
// license 可用
return queryKey, nil
}
// GenAuthKeyService 生成授权码(新设备)
func GenAuthKeyService(count, days int) vo.DTO {
if count < 1 {
count = 1
}
if days < 1 {
days = 30
}
res := db.CreateLicense(count, days)
authKeys := strings.Split(res, "\n\t")
if len(res) == 0 {
authKeys = []string{}
}
return vo.NewSuccessObj(authKeys, "AuthKey生成成功")
}
// 按类型生成(不使用不计算时间)
func GenAuthKeyService3(count int, itype int) vo.DTO {
//1日 7 周 30月 90季 180 半年 365年 30000
types := []int{1, 7, 30, 90, 180, 365, 30000}
// 判断 itype 在 types 中
isType := false
for _, t := range types {
if t == itype {
isType = true
break
}
}
log.Println("isType", isType)
log.Println("Type", itype)
log.Println("types", types)
if !isType {
return vo.NewFail("type 参数错误")
}
res := db.CreateLicense3(count, itype)
authKeys := strings.Split(res, "\n\t")
if len(res) == 0 {
authKeys = []string{}
}
return vo.NewSuccessObj(authKeys, "AuthKey生成成功")
}
// 授权码延期 西柚云
func DelayAuthKeyServiceNew(key string, m req.DelayAuthKeyModelNew) vo.DTO {
if m.KeyUse == "" || key == "" {
return vo.NewFail("keyuse 参数错误")
}
// 计算被使用key的剩余天数
keyuse_expirydata, err := db.HasLicense(m.KeyUse)
if err != nil || keyuse_expirydata == nil {
return vo.NewFail("查询失败")
}
key_use_days := keyuse_expirydata.Type
ms := req.DelayAuthKeyModel{
Key: key,
Days: key_use_days,
ExpiryDate: "",
}
db.DeleteLicense(m.KeyUse, 2)
return DelayAuthKeyService(ms)
}
// 授权码解绑 西柚云
func UnbindAuthKeyService(key string) vo.DTO {
if key == "" {
return vo.NewFail("key 参数错误")
}
ms := req.DeleteAuthKeyModel{
Key: key,
Opt: 3,
}
return checkExIdPerformNoCreateConnect(key, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
wxAccount := connect.GetWXAccount()
wxAccount.GetUserInfo().SetLoginState(0)
if wxAccount.GetUserInfo().GetLoginState() == 0 {
return DeleteAuthKeyService(ms)
} else {
return vo.NewFail("解绑失败")
}
})
}
// 查看配置
func GetConfigService(key string) vo.DTO {
if key == "" {
return vo.NewFail("key 参数错误")
}
query, err := db.QueryCommand(key)
if err != nil {
return vo.NewFail("操作失败!")
}
return vo.NewSuccessObj(query, "操作成功!")
}
// DelayAuthKeyService 授权码延期
func DelayAuthKeyService(m req.DelayAuthKeyModel) vo.DTO {
if m.Days < 1 {
m.Days = 30
}
if len(strings.TrimSpace(m.ExpiryDate)) > 0 {
// 获取当前的过期日期
expiryDate, err := time.Parse("2006-01-02", m.ExpiryDate)
if err != nil {
return vo.NewFail("ExpiryDate 参数解析错误")
}
now := time.Now()
if expiryDate.Before(now) {
return vo.NewFail("ExpiryDate 参数设置错误")
}
// ExpiryDate 参数可用
m.ExpiryDate = strings.TrimSpace(m.ExpiryDate)
m.Days = 0
}
expiryDateStr, err := db.DelayLicense(m)
if err != nil {
return vo.NewFail("延期失败: " + err.Error())
}
// 延期成功; 更新已建立链接的授权码的过期时间
return getExistWxConnect(m.Key, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
if connect != nil {
connect.GetWXServer().UpdateExpiryDate(m.Key, expiryDateStr)
}
return vo.NewSuccess(gin.H{
"expiryDate": expiryDateStr,
}, "延期成功")
})
}
// 更新禁用状态
func BannedAuthKeyService(m req.BannedAuthKeyModel) vo.DTO {
bannedStr := "启用:0"
if m.IsBanned != 0 {
m.IsBanned = 1
bannedStr = "禁用:1"
}
err := db.DisableLicense(m.Key, m.IsBanned)
if err != nil {
return vo.NewFail("设置失败: " + err.Error())
}
// 延期成功; 更新已建立链接的授权码的过期时间
return getExistWxConnect(m.Key, func(connect wxface.IWXConnect, newIWXConnect bool) vo.DTO {
if connect != nil {
connect.GetWXServer().UpdateDisable(m.Key, m.IsBanned)
}
return vo.NewSuccess(gin.H{
"isBanned": bannedStr,
}, "设置成功")
})
}
// HttpSyncLicenseKeyService HTTP-激活状态
func HttpSyncLicenseKeyService() vo.DTO {
results, err := db.HttpSyncLicenseKey()
if err != nil {
return vo.NewFail("发生错误: " + err.Error())
}
return vo.NewSuccessObj(results, "")
}
// DeleteAuthKeyService 删除授权码
func DeleteAuthKeyService(m req.DeleteAuthKeyModel) vo.DTO {
err := db.DeleteLicense(m.Key, m.Opt)
if err != nil {
return vo.NewFail("删除授权码失败: " + err.Error())
}
return vo.NewSuccess(gin.H{}, "删除成功")
}
// GetLicenseKeyService 查询卡密有效期
func GetLicenseKeyService(queryKey string) vo.DTO {
has, err := db.HasLicense(queryKey)
if err != nil {
return vo.NewFail("查询失败")
}
if has == nil {
return vo.NewFail("卡密不存在")
}
return vo.NewSuccessObj(has, "查询成功")
}
// GetActiveLicenseKeysService 获取所有激活状态的卡密
func GetActiveLicenseKeysService() vo.DTO {
results, err := db.GetActiveLicenseKeys()
if err != nil {
return vo.NewFail("查询失败: " + err.Error())
}
return vo.NewSuccessObj(results, "查询成功")
}