1、定时删除过期数据

2、默认自动续期
This commit is contained in:
2025-07-29 18:16:12 +08:00
parent 426a79da49
commit 7f9101fcac
13 changed files with 182 additions and 11 deletions

View File

@ -496,3 +496,30 @@ func (e MemberProxy) DeleteMyProxy(c *gin.Context) {
e.OK(nil, "success")
}
// 清除自己的代理
func (e MemberProxy) CleanMyProxy(c *gin.Context) {
req := dto.MemberProxyCleanReq{}
s := service.MemberProxy{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, nil, "server error")
}
userId := user.GetUserId(c)
err = s.CleanMyProxy(&req, userId)
if err != nil {
e.Logger.Error(err)
e.Error(500, nil, err.Error())
return
}
e.OK(nil, "success")
}

View File

@ -404,3 +404,30 @@ func (e SmsPhone) ChangeAutoRenew(c *gin.Context) {
e.OK(nil, "修改自动续费状态成功")
}
// 清除我的号码
func (e SmsPhone) CleanMyPhone(c *gin.Context) {
req := dto.SmsPhoneCleanMyPhoneReq{}
s := service.SmsPhone{}
err := e.MakeContext(c).
MakeOrm().
Bind(&req).
MakeService(&s.Service).
Errors
if err != nil {
e.Logger.Error(err)
e.Error(500, err, err.Error())
return
}
userId := user.GetUserId(c)
err = s.CleanMyPhone(&req, userId)
if err != nil {
e.Error(500, err, fmt.Sprintf("清理失败,\r\n失败信息 %s", err.Error()))
return
}
e.OK(nil, "清理成功")
}

View File

@ -29,7 +29,8 @@ func registerMemberProxyRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMi
r2.POST("user-renewal", api.UserRenewal) //用户续费
r2.POST("change-auto-renewal", api.ChangeAutoRenewal) //修改自动续费
r2.DELETE("my", api.DeleteMyProxy) //删除我的代理
r2.DELETE("my", api.DeleteMyProxy) //删除我的代理
r2.DELETE("clean", api.CleanMyProxy) //清理自己的代理
}
r := v1.Group("/member-proxy").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())

View File

@ -24,6 +24,7 @@ func registerSmsPhoneRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddl
r1.GET("list", api.GetMyPage) // 获取自己的号码列表
r1.POST("weakUp", api.WeakUp) // 新增号码
r1.DELETE("my-number", api.DeleteMyNumber) // 删除自己的号码
r1.DELETE("clean", api.CleanMyPhone) //清理自己的号码
r1.PUT("cancel", api.CancelNumber) //取消号码
r1.PUT("auto-renewal", api.ChangeAutoRenew) //修改自动续费状态
}

View File

