修复设备解绑后,对userinfo接口改动
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 6m15s

This commit is contained in:
shanshanzhong 2026-01-14 21:06:08 -08:00
parent b3ebf47b2c
commit 8842d23cd7
7 changed files with 204 additions and 2 deletions

View File

@ -0,0 +1,66 @@
package main
import (
"context"
"fmt"
"time"
"github.com/perfect-panel/server/initialize"
"github.com/perfect-panel/server/internal/config"
loggerLog "github.com/perfect-panel/server/internal/model/log"
"github.com/perfect-panel/server/internal/svc"
"github.com/perfect-panel/server/pkg/conf"
)
func main() {
var c config.Config
conf.MustLoad("etc/ppanel.yaml", &c)
fmt.Println("Initializing ServiceContext...")
svcCtx := svc.NewServiceContext(c)
initialize.Email(svcCtx)
fmt.Println("ServiceContext initialized.")
ctx := context.Background()
// 模拟真实数据
content := map[string]interface{}{
"Type": 1,
"SiteLogo": c.Site.SiteLogo,
"SiteName": c.Site.SiteName,
"Expire": 15,
"Code": "123456",
}
messageLog := loggerLog.Message{
Platform: svcCtx.Config.Email.Platform,
To: "shanshanzhong147@gmail.com",
Subject: "PPanel Test - Verify Email (Register)",
Content: content,
Status: 1,
}
emailLog, err := messageLog.Marshal()
if err != nil {
panic(err)
}
systemLog := &loggerLog.SystemLog{
Type: loggerLog.TypeEmailMessage.Uint8(),
Date: time.Now().Format("2006-01-02"),
ObjectID: 0,
Content: string(emailLog),
}
fmt.Println("Attempting to insert into system_logs...")
err = svcCtx.LogModel.Insert(ctx, systemLog)
if err != nil {
fmt.Printf("❌ Insert failed!\n")
fmt.Printf("Error Type: %T\n", err)
fmt.Printf("Error String: %s\n", err.Error())
fmt.Printf("Detailed Error: %+v\n", err)
} else {
fmt.Println("✅ Insert successful!")
}
}

119
cmd/test_email/main.go Normal file
View File

@ -0,0 +1,119 @@
package main
import (
"context"
"encoding/json"
"fmt"
"log"
"github.com/hibiken/asynq"
"github.com/perfect-panel/server/initialize"
"github.com/perfect-panel/server/internal/config"
"github.com/perfect-panel/server/internal/svc"
"github.com/perfect-panel/server/pkg/conf"
emailLogic "github.com/perfect-panel/server/queue/logic/email"
"github.com/perfect-panel/server/queue/types"
)
func main() {
var c config.Config
conf.MustLoad("etc/ppanel.yaml", &c)
if !c.Email.Enable {
log.Fatal("Email is disabled in config. Please enable it in etc/ppanel.yaml")
}
// Initialize ServiceContext
svcCtx := svc.NewServiceContext(c)
initialize.Email(svcCtx)
ctx := context.Background()
// Target email
targetEmail := "shanshanzhong147@gmail.com"
fmt.Printf("Preparing to send emails to: %s\n", targetEmail)
senderLogic := emailLogic.NewSendEmailLogic(svcCtx)
// 1. Verify Email (Register)
fmt.Println("\n[1/5] Sending Registration/Verify Email...")
send(ctx, senderLogic, types.SendEmailPayload{
Type: types.EmailTypeVerify,
Email: targetEmail,
Subject: "PPanel Test - Verify Email (Register)",
Content: map[string]interface{}{
"Type": 1, // 1: Register
"SiteLogo": c.Site.SiteLogo,
"SiteName": c.Site.SiteName,
"Expire": 15,
"Code": "123456",
},
})
// 2. Verify Email (Password Reset)
fmt.Println("\n[2/5] Sending Password Reset/Verify Email...")
send(ctx, senderLogic, types.SendEmailPayload{
Type: types.EmailTypeVerify,
Email: targetEmail,
Subject: "PPanel Test - Verify Email (Password Reset)",
Content: map[string]interface{}{
"Type": 2, // 2: Password Reset
"SiteLogo": c.Site.SiteLogo,
"SiteName": c.Site.SiteName,
"Expire": 15,
"Code": "654321",
},
})
// 3. Maintenance Email
fmt.Println("\n[3/5] Sending Maintenance Email...")
send(ctx, senderLogic, types.SendEmailPayload{
Type: types.EmailTypeMaintenance,
Email: targetEmail,
Subject: "PPanel Test - Maintenance Notice",
Content: map[string]interface{}{
"SiteLogo": c.Site.SiteLogo,
"SiteName": c.Site.SiteName,
"MaintenanceDate": "2026-01-01",
"MaintenanceTime": "12:00 - 14:00 (UTC+8)",
},
})
// 4. Expiration Email
fmt.Println("\n[4/5] Sending Expiration Email...")
send(ctx, senderLogic, types.SendEmailPayload{
Type: types.EmailTypeExpiration,
Email: targetEmail,
Subject: "PPanel Test - Subscription Expiration",
Content: map[string]interface{}{
"SiteLogo": c.Site.SiteLogo,
"SiteName": c.Site.SiteName,
"ExpireDate": "2026-02-01",
},
})
// 5. Traffic Exceed Email
fmt.Println("\n[5/5] Sending Traffic Exceed Email...")
send(ctx, senderLogic, types.SendEmailPayload{
Type: types.EmailTypeTrafficExceed,
Email: targetEmail,
Subject: "PPanel Test - Traffic Exceeded",
Content: map[string]interface{}{
"SiteLogo": c.Site.SiteLogo,
"SiteName": c.Site.SiteName,
"UsedTraffic": "100GB",
"MaxTraffic": "100GB",
},
})
fmt.Println("\nAll tests completed. Please check your inbox.")
}
func send(ctx context.Context, l *emailLogic.SendEmailLogic, payload types.SendEmailPayload) {
data, _ := json.Marshal(payload)
task := asynq.NewTask(types.ForthwithSendEmail, data)
if err := l.ProcessTask(ctx, task); err != nil {
fmt.Printf("❌ Failed to send %s: %v\n", payload.Type, err)
} else {
fmt.Printf("✅ Sent %s successfully.\n", payload.Type)
}
}

