Ver código fonte

feat: 补全系统菜单初始化 & DNS管理页自动跳转

- DataInit 补充 系统配置 子菜单(账号/角色/菜单/APIs管理)
- DataInit 补充 Cloudflare 子菜单(Zone列表/DNS管理/DNS模板)
- DNS管理页从 Zone列表跳转时自动选中账号和域名

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
urban 1 mês atrás
pai
commit
10645f1e19

+ 87 - 0
magic_admin/model/system/sys_data_init.go

@@ -144,6 +144,93 @@ func (*Menus) DataInit(db *gorm.DB) error {
 			}
 		}
 	}
+
+	// 初始化 系统配置 子菜单
+	sysParent := Menus{}
+	db.Model(&Menus{}).Where("router = ?", "/system").First(&sysParent)
+	if sysParent.ID != 0 {
+		sysChildren := []Menus{
+			{Name: "账号管理", Icon: "Menu", Router: "/system/accountManage", Component: "@/views/system/accountManage/index.vue", Sort: 1, Enable: true, IsKeepAlive: true},
+			{Name: "角色管理", Icon: "Menu", Router: "/system/roleManage", Component: "@/views/system/roleManage/index.vue", Sort: 2, Enable: true, IsKeepAlive: true},
+			{Name: "菜单管理", Icon: "Menu", Router: "/system/menuMange", Component: "@/views/system/menuMange/index.vue", Sort: 3, Enable: true, IsKeepAlive: true},
+			{Name: "APIs管理", Icon: "Menu", Router: "/system/apisManage", Component: "@/views/system/apisManage/index.vue", Sort: 4, Enable: true, IsKeepAlive: true},
+		}
+		for _, child := range sysChildren {
+			find := Menus{}
+			if stat := db.Model(&Menus{}).Where("router = ?", child.Router).Find(&find).Statement; stat.RowsAffected == 0 {
+				child.ParentId = sysParent.ID
+				if err := db.Create(&child).Error; err != nil {
+					return err
+				}
+			}
+		}
+	}
+
+	// 初始化 Cloudflare 菜单(查找或创建父菜单,再补充子菜单)
+	cfParent := Menus{}
+	db.Model(&Menus{}).Where("router = ?", "/cloudflare").First(&cfParent)
+	if cfParent.ID == 0 {
+		cfParent = Menus{
+			ParentId:    0,
+			Name:        "Cloudflare",
+			Icon:        "Monitor",
+			Router:      "/cloudflare",
+			Sort:        2,
+			Enable:      true,
+			IsKeepAlive: true,
+		}
+		if err := db.Create(&cfParent).Error; err != nil {
+			return err
+		}
+	}
+	cfChildren := []Menus{
+		{
+			Name:        "账号管理",
+			Icon:        "Key",
+			Router:      "/cloudflare/account",
+			Component:   "@/views/cloudflare/account/index.vue",
+			Sort:        1,
+			Enable:      true,
+			IsKeepAlive: true,
+		},
+		{
+			Name:        "Zone 列表",
+			Icon:        "List",
+			Router:      "/cloudflare/zones",
+			Component:   "@/views/cloudflare/zones/index.vue",
+			Sort:        2,
+			Enable:      true,
+			IsKeepAlive: true,
+		},
+		{
+			Name:        "DNS 管理",
+			Icon:        "Connection",
+			Router:      "/cloudflare/dns",
+			Component:   "@/views/cloudflare/dns/index.vue",
+			Sort:        3,
+			Enable:      true,
+			IsKeepAlive: true,
+		},
+		{
+			Name:        "DNS 模板",
+			Icon:        "Document",
+			Router:      "/cloudflare/template",
+			Component:   "@/views/cloudflare/template/index.vue",
+			Sort:        4,
+			Enable:      true,
+			IsKeepAlive: true,
+		},
+	}
+	for _, child := range cfChildren {
+		find := Menus{}
+		if stat := db.Model(&Menus{}).Where("router = ?", child.Router).Find(&find).Statement; stat.RowsAffected == 0 {
+			child.ParentId = cfParent.ID
+			if err := db.Create(&child).Error; err != nil {
+				return err
+			}
+		}
+	}
+
 	return nil
 }
 

+ 12 - 0
magic_admin_web/src/views/cloudflare/dns/index.vue

@@ -177,6 +177,7 @@ CNAME  www  example.com</pre>
 
 <script setup>
 import { ref, onMounted, defineComponent, h } from 'vue';
+import { useRoute } from 'vue-router';
 import { ElMessage, ElMessageBox, ElProgress } from 'element-plus';
 import {
   getCfAccountList, getCfRecords,
@@ -241,9 +242,20 @@ const recordRules = {
   content: [{ required: true, message: '请输入内容' }]
 };
 
+const route = useRoute();
+
 onMounted(async () => {
   const res = await getCfAccountList({ pageSize: 100 });
   accounts.value = res?.data?.list || [];
+
+  // 从 Zone 列表跳转过来时,自动选中账号和域名
+  const { accountId, zoneId } = route.query;
+  if (accountId && zoneId) {
+    selectedAccountId.value = Number(accountId);
+    await onAccountChange();
+    selectedZoneId.value = zoneId;
+    await loadRecords();
+  }
 });
 
 async function onAccountChange() {