From 26dd107f484b98762c0ecbbd9c0ee26b07d55515 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B7=B3?= <454313500@qq.com> Date: Sun, 18 Feb 2024 09:35:35 +0800 Subject: [PATCH] =?UTF-8?q?style:=20=E4=BF=AE=E6=94=B9rbac=20service?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/LoginLogService.cs | 37 ---------------- .../{ => Monitor}/MonitorCacheService.cs | 2 +- .../{ => Monitor}/MonitorServerService.cs | 2 +- .../Services/{ => Monitor}/OnlineService.cs | 4 +- .../Services/{ => Monitor}/TaskService.cs | 14 +++--- .../Services/OperationLogService.cs | 40 ----------------- .../00.快速上手/00.模块与项目.md | 41 ++++++++++++++++++ .../00.快速上手/01.依赖关系.md | 0 .../00.快速上手/image-1.png | Bin 0 -> 10131 bytes .../01.框架快速开始教程/00.快速上手/image.png | Bin 0 -> 18863 bytes .../01.框架快速开始教程/05.脚手架使用.md | 34 +++++++++++++++ 11 files changed, 86 insertions(+), 88 deletions(-) delete mode 100644 Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/LoginLogService.cs rename Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/{ => Monitor}/MonitorCacheService.cs (96%) rename Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/{ => Monitor}/MonitorServerService.cs (97%) rename Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/{ => Monitor}/OnlineService.cs (97%) rename Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/{ => Monitor}/TaskService.cs (95%) delete mode 100644 Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/OperationLogService.cs create mode 100644 Yi.Doc.Md/01.框架快速开始教程/00.快速上手/00.模块与项目.md create mode 100644 Yi.Doc.Md/01.框架快速开始教程/00.快速上手/01.依赖关系.md create mode 100644 Yi.Doc.Md/01.框架快速开始教程/00.快速上手/image-1.png create mode 100644 Yi.Doc.Md/01.框架快速开始教程/00.快速上手/image.png create mode 100644 Yi.Doc.Md/01.框架快速开始教程/05.脚手架使用.md diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/LoginLogService.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/LoginLogService.cs deleted file mode 100644 index 9ff45657..00000000 --- a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/LoginLogService.cs +++ /dev/null @@ -1,37 +0,0 @@ -using SqlSugar; -using Volo.Abp; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Application.Services; -using Yi.Framework.Ddd.Application; -using Yi.Framework.Rbac.Application.Contracts.Dtos.LoginLog; -using Yi.Framework.Rbac.Domain.Entities; -using Yi.Framework.SqlSugarCore.Abstractions; - -namespace Yi.Framework.Rbac.Application.Services -{ - public class LoginLogService : YiCrudAppService - { - private readonly ISqlSugarRepository _repository; - public LoginLogService(ISqlSugarRepository repository) : base(repository) - { - _repository = repository; - } - - public override async Task> GetListAsync(LoginLogGetListInputVo input) - { - RefAsync total = 0; - - var entities = await _repository._DbQueryable.WhereIF(!string.IsNullOrEmpty(input.LoginIp), x => x.LoginIp.Contains(input.LoginIp!)) - .WhereIF(!string.IsNullOrEmpty(input.LoginUser), x => x.LoginUser!.Contains(input.LoginUser!)) - .WhereIF(input.StartTime is not null && input.EndTime is not null, x => x.CreationTime >= input.StartTime && x.CreationTime <= input.EndTime) - .ToPageListAsync(input.SkipCount, input.MaxResultCount, total); - return new PagedResultDto(total, await MapToGetListOutputDtosAsync(entities)); - } - - [RemoteService(false)] - public override Task UpdateAsync(Guid id, LoginLogGetListOutputDto input) - { - return base.UpdateAsync(id, input); - } - } -} diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/MonitorCacheService.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/Monitor/MonitorCacheService.cs similarity index 96% rename from Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/MonitorCacheService.cs rename to Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/Monitor/MonitorCacheService.cs index 0d02cee6..2862d243 100644 --- a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/MonitorCacheService.cs +++ b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/Monitor/MonitorCacheService.cs @@ -3,7 +3,7 @@ using Volo.Abp.Application.Services; using Yi.Framework.Rbac.Application.Contracts.Dtos.MonitorCache; using Yi.Framework.Rbac.Application.Contracts.IServices; -namespace Yi.Framework.Rbac.Application.Services +namespace Yi.Framework.Rbac.Application.Services.Monitor { public class MonitorCacheService : ApplicationService, IMonitorCacheService { diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/MonitorServerService.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/Monitor/MonitorServerService.cs similarity index 97% rename from Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/MonitorServerService.cs rename to Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/Monitor/MonitorServerService.cs index 7ab64101..55af86d3 100644 --- a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/MonitorServerService.cs +++ b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/Monitor/MonitorServerService.cs @@ -7,7 +7,7 @@ using Volo.Abp.Application.Services; using Yi.Framework.Core.Helper; using Yi.Framework.Rbac.Application.Contracts.IServices; -namespace Yi.Framework.Rbac.Application.Services +namespace Yi.Framework.Rbac.Application.Services.Monitor { public class MonitorServerService : ApplicationService, IMonitorServerService { diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/OnlineService.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/Monitor/OnlineService.cs similarity index 97% rename from Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/OnlineService.cs rename to Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/Monitor/OnlineService.cs index 257d3e54..c0395e4d 100644 --- a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/OnlineService.cs +++ b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/Monitor/OnlineService.cs @@ -7,7 +7,7 @@ using Yi.Framework.Rbac.Application.Contracts.IServices; using Yi.Framework.Rbac.Application.SignalRHubs; using Yi.Framework.Rbac.Domain.Shared.Model; -namespace Yi.Framework.Rbac.Application.Services +namespace Yi.Framework.Rbac.Application.Services.Monitor { public class OnlineService : ApplicationService, IOnlineService { @@ -37,7 +37,7 @@ namespace Yi.Framework.Rbac.Application.Services { dataWhere = dataWhere.Where((u) => u.UserName!.Contains(online.UserName)); } - return Task.FromResult(new PagedResultDto() { TotalCount = data.Count, Items = dataWhere.ToList() }) ; + return Task.FromResult(new PagedResultDto() { TotalCount = data.Count, Items = dataWhere.ToList() }); } diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/TaskService.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/Monitor/TaskService.cs similarity index 95% rename from Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/TaskService.cs rename to Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/Monitor/TaskService.cs index b8f79698..ab857fb6 100644 --- a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/TaskService.cs +++ b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/Monitor/TaskService.cs @@ -11,7 +11,7 @@ using Yi.Framework.Rbac.Application.Contracts.Dtos.Task; using Yi.Framework.Rbac.Application.Contracts.IServices; using Yi.Framework.Rbac.Domain.Shared.Enums; -namespace Yi.Framework.Rbac.Application.Services +namespace Yi.Framework.Rbac.Application.Services.Monitor { public class TaskService : ApplicationService, ITaskService { @@ -19,7 +19,7 @@ namespace Yi.Framework.Rbac.Application.Services private readonly IClock _clock; public TaskService(ISchedulerFactory schedulerFactory, IClock clock) { - _clock=clock; + _clock = clock; _schedulerFactory = schedulerFactory; } @@ -39,7 +39,7 @@ namespace Yi.Framework.Rbac.Application.Services //状态 var state = await scheduler.GetTriggerState(trigger.Key); - + var output = new TaskGetOutput { JobId = jobDetail.Key.Name, @@ -48,7 +48,7 @@ namespace Yi.Framework.Rbac.Application.Services Properties = Newtonsoft.Json.JsonConvert.SerializeObject(jobDetail.JobDataMap), Concurrent = !jobDetail.ConcurrentExecutionDisallowed, Description = jobDetail.Description, - LastRunTime = _clock.Normalize( trigger.GetPreviousFireTimeUtc()?.DateTime??DateTime.MinValue), + LastRunTime = _clock.Normalize(trigger.GetPreviousFireTimeUtc()?.DateTime ?? DateTime.MinValue), NextRunTime = _clock.Normalize(trigger.GetNextFireTimeUtc()?.DateTime ?? DateTime.MinValue), AssemblyName = jobDetail.JobType.Assembly.GetName().Name, Status = state.ToString() @@ -56,7 +56,7 @@ namespace Yi.Framework.Rbac.Application.Services if (trigger is ISimpleTrigger simple) { - output.TriggerArgs =Math.Round(simple.RepeatInterval.TotalMinutes,2) .ToString() + "分钟"; + output.TriggerArgs = Math.Round(simple.RepeatInterval.TotalMinutes, 2).ToString() + "分钟"; output.Type = JobTypeEnum.Millisecond; output.Millisecond = simple.RepeatInterval.TotalMilliseconds; } @@ -64,7 +64,7 @@ namespace Yi.Framework.Rbac.Application.Services { output.TriggerArgs = cron.CronExpressionString!; output.Type = JobTypeEnum.Cron; - output.Cron=cron.CronExpressionString; + output.Cron = cron.CronExpressionString; } return output; } @@ -159,7 +159,7 @@ namespace Yi.Framework.Rbac.Application.Services /// /// public async Task DeleteAsync(IEnumerable id) - { + { var scheduler = await _schedulerFactory.GetScheduler(); await scheduler.DeleteJobs(id.Select(x => new JobKey(x)).ToList()); } diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/OperationLogService.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/OperationLogService.cs deleted file mode 100644 index c12af05d..00000000 --- a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/Services/OperationLogService.cs +++ /dev/null @@ -1,40 +0,0 @@ -using SqlSugar; -using Volo.Abp; -using Volo.Abp.Application.Dtos; -using Yi.Framework.Ddd.Application; -using Yi.Framework.Rbac.Application.Contracts.Dtos.OperLog; -using Yi.Framework.Rbac.Application.Contracts.IServices; -using Yi.Framework.Rbac.Domain.Operlog; -using Yi.Framework.SqlSugarCore.Abstractions; - -namespace Yi.Framework.Rbac.Application.Services -{ - /// - /// OperationLog服务实现 - /// - public class OperationLogService : YiCrudAppService, - IOperationLogService - { - private ISqlSugarRepository _repository; - public OperationLogService(ISqlSugarRepository repository) : base(repository) - { - _repository=repository; - } - - public override async Task> GetListAsync(OperationLogGetListInputVo input) - { - RefAsync total = 0; - var entities = await _repository._DbQueryable.WhereIF(!string.IsNullOrEmpty(input.OperUser), x => x.OperUser.Contains(input.OperUser!)) - .WhereIF(input.OperType is not null, x => x.OperType == input.OperType) - .WhereIF(input.StartTime is not null && input.EndTime is not null, x => x.CreationTime >= input.StartTime && x.CreationTime <= input.EndTime) - .ToPageListAsync(input.SkipCount, input.MaxResultCount, total); - return new PagedResultDto(total, await MapToGetListOutputDtosAsync(entities)); - } - - [RemoteService(false)] - public override Task UpdateAsync(Guid id, OperationLogGetListOutputDto input) - { - return base.UpdateAsync(id, input); - } - } -} diff --git a/Yi.Doc.Md/01.框架快速开始教程/00.快速上手/00.模块与项目.md b/Yi.Doc.Md/01.框架快速开始教程/00.快速上手/00.模块与项目.md new file mode 100644 index 00000000..7d16b8fa --- /dev/null +++ b/Yi.Doc.Md/01.框架快速开始教程/00.快速上手/00.模块与项目.md @@ -0,0 +1,41 @@ +## 模块与项目 +意框架是一个基于Abp.VNext的框架,完美使用模块化理念进行开发。既然是模块化开发,就有`项目`与`项目`的概念。 + +很多人问到了我,我的代码应该放到哪里,其实是没有分清楚模块与项目,弄清楚这个,再下手撸码,才更有方向。 + +其实不必一堆概念,只需要心中思考一下 + +> 我接下来要开发的业务是否有必要被其他项目依赖使用? + +例如:内置的Rbac模块、Bbs模块,单独具备权限管理和社区论坛的功能,公开给大家复用引用,这就可以当成一个模块 + +`但是`,有时候如果我不认为他有必要复用,就是公司的一个内部系统,想要快速开发并交付,要同时具备权限管理、商城、审批等各种功能,那就直接当一个项目开发即可,不一定需要将各个模块拆的太散 + +> 这个划分的界限,是由项目来决定 + +注意:模块的代码与项目的代码结构几乎没有区别 + +这意味,有一个最好的方式,先将业务全部写在项目中,等稳定之后,在复制抽象到模块中,完全没有问题。 + +### 模块的优缺点 +- 优点:高度抽象复用 +- 缺点:肉眼可见的程序集增加、维护成本更高 + +### 模块 +![Alt text](image.png) + +代码位置放在`module`目录下,单独建立一个自己的模块名称,可使用`脚手架使用`将默认代码生成在这里。 + +### 项目 +![Alt text](image-1.png) + +框架内置一个host项目,代码位置存放在`src`中,直接使用即可,如果想更换命名,可以使用上一节的`脚手架使用`。 + +## 总结 +> 由于很多人询问我这个问题,所以单独写一篇,方便大家理解。 + +先区分模块还是项目,然后代码写到对应的位置即可 + +理论上,按这套规则意味着,只有在自己的`module`、`src`下才需要写代码,其他地方都是内置好了的,通过继承、实现等方式扩展即可 + +当然,你可以不按这套规则出发,目录结构按自己的舒服的方式去设计,当然也是可以的,不过这得花费一些时间了。 diff --git a/Yi.Doc.Md/01.框架快速开始教程/00.快速上手/01.依赖关系.md b/Yi.Doc.Md/01.框架快速开始教程/00.快速上手/01.依赖关系.md new file mode 100644 index 00000000..e69de29b diff --git a/Yi.Doc.Md/01.框架快速开始教程/00.快速上手/image-1.png b/Yi.Doc.Md/01.框架快速开始教程/00.快速上手/image-1.png new file mode 100644 index 0000000000000000000000000000000000000000..e2d30f8e428410c7435c283dd215f4512154062b GIT binary patch literal 10131 zcmbt)bx>SE_vK*00t|rwK?jEf4ekt1AP_VV+=CNra2ed)nc%_Q5*XYefdoQuhmhb5 z?)&onzS`Q_{d23Pre3}3>b|f0_POVr?x;6viUfF+cpwmnKv_vn69huz1)hs=9s&RB zNcL0^2m(@;gKB%_?j!u&NwyJ(U5r=qvlKjN4#w1LU^L}7O14hM=bwb0e;!|ZbG@GL z*uJ1rxv)FAnd_0Uu()K%+!469JZ{}?JGGUY{sdO*c_?v_+wSp8h+rZ7%|;o!BV`-4 zaVj_@HqMKEu!n-GYq){m?IF`!q3DMarE)rdLtvhpALtt&-$d;3#KcLCO#s~iN#12B z4jdBsazJy35R3`k#K7W(Lq@ZsHDS^!-wK~Q*ck`=&a9NQONf)m^SG1v-_bq&VuK0I zB%Z>mkNXB&d*Rz+X64Um&G4gmUq|QZXA#jbi?02l?k$71q0fB0A-jDWnQ?ew2V77v z^PoHQtFBHIUJO=7&C+0VL4EQ5SUN|q|3yu&Q0FC%wZ%1bXHXG#^bp`ps2Jc;@O_CH zr?7wXX@863Liq9VhtrFT37tR?NM+Yyb{2_F*B6{1&w zK_Lqc)~kB6>rx`!bkJ;5zmZR!{n7hTPClN3{l)5+PZ{+VLpc>oUevw^8irc?5w9m! zvk=`^LQt?A?(p--r!Rt@=DyyoC+wb9IX<4s!6ve!?1;$d*cooZo$&jsvD%SQf01vu z=y4AroaBjxyb50%s5xN?LhHUVM*0$Xoqn+pKJWV2!_px*Q)4Q9cldhY`10Lqhsji8 z4CHHQ0YtDCodUEfPI#~sOf%6LZVv>dI5dgL2ZyM>9)t{jlo`(heOkYT?k&}0h#3bE z>9u2<%w^T=GaF*nIZ1?x!g)xZxtVWlY}jUK7T^5-a>D$UkthIQQWLj8vA-W z4`SY3h4|KQJV~&apy{jM-XvP_eI|y)+Is;7+pc}pRo^q)78O4!O(?KEdm^WW)J-J> z(!P~!s3nJ zFl~16?hs^(mgZoQ2EX>O1r`r9rBe@CN9P_T&BkDoua zcO?Jqp~p6@3+x}{z;bgkg@_TijredfIP~ zMCX5`)eYb}s|$%A6;yBWP=6bo*grkbU$9Udo(U)GY?9I}*^l9?ys^GN0lPs*+{|Zc zO@{uB!TQmQq4aL|&^g%RFrmKuF3{pCT|Kz5IDV{N@3EGaR%T}A@U^|29bUcOZ&*Pa z;UyT3e}f$FCpaMV+M~ZbKf!^3ItS1q3RX~Rd&^D{D~A#OH%`KQE!<2c2P%RW-`Jeo zABFsJC%+b#D`4{mpWNJCj;IGDYe6cFZa}~Mc5))s;>^#_>0B;s?#1kMozaJ^I;-#u zuqf&5`qR0cdO`wG5a2nqc{EzbK)0uUDma{zz-7-p|8GKrUlD!xMj~CEuPFH8i%W0& z1lA=H{ccZ8I|gk#og&d=2Fr{5K7@A$-0V{)I8=2cgaU-TzupzWYMB3&VCK2b;zWJ1 zhMF*u;Si6@ZZ-g^T#r>4>&D&WbClYe=irTn;BCEhi(x2BS-teX{aHaT1s%vcMzM7Y>_5vI+%1vI{iroVt zA_tLkJ02z}esA0UaV}ts$(mO=#Yrc2mD|5)5e<1{NjF?I-K^KNL+i5oMrS2-=jkq5 ze2AkwpD>qyh4X$(vtGR|7S|Q`+TMdijN5}NVMc<9f|Vol&SANtqbz6oN+WeML9C1uPBHkIvzY*O_Yrzs38ktiu{=g?R;Y))ed}V{|>6-X-KtW3(2XBM! z2(hVwpQB``Ard8+YQDryWf*PLoB79L-fs$=Zd!73kkn-7302j37+_! z9a+Wm8jKMX9{xyX#~gVV^`EL0*4`mSgudQ@M{0*Y1eeZ8d3OB_Qs$7Ta%!N z*ynds@npXXxkt8#tGO$TN2c7J&5v-8R`sQ>Jg2!6K$o%s-OI7x!s91gic(JBTN{$4xfrAPbDfmC#UN6^9ZG!;r-N-q)%e`iKf zf5j`mxZT~d&Pv=>&>!TyQ*}%4JI8^&pBxM+NuiEFPIg~mv2vu5@jE$&mQ12+BoaQ6 z%-L#)1trJ^5P2nFANe-Yh4sV{CeR$wMN4fxrdDts#z-i|a56qQ<>QZ(bR>s|fU?(I z&|ekv%#SzuYpgBC?R$0yvfXjx{Ee!=CJ7A3u%FnF<_qdEb&YVp5u+%^Mwjm=g>o!_ z9)YNBp#0+D!?R%Xsg2QX8O!I6=2D_G@|$XyXXidYtIPX-e)GcJrLu7{)t`FF;rK3k zA;a0ic1kmJs27KZsNiGe#C02hEp-#kG#w(by{k@P_#i`ZIMldNW3<&{%Vjo~N6Vz4 zH*Or*651-piwLDQ%)%;mZ}391J-LIRfi4;cU4Lfenp@w$j2Apu#94SkCHx{{?yr8V zAw`e$A!vtk*Tv=!A(;?|g5^uN0l9NQO?l0#e+;8~ii}ST=hm6^4bsK4yk$g-$-@9v z=^op+LloD-XJx{V38%pPo@+Pz8wiU2a(Dy;u*vfSkvaJ^pN%h`H`O}f~k$k?1YX4E!jF$cizmQKO7E=*? z{Thd{huH9b-|8`f7EVDzPu67Ib?Y9-9GGUCye!I`J~J2J@1Dxyy?20lI4P#^$Onx zwZ;C?q0Z22>^$_+R{{DJcD$$Km2Fo%;XE%^e~0Bzw2Ob*>?mAgGf&cddVbhvieqX^ z1&hG;yi9sIJ>@|f@G+vakKm(KwydNV_64)*#jUZTIm7%LF}^cqKD17(cvDumACKhg zQ{T1s*g>96B0k^0wS@V-Ke_&a;6d!kw6{Kmc2Yr!G&`g6eQ85i?cFvL51D=^C+m7v z*VYQ1GHDW3Ruk$jn7bIFCL`W^iPNh;0wsu}a0H!~WBF{xA*6U#{*vuW@zn;cg|)Rr ztZKQ#;^%|Iz#j>)qaOR*R3(c%@_+C85yaXcxzw~ z6CI6rdS;tf3e@#iuRhLllZAwYlvPypqPE7|BnN?xd4w~qG&3QQ@CH-(?C>y7z{AZ- zU-DX7u{#btXl`y!WbY{yd?nMu_>XxfbJs&~;KSJeFK2iIX2dD1Du4jAKwoxwgadNO z1kEHusZoX^Q%Zu7DRL~sVzywET6O{V$&%PewD90aOT~~(@umnbO3k|PXN@A?nbo}y zYnC^z9dT4&a8b3y^~-eRkM;u@&Ce%k;*m+Pml)Qr64~Y4C%7=yHi@8GPVb-7)5|hv zqc7i}AdeDZFKIRrsvmCq)yHPV*ze%@SLamtx^CaG8E5vbZ=PR3&irGG9{iPHlKYZh zVt=X<_k&PsJ2J~7UsKy*np_XnHk!}1>0TPQE@5sta+C*0=xuH=1(tpPcES3G*6Am^ZaQi`Jo(d z4=s=A7Czk5b%x`2dgk7&(Z-s1u^u3P(ig!{F=|!bUIZP4)W|EEJ=IC^uJ2}@iPhH zzxc6wL64iBz8Y7et7#SuNw0*x6yysApviiu=7otuM~Vl5N0~uNnOXaX-;Zi;&+(jy z76-Rh3cI=e`YJF@$tenEBJ+07{ZY}NEsPVjL2HZI&u)x+ z>a+FtBWHRy!|wpxqxeH3{a|oM;pYp!b3U_Jodr1=A;bQtHUXeiH*3po80W*MS%-V!~Frg$8|9eoBbQm&zm22$I zBJu2HGMy@rsGA6;!_5;huwS{}@<{*93pyIV7>tMxi9ZK~y+wYs@LJAJH3z4qj6uH~ z&8e>!ymuG$(^p>9`#1~~Kf8>J5@C~&O+@a3Tjtu5oCawcccnlKGk<6~4(E5taPzCIwm4f1)C}yIE8QiaK@O4@Cd*m#S-xloX7!lEMsfgO*|}K^W|QY zNfyvsI65g7ubT`sHZ!BHG-2-rO%}?GEJl8$Km)=@N7^6hjg8N*TdAWjY381%T?bM0 z<~xA`jbUYZk`3kNZ4j$s0x>Q#Nk9{v&@zf}Gdi+GW|07!70sJD?8(t*OOdW7O-^!G0pdsG&g(zRwf-C)Dh58NuZH_P>&J+GI6D11B^+?ueo4KK zuSs%fzu5D6>#FtWp#5;YKZ-;cb})1aH|&A41^yQ~%vlaCD^w&FV-n|^QYxu5m}4$W z1+eQK7X%&VPtD=nKg{b*PlP0*A6#~SN%c$&danC+aIg2cqm2w~+$^>p%~~X^)em(> ztjxXB@`Xe-^zlO<1DQg`=gm6Rw^M6#sBnAYwQog@Qn|Ys7Ybxizha7dlua`l*?f4| zRdV}s^|RY$d*H2+b%Nz^g!A3E8`SU%18hb!Pk>edz_Y2hvJj~@^a5G)!CwME9OVMb zQ?-B|T$K{6I0LG*>l+aG|6)ofM{2Z_pJ^qIyhK-j3#d!+iBMzcw~XQGADI4(qX5Zi zbnkcH2$RIHf2o+=dkm(O>#CTyTQS8+%-d`bFq|YYJ^R7;rw?x}m`OE+9j;fiJo4V_ zaZ-IjsLwTkKmVH%v0E*~@d?#c**;4bGcj%BZ)Ak+H@iI_ zzl`iiL0T83I`59kJM#@G70K(9r^^TAZE)1-3F}qsGMfPrh9AXhyT2@dPY+sc^g6p; zF>BXp4jovEDqfJ~V0%T|@3}vpmeIm#kO^}g`1JH2966{stX5H5m)h{UnqgveV3gTc z^&twx^cL$V{;_5NjM_f6eZ|h>)2-=|qcBxKdHxS7sh%_J zz`l?G8Yg3=@?DVqVjNpEx?RN!5<-33N-R*n`$2O)GM{s6MNT8M?rK8Ihbbxy!<%(P zEbEt8x#>l|*dGml2>X6>gwT!xskw$~c#1z(b4&&JDW>$9Pa;ZfW0&T=?<$)62{hN+ z>_qpN>6&>+j5+I$TtT_K4uS0}T|-<+bm&9mm(9>%fFI^?217c%s`{)=A* zlUKBJ6+SJm?<&AIv6iivMVnD~=Fny36SI0fQnU!sL|ZG`oxrI-G2a2sK;g}buP8Xm zCs=6C$Sx@V^I+^#Osrq0bN_8PQ1zGVY>nI4KepXAdKQ-mx>VY)PesP?^unJ-5r>6f z(R92sQh0K_$LDAO=RwEfWpHj%Cpc5kS9o4g5%Mgq7pDlI6_1m+>dIPe7q(EON$34;@|P_sHv5$nPhVQN(R!A;e==e_xX~LshCJRhl!?{^vcrS<#D* z+_bj1UkwN+0ZHgr0ib%r!vJ__{z{LyR&5{sh)$vL7~m&~S9=J4)J_6r#}?6iX`-FC z;wJ%1H|6?eA`ifD=)+f>q&hE=_Q!p zot;2>Sll8}ba^Nu+SpcW`vJyK#zj|Yun@5L`0(DgY+xA9AD`3E0g@FrUAe4}^SvszN=*NU6!fSmVc<$EK2SiJ0t z)109}#LPCbJhH5Q>ybR5bR(UQG@Z61Vu~+rpI0$AVSTCfUvA{Kg&>tD_BEDBI8l6{ z%2neI@Loe#`zRjO+1VND`L3sm((yaVK;HU|6yEAV?Y%x+B+~aN42ev^&BGEC&}ArH zNBms)I4YKPpE)v{Gj*M^-jNm3**3@f^MS5uMWy56#ld)}FZJG{W7)(Bffgoj5Hh9h zYcLG;t;R43(#b%eX{{3`yJZkubXe944yUXmn%4+@64K0`WZ18+?BX^-}N=J;oq zqD(J5Pg}~*!?2fj{I_xuCLVbmN2c_;yMlm-9u_NSHaXnPqY;l7XunuLNi=>aZ<>}N zP1xuxm}B;j{5jgL#K(9vu{J%m;)p+A%r~%rj`E z=Gv;;4J`@enak%@6w3|2NyZ6DUfjj`i>KBSzTHZro= zvcnqlR2RPrrLEav$pCOxr_Vp0ZLY~2BU6m_3Ek_rc$W}3ESv~-RTB?p?#Dh#+0rAW zDgQr252aQ?ck<#(npfv*sLiYCb8UQq*QGidpQdaltP_0W_VlQi z0hKAeds*O}oUw}dX_z!9mPK-)`x!iWtVTxZ{XCQ4%elZeiLZ;+eA(=*x_-lAxTK?E zSFP&P>u(=UZg7WIKdY}VU`u9vKWMKO%)OKfOlX9IG;YO3L!g)emsh9uNYts??|7Qg z5ZO`~A+R<{sNi&T^+`nS2b?{0-*Gx zFKgb-Ousb0|Gmzw&Txq7kuUE4d6ya5P!xDT($DLF@L*~ae|sK?*=Ya0+i89djo7Aa z&P>7q@)IzUHTgVEB6?1R&hX45MM3gJMH37^{Q3NOa@0NNar+Xp#}hvoc&~l^qNQhM zkwATtcv}eITf>0#==^?Z;deE~y>ZuI82Ji3@(;XE2E?Alv2dANdDo&0jnu&`-lF;d zuHp6<63bZ}TXy`CmIH4M!*Tx=BS>^vy$)0k=_7yDxuFDpvWYO1F0Cs2ZdHemO0Kp_F%W^Fb^${m(@~-CqfP_$u@ToKe?X2-m=ujZqOcqH6tRQoMHlH zrEhZ`VcDb7QI?9;s2w2Z!P~1HtmbbRzY+cWT`vA;d99rHzq$pqy0sDct|X6H((7|j zPPY-0cR$k)wkadP&t?MeVMIVPuMP*PSPTw+3}}iKLT#dTQ~CBM$u-%l$HGiU!SRLy_j1D2U)n zN6KWS#Ph>VeG5jm^I}cEYyCa_dzOIvS0->+gO~2Uj1R@w@bRAmxmN6>X6A&pws`|o zZJNU7Ki{>k4w=GHdUo35X4{d%@!{dGA|mtb;Yn?t?+fljrhM0z*6&Lr=!uF3LuNNT zUMvqSCUEK)PwyB5vLN=gQ3$ zI=aXIeSboe+ko?{}f8Gn*(&PT}YgPP_6C$3g( zzv~&G99h86sCxHiJ+{WmU=1||gdX-gPg<6Q-7ww;_+qtUJ8htxxhziC*}~O`=-tIb zhiTYX<%=}>#;A%H^&0LL%dVSa*-)dpFSPsMG;u0wY>W|J4-Ur>&5DwvCR9jd2FCBvl9Eqa6JYNAp@@s>xGD# z;P%8f1NN;M!_~9vg+9r#nReTL5#{&vhs6N)9dyV``-}zYD1C!f>waS(>&M$hsE(`K z*k$BIXiS7qpuE@Ye@}UV<7nFn;y*ea^+3GJ`;M-SR&_$yWN8PH$TYMgPD1MQ^Lzsj z!jbZ46DwQ0OZ@9VCIJ0=uDmDJtrTESoZI(Y41Boz?D8LyP@ejgy;SsUAkbOEXL^+H zPgoHXE~{@83Y7dQ`Kn{= zLEmgt8~Y2tQyc@#=MiXndioV%EU&nDl^5%rCT_J?2&Xny*++j~fbksRomU#abuDUK z!0;W8xFhZREr8Dw`3#^;Aktb%Vphty=PDdcVFdbhllKTVLcocO5DmepNU;ydR^Y+} zYQ2onjSBa6NxFC0Zb*Funs!wpBwGE-vLq(dhqQ$DLpeT`9m#_Oo-$f2Bzgj#rA8?) zk!>EVN|XPSk?*X<)#sHm_yqTQM5}IuHn3?cZGhhRodDum29gUX`<_j z6cuPBwJ1E0YnX=Q8)VWeKzq8(ZBbf_r)pK+Fq0d^Iw!ZXdGz2E@&NMx>MlT4P0iX0 z-DU*#8~E-44?-bp8v8;s!f?;t8#_-c1MECUA6-w-$?^boDcgRDq%4+y^qcG5-Y)hK?zx6Y<*qaTO{`&`f^r;+`&-xJFkKne(pH|o#+anYI`bCG|C~$ZIo<`8u;MlnIRH+x_%-*ckE$_5B z4KTVZ+MO}e>iFC1&JzNIeoNiaAKWjRY&c!O)-DIt>(3hlv7D|R#ja$%aW(NV$$H*} z{sx%>TAiPX8uv#jJ&(}Hd`UoXw(cT*&d<;+H*@e;0VXqIMN?}|w!ev={7Mc(x>44S zF~=XgGZ0)9616bPucgzP=S?qw_jm9|EBsiAR9^d6wcG}4XSmM8J#dJuPpC%9<9R=miF74n2$GMxFk7l2uiw1a zm1AfeoOWP;qhR4lZaA-zX{J5(eYp<@^e0-8_wGm3E3V1G;uxQCnWFvKv$~VfFWlP) z`*j%Irr_Y3qDdT$Ws@Z5$B)w5?r2=!MCbTfvKB9e5blRr&Iy^D0b!?W0$YaqrhIg@#2nbd1c@$f1wXyE20^ey3LNrI^SiZK~Gw?qJG#z$T*nkqP8{=O}e_W;AE?o9r7kX z0NGIrc58M}q`bw53_FyLR5iOE#FA5}h4>W_@fE!V5#p>+_kSH`*5-1Q8(2@14|to* zyrf?!C5fdHHBPFsUzA#<3CLV^=Q}|hZ_t94wvy*7AO8yO>zF*9+e$t$d*1G` z0?EvlSASe-G;4QCiG$A5qr^dXXsKhwXs5e^ZDx)4YxFrzJ=^CU(a5BzP|q}v%I+w1 zr>;Ou;E1yR^IvG}qj*!)jy|Y6IzftHp~9Ef^_qvQdLFbeYOVciDQvj^d#+&-eJXnf zlF-4;4==sgSWEY&QNW_Y(UYhxgi<;C;SGuk?eDzp4FmV%81CjoQ*Tk*BBp@p6*3dg zWd6d(e`hmdjWMA4!;HKdq{J};snK8y3k$E~0dluz=gy(N$ipJY{Dv7a-{lz zot#@-ZsSLgKHj97<~;STTvn3X&yLY3TJ*$r!S?!zR4r*)ek;K-YpKuFc8#Y_vTEGJg-|Z?xn%l?*2 z`xAwBwv65S-8$OPTmsq1aiyV(3aqN9VCzra`Y(8C{jg;_q(WV8Tzh?!fmH~u5jlG*>~zr)7u}{)wzAjz^$#77uMI`>d4d^gUZl#%ZeZxX&!*1n*nCSE zD8%pIzwiG3hPX5f6IxvI9?GGUui3Sb$*C|vy_N)a3Y?A6NqA5Mk%dOwXnbixYuxCo z)19Fgm59$uQmL!1WAtN;6zhT26$?g3;o7cMUQ<4L^yvGH;xlVF5B>w)+((L7ku8FM Q*Y7~e@@jH5GN$nV1zwxDPXGV_ literal 0 HcmV?d00001 diff --git a/Yi.Doc.Md/01.框架快速开始教程/00.快速上手/image.png b/Yi.Doc.Md/01.框架快速开始教程/00.快速上手/image.png new file mode 100644 index 0000000000000000000000000000000000000000..2cc8d2840217d371812d648486d5fc6d4450577e GIT binary patch literal 18863 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我们只需要安装一次即可,如果模板文件发生变化,我们生成出来的文件也是一样会变化的 + +当模板安装完成,接下来我们可以选择一个自己想要的空白文件夹,输入命令: + +``` shell +dotnet new yi --name=Acme.BookStore +#Acme.BookStore可以替换成你想要生成的名称即可 +``` + +![image.png](/prod-api/file/55536e5a-ef47-1593-3701-3a100333df31/true) + +最后查看目录: +![image.png](/prod-api/file/20286d62-a9d1-6ab0-7fc0-3a1003348554/true) +这个便是我们想要的结果了 \ No newline at end of file