View File

@ -0,0 +1 @@
ALTER TABLE auth_method MODIFY config TEXT NOT NULL COMMENT 'Auth Configuration';

View File

@ -0,0 +1 @@
ALTER TABLE auth_method MODIFY config MEDIUMTEXT NOT NULL COMMENT 'Auth Configuration';

View File

@ -124,6 +124,8 @@ func (l *UnbindDeviceLogic) UnbindDevice(req *types.UnbindDeviceRequest) error {
_ = l.svcCtx.Redis.ZRem(ctx, sessionsKey, sessionId).Err()
}
l.svcCtx.DeviceManager.KickDevice(u.Id, identifier)
// clean user cache
_ = l.svcCtx.UserModel.ClearUserCache(l.ctx, u)
l.Infow("设备解绑完成",
logger.Field("device_identifier", identifier),
logger.Field("elapsed_ms", duration.Milliseconds()))

View File

@ -10,7 +10,7 @@ import (
type Auth struct {
Id int64 `gorm:"primaryKey"`
Method string `gorm:"unique;type:varchar(255);not null;default:'';comment:platform"`
Config string `gorm:"type:text;not null;comment:Auth Configuration"`
Config string `gorm:"type:mediumtext;not null;comment:Auth Configuration"`
Enabled *bool `gorm:"type:tinyint(1);not null;default:false;comment:Is Enabled"`
CreatedAt time.Time `gorm:"<-:create;comment:Create Time"`
UpdatedAt time.Time `gorm:"comment:Update Time"`
@ -129,7 +129,7 @@ func (l *EmailAuthConfig) Marshal() string {
if l.ExpirationEmailTemplate == "" {
l.ExpirationEmailTemplate = email.DefaultExpirationEmailTemplate
}
if l.ExpirationEmailTemplate == "" {
if l.MaintenanceEmailTemplate == "" {
l.MaintenanceEmailTemplate = email.DefaultMaintenanceEmailTemplate
}
if l.TrafficExceedEmailTemplate == "" {
@ -175,6 +175,19 @@ func (l *EmailAuthConfig) Unmarshal(data string) {
}
_ = json.Unmarshal([]byte(config.Marshal()), &l)
}
if l.ExpirationEmailTemplate == "" {
l.ExpirationEmailTemplate = email.DefaultExpirationEmailTemplate
}
if l.MaintenanceEmailTemplate == "" {
l.MaintenanceEmailTemplate = email.DefaultMaintenanceEmailTemplate
}
if l.TrafficExceedEmailTemplate == "" {
l.TrafficExceedEmailTemplate = email.DefaultTrafficExceedEmailTemplate
}
if l.VerifyEmailTemplate == "" {
l.VerifyEmailTemplate = email.DefaultEmailVerifyTemplate
}
}
// SMTPConfig Email SMTP configuration