From 9fd157a63dfbb8ee9f32fff7540c97eb4a3d3cce Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期五, 01 八月 2025 17:00:30 +0800
Subject: [PATCH] feat:菜单开发

---
 FlexJobApi.User.Application/FlexJobApi.User.Application.xml          |   10 +-
 FlexJobApi.User.Application/Menus/Queries/MenuListQueryHandler.cs    |   33 ++++----
 FlexJobApi.User.Application/Menus/Commands/MenuSaveCommandHandler.cs |   24 +++++
 FlexJobApi.Core/Models/User/Menus/Queries/MenuAllQuery.cs            |   23 ++++-
 FlexJobApi.Core/FlexJobApi.Core.xml                                  |  115 ++++++++++++++++------------
 FlexJobApi.User.Application/Menus/MenuAppService.cs                  |    2 
 FlexJobApi.Core/Enums/Users/EnumMenuType.cs                          |    2 
 FlexJobApi.User.Application/EnumUserErrorCodeType.cs                 |    5 +
 8 files changed, 132 insertions(+), 82 deletions(-)

diff --git a/FlexJobApi.Core/Enums/Users/EnumMenuType.cs b/FlexJobApi.Core/Enums/Users/EnumMenuType.cs
index 7879ce6..f888961 100644
--- a/FlexJobApi.Core/Enums/Users/EnumMenuType.cs
+++ b/FlexJobApi.Core/Enums/Users/EnumMenuType.cs
@@ -26,7 +26,7 @@
         /// <summary>
         /// 鎸夐挳
         /// </summary>
-        Buuton = 40,
+        Button = 40,
         /// <summary>
         /// 瀛楁
         /// </summary>
diff --git a/FlexJobApi.Core/FlexJobApi.Core.xml b/FlexJobApi.Core/FlexJobApi.Core.xml
index d88b550..66d9d3e 100644
--- a/FlexJobApi.Core/FlexJobApi.Core.xml
+++ b/FlexJobApi.Core/FlexJobApi.Core.xml
@@ -1989,92 +1989,107 @@
             澶囨敞
             </summary>
         </member>
-        <member name="T:FlexJobApi.Core.MenuAllQuery">
+        <member name="T:FlexJobApi.Core.MenuListQuery">
             <summary>
             鏌ヨ鎵�鏈夎彍鍗�
             </summary>
         </member>
