diff --git a/README.md b/README.md index 8c8b806..8e78fda 100644 --- a/README.md +++ b/README.md @@ -100,7 +100,7 @@ proxy services. Built with Go, it emphasizes performance, security, and scalabil ``` 4. **Pull from Docker Hub** (after CI/CD publishes): - ```bash + ```bashw docker pull yourusername/ppanel-server:latest docker run --rm -p 8080:8080 yourusername/ppanel-server:latest ``` diff --git a/etc/ppanel.yaml b/etc/ppanel.yaml index 6978435..24ddd89 100644 --- a/etc/ppanel.yaml +++ b/etc/ppanel.yaml @@ -2,11 +2,11 @@ Host: 0.0.0.0 Port: 8080 Debug: false JwtAuth: - AccessSecret: 1234567890 + AccessSecret: e4bbdb8ca57179374c0e8a7a85038da21341aee4bdff98c0e612751d7c362cac AccessExpire: 604800 Logger: ServiceName: PPanel - Mode: console + Mode: file Encoding: plain TimeFormat: '2025-01-01 00:00:00.000' Path: logs diff --git a/internal/logic/common/sendEmailCodeLogic.go b/internal/logic/common/sendEmailCodeLogic.go index ac37acc..4126ef4 100644 --- a/internal/logic/common/sendEmailCodeLogic.go +++ b/internal/logic/common/sendEmailCodeLogic.go @@ -89,7 +89,7 @@ func (l *SendEmailCodeLogic) SendEmailCode(req *types.SendCodeRequest) (resp *ty // Generate verification code code := random.Key(6, 0) taskPayload.Email = req.Email - taskPayload.Subject = "Verification code" + taskPayload.Subject = "Verification Code" content, err := l.initTemplate(req.Type, code) if err != nil { l.Logger.Error("[SendEmailCode]: InitTemplate Error", logger.Field("error", err.Error())) diff --git a/internal/model/server/server.go b/internal/model/server/server.go index c185503..2916aa9 100644 --- a/internal/model/server/server.go +++ b/internal/model/server/server.go @@ -9,12 +9,15 @@ import ( ) const ( - RelayModeNone = "none" - RelayModeAll = "all" - RelayModeRandom = "random" - RuleGroupTypeReject = "reject" - RuleGroupTypeDefault = "default" - RuleGroupTypeDirect = "direct" + RelayModeNone = "none" + RelayModeAll = "all" + RelayModeRandom = "random" + RelayModeMixed = "mixed" + RelayModeAllDirect = "all_direct" + RelayModeRandomDirect = "random_direct" + RuleGroupTypeReject = "reject" + RuleGroupTypeDefault = "default" + RuleGroupTypeDirect = "direct" ) type ServerFilter struct { diff --git a/internal/model/traffic/model.go b/internal/model/traffic/model.go index d9ef1bc..b4096c5 100644 --- a/internal/model/traffic/model.go +++ b/internal/model/traffic/model.go @@ -118,6 +118,6 @@ func (m *customTrafficModel) TopUsersTrafficByMonthly(ctx context.Context, date func (m *customTrafficModel) QueryTrafficLogPageList(ctx context.Context, userId, subscribeId int64, page, size int) ([]*TrafficLog, int64, error) { var list []*TrafficLog var total int64 - err := m.Conn.WithContext(ctx).Model(&TrafficLog{}).Where("user_id = ? and subscribe_id= ?", userId, subscribeId).Count(&total).Limit(size).Offset((page - 1) * size).Find(&list).Error + err := m.Conn.WithContext(ctx).Model(&TrafficLog{}).Where("user_id = ? and subscribe_id= ?", userId, subscribeId).Count(&total).Order("timestamp DESC").Limit(size).Offset((page - 1) * size).Find(&list).Error return list, total, err } diff --git a/pkg/adapter/uilts.go b/pkg/adapter/uilts.go index 317da61..9832374 100644 --- a/pkg/adapter/uilts.go +++ b/pkg/adapter/uilts.go @@ -213,6 +213,157 @@ func adapterProxies(servers []*server.Server) ([]proxy.Proxy, []string, map[stri } } proxies = append(proxies, *n) + case server.RelayModeMixed: + // 生成直连节点 + n := addNode(node, node.ServerAddr, 0) + if n != nil { + directName := "直连-" + node.Name + n.Name = directName + if node.Tags != "" { + t := tool.RemoveDuplicateElements(strings.Split(node.Tags, ",")...) + for _, tag := range t { + if tag != "" { + if _, ok := tags[tag]; !ok { + tags[tag] = []string{} + } + tags[tag] = append(tags[tag], n.Name) + } + } + } + proxies = append(proxies, *n) + } + + // 生成一个随机中继节点(类似random模式,但和直连共存) + var relays []server.NodeRelay + if err := json.Unmarshal([]byte(node.RelayNode), &relays); err != nil { + logger.Errorw("Unmarshal RelayNode", logger.Field("error", err.Error()), logger.Field("node", node.Name), logger.Field("relayNode", node.RelayNode)) + continue + } + if len(relays) > 0 { + randNum := random.RandomInRange(0, len(relays)-1) + relay := relays[randNum] + n := addNode(node, relay.Host, relay.Port) + if n == nil { + continue + } + relayName := "中继-" + node.Name + if relay.Prefix != "" { + relayName = relay.Prefix + node.Name + } + n.Name = relayName + if node.Tags != "" { + t := tool.RemoveDuplicateElements(strings.Split(node.Tags, ",")...) + for _, tag := range t { + if tag != "" { + if _, ok := tags[tag]; !ok { + tags[tag] = []string{} + } + tags[tag] = append(tags[tag], n.Name) + } + } + } + proxies = append(proxies, *n) + } + case server.RelayModeAllDirect: + // 生成直连节点 + n := addNode(node, node.ServerAddr, 0) + if n != nil { + directName := "直连-" + node.Name + n.Name = directName + if node.Tags != "" { + t := tool.RemoveDuplicateElements(strings.Split(node.Tags, ",")...) + for _, tag := range t { + if tag != "" { + if _, ok := tags[tag]; !ok { + tags[tag] = []string{} + } + tags[tag] = append(tags[tag], n.Name) + } + } + } + proxies = append(proxies, *n) + } + + // 生成所有中继节点 + var relays []server.NodeRelay + if err := json.Unmarshal([]byte(node.RelayNode), &relays); err != nil { + logger.Errorw("Unmarshal RelayNode", logger.Field("error", err.Error()), logger.Field("node", node.Name), logger.Field("relayNode", node.RelayNode)) + continue + } + for _, relay := range relays { + n := addNode(node, relay.Host, relay.Port) + if n == nil { + continue + } + relayName := "中继-" + node.Name + if relay.Prefix != "" { + relayName = relay.Prefix + node.Name + } + n.Name = relayName + if node.Tags != "" { + t := tool.RemoveDuplicateElements(strings.Split(node.Tags, ",")...) + for _, tag := range t { + if tag != "" { + if _, ok := tags[tag]; !ok { + tags[tag] = []string{} + } + tags[tag] = append(tags[tag], n.Name) + } + } + } + proxies = append(proxies, *n) + } + case server.RelayModeRandomDirect: + // 生成直连节点 + n := addNode(node, node.ServerAddr, 0) + if n != nil { + directName := "直连-" + node.Name + n.Name = directName + if node.Tags != "" { + t := tool.RemoveDuplicateElements(strings.Split(node.Tags, ",")...) + for _, tag := range t { + if tag != "" { + if _, ok := tags[tag]; !ok { + tags[tag] = []string{} + } + tags[tag] = append(tags[tag], n.Name) + } + } + } + proxies = append(proxies, *n) + } + + // 随机选择一个中继节点 + var relays []server.NodeRelay + if err := json.Unmarshal([]byte(node.RelayNode), &relays); err != nil { + logger.Errorw("Unmarshal RelayNode", logger.Field("error", err.Error()), logger.Field("node", node.Name), logger.Field("relayNode", node.RelayNode)) + continue + } + if len(relays) > 0 { + randNum := random.RandomInRange(0, len(relays)-1) + relay := relays[randNum] + n := addNode(node, relay.Host, relay.Port) + if n == nil { + continue + } + relayName := "中继-" + node.Name + if relay.Prefix != "" { + relayName = relay.Prefix + node.Name + } + n.Name = relayName + if node.Tags != "" { + t := tool.RemoveDuplicateElements(strings.Split(node.Tags, ",")...) + for _, tag := range t { + if tag != "" { + if _, ok := tags[tag]; !ok { + tags[tag] = []string{} + } + tags[tag] = append(tags[tag], n.Name) + } + } + } + proxies = append(proxies, *n) + } default: logger.Info("Not Relay Mode", logger.Field("node", node.Name), logger.Field("relayMode", node.RelayMode)) n := addNode(node, node.ServerAddr, 0)