Browse Source

feat: 网站支持中文域名 (#3472)

Refs https://github.com/1Panel-dev/1Panel/issues/1522
pull/3479/head
zhengkunwang 11 months ago committed by GitHub
parent
commit
ebfaf77c8f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 13
      backend/app/service/website.go
  2. 31
      backend/app/service/website_utils.go
  3. 35
      backend/utils/common/common.go

13
backend/app/service/website.go

@ -9,6 +9,7 @@ import (
"encoding/pem" "encoding/pem"
"errors" "errors"
"fmt" "fmt"
"github.com/1Panel-dev/1Panel/backend/utils/common"
"os" "os"
"path" "path"
"reflect" "reflect"
@ -172,8 +173,14 @@ func (w WebsiteService) GetWebsites() ([]response.WebsiteDTO, error) {
func (w WebsiteService) CreateWebsite(create request.WebsiteCreate) (err error) { func (w WebsiteService) CreateWebsite(create request.WebsiteCreate) (err error) {
primaryDomainArray := strings.Split(create.PrimaryDomain, ":") primaryDomainArray := strings.Split(create.PrimaryDomain, ":")
primaryDomain := primaryDomainArray[0] primaryDomain := primaryDomainArray[0]
alias := create.Alias
if exist, _ := websiteRepo.GetBy(websiteRepo.WithAlias(create.Alias)); len(exist) > 0 { if common.ContainsChinese(alias) {
alias, err = common.PunycodeEncode(alias)
if err != nil {
return
}
}
if exist, _ := websiteRepo.GetBy(websiteRepo.WithAlias(alias)); len(exist) > 0 {
return buserr.New(constant.ErrAliasIsExist) return buserr.New(constant.ErrAliasIsExist)
} }
@ -201,7 +208,7 @@ func (w WebsiteService) CreateWebsite(create request.WebsiteCreate) (err error)
website := &model.Website{ website := &model.Website{
PrimaryDomain: primaryDomain, PrimaryDomain: primaryDomain,
Type: create.Type, Type: create.Type,
Alias: create.Alias, Alias: alias,
Remark: create.Remark, Remark: create.Remark,
Status: constant.WebRunning, Status: constant.WebRunning,
ExpireDate: defaultDate, ExpireDate: defaultDate,

31
backend/app/service/website_utils.go

@ -30,27 +30,44 @@ import (
) )
func getDomain(domainStr string, defaultPort int) (model.WebsiteDomain, error) { func getDomain(domainStr string, defaultPort int) (model.WebsiteDomain, error) {
domain := model.WebsiteDomain{} var (
err error
domain = model.WebsiteDomain{}
portN int
)
domainArray := strings.Split(domainStr, ":") domainArray := strings.Split(domainStr, ":")
if len(domainArray) == 1 { if len(domainArray) == 1 {
domain.Domain = domainArray[0] domain.Domain, err = handleChineseDomain(domainArray[0])
if err != nil {
return domain, err
}
domain.Port = defaultPort domain.Port = defaultPort
return domain, nil return domain, nil
} }
if len(domainArray) > 1 { if len(domainArray) > 1 {
domain.Domain = domainArray[0] domain.Domain, err = handleChineseDomain(domainArray[0])
if err != nil {
return domain, err
}
portStr := domainArray[1] portStr := domainArray[1]
portN, err := strconv.Atoi(portStr) portN, err = strconv.Atoi(portStr)
if err != nil { if err != nil {
return model.WebsiteDomain{}, buserr.WithName("ErrTypePort", portStr) return domain, buserr.WithName("ErrTypePort", portStr)
} }
if portN <= 0 || portN > 65535 { if portN <= 0 || portN > 65535 {
return model.WebsiteDomain{}, buserr.New("ErrTypePortRange") return domain, buserr.New("ErrTypePortRange")
} }
domain.Port = portN domain.Port = portN
return domain, nil return domain, nil
} }
return model.WebsiteDomain{}, nil return domain, nil
}
func handleChineseDomain(domain string) (string, error) {
if common.ContainsChinese(domain) {
return common.PunycodeEncode(domain)
}
return domain, nil
} }
func createIndexFile(website *model.Website, runtime *model.Runtime) error { func createIndexFile(website *model.Website, runtime *model.Runtime) error {

35
backend/utils/common/common.go

@ -3,6 +3,7 @@ package common
import ( import (
"crypto/rand" "crypto/rand"
"fmt" "fmt"
"golang.org/x/net/idna"
"io" "io"
mathRand "math/rand" mathRand "math/rand"
"net" "net"
@ -12,9 +13,9 @@ import (
"strconv" "strconv"
"strings" "strings"
"time" "time"
"unicode"
"github.com/1Panel-dev/1Panel/backend/utils/cmd" "github.com/1Panel-dev/1Panel/backend/utils/cmd"
"github.com/mozillazg/go-pinyin"
) )
func CompareVersion(version1, version2 string) bool { func CompareVersion(version1, version2 string) bool {
@ -216,20 +217,6 @@ func LoadTimeZoneByCmd() string {
return fields[2] return fields[2]
} }
func ConvertToPinyin(text string) string {
args := pinyin.NewArgs()
args.Fallback = func(r rune, a pinyin.Args) []string {
return []string{string(r)}
}
p := pinyin.Pinyin(text, args)
var strArr []string
for i := 0; i < len(p); i++ {
strArr = append(strArr, strings.Join(p[i], ""))
}
return strings.Join(strArr, "")
}
func IsValidDomain(domain string) bool { func IsValidDomain(domain string) bool {
pattern := `^([\w\p{Han}\-\*]{1,100}\.){1,10}([\w\p{Han}\-]{1,24}|[\w\p{Han}\-]{1,24}\.[\w\p{Han}\-]{1,24})(:\d{1,5})?$` pattern := `^([\w\p{Han}\-\*]{1,100}\.){1,10}([\w\p{Han}\-]{1,24}|[\w\p{Han}\-]{1,24}\.[\w\p{Han}\-]{1,24})(:\d{1,5})?$`
match, err := regexp.MatchString(pattern, domain) match, err := regexp.MatchString(pattern, domain)
@ -238,3 +225,21 @@ func IsValidDomain(domain string) bool {
} }
return match return match
} }
func ContainsChinese(text string) bool {
for _, char := range text {
if unicode.Is(unicode.Han, char) {
return true
}
}
return false
}
func PunycodeEncode(text string) (string, error) {
encoder := idna.New()
ascii, err := encoder.ToASCII(text)
if err != nil {
return "", err
}
return ascii, nil
}

Loading…
Cancel
Save