feat: Add multiple dimensions to website search (#13163)

This commit is contained in:
CityFun
2026-07-01 16:19:43 +08:00
committed by GitHub
parent 9073b16baa
commit b98a2b06c9
21 changed files with 485 additions and 269 deletions
+14
View File
@@ -17,6 +17,7 @@ type IWebsiteRepo interface {
WithGroupID(groupId uint) DBOption
WithDefaultServer() DBOption
WithDomainLike(domain string) DBOption
WithSearchKeyword(keyword string, ids []uint) DBOption
WithRuntimeID(runtimeID uint) DBOption
WithParentID(websiteID uint) DBOption
WithType(websiteType string) DBOption
@@ -76,6 +77,19 @@ func (w *WebsiteRepo) WithDomainLike(domain string) DBOption {
}
}
func (w *WebsiteRepo) WithSearchKeyword(keyword string, ids []uint) DBOption {
return func(db *gorm.DB) *gorm.DB {
if keyword == "" {
return db
}
keyword = "%" + keyword + "%"
if len(ids) == 0 {
return db.Where("(primary_domain like ? OR alias like ?)", keyword, keyword)
}
return db.Where("(primary_domain like ? OR alias like ? OR id in (?))", keyword, keyword, ids)
}
}
func (w *WebsiteRepo) WithAlias(alias string) DBOption {
return func(db *gorm.DB) *gorm.DB {
return db.Where("alias = ?", alias)
+2 -4
View File
@@ -168,15 +168,13 @@ func (w WebsiteService) PageWebsite(req request.WebsiteSearch) (int64, []respons
opts = append(opts, repo.WithOrderRuleBy(req.OrderBy, req.Order), repo.WithOrderRuleBy("updated_at", "descending"))
if req.Name != "" {
domains, _ := websiteDomainRepo.GetBy(websiteDomainRepo.WithDomainLike(req.Name))
var websiteIds []uint
if len(domains) > 0 {
var websiteIds []uint
for _, domain := range domains {
websiteIds = append(websiteIds, domain.WebsiteID)
}
opts = append(opts, repo.WithByIDs(websiteIds))
} else {
opts = append(opts, websiteRepo.WithDomainLike(req.Name))
}
opts = append(opts, websiteRepo.WithSearchKeyword(req.Name, websiteIds))
}
if req.WebsiteGroupID != 0 {
opts = append(opts, websiteRepo.WithGroupID(req.WebsiteGroupID))
+4 -4
View File
@@ -6,9 +6,9 @@ replace github.com/moby/go-archive => github.com/moby/go-archive v0.1.0
require (
github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible
github.com/compose-spec/compose-go/v2 v2.11.0
github.com/compose-spec/compose-go/v2 v2.12.1
github.com/creack/pty v1.1.24
github.com/docker/cli v29.6.0+incompatible
github.com/docker/cli v29.6.1+incompatible
github.com/docker/docker v28.5.2+incompatible
github.com/docker/go-connections v0.7.0
github.com/fsnotify/fsnotify v1.10.1
@@ -30,7 +30,7 @@ require (
github.com/klauspost/compress v1.18.6
github.com/mholt/archiver/v4 v4.0.0-alpha.8
github.com/miekg/dns v1.1.72
github.com/minio/minio-go/v7 v7.2.0
github.com/minio/minio-go/v7 v7.2.1
github.com/nicksnyder/go-i18n/v2 v2.6.1
github.com/opencontainers/image-spec v1.1.1
github.com/oschwald/maxminddb-golang v1.13.1
@@ -60,7 +60,7 @@ require (
google.golang.org/genproto v0.0.0-20260414002931-afd174a4e478
gopkg.in/ini.v1 v1.67.3
gopkg.in/yaml.v3 v3.0.1
gorm.io/gorm v1.31.1
gorm.io/gorm v1.31.2
)
require (
+10 -8
View File
@@ -204,8 +204,8 @@ github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gE
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/compose-spec/compose-go/v2 v2.11.0 h1:xoq/ootgIL6TsHmbJHrkuh7+bzjhPV3NHftHRPPyVXM=
github.com/compose-spec/compose-go/v2 v2.11.0/go.mod h1:ZU6zlcweCZKyiB7BVfCizQT9XmkEIMFE+PRZydVcsZg=
github.com/compose-spec/compose-go/v2 v2.12.1 h1:+xBZNxcgSus4atQJwXPEdhHRgCEyZmj/BuqN5m33Ou0=
github.com/compose-spec/compose-go/v2 v2.12.1/go.mod h1:ZU6zlcweCZKyiB7BVfCizQT9XmkEIMFE+PRZydVcsZg=
github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI=
github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M=
github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE=
@@ -230,8 +230,8 @@ github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5Qvfr
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
github.com/dlclark/regexp2 v1.12.0 h1:0j4c5qQmnC6XOWNjP3PIXURXN2gWx76rd3KvgdPkCz8=
github.com/dlclark/regexp2 v1.12.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/docker/cli v29.6.0+incompatible h1:nw9himxMMZ7eIeherJNlKQq+acnlzGgHd+4uf10QRSc=
github.com/docker/cli v29.6.0+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
github.com/docker/cli v29.6.1+incompatible h1:oO7F4nn3Ovr/5TlfTUWFbMwBSS/B7Xs6Epv26gBrUP8=
github.com/docker/cli v29.6.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM=
github.com/docker/docker v28.5.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/docker-credential-helpers v0.9.5 h1:EFNN8DHvaiK8zVqFA2DT6BjXE0GzfLOZ38ggPTKePkY=
@@ -608,8 +608,8 @@ github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLT
github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY=
github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
github.com/minio/minio-go/v7 v7.2.0 h1:RCJM0R1XOsRs+A3x3UCaf3ZYbByDaLjFeAi+YCQEPhs=
github.com/minio/minio-go/v7 v7.2.0/go.mod h1:EU9hENAStx/xXduNdrGO5e4X5vk19NtgB+RIPjZO8o0=
github.com/minio/minio-go/v7 v7.2.1 h1:PfBfwvKB/MmqyN8Vb1G9voWisaM9OrLv+WwOvMwS9Dw=
github.com/minio/minio-go/v7 v7.2.1/go.mod h1:EU9hENAStx/xXduNdrGO5e4X5vk19NtgB+RIPjZO8o0=
github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
@@ -1409,8 +1409,10 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/gorm v1.31.1 h1:7CA8FTFz/gRfgqgpeKIBcervUn3xSyPUmr6B2WXJ7kg=
gorm.io/gorm v1.31.1/go.mod h1:XyQVbO2k6YkOis7C2437jSit3SsDK72s7n7rsSHd+Gs=
gorm.io/driver/sqlite v1.6.0 h1:WHRRrIiulaPiPFmDcod6prc4l2VGVWHz80KspNsxSfQ=
gorm.io/driver/sqlite v1.6.0/go.mod h1:AO9V1qIQddBESngQUKWL9yoH93HIeA1X6V633rBwyT8=
gorm.io/gorm v1.31.2 h1:3o8FXNo9v9S858gil+3LlZA1LkCOzgb4g5BL64FgaCo=
gorm.io/gorm v1.31.2/go.mod h1:XyQVbO2k6YkOis7C2437jSit3SsDK72s7n7rsSHd+Gs=
gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q=
gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-1
View File
@@ -74,7 +74,6 @@ const docTemplate = `{
"description": "OK",
"schema": {
"additionalProperties": {
"format": "int64",
"type": "integer"
},
"type": "object"
-1
View File
@@ -70,7 +70,6 @@
"description": "OK",
"schema": {
"additionalProperties": {
"format": "int64",
"type": "integer"
},
"type": "object"
+1 -1
View File
@@ -38,7 +38,7 @@ require (
golang.org/x/text v0.38.0
gopkg.in/yaml.v2 v2.4.0
gopkg.in/yaml.v3 v3.0.1
gorm.io/gorm v1.31.1
gorm.io/gorm v1.31.2
)
require (
+6 -2
View File
@@ -148,6 +148,8 @@ github.com/mattn/go-isatty v0.0.21 h1:xYae+lCNBP7QuW4PUnNG61ffM4hVIfm+zUzDuSzYLG
github.com/mattn/go-isatty v0.0.21/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4=
github.com/mattn/go-runewidth v0.0.21 h1:jJKAZiQH+2mIinzCJIaIG9Be1+0NR+5sz/lYEEjdM8w=
github.com/mattn/go-runewidth v0.0.21/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs=
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -287,8 +289,10 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/gorm v1.31.1 h1:7CA8FTFz/gRfgqgpeKIBcervUn3xSyPUmr6B2WXJ7kg=
gorm.io/gorm v1.31.1/go.mod h1:XyQVbO2k6YkOis7C2437jSit3SsDK72s7n7rsSHd+Gs=
gorm.io/driver/sqlite v1.6.0 h1:WHRRrIiulaPiPFmDcod6prc4l2VGVWHz80KspNsxSfQ=
gorm.io/driver/sqlite v1.6.0/go.mod h1:AO9V1qIQddBESngQUKWL9yoH93HIeA1X6V633rBwyT8=
gorm.io/gorm v1.31.2 h1:3o8FXNo9v9S858gil+3LlZA1LkCOzgb4g5BL64FgaCo=
gorm.io/gorm v1.31.2/go.mod h1:XyQVbO2k6YkOis7C2437jSit3SsDK72s7n7rsSHd+Gs=
modernc.org/cc/v4 v4.27.3 h1:uNCgn37E5U09mTv1XgskEVUJ8ADKpmFMPxzGJ0TSo+U=
modernc.org/cc/v4 v4.27.3/go.mod h1:3YjcbCqhoTTHPycJDRl2WZKKFj0nwcOIPBfEZK0Hdk8=
modernc.org/ccgo/v4 v4.32.4 h1:L5OB8rpEX4ZsXEQwGozRfJyJSFHbbNVOoQ59DU9/KuU=
+421 -243
View File
File diff suppressed because it is too large Load Diff
+5 -5
View File
@@ -56,20 +56,20 @@
"vue-codemirror": "^6.1.1",
"vue-demi": "^0.14.6",
"vue-i18n": "^11.4.4",
"vue-router": "^4.5.1"
"vue-router": "^5.1.0"
},
"devDependencies": {
"@tailwindcss/postcss": "^4.3.0",
"@types/node": "^25.9.1",
"@types/uuid": "^11.0.0",
"@typescript-eslint/eslint-plugin": "^8.61.1",
"@typescript-eslint/parser": "^8.61.1",
"@typescript-eslint/eslint-plugin": "^8.62.0",
"@typescript-eslint/parser": "^8.62.0",
"@vitejs/plugin-vue": "^6.0.7",
"@vitejs/plugin-vue-jsx": "^5.1.5",
"@vue/compiler-sfc": "^3.5.35",
"autoprefixer": "^10.5.0",
"esbuild": "^0.28.0",
"eslint": "^10.4.1",
"eslint": "^10.5.0",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.5.5",
"eslint-plugin-vue": "^10.9.2",
@@ -86,7 +86,7 @@
"unplugin-vue-components": "^32.1.0",
"vite": "^8.0.16",
"vite-plugin-compression": "^0.5.1",
"vite-plugin-eslint2": "^5.0.3",
"vite-plugin-eslint2": "^5.3.0",
"vite-svg-loader": "^5.1.1",
"vue-eslint-parser": "^10.4.1",
"vue-tsc": "^3.3.4"
+2
View File
@@ -4797,6 +4797,8 @@ const message = {
urlcc: 'URL frequency limit',
method: 'Request type',
addIpsToBlock: 'Batch block IP',
addIpSegmentToBlock: 'Block IP segment',
addIpSegmentsToBlock: 'Batch block IP segments',
addUrlsToWhite: 'Batch add URL to white list',
noBlackIp: 'IP is already blocked, no need to block again',
noWhiteUrl: 'URL is already in the white list, no need to add again',
+2
View File
@@ -4846,6 +4846,8 @@ const message = {
urlcc: 'Límite de frecuencia por URL',
method: 'Método de petición',
addIpsToBlock: 'Bloqueo masivo de IPs',
addIpSegmentToBlock: 'Bloquear segmento IP',
addIpSegmentsToBlock: 'Bloqueo masivo de segmentos IP',
addUrlsToWhite: 'Añadir URLs en whitelist en lote',
noBlackIp: 'IP ya bloqueada',
noWhiteUrl: 'URL ya en whitelist',
+2
View File
@@ -4768,6 +4768,8 @@ const message = {
urlcc: 'محدودیت فرکانس URL',
method: 'نوع درخواست',
addIpsToBlock: 'مسدودسازی دسته‌ای IP',
addIpSegmentToBlock: 'مسدود کردن بخش IP',
addIpSegmentsToBlock: 'مسدودسازی دسته‌ای بخش‌های IP',
addUrlsToWhite: 'افزودن دسته‌ای URL به لیست سفید',
noBlackIp: 'IP از قبل مسدود شده است، نیازی به مسدودسازی مجدد نیست',
noWhiteUrl: 'URL از قبل در لیست سفید است، نیازی به افزودن مجدد نیست',
+2
View File
@@ -4818,6 +4818,8 @@ const message = {
urlcc: 'URL 頻度制限',
method: 'リクエストタイプ',
addIpsToBlock: 'IP を一括ブロック',
addIpSegmentToBlock: 'IP セグメントをブラック追加',
addIpSegmentsToBlock: 'IP セグメントを一括ブラック追加',
addUrlsToWhite: 'URL を一括でホワイトリストに追加',
noBlackIp: 'IP は既にブロックされているため再度ブロックする必要はありません',
noWhiteUrl: 'URL は既にホワイトリストに含まれているため再度追加する必要はありません',
+2
View File
@@ -4720,6 +4720,8 @@ const message = {
urlcc: 'URL 빈도 제한',
method: '요청 유형',
addIpsToBlock: 'IP 일괄 차단',
addIpSegmentToBlock: 'IP 대역 차단',
addIpSegmentsToBlock: 'IP 대역 일괄 차단',
addUrlsToWhite: 'URL을 일괄 허용 목록에 추가',
noBlackIp: 'IP가 이미 차단되어 있으므로 다시 차단할 필요가 없습니다',
noWhiteUrl: 'URL이 이미 허용 목록에 포함되어 있으므로 다시 추가할 필요가 없습니다',
+2
View File
@@ -4878,6 +4878,8 @@ const message = {
urlcc: 'Had frekuensi URL',
method: 'Jenis permintaan',
addIpsToBlock: 'Sekat IP secara pukal',
addIpSegmentToBlock: 'Sekat segmen IP',
addIpSegmentsToBlock: 'Sekat segmen IP secara pukal',
addUrlsToWhite: 'Tambah URL ke senarai putih secara pukal',
noBlackIp: 'IP telah disekat, tidak perlu disekat semula',
noWhiteUrl: 'URL telah dimasukkan ke senarai putih, tidak perlu ditambah semula',
+2
View File
@@ -5023,6 +5023,8 @@ const message = {
urlcc: 'Limitação de frequência de URL',
method: 'Tipo de solicitação',
addIpsToBlock: 'Bloquear IPs em massa',
addIpSegmentToBlock: 'Bloquear segmento de IP',
addIpSegmentsToBlock: 'Bloquear segmentos de IP em massa',
addUrlsToWhite: 'Adicionar URLs à lista branca em massa',
noBlackIp: 'O IP está bloqueado, não é necessário bloquear novamente',
noWhiteUrl: 'O URL está na lista branca, não é necessário adicionar novamente',
+2
View File
@@ -4872,6 +4872,8 @@ const message = {
urlcc: 'Ограничение частоты URL',
method: 'Тип запроса',
addIpsToBlock: 'Массовая блокировка IP',
addIpSegmentToBlock: 'Блокировать IP-сегмент',
addIpSegmentsToBlock: 'Массовая блокировка IP-сегментов',
addUrlsToWhite: 'Массовое добавление URL в белый список',
noBlackIp: 'IP уже заблокирован, не нужно блокировать снова',
noWhiteUrl: 'URL уже в белом списке, не нужно добавлять снова',
+2
View File
@@ -4868,6 +4868,8 @@ const message = {
urlcc: 'URL sıklık sınırı',
method: 'İstek türü',
addIpsToBlock: 'Toplu IP engelleme',
addIpSegmentToBlock: 'IP segmentini engelle',
addIpSegmentsToBlock: 'IP segmentlerini toplu engelle',
addUrlsToWhite: 'Toplu URLyi beyaz listeye ekleme',
noBlackIp: 'IP zaten engellenmiş, tekrar engellemeye gerek yok',
noWhiteUrl: 'URL zaten beyaz listede, tekrar eklemeye gerek yok',
+2
View File
@@ -4471,6 +4471,8 @@ const message = {
urlcc: 'URL 頻率限制',
method: '請求類型',
addIpsToBlock: '批次封鎖 IP',
addIpSegmentToBlock: '封鎖 IP ',
addIpSegmentsToBlock: '批次封鎖 IP ',
addUrlsToWhite: '批次加白 URL',
noBlackIp: 'IP 已封鎖無需再次封鎖',
noWhiteUrl: 'URL 已加白無需再次加白',
+2
View File
@@ -3923,6 +3923,8 @@ const message = {
urlcc: 'URL 频率限制',
method: '请求类型',
addIpsToBlock: '批量拉黑 IP',
addIpSegmentToBlock: '拉黑 IP ',
addIpSegmentsToBlock: '批量拉黑 IP ',
addUrlsToWhite: '批量加白 URL',
noBlackIp: 'IP 已拉黑无需再次拉黑',
noWhiteUrl: 'URL 已加白无需再次加白',