jcq il y a 21 heures
Parent
commit
76efb604c5

+ 2 - 0
src/components/common/BaseComponents.vue

@@ -7,12 +7,14 @@ import InstantMessageToast from "@/components/messages/InstantMessageToast.vue";
 
 <template>
 	<div>
+		
 		<TConfirmDialog></TConfirmDialog>
 		<TToast>
 			<template #message="slotProps">
 				{{ slotProps.message.detail }}
 			</template>
 		</TToast>
+		
 		<InstantMessageToast></InstantMessageToast>
 		<TDialogDynamic></TDialogDynamic>
 	</div>

+ 12 - 10
src/components/server/ServerNameBox.vue

@@ -127,16 +127,6 @@ defineExpose({
 <template>
 	<div>
 		<input type="hidden" name="serverNames" :value="JSON.stringify(serverNames)" ref="serverNamesRef"/>
-		<div v-if="serverNames.length > 0" class="label-group">
-			<TLabel outlined="" v-for="(serverName, index) in serverNames" :class="{hidden: serverName.isShowing === false}">
-				<em v-if="serverName.type != 'full'">{{ serverName.type }}</em>
-				<span v-if="serverName.subNames == null || serverName.subNames.length == 0" :class="{disabled: serverName.isShowing === false}">{{ serverName.name }}</span>
-				<span v-else :class="{disabled: serverName.isShowing === false}">{{ serverName.subNames[0] }}等{{ serverName.subNames.length }}个域名</span>&nbsp;
-				<a href="" title="修改" @click.prevent="updateServerName(index, serverName)"><i class="icon pencil small"></i></a>&nbsp;
-				<a href="" title="删除" @click.prevent="removeServerName(index)"><i class="icon remove"></i></a>
-			</TLabel>
-			<TDivider></TDivider>
-		</div>
 		<div class="ui fields inline">
 			<div class="ui field"><a href="" @click.prevent="addServerName()">添加域名绑定</a></div>
 			<div class="ui field" v-if="serverNames.length > 0"><span class="grey">|</span></div>
@@ -148,6 +138,18 @@ defineExpose({
 				<TInputText type="text" placeholder="搜索域名" ref="keywordRef" v-model="keyword"/>
 			</div>
 		</div>
+			<TDivider></TDivider>
+
+		<div v-if="serverNames.length > 0" class="label-group">
+			<TLabel outlined="" v-for="(serverName, index) in serverNames" :class="{hidden: serverName.isShowing === false}">
+				<em v-if="serverName.type != 'full'">{{ serverName.type }}</em>
+				<span v-if="serverName.subNames == null || serverName.subNames.length == 0" :class="{disabled: serverName.isShowing === false}">{{ serverName.name }}</span>
+				<span v-else :class="{disabled: serverName.isShowing === false}">{{ serverName.subNames[0] }}等{{ serverName.subNames.length }}个域名</span>&nbsp;
+				<a href="" title="修改" @click.prevent="updateServerName(index, serverName)"><i class="icon pencil small"></i></a>&nbsp;
+				<a href="" title="删除" @click.prevent="removeServerName(index)"><i class="icon remove"></i></a>
+			</TLabel>
+		</div>
+		
 	</div>
 </template>
 

+ 1 - 0
src/layouts/BasicLayout.vue

@@ -7,6 +7,7 @@ provide("$popupLayout", false)
 </script>
 
 <template>
+	
 	<div>
 		<slot></slot>
 	</div>

+ 1 - 1
src/layouts/ChildLayout.vue

@@ -73,7 +73,7 @@ onUnmounted(() => {
 .left-box.has-menu {
 	/* top: 10.8em;
 	top: 88px!important; */
-	top: 30px!important;
+	top: 0px!important;
 	position: absolute;
 	border: 1px solid rgba(229, 232, 242, 1);
 }

+ 0 - 2
src/layouts/ServerSettingLayout.vue

@@ -1,12 +1,10 @@
 <script setup>
 import ChildLayout from "@/layouts/ChildLayout.vue";
-import SettingMenu from "@/views/servers/server/settings/@setting_menu.vue";
 
 const props = defineProps(["ctx"])
 </script>
 
 <template>
-	<SettingMenu :ctx="ctx"></SettingMenu>
 	<ChildLayout :ctx="ctx" :has-menu="true" class="child-box">
 		<slot></slot>
 	</ChildLayout>

+ 1068 - 0
src/views/index/initData.js

@@ -1,4 +1,1072 @@
+// mock data
 const dataMaps = {
+    "/servers/server/settings/http":{
+        "canSpecifyPort": true,
+        "conflictingPorts": [],
+        "firstMenuItem": "index",
+        "httpConfig": {
+            "addresses": [
+                {
+                    "protocol": "http",
+                    "host": "",
+                    "portRange": "8080",
+                    "minPort": 8080,
+                    "maxPort": 8080
+                }
+            ],
+            "isOn": true
+        },
+        "leftMenuActiveItem": {
+            "isActive": true,
+            "isOff": false,
+            "isOn": true,
+            "name": "HTTP",
+            "url": "/servers/server/settings/http?serverId=1"
+        },
+        "leftMenuItemIsDisabled": false,
+        "leftMenuItems": [
+            {
+                "isActive": false,
+                "isOn": true,
+                "name": "域名",
+                "url": "/servers/server/settings/serverNames?serverId=1",
+                "label": "域名"
+            },
+            {
+                "isActive": false,
+                "name": "DNS",
+                "url": "/servers/server/settings/dns?serverId=1",
+                "label": "DNS"
+            },
+            {
+                "isActive": false,
+                "isOn": false,
+                "name": "套餐",
+                "subName": "",
+                "url": "/servers/server/settings/plan?serverId=1",
+                "label": "套餐"
+            },
+            {
+                "isActive": true,
+                "isOff": false,
+                "isOn": true,
+                "name": "HTTP",
+                "url": "/servers/server/settings/http?serverId=1",
+                "label": "HTTP"
+            },
+            {
+                "isActive": false,
+                "isOff": false,
+                "isOn": true,
+                "name": "HTTPS",
+                "url": "/servers/server/settings/https?serverId=1",
+                "label": "HTTPS"
+            },
+            {
+                "configCode": "reverseProxy",
+                "isActive": false,
+                "isOn": true,
+                "name": "源站",
+                "url": "/servers/server/settings/reverseProxy?serverId=1",
+                "label": "源站"
+            },
+            {
+                "isActive": false,
+                "name": "-",
+                "url": "",
+                "label": "-"
+            },
+            {
+                "configCode": "uam",
+                "isActive": false,
+                "isImportant": false,
+                "isOn": false,
+                "name": "5秒盾",
+                "url": "/servers/server/settings/uam?serverId=1",
+                "label": "5秒盾"
+            },
+            {
+                "configCode": "cc",
+                "isActive": false,
+                "isImportant": false,
+                "isOn": false,
+                "name": "CC防护",
+                "url": "/servers/server/settings/cc?serverId=1",
+                "label": "CC防护"
+            },
+            {
+                "isActive": false,
+                "name": "-",
+                "url": "",
+                "label": "-"
+            },
+            {
+                "configCode": "hostRedirects",
+                "isActive": false,
+                "isOn": false,
+                "name": "URL跳转",
+                "url": "/servers/server/settings/redirects?serverId=1",
+                "label": "URL跳转"
+            },
+            {
+                "isActive": false,
+                "isOn": false,
+                "name": "重写规则",
+                "url": "/servers/server/settings/rewrite?serverId=1",
+                "label": "重写规则"
+            },
+            {
+                "configCode": "waf",
+                "isActive": false,
+                "isOn": false,
+                "name": "WAF",
+                "url": "/servers/server/settings/waf?serverId=1",
+                "label": "WAF"
+            },
+            {
+                "configCode": "cache",
+                "isActive": false,
+                "isOn": false,
+                "name": "缓存",
+                "url": "/servers/server/settings/cache?serverId=1",
+                "label": "缓存"
+            },
+            {
+                "configCode": "auth",
+                "isActive": false,
+                "isOn": false,
+                "name": "访问鉴权",
+                "url": "/servers/server/settings/access?serverId=1",
+                "label": "访问鉴权"
+            },
+            {
+                "configCode": "referers",
+                "isActive": false,
+                "isOn": false,
+                "name": "防盗链",
+                "url": "/servers/server/settings/referers?serverId=1",
+                "label": "防盗链"
+            },
+            {
+                "configCode": "userAgent",
+                "isActive": false,
+                "isOn": false,
+                "name": "UA名单",
+                "url": "/servers/server/settings/userAgent?serverId=1",
+                "label": "UA名单"
+            },
+            {
+                "configCode": "accessLog",
+                "isActive": false,
+                "isOn": true,
+                "name": "访问日志",
+                "url": "/servers/server/settings/accessLog?serverId=1",
+                "label": "访问日志"
+            },
+            {
+                "configCode": "compression",
+                "isActive": false,
+                "isOn": false,
+                "name": "内容压缩",
+                "url": "/servers/server/settings/compression?serverId=1",
+                "label": "内容压缩"
+            },
+            {
+                "configCode": "pages",
+                "isActive": false,
+                "isOn": false,
+                "name": "自定义页面",
+                "url": "/servers/server/settings/pages?serverId=1",
+                "label": "自定义页面"
+            },
+            {
+                "isActive": false,
+                "isOn": true,
+                "name": "HTTP报头",
+                "url": "/servers/server/settings/headers?serverId=1",
+                "label": "HTTP报头"
+            },
+            {
+                "configCode": "websocket",
+                "isActive": false,
+                "isOn": true,
+                "name": "Websocket",
+                "url": "/servers/server/settings/websocket?serverId=1",
+                "label": "Websocket"
+            },
+            {
+                "configCode": "grpc",
+                "isActive": false,
+                "isOn": false,
+                "name": "gRPC",
+                "url": "/servers/server/settings/grpc?serverId=1",
+                "label": "gRPC"
+            },
+            {
+                "configCode": "webp",
+                "isActive": false,
+                "isOn": false,
+                "name": "WebP",
+                "url": "/servers/server/settings/webp?serverId=1",
+                "label": "WebP"
+            },
+            {
+                "configCode": "optimization",
+                "isActive": false,
+                "isOn": false,
+                "name": "页面优化",
+                "url": "/servers/server/settings/optimization?serverId=1",
+                "label": "页面优化"
+            },
+            {
+                "configCode": "multimedia",
+                "isActive": false,
+                "isOn": false,
+                "name": "音视频设置",
+                "url": "/servers/server/settings/multimedia?serverId=1",
+                "label": "音视频设置"
+            },
+            {
+                "configCode": "stat",
+                "isActive": false,
+                "isOn": true,
+                "name": "统计",
+                "url": "/servers/server/settings/stat?serverId=1",
+                "label": "统计"
+            },
+            {
+                "configCode": "charset",
+                "isActive": false,
+                "isOn": false,
+                "name": "字符编码",
+                "url": "/servers/server/settings/charset?serverId=1",
+                "label": "字符编码"
+            },
+            {
+                "isActive": false,
+                "name": "-",
+                "url": "",
+                "label": "-"
+            },
+            {
+                "isActive": false,
+                "isOn": false,
+                "name": "分组",
+                "url": "/servers/server/settings/groups?serverId=1",
+                "label": "分组"
+            },
+            {
+                "configCode": "remoteAddr",
+                "isActive": false,
+                "isOn": true,
+                "name": "访客IP地址",
+                "url": "/servers/server/settings/remoteAddr?serverId=1",
+                "label": "访客IP地址"
+            },
+            {
+                "isActive": false,
+                "isOn": false,
+                "name": "请求限制",
+                "url": "/servers/server/settings/requestLimit?serverId=1",
+                "label": "请求限制"
+            },
+            {
+                "isActive": false,
+                "isOn": false,
+                "name": "边缘脚本",
+                "url": "/servers/server/settings/requestScripts?serverId=1",
+                "label": "边缘脚本"
+            }
+        ],
+        "mainMenu": "",
+        "mainTab": "setting",
+        "maxPort": 9999,
+        "minPort": 80,
+        "redirectToHTTPSConfig": {
+            "isPrior": false,
+            "isOn": false,
+            "status": 0,
+            "host": "",
+            "port": 0,
+            "onlyDomains": [],
+            "exceptDomains": []
+        },
+        "secondMenuItem": "http",
+        "server": {
+            "clusterId": 1,
+            "id": 1,
+            "name": "example.com"
+        },
+        "serverFamily": "http",
+        "serverId": 1,
+        "serverType": "httpProxy",
+        "teaBadge": 0,
+        "teaCommon": {
+            "teaIsPlus": true,
+            "teaLogoFileId": 0,
+            "teaShowVersion": true,
+            "teaUsername": "默认用户"
+        },
+        "teaDemoEnabled": false,
+        "teaDocURL": "",
+        "teaFaviconFileId": 0,
+        "teaFrontMode": "",
+        "teaIsSuper": false,
+        "teaLang": "zh-cn",
+        "teaMenu": "servers",
+        "teaModules": [
+            {
+                "code": "dashboard",
+                "icon": "dashboard",
+                "isOn": true,
+                "name": "概览",
+                "subItems": []
+            },
+            {
+                "code": "servers",
+                "icon": "pi-sitemap",
+                "isOn": true,
+                "name": "CDN加速",
+                "subItems": [
+                    {
+                        "code": "servers",
+                        "name": "我的网站",
+                        "url": "/servers"
+                    },
+                    {
+                        "code": "cache",
+                        "name": "刷新预热",
+                        "url": "/servers/cache"
+                    },
+                    {
+                        "code": "certs",
+                        "name": "证书管理",
+                        "url": "/servers/certs"
+                    },
+                    {
+                        "code": "acme",
+                        "isOn": true,
+                        "name": "证书申请",
+                        "url": "/servers/certs/acme"
+                    },
+                    {
+                        "code": "trafficStat",
+                        "isOn": true,
+                        "name": "用量统计",
+                        "url": "/servers/traffic-stats"
+                    },
+                    {
+                        "code": "fee",
+                        "isOn": false,
+                        "name": "计费方式",
+                        "url": "/servers/fee"
+                    },
+                    {
+                        "code": "trafficPackage",
+                        "isOn": false,
+                        "name": "流量包",
+                        "url": "/servers/packages"
+                    }
+                ]
+            },
+            {
+                "code": "lb",
+                "icon": "paper plane",
+                "isOn": true,
+                "name": "负载均衡"
+            },
+            {
+                "code": "waf",
+                "icon": "magnet",
+                "isOn": true,
+                "name": "WAF安全",
+                "subItems": [
+                    {
+                        "code": "overview",
+                        "name": "概览",
+                        "url": "/waf"
+                    },
+                    {
+                        "code": "wafLogs",
+                        "name": "拦截日志",
+                        "url": "/waf/logs"
+                    },
+                    {
+                        "code": "iplist",
+                        "name": "拦截IP",
+                        "url": "/waf/iplists"
+                    }
+                ]
+            },
+            {
+                "code": "plans",
+                "icon": "puzzle piece",
+                "isOn": true,
+                "name": "套餐管理"
+            },
+            {
+                "code": "anti-ddos",
+                "icon": "shield",
+                "isOn": true,
+                "name": "DDoS高防",
+                "subItems": [
+                    {
+                        "code": "instance",
+                        "name": "实例列表",
+                        "url": "/anti-ddos/instances"
+                    },
+                    {
+                        "code": "package",
+                        "name": "购买实例",
+                        "url": "/anti-ddos/packages"
+                    }
+                ]
+            },
+            {
+                "code": "ns",
+                "icon": "globe",
+                "isOn": true,
+                "name": "域名解析",
+                "subItems": [
+                    {
+                        "code": "domain",
+                        "name": "我的域名",
+                        "url": "/ns/domains"
+                    },
+                    {
+                        "code": "domainGroup",
+                        "name": "域名分组",
+                        "url": "/ns/domains/groups"
+                    },
+                    {
+                        "code": "domainBatch",
+                        "name": "批量操作",
+                        "url": "/ns/domains/batch"
+                    },
+                    {
+                        "code": "route",
+                        "name": "线路管理",
+                        "url": "/ns/routes"
+                    },
+                    {
+                        "code": "plan",
+                        "name": "套餐",
+                        "url": "/ns/plans"
+                    }
+                ]
+            },
+            {
+                "code": "finance",
+                "icon": "dollar sign",
+                "isOn": true,
+                "name": "财务管理",
+                "subItems": [
+                    {
+                        "code": "overview",
+                        "name": "概览",
+                        "url": "/finance"
+                    },
+                    {
+                        "code": "bills",
+                        "name": "费用账单",
+                        "url": "/finance/bills"
+                    },
+                    {
+                        "code": "logs",
+                        "name": "收支明细",
+                        "url": "/finance/logs"
+                    },
+                    {
+                        "code": "charge",
+                        "name": "充值",
+                        "url": "/finance/charge"
+                    }
+                ]
+            },
+            {
+                "code": "tickets",
+                "icon": "ticket",
+                "isOn": true,
+                "name": "工单系统"
+            },
+            {
+                "code": "acl",
+                "icon": "address book",
+                "isOn": true,
+                "name": "访问控制"
+            }
+        ],
+        "teaName": "FlexCDN演示",
+        "teaPageFooterHTML": "",
+        "teaRole": "user",
+        "teaShowIndexPage": false,
+        "teaShowPageFooter": false,
+        "teaSubMenu": "",
+        "teaSubMenus": [],
+        "teaTabbar": [
+            {
+                "icon": "",
+                "isActive": false,
+                "name": "网站列表",
+                "right": false,
+                "subName": "",
+                "url": "/servers"
+            },
+            {
+                "icon": "setting",
+                "isActive": true,
+                "name": "设置",
+                "right": false,
+                "subName": "",
+                "url": "/servers/server?serverId=1"
+            },
+            {
+                "icon": "chart area",
+                "isActive": false,
+                "name": "统计",
+                "right": false,
+                "subName": "",
+                "url": "/servers/server/stat?serverId=1"
+            },
+            {
+                "icon": "history",
+                "isActive": false,
+                "name": "访问日志",
+                "right": false,
+                "subName": "",
+                "url": "/servers/server/log?serverId=1"
+            }
+        ],
+        "teaTheme": "violet",
+        "teaTitle": "FlexCDN用户系统演示",
+        "teaUserAvatar": "",
+        "teaVersion": "1.1.1",
+        "webId": 1
+    },
+    "/servers/server/settings/plan":{
+        "firstMenuItem": "index",
+        "hasTrafficLimit": false,
+        "leftMenuActiveItem": {
+            "isActive": true,
+            "isOn": false,
+            "name": "套餐",
+            "subName": "",
+            "url": "/servers/server/settings/plan?serverId=1"
+        },
+        "leftMenuItemIsDisabled": false,
+        "leftMenuItems": [
+            {
+                "isActive": false,
+                "isOn": true,
+                "name": "域名",
+                "url": "/servers/server/settings/serverNames?serverId=1",
+                "label": "域名"
+            },
+            {
+                "isActive": false,
+                "name": "DNS",
+                "url": "/servers/server/settings/dns?serverId=1",
+                "label": "DNS"
+            },
+            {
+                "isActive": true,
+                "isOn": false,
+                "name": "套餐",
+                "subName": "",
+                "url": "/servers/server/settings/plan?serverId=1",
+                "label": "套餐"
+            },
+            {
+                "isActive": false,
+                "isOff": false,
+                "isOn": true,
+                "name": "HTTP",
+                "url": "/servers/server/settings/http?serverId=1",
+                "label": "HTTP"
+            },
+            {
+                "isActive": false,
+                "isOff": false,
+                "isOn": true,
+                "name": "HTTPS",
+                "url": "/servers/server/settings/https?serverId=1",
+                "label": "HTTPS"
+            },
+            {
+                "configCode": "reverseProxy",
+                "isActive": false,
+                "isOn": true,
+                "name": "源站",
+                "url": "/servers/server/settings/reverseProxy?serverId=1",
+                "label": "源站"
+            },
+            {
+                "isActive": false,
+                "name": "-",
+                "url": "",
+                "label": "-"
+            },
+            {
+                "configCode": "uam",
+                "isActive": false,
+                "isImportant": false,
+                "isOn": false,
+                "name": "5秒盾",
+                "url": "/servers/server/settings/uam?serverId=1",
+                "label": "5秒盾"
+            },
+            {
+                "configCode": "cc",
+                "isActive": false,
+                "isImportant": false,
+                "isOn": false,
+                "name": "CC防护",
+                "url": "/servers/server/settings/cc?serverId=1",
+                "label": "CC防护"
+            },
+            {
+                "isActive": false,
+                "name": "-",
+                "url": "",
+                "label": "-"
+            },
+            {
+                "configCode": "hostRedirects",
+                "isActive": false,
+                "isOn": false,
+                "name": "URL跳转",
+                "url": "/servers/server/settings/redirects?serverId=1",
+                "label": "URL跳转"
+            },
+            {
+                "isActive": false,
+                "isOn": false,
+                "name": "重写规则",
+                "url": "/servers/server/settings/rewrite?serverId=1",
+                "label": "重写规则"
+            },
+            {
+                "configCode": "waf",
+                "isActive": false,
+                "isOn": false,
+                "name": "WAF",
+                "url": "/servers/server/settings/waf?serverId=1",
+                "label": "WAF"
+            },
+            {
+                "configCode": "cache",
+                "isActive": false,
+                "isOn": false,
+                "name": "缓存",
+                "url": "/servers/server/settings/cache?serverId=1",
+                "label": "缓存"
+            },
+            {
+                "configCode": "auth",
+                "isActive": false,
+                "isOn": false,
+                "name": "访问鉴权",
+                "url": "/servers/server/settings/access?serverId=1",
+                "label": "访问鉴权"
+            },
+            {
+                "configCode": "referers",
+                "isActive": false,
+                "isOn": false,
+                "name": "防盗链",
+                "url": "/servers/server/settings/referers?serverId=1",
+                "label": "防盗链"
+            },
+            {
+                "configCode": "userAgent",
+                "isActive": false,
+                "isOn": false,
+                "name": "UA名单",
+                "url": "/servers/server/settings/userAgent?serverId=1",
+                "label": "UA名单"
+            },
+            {
+                "configCode": "accessLog",
+                "isActive": false,
+                "isOn": true,
+                "name": "访问日志",
+                "url": "/servers/server/settings/accessLog?serverId=1",
+                "label": "访问日志"
+            },
+            {
+                "configCode": "compression",
+                "isActive": false,
+                "isOn": false,
+                "name": "内容压缩",
+                "url": "/servers/server/settings/compression?serverId=1",
+                "label": "内容压缩"
+            },
+            {
+                "configCode": "pages",
+                "isActive": false,
+                "isOn": false,
+                "name": "自定义页面",
+                "url": "/servers/server/settings/pages?serverId=1",
+                "label": "自定义页面"
+            },
+            {
+                "isActive": false,
+                "isOn": true,
+                "name": "HTTP报头",
+                "url": "/servers/server/settings/headers?serverId=1",
+                "label": "HTTP报头"
+            },
+            {
+                "configCode": "websocket",
+                "isActive": false,
+                "isOn": true,
+                "name": "Websocket",
+                "url": "/servers/server/settings/websocket?serverId=1",
+                "label": "Websocket"
+            },
+            {
+                "configCode": "grpc",
+                "isActive": false,
+                "isOn": false,
+                "name": "gRPC",
+                "url": "/servers/server/settings/grpc?serverId=1",
+                "label": "gRPC"
+            },
+            {
+                "configCode": "webp",
+                "isActive": false,
+                "isOn": false,
+                "name": "WebP",
+                "url": "/servers/server/settings/webp?serverId=1",
+                "label": "WebP"
+            },
+            {
+                "configCode": "optimization",
+                "isActive": false,
+                "isOn": false,
+                "name": "页面优化",
+                "url": "/servers/server/settings/optimization?serverId=1",
+                "label": "页面优化"
+            },
+            {
+                "configCode": "multimedia",
+                "isActive": false,
+                "isOn": false,
+                "name": "音视频设置",
+                "url": "/servers/server/settings/multimedia?serverId=1",
+                "label": "音视频设置"
+            },
+            {
+                "configCode": "stat",
+                "isActive": false,
+                "isOn": true,
+                "name": "统计",
+                "url": "/servers/server/settings/stat?serverId=1",
+                "label": "统计"
+            },
+            {
+                "configCode": "charset",
+                "isActive": false,
+                "isOn": false,
+                "name": "字符编码",
+                "url": "/servers/server/settings/charset?serverId=1",
+                "label": "字符编码"
+            },
+            {
+                "isActive": false,
+                "name": "-",
+                "url": "",
+                "label": "-"
+            },
+            {
+                "isActive": false,
+                "isOn": false,
+                "name": "分组",
+                "url": "/servers/server/settings/groups?serverId=1",
+                "label": "分组"
+            },
+            {
+                "configCode": "remoteAddr",
+                "isActive": false,
+                "isOn": true,
+                "name": "访客IP地址",
+                "url": "/servers/server/settings/remoteAddr?serverId=1",
+                "label": "访客IP地址"
+            },
+            {
+                "isActive": false,
+                "isOn": false,
+                "name": "请求限制",
+                "url": "/servers/server/settings/requestLimit?serverId=1",
+                "label": "请求限制"
+            },
+            {
+                "isActive": false,
+                "isOn": false,
+                "name": "边缘脚本",
+                "url": "/servers/server/settings/requestScripts?serverId=1",
+                "label": "边缘脚本"
+            }
+        ],
+        "mainMenu": "",
+        "mainTab": "setting",
+        "mustUsePlan": true,
+        "secondMenuItem": "plan",
+        "server": {
+            "clusterId": 1,
+            "id": 1,
+            "name": "example.com"
+        },
+        "serverFamily": "http",
+        "serverId": 1,
+        "teaBadge": 0,
+        "teaCommon": {
+            "teaIsPlus": true,
+            "teaLogoFileId": 0,
+            "teaShowVersion": true,
+            "teaUsername": "默认用户"
+        },
+        "teaDemoEnabled": false,
+        "teaDocURL": "",
+        "teaFaviconFileId": 0,
+        "teaFrontMode": "",
+        "teaIsSuper": false,
+        "teaLang": "zh-cn",
+        "teaMenu": "servers",
+        "teaModules": [
+            {
+                "code": "dashboard",
+                "icon": "dashboard",
+                "isOn": true,
+                "name": "概览",
+                "subItems": []
+            },
+            {
+                "code": "servers",
+                "icon": "pi-sitemap",
+                "isOn": true,
+                "name": "CDN加速",
+                "subItems": [
+                    {
+                        "code": "servers",
+                        "name": "我的网站",
+                        "url": "/servers"
+                    },
+                    {
+                        "code": "cache",
+                        "name": "刷新预热",
+                        "url": "/servers/cache"
+                    },
+                    {
+                        "code": "certs",
+                        "name": "证书管理",
+                        "url": "/servers/certs"
+                    },
+                    {
+                        "code": "acme",
+                        "isOn": true,
+                        "name": "证书申请",
+                        "url": "/servers/certs/acme"
+                    },
+                    {
+                        "code": "trafficStat",
+                        "isOn": true,
+                        "name": "用量统计",
+                        "url": "/servers/traffic-stats"
+                    },
+                    {
+                        "code": "fee",
+                        "isOn": false,
+                        "name": "计费方式",
+                        "url": "/servers/fee"
+                    },
+                    {
+                        "code": "trafficPackage",
+                        "isOn": false,
+                        "name": "流量包",
+                        "url": "/servers/packages"
+                    }
+                ]
+            },
+            {
+                "code": "lb",
+                "icon": "paper plane",
+                "isOn": true,
+                "name": "负载均衡"
+            },
+            {
+                "code": "waf",
+                "icon": "magnet",
+                "isOn": true,
+                "name": "WAF安全",
+                "subItems": [
+                    {
+                        "code": "overview",
+                        "name": "概览",
+                        "url": "/waf"
+                    },
+                    {
+                        "code": "wafLogs",
+                        "name": "拦截日志",
+                        "url": "/waf/logs"
+                    },
+                    {
+                        "code": "iplist",
+                        "name": "拦截IP",
+                        "url": "/waf/iplists"
+                    }
+                ]
+            },
+            {
+                "code": "plans",
+                "icon": "puzzle piece",
+                "isOn": true,
+                "name": "套餐管理"
+            },
+            {
+                "code": "anti-ddos",
+                "icon": "shield",
+                "isOn": true,
+                "name": "DDoS高防",
+                "subItems": [
+                    {
+                        "code": "instance",
+                        "name": "实例列表",
+                        "url": "/anti-ddos/instances"
+                    },
+                    {
+                        "code": "package",
+                        "name": "购买实例",
+                        "url": "/anti-ddos/packages"
+                    }
+                ]
+            },
+            {
+                "code": "ns",
+                "icon": "globe",
+                "isOn": true,
+                "name": "域名解析",
+                "subItems": [
+                    {
+                        "code": "domain",
+                        "name": "我的域名",
+                        "url": "/ns/domains"
+                    },
+                    {
+                        "code": "domainGroup",
+                        "name": "域名分组",
+                        "url": "/ns/domains/groups"
+                    },
+                    {
+                        "code": "domainBatch",
+                        "name": "批量操作",
+                        "url": "/ns/domains/batch"
+                    },
+                    {
+                        "code": "route",
+                        "name": "线路管理",
+                        "url": "/ns/routes"
+                    },
+                    {
+                        "code": "plan",
+                        "name": "套餐",
+                        "url": "/ns/plans"
+                    }
+                ]
+            },
+            {
+                "code": "finance",
+                "icon": "dollar sign",
+                "isOn": true,
+                "name": "财务管理",
+                "subItems": [
+                    {
+                        "code": "overview",
+                        "name": "概览",
+                        "url": "/finance"
+                    },
+                    {
+                        "code": "bills",
+                        "name": "费用账单",
+                        "url": "/finance/bills"
+                    },
+                    {
+                        "code": "logs",
+                        "name": "收支明细",
+                        "url": "/finance/logs"
+                    },
+                    {
+                        "code": "charge",
+                        "name": "充值",
+                        "url": "/finance/charge"
+                    }
+                ]
+            },
+            {
+                "code": "tickets",
+                "icon": "ticket",
+                "isOn": true,
+                "name": "工单系统"
+            },
+            {
+                "code": "acl",
+                "icon": "address book",
+                "isOn": true,
+                "name": "访问控制"
+            }
+        ],
+        "teaName": "FlexCDN演示",
+        "teaPageFooterHTML": "",
+        "teaRole": "user",
+        "teaShowIndexPage": false,
+        "teaShowPageFooter": false,
+        "teaSubMenu": "",
+        "teaSubMenus": [],
+        "teaTabbar": [
+            {
+                "icon": "",
+                "isActive": false,
+                "name": "网站列表",
+                "right": false,
+                "subName": "",
+                "url": "/servers"
+            },
+            {
+                "icon": "setting",
+                "isActive": true,
+                "name": "设置",
+                "right": false,
+                "subName": "",
+                "url": "/servers/server?serverId=1"
+            },
+            {
+                "icon": "chart area",
+                "isActive": false,
+                "name": "统计",
+                "right": false,
+                "subName": "",
+                "url": "/servers/server/stat?serverId=1"
+            },
+            {
+                "icon": "history",
+                "isActive": false,
+                "name": "访问日志",
+                "right": false,
+                "subName": "",
+                "url": "/servers/server/log?serverId=1"
+            }
+        ],
+        "teaTheme": "violet",
+        "teaTitle": "FlexCDN用户系统演示",
+        "teaUserAvatar": "",
+        "teaVersion": "1.1.1",
+        "trafficDailyFormat": "5.64MiB",
+        "trafficMonthlyFormat": "136.13MiB",
+        "userPlan": {
+            "id": 0
+        },
+        "userPlans": []
+    },
     "/servers/server/settings/serverNames":{
         "auditingResult": {
             "createdTime": "1970-01-01 08:00:00",

+ 316 - 221
src/views/layout.vue

@@ -1,7 +1,7 @@
 <script setup>
-import "./layout.css"
-import "@/assets/table.css"
-import Context from "./layout.js"
+import "./layout.css";
+import "@/assets/table.css";
+import Context from "./layout.js";
 import ctxRef from "@/utils/ctx_ref.js";
 import { provide, ref } from "vue";
 import BasicLayout from "@/layouts/BasicLayout.vue";
@@ -12,319 +12,414 @@ import TTabView from "@/components/ui/TTabView.vue";
 import TTabs from "@/components/ui/TTabs.vue";
 import TTab from "@/components/ui/TTab.vue";
 import InitData from "./index/initData";
+import SettingMenu from "@/views/servers/server/settings/@setting_menu.vue";
 
-InitData()
-const ctx = ctxRef(new Context())
+InitData();
+const ctx = ctxRef(new Context());
 
-provide("$popupLayout", false)
+provide("$popupLayout", false);
 
-const mainMenuVisible = ref(false)
+const mainMenuVisible = ref(false);
 const showMainMenu = () => {
-	const mainMenu = document.querySelector(".main-menu")
-	mainMenuVisible.value = !mainMenuVisible.value
-	if (mainMenuVisible.value) {
-		mainMenu.style.display = "block"
-	} else {
-		mainMenu.style.display = "none"
-	}
-}
-
+  const mainMenu = document.querySelector(".main-menu");
+  mainMenuVisible.value = !mainMenuVisible.value;
+  if (mainMenuVisible.value) {
+    mainMenu.style.display = "block";
+  } else {
+    mainMenu.style.display = "none";
+  }
+};
 </script>
 
 <template>
-	<BasicLayout>
-		<!-- 顶部导航 -->
-		<div class="top-nav">
-			<TMenubar>
-				<template #start>
-					<a href="" class="inline-block sm:hidden"
-						:class="{ 'bg-gray-200': mainMenuVisible, '!bg-transparent': !mainMenuVisible }"
-						@click.prevent="showMainMenu"><i class="icon bars"></i></a>
-					<a href="/dashboard" class="hidden sm:flex">
-						<div class="flex gap-[8px] items-center">
-							<span class="title-icon text-[24px] text-[#1e65ff]"></span>
-							<span class="font-bold text-[24px]">Faven.</span>
-						</div>
-						<!-- <i class="ui icon cloud" v-if="ctx.teaCommon.teaLogoFileId == 0"></i><img
+  <BasicLayout>
+    <!-- 顶部导航 -->
+    <div class="top-nav">
+      <TMenubar>
+        <template #start>
+          <a
+            href=""
+            class="inline-block sm:hidden"
+            :class="{
+              'bg-gray-200': mainMenuVisible,
+              '!bg-transparent': !mainMenuVisible,
+            }"
+            @click.prevent="showMainMenu"
+            ><i class="icon bars"></i
+          ></a>
+          <a href="/dashboard" class="hidden sm:flex">
+            <div class="flex gap-[8px] items-center">
+              <span class="title-icon text-[24px] text-[#1e65ff]"></span>
+              <span class="font-bold text-[24px]">Faven.</span>
+            </div>
+            <!-- <i class="ui icon cloud" v-if="ctx.teaCommon.teaLogoFileId == 0"></i><img
 							v-if="ctx.teaCommon.teaLogoFileId > 0" :src="'/ui/image/' + ctx.teaCommon.teaLogoFileId"
 							style="width: auto;height: 1.6em" alt="Logo" class="dark:invert" /> &nbsp; {{ ctx.teaTitle
 						}}&nbsp;<sup v-if="ctx.teaCommon.teaShowVersion">v{{ ctx.teaVersion }}</sup><sup
 							v-if="ctx.teaFrontMode == 'proxy'">front:{{ ctx.teaFrontMode }}</sup> &nbsp; -->
-					</a>
-				</template>
-				<template #end>
-					<div class="flex flex-wrap items-center">
-						<a href="/messages" class="item" :class="{ active: ctx.teaMenu == 'message' }"><span
-								:class="{ 'blink': ctx.globalMessageBadge > 0 }" class="flex items-center gap-0.5"><i
-									class="icon bell mr-1"></i><span class="hidden sm:inline-block">消息({{
-										ctx.globalMessageBadge }}) </span></span></a>
-						<a href="/settings/profile" class="item" :class="{ active: ctx.teaMenu == 'settings' }">
-							<i class="icon setting mr-1"></i><span class="hidden sm:inline-block">设置</span>
-						</a>
-						<a href="/" class="item" v-show="ctx.teaShowIndexPage">
-							<i class="icon home"></i><span class="hidden sm:inline-block">&nbsp;首页</span>
-						</a>
-						<a href="/docs" class="item" :class="{ active: ctx.teaMenu == 'docs' }"><i
-								class="icon file mr-1"></i><span class="hidden sm:inline-block">文档</span></a>
-						<a href="/settings/profile" class="item">
-							<i class="icon user mr-1" v-if="ctx.teaUserAvatar.length == 0"></i>
-							<img class="avatar" alt="" :src="ctx.teaUserAvatar" v-if="ctx.teaUserAvatar.length > 0" />
-							<span class="hidden sm:inline-block">{{ ctx.teaCommon.teaUsername }}</span>
-						</a>
-						<!-- color scheme -->
-						<a href="" class="item" v-tooltip.bottom="'切换亮色/暗色风格'" @click.prevent="ctx.changeColorScheme()">
-							<i class="pi pi-moon" v-if="ctx.currentColorScheme == 'dark'"></i>
-							<i class="pi pi-sun" v-if="ctx.currentColorScheme == 'light'"></i>
-							<span class="hidden sm:inline-block" v-if="ctx.currentColorScheme == 'dark'">暗色</span>
-							<span class="hidden sm:inline-block" v-if="ctx.currentColorScheme == 'light'">亮色</span>
-						</a>
-						<a :href="ctx.$url('logout')" class="item" title="安全退出登录"><i
-								class="icon sign out mr-1"></i><span class="hidden sm:inline-block">退出</span></a>
-					</div>
-				</template>
-			</TMenubar>
-		</div>
-
-		<!-- 左侧主菜单 -->
-		<div class="main-menu">
-			<div>
-				<div class="pb-20">
-					<TMenuAccordion :items="ctx.menuItems" style="width: 11em"></TMenuAccordion>
-				</div>
-				<TDivider layout="vertical" class="divider"></TDivider>
-			</div>
-		</div>
-
-		<!-- 右侧主操作栏 -->
-		<div class="main" :class="{ 'opacity-30': mainMenuVisible }">
-			<!-- 操作菜单 -->
-			<div class="mb-4 -mt-3">
-				<TTabView v-if="ctx.teaTabbar.length > 1" code="RANDOM" :value="ctx.tabValue" @change="ctx.changeTab">
-					<TTabs>
-						<TTab v-for="(item, index) in ctx.teaTabbar" :code="item.url"
-							@click="ctx.clickTab($event, item)" :disabled="item.isDisabled && !item.isActive">
-							<!-- TODO, right, title, icon, subName -->
-							<!-- right:item.isRight, title: item.isTitle, icon: item.icon != null && item.icon.length > 0-->
-
-							<var class="not-italic">
-								<span>{{ item.name }}</span>
-								<span v-if="item.subName.length > 0">({{ item.subName }})</span>
-								<i class="icon small" :class="item.icon"
-									v-if="index == 0 && item.icon != null && item.icon.length > 0"></i>
-							</var>
-							<var class="not-italic" v-if="item.isTitle && typeof ctx.node == 'object'">{{ ctx.node.name
-							}}</var>
-						</TTab>
-					</TTabs>
-				</TTabView>
-			</div>
-
-			<!-- 功能区 -->
-			<div class="main-box md:mb-0">
-				<RouterView :key="$route.fullPath"></RouterView>
-			</div>
-
-			<!-- 底部 -->
-			<div class="footer md:fixed left-0 right-0 bottom-0 z-50 flex flex-wrap gap-8 leading-10 py-2 bg-black border-t-2 border-gray-200 dark:border-gray-700 pl-4"
-				v-if="ctx.teaShowPageFooter && ctx.teaPageFooterHTML.length == 0">
-				<a class="item" title="点击进入检查版本更新页面">{{ ctx.teaName }} v{{ ctx.teaVersion }}</a>
-			</div>
-			<div class="footer md:fixed left-0 right-0 bottom-0 z-50 flex flex-wrap gap-8 leading-10 py-2 bg-black border-t-2 border-gray-200 dark:border-gray-700 pl-4"
-				v-if="ctx.teaShowPageFooter && ctx.teaPageFooterHTML.length > 0" v-html="ctx.teaPageFooterHTML"></div>
-		</div>
-	</BasicLayout>
+          </a>
+        </template>
+        <template #end>
+          <div class="flex flex-wrap items-center">
+            <a
+              href="/messages"
+              class="item"
+              :class="{ active: ctx.teaMenu == 'message' }"
+              ><span
+                :class="{ blink: ctx.globalMessageBadge > 0 }"
+                class="flex items-center gap-0.5"
+                ><i class="icon bell mr-1"></i
+                ><span class="hidden sm:inline-block"
+                  >消息({{ ctx.globalMessageBadge }})
+                </span></span
+              ></a
+            >
+            <a
+              href="/settings/profile"
+              class="item"
+              :class="{ active: ctx.teaMenu == 'settings' }"
+            >
+              <i class="icon setting mr-1"></i
+              ><span class="hidden sm:inline-block">设置</span>
+            </a>
+            <a href="/" class="item" v-show="ctx.teaShowIndexPage">
+              <i class="icon home"></i
+              ><span class="hidden sm:inline-block">&nbsp;首页</span>
+            </a>
+            <a
+              href="/docs"
+              class="item"
+              :class="{ active: ctx.teaMenu == 'docs' }"
+              ><i class="icon file mr-1"></i
+              ><span class="hidden sm:inline-block">文档</span></a
+            >
+            <a href="/settings/profile" class="item">
+              <i
+                class="icon user mr-1"
+                v-if="ctx.teaUserAvatar.length == 0"
+              ></i>
+              <img
+                class="avatar"
+                alt=""
+                :src="ctx.teaUserAvatar"
+                v-if="ctx.teaUserAvatar.length > 0"
+              />
+              <span class="hidden sm:inline-block">{{
+                ctx.teaCommon.teaUsername
+              }}</span>
+            </a>
+            <!-- color scheme -->
+            <a
+              href=""
+              class="item"
+              v-tooltip.bottom="'切换亮色/暗色风格'"
+              @click.prevent="ctx.changeColorScheme()"
+            >
+              <i class="pi pi-moon" v-if="ctx.currentColorScheme == 'dark'"></i>
+              <i class="pi pi-sun" v-if="ctx.currentColorScheme == 'light'"></i>
+              <span
+                class="hidden sm:inline-block"
+                v-if="ctx.currentColorScheme == 'dark'"
+                >暗色</span
+              >
+              <span
+                class="hidden sm:inline-block"
+                v-if="ctx.currentColorScheme == 'light'"
+                >亮色</span
+              >
+            </a>
+            <a :href="ctx.$url('logout')" class="item" title="安全退出登录"
+              ><i class="icon sign out mr-1"></i
+              ><span class="hidden sm:inline-block">退出</span></a
+            >
+          </div>
+        </template>
+      </TMenubar>
+    </div>
+
+    <!-- 左侧主菜单 -->
+    <div class="main-menu">
+      <div>
+        <div class="pb-20">
+          <TMenuAccordion
+            :items="ctx.menuItems"
+            style="width: 11em"
+          ></TMenuAccordion>
+        </div>
+        <TDivider layout="vertical" class="divider"></TDivider>
+      </div>
+    </div>
+
+    <!-- 右侧主操作栏 -->
+    <div class="main" :class="{ 'opacity-30': mainMenuVisible }">
+      <!-- 操作菜单 -->
+      <SettingMenu :ctx="ctx" class=""></SettingMenu>
+
+      <div class="mt-3">
+        <TTabView
+          v-if="ctx.teaTabbar.length > 1"
+          code="RANDOM"
+          :value="ctx.tabValue"
+          @change="ctx.changeTab"
+        >
+          <TTabs>
+            <TTab
+              v-for="(item, index) in ctx.teaTabbar"
+              :code="item.url"
+              @click="ctx.clickTab($event, item)"
+              :disabled="item.isDisabled && !item.isActive"
+            >
+              <!-- TODO, right, title, icon, subName -->
+              <!-- right:item.isRight, title: item.isTitle, icon: item.icon != null && item.icon.length > 0-->
+
+              <var class="not-italic">
+				<i v-if="index > 0 && item.icon === 'setting'"  class="pi pi-cog ">
+				</i>
+				<i v-else-if="index > 0 && item.icon === 'chart area'"  class="pi pi-chart-pie ">
+				</i>
+				<svg  v-else-if="index > 0 && item.icon === 'history'" width="16" height="16" viewBox="0 0 16 16" fill="none" class="inline-block" style="margin-top: -2px;" xmlns="http://www.w3.org/2000/svg">
+					<path d="M13.6666 3.33325H4.33325V14.6666H13.6666V3.33325Z" stroke="#657080" stroke-linejoin="round"/>
+					<path d="M11.6666 3.33325V1.33325H2.66659C2.48249 1.33325 2.33325 1.48249 2.33325 1.66659V12.6666H4.33325" stroke="#657080" stroke-linecap="round" stroke-linejoin="round"/>
+					<path d="M7 7.33325H11" stroke="#657080" stroke-linecap="round" stroke-linejoin="round"/>
+					<path d="M7 10H11" stroke="#657080" stroke-linecap="round" stroke-linejoin="round"/>
+				</svg>
+
+				<i
+                  class="icon small"
+                  :class="item.icon"
+                  v-else-if="index == 0 && item.icon != null && item.icon.length > 0"
+                ></i>
+                <span>{{ item.name }}</span>
+                <span v-if="item.subName.length > 0">({{ item.subName }})</span>
+              
+              </var>
+              <var
+                class="not-italic"
+                v-if="item.isTitle && typeof ctx.node == 'object'"
+                >{{ ctx.node.name }}</var
+              >
+            </TTab>
+          </TTabs>
+        </TTabView>
+      </div>
+
+      <!-- 功能区 -->
+      <div class="main-box md:mb-0">
+        <RouterView :key="$route.fullPath"></RouterView>
+      </div>
+
+      <!-- 底部 -->
+      <div
+        class="footer md:fixed left-0 right-0 bottom-0 z-50 flex flex-wrap gap-8 leading-10 py-2 bg-black border-t-2 border-gray-200 dark:border-gray-700 pl-4"
+        v-if="ctx.teaShowPageFooter && ctx.teaPageFooterHTML.length == 0"
+      >
+        <a class="item" title="点击进入检查版本更新页面"
+          >{{ ctx.teaName }} v{{ ctx.teaVersion }}</a
+        >
+      </div>
+      <div
+        class="footer md:fixed left-0 right-0 bottom-0 z-50 flex flex-wrap gap-8 leading-10 py-2 bg-black border-t-2 border-gray-200 dark:border-gray-700 pl-4"
+        v-if="ctx.teaShowPageFooter && ctx.teaPageFooterHTML.length > 0"
+        v-html="ctx.teaPageFooterHTML"
+      ></div>
+    </div>
+  </BasicLayout>
 </template>
 
 <style scoped lang="postcss">
+:deep(.p-tablist-tab-list){
+  padding: 15px  ;
+  padding-bottom: 0;
+}
 .title-icon {
-	width: 1em;
-	height: 1em;
-	mask-image: var(--svg);
-	--svg: url(@/assets/icon/title.svg);
-	background-color: currentColor;
-	display: inline-block;
-	-webkit-mask-size: 100% 100%;
-	mask-size: 100% 100%;
-	-webkit-mask-repeat: no-repeat;
-	mask-repeat: no-repeat;
+  width: 1em;
+  height: 1em;
+  mask-image: var(--svg);
+  --svg: url(@/assets/icon/title.svg);
+  background-color: currentColor;
+  display: inline-block;
+  -webkit-mask-size: 100% 100%;
+  mask-size: 100% 100%;
+  -webkit-mask-repeat: no-repeat;
+  mask-repeat: no-repeat;
 }
 
 :deep(td a),
 :deep(.comment a),
 :deep(form a) {
-	color: var(--p-primary-color);
+  color: var(--p-primary-color);
 }
 
 :deep(td a:hover),
 :deep(.comment a:hover),
 :deep(.form a:hover) {
-	color: var(--p-primary-700);
+  color: var(--p-primary-700);
 }
 
 .top-nav {
-	border-radius: 0 !important;
-	position: fixed;
-	width: 100%;
-	z-index: 1000;
-	overflow-x: auto;
-	border: 0 !important;
-	box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
-
-	.red {
-		color: var(--p-red-500) !important;
-	}
-
-	.hover-span {
-		span {
-			display: none;
-		}
-
-		font-size: 0.8em;
-	}
-
-	.hover-span:hover {
-		span {
-			display: inline;
-		}
-	}
-
-	.item {
-		@apply flex items-center gap-0.5;
-	}
+  border-radius: 0 !important;
+  position: fixed;
+  width: 100%;
+  z-index: 1000;
+  overflow-x: auto;
+  border: 0 !important;
+  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+
+  .red {
+    color: var(--p-red-500) !important;
+  }
+
+  .hover-span {
+    span {
+      display: none;
+    }
+
+    font-size: 0.8em;
+  }
+
+  .hover-span:hover {
+    span {
+      display: inline;
+    }
+  }
+
+  .item {
+    @apply flex items-center gap-0.5;
+  }
 }
 
 .top-nav .p-menubar {
-	border-top: 0;
-	border-radius: 0;
+  border-top: 0;
+  border-radius: 0;
 }
 
 @media screen and (max-width: 768px) {
-	.top-nav {
-		position: relative !important;
-		width: 100%;
-	}
-
-	.main {
-		position: relative !important;
-		left: 0;
-		right: 0;
-		bottom: 0;
-		top: auto;
-		padding-left: 1em;
-		padding-right: 1em;
-	}
-
-	.main-menu {
-		display: none;
-	}
+  .top-nav {
+    position: relative !important;
+    width: 100%;
+  }
+
+  .main {
+    position: relative !important;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    top: auto;
+    padding-left: 1em;
+    padding-right: 1em;
+  }
+
+  .main-menu {
+    display: none;
+  }
 }
 
 .main-menu {
-	position: fixed;
-	left: 0.8em;
-	top: 5.6em;
-	bottom: 0;
-	overflow-y: auto;
-	overflow-x: hidden;
-	z-index: 10;
-	width: 13em;
-	background: #edeff4;
-
-	.divider {
-		position: fixed;
-		top: 4em;
-		bottom: 1em;
-		left: 11.5em;
-	}
+  position: fixed;
+  left: 0.8em;
+  top: 5.6em;
+  bottom: 0;
+  overflow-y: auto;
+  overflow-x: hidden;
+  z-index: 10;
+  width: 13em;
+  background: #edeff4;
+
+  .divider {
+    position: fixed;
+    top: 4em;
+    bottom: 1em;
+    left: 11.5em;
+  }
 }
 
 .dark .main-menu {
-	background: black;
+  background: black;
 }
 
 .top-nav a {
-	@apply px-4 py-2;
+  @apply px-4 py-2;
 }
 
 .top-nav a:hover {
-	@apply bg-gray-100 dark:bg-gray-700 rounded-md;
+  @apply bg-gray-100 dark:bg-gray-700 rounded-md;
 }
 
 .hover-span,
 .hover-span a {
-	@apply flex items-center gap-2;
+  @apply flex items-center gap-2;
 }
 
 :deep(.p-panelmenu) {
-	width: 10em;
+  width: 10em;
 }
 
 p.comment em,
 div.comment em {
-	font-style: italic;
+  font-style: italic;
 }
 
 :deep(.p-message) {
-	@apply py-1;
+  @apply py-1;
 }
 
 :deep(th.width6) {
-	width: 6em !important;
+  width: 6em !important;
 }
 
 :deep(th.width10) {
-	width: 10em !important;
+  width: 10em !important;
 }
 
 :deep(span.disabled) {
-	@apply text-gray-500;
+  @apply text-gray-500;
 }
 
 /** footer **/
 .footer a,
 .footer :deep(a) {
-	@apply text-white;
+  @apply text-white;
 }
 
 .main {
-	padding-bottom: 1em;
-	font-family: Source Han Sans SC;
-	margin-top: .6em;
+  padding-bottom: 1em;
+  font-family: Source Han Sans SC;
+  margin-top: 0.6em;
 }
 
 .main-box {
-	background-color: var(--p-content-background);
-	padding: 30px;
-	min-height: calc(100vh - 100px);
+  background-color: var(--p-content-background);
+  padding: 30px;
+  padding-top: 15px;
+  min-height: calc(100vh - 100px);
 }
 
 :deep(.p-menu-item-link) {
-	font-weight: 400;
-	font-size: 14px;
-	line-height: 14px;
-	color: rgba(49, 49, 49, 1);
-	padding: 12px 20px;
+  font-weight: 400;
+  font-size: 14px;
+  line-height: 14px;
+  color: rgba(49, 49, 49, 1);
+  padding: 12px 20px;
 }
 
 :deep(.p-menu-list) {
-	padding: 10px 10px;
+  padding: 10px 10px;
 }
 
 :deep(.p-menu-item-link.on) {
-	text-decoration: none;
+  text-decoration: none;
 }
 
 :deep(.t-active-item) {
-	color: rgba(30, 101, 255, 1) !important;
+  color: rgba(30, 101, 255, 1) !important;
 }
 </style>
 <style lang="postcss">
 .dark {
-
-	td a:hover,
-	.comment a:hover,
-	.form a:hover {
-		color: var(--p-primary-200);
-	}
+  td a:hover,
+  .comment a:hover,
+  .form a:hover {
+    color: var(--p-primary-200);
+  }
 }
 </style>

+ 1 - 0
src/views/servers/server/settings/serverNames/index.vue

@@ -16,6 +16,7 @@ const ctx = ctxRef(new Context())
 </script>
 
 <template>
+	
 	<ServerSettingLayout :ctx="ctx">
         <!-- 审核中 -->
 		<div v-show="ctx.isAuditing">