@ -140,6 +140,7 @@ func (e *CliProxyService) UseIp(req *dto.CliProxyIPUseReq, userId int) (decimal.
memberProxy.Password = resp.Data.Password
memberProxy.UserName = resp.Data.UserName
memberProxy.Expired = time.Unix(int64(resp.Data.Expired), 0)
memberProxy.AutoRenewal = 1
err = e.Orm.Transaction(func(tx *gorm.DB) error {
if err1 := tx.Exec("UPDATE member_balance SET balance = balance - ? WHERE user_id =?", price, userId).Error; err1 != nil {

View File

@ -130,3 +130,7 @@ type MemberProxyResp struct {
Status int `json:"status"`
AutoRenewal bool `json:"autoRenewal"`
}
type MemberProxyCleanReq struct {
Type int `json:"type" comment:"类型1-长效ip 2-流量计费"`
}

View File

@ -172,3 +172,7 @@ type SmsPhoneChangeAutoRenewReq struct {
Id int `json:"id" comment:"短信号码id"`
AutoRenew int `json:"autoRenew" comment:"是否自动续费 1-不自动续费 2-自动续费"`
}
type SmsPhoneCleanMyPhoneReq struct {
Type int `json:"type" comment:"类型 0-短效 1-长效"`
}

View File

@ -15,6 +15,7 @@ import (
"go-admin/app/admin/service/dto"
"go-admin/common/actions"
cDto "go-admin/common/dto"
"go-admin/common/global"
)
type MemberProxy struct {
@ -329,6 +330,38 @@ func (e *MemberProxy) CreateProxy(req *dto.MemberProxyInsertReq, userId int) (de
return balance, err
}
// 清除我的代理
func (e *MemberProxy) CleanMyProxy(req *dto.MemberProxyCleanReq, userId int) error {
if err := e.Orm.Where("user_id =? and type =?", userId, req.Type).Delete(&models.MemberProxy{}).Error; err != nil {
e.Log.Errorf("清除数据失败 err:%v", err)
return errors.New("删除失败")
}
return nil
}
// 删除过期数据
func (e *MemberProxy) DeleteExpired() error {
configService := SysConfig{Service: e.Service}
cliProxyConfig := dto.GetSysConfigByKEYForServiceResp{}
configService.GetWithKey(&dto.SysConfigByKeyReq{ConfigKey: global.ProxyExpiryTime}, &cliProxyConfig)
if cliProxyConfig.ConfigValue == "" {
e.Log.Error("获取动态ip默认时长失败")
return errors.New("server error")
}
day, _ := strconv.Atoi(cliProxyConfig.ConfigValue)
timeDruction := time.Hour * 24 * time.Duration(day)
endTime := time.Now().Add(-timeDruction)
if err := e.Orm.Exec("delete from member_proxy where expired <?", endTime).Error; err != nil {
e.Log.Errorf("删除过期数据失败 err:%v")
}
return nil
}
func (e *MemberProxy) getUserName(area, state string) (decimal.Decimal, string, error) {
configService := SysConfig{Service: e.Service}
cliProxyConfig := dto.GetSysConfigByKEYForServiceResp{}

View File

@ -15,6 +15,7 @@ import (
"go-admin/app/admin/service/dto"
"go-admin/common/actions"
cDto "go-admin/common/dto"
"go-admin/common/global"
"go-admin/common/statuscode"
"go-admin/config"
"go-admin/utils/httphelper"
@ -214,6 +215,7 @@ func (e *SmsPhone) GetNumber(req *dto.GetNumberReq, userId int) (decimal.Decimal
} else {
now = now.Add(time.Minute * time.Duration(serviceItem.ExpirationMinutes))
smsPhone.ExpireTime = &now
smsPhone.AutoRenewal = 2
}
smsPhone.Status = 1
@ -223,18 +225,24 @@ func (e *SmsPhone) GetNumber(req *dto.GetNumberReq, userId int) (decimal.Decimal
return decimal.Zero, statuscode.ServerError
}
// if req.Type == 1 {
// //保存长效号码
// // if code := e.KeepLongTerm(smsPhone.ActivationId); code != statuscode.Success {
// // return decimal.Zero, code
// // }
// }
if err := e.Orm.Exec("UPDATE member_balance SET balance = balance -? WHERE user_id =?", price, userId).Error; err != nil {
e.Log.Errorf("更新余额失败", err)
return decimal.Zero, statuscode.ServerError
}
//长效号码默认开启续费
if req.Type == 1 {
code := e.ChangeAutoRenewForApi(smsPhone.NewActivationId, true)
if code == statuscode.Success {
smsPhone.AutoRenewal = 1
if err := e.Orm.Model(&smsPhone).Update("auto_renewal", smsPhone.AutoRenewal).Error; err != nil {
e.Log.Errorf("更新短信号码自动续期失败, %s", err)
}
}
}
balance = balanceService.GetBalance(userId)
return balance, statuscode.Success
@ -777,3 +785,35 @@ func (e *SmsPhone) Remove(d *dto.SmsPhoneDeleteReq, p *actions.DataPermission) e
}
return nil
}
// 清除我的数据
func (e *SmsPhone) CleanMyPhone(req *dto.SmsPhoneCleanMyPhoneReq, userId int) error {
if err := e.Orm.Where("user_id =? and type =?", userId, req.Type).Delete(&models.SmsPhone{}).Error; err != nil {
e.Log.Errorf("清除用户手机号码失败:%s", err.Error())
return err
}
return nil
}
// 删除过期数据
func (e *SmsPhone) DeleteExpired() error {
configService := SysConfig{Service: e.Service}
cliProxyConfig := dto.GetSysConfigByKEYForServiceResp{}
configService.GetWithKey(&dto.SysConfigByKeyReq{ConfigKey: global.SmsExpiryTime}, &cliProxyConfig)
if cliProxyConfig.ConfigValue == "" {
e.Log.Error("获取短信过期保留时长失败")
return errors.New("server error")
}
day, _ := strconv.Atoi(cliProxyConfig.ConfigValue)
timeDruction := time.Hour * 24 * time.Duration(day)
endTime := time.Now().Add(-timeDruction)
if err := e.Orm.Exec("delete from sms_phone where expire_time <?", endTime).Error; err != nil {
e.Log.Errorf("删除过期数据失败 err:%v")
}
return nil
}

View File

@ -18,6 +18,7 @@ func InitJob() {
"CleanExpiredOrderJob": CleanExpiredOrderJob{}, //清理过期订单
"SmsJob": SmsJob{}, //短信定时查询验证码
"SmsRenewalJob": SmsRenewalJob{}, //短信定时自动续期
"AutoDeleteJob": AutoDeleteJob{}, //定时删除任务
// ...
}
}

View File

@ -9,6 +9,22 @@ import (
type RenewalJob struct{}
type SmsRenewalJob struct{}
type ExpireProxyJob struct{}
type AutoDeleteJob struct{}
// 定时删除任务
func (j AutoDeleteJob) Exec(args interface{}) error {
memberService := service.MemberProxy{}
memberService.Orm = GetDb()
memberService.Log = logger.NewHelper(logger.DefaultLogger)
phoneService := service.SmsPhone{}
phoneService.Orm = GetDb()
phoneService.Log = logger.NewHelper(logger.DefaultLogger)
memberService.DeleteExpired()
phoneService.DeleteExpired()
return nil
}
// 定时续期任务
func (j RenewalJob) Exec(args interface{}) error {

View File

@ -17,3 +17,16 @@ func TestProxyJob(t *testing.T) {
t.Error(err)
}
}
func TestAutoDeleteJob(t *testing.T) {
initSetting()
config.ExtConfig.CliproxyUrl = "https://f.cliproxy.com"
config.ExtConfig.CliproxyApiUrl = "https://api.cliproxy.com"
config.ExtConfig.DaisysmsUrl = "https://daisysms.com/stubs/handler_api.php"
autoDeleteJob := AutoDeleteJob{}
if err := autoDeleteJob.Exec(nil); err != nil {
t.Error(err)
}
}

View File

@ -2,7 +2,10 @@ package global
//ConfigKey
const (
流量代理有效天数 = "traffic_proxy_effective_day"
长效号码续费标准 = "long_number_renew_deduction_standard"
长效IP续费kk扣除标准 = "ip_renew_deduction_standard"
TrafficProxyEffectiveDay = "traffic_proxy_effective_day" //流量代理有效天数
LongNumberRenewDeductionStandard = "long_number_renew_deduction_standard" //长效号码续费标准
IPRenewDeductionStandard = "ip_renew_deduction_standard" //长效IP续费kk扣除标准
ProxyExpiryTime = "proxy_expiry_time" //代理过期记录保留时长
SmsExpiryTime = "sms_expiry_time" //接码过期记录保留时长
)