-        <member name="T:FlexJobApi.Core.MenuAllCallback">
-            <summary>
-            鏌ヨ鎵�鏈夎彍鍗�-缁撴灉
-            </summary>
-        </member>
-        <member name="T:FlexJobApi.Core.MenuAllCallbackItem">
-            <summary>
-            鏌ヨ鎵�鏈夎彍鍗�-缁撴灉-椤�
-            </summary>
-        </member>
-        <member name="P:FlexJobApi.Core.MenuAllCallbackItem.Id">
-            <summary>
-            Id
-            </summary>
-        </member>
-        <member name="P:FlexJobApi.Core.MenuAllCallbackItem.ParentId">
-            <summary>
-            涓婄骇Id
-            </summary>
-        </member>
-        <member name="P:FlexJobApi.Core.MenuAllCallbackItem.Childrens">
-            <summary>
-            涓嬬骇
-            </summary>
-        </member>
-        <member name="P:FlexJobApi.Core.MenuAllCallbackItem.Path">
-            <summary>
-            鑿滃崟璺緞
-            </summary>
-        </member>
-        <member name="P:FlexJobApi.Core.MenuAllCallbackItem.Code">
-            <summary>
-            缂栧彿
-            </summary>
-        </member>
-        <member name="P:FlexJobApi.Core.MenuAllCallbackItem.Name">
-            <summary>
-            鍚嶇О
-            </summary>
-        </member>
-        <member name="P:FlexJobApi.Core.MenuAllCallbackItem.Type">
+        <member name="P:FlexJobApi.Core.MenuListQuery.Types">
             <summary>
             绫诲瀷
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.MenuAllCallbackItem.VisitLevel">
+        <member name="P:FlexJobApi.Core.MenuListQuery.ParentId">
+            <summary>
+            涓婄骇Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.MenuListQuery.Keywords">
+            <summary>
+            鍏抽敭瀛�
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.MenuListCallback">
+            <summary>
+            鏌ヨ鎵�鏈夎彍鍗�-缁撴灉
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.MenuListCallbackItem">
+            <summary>
+            鏌ヨ鎵�鏈夎彍鍗�-缁撴灉-椤�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.MenuListCallbackItem.Id">
+            <summary>
+            Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.MenuListCallbackItem.ParentId">
+            <summary>
+            涓婄骇Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.MenuListCallbackItem.Childrens">
+            <summary>
+            涓嬬骇
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.MenuListCallbackItem.Path">
+            <summary>
+            鑿滃崟璺緞
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.MenuListCallbackItem.Code">
+            <summary>
+            缂栧彿
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.MenuListCallbackItem.Name">
+            <summary>
+            鍚嶇О
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.MenuListCallbackItem.Type">
+            <summary>
+            绫诲瀷
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.MenuListCallbackItem.VisitLevel">
             <summary>
             璁块棶绾у埆
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.MenuAllCallbackItem.Icon">
+        <member name="P:FlexJobApi.Core.MenuListCallbackItem.Icon">
             <summary>
             鍥炬爣
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.MenuAllCallbackItem.Url">
+        <member name="P:FlexJobApi.Core.MenuListCallbackItem.Url">
             <summary>
             閾炬帴鍦板潃
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.MenuAllCallbackItem.IsDisabled">
+        <member name="P:FlexJobApi.Core.MenuListCallbackItem.IsDisabled">
             <summary>
             鏄惁绂佺敤
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.MenuAllCallbackItem.IsHidden">
+        <member name="P:FlexJobApi.Core.MenuListCallbackItem.IsHidden">
             <summary>
             鏄惁闅愯棌
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.MenuAllCallbackItem.IsCache">
+        <member name="P:FlexJobApi.Core.MenuListCallbackItem.IsCache">
             <summary>
             鏄惁缂撳瓨
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.MenuAllCallbackItem.Sort">
+        <member name="P:FlexJobApi.Core.MenuListCallbackItem.Sort">
             <summary>
             鎺掑簭
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.MenuAllCallbackItem.Remark">
+        <member name="P:FlexJobApi.Core.MenuListCallbackItem.Remark">
             <summary>
             澶囨敞
             </summary>
diff --git a/FlexJobApi.Core/Models/User/Menus/Queries/MenuAllQuery.cs b/FlexJobApi.Core/Models/User/Menus/Queries/MenuAllQuery.cs
index 3af7609..e4a35fd 100644
--- a/FlexJobApi.Core/Models/User/Menus/Queries/MenuAllQuery.cs
+++ b/FlexJobApi.Core/Models/User/Menus/Queries/MenuAllQuery.cs
@@ -1,4 +1,5 @@
-锘縰sing MediatR;
+锘縰sing Mapster;
+using MediatR;
 using System;
 using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
@@ -13,6 +14,20 @@
     /// </summary>
     public class MenuListQuery : IRequest<MenuListCallback>
     {
+        public MenuListQuery()
+        {
+
+        }
+
+        /// <summary>
+        /// 涓婄骇Id
+        /// </summary>
+        public Guid? ParentId { get; set; }
+
+        /// <summary>
+        /// 鍏抽敭瀛�
+        /// </summary>
+        public string Keywords { get; set; }
     }
 
     /// <summary>
