From c2e3194d04edb97efb9d968026928107a181d95b Mon Sep 17 00:00:00 2001 From: 李曜臣 Date: Fri, 8 May 2026 21:07:16 +0800 Subject: [PATCH] 登陆优化;产品-门店绑定优化 --- 标签模块接口对接说明.md | 34 ++++++++++++++++++++++++++++++---- 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application.Contracts/Dtos/Product/ProductCreateInputVo.cs | 8 ++++++++ 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application.Contracts/IServices/IProductAppService.cs | 7 +++++++ 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application/Services/ProductAppService.cs | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application/Services/UsAppAuthAppService.cs | 11 ++++++++--- 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application.Contracts/IServices/IAccountService.cs | 6 ------ 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/ObjectMapping/RbacMapsterRegister.cs | 26 ++++++++++++++++++++++++++ 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/AccountService.cs | 10 ++++++++-- 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/MenuParentIdConverter.cs | 26 ++++++++++++++++++++++++++ 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Entities/MenuAggregateRoot.cs | 24 +++++++++++++----------- 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Managers/AccountManager.cs | 8 +++----- 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Managers/UserManager.cs | 3 ++- 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.SqlSugarCore/DataSeeds/MenuPureDataSeed.cs | 74 +++++++++++++++++++++++++++++++++++++------------------------------------- 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.SqlSugarCore/DataSeeds/MenuRuoYiDataSeed.cs | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------ 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.SqlSugarCore/DataSeeds/MenuVben5DataSeed.cs | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------------------- 美国版/Food Labeling Management Platform/src/components/products/ProductsView.tsx | 66 +++++++++++++++++++++++++++++++++++++++++++----------------------- 项目相关文档/本次新增与优化接口汇总.md | 1 + 项目相关文档/标签模块接口对接说明.md | 34 ++++++++++++++++++++++++++++++---- 18 files changed, 427 insertions(+), 206 deletions(-) create mode 100644 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/ObjectMapping/RbacMapsterRegister.cs create mode 100644 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/MenuParentIdConverter.cs diff --git a/标签模块接口对接说明.md b/标签模块接口对接说明.md index 5a88ce2..b002b2b 100644 --- a/标签模块接口对接说明.md +++ b/标签模块接口对接说明.md @@ -574,6 +574,10 @@ ADD UNIQUE KEY `uk_fl_ltpd_template_product_label_type` (`TemplateId`, `ProductI 入参: - `id`:产品Id(`fl_product.Id`) +返回(`ProductGetOutputDto`,与实现一致的主要字段): +- `id`、`productCode`、`productName`、`categoryId`、`categoryName`、`productImageUrl`、`state` +- **`locationIds`**:`string[]`,该产品在 **`fl_location_product`** 中绑定的门店 Id(去重);无关联时为空数组 + ### 6.3 新增产品 方法:`POST /api/app/product` @@ -583,15 +587,30 @@ ADD UNIQUE KEY `uk_fl_ltpd_template_product_label_type` (`TemplateId`, `ProductI { "productCode": "PRD_TEST_001", "productName": "Chicken", - "categoryName": "Meat", + "categoryId": "a2696b9e-2277-11f1-b4c6-00163e0c7c4f", "productImageUrl": "https://example.com/img.png", - "state": true + "state": true, + "locationIds": [ + "11111111-1111-1111-1111-111111111111", + "22222222-2222-2222-2222-222222222222" + ] } ``` +字段说明: +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `productCode` | string | 是 | 产品编码 | +| `productName` | string | 是 | 产品名称 | +| `categoryId` | string \| null | 否 | 产品分类 Id(`fl_product_category.id`) | +| `productImageUrl` | string \| null | 否 | 主图 URL | +| `state` | bool | 否 | 默认 `true` | +| **`locationIds`** | `string[]` \| **省略** | 否 | **可选。** 有该字段时:在同一事务内按列表批量写入 **`fl_location_product`**(**每个门店 Id 一行**,即「一产品一门店一条关联」)。**请求体中省略该字段**时:本接口不写门店关联,仍可通过 **§7 Product-Location** 维护。传空数组 `[]` 表示新建产品后不绑定任何门店。 | + 校验: -- `productCode/productName` 不能为空 +- `productCode` / `productName` 不能为空 - `productCode` 不能与未删除的数据重复 +- 若传入 **`locationIds`** 且含非空项:每个 Id 须为合法 Guid,且对应门店存在于 **`Location`** 主数据且未删除;否则返回友好错误(如「门店Id格式不正确」「门店不存在」) ### 6.4 编辑产品 @@ -599,7 +618,13 @@ ADD UNIQUE KEY `uk_fl_ltpd_template_product_label_type` (`TemplateId`, `ProductI 入参: - Path:`id` 为当前产品Id(`fl_product.Id`) -- Body:字段同新增(`ProductUpdateInputVo`) +- Body:字段同新增(`ProductUpdateInputVo`,继承 `ProductCreateInputVo`) + +**`locationIds` 行为(与新增不同,请注意):** +- **请求体中省略 `locationIds` 属性**:不修改 **`fl_location_product`**(仅更新 `fl_product` 主表字段;兼容原「先 PUT 产品再调 §7 同步门店」的调用方式)。 +- **请求体中包含 `locationIds` 属性**(含空数组 `[]`):对该产品的门店关联做 **整表替换**——先删除本产品下全部 **`fl_location_product`** 行,再按列表逐条插入;`[]` 表示解除该产品与所有门店的关联。 + +其它校验同 **§6.3**(含门店存在性校验,当 `locationIds` 含非空项时)。 ### 6.5 删除(逻辑删除) @@ -613,6 +638,7 @@ ADD UNIQUE KEY `uk_fl_ltpd_template_product_label_type` (`TemplateId`, `ProductI 说明: - 关联表:`fl_location_product` +- 也可在 **§6.3 / §6.4** 通过产品 Body 的 **`locationIds`** 一次性维护本产品在各门店的关联(与 §7 写入同一张表);二者可并存,按需选择调用方式。 - 关联按门店进行批量替换: - `Create`:在门店下新增未存在的 product 关联 - `Update`:替换该门店下全部关联(先删后建) diff --git a/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application.Contracts/Dtos/Product/ProductCreateInputVo.cs b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application.Contracts/Dtos/Product/ProductCreateInputVo.cs index 16a4335..3ed7135 100644 --- a/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application.Contracts/Dtos/Product/ProductCreateInputVo.cs +++ b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application.Contracts/Dtos/Product/ProductCreateInputVo.cs @@ -1,3 +1,5 @@ +using System.Collections.Generic; + namespace FoodLabeling.Application.Contracts.Dtos.Product; public class ProductCreateInputVo @@ -11,5 +13,11 @@ public class ProductCreateInputVo public string? ProductImageUrl { get; set; } public bool State { get; set; } = true; + + /// + /// 可选。门店 Id 列表;每个 Id 在 fl_location_product 落一行(同一 fl_product 可对应多门店)。 + /// 不传或空列表则不在本接口写入门店关联(仍可用 product-location 接口维护)。 + /// + public List? LocationIds { get; set; } } diff --git a/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application.Contracts/IServices/IProductAppService.cs b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application.Contracts/IServices/IProductAppService.cs index c0f0cbd..4193329 100644 --- a/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application.Contracts/IServices/IProductAppService.cs +++ b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application.Contracts/IServices/IProductAppService.cs @@ -23,11 +23,18 @@ public interface IProductAppService : IApplicationService /// /// 新增产品 /// + /// + /// 若 有值,将在同一事务内批量写入 fl_location_product(一门店一条)。 + /// Task CreateAsync(ProductCreateInputVo input); /// /// 编辑产品 /// + /// + /// 当请求体包含 属性时,按该列表整表替换本产品在各门店的关联; + /// 不传该属性则不改门店关联(兼容仅改名称/分类等调用)。 + /// Task UpdateAsync(string id, ProductUpdateInputVo input); /// diff --git a/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application/Services/ProductAppService.cs b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application/Services/ProductAppService.cs index 0bd17df..6b04d91 100644 --- a/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application/Services/ProductAppService.cs +++ b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application/Services/ProductAppService.cs @@ -3,6 +3,7 @@ using FoodLabeling.Application.Contracts.Dtos.Common; using FoodLabeling.Application.Contracts.Dtos.Product; using FoodLabeling.Application.Contracts.IServices; using FoodLabeling.Application.Services.DbModels; +using FoodLabeling.Domain.Entities; using SqlSugar; using Volo.Abp; using Volo.Abp.Application.Services; @@ -188,6 +189,13 @@ public class ProductAppService : ApplicationService, IProductAppService }; await _dbContext.SqlSugarClient.Insertable(entity).ExecuteCommandAsync(); + + if (input.LocationIds is not null) + { + var locIds = await NormalizeAndValidateLocationIdsAsync(input.LocationIds); + await ReplaceProductLocationLinksAsync(entity.Id, locIds); + } + return await GetAsync(entity.Id); } @@ -228,6 +236,13 @@ public class ProductAppService : ApplicationService, IProductAppService entity.State = input.State; await _dbContext.SqlSugarClient.Updateable(entity).ExecuteCommandAsync(); + + if (input.LocationIds is not null) + { + var locIds = await NormalizeAndValidateLocationIdsAsync(input.LocationIds); + await ReplaceProductLocationLinksAsync(productId, locIds); + } + return await GetAsync(productId); } @@ -251,6 +266,66 @@ public class ProductAppService : ApplicationService, IProductAppService await _dbContext.SqlSugarClient.Updateable(entity).ExecuteCommandAsync(); } + /// + /// 去重、校验门店 Id 格式与存在性。 + /// + private async Task> NormalizeAndValidateLocationIdsAsync(IEnumerable rawIds) + { + var distinct = rawIds + .Where(x => !string.IsNullOrWhiteSpace(x)) + .Select(x => x.Trim()) + .Distinct(StringComparer.Ordinal) + .ToList(); + + if (distinct.Count == 0) + { + return new List(); + } + + foreach (var id in distinct) + { + if (!Guid.TryParse(id, out _)) + { + throw new UserFriendlyException("门店Id格式不正确"); + } + } + + var guidList = distinct.Select(Guid.Parse).ToList(); + var existCount = await _dbContext.SqlSugarClient.Queryable() + .Where(x => !x.IsDeleted && guidList.Contains(x.Id)) + .CountAsync(); + if (existCount != distinct.Count) + { + throw new UserFriendlyException("门店不存在"); + } + + return distinct; + } + + /// + /// 按产品维度替换 fl_location_product:先删本产品全部关联,再按列表插入(每门店一行)。 + /// + private async Task ReplaceProductLocationLinksAsync(string productId, List locationIds) + { + await _dbContext.SqlSugarClient.Deleteable() + .Where(x => x.ProductId == productId) + .ExecuteCommandAsync(); + + if (locationIds.Count == 0) + { + return; + } + + var rows = locationIds.Select(lid => new FlLocationProductDbEntity + { + Id = _guidGenerator.Create().ToString(), + LocationId = lid, + ProductId = productId + }).ToList(); + + await _dbContext.SqlSugarClient.Insertable(rows).ExecuteCommandAsync(); + } + private static PagedResultWithPageDto BuildPagedResult(int skipCount, int maxResultCount, int total, List items) { var pageSize = maxResultCount <= 0 ? items.Count : maxResultCount; diff --git a/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application/Services/UsAppAuthAppService.cs b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application/Services/UsAppAuthAppService.cs index deacda1..1a8fd09 100644 --- a/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application/Services/UsAppAuthAppService.cs +++ b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application/Services/UsAppAuthAppService.cs @@ -413,16 +413,21 @@ public class UsAppAuthAppService : ApplicationService, IUsAppAuthAppService } /// - /// 按邮箱查找未删除且启用的用户(邮箱比较忽略大小写) + /// 按邮箱或用户名(邮箱形字符串写在 UserName 时)查找未删除且启用的用户;比较忽略大小写,Email 命中优先。 /// private async Task FindActiveUserByEmailAsync(string email) { var normalized = email.Trim().ToLowerInvariant(); var users = await _userRepository._DbQueryable .Where(u => !u.IsDeleted && u.State == true) - .Where(u => u.Email != null && SqlFunc.ToLower(u.Email) == normalized) + .Where(u => + (u.Email != null && SqlFunc.ToLower(u.Email) == normalized) || + SqlFunc.ToLower(u.UserName) == normalized) .ToListAsync(); - return users.FirstOrDefault(); + return users.FirstOrDefault(u => + u.Email != null && + string.Equals(u.Email.Trim(), normalized, StringComparison.OrdinalIgnoreCase)) + ?? users.FirstOrDefault(); } private string CreateAppAccessToken(UserAggregateRoot user) diff --git a/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application.Contracts/IServices/IAccountService.cs b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application.Contracts/IServices/IAccountService.cs index e06151a..e51810e 100644 --- a/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application.Contracts/IServices/IAccountService.cs +++ b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application.Contracts/IServices/IAccountService.cs @@ -14,12 +14,6 @@ namespace Yi.Framework.Rbac.Application.Contracts.IServices Task RestPasswordAsync(Guid userId, RestPasswordDto input); /// - /// 提供其他服务使用,根据用户id,直接返回token - /// - /// - Task PostLoginAsync(Guid userId); - - /// /// 根据信息查询用户,可能为空,代表该用户不存在或禁用 /// /// diff --git a/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/ObjectMapping/RbacMapsterRegister.cs b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/ObjectMapping/RbacMapsterRegister.cs new file mode 100644 index 0000000..bbeeb64 --- /dev/null +++ b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/ObjectMapping/RbacMapsterRegister.cs @@ -0,0 +1,26 @@ +using Mapster; +using Yi.Framework.Rbac.Application.Contracts.Dtos.Menu; +using Yi.Framework.Rbac.Domain.Entities; +using Yi.Framework.Rbac.Domain.Shared; +using Yi.Framework.Rbac.Domain.Shared.Dtos; + +namespace Yi.Framework.Rbac.Application.ObjectMapping; + +/// +/// Menu.ParentId 实体为字符串,对外 DTO 仍为 。 +/// +public class RbacMapsterRegister : IRegister +{ + public void Register(TypeAdapterConfig config) + { + config.NewConfig() + .Map(d => d.ParentId, s => MenuParentIdConverter.ToGuid(s.ParentId)); + + config.NewConfig() + .Map(d => d.ParentId, s => MenuParentIdConverter.ToGuid(s.ParentId)); + + // 登录组装用户信息时使用;库中 ParentId 可能为 "0",不能交给 Mapster 默认 string→Guid + config.NewConfig() + .Map(d => d.ParentId, s => MenuParentIdConverter.ToGuid(s.ParentId)); + } +} diff --git a/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/AccountService.cs b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/AccountService.cs index efbdc4c..2b58f5a 100644 --- a/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/AccountService.cs +++ b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/AccountService.cs @@ -115,11 +115,17 @@ namespace Yi.Framework.Rbac.Application.Services ValidationImageCaptcha(input.Uuid,input.Code); var normalized = email.ToLowerInvariant(); + // 平台登录框为「邮箱」:优先按 Email 匹配;若历史账号仅把邮箱形字符串写在 UserName、Email 为空,则按 UserName 匹配。 var candidates = await _userRepository._DbQueryable .Where(u => !u.IsDeleted && u.State == true) - .Where(u => u.Email != null && SqlFunc.ToLower(u.Email) == normalized) + .Where(u => + (u.Email != null && SqlFunc.ToLower(u.Email) == normalized) || + SqlFunc.ToLower(u.UserName) == normalized) .ToListAsync(); - var user = candidates.FirstOrDefault(); + var user = candidates.FirstOrDefault(u => + u.Email != null && + string.Equals(u.Email.Trim(), normalized, StringComparison.OrdinalIgnoreCase)) + ?? candidates.FirstOrDefault(); if (user is null) { throw new UserFriendlyException("Sign-in failed: account not found."); diff --git a/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/MenuParentIdConverter.cs b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/MenuParentIdConverter.cs new file mode 100644 index 0000000..77f2a96 --- /dev/null +++ b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/MenuParentIdConverter.cs @@ -0,0 +1,26 @@ +namespace Yi.Framework.Rbac.Domain.Shared; + +/// +/// Menu.ParentId 在部分库中为 varchar(如根节点为 0),与 ORM 中 Guid 映射不一致时会导致 SqlSugar 绑定失败;统一用字符串落库并在需要时转为 。 +/// +public static class MenuParentIdConverter +{ + public static bool IsRoot(string? raw) => + string.IsNullOrWhiteSpace(raw) || + raw.Trim() == "0" || + string.Equals(raw.Trim(), Guid.Empty.ToString(), StringComparison.OrdinalIgnoreCase); + + public static Guid ToGuid(string? raw) + { + if (IsRoot(raw)) + { + return Guid.Empty; + } + + var t = raw!.Trim(); + return Guid.TryParse(t, out var g) ? g : Guid.Empty; + } + + /// 写入数据库:根节点与历史库对齐为 0,否则为标准 GUID 字符串。 + public static string FromGuid(Guid g) => g == Guid.Empty ? "0" : g.ToString("D"); +} diff --git a/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Entities/MenuAggregateRoot.cs b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Entities/MenuAggregateRoot.cs index 9ede281..9604c9b 100644 --- a/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Entities/MenuAggregateRoot.cs +++ b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Entities/MenuAggregateRoot.cs @@ -1,4 +1,4 @@ -using System.Text.RegularExpressions; +using System.Text.RegularExpressions; using System.Web; using NUglify.Helpers; using SqlSugar; @@ -7,6 +7,7 @@ using Volo.Abp.Auditing; using Volo.Abp.Domain.Entities; using Yi.Framework.Core.Data; using Yi.Framework.Core.Helper; +using Yi.Framework.Rbac.Domain.Shared; using Yi.Framework.Rbac.Domain.Shared.Dtos; using Yi.Framework.Rbac.Domain.Shared.Enums; @@ -25,13 +26,13 @@ namespace Yi.Framework.Rbac.Domain.Entities public MenuAggregateRoot(Guid id) { Id = id; - ParentId = Guid.Empty; + ParentId = MenuParentIdConverter.FromGuid(Guid.Empty); } public MenuAggregateRoot(Guid id, Guid parentId) { Id = id; - ParentId = parentId; + ParentId = MenuParentIdConverter.FromGuid(parentId); } /// @@ -100,8 +101,9 @@ namespace Yi.Framework.Rbac.Domain.Entities /// /// /// + /// 父级菜单 Id;库中多为 varchar(如根为 0 或 GUID 文本)。 [SugarColumn(ColumnName = "ParentId")] - public Guid ParentId { get; set; } + public string ParentId { get; set; } = "0"; /// /// 菜单图标 @@ -183,7 +185,7 @@ namespace Yi.Framework.Rbac.Domain.Entities r.OrderNum = m.OrderNum; var routerName = m.Router?.Split("/").LastOrDefault(); r.Id = m.Id; - r.ParentId = m.ParentId; + r.ParentId = MenuParentIdConverter.ToGuid(m.ParentId); //开头大写 r.Name = routerName?.First().ToString().ToUpper() + routerName?.Substring(1); @@ -197,7 +199,7 @@ namespace Yi.Framework.Rbac.Domain.Entities r.AlwaysShow = true; //判断是否为最顶层的路由 - if (Guid.Empty == m.ParentId) + if (MenuParentIdConverter.IsRoot(m.ParentId)) { r.Component = "Layout"; } @@ -250,7 +252,7 @@ namespace Yi.Framework.Rbac.Domain.Entities var r = new Vue3RouterDto(); r.OrderNum = m.OrderNum; r.Id = m.Id; - r.ParentId = m.ParentId; + r.ParentId = MenuParentIdConverter.ToGuid(m.ParentId); r.Hidden = !m.IsShow; // 检测是否为 URL 链接(http:// 或 https:// 开头) @@ -359,7 +361,7 @@ namespace Yi.Framework.Rbac.Domain.Entities r.AlwaysShow = false; // 判断是否为最顶层的路由 - if (Guid.Empty == m.ParentId) + if (MenuParentIdConverter.IsRoot(m.ParentId)) { r.Component = "Layout"; } @@ -385,7 +387,7 @@ namespace Yi.Framework.Rbac.Domain.Entities r.AlwaysShow = true; // 判断是否为最顶层的路由 - if (Guid.Empty == m.ParentId) + if (MenuParentIdConverter.IsRoot(m.ParentId)) { r.Component = "Layout"; } @@ -449,7 +451,7 @@ namespace Yi.Framework.Rbac.Domain.Entities }, Children =null, Id = m.Id, - ParentId = m.ParentId + ParentId = MenuParentIdConverter.ToGuid(m.ParentId) }) .ToList(); @@ -487,7 +489,7 @@ namespace Yi.Framework.Rbac.Domain.Entities var treeDto = new MenuTreeDto { Id = m.Id, - ParentId = m.ParentId, + ParentId = MenuParentIdConverter.ToGuid(m.ParentId), OrderNum = m.OrderNum, MenuName = m.MenuName, MenuType = m.MenuType, diff --git a/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Managers/AccountManager.cs b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Managers/AccountManager.cs index f2b393e..1a9193b 100644 --- a/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Managers/AccountManager.cs +++ b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Managers/AccountManager.cs @@ -1,4 +1,4 @@ -using System.IdentityModel.Tokens.Jwt; +using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; using Mapster; @@ -77,10 +77,8 @@ namespace Yi.Framework.Rbac.Domain.Managers { throw new UserFriendlyException(UserConst.No_Role); } - if (!userInfo.PermissionCodes.Any()) - { - throw new UserFriendlyException(UserConst.No_Permission); - } + + // 菜单表 PermissionCode 可未落库;当前以角色及角色-菜单绑定为准,不要求 PermissionCodes 非空 if (getUserInfo is not null) { diff --git a/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Managers/UserManager.cs b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Managers/UserManager.cs index cb05705..d826efa 100644 --- a/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Managers/UserManager.cs +++ b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Managers/UserManager.cs @@ -1,4 +1,4 @@ -using System.Text.RegularExpressions; +using System.Text.RegularExpressions; using Mapster; using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.DependencyInjection; @@ -10,6 +10,7 @@ using Volo.Abp.EventBus.Local; using Volo.Abp.Guids; using Yi.Framework.Rbac.Domain.Entities; using Yi.Framework.Rbac.Domain.Repositories; +using Yi.Framework.Rbac.Domain.Shared; using Yi.Framework.Rbac.Domain.Shared.Caches; using Yi.Framework.Rbac.Domain.Shared.Consts; using Yi.Framework.Rbac.Domain.Shared.Dtos; diff --git a/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.SqlSugarCore/DataSeeds/MenuPureDataSeed.cs b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.SqlSugarCore/DataSeeds/MenuPureDataSeed.cs index 3eaf7d6..7365854 100644 --- a/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.SqlSugarCore/DataSeeds/MenuPureDataSeed.cs +++ b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.SqlSugarCore/DataSeeds/MenuPureDataSeed.cs @@ -87,7 +87,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Router = "/system/user/index", MenuIcon = "ri:admin-line", OrderNum = 100, - ParentId = system.Id, + ParentId = system.Id.ToString(), RouterName = "SystemUser" }; entities.Add(user); @@ -99,7 +99,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:user:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = user.Id, + ParentId = user.Id.ToString(), IsDeleted = false }; entities.Add(userQuery); @@ -111,7 +111,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:user:add", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = user.Id, + ParentId = user.Id.ToString(), IsDeleted = false }; entities.Add(userAdd); @@ -123,7 +123,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:user:edit", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = user.Id, + ParentId = user.Id.ToString(), IsDeleted = false }; entities.Add(userEdit); @@ -135,7 +135,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:user:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = user.Id, + ParentId = user.Id.ToString(), IsDeleted = false }; entities.Add(userRemove); @@ -148,7 +148,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:user:resetPwd", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = user.Id, + ParentId = user.Id.ToString(), IsDeleted = false }; entities.Add(userResetPwd); @@ -164,7 +164,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Router = "/system/role/index", MenuIcon = "ri:admin-fill", OrderNum = 99, - ParentId = system.Id, + ParentId = system.Id.ToString(), RouterName = "SystemRole" }; entities.Add(role); @@ -176,7 +176,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:role:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = role.Id, + ParentId = role.Id.ToString(), IsDeleted = false }; entities.Add(roleQuery); @@ -188,7 +188,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:role:add", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = role.Id, + ParentId = role.Id.ToString(), IsDeleted = false }; entities.Add(roleAdd); @@ -200,7 +200,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:role:edit", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = role.Id, + ParentId = role.Id.ToString(), IsDeleted = false }; entities.Add(roleEdit); @@ -212,7 +212,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:role:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = role.Id, + ParentId = role.Id.ToString(), IsDeleted = false }; entities.Add(roleRemove); @@ -228,7 +228,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Router = "/system/menu/index", MenuIcon = "ep:menu", OrderNum = 98, - ParentId = system.Id, + ParentId = system.Id.ToString(), RouterName = "SystemMenu" }; entities.Add(menu); @@ -240,7 +240,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:menu:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = menu.Id, + ParentId = menu.Id.ToString(), IsDeleted = false }; entities.Add(menuQuery); @@ -252,7 +252,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:menu:add", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = menu.Id, + ParentId = menu.Id.ToString(), IsDeleted = false }; entities.Add(menuAdd); @@ -264,7 +264,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:menu:edit", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = menu.Id, + ParentId = menu.Id.ToString(), IsDeleted = false }; entities.Add(menuEdit); @@ -276,7 +276,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:menu:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = menu.Id, + ParentId = menu.Id.ToString(), IsDeleted = false }; entities.Add(menuRemove); @@ -291,7 +291,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Router = "/system/dept/index", MenuIcon = "ri:git-branch-line", OrderNum = 97, - ParentId = system.Id, + ParentId = system.Id.ToString(), RouterName = "SystemDept" }; entities.Add(dept); @@ -303,7 +303,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:dept:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = dept.Id, + ParentId = dept.Id.ToString(), IsDeleted = false }; entities.Add(deptQuery); @@ -315,7 +315,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:dept:add", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = dept.Id, + ParentId = dept.Id.ToString(), IsDeleted = false }; entities.Add(deptAdd); @@ -327,7 +327,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:dept:edit", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = dept.Id, + ParentId = dept.Id.ToString(), IsDeleted = false }; entities.Add(deptEdit); @@ -339,7 +339,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:dept:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = dept.Id, + ParentId = dept.Id.ToString(), IsDeleted = false }; entities.Add(deptRemove); @@ -356,7 +356,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Router = "/system/post/index", MenuIcon = "ant-design:deployment-unit-outlined", OrderNum = 96, - ParentId = system.Id, + ParentId = system.Id.ToString(), RouterName = "SystemPost" }; entities.Add(post); @@ -368,7 +368,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:post:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = post.Id, + ParentId = post.Id.ToString(), IsDeleted = false }; entities.Add(postQuery); @@ -380,7 +380,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:post:add", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = post.Id, + ParentId = post.Id.ToString(), IsDeleted = false }; entities.Add(postAdd); @@ -392,7 +392,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:post:edit", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = post.Id, + ParentId = post.Id.ToString(), IsDeleted = false }; entities.Add(postEdit); @@ -404,7 +404,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:post:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = post.Id, + ParentId = post.Id.ToString(), IsDeleted = false }; entities.Add(postRemove); @@ -420,7 +420,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Router = "/monitor/operation-logs", MenuIcon = "ri:history-fill", OrderNum = 100, - ParentId = monitoring.Id, + ParentId = monitoring.Id.ToString(), RouterName = "OperationLog", Component = "monitor/logs/operation/index" }; @@ -433,7 +433,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "monitor:operlog:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = operationLog.Id, + ParentId = operationLog.Id.ToString(), IsDeleted = false }; entities.Add(operationLogQuery); @@ -445,7 +445,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "monitor:operlog:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = operationLog.Id, + ParentId = operationLog.Id.ToString(), IsDeleted = false }; entities.Add(operationLogRemove); @@ -465,7 +465,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Component = "monitor/logs/login/index", MenuIcon = "ri:window-line", OrderNum = 100, - ParentId = monitoring.Id, + ParentId = monitoring.Id.ToString(), RouterName = "LoginLog", }; entities.Add(loginLog); @@ -477,7 +477,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "monitor:logininfor:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = loginLog.Id, + ParentId = loginLog.Id.ToString(), IsDeleted = false }; entities.Add(loginLogQuery); @@ -489,7 +489,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "monitor:logininfor:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = loginLog.Id, + ParentId = loginLog.Id.ToString(), IsDeleted = false, }; @@ -509,7 +509,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Component = "/system/config/index", MenuIcon = "ri:edit-box-line", OrderNum = 94, - ParentId = system.Id, + ParentId = system.Id.ToString(), IsDeleted = false }; entities.Add(config); @@ -521,7 +521,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:config:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = config.Id, + ParentId = config.Id.ToString(), IsDeleted = false }; entities.Add(configQuery); @@ -533,7 +533,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:config:add", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = config.Id, + ParentId = config.Id.ToString(), IsDeleted = false }; entities.Add(configAdd); @@ -545,7 +545,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:config:edit", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = config.Id, + ParentId = config.Id.ToString(), IsDeleted = false }; entities.Add(configEdit); @@ -557,7 +557,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:config:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = config.Id, + ParentId = config.Id.ToString(), IsDeleted = false }; entities.Add(configRemove); diff --git a/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.SqlSugarCore/DataSeeds/MenuRuoYiDataSeed.cs b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.SqlSugarCore/DataSeeds/MenuRuoYiDataSeed.cs index f00d25c..eb024b2 100644 --- a/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.SqlSugarCore/DataSeeds/MenuRuoYiDataSeed.cs +++ b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.SqlSugarCore/DataSeeds/MenuRuoYiDataSeed.cs @@ -88,7 +88,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Component = "code/field/index", MenuIcon = "number", OrderNum = 99, - ParentId = code.Id, + ParentId = code.Id.ToString(), IsDeleted = false }; entities.Add(field); @@ -599,7 +599,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Component = "system/tenant/index", MenuIcon = "list", OrderNum = 101, - ParentId = system.Id, + ParentId = system.Id.ToString(), IsDeleted = false }; entities.Add(tenant); @@ -611,7 +611,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:tenant:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = tenant.Id, + ParentId = tenant.Id.ToString(), IsDeleted = false }; entities.Add(tenantQuery); @@ -623,7 +623,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:tenant:add", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = tenant.Id, + ParentId = tenant.Id.ToString(), IsDeleted = false }; entities.Add(tenantAdd); @@ -635,7 +635,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:tenant:edit", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = tenant.Id, + ParentId = tenant.Id.ToString(), IsDeleted = false }; entities.Add(tenantEdit); @@ -647,7 +647,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:tenant:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = tenant.Id, + ParentId = tenant.Id.ToString(), IsDeleted = false }; entities.Add(tenantRemove); @@ -677,7 +677,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Component = "system/user/index", MenuIcon = "user", OrderNum = 100, - ParentId = system.Id, + ParentId = system.Id.ToString(), IsDeleted = false }; entities.Add(user); @@ -689,7 +689,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:user:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = user.Id, + ParentId = user.Id.ToString(), IsDeleted = false }; entities.Add(userQuery); @@ -701,7 +701,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:user:add", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = user.Id, + ParentId = user.Id.ToString(), IsDeleted = false }; entities.Add(userAdd); @@ -713,7 +713,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:user:edit", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = user.Id, + ParentId = user.Id.ToString(), IsDeleted = false }; entities.Add(userEdit); @@ -725,7 +725,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:user:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = user.Id, + ParentId = user.Id.ToString(), IsDeleted = false }; entities.Add(userRemove); @@ -738,7 +738,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:user:resetPwd", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = user.Id, + ParentId = user.Id.ToString(), IsDeleted = false }; entities.Add(userResetPwd); @@ -758,7 +758,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Component = "system/role/index", MenuIcon = "peoples", OrderNum = 99, - ParentId = system.Id, + ParentId = system.Id.ToString(), IsDeleted = false }; entities.Add(role); @@ -770,7 +770,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:role:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = role.Id, + ParentId = role.Id.ToString(), IsDeleted = false }; entities.Add(roleQuery); @@ -782,7 +782,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:role:add", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = role.Id, + ParentId = role.Id.ToString(), IsDeleted = false }; entities.Add(roleAdd); @@ -794,7 +794,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:role:edit", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = role.Id, + ParentId = role.Id.ToString(), IsDeleted = false }; entities.Add(roleEdit); @@ -806,7 +806,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:role:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = role.Id, + ParentId = role.Id.ToString(), IsDeleted = false }; entities.Add(roleRemove); @@ -826,7 +826,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Component = "system/menu/index", MenuIcon = "tree-table", OrderNum = 98, - ParentId = system.Id, + ParentId = system.Id.ToString(), IsDeleted = false }; entities.Add(menu); @@ -838,7 +838,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:menu:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = menu.Id, + ParentId = menu.Id.ToString(), IsDeleted = false }; entities.Add(menuQuery); @@ -850,7 +850,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:menu:add", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = menu.Id, + ParentId = menu.Id.ToString(), IsDeleted = false }; entities.Add(menuAdd); @@ -862,7 +862,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:menu:edit", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = menu.Id, + ParentId = menu.Id.ToString(), IsDeleted = false }; entities.Add(menuEdit); @@ -874,7 +874,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:menu:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = menu.Id, + ParentId = menu.Id.ToString(), IsDeleted = false }; entities.Add(menuRemove); @@ -893,7 +893,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Component = "system/dept/index", MenuIcon = "tree", OrderNum = 97, - ParentId = system.Id, + ParentId = system.Id.ToString(), IsDeleted = false }; entities.Add(dept); @@ -905,7 +905,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:dept:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = dept.Id, + ParentId = dept.Id.ToString(), IsDeleted = false }; entities.Add(deptQuery); @@ -917,7 +917,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:dept:add", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = dept.Id, + ParentId = dept.Id.ToString(), IsDeleted = false }; entities.Add(deptAdd); @@ -929,7 +929,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:dept:edit", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = dept.Id, + ParentId = dept.Id.ToString(), IsDeleted = false }; entities.Add(deptEdit); @@ -941,7 +941,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:dept:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = dept.Id, + ParentId = dept.Id.ToString(), IsDeleted = false }; entities.Add(deptRemove); @@ -962,7 +962,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Component = "system/post/index", MenuIcon = "post", OrderNum = 96, - ParentId = system.Id, + ParentId = system.Id.ToString(), IsDeleted = false }; entities.Add(post); @@ -974,7 +974,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:post:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = post.Id, + ParentId = post.Id.ToString(), IsDeleted = false }; entities.Add(postQuery); @@ -986,7 +986,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:post:add", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = post.Id, + ParentId = post.Id.ToString(), IsDeleted = false }; entities.Add(postAdd); @@ -998,7 +998,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:post:edit", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = post.Id, + ParentId = post.Id.ToString(), IsDeleted = false }; entities.Add(postEdit); @@ -1010,7 +1010,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:post:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = post.Id, + ParentId = post.Id.ToString(), IsDeleted = false }; entities.Add(postRemove); @@ -1029,7 +1029,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Component = "system/dict/index", MenuIcon = "dict", OrderNum = 95, - ParentId = system.Id, + ParentId = system.Id.ToString(), IsDeleted = false }; entities.Add(dict); @@ -1041,7 +1041,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:dict:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = dict.Id, + ParentId = dict.Id.ToString(), IsDeleted = false }; entities.Add(dictQuery); @@ -1053,7 +1053,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:dict:add", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = dict.Id, + ParentId = dict.Id.ToString(), IsDeleted = false }; entities.Add(dictAdd); @@ -1065,7 +1065,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:dict:edit", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = dict.Id, + ParentId = dict.Id.ToString(), IsDeleted = false }; entities.Add(dictEdit); @@ -1077,7 +1077,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:dict:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = dict.Id, + ParentId = dict.Id.ToString(), IsDeleted = false }; entities.Add(dictRemove); @@ -1097,7 +1097,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Component = "system/config/index", MenuIcon = "edit", OrderNum = 94, - ParentId = system.Id, + ParentId = system.Id.ToString(), IsDeleted = false }; entities.Add(config); @@ -1109,7 +1109,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:config:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = config.Id, + ParentId = config.Id.ToString(), IsDeleted = false }; entities.Add(configQuery); @@ -1121,7 +1121,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:config:add", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = config.Id, + ParentId = config.Id.ToString(), IsDeleted = false }; entities.Add(configAdd); @@ -1133,7 +1133,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:config:edit", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = config.Id, + ParentId = config.Id.ToString(), IsDeleted = false }; entities.Add(configEdit); @@ -1145,7 +1145,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:config:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = config.Id, + ParentId = config.Id.ToString(), IsDeleted = false }; entities.Add(configRemove); @@ -1167,7 +1167,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Component = "system/notice/index", MenuIcon = "message", OrderNum = 93, - ParentId = system.Id, + ParentId = system.Id.ToString(), IsDeleted = false }; entities.Add(notice); @@ -1179,7 +1179,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:notice:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = notice.Id, + ParentId = notice.Id.ToString(), IsDeleted = false }; entities.Add(noticeQuery); @@ -1191,7 +1191,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:notice:add", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = notice.Id, + ParentId = notice.Id.ToString(), IsDeleted = false }; entities.Add(noticeAdd); @@ -1203,7 +1203,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:notice:edit", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = notice.Id, + ParentId = notice.Id.ToString(), IsDeleted = false }; entities.Add(noticeEdit); @@ -1215,7 +1215,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:notice:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = notice.Id, + ParentId = notice.Id.ToString(), IsDeleted = false }; entities.Add(noticeRemove); @@ -1233,7 +1233,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds IsLink = false, MenuIcon = "log", OrderNum = 92, - ParentId = system.Id, + ParentId = system.Id.ToString(), IsDeleted = false }; entities.Add(log); @@ -1252,7 +1252,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Component = "monitor/operlog/index", MenuIcon = "form", OrderNum = 100, - ParentId = log.Id, + ParentId = log.Id.ToString(), IsDeleted = false }; entities.Add(operationLog); @@ -1264,7 +1264,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "monitor:operlog:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = operationLog.Id, + ParentId = operationLog.Id.ToString(), IsDeleted = false }; entities.Add(operationLogQuery); @@ -1276,7 +1276,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "monitor:operlog:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = operationLog.Id, + ParentId = operationLog.Id.ToString(), IsDeleted = false }; entities.Add(operationLogRemove); @@ -1296,7 +1296,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Component = "monitor/logininfor/index", MenuIcon = "logininfor", OrderNum = 100, - ParentId = log.Id, + ParentId = log.Id.ToString(), IsDeleted = false }; entities.Add(loginLog); @@ -1308,7 +1308,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "monitor:logininfor:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = loginLog.Id, + ParentId = loginLog.Id.ToString(), IsDeleted = false }; entities.Add(loginLogQuery); @@ -1320,7 +1320,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "monitor:logininfor:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = loginLog.Id, + ParentId = loginLog.Id.ToString(), IsDeleted = false }; entities.Add(loginLogRemove); diff --git a/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.SqlSugarCore/DataSeeds/MenuVben5DataSeed.cs b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.SqlSugarCore/DataSeeds/MenuVben5DataSeed.cs index f6437dd..7db6b19 100644 --- a/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.SqlSugarCore/DataSeeds/MenuVben5DataSeed.cs +++ b/美国版/Food Labeling Management Code/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.SqlSugarCore/DataSeeds/MenuVben5DataSeed.cs @@ -1,4 +1,4 @@ -using Volo.Abp.Data; +using Volo.Abp.Data; using Volo.Abp.DependencyInjection; using Volo.Abp.Guids; using Yi.Framework.Rbac.Domain.Entities; @@ -88,7 +88,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds // Component = "code/field/index", // MenuIcon = "tabler:file-code", // OrderNum = 99, - // ParentId = code.Id, + // ParentId = code.Id.ToString(), // IsDeleted = false // }; // entities.Add(field); @@ -251,7 +251,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Component = "system/tenant/index", MenuIcon = "tabler:users", OrderNum = 101, - ParentId = system.Id, + ParentId = system.Id.ToString(), IsDeleted = false }; entities.Add(tenant); @@ -263,7 +263,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:tenant:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = tenant.Id, + ParentId = tenant.Id.ToString(), IsDeleted = false }; entities.Add(tenantQuery); @@ -275,7 +275,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:tenant:add", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = tenant.Id, + ParentId = tenant.Id.ToString(), IsDeleted = false }; entities.Add(tenantAdd); @@ -287,7 +287,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:tenant:edit", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = tenant.Id, + ParentId = tenant.Id.ToString(), IsDeleted = false }; entities.Add(tenantEdit); @@ -299,7 +299,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:tenant:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = tenant.Id, + ParentId = tenant.Id.ToString(), IsDeleted = false }; entities.Add(tenantRemove); @@ -318,7 +318,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Component = "system/user/index", MenuIcon = "tabler:user", OrderNum = 100, - ParentId = system.Id, + ParentId = system.Id.ToString(), IsDeleted = false }; entities.Add(user); @@ -330,7 +330,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:user:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = user.Id, + ParentId = user.Id.ToString(), IsDeleted = false }; entities.Add(userQuery); @@ -342,7 +342,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:user:add", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = user.Id, + ParentId = user.Id.ToString(), IsDeleted = false }; entities.Add(userAdd); @@ -354,7 +354,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:user:edit", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = user.Id, + ParentId = user.Id.ToString(), IsDeleted = false }; entities.Add(userEdit); @@ -366,7 +366,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:user:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = user.Id, + ParentId = user.Id.ToString(), IsDeleted = false }; entities.Add(userRemove); @@ -379,7 +379,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:user:resetPwd", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = user.Id, + ParentId = user.Id.ToString(), IsDeleted = false }; entities.Add(userResetPwd); @@ -399,7 +399,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Component = "system/role/index", MenuIcon = "eos-icons:role-binding-outlined", OrderNum = 99, - ParentId = system.Id, + ParentId = system.Id.ToString(), IsDeleted = false }; entities.Add(role); @@ -411,7 +411,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:role:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = role.Id, + ParentId = role.Id.ToString(), IsDeleted = false }; entities.Add(roleQuery); @@ -423,7 +423,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:role:add", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = role.Id, + ParentId = role.Id.ToString(), IsDeleted = false }; entities.Add(roleAdd); @@ -435,7 +435,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:role:edit", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = role.Id, + ParentId = role.Id.ToString(), IsDeleted = false }; entities.Add(roleEdit); @@ -447,7 +447,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:role:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = role.Id, + ParentId = role.Id.ToString(), IsDeleted = false }; entities.Add(roleRemove); @@ -466,7 +466,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds MenuIcon = "tabler:user-shield", OrderNum = 15, IsDeleted = false, - ParentId = system.Id + ParentId = system.Id.ToString() }; entities.Add(roleAuthUser); @@ -485,7 +485,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Component = "system/menu/index", MenuIcon = "ic:sharp-menu", OrderNum = 98, - ParentId = system.Id, + ParentId = system.Id.ToString(), IsDeleted = false }; entities.Add(menu); @@ -497,7 +497,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:menu:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = menu.Id, + ParentId = menu.Id.ToString(), IsDeleted = false }; entities.Add(menuQuery); @@ -509,7 +509,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:menu:add", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = menu.Id, + ParentId = menu.Id.ToString(), IsDeleted = false }; entities.Add(menuAdd); @@ -521,7 +521,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:menu:edit", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = menu.Id, + ParentId = menu.Id.ToString(), IsDeleted = false }; entities.Add(menuEdit); @@ -533,7 +533,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:menu:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = menu.Id, + ParentId = menu.Id.ToString(), IsDeleted = false }; entities.Add(menuRemove); @@ -552,7 +552,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Component = "system/dept/index", MenuIcon = "mingcute:department-line", OrderNum = 97, - ParentId = system.Id, + ParentId = system.Id.ToString(), IsDeleted = false }; entities.Add(dept); @@ -564,7 +564,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:dept:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = dept.Id, + ParentId = dept.Id.ToString(), IsDeleted = false }; entities.Add(deptQuery); @@ -576,7 +576,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:dept:add", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = dept.Id, + ParentId = dept.Id.ToString(), IsDeleted = false }; entities.Add(deptAdd); @@ -588,7 +588,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:dept:edit", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = dept.Id, + ParentId = dept.Id.ToString(), IsDeleted = false }; entities.Add(deptEdit); @@ -600,7 +600,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:dept:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = dept.Id, + ParentId = dept.Id.ToString(), IsDeleted = false }; entities.Add(deptRemove); @@ -621,7 +621,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Component = "system/post/index", MenuIcon = "tabler:user-star", OrderNum = 96, - ParentId = system.Id, + ParentId = system.Id.ToString(), IsDeleted = false }; entities.Add(post); @@ -633,7 +633,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:post:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = post.Id, + ParentId = post.Id.ToString(), IsDeleted = false }; entities.Add(postQuery); @@ -645,7 +645,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:post:add", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = post.Id, + ParentId = post.Id.ToString(), IsDeleted = false }; entities.Add(postAdd); @@ -657,7 +657,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:post:edit", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = post.Id, + ParentId = post.Id.ToString(), IsDeleted = false }; entities.Add(postEdit); @@ -669,7 +669,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:post:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = post.Id, + ParentId = post.Id.ToString(), IsDeleted = false }; entities.Add(postRemove); @@ -688,7 +688,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Component = "system/dict/index", MenuIcon = "fluent-mdl2:dictionary", OrderNum = 95, - ParentId = system.Id, + ParentId = system.Id.ToString(), IsDeleted = false }; entities.Add(dict); @@ -700,7 +700,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:dict:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = dict.Id, + ParentId = dict.Id.ToString(), IsDeleted = false }; entities.Add(dictQuery); @@ -712,7 +712,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:dict:add", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = dict.Id, + ParentId = dict.Id.ToString(), IsDeleted = false }; entities.Add(dictAdd); @@ -724,7 +724,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:dict:edit", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = dict.Id, + ParentId = dict.Id.ToString(), IsDeleted = false }; entities.Add(dictEdit); @@ -736,7 +736,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:dict:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = dict.Id, + ParentId = dict.Id.ToString(), IsDeleted = false }; entities.Add(dictRemove); @@ -756,7 +756,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Component = "system/config/index", MenuIcon = "ant-design:setting-outlined", OrderNum = 94, - ParentId = system.Id, + ParentId = system.Id.ToString(), IsDeleted = false }; entities.Add(config); @@ -768,7 +768,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:config:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = config.Id, + ParentId = config.Id.ToString(), IsDeleted = false }; entities.Add(configQuery); @@ -780,7 +780,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:config:add", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = config.Id, + ParentId = config.Id.ToString(), IsDeleted = false }; entities.Add(configAdd); @@ -792,7 +792,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:config:edit", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = config.Id, + ParentId = config.Id.ToString(), IsDeleted = false }; entities.Add(configEdit); @@ -804,7 +804,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:config:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = config.Id, + ParentId = config.Id.ToString(), IsDeleted = false }; entities.Add(configRemove); @@ -826,7 +826,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Component = "system/notice/index", MenuIcon = "fe:notice-push", OrderNum = 93, - ParentId = system.Id, + ParentId = system.Id.ToString(), IsDeleted = false }; entities.Add(notice); @@ -838,7 +838,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:notice:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = notice.Id, + ParentId = notice.Id.ToString(), IsDeleted = false }; entities.Add(noticeQuery); @@ -850,7 +850,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:notice:add", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = notice.Id, + ParentId = notice.Id.ToString(), IsDeleted = false }; entities.Add(noticeAdd); @@ -862,7 +862,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:notice:edit", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = notice.Id, + ParentId = notice.Id.ToString(), IsDeleted = false }; entities.Add(noticeEdit); @@ -874,7 +874,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "system:notice:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = notice.Id, + ParentId = notice.Id.ToString(), IsDeleted = false }; entities.Add(noticeRemove); @@ -892,7 +892,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds IsLink = false, MenuIcon = "material-symbols:logo-dev-outline", OrderNum = 92, - ParentId = system.Id, + ParentId = system.Id.ToString(), IsDeleted = false }; entities.Add(log); @@ -911,7 +911,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Component = "monitor/operlog/index", MenuIcon = "tabler:align-box-right-middle", OrderNum = 100, - ParentId = log.Id, + ParentId = log.Id.ToString(), IsDeleted = false }; entities.Add(operationLog); @@ -923,7 +923,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "monitor:operlog:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = operationLog.Id, + ParentId = operationLog.Id.ToString(), IsDeleted = false }; entities.Add(operationLogQuery); @@ -935,7 +935,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "monitor:operlog:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = operationLog.Id, + ParentId = operationLog.Id.ToString(), IsDeleted = false }; entities.Add(operationLogRemove); @@ -955,7 +955,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds Component = "monitor/logininfor/index", MenuIcon = "tabler:align-box-right-middle", OrderNum = 100, - ParentId = log.Id, + ParentId = log.Id.ToString(), IsDeleted = false }; entities.Add(loginLog); @@ -967,7 +967,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "monitor:logininfor:query", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = loginLog.Id, + ParentId = loginLog.Id.ToString(), IsDeleted = false }; entities.Add(loginLogQuery); @@ -979,7 +979,7 @@ namespace Yi.Framework.Rbac.SqlSugarCore.DataSeeds PermissionCode = "monitor:logininfor:remove", MenuType = MenuTypeEnum.Component, OrderNum = 100, - ParentId = loginLog.Id, + ParentId = loginLog.Id.ToString(), IsDeleted = false }; entities.Add(loginLogRemove); diff --git a/美国版/Food Labeling Management Platform/src/components/products/ProductsView.tsx b/美国版/Food Labeling Management Platform/src/components/products/ProductsView.tsx index 4bb8dcb..a8493c5 100755 --- a/美国版/Food Labeling Management Platform/src/components/products/ProductsView.tsx +++ b/美国版/Food Labeling Management Platform/src/components/products/ProductsView.tsx @@ -68,6 +68,7 @@ import type { LocationDto } from "../../types/location"; import type { ProductDto, ProductCreateInput, ProductUpdateInput } from "../../types/product"; import type { ProductCategoryDto, ProductCategoryCreateInput } from "../../types/productCategory"; import { SearchableSelect } from "../ui/searchable-select"; +import { SearchableMultiSelect } from "../ui/searchable-multi-select"; import { Pagination, PaginationContent, @@ -101,24 +102,36 @@ async function buildProductLocationMap(signal?: AbortSignal): Promise { const prev = [...new Set(previousLocationIds.filter(Boolean))]; - for (const locId of prev) { - if (locId === newLocationId) continue; - const current = await getProductIdsByLocation(locId); - if (current.includes(productId)) { + const next = [...new Set(newLocationIds.map((x) => x.trim()).filter(Boolean))]; + const nextSet = new Set(next); + const prevSet = new Set(prev); + + const removals = prev.filter((locId) => !nextSet.has(locId)); + await Promise.all( + removals.map(async (locId) => { + const current = await getProductIdsByLocation(locId); + if (!current.includes(productId)) return; await updateProductLocation(locId, { productIds: current.filter((x) => x !== productId), }); - } - } - if (newLocationId.trim()) { - await createProductLocation({ locationId: newLocationId, productIds: [productId] }); - } + }), + ); + + const additions = next.filter((locId) => !prevSet.has(locId)); + await Promise.all( + additions.map((locId) => + createProductLocation({ locationId: locId, productIds: [productId] }), + ), + ); } export function ProductsView() { @@ -966,7 +979,7 @@ function ProductFormDialog({ const [categoryId, setCategoryId] = useState(""); const [productImageUrl, setProductImageUrl] = useState(""); const [state, setState] = useState(true); - const [locationId, setLocationId] = useState(""); + const [locationIds, setLocationIds] = useState([]); useEffect(() => { if (!open) return; @@ -977,14 +990,14 @@ function ProductFormDialog({ setProductImageUrl(editing.productImageUrl ?? ""); setState(editing.state !== false); const lids = locationMap.get(editing.id) ?? []; - setLocationId(lids[0] ?? ""); + setLocationIds([...new Set(lids.filter(Boolean))]); } else { setProductCode(""); setProductName(""); setCategoryId(""); setProductImageUrl(""); setState(true); - setLocationId(""); + setLocationIds([]); } }, [open, editing, locationMap]); @@ -993,8 +1006,9 @@ function ProductFormDialog({ toast.error("Validation", { description: "Product code and name are required." }); return; } - if (!locationId.trim()) { - toast.error("Validation", { description: "Select a store to bind this product." }); + const storeIds = [...new Set(locationIds.map((x) => x.trim()).filter(Boolean))]; + if (storeIds.length === 0) { + toast.error("Validation", { description: "Select at least one store to bind this product." }); return; } @@ -1011,10 +1025,14 @@ function ProductFormDialog({ if (editing) { await updateProduct(editing.id, body as ProductUpdateInput); const prev = locationMap.get(editing.id) ?? []; - await syncProductStoreBinding(editing.id, locationId.trim(), prev); + await syncProductStoreBinding(editing.id, storeIds, prev); } else { const created = await createProduct(body); - await createProductLocation({ locationId: locationId.trim(), productIds: [created.id] }); + await Promise.all( + storeIds.map((locId) => + createProductLocation({ locationId: locId, productIds: [created.id] }), + ), + ); } toast.success(editing ? "Product updated." : "Product created."); onSaved(); @@ -1033,7 +1051,9 @@ function ProductFormDialog({ {editing ? "Edit Product" : "Add New Product"} - {editing ? "Update product and store binding." : "Create a product and bind it to a store."} + {editing + ? "Update product and store bindings (one row per product–store pair)." + : "Create a product and bind it to one or more stores (one row per pair)."} @@ -1080,12 +1100,12 @@ function ProductFormDialog({ />
- - Bind to store(s) * + diff --git a/项目相关文档/本次新增与优化接口汇总.md b/项目相关文档/本次新增与优化接口汇总.md index 5d7b960..fece249 100644 --- a/项目相关文档/本次新增与优化接口汇总.md +++ b/项目相关文档/本次新增与优化接口汇总.md @@ -7,6 +7,7 @@ > - App `labeling-tree`:L1 标签分类返回 `buttonAppearance` > - Web 管理端 `auth-session`:**当前用户菜单与权限**、**退出登录**(食品标签-美国版模块) > - Web `rbac-menu` 列表/详情:补充返回 `routerName`、`router` +> - 产品 **Products**:`POST/PUT /api/app/product` 支持可选 Body 字段 **`locationIds`**(多门店批量绑定 / 编辑时整表替换关联),详见 `项目相关文档/标签模块接口对接说明.md` **§6** > > 其余标签打印相关接口不在本文范围内。 diff --git a/项目相关文档/标签模块接口对接说明.md b/项目相关文档/标签模块接口对接说明.md index 9c36c2f..6cb7c8d 100644 --- a/项目相关文档/标签模块接口对接说明.md +++ b/项目相关文档/标签模块接口对接说明.md @@ -574,6 +574,10 @@ ADD UNIQUE KEY `uk_fl_ltpd_template_product_label_type` (`TemplateId`, `ProductI 入参: - `id`:产品Id(`fl_product.Id`) +返回(`ProductGetOutputDto`,与实现一致的主要字段): +- `id`、`productCode`、`productName`、`categoryId`、`categoryName`、`productImageUrl`、`state` +- **`locationIds`**:`string[]`,该产品在 **`fl_location_product`** 中绑定的门店 Id(去重);无关联时为空数组 + ### 6.3 新增产品 方法:`POST /api/app/product` @@ -583,15 +587,30 @@ ADD UNIQUE KEY `uk_fl_ltpd_template_product_label_type` (`TemplateId`, `ProductI { "productCode": "PRD_TEST_001", "productName": "Chicken", - "categoryName": "Meat", + "categoryId": "a2696b9e-2277-11f1-b4c6-00163e0c7c4f", "productImageUrl": "https://example.com/img.png", - "state": true + "state": true, + "locationIds": [ + "11111111-1111-1111-1111-111111111111", + "22222222-2222-2222-2222-222222222222" + ] } ``` +字段说明: +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| `productCode` | string | 是 | 产品编码 | +| `productName` | string | 是 | 产品名称 | +| `categoryId` | string \| null | 否 | 产品分类 Id(`fl_product_category.id`) | +| `productImageUrl` | string \| null | 否 | 主图 URL | +| `state` | bool | 否 | 默认 `true` | +| **`locationIds`** | `string[]` \| **省略** | 否 | **可选。** 有该字段时:在同一事务内按列表批量写入 **`fl_location_product`**(**每个门店 Id 一行**,即「一产品一门店一条关联」)。**请求体中省略该字段**时:本接口不写门店关联,仍可通过 **§7 Product-Location** 维护。传空数组 `[]` 表示新建产品后不绑定任何门店。 | + 校验: -- `productCode/productName` 不能为空 +- `productCode` / `productName` 不能为空 - `productCode` 不能与未删除的数据重复 +- 若传入 **`locationIds`** 且含非空项:每个 Id 须为合法 Guid,且对应门店存在于 **`Location`** 主数据且未删除;否则返回友好错误(如「门店Id格式不正确」「门店不存在」) ### 6.4 编辑产品 @@ -599,7 +618,13 @@ ADD UNIQUE KEY `uk_fl_ltpd_template_product_label_type` (`TemplateId`, `ProductI 入参: - Path:`id` 为当前产品Id(`fl_product.Id`) -- Body:字段同新增(`ProductUpdateInputVo`) +- Body:字段同新增(`ProductUpdateInputVo`,继承 `ProductCreateInputVo`) + +**`locationIds` 行为(与新增不同,请注意):** +- **请求体中省略 `locationIds` 属性**:不修改 **`fl_location_product`**(仅更新 `fl_product` 主表字段;兼容原「先 PUT 产品再调 §7 同步门店」的调用方式)。 +- **请求体中包含 `locationIds` 属性**(含空数组 `[]`):对该产品的门店关联做 **整表替换**——先删除本产品下全部 **`fl_location_product`** 行,再按列表逐条插入;`[]` 表示解除该产品与所有门店的关联。 + +其它校验同 **§6.3**(含门店存在性校验,当 `locationIds` 含非空项时)。 ### 6.5 删除(逻辑删除) @@ -613,6 +638,7 @@ ADD UNIQUE KEY `uk_fl_ltpd_template_product_label_type` (`TemplateId`, `ProductI 说明: - 关联表:`fl_location_product` +- 也可在 **§6.3 / §6.4** 通过产品 Body 的 **`locationIds`** 一次性维护本产品在各门店的关联(与 §7 写入同一张表);二者可并存,按需选择调用方式。 - 关联按门店进行批量替换: - `Create`:在门店下新增未存在的 product 关联 - `Update`:替换该门店下全部关联(先删后建) -- libgit2 0.21.4