From 9d365dbf1ee608ecc11999f12f6fedcff4f81e92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B7=B3?= Date: Mon, 17 Oct 2022 18:08:16 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E6=94=B9=E9=80=A0null?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yi-sqlsugar-dev.db | Bin 364544 -> 364544 bytes .../Yi.Framework.WebCore/Appsettings.cs | 10 +++---- .../AttributeExtend/GlobalLogAttribute.cs | 5 ++-- .../BuilderExtend/ApolloExtension.cs | 4 +-- .../CommonExtend/HttpContextExtend.cs | 16 +++++------ .../DbExtend/DbFiterExtend.cs | 8 ++++-- .../CustomExceptionFilterAttribute.cs | 2 +- .../CustomIOCFilterFactoryAttribute.cs | 4 +-- .../MiddlewareExtend/SqlsugarExtension.cs | 4 +-- .../MiddlewareExtend/StaticPageExtension.cs | 4 +-- .../SignalRHub/MainHub.cs | 12 ++++---- .../SignalRHub/OnlineUser.cs | 14 ++++----- .../Yi.Framework.WebCore.csproj | 1 + Yi.Vue3.x.Vant/components.d.ts | 2 ++ Yi.Vue3.x.Vant/src/layout/bottom/index.vue | 2 ++ Yi.Vue3.x.Vant/src/layout/head/index.vue | 9 ++++++ Yi.Vue3.x.Vant/src/router/index.ts | 27 +++++++++++++++++- Yi.Vue3.x.Vant/src/view/shop/shopDetails.vue | 5 ++++ Yi.Vue3.x.Vant/src/view/shop/shopIndex.vue | 23 +++++++++++++++ Yi.Vue3.x.Vant/src/view/shop/shopSearch.vue | 7 +++++ 20 files changed, 117 insertions(+), 42 deletions(-) create mode 100644 Yi.Vue3.x.Vant/src/layout/head/index.vue create mode 100644 Yi.Vue3.x.Vant/src/view/shop/shopDetails.vue create mode 100644 Yi.Vue3.x.Vant/src/view/shop/shopIndex.vue create mode 100644 Yi.Vue3.x.Vant/src/view/shop/shopSearch.vue diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/yi-sqlsugar-dev.db b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/yi-sqlsugar-dev.db index 2b7e921af0dcb0e7271df6ab7c82a5e635e5797c..dca11648a054d4219323437dcea63641f83e88d6 100644 GIT binary patch delta 225 zcmZozAl9%zY=Si7%!xA2j58Y(S`!$zCNM2|&$5P{i(xuX0JGzCZwJQ8>4!cr&0=Af zVCUMbsIZDvhL@R*N%V{A-W^T?3=C_byj>TYfV?&BYTucFn0dR}cb0n{%reYtr?WS( znzFEnF|P&c&SjQJYt$8B6I7I!RMcj0WB>sUuwl~|)-pS2nJXBYS(zGI85!$Ym|I#} u8aJ{w>Oj?}GdRQ5@47gB;ch00=>j6mZbEQP26|=|20&!KeSQmTA~ygtU_Fcg delta 84 zcmZozAl9%zY=Si7^ocUgjMEzvS`!$zCNM2|&$5bLjbS=Z0JGzCZwJQ8>4!cr&DyM} naEi5E?K=|?GjCV>&T_AVS&C);boK^TQ=nWj%l7##tclzJ6=xnu diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/Appsettings.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/Appsettings.cs index 23c825f3..9161b748 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/Appsettings.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/Appsettings.cs @@ -11,8 +11,8 @@ namespace Yi.Framework.WebCore /// public class Appsettings { - static IConfiguration Configuration { get; set; } - static string contentPath { get; set; } + static IConfiguration? Configuration { get; set; } + static string? contentPath { get; set; } public Appsettings(string contentPath) { @@ -37,14 +37,14 @@ namespace Yi.Framework.WebCore /// /// 节点配置 /// - public static string app(params string[] sections) + public static string? app(params string[] sections) { try { if (sections.Any()) { - return Configuration[string.Join(":", sections)]; + return Configuration?[string.Join(":", sections)]; } } catch (Exception) { } @@ -59,7 +59,7 @@ namespace Yi.Framework.WebCore } - public static bool Bool(object thisValue) + public static bool Bool(object? thisValue) { bool reval = false; if (thisValue != null && thisValue != DBNull.Value && bool.TryParse(thisValue.ToString(), out reval)) diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/AttributeExtend/GlobalLogAttribute.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/AttributeExtend/GlobalLogAttribute.cs index 4b02390e..20e5e3d1 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/AttributeExtend/GlobalLogAttribute.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/AttributeExtend/GlobalLogAttribute.cs @@ -35,9 +35,8 @@ namespace Yi.Framework.WebCore.AttributeExtend if (context.ActionDescriptor is not ControllerActionDescriptor controllerActionDescriptor) return; //查找标签,获取标签对象 - LogAttribute logAttribute = controllerActionDescriptor.MethodInfo.GetCustomAttributes(inherit: true) + LogAttribute? logAttribute = controllerActionDescriptor.MethodInfo.GetCustomAttributes(inherit: true) .FirstOrDefault(a => a.GetType().Equals(typeof(LogAttribute))) as LogAttribute; - //空对象直接返回 if (logAttribute is null) return; @@ -72,7 +71,7 @@ namespace Yi.Framework.WebCore.AttributeExtend { if (context.Result is ContentResult result && result.ContentType == "application/json") { - logEntity.RequestResult = result.Content.Replace("\r\n", "").Trim(); + logEntity.RequestResult = result.Content?.Replace("\r\n", "").Trim(); } if (context.Result is JsonResult result2) { diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/BuilderExtend/ApolloExtension.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/BuilderExtend/ApolloExtension.cs index 313fce11..6005cdc6 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/BuilderExtend/ApolloExtension.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/BuilderExtend/ApolloExtension.cs @@ -50,8 +50,8 @@ namespace Yi.Framework.WebCore.BuilderExtend { foreach (var apolloProvider in root.Providers.Where(p => p is ApolloConfigurationProvider)) { - var property = apolloProvider.GetType().BaseType.GetProperty("Data", BindingFlags.Instance | BindingFlags.NonPublic); - var data = property.GetValue(apolloProvider) as IDictionary; + var property = apolloProvider.GetType().BaseType?.GetProperty("Data", BindingFlags.Instance | BindingFlags.NonPublic); + var data = property?.GetValue(apolloProvider) as IDictionary; foreach (var item in data) { Console.WriteLine($"key {item.Key} value {item.Value}"); diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/CommonExtend/HttpContextExtend.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/CommonExtend/HttpContextExtend.cs index 790e85be..784be41e 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/CommonExtend/HttpContextExtend.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/CommonExtend/HttpContextExtend.cs @@ -50,7 +50,7 @@ namespace Yi.Framework.WebCore /// /// /// - public static string GetUserNameInfo(this HttpContext httpContext) + public static string? GetUserNameInfo(this HttpContext httpContext) { var p = httpContext; return httpContext.User.Claims.FirstOrDefault(u => u.Type == "userName")?.Value; @@ -61,10 +61,10 @@ namespace Yi.Framework.WebCore /// /// /// - public static string GetDeptIdInfo(this HttpContext httpContext) + public static string? GetDeptIdInfo(this HttpContext httpContext) { var p = httpContext; - return httpContext.User.Claims.FirstOrDefault(u => u.Type == "deptId").Value; + return httpContext.User.Claims.FirstOrDefault(u => u.Type == "deptId")?.Value; } /// @@ -72,10 +72,10 @@ namespace Yi.Framework.WebCore /// /// /// - public static string GetPermissionInfo(this HttpContext httpContext) + public static string? GetPermissionInfo(this HttpContext httpContext) { var p = httpContext; - return httpContext.User.Claims.FirstOrDefault(u => u.Type == "permission").Value; + return httpContext.User.Claims.FirstOrDefault(u => u.Type == "permission")?.Value; } @@ -87,7 +87,7 @@ namespace Yi.Framework.WebCore /// public static UserEntity GetUserEntityInfo(this HttpContext httpContext, out List menuIds) { - IEnumerable claimlist = null; + IEnumerable? claimlist = null; long resId = 0; try { @@ -139,7 +139,7 @@ namespace Yi.Framework.WebCore { string res = "zh-CN"; var str = httpContext.Request.Headers["Accept-Language"].FirstOrDefault(); - if (str.IsNotNull()) + if (str is not null) { res = str.Split(",")[0]; } @@ -167,7 +167,7 @@ namespace Yi.Framework.WebCore } else { - param = context.Request.QueryString.Value.ToString(); + param = context.Request.QueryString.Value is null?"": context.Request.QueryString.Value.ToString(); } return param; } diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/DbExtend/DbFiterExtend.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/DbExtend/DbFiterExtend.cs index 59aeb3d2..c749a4d9 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/DbExtend/DbFiterExtend.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/DbExtend/DbFiterExtend.cs @@ -44,12 +44,13 @@ namespace Yi.Framework.Core roles = new(); } //先测试部门就是LEBG - long deptId = (long)userRoleMenu.User.DeptId; + long deptId = userRoleMenu.User.DeptId??-1; long userId = httpContext.GetUserIdInfo(); //根据角色的数据范围,来添加相对于的数据权限 foreach (var role in roles) { - DataScopeEnum dataScope = (DataScopeEnum)role.DataScope; + //默认为全部 + DataScopeEnum dataScope = (DataScopeEnum)(role.DataScope?? DataScopeEnum.ALL.GetHashCode()); switch (dataScope) { case DataScopeEnum.ALL: @@ -71,8 +72,9 @@ namespace Yi.Framework.Core case DataScopeEnum.DEPT_FOLLOW: //放行自己部门及以下 var allChildDepts = db.Queryable().ToChildList(it => it.ParentId, deptId); + + var filter1 = new TableFilterItem(it => allChildDepts.Select(f => f.Id).ToList().Contains(it.DeptId??-1), true); - var filter1 = new TableFilterItem(it => allChildDepts.Select(f => f.Id).ToList().Contains((long)it.DeptId), true); db.QueryFilter.Add(filter1); //部门无需过滤 diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/CustomExceptionFilterAttribute.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/CustomExceptionFilterAttribute.cs index 0af7e9f8..23af7be8 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/CustomExceptionFilterAttribute.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/CustomExceptionFilterAttribute.cs @@ -15,7 +15,7 @@ namespace Yi.Framework.WebCore.FilterExtend /// public class CustomExceptionFilterAttribute : IExceptionFilter { - private ILogger _logger = null; + private ILogger _logger; public CustomExceptionFilterAttribute(ILogger logger) { this._logger = logger; diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/CustomIOCFilterFactoryAttribute.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/CustomIOCFilterFactoryAttribute.cs index 77a08bcf..985117ab 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/CustomIOCFilterFactoryAttribute.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/CustomIOCFilterFactoryAttribute.cs @@ -11,7 +11,7 @@ namespace Yi.Framework.WebCore.FilterExtend /// public class CustomIOCFilterFactoryAttribute : Attribute, IFilterFactory { - private readonly Type _FilterType = null; + private readonly Type _FilterType; public CustomIOCFilterFactoryAttribute(Type type) { @@ -23,7 +23,7 @@ namespace Yi.Framework.WebCore.FilterExtend { //return (IFilterMetadata)serviceProvider.GetService(typeof(CustomExceptionFilterAttribute)); - return (IFilterMetadata)serviceProvider.GetService(this._FilterType); + return (IFilterMetadata)serviceProvider.GetService(this._FilterType)!; } } diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/SqlsugarExtension.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/SqlsugarExtension.cs index e48a59f4..29f36b3b 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/SqlsugarExtension.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/SqlsugarExtension.cs @@ -11,7 +11,7 @@ namespace Yi.Framework.WebCore.MiddlewareExtend { public static class SqlsugarExtension { - public static void AddSqlsugarServer(this IServiceCollection services, Action action = null) + public static void AddSqlsugarServer(this IServiceCollection services, Action? action = null) { DbType dbType; var slavaConFig = new List(); @@ -60,7 +60,7 @@ namespace Yi.Framework.WebCore.MiddlewareExtend }, db => { - if (action.IsNotNull()) + if (action is not null) { action(db); } diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/StaticPageExtension.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/StaticPageExtension.cs index 429fdce7..758244f6 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/StaticPageExtension.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/StaticPageExtension.cs @@ -31,7 +31,7 @@ namespace Yi.Framework.WebCore.MiddlewareExtend { if (this._supportDelete && "Delete".Equals(context.Request.Query["ActionHeader"])) { - this.DeleteHmtl(context.Request.Path.Value); + this.DeleteHmtl(context.Request.Path.Value??""); context.Response.StatusCode = 200; } else if (this._supportWarmup && "ClearAll".Equals(context.Request.Query["ActionHeader"])) @@ -52,7 +52,7 @@ namespace Yi.Framework.WebCore.MiddlewareExtend copyStream.Position = 0; var reader = new StreamReader(copyStream); var content = await reader.ReadToEndAsync(); - string url = context.Request.Path.Value; + string url = context.Request.Path.Value??""; this.SaveHmtl(url, content); diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/SignalRHub/MainHub.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/SignalRHub/MainHub.cs index d1baf01f..1617fa1e 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/SignalRHub/MainHub.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/SignalRHub/MainHub.cs @@ -16,7 +16,7 @@ namespace Yi.Framework.WebCore.SignalRHub public static readonly List clientUsers = new(); - private HttpContext _httpContext; + private HttpContext? _httpContext; private ILogger _logger; public MainHub(IHttpContextAccessor httpContextAccessor,ILogger logger) { @@ -32,11 +32,11 @@ namespace Yi.Framework.WebCore.SignalRHub /// public override Task OnConnectedAsync() { - var name = _httpContext.GetUserNameInfo(); - var loginUser = _httpContext.GetLoginLogInfo(); + var name = _httpContext?.GetUserNameInfo(); + var loginUser = _httpContext?.GetLoginLogInfo(); var user = clientUsers.Any(u => u.ConnnectionId == Context.ConnectionId); //判断用户是否存在,否则添加集合 - if (!user && Context.User.Identity.IsAuthenticated) + if (!user && (Context.User?.Identity?.IsAuthenticated??false)) { OnlineUser users = new(Context.ConnectionId) { @@ -45,7 +45,7 @@ namespace Yi.Framework.WebCore.SignalRHub Ipaddr= loginUser.LoginIp, LoginTime=DateTime.Now, Os=loginUser.Os, - UserName= name + UserName= name??"" }; clientUsers.Add(users); _logger.LogInformation($"{DateTime.Now}:{name},{Context.ConnectionId}连接服务端success,当前已连接{clientUsers.Count}个"); @@ -63,7 +63,7 @@ namespace Yi.Framework.WebCore.SignalRHub /// /// /// - public override Task OnDisconnectedAsync(Exception exception) + public override Task OnDisconnectedAsync(Exception? exception) { var user = clientUsers.Where(p => p.ConnnectionId == Context.ConnectionId).FirstOrDefault(); //判断用户是否存在,否则添加集合 diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/SignalRHub/OnlineUser.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/SignalRHub/OnlineUser.cs index 8b3259d2..ac58ab1a 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/SignalRHub/OnlineUser.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/SignalRHub/OnlineUser.cs @@ -19,18 +19,18 @@ namespace Yi.Framework.WebCore.SignalRHub /// /// 客户端连接Id /// - public string ConnnectionId { get; } + public string? ConnnectionId { get; } /// /// 用户id /// public long? UserId { get; set; } - public string UserName { get; set; } - public DateTime LoginTime { get; set; } - public string Ipaddr { get; set; } - public string LoginLocation { get; set; } + public string? UserName { get; set; } + public DateTime? LoginTime { get; set; } + public string? Ipaddr { get; set; } + public string? LoginLocation { get; set; } - public string Os { get; set; } - public string Browser { get; set; } + public string? Os { get; set; } + public string? Browser { get; set; } } diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/Yi.Framework.WebCore.csproj b/Yi.Framework.Net6/Yi.Framework.WebCore/Yi.Framework.WebCore.csproj index bc7336af..a24eeae2 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/Yi.Framework.WebCore.csproj +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/Yi.Framework.WebCore.csproj @@ -2,6 +2,7 @@ net6.0 + enable diff --git a/Yi.Vue3.x.Vant/components.d.ts b/Yi.Vue3.x.Vant/components.d.ts index b04c459e..71bae129 100644 --- a/Yi.Vue3.x.Vant/components.d.ts +++ b/Yi.Vue3.x.Vant/components.d.ts @@ -31,6 +31,8 @@ declare module '@vue/runtime-core' { VanPullRefresh: typeof import('vant/es')['PullRefresh'] VanRow: typeof import('vant/es')['Row'] VanSticky: typeof import('vant/es')['Sticky'] + VanSwipe: typeof import('vant/es')['Swipe'] + VanSwipeItem: typeof import('vant/es')['SwipeItem'] VanTab: typeof import('vant/es')['Tab'] VanTabbar: typeof import('vant/es')['Tabbar'] VanTabbarItem: typeof import('vant/es')['TabbarItem'] diff --git a/Yi.Vue3.x.Vant/src/layout/bottom/index.vue b/Yi.Vue3.x.Vant/src/layout/bottom/index.vue index 0f607970..a955d1f4 100644 --- a/Yi.Vue3.x.Vant/src/layout/bottom/index.vue +++ b/Yi.Vue3.x.Vant/src/layout/bottom/index.vue @@ -35,6 +35,7 @@ let tabbar=ref([ {icon:"wap-home",to:"/",title:"主页"}, {icon:"location-o",to:"",title:"发现"}, {icon:"",to:"",title:""}, + // {icon:"friends-o",to:"/shopIndex",title:"商城"}, {icon:"friends-o",to:"",title:"商城"}, {icon:"setting-o",to:"/my",title:"我的"}, ]) @@ -43,6 +44,7 @@ const onChange=(index:number)=>{ {icon:"wap-home-o",to:"/",title:"主页"}, {icon:"location-o",to:"",title:"发现"}, {icon:"",to:"",title:""}, + // {icon:"friends-o",to:"/shopIndex",title:"商城"}, {icon:"friends-o",to:"",title:"商城"}, {icon:"setting-o",to:"/my",title:"我的"}, ]; diff --git a/Yi.Vue3.x.Vant/src/layout/head/index.vue b/Yi.Vue3.x.Vant/src/layout/head/index.vue new file mode 100644 index 00000000..d012f2e0 --- /dev/null +++ b/Yi.Vue3.x.Vant/src/layout/head/index.vue @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/Yi.Vue3.x.Vant/src/router/index.ts b/Yi.Vue3.x.Vant/src/router/index.ts index 4337c530..2ea52cdf 100644 --- a/Yi.Vue3.x.Vant/src/router/index.ts +++ b/Yi.Vue3.x.Vant/src/router/index.ts @@ -1,14 +1,20 @@ import { createWebHistory, createRouter } from 'vue-router'; import Layout from '@/layout/index.vue'; +import HeadLayout from '@/layout/head/index.vue' export const constantRoutes = [ - + { name:'Layout', path: '/', component: Layout, redirect:"/recommend", children: [ + { + path: '/shopIndex', + component: () => import('@/view/shop/shopIndex.vue'), + name: 'ShopIndex', + }, { path: '/my', component: () => import('@/view/my.vue'), @@ -49,6 +55,25 @@ export const constantRoutes = [ component: () => import('@/view/login.vue'), name: 'Login', }, + + { + name:'Shop', + path: '/shop', + component: HeadLayout, + redirect:"/shopIndex", + children: [ + { + path: '/shopDetails', + component: () => import('@/view/shop/shopDetails.vue'), + name: 'ShopDetails', + }, + { + path: '/shopSearch', + component: () => import('@/view/shop/shopSearch.vue'), + name: 'ShopSearch', + }, + ] + } ]; const router = createRouter({ diff --git a/Yi.Vue3.x.Vant/src/view/shop/shopDetails.vue b/Yi.Vue3.x.Vant/src/view/shop/shopDetails.vue new file mode 100644 index 00000000..f99b463c --- /dev/null +++ b/Yi.Vue3.x.Vant/src/view/shop/shopDetails.vue @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/Yi.Vue3.x.Vant/src/view/shop/shopIndex.vue b/Yi.Vue3.x.Vant/src/view/shop/shopIndex.vue new file mode 100644 index 00000000..5880c164 --- /dev/null +++ b/Yi.Vue3.x.Vant/src/view/shop/shopIndex.vue @@ -0,0 +1,23 @@ + + \ No newline at end of file diff --git a/Yi.Vue3.x.Vant/src/view/shop/shopSearch.vue b/Yi.Vue3.x.Vant/src/view/shop/shopSearch.vue new file mode 100644 index 00000000..904850e1 --- /dev/null +++ b/Yi.Vue3.x.Vant/src/view/shop/shopSearch.vue @@ -0,0 +1,7 @@ + \ No newline at end of file From dab4a092d9f0b0daaacedd0e6f4033d55efcf469 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B7=B3?= Date: Tue, 18 Oct 2022 09:01:16 +0800 Subject: [PATCH 2/8] =?UTF-8?q?sql=E6=97=A5=E5=BF=97=E6=89=93=E5=8D=B0?= =?UTF-8?q?=E8=BE=93=E5=87=BA=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Yi.Framework.ApiMicroservice/Program.cs | 5 ++ .../Properties/launchSettings.json | 4 +- .../appsettings.Production.json | 2 + .../appsettings.Staging.json | 2 + .../appsettings.json | 2 + .../yi-sqlsugar-dev.db | Bin 364544 -> 364544 bytes .../Yi.Framework.Common/Models/GobalModel.cs | 13 +++ .../QueueModel/OrderCreateQueueModel.cs | 2 +- .../Yi.Framework.WebCore/Appsettings.cs | 4 +- .../BuilderExtend/ApolloExtension.cs | 8 +- .../Internal/JsonOptionsWritable.cs | 4 +- .../DbExtend/DbFiterExtend.cs | 77 +++++++++--------- .../DbExtend/DbSeedExtend.cs | 2 +- .../CustomExceptionFilterAttribute.cs | 4 +- .../CustomResourceFilterAttribute.cs | 2 +- .../FilterExtend/LogActionFilterAttribute.cs | 8 +- .../MiddlewareExtend/SqlsugarExtension.cs | 9 +- .../MiddlewareExtend/SwaggerExtension.cs | 4 + .../Yi.Framework.WebCore/ServiceLocator.cs | 6 +- .../SignalRHub/MainHub.cs | 8 +- 20 files changed, 100 insertions(+), 66 deletions(-) create mode 100644 Yi.Framework.Net6/Yi.Framework.Common/Models/GobalModel.cs diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Program.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Program.cs index 392211b4..6227a613 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Program.cs +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Program.cs @@ -142,6 +142,11 @@ builder.Services.AddHttpContextAccessor(); //ͼ #endregion builder.Services.AddSingleton(); + +#region +//ȫóʼֵ +#endregion +GobalModel.SqlLogEnable = Appsettings.appBool("SqlLog_Enable"); //----------------------------------------------------------------------------------------------------------- var app = builder.Build(); #region diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Properties/launchSettings.json b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Properties/launchSettings.json index d49e5e26..29745205 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Properties/launchSettings.json +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Properties/launchSettings.json @@ -2,8 +2,8 @@ "profiles": { "Yi.Framework.ApiMicroservice": { "commandName": "Project", - //ǷԶ˸оعرȽ鷳 - "launchBrowser": false, + //ǷԶ + "launchBrowser": true, "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }, diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.Production.json b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.Production.json index 37d54a8b..ec8aa7bb 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.Production.json +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.Production.json @@ -9,6 +9,8 @@ }, "AllowedHosts": "*", + "SqlLog_Enable": false, + "Consul_Enabled": false, "Apollo_Enabled": false, "HealthCheck_Enabled": false, diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.Staging.json b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.Staging.json index c7ae2d34..fd710b84 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.Staging.json +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.Staging.json @@ -9,6 +9,8 @@ }, "AllowedHosts": "*", + "SqlLog_Enable": false, + "Consul_Enabled": false, "DbSeed_Enabled": false, "Apollo_Enabled": false, diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.json b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.json index 94d17102..0ed84298 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.json +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.json @@ -9,6 +9,8 @@ }, "AllowedHosts": "*", + "SqlLog_Enable": false, + "Consul_Enabled": false, "DbSeed_Enabled": false, "Apollo_Enabled": false, diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/yi-sqlsugar-dev.db b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/yi-sqlsugar-dev.db index dca11648a054d4219323437dcea63641f83e88d6..7b63d53450bb907b9f7f419cd83b0c020ffef2f6 100644 GIT binary patch delta 164 zcmZozAl9%zY=Si7tcfztjI$aOS`!$zCNM2|&$5>755shx0A|PO-VThF(+_=Mn#aWU zXS1ThELJ{VW;Q0#ugocihXfcH*0pneX98m8?OfkkeswU*GP_J?Z(y}#WS-8b$LzS- zK;aORL|UVs0Gptqyttw^gEIpNaDWY%ele3-V)_I*W;J0$3k3rUD^p7=6AL{9Lo;I& M6XWe`n^}W-0NV#IRsaA1 delta 84 zcmZozAl9%zY=Si7%!xA2j58Y(S`!$zCNM2|&$5P{i(xuX0JGzCZwJQ8>4!cr&D*S~ nu!^;v>pK$=GjHem&ho2+S%!J-boK^TOQ2jX^Y*pPtie102ZJ5@ diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Models/GobalModel.cs b/Yi.Framework.Net6/Yi.Framework.Common/Models/GobalModel.cs new file mode 100644 index 00000000..1a86dd15 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Common/Models/GobalModel.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Common.Models +{ + public static class GobalModel + { + public static bool SqlLogEnable { get; set; } = true; + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Common/QueueModel/OrderCreateQueueModel.cs b/Yi.Framework.Net6/Yi.Framework.Common/QueueModel/OrderCreateQueueModel.cs index fd20b344..0f715418 100644 --- a/Yi.Framework.Net6/Yi.Framework.Common/QueueModel/OrderCreateQueueModel.cs +++ b/Yi.Framework.Net6/Yi.Framework.Common/QueueModel/OrderCreateQueueModel.cs @@ -28,7 +28,7 @@ namespace Yi.Framework.Common.QueueModel /// 尝试次数 /// public int TryTime { get; set; } - + public OrderTypeEnum OrderType { get; set; } public enum OrderTypeEnum diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/Appsettings.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/Appsettings.cs index 9161b748..53fedd00 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/Appsettings.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/Appsettings.cs @@ -84,9 +84,9 @@ namespace Yi.Framework.WebCore } - public static IConfiguration appConfiguration(params string[] sections) + public static IConfiguration? appConfiguration(params string[] sections) { - return Configuration.GetSection(string.Join(":", sections)); + return Configuration?.GetSection(string.Join(":", sections)); } } } diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/BuilderExtend/ApolloExtension.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/BuilderExtend/ApolloExtension.cs index 6005cdc6..36c73af5 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/BuilderExtend/ApolloExtension.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/BuilderExtend/ApolloExtension.cs @@ -52,10 +52,14 @@ namespace Yi.Framework.WebCore.BuilderExtend { var property = apolloProvider.GetType().BaseType?.GetProperty("Data", BindingFlags.Instance | BindingFlags.NonPublic); var data = property?.GetValue(apolloProvider) as IDictionary; - foreach (var item in data) + if (data is not null) { - Console.WriteLine($"key {item.Key} value {item.Value}"); + foreach (var item in data) + { + Console.WriteLine($"key {item.Key} value {item.Value}"); + } } + } }); } diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/BuilderExtend/OptionsWritable/Internal/JsonOptionsWritable.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/BuilderExtend/OptionsWritable/Internal/JsonOptionsWritable.cs index 662976d5..47ee93ff 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/BuilderExtend/OptionsWritable/Internal/JsonOptionsWritable.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/BuilderExtend/OptionsWritable/Internal/JsonOptionsWritable.cs @@ -15,12 +15,12 @@ internal class JsonOptionsWritable : FileOptionsWritableBase public override void Update(Action configuration) { - JObject jObject = JsonConvert.DeserializeObject(File.ReadAllText(this.FileName)); + JObject? jObject = JsonConvert.DeserializeObject(File.ReadAllText(this.FileName)); if (jObject != null) { TOptions option = this.Monitor.CurrentValue ?? new TOptions(); - if (jObject.TryGetValue(this.Section, out JToken jtoken)) + if (jObject.TryGetValue(this.Section, out JToken? jtoken)) { option = JsonConvert.DeserializeObject(jtoken.ToString()) ?? new TOptions(); configuration?.Invoke(option); diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/DbExtend/DbFiterExtend.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/DbExtend/DbFiterExtend.cs index c749a4d9..b5b33dab 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/DbExtend/DbFiterExtend.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/DbExtend/DbFiterExtend.cs @@ -21,7 +21,7 @@ namespace Yi.Framework.Core } //无需授权情况 - var userName = httpContext.GetUserNameInfo(); + var userName = httpContext?.GetUserNameInfo(); if (userName is null) { return; @@ -35,54 +35,57 @@ namespace Yi.Framework.Core //这里可以优化一下 //根据缓存获取全部用户信息 - var userRoleMenu = ServiceLocator.Instance.GetService().Get("用户id"); + var userRoleMenu = ServiceLocator.Instance?.GetService()?.Get("用户id"); - var roles = userRoleMenu.Roles; + var roles = userRoleMenu?.Roles; if (roles.IsNull()) { roles = new(); } //先测试部门就是LEBG - long deptId = userRoleMenu.User.DeptId??-1; - long userId = httpContext.GetUserIdInfo(); + long deptId = userRoleMenu?.User.DeptId ?? -1; + long userId = httpContext?.GetUserIdInfo()??-1; //根据角色的数据范围,来添加相对于的数据权限 - foreach (var role in roles) + if (roles is not null) { - //默认为全部 - DataScopeEnum dataScope = (DataScopeEnum)(role.DataScope?? DataScopeEnum.ALL.GetHashCode()); - switch (dataScope) + foreach (var role in roles) { - case DataScopeEnum.ALL: - //直接放行 - break; - case DataScopeEnum.DEPT: - //只能查询到自己的部门的数据 - db.QueryFilter.Add(new TableFilterItem(it => it.DeptId == deptId, true)); - break; - case DataScopeEnum.USER: - //只能查询到自己 - db.QueryFilter.Add(new TableFilterItem(it => it.Id == userId, true)); - break; - case DataScopeEnum.CUSTOM: - //自定义查询 - var filter = new TableFilterItem(it => SqlFunc.Subqueryable().Where(f => f.DeptId == it.DeptId && f.RoleId == (long)role.Id).Any(), true); - db.QueryFilter.Add(filter); - break; - case DataScopeEnum.DEPT_FOLLOW: - //放行自己部门及以下 - var allChildDepts = db.Queryable().ToChildList(it => it.ParentId, deptId); - - var filter1 = new TableFilterItem(it => allChildDepts.Select(f => f.Id).ToList().Contains(it.DeptId??-1), true); + //默认为全部 + DataScopeEnum dataScope = (DataScopeEnum)(role.DataScope ?? DataScopeEnum.ALL.GetHashCode()); + switch (dataScope) + { + case DataScopeEnum.ALL: + //直接放行 + break; + case DataScopeEnum.DEPT: + //只能查询到自己的部门的数据 + db.QueryFilter.Add(new TableFilterItem(it => it.DeptId == deptId, true)); + break; + case DataScopeEnum.USER: + //只能查询到自己 + db.QueryFilter.Add(new TableFilterItem(it => it.Id == userId, true)); + break; + case DataScopeEnum.CUSTOM: + //自定义查询 + var filter = new TableFilterItem(it => SqlFunc.Subqueryable().Where(f => f.DeptId == it.DeptId && f.RoleId == (long)role.Id).Any(), true); + db.QueryFilter.Add(filter); + break; + case DataScopeEnum.DEPT_FOLLOW: + //放行自己部门及以下 + var allChildDepts = db.Queryable().ToChildList(it => it.ParentId, deptId); - db.QueryFilter.Add(filter1); + var filter1 = new TableFilterItem(it => allChildDepts.Select(f => f.Id).ToList().Contains(it.DeptId ?? -1), true); - //部门无需过滤 - //var filter2 = new TableFilterItem(it => allChildDepts.Select(f => f.Id).ToList().Contains(it.Id),true); - //db.QueryFilter.Add(filter2); - break; - default: - break; + db.QueryFilter.Add(filter1); + + //部门无需过滤 + //var filter2 = new TableFilterItem(it => allChildDepts.Select(f => f.Id).ToList().Contains(it.Id),true); + //db.QueryFilter.Add(filter2); + break; + default: + break; + } } } } diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/DbExtend/DbSeedExtend.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/DbExtend/DbSeedExtend.cs index 54a688f0..b1e23a78 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/DbExtend/DbSeedExtend.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/DbExtend/DbSeedExtend.cs @@ -93,7 +93,7 @@ namespace Yi.Framework.WebCore.DbExtend if (Appsettings.appBool("DbSeed_Enabled")) { - var _Db = app.ApplicationServices.GetService(); + var _Db = app.ApplicationServices.GetRequiredService(); Invoer(_Db); } diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/CustomExceptionFilterAttribute.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/CustomExceptionFilterAttribute.cs index 23af7be8..7e6754b6 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/CustomExceptionFilterAttribute.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/CustomExceptionFilterAttribute.cs @@ -27,8 +27,8 @@ namespace Yi.Framework.WebCore.FilterExtend { context.Result = new JsonResult( Result.Error("操作失败").SetData(context.Exception.Message)); - string url = context.HttpContext.Request.Path.Value; - string actionName = context.ActionDescriptor.DisplayName; + string? url = context.HttpContext.Request.Path.Value; + string? actionName = context.ActionDescriptor.DisplayName; var logModel = new LogModel() { diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/CustomResourceFilterAttribute.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/CustomResourceFilterAttribute.cs index c8640ef7..031948f0 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/CustomResourceFilterAttribute.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/CustomResourceFilterAttribute.cs @@ -12,7 +12,7 @@ namespace Yi.Framework.WebCore.FilterExtend /// public class CustomResourceFilterAttribute : Attribute, IResourceFilter, IFilterMetadata { - private static Dictionary CustomCache = new Dictionary(); + private static Dictionary CustomCache = new Dictionary(); /// /// 发生在其他动作之前 /// diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/LogActionFilterAttribute.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/LogActionFilterAttribute.cs index 50cbca85..0e91e039 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/LogActionFilterAttribute.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/FilterExtend/LogActionFilterAttribute.cs @@ -14,7 +14,7 @@ namespace Yi.Framework.WebCore.FilterExtend /// public class LogActionFilterAttribute : ActionFilterAttribute { - private ILogger _logger = null; + private ILogger _logger ; public LogActionFilterAttribute(ILogger logger) { this._logger = logger; @@ -22,11 +22,11 @@ namespace Yi.Framework.WebCore.FilterExtend public override void OnActionExecuting(ActionExecutingContext context) { - string url = context.HttpContext.Request.Path.Value; + string? url = context.HttpContext.Request.Path.Value; string argument = JsonConvert.SerializeObject(context.ActionArguments); - string controllerName = context.Controller.GetType().FullName; - string actionName = context.ActionDescriptor.DisplayName; + string? controllerName = context.Controller.GetType().FullName; + string? actionName = context.ActionDescriptor.DisplayName; LogModel logModel = new LogModel() { diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/SqlsugarExtension.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/SqlsugarExtension.cs index 29f36b3b..b3dd8d1e 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/SqlsugarExtension.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/SqlsugarExtension.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Yi.Framework.Common.Models; namespace Yi.Framework.WebCore.MiddlewareExtend { @@ -95,10 +96,9 @@ namespace Yi.Framework.WebCore.MiddlewareExtend }; db.Aop.OnLogExecuting = (s, p) => { - //暂时先关闭sql打印 - if (false) + if (GobalModel.SqlLogEnable) { - var _logger = ServiceLocator.Instance.GetService>(); + var _logger = ServiceLocator.Instance?.GetRequiredService>(); StringBuilder sb = new StringBuilder(); sb.Append("执行SQL:" + s.ToString()); @@ -106,8 +106,7 @@ namespace Yi.Framework.WebCore.MiddlewareExtend { sb.Append($"\r\n参数:{i.ParameterName},参数值:{i.Value}"); } - - _logger.LogInformation(sb.ToString()); + _logger?.LogInformation(sb.ToString()); } diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/SwaggerExtension.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/SwaggerExtension.cs index 1c4bca99..d49d925c 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/SwaggerExtension.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/SwaggerExtension.cs @@ -31,6 +31,10 @@ namespace Yi.Framework.WebCore.MiddlewareExtend //为 Swagger JSON and UI设置xml文档注释路径 //获取应用程序所在目录(绝对路径,不受工作目录影响,建议采用此方法获取路径使用windwos&Linux) var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location); + if (basePath is null) + { + throw new Exception("未找到swagger文件"); + } var apiXmlPath = Path.Combine(basePath, @"Config/SwaggerDoc.xml");//控制器层注释 //var entityXmlPath = Path.Combine(basePath, @"SwaggerDoc.xml");//实体注释 //c.IncludeXmlComments(apiXmlPath, true);//true表示显示控制器注释 diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/ServiceLocator.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/ServiceLocator.cs index d6e235d2..8d72a516 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/ServiceLocator.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/ServiceLocator.cs @@ -7,14 +7,14 @@ namespace Yi.Framework.WebCore { public static class ServiceLocator { - public static IServiceProvider Instance { get; set; } + public static IServiceProvider? Instance { get; set; } public static string Admin { get; set; } = "cc"; - public static bool GetHttp(out HttpContext httpContext) + public static bool GetHttp(out HttpContext? httpContext) { httpContext = null; - var httpContextAccessor = Instance.GetService(); + var httpContextAccessor = Instance?.GetService(); if (httpContextAccessor is null) { return false; diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/SignalRHub/MainHub.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/SignalRHub/MainHub.cs index 1617fa1e..f8f24f98 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/SignalRHub/MainHub.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/SignalRHub/MainHub.cs @@ -40,11 +40,11 @@ namespace Yi.Framework.WebCore.SignalRHub { OnlineUser users = new(Context.ConnectionId) { - Browser= loginUser.Browser, - LoginLocation = loginUser.LoginLocation, - Ipaddr= loginUser.LoginIp, + Browser= loginUser?.Browser, + LoginLocation = loginUser?.LoginLocation, + Ipaddr= loginUser?.LoginIp, LoginTime=DateTime.Now, - Os=loginUser.Os, + Os=loginUser?.Os, UserName= name??"" }; clientUsers.Add(users); From ab8cdd88b921021c1f532d0f83df3745b5998d90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B7=B3?= Date: Tue, 18 Oct 2022 18:01:16 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E6=B7=BB=E5=8A=A0codeFirst=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/TestController.cs | 2 +- .../Yi.Framework.ApiMicroservice.csproj | 3 - .../appsettings.Production.json | 58 +++++++++--------- .../appsettings.Staging.json | 22 ++++--- .../appsettings.json | 1 + .../yi-sqlsugar-dev.db | Bin 364544 -> 180224 bytes .../ModelsTemplate/ArticleEntity.cs | 6 +- .../ModelsTemplate/ConfigEntity.cs | 10 +-- .../ModelsTemplate/DeptEntity.cs | 8 +-- .../ModelsTemplate/DictionaryEntity.cs | 6 +- .../ModelsTemplate/DictionaryInfoEntity.cs | 12 ++-- .../ModelsTemplate/FileEntity.cs | 8 +-- .../ModelsTemplate/LogEntity.cs | 4 +- .../ModelsTemplate/LoginLogEntity.cs | 14 ++--- .../ModelsTemplate/MenuEntity.cs | 14 ++--- .../ModelsTemplate/OperationLogEntity.cs | 16 ++--- .../ModelsTemplate/PostEntity.cs | 6 +- .../ModelsTemplate/RoleDeptEntity.cs | 2 +- .../ModelsTemplate/RoleEntity.cs | 14 ++--- .../ModelsTemplate/TenantEntity.cs | 4 +- .../ModelsTemplate/UserEntity.cs | 20 +++--- .../ModelsTemplate/UserPostEntity.cs | 2 +- .../Yi.Framework.Model.csproj | 1 + .../DbExtend/DbSeedExtend.cs | 35 ++++++++++- .../MiddlewareExtend/SqlsugarExtension.cs | 14 ++++- 25 files changed, 161 insertions(+), 121 deletions(-) diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/TestController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/TestController.cs index 8e0c2f73..a2e327d7 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/TestController.cs +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/TestController.cs @@ -272,7 +272,7 @@ namespace Yi.Framework.ApiMicroservice.Controllers public Result SeedDb() { var rep = _iUserService._repository; - return Result.Success().SetStatus(DbSeedExtend.Invoer(rep._Db)); + return Result.Success().SetStatus(DbSeedExtend.DataInvoer(rep._Db)); } /// diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Yi.Framework.ApiMicroservice.csproj b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Yi.Framework.ApiMicroservice.csproj index 677bea43..922abba3 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Yi.Framework.ApiMicroservice.csproj +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Yi.Framework.ApiMicroservice.csproj @@ -43,9 +43,6 @@ Always - - Always - diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.Production.json b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.Production.json index ec8aa7bb..07cf237d 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.Production.json +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.Production.json @@ -1,5 +1,5 @@ { - "StartUrl": "http://localohost:19001", + "StartUrl": "http://*:19001", "Logging": { "LogLevel": { "Default": "Information", @@ -12,10 +12,13 @@ "SqlLog_Enable": false, "Consul_Enabled": false, + "DbCodeFirst_Enabled": false, + "DbSeed_Enabled": false, "Apollo_Enabled": false, "HealthCheck_Enabled": false, "RabbitMQ_Enabled": false, "Redis_Enabled": false, + "RedisSeed_Enabled": false, "Kafka_Enabled": false, "ElasticSeach_Enabled": false, "MutiDB_Enabled": false, @@ -23,19 +26,16 @@ "CAP_Enabled": false, "CAPDashboard_Enabled": false, - "DbSeed_Enabled": true, - "RedisSeed_Enabled": false, - "Cors_Enabled": true, "DbList": [ "Sqlite", "Mysql", "Sqlserver", "Oracle" ], "DbSelect": "Sqlite", "DbConn": { "WriteUrl": "DataSource=yi-sqlsugar-dev.db", - //"WriteUrl": "server=119.91.207.67;port=3306;database=yi-sqlsugar-dev;user id=root;password=Qz52013142020.", + //"WriteUrl": "[xxxx];port=3306;database=[xxxx];user id=[xxxx];password=[xxxx]", "ReadUrl": [ - "server=119.91.207.67;port=3306;database=yi-sqlsugar-dev;user id=root;password=Qz52013142020.", - "server=119.91.207.67;port=3306;database=yi-sqlsugar-dev;user id=root;password=Qz52013142020.", - "server=119.91.207.67;port=3306;database=yi-sqlsugar-dev;user id=root;password=Qz52013142020." + "server=[xxxx];port=3306;database=[xxxx];user id=[xxxx];password=[xxxx]", + "server=[xxxx];port=3306;database=[xxxx];user id=[xxxx];password=[xxxx]", + "server=[xxxx];port=3306;database=[xxxx];user id=[xxxx];password=[xxxx]" ] }, "JwtAuthorize": { @@ -44,39 +44,39 @@ "PolicyName": "permission", "DefaultScheme": "Bearer", "IsHttps": false, - "Expiration": 30, + "Expiration": 300, "ReExpiration": 3000 }, "RedisConnOptions": { - "Host": "118.195.191.41", + "Host": "[xxxx]", "Prot": 6379, "DB": 1, - "Password": "Qz52013142020." + "Password": "[xxxx]" }, "RabbitConn": { - "HostName": "118.195.191.41", - "UserName": "cc", - "Password": "cc", + "HostName": "[xxxx]", + "UserName": "[xxxx]", + "Password": "[xxxx]", "Port": 5672 }, "ElasticSeachConn": { - "Url": "https://es-4zakkyyn.public.tencentelasticsearch.com:9200", - "IndexName": "yies", - "UserName": "elastic", - "PassWord": "Qz52013142020." + "Url": "[xxxx]", + "IndexName": "[xxxx]", + "UserName": "[xxxx]", + "PassWord": "[xxxx]" }, "KafkaOptions": { - "BrokerList": "192.168.3.230:9092", - "TopicName": "kafkalog" + "BrokerList": "[xxxx]", + "TopicName": "[xxxx]" }, "ConsulClientOption": { - "IP": "118.195.191.41", - "Port": "8500", - "Datacenter": "dc1" + "IP": "[xxxx]", + "Port": "[xxxx]", + "Datacenter": "[xxxx]" }, "ConsulRegisterOption": { - "IP": "118.195.191.41", - "Port": "19005", + "IP": "[xxxx]", + "Port": "19001", "GroupName": "ApiMicroservice", "HealthCheckUrl": "/Health", "Interval": 10, @@ -85,10 +85,10 @@ "Tag": "13" }, "SMS": { - "ID": "LTAI5tJvjPaXCyyPMfXLNbVA", - "Secret": "fLQv7jjj57fUKLFK8REeAQPFVDjUYn", - "Sign": "JiftCC", - "Template": "SMS_221640732" + "ID": "[xxxx]", + "Secret": "[xxxx]", + "Sign": "[xxxx]", + "Template": "[xxxx]" }, "IPLibraryServiceUrl": "http://gRPCIPLibraryService" } \ No newline at end of file diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.Staging.json b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.Staging.json index fd710b84..07cf237d 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.Staging.json +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.Staging.json @@ -12,6 +12,7 @@ "SqlLog_Enable": false, "Consul_Enabled": false, + "DbCodeFirst_Enabled": false, "DbSeed_Enabled": false, "Apollo_Enabled": false, "HealthCheck_Enabled": false, @@ -27,23 +28,24 @@ "Cors_Enabled": true, "DbList": [ "Sqlite", "Mysql", "Sqlserver", "Oracle" ], - "DbSelect": "Mysql", - "Pan": { - "ZipPath": "D:/AppWeb/test/zip" - }, - + "DbSelect": "Sqlite", "DbConn": { - "WriteUrl": "server=[xxxx];port=3306;database=[xxxx];user id=[xxxx];password=[xxxx]", + "WriteUrl": "DataSource=yi-sqlsugar-dev.db", + //"WriteUrl": "[xxxx];port=3306;database=[xxxx];user id=[xxxx];password=[xxxx]", "ReadUrl": [ "server=[xxxx];port=3306;database=[xxxx];user id=[xxxx];password=[xxxx]", "server=[xxxx];port=3306;database=[xxxx];user id=[xxxx];password=[xxxx]", "server=[xxxx];port=3306;database=[xxxx];user id=[xxxx];password=[xxxx]" ] }, - "JWTTokenOptions": { - "Audience": "http://localhost:7000", - "Issuer": "http://localhost:7000", - "SecurityKey": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDI2a2EJ7m872v0afyoSDJT2o1+SitIeJSWtLJU8/Wz2m7gStexajkeD+Lka6DSTy8gt9UwfgVQo6uKjVLG5Ex7PiGOODVqAEghBuS7JzIYU5RvI543nNDAPfnJsas96mSA7L/mD7RTE2drj6hf3oZjJpMPZUQI/B1Qjb5H3K3PNwIDAQAB" + "JwtAuthorize": { + "Issuer": "cc", + "Audience": "cc", + "PolicyName": "permission", + "DefaultScheme": "Bearer", + "IsHttps": false, + "Expiration": 300, + "ReExpiration": 3000 }, "RedisConnOptions": { "Host": "[xxxx]", diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.json b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.json index 0ed84298..07cf237d 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.json +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.json @@ -12,6 +12,7 @@ "SqlLog_Enable": false, "Consul_Enabled": false, + "DbCodeFirst_Enabled": false, "DbSeed_Enabled": false, "Apollo_Enabled": false, "HealthCheck_Enabled": false, diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/yi-sqlsugar-dev.db b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/yi-sqlsugar-dev.db index 7b63d53450bb907b9f7f419cd83b0c020ffef2f6..ce7018e8a79388231b137bfc10def269de7c46f5 100644 GIT binary patch literal 180224 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 G$^Q>*K4_Kz literal 364544 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%0DpG&!s=@djNX)O-BOgRbr$n?cU@Fk`%sv}^oFYx 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 jnM^~2NpL(h [SugarColumn(ColumnName="Title" )] - public string Title { get; set; } + public string? Title { get; set; } /// /// 文章内容 /// [SugarColumn(ColumnName="Content" )] - public string Content { get; set; } + public string? Content { get; set; } /// /// 用户id /// @@ -72,7 +72,7 @@ namespace Yi.Framework.Model.Models /// 描述 /// [SugarColumn(ColumnName="Remark" )] - public string Remark { get; set; } + public string? Remark { get; set; } /// /// 图片列表 /// diff --git a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/ConfigEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/ConfigEntity.cs index f41dd6b0..7fd11b35 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/ConfigEntity.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/ConfigEntity.cs @@ -22,22 +22,22 @@ namespace Yi.Framework.Model.Models /// 配置名称 /// [SugarColumn(ColumnName="ConfigName" )] - public string ConfigName { get; set; } + public string? ConfigName { get; set; } /// /// 配置键 /// [SugarColumn(ColumnName="ConfigKey" )] - public string ConfigKey { get; set; } + public string? ConfigKey { get; set; } /// /// 配置值 /// [SugarColumn(ColumnName="ConfigValue" )] - public string ConfigValue { get; set; } + public string? ConfigValue { get; set; } /// /// 配置类别 /// [SugarColumn(ColumnName="ConfigType" )] - public string ConfigType { get; set; } + public string? ConfigType { get; set; } /// /// 创建者 /// @@ -77,6 +77,6 @@ namespace Yi.Framework.Model.Models /// 描述 /// [SugarColumn(ColumnName="Remark" )] - public string Remark { get; set; } + public string? Remark { get; set; } } } diff --git a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/DeptEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/DeptEntity.cs index c8628796..bfc66554 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/DeptEntity.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/DeptEntity.cs @@ -22,17 +22,17 @@ namespace Yi.Framework.Model.Models /// 部门名称 /// [SugarColumn(ColumnName="DeptName" )] - public string DeptName { get; set; } + public string? DeptName { get; set; } /// /// 部门编码 /// [SugarColumn(ColumnName="DeptCode" )] - public string DeptCode { get; set; } + public string? DeptCode { get; set; } /// /// 负责人 /// [SugarColumn(ColumnName="Leader" )] - public string Leader { get; set; } + public string? Leader { get; set; } /// /// 父级id /// @@ -77,6 +77,6 @@ namespace Yi.Framework.Model.Models /// 描述 /// [SugarColumn(ColumnName="Remark" )] - public string Remark { get; set; } + public string? Remark { get; set; } } } diff --git a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/DictionaryEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/DictionaryEntity.cs index c95a26fa..b14c1f02 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/DictionaryEntity.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/DictionaryEntity.cs @@ -22,12 +22,12 @@ namespace Yi.Framework.Model.Models /// 字典名称 /// [SugarColumn(ColumnName="DictName" )] - public string DictName { get; set; } + public string? DictName { get; set; } /// /// 字典类型 /// [SugarColumn(ColumnName="DictType" )] - public string DictType { get; set; } + public string? DictType { get; set; } /// /// 创建者 /// @@ -67,6 +67,6 @@ namespace Yi.Framework.Model.Models /// 描述 /// [SugarColumn(ColumnName="Remark" )] - public string Remark { get; set; } + public string? Remark { get; set; } } } diff --git a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/DictionaryInfoEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/DictionaryInfoEntity.cs index 57dffa89..c1f7200e 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/DictionaryInfoEntity.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/DictionaryInfoEntity.cs @@ -22,17 +22,17 @@ namespace Yi.Framework.Model.Models /// 字典类型 /// [SugarColumn(ColumnName="DictType" )] - public string DictType { get; set; } + public string? DictType { get; set; } /// /// 字典标签 /// [SugarColumn(ColumnName="DictLabel" )] - public string DictLabel { get; set; } + public string? DictLabel { get; set; } /// /// 字典值 /// [SugarColumn(ColumnName="DictValue" )] - public string DictValue { get; set; } + public string? DictValue { get; set; } /// /// 是否为该类型的默认值 /// @@ -77,16 +77,16 @@ namespace Yi.Framework.Model.Models /// 描述 /// [SugarColumn(ColumnName="Remark" )] - public string Remark { get; set; } + public string? Remark { get; set; } /// /// tag类型 /// [SugarColumn(ColumnName="ListClass" )] - public string ListClass { get; set; } + public string? ListClass { get; set; } /// /// tagClass /// [SugarColumn(ColumnName="CssClass" )] - public string CssClass { get; set; } + public string? CssClass { get; set; } } } diff --git a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/FileEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/FileEntity.cs index 4f0e5a77..1336abe1 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/FileEntity.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/FileEntity.cs @@ -22,7 +22,7 @@ namespace Yi.Framework.Model.Models /// 文件类型 /// [SugarColumn(ColumnName="FileType" )] - public string FileType { get; set; } + public string? FileType { get; set; } /// /// 文件大小 /// @@ -32,12 +32,12 @@ namespace Yi.Framework.Model.Models /// 文件名 /// [SugarColumn(ColumnName="FileName" )] - public string FileName { get; set; } + public string? FileName { get; set; } /// /// 文件路径 /// [SugarColumn(ColumnName="FilePath" )] - public string FilePath { get; set; } + public string? FilePath { get; set; } /// /// 创建者 /// @@ -77,6 +77,6 @@ namespace Yi.Framework.Model.Models /// 描述 /// [SugarColumn(ColumnName="Remark" )] - public string Remark { get; set; } + public string? Remark { get; set; } } } diff --git a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/LogEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/LogEntity.cs index b7a085b1..e2db6dc9 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/LogEntity.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/LogEntity.cs @@ -43,7 +43,7 @@ namespace Yi.Framework.Model.Models /// 消息 /// [SugarColumn(ColumnName="Message" )] - public string Message { get; set; } + public string? Message { get; set; } /// /// 排序字段 /// @@ -53,6 +53,6 @@ namespace Yi.Framework.Model.Models /// 描述 /// [SugarColumn(ColumnName="Remark" )] - public string Remark { get; set; } + public string? Remark { get; set; } } } diff --git a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/LoginLogEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/LoginLogEntity.cs index d2165318..9f0dc985 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/LoginLogEntity.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/LoginLogEntity.cs @@ -22,32 +22,32 @@ namespace Yi.Framework.Model.Models /// 登录用户 /// [SugarColumn(ColumnName="LoginUser" )] - public string LoginUser { get; set; } + public string? LoginUser { get; set; } /// /// 登录地点 /// [SugarColumn(ColumnName="LoginLocation" )] - public string LoginLocation { get; set; } + public string? LoginLocation { get; set; } /// /// 登录Ip /// [SugarColumn(ColumnName="LoginIp" )] - public string LoginIp { get; set; } + public string? LoginIp { get; set; } /// /// 浏览器 /// [SugarColumn(ColumnName="Browser" )] - public string Browser { get; set; } + public string? Browser { get; set; } /// /// 操作系统 /// [SugarColumn(ColumnName="Os" )] - public string Os { get; set; } + public string? Os { get; set; } /// /// 登录信息 /// [SugarColumn(ColumnName="LogMsg" )] - public string LogMsg { get; set; } + public string? LogMsg { get; set; } /// /// 创建者 /// @@ -82,7 +82,7 @@ namespace Yi.Framework.Model.Models /// 描述 /// [SugarColumn(ColumnName="Remark" )] - public string Remark { get; set; } + public string? Remark { get; set; } /// /// 是否删除 /// diff --git a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/MenuEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/MenuEntity.cs index d10103ad..aeb3c471 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/MenuEntity.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/MenuEntity.cs @@ -23,7 +23,7 @@ namespace Yi.Framework.Model.Models /// /// [SugarColumn(ColumnName="MenuName" )] - public string MenuName { get; set; } + public string? MenuName { get; set; } /// /// /// @@ -33,7 +33,7 @@ namespace Yi.Framework.Model.Models /// /// [SugarColumn(ColumnName="PermissionCode" )] - public string PermissionCode { get; set; } + public string? PermissionCode { get; set; } /// /// /// @@ -73,12 +73,12 @@ namespace Yi.Framework.Model.Models /// 菜单图标 /// [SugarColumn(ColumnName="MenuIcon" )] - public string MenuIcon { get; set; } + public string? MenuIcon { get; set; } /// /// 菜单组件路由 /// [SugarColumn(ColumnName="Router" )] - public string Router { get; set; } + public string? Router { get; set; } /// /// 是否为外部链接 /// @@ -103,16 +103,16 @@ namespace Yi.Framework.Model.Models /// 描述 /// [SugarColumn(ColumnName="Remark" )] - public string Remark { get; set; } + public string? Remark { get; set; } /// /// 组件路径 /// [SugarColumn(ColumnName="Component" )] - public string Component { get; set; } + public string? Component { get; set; } /// /// 路由参数 /// [SugarColumn(ColumnName="Query" )] - public string Query { get; set; } + public string? Query { get; set; } } } diff --git a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/OperationLogEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/OperationLogEntity.cs index 183e60a3..3ee911fd 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/OperationLogEntity.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/OperationLogEntity.cs @@ -22,7 +22,7 @@ namespace Yi.Framework.Model.Models /// 操作模块 /// [SugarColumn(ColumnName="Title" )] - public string Title { get; set; } + public string? Title { get; set; } /// /// 操作类型 /// @@ -32,7 +32,7 @@ namespace Yi.Framework.Model.Models /// 请求方法 /// [SugarColumn(ColumnName="RequestMethod" )] - public string RequestMethod { get; set; } + public string? RequestMethod { get; set; } /// /// 操作人员 /// @@ -42,27 +42,27 @@ namespace Yi.Framework.Model.Models /// 操作Ip /// [SugarColumn(ColumnName="OperIp" )] - public string OperIp { get; set; } + public string? OperIp { get; set; } /// /// 操作地点 /// [SugarColumn(ColumnName="OperLocation" )] - public string OperLocation { get; set; } + public string? OperLocation { get; set; } /// /// 操作方法 /// [SugarColumn(ColumnName="Method" )] - public string Method { get; set; } + public string? Method { get; set; } /// /// 请求参数 /// [SugarColumn(ColumnName="RequestParam" )] - public string RequestParam { get; set; } + public string? RequestParam { get; set; } /// /// 请求结果 /// [SugarColumn(ColumnName="RequestResult" )] - public string RequestResult { get; set; } + public string? RequestResult { get; set; } /// /// 创建者 /// @@ -97,7 +97,7 @@ namespace Yi.Framework.Model.Models /// 描述 /// [SugarColumn(ColumnName="Remark" )] - public string Remark { get; set; } + public string? Remark { get; set; } /// /// 是否删除 /// diff --git a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/PostEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/PostEntity.cs index 35e513ca..02564b99 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/PostEntity.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/PostEntity.cs @@ -22,12 +22,12 @@ namespace Yi.Framework.Model.Models /// 岗位编码 /// [SugarColumn(ColumnName="PostCode" )] - public string PostCode { get; set; } + public string? PostCode { get; set; } /// /// 岗位名称 /// [SugarColumn(ColumnName="PostName" )] - public string PostName { get; set; } + public string? PostName { get; set; } /// /// 创建者 /// @@ -67,6 +67,6 @@ namespace Yi.Framework.Model.Models /// 描述 /// [SugarColumn(ColumnName="Remark" )] - public string Remark { get; set; } + public string? Remark { get; set; } } } diff --git a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/RoleDeptEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/RoleDeptEntity.cs index a63cc7ab..5a3689c0 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/RoleDeptEntity.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/RoleDeptEntity.cs @@ -67,6 +67,6 @@ namespace Yi.Framework.Model.Models /// 描述 /// [SugarColumn(ColumnName="Remark" )] - public string Remark { get; set; } + public string? Remark { get; set; } } } diff --git a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/RoleEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/RoleEntity.cs index 63a36218..e269079b 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/RoleEntity.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/RoleEntity.cs @@ -9,20 +9,20 @@ namespace Yi.Framework.Model.Models /// 角色表 /// [SugarTable("Role")] - public partial class RoleEntity:IBaseModelEntity + public partial class RoleEntity : IBaseModelEntity { public RoleEntity() { this.CreateTime = DateTime.Now; } [JsonConverter(typeof(ValueToStringConverter))] - [SugarColumn(ColumnName="Id" ,IsPrimaryKey = true )] - public long Id { get; set; } + [SugarColumn(ColumnName = "Id", IsPrimaryKey = true)] + public long Id { get; set; } /// /// /// - [SugarColumn(ColumnName="RoleName" )] - public string RoleName { get; set; } + [SugarColumn(ColumnName = "RoleName")] + public string? RoleName { get; set; } /// /// 创建者 /// @@ -57,7 +57,7 @@ namespace Yi.Framework.Model.Models /// 角色编码 /// [SugarColumn(ColumnName="RoleCode" )] - public string RoleCode { get; set; } + public string? RoleCode { get; set; } /// /// 排序字段 /// @@ -67,7 +67,7 @@ namespace Yi.Framework.Model.Models /// 描述 /// [SugarColumn(ColumnName="Remark" )] - public string Remark { get; set; } + public string? Remark { get; set; } /// /// 角色数据范围 /// diff --git a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/TenantEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/TenantEntity.cs index 408b15d9..6fe01429 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/TenantEntity.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/TenantEntity.cs @@ -22,7 +22,7 @@ namespace Yi.Framework.Model.Models /// /// [SugarColumn(ColumnName="TenantName" )] - public string TenantName { get; set; } + public string? TenantName { get; set; } /// /// 创建者 /// @@ -62,6 +62,6 @@ namespace Yi.Framework.Model.Models /// 描述 /// [SugarColumn(ColumnName="Remark" )] - public string Remark { get; set; } + public string? Remark { get; set; } } } diff --git a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/UserEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/UserEntity.cs index 70d7731f..ba887c24 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/UserEntity.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/UserEntity.cs @@ -22,7 +22,7 @@ namespace Yi.Framework.Model.Models /// /// [SugarColumn(ColumnName="Name" )] - public string Name { get; set; } + public string? Name { get; set; } /// /// /// @@ -72,42 +72,42 @@ namespace Yi.Framework.Model.Models /// /// [SugarColumn(ColumnName="Salt" )] - public string Salt { get; set; } + public string? Salt { get; set; } /// /// /// [SugarColumn(ColumnName="Icon" )] - public string Icon { get; set; } + public string? Icon { get; set; } /// /// /// [SugarColumn(ColumnName="Nick" )] - public string Nick { get; set; } + public string? Nick { get; set; } /// /// /// [SugarColumn(ColumnName="Email" )] - public string Email { get; set; } + public string? Email { get; set; } /// /// /// [SugarColumn(ColumnName="Ip" )] - public string Ip { get; set; } + public string? Ip { get; set; } /// /// /// [SugarColumn(ColumnName="Address" )] - public string Address { get; set; } + public string? Address { get; set; } /// /// /// [SugarColumn(ColumnName="Phone" )] - public string Phone { get; set; } + public string? Phone { get; set; } /// /// /// [SugarColumn(ColumnName="Introduction" )] - public string Introduction { get; set; } + public string? Introduction { get; set; } /// /// 排序字段 /// @@ -117,7 +117,7 @@ namespace Yi.Framework.Model.Models /// 描述 /// [SugarColumn(ColumnName="Remark" )] - public string Remark { get; set; } + public string? Remark { get; set; } /// /// 部门id /// diff --git a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/UserPostEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/UserPostEntity.cs index ef30ac12..bf737ff6 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/UserPostEntity.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/UserPostEntity.cs @@ -67,6 +67,6 @@ namespace Yi.Framework.Model.Models /// 描述 /// [SugarColumn(ColumnName="Remark" )] - public string Remark { get; set; } + public string? Remark { get; set; } } } diff --git a/Yi.Framework.Net6/Yi.Framework.Model/Yi.Framework.Model.csproj b/Yi.Framework.Net6/Yi.Framework.Model/Yi.Framework.Model.csproj index 7bc07bb8..03cc9a11 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/Yi.Framework.Model.csproj +++ b/Yi.Framework.Net6/Yi.Framework.Model/Yi.Framework.Model.csproj @@ -2,6 +2,7 @@ net6.0 + enable diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/DbExtend/DbSeedExtend.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/DbExtend/DbSeedExtend.cs index b1e23a78..8e93a35c 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/DbExtend/DbSeedExtend.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/DbExtend/DbSeedExtend.cs @@ -13,7 +13,12 @@ namespace Yi.Framework.WebCore.DbExtend { public static class DbSeedExtend { - public static bool Invoer(ISqlSugarClient _Db) + /// + /// 初始化数据 + /// + /// + /// + public static bool DataInvoer(ISqlSugarClient _Db) { bool res = false; var users = SeedFactory.GetUserSeed(); @@ -87,14 +92,40 @@ namespace Yi.Framework.WebCore.DbExtend return res; } + /// + /// codeFirst初始化表 + /// + /// + /// + public static void TableInvoer(ISqlSugarClient _Db) + { + //创建数据库 + _Db.DbMaintenance.CreateDatabase(); + var typeList = Common.Helper.AssemblyHelper.GetClass("Yi.Framework.Model"); + foreach (var t in typeList) + { + //扫描如果存在SugarTable特性,直接codefirst + if (t.GetCustomAttributes(false).Any(a => a.GetType().Equals(typeof(SugarTable)))) + { + _Db.CodeFirst.SetStringDefaultLength(200).InitTables(t);//这样一个表就能成功创建了 + } + } + + } + public static void UseDbSeedInitService(this IApplicationBuilder app) { + if (Appsettings.appBool("DbCodeFirst_Enabled")) + { + var _Db = app.ApplicationServices.GetRequiredService(); + TableInvoer(_Db); + } if (Appsettings.appBool("DbSeed_Enabled")) { var _Db = app.ApplicationServices.GetRequiredService(); - Invoer(_Db); + DataInvoer(_Db); } } diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/SqlsugarExtension.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/SqlsugarExtension.cs index b3dd8d1e..42a88bd3 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/SqlsugarExtension.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/SqlsugarExtension.cs @@ -4,6 +4,7 @@ using SqlSugar; using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using System.Text; using System.Threading.Tasks; using Yi.Framework.Common.Models; @@ -50,9 +51,16 @@ namespace Yi.Framework.WebCore.MiddlewareExtend { EntityService = (c, p) => { - // int? decimal?这种 isnullable=true - if (c.PropertyType.IsGenericType && - c.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>)) + //// int? decimal?这种 isnullable=true + //if (c.PropertyType.IsGenericType && + //c.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>)) + //{ + // p.IsNullable = true; + //} + + //高版C#写法 支持string?和string + if (new NullabilityInfoContext() + .Create(c).WriteState is NullabilityState.Nullable) { p.IsNullable = true; } From 0a27cd740313acd01d4313edb5d207e208235c8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B7=B3?= Date: Tue, 18 Oct 2022 19:27:58 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E5=95=86=E5=9F=8E=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WebFirst/database/sqlite.db | Bin 647168 -> 651264 bytes .../Config/SwaggerDoc.xml | 240 +++++++++--------- .../{ => Article}/ArticleController.cs | 0 .../Controllers/Shop/CategoryController.cs | 28 ++ .../Controllers/Shop/SkuController.cs | 28 ++ .../Controllers/Shop/SpecsController.cs | 28 ++ .../Controllers/Shop/SpecsGroupController.cs | 28 ++ .../Controllers/Shop/SpuController.cs | 28 ++ .../{ => System}/AccountController.cs | 0 .../{ => System}/ConfigController.cs | 0 .../{ => System}/DeptController.cs | 0 .../{ => System}/DictionaryController.cs | 0 .../{ => System}/DictionaryInfoController.cs | 0 .../{ => System}/FileController.cs | 0 .../Controllers/{ => System}/LogController.cs | 0 .../{ => System}/LoginLogController.cs | 0 .../{ => System}/MenuController.cs | 0 .../{ => System}/OnlineController.cs | 0 .../{ => System}/OperationLogController.cs | 0 .../{ => System}/PostController.cs | 0 .../{ => System}/RoleController.cs | 0 .../{ => System}/UserController.cs | 0 .../appsettings.json | 4 +- .../yi-sqlsugar-dev.db | Bin 180224 -> 221184 bytes .../IServiceTemplate/ICategoryService.cs | 9 + .../IServiceTemplate/ISkuService.cs | 9 + .../IServiceTemplate/ISpecsGroupService.cs | 9 + .../IServiceTemplate/ISpecsService.cs | 9 + .../IServiceTemplate/ISpuService.cs | 9 + .../Yi.Framework.Model/CategoryEntity.cs | 20 ++ .../ModelsTemplate/CategoryEntity.cs | 72 ++++++ .../ModelsTemplate/SkuEntity.cs | 78 ++++++ .../ModelsTemplate/SpecsEntity.cs | 72 ++++++ .../ModelsTemplate/SpecsGroupEntity.cs | 72 ++++++ .../ModelsTemplate/SpuEntity.cs | 83 ++++++ .../Yi.Framework.Model/SkuEntity.cs | 35 +++ .../Yi.Framework.Model/SpecsGroupEntity.cs | 16 ++ .../Yi.Framework.Model/SpuEntity.cs | 36 +++ .../ServiceTemplate/CategoryService.cs | 14 + .../ServiceTemplate/SkuService.cs | 14 + .../ServiceTemplate/SpecsGroupService.cs | 14 + .../ServiceTemplate/SpecsService.cs | 14 + .../ServiceTemplate/SpuService.cs | 14 + 43 files changed, 861 insertions(+), 122 deletions(-) rename Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/{ => Article}/ArticleController.cs (100%) create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/CategoryController.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SkuController.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SpecsController.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SpecsGroupController.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SpuController.cs rename Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/{ => System}/AccountController.cs (100%) rename Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/{ => System}/ConfigController.cs (100%) rename Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/{ => System}/DeptController.cs (100%) rename Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/{ => System}/DictionaryController.cs (100%) rename Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/{ => System}/DictionaryInfoController.cs (100%) rename Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/{ => System}/FileController.cs (100%) rename Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/{ => System}/LogController.cs (100%) rename Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/{ => System}/LoginLogController.cs (100%) rename Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/{ => System}/MenuController.cs (100%) rename Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/{ => System}/OnlineController.cs (100%) rename Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/{ => System}/OperationLogController.cs (100%) rename Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/{ => System}/PostController.cs (100%) rename Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/{ => System}/RoleController.cs (100%) rename Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/{ => System}/UserController.cs (100%) create mode 100644 Yi.Framework.Net6/Yi.Framework.Interface/IServiceTemplate/ICategoryService.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Interface/IServiceTemplate/ISkuService.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Interface/IServiceTemplate/ISpecsGroupService.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Interface/IServiceTemplate/ISpecsService.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Interface/IServiceTemplate/ISpuService.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/CategoryEntity.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/CategoryEntity.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/SkuEntity.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/SpecsEntity.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/SpecsGroupEntity.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/SpuEntity.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/SkuEntity.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/SpecsGroupEntity.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Model/SpuEntity.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Service/ServiceTemplate/CategoryService.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Service/ServiceTemplate/SkuService.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Service/ServiceTemplate/SpecsGroupService.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Service/ServiceTemplate/SpecsService.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Service/ServiceTemplate/SpuService.cs diff --git a/WebFirst/database/sqlite.db b/WebFirst/database/sqlite.db index 07b8ee1267e555782ba0e1a0c04923399f8b1f0c..df70988a1e8f5a132f8a1432d7a40a20fdd5f300 100644 GIT binary patch delta 2183 zcmZ{leQXnD7{KqY*RAcfJ!Us2A$2QkTu0ZBYrA%v=vFph1%bAA@*$!uw2->8&TWlZ z{9{|3Jp94OaL&VjL_#9Os6fyx2xbyL62m``7=%BjCeRJhNMbNC@gJYw+pjUb+sQ5B^q>J*N`_1=kQA0558_enP`PrdH8(m!3AcBgOD8~MvQ zl~epb{9pV-{#X7kKga*b-{i0J-}1Bk<{GOo>}J+3=PyWy-e}% z@P6|T=DnsrO%tYi<4490?hZG?ar*OyGlm|$d?~c7S?}K^a};f{EbsF9bUIe*%aHs2 z>2qF>*XtBLPO-IKY;E`Z+P$L7Bl=prq7w2l!j_>ZTH0)4-f|$ZZ)oFSIx`>@rR?;f z?9}-EvlH_lTwS;_v4n|OvDMWYKvDpv%NQ!NvK3s%1-Z+7Wq4n zk<@z$+wX7pwYYp@OTZJDI`KdV?T?{hZLOosU6otz&gQF%SMIm*$f)9HeBG^M5-OBPC{!u|Wx>d(AP_6dH=etKkn z`m=kpr{~Ad4-F3{`wz5uJW>w?kmFdy>089Xox2D%)R)PQ{ufJL3oRVgnDfa|^r&wP?QFLQ|2!g8}3|l>$IQA)_Vl z5&4++k{g^HwPJ;erK#@3aBng-lz-(9!}$;A-+Zf-dN(weSx5t;nXSDC@l>j>{Fa|Q zx^VUaF%hv^UT|=f&4!CKVRVJ#5ssIn@}m-t=K_|xU^PcIHKCDMD2v)r$ZCcDvbA^g zU?T5mp|xZuj~3UCI>43BY$IYyV#~&q?JTlrJBv0YMqBVyZ`DSim;0=XaW0t#ToVT(L`XISU(QQcXv!85;9BwEkZX z)kZ_qqczY_2n5x`aphPQQ`r%1g;jYE8m*;DVy|aN5naqbVQt!N~e#-4HhG)m>r@76>~v^pkjX5Mo=*)Y$Yh1+d@z{ z_k0;D=77xvg~{GTP!Sh|2`b`;9)gNEVIx7|+y;Wex%Fiz46vJ^Bs+8wl;nbS1cmKA Iq@rl)U+8_t2><{9 delta 249 zcmZp8px$smeS);06$1mqJRpXF=@WH~8Lc)Zi0L!>PcGM&Wn8d%s($_j1#bTRASLto zfAfFkf6xDt|1tkv{_Fe~`A_p7<=@XIwpE33DnA=HgRn3MNBe$$#_jw0nVbw{fm*n^ zD;fBw@SE^m;Y;BC#M{EFz_W_Sp8F@!zh0lk*}Q0PDm=$^ZZW diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Config/SwaggerDoc.xml b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Config/SwaggerDoc.xml index 92d0af2b..d92fa4c9 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Config/SwaggerDoc.xml +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Config/SwaggerDoc.xml @@ -4,62 +4,6 @@ Yi.Framework.ApiMicroservice - - - 账户管理 - - - - - 重置管理员CC的密码 - - - - - - 没啥说,登录 - - - - - - - 没啥说,注册 - - - - - - - 没啥说,登出 - - - - - - 通过已登录的用户获取用户信息 - - - - - - 获取当前登录用户的前端路由 - - - - - - 自己更新密码 - - - - - - - 验证码 - - - 动态条件分页查询 @@ -206,6 +150,62 @@ + + + 账户管理 + + + + + 重置管理员CC的密码 + + + + + + 没啥说,登录 + + + + + + + 没啥说,注册 + + + + + + + 没啥说,登出 + + + + + + 通过已登录的用户获取用户信息 + + + + + + 获取当前登录用户的前端路由 + + + + + + 自己更新密码 + + + + + + + 验证码 + + + 动态条件分页查询 @@ -441,6 +441,70 @@ + + + 用户管理 + + + + + 动态条件分页查询 + + + + + + + + + 更改用户状态 + + + + + + + + 给多用户设置多角色 + + + + + + + 通过用户id得到用户信息关联部门、岗位、角色 + + + + + + + 更新用户信息 + + + + + + + 更新个人中心信息 + + + + + + + 添加用户 + + + + + + + 重置密码 + + + + 测试控制器 @@ -562,69 +626,5 @@ - - - 用户管理 - - - - - 动态条件分页查询 - - - - - - - - - 更改用户状态 - - - - - - - - 给多用户设置多角色 - - - - - - - 通过用户id得到用户信息关联部门、岗位、角色 - - - - - - - 更新用户信息 - - - - - - - 更新个人中心信息 - - - - - - - 添加用户 - - - - - - - 重置密码 - - - - diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/ArticleController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Article/ArticleController.cs similarity index 100% rename from Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/ArticleController.cs rename to Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Article/ArticleController.cs diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/CategoryController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/CategoryController.cs new file mode 100644 index 00000000..cc47f38f --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/CategoryController.cs @@ -0,0 +1,28 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Yi.Framework.Common.Models; +using Yi.Framework.Interface; +using Yi.Framework.Model.Models; +using Yi.Framework.Repository; +using Yi.Framework.WebCore; +using Yi.Framework.WebCore.AttributeExtend; +using Yi.Framework.WebCore.AuthorizationPolicy; + +namespace Yi.Framework.ApiMicroservice.Controllers +{ + [ApiController] + [Route("api/[controller]/[action]")] + public class CategoryController : BaseCrudController + { + private ICategoryService _iCategoryService; + public CategoryController(ILogger logger, ICategoryService iCategoryService) : base(logger, iCategoryService) + { + _iCategoryService = iCategoryService; + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SkuController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SkuController.cs new file mode 100644 index 00000000..22a37906 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SkuController.cs @@ -0,0 +1,28 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Yi.Framework.Common.Models; +using Yi.Framework.Interface; +using Yi.Framework.Model.Models; +using Yi.Framework.Repository; +using Yi.Framework.WebCore; +using Yi.Framework.WebCore.AttributeExtend; +using Yi.Framework.WebCore.AuthorizationPolicy; + +namespace Yi.Framework.ApiMicroservice.Controllers +{ + [ApiController] + [Route("api/[controller]/[action]")] + public class SkuController : BaseCrudController + { + private ISkuService _iSkuService; + public SkuController(ILogger logger, ISkuService iSkuService) : base(logger, iSkuService) + { + _iSkuService = iSkuService; + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SpecsController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SpecsController.cs new file mode 100644 index 00000000..c31c4c91 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SpecsController.cs @@ -0,0 +1,28 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Yi.Framework.Common.Models; +using Yi.Framework.Interface; +using Yi.Framework.Model.Models; +using Yi.Framework.Repository; +using Yi.Framework.WebCore; +using Yi.Framework.WebCore.AttributeExtend; +using Yi.Framework.WebCore.AuthorizationPolicy; + +namespace Yi.Framework.ApiMicroservice.Controllers +{ + [ApiController] + [Route("api/[controller]/[action]")] + public class SpecsController : BaseCrudController + { + private ISpecsService _iSpecsService; + public SpecsController(ILogger logger, ISpecsService iSpecsService) : base(logger, iSpecsService) + { + _iSpecsService = iSpecsService; + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SpecsGroupController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SpecsGroupController.cs new file mode 100644 index 00000000..8e65d62e --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SpecsGroupController.cs @@ -0,0 +1,28 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Yi.Framework.Common.Models; +using Yi.Framework.Interface; +using Yi.Framework.Model.Models; +using Yi.Framework.Repository; +using Yi.Framework.WebCore; +using Yi.Framework.WebCore.AttributeExtend; +using Yi.Framework.WebCore.AuthorizationPolicy; + +namespace Yi.Framework.ApiMicroservice.Controllers +{ + [ApiController] + [Route("api/[controller]/[action]")] + public class SpecsGroupController : BaseCrudController + { + private ISpecsGroupService _iSpecsGroupService; + public SpecsGroupController(ILogger logger, ISpecsGroupService iSpecsGroupService) : base(logger, iSpecsGroupService) + { + _iSpecsGroupService = iSpecsGroupService; + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SpuController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SpuController.cs new file mode 100644 index 00000000..e16727d2 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SpuController.cs @@ -0,0 +1,28 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Yi.Framework.Common.Models; +using Yi.Framework.Interface; +using Yi.Framework.Model.Models; +using Yi.Framework.Repository; +using Yi.Framework.WebCore; +using Yi.Framework.WebCore.AttributeExtend; +using Yi.Framework.WebCore.AuthorizationPolicy; + +namespace Yi.Framework.ApiMicroservice.Controllers +{ + [ApiController] + [Route("api/[controller]/[action]")] + public class SpuController : BaseCrudController + { + private ISpuService _iSpuService; + public SpuController(ILogger logger, ISpuService iSpuService) : base(logger, iSpuService) + { + _iSpuService = iSpuService; + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/AccountController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/AccountController.cs similarity index 100% rename from Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/AccountController.cs rename to Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/AccountController.cs diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/ConfigController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/ConfigController.cs similarity index 100% rename from Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/ConfigController.cs rename to Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/ConfigController.cs diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/DeptController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/DeptController.cs similarity index 100% rename from Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/DeptController.cs rename to Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/DeptController.cs diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/DictionaryController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/DictionaryController.cs similarity index 100% rename from Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/DictionaryController.cs rename to Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/DictionaryController.cs diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/DictionaryInfoController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/DictionaryInfoController.cs similarity index 100% rename from Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/DictionaryInfoController.cs rename to Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/DictionaryInfoController.cs diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/FileController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/FileController.cs similarity index 100% rename from Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/FileController.cs rename to Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/FileController.cs diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/LogController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/LogController.cs similarity index 100% rename from Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/LogController.cs rename to Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/LogController.cs diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/LoginLogController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/LoginLogController.cs similarity index 100% rename from Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/LoginLogController.cs rename to Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/LoginLogController.cs diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/MenuController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/MenuController.cs similarity index 100% rename from Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/MenuController.cs rename to Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/MenuController.cs diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/OnlineController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/OnlineController.cs similarity index 100% rename from Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/OnlineController.cs rename to Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/OnlineController.cs diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/OperationLogController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/OperationLogController.cs similarity index 100% rename from Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/OperationLogController.cs rename to Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/OperationLogController.cs diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/PostController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/PostController.cs similarity index 100% rename from Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/PostController.cs rename to Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/PostController.cs diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/RoleController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/RoleController.cs similarity index 100% rename from Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/RoleController.cs rename to Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/RoleController.cs diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/UserController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/UserController.cs similarity index 100% rename from Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/UserController.cs rename to Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/System/UserController.cs diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.json b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.json index 07cf237d..0278d8e5 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.json +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/appsettings.json @@ -12,8 +12,8 @@ "SqlLog_Enable": false, "Consul_Enabled": false, - "DbCodeFirst_Enabled": false, - "DbSeed_Enabled": false, + "DbCodeFirst_Enabled": true, + "DbSeed_Enabled": true, "Apollo_Enabled": false, "HealthCheck_Enabled": false, "RabbitMQ_Enabled": false, diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/yi-sqlsugar-dev.db b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/yi-sqlsugar-dev.db index ce7018e8a79388231b137bfc10def269de7c46f5..326eb9ab35c5c9682b78a1f1e908f533fd4542f7 100644 GIT binary patch literal 221184 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 F{QpCM`MLlA literal 180224 zcmeHw3v?6LxvoZ%NADRKTL@zevcVW*{E&??HUVOcAr8hi#t@7{RAG&c5?eBo9B^q? z2?RnOl+Y7OlF|^;kkIyqqgio~ z?-@Pz?9mnuX&xoNz|#CP`}=0^@7pu8XK&5c=1rZ!nB*A>M@IcIPlL{><2c=o9*<6^ zD@1=w&|m5`11%U+0s7>KW!7S$u4etYJhW9W{s&I8K>V}#AC{=?ccy)ob$Q<~^%{Pa zw~IS$c%0k8?O>7o&91L-^6nKbP8SRXq`lGIBS>kVe>@hJW8b>qh~)F)_xyWY4wJjG zlDk)m`FD;;YlDNaU^wKDOmu{X!suqoCYxnfEuIX&|l&LqCEpk}PIs#>$ox$N? zDCX(v?(=kQ>Fo6M^mc4)?d|t$Xz%wdL1{3oZ(>X;^W5o=4DRwr7S%U4Rw`-J2|E2d zrIDN|w)#iL*&H3wwbGD(d?beRgEE6NB9pg8B!5iW5|tvEoKhS6f}@ByfRe?~5`o}jWScTMWgHl9#7>8fp>RTvMP|;d!JVwiwCVXle@H(JLID(RVJOCRhd3i zMe6cnuX0qRoHgxpP#KVu4R+qWzVzx&k}f(9)>}+&my0{RUU5(wi>*a}R?0QBYWjYm z#JT-K3EIK|wxOMp9~}`)zkB=KAf(w<~r$P|B%P%-FEOMlgV9F#2vmvcDF4Y z8VU|8?`E~b%F1bbtR&CrvXW$jG{N*yNs;>mucU#ayRyp6yH^*nj&4OJpI7;`+_N`N zKC18AEc?Du3XS7GUhO$vHEqXn;+%ft1d31Et5}Z|84X6GsKJr*xW7&gY^+4bU^v9A z_`TurSdQ~sN3=5-Lf3qCi>4#m<{#XJPMY-U&AY;T=(QiANzoP_9Seuh36`1tP2*A| z`%#UqLKS?ja}$=v=f&@)gT)4uyRD5ov{J64o5xVwwKF{I+czQkBX{i^4Toa8?%Egd zPu!JblTlrxbEKShMOQ8%%m!Z0E6gX|a@;6IqyAy`h4dP$0kUz6k#`5%Sf`sDI{Umi zHs&2{;Y{x0V(#z;+4R;(EI2qKB|r3PGm~qlZCqb4Ho}$yof%`fDm8BIXKkJ5H2f-+ z<&&-t*XTFCUF#S{6^XcwSXx(Chwj!=cXu9CC#vppa3WU3V;Hj04M+ofC8WZC;$q80-(V4s(=+24DSE0S9_scpa3WU3V;Hj z04M+ofC8WZC;$q80-%7b0F3`bMF0gr0Z;%G00lq+PyiGF1wa8%02BZPu73q!{Qvs* z7)l5VfC8WZC;$q80-yjW01AKtpa3WU3gEfeqX#cO`YyvJ-XJ#E^+zt11%OY**-C*@g;-!V2B-ZOmJFkk;e{RZy0 z+%e9p`$ye=OnLQJccqIjH|u!a3Z2fZD=09VEqGo**Prf6ysLLEN}N0!f9vGr`7@Ib z9Zs&()z{V6S9|NKy~{n`rk2LWmb!+T#^v6T@G$xxxNQ+4js<1#zpHwj>4{XS!O3(W^(t>!Q3pD zixqCQ%QAPyWhV7NF{Wm@JUdCPa#^M(U1pL;W+QT@%S8&g%4L~*8ZP5>_%C%dc@}18x$IWh)h^5Igv(6semCZ3xja+hR=X^7 zXIy4d56r~WESFtLYL&|}HR&>wJmNy+OqUB4a+S+6_cUCNMI;HQO}UJhlP(wH02d*PXSqB>VOP5>vlA{ex%+2eZkEgW3b)#2nLFb$lX@T@ zQ?p!lCaF~}%haUHO!B=>M4ooJlsaRJ3c1Q!=AMSvV^Vl*M2h0%DWman(r7C#6U%7JgCzGHKDSX6gx z#{OX9%;Ci2uP|&J9uEejU9s3$w57Io7)^*S)eMG5YX=8I5^CT_q}qw#_M45UROvmq z-0FKm!{mz>Coi6kzj`))=vBsEV&U*eEq>eiB?DF{b|t?8mjvEsdJMT-cocz zlUfF2;Ydq3G!hI+ErduMV>e1lf(? z&%rK^WGpIHGwPCz^8GS{G1;z;PM|h!WhEZ}uXQ}G6aOeqitmX(7r!sQC_XJdDn2NF zS&WF1xJ}$3t`fcC0?{p6g}(^D7k(rBQg~ZxCAfTJQ)3 z0`K@Q$8R0KcKpKeL&s~5?;v`3fdZfaC;$q80-yjW01AKtpa3WU3glG4Zs57($XHD+ z5meU@!IEkss9HhrvBaxoDssw9GnMMSW$f(XhN62XFUBACB`2+HOYL1`HgcuI+2 zo`(qL&Le`7xkNChgb0e~5W(zXA}E?o1ha~Wz&(oyX1a;MHIoPmT|`h&NCYzqh#-Fk z5jgXSKy(s;AQFK?AOgFC2yAvDu-b^gVkH8zg$PV$BH&F#kjE2&F^>ogMk3G~h=9}E z47?>Z-U`qE=R5#mBPak0fC8WZC;$q80-yjW01AKtpa3XvT_^z0|6dn2LLoo_PyiGF z1wa8%02BZPKmkwy6aWQ4ft(89@qepholbmS42osK{}CP&whA*G|KPYEt%MgS01AKt zpa3WU3V;Hj04M+ofC8WZrNA1iz?bV%vzT%6S}> z@uv^OA3B=2Z-3&!d-3?cRs3?+=l`in4k0K23V;Hj04M+ofC8WZC;$q80-yjW018~2 z0;%Wnac5Eb`F|8-p8rQd=J|gVWS;*=LFV~?6l9+NM?vQKe-vb%|3^XQ`F|AXg?~LmGA-uKmkwy6aWQ40Z;%G00lq+P~fkkz<|}xm)9z@ z$a7wKKC(4VOL7A9`(H`yzZ=a|?n9Hqqp8n*(U?Cr9?d?WSs$2u^kV#t6O%G1e&poT znRB;T5P1bfZchB&(aUd~n*8p?_~Q>?^6;1x@x>;_Bo;9VP>2W2S#oWpwKAA3^>m+%ue3KA`x{pWHr4)6ZqITku=i(1Njq^Pr z;k>idAX6u0&dVaR@$$us=vxo*BZnt1-h)|h5AXC1N5bP{EMgL%5N|Ug;z}yJ1|?la zW=x#BW{?Pl`BnpB_EOAxrD*Zj_s0*ts2CU-^^f=h!Ki=d2(x;SsH7nJEP`;!A6H3N z>gcZU9^WqXLkKKENPt4Tl|#hkRJL`=Uys=TO#H}qaJKQUH29*@UKTHzUg3rD|G&z~ z3`jr$PyiGF1wa8%02BZPKmkwy6aWQ4fm{lt#{b_%U0><(e-vcK|51<`|3^V){2v9G z@qZL##{W@}8UIH?X8a!onel%V$m9QW`13mPW$|{gNcgcZF3fgZa15hgFnGo8vpa1U zZKJk%*0-&r)?&-smfe>1-@A&gf)cI;f;jMiT=5(6AKQR*dQ0X?k6Xezt}_ zapa-+{ilcgBT*KAAo1)s6tg#-@gmHe9*0W2c4+cj7ZN9)PaHkp zoV^o&>8)fUWq?Y_{jEjneWY_gOSO;5hfkx-U%vRw$tUh!&e+EeGLf>6o>_>!C|v^d zw5vR1cgg8ivBzJ(aAp7gCI;_q%H|}ao546!&G_8w@k3{qF&KSud2^C+CWFzXVZ8T3 zBZKh^nDO2VNk$igu~5aB_{x#QHx4dkF#46v3ggy7HDkIa6sQ=LpGj|EFz!?~D~yW! zJq2psv_CUcyvh%x*E4trmCebr&tNd-s~DA^MfWlo1IlKFaeF>KzA|+vU3MpCR1KP< zakwidpJlNQDx1k;x6i5OPM2TQa4QF99W%$oaoZ_6`KnBgi_)wD!HP#>@k7AJ?`P_& zZ0-~oYz~S|8NX$fKA>#g>~Qj>1!*;_(rVfpp_q-eajpFtWRNm05jHe830Z1RuAbD6V-71N~$h85K2{>^>u8yU>W>?)(m zTdkP3SW9bB(JEzI+rF-KOJ^U0H;@!S9<9E`;^Zqcc4w|H<`l0o+?;sqK>Y4gEPn>k zHZ;;o*3M04HE~*26Gbf7y=hg=+e}X0o9$Z2W6DsN9KcpGl=EV!$#OrB`LkRM^R)cR z5jE|rVNV|8%wojU>Cy2kk3BSX@)%QPWwSC=-eY7i8dQvlN8X%#>H=F{d9%XUZE*7C zL{&&TrpJt_f%e3yZ=)}Munzm333+5*Nz{S9yI-C;T<4_;Ig&7b_C;oa6*iQjgJV$X zNUF()UuBn6&KOF8$N%RDC$c{OFGfU3+$L@iSBYM6f#?>k!e4~n3%?P5DZDMbE<7hZ ziGc6|1wa8%02BZPKmkwy6aWQ40Z;%G00pj9f%K?2>e!z{1hb2YplCJ`%qk)R_beiq z=_Uf#Od=?B5kWyA5zHtcg8Ugo;LIli(Mbe?NCar~+`x0m4syGL2yAvDu-b@#82`US zj{jdG$Nw*ptlTT4~5XJ`%(EL7BlBk;&U4 zl0PPGK{H)ua!PIN3yvb<07@1^O9XafI1n6~U|^MvOf1gOh!m4#fyfN?Ng;nIMhchC zPIn|AMY_gE%RER>2|Zy<#4`&KmYPs07Ht3M=nspFh@0 zV=?3%dbb^{x0u{67k7BQ;u>0q*IOy4(5mTsgc9fW2qkC>2iPWdN`6%PnI8A}BNF4V z`Fyy0@FtVVT~x#!zC$*xEgTvO4lD0wwQ!pv`0yi`y8#LfdjR& z%FMf07qL#YicCJQ@@cteZ=QUx-nUuyeWMf_$A7%qbG&NWj^o5R{l*CtpR^aE9w{;! zj7Cv|Bj@3KogA-NiH^Z=h*|M_!{f0Wr>%}?XE1~=+v-M1N3_j9xC@;N>D8OjRNwU4 zkI*V;3y+S4L+HH8%>JfvDU$uD#upSm*98SjS6rZ>gSXx(Chi0pN*?%H@!8Tw& zsk@Aly@>vO7GAa*?tijd#ki{Yy!d@SO89l0;RC)BxuJEaNUqn){hIRbQP*l^<@77H zeCL<*!uvU>ps4cM26W!G5?1Bw4Wlj%bhqI1rk08i>~+a)phHRLX2TaLoy!J}F$E9d&qZHc}Mm;l({shdR^!lh1q)(vuB#RSujOFC$3=hf@FcV!R zAIaRJrnDdR390jv?lej!>Xo8$?-wK0r*&dcPLWwJ#vkPZm#uRRomiR*dH05L)`^9z zYd$X-x$iONo7^QO+`R*G&+4VP!zJ8kKf2NqLp}BB#nx>DENT zd*q%@MlI+j8U<7*ETY~R9cI?D&qw{Kox!`=7p9~~!#;0n$yMRZb#^4W><>1IN|)P4 zxq{&>_|K`XSa{X6D-}+hvoi%J*c|*KYDWj8!65p9Dxy0XZ_9ag!wGu)v0b0J8u1Bs ztfMo^3W0ZbSF+A1nO<%@@+15SZIXKRhbt3Q;PS&tUXl6AvJcUNg2q()QIhv8>u zoDuosK=;R-_=pbuhZiUS3V;Hj04M+ofC8WZC;$q80-yjW01AA<3Jjqs{_{)cxl60? z9r~7h;@tyI{WzL~H}UBC zEBhadAAcnN>RHVL^>qz3jmsMXEe1QEPoueAk;@k@#P9$5)XVoIEa$>VQR&K= z?@fOF{N%-BlMfwcVV84uzF?jz*K3^CK`A_S{F|3AJaFa2TiKEI0X+V16n~DM{}(64 z_s{~oKmkwy6aWQ40Z;%G00lq+PyiGF1wa8%;IplO-N19HE(;?Oa0VjK>66d@C*DPU z1n~U-XWLT99Vh?_fC8WZC;$q80-yjW01AKtpa3ZF*H8eS|Nm>K2ppgQC;$q80-yjW z01AKtpa3WU3V;Hjz-LLK=NvqK;vez3_45?I15R%8{24S)0Gg#BJ6WSYFd7UQCez9A_`hD9l%N0qXaxi` zC;$q80-yjW01AKtpa3WU3V;Hj04M+oe98)>p8v;P4(aFr-$DHac_?F?_-CBGCE}mO zLgAl<$Av**k>lSTFF5u%Zg6n+AK4$U_t;&w_iU$a0b8Z@ch(oJd#x+2ddrV34_Y=^ zW}1Ixe!?u77n|NUy=0m&tuh(-pYTWdUf!MeFL`J3hVrV6zc;>Y{GxHS(P((v@D;;m z!z}&3>YvmP>z8mJaIbLtxEoPMeyTgBYi_ghJg-b-h`UJs?SOMls;fkv*+B0s$kwy5 ztg*RyjRx9EL1(a_ts3Z!6f~a&y-@>QO+lS3=xPmg6$KSp&{Z1fN(w5lper@d8z`uQ z1-(H7T|q(ZEa(aiw1tA&SkM*?w3&ihSrptTfK z$AZ>spfxfSoksEJyLx903tFRrR#VVw7PMLeT|z;Zu%Jsc&?*XA#e!C8po=N!Vit6< z23ko$D_PJ=4RjF&UBrSe(m*RHXax&ep@A->pbJ^hg&Jr%1ubVm%Qesi6m$U#xM{&=Lw- z!h)7)pmQkb92Rtr23kx(i&@ZO4RkgIoy~&I)3hH7(T^eX11ubMj3pLOJ3d(HM7HFU|C@8a0J3|A_r=ZM6ZN3KT zq@c`3ty2RPDJZj1D{7zu1!XpB1r5|eL79zOhX!h=pv*?CT?4gIP-dgnrh!^1D6>&( z)j%y2l-a1YXrSqVV@!csFw91+Spzjudu29iO&TaqL79zOUIWdepv*>Xo(5{9pv*?C zQ3EwlP-dgnpn>WsD6>(k*FfcFCB93?6v!NAqn6V^<)1DfpjjHV=$5~#4UhldW?PY- z|6lyR_@el<_^9}x_+>F7O5!$ggSblciVH-yXchh<{9gEt@Jr!s;dS9T;Ys0ya75TA zgap6PC#)A*glfSf6bQWIzZ}1H{Mzvg#}6H^Ilkj~+;QA-59&?0-Lb>b<7jg%b5uI! zI7Elu{wMpC{a5yXu>ZjRlKmO`WA>x={r0GR$lh=7w6C_;+so~<>^9r~vwdK@YZKrLE?Ix6Yc!2_-04M+ofC8WZC;$q80w2EusWCM)Mz!NM zBDi%25e(c)1ltFQpnp3NZ0je2TecCw)?0{R%T^-j+d>4J`-q@-GZAd+C4!z!M9|$s z1YO-ku(68>IyVx*hE5{5c>@u2+)M;Fbr8Y&n}}fDdLn3FM+9rziJ)yQ5v*w=g4Q)e zaAPYGtiF*5R;?z2m8*#0hLuFH;szpUSwRHNEkv-qnFyMe6Tz}3B4}Jj1WOx79ud2iGVi| zK^{*8#ylc0r04%frzd@S{(ls3>G6LQ=wSZ;kN-jedjJJM0Z;%G00lq+PyiGF1wa8% z02BZPK5YeH{{K(g0oXq%01AKtpa3WU3V;Hj04M+ofC8WZDDd$sAkY6V5C zj4}y**7+tHn;P*n^}RjO)^NDbCxtsUE#0%Td1B*8tlPV+W7*i!y+a#zci*wTz5n*{ z@Y-0-7pl31^b(}#kw~(?7C%rYyXzIo`yR|>bGqhZQdE%*3-K7j!jD& zwyoLH**w%ae9K6rb*O!7Yj4AydsePg^0TyYX@j?+v99jM-MecB!=s5;zZ*aGqPMZR zF8P{z>ygB%`w~ZvzyJE(=soem85|xvHucu?XwBVU;xc8=&y-!?q?G-C>z#7hzx8PR z*@v>u@X^>Yj)R68(jOdNe)Hb$ z+{~>T${C+%QVsuv}g8sps#0|Mk;`Nu|h%N1nTUasTD-9f==* z60L^$|F7>u8%hTXfC8WZC;$q80-yjW01AKtpa3ZFxl$lCGXR}KQXS=5?wYhAO!&=r6DD&(L4hKUqPgi%Jr)x`Rr>Cd4 zV`FP?zh^^xzh?trp|&@HZrjt(Y4Zu6qDpap%SI{*(Zhkp_nGG9#3WM0^Z$L!s&vcfV4Nddn6c> zeE#uRSdM)ut$g0p(xL;gQd#UnE7D^3grhOM9ekv@RjXtmPS$e=%VsaN1afgcJ!$4W9ynED#g0gbj2ZNG4TXjhr{kK&2uhBky zDw~t*REDp%8>P^=&zoABcc8hLyuPQ_r#|PZZAq=3wlNrx^~!>?k#)o0icd)FirKkN z|G4Oi&?N_5Me^zYutTo*cnkiUqZRi<3HveE_rF?G2%lDRHodSIZQ%g>q<4)6gnT~p z$NZZI!(*BYB0gGXUF~SWXG6tAyi^SH|6SKNJ5V@K02BZPKmkwy6aWQ40Z;%G00lq+ zP(W4y=Kq6=01AKtpa3WU3V;Hj04M+ofC8WZC;$pv{|eyof1_Ba6Mrb)FLt8^c!2_- z04M+ofC8WZC;$q80-yjW01AKtpA!X|jaHuLld~cI>8`|;OHP9eeZF(asgpm^L-h4^ z_4U=>x@zxokGH9%v9YDDp=Md*vSxz@s!u|=t3mY|r~*mu6+f-d+AF7lrZOs1$l zc+Kya_m~Z)r%fC9_xa;|N#6JKq&$o9JH{r%dxkF?=Iei`-@yHrJH~l+|A;83_3Ey4 z@#SV+vbUw6z-+c~2#B-yuHLyQaq?{Zt&@}I&rCjaIJqusCrIOR??`wU{SVx>2oZ9P zNkT+r))9mi@nZ)PC!UWVdE&~WPwAr*(U>&af+oxv3J$kKq|xx5QgSczvvswgy##Kp z!2DhY|3ZcT@>}N<4}Xv1mjc1q)z}9XV)j}Fd%41%_}cUFCm*NS{ei&M$aj=u@&*R^ zf+YFrvs2GKNs;d!mm(8aqu;v#(OXi=xQfgcWMxCj%J~ZY)cH3j-#D)pek2%83BxiM zYp2*0P_VU1R4dOscI*6Ho|MI(JsCgrn%eU~a4@EJd@jrJ?PZv~nju@M!mf5)W+(h+ za`%^F?kWbiN8wicEpunwW>OD$Fg2?x%}Y|N+?J_HubJeLd5GMS(!}MGy{=7pJy#)D z4%?*HGWRr`#_8n0q|bOc>GE7$pj7>$kL;583nwqXaa8T{7@FHm?Q#**jwaYSh#$_h;z)Vcda@m!nR=F%wlP)vKBQ8YFbh%I=SGg>6 zPs8O{M3QjYl*@QI>2e`15XVOP5>vlA{e zx%+2eZkEgW3b)#2nLFb$lX@T@Q?p!lCaF~}%haUHO!B=>M4ooJlsaRJ3c1QZ%V``Sywj{O6Ynht#nn^xxL*!|%iz%+!>>p)B`3=%`%!#Qmc%XsY#=m+*u!MiJ zuXb=SB%ua=M5>(#Zok=xN|oM&%dNgAG)%sDaq{Bn_^W5*hhAmuB^C~k)Z(|DUov2Y zQujPX%1udQs-dcnpE@^r;Vng{(Qqgj3rAYQp^;!nY9U187`stYD(`_LyjBSnt$Ori zNs3FOr91o87m6n`~NoGvGnu*!aoa-3xmQU$GotS?&kT31^2mLH>U1#Gg+H2=!{gjq5#Hob3p$uwbFWis$T;g9mYygTn- z^3LQ9oqPC!96tClr3H?Pq^TPf%a7PM6Zy^(_Ev!FL>psOjUlLcL^fv%#U zS$p$wSyySGD=DbJ+UrUU^acv*U_o!tKvz&uI}5r(18t$8HWsu+18t_DSv$h9OwAhT zatdl;?RB{Z+C)LkENGJkx{QLFSkPq}Xd?yXSt&d`>wQP6oT=sXQ{E(Oi{{U%(S=4zlN6tsl3*AfkM4h5aV zg3i%Eiz#R^3tFs!&ZeNVSZYJ>7SyeQ&ZM9- zSP2dj20lRnPyUHX^f8OFjROpt7HYugpd*_544A${h#E)8@e1!eY4Zqz_KDJZjVvQq=yKtY*(lN&V9n<*%>Z}Mghw1a{& z`zAXy(3>bIvv2Yy4Rk#PW%f<3*Fe`%P-frcIt{d)f-?Ii+cnU&6qMOFxmE*hqoAz5 G$^Q>*K4_Kz diff --git a/Yi.Framework.Net6/Yi.Framework.Interface/IServiceTemplate/ICategoryService.cs b/Yi.Framework.Net6/Yi.Framework.Interface/IServiceTemplate/ICategoryService.cs new file mode 100644 index 00000000..88833ca8 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Interface/IServiceTemplate/ICategoryService.cs @@ -0,0 +1,9 @@ +using Yi.Framework.Model.Models; +using Yi.Framework.Repository; + +namespace Yi.Framework.Interface +{ + public partial interface ICategoryService:IBaseService + { + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Interface/IServiceTemplate/ISkuService.cs b/Yi.Framework.Net6/Yi.Framework.Interface/IServiceTemplate/ISkuService.cs new file mode 100644 index 00000000..5adf4d8f --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Interface/IServiceTemplate/ISkuService.cs @@ -0,0 +1,9 @@ +using Yi.Framework.Model.Models; +using Yi.Framework.Repository; + +namespace Yi.Framework.Interface +{ + public partial interface ISkuService:IBaseService + { + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Interface/IServiceTemplate/ISpecsGroupService.cs b/Yi.Framework.Net6/Yi.Framework.Interface/IServiceTemplate/ISpecsGroupService.cs new file mode 100644 index 00000000..f7bb04e6 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Interface/IServiceTemplate/ISpecsGroupService.cs @@ -0,0 +1,9 @@ +using Yi.Framework.Model.Models; +using Yi.Framework.Repository; + +namespace Yi.Framework.Interface +{ + public partial interface ISpecsGroupService:IBaseService + { + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Interface/IServiceTemplate/ISpecsService.cs b/Yi.Framework.Net6/Yi.Framework.Interface/IServiceTemplate/ISpecsService.cs new file mode 100644 index 00000000..174689d2 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Interface/IServiceTemplate/ISpecsService.cs @@ -0,0 +1,9 @@ +using Yi.Framework.Model.Models; +using Yi.Framework.Repository; + +namespace Yi.Framework.Interface +{ + public partial interface ISpecsService:IBaseService + { + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Interface/IServiceTemplate/ISpuService.cs b/Yi.Framework.Net6/Yi.Framework.Interface/IServiceTemplate/ISpuService.cs new file mode 100644 index 00000000..774a4cab --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Interface/IServiceTemplate/ISpuService.cs @@ -0,0 +1,9 @@ +using Yi.Framework.Model.Models; +using Yi.Framework.Repository; + +namespace Yi.Framework.Interface +{ + public partial interface ISpuService:IBaseService + { + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Model/CategoryEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/CategoryEntity.cs new file mode 100644 index 00000000..b5f24ae3 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Model/CategoryEntity.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json.Serialization; +using SqlSugar; +namespace Yi.Framework.Model.Models +{ + /// + /// 商品分类表 + /// + public partial class CategoryEntity:IBaseModelEntity + { + [SugarColumn(IsIgnore = true)] + public List Children { get; set; } + + + [Navigate(NavigateType.OneToMany,nameof(SpecsGroupEntity.CategoryId))] + public List SpecsGroups { get; set; } + } +} \ No newline at end of file diff --git a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/CategoryEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/CategoryEntity.cs new file mode 100644 index 00000000..16131d5e --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/CategoryEntity.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json.Serialization; +using SqlSugar; +namespace Yi.Framework.Model.Models +{ + /// + /// 商品分类表 + /// + [SugarTable("Category")] + public partial class CategoryEntity:IBaseModelEntity + { + public CategoryEntity() + { + this.CreateTime = DateTime.Now; + } + [JsonConverter(typeof(ValueToStringConverter))] + [SugarColumn(ColumnName="Id" ,IsPrimaryKey = true )] + public long Id { get; set; } + /// + /// 父级id + /// + [SugarColumn(ColumnName="ParentId" )] + public long? ParentId { get; set; } + /// + /// 分类名称 + /// + [SugarColumn(ColumnName="CategoryName" )] + public string CategoryName { get; set; } + /// + /// 创建者 + /// + [SugarColumn(ColumnName="CreateUser" )] + public long? CreateUser { get; set; } + /// + /// 创建时间 + /// + [SugarColumn(ColumnName="CreateTime" )] + public DateTime? CreateTime { get; set; } + /// + /// 修改者 + /// + [SugarColumn(ColumnName="ModifyUser" )] + public long? ModifyUser { get; set; } + /// + /// 修改时间 + /// + [SugarColumn(ColumnName="ModifyTime" )] + public DateTime? ModifyTime { get; set; } + /// + /// 是否删除 + /// + [SugarColumn(ColumnName="IsDeleted" )] + public bool? IsDeleted { get; set; } + /// + /// 租户Id + /// + [SugarColumn(ColumnName="TenantId" )] + public long? TenantId { get; set; } + /// + /// 排序字段 + /// + [SugarColumn(ColumnName="OrderNum" )] + public int? OrderNum { get; set; } + /// + /// 描述 + /// + [SugarColumn(ColumnName="Remark" )] + public string? Remark { get; set; } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/SkuEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/SkuEntity.cs new file mode 100644 index 00000000..76e374eb --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/SkuEntity.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json.Serialization; +using SqlSugar; +namespace Yi.Framework.Model.Models +{ + /// + /// Sku表 + /// + [SugarTable("Sku")] + public partial class SkuEntity:IBaseModelEntity + { + public SkuEntity() + { + this.CreateTime = DateTime.Now; + } + [JsonConverter(typeof(ValueToStringConverter))] + [SugarColumn(ColumnName="Id" ,IsPrimaryKey = true )] + public long Id { get; set; } + /// + /// SpuId + /// + [SugarColumn(ColumnName="SpuId" )] + public long? SpuId { get; set; } + /// + /// 库存 + /// + [SugarColumn(ColumnName="Stock" )] + public int? Stock { get; set; } + /// + /// 价格 + /// + [SugarColumn(ColumnName="Price" )] + public int? Price { get; set; } + + /// + /// 创建者 + /// + [SugarColumn(ColumnName="CreateUser" )] + public long? CreateUser { get; set; } + /// + /// 创建时间 + /// + [SugarColumn(ColumnName="CreateTime" )] + public DateTime? CreateTime { get; set; } + /// + /// 修改者 + /// + [SugarColumn(ColumnName="ModifyUser" )] + public long? ModifyUser { get; set; } + /// + /// 修改时间 + /// + [SugarColumn(ColumnName="ModifyTime" )] + public DateTime? ModifyTime { get; set; } + /// + /// 是否删除 + /// + [SugarColumn(ColumnName="IsDeleted" )] + public bool? IsDeleted { get; set; } + /// + /// 租户Id + /// + [SugarColumn(ColumnName="TenantId" )] + public long? TenantId { get; set; } + /// + /// 排序字段 + /// + [SugarColumn(ColumnName="OrderNum" )] + public int? OrderNum { get; set; } + /// + /// 描述 + /// + [SugarColumn(ColumnName="Remark" )] + public string? Remark { get; set; } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/SpecsEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/SpecsEntity.cs new file mode 100644 index 00000000..a5b0c161 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/SpecsEntity.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json.Serialization; +using SqlSugar; +namespace Yi.Framework.Model.Models +{ + /// + /// 商品规格表 + /// + [SugarTable("Specs")] + public partial class SpecsEntity:IBaseModelEntity + { + public SpecsEntity() + { + this.CreateTime = DateTime.Now; + } + [JsonConverter(typeof(ValueToStringConverter))] + [SugarColumn(ColumnName="Id" ,IsPrimaryKey = true )] + public long Id { get; set; } + /// + /// 商品规格组id + /// + [SugarColumn(ColumnName="SpecsGroupId" )] + public long? SpecsGroupId { get; set; } + /// + /// 商品规格名 + /// + [SugarColumn(ColumnName="SpecsName" )] + public string SpecsName { get; set; } + /// + /// 创建者 + /// + [SugarColumn(ColumnName="CreateUser" )] + public long? CreateUser { get; set; } + /// + /// 创建时间 + /// + [SugarColumn(ColumnName="CreateTime" )] + public DateTime? CreateTime { get; set; } + /// + /// 修改者 + /// + [SugarColumn(ColumnName="ModifyUser" )] + public long? ModifyUser { get; set; } + /// + /// 修改时间 + /// + [SugarColumn(ColumnName="ModifyTime" )] + public DateTime? ModifyTime { get; set; } + /// + /// 是否删除 + /// + [SugarColumn(ColumnName="IsDeleted" )] + public bool? IsDeleted { get; set; } + /// + /// 租户Id + /// + [SugarColumn(ColumnName="TenantId" )] + public long? TenantId { get; set; } + /// + /// 排序字段 + /// + [SugarColumn(ColumnName="OrderNum" )] + public int? OrderNum { get; set; } + /// + /// 描述 + /// + [SugarColumn(ColumnName="Remark" )] + public string? Remark { get; set; } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/SpecsGroupEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/SpecsGroupEntity.cs new file mode 100644 index 00000000..8dd9c248 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/SpecsGroupEntity.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json.Serialization; +using SqlSugar; +namespace Yi.Framework.Model.Models +{ + /// + /// 商品规格组表 + /// + [SugarTable("SpecsGroup")] + public partial class SpecsGroupEntity:IBaseModelEntity + { + public SpecsGroupEntity() + { + this.CreateTime = DateTime.Now; + } + [JsonConverter(typeof(ValueToStringConverter))] + [SugarColumn(ColumnName="Id" ,IsPrimaryKey = true )] + public long Id { get; set; } + /// + /// 分类id + /// + [SugarColumn(ColumnName="CategoryId" )] + public long? CategoryId { get; set; } + /// + /// 商品规格组名 + /// + [SugarColumn(ColumnName="SpecsGroupName" )] + public string SpecsGroupName { get; set; } + /// + /// 创建者 + /// + [SugarColumn(ColumnName="CreateUser" )] + public long? CreateUser { get; set; } + /// + /// 创建时间 + /// + [SugarColumn(ColumnName="CreateTime" )] + public DateTime? CreateTime { get; set; } + /// + /// 修改者 + /// + [SugarColumn(ColumnName="ModifyUser" )] + public long? ModifyUser { get; set; } + /// + /// 修改时间 + /// + [SugarColumn(ColumnName="ModifyTime" )] + public DateTime? ModifyTime { get; set; } + /// + /// 是否删除 + /// + [SugarColumn(ColumnName="IsDeleted" )] + public bool? IsDeleted { get; set; } + /// + /// 租户Id + /// + [SugarColumn(ColumnName="TenantId" )] + public long? TenantId { get; set; } + /// + /// 排序字段 + /// + [SugarColumn(ColumnName="OrderNum" )] + public int? OrderNum { get; set; } + /// + /// 描述 + /// + [SugarColumn(ColumnName="Remark" )] + public string? Remark { get; set; } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/SpuEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/SpuEntity.cs new file mode 100644 index 00000000..f1b2453d --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/SpuEntity.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json.Serialization; +using SqlSugar; +namespace Yi.Framework.Model.Models +{ + /// + /// Spu表 + /// + [SugarTable("Spu")] + public partial class SpuEntity:IBaseModelEntity + { + public SpuEntity() + { + this.CreateTime = DateTime.Now; + } + [JsonConverter(typeof(ValueToStringConverter))] + [SugarColumn(ColumnName="Id" ,IsPrimaryKey = true )] + public long Id { get; set; } + /// + /// 商品分类Id + /// + [SugarColumn(ColumnName="CategoryId" )] + public long? CategoryId { get; set; } + /// + /// 商品名称 + /// + [SugarColumn(ColumnName="SpuName" )] + public string SpuName { get; set; } + /// + /// 商品详情 + /// + [SugarColumn(ColumnName="Details" )] + public string Details { get; set; } + /// + /// 商品价格 + /// + [SugarColumn(ColumnName="Price" )] + public string Price { get; set; } + + /// + /// 创建者 + /// + [SugarColumn(ColumnName="CreateUser" )] + public long? CreateUser { get; set; } + /// + /// 创建时间 + /// + [SugarColumn(ColumnName="CreateTime" )] + public DateTime? CreateTime { get; set; } + /// + /// 修改者 + /// + [SugarColumn(ColumnName="ModifyUser" )] + public long? ModifyUser { get; set; } + /// + /// 修改时间 + /// + [SugarColumn(ColumnName="ModifyTime" )] + public DateTime? ModifyTime { get; set; } + /// + /// 是否删除 + /// + [SugarColumn(ColumnName="IsDeleted" )] + public bool? IsDeleted { get; set; } + /// + /// 租户Id + /// + [SugarColumn(ColumnName="TenantId" )] + public long? TenantId { get; set; } + /// + /// 排序字段 + /// + [SugarColumn(ColumnName="OrderNum" )] + public int? OrderNum { get; set; } + /// + /// 描述 + /// + [SugarColumn(ColumnName="Remark" )] + public string? Remark { get; set; } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Model/SkuEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/SkuEntity.cs new file mode 100644 index 00000000..b07a6bcf --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Model/SkuEntity.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json.Serialization; +using SqlSugar; +namespace Yi.Framework.Model.Models +{ + /// + /// Sku表 + /// + public partial class SkuEntity:IBaseModelEntity + { + /// + /// 规格sku信息 + /// + [SugarColumn(ColumnName = "SpecsSkuInfo", IsJson = true)] + public List SpecsSkuInfo { get; set; } + /// + /// 规格sku完整信息 + /// + [SugarColumn(ColumnName = "SpecsSkuAllInfo", IsJson = true)] + public List SpecsSkuAllInfo { get; set; } + } + + public class SpecsSkuAllInfoModel + { + public string? SpecsGroupName { get; set; } + public string? SpecsName { get; set; } + } + public class SpecsSkuInfoModel + { + public long? SpecsGroupId { get; set; } + public long? SpecsId { get; set; } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Model/SpecsGroupEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/SpecsGroupEntity.cs new file mode 100644 index 00000000..96793422 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Model/SpecsGroupEntity.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json.Serialization; +using SqlSugar; +namespace Yi.Framework.Model.Models +{ + /// + /// 商品规格组表 + /// + public partial class SpecsGroupEntity:IBaseModelEntity + { + [Navigate(NavigateType.OneToMany, nameof(SpecsEntity.SpecsGroupId))] + public List Specses { get; set; } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Model/SpuEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/SpuEntity.cs new file mode 100644 index 00000000..6f253f55 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Model/SpuEntity.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json.Serialization; +using SqlSugar; +namespace Yi.Framework.Model.Models +{ + + public partial class SpuEntity:IBaseModelEntity + { + /// + /// 规格Spu完整信息 + /// + [SugarColumn(ColumnName = "SpecsAllInfo", IsJson = true)] + public List SpecsSpuAllInfo { get; set; } + /// + /// 规格Spu信息 + /// + [SugarColumn(ColumnName = "SpecsInfo", IsJson = true)] + public List SpecsSpuInfo { get; set; } + + [Navigate(NavigateType.OneToMany, nameof(SkuEntity.SpuId))] + public List Spus { get; set; } + } + + public class SpecsSpuAllInfoModel + { + public string? SpecsGroupName { get; set; } + public List? SpecsNames{ get;set;} + } + public class SpecsSpuInfoModel + { + public long? SpecsGroupId{ get; set; } + public List? SpecsIds { get; set; } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Service/ServiceTemplate/CategoryService.cs b/Yi.Framework.Net6/Yi.Framework.Service/ServiceTemplate/CategoryService.cs new file mode 100644 index 00000000..ea55419a --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Service/ServiceTemplate/CategoryService.cs @@ -0,0 +1,14 @@ +using SqlSugar; +using Yi.Framework.Interface; +using Yi.Framework.Model.Models; +using Yi.Framework.Repository; + +namespace Yi.Framework.Service +{ + public partial class CategoryService : BaseService, ICategoryService + { + public CategoryService(IRepository repository) : base(repository) + { + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Service/ServiceTemplate/SkuService.cs b/Yi.Framework.Net6/Yi.Framework.Service/ServiceTemplate/SkuService.cs new file mode 100644 index 00000000..6d86af4c --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Service/ServiceTemplate/SkuService.cs @@ -0,0 +1,14 @@ +using SqlSugar; +using Yi.Framework.Interface; +using Yi.Framework.Model.Models; +using Yi.Framework.Repository; + +namespace Yi.Framework.Service +{ + public partial class SkuService : BaseService, ISkuService + { + public SkuService(IRepository repository) : base(repository) + { + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Service/ServiceTemplate/SpecsGroupService.cs b/Yi.Framework.Net6/Yi.Framework.Service/ServiceTemplate/SpecsGroupService.cs new file mode 100644 index 00000000..fc7edbe2 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Service/ServiceTemplate/SpecsGroupService.cs @@ -0,0 +1,14 @@ +using SqlSugar; +using Yi.Framework.Interface; +using Yi.Framework.Model.Models; +using Yi.Framework.Repository; + +namespace Yi.Framework.Service +{ + public partial class SpecsGroupService : BaseService, ISpecsGroupService + { + public SpecsGroupService(IRepository repository) : base(repository) + { + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Service/ServiceTemplate/SpecsService.cs b/Yi.Framework.Net6/Yi.Framework.Service/ServiceTemplate/SpecsService.cs new file mode 100644 index 00000000..0374e217 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Service/ServiceTemplate/SpecsService.cs @@ -0,0 +1,14 @@ +using SqlSugar; +using Yi.Framework.Interface; +using Yi.Framework.Model.Models; +using Yi.Framework.Repository; + +namespace Yi.Framework.Service +{ + public partial class SpecsService : BaseService, ISpecsService + { + public SpecsService(IRepository repository) : base(repository) + { + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Service/ServiceTemplate/SpuService.cs b/Yi.Framework.Net6/Yi.Framework.Service/ServiceTemplate/SpuService.cs new file mode 100644 index 00000000..a91bc78d --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Service/ServiceTemplate/SpuService.cs @@ -0,0 +1,14 @@ +using SqlSugar; +using Yi.Framework.Interface; +using Yi.Framework.Model.Models; +using Yi.Framework.Repository; + +namespace Yi.Framework.Service +{ + public partial class SpuService : BaseService, ISpuService + { + public SpuService(IRepository repository) : base(repository) + { + } + } +} From 9aaf3635842440c94b6c6dc1e0daca6f6ede8fe9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B7=B3?= Date: Wed, 19 Oct 2022 14:34:53 +0800 Subject: [PATCH 5/8] =?UTF-8?q?10/19=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Yi.Framework.ApiMicroservice/Program.cs | 2 +- .../ConsulRegisterHostExtend.cs | 126 ++++++++++++++++++ 2 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/ConsulRegisterHostExtend.cs diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Program.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Program.cs index 6227a613..d3e88145 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Program.cs +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Program.cs @@ -139,7 +139,7 @@ builder.Services.AddHeiCaptcha(); #endregion builder.Services.AddHttpContextAccessor(); #region -//ͼ +//ͼSystem.DrawinglinuҪ֧ #endregion builder.Services.AddSingleton(); diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/ConsulRegisterHostExtend.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/ConsulRegisterHostExtend.cs new file mode 100644 index 00000000..4061172f --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/MiddlewareExtend/ConsulRegisterHostExtend.cs @@ -0,0 +1,126 @@ +using Consul; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Options; +using System; +using System.Threading; +using System.Threading.Tasks; +using Yi.Framework.Common.IOCOptions; + +namespace Yi.Framework.WebCore.MiddlewareExtend +{ + /// + /// 注册ConsulRegisterService 这个servcie在app启动的时候会自动注册服务信息 + /// + public class ConsulRegisterHostExtend : IHostedService + { + private readonly ConsulRegisterOption _consulRegisterOptions; + private readonly ConsulClientOption _consulClientOptions; + public ConsulRegisterHostExtend() + { + _consulRegisterOptions = Appsettings.app("ConsulRegisterOption"); + + _consulClientOptions = Appsettings.app("ConsulClientOption"); + } + public async Task StartAsync(CancellationToken cancellationToken) + { + var httpPort = this._consulRegisterOptions.Port; + //var grpcPort = Convert.ToInt32(Appsettings.app("GrpcPort")); + //------------------Http------------------ + using (ConsulClient client = new ConsulClient(c => + { + c.Address = new Uri($"http://{this._consulClientOptions.IP}:{this._consulClientOptions.Port}/"); + c.Datacenter = this._consulClientOptions.Datacenter; + })) + { + var serviceId = $"{this._consulRegisterOptions.IP}:{httpPort}-{this._consulRegisterOptions.GroupName}"; + + await client.Agent.ServiceDeregister(serviceId, cancellationToken); + + Console.WriteLine($"开始向Consul注册Http[{serviceId}]服务 ..."); + + await client.Agent.ServiceRegister(new AgentServiceRegistration() + { + ID = serviceId,//唯一Id + Name = this._consulRegisterOptions.GroupName,//组名称-Group + Address = this._consulRegisterOptions.IP, + Port = httpPort, + Tags = new string[] { "Http" }, + Check = new AgentServiceCheck() + { + Interval = TimeSpan.FromSeconds(this._consulRegisterOptions.Interval), + HTTP = $"http://{_consulRegisterOptions.IP}:{httpPort}/Health", + //GRPC = $"{this._consulRegisterOptions.IP}:{grpcPort}",//gRPC特有 + GRPCUseTLS = false,//支持http + Timeout = TimeSpan.FromSeconds(this._consulRegisterOptions.Timeout), + DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(this._consulRegisterOptions.DeregisterCriticalServiceAfter), + + } + }); + } + + + //------------------Grpc------------------ + //using (ConsulClient client = new ConsulClient(c => + //{ + // c.Address = new Uri($"http://{this._consulClientOptions.IP}:{this._consulClientOptions.Port}/"); + // c.Datacenter = this._consulClientOptions.Datacenter; + //})) + //{ + // var serviceId = $"{this._consulRegisterOptions.IP}:{grpcPort}-{this._consulRegisterOptions.GrpcGroupName}"; + + // await client.Agent.ServiceDeregister(serviceId, cancellationToken); + + // Console.WriteLine($"开始向Consul注册Grpc[{serviceId}]服务 ..."); + + // await client.Agent.ServiceRegister(new AgentServiceRegistration() + // { + // ID = serviceId,//唯一Id + // Name = this._consulRegisterOptions.GrpcGroupName,//组名称-Group + // Address = this._consulRegisterOptions.IP, + // Port = grpcPort, + // Tags = new string[] { "Grpc" }, + // Check = new AgentServiceCheck() + // { + // Interval = TimeSpan.FromSeconds(this._consulRegisterOptions.Interval), + // //HTTP = this._consulRegisterOption.HealthCheckUrl, + // GRPC = $"{this._consulRegisterOptions.IP}:{grpcPort}",//gRPC特有 + // GRPCUseTLS = false,//支持http + // Timeout = TimeSpan.FromSeconds(this._consulRegisterOptions.Timeout), + // DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(this._consulRegisterOptions.DeregisterCriticalServiceAfter), + + // } + // }); + //} + } + + /// + /// 正常注销调用 + /// + /// + /// + public async Task StopAsync(CancellationToken cancellationToken) + { + var httpPort = this._consulRegisterOptions.Port; + //var grpcPort = Appsettings.app("GrpcPort"); + + + using (ConsulClient client = new ConsulClient(c => + { + c.Address = new Uri($"http://{this._consulClientOptions.IP}:{this._consulClientOptions.Port}/"); + c.Datacenter = this._consulClientOptions.Datacenter; + })) { + + + var serviceId = $"{this._consulRegisterOptions.GroupName}:{this._consulRegisterOptions.IP}-{httpPort}"; + + //var grpcServiceId = $"{this._consulRegisterOptions.GrpcGroupName}:{this._consulRegisterOptions.IP}-{grpcPort}"; + + await client.Agent.ServiceDeregister(serviceId, cancellationToken); + //await client.Agent.ServiceDeregister(grpcServiceId, cancellationToken); + Console.WriteLine($"开始Consul注销[{serviceId}]服务 ..."); + + } + + } + } +} From 0755a4026ad403caffcdcce36f89285f9a8ff036 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B7=B3?= Date: Wed, 19 Oct 2022 19:10:48 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dcodefirst?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Yi.Framework.ApiMicroservice/Program.cs | 3 --- .../yi-sqlsugar-dev.db | Bin 221184 -> 221184 bytes .../Yi.Framework.Model/ArticleEntity.cs | 2 +- .../Yi.Framework.Model/CategoryEntity.cs | 4 ++-- .../Yi.Framework.Model/MenuEntity.cs | 12 ++++++------ .../ModelsTemplate/ArticleEntity.cs | 2 +- .../Yi.Framework.Model/RoleEntity.cs | 4 ++-- .../Yi.Framework.Model/SkuEntity.cs | 4 ++-- .../Yi.Framework.Model/SpecsGroupEntity.cs | 2 +- .../Yi.Framework.Model/SpuEntity.cs | 6 +++--- .../Yi.Framework.Model/UserEntity.cs | 6 +++--- Yi.Vue3.x.Vant/components.d.ts | 2 -- Yi.Vue3.x.Vant/src/api/articleApi.ts | 1 - Yi.Vue3.x.Vant/src/layout/bottom/index.vue | 8 ++++---- Yi.Vue3.x.Vant/src/utils/myaxios.ts | 10 +++++++++- 15 files changed, 34 insertions(+), 32 deletions(-) diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Program.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Program.cs index d3e88145..45a105fc 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Program.cs +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Program.cs @@ -159,9 +159,6 @@ ServiceLocator.Instance = app.Services; //ҳע #endregion app.UseDeveloperExceptionPage(); - #region - //Swaggerע - #endregion app.UseSwaggerService(); } #region diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/yi-sqlsugar-dev.db b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/yi-sqlsugar-dev.db index 326eb9ab35c5c9682b78a1f1e908f533fd4542f7..8600b9436a61e0febe1437d3fc235c188850cc35 100644 GIT binary patch literal 221184 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 literal 221184 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 F{QpCM`MLlA diff --git a/Yi.Framework.Net6/Yi.Framework.Model/ArticleEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/ArticleEntity.cs index fc9ad6b0..0f9cb8ca 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/ArticleEntity.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/ArticleEntity.cs @@ -8,6 +8,6 @@ namespace Yi.Framework.Model.Models public partial class ArticleEntity:IBaseModelEntity { [Navigate(NavigateType.OneToOne,nameof(UserId))] - public UserEntity User { get; set; } + public UserEntity? User { get; set; } } } diff --git a/Yi.Framework.Net6/Yi.Framework.Model/CategoryEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/CategoryEntity.cs index b5f24ae3..565f195e 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/CategoryEntity.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/CategoryEntity.cs @@ -11,10 +11,10 @@ namespace Yi.Framework.Model.Models public partial class CategoryEntity:IBaseModelEntity { [SugarColumn(IsIgnore = true)] - public List Children { get; set; } + public List? Children { get; set; } [Navigate(NavigateType.OneToMany,nameof(SpecsGroupEntity.CategoryId))] - public List SpecsGroups { get; set; } + public List? SpecsGroups { get; set; } } } \ No newline at end of file diff --git a/Yi.Framework.Net6/Yi.Framework.Model/MenuEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/MenuEntity.cs index e56f69ea..7cc31a48 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/MenuEntity.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/MenuEntity.cs @@ -25,14 +25,14 @@ namespace Yi.Framework.Model.Models var r = new VueRouterModel(); r.OrderNum = m.OrderNum ?? 0; - var routerName = m.Router.Split("/").LastOrDefault(); + var routerName = m.Router?.Split("/").LastOrDefault(); r.Id = m.Id; - r.ParentId = (long)m.ParentId; + r.ParentId = m.ParentId??-1; //开头大写 - r.Name = routerName.First().ToString().ToUpper() + routerName.Substring(1); + r.Name = routerName?.First().ToString().ToUpper() + routerName?.Substring(1); r.Path = m.Router; - r.Hidden = (bool)!m.IsShow; + r.Hidden =!m.IsShow??false; if (m.MenuType == MenuTypeEnum.Catalogue.GetHashCode()) @@ -62,9 +62,9 @@ namespace Yi.Framework.Model.Models { Title = m.MenuName, Icon = m.MenuIcon, - NoCache = (bool)!m.IsCache + NoCache = !m.IsCache??true }; - if ((bool)m.IsLink) + if (m.IsLink??false) { r.Meta.link = m.Router; r.AlwaysShow = false; diff --git a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/ArticleEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/ArticleEntity.cs index 3d9d7f17..c1dceebc 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/ArticleEntity.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/ArticleEntity.cs @@ -77,6 +77,6 @@ namespace Yi.Framework.Model.Models /// 图片列表 /// [SugarColumn(ColumnName="Images",IsJson = true)] - public List Images { get; set; } + public List? Images { get; set; } } } diff --git a/Yi.Framework.Net6/Yi.Framework.Model/RoleEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/RoleEntity.cs index 3aec15c2..6a99237e 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/RoleEntity.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/RoleEntity.cs @@ -10,9 +10,9 @@ namespace Yi.Framework.Model.Models { [Navigate(typeof(RoleMenuEntity),nameof(RoleMenuEntity.RoleId),nameof(RoleMenuEntity.MenuId))] - public List Menus { get; set; } + public List? Menus { get; set; } [Navigate(typeof(RoleDeptEntity), nameof(RoleDeptEntity.RoleId), nameof(RoleDeptEntity.DeptId))] - public List Depts { get; set; } + public List? Depts { get; set; } } } diff --git a/Yi.Framework.Net6/Yi.Framework.Model/SkuEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/SkuEntity.cs index b07a6bcf..582c3283 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/SkuEntity.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/SkuEntity.cs @@ -14,12 +14,12 @@ namespace Yi.Framework.Model.Models /// 规格sku信息 /// [SugarColumn(ColumnName = "SpecsSkuInfo", IsJson = true)] - public List SpecsSkuInfo { get; set; } + public List? SpecsSkuInfo { get; set; } /// /// 规格sku完整信息 /// [SugarColumn(ColumnName = "SpecsSkuAllInfo", IsJson = true)] - public List SpecsSkuAllInfo { get; set; } + public List? SpecsSkuAllInfo { get; set; } } public class SpecsSkuAllInfoModel diff --git a/Yi.Framework.Net6/Yi.Framework.Model/SpecsGroupEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/SpecsGroupEntity.cs index 96793422..3a4df243 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/SpecsGroupEntity.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/SpecsGroupEntity.cs @@ -11,6 +11,6 @@ namespace Yi.Framework.Model.Models public partial class SpecsGroupEntity:IBaseModelEntity { [Navigate(NavigateType.OneToMany, nameof(SpecsEntity.SpecsGroupId))] - public List Specses { get; set; } + public List? Specses { get; set; } } } diff --git a/Yi.Framework.Net6/Yi.Framework.Model/SpuEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/SpuEntity.cs index 6f253f55..cb09b8df 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/SpuEntity.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/SpuEntity.cs @@ -12,15 +12,15 @@ namespace Yi.Framework.Model.Models /// 规格Spu完整信息 /// [SugarColumn(ColumnName = "SpecsAllInfo", IsJson = true)] - public List SpecsSpuAllInfo { get; set; } + public List? SpecsSpuAllInfo { get; set; } /// /// 规格Spu信息 /// [SugarColumn(ColumnName = "SpecsInfo", IsJson = true)] - public List SpecsSpuInfo { get; set; } + public List? SpecsSpuInfo { get; set; } [Navigate(NavigateType.OneToMany, nameof(SkuEntity.SpuId))] - public List Spus { get; set; } + public List? Spus { get; set; } } public class SpecsSpuAllInfoModel diff --git a/Yi.Framework.Net6/Yi.Framework.Model/UserEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/UserEntity.cs index dd3d2275..07d56a5a 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/UserEntity.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/UserEntity.cs @@ -12,13 +12,13 @@ namespace Yi.Framework.Model.Models /// 看好啦!ORM精髓,导航属性 /// [Navigate(typeof(UserRoleEntity), nameof(UserRoleEntity.UserId), nameof(UserRoleEntity.RoleId))] - public List Roles { get; set; } + public List? Roles { get; set; } [Navigate(typeof(UserPostEntity), nameof(UserPostEntity.UserId), nameof(UserPostEntity.PostId))] - public List Posts { get; set; } + public List? Posts { get; set; } [Navigate( NavigateType.OneToOne,nameof(DeptId))] - public DeptEntity Dept { get; set; } + public DeptEntity? Dept { get; set; } /// /// 构建密码,MD5盐值加密 diff --git a/Yi.Vue3.x.Vant/components.d.ts b/Yi.Vue3.x.Vant/components.d.ts index 71bae129..9709bee6 100644 --- a/Yi.Vue3.x.Vant/components.d.ts +++ b/Yi.Vue3.x.Vant/components.d.ts @@ -15,7 +15,6 @@ declare module '@vue/runtime-core' { RouterView: typeof import('vue-router')['RouterView'] VanActionSheet: typeof import('vant/es')['ActionSheet'] VanButton: typeof import('vant/es')['Button'] - VanCell: typeof import('vant/es')['Cell'] VanCellGroup: typeof import('vant/es')['CellGroup'] VanCol: typeof import('vant/es')['Col'] VanDivider: typeof import('vant/es')['Divider'] @@ -27,7 +26,6 @@ declare module '@vue/runtime-core' { VanList: typeof import('vant/es')['List'] VanLoading: typeof import('vant/es')['Loading'] VanNavBar: typeof import('vant/es')['NavBar'] - VanPopup: typeof import('vant/es')['Popup'] VanPullRefresh: typeof import('vant/es')['PullRefresh'] VanRow: typeof import('vant/es')['Row'] VanSticky: typeof import('vant/es')['Sticky'] diff --git a/Yi.Vue3.x.Vant/src/api/articleApi.ts b/Yi.Vue3.x.Vant/src/api/articleApi.ts index 24ad276c..c7ad11a1 100644 --- a/Yi.Vue3.x.Vant/src/api/articleApi.ts +++ b/Yi.Vue3.x.Vant/src/api/articleApi.ts @@ -3,7 +3,6 @@ import { ArticleEntity } from '@/type/interface/ArticleEntity' export default { add(data:any) { - console.log(data) return myaxios({ url: `/article/add`, method: 'post', diff --git a/Yi.Vue3.x.Vant/src/layout/bottom/index.vue b/Yi.Vue3.x.Vant/src/layout/bottom/index.vue index a955d1f4..8f9bdbe3 100644 --- a/Yi.Vue3.x.Vant/src/layout/bottom/index.vue +++ b/Yi.Vue3.x.Vant/src/layout/bottom/index.vue @@ -35,8 +35,8 @@ let tabbar=ref([ {icon:"wap-home",to:"/",title:"主页"}, {icon:"location-o",to:"",title:"发现"}, {icon:"",to:"",title:""}, - // {icon:"friends-o",to:"/shopIndex",title:"商城"}, - {icon:"friends-o",to:"",title:"商城"}, + {icon:"friends-o",to:"/shopIndex",title:"商城"}, + // {icon:"friends-o",to:"",title:"商城"}, {icon:"setting-o",to:"/my",title:"我的"}, ]) const onChange=(index:number)=>{ @@ -44,8 +44,8 @@ const onChange=(index:number)=>{ {icon:"wap-home-o",to:"/",title:"主页"}, {icon:"location-o",to:"",title:"发现"}, {icon:"",to:"",title:""}, - // {icon:"friends-o",to:"/shopIndex",title:"商城"}, - {icon:"friends-o",to:"",title:"商城"}, + {icon:"friends-o",to:"/shopIndex",title:"商城"}, + // {icon:"friends-o",to:"",title:"商城"}, {icon:"setting-o",to:"/my",title:"我的"}, ]; tabbar.value[index].icon=tabbar.value[index].icon.replace("-o","") diff --git a/Yi.Vue3.x.Vant/src/utils/myaxios.ts b/Yi.Vue3.x.Vant/src/utils/myaxios.ts index fbcd51fd..b25bde49 100644 --- a/Yi.Vue3.x.Vant/src/utils/myaxios.ts +++ b/Yi.Vue3.x.Vant/src/utils/myaxios.ts @@ -42,7 +42,15 @@ myaxios.interceptors.request.use(function(config:any) { myaxios.interceptors.response.use(async function(response) { //成功 const resp = response.data - + if(resp.code==401) + { + Notify({ type: 'warning', message: '登录过期' }); + //登出 + useUserStore().logOut().then(() => { + location.href = '/'; + }) + isRelogin.show = false; + } // store.dispatch("closeLoad"); return resp; }, async function(error) { From ff7eecee55cba2afc9c299c0bb75b1e4c97c1467 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B7=B3?= Date: Thu, 20 Oct 2022 16:33:29 +0800 Subject: [PATCH 7/8] =?UTF-8?q?10/20=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Config/SwaggerDoc.xml | 12 +++++++++ .../Controllers/Article/ArticleController.cs | 2 +- .../Controllers/Shop/SkuController.cs | 12 ++++++++- .../Controllers/Shop/SpuController.cs | 12 ++++++++- .../yi-sqlsugar-dev.db | Bin 221184 -> 221184 bytes .../Yi.Framework.Interface/ISkuService.cs | 19 +++++++++++++ .../Yi.Framework.Interface/ISpuService.cs | 19 +++++++++++++ .../ModelsTemplate/SpuEntity.cs | 6 ++--- .../Yi.Framework.Model/SpuEntity.cs | 2 +- .../Yi.Framework.Service/SkuService.cs | 25 ++++++++++++++++++ .../Yi.Framework.Service/SpuService.cs | 25 ++++++++++++++++++ 11 files changed, 127 insertions(+), 7 deletions(-) create mode 100644 Yi.Framework.Net6/Yi.Framework.Interface/ISkuService.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Interface/ISpuService.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Service/SkuService.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.Service/SpuService.cs diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Config/SwaggerDoc.xml b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Config/SwaggerDoc.xml index d92fa4c9..34d4d413 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Config/SwaggerDoc.xml +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Config/SwaggerDoc.xml @@ -150,6 +150,18 @@ + + + 动态条件分页查询 + + + + + + 动态条件分页查询 + + + 账户管理 diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Article/ArticleController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Article/ArticleController.cs index 50f7ff67..36ee1e7a 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Article/ArticleController.cs +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Article/ArticleController.cs @@ -51,7 +51,7 @@ namespace Yi.Framework.ApiMicroservice.Controllers { //如果标题为空,默认为内容的前20个字符 entity.Title = string.IsNullOrEmpty(entity.Title) ? - (entity.Content.Length > 20 ? entity.Content.Substring(0, 20) : entity.Content) : + (entity.Content?.Length > 20 ? entity.Content.Substring(0, 20) : entity.Content) : entity.Title; entity.UserId = HttpContext.GetUserIdInfo(); return base.Add(entity); diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SkuController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SkuController.cs index 22a37906..a0e840b5 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SkuController.cs +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SkuController.cs @@ -17,12 +17,22 @@ namespace Yi.Framework.ApiMicroservice.Controllers { [ApiController] [Route("api/[controller]/[action]")] - public class SkuController : BaseCrudController + public class SkuController : BaseSimpleCrudController { private ISkuService _iSkuService; public SkuController(ILogger logger, ISkuService iSkuService) : base(logger, iSkuService) { _iSkuService = iSkuService; } + + /// + /// 动态条件分页查询 + /// + /// + [HttpGet] + public async Task PageList([FromQuery] SkuEntity eneity, [FromQuery] PageParModel page) + { + return Result.Success().SetData(await _iSkuService.SelctPageList(eneity, page)); + } } } diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SpuController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SpuController.cs index e16727d2..2ee37fc0 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SpuController.cs +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SpuController.cs @@ -17,12 +17,22 @@ namespace Yi.Framework.ApiMicroservice.Controllers { [ApiController] [Route("api/[controller]/[action]")] - public class SpuController : BaseCrudController + public class SpuController : BaseSimpleCrudController { private ISpuService _iSpuService; public SpuController(ILogger logger, ISpuService iSpuService) : base(logger, iSpuService) { _iSpuService = iSpuService; } + + /// + /// 动态条件分页查询 + /// + /// + [HttpGet] + public async Task PageList([FromQuery] SpuEntity eneity, [FromQuery] PageParModel page) + { + return Result.Success().SetData(await _iSpuService.SelctPageList(eneity, page)); + } } } diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/yi-sqlsugar-dev.db b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/yi-sqlsugar-dev.db index 8600b9436a61e0febe1437d3fc235c188850cc35..befd89061e33fea98c32c33a916e60fff227ed92 100644 GIT binary patch delta 216 zcmZoTz}s+ucY-vd)I=F)MybYx)&$0_2~11s*%Gb>|5D^n9a17mYTV`IbUYNg!#@5DeOJMxT&kl9VCIJ?O?JNhF{>%pezwtrS delta 35 rcmZoTz}s+ucY-vd + { + /// + /// 动态条件分页查询 + /// + /// + /// + /// + Task>> SelctPageList(SkuEntity entity, PageParModel page); + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Interface/ISpuService.cs b/Yi.Framework.Net6/Yi.Framework.Interface/ISpuService.cs new file mode 100644 index 00000000..01532604 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Interface/ISpuService.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Yi.Framework.Common.Models; +using Yi.Framework.Model.Models; +using Yi.Framework.Repository; + +namespace Yi.Framework.Interface +{ + public partial interface ISpuService:IBaseService + { + /// + /// 动态条件分页查询 + /// + /// + /// + /// + Task>> SelctPageList(SpuEntity entity, PageParModel page); + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/SpuEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/SpuEntity.cs index f1b2453d..51db453a 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/SpuEntity.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/ModelsTemplate/SpuEntity.cs @@ -27,17 +27,17 @@ namespace Yi.Framework.Model.Models /// 商品名称 /// [SugarColumn(ColumnName="SpuName" )] - public string SpuName { get; set; } + public string? SpuName { get; set; } /// /// 商品详情 /// [SugarColumn(ColumnName="Details" )] - public string Details { get; set; } + public string? Details { get; set; } /// /// 商品价格 /// [SugarColumn(ColumnName="Price" )] - public string Price { get; set; } + public string? Price { get; set; } /// /// 创建者 diff --git a/Yi.Framework.Net6/Yi.Framework.Model/SpuEntity.cs b/Yi.Framework.Net6/Yi.Framework.Model/SpuEntity.cs index cb09b8df..30ef1e5b 100644 --- a/Yi.Framework.Net6/Yi.Framework.Model/SpuEntity.cs +++ b/Yi.Framework.Net6/Yi.Framework.Model/SpuEntity.cs @@ -20,7 +20,7 @@ namespace Yi.Framework.Model.Models public List? SpecsSpuInfo { get; set; } [Navigate(NavigateType.OneToMany, nameof(SkuEntity.SpuId))] - public List? Spus { get; set; } + public List? Skus { get; set; } } public class SpecsSpuAllInfoModel diff --git a/Yi.Framework.Net6/Yi.Framework.Service/SkuService.cs b/Yi.Framework.Net6/Yi.Framework.Service/SkuService.cs new file mode 100644 index 00000000..93bb7fe4 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Service/SkuService.cs @@ -0,0 +1,25 @@ +using SqlSugar; +using System.Collections.Generic; +using System.Threading.Tasks; +using Yi.Framework.Common.Models; +using Yi.Framework.Interface; +using Yi.Framework.Model.Models; +using Yi.Framework.Repository; + +namespace Yi.Framework.Service +{ + public partial class SkuService : BaseService, ISkuService + { + public async Task>> SelctPageList(SkuEntity enetity, PageParModel page) + { + RefAsync total = 0; + var data = await _repository._DbQueryable + + .WhereIF(page.StartTime is not null && page.EndTime is not null, u => u.CreateTime >= page.StartTime && u.CreateTime <= page.EndTime) + .WhereIF(enetity.IsDeleted is not null, u => u.IsDeleted == enetity.IsDeleted) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .ToPageListAsync(page.PageNum, page.PageSize, total); + return new PageModel>(data, total); + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.Service/SpuService.cs b/Yi.Framework.Net6/Yi.Framework.Service/SpuService.cs new file mode 100644 index 00000000..1063ce57 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.Service/SpuService.cs @@ -0,0 +1,25 @@ +using SqlSugar; +using System.Collections.Generic; +using System.Threading.Tasks; +using Yi.Framework.Common.Models; +using Yi.Framework.Interface; +using Yi.Framework.Model.Models; +using Yi.Framework.Repository; + +namespace Yi.Framework.Service +{ + public partial class SpuService : BaseService, ISpuService + { + public async Task>> SelctPageList(SpuEntity enetity, PageParModel page) + { + RefAsync total = 0; + var data = await _repository._DbQueryable + + .WhereIF(page.StartTime is not null && page.EndTime is not null, u => u.CreateTime >= page.StartTime && u.CreateTime <= page.EndTime) + .WhereIF(enetity.IsDeleted is not null, u => u.IsDeleted == enetity.IsDeleted) + .OrderBy(u => u.CreateTime, OrderByType.Desc) + .ToPageListAsync(page.PageNum, page.PageSize, total); + return new PageModel>(data, total); + } + } +} From 30158ac145749c3e0fa486406be707af0e882d87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B7=B3?= Date: Thu, 20 Oct 2022 18:11:54 +0800 Subject: [PATCH 8/8] =?UTF-8?q?spu=E3=80=81skus=E6=95=B0=E6=8D=AE=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Shop/SkuController.cs | 76 ++++++++++++++++++ .../Controllers/Shop/SpuController.cs | 50 ++++++++++++ .../yi-sqlsugar-dev.db | Bin 221184 -> 221184 bytes .../Yi.Framework.Service/SpuService.cs | 2 +- .../BuilderExtend/JsonExtension.cs | 6 +- Yi.Vue3.x.Vant/src/api/skuApi.ts | 18 +++++ Yi.Vue3.x.Vant/src/api/spuApi.ts | 18 +++++ Yi.Vue3.x.Vant/src/view/shop/shopSearch.vue | 32 +++++++- 8 files changed, 199 insertions(+), 3 deletions(-) create mode 100644 Yi.Vue3.x.Vant/src/api/skuApi.ts create mode 100644 Yi.Vue3.x.Vant/src/api/spuApi.ts diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SkuController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SkuController.cs index a0e840b5..600874f6 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SkuController.cs +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SkuController.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Yi.Framework.Common.Enum; using Yi.Framework.Common.Models; using Yi.Framework.Interface; using Yi.Framework.Model.Models; @@ -34,5 +35,80 @@ namespace Yi.Framework.ApiMicroservice.Controllers { return Result.Success().SetData(await _iSkuService.SelctPageList(eneity, page)); } + + + + + //数据测试 + [HttpGet] + public async Task Test(OperEnum operEnum) + { + switch (operEnum) + { + case OperEnum.Insert: + List spus = new(); + var sku1 = new SkuEntity() + { + Id = 1, + Stock = 100, + IsDeleted = false, + SpuId = 1, + Price = 1000, + SpecsSkuAllInfo = new List { + new SpecsSkuAllInfoModel { SpecsGroupName="内存",SpecsName="1GB" } , + new SpecsSkuAllInfoModel { SpecsGroupName="颜色",SpecsName= "红" } }, + }; + var sku2 = new SkuEntity() + { + Id = 2, + Stock = 100, + IsDeleted = false, + SpuId = 1, + Price = 4000, + SpecsSkuAllInfo = new List { + new SpecsSkuAllInfoModel { SpecsGroupName="内存",SpecsName="2GB" } , + new SpecsSkuAllInfoModel { SpecsGroupName="颜色",SpecsName= "绿" } }, + }; + + + var sku3 = new SkuEntity() + { + Id = 3, + Stock = 100, + IsDeleted = false, + SpuId = 2, + Price = 2000, + SpecsSkuAllInfo = new List { + new SpecsSkuAllInfoModel { SpecsGroupName="内存",SpecsName="3GB" } , + new SpecsSkuAllInfoModel { SpecsGroupName="颜色",SpecsName= "红" } }, + }; + var sku4 = new SkuEntity() + { + Id = 4, + Stock = 100, + IsDeleted = false, + SpuId = 2, + Price = 1000, + SpecsSkuAllInfo = new List { + new SpecsSkuAllInfoModel { SpecsGroupName="内存",SpecsName="2GB" } , + new SpecsSkuAllInfoModel { SpecsGroupName="颜色",SpecsName= "蓝" } }, + }; + spus.Add(sku1); + spus.Add(sku2); + spus.Add(sku3); + spus.Add(sku4); + await _iSkuService._repository.InsertRangeAsync(spus); + break; + + case OperEnum.Delete: + await _iSkuService._repository.DeleteAsync((u)=>true); + break; + default: + break; + } + + + return Result.Success(); + } } } diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SpuController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SpuController.cs index 2ee37fc0..bd4e9dc7 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SpuController.cs +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/Shop/SpuController.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Yi.Framework.Common.Enum; using Yi.Framework.Common.Models; using Yi.Framework.Interface; using Yi.Framework.Model.Models; @@ -34,5 +35,54 @@ namespace Yi.Framework.ApiMicroservice.Controllers { return Result.Success().SetData(await _iSpuService.SelctPageList(eneity, page)); } + + + + + //数据测试 + [HttpGet] + public async Task Test(OperEnum operEnum) + { + switch (operEnum) + { + case OperEnum.Insert: + List spus = new(); + var spu1 = new SpuEntity() + { + Id = 1, + SpuName = "华为mate40 5G手机", + IsDeleted = false, + Details = "华为手机就是牛", + Price = "1000-2000", + SpecsSpuAllInfo = new List { + new SpecsSpuAllInfoModel { SpecsGroupName="内存",SpecsNames=new List { "1GB","2GB","3GB"} } , + new SpecsSpuAllInfoModel { SpecsGroupName="颜色",SpecsNames=new List { "红","蓝","绿"} } }, + }; + var spu2 = new SpuEntity() + { + Id = 2, + SpuName = "小米888 8G手机", + IsDeleted = false, + Details = "小米手机就是牛", + Price = "2000-3000", + SpecsSpuAllInfo = new List { + new SpecsSpuAllInfoModel { SpecsGroupName="内存",SpecsNames=new List { "1GB","2GB","3GB"} } , + new SpecsSpuAllInfoModel { SpecsGroupName="颜色",SpecsNames=new List { "红","蓝","绿"} } }, + }; + spus.Add(spu1); + spus.Add(spu2); + await _iSpuService._repository.InsertRangeAsync(spus); + break; + + case OperEnum.Delete: + await _iSpuService._repository.DeleteAsync((u) => true); + break; + default: + break; + } + + + return Result.Success(); + } } } diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/yi-sqlsugar-dev.db b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/yi-sqlsugar-dev.db index befd89061e33fea98c32c33a916e60fff227ed92..a80e2499ee6f710d355c5cedcc981368c2ebc717 100644 GIT binary patch delta 1069 zcmZoTz}s+ucY-vd>_i!7M%l)MtqF`v{5hET^%(f4^XqLE6j0)qNM{mY6I7I!RMcj0 zW&i;W(H{ar-iM~Ik7u+KHZo8!G`BJ}urjvLGchwWv9vIrK0Tf>cRR}i#uxk|V3h(4 zOx(Nj$-2rx1-GBH>K z?EzWV=+45F!u-O>z{p6~&_EYror$rPv8A4wxzY4P{Y+~0N>)ln?oLXzI@L3;?6}&NxASG@#-b{^@D`O!F{x SfB(nh;snvXo#g=2pZNgA`6w*_ diff --git a/Yi.Framework.Net6/Yi.Framework.Service/SpuService.cs b/Yi.Framework.Net6/Yi.Framework.Service/SpuService.cs index 1063ce57..c21b2c39 100644 --- a/Yi.Framework.Net6/Yi.Framework.Service/SpuService.cs +++ b/Yi.Framework.Net6/Yi.Framework.Service/SpuService.cs @@ -14,7 +14,7 @@ namespace Yi.Framework.Service { RefAsync total = 0; var data = await _repository._DbQueryable - + .Includes(spu=>spu.Skus) .WhereIF(page.StartTime is not null && page.EndTime is not null, u => u.CreateTime >= page.StartTime && u.CreateTime <= page.EndTime) .WhereIF(enetity.IsDeleted is not null, u => u.IsDeleted == enetity.IsDeleted) .OrderBy(u => u.CreateTime, OrderByType.Desc) diff --git a/Yi.Framework.Net6/Yi.Framework.WebCore/BuilderExtend/JsonExtension.cs b/Yi.Framework.Net6/Yi.Framework.WebCore/BuilderExtend/JsonExtension.cs index 55fa9629..cc59de83 100644 --- a/Yi.Framework.Net6/Yi.Framework.WebCore/BuilderExtend/JsonExtension.cs +++ b/Yi.Framework.Net6/Yi.Framework.WebCore/BuilderExtend/JsonExtension.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; +using System.Text.Json.Serialization; using System.Threading.Tasks; namespace Yi.Framework.WebCore.BuilderExtend @@ -13,11 +14,14 @@ namespace Yi.Framework.WebCore.BuilderExtend { public static void AddJsonFileService(this IMvcBuilder builder) { + builder.AddJsonOptions(options => + options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter())); + builder.AddNewtonsoftJson(options => { options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm"; - + //options.SerializerSettings.Converters.Add(new ValueToStringConverter()); }); diff --git a/Yi.Vue3.x.Vant/src/api/skuApi.ts b/Yi.Vue3.x.Vant/src/api/skuApi.ts new file mode 100644 index 00000000..5c268d36 --- /dev/null +++ b/Yi.Vue3.x.Vant/src/api/skuApi.ts @@ -0,0 +1,18 @@ +import myaxios from '@/utils/myaxios' + +export default { + add(data:any) { + return myaxios({ + url: `/sku/add`, + method: 'post', + data: data + }) + }, + pageList(data:any) { + return myaxios({ + url: '/sku/pageList', + method: 'get', + params: data + }) + } +} \ No newline at end of file diff --git a/Yi.Vue3.x.Vant/src/api/spuApi.ts b/Yi.Vue3.x.Vant/src/api/spuApi.ts new file mode 100644 index 00000000..9f52a64f --- /dev/null +++ b/Yi.Vue3.x.Vant/src/api/spuApi.ts @@ -0,0 +1,18 @@ +import myaxios from '@/utils/myaxios' + +export default { + add(data:any) { + return myaxios({ + url: `/spu/add`, + method: 'post', + data: data + }) + }, + pageList(data:any) { + return myaxios({ + url: '/spu/pageList', + method: 'get', + params: data + }) + } +} \ No newline at end of file diff --git a/Yi.Vue3.x.Vant/src/view/shop/shopSearch.vue b/Yi.Vue3.x.Vant/src/view/shop/shopSearch.vue index 904850e1..1bab92f2 100644 --- a/Yi.Vue3.x.Vant/src/view/shop/shopSearch.vue +++ b/Yi.Vue3.x.Vant/src/view/shop/shopSearch.vue @@ -4,4 +4,34 @@ 点击进入商品详情
返回商品首页 - \ No newline at end of file +这个是spu: +
商品名称:{{item.spuName}} +
规格组: {{spec.specsGroupName}} +
规格值: {{name}} + +
+ +
+
+
+ + + + \ No newline at end of file