@@ -35,7 +50,6 @@
     {
         public MenuListCallbackItem()
         {
-            Childrens = [];
         }
 
         /// <summary>
@@ -47,11 +61,6 @@
         /// 涓婄骇Id
         /// </summary>
         public Guid? ParentId { get; set; }
-
-        /// <summary>
-        /// 涓嬬骇
-        /// </summary>
-        public List<MenuListCallbackItem> Childrens { get; set; }
 
         /// <summary>
         /// 鑿滃崟璺緞
diff --git a/FlexJobApi.User.Application/EnumUserErrorCodeType.cs b/FlexJobApi.User.Application/EnumUserErrorCodeType.cs
index e0fe456..ef102ad 100644
--- a/FlexJobApi.User.Application/EnumUserErrorCodeType.cs
+++ b/FlexJobApi.User.Application/EnumUserErrorCodeType.cs
@@ -16,6 +16,11 @@
         [ErrorCodeItemMetadata("{0}涓嶅瓨鍦�")]
         s100 = 100,
         /// <summary>
+        /// 鍙傛暟閿欒锛歿0}
+        /// </summary>
+        [ErrorCodeItemMetadata("鍙傛暟閿欒锛歿0}")]
+        s200 = 200,
+        /// <summary>
         /// 璐﹀彿鎴栧瘑鐮佷笉瀛樺湪
         /// </summary>
         [ErrorCodeItemMetadata("璐﹀彿鎴栧瘑鐮佷笉瀛樺湪")]
diff --git a/FlexJobApi.User.Application/FlexJobApi.User.Application.xml b/FlexJobApi.User.Application/FlexJobApi.User.Application.xml
index be1b05f..5442d20 100644
--- a/FlexJobApi.User.Application/FlexJobApi.User.Application.xml
+++ b/FlexJobApi.User.Application/FlexJobApi.User.Application.xml
@@ -67,9 +67,9 @@
             鑿滃崟
             </summary>
         </member>
-        <member name="M:FlexJobApi.User.Application.MenuAppService.AllQuery(FlexJobApi.Core.MenuAllQuery)">
+        <member name="M:FlexJobApi.User.Application.MenuAppService.ListQuery(FlexJobApi.Core.MenuListQuery)">
             <summary>
-            鏌ヨ鎵�鏈夎彍鍗�
+            鏌ヨ鑿滃崟鍒楄〃
             </summary>
             <param name="query"></param>
             <returns></returns>
@@ -81,17 +81,17 @@
             <param name="command"></param>
             <returns></returns>
         </member>
-        <member name="T:FlexJobApi.User.Application.MenuAllQueryHandler">
+        <member name="T:FlexJobApi.User.Application.MenuListQueryHandler">
             <summary>
             鏌ヨ鎵�鏈夎彍鍗�
             </summary>
         </member>
-        <member name="M:FlexJobApi.User.Application.MenuAllQueryHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.Menu})">
+        <member name="M:FlexJobApi.User.Application.MenuListQueryHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.Menu})">
             <summary>
             鏌ヨ鎵�鏈夎彍鍗�
             </summary>
         </member>
-        <member name="M:FlexJobApi.User.Application.MenuAllQueryHandler.Handle(FlexJobApi.Core.MenuAllQuery,System.Threading.CancellationToken)">
+        <member name="M:FlexJobApi.User.Application.MenuListQueryHandler.Handle(FlexJobApi.Core.MenuListQuery,System.Threading.CancellationToken)">
             <inheritdoc/>
         </member>
     </members>
diff --git a/FlexJobApi.User.Application/Menus/Commands/MenuSaveCommandHandler.cs b/FlexJobApi.User.Application/Menus/Commands/MenuSaveCommandHandler.cs
index 4ab1616..f7d5f52 100644
--- a/FlexJobApi.User.Application/Menus/Commands/MenuSaveCommandHandler.cs
+++ b/FlexJobApi.User.Application/Menus/Commands/MenuSaveCommandHandler.cs
@@ -29,10 +29,30 @@
                 ? await menuRep.AsQueryable().FirstOrDefaultAsync(it => it.Id == request.Id, cancellationToken)
                 : new Menu();
             if (menu == null) throw Oops.Oh(EnumUserErrorCodeType.s100, "鑿滃崟");
+
+            if (request.Id.HasValue && menu.Code != request.Code)
+            {
+                throw Oops.Oh(EnumUserErrorCodeType.s200, "缂栧彿涓嶅彲淇敼");
+            }
+
             request.Adapt(menu);
+
+            if (menu.ParentId.HasValue)
+            {
+                menu.Path = await menuRep.AsQueryable().AsNoTracking().Where(it => it.Id == menu.ParentId).Select(it => it.Path).FirstOrDefaultAsync();
+                menu.Path = $"{menu.Path}/{menu.Code}";
+            }
+            else
+            {
+                menu.Path = "/";
+            }
+
             var result = request.Id == null
-                ? await menuRep.InsertNowAsync(menu, cancellationToken: cancellationToken)
-                : await menuRep.UpdateNowAsync(menu, cancellationToken: cancellationToken);
+                ? await menuRep.InsertAsync(menu, cancellationToken: cancellationToken)
+                : await menuRep.UpdateAsync(menu);
+
+            await menuRep.SaveNowAsync(cancellationToken);
+
             return menu.Id;
         }
     }
