前端页面
This commit is contained in:
@@ -1,8 +1,11 @@
|
||||
package apps
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
|
||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/httpdns/httpdnsutils"
|
||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/httpdns/policies"
|
||||
"github.com/iwind/TeaGo/actions"
|
||||
)
|
||||
|
||||
@@ -11,15 +14,41 @@ type AppSettingsAction struct {
|
||||
}
|
||||
|
||||
func (this *AppSettingsAction) Init() {
|
||||
this.Nav("httpdns", "app", "")
|
||||
this.Nav("httpdns", "app", "settings")
|
||||
}
|
||||
|
||||
func (this *AppSettingsAction) RunGet(params struct {
|
||||
AppId int64
|
||||
AppId int64
|
||||
Section string
|
||||
}) {
|
||||
httpdnsutils.AddLeftMenu(this.Parent())
|
||||
app := pickApp(params.AppId)
|
||||
|
||||
// 顶部 tabbar
|
||||
httpdnsutils.AddAppTabbar(this.Parent(), app.GetString("name"), params.AppId, "settings")
|
||||
|
||||
// 当前选中的 section
|
||||
section := params.Section
|
||||
if len(section) == 0 {
|
||||
section = "basic"
|
||||
}
|
||||
this.Data["activeSection"] = section
|
||||
appIdStr := strconv.FormatInt(params.AppId, 10)
|
||||
this.Data["leftMenuItems"] = []map[string]interface{}{
|
||||
{
|
||||
"name": "基础配置",
|
||||
"url": "/httpdns/apps/app/settings?appId=" + appIdStr + "§ion=basic",
|
||||
"isActive": section == "basic",
|
||||
},
|
||||
{
|
||||
"name": "认证与密钥",
|
||||
"url": "/httpdns/apps/app/settings?appId=" + appIdStr + "§ion=auth",
|
||||
"isActive": section == "auth",
|
||||
},
|
||||
}
|
||||
|
||||
settings := loadAppSettings(app)
|
||||
this.Data["clusters"] = policies.LoadAvailableDeployClusters()
|
||||
this.Data["app"] = app
|
||||
this.Data["settings"] = settings
|
||||
this.Show()
|
||||
@@ -28,16 +57,24 @@ func (this *AppSettingsAction) RunGet(params struct {
|
||||
func (this *AppSettingsAction) RunPost(params struct {
|
||||
AppId int64
|
||||
|
||||
AppStatus bool
|
||||
AppStatus bool
|
||||
PrimaryClusterId int64
|
||||
BackupClusterId int64
|
||||
|
||||
Must *actions.Must
|
||||
CSRF *actionutils.CSRF
|
||||
}) {
|
||||
params.Must.Field("appId", params.AppId).Gt(0, "please select app")
|
||||
params.Must.Field("primaryClusterId", params.PrimaryClusterId).Gt(0, "please select primary cluster")
|
||||
if params.BackupClusterId > 0 && params.BackupClusterId == params.PrimaryClusterId {
|
||||
this.FailField("backupClusterId", "backup cluster must be different from primary cluster")
|
||||
}
|
||||
|
||||
app := pickApp(params.AppId)
|
||||
settings := loadAppSettings(app)
|
||||
settings["appStatus"] = params.AppStatus
|
||||
settings["primaryClusterId"] = params.PrimaryClusterId
|
||||
settings["backupClusterId"] = params.BackupClusterId
|
||||
|
||||
// SNI strategy is fixed to level2 empty.
|
||||
settings["sniPolicy"] = "level2"
|
||||
|
||||
@@ -20,6 +20,8 @@ func defaultAppSettings(app maps.Map) maps.Map {
|
||||
aesSecretPlain := randomPlainSecret("as")
|
||||
return maps.Map{
|
||||
"appId": app.GetString("appId"),
|
||||
"primaryClusterId": app.GetInt64("clusterId"),
|
||||
"backupClusterId": int64(0),
|
||||
"signSecretPlain": signSecretPlain,
|
||||
"signSecretMasked": maskSecret(signSecretPlain),
|
||||
"signSecretUpdatedAt": "2026-02-20 12:30:00",
|
||||
@@ -45,6 +47,8 @@ func defaultAppSettings(app maps.Map) maps.Map {
|
||||
func cloneSettings(settings maps.Map) maps.Map {
|
||||
return maps.Map{
|
||||
"appId": settings.GetString("appId"),
|
||||
"primaryClusterId": settings.GetInt64("primaryClusterId"),
|
||||
"backupClusterId": settings.GetInt64("backupClusterId"),
|
||||
"signSecretPlain": settings.GetString("signSecretPlain"),
|
||||
"signSecretMasked": settings.GetString("signSecretMasked"),
|
||||
"signSecretUpdatedAt": settings.GetString("signSecretUpdatedAt"),
|
||||
@@ -90,6 +94,12 @@ func saveAppSettings(appId int64, settings maps.Map) {
|
||||
appSettingsStore.Unlock()
|
||||
}
|
||||
|
||||
func deleteAppSettings(appId int64) {
|
||||
appSettingsStore.Lock()
|
||||
delete(appSettingsStore.data, appId)
|
||||
appSettingsStore.Unlock()
|
||||
}
|
||||
|
||||
func resetSignSecret(app maps.Map) maps.Map {
|
||||
settings := loadAppSettings(app)
|
||||
signSecretPlain := randomPlainSecret("ss")
|
||||
@@ -144,6 +154,19 @@ func maskSecret(secret string) string {
|
||||
func ensureSettingsFields(settings maps.Map) bool {
|
||||
changed := false
|
||||
|
||||
if settings.GetInt64("primaryClusterId") <= 0 {
|
||||
settings["primaryClusterId"] = int64(1)
|
||||
changed = true
|
||||
}
|
||||
if settings.GetInt64("backupClusterId") < 0 {
|
||||
settings["backupClusterId"] = int64(0)
|
||||
changed = true
|
||||
}
|
||||
if settings.GetInt64("backupClusterId") > 0 && settings.GetInt64("backupClusterId") == settings.GetInt64("primaryClusterId") {
|
||||
settings["backupClusterId"] = int64(0)
|
||||
changed = true
|
||||
}
|
||||
|
||||
signSecretPlain := settings.GetString("signSecretPlain")
|
||||
if len(signSecretPlain) == 0 {
|
||||
signSecretPlain = randomPlainSecret("ss")
|
||||
|
||||
@@ -19,31 +19,45 @@ func (this *CreatePopupAction) RunGet(params struct{}) {
|
||||
clusters := policies.LoadAvailableDeployClusters()
|
||||
this.Data["clusters"] = clusters
|
||||
|
||||
defaultClusterID := policies.LoadDefaultClusterID()
|
||||
if defaultClusterID <= 0 && len(clusters) > 0 {
|
||||
defaultClusterID = clusters[0].GetInt64("id")
|
||||
defaultPrimaryClusterId := policies.LoadDefaultClusterID()
|
||||
if defaultPrimaryClusterId <= 0 && len(clusters) > 0 {
|
||||
defaultPrimaryClusterId = clusters[0].GetInt64("id")
|
||||
}
|
||||
this.Data["defaultClusterId"] = defaultClusterID
|
||||
this.Data["defaultPrimaryClusterId"] = defaultPrimaryClusterId
|
||||
|
||||
defaultBackupClusterId := int64(0)
|
||||
for _, cluster := range clusters {
|
||||
clusterId := cluster.GetInt64("id")
|
||||
if clusterId > 0 && clusterId != defaultPrimaryClusterId {
|
||||
defaultBackupClusterId = clusterId
|
||||
break
|
||||
}
|
||||
}
|
||||
this.Data["defaultBackupClusterId"] = defaultBackupClusterId
|
||||
|
||||
// Mock users for dropdown
|
||||
this.Data["users"] = []maps.Map{
|
||||
{"id": int64(1), "name": "张三", "username": "zhangsan"},
|
||||
{"id": int64(2), "name": "李四", "username": "lisi"},
|
||||
{"id": int64(3), "name": "王五", "username": "wangwu"},
|
||||
{"id": int64(1), "name": "User A", "username": "zhangsan"},
|
||||
{"id": int64(2), "name": "User B", "username": "lisi"},
|
||||
{"id": int64(3), "name": "User C", "username": "wangwu"},
|
||||
}
|
||||
|
||||
this.Show()
|
||||
}
|
||||
|
||||
func (this *CreatePopupAction) RunPost(params struct {
|
||||
Name string
|
||||
ClusterId int64
|
||||
UserId int64
|
||||
Name string
|
||||
PrimaryClusterId int64
|
||||
BackupClusterId int64
|
||||
UserId int64
|
||||
|
||||
Must *actions.Must
|
||||
CSRF *actionutils.CSRF
|
||||
}) {
|
||||
params.Must.Field("name", params.Name).Require("请输入应用名称")
|
||||
params.Must.Field("clusterId", params.ClusterId).Gt(0, "请选择所属集群")
|
||||
params.Must.Field("name", params.Name).Require("please input app name")
|
||||
params.Must.Field("primaryClusterId", params.PrimaryClusterId).Gt(0, "please select primary cluster")
|
||||
if params.BackupClusterId > 0 && params.BackupClusterId == params.PrimaryClusterId {
|
||||
this.FailField("backupClusterId", "backup cluster must be different from primary cluster")
|
||||
}
|
||||
this.Success()
|
||||
}
|
||||
|
||||
@@ -21,6 +21,9 @@ func (this *CustomRecordsAction) RunGet(params struct {
|
||||
httpdnsutils.AddLeftMenu(this.Parent())
|
||||
|
||||
app := pickApp(params.AppId)
|
||||
// 自定义解析属于域名管理子页,顶部沿用应用 tabbar(高亮域名列表)
|
||||
httpdnsutils.AddAppTabbar(this.Parent(), app.GetString("name"), params.AppId, "domains")
|
||||
|
||||
domains := mockDomains(app.GetInt64("id"))
|
||||
domain := pickDomainFromDomains(domains, params.DomainId)
|
||||
domainName := domain.GetString("name")
|
||||
@@ -35,7 +38,6 @@ func (this *CustomRecordsAction) RunGet(params struct {
|
||||
|
||||
for _, record := range records {
|
||||
record["lineText"] = buildLineText(record)
|
||||
record["paramsText"] = buildParamsText(record)
|
||||
record["recordValueText"] = buildRecordValueText(record)
|
||||
}
|
||||
|
||||
|
||||
@@ -42,7 +42,6 @@ func (this *CustomRecordsCreatePopupAction) RunGet(params struct {
|
||||
"weightEnabled": false,
|
||||
"ttl": 30,
|
||||
"isOn": true,
|
||||
"sdnsParamsJson": "[]",
|
||||
"recordItemsJson": `[{"type":"A","value":"","weight":100}]`,
|
||||
}
|
||||
|
||||
@@ -65,9 +64,6 @@ func (this *CustomRecordsCreatePopupAction) RunGet(params struct {
|
||||
record["ttl"] = existing.GetInt("ttl")
|
||||
record["isOn"] = existing.GetBool("isOn")
|
||||
|
||||
sdnsParams, _ := existing["sdnsParams"].([]maps.Map)
|
||||
record["sdnsParamsJson"] = marshalJSON(sdnsParams, "[]")
|
||||
|
||||
recordItems := make([]maps.Map, 0)
|
||||
recordType := strings.ToUpper(strings.TrimSpace(existing.GetString("recordType")))
|
||||
values, _ := existing["recordValues"].([]maps.Map)
|
||||
@@ -140,7 +136,6 @@ func (this *CustomRecordsCreatePopupAction) RunPost(params struct {
|
||||
LineCountry string
|
||||
|
||||
RuleName string
|
||||
SDNSParamsJSON string
|
||||
RecordItemsJSON string
|
||||
WeightEnabled bool
|
||||
TTL int
|
||||
@@ -154,7 +149,6 @@ func (this *CustomRecordsCreatePopupAction) RunPost(params struct {
|
||||
params.Domain = strings.TrimSpace(params.Domain)
|
||||
params.LineScope = strings.ToLower(strings.TrimSpace(params.LineScope))
|
||||
params.RuleName = strings.TrimSpace(params.RuleName)
|
||||
params.SDNSParamsJSON = strings.TrimSpace(params.SDNSParamsJSON)
|
||||
params.RecordItemsJSON = strings.TrimSpace(params.RecordItemsJSON)
|
||||
|
||||
domain := maps.Map{}
|
||||
@@ -181,16 +175,6 @@ func (this *CustomRecordsCreatePopupAction) RunPost(params struct {
|
||||
return
|
||||
}
|
||||
|
||||
sdnsParams, err := parseSDNSParamsJSON(params.SDNSParamsJSON)
|
||||
if err != nil {
|
||||
this.Fail(err.Error())
|
||||
return
|
||||
}
|
||||
if len(sdnsParams) > 10 {
|
||||
this.Fail("sdns params should be <= 10")
|
||||
return
|
||||
}
|
||||
|
||||
recordValues, err := parseRecordItemsJSON(params.RecordItemsJSON, params.WeightEnabled)
|
||||
if err != nil {
|
||||
this.Fail(err.Error())
|
||||
@@ -250,7 +234,7 @@ func (this *CustomRecordsCreatePopupAction) RunPost(params struct {
|
||||
"lineContinent": lineContinent,
|
||||
"lineCountry": lineCountry,
|
||||
"ruleName": params.RuleName,
|
||||
"sdnsParams": sdnsParams,
|
||||
"sdnsParams": []maps.Map{},
|
||||
"recordType": recordType,
|
||||
"recordValues": recordValues,
|
||||
"weightEnabled": params.WeightEnabled,
|
||||
@@ -261,38 +245,6 @@ func (this *CustomRecordsCreatePopupAction) RunPost(params struct {
|
||||
this.Success()
|
||||
}
|
||||
|
||||
func parseSDNSParamsJSON(raw string) ([]maps.Map, error) {
|
||||
if len(raw) == 0 {
|
||||
return []maps.Map{}, nil
|
||||
}
|
||||
|
||||
list := []maps.Map{}
|
||||
if err := json.Unmarshal([]byte(raw), &list); err != nil {
|
||||
return nil, fmt.Errorf("sdns params json is invalid")
|
||||
}
|
||||
|
||||
result := make([]maps.Map, 0, len(list))
|
||||
for _, item := range list {
|
||||
name := strings.TrimSpace(item.GetString("name"))
|
||||
value := strings.TrimSpace(item.GetString("value"))
|
||||
if len(name) == 0 && len(value) == 0 {
|
||||
continue
|
||||
}
|
||||
if len(name) < 2 || len(name) > 64 {
|
||||
return nil, fmt.Errorf("sdns param name length should be in 2-64")
|
||||
}
|
||||
if len(value) < 1 || len(value) > 64 {
|
||||
return nil, fmt.Errorf("sdns param value length should be in 1-64")
|
||||
}
|
||||
result = append(result, maps.Map{
|
||||
"name": name,
|
||||
"value": value,
|
||||
})
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func parseRecordItemsJSON(raw string, weightEnabled bool) ([]maps.Map, error) {
|
||||
if len(raw) == 0 {
|
||||
return []maps.Map{}, nil
|
||||
|
||||
@@ -18,19 +18,14 @@ var customRecordStore = struct {
|
||||
data: map[int64][]maps.Map{
|
||||
1: {
|
||||
{
|
||||
"id": int64(1001),
|
||||
"domain": "api.business.com",
|
||||
"lineScope": "china",
|
||||
"lineCarrier": "电信",
|
||||
"lineRegion": "华东",
|
||||
"lineProvince": "上海",
|
||||
"ruleName": "上海电信灰度-v2",
|
||||
"sdnsParams": []maps.Map{
|
||||
{
|
||||
"name": "app_ver",
|
||||
"value": "2.3.1",
|
||||
},
|
||||
},
|
||||
"id": int64(1001),
|
||||
"domain": "api.business.com",
|
||||
"lineScope": "china",
|
||||
"lineCarrier": "电信",
|
||||
"lineRegion": "华东",
|
||||
"lineProvince": "上海",
|
||||
"ruleName": "上海电信灰度-v2",
|
||||
"sdnsParams": []maps.Map{},
|
||||
"recordType": "A",
|
||||
"recordValues": []maps.Map{{"type": "A", "value": "1.1.1.10", "weight": 100}},
|
||||
"weightEnabled": false,
|
||||
@@ -134,6 +129,12 @@ func deleteCustomRecord(appID int64, recordID int64) {
|
||||
customRecordStore.data[appID] = filtered
|
||||
}
|
||||
|
||||
func deleteCustomRecordsByApp(appID int64) {
|
||||
customRecordStore.Lock()
|
||||
defer customRecordStore.Unlock()
|
||||
delete(customRecordStore.data, appID)
|
||||
}
|
||||
|
||||
func toggleCustomRecord(appID int64, recordID int64, isOn bool) {
|
||||
customRecordStore.Lock()
|
||||
defer customRecordStore.Unlock()
|
||||
@@ -207,27 +208,6 @@ func buildLineText(record maps.Map) string {
|
||||
return strings.Join(finalParts, " / ")
|
||||
}
|
||||
|
||||
func buildParamsText(record maps.Map) string {
|
||||
params, ok := record["sdnsParams"].([]maps.Map)
|
||||
if !ok || len(params) == 0 {
|
||||
return "-"
|
||||
}
|
||||
|
||||
parts := make([]string, 0, len(params))
|
||||
for _, param := range params {
|
||||
name := strings.TrimSpace(param.GetString("name"))
|
||||
value := strings.TrimSpace(param.GetString("value"))
|
||||
if len(name) == 0 || len(value) == 0 {
|
||||
continue
|
||||
}
|
||||
parts = append(parts, name+"="+value)
|
||||
}
|
||||
if len(parts) == 0 {
|
||||
return "-"
|
||||
}
|
||||
return strings.Join(parts, "; ")
|
||||
}
|
||||
|
||||
func buildRecordValueText(record maps.Map) string {
|
||||
values, ok := record["recordValues"].([]maps.Map)
|
||||
if !ok || len(values) == 0 {
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
package apps
|
||||
|
||||
import (
|
||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/httpdns/httpdnsutils"
|
||||
)
|
||||
|
||||
type DeleteAction struct {
|
||||
actionutils.ParentAction
|
||||
}
|
||||
|
||||
func (this *DeleteAction) Init() {
|
||||
this.Nav("httpdns", "app", "delete")
|
||||
}
|
||||
|
||||
func (this *DeleteAction) RunGet(params struct {
|
||||
AppId int64
|
||||
}) {
|
||||
httpdnsutils.AddLeftMenu(this.Parent())
|
||||
app := pickApp(params.AppId)
|
||||
httpdnsutils.AddAppTabbar(this.Parent(), app.GetString("name"), app.GetInt64("id"), "delete")
|
||||
this.Data["app"] = app
|
||||
this.Data["domainCount"] = len(mockDomains(app.GetInt64("id")))
|
||||
this.Show()
|
||||
}
|
||||
|
||||
func (this *DeleteAction) RunPost(params struct {
|
||||
AppId int64
|
||||
}) {
|
||||
if params.AppId > 0 {
|
||||
if deleteApp(params.AppId) {
|
||||
deleteAppSettings(params.AppId)
|
||||
deleteCustomRecordsByApp(params.AppId)
|
||||
}
|
||||
}
|
||||
|
||||
this.Success()
|
||||
}
|
||||
@@ -10,7 +10,7 @@ type DomainsAction struct {
|
||||
}
|
||||
|
||||
func (this *DomainsAction) Init() {
|
||||
this.Nav("httpdns", "app", "")
|
||||
this.Nav("httpdns", "app", "domains")
|
||||
}
|
||||
|
||||
func (this *DomainsAction) RunGet(params struct {
|
||||
@@ -19,6 +19,9 @@ func (this *DomainsAction) RunGet(params struct {
|
||||
httpdnsutils.AddLeftMenu(this.Parent())
|
||||
app := pickApp(params.AppId)
|
||||
|
||||
// 构建顶部 tabbar
|
||||
httpdnsutils.AddAppTabbar(this.Parent(), app.GetString("name"), params.AppId, "domains")
|
||||
|
||||
domains := mockDomains(app.GetInt64("id"))
|
||||
for _, domain := range domains {
|
||||
domainName := domain.GetString("name")
|
||||
|
||||
@@ -15,6 +15,7 @@ func init() {
|
||||
Prefix("/httpdns/apps").
|
||||
Get("", new(IndexAction)).
|
||||
Get("/app", new(AppAction)).
|
||||
Get("/sdk", new(SDKAction)).
|
||||
GetPost("/app/settings", new(AppSettingsAction)).
|
||||
Post("/app/settings/toggleSignEnabled", new(AppSettingsToggleSignEnabledAction)).
|
||||
Post("/app/settings/resetSignSecret", new(AppSettingsResetSignSecretAction)).
|
||||
@@ -22,6 +23,7 @@ func init() {
|
||||
Get("/domains", new(DomainsAction)).
|
||||
Get("/customRecords", new(CustomRecordsAction)).
|
||||
GetPost("/createPopup", new(CreatePopupAction)).
|
||||
GetPost("/delete", new(DeleteAction)).
|
||||
GetPost("/domains/createPopup", new(DomainsCreatePopupAction)).
|
||||
Post("/domains/delete", new(DomainsDeleteAction)).
|
||||
GetPost("/customRecords/createPopup", new(CustomRecordsCreatePopupAction)).
|
||||
|
||||
@@ -2,15 +2,23 @@ package apps
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/iwind/TeaGo/maps"
|
||||
)
|
||||
|
||||
func mockApps() []maps.Map {
|
||||
var appStore = struct {
|
||||
sync.RWMutex
|
||||
data []maps.Map
|
||||
}{
|
||||
data: defaultMockApps(),
|
||||
}
|
||||
|
||||
func defaultMockApps() []maps.Map {
|
||||
return []maps.Map{
|
||||
{
|
||||
"id": int64(1),
|
||||
"name": "主站移动业务",
|
||||
"name": "\u4e3b\u7ad9\u79fb\u52a8\u4e1a\u52a1",
|
||||
"appId": "ab12xc34s2",
|
||||
"clusterId": int64(1),
|
||||
"domainCount": 3,
|
||||
@@ -20,12 +28,12 @@ func mockApps() []maps.Map {
|
||||
"pinningMode": "report",
|
||||
"sanMode": "strict",
|
||||
"riskLevel": "medium",
|
||||
"riskSummary": "Pinning 处于观察模式",
|
||||
"riskSummary": "Pinning \u5904\u4e8e\u89c2\u5bdf\u6a21\u5f0f",
|
||||
"secretVersion": "v2026.02.20",
|
||||
},
|
||||
{
|
||||
"id": int64(2),
|
||||
"name": "视频网关业务",
|
||||
"name": "\u89c6\u9891\u7f51\u5173\u4e1a\u52a1",
|
||||
"appId": "vd8992ksm1",
|
||||
"clusterId": int64(2),
|
||||
"domainCount": 1,
|
||||
@@ -35,12 +43,12 @@ func mockApps() []maps.Map {
|
||||
"pinningMode": "enforce",
|
||||
"sanMode": "strict",
|
||||
"riskLevel": "low",
|
||||
"riskSummary": "已启用强校验",
|
||||
"riskSummary": "\u5df2\u542f\u7528\u5f3a\u6821\u9a8c",
|
||||
"secretVersion": "v2026.02.18",
|
||||
},
|
||||
{
|
||||
"id": int64(3),
|
||||
"name": "海外灰度测试",
|
||||
"name": "\u6d77\u5916\u7070\u5ea6\u6d4b\u8bd5",
|
||||
"appId": "ov7711hkq9",
|
||||
"clusterId": int64(1),
|
||||
"domainCount": 2,
|
||||
@@ -50,12 +58,57 @@ func mockApps() []maps.Map {
|
||||
"pinningMode": "off",
|
||||
"sanMode": "report",
|
||||
"riskLevel": "high",
|
||||
"riskSummary": "应用关闭且证书策略偏弱",
|
||||
"riskSummary": "\u5e94\u7528\u5173\u95ed\u4e14\u8bc1\u4e66\u7b56\u7565\u504f\u5f31",
|
||||
"secretVersion": "v2026.01.30",
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func cloneMap(src maps.Map) maps.Map {
|
||||
dst := maps.Map{}
|
||||
for k, v := range src {
|
||||
dst[k] = v
|
||||
}
|
||||
return dst
|
||||
}
|
||||
|
||||
func cloneApps(apps []maps.Map) []maps.Map {
|
||||
result := make([]maps.Map, 0, len(apps))
|
||||
for _, app := range apps {
|
||||
result = append(result, cloneMap(app))
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func mockApps() []maps.Map {
|
||||
appStore.RLock()
|
||||
defer appStore.RUnlock()
|
||||
return cloneApps(appStore.data)
|
||||
}
|
||||
|
||||
func deleteApp(appID int64) bool {
|
||||
if appID <= 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
appStore.Lock()
|
||||
defer appStore.Unlock()
|
||||
|
||||
found := false
|
||||
filtered := make([]maps.Map, 0, len(appStore.data))
|
||||
for _, app := range appStore.data {
|
||||
if app.GetInt64("id") == appID {
|
||||
found = true
|
||||
continue
|
||||
}
|
||||
filtered = append(filtered, app)
|
||||
}
|
||||
if found {
|
||||
appStore.data = filtered
|
||||
}
|
||||
return found
|
||||
}
|
||||
|
||||
func filterApps(keyword string, riskLevel string, ecsMode string, pinningMode string) []maps.Map {
|
||||
all := mockApps()
|
||||
if len(keyword) == 0 && len(riskLevel) == 0 && len(ecsMode) == 0 && len(pinningMode) == 0 {
|
||||
@@ -89,6 +142,15 @@ func filterApps(keyword string, riskLevel string, ecsMode string, pinningMode st
|
||||
|
||||
func pickApp(appID int64) maps.Map {
|
||||
apps := mockApps()
|
||||
if len(apps) == 0 {
|
||||
return maps.Map{
|
||||
"id": int64(0),
|
||||
"name": "",
|
||||
"appId": "",
|
||||
"clusterId": int64(0),
|
||||
}
|
||||
}
|
||||
|
||||
if appID <= 0 {
|
||||
return apps[0]
|
||||
}
|
||||
|
||||
27
EdgeAdmin/internal/web/actions/default/httpdns/apps/sdk.go
Normal file
27
EdgeAdmin/internal/web/actions/default/httpdns/apps/sdk.go
Normal file
@@ -0,0 +1,27 @@
|
||||
package apps
|
||||
|
||||
import (
|
||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/httpdns/httpdnsutils"
|
||||
)
|
||||
|
||||
type SDKAction struct {
|
||||
actionutils.ParentAction
|
||||
}
|
||||
|
||||
func (this *SDKAction) Init() {
|
||||
this.Nav("httpdns", "app", "sdk")
|
||||
}
|
||||
|
||||
func (this *SDKAction) RunGet(params struct {
|
||||
AppId int64
|
||||
}) {
|
||||
httpdnsutils.AddLeftMenu(this.Parent())
|
||||
app := pickApp(params.AppId)
|
||||
|
||||
// 构建顶部 tabbar
|
||||
httpdnsutils.AddAppTabbar(this.Parent(), app.GetString("name"), params.AppId, "sdk")
|
||||
|
||||
this.Data["app"] = app
|
||||
this.Show()
|
||||
}
|
||||
Reference in New Issue
Block a user