From 71d0c92a63f1e26c6ba9634413083de1acaf916c Mon Sep 17 00:00:00 2001 From: sunpengfei <i@angelzzz.com> Date: 星期三, 06 八月 2025 11:18:29 +0800 Subject: [PATCH] feat:数据字典类别开发 --- FlexJobApi.Core/Utils/ConsulUtils/ConsulApplicationComponent.cs | 57 FlexJobApi.Core/Utils/DbUtils/PagedListQuery.cs | 2 FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs | 252 ++- FlexJobApi.Core/Utils/ResourceUtils/ResourceModel.cs | 24 FlexJobApi.Core/Utils/DbUtils/SaveDataCommand.cs | 8 FlexJobApi.Core/Utils/EnumUtils/EnumUtils.cs | 16 FlexJobApi.Database.Migrations/Migrations/20250806024717_UpdateResource0806.cs | 130 + FlexJobApi.Core/Models/User/Roles/Queries/GetRolesQuery.cs | 2 FlexJobApi.Core/Entities/Users/Role.cs | 2 FlexJobApi.Core/Utils/DbUtils/DbUtils.cs | 118 + FlexJobApi.Core/Models/Main/Dictionaries/Commands/DeleteDictionaryCategoryCommand.cs | 2 FlexJobApi.Core/Entities/Common/DictionaryData.cs | 2 FlexJobApi.Core/Models/Main/Dictionaries/Commands/SaveDictionaryCategoryCommand.cs | 4 FlexJobApi.Core/Utils/DbUtils/SelectQuery.cs | 39 FlexJobApi.Core/FlexJobApi.Core.xml | 377 +++- FlexJobApi.Database.Migrations/Migrations/20250806024717_UpdateResource0806.Designer.cs | 2231 +++++++++++++++++++++++++++++++++ FlexJobApi.Core/Utils/ConsulUtils/ConsulServiceComponent.cs | 23 FlexJobApi.Database.Migrations/REDEME.MD | 2 FlexJobApi.Application/Dictionaries/Commands/DictionaryDataCommandHandler.cs | 46 FlexJobApi.Application/Dictionaries/Queries/DictionaryCategoriesQueryHandler.cs | 72 + FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryCategorySelectQuery.cs | 17 FlexJobApi.User.Application/FlexJobApi.User.Application.xml | 25 FlexJobApi.Core/Models/Main/Dictionaries/Commands/SaveDictionaryDataCommand.cs | 4 FlexJobApi.Core/settings.json | 7 FlexJobApi.Core/Utils/ResourceUtils/ResourceServiceAttribute.cs | 5 FlexJobApi.Core/Entities/Common/Resource.cs | 42 FlexJobApi.Core/Enums/Common/EnumResourceService.cs | 4 FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryCategoriesQuery.cs | 7 FlexJobApi.User.Application/UserInfos/Commands/UserInfoCommandHandler.cs | 14 FlexJobApi.Application/Dictionaries/Queries/DictionaryDatasQueryHandler.cs | 54 FlexJobApi.Core/Entities/Users/Department.cs | 2 FlexJobApi.Application/FlexJobApi.Application.xml | 81 FlexJobApi.Core/Entities/Users/Menu.cs | 2 FlexJobApi.Core/Interfaces/IIsDisabled.cs | 19 FlexJobApi.Core/Models/User/UserInfos/Queries/GetOperationUserInfosQuery.cs | 2 /dev/null | 50 FlexJobApi.Core/Models/User/Enterprises/Queries/GetEnterprisesQuery.cs | 2 FlexJobApi.User.Application/UserInfos/Queries/GetOperationUserInfosQueryHandler.cs | 32 FlexJobApi.Core/FlexJobApiCoreStartup.cs | 12 FlexJobApi.User.Application/Roles/Queries/GetRolesQueryHandler.cs | 35 FlexJobApi.Core/Models/Main/Dictionaries/Commands/SetDictionaryDataIsDisabledCommand.cs | 17 FlexJobApi.Application/Dictionaries/Commands/DictionaryCategoryCommandHandler.cs | 42 FlexJobApi.Core/Utils/DbUtils/SetIsDisabledCommand.cs | 27 FlexJobApi.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs | 33 FlexJobApi.Core/FlexJobApi.Core.csproj | 1 FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryDatasQuery.cs | 8 46 files changed, 3,605 insertions(+), 348 deletions(-) diff --git a/FlexJobApi.Application/Dictionaries/Commands/DeleteDictionaryCategoryCommandHandler.cs b/FlexJobApi.Application/Dictionaries/Commands/DeleteDictionaryCategoryCommandHandler.cs deleted file mode 100644 index a430922..0000000 --- a/FlexJobApi.Application/Dictionaries/Commands/DeleteDictionaryCategoryCommandHandler.cs +++ /dev/null @@ -1,21 +0,0 @@ -锘縰sing FlexJobApi.Core; -using MediatR; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FlexJobApi.Application -{ - /// <summary> - /// 鍒犻櫎瀛楀吀绫诲埆 - /// </summary> - public class DeleteDictionaryCategoryCommandHandler : IRequestHandler<DeleteDictionaryCategoryCommand, int> - { - public async Task<int> Handle(DeleteDictionaryCategoryCommand request, CancellationToken cancellationToken) - { - return await DbUtils.DeleteData<DictionaryCategory>(request, null, cancellationToken); - } - } -} diff --git a/FlexJobApi.Application/Dictionaries/Commands/DictionaryCategoryCommandHandler.cs b/FlexJobApi.Application/Dictionaries/Commands/DictionaryCategoryCommandHandler.cs new file mode 100644 index 0000000..ec0ca8a --- /dev/null +++ b/FlexJobApi.Application/Dictionaries/Commands/DictionaryCategoryCommandHandler.cs @@ -0,0 +1,42 @@ +锘縰sing FlexJobApi.Core; +using MediatR; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FlexJobApi.Application +{ + /// <summary> + /// 瀛楀吀绫诲埆鍛戒护澶勭悊鍣� + /// </summary> + public class DictionaryCategoryCommandHandler : + IRequestHandler<DeleteDictionaryCategoryCommand, int>, + IRequestHandler<SaveDictionaryCategoryCommand, Guid> + { + /// <summary> + /// 鍒犻櫎鏁版嵁瀛楀吀绫诲埆 + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public Task<int> Handle(DeleteDictionaryCategoryCommand request, CancellationToken cancellationToken) + { + return DbUtils.DeleteData<DictionaryCategory>(request, null, cancellationToken); + } + + /// <summary> + /// 淇濆瓨鏁版嵁瀛楀吀绫诲埆 + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public Task<Guid> Handle(SaveDictionaryCategoryCommand request, CancellationToken cancellationToken) + { + return request.SaveData<DictionaryCategory, SaveDictionaryCategoryCommand>( + (q, e, r) => q.Any(it => it.Id != request.Id && it.Code == request.Code), + cancellationToken); + } + } +} diff --git a/FlexJobApi.Application/Dictionaries/Commands/DictionaryDataCommandHandler.cs b/FlexJobApi.Application/Dictionaries/Commands/DictionaryDataCommandHandler.cs new file mode 100644 index 0000000..a480570 --- /dev/null +++ b/FlexJobApi.Application/Dictionaries/Commands/DictionaryDataCommandHandler.cs @@ -0,0 +1,46 @@ +锘縰sing FlexJobApi.Core; +using MediatR; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FlexJobApi.Application +{ + /// <summary> + /// 鏁版嵁瀛楀吀鍛戒护澶勭悊鍣� + /// </summary> + public class DictionaryDataCommandHandler : + IRequestHandler<SaveDictionaryDataCommand, Guid>, + IRequestHandler<SetDictionaryDataIsDisabledCommand, int> + + { + /// <summary> + /// 淇濆瓨鏁版嵁瀛楀吀 + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public Task<Guid> Handle(SaveDictionaryDataCommand request, CancellationToken cancellationToken) + { + return request.SaveData<DictionaryData, SaveDictionaryDataCommand>( + (q, e, r) => q.Any(it => + it.CategoryId == request.CategoryId + && it.ParentId == request.ParentId + && it.Code == request.Code + && it.Content == request.Content), cancellationToken); + } + + /// <summary> + /// 璁剧疆鏁版嵁瀛楀吀鏄惁绂佺敤 + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public Task<int> Handle(SetDictionaryDataIsDisabledCommand request, CancellationToken cancellationToken) + { + return request.SetIsDisable<DictionaryData>(cancellationToken: cancellationToken); + } + } +} diff --git a/FlexJobApi.Application/Dictionaries/Commands/SaveDictionaryCategoryCommandHandler.cs b/FlexJobApi.Application/Dictionaries/Commands/SaveDictionaryCategoryCommandHandler.cs deleted file mode 100644 index 2e85eb0..0000000 --- a/FlexJobApi.Application/Dictionaries/Commands/SaveDictionaryCategoryCommandHandler.cs +++ /dev/null @@ -1,24 +0,0 @@ -锘縰sing FlexJobApi.Core; -using MediatR; -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FlexJobApi.Application -{ - /// <summary> - /// 淇濆瓨瀛楀吀绫诲埆 - /// </summary> - public class SaveDictionaryCategoryCommandHandler : IRequestHandler<SaveDictionaryCategoryCommand, Guid> - { - public Task<Guid> Handle(SaveDictionaryCategoryCommand request, CancellationToken cancellationToken) - { - return request.SaveData<DictionaryCategory, SaveDictionaryCategoryCommand>( - (q, e, r) => q.Any(it => it.Id != request.Id && it.Code == request.Code), - cancellationToken); - } - } -} diff --git a/FlexJobApi.Application/Dictionaries/Commands/SaveDictionaryDataCommandHandler.cs b/FlexJobApi.Application/Dictionaries/Commands/SaveDictionaryDataCommandHandler.cs deleted file mode 100644 index 6fc0fe4..0000000 --- a/FlexJobApi.Application/Dictionaries/Commands/SaveDictionaryDataCommandHandler.cs +++ /dev/null @@ -1,26 +0,0 @@ -锘縰sing FlexJobApi.Core; -using MediatR; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FlexJobApi.Application -{ - /// <summary> - /// 淇濆瓨瀛楀吀鏁版嵁 - /// </summary> - public class SaveDictionaryDataCommandHandler : IRequestHandler<SaveDictionaryDataCommand, Guid> - { - public Task<Guid> Handle(SaveDictionaryDataCommand request, CancellationToken cancellationToken) - { - return request.SaveData<DictionaryData, SaveDictionaryDataCommand>( - (q, e, r) => q.Any(it => - it.CategoryId == request.CategoryId - && it.ParentId == request.ParentId - && it.Code == request.Code - && it.Content == request.Content), cancellationToken); - } - } -} diff --git a/FlexJobApi.Application/Dictionaries/Commands/SetDictionaryDataIsDisabledCommandHandler.cs b/FlexJobApi.Application/Dictionaries/Commands/SetDictionaryDataIsDisabledCommandHandler.cs deleted file mode 100644 index 56b9506..0000000 --- a/FlexJobApi.Application/Dictionaries/Commands/SetDictionaryDataIsDisabledCommandHandler.cs +++ /dev/null @@ -1,34 +0,0 @@ -锘縰sing FlexJobApi.Core; -using Furion.DatabaseAccessor; -using MediatR; -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FlexJobApi.Application -{ - /// <summary> - /// 璁剧疆瀛楀吀鏁版嵁鏄惁绂佺敤 - /// </summary> - public class SetDictionaryDataIsDisabledCommandHandler( - IRepository<DictionaryData> rep - ) : IRequestHandler<SetDictionaryDataIsDisabledCommand, int> - { - private readonly IRepository<DictionaryData> rep = rep; - - public async Task<int> Handle(SetDictionaryDataIsDisabledCommand request, CancellationToken cancellationToken) - { - var entities = await rep.AsQueryable() - .Where(it => request.Ids.Contains(it.Id) && it.IsDisabled != request.IsDisabled) - .ToListAsync(); - foreach (var entity in entities) - { - entity.IsDisabled = request.IsDisabled; - } - return entities.Count; - } - } -} diff --git a/FlexJobApi.Application/Dictionaries/Queries/DictionaryCategoriesQueryHandler.cs b/FlexJobApi.Application/Dictionaries/Queries/DictionaryCategoriesQueryHandler.cs new file mode 100644 index 0000000..79d4f86 --- /dev/null +++ b/FlexJobApi.Application/Dictionaries/Queries/DictionaryCategoriesQueryHandler.cs @@ -0,0 +1,72 @@ +锘縰sing FlexJobApi.Core; +using Furion.DatabaseAccessor; +using Mapster; +using MediatR; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FlexJobApi.Application +{ + /// <summary> + /// 鏁版嵁瀛楀吀绫诲埆鏌ヨ澶勭悊鍣� + /// </summary> + public class DictionaryCategoriesQueryHandler( + IRepository<DictionaryCategory> rep + ) : IRequestHandler<GetDictionaryCategoriesQuery, PagedListQueryResult<GetDictionaryCategoriesQueryResultItem>>, + IRequestHandler<GetDictionaryCategorySelectQuery, List<SelectQueryResultItem<Guid>>> + { + private readonly IRepository<DictionaryCategory> rep = rep; + + /// <summary> + /// 鏌ヨ鏁版嵁瀛楀吀绫诲埆鍒嗛〉鍒楄〃鏁版嵁 + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public Task<PagedListQueryResult<GetDictionaryCategoriesQueryResultItem>> Handle(GetDictionaryCategoriesQuery request, CancellationToken cancellationToken) + { + return request.PageModel.ToPagedListAsync<DictionaryCategory, GetDictionaryCategoriesQueryResultItem>( + q => + { + q = q.OrderBy(it => it.Sort).ThenBy(it => it.CreatedTime); + if (request.Keywords.IsNotNull()) + { + q = q.Where(it => + it.Code.Contains(request.Keywords) || + it.Name.Contains(request.Keywords) || + it.Remark.Contains(request.Keywords)); + } + return q; + }, cancellationToken: cancellationToken); + } + + /// <summary> + /// 鏌ヨ鏁版嵁瀛楀吀绫诲埆閫夋嫨鍣ㄦ暟鎹� + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public Task<List<SelectQueryResultItem<Guid>>> Handle(GetDictionaryCategorySelectQuery request, CancellationToken cancellationToken) + { + var items = rep.AsQueryable().AsNoTracking() + .Select(it => new SelectQueryResultItem<Guid> + { + Value = it.Id, + Label = it.Name, + Data = new + { + it.Id, + it.Name, + it.Remark, + it.FieldNames + } + }) + .ToListAsync(cancellationToken); + return items; + } + } +} diff --git a/FlexJobApi.Application/Dictionaries/Queries/DictionaryDatasQueryHandler.cs b/FlexJobApi.Application/Dictionaries/Queries/DictionaryDatasQueryHandler.cs new file mode 100644 index 0000000..aedfaf2 --- /dev/null +++ b/FlexJobApi.Application/Dictionaries/Queries/DictionaryDatasQueryHandler.cs @@ -0,0 +1,54 @@ +锘縰sing FlexJobApi.Core; +using Furion.DatabaseAccessor; +using Mapster; +using MediatR; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FlexJobApi.Application +{ + /// <summary> + /// 鏁版嵁瀛楀吀鏌ヨ澶勭悊鍣� + /// </summary> + public class DictionaryDatasQueryHandler( + IRepository<DictionaryData> rep + ) : IRequestHandler<GetDictionaryDatasQuery, PagedListQueryResult<GetDictionaryDatasQueryResultItem>> + { + private readonly IRepository<DictionaryData> rep = rep; + + /// <summary> + /// 鑾峰彇鏁版嵁瀛楀吀鍒嗛〉鍒楄〃鏁版嵁 + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public Task<PagedListQueryResult<GetDictionaryDatasQueryResultItem>> Handle(GetDictionaryDatasQuery request, CancellationToken cancellationToken) + { + return request.PageModel.ToPagedListAsync<DictionaryData, GetDictionaryDatasQueryResultItem>( + q => + { + q = q.OrderBy(it => it.Sort).ThenBy(it => it.CreatedTime); + if (request.CategoryId.HasValue) + { + q = q.Where(it => it.CategoryId == request.CategoryId); + } + if (request.Keywords.IsNotNull()) + { + q = q.Where(it => + it.Code.Contains(request.Keywords) + || it.Content.Contains(request.Keywords) + || it.Field1.Contains(request.Keywords) + || it.Field2.Contains(request.Keywords) + || it.Field3.Contains(request.Keywords) + || it.Field4.Contains(request.Keywords) + || it.Field5.Contains(request.Keywords)); + } + return q; + }, cancellationToken: cancellationToken); + } + } +} diff --git a/FlexJobApi.Application/Dictionaries/Queries/GetDictionaryCategoriesQueryHandler.cs b/FlexJobApi.Application/Dictionaries/Queries/GetDictionaryCategoriesQueryHandler.cs deleted file mode 100644 index 814b83b..0000000 --- a/FlexJobApi.Application/Dictionaries/Queries/GetDictionaryCategoriesQueryHandler.cs +++ /dev/null @@ -1,41 +0,0 @@ -锘縰sing FlexJobApi.Core; -using Furion.DatabaseAccessor; -using Mapster; -using MediatR; -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FlexJobApi.Application -{ - /// <summary> - /// 鏌ヨ瀛楀吀绫诲埆鍒嗛〉鍒楄〃鏁版嵁 - /// </summary> - public class GetDictionaryCategoriesQueryHandler( - IRepository<DictionaryCategory> rep - ) : IRequestHandler<GetDictionaryCategoriesQuery, PagedListQueryResult<GetDictionaryCategoriesQueryResultItem>> - { - private readonly IRepository<DictionaryCategory> rep = rep; - - public async Task<PagedListQueryResult<GetDictionaryCategoriesQueryResultItem>> Handle(GetDictionaryCategoriesQuery request, CancellationToken cancellationToken) - { - var q = rep.AsQueryable().AsNoTracking() - .OrderBy(it => it.Sort).ThenBy(it => it.CreatedTime) - .AsQueryable(); - if (request.Keywords.IsNotNull()) - { - q = q.Where(it => - it.Code.Contains(request.Keywords) || - it.Name.Contains(request.Keywords) || - it.Remark.Contains(request.Keywords)); - } - var result = await q - .ProjectToType<GetDictionaryCategoriesQueryResultItem>() - .ToPagedListAsync(request.PageModel, cancellationToken); - return result; - } - } -} diff --git a/FlexJobApi.Application/Dictionaries/Queries/GetDictionaryDatasQueryHandler.cs b/FlexJobApi.Application/Dictionaries/Queries/GetDictionaryDatasQueryHandler.cs deleted file mode 100644 index 0d0b8ca..0000000 --- a/FlexJobApi.Application/Dictionaries/Queries/GetDictionaryDatasQueryHandler.cs +++ /dev/null @@ -1,45 +0,0 @@ -锘縰sing FlexJobApi.Core; -using Furion.DatabaseAccessor; -using Mapster; -using MediatR; -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FlexJobApi.Application -{ - /// <summary> - /// 鑾峰彇瀛楀吀鏁版嵁鍒嗛〉鍒楄〃 - /// </summary> - public class GetDictionaryDatasQueryHandler( - IRepository<DictionaryData> rep - ) : IRequestHandler<GetDictionaryDatasQuery, PagedListQueryResult<GetDictionaryDatasQueryResultItem>> - { - private readonly IRepository<DictionaryData> rep = rep; - - public async Task<PagedListQueryResult<GetDictionaryDatasQueryResultItem>> Handle(GetDictionaryDatasQuery request, CancellationToken cancellationToken) - { - var q = rep.AsQueryable().AsNoTracking() - .OrderBy(it => it.Sort).ThenByDescending(it => it.CreatedTime) - .Where(it => it.CategoryId == request.CategoryId); - if (request.Keywords.IsNotNull()) - { - q = q.Where(it => - it.Code.Contains(request.Keywords) - || it.Content.Contains(request.Keywords) - || it.Field1.Contains(request.Keywords) - || it.Field2.Contains(request.Keywords) - || it.Field3.Contains(request.Keywords) - || it.Field4.Contains(request.Keywords) - || it.Field5.Contains(request.Keywords)); - } - var result = await q - .ProjectToType<GetDictionaryDatasQueryResultItem>() - .ToPagedListAsync(request.PageModel, cancellationToken); - return result; - } - } -} diff --git a/FlexJobApi.Application/FlexJobApi.Application.xml b/FlexJobApi.Application/FlexJobApi.Application.xml index f671789..f6795e1 100644 --- a/FlexJobApi.Application/FlexJobApi.Application.xml +++ b/FlexJobApi.Application/FlexJobApi.Application.xml @@ -4,50 +4,83 @@ <name>FlexJobApi.Application</name> </assembly> <members> - <member name="T:FlexJobApi.Application.DeleteDictionaryCategoryCommandHandler"> + <member name="T:FlexJobApi.Application.DictionaryCategoryCommandHandler"> <summary> - 鍒犻櫎瀛楀吀绫诲埆 + 瀛楀吀绫诲埆鍛戒护澶勭悊鍣� </summary> </member> - <member name="T:FlexJobApi.Application.SaveDictionaryCategoryCommandHandler"> + <member name="M:FlexJobApi.Application.DictionaryCategoryCommandHandler.Handle(FlexJobApi.Core.DeleteDictionaryCategoryCommand,System.Threading.CancellationToken)"> <summary> - 淇濆瓨瀛楀吀绫诲埆 + 鍒犻櫎鏁版嵁瀛楀吀绫诲埆 + </summary> + <param name="request"></param> + <param name="cancellationToken"></param> + <returns></returns> + </member> + <member name="M:FlexJobApi.Application.DictionaryCategoryCommandHandler.Handle(FlexJobApi.Core.SaveDictionaryCategoryCommand,System.Threading.CancellationToken)"> + <summary> + 淇濆瓨鏁版嵁瀛楀吀绫诲埆 + </summary> + <param name="request"></param> + <param name="cancellationToken"></param> + <returns></returns> + </member> + <member name="T:FlexJobApi.Application.DictionaryDataCommandHandler"> + <summary> + 鏁版嵁瀛楀吀鍛戒护澶勭悊鍣� </summary> </member> - <member name="T:FlexJobApi.Application.SaveDictionaryDataCommandHandler"> + <member name="M:FlexJobApi.Application.DictionaryDataCommandHandler.Handle(FlexJobApi.Core.SaveDictionaryDataCommand,System.Threading.CancellationToken)"> <summary> - 淇濆瓨瀛楀吀鏁版嵁 + 淇濆瓨鏁版嵁瀛楀吀 + </summary> + <param name="request"></param> + <param name="cancellationToken"></param> + <returns></returns> + </member> + <member name="M:FlexJobApi.Application.DictionaryDataCommandHandler.Handle(FlexJobApi.Core.SetDictionaryDataIsDisabledCommand,System.Threading.CancellationToken)"> + <summary> + 璁剧疆鏁版嵁瀛楀吀鏄惁绂佺敤 + </summary> + <param name="request"></param> + <param name="cancellationToken"></param> + <returns></returns> + </member> + <member name="T:FlexJobApi.Application.DictionaryCategoriesQueryHandler"> + <summary> + 鏁版嵁瀛楀吀绫诲埆鏌ヨ澶勭悊鍣� </summary> </member> - <member name="T:FlexJobApi.Application.SetDictionaryDataIsDisabledCommandHandler"> + <member name="M:FlexJobApi.Application.DictionaryCategoriesQueryHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.DictionaryCategory})"> <summary> - 璁剧疆瀛楀吀鏁版嵁鏄惁绂佺敤 + 鏁版嵁瀛楀吀绫诲埆鏌ヨ澶勭悊鍣� </summary> </member> - <member name="M:FlexJobApi.Application.SetDictionaryDataIsDisabledCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.DictionaryData})"> + <member name="M:FlexJobApi.Application.DictionaryCategoriesQueryHandler.Handle(FlexJobApi.Core.GetDictionaryCategoriesQuery,System.Threading.CancellationToken)"> <summary> - 璁剧疆瀛楀吀鏁版嵁鏄惁绂佺敤 + 鏌ヨ鏁版嵁瀛楀吀绫诲埆鍒嗛〉鍒楄〃鏁版嵁 + </summary> + <param name="request"></param> + <param name="cancellationToken"></param> + <returns></returns> + </member> + <member name="T:FlexJobApi.Application.DictionaryDatasQueryHandler"> + <summary> + 鏁版嵁瀛楀吀鏌ヨ澶勭悊鍣� </summary> </member> - <member name="T:FlexJobApi.Application.GetDictionaryCategoriesQueryHandler"> + <member name="M:FlexJobApi.Application.DictionaryDatasQueryHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.DictionaryData})"> <summary> - 鏌ヨ瀛楀吀绫诲埆鍒嗛〉鍒楄〃鏁版嵁 + 鏁版嵁瀛楀吀鏌ヨ澶勭悊鍣� </summary> </member> - <member name="M:FlexJobApi.Application.GetDictionaryCategoriesQueryHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.DictionaryCategory})"> + <member name="M:FlexJobApi.Application.DictionaryDatasQueryHandler.Handle(FlexJobApi.Core.GetDictionaryDatasQuery,System.Threading.CancellationToken)"> <summary> - 鏌ヨ瀛楀吀绫诲埆鍒嗛〉鍒楄〃鏁版嵁 + 鑾峰彇鏁版嵁瀛楀吀鍒嗛〉鍒楄〃鏁版嵁 </summary> - </member> - <member name="T:FlexJobApi.Application.GetDictionaryDatasQueryHandler"> - <summary> - 鑾峰彇瀛楀吀鏁版嵁鍒嗛〉鍒楄〃 - </summary> - </member> - <member name="M:FlexJobApi.Application.GetDictionaryDatasQueryHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.DictionaryData})"> - <summary> - 鑾峰彇瀛楀吀鏁版嵁鍒嗛〉鍒楄〃 - </summary> + <param name="request"></param> + <param name="cancellationToken"></param> + <returns></returns> </member> </members> </doc> diff --git a/FlexJobApi.Core/Entities/Common/DictionaryData.cs b/FlexJobApi.Core/Entities/Common/DictionaryData.cs index 1e3bb31..a89e7d8 100644 --- a/FlexJobApi.Core/Entities/Common/DictionaryData.cs +++ b/FlexJobApi.Core/Entities/Common/DictionaryData.cs @@ -13,7 +13,7 @@ /// <summary> /// 瀛楀吀鏁版嵁 /// </summary> - public class DictionaryData : CommonEntity, IEntityTypeBuilder<DictionaryData> + public class DictionaryData : CommonEntity, IEntityTypeBuilder<DictionaryData>, IIsDisabled { public DictionaryData() { diff --git a/FlexJobApi.Core/Entities/Common/Resource.cs b/FlexJobApi.Core/Entities/Common/Resource.cs index 2756c99..8e4354c 100644 --- a/FlexJobApi.Core/Entities/Common/Resource.cs +++ b/FlexJobApi.Core/Entities/Common/Resource.cs @@ -13,16 +13,44 @@ public class Resource : CommonEntity, IDbAuditLogIgnore { /// <summary> + /// 搴旂敤鍚嶇О + /// </summary> + public string ApplicationName { get; set; } + + /// <summary> + /// 鍔ㄦ�佺▼搴忛泦鍚嶇О + /// </summary> + public string DynamicAssemblyName { get; set; } + + /// <summary> + /// 鏈嶅姟 + /// </summary> + public EnumResourceService Service { get; set; } + + /// <summary> + /// 鏈嶅姟鍚嶇О + /// </summary> + public string ServiceName { get; set; } + + /// <summary> /// 鎺у埗鍣� /// </summary> - [Required] public EnumResourceController Controller { get; set; } + + /// <summary> + /// 鎺у埗鍣ㄦ憳瑕� + /// </summary> + public string ControllerSummary { get; set; } /// <summary> /// 濮旀墭鍚嶇О /// </summary> - [Required] public string ActionName { get; set; } + + /// <summary> + /// 濮旀墭鎽樿 + /// </summary> + public string ActionSummary { get; set; } /// <summary> /// 缂栧彿 @@ -37,11 +65,21 @@ public string Name { get; set; } /// <summary> + /// 蹇界暐鏉冮檺 + /// </summary> + public bool AllowAnonymous { get; set; } + + /// <summary> /// 璇锋眰鏂瑰紡 /// </summary> public EnumResourceMethod Method { get; set; } /// <summary> + /// 璺敱鍖哄煙 + /// </summary> + public string RouteArea { get; set; } + + /// <summary> /// 璺敱 /// </summary> [Required] diff --git a/FlexJobApi.Core/Entities/Users/Department.cs b/FlexJobApi.Core/Entities/Users/Department.cs index 31178f4..7a9fdcc 100644 --- a/FlexJobApi.Core/Entities/Users/Department.cs +++ b/FlexJobApi.Core/Entities/Users/Department.cs @@ -13,7 +13,7 @@ /// <summary> /// 閮ㄩ棬 /// </summary> - public class Department : CommonEntity, IEntityTypeBuilder<Department> + public class Department : CommonEntity, IEntityTypeBuilder<Department>, IIsDisabled { public Department() { diff --git a/FlexJobApi.Core/Entities/Users/Menu.cs b/FlexJobApi.Core/Entities/Users/Menu.cs index 6012d3f..fae1628 100644 --- a/FlexJobApi.Core/Entities/Users/Menu.cs +++ b/FlexJobApi.Core/Entities/Users/Menu.cs @@ -13,7 +13,7 @@ /// <summary> /// 鑿滃崟 /// </summary> - public class Menu : CommonEntity, IEntityTypeBuilder<Menu> + public class Menu : CommonEntity, IEntityTypeBuilder<Menu>, IIsDisabled { public Menu() { diff --git a/FlexJobApi.Core/Entities/Users/Role.cs b/FlexJobApi.Core/Entities/Users/Role.cs index 8890d19..af3775f 100644 --- a/FlexJobApi.Core/Entities/Users/Role.cs +++ b/FlexJobApi.Core/Entities/Users/Role.cs @@ -10,7 +10,7 @@ /// <summary> /// 瑙掕壊 /// </summary> - public class Role : CommonEntity + public class Role : CommonEntity, IIsDisabled { public Role() { diff --git a/FlexJobApi.Core/Enums/Common/EnumResourceService.cs b/FlexJobApi.Core/Enums/Common/EnumResourceService.cs index f458e9a..a89a6fe 100644 --- a/FlexJobApi.Core/Enums/Common/EnumResourceService.cs +++ b/FlexJobApi.Core/Enums/Common/EnumResourceService.cs @@ -15,12 +15,12 @@ /// <summary> /// 涓绘湇鍔� /// </summary> - [ResourceService(ApplicationName = "FlexJobApi.Application", RouteArea = "main")] + [ResourceService(ApplicationName = "FlexJobApi.Application", RouteArea = "main", ServiceName = "Local_FlexJobApi")] Main, /// <summary> /// 鐢ㄦ埛鏈嶅姟 /// </summary> - [ResourceService(ApplicationName = "FlexJobApi.User.Application", RouteArea = "user")] + [ResourceService(ApplicationName = "FlexJobApi.User.Application", RouteArea = "user", ServiceName = "Local_FlexJobApi")] User } } diff --git a/FlexJobApi.Core/FlexJobApi.Core.csproj b/FlexJobApi.Core/FlexJobApi.Core.csproj index a658ceb..d1ed9c8 100644 --- a/FlexJobApi.Core/FlexJobApi.Core.csproj +++ b/FlexJobApi.Core/FlexJobApi.Core.csproj @@ -18,6 +18,7 @@ <ItemGroup> <PackageReference Include="aliyun-net-sdk-core" Version="1.5.6" /> + <PackageReference Include="Consul" Version="1.7.14.8" /> <PackageReference Include="Furion" Version="4.9.7.106" /> <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.7.106" /> <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.7.106" /> diff --git a/FlexJobApi.Core/FlexJobApi.Core.xml b/FlexJobApi.Core/FlexJobApi.Core.xml index f941017..17d0d80 100644 --- a/FlexJobApi.Core/FlexJobApi.Core.xml +++ b/FlexJobApi.Core/FlexJobApi.Core.xml @@ -249,14 +249,44 @@ 璧勬簮 </summary> </member> + <member name="P:FlexJobApi.Core.Resource.ApplicationName"> + <summary> + 搴旂敤鍚嶇О + </summary> + </member> + <member name="P:FlexJobApi.Core.Resource.DynamicAssemblyName"> + <summary> + 鍔ㄦ�佺▼搴忛泦鍚嶇О + </summary> + </member> + <member name="P:FlexJobApi.Core.Resource.Service"> + <summary> + 鏈嶅姟 + </summary> + </member> + <member name="P:FlexJobApi.Core.Resource.ServiceName"> + <summary> + 鏈嶅姟鍚嶇О + </summary> + </member> <member name="P:FlexJobApi.Core.Resource.Controller"> <summary> 鎺у埗鍣� </summary> </member> + <member name="P:FlexJobApi.Core.Resource.ControllerSummary"> + <summary> + 鎺у埗鍣ㄦ憳瑕� + </summary> + </member> <member name="P:FlexJobApi.Core.Resource.ActionName"> <summary> 濮旀墭鍚嶇О + </summary> + </member> + <member name="P:FlexJobApi.Core.Resource.ActionSummary"> + <summary> + 濮旀墭鎽樿 </summary> </member> <member name="P:FlexJobApi.Core.Resource.Code"> @@ -269,9 +299,19 @@ 鍚嶇О </summary> </member> + <member name="P:FlexJobApi.Core.Resource.AllowAnonymous"> + <summary> + 蹇界暐鏉冮檺 + </summary> + </member> <member name="P:FlexJobApi.Core.Resource.Method"> <summary> 璇锋眰鏂瑰紡 + </summary> + </member> + <member name="P:FlexJobApi.Core.Resource.RouteArea"> + <summary> + 璺敱鍖哄煙 </summary> </member> <member name="P:FlexJobApi.Core.Resource.Route"> @@ -2074,6 +2114,16 @@ 杩愯惀 </summary> </member> + <member name="T:FlexJobApi.Core.IIsDisabled"> + <summary> + 鏄惁宸茬鐢� + </summary> + </member> + <member name="P:FlexJobApi.Core.IIsDisabled.IsDisabled"> + <summary> + 鏄惁宸茬鐢� + </summary> + </member> <member name="T:FlexJobApi.Core.IPhysicalDeletion"> <summary> 鐗╃悊鍒犻櫎 @@ -2081,12 +2131,12 @@ </member> <member name="T:FlexJobApi.Core.DeleteDictionaryCategoryCommand"> <summary> - 鍒犻櫎瀛楀吀绫诲埆 + 鍒犻櫎鏁版嵁瀛楀吀绫诲埆 </summary> </member> <member name="T:FlexJobApi.Core.SaveDictionaryCategoryCommand"> <summary> - 淇濆瓨瀛楀吀绫诲埆 + 淇濆瓨鏁版嵁瀛楀吀绫诲埆 </summary> </member> <member name="P:FlexJobApi.Core.SaveDictionaryCategoryCommand.Code"> @@ -2111,7 +2161,7 @@ </member> <member name="T:FlexJobApi.Core.SaveDictionaryDataCommand"> <summary> - 淇濆瓨瀛楀吀鏁版嵁 + 淇濆瓨鏁版嵁瀛楀吀 </summary> </member> <member name="P:FlexJobApi.Core.SaveDictionaryDataCommand.CategoryId"> @@ -2171,27 +2221,22 @@ </member> <member name="T:FlexJobApi.Core.SetDictionaryDataIsDisabledCommand"> <summary> - 璁剧疆瀛楀吀鏁版嵁鏄惁绂佺敤 - </summary> - </member> - <member name="P:FlexJobApi.Core.SetDictionaryDataIsDisabledCommand.Ids"> - <summary> - Id - </summary> - </member> - <member name="P:FlexJobApi.Core.SetDictionaryDataIsDisabledCommand.IsDisabled"> - <summary> - 鏄惁绂佺敤 + 璁剧疆鏁版嵁瀛楀吀鏄惁绂佺敤 </summary> </member> <member name="T:FlexJobApi.Core.GetDictionaryCategoriesQuery"> <summary> - 鏌ヨ瀛楀吀绫诲埆鍒嗛〉鍒楄〃鏁版嵁 + 鑾峰彇鏁版嵁瀛楀吀绫诲埆鍒嗛〉鍒楄〃鏁版嵁 </summary> </member> <member name="P:FlexJobApi.Core.GetDictionaryCategoriesQuery.Keywords"> <summary> 鍏抽敭瀛� + </summary> + </member> + <member name="T:FlexJobApi.Core.GetDictionaryCategoriesQueryResultItem"> + <summary> + 鑾峰彇鏁版嵁瀛楀吀绫诲埆鍒嗛〉鍒楄〃鏁版嵁-缁撴灉-椤� </summary> </member> <member name="P:FlexJobApi.Core.GetDictionaryCategoriesQueryResultItem.Id"> @@ -2221,7 +2266,7 @@ </member> <member name="T:FlexJobApi.Core.GetDictionaryDatasQuery"> <summary> - 鑾峰彇瀛楀吀鏁版嵁鍒嗛〉鍒楄〃 + 鑾峰彇鏁版嵁瀛楀吀鍒嗛〉鍒楄〃鏁版嵁 </summary> </member> <member name="P:FlexJobApi.Core.GetDictionaryDatasQuery.CategoryId"> @@ -2236,7 +2281,7 @@ </member> <member name="T:FlexJobApi.Core.GetDictionaryDatasQueryResultItem"> <summary> - 鑾峰彇瀛楀吀鏁版嵁鍒嗛〉鍒楄〃-缁撴灉-琛屾暟鎹� + 鑾峰彇鏁版嵁瀛楀吀鍒嗛〉鍒楄〃鏁版嵁-缁撴灉-琛屾暟鎹� </summary> </member> <member name="P:FlexJobApi.Core.GetDictionaryDatasQueryResultItem.Id"> @@ -3745,6 +3790,37 @@ 鏁版嵁搴撳伐鍏� </summary> </member> + <member name="M:FlexJobApi.Core.DbUtils.ToPagedListAsync``2(FlexJobApi.Core.PagedListQueryPageModel,System.Func{System.Linq.IQueryable{``0},System.Linq.IQueryable{``0}},System.Linq.Expressions.Expression{System.Func{``0,``1}},System.Threading.CancellationToken)"> + <summary> + 鏌ヨ鍒嗛〉鍒楄〃鏁版嵁 + </summary> + <typeparam name="TEntity"></typeparam> + <typeparam name="TItem"></typeparam> + <param name="page"></param> + <param name="query"></param> + <param name="selector"></param> + <param name="cancellationToken"></param> + <returns></returns> + </member> + <member name="M:FlexJobApi.Core.DbUtils.OrderBy``1(System.Linq.IQueryable{``0},System.Collections.Generic.List{FlexJobApi.Core.PagedListQueryPageModelOrderInput})"> + <summary> + 鎺掑簭 + </summary> + <typeparam name="T"></typeparam> + <param name="q"></param> + <param name="orders"></param> + <returns></returns> + </member> + <member name="M:FlexJobApi.Core.DbUtils.SetIsDisable``1(FlexJobApi.Core.SetIsDisabledCommand,System.Func{System.Linq.IQueryable{``0},System.Linq.IQueryable{``0}},System.Threading.CancellationToken)"> + <summary> + 璁剧疆鏄惁绂佺敤 + </summary> + <typeparam name="TEntity"></typeparam> + <param name="request"></param> + <param name="query"></param> + <param name="cancellationToken"></param> + <returns></returns> + </member> <member name="M:FlexJobApi.Core.DbUtils.DeleteData``1(FlexJobApi.Core.DeleteDataCommand,System.Func{System.Linq.IQueryable{``0},System.Linq.IQueryable{``0}},System.Threading.CancellationToken)"> <summary> 鍒犻櫎鏁版嵁 @@ -3786,9 +3862,102 @@ 鍒犻櫎鍛戒护 </summary> </member> + <member name="T:FlexJobApi.Core.PagedListQuery`2"> + <summary> + 鏌ヨ鍒嗛〉鍒楄〃 + </summary> + <typeparam name="TResult"></typeparam> + <typeparam name="TItem"></typeparam> + </member> + <member name="P:FlexJobApi.Core.PagedListQuery`2.PageModel"> + <summary> + 鍒嗛〉淇℃伅 + </summary> + </member> + <member name="T:FlexJobApi.Core.PagedListQueryPageModel"> + <summary> + 鏌ヨ鍒嗛〉鍒楄〃-鍒嗛〉淇℃伅 + </summary> + </member> + <member name="P:FlexJobApi.Core.PagedListQueryPageModel.Rows"> + <summary> + 琛屾暟 + </summary> + </member> + <member name="P:FlexJobApi.Core.PagedListQueryPageModel.Page"> + <summary> + 椤电爜 + </summary> + </member> + <member name="P:FlexJobApi.Core.PagedListQueryPageModel.OrderInput"> + <summary> + 鎺掑簭 + </summary> + </member> + <member name="T:FlexJobApi.Core.PagedListQueryPageModelOrderInput"> + <summary> + 鏌ヨ鍒嗛〉鍒楄〃-鍒嗛〉淇℃伅-鎺掑簭淇℃伅 + </summary> + </member> + <member name="P:FlexJobApi.Core.PagedListQueryPageModelOrderInput.Property"> + <summary> + 灞炴�� + </summary> + </member> + <member name="P:FlexJobApi.Core.PagedListQueryPageModelOrderInput.Order"> + <summary> + 鎺掑簭 + </summary> + </member> + <member name="T:FlexJobApi.Core.PagedListQueryResult`1"> + <summary> + 鏌ヨ鍒嗛〉鍒楄〃-缁撴灉 + </summary> + <typeparam name="TItem"></typeparam> + </member> + <member name="P:FlexJobApi.Core.PagedListQueryResult`1.PageModel"> + <summary> + 鍒嗛〉淇℃伅 + </summary> + </member> + <member name="P:FlexJobApi.Core.PagedListQueryResult`1.Data"> + <summary> + 鏁版嵁 + </summary> + </member> + <member name="T:FlexJobApi.Core.PagedListQueryResultPageModel"> + <summary> + 鏌ヨ鍒嗛〉鍒楄〃-鍒嗛〉淇℃伅 + </summary> + </member> + <member name="P:FlexJobApi.Core.PagedListQueryResultPageModel.TotalCount"> + <summary> + 鎬绘暟 + </summary> + </member> + <member name="P:FlexJobApi.Core.PagedListQueryResultPageModel.TotalPage"> + <summary> + 椤垫暟 + </summary> + </member> <member name="T:FlexJobApi.Core.SaveDataCommand"> <summary> 淇濆瓨鏁版嵁鍛戒护 + </summary> + </member> + <member name="P:FlexJobApi.Core.SaveDataCommand.Id"> + <summary> + Id + </summary> + </member> + <member name="T:FlexJobApi.Core.SetIsDisabledCommand"> + <summary> + 璁剧疆鏄惁宸茬鐢ㄥ懡浠� + </summary> + </member> + <member name="P:FlexJobApi.Core.SetIsDisabledCommand.IsDisabled"> + <summary> + 鏄惁宸茬鐢� </summary> </member> <member name="P:FlexJobApi.Core.EnumModel.Name"> @@ -3866,6 +4035,15 @@ <typeparam name="T"></typeparam> <param name="model"></param> <param name="name"></param> + <returns></returns> + </member> + <member name="M:FlexJobApi.Core.EnumUtils.GetCustomAttribute``2(``0)"> + <summary> + 鑾峰彇鑷畾涔夌壒鎬� + </summary> + <typeparam name="TEnum"></typeparam> + <typeparam name="TAttribute"></typeparam> + <param name="enum"></param> <returns></returns> </member> <member name="T:FlexJobApi.Core.EventBusServiceComponent"> @@ -4080,103 +4258,6 @@ </summary> <returns></returns> </member> - <member name="T:FlexJobApi.Core.PagedListQuery`2"> - <summary> - 鏌ヨ鍒嗛〉鍒楄〃 - </summary> - <typeparam name="TResult"></typeparam> - <typeparam name="TItem"></typeparam> - </member> - <member name="P:FlexJobApi.Core.PagedListQuery`2.PageModel"> - <summary> - 鍒嗛〉淇℃伅 - </summary> - </member> - <member name="T:FlexJobApi.Core.PagedListQueryPageModel"> - <summary> - 鏌ヨ鍒嗛〉鍒楄〃-鍒嗛〉淇℃伅 - </summary> - </member> - <member name="P:FlexJobApi.Core.PagedListQueryPageModel.Rows"> - <summary> - 琛屾暟 - </summary> - </member> - <member name="P:FlexJobApi.Core.PagedListQueryPageModel.Page"> - <summary> - 椤电爜 - </summary> - </member> - <member name="P:FlexJobApi.Core.PagedListQueryPageModel.OrderInput"> - <summary> - 鎺掑簭 - </summary> - </member> - <member name="T:FlexJobApi.Core.PagedListQueryPageModelOrderInput"> - <summary> - 鏌ヨ鍒嗛〉鍒楄〃-鍒嗛〉淇℃伅-鎺掑簭淇℃伅 - </summary> - </member> - <member name="P:FlexJobApi.Core.PagedListQueryPageModelOrderInput.Property"> - <summary> - 灞炴�� - </summary> - </member> - <member name="P:FlexJobApi.Core.PagedListQueryPageModelOrderInput.Order"> - <summary> - 鎺掑簭 - </summary> - </member> - <member name="T:FlexJobApi.Core.PagedListQueryResult`1"> - <summary> - 鏌ヨ鍒嗛〉鍒楄〃-缁撴灉 - </summary> - <typeparam name="TItem"></typeparam> - </member> - <member name="P:FlexJobApi.Core.PagedListQueryResult`1.PageModel"> - <summary> - 鍒嗛〉淇℃伅 - </summary> - </member> - <member name="P:FlexJobApi.Core.PagedListQueryResult`1.Data"> - <summary> - 鏁版嵁 - </summary> - </member> - <member name="T:FlexJobApi.Core.PagedListQueryResultPageModel"> - <summary> - 鏌ヨ鍒嗛〉鍒楄〃-鍒嗛〉淇℃伅 - </summary> - </member> - <member name="P:FlexJobApi.Core.PagedListQueryResultPageModel.TotalCount"> - <summary> - 鎬绘暟 - </summary> - </member> - <member name="P:FlexJobApi.Core.PagedListQueryResultPageModel.TotalPage"> - <summary> - 椤垫暟 - </summary> - </member> - <member name="M:FlexJobApi.Core.PagedListUtils.ToPagedListAsync``1(System.Linq.IQueryable{``0},FlexJobApi.Core.PagedListQueryPageModel,System.Threading.CancellationToken)"> - <summary> - 鏌ヨ鍒嗛〉鍒楄〃鏁版嵁 - </summary> - <typeparam name="TItem"></typeparam> - <param name="q"></param> - <param name="page"></param> - <param name="cancellationToken"></param> - <returns></returns> - </member> - <member name="M:FlexJobApi.Core.PagedListUtils.OrderBy``1(System.Linq.IQueryable{``0},System.Collections.Generic.List{FlexJobApi.Core.PagedListQueryPageModelOrderInput})"> - <summary> - 鎺掑簭 - </summary> - <typeparam name="T"></typeparam> - <param name="q"></param> - <param name="orders"></param> - <returns></returns> - </member> <member name="P:FlexJobApi.Core.ResourceModel.TraceId"> <summary> 璺熻釜Id @@ -4187,9 +4268,19 @@ 搴旂敤鍚嶇О </summary> </member> - <member name="P:FlexJobApi.Core.ResourceModel.RouteArea"> + <member name="P:FlexJobApi.Core.ResourceModel.DynamicAssemblyName"> <summary> - 璺敱鍖哄煙 + 鍔ㄦ�佺▼搴忛泦鍚嶇О + </summary> + </member> + <member name="P:FlexJobApi.Core.ResourceModel.Service"> + <summary> + 鏈嶅姟 + </summary> + </member> + <member name="P:FlexJobApi.Core.ResourceModel.ServiceName"> + <summary> + 鏈嶅姟鍚嶇О </summary> </member> <member name="P:FlexJobApi.Core.ResourceModel.Controller"> @@ -4205,6 +4296,11 @@ <member name="P:FlexJobApi.Core.ResourceModel.ActionName"> <summary> 濮旀墭鍚嶇О + </summary> + </member> + <member name="P:FlexJobApi.Core.ResourceModel.ActionSummary"> + <summary> + 濮旀墭鎽樿 </summary> </member> <member name="P:FlexJobApi.Core.ResourceModel.Code"> @@ -4225,6 +4321,11 @@ <member name="P:FlexJobApi.Core.ResourceModel.Method"> <summary> 璇锋眰鏂瑰紡 + </summary> + </member> + <member name="P:FlexJobApi.Core.ResourceModel.RouteArea"> + <summary> + 璺敱鍖哄煙 </summary> </member> <member name="P:FlexJobApi.Core.ResourceModel.Route"> @@ -4297,16 +4398,60 @@ 璺敱鍖哄煙 </summary> </member> + <member name="P:FlexJobApi.Core.ResourceServiceAttribute.ServiceName"> + <summary> + 鏈嶅姟鍚嶇О + </summary> + </member> <member name="T:FlexJobApi.Core.ResourceUtils"> <summary> 璧勬簮宸ュ叿 </summary> </member> + <member name="M:FlexJobApi.Core.ResourceUtils.SendHttpAsync``2(``0)"> + <summary> + 鍙戦�丠TTP璇锋眰 + </summary> + <typeparam name="TRequest"></typeparam> + <typeparam name="TResponse"></typeparam> + <param name="request"></param> + <returns></returns> + </member> + <member name="M:FlexJobApi.Core.ResourceUtils.GetHealthyServiceDomain(FlexJobApi.Core.Resource)"> + <summary> + 鑾峰彇鍋ュ悍鏈嶅姟鍩熷悕 + </summary> + <param name="resource"></param> + <returns></returns> + </member> <member name="M:FlexJobApi.Core.ResourceUtils.BuildDynamicControllersAsync"> <summary> 鐢熸垚鍔ㄦ�佹帶鍒跺櫒 </summary> </member> + <member name="M:FlexJobApi.Core.ResourceUtils.SaveResourcesAsync(System.Collections.Generic.List{FlexJobApi.Core.ResourceModel},System.String,Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.Resource})"> + <summary> + 淇濆瓨璧勬簮 + </summary> + <param name="models"></param> + <param name="traceId"></param> + <param name="rep"></param> + <returns></returns> + </member> + <member name="M:FlexJobApi.Core.ResourceUtils.DynamicControllersHotPlug(System.Collections.Generic.List{FlexJobApi.Core.Resource},Furion.DynamicApiController.IDynamicApiRuntimeChangeProvider)"> + <summary> + 鍔ㄦ�佹帶鍒跺櫒鐑彃 + </summary> + <param name="resources"></param> + <param name="provider"></param> + </member> + <member name="M:FlexJobApi.Core.ResourceUtils.DynamicControllerHotPluck(FlexJobApi.Core.Resource,Furion.DynamicApiController.IDynamicApiRuntimeChangeProvider)"> + <summary> + 鍔ㄦ�佹帶鍒跺櫒鐑嫈 + </summary> + <param name="resource"></param> + <param name="provider"></param> + </member> <member name="M:FlexJobApi.Core.ResourceUtils.GetCSharpFriendlyName(System.Type)"> <summary> 鑾峰彇C#鍙嬪ソ鍚嶇О diff --git a/FlexJobApi.Core/FlexJobApiCoreStartup.cs b/FlexJobApi.Core/FlexJobApiCoreStartup.cs index c913fe3..cc2c31d 100644 --- a/FlexJobApi.Core/FlexJobApiCoreStartup.cs +++ b/FlexJobApi.Core/FlexJobApiCoreStartup.cs @@ -1,4 +1,5 @@ -锘縰sing Furion; +锘縰sing Consul; +using Furion; using Furion.EventBus; using MediatR; using Microsoft.AspNetCore.Builder; @@ -19,6 +20,8 @@ { public void ConfigureServices(IServiceCollection services) { + services.AddHealthChecks(); + services.AddConsoleFormatter(options => { options.WithTraceId = true; @@ -42,6 +45,10 @@ }); services.AddConfigurableOptions<AliyunOptions>(); + + services.AddHttpRemote(); + + services.AddComponent<ConsulServiceComponent>(); services.AddComponent<EventBusServiceComponent>(); @@ -106,8 +113,11 @@ app.UseEndpoints(endpoints => { endpoints.MapControllers(); + endpoints.MapHealthChecks("/healthz"); }); + app.UseComponent<ConsulApplicationComponent>(env); + //lifetime.ApplicationStarted.Register(async () => //{ // await ResourceUtils.BuildDynamicControllersAsync(); diff --git a/FlexJobApi.Core/Interfaces/IIsDisabled.cs b/FlexJobApi.Core/Interfaces/IIsDisabled.cs new file mode 100644 index 0000000..aedab8a --- /dev/null +++ b/FlexJobApi.Core/Interfaces/IIsDisabled.cs @@ -0,0 +1,19 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FlexJobApi.Core +{ + /// <summary> + /// 鏄惁宸茬鐢� + /// </summary> + public interface IIsDisabled + { + /// <summary> + /// 鏄惁宸茬鐢� + /// </summary> + bool IsDisabled { get; set; } + } +} diff --git a/FlexJobApi.Core/Models/Main/Dictionaries/Commands/DeleteDictionaryCategoryCommand.cs b/FlexJobApi.Core/Models/Main/Dictionaries/Commands/DeleteDictionaryCategoryCommand.cs index 5099239..2cef291 100644 --- a/FlexJobApi.Core/Models/Main/Dictionaries/Commands/DeleteDictionaryCategoryCommand.cs +++ b/FlexJobApi.Core/Models/Main/Dictionaries/Commands/DeleteDictionaryCategoryCommand.cs @@ -8,7 +8,7 @@ namespace FlexJobApi.Core { /// <summary> - /// 鍒犻櫎瀛楀吀绫诲埆 + /// 鍒犻櫎鏁版嵁瀛楀吀绫诲埆 /// </summary> [Resource([EnumResourceController.Dictionary])] public class DeleteDictionaryCategoryCommand : DeleteDataCommand, IRequest<int> diff --git a/FlexJobApi.Core/Models/Main/Dictionaries/Commands/SaveDictionaryCategoryCommand.cs b/FlexJobApi.Core/Models/Main/Dictionaries/Commands/SaveDictionaryCategoryCommand.cs index 113fc40..999f4da 100644 --- a/FlexJobApi.Core/Models/Main/Dictionaries/Commands/SaveDictionaryCategoryCommand.cs +++ b/FlexJobApi.Core/Models/Main/Dictionaries/Commands/SaveDictionaryCategoryCommand.cs @@ -9,10 +9,10 @@ namespace FlexJobApi.Core { /// <summary> - /// 淇濆瓨瀛楀吀绫诲埆 + /// 淇濆瓨鏁版嵁瀛楀吀绫诲埆 /// </summary> [Resource([EnumResourceController.Dictionary])] - public class SaveDictionaryCategoryCommand : SaveDataCommand, IRequest<Guid> + public class SaveDictionaryCategoryCommand : SaveDataCommand { /// <summary> /// 缂栧彿 diff --git a/FlexJobApi.Core/Models/Main/Dictionaries/Commands/SaveDictionaryDataCommand.cs b/FlexJobApi.Core/Models/Main/Dictionaries/Commands/SaveDictionaryDataCommand.cs index 55c42d1..759dcfe 100644 --- a/FlexJobApi.Core/Models/Main/Dictionaries/Commands/SaveDictionaryDataCommand.cs +++ b/FlexJobApi.Core/Models/Main/Dictionaries/Commands/SaveDictionaryDataCommand.cs @@ -9,10 +9,10 @@ namespace FlexJobApi.Core { /// <summary> - /// 淇濆瓨瀛楀吀鏁版嵁 + /// 淇濆瓨鏁版嵁瀛楀吀 /// </summary> [Resource([EnumResourceController.Dictionary])] - public class SaveDictionaryDataCommand : SaveDataCommand, IRequest<Guid> + public class SaveDictionaryDataCommand : SaveDataCommand { /// <summary> /// 绫诲埆Id diff --git a/FlexJobApi.Core/Models/Main/Dictionaries/Commands/SetDictionaryDataIsDisabledCommand.cs b/FlexJobApi.Core/Models/Main/Dictionaries/Commands/SetDictionaryDataIsDisabledCommand.cs index 37cf0d2..7c44111 100644 --- a/FlexJobApi.Core/Models/Main/Dictionaries/Commands/SetDictionaryDataIsDisabledCommand.cs +++ b/FlexJobApi.Core/Models/Main/Dictionaries/Commands/SetDictionaryDataIsDisabledCommand.cs @@ -8,24 +8,11 @@ namespace FlexJobApi.Core { /// <summary> - /// 璁剧疆瀛楀吀鏁版嵁鏄惁绂佺敤 + /// 璁剧疆鏁版嵁瀛楀吀鏄惁绂佺敤 /// </summary> [Resource([EnumResourceController.Dictionary])] - public class SetDictionaryDataIsDisabledCommand : IRequest<int> + public class SetDictionaryDataIsDisabledCommand : SetIsDisabledCommand { - public SetDictionaryDataIsDisabledCommand() - { - Ids = []; - } - /// <summary> - /// Id - /// </summary> - public List<Guid> Ids { get; set; } - - /// <summary> - /// 鏄惁绂佺敤 - /// </summary> - public bool IsDisabled { get; set; } } } diff --git a/FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryCategoriesQuery.cs b/FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryCategoriesQuery.cs index a1a7a37..a0f5619 100644 --- a/FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryCategoriesQuery.cs +++ b/FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryCategoriesQuery.cs @@ -9,10 +9,10 @@ namespace FlexJobApi.Core { /// <summary> - /// 鏌ヨ瀛楀吀绫诲埆鍒嗛〉鍒楄〃鏁版嵁 + /// 鑾峰彇鏁版嵁瀛楀吀绫诲埆鍒嗛〉鍒楄〃鏁版嵁 /// </summary> [Resource([EnumResourceController.Dictionary])] - public class GetDictionaryCategoriesQuery : PagedListQuery<PagedListQueryResult<GetDictionaryCategoriesQueryResultItem>, GetDictionaryCategoriesQueryResultItem>, IRequest<PagedListQueryResult<GetDictionaryCategoriesQueryResultItem>> + public class GetDictionaryCategoriesQuery : PagedListQuery<PagedListQueryResult<GetDictionaryCategoriesQueryResultItem>, GetDictionaryCategoriesQueryResultItem> { /// <summary> /// 鍏抽敭瀛� @@ -20,6 +20,9 @@ public string Keywords { get; set; } } + /// <summary> + /// 鑾峰彇鏁版嵁瀛楀吀绫诲埆鍒嗛〉鍒楄〃鏁版嵁-缁撴灉-椤� + /// </summary> public class GetDictionaryCategoriesQueryResultItem { /// <summary> diff --git a/FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryCategorySelectQuery.cs b/FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryCategorySelectQuery.cs new file mode 100644 index 0000000..e739ef3 --- /dev/null +++ b/FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryCategorySelectQuery.cs @@ -0,0 +1,17 @@ +锘縰sing MediatR; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FlexJobApi.Core +{ + /// <summary> + /// 鏌ヨ鏁版嵁瀛楀吀绫诲埆閫夋嫨鍣ㄦ暟鎹� + /// </summary> + public class GetDictionaryCategorySelectQuery : SelectQuery<Guid> + { + } +} diff --git a/FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryDatasQuery.cs b/FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryDatasQuery.cs index 0f82192..24345b6 100644 --- a/FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryDatasQuery.cs +++ b/FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryDatasQuery.cs @@ -9,15 +9,15 @@ namespace FlexJobApi.Core { /// <summary> - /// 鑾峰彇瀛楀吀鏁版嵁鍒嗛〉鍒楄〃 + /// 鑾峰彇鏁版嵁瀛楀吀鍒嗛〉鍒楄〃鏁版嵁 /// </summary> [Resource([EnumResourceController.Dictionary])] - public class GetDictionaryDatasQuery : PagedListQuery<PagedListQueryResult<GetDictionaryDatasQueryResultItem>, GetDictionaryDatasQueryResultItem> , IRequest<PagedListQueryResult<GetDictionaryDatasQueryResultItem>> + public class GetDictionaryDatasQuery : PagedListQuery<PagedListQueryResult<GetDictionaryDatasQueryResultItem>, GetDictionaryDatasQueryResultItem> { /// <summary> /// 绫诲埆Id /// </summary> - public Guid CategoryId { get; set; } + public Guid? CategoryId { get; set; } /// <summary> /// 鍏抽敭瀛� @@ -26,7 +26,7 @@ } /// <summary> - /// 鑾峰彇瀛楀吀鏁版嵁鍒嗛〉鍒楄〃-缁撴灉-琛屾暟鎹� + /// 鑾峰彇鏁版嵁瀛楀吀鍒嗛〉鍒楄〃鏁版嵁-缁撴灉-琛屾暟鎹� /// </summary> public class GetDictionaryDatasQueryResultItem { diff --git a/FlexJobApi.Core/Models/User/Enterprises/Queries/GetEnterprisesQuery.cs b/FlexJobApi.Core/Models/User/Enterprises/Queries/GetEnterprisesQuery.cs index 9ff08a9..739cb0c 100644 --- a/FlexJobApi.Core/Models/User/Enterprises/Queries/GetEnterprisesQuery.cs +++ b/FlexJobApi.Core/Models/User/Enterprises/Queries/GetEnterprisesQuery.cs @@ -12,7 +12,7 @@ /// 鏌ヨ浼佷笟淇℃伅鍒嗛〉鍒楄〃鏁版嵁 /// </summary> [Resource([EnumResourceController.Enterprise])] - public class GetEnterprisesQuery : PagedListQuery<PagedListQueryResult<GetEnterprisesQueryResultItem>, GetEnterprisesQueryResultItem>, IRequest<PagedListQueryResult<GetEnterprisesQueryResultItem>> + public class GetEnterprisesQuery : PagedListQuery<PagedListQueryResult<GetEnterprisesQueryResultItem>, GetEnterprisesQueryResultItem> { /// <summary> /// 鍏抽敭瀛� diff --git a/FlexJobApi.Core/Models/User/Roles/Queries/GetRolesQuery.cs b/FlexJobApi.Core/Models/User/Roles/Queries/GetRolesQuery.cs index e96931f..4231a99 100644 --- a/FlexJobApi.Core/Models/User/Roles/Queries/GetRolesQuery.cs +++ b/FlexJobApi.Core/Models/User/Roles/Queries/GetRolesQuery.cs @@ -12,7 +12,7 @@ /// 鏌ヨ瑙掕壊鍒嗛〉鍒楄〃 /// </summary> [Resource([EnumResourceController.Role])] - public class GetRolesQuery : PagedListQuery<PagedListQueryResult<GetRolesQueryResultItem>, GetRolesQueryResultItem>, IRequest<PagedListQueryResult<GetRolesQueryResultItem>> + public class GetRolesQuery : PagedListQuery<PagedListQueryResult<GetRolesQueryResultItem>, GetRolesQueryResultItem> { /// <summary> /// 鐢ㄦ埛绫诲瀷 diff --git a/FlexJobApi.Core/Models/User/UserInfos/Queries/GetOperationUserInfosQuery.cs b/FlexJobApi.Core/Models/User/UserInfos/Queries/GetOperationUserInfosQuery.cs index e5952ce..81a2457 100644 --- a/FlexJobApi.Core/Models/User/UserInfos/Queries/GetOperationUserInfosQuery.cs +++ b/FlexJobApi.Core/Models/User/UserInfos/Queries/GetOperationUserInfosQuery.cs @@ -13,7 +13,7 @@ /// 鏌ヨ杩愯惀绔敤鎴峰垎椤靛垪琛ㄦ暟鎹� /// </summary> [Resource([EnumResourceController.UserInfo])] - public class GetOperationUserInfosQuery : PagedListQuery<PagedListQueryResult<GetOperationUserInfosQueryResultItem>, GetOperationUserInfosQueryResultItem>, IRequest<PagedListQueryResult<GetOperationUserInfosQueryResultItem>> + public class GetOperationUserInfosQuery : PagedListQuery<PagedListQueryResult<GetOperationUserInfosQueryResultItem>, GetOperationUserInfosQueryResultItem> { /// <summary> /// 鍏抽敭瀛� diff --git a/FlexJobApi.Core/Utils/ConsulUtils/ConsulApplicationComponent.cs b/FlexJobApi.Core/Utils/ConsulUtils/ConsulApplicationComponent.cs new file mode 100644 index 0000000..ef0a383 --- /dev/null +++ b/FlexJobApi.Core/Utils/ConsulUtils/ConsulApplicationComponent.cs @@ -0,0 +1,57 @@ +锘縰sing Consul; +using Furion; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FlexJobApi.Core +{ + public class ConsulApplicationComponent : IApplicationComponent + { + public void Load(IApplicationBuilder app, IWebHostEnvironment env, ComponentContext componentContext) + { + var consulClient = app.ApplicationServices.GetRequiredService<IConsulClient>(); + var lifetime = app.ApplicationServices.GetRequiredService<IHostApplicationLifetime>(); + + // 鏈嶅姟閰嶇疆锛堜粠appsettings.json璇诲彇锛� + var serviceName = App.Configuration["Consul:ServiceName"] ?? "UnknownService"; + var serviceHost = App.Configuration["Consul:ServiceIP"] ?? "localhost"; + var servicePort = int.Parse(App.Configuration["Consul:ServicePort"]); // 鎴栫洿鎺ョ敤鍚姩绔彛 + + // 鏈嶅姟鍞竴ID锛堥伩鍏嶅悓涓�鏈嶅姟澶氬疄渚嬪啿绐侊級 + var serviceId = $"{serviceName}-{serviceHost}-{servicePort}"; + + // 鏈嶅姟娉ㄥ唽淇℃伅 + var registration = new AgentServiceRegistration + { + ID = serviceId, + Name = serviceName, + Address = serviceHost, + Port = servicePort, + // 鍋ュ悍妫�鏌ラ厤缃� + Check = new AgentServiceCheck + { + HTTP = $"http://{serviceHost}:{servicePort}{App.Configuration["Consul:ServiceHealthCheck"]}", + Interval = TimeSpan.FromSeconds(10), + Timeout = TimeSpan.FromSeconds(5), + DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(30) + } + }; + + // 娉ㄥ唽鏈嶅姟 + consulClient.Agent.ServiceRegister(registration).Wait(); + + // 搴旂敤鍋滄鏃舵敞閿�鏈嶅姟 + lifetime.ApplicationStopping.Register(() => + { + consulClient.Agent.ServiceDeregister(serviceId).Wait(); + }); + } + } +} diff --git a/FlexJobApi.Core/Utils/ConsulUtils/ConsulServiceComponent.cs b/FlexJobApi.Core/Utils/ConsulUtils/ConsulServiceComponent.cs new file mode 100644 index 0000000..95b7d88 --- /dev/null +++ b/FlexJobApi.Core/Utils/ConsulUtils/ConsulServiceComponent.cs @@ -0,0 +1,23 @@ +锘縰sing Consul; +using Furion; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FlexJobApi.Core +{ + public class ConsulServiceComponent : IServiceComponent + { + public void Load(IServiceCollection services, ComponentContext componentContext) + { + services.AddSingleton<IConsulClient, ConsulClient>(p => new ConsulClient(config => + { + var address = App.Configuration["Consul:Address"] ?? "http://localhost:8500"; + config.Address = new Uri(address); + })); + } + } +} diff --git a/FlexJobApi.Core/Utils/DbUtils/DbUtils.cs b/FlexJobApi.Core/Utils/DbUtils/DbUtils.cs index ecaf344..e6a1389 100644 --- a/FlexJobApi.Core/Utils/DbUtils/DbUtils.cs +++ b/FlexJobApi.Core/Utils/DbUtils/DbUtils.cs @@ -25,6 +25,124 @@ public static class DbUtils { /// <summary> + /// 鏌ヨ鍒嗛〉鍒楄〃鏁版嵁 + /// </summary> + /// <typeparam name="TEntity"></typeparam> + /// <typeparam name="TItem"></typeparam> + /// <param name="page"></param> + /// <param name="query"></param> + /// <param name="selector"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public static async Task<PagedListQueryResult<TItem>> ToPagedListAsync<TEntity, TItem>( + this PagedListQueryPageModel page, + Func<IQueryable<TEntity>, IQueryable<TEntity>> query = null, + Expression<Func<TEntity, TItem>> selector = null, + CancellationToken cancellationToken = default) + where TEntity : CommonEntity, new() + where TItem : class, new() + { + var rep = Db.GetRepository<TEntity>(); + var q = rep.AsQueryable().AsNoTracking(); + if (query != null) q = query(q); + q = q.OrderBy(page.OrderInput); + var s = selector == null + ? q.ProjectToType<TItem>() + : q.Select(selector); + var pagedList = await s.ToPagedListAsync(page.Page, page.Rows, cancellationToken); + var result = new PagedListQueryResult<TItem>(); + result.PageModel = page.Adapt<PagedListQueryResultPageModel>(); + result.PageModel.TotalCount = pagedList.TotalCount; + result.PageModel.TotalPage = pagedList.TotalPages; + result.Data = pagedList.Items.ToList(); + return result; + } + + /// <summary> + /// 鎺掑簭 + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="q"></param> + /// <param name="orders"></param> + /// <returns></returns> + public static IQueryable<T> OrderBy<T>(this IQueryable<T> q, List<PagedListQueryPageModelOrderInput> orders) + { + if (orders.IsNull()) return q; + + var entityType = typeof(T); + int index = 0; + + var props = entityType.GetProperties(); + foreach (var order in orders) + { + if (string.IsNullOrEmpty(order.Property)) continue; + + // 鑾峰彇鎺掑簭瀛楁鐨勫睘鎬т俊鎭� + var propertyInfo = props.FirstOrDefault(it => it.Name.Equals(order.Property, StringComparison.OrdinalIgnoreCase)); + if (propertyInfo == null) throw Oops.Oh(EnumErrorCodeType.s404, $"璇ユ帓搴忓瓧娈祘order.Property}"); + + // 鍒涘缓琛ㄨ揪寮忔爲 + var parameter = Expression.Parameter(entityType, "x"); + var propertyAccess = Expression.Property(parameter, propertyInfo); + var lambda = Expression.Lambda(propertyAccess, parameter); + + string methodName; + if (index == 0) + { + // 棣栨鎺掑簭 + methodName = order.Order == EnumPagedListOrder.Asc + ? "OrderBy" + : "OrderByDescending"; + } + else + { + // 浜屾鍙婁互鍚庢帓搴� + methodName = order.Order == EnumPagedListOrder.Asc + ? "ThenBy" + : "ThenByDescending"; + } + + // 璋冪敤鐩稿簲鐨勬帓搴忔柟娉� + var resultExpression = Expression.Call( + typeof(Queryable), + methodName, + [entityType, propertyInfo.PropertyType], + q.Expression, + Expression.Quote(lambda) + ); + + q = q.Provider.CreateQuery<T>(resultExpression); + index++; + } + + return q; + } + + /// <summary> + /// 璁剧疆鏄惁绂佺敤 + /// </summary> + /// <typeparam name="TEntity"></typeparam> + /// <param name="request"></param> + /// <param name="query"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public static async Task<int> SetIsDisable<TEntity>(this SetIsDisabledCommand request, Func<IQueryable<TEntity>, IQueryable<TEntity>> query = null, CancellationToken cancellationToken = default) + where TEntity : CommonEntity, IIsDisabled, new() + { + var rep = Db.GetRepository<TEntity>(); + var q = rep.AsQueryable(); + if (query != null) q = query(q); + var entities = await q + .Where(it => request.Ids.Contains(it.Id) && it.IsDisabled != request.IsDisabled) + .ToListAsync(); + foreach (var entity in entities) + { + entity.IsDisabled = request.IsDisabled; + } + return entities.Count; + } + + /// <summary> /// 鍒犻櫎鏁版嵁 /// </summary> /// <typeparam name="TEntity"></typeparam> diff --git a/FlexJobApi.Core/Utils/PagedListUtils/PagedListQuery.cs b/FlexJobApi.Core/Utils/DbUtils/PagedListQuery.cs similarity index 96% rename from FlexJobApi.Core/Utils/PagedListUtils/PagedListQuery.cs rename to FlexJobApi.Core/Utils/DbUtils/PagedListQuery.cs index 6ae8a7e..f2c1b66 100644 --- a/FlexJobApi.Core/Utils/PagedListUtils/PagedListQuery.cs +++ b/FlexJobApi.Core/Utils/DbUtils/PagedListQuery.cs @@ -12,7 +12,7 @@ /// </summary> /// <typeparam name="TResult"></typeparam> /// <typeparam name="TItem"></typeparam> - public abstract class PagedListQuery<TResult, TItem> + public abstract class PagedListQuery<TResult, TItem> : IRequest<TResult> where TResult : PagedListQueryResult<TItem>, new() where TItem : class, new() { diff --git a/FlexJobApi.Core/Utils/DbUtils/SaveDataCommand.cs b/FlexJobApi.Core/Utils/DbUtils/SaveDataCommand.cs index 2dbcbc8..03f70b2 100644 --- a/FlexJobApi.Core/Utils/DbUtils/SaveDataCommand.cs +++ b/FlexJobApi.Core/Utils/DbUtils/SaveDataCommand.cs @@ -1,4 +1,5 @@ -锘縰sing System; +锘縰sing MediatR; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -9,8 +10,11 @@ /// <summary> /// 淇濆瓨鏁版嵁鍛戒护 /// </summary> - public abstract class SaveDataCommand + public abstract class SaveDataCommand : IRequest<Guid> { + /// <summary> + /// Id + /// </summary> public Guid? Id { get; set; } } } diff --git a/FlexJobApi.Core/Utils/DbUtils/SelectQuery.cs b/FlexJobApi.Core/Utils/DbUtils/SelectQuery.cs new file mode 100644 index 0000000..6fdefaa --- /dev/null +++ b/FlexJobApi.Core/Utils/DbUtils/SelectQuery.cs @@ -0,0 +1,39 @@ +锘縰sing MediatR; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FlexJobApi.Core +{ + /// <summary> + /// 閫夋嫨鍣ㄦ煡璇� + /// </summary> + /// <typeparam name="TValue"></typeparam> + public class SelectQuery<TValue> : IRequest<List<SelectQueryResultItem<TValue>>> + { + + } + + /// <summary> + /// 閫夋嫨鍣ㄦ煡璇�-缁撴灉-椤� + /// </summary> + public class SelectQueryResultItem<TValue> + { + /// <summary> + /// 鍊� + /// </summary> + public TValue Value { get; set; } + + /// <summary> + /// 鏍囩 + /// </summary> + public string Label { get; set; } + + /// <summary> + /// 鏁版嵁 + /// </summary> + public object Data { get; set; } + } +} diff --git a/FlexJobApi.Core/Utils/DbUtils/SetIsDisabledCommand.cs b/FlexJobApi.Core/Utils/DbUtils/SetIsDisabledCommand.cs new file mode 100644 index 0000000..74a3d69 --- /dev/null +++ b/FlexJobApi.Core/Utils/DbUtils/SetIsDisabledCommand.cs @@ -0,0 +1,27 @@ +锘縰sing MediatR; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FlexJobApi.Core +{ + /// <summary> + /// 璁剧疆鏄惁宸茬鐢ㄥ懡浠� + /// </summary> + public abstract class SetIsDisabledCommand : IRequest<int>, IIsDisabled + { + protected SetIsDisabledCommand() + { + Ids = []; + } + + public List<Guid> Ids { get; set; } + + /// <summary> + /// 鏄惁宸茬鐢� + /// </summary> + public bool IsDisabled { get; set; } + } +} diff --git a/FlexJobApi.Core/Utils/EnumUtils/EnumUtils.cs b/FlexJobApi.Core/Utils/EnumUtils/EnumUtils.cs index 5421781..fcd9ac2 100644 --- a/FlexJobApi.Core/Utils/EnumUtils/EnumUtils.cs +++ b/FlexJobApi.Core/Utils/EnumUtils/EnumUtils.cs @@ -1,6 +1,7 @@ 锘縰sing System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using System.Text; using System.Threading.Tasks; @@ -97,5 +98,20 @@ .Select(it => it.Enum) .FirstOrDefault(); } + + /// <summary> + /// 鑾峰彇鑷畾涔夌壒鎬� + /// </summary> + /// <typeparam name="TEnum"></typeparam> + /// <typeparam name="TAttribute"></typeparam> + /// <param name="enum"></param> + /// <returns></returns> + public static TAttribute GetCustomAttribute<TEnum, TAttribute>(this TEnum @enum) + where TEnum : struct + where TAttribute : Attribute + { + + return typeof(TEnum).GetMember(@enum.ToString())[0].GetCustomAttribute<TAttribute>(); + } } } diff --git a/FlexJobApi.Core/Utils/PagedListUtils/PagedListUtils.cs b/FlexJobApi.Core/Utils/PagedListUtils/PagedListUtils.cs deleted file mode 100644 index 402f2aa..0000000 --- a/FlexJobApi.Core/Utils/PagedListUtils/PagedListUtils.cs +++ /dev/null @@ -1,99 +0,0 @@ -锘縰sing Furion.DatabaseAccessor; -using Furion.FriendlyException; -using Mapster; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Reflection; -using System.Text; -using System.Threading; -using System.Threading.Tasks; - -namespace FlexJobApi.Core -{ - public static class PagedListUtils - { - /// <summary> - /// 鏌ヨ鍒嗛〉鍒楄〃鏁版嵁 - /// </summary> - /// <typeparam name="TItem"></typeparam> - /// <param name="q"></param> - /// <param name="page"></param> - /// <param name="cancellationToken"></param> - /// <returns></returns> - public static async Task<PagedListQueryResult<TItem>> ToPagedListAsync<TItem>(this IQueryable<TItem> q, PagedListQueryPageModel page, CancellationToken cancellationToken = default) - where TItem : class, new() - { - var pagedList = await q - .OrderBy(page.OrderInput) - .ToPagedListAsync(page.Page, page.Rows, cancellationToken); - var result = new PagedListQueryResult<TItem>(); - result.PageModel = page.Adapt<PagedListQueryResultPageModel>(); - result.PageModel.TotalCount = pagedList.TotalCount; - result.PageModel.TotalPage = pagedList.TotalPages; - result.Data = pagedList.Items.ToList(); - return result; - } - - /// <summary> - /// 鎺掑簭 - /// </summary> - /// <typeparam name="T"></typeparam> - /// <param name="q"></param> - /// <param name="orders"></param> - /// <returns></returns> - public static IQueryable<T> OrderBy<T>(this IQueryable<T> q, List<PagedListQueryPageModelOrderInput> orders) - { - if (orders.IsNull()) return q; - - var entityType = typeof(T); - int index = 0; - - var props = entityType.GetProperties(); - foreach (var order in orders) - { - if (string.IsNullOrEmpty(order.Property)) continue; - - // 鑾峰彇鎺掑簭瀛楁鐨勫睘鎬т俊鎭� - var propertyInfo = props.FirstOrDefault(it => it.Name.Equals(order.Property, StringComparison.OrdinalIgnoreCase)); - if (propertyInfo == null) throw Oops.Oh(EnumErrorCodeType.s404, $"璇ユ帓搴忓瓧娈祘order.Property}"); - - // 鍒涘缓琛ㄨ揪寮忔爲 - var parameter = Expression.Parameter(entityType, "x"); - var propertyAccess = Expression.Property(parameter, propertyInfo); - var lambda = Expression.Lambda(propertyAccess, parameter); - - string methodName; - if (index == 0) - { - // 棣栨鎺掑簭 - methodName = order.Order == EnumPagedListOrder.Asc - ? "OrderBy" - : "OrderByDescending"; - } - else - { - // 浜屾鍙婁互鍚庢帓搴� - methodName = order.Order == EnumPagedListOrder.Asc - ? "ThenBy" - : "ThenByDescending"; - } - - // 璋冪敤鐩稿簲鐨勬帓搴忔柟娉� - var resultExpression = Expression.Call( - typeof(Queryable), - methodName, - [entityType, propertyInfo.PropertyType], - q.Expression, - Expression.Quote(lambda) - ); - - q = q.Provider.CreateQuery<T>(resultExpression); - index++; - } - - return q; - } - } -} diff --git a/FlexJobApi.Core/Utils/ResourceUtils/ResourceModel.cs b/FlexJobApi.Core/Utils/ResourceUtils/ResourceModel.cs index 2c94af3..e1e113d 100644 --- a/FlexJobApi.Core/Utils/ResourceUtils/ResourceModel.cs +++ b/FlexJobApi.Core/Utils/ResourceUtils/ResourceModel.cs @@ -20,9 +20,19 @@ public string ApplicationName { get; set; } /// <summary> - /// 璺敱鍖哄煙 + /// 鍔ㄦ�佺▼搴忛泦鍚嶇О /// </summary> - public string RouteArea { get; set; } + public string DynamicAssemblyName { get; set; } + + /// <summary> + /// 鏈嶅姟 + /// </summary> + public EnumResourceService Service { get; set; } + + /// <summary> + /// 鏈嶅姟鍚嶇О + /// </summary> + public string ServiceName { get; set; } /// <summary> /// 鎺у埗鍣� @@ -38,6 +48,11 @@ /// 濮旀墭鍚嶇О /// </summary> public string ActionName { get; set; } + + /// <summary> + /// 濮旀墭鎽樿 + /// </summary> + public string ActionSummary { get; set; } /// <summary> /// 缂栧彿 @@ -60,6 +75,11 @@ public EnumResourceMethod Method { get; set; } /// <summary> + /// 璺敱鍖哄煙 + /// </summary> + public string RouteArea { get; set; } + + /// <summary> /// 璺敱 /// </summary> public string Route { get; set; } diff --git a/FlexJobApi.Core/Utils/ResourceUtils/ResourceServiceAttribute.cs b/FlexJobApi.Core/Utils/ResourceUtils/ResourceServiceAttribute.cs index 2578882..3be7424 100644 --- a/FlexJobApi.Core/Utils/ResourceUtils/ResourceServiceAttribute.cs +++ b/FlexJobApi.Core/Utils/ResourceUtils/ResourceServiceAttribute.cs @@ -60,5 +60,10 @@ /// 璺敱鍖哄煙 /// </summary> public string RouteArea { get; set; } + + /// <summary> + /// 鏈嶅姟鍚嶇О + /// </summary> + public string ServiceName { get; set; } } } diff --git a/FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs b/FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs index 79e9361..0bf57e6 100644 --- a/FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs +++ b/FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs @@ -1,8 +1,11 @@ -锘縰sing Furion; +锘縰sing Consul; +using Furion; using Furion.DatabaseAccessor; +using Furion.DataEncryption; using Furion.DistributedIDGenerator; using Furion.DynamicApiController; using Furion.FriendlyException; +using Furion.HttpRemote; using Mapster; using MediatR; using Microsoft.AspNetCore.Mvc; @@ -14,12 +17,17 @@ using System; using System.Collections.Generic; using System.ComponentModel; +using System.Diagnostics; using System.Linq; +using System.Net.Http; +using System.Net.Http.Headers; using System.Reflection; +using System.Resources; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; +using static System.Collections.Specialized.BitVector32; namespace FlexJobApi.Core { @@ -29,6 +37,87 @@ public static class ResourceUtils { /// <summary> + /// 鍙戦�丠TTP璇锋眰 + /// </summary> + /// <typeparam name="TRequest"></typeparam> + /// <typeparam name="TResponse"></typeparam> + /// <param name="request"></param> + /// <returns></returns> + public static async Task<TResponse> SendHttpAsync<TRequest, TResponse>(TRequest request) + where TRequest : class, new() + { + var requestTypeFullName = typeof(TRequest).FullName; + var resource = await Db.GetRepository<Resource>().AsQueryable().AsNoTracking() + .Where(it => !it.IsExpired && it.RequestTypeFullName == requestTypeFullName) + .FirstOrDefaultAsync(); + var domain = await GetHealthyServiceDomain(resource); + var httpRemoteService = App.GetRequiredService<IHttpRemoteService>(); + var token = App.HttpContext.Request.Headers["Authorization"].ToString(); + var refreshToken = App.HttpContext.Request.Headers["X-Authorization"].ToString(); + TResponse response; + switch (resource.Method) + { + case EnumResourceMethod.Get: + response = await httpRemoteService.GetAsAsync<TResponse>( + $"{domain}{resource.Route}", + it => + it.WithQueryParameters(request) + .AddAuthentication(new AuthenticationHeaderValue("Authorization", token)) + .AddAuthentication(new AuthenticationHeaderValue("X-Authorization", refreshToken))); + break; + case EnumResourceMethod.Post: + response = await httpRemoteService.PostAsAsync<TResponse>( + $"{domain}{resource.Route}", + it => + it.SetJsonContent(request) + .WithHeader("Authorization", token) + .WithHeader("X-Authorization", refreshToken)); + break; + case EnumResourceMethod.Put: + response = await httpRemoteService.PutAsAsync<TResponse>( + $"{domain}{resource.Route}", + it => + it.SetJsonContent(request) + .AddAuthentication(new AuthenticationHeaderValue("Authorization", token)) + .AddAuthentication(new AuthenticationHeaderValue("X-Authorization", refreshToken))); + break; + case EnumResourceMethod.Delete: + response = await httpRemoteService.DeleteAsAsync<TResponse>( + $"{domain}{resource.Route}", + it => + it.SetJsonContent(request) + .AddAuthentication(new AuthenticationHeaderValue("Authorization", token)) + .AddAuthentication(new AuthenticationHeaderValue("X-Authorization", refreshToken))); + break; + default: + throw Oops.Oh(EnumErrorCodeType.s400, $"涓嶆敮鎸佽姹傛柟寮弡resource.Method}"); + } + return response; + } + + /// <summary> + /// 鑾峰彇鍋ュ悍鏈嶅姟鍩熷悕 + /// </summary> + /// <param name="resource"></param> + /// <returns></returns> + public static async Task<string> GetHealthyServiceDomain(Resource resource) + { + var client = App.GetRequiredService<IConsulClient>(); + var queryResult = await client.Health.Service(resource.ServiceName, null, true); + if (queryResult.StatusCode != System.Net.HttpStatusCode.OK) + throw Oops.Oh(EnumErrorCodeType.s404, $"寰湇鍔resource.Service}"); + + var domains = queryResult.Response + .Select(s => $"http://{s.Service.Address}:{s.Service.Port}") + .ToList(); + if (domains.IsNull()) + throw Oops.Oh(EnumErrorCodeType.s404, $"寰湇鍔resource.Service}"); + // 杞閫夋嫨瀹炰緥 + int randomIndex = new Random().Next(domains.Count); + return domains[randomIndex]; + } + + /// <summary> /// 鐢熸垚鍔ㄦ�佹帶鍒跺櫒 /// </summary> public static async Task BuildDynamicControllersAsync() @@ -36,15 +125,15 @@ var traceId = App.GetTraceId() ?? IDGen.NextID().ToString(); var scopeFactory = App.GetService<IServiceScopeFactory>(); var serviceScope = scopeFactory.CreateScope(); - var rep = serviceScope.ServiceProvider.GetRequiredService<IRepository<Resource>>(); var provider = serviceScope.ServiceProvider.GetRequiredService<IDynamicApiRuntimeChangeProvider>(); + var rep = serviceScope.ServiceProvider.GetRequiredService<IRepository<Resource>>(); var xmlDoc = await XmlDocUtils.GetXmlDocAsync(); var enumWebApiMethods = await EnumUtils.GetModel<EnumResourceMethod>(); var resourceControllers = await EnumUtils.GetModel<EnumResourceController>(); - var requests = App.Assemblies.SelectMany(it => it.GetTypes()).Where(it => typeof(IBaseRequest).IsAssignableFrom(it)).ToList(); - var resources = await rep.AsQueryable() - .Where(it => !it.IsExpired) - .ToListAsync(); + var requests = App.Assemblies + .SelectMany(it => it.GetTypes()) + .Where(it => !it.IsAbstract && typeof(IBaseRequest).IsAssignableFrom(it)) + .ToList(); var models = new List<ResourceModel>(); foreach (var request in requests) { @@ -53,25 +142,21 @@ foreach (var controller in resourceAttribute.Controllers) { - var resourceController = controller.GetType().GetMember(controller.ToString())[0].GetCustomAttribute<ResourceControllerAttribute>(); - var resourceService = resourceController.Service.GetType().GetMember(resourceController.Service.ToString())[0].GetCustomAttribute<ResourceServiceAttribute>(); + var requestXmlDoc = await request.GetXmlDocMemberAsync(xmlDoc); + var resourceController = controller.GetCustomAttribute<EnumResourceController, ResourceControllerAttribute>(); + var resourceService = resourceController.Service.GetCustomAttribute<EnumResourceService, ResourceServiceAttribute>(); var model = new ResourceModel(); model.TraceId = traceId; model.ApplicationName = resourceService.ApplicationName; - model.RouteArea = resourceService.RouteArea; - var name = request.Name; - name = Regex.Replace(name, @"(Command|Query)$", "", RegexOptions.None); - model.ActionName = name; - model.Route = $"/api/{resourceService.RouteArea ?? "main"}/{controller}/{name}"; - var requestXmlDoc = await request.GetXmlDocMemberAsync(xmlDoc); - model.Code = requestXmlDoc.Name; model.Controller = controller; model.ControllerSummary = resourceControllers.GetDescription(controller); - if (controller == EnumResourceController.Role) - { - Console.WriteLine(); - } + model.ActionName = Regex.Replace(request.Name, @"(Command|Query)$", "", RegexOptions.None); + model.ActionSummary = requestXmlDoc?.Summary; + model.Service = resourceController.Service; + model.ServiceName = resourceService.ServiceName; + model.RouteArea = resourceService.RouteArea; + model.Route = $"/api/{resourceService.RouteArea ?? "main"}/{controller}/{model.ActionName}"; model.Method = request.BaseType?.IsGenericType == true && request.BaseType.GetGenericTypeDefinition() == typeof(PagedListQuery<,>) ? EnumResourceMethod.Post @@ -84,7 +169,8 @@ : new List<string> { "Delete", "Remove ", "Clear" }.Any(it => request.Name.StartsWith(it, StringComparison.OrdinalIgnoreCase)) ? EnumResourceMethod.Delete : EnumResourceMethod.Post; - model.Name = requestXmlDoc?.Summary; + model.Code = requestXmlDoc?.Name; + model.Name = $"{model.ControllerSummary}-{model.ActionSummary}"; model.AllowAnonymous = resourceAttribute.AllowAnonymous; model.RequestTypeName = request.Name; model.RequestTypeFullName = request.FullName; @@ -96,21 +182,45 @@ model.ResponseTypeFullName = responseType.FullName; } - var resource = resources.FirstOrDefault(it => it.Route == model.Route && it.Method == model.Method); - if (resource == null) - { - resource = new Resource(); - model.Adapt(resource); - await rep.InsertAsync(resource); - resources.Add(resource); - } - else - { - model.Adapt(resource); - await rep.UpdateAsync(resource); - } models.Add(model); + } + } + + var resources = await SaveResourcesAsync(models, traceId, rep); + + DynamicControllersHotPlug(resources, provider); + + await rep.SaveNowAsync(); + } + + /// <summary> + /// 淇濆瓨璧勬簮 + /// </summary> + /// <param name="models"></param> + /// <param name="traceId"></param> + /// <param name="rep"></param> + /// <returns></returns> + private static async Task<List<Resource>> SaveResourcesAsync(List<ResourceModel> models, string traceId, IRepository<Resource> rep = null) + { + rep = rep ?? Db.GetRepository<Resource>(); + var resources = await rep.AsQueryable() + .Where(it => !it.IsExpired) + .ToListAsync(); + foreach (var model in models) + { + var resource = resources.FirstOrDefault(it => it.Route == model.Route && it.Method == model.Method); + if (resource == null) + { + resource = new Resource(); + model.Adapt(resource); + await rep.InsertAsync(resource); + resources.Add(resource); + } + else + { + model.Adapt(resource); + await rep.UpdateAsync(resource); } } @@ -121,21 +231,18 @@ await rep.UpdateAsync(expiredResource); } - var controllers = models - .GroupBy(it => new - { - it.Controller, - it.ControllerSummary, - it.ApplicationName, - it.RouteArea - }) - .Select(it => new - { - it.Key, - Actions = it.ToList() - }) - .ToList(); - foreach (var controller in controllers) + return resources.Where(it => !it.IsExpired).ToList(); + } + + /// <summary> + /// 鍔ㄦ�佹帶鍒跺櫒鐑彃 + /// </summary> + /// <param name="resources"></param> + /// <param name="provider"></param> + public static void DynamicControllersHotPlug(List<Resource> resources, IDynamicApiRuntimeChangeProvider provider = null) + { + provider = provider ?? App.GetRequiredService<IDynamicApiRuntimeChangeProvider>(); + foreach (var resource in resources) { var code = $@" using FlexJobApi.Core; @@ -149,46 +256,53 @@ using System.Collections.Generic; using System.ComponentModel; -namespace {controller.Key.ApplicationName} +namespace {resource.ApplicationName}.{resource.Controller}.{resource.ActionName}Request {{ /// <summary> - /// {controller.Key.ControllerSummary} + /// {resource.ControllerSummary} /// </summary> - [Route(""api/{controller.Key.RouteArea}/[controller]"")] - public class {controller.Key.Controller}AppService(IMediator mediator) : IDynamicApiController + [Route(""api/{resource.RouteArea}/[controller]"")] + public class {resource.Controller}AppService(IMediator mediator) : IDynamicApiController {{ - private readonly IMediator mediator = mediator;"; - foreach (var action in controller.Actions) - { - code += $@" + private readonly IMediator mediator = mediator; /// <summary> - /// {action.Name} + /// {resource.ActionSummary} /// </summary> /// <param name=""request""></param> /// <returns></returns>"; - if (action.AllowAnonymous) - { - code += $@" - [AllowAnonymous]"; - } + if (resource.AllowAnonymous) + { code += $@" - [Http{action.Method}] - public Task<{action.ResponseTypeName}> {action.ActionName}({action.RequestTypeName} request) + [AllowAnonymous]"; + } + code += $@" + [Http{resource.Method}] + public Task<{resource.ResponseTypeName}> {resource.ActionName}({resource.RequestTypeName} request) {{ return mediator.Send(request); }} -"; - } - code += $@" + }} }} "; var dynamicAssembly = App.CompileCSharpClassCode(code); provider.AddAssembliesWithNotifyChanges(dynamicAssembly); + var dynamicAssemblyName = dynamicAssembly.GetName().Name; + resource.DynamicAssemblyName = dynamicAssemblyName; } - await rep.SaveNowAsync(); + } + + /// <summary> + /// 鍔ㄦ�佹帶鍒跺櫒鐑嫈 + /// </summary> + /// <param name="resource"></param> + /// <param name="provider"></param> + public static void DynamicControllerHotPluck(Resource resource, IDynamicApiRuntimeChangeProvider provider = null) + { + provider = provider ?? App.GetRequiredService<IDynamicApiRuntimeChangeProvider>(); + provider.RemoveAssembliesWithNotifyChanges(resource.DynamicAssemblyName); } /// <summary> @@ -196,7 +310,7 @@ /// </summary> /// <param name="type"></param> /// <returns></returns> - public static string GetCSharpFriendlyName(this Type type) + private static string GetCSharpFriendlyName(this Type type) { // 澶勭悊鍙┖绫诲瀷 if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) diff --git a/FlexJobApi.Core/settings.json b/FlexJobApi.Core/settings.json index 1d3e7c9..90a659b 100644 --- a/FlexJobApi.Core/settings.json +++ b/FlexJobApi.Core/settings.json @@ -51,6 +51,13 @@ } }, "SupplierPassword": "qwe321", + "Consul": { + "Address": "http://localhost:8500/", + "ServiceName": "Local_FlexJobApi", + "ServiceIP": "localhost", + "ServicePort": 53780, + "ServiceHealthCheck": "/healthz" + }, "DistributedCache": { "Access": "Redis", "Configuration": "118.178.252.28:5390,password=Bole123!" diff --git a/FlexJobApi.Database.Migrations/Migrations/20250806024717_UpdateResource0806.Designer.cs b/FlexJobApi.Database.Migrations/Migrations/20250806024717_UpdateResource0806.Designer.cs new file mode 100644 index 0000000..e4a1872 --- /dev/null +++ b/FlexJobApi.Database.Migrations/Migrations/20250806024717_UpdateResource0806.Designer.cs @@ -0,0 +1,2231 @@ +锘�// <auto-generated /> +using System; +using FlexJobApi.EntityFramework.Core; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace FlexJobApi.Database.Migrations.Migrations +{ + [DbContext(typeof(DefaultDbContext))] + [Migration("20250806024717_UpdateResource0806")] + partial class UpdateResource0806 + { + /// <inheritdoc /> + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.7") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("FlexJobApi.Core.Department", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property<DateTimeOffset>("CreatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("CreatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鍒涘缓鎿嶄綔浜�"); + + b.Property<Guid>("EnterpriseId") + .HasColumnType("uniqueidentifier") + .HasComment("浼佷笟Id"); + + b.Property<bool>("IsDeleted") + .HasColumnType("bit") + .HasComment("鏄惁鍒犻櫎"); + + b.Property<bool>("IsDisabled") + .HasColumnType("bit") + .HasComment("鏄惁绂佺敤"); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasComment("鍚嶇О"); + + b.Property<Guid?>("ParentId") + .HasColumnType("uniqueidentifier") + .HasComment("涓婄骇Id"); + + b.Property<string>("Path") + .HasColumnType("nvarchar(max)") + .HasComment("閮ㄩ棬璺緞"); + + b.Property<string>("Remark") + .HasColumnType("nvarchar(max)") + .HasComment("澶囨敞"); + + b.Property<int>("Sort") + .HasColumnType("int") + .HasComment("鎺掑簭"); + + b.Property<string>("TraceId") + .HasColumnType("nvarchar(max)") + .HasComment("璺熻釜Id"); + + b.Property<DateTimeOffset?>("UpdatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("UpdatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鏈�鍚庢洿鏂版搷浣滀汉"); + + b.HasKey("Id"); + + b.HasIndex("EnterpriseId"); + + b.HasIndex("ParentId"); + + b.ToTable("Department", t => + { + t.HasComment("閮ㄩ棬"); + }); + }); + + modelBuilder.Entity("FlexJobApi.Core.DictionaryCategory", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property<string>("Code") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasComment("缂栧彿"); + + b.Property<DateTimeOffset>("CreatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("CreatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鍒涘缓鎿嶄綔浜�"); + + b.Property<string>("FieldNames") + .HasColumnType("nvarchar(max)") + .HasComment("瀛楁鍚嶏紙閫楀彿闅斿紑锛�"); + + b.Property<bool>("IsDeleted") + .HasColumnType("bit") + .HasComment("鏄惁鍒犻櫎"); + + b.Property<string>("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasComment("鍚嶇О"); + + b.Property<string>("Remark") + .HasColumnType("nvarchar(max)") + .HasComment("澶囨敞"); + + b.Property<int>("Sort") + .HasColumnType("int") + .HasComment("鎺掑簭"); + + b.Property<string>("TraceId") + .HasColumnType("nvarchar(max)") + .HasComment("璺熻釜Id"); + + b.Property<DateTimeOffset?>("UpdatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("UpdatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鏈�鍚庢洿鏂版搷浣滀汉"); + + b.HasKey("Id"); + + b.ToTable("DictionaryCategory", t => + { + t.HasComment("瀛楀吀绫诲埆"); + }); + }); + + modelBuilder.Entity("FlexJobApi.Core.DictionaryData", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property<Guid>("CategoryId") + .HasColumnType("uniqueidentifier") + .HasComment("绫诲埆Id"); + + b.Property<string>("Code") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasComment("缂栧彿"); + + b.Property<string>("Content") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasComment("鏄剧ず鍐呭"); + + b.Property<DateTimeOffset>("CreatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("CreatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鍒涘缓鎿嶄綔浜�"); + + b.Property<string>("Field1") + .HasColumnType("nvarchar(max)") + .HasComment("瀛楁1"); + + b.Property<string>("Field2") + .HasColumnType("nvarchar(max)") + .HasComment("瀛楁2"); + + b.Property<string>("Field3") + .HasColumnType("nvarchar(max)") + .HasComment("瀛楁3"); + + b.Property<string>("Field4") + .HasColumnType("nvarchar(max)") + .HasComment("瀛楁4"); + + b.Property<string>("Field5") + .HasColumnType("nvarchar(max)") + .HasComment("瀛楁5"); + + b.Property<bool>("IsDeleted") + .HasColumnType("bit") + .HasComment("鏄惁鍒犻櫎"); + + b.Property<bool>("IsDisabled") + .HasColumnType("bit") + .HasComment("鏄惁绂佺敤"); + + b.Property<Guid?>("ParentId") + .HasColumnType("uniqueidentifier") + .HasComment("涓婄骇Id"); + + b.Property<string>("Path") + .HasColumnType("nvarchar(max)") + .HasComment("瀛楀吀璺緞"); + + b.Property<int>("Sort") + .HasColumnType("int") + .HasComment("鎺掑簭"); + + b.Property<string>("TraceId") + .HasColumnType("nvarchar(max)") + .HasComment("璺熻釜Id"); + + b.Property<DateTimeOffset?>("UpdatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("UpdatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鏈�鍚庢洿鏂版搷浣滀汉"); + + b.HasKey("Id"); + + b.HasIndex("CategoryId"); + + b.HasIndex("ParentId"); + + b.ToTable("DictionaryData", t => + { + t.HasComment("瀛楀吀鏁版嵁"); + }); + }); + + modelBuilder.Entity("FlexJobApi.Core.Enterprise", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property<string>("BankCard") + .HasMaxLength(32) + .HasColumnType("nvarchar(32)") + .HasComment("娉曚汉鎴栫粡鍔炰汉閾惰鍗″彿"); + + b.Property<Guid?>("BankCardImgId") + .HasColumnType("uniqueidentifier") + .HasComment("娉曚汉鎴栫粡鍔炰汉閾惰鍗$収鐗嘔d"); + + b.Property<string>("ContactNumber") + .HasMaxLength(11) + .HasColumnType("nvarchar(11)") + .HasComment("鑱旂郴鐢佃瘽"); + + b.Property<string>("Contacts") + .HasMaxLength(32) + .HasColumnType("nvarchar(32)") + .HasComment("鑱旂郴浜�"); + + b.Property<DateTimeOffset>("CreatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("CreatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鍒涘缓鎿嶄綔浜�"); + + b.Property<string>("EnterpriseName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasComment("浼佷笟鍏ㄧО"); + + b.Property<int?>("EnterpriseRealMethod") + .HasColumnType("int") + .HasComment("浼佷笟璁よ瘉鏂瑰紡"); + + b.Property<string>("Identity") + .HasMaxLength(18) + .HasColumnType("nvarchar(18)") + .HasComment("娉曚汉鎴栫粡鍔炰汉韬唤璇佸彿"); + + b.Property<Guid?>("IdentityBackImgId") + .HasColumnType("uniqueidentifier") + .HasComment("娉曚汉鎴栫粡鍔炰汉韬唤璇佸浗寰介潰Id"); + + b.Property<Guid?>("IdentityImgId") + .HasColumnType("uniqueidentifier") + .HasComment("娉曚汉鎴栫粡鍔炰汉韬唤璇佷汉鍍忛潰Id"); + + b.Property<bool>("IsDeleted") + .HasColumnType("bit") + .HasComment("鏄惁鍒犻櫎"); + + b.Property<bool>("IsReal") + .HasColumnType("bit") + .HasComment("鏄惁瀹炲悕"); + + b.Property<string>("LegalPerson") + .HasMaxLength(32) + .HasColumnType("nvarchar(32)") + .HasComment("娉曚汉濮撳悕"); + + b.Property<Guid?>("LicenseImageId") + .HasColumnType("uniqueidentifier") + .HasComment("钀ヤ笟鎵х収鐓х墖Id"); + + b.Property<string>("Name") + .HasMaxLength(32) + .HasColumnType("nvarchar(32)") + .HasComment("娉曚汉鎴栫粡鍔炰汉濮撳悕"); + + b.Property<int?>("PersonalRealMethod") + .HasColumnType("int") + .HasComment("娉曚汉鎴栫粡鍔炰汉瀹炲悕鏂瑰紡"); + + b.Property<string>("PhoneNumber") + .HasMaxLength(11) + .HasColumnType("nvarchar(11)") + .HasComment("娉曚汉鎴栫粡鍔炰汉鎵嬫満鍙�"); + + b.Property<bool?>("Proxy") + .HasColumnType("bit") + .HasComment("鏄惁濮旀墭缁忓姙浜�"); + + b.Property<string>("ProxyPowerAttorneyUrl") + .HasColumnType("nvarchar(max)") + .HasComment("浼佷笟鎺堟潈涔�"); + + b.Property<int?>("RealAccess") + .HasColumnType("int") + .HasComment("瀹炲悕閫氶亾"); + + b.Property<string>("SocietyCreditCode") + .IsRequired() + .HasMaxLength(18) + .HasColumnType("nvarchar(18)") + .HasComment("缁熶竴绀句細淇$敤浠g爜"); + + b.Property<int>("Sort") + .HasColumnType("int") + .HasComment("鎺掑簭"); + + b.Property<string>("TraceId") + .HasColumnType("nvarchar(max)") + .HasComment("璺熻釜Id"); + + b.Property<DateTimeOffset?>("UpdatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("UpdatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鏈�鍚庢洿鏂版搷浣滀汉"); + + b.HasKey("Id"); + + b.HasIndex("IdentityBackImgId"); + + b.HasIndex("IdentityImgId"); + + b.HasIndex("LicenseImageId"); + + b.ToTable("Enterprise", t => + { + t.HasComment("浼佷笟"); + }); + }); + + modelBuilder.Entity("FlexJobApi.Core.FileStore", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property<string>("AbsolutePath") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasComment("缁濆璺緞"); + + b.Property<int>("Access") + .HasColumnType("int") + .HasComment("閫氶亾"); + + b.Property<string>("ContentType") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasComment("鍐呭绫诲瀷"); + + b.Property<DateTimeOffset>("CreatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("CreatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鍒涘缓鎿嶄綔浜�"); + + b.Property<string>("Extension") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("nvarchar(32)") + .HasComment("鎵╁睍鍚�"); + + b.Property<int>("FileType") + .HasColumnType("int") + .HasComment("鏂囦欢绫诲瀷"); + + b.Property<string>("Hash") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasComment("鍝堝笇"); + + b.Property<int?>("ImageHeight") + .HasColumnType("int") + .HasComment("楂樺害锛堝儚绱狅級"); + + b.Property<int?>("ImageWidth") + .HasColumnType("int") + .HasComment("瀹藉害锛堝儚绱狅級"); + + b.Property<bool>("IsDeleted") + .HasColumnType("bit") + .HasComment("鏄惁鍒犻櫎"); + + b.Property<long>("Length") + .HasColumnType("bigint") + .HasComment("鏂囦欢澶у皬锛堝瓧鑺傦級"); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasComment("鍚嶇О"); + + b.Property<string>("RelativePath") + .HasColumnType("nvarchar(max)") + .HasComment("鐩稿璺緞"); + + b.Property<int>("Sort") + .HasColumnType("int") + .HasComment("鎺掑簭"); + + b.Property<string>("TraceId") + .HasColumnType("nvarchar(max)") + .HasComment("璺熻釜Id"); + + b.Property<DateTimeOffset?>("UpdatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("UpdatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鏈�鍚庢洿鏂版搷浣滀汉"); + + b.HasKey("Id"); + + b.ToTable("FileStore", t => + { + t.HasComment("鏂囦欢瀛樺偍"); + }); + }); + + modelBuilder.Entity("FlexJobApi.Core.FileVirtualPath", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property<DateTimeOffset>("CreatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("CreatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鍒涘缓鎿嶄綔浜�"); + + b.Property<bool>("IsDeleted") + .HasColumnType("bit") + .HasComment("鏄惁鍒犻櫎"); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasComment("鍚嶇О"); + + b.Property<int>("Sort") + .HasColumnType("int") + .HasComment("鎺掑簭"); + + b.Property<Guid>("StoreId") + .HasColumnType("uniqueidentifier") + .HasComment("鏂囦欢瀛樺偍Id"); + + b.Property<string>("TraceId") + .HasColumnType("nvarchar(max)") + .HasComment("璺熻釜Id"); + + b.Property<DateTimeOffset?>("UpdatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("UpdatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鏈�鍚庢洿鏂版搷浣滀汉"); + + b.Property<string>("VirtualPath") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasComment("铏氭嫙璺緞"); + + b.HasKey("Id"); + + b.HasIndex("StoreId"); + + b.ToTable("FileVirtualPath", t => + { + t.HasComment("鏂囦欢铏氭嫙璺緞"); + }); + }); + + modelBuilder.Entity("FlexJobApi.Core.Menu", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property<int>("ClientType") + .HasColumnType("int") + .HasComment("瀹㈡埛绔被鍨�"); + + b.Property<string>("Code") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasComment("缂栧彿"); + + b.Property<DateTimeOffset>("CreatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("CreatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鍒涘缓鎿嶄綔浜�"); + + b.Property<string>("Group") + .HasColumnType("nvarchar(max)") + .HasComment("鍒嗙粍鍚嶇О锛堢敤浜庢寜閽�/瀛楁锛�"); + + b.Property<string>("Icon") + .HasColumnType("nvarchar(max)") + .HasComment("鍥炬爣"); + + b.Property<bool>("IsCache") + .HasColumnType("bit") + .HasComment("鏄惁缂撳瓨"); + + b.Property<bool>("IsDeleted") + .HasColumnType("bit") + .HasComment("鏄惁鍒犻櫎"); + + b.Property<bool>("IsDisabled") + .HasColumnType("bit") + .HasComment("鏄惁绂佺敤"); + + b.Property<string>("Location") + .HasColumnType("nvarchar(max)") + .HasComment("浣嶇疆锛堢敤浜庢寜閽級"); + + b.Property<string>("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasComment("鍚嶇О"); + + b.Property<Guid?>("ParentId") + .HasColumnType("uniqueidentifier") + .HasComment("涓婄骇Id"); + + b.Property<string>("Path") + .HasColumnType("nvarchar(max)") + .HasComment("鑿滃崟璺緞"); + + b.Property<string>("Remark") + .HasColumnType("nvarchar(max)") + .HasComment("澶囨敞"); + + b.Property<int>("Sort") + .HasColumnType("int") + .HasComment("鎺掑簭"); + + b.Property<string>("TraceId") + .HasColumnType("nvarchar(max)") + .HasComment("璺熻釜Id"); + + b.Property<int>("Type") + .HasColumnType("int") + .HasComment("绫诲瀷"); + + b.Property<DateTimeOffset?>("UpdatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("UpdatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鏈�鍚庢洿鏂版搷浣滀汉"); + + b.Property<string>("Url") + .HasColumnType("nvarchar(max)") + .HasComment("閾炬帴鍦板潃"); + + b.Property<int>("UserType") + .HasColumnType("int") + .HasComment("鐢ㄦ埛绫诲瀷"); + + b.Property<int>("VisitLevel") + .HasColumnType("int") + .HasComment("璁块棶绾у埆"); + + b.Property<string>("Width") + .HasColumnType("nvarchar(max)") + .HasComment("鍒楀锛堢敤浜庢寜閽�/鍒�/鍏冪礌锛�"); + + b.HasKey("Id"); + + b.HasIndex("ParentId"); + + b.ToTable("Menu", t => + { + t.HasComment("鑿滃崟"); + }); + }); + + modelBuilder.Entity("FlexJobApi.Core.Resource", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property<string>("ActionName") + .HasColumnType("nvarchar(max)") + .HasComment("濮旀墭鍚嶇О"); + + b.Property<string>("ActionSummary") + .HasColumnType("nvarchar(max)") + .HasComment("濮旀墭鎽樿"); + + b.Property<bool>("AllowAnonymous") + .HasColumnType("bit") + .HasComment("蹇界暐鏉冮檺"); + + b.Property<string>("ApplicationName") + .HasColumnType("nvarchar(max)") + .HasComment("搴旂敤鍚嶇О"); + + b.Property<string>("Code") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasComment("缂栧彿"); + + b.Property<int>("Controller") + .HasColumnType("int") + .HasComment("鎺у埗鍣�"); + + b.Property<string>("ControllerSummary") + .HasColumnType("nvarchar(max)") + .HasComment("鎺у埗鍣ㄦ憳瑕�"); + + b.Property<DateTimeOffset>("CreatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("CreatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鍒涘缓鎿嶄綔浜�"); + + b.Property<string>("DynamicAssemblyName") + .HasColumnType("nvarchar(max)") + .HasComment("鍔ㄦ�佺▼搴忛泦鍚嶇О"); + + b.Property<bool>("IsDeleted") + .HasColumnType("bit") + .HasComment("鏄惁鍒犻櫎"); + + b.Property<bool>("IsExpired") + .HasColumnType("bit") + .HasComment("鏄惁宸茶繃鏈�"); + + b.Property<int>("Method") + .HasColumnType("int") + .HasComment("璇锋眰鏂瑰紡"); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasComment("鍚嶇О"); + + b.Property<string>("RequestTypeFullName") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasComment("璇锋眰绫诲瀷鍏ㄥ悕"); + + b.Property<string>("RequestTypeName") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasComment("璇锋眰绫诲瀷鍚嶇О"); + + b.Property<string>("ResponseTypeFullName") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasComment("鍝嶅簲绫诲瀷鍏ㄥ悕"); + + b.Property<string>("ResponseTypeName") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasComment("鍝嶅簲绫诲瀷鍚嶇О"); + + b.Property<string>("Route") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasComment("璺敱"); + + b.Property<string>("RouteArea") + .HasColumnType("nvarchar(max)") + .HasComment("璺敱鍖哄煙"); + + b.Property<int>("Service") + .HasColumnType("int") + .HasComment("鏈嶅姟"); + + b.Property<string>("ServiceName") + .HasColumnType("nvarchar(max)") + .HasComment("鏈嶅姟鍚嶇О"); + + b.Property<int>("Sort") + .HasColumnType("int") + .HasComment("鎺掑簭"); + + b.Property<string>("TraceId") + .HasColumnType("nvarchar(max)") + .HasComment("璺熻釜Id"); + + b.Property<DateTimeOffset?>("UpdatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("UpdatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鏈�鍚庢洿鏂版搷浣滀汉"); + + b.HasKey("Id"); + + b.ToTable("Resource", t => + { + t.HasComment("璧勬簮"); + }); + }); + + modelBuilder.Entity("FlexJobApi.Core.Role", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property<int>("ClientType") + .HasColumnType("int") + .HasComment("瀹㈡埛绔被鍨�"); + + b.Property<DateTimeOffset>("CreatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("CreatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鍒涘缓鎿嶄綔浜�"); + + b.Property<int>("DataPower") + .HasColumnType("int") + .HasComment("鏁版嵁鏉冮檺"); + + b.Property<bool>("IsDeleted") + .HasColumnType("bit") + .HasComment("鏄惁鍒犻櫎"); + + b.Property<bool>("IsDisabled") + .HasColumnType("bit") + .HasComment("鏄惁绂佺敤"); + + b.Property<int>("MinLevel") + .HasColumnType("int") + .HasComment("鏈�浣庣骇鍒�"); + + b.Property<string>("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasComment("鍚嶇О"); + + b.Property<string>("Remark") + .HasColumnType("nvarchar(max)") + .HasComment("澶囨敞"); + + b.Property<int>("Sort") + .HasColumnType("int") + .HasComment("鎺掑簭"); + + b.Property<string>("TraceId") + .HasColumnType("nvarchar(max)") + .HasComment("璺熻釜Id"); + + b.Property<DateTimeOffset?>("UpdatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("UpdatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鏈�鍚庢洿鏂版搷浣滀汉"); + + b.Property<int>("UserType") + .HasColumnType("int") + .HasComment("鐢ㄦ埛绫诲瀷"); + + b.HasKey("Id"); + + b.ToTable("Role", t => + { + t.HasComment("瑙掕壊"); + }); + }); + + modelBuilder.Entity("FlexJobApi.Core.RoleMenu", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property<DateTimeOffset>("CreatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("CreatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鍒涘缓鎿嶄綔浜�"); + + b.Property<bool>("IsDeleted") + .HasColumnType("bit") + .HasComment("鏄惁鍒犻櫎"); + + b.Property<Guid>("MenuId") + .HasColumnType("uniqueidentifier") + .HasComment("鑿滃崟Id"); + + b.Property<Guid>("RoleId") + .HasColumnType("uniqueidentifier") + .HasComment("瑙掕壊Id"); + + b.Property<int>("Sort") + .HasColumnType("int") + .HasComment("鎺掑簭"); + + b.Property<string>("TraceId") + .HasColumnType("nvarchar(max)") + .HasComment("璺熻釜Id"); + + b.Property<DateTimeOffset?>("UpdatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("UpdatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鏈�鍚庢洿鏂版搷浣滀汉"); + + b.HasKey("Id"); + + b.HasIndex("MenuId"); + + b.HasIndex("RoleId"); + + b.ToTable("RoleMenu", t => + { + t.HasComment("瑙掕壊鑿滃崟"); + }); + }); + + modelBuilder.Entity("FlexJobApi.Core.RoleResource", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property<DateTimeOffset>("CreatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("CreatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鍒涘缓鎿嶄綔浜�"); + + b.Property<int>("DataPower") + .HasColumnType("int") + .HasComment("鏁版嵁鏉冮檺"); + + b.Property<bool>("IsDeleted") + .HasColumnType("bit") + .HasComment("鏄惁鍒犻櫎"); + + b.Property<Guid>("ResourceId") + .HasColumnType("uniqueidentifier") + .HasComment("璧勬簮Id"); + + b.Property<Guid>("RoleId") + .HasColumnType("uniqueidentifier") + .HasComment("瑙掕壊Id"); + + b.Property<int>("Sort") + .HasColumnType("int") + .HasComment("鎺掑簭"); + + b.Property<string>("TraceId") + .HasColumnType("nvarchar(max)") + .HasComment("璺熻釜Id"); + + b.Property<DateTimeOffset?>("UpdatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("UpdatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鏈�鍚庢洿鏂版搷浣滀汉"); + + b.HasKey("Id"); + + b.HasIndex("ResourceId"); + + b.HasIndex("RoleId"); + + b.ToTable("RoleResource", t => + { + t.HasComment("瑙掕壊璧勬簮"); + }); + }); + + modelBuilder.Entity("FlexJobApi.Core.TaskInfo", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property<string>("Address") + .HasColumnType("nvarchar(max)") + .HasComment("浠诲姟鍦扮偣璇︾粏鍦板潃"); + + b.Property<int>("AgeMaxLimit") + .HasColumnType("int") + .HasComment("骞撮緞鑼冨洿澶�"); + + b.Property<int>("AgeMinLimit") + .HasColumnType("int") + .HasComment("骞撮緞鑼冨洿鏈�灏�"); + + b.Property<DateTime>("BeginTime") + .HasColumnType("datetime2") + .HasComment("浠诲姟寮�濮嬫椂闂�"); + + b.Property<int>("BillingMethod") + .HasColumnType("int") + .HasComment("璁¤垂鏂瑰紡"); + + b.Property<Guid>("CityId") + .HasColumnType("uniqueidentifier") + .HasComment("浠诲姟鍦扮偣鎵�灞炲尯鍩烮d"); + + b.Property<DateTimeOffset>("CreatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("CreatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鍒涘缓鎿嶄綔浜�"); + + b.Property<DateTime>("EndTime") + .HasColumnType("datetime2") + .HasComment("浠诲姟缁撴潫鏃堕棿"); + + b.Property<Guid>("EnterpriseId") + .HasColumnType("uniqueidentifier") + .HasComment("浼佷笟Id"); + + b.Property<int>("GenderLimit") + .HasColumnType("int") + .HasComment("鎬у埆瑕佹眰"); + + b.Property<bool>("IsDeleted") + .HasColumnType("bit") + .HasComment("鏄惁鍒犻櫎"); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasComment("浠诲姟鍚嶇О"); + + b.Property<decimal>("ServiceFee") + .HasColumnType("decimal(18,2)") + .HasComment("鏈嶅姟璐�"); + + b.Property<int>("SettlementCycle") + .HasColumnType("int") + .HasComment("缁撶畻鏂瑰紡"); + + b.Property<int>("Sort") + .HasColumnType("int") + .HasComment("鎺掑簭"); + + b.Property<string>("TraceId") + .HasColumnType("nvarchar(max)") + .HasComment("璺熻釜Id"); + + b.Property<DateTimeOffset?>("UpdatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("UpdatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鏈�鍚庢洿鏂版搷浣滀汉"); + + b.HasKey("Id"); + + b.HasIndex("CityId"); + + b.HasIndex("EnterpriseId"); + + b.ToTable("TaskInfo", t => + { + t.HasComment("浠诲姟淇℃伅"); + }); + }); + + modelBuilder.Entity("FlexJobApi.Core.TaskInfoBenefit", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property<Guid>("BenefitId") + .HasColumnType("uniqueidentifier") + .HasComment("绂忓埄Id"); + + b.Property<Guid>("BenefitId1") + .HasColumnType("uniqueidentifier"); + + b.Property<DateTimeOffset>("CreatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("CreatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鍒涘缓鎿嶄綔浜�"); + + b.Property<bool>("IsDeleted") + .HasColumnType("bit") + .HasComment("鏄惁鍒犻櫎"); + + b.Property<int>("Sort") + .HasColumnType("int") + .HasComment("鎺掑簭"); + + b.Property<Guid>("TaskInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("浠诲姟Id"); + + b.Property<string>("TraceId") + .HasColumnType("nvarchar(max)") + .HasComment("璺熻釜Id"); + + b.Property<DateTimeOffset?>("UpdatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("UpdatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鏈�鍚庢洿鏂版搷浣滀汉"); + + b.HasKey("Id"); + + b.HasIndex("BenefitId"); + + b.HasIndex("BenefitId1"); + + b.ToTable("TaskInfoBenefit", t => + { + t.HasComment("浠诲姟绂忓埄"); + }); + }); + + modelBuilder.Entity("FlexJobApi.Core.TaskInfoCredentialLimit", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property<DateTimeOffset>("CreatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("CreatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鍒涘缓鎿嶄綔浜�"); + + b.Property<bool>("IsDeleted") + .HasColumnType("bit") + .HasComment("鏄惁鍒犻櫎"); + + b.Property<int>("Sort") + .HasColumnType("int") + .HasComment("鎺掑簭"); + + b.Property<Guid>("TaskInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("浠诲姟Id"); + + b.Property<string>("TraceId") + .HasColumnType("nvarchar(max)") + .HasComment("璺熻釜Id"); + + b.Property<Guid?>("TypeId") + .HasColumnType("uniqueidentifier") + .HasComment("璇佷功绫诲瀷Id"); + + b.Property<DateTimeOffset?>("UpdatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("UpdatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鏈�鍚庢洿鏂版搷浣滀汉"); + + b.HasKey("Id"); + + b.HasIndex("TaskInfoId"); + + b.HasIndex("TypeId"); + + b.ToTable("TaskInfoCredentialLimit"); + }); + + modelBuilder.Entity("FlexJobApi.Core.TaskInfoUser", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property<DateTimeOffset>("CreatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("CreatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鍒涘缓鎿嶄綔浜�"); + + b.Property<int>("HireStatus") + .HasColumnType("int") + .HasComment("褰曠敤鐘舵��"); + + b.Property<DateTime?>("HireTime") + .HasColumnType("datetime2") + .HasComment("褰曠敤鏃堕棿"); + + b.Property<bool>("IsDeleted") + .HasColumnType("bit") + .HasComment("鏄惁鍒犻櫎"); + + b.Property<int?>("SignContractStatus") + .HasColumnType("int") + .HasComment("绛剧害鐘舵��"); + + b.Property<DateTime?>("SignContractTime") + .HasColumnType("datetime2") + .HasComment("绛剧害鏃堕棿"); + + b.Property<int>("Sort") + .HasColumnType("int") + .HasComment("鎺掑簭"); + + b.Property<Guid>("TaskInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("浠诲姟Id"); + + b.Property<string>("TraceId") + .HasColumnType("nvarchar(max)") + .HasComment("璺熻釜Id"); + + b.Property<DateTimeOffset?>("UpdatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("UpdatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鏈�鍚庢洿鏂版搷浣滀汉"); + + b.Property<Guid>("UserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鐢ㄦ埛淇℃伅Id"); + + b.HasKey("Id"); + + b.HasIndex("TaskInfoId"); + + b.HasIndex("UserInfoId"); + + b.ToTable("TaskInfoUser", t => + { + t.HasComment("浠诲姟鐢ㄦ埛淇℃伅"); + }); + }); + + modelBuilder.Entity("FlexJobApi.Core.UserAuth", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property<Guid?>("AvatarId") + .HasColumnType("uniqueidentifier") + .HasComment("澶村儚Id"); + + b.Property<string>("BankCard") + .HasMaxLength(32) + .HasColumnType("nvarchar(32)") + .HasComment("閾惰鍗″彿"); + + b.Property<Guid?>("BankCardImgId") + .HasColumnType("uniqueidentifier") + .HasComment("閾惰鍗$収鐗嘔d"); + + b.Property<DateTimeOffset>("CreatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("CreatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鍒涘缓鎿嶄綔浜�"); + + b.Property<string>("Identity") + .HasColumnType("nvarchar(max)") + .HasComment("韬唤璇佸彿"); + + b.Property<Guid?>("IdentityBackImgId") + .HasColumnType("uniqueidentifier") + .HasComment("韬唤璇佸浗寰介潰Id"); + + b.Property<Guid?>("IdentityImgId") + .HasColumnType("uniqueidentifier") + .HasComment("韬唤璇佷汉鍍忛潰Id"); + + b.Property<bool>("IsCheckPhoneNumber") + .HasColumnType("bit") + .HasComment("鏄惁宸叉牎楠屾墜鏈哄彿"); + + b.Property<bool>("IsDeleted") + .HasColumnType("bit") + .HasComment("鏄惁鍒犻櫎"); + + b.Property<bool>("IsReal") + .HasColumnType("bit") + .HasComment("鏄惁瀹炲悕"); + + b.Property<string>("Name") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("nvarchar(32)") + .HasComment("濮撳悕"); + + b.Property<string>("Password") + .HasColumnType("nvarchar(max)") + .HasComment("瀵嗙爜"); + + b.Property<string>("PhoneNumber") + .HasMaxLength(11) + .HasColumnType("nvarchar(11)") + .HasComment("鎵嬫満鍙�"); + + b.Property<int?>("RealAccess") + .HasColumnType("int") + .HasComment("瀹炲悕閫氶亾"); + + b.Property<int>("Sort") + .HasColumnType("int") + .HasComment("鎺掑簭"); + + b.Property<string>("TraceId") + .HasColumnType("nvarchar(max)") + .HasComment("璺熻釜Id"); + + b.Property<DateTimeOffset?>("UpdatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("UpdatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鏈�鍚庢洿鏂版搷浣滀汉"); + + b.Property<string>("UserName") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("nvarchar(32)") + .HasComment("鐢ㄦ埛鍚�"); + + b.HasKey("Id"); + + b.HasIndex("AvatarId"); + + b.HasIndex("BankCardImgId"); + + b.HasIndex("IdentityBackImgId"); + + b.HasIndex("IdentityImgId"); + + b.ToTable("UserAuth", t => + { + t.HasComment("鐢ㄦ埛"); + }); + + b.HasData( + new + { + Id = new Guid("11111111-1111-1111-1111-111111111111"), + CreatedTime = new DateTimeOffset(new DateTime(2000, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 8, 0, 0, 0)), + IsCheckPhoneNumber = false, + IsDeleted = false, + IsReal = false, + Name = "绠$悊鍛�", + Password = "iEYggKrMhQ3ASUGLobra1w==:fn/DsMJUbD9FGpvBvR3moMpMPptdxzZlourPVhU479I=", + Sort = 0, + UserName = "system" + }); + }); + + modelBuilder.Entity("FlexJobApi.Core.UserInfo", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property<Guid?>("CityId") + .HasColumnType("uniqueidentifier") + .HasComment("甯搁┗鍩庡競Id"); + + b.Property<DateTimeOffset>("CreatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("CreatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鍒涘缓鎿嶄綔浜�"); + + b.Property<Guid?>("EducationalBackgroundId") + .HasColumnType("uniqueidentifier") + .HasComment("瀛﹀巻Id"); + + b.Property<Guid?>("EnterpriseId") + .HasColumnType("uniqueidentifier") + .HasComment("浼佷笟Id"); + + b.Property<int?>("FreeTime") + .HasColumnType("int") + .HasComment("绌洪棽鏃堕棿"); + + b.Property<int?>("Height") + .HasColumnType("int") + .HasComment("韬珮"); + + b.Property<bool>("IsDeleted") + .HasColumnType("bit") + .HasComment("鏄惁鍒犻櫎"); + + b.Property<int?>("JobSeekingStatus") + .HasColumnType("int") + .HasComment("姹傝亴鐘舵��"); + + b.Property<int>("Level") + .HasColumnType("int") + .HasComment("绾у埆"); + + b.Property<Guid?>("PersonalIdentityId") + .HasColumnType("uniqueidentifier") + .HasComment("韬唤Id"); + + b.Property<string>("Remark") + .HasColumnType("nvarchar(max)") + .HasComment("澶囨敞"); + + b.Property<int>("Sort") + .HasColumnType("int") + .HasComment("鎺掑簭"); + + b.Property<int>("Status") + .HasColumnType("int") + .HasComment("鐘舵��"); + + b.Property<string>("TraceId") + .HasColumnType("nvarchar(max)") + .HasComment("璺熻釜Id"); + + b.Property<int>("Type") + .HasColumnType("int") + .HasComment("鐢ㄦ埛绫诲瀷"); + + b.Property<DateTimeOffset?>("UpdatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("UpdatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鏈�鍚庢洿鏂版搷浣滀汉"); + + b.Property<Guid>("UserAuthId") + .HasColumnType("uniqueidentifier") + .HasComment("鐢ㄦ埛Id"); + + b.Property<int?>("Weight") + .HasColumnType("int") + .HasComment("浣撻噸"); + + b.Property<string>("WorkExperience") + .HasColumnType("nvarchar(max)") + .HasComment("宸ヤ綔缁忛獙"); + + b.Property<string>("WorkSeniority") + .HasColumnType("nvarchar(max)") + .HasComment("宸ヤ綔璧勫巻"); + + b.Property<string>("WxmpOpenId") + .HasMaxLength(32) + .HasColumnType("nvarchar(32)") + .HasComment("寰俊寮�鏀綢d"); + + b.HasKey("Id"); + + b.HasIndex("CityId"); + + b.HasIndex("EducationalBackgroundId"); + + b.HasIndex("EnterpriseId"); + + b.HasIndex("PersonalIdentityId"); + + b.HasIndex("UserAuthId"); + + b.ToTable("UserInfo", t => + { + t.HasComment("鐢ㄦ埛淇℃伅"); + }); + + b.HasData( + new + { + Id = new Guid("11111111-1111-1111-1111-111111111112"), + CreatedTime = new DateTimeOffset(new DateTime(2000, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 8, 0, 0, 0)), + IsDeleted = false, + Level = 999, + Sort = 0, + Status = 0, + Type = 100, + UserAuthId = new Guid("11111111-1111-1111-1111-111111111111") + }); + }); + + modelBuilder.Entity("FlexJobApi.Core.UserInfoBankCard", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property<string>("Bank") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasComment("寮�鎴疯"); + + b.Property<string>("Code") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("nvarchar(32)") + .HasComment("閾惰鍗″彿"); + + b.Property<DateTimeOffset>("CreatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("CreatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鍒涘缓鎿嶄綔浜�"); + + b.Property<bool>("IsDeleted") + .HasColumnType("bit") + .HasComment("鏄惁鍒犻櫎"); + + b.Property<string>("PhoneNumber") + .IsRequired() + .HasMaxLength(11) + .HasColumnType("nvarchar(11)") + .HasComment("閾惰棰勭暀鎵嬫満鍙�"); + + b.Property<int>("Sort") + .HasColumnType("int") + .HasComment("鎺掑簭"); + + b.Property<string>("TraceId") + .HasColumnType("nvarchar(max)") + .HasComment("璺熻釜Id"); + + b.Property<DateTimeOffset?>("UpdatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("UpdatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鏈�鍚庢洿鏂版搷浣滀汉"); + + b.Property<Guid>("UserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鐢ㄦ埛淇℃伅Id"); + + b.HasKey("Id"); + + b.HasIndex("UserInfoId"); + + b.ToTable("UserInfoBankCard", t => + { + t.HasComment("鐢ㄦ埛閾惰鍗′俊鎭�"); + }); + }); + + modelBuilder.Entity("FlexJobApi.Core.UserInfoCredential", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property<Guid?>("BackImgId") + .HasColumnType("uniqueidentifier") + .HasComment("璇佷功鍙嶉潰鐓х墖Id"); + + b.Property<string>("Code") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasComment("璇佷功缂栧彿"); + + b.Property<DateTimeOffset>("CreatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("CreatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鍒涘缓鎿嶄綔浜�"); + + b.Property<DateTime>("EndDate") + .HasColumnType("datetime2") + .HasComment("缁撴潫鏃ユ湡"); + + b.Property<Guid>("ImgId") + .HasColumnType("uniqueidentifier") + .HasComment("璇佷功姝i潰鐓х墖Id"); + + b.Property<bool>("IsDeleted") + .HasColumnType("bit") + .HasComment("鏄惁鍒犻櫎"); + + b.Property<bool>("IsForever") + .HasColumnType("bit") + .HasComment("姘镐箙璇佷功"); + + b.Property<string>("IssueUnit") + .HasColumnType("nvarchar(max)") + .HasComment("鍙戣瘉鍗曚綅"); + + b.Property<int>("Sort") + .HasColumnType("int") + .HasComment("鎺掑簭"); + + b.Property<DateTime>("StartDate") + .HasColumnType("datetime2") + .HasComment("寮�濮嬫棩鏈�"); + + b.Property<string>("TraceId") + .HasColumnType("nvarchar(max)") + .HasComment("璺熻釜Id"); + + b.Property<Guid?>("TypeId") + .HasColumnType("uniqueidentifier") + .HasComment("璇佷功绫诲瀷Id"); + + b.Property<DateTimeOffset?>("UpdatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("UpdatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鏈�鍚庢洿鏂版搷浣滀汉"); + + b.Property<Guid>("UserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鐢ㄦ埛淇℃伅Id"); + + b.HasKey("Id"); + + b.HasIndex("BackImgId"); + + b.HasIndex("ImgId"); + + b.HasIndex("TypeId"); + + b.HasIndex("UserInfoId"); + + b.ToTable("UserInfoCredential", t => + { + t.HasComment("鐢ㄦ埛淇℃伅璧勬牸璇佷功"); + }); + }); + + modelBuilder.Entity("FlexJobApi.Core.UserInfoDepartment", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property<DateTimeOffset>("CreatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("CreatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鍒涘缓鎿嶄綔浜�"); + + b.Property<Guid>("DepartmentId") + .HasColumnType("uniqueidentifier") + .HasComment("閮ㄩ棬Id"); + + b.Property<bool>("IsDeleted") + .HasColumnType("bit") + .HasComment("鏄惁鍒犻櫎"); + + b.Property<int>("Sort") + .HasColumnType("int") + .HasComment("鎺掑簭"); + + b.Property<string>("TraceId") + .HasColumnType("nvarchar(max)") + .HasComment("璺熻釜Id"); + + b.Property<DateTimeOffset?>("UpdatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("UpdatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鏈�鍚庢洿鏂版搷浣滀汉"); + + b.Property<Guid>("UserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鐢ㄦ埛淇℃伅Id"); + + b.HasKey("Id"); + + b.HasIndex("DepartmentId"); + + b.HasIndex("UserInfoId"); + + b.ToTable("UserInfoDepartment", t => + { + t.HasComment("鐢ㄦ埛淇℃伅閮ㄩ棬"); + }); + }); + + modelBuilder.Entity("FlexJobApi.Core.UserInfoExpectJob", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property<DateTimeOffset>("CreatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("CreatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鍒涘缓鎿嶄綔浜�"); + + b.Property<bool>("IsDeleted") + .HasColumnType("bit") + .HasComment("鏄惁鍒犻櫎"); + + b.Property<Guid>("PersonalIdentityId") + .HasColumnType("uniqueidentifier") + .HasComment("鏈熸湜宀椾綅Id"); + + b.Property<int>("Sort") + .HasColumnType("int") + .HasComment("鎺掑簭"); + + b.Property<string>("TraceId") + .HasColumnType("nvarchar(max)") + .HasComment("璺熻釜Id"); + + b.Property<DateTimeOffset?>("UpdatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("UpdatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鏈�鍚庢洿鏂版搷浣滀汉"); + + b.Property<Guid>("UserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鐢ㄦ埛淇℃伅Id"); + + b.HasKey("Id"); + + b.HasIndex("PersonalIdentityId"); + + b.HasIndex("UserInfoId"); + + b.ToTable("UserInfoExpectJob", t => + { + t.HasComment("鐢ㄦ埛淇℃伅鏈熸湜宀椾綅"); + }); + }); + + modelBuilder.Entity("FlexJobApi.Core.UserInfoPhoto", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property<DateTimeOffset>("CreatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("CreatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鍒涘缓鎿嶄綔浜�"); + + b.Property<Guid>("ImgId") + .HasColumnType("uniqueidentifier") + .HasComment("鐓х墖Id"); + + b.Property<bool>("IsDeleted") + .HasColumnType("bit") + .HasComment("鏄惁鍒犻櫎"); + + b.Property<int>("Sort") + .HasColumnType("int") + .HasComment("鎺掑簭"); + + b.Property<string>("TraceId") + .HasColumnType("nvarchar(max)") + .HasComment("璺熻釜Id"); + + b.Property<DateTimeOffset?>("UpdatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("UpdatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鏈�鍚庢洿鏂版搷浣滀汉"); + + b.Property<Guid>("UserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鐢ㄦ埛淇℃伅Id"); + + b.HasKey("Id"); + + b.HasIndex("ImgId"); + + b.HasIndex("UserInfoId"); + + b.ToTable("UserInfoPhoto", t => + { + t.HasComment("鐢ㄦ埛淇℃伅鐢熸椿鐓�"); + }); + }); + + modelBuilder.Entity("FlexJobApi.Core.UserInfoRole", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property<DateTimeOffset>("CreatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("CreatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鍒涘缓鎿嶄綔浜�"); + + b.Property<bool>("IsDeleted") + .HasColumnType("bit") + .HasComment("鏄惁鍒犻櫎"); + + b.Property<Guid>("RoleId") + .HasColumnType("uniqueidentifier") + .HasComment("瑙掕壊Id"); + + b.Property<int>("Sort") + .HasColumnType("int") + .HasComment("鎺掑簭"); + + b.Property<string>("TraceId") + .HasColumnType("nvarchar(max)") + .HasComment("璺熻釜Id"); + + b.Property<DateTimeOffset?>("UpdatedTime") + .HasColumnType("datetimeoffset"); + + b.Property<Guid?>("UpdatedUserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鏈�鍚庢洿鏂版搷浣滀汉"); + + b.Property<Guid>("UserInfoId") + .HasColumnType("uniqueidentifier") + .HasComment("鐢ㄦ埛淇℃伅Id"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.HasIndex("UserInfoId"); + + b.ToTable("UserInfoRole", t => + { + t.HasComment("鐢ㄦ埛淇℃伅瑙掕壊"); + }); + }); + + modelBuilder.Entity("FlexJobApi.Core.Department", b => + { + b.HasOne("FlexJobApi.Core.Enterprise", "Enterprise") + .WithMany("Departments") + .HasForeignKey("EnterpriseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("FlexJobApi.Core.Department", "Parent") + .WithMany("Children") + .HasForeignKey("ParentId"); + + b.Navigation("Enterprise"); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("FlexJobApi.Core.DictionaryData", b => + { + b.HasOne("FlexJobApi.Core.DictionaryCategory", "Category") + .WithMany() + .HasForeignKey("CategoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("FlexJobApi.Core.DictionaryData", "Parent") + .WithMany("Children") + .HasForeignKey("ParentId"); + + b.Navigation("Category"); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("FlexJobApi.Core.Enterprise", b => + { + b.HasOne("FlexJobApi.Core.FileVirtualPath", "IdentityBackImg") + .WithMany() + .HasForeignKey("IdentityBackImgId"); + + b.HasOne("FlexJobApi.Core.FileVirtualPath", "IdentityImg") + .WithMany() + .HasForeignKey("IdentityImgId"); + + b.HasOne("FlexJobApi.Core.FileVirtualPath", "LicenseImage") + .WithMany() + .HasForeignKey("LicenseImageId"); + + b.Navigation("IdentityBackImg"); + + b.Navigation("IdentityImg"); + + b.Navigation("LicenseImage"); + }); + + modelBuilder.Entity("FlexJobApi.Core.FileVirtualPath", b => + { + b.HasOne("FlexJobApi.Core.FileStore", "Store") + .WithMany() + .HasForeignKey("StoreId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Store"); + }); + + modelBuilder.Entity("FlexJobApi.Core.Menu", b => + { + b.HasOne("FlexJobApi.Core.Menu", "Parent") + .WithMany("Children") + .HasForeignKey("ParentId"); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("FlexJobApi.Core.RoleMenu", b => + { + b.HasOne("FlexJobApi.Core.Menu", "Menu") + .WithMany() + .HasForeignKey("MenuId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("FlexJobApi.Core.Role", "Role") + .WithMany("RoleMenus") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Menu"); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("FlexJobApi.Core.RoleResource", b => + { + b.HasOne("FlexJobApi.Core.Resource", "Resource") + .WithMany() + .HasForeignKey("ResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("FlexJobApi.Core.Role", "Role") + .WithMany("RoleResources") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Resource"); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("FlexJobApi.Core.TaskInfo", b => + { + b.HasOne("FlexJobApi.Core.DictionaryData", "City") + .WithMany() + .HasForeignKey("CityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("FlexJobApi.Core.Enterprise", "Enterprise") + .WithMany() + .HasForeignKey("EnterpriseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("City"); + + b.Navigation("Enterprise"); + }); + + modelBuilder.Entity("FlexJobApi.Core.TaskInfoBenefit", b => + { + b.HasOne("FlexJobApi.Core.TaskInfo", "TaskInfo") + .WithMany("Benefits") + .HasForeignKey("BenefitId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("FlexJobApi.Core.DictionaryData", "Benefit") + .WithMany() + .HasForeignKey("BenefitId1") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Benefit"); + + b.Navigation("TaskInfo"); + }); + + modelBuilder.Entity("FlexJobApi.Core.TaskInfoCredentialLimit", b => + { + b.HasOne("FlexJobApi.Core.TaskInfo", "TaskInfo") + .WithMany("CredentialLimits") + .HasForeignKey("TaskInfoId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("FlexJobApi.Core.DictionaryData", "Type") + .WithMany() + .HasForeignKey("TypeId"); + + b.Navigation("TaskInfo"); + + b.Navigation("Type"); + }); + + modelBuilder.Entity("FlexJobApi.Core.TaskInfoUser", b => + { + b.HasOne("FlexJobApi.Core.TaskInfo", "TaskInfo") + .WithMany() + .HasForeignKey("TaskInfoId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("FlexJobApi.Core.UserInfo", "UserInfo") + .WithMany() + .HasForeignKey("UserInfoId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("TaskInfo"); + + b.Navigation("UserInfo"); + }); + + modelBuilder.Entity("FlexJobApi.Core.UserAuth", b => + { + b.HasOne("FlexJobApi.Core.FileVirtualPath", "Avatar") + .WithMany() + .HasForeignKey("AvatarId"); + + b.HasOne("FlexJobApi.Core.FileVirtualPath", "BankCardImg") + .WithMany() + .HasForeignKey("BankCardImgId"); + + b.HasOne("FlexJobApi.Core.FileVirtualPath", "IdentityBackImg") + .WithMany() + .HasForeignKey("IdentityBackImgId"); + + b.HasOne("FlexJobApi.Core.FileVirtualPath", "IdentityImg") + .WithMany() + .HasForeignKey("IdentityImgId"); + + b.Navigation("Avatar"); + + b.Navigation("BankCardImg"); + + b.Navigation("IdentityBackImg"); + + b.Navigation("IdentityImg"); + }); + + modelBuilder.Entity("FlexJobApi.Core.UserInfo", b => + { + b.HasOne("FlexJobApi.Core.DictionaryData", "City") + .WithMany() + .HasForeignKey("CityId"); + + b.HasOne("FlexJobApi.Core.DictionaryData", "EducationalBackground") + .WithMany() + .HasForeignKey("EducationalBackgroundId"); + + b.HasOne("FlexJobApi.Core.Enterprise", "Enterprise") + .WithMany("UserInfos") + .HasForeignKey("EnterpriseId"); + + b.HasOne("FlexJobApi.Core.DictionaryData", "PersonalIdentity") + .WithMany() + .HasForeignKey("PersonalIdentityId"); + + b.HasOne("FlexJobApi.Core.UserAuth", "UserAuth") + .WithMany("UserInfos") + .HasForeignKey("UserAuthId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("City"); + + b.Navigation("EducationalBackground"); + + b.Navigation("Enterprise"); + + b.Navigation("PersonalIdentity"); + + b.Navigation("UserAuth"); + }); + + modelBuilder.Entity("FlexJobApi.Core.UserInfoBankCard", b => + { + b.HasOne("FlexJobApi.Core.UserInfo", "UserInfo") + .WithMany() + .HasForeignKey("UserInfoId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("UserInfo"); + }); + + modelBuilder.Entity("FlexJobApi.Core.UserInfoCredential", b => + { + b.HasOne("FlexJobApi.Core.FileVirtualPath", "BackImg") + .WithMany() + .HasForeignKey("BackImgId"); + + b.HasOne("FlexJobApi.Core.FileVirtualPath", "Img") + .WithMany() + .HasForeignKey("ImgId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("FlexJobApi.Core.DictionaryData", "Type") + .WithMany() + .HasForeignKey("TypeId"); + + b.HasOne("FlexJobApi.Core.UserInfo", "UserInfo") + .WithMany("UserInfoCredentials") + .HasForeignKey("UserInfoId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("BackImg"); + + b.Navigation("Img"); + + b.Navigation("Type"); + + b.Navigation("UserInfo"); + }); + + modelBuilder.Entity("FlexJobApi.Core.UserInfoDepartment", b => + { + b.HasOne("FlexJobApi.Core.Department", "Department") + .WithMany() + .HasForeignKey("DepartmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("FlexJobApi.Core.UserInfo", "UserInfo") + .WithMany("UserInfoDepartments") + .HasForeignKey("UserInfoId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Department"); + + b.Navigation("UserInfo"); + }); + + modelBuilder.Entity("FlexJobApi.Core.UserInfoExpectJob", b => + { + b.HasOne("FlexJobApi.Core.DictionaryData", "PersonalIdentity") + .WithMany() + .HasForeignKey("PersonalIdentityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("FlexJobApi.Core.UserInfo", "UserInfo") + .WithMany("UserInfoExpectJobs") + .HasForeignKey("UserInfoId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PersonalIdentity"); + + b.Navigation("UserInfo"); + }); + + modelBuilder.Entity("FlexJobApi.Core.UserInfoPhoto", b => + { + b.HasOne("FlexJobApi.Core.FileVirtualPath", "Img") + .WithMany() + .HasForeignKey("ImgId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("FlexJobApi.Core.UserInfo", "UserInfo") + .WithMany() + .HasForeignKey("UserInfoId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Img"); + + b.Navigation("UserInfo"); + }); + + modelBuilder.Entity("FlexJobApi.Core.UserInfoRole", b => + { + b.HasOne("FlexJobApi.Core.Role", "Role") + .WithMany("UserInfoRoles") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("FlexJobApi.Core.UserInfo", "UserInfo") + .WithMany("UserInfoRoles") + .HasForeignKey("UserInfoId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + + b.Navigation("UserInfo"); + }); + + modelBuilder.Entity("FlexJobApi.Core.Department", b => + { + b.Navigation("Children"); + }); + + modelBuilder.Entity("FlexJobApi.Core.DictionaryData", b => + { + b.Navigation("Children"); + }); + + modelBuilder.Entity("FlexJobApi.Core.Enterprise", b => + { + b.Navigation("Departments"); + + b.Navigation("UserInfos"); + }); + + modelBuilder.Entity("FlexJobApi.Core.Menu", b => + { + b.Navigation("Children"); + }); + + modelBuilder.Entity("FlexJobApi.Core.Role", b => + { + b.Navigation("RoleMenus"); + + b.Navigation("RoleResources"); + + b.Navigation("UserInfoRoles"); + }); + + modelBuilder.Entity("FlexJobApi.Core.TaskInfo", b => + { + b.Navigation("Benefits"); + + b.Navigation("CredentialLimits"); + }); + + modelBuilder.Entity("FlexJobApi.Core.UserAuth", b => + { + b.Navigation("UserInfos"); + }); + + modelBuilder.Entity("FlexJobApi.Core.UserInfo", b => + { + b.Navigation("UserInfoCredentials"); + + b.Navigation("UserInfoDepartments"); + + b.Navigation("UserInfoExpectJobs"); + + b.Navigation("UserInfoRoles"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/FlexJobApi.Database.Migrations/Migrations/20250806024717_UpdateResource0806.cs b/FlexJobApi.Database.Migrations/Migrations/20250806024717_UpdateResource0806.cs new file mode 100644 index 0000000..654a953 --- /dev/null +++ b/FlexJobApi.Database.Migrations/Migrations/20250806024717_UpdateResource0806.cs @@ -0,0 +1,130 @@ +锘縰sing Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace FlexJobApi.Database.Migrations.Migrations +{ + /// <inheritdoc /> + public partial class UpdateResource0806 : Migration + { + /// <inheritdoc /> + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn<string>( + name: "ActionName", + table: "Resource", + type: "nvarchar(max)", + nullable: true, + comment: "濮旀墭鍚嶇О", + oldClrType: typeof(string), + oldType: "nvarchar(max)", + oldComment: "濮旀墭鍚嶇О"); + + migrationBuilder.AddColumn<string>( + name: "ActionSummary", + table: "Resource", + type: "nvarchar(max)", + nullable: true, + comment: "濮旀墭鎽樿"); + + migrationBuilder.AddColumn<bool>( + name: "AllowAnonymous", + table: "Resource", + type: "bit", + nullable: false, + defaultValue: false, + comment: "蹇界暐鏉冮檺"); + + migrationBuilder.AddColumn<string>( + name: "ApplicationName", + table: "Resource", + type: "nvarchar(max)", + nullable: true, + comment: "搴旂敤鍚嶇О"); + + migrationBuilder.AddColumn<string>( + name: "ControllerSummary", + table: "Resource", + type: "nvarchar(max)", + nullable: true, + comment: "鎺у埗鍣ㄦ憳瑕�"); + + migrationBuilder.AddColumn<string>( + name: "DynamicAssemblyName", + table: "Resource", + type: "nvarchar(max)", + nullable: true, + comment: "鍔ㄦ�佺▼搴忛泦鍚嶇О"); + + migrationBuilder.AddColumn<string>( + name: "RouteArea", + table: "Resource", + type: "nvarchar(max)", + nullable: true, + comment: "璺敱鍖哄煙"); + + migrationBuilder.AddColumn<int>( + name: "Service", + table: "Resource", + type: "int", + nullable: false, + defaultValue: 0, + comment: "鏈嶅姟"); + + migrationBuilder.AddColumn<string>( + name: "ServiceName", + table: "Resource", + type: "nvarchar(max)", + nullable: true, + comment: "鏈嶅姟鍚嶇О"); + } + + /// <inheritdoc /> + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "ActionSummary", + table: "Resource"); + + migrationBuilder.DropColumn( + name: "AllowAnonymous", + table: "Resource"); + + migrationBuilder.DropColumn( + name: "ApplicationName", + table: "Resource"); + + migrationBuilder.DropColumn( + name: "ControllerSummary", + table: "Resource"); + + migrationBuilder.DropColumn( + name: "DynamicAssemblyName", + table: "Resource"); + + migrationBuilder.DropColumn( + name: "RouteArea", + table: "Resource"); + + migrationBuilder.DropColumn( + name: "Service", + table: "Resource"); + + migrationBuilder.DropColumn( + name: "ServiceName", + table: "Resource"); + + migrationBuilder.AlterColumn<string>( + name: "ActionName", + table: "Resource", + type: "nvarchar(max)", + nullable: false, + defaultValue: "", + comment: "濮旀墭鍚嶇О", + oldClrType: typeof(string), + oldType: "nvarchar(max)", + oldNullable: true, + oldComment: "濮旀墭鍚嶇О"); + } + } +} diff --git a/FlexJobApi.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs b/FlexJobApi.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs index 18c4892..2b196b6 100644 --- a/FlexJobApi.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs +++ b/FlexJobApi.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs @@ -637,9 +637,20 @@ .HasColumnType("uniqueidentifier"); b.Property<string>("ActionName") - .IsRequired() .HasColumnType("nvarchar(max)") .HasComment("濮旀墭鍚嶇О"); + + b.Property<string>("ActionSummary") + .HasColumnType("nvarchar(max)") + .HasComment("濮旀墭鎽樿"); + + b.Property<bool>("AllowAnonymous") + .HasColumnType("bit") + .HasComment("蹇界暐鏉冮檺"); + + b.Property<string>("ApplicationName") + .HasColumnType("nvarchar(max)") + .HasComment("搴旂敤鍚嶇О"); b.Property<string>("Code") .IsRequired() @@ -650,12 +661,20 @@ .HasColumnType("int") .HasComment("鎺у埗鍣�"); + b.Property<string>("ControllerSummary") + .HasColumnType("nvarchar(max)") + .HasComment("鎺у埗鍣ㄦ憳瑕�"); + b.Property<DateTimeOffset>("CreatedTime") .HasColumnType("datetimeoffset"); b.Property<Guid?>("CreatedUserInfoId") .HasColumnType("uniqueidentifier") .HasComment("鍒涘缓鎿嶄綔浜�"); + + b.Property<string>("DynamicAssemblyName") + .HasColumnType("nvarchar(max)") + .HasComment("鍔ㄦ�佺▼搴忛泦鍚嶇О"); b.Property<bool>("IsDeleted") .HasColumnType("bit") @@ -699,6 +718,18 @@ .HasColumnType("nvarchar(max)") .HasComment("璺敱"); + b.Property<string>("RouteArea") + .HasColumnType("nvarchar(max)") + .HasComment("璺敱鍖哄煙"); + + b.Property<int>("Service") + .HasColumnType("int") + .HasComment("鏈嶅姟"); + + b.Property<string>("ServiceName") + .HasColumnType("nvarchar(max)") + .HasComment("鏈嶅姟鍚嶇О"); + b.Property<int>("Sort") .HasColumnType("int") .HasComment("鎺掑簭"); diff --git a/FlexJobApi.Database.Migrations/REDEME.MD b/FlexJobApi.Database.Migrations/REDEME.MD index 0d380c7..2f3d2ab 100644 --- a/FlexJobApi.Database.Migrations/REDEME.MD +++ b/FlexJobApi.Database.Migrations/REDEME.MD @@ -1,7 +1,7 @@ -------------------------------主数据库--------------------------------------- 新增迁移文件 -dotnet ef migrations add UpdateRole0805 -s "../FlexJobApi.Web.Entry" -c DefaultDbContext +dotnet ef migrations add UpdateResource0806 -s "../FlexJobApi.Web.Entry" -c DefaultDbContext 删除迁移文件 dotnet ef migrations remove -s "../FlexJobApi.Web.Entry" -c DefaultDbContext diff --git a/FlexJobApi.User.Application/FlexJobApi.User.Application.xml b/FlexJobApi.User.Application/FlexJobApi.User.Application.xml index 4d13375..577984f 100644 --- a/FlexJobApi.User.Application/FlexJobApi.User.Application.xml +++ b/FlexJobApi.User.Application/FlexJobApi.User.Application.xml @@ -310,12 +310,14 @@ 鏌ヨ瑙掕壊鍒嗛〉鍒楄〃 </summary> <param name="repRole"></param> + <param name="repUserInfoRole"></param> </member> <member name="M:FlexJobApi.User.Application.GetRolesQueryHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.Role},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.UserInfoRole})"> <summary> 鏌ヨ瑙掕壊鍒嗛〉鍒楄〃 </summary> <param name="repRole"></param> + <param name="repUserInfoRole"></param> </member> <member name="M:FlexJobApi.User.Application.GetRolesQueryHandler.Handle(FlexJobApi.Core.GetRolesQuery,System.Threading.CancellationToken)"> <inheritdoc/> @@ -333,18 +335,23 @@ <member name="M:FlexJobApi.User.Application.GetRoleUserInfosQueryHandler.Handle(FlexJobApi.Core.GetRoleUserInfosQuery,System.Threading.CancellationToken)"> <inheritdoc/> </member> - <member name="T:FlexJobApi.User.Application.UserInfos.Commands.SetUserInfoStatusCommandHandler"> + <member name="T:FlexJobApi.User.Application.UserInfos.Commands.UserInfoCommandHandler"> + <summary> + 鐢ㄦ埛淇℃伅鍛戒护澶勭悊鍣� + </summary> + </member> + <member name="M:FlexJobApi.User.Application.UserInfos.Commands.UserInfoCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.UserInfo})"> + <summary> + 鐢ㄦ埛淇℃伅鍛戒护澶勭悊鍣� + </summary> + </member> + <member name="M:FlexJobApi.User.Application.UserInfos.Commands.UserInfoCommandHandler.Handle(FlexJobApi.Core.SetUserInfoStatusCommand,System.Threading.CancellationToken)"> <summary> 璁剧疆鐢ㄦ埛淇℃伅鐘舵�� </summary> - </member> - <member name="M:FlexJobApi.User.Application.UserInfos.Commands.SetUserInfoStatusCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.UserInfo})"> - <summary> - 璁剧疆鐢ㄦ埛淇℃伅鐘舵�� - </summary> - </member> - <member name="M:FlexJobApi.User.Application.UserInfos.Commands.SetUserInfoStatusCommandHandler.Handle(FlexJobApi.Core.SetUserInfoStatusCommand,System.Threading.CancellationToken)"> - <inheritdoc/> + <param name="request"></param> + <param name="cancellationToken"></param> + <returns></returns> </member> <member name="T:FlexJobApi.User.Application.GetOperationUserInfosQueryHandler"> <summary> diff --git a/FlexJobApi.User.Application/Roles/Queries/GetRolesQueryHandler.cs b/FlexJobApi.User.Application/Roles/Queries/GetRolesQueryHandler.cs index 895ddf3..84cbf3b 100644 --- a/FlexJobApi.User.Application/Roles/Queries/GetRolesQueryHandler.cs +++ b/FlexJobApi.User.Application/Roles/Queries/GetRolesQueryHandler.cs @@ -15,6 +15,7 @@ /// 鏌ヨ瑙掕壊鍒嗛〉鍒楄〃 /// </summary> /// <param name="repRole"></param> + /// <param name="repUserInfoRole"></param> public class GetRolesQueryHandler( IRepository<Role> repRole, IRepository<UserInfoRole> repUserInfoRole @@ -26,22 +27,24 @@ /// <inheritdoc/> public async Task<PagedListQueryResult<GetRolesQueryResultItem>> Handle(GetRolesQuery request, CancellationToken cancellationToken) { - var q = repRole.AsQueryable().AsNoTracking(); - if (request.UserType.HasValue) - { - q = q.Where(it => it.UserType == request.UserType); - } - if (request.ClientType.HasValue) - { - q = q.Where(it => it.ClientType == request.ClientType); - } - if (request.Keywords.IsNotNull()) - { - q = q.Where(it => it.Name.Contains(request.Keywords) || it.Remark.Contains(request.Keywords)); - } - var result = await q - .ProjectToType<GetRolesQueryResultItem>() - .ToPagedListAsync(request.PageModel, cancellationToken); + var result = await request.PageModel.ToPagedListAsync<Role, GetRolesQueryResultItem>( + q => + { + q = q.OrderBy(it => it.Sort).ThenBy(it => it.CreatedTime); + if (request.UserType.HasValue) + { + q = q.Where(it => it.UserType == request.UserType); + } + if (request.ClientType.HasValue) + { + q = q.Where(it => it.ClientType == request.ClientType); + } + if (request.Keywords.IsNotNull()) + { + q = q.Where(it => it.Name.Contains(request.Keywords) || it.Remark.Contains(request.Keywords)); + } + return q; + }, cancellationToken: cancellationToken); if (result.Data.Any()) { diff --git a/FlexJobApi.User.Application/UserInfos/Commands/SetUserInfoStatusCommandHandler.cs b/FlexJobApi.User.Application/UserInfos/Commands/UserInfoCommandHandler.cs similarity index 71% rename from FlexJobApi.User.Application/UserInfos/Commands/SetUserInfoStatusCommandHandler.cs rename to FlexJobApi.User.Application/UserInfos/Commands/UserInfoCommandHandler.cs index d91b776..8734b0f 100644 --- a/FlexJobApi.User.Application/UserInfos/Commands/SetUserInfoStatusCommandHandler.cs +++ b/FlexJobApi.User.Application/UserInfos/Commands/UserInfoCommandHandler.cs @@ -11,15 +11,21 @@ namespace FlexJobApi.User.Application.UserInfos.Commands { /// <summary> - /// 璁剧疆鐢ㄦ埛淇℃伅鐘舵�� + /// 鐢ㄦ埛淇℃伅鍛戒护澶勭悊鍣� /// </summary> - public class SetUserInfoStatusCommandHandler( + public class UserInfoCommandHandler( IRepository<UserInfo> rep - ) : IRequestHandler<SetUserInfoStatusCommand, int> + ) : + IRequestHandler<SetUserInfoStatusCommand, int> { private readonly IRepository<UserInfo> rep = rep; - /// <inheritdoc/> + /// <summary> + /// 璁剧疆鐢ㄦ埛淇℃伅鐘舵�� + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> public async Task<int> Handle(SetUserInfoStatusCommand request, CancellationToken cancellationToken) { var entities = await rep.AsQueryable() diff --git a/FlexJobApi.User.Application/UserInfos/Queries/GetOperationUserInfosQueryHandler.cs b/FlexJobApi.User.Application/UserInfos/Queries/GetOperationUserInfosQueryHandler.cs index 333ab4c..44c2d5e 100644 --- a/FlexJobApi.User.Application/UserInfos/Queries/GetOperationUserInfosQueryHandler.cs +++ b/FlexJobApi.User.Application/UserInfos/Queries/GetOperationUserInfosQueryHandler.cs @@ -24,27 +24,29 @@ /// <inheritdoc/> public async Task<PagedListQueryResult<GetOperationUserInfosQueryResultItem>> Handle(GetOperationUserInfosQuery request, CancellationToken cancellationToken) { - var q = repUser.AsQueryable().AsNoTracking() - .OrderByDescending(it => it.Level).ThenByDescending(it => it.CreatedTime) - .Where(it => it.Type == EnumUserType.Operation); - if (request.Keywords.IsNotNull()) - { - q = q.Where(it => - it.UserAuth.Name.Contains(request.Keywords) - || it.UserAuth.UserName.Contains(request.Keywords) - || it.UserAuth.PhoneNumber.Contains(request.Keywords) - || it.Remark.Contains(request.Keywords)); - } - var result = await q - .Select(it => new GetOperationUserInfosQueryResultItem + var result = await request.PageModel.ToPagedListAsync<UserInfo, GetOperationUserInfosQueryResultItem>( + q => + { + q = q.OrderByDescending(it => it.Level).ThenByDescending(it => it.CreatedTime) + .Where(it => it.Type == EnumUserType.Operation); + if (request.Keywords.IsNotNull()) + { + q = q.Where(it => + it.UserAuth.Name.Contains(request.Keywords) + || it.UserAuth.UserName.Contains(request.Keywords) + || it.UserAuth.PhoneNumber.Contains(request.Keywords) + || it.Remark.Contains(request.Keywords)); + } + return q; + }, + it => new GetOperationUserInfosQueryResultItem { Id = it.Id, Name = it.UserAuth.Name, UserName = it.UserAuth.UserName, PhoneNumber = it.UserAuth.PhoneNumber, Remark = it.Remark - }) - .ToPagedListAsync(request.PageModel, cancellationToken); + }, cancellationToken); if (result.Data.Any()) { var ids = result.Data.DistinctSelect(it => it.Id); diff --git a/FlexJobApi.User.Web.Entry/Startup.cs b/FlexJobApi.User.Web.Entry/Startup.cs deleted file mode 100644 index 2ff8fc6..0000000 --- a/FlexJobApi.User.Web.Entry/Startup.cs +++ /dev/null @@ -1,50 +0,0 @@ -锘縰sing FlexJobApi.Core; -using Furion; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; - -namespace FlexJobApi.User.Web.Core; - -[AppStartup(4)] -public class Startup : AppStartup -{ - public void ConfigureServices(IServiceCollection services) - { - services.AddJwt<JwtHandler>(enableGlobalAuthorize: true); - - services.AddCorsAccessor(); - - services.AddControllers() - .AddFriendlyException() - .AddDataValidation() - .AddInjectWithUnifyResult<FriendlyResultProvider>(); - } - - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - - app.UseUnifyResultStatusCodes(); - - app.UseHttpsRedirection(); - - app.UseRouting(); - - app.UseCorsAccessor(); - - app.UseAuthentication(); - app.UseAuthorization(); - - app.UseInject(string.Empty); - - app.UseEndpoints(endpoints => - { - endpoints.MapControllers(); - }); - } -} -- Gitblit v1.9.1