refactor: 更新项目引用路径从perfect-panel/ppanel-server到perfect-panel/server

feat: 添加版本和构建时间变量
fix: 修正短信队列类型注释错误
style: 清理未使用的代码和测试文件
docs: 更新安装文档中的下载链接
chore: 迁移数据库脚本添加日志和订阅配置
This commit is contained in:
2025-10-13 01:33:03 -07:00
parent 393b42f35a
commit c582087c0f
974 changed files with 23609 additions and 23398 deletions
+14 -8
View File
@@ -5,17 +5,17 @@ import (
"fmt"
"strings"
"github.com/perfect-panel/ppanel-server/pkg/constant"
"github.com/perfect-panel/server/pkg/constant"
"github.com/perfect-panel/ppanel-server/pkg/logger"
"github.com/perfect-panel/server/pkg/logger"
"github.com/gin-gonic/gin"
"github.com/perfect-panel/ppanel-server/internal/config"
"github.com/perfect-panel/ppanel-server/internal/svc"
"github.com/perfect-panel/ppanel-server/pkg/jwt"
"github.com/perfect-panel/ppanel-server/pkg/result"
"github.com/perfect-panel/ppanel-server/pkg/tool"
"github.com/perfect-panel/ppanel-server/pkg/xerr"
"github.com/perfect-panel/server/internal/config"
"github.com/perfect-panel/server/internal/svc"
"github.com/perfect-panel/server/pkg/jwt"
"github.com/perfect-panel/server/pkg/result"
"github.com/perfect-panel/server/pkg/tool"
"github.com/perfect-panel/server/pkg/xerr"
"github.com/pkg/errors"
)
@@ -40,6 +40,11 @@ func AuthMiddleware(svc *svc.ServiceContext) func(c *gin.Context) {
c.Abort()
return
}
loginType := ""
if claims["LoginType"] != nil {
loginType = claims["LoginType"].(string)
}
// get user id from token
userId := int64(claims["UserId"].(float64))
// get session id from token
@@ -77,6 +82,7 @@ func AuthMiddleware(svc *svc.ServiceContext) func(c *gin.Context) {
c.Abort()
return
}
ctx = context.WithValue(ctx, constant.LoginType, loginType)
ctx = context.WithValue(ctx, constant.CtxKeyUser, userInfo)
ctx = context.WithValue(ctx, constant.CtxKeySessionID, sessionId)
c.Request = c.Request.WithContext(ctx)
@@ -3,6 +3,7 @@ package middleware
import (
"bufio"
"bytes"
"context"
"encoding/json"
"fmt"
"io"
@@ -10,29 +11,40 @@ import (
"net/http"
"strings"
"github.com/perfect-panel/ppanel-server/pkg/logger"
"github.com/perfect-panel/ppanel-server/pkg/result"
"github.com/perfect-panel/ppanel-server/pkg/xerr"
"github.com/perfect-panel/server/internal/svc"
pkgaes "github.com/perfect-panel/server/pkg/aes"
"github.com/perfect-panel/server/pkg/constant"
"github.com/perfect-panel/server/pkg/result"
"github.com/perfect-panel/server/pkg/xerr"
"github.com/pkg/errors"
"github.com/gin-gonic/gin"
"github.com/perfect-panel/ppanel-server/internal/svc"
pkgaes "github.com/perfect-panel/ppanel-server/pkg/aes"
)
const (
noWritten = -1
defaultStatus = http.StatusOK
key = "123456"
)
func AppMiddleware(svc *svc.ServiceContext) func(c *gin.Context) {
func DeviceMiddleware(srvCtx *svc.ServiceContext) func(c *gin.Context) {
return func(c *gin.Context) {
if !strings.Contains(c.Request.URL.Path, "/v1/app") {
loginType := c.GetString(string(constant.LoginType))
if loginType == "" {
loginType = c.GetHeader("Login-Type")
}
if loginType != "device" {
c.Next()
return
}
rw := NewResponseWriter(c, svc)
c.Request = c.Request.WithContext(context.WithValue(c.Request.Context(), constant.LoginType, loginType))
if !srvCtx.Config.Device.Enable || srvCtx.Config.Device.SecuritySecret == "" {
c.Next()
return
}
rw := NewResponseWriter(c, srvCtx)
if !rw.Decrypt() {
result.HttpResult(c, nil, errors.Wrapf(xerr.NewErrCode(xerr.InvalidCiphertext), "Invalid ciphertext"))
c.Abort()
@@ -50,17 +62,10 @@ func NewResponseWriter(c *gin.Context, srvCtx *svc.ServiceContext) (rw *Response
body: new(bytes.Buffer),
ResponseWriter: c.Writer,
}
applicationConfig, err := srvCtx.ApplicationModel.FindOneConfig(c, 1)
if err != nil {
logger.Errorf("[AppMiddleware] find application config error: %v", err.Error())
return
}
if strings.ToUpper(applicationConfig.EncryptionMethod) == "AES" && applicationConfig.EncryptionKey != "" {
rw.encryptionKey = applicationConfig.EncryptionKey
rw.encryptionMethod = applicationConfig.EncryptionMethod
rw.encryption = true
}
return
rw.encryptionKey = srvCtx.Config.Device.SecuritySecret
rw.encryptionMethod = "AES"
rw.encryption = true
return rw
}
func (rw *ResponseWriter) Encrypt() {
+11 -4
View File
@@ -6,13 +6,13 @@ import (
"io"
"time"
"github.com/perfect-panel/ppanel-server/pkg/logger"
"github.com/perfect-panel/server/pkg/logger"
"github.com/perfect-panel/ppanel-server/pkg/xerr"
"github.com/perfect-panel/server/pkg/xerr"
"github.com/pkg/errors"
"github.com/gin-gonic/gin"
"github.com/perfect-panel/ppanel-server/internal/svc"
"github.com/perfect-panel/server/internal/svc"
)
type responseBodyWriter struct {
@@ -44,6 +44,9 @@ func LoggerMiddleware(svc *svc.ServiceContext) func(c *gin.Context) {
// Start recording logs
cost := time.Since(start)
responseStatus := c.Writer.Status()
host := c.Request.Host
logs := []logger.LogField{
{
Key: "status",
@@ -51,7 +54,7 @@ func LoggerMiddleware(svc *svc.ServiceContext) func(c *gin.Context) {
},
{
Key: "request",
Value: c.Request.Method + " " + c.Request.URL.String(),
Value: c.Request.Method + " " + host + c.Request.URL.String(),
},
{
Key: "query",
@@ -88,6 +91,10 @@ func LoggerMiddleware(svc *svc.ServiceContext) func(c *gin.Context) {
} else {
logger.WithContext(c.Request.Context()).Infow("HTTP Request", logs...)
}
if responseStatus == 404 {
logger.WithContext(c.Request.Context()).Debugf("404 Not Found: Host:%s Path:%s IsPanDomain:%v", host, c.Request.URL.Path, svc.Config.Subscribe.PanDomain)
}
}
}
+2 -2
View File
@@ -3,10 +3,10 @@ package middleware
import (
"context"
"github.com/perfect-panel/ppanel-server/pkg/constant"
"github.com/perfect-panel/server/pkg/constant"
"github.com/gin-gonic/gin"
"github.com/perfect-panel/ppanel-server/internal/svc"
"github.com/perfect-panel/server/internal/svc"
)
type PaymentParams struct {
+48 -5
View File
@@ -1,17 +1,60 @@
package middleware
import (
"net/http"
"strings"
"github.com/gin-gonic/gin"
"github.com/perfect-panel/ppanel-server/internal/logic/subscribe"
"github.com/perfect-panel/ppanel-server/internal/svc"
"github.com/perfect-panel/ppanel-server/internal/types"
"github.com/perfect-panel/server/internal/logic/subscribe"
"github.com/perfect-panel/server/internal/svc"
"github.com/perfect-panel/server/internal/types"
"github.com/perfect-panel/server/pkg/logger"
"github.com/perfect-panel/server/pkg/tool"
)
func PanDomainMiddleware(svc *svc.ServiceContext) func(c *gin.Context) {
return func(c *gin.Context) {
if svc.Config.Subscribe.PanDomain {
if svc.Config.Subscribe.PanDomain && c.Request.URL.Path == "/" {
// intercept browser
ua := c.GetHeader("User-Agent")
if svc.Config.Subscribe.UserAgentLimit {
if ua == "" {
c.String(http.StatusForbidden, "Access denied")
c.Abort()
return
}
browserKeywords := tool.RemoveDuplicateElements(strings.Split(svc.Config.Subscribe.UserAgentList, "\n")...)
var allow = false
// query client list
clients, err := svc.ClientModel.List(c.Request.Context())
if err != nil {
logger.Errorw("[PanDomainMiddleware] Query client list failed", logger.Field("error", err.Error()))
}
for _, item := range clients {
u := strings.ToLower(item.UserAgent)
u = strings.Trim(u, " ")
browserKeywords = append(browserKeywords, u)
}
for _, keyword := range browserKeywords {
keyword = strings.ToLower(strings.Trim(keyword, " "))
if keyword == "" {
continue
}
if strings.Contains(strings.ToLower(ua), keyword) {
allow = true
}
}
if !allow {
c.String(http.StatusForbidden, "Access denied")
c.Abort()
return
}
}
domain := c.Request.Host
domainArr := strings.Split(domain, ".")
domainFirst := domainArr[0]
@@ -21,7 +64,7 @@ func PanDomainMiddleware(svc *svc.ServiceContext) func(c *gin.Context) {
UA: c.Request.Header.Get("User-Agent"),
}
l := subscribe.NewSubscribeLogic(c, svc)
resp, err := l.Generate(&request)
resp, err := l.Handler(&request)
if err != nil {
return
}
+1 -1
View File
@@ -2,7 +2,7 @@ package middleware
import (
"github.com/gin-gonic/gin"
"github.com/perfect-panel/ppanel-server/internal/svc"
"github.com/perfect-panel/server/internal/svc"
)
func ServerMiddleware(svc *svc.ServiceContext) func(c *gin.Context) {
+7 -15
View File
@@ -6,18 +6,16 @@ import (
"net/http"
"strings"
"github.com/perfect-panel/ppanel-server/pkg/constant"
"github.com/perfect-panel/server/pkg/constant"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/codes"
semconv "go.opentelemetry.io/otel/semconv/v1.24.0"
oteltrace "go.opentelemetry.io/otel/trace"
"github.com/perfect-panel/ppanel-server/internal/svc"
"github.com/perfect-panel/ppanel-server/pkg/logger"
"github.com/perfect-panel/ppanel-server/pkg/trace"
"github.com/perfect-panel/server/internal/svc"
"github.com/perfect-panel/server/pkg/trace"
)
// statusByWriter returns a span status code and message for an HTTP status code
@@ -71,19 +69,13 @@ func TraceMiddleware(_ *svc.ServiceContext) func(ctx *gin.Context) {
)
defer span.End()
requestId, err := uuid.NewV7()
if err != nil {
logger.Errorw(
"failed to generate request id in uuid v7 format, fallback to uuid v4",
logger.Field("error", err),
)
requestId = uuid.New()
}
c.Header(trace.RequestIdKey, requestId.String())
requestId := trace.TraceIDFromContext(ctx)
c.Header(trace.RequestIdKey, requestId)
span.SetAttributes(requestAttributes(c.Request)...)
span.SetAttributes(
attribute.String("http.request_id", requestId.String()),
attribute.String("http.request_id", requestId),
semconv.HTTPRouteKey.String(c.FullPath()),
)
// context with request host