diff --git a/FlexJobApi.User.Application/Menus/MenuAppService.cs b/FlexJobApi.User.Application/Menus/MenuAppService.cs
index c03c4eb..cb3fa63 100644
--- a/FlexJobApi.User.Application/Menus/MenuAppService.cs
+++ b/FlexJobApi.User.Application/Menus/MenuAppService.cs
@@ -19,7 +19,7 @@
         private readonly IMediator mediator = mediator;
 
         /// <summary>
-        /// 鏌ヨ鑿滃崟鍒楄〃
+        /// 鏌ヨ鑿滃崟/椤甸潰/妯℃�佹鍒楄〃
         /// </summary>
         /// <param name="query"></param>
         /// <returns></returns>
diff --git a/FlexJobApi.User.Application/Menus/Queries/MenuListQueryHandler.cs b/FlexJobApi.User.Application/Menus/Queries/MenuListQueryHandler.cs
index 6cfd83b..9f50732 100644
--- a/FlexJobApi.User.Application/Menus/Queries/MenuListQueryHandler.cs
+++ b/FlexJobApi.User.Application/Menus/Queries/MenuListQueryHandler.cs
@@ -12,10 +12,10 @@
 namespace FlexJobApi.User.Application
 {
     /// <summary>
-    /// 鏌ヨ鎵�鏈夎彍鍗�
+    /// 鏌ヨ鑿滃崟/椤甸潰/妯℃�佹鍒楄〃
     /// </summary>
     public class MenuListQueryHandler(
-        IRepository<Menu> menuRep) 
+        IRepository<Menu> menuRep)
         : IRequestHandler<MenuListQuery, MenuListCallback>
     {
         private readonly IRepository<Menu> menuRep = menuRep;
@@ -23,21 +23,22 @@
         /// <inheritdoc/>
         public async Task<MenuListCallback> Handle(MenuListQuery request, CancellationToken cancellationToken)
         {
-            var config = new TypeAdapterConfig();
-            config.Default.MaxDepth(10);
             var callback = new MenuListCallback();
-            callback.Items = await menuRep.AsQueryable()
-              .Include(it => it.Childrens.Where(c =>
-                    c.Type == EnumMenuType.Menu
-                    || c.Type == EnumMenuType.Page
-                    || c.Type == EnumMenuType.Modal))
-              .OrderBy(it => it.Sort).ThenBy(it => it.CreatedTime)
-              .Where(it =>
-                    it.Type == EnumMenuType.Menu
-                    || it.Type == EnumMenuType.Page
-                    || it.Type == EnumMenuType.Modal)
-              .ProjectToType<MenuListCallbackItem>(config)
-              .ToListAsync(cancellationToken);
+            var q = menuRep.AsQueryable().AsNoTracking()
+                .Where(it => it.Type == EnumMenuType.Menu || it.Type == EnumMenuType.Page || it.Type == EnumMenuType.Modal);
+            if (request.ParentId.HasValue)
+            {
+                q = q.Where(it => it.ParentId == request.ParentId);
+            }
+            if (!string.IsNullOrEmpty(request.Keywords))
+            {
+                q = q.Where(it =>
+                    it.Name.Contains(request.Keywords)
+                    || it.Code.Contains(request.Keywords)
+                    || it.Path.Contains(request.Keywords)
+                    || it.Remark.Contains(request.Keywords));
+            }
+            callback.Items = await q.ProjectToType<MenuListCallbackItem>().ToListAsync();
             return callback;
         }
     }

--
Gitblit v1.9.1