From 3f66fc9e6092095c29b7d18207c730001f9a23d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com> Date: Wed, 31 May 2023 18:54:20 +0800 Subject: [PATCH 01/27] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E5=81=B6=E7=8E=B0=E5=87=BA=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ZR.Admin.WebApi/Controllers/BaseController.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/ZR.Admin.WebApi/Controllers/BaseController.cs b/ZR.Admin.WebApi/Controllers/BaseController.cs index 90bc9ff..54652d8 100644 --- a/ZR.Admin.WebApi/Controllers/BaseController.cs +++ b/ZR.Admin.WebApi/Controllers/BaseController.cs @@ -61,6 +61,7 @@ namespace ZR.Admin.WebApi.Controllers //IWebHostEnvironment webHostEnvironment = (IWebHostEnvironment)App.ServiceProvider.GetService(typeof(IWebHostEnvironment)); //string fileDir = Path.Combine(webHostEnvironment.WebRootPath, path, fileName); + Response.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition"); var stream = Io.File.OpenRead(path); //创建文件流 return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", HttpUtility.UrlEncode(fileName)); } From 538dde51a8485aad08729200c1cb2c1af54a64b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com> Date: Wed, 31 May 2023 18:55:48 +0800 Subject: [PATCH 02/27] =?UTF-8?q?:zap:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CodeGenTemplate/TplControllers.txt | 3 +- .../wwwroot/CodeGenTemplate/TplService.txt | 1 + .../wwwroot/CodeGenTemplate/v3/TreeVue.txt | 4 +- .../wwwroot/CodeGenTemplate/v3/Vue.txt | 13 +- ZR.Vue/src/views/monitor/job/index.vue | 199 ++++++++++-------- ZR.Vue/src/views/monitor/onlineuser/index.vue | 3 + 6 files changed, 122 insertions(+), 101 deletions(-) create mode 100644 ZR.Vue/src/views/monitor/onlineuser/index.vue diff --git a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplControllers.txt b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplControllers.txt index 0690bb6..a15b37d 100644 --- a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplControllers.txt +++ b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplControllers.txt @@ -70,7 +70,8 @@ $end { var response = _${replaceDto.ModelTypeName}Service.GetFirst(x => x.${replaceDto.PKName} == ${replaceDto.PKName}); - return SUCCESS(response); + var info = response.Adapt<${replaceDto.ModelTypeName}>(); + return SUCCESS(info); } $if(replaceDto.ShowBtnAdd) diff --git a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplService.txt b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplService.txt index a3fb503..dd0e30a 100644 --- a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplService.txt +++ b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplService.txt @@ -1,6 +1,7 @@ using System; using SqlSugar; using Infrastructure.Attribute; +using Infrastructure.Extensions; using ${options.BaseNamespace}Model; using ${options.DtosNamespace}; using ${options.ModelsNamespace}.${options.SubNamespace}; diff --git a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/v3/TreeVue.txt b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/v3/TreeVue.txt index f0beb2e..2b888d6 100644 --- a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/v3/TreeVue.txt +++ b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/v3/TreeVue.txt @@ -120,9 +120,7 @@ $if(column.HtmlType == "customInput" && column.IsPk == false) $elseif(column.HtmlType == "imageUpload") $elseif(column.HtmlType == "checkbox" || column.HtmlType == "select" || column.HtmlType == "radio") diff --git a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/v3/Vue.txt b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/v3/Vue.txt index d2c466e..e79e9c2 100644 --- a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/v3/Vue.txt +++ b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/v3/Vue.txt @@ -179,18 +179,7 @@ $if(column.HtmlType == "customInput" && column.IsPk == false) $elseif(column.HtmlType == "imageUpload") $elseif(column.HtmlType == "checkbox" || column.HtmlType.Contains("select") || column.HtmlType == "radio") diff --git a/ZR.Vue/src/views/monitor/job/index.vue b/ZR.Vue/src/views/monitor/job/index.vue index 2976c98..68ff18b 100644 --- a/ZR.Vue/src/views/monitor/job/index.vue +++ b/ZR.Vue/src/views/monitor/job/index.vue @@ -4,8 +4,14 @@ - + 搜索 @@ -25,10 +31,13 @@ 删除 --> - 导出 + 导出 - 日志 + 日志 @@ -45,29 +54,77 @@ @@ -79,7 +136,7 @@ -
{{form.id}}
+
{{ form.id }}
@@ -89,7 +146,7 @@ - + @@ -164,12 +221,12 @@ 开始日期 - + - + @@ -191,14 +248,14 @@ - + -

{{item.jobMessage}}

-

{{item.exception}}

+

{{ item.jobMessage }}

+

{{ item.exception }}

@@ -207,17 +264,7 @@ diff --git a/ZR.Vue/src/views/monitor/onlineuser/index.vue b/ZR.Vue/src/views/monitor/onlineuser/index.vue new file mode 100644 index 0000000..3525132 --- /dev/null +++ b/ZR.Vue/src/views/monitor/onlineuser/index.vue @@ -0,0 +1,3 @@ + From 68d43240e745310fb10d41b8837725cea95d723f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com> Date: Thu, 1 Jun 2023 15:06:41 +0800 Subject: [PATCH 03/27] =?UTF-8?q?:zap:=20=E4=BC=98=E5=8C=96=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E5=85=AC=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/System/SysNoticeController.cs | 44 +---- ZR.Model/System/Dto/SysNoticeDto.cs | 11 +- ZR.Model/System/SysNotice.cs | 4 +- ZR.Service/System/SysNoticeService.cs | 2 +- ZR.Vue/src/views/system/notice/index.vue | 180 ++++++++++-------- document/images/qrcodeH5.png | Bin 19517 -> 38876 bytes document/mysql/admin-mysql.sql | 72 ++++--- document/pgsql/admin-pg15.sql | 4 +- document/sqlserver/admin-sqlserver.sql | 5 +- 9 files changed, 162 insertions(+), 160 deletions(-) diff --git a/ZR.Admin.WebApi/Controllers/System/SysNoticeController.cs b/ZR.Admin.WebApi/Controllers/System/SysNoticeController.cs index 8b7d251..1027660 100644 --- a/ZR.Admin.WebApi/Controllers/System/SysNoticeController.cs +++ b/ZR.Admin.WebApi/Controllers/System/SysNoticeController.cs @@ -45,7 +45,7 @@ namespace ZR.Admin.WebApi.Controllers.System { var predicate = Expressionable.Create(); - predicate = predicate.And(m => m.Status == "0"); + predicate = predicate.And(m => m.Status == 0); var response = _SysNoticeService.GetPages(predicate.ToExpression(), parm); return SUCCESS(response); } @@ -61,9 +61,9 @@ namespace ZR.Admin.WebApi.Controllers.System var predicate = Expressionable.Create(); predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.NoticeTitle), m => m.NoticeTitle.Contains(parm.NoticeTitle)); - predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.NoticeType), m => m.NoticeType == parm.NoticeType); + predicate = predicate.AndIF(parm.NoticeType != null, m => m.NoticeType == parm.NoticeType); predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.CreateBy), m => m.Create_by.Contains(parm.CreateBy) || m.Update_by.Contains(parm.CreateBy)); - predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.Status), m => m.Status == parm.Status); + predicate = predicate.AndIF(parm.Status != null, m => m.Status == parm.Status); var response = _SysNoticeService.GetPages(predicate.ToExpression(), parm); return SUCCESS(response); } @@ -88,14 +88,9 @@ namespace ZR.Admin.WebApi.Controllers.System /// [HttpPost] [ActionPermissionFilter(Permission = "system:notice:add")] - [Log(Title = "通知公告表", BusinessType = BusinessType.INSERT)] + [Log(Title = "发布通告", BusinessType = BusinessType.INSERT)] public IActionResult AddSysNotice([FromBody] SysNoticeDto parm) { - if (parm == null) - { - throw new CustomException("请求参数错误"); - } - //从 Dto 映射到 实体 var modal = parm.Adapt().ToCreate(HttpContext); modal.Create_by = HttpContext.GetName(); modal.Create_time = DateTime.Now; @@ -120,19 +115,13 @@ namespace ZR.Admin.WebApi.Controllers.System /// [HttpPut] [ActionPermissionFilter(Permission = "system:notice:update")] - [Log(Title = "通知公告表", BusinessType = BusinessType.UPDATE)] + [Log(Title = "修改公告", BusinessType = BusinessType.UPDATE)] public IActionResult UpdateSysNotice([FromBody] SysNoticeDto parm) { - if (parm == null) - { - throw new CustomException("请求实体不能为空"); - } - //从 Dto 映射到 实体 var model = parm.Adapt().ToUpdate(HttpContext); - + model.Update_by = HttpContext.GetName(); var response = _SysNoticeService.Update(w => w.NoticeId == model.NoticeId, it => new SysNotice() { - //Update 字段映射 NoticeTitle = model.NoticeTitle, NoticeType = model.NoticeType, NoticeContent = model.NoticeContent, @@ -150,7 +139,7 @@ namespace ZR.Admin.WebApi.Controllers.System /// [HttpPut("send/{NoticeId}")] [ActionPermissionFilter(Permission = "system:notice:update")] - [Log(Title = "通知公告表", BusinessType = BusinessType.OTHER)] + [Log(Title = "发送通知公告", BusinessType = BusinessType.OTHER)] public IActionResult SendNotice(int NoticeId = 0) { if (NoticeId <= 0) @@ -158,7 +147,7 @@ namespace ZR.Admin.WebApi.Controllers.System throw new CustomException("请求实体不能为空"); } var response = _SysNoticeService.GetFirst(x => x.NoticeId == NoticeId); - if (response != null && response.Status == "0") + if (response != null && response.Status == 0) { _hubContext.Clients.All.SendAsync(HubsConstant.ReceiveNotice, response.NoticeTitle, response.NoticeContent); } @@ -171,7 +160,7 @@ namespace ZR.Admin.WebApi.Controllers.System /// [HttpDelete("{ids}")] [ActionPermissionFilter(Permission = "system:notice:delete")] - [Log(Title = "通知公告表", BusinessType = BusinessType.DELETE)] + [Log(Title = "通知公告", BusinessType = BusinessType.DELETE)] public IActionResult DeleteSysNotice(string ids) { int[] idsArr = Tools.SpitIntArrary(ids); @@ -181,20 +170,5 @@ namespace ZR.Admin.WebApi.Controllers.System return SUCCESS(response); } - - /// - /// 通知公告表导出 - /// - /// - [Log(BusinessType = BusinessType.EXPORT, IsSaveResponseData = false, Title = "通知公告表")] - [HttpGet("export")] - [ActionPermissionFilter(Permission = "system:notice:export")] - public IActionResult Export() - { - var list = _SysNoticeService.GetAll(); - - string sFileName = ExportExcel(list, "SysNotice", "通知公告表"); - return SUCCESS(new { path = "/export/" + sFileName, fileName = sFileName }); - } } } \ No newline at end of file diff --git a/ZR.Model/System/Dto/SysNoticeDto.cs b/ZR.Model/System/Dto/SysNoticeDto.cs index 26e23d9..e770064 100644 --- a/ZR.Model/System/Dto/SysNoticeDto.cs +++ b/ZR.Model/System/Dto/SysNoticeDto.cs @@ -1,3 +1,5 @@ +using System.ComponentModel.DataAnnotations; + namespace ZR.Model.System.Dto { /// @@ -6,10 +8,11 @@ namespace ZR.Model.System.Dto public class SysNoticeDto { public int NoticeId { get; set; } + [Required] public string NoticeTitle { get; set; } - public string NoticeType { get; set; } + public int NoticeType { get; set; } public string NoticeContent { get; set; } - public string Status { get; set; } + public int Status { get; set; } public string Remark { get; set; } } @@ -19,8 +22,8 @@ namespace ZR.Model.System.Dto public class SysNoticeQueryDto : PagerInfo { public string NoticeTitle { get; set; } - public string NoticeType { get; set; } + public int? NoticeType { get; set; } public string CreateBy { get; set; } - public string Status { get; set; } + public int? Status { get; set; } } } diff --git a/ZR.Model/System/SysNotice.cs b/ZR.Model/System/SysNotice.cs index accf568..758fc03 100644 --- a/ZR.Model/System/SysNotice.cs +++ b/ZR.Model/System/SysNotice.cs @@ -26,7 +26,7 @@ namespace ZR.Model.System /// 公告类型 (1通知 2公告) /// [SugarColumn(ColumnName = "notice_type")] - public string NoticeType { get; set; } + public int NoticeType { get; set; } /// /// 公告内容 /// @@ -35,6 +35,6 @@ namespace ZR.Model.System /// /// 公告状态 (0正常 1关闭) /// - public string Status { get; set; } + public int Status { get; set; } } } \ No newline at end of file diff --git a/ZR.Service/System/SysNoticeService.cs b/ZR.Service/System/SysNoticeService.cs index bbe99e9..168297a 100644 --- a/ZR.Service/System/SysNoticeService.cs +++ b/ZR.Service/System/SysNoticeService.cs @@ -28,7 +28,7 @@ namespace ZR.Service.System var predicate = Expressionable.Create(); //搜索条件查询语法参考Sqlsugar - predicate = predicate.And(m => m.Status == "0"); + predicate = predicate.And(m => m.Status == 0); return GetList(predicate.ToExpression()); } diff --git a/ZR.Vue/src/views/system/notice/index.vue b/ZR.Vue/src/views/system/notice/index.vue index ee85336..301947c 100644 --- a/ZR.Vue/src/views/system/notice/index.vue +++ b/ZR.Vue/src/views/system/notice/index.vue @@ -23,13 +23,28 @@ 新增
- + 修改 - 删除 + 删除 @@ -58,15 +73,20 @@
- + @@ -80,14 +100,14 @@ - + - {{dict.dictLabel}} + {{ dict.dictLabel }} @@ -115,10 +135,10 @@ import { updateNotice, sendNotice, // exportNotice, -} from "@/api/system/notice"; +} from '@/api/system/notice' export default { - name: "notice", + name: 'notice', data() { return { // 遮罩层 @@ -136,7 +156,7 @@ export default { // 公告表格数据 noticeList: [], // 弹出层标题 - title: "", + title: '', // 是否显示弹出层 open: false, // 类型数据字典 @@ -155,38 +175,34 @@ export default { form: {}, // 表单校验 rules: { - noticeTitle: [ - { required: true, message: "公告标题不能为空", trigger: "blur" }, - ], - noticeType: [ - { required: true, message: "公告类型不能为空", trigger: "change" }, - ], + noticeTitle: [{ required: true, message: '公告标题不能为空', trigger: 'blur' }], + noticeType: [{ required: true, message: '公告类型不能为空', trigger: 'change' }], }, - }; + } }, created() { - this.getList(); - this.getDicts("sys_notice_status").then((response) => { - this.statusOptions = response.data; - }); - this.getDicts("sys_notice_type").then((response) => { - this.typeOptions = response.data; - }); + this.getList() + this.getDicts('sys_notice_status').then((response) => { + this.statusOptions = response.data + }) + this.getDicts('sys_notice_type').then((response) => { + this.typeOptions = response.data + }) }, methods: { /** 查询公告列表 */ getList() { - this.loading = true; + this.loading = true listNotice(this.queryParams).then((res) => { - this.noticeList = res.data.result; - this.total = res.data.totalNum; - this.loading = false; - }); + this.noticeList = res.data.result + this.total = res.data.totalNum + this.loading = false + }) }, // 取消按钮 cancel() { - this.open = false; - this.reset(); + this.open = false + this.reset() }, // 表单重置 reset() { @@ -195,93 +211,89 @@ export default { noticeTitle: undefined, noticeType: undefined, noticeContent: undefined, - status: "0", - }; - this.resetForm("form"); + status: 0, + } + this.resetForm('form') }, /** 搜索按钮操作 */ handleQuery() { - this.queryParams.pageNum = 1; - this.getList(); + this.queryParams.pageNum = 1 + this.getList() }, /** 重置按钮操作 */ resetQuery() { - this.resetForm("queryForm"); - this.handleQuery(); + this.resetForm('queryForm') + this.handleQuery() }, // 多选框选中数据 handleSelectionChange(selection) { - this.ids = selection.map((item) => item.noticeId); - this.single = selection.length != 1; - this.multiple = !selection.length; + this.ids = selection.map((item) => item.noticeId) + this.single = selection.length != 1 + this.multiple = !selection.length }, /** 新增按钮操作 */ handleAdd() { - this.reset(); - this.open = true; - this.title = "添加公告"; + this.reset() + this.open = true + this.title = '添加公告' }, /** 修改按钮操作 */ handleUpdate(row) { - this.reset(); - const noticeId = row.noticeId || this.ids; + this.reset() + const noticeId = row.noticeId || this.ids getNotice(noticeId).then((response) => { - this.form = response.data; - this.open = true; - this.title = "修改公告"; - }); + this.form = response.data + this.open = true + this.title = '修改公告' + }) }, - // 发送通知 + // 发送通知 handleNotice(row) { - const noticeId = row.noticeId || this.ids; - sendNotice(noticeId).then(res => { - this.msgSuccess("发送通知成功"); - }); + const noticeId = row.noticeId || this.ids + sendNotice(noticeId).then((res) => { + this.msgSuccess('发送通知成功') + }) }, /** 提交按钮 */ submitForm: function () { - this.$refs["form"].validate((valid) => { + this.$refs['form'].validate((valid) => { if (valid) { if (this.form.noticeId != undefined) { updateNotice(this.form).then((response) => { if (!response.data) { - this.msgError("修改失败"); - return; + this.msgError('修改失败') + return } - this.msgSuccess("修改成功"); - this.open = false; - this.getList(); - }); + this.msgSuccess('修改成功') + this.open = false + this.getList() + }) } else { addNotice(this.form).then((response) => { - this.msgSuccess("新增成功"); - this.open = false; - this.getList(); - }); + this.msgSuccess('新增成功') + this.open = false + this.getList() + }) } } - }); + }) }, /** 删除按钮操作 */ handleDelete(row) { - const noticeIds = row.noticeId || this.ids; - this.$confirm( - '是否确认删除公告编号为"' + noticeIds + '"的数据项?', - "警告", - { - confirmButtonText: "确定", - cancelButtonText: "取消", - type: "warning", - } - ) + const noticeIds = row.noticeId || this.ids + this.$confirm('是否确认删除公告编号为"' + noticeIds + '"的数据项?', '警告', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) .then(function () { - return delNotice(noticeIds); + return delNotice(noticeIds) }) .then(() => { - this.getList(); - this.msgSuccess("删除成功"); - }); + this.getList() + this.msgSuccess('删除成功') + }) }, }, -}; +} diff --git a/document/images/qrcodeH5.png b/document/images/qrcodeH5.png index 0f27fa57dae1d70e0be7c6a0ebf5208b12a0ccd4..584c0b0e56b7d91e15c2aedd0004b9169a495b5a 100644 GIT binary patch literal 38876 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 literal 19517 zcmb4q1wd8L*6%*Rp+#D{ySux)TaXYCkPZO>rKGzX=|)Nd$Q4WAW000910k_M5Gyo3=2fM%*0(e1@ zp-=<_C@K;XA~HHEIyxFE8rnS!Y|MKYSQuz%nE04jIJkItcZ5a8nyVB_N9!h}HJ zK^_Ds3KWWhdk^g%?*I4ewj01ghOj_b;2~H592Nu~3v$~FkOBZ4JOuUv{(K=LBB4ML z;306}W88m~|MC2G2|$O30C1S_m|z?2B>rUk`x6zY@CUykZXIL=$N>Pmlq-|8j65pf z{`Uj_)Fg9Z0Dw=Dy2nP-YdMDP=pliqkdrFWe3>fEx4Po#(TBH`iaPx-QvvFIXIhhlk37R(ra8= z3RxgEqm*{z415aMy3oPLdBN^bFe@X5s02b!pUH0}V7Uq2L#EhxWS2K60(*!Mb_G$+ z;tYO(69V=tn|=`+EA-4;Nx(*30q7>-N+rrqWu62F1GXyw&~E#RS|G~Dq!Yu>KO3k_ zBkAFhx4De)BFWdVSs;UtgKN{=MgE%W45?w`ZUo>Sv75oO@yeM(obK0VP$P4M*aUdR z5};yfWbnbA(XI(0tWCJd4GjV@Bwc3!9I9L=>R}b42y&T1ve`rwWd^l{aqu-1`4O4` z@*)(@-Dh~Ae!}~REP#Y5u$Q#H5$Z0}`7WZNAk+XEs7hLNeZZ)SA5Q^LAaI~&?WHiv z<1@}MxqcFoZ}52ax(KyldP4=Kkjk zV$iMu0N19D)wl1dVXy%QzEDfSxd$Mcl61S;Eaq%mBbEb@yD2o%3jnWCn_x7K3VCSk z=C-0ixEiv^`m`%*!`H9x=`g?v@W{Dhn!zp5`t#EpBeWHuEC2vWKBlcR2~`hfVzG!B z>nmLN48870cCV}BImf}-OfEG@8A<^9t4`W2l1YC60PO~wW{1=3C_<0>!D)3yyYpLv ze>2)&E@|E8LA`P?&0Z`48kWI*v-o695^$hMPjLQ9G*4xzp?k7$=g|J?UEbc4XeFz= zflCnxiB3P#GXouAh+*KGY40^6!DoM1C!%jrbi(($_tH$S``~H7ANr`-UZ|>~V`??Q z7bA^+BZVXop0LN-UU{khp?Z)YG6(QIoAXY49iUASel!Q>qc=(oQ6!1@YiO&uiICP|P{hwFR%m?6QE&JvW0Ymy+`1l(H_foJd(0aDDMwJ-mV^?=N!)kAKML-s zm_0c>*=?z4H3UFz)PD;Vb0e!@^j&S@t*8eFF(=#g!W&g)v!9Ww!39%wR zUjmB*jlq&aZA1KHTPk`~9>R>Mr%LKolyL=ehMTrj{nN71g%Ps@gYpaGyimlfAUwS6 zI47|O(S_NM+LOG_p^reeJEF)xrOB+z1#xReKdtysx9srgs^v=RP9n2r;Y*xo=?ccW zAJ5MoI<(#b`lbqhlC3Il@1zg?>iThX|BbVs(X?YkKim7b0;0J!forZRE`g1Rw?y(X zbS1VO4RWRg<^r?0sB|R3GWPCf&sQI{rz|_}o3itatKV_^1nti!y6bUzoW3HMZ)x{o zZCst*bUGT}e*mk`?lN!mMj@{IKCTFoz#yS)9}?1qce-{g!~$dqRyf}wenO4%2c;>akTO?t&A-C^rQ&Gr@2W`iEvx8{ zM$tc&N`4tC!6F1PpF|ZUdrD~jr^#3tGM%S=-w+!<;;U>T?dT zQ%+Qgb)FyKD&ktJh#`~dd1UwCMbLz|kHywG!l{UK4pr_BBH`q5?A*NmULqn?6oP5s3Qc1~&kaP|AIPoABspH_zMfJ4rqA@T#v z=BB6pywy2KW>O_-7;T*%JMeEfNWJ|JMv)$w37tSbq+yiJY|3Sy=1!8Q>x9cPV9dD16lZv?O2wv+REgxRYA$elb-tyR_+btl9eZvuZ(V z&|c&&Z`Qn<;n)-2tjU2~3qCi*v#{*+tMzimr=kLi(RIfbI1iU^fy!mU%FM%gbj_NN zUNlRzhlp$A#qWp*62_kjR_@eifFGsqne)guPLD>Mvb1bDPuFLM-|}M@KhBQd9_BF( zCClWgJbRbM;h#e=O3Y0z2}Zks zhx_teT$VFJrV>+>Z$ZQ(v+fhb2WcEtne%Ip9bzzi9$vKjus@SN4Zm^HEAZ6vOX+76 zdpnoCeARvn6d{2h&p+sC8#N0_1?`i5WPLyDcnfrW)<|cr)Fd{@=c|=*P*fL?z>_E^;*DjTfDHF=0OEP;nlRi1YAxOLSSgD=>GXlBGO!l=baCY(xAT z3G1Q)2PI?f5Cggg6yN#{A1S1*GU7cc|L(9pDui$gFb`q!^OC*VR}>+{_fGR?>4l(E zD%7JT5s{bGkNKC5dv>$~h3Nf0IO*5a_OU@UT+-Tyvs7$+D zb~X~>mE)}jC*~}<#!cZ*rYQUJgQH)I_s90Pj?T2L_J^P9(<^BBNnhOgFB82dk^}6O z*6(XG)_bDG_>21VHs6nJ{N#_A(kpvJ?_PdVfcBF=GL=2Yw=&U)O(#0Yj`M51S5@M3 zb@NXKV}6f$lsB)j@{j6Y#@2g*jAh!%kDh5;nHr3lTxEq0+KIdA2d+uZiSZe(K0#3Q zy#)e3S%3G-?9)8SSb@0`X)5|6CGa&tsGF8E+eaW$5Dc?^yq-eAH?iZOFU+qD;bAvsRov)!wc zsc}h0DO2AVp!s%Y%>6I%ePW6G4`W#<##9S*HbU~&1QcV<5pCSW1A4B0JJRGaY_@hLgZ7pNc%__fihWPlS ztpKV;>yHG~X#)nDo9{Cy_guIgtN_x=+?;Y-d#IG`sNMMGi=OeaG$ocT*>QkD*h<4I^?&FDcl19$UXY-rMBtNrhGDB0VX ztHn<-3iT}w{S`3lVue>hM_&68T!9Pox}Ef;fKd&@fx)~rQ|YG(baV$ING~ z6+UY5*&((ih`vInIJ~@%a~BZ4UVmimxQMcEf5a+%*|;QoFyB!@c_niT@EWd4-vWW4 zPaV0&`9*tYt6SiA3{H(Edz9+yEFF=yF9dG#7w^f+T>nzI=lV>2!( zTla7>6z_;evQTm%K^Hz@%o_88n(;(9$SF-G_=mG2+C{ug_6*$%sS@IsE}1b>Ec|yk z2IC|iBKp7J1)I@0dvE?G&T~h+537eqpXTNxlj6jF;}3Mv&eE!b`IZ(Ju7PpM*8@8wWIXUC|Y!UqOx_fc6E;Q zp-HUDmS6VqAMoJM2y|1ucTD-Imv$#darVr>%(p2iEIopGh5XSUJXy`<-@Df*c5=m? z{T{AITbYRnK-W8&c)a)ve#dFh1kXG*?%ap|7^?R-fnq1?Vx$YjSSibfjgWdD-ps|a z)BdEcS#l?Rde58n$^CjH43_%FFSB&p{1MQx!+9s`P>~BN@jD>3s>XM7c$9Y+q2J_w zSBh4;eqXzBd2tJnGvQ4{3qDz_*T*j*s#gO`uLdFtka(Kd;8%4vtupi+Wpa1QRkHLq zH6t@b{v-IMD+heiqs8w=t_6GtdEN_U_%UvqZ zK8!;94V4@vuwCXrtdL3SM}rnY6Up5Fp>Hn6^)hE1DjHo)BB--{^8E&fD9fh(U!V-E zeYb$hW25(eOVL!{?a0R(r-iXJSE+DcFtiqY$0r>7LKn2s?%4VA#t43?#g>LpEhrHE zq1KL$oB9RbYr$MjUjZ%Rna)FGojVZnKat6tkgv^*7iT)&9pK=zl}&zNpV?9LFYv?h zW1^C%xBp%ZXJv)Ht>lM^K}fC$GrILo$u!0-kc@@?kWDJxZFf|fD7qrtVn3DRu^pSp z3xVsGGq(UNfrj;WV(s^eOuenIH<33g2H#fcilA-9gi)XRd{m}U2pui zy=7~rH12|AL)V&bJT_rYH5l0Ud3Bk6b4oL}?+p*XOG$J4 z9O(5}HrHODKT>SLB^uwaW|N5Jr+Gh*;aN|VP5qZp0>-i-Yzt#sZ7sa>Rm=ToN80(u z(xZ(PZY@`u>t?->V8*Zi#-;u$kEO16GcZ4*^zGPIq^Ul0<)vYTgkhS!J|+XcpXQ~hnX>d} zEDeR0AMQPSKt}}k9V?&3+~I76O@lCa%GXoLJMT<3eJ64mnJPl2Z7_a{e6iA9{_H71 zwpIU3zeU+UdehW^ZFBnm>i>^ zdjz_j#2#l=^hMP)XLKa_J$-sDKi}BVdv`;fIFQg=auTUq`EQNo&eS=pl}DuPwOKj&YpH`}hnsN82r=g6Or$oaYTL*^4h-Bn-HJ8^+q zfN{9ZU<56_;_`3(V2Zj5ig>dqy%czB)Vpige%dlLN3^1R#~GiM!Giq-y9}H5W#8js zvd#;6714liF=;;V>!ciKNZmr_hxdcsdltx%(-RZZ>FLk|G<5UTEPhYMNLZh8vrSug z%t+uKSGsd7hZ5NJH<}oFpXr1xV`>-EmOoLa8W_?ej^q}OChe5U`&c68@$+$B$cjLZ z*3np6%VdFdI`*#0$Xcjz{i?ofQMWFX++LKI!@$teC1bj|0H%@5SiKbo`=BZljvChM z`EWI><3fbqpKvpBURavFEVqE?;@#-L=1!CiG|AVcl6iAcd8hGSXpI=w%zZOo>VIt* z4wtJN%~n?&6KaFvsG>(=Id4dH3OIkbBrM!~D%tRhPjv{LN$7g{QVlu=(=#9Ie9cYLya!evxjEOeSkdOX znha|b%jI``Co=MxSC3LoUreyJTqwg*jwr7Z8>CE5wl+i)Dqwy6;rL(m%^Oox9?hV| z%&}3lJ@5a2RP3M4fCCr+MoBCsD%!(g-`wHjXe*cP8f~E>v51R&y@^X^%2ZvI5{5pN z;kE_eRMo-j#FRmSs?BYlH>)8$^!pu!HtKUP6()1bZ{qXBb$?Myy{Nd73;v~l8m`zz zDAFo*ggT$BG)>d-qb)Y^@h$K+7N12-=N7P69lNeg8st%1+nTMyZn*N~w(%_)s*6xe z9JDCH&$=i`^(`8H??T)a*EO--`;OCw|{XOPIFO`CXfiy$;f~vi3Hk`L9gBx^d;wAGZ}4 z8hhL0j+d$Dzi0Rl>PMqoz1bte`C&RO=t;NLAyBn85Suw7b5sbMoAoAslU8|DWlcIV zU-f&4jO6E~ql{vBEDkI$8PZra%|i4H_mWBWqZ*6UhjAl@vt?BFE7*M5<%$+v&h^uX zNtB7`eCA?<4M)XohPi%feFpE6!q^t2`i41eU&c6$cMMP;0v<4o? z`xqir9g4nKLzM%|4c4yRhJ@1cYUw9a)G`y#YrjR~i0%(`BUl&Zq-c$Yo!IeSZw$^O zo(h(Q6b0yosS}~1B}jQOV)KO#(FDj!Bq`0aV3{Mw@S-=ZFJ83q z9_vTJVtYVTZ@p@tkZ;z-#C|Oop7Y}|INo78+oXTh6T=#+;$N;WcI`DJte1;Pub(m} zN^PJu_3#dO7o2*0WC_}cZDZy{`b&5R&!ds8t7=Eq`NqbhtG;&^;_q1ka+~UnVgl2 z0cp|Z?=c}hZkyOA(*Gu-3rRl-i#tiH+rMTxP@$F0mR zHXIfdZ0FwFU_7#AuoqB+fqB|f5&l6{C3U#g;pYC=$cH+fE{-W#St+1bjK+IT;khER8|3yKjt1!P*S1W;+# zBCZF$ZbsTkM8DxASVxaSHBsc+zR$p$kx)&fdAJB2wpuH1Ybr0NWRF;(bA>0O7BQ6_ z#a7vOq+QLAT!zpSR4cCc3nYqCDK@j@&_yfMy;4WuSa&t1uu(pFZ(4U5PH0T{m{O;| zL8Uj6TzBafz`U+c8s@TF)Xpevh*VCsdhwDzh>mxs&(vPrTG=&5TL6u1p6_#7I7gA& zB^c~XH;8M#fWgjOCz3)S^u4iS?$^I+zq_%v?k!f+aCLOe`EJ*IB0u*G45s=|ucfEC z1zbm~(BS3-D=?H5Esy;PWry*wlV#2aK$5<3l_5)4GjHBuQv3$l^PZU*kzA@_of<*i z-I9nMdV;OX2cZNTZldB0SJfXbLP*$@gYTid@Ekca8KF5QB#8?hC&h1GAKI%7k-@`q zCe;_3>HFLH>n{>Doj-#Oyj9Bs2dAQ$Y`t@wriSa!KiS_3^)$r`ma|=a60E9T>noch zJ#87B8)*I;Y`&m3bm-eDi(qk=lp7Gas!QVn zsq)tiU;=1K(`?8+6!sl4Xs?vlW5W8!sPj4N6*6RYhEp5yh`jr!UM}dwq})tBF6wA7 z(Bjgj-PJPcg<)h*na9@gOxT5Wopq(C*G;N z*PZKbKM&$xM7agjN0oyUwMmcLmNs;HKKT?VcGN3mC1dwTi8xTQheRr54JjiGFm@SR zDVe_^AZFMivZPN zwnVDGGUWcOoVJ2#V+o0)E%~80M?Tg0+}K<+LI0Gao$cZP?ObD>frO?n)BB6e1~|VD zib=8(6e^b>=*?!9+!;EXoYlbLL7y%2&9Cp^$v^iANx#NSD0;$$d<%>*QdZmTMAO}j zQOEOr7Zcx-Vakr>%PW&o=~IIeD7!c2m%2>usi{Hxw;; ziNz7_Dx@aWnh>j5y_=f0Gjw6Xz*D*fhULOC7W-3^mn4O0xmHFj40JM$iY#XLW3EiB zIewL}&2)B#L&)3>>id;k(({o}6p5K;c$B=S&Q?FKe+@SbF9|e>$0^I05{rNdkq}y> zY_tfb$r`>xW|~$%B3+#7MfQBCw8vu`FURYB_Wb^e4|l7wfkLE?raIn$me~W04Vk-T z;Z9>~5Ppe{=S)-5Nx_%ash&@Me__2liH;3LMPG0nQgSFEoq~zSA>EUijPVY34Ef>e z!w7vgQg3CW8T|a$i8Ovfx(Vv4(vx%IJWx~K2V2=TpsRt=s~3y;)JKuho@C+t6E<{Led;W!0Q;ZEC*c5)c~l#fQ68LGWw$ zAYWUIhex4Q_PY9n7w;GDWD43E9!s+dGcC1@l*%+IiU`j03-a>p7@1ELK3xwV z)Aa2Bf=^n%iO?I|qTC=GEsLiw{t4FB=>tA%i*Y0}k9cYptL&Eoal&F6R^bCEC>qI6 zGe@v<-2L9UrteXv`CyPJ$)vyE4o@!=#Ii6`V6c(t*vfhMZwqht(*td-z~!T|2tqv1 z$HfX~vFkDE)Jx(aLYA>MHw0VSYDe3m6+yJIihoR> z9I6b%t5cPu1;hM0>g-!&x-?&Jj;I`0sVmcMmDNLc!J|Q6&B@(XN-$lLa~Rr(lYp+Q z8uW&W3MY_fSN8iVHO*n=qCk%V!fR^P&yIS-vdMzH!$jlOva(~D_spzg>{J3?4P&F= z*`(hB%cK}Sb>z6Ni`FX+ZFacNlE==ZkFj@_9h>q?)!eL&22|p|koRC~6_?8O0E-MK zy4Zh@NS`(iA`H#ghfxl z!zsPWDX# zdQHh-x-MK0X}btglB}s%%XGqYarE{_;E^D1LtB0HrglZC?!+0(KayWENmKbK?>hw) zMCNp=?$+!4%uFA_sgRGd{%^Uef6XwN6_?N`hPxE0D(HW@i}Z05!#Ikp$2c*VJi;GB~SHHbBR0~U{8aj`ZkCwov->M9&ak~y5W+kjHu*b z>9`nGk>Qc{P<%Wc<4+!EYNhiVeH{=U)TU!(7 zXPjFrObwWeL_Ys?Jas<*beFsPNA`k`pkc?zhMW=;XB3PEPi_Bv6M7GfTdg!>@Z(pg zObO0AftVQ<#97q)f5rcWbg)H9etlTnq!lMAW??m5(w^z=1{~aajWV~G@Ob?Ql z1v6H{wlYK`b54BRB5WR+>T%c`Qrrir!NtPek@-8-0^00uN`%9l{9Uib!)8yoU_OaW zPv?Gwm(AO|Jl0Ri#_)I-C~L~I7m!ihM4<;xUQDQC5Cq4Mxn zS%8b11MN!T@SETsRTYGmItE>yD)SF|(^eW#rF7obctM)Y?Ii79n(zr2r(D!an|M|p z>Hu;Z6G>C3);riT|98BA4O3ByU;k#t?0)>tEOyMI$NA#*2KgteR#;5Pg`IPHLJx^$ zB31n3`V?&P->T=Qo`MN2QmkJY-SHzWa9R5jWv-YbB2sO`{hD?3asoS{;|E}`# zP4piawSNz`rfUBejsF%iF)lvr`Uan?d&llZ^GDU2@8m`x)W?F|k;JHzDP!l3v+C9U zJ!EK`pXu*#nhhlj?wMMutGpd{jjD0HXFR4ubWxp}lQFU#75)G+#f@DOA!wOn%KS=t z7o$x1E_LEDw9-fyjo|u39YKAZbJ(@Ap;#bm%yf8Y$Mz|ouyIZ zliUXe4<&QmbI-egwnMY9b%`$zY&eOE3tUx?T>7VYCR%>fu`m7joXv^k|C)ol8&Tne zL-}27Q%vzx`qz4Y=d%7oW+*&eP%y#OY!DA>M6*M4mmyPlyp5Dx`JM$A$~2w4^HYlz zf{L&mWSQ@(0wQLu!(S<@6sw}>GmolRxA=yyFqTj_CTe_bpa}X#k zq4mw1YBD)BgUfqI2f`%-Mjhr#SQ1HjWRNGO1qazKLP4-5HTFwP2(k0#oeV5&hd$kJ zmiL3z6(DUm>d0#ji*BgrLz~KRvbf=TVd3j7Cf%b{YY8_lf91DiMzgYp1UW2G1FNvz zujWG>gEnQ7w|XbCReC|M2yfBB5Js!*jMTDn(foJ9)hd1R$^3(y>UZH%Y7 zDj08by=mKQ8X=WgE#kffP8Cuc1ZnCi5{_^NWp-3-Hc;`f%R3aYvl2zV4QhkC!On@1(K0txxQ6;nt+0Vo3%ql}FIwriBC*_EL6^f-?zrij-2Suxc4Ms`)Z-AYFED zSr#pIM+5~FD(UCo&a1wn#dA zjLrIOWhR5H3hGa9qJ4e8g@wzg!@b-PzuRdDZXbk$fC`eD&)34GP?mzXg1dAmQ zA3+EoDN(3QH}D4cP@0%v_7zqX@n2D(dPFY9$iK8Sm#Tj%$^v7C$slj`pM2IKqeGTt z#_-^wrKr=R_UAti)Z-MG5f#Vwk+Dh!X*5GQcHBjupK&DHqq^~qeeu^z4osdVq{WIy z)fCgPeE*!RPjXKVF2JKvdj7}3hc}NJE)fE2EVDkHB1BkrN`wfucZ}gPCPJvvdUfdWaz7vtFdX7V`%Wi#XsQB9R&pVKF< z?+Q4u8FSQML>=j!7Q-1x-%)>{?Y_nLp4&)&eL0b41BPQ6S-iF`*R!P^^Cy9Imu`RO~TA1a>#U#I~=<$E)4*5B%>g z4*Mdo5pK%Iu(?|IC?o>l5Rfq`1aBhn{CPNPazE!8%gZBRIcj=DV!x{jxX76afG597 zK&`gU!jZ!JhyV)EO{<~*p=T4H{7LbSS0VsVKh>y&;8%PVdK4PUyvGu91@Pg$Ld!bCj@^d43DEZLAp zy4D9E`uq3sZR;DfLVPg^Et?SvD8iy`U)vq_4uyyIQ<8ISrdw$9$TJII>)T_SzGuKh z=1Zb(K&e*uwVc?moMILhcr9_BQkX0V2Z`A>LC$z$qQDXA7xXjSQwjl@VD|}})L01d zS=l*Lb7T$Ssm009gUnBR1Ssa*m!{<6jm@IJ2x{$5eB7;$J9IkL5$rO0SwBdJVvt%; z)k}oSt}>jU%Nd~@x;U?`Tu?x_iPHpd*IlruYmZJ1B*1=xm`6nn&crCujWmkfEOCYu zN?1L4fC2ACt)pd0#G>s*uOnqCgerK!pdrs?7=rXR+?lI2pwoggLIwl5C})i zH`LYn4kauFUvx#1;es(UNY|tTPxu9sA@||5qh6XP3&qNG-(}0&2tv7bo zYUf-^VoJX_-#0ggER)er*I_ev>=eER$2bbnJ?3{CB~E>6pCaPaEDwTN(rZn?9Z$kH zb`P<50fV2sE+xaoU9rUxGj0XPHL(b1VGcHHsSbNy&)!w$>^Ue$%`Dwc z$A7Q@ZOxUSdF13|Od(Bj11^9^4H~`M+o?ep8>c|dJ9<-*{!4>jfdukJeh*J^`K_yX z%hpTxY61GvXa}+ZocNE-@xP`4_k7*zu0tQgyxeV>ZcgiF@>Mdcegi7qgY;ke+*kPm zfW-OSs6wPT-r&ta{IB`q=h7!pkDmO{b~;NEjMihO7G=0r0}Lsg$!1jdI1E0ubN6D< zzXzp&wOJ0Nhps=Df_Bpc_P-@d?UYQq=uExuiX>8cf~xhD@j{>RXSMdZ)_s}NMnjdW zsT{R{w})VXnudfFnd$J+8zie3i%^eh2r$P67Ry@sC(=oOdN9&pnBob3H!eA9R$q0^ zZ8@4)W3X$utakh1Z%lz4967n?3t`zh?@Enz&gL#rDOHHt+*ZIXqYYg!@3UE5`#@P5;3%Quls{PpSS+ zSx3ilG0sLui6L|Q_D1658va8G=$kR^O`06akeeTN#G`VuFYG#aO*8T}U6>j;6fxlN zt#|7+>J-U}i4=T4995j?no+Y!JnnvMNuUrXr>cBS3C9M`e{jf^9nc9RuzxkpDE_!R z9FDVD&6xAj!Oh2y8XvP?pV{48^cOd$#p2G{dg|~^6pc2eWO*JRyL_19tlOXtTC07! z#gDzX_Xj?`_DCXP@f1U88eYuf%s*al|6*t|>{Qv1DQqM+_9_M{n=3L6jjKY1PnI+V zUNk0*TTuiZoBcp4R6qr$7m;L4-^sFCN;$ft+ZQ30R+_w}4%2&0&29W~g+J*cp7-(RmGPaXuODMydxVoaCTg-i zUJHu;!V$^&MYvKm=XomgA5g;w^O%?K&Sim54F%n19%g^zpwoa_ zN2s(T$2H(0q!rn=(Geo5vawPj5AHO4{T#&z?rmec84P@7J+GN${PZ`wj`(y>*VyZUF{` zVikm%5YRu)^=+N^WG;u8GGB4Ts}#WFqYT0TM#Z^KuCyk?eThzGM!NCtd@FDx6gp-O)b73s*@dqNAT~*YpMiF>zO{e-|KlAgi0O!xjJ9h*4<8Egd z{AT$d!F(?b#Zgm23WI!jTUXa$HhlJ2lZMba;=T|MHcJ>#64_|%VY`3a_T z*`}VMd_u2%w*~j%tXlhramjwxMqCoEc>AC5A&&$5%X_-#u@)e(poT-E4icAjM)+zx zaa6rqhH)cu2RJOB6x~njM5C$3`N+^t$1Hqa?eyY7ZahJ*YdY4B*`>M!jrQ-}{;Yz~ zcB9`j_Vx7e#K-(@K(rJ3gO*A7wv~zd8!3PwWJryR?wiA;8U2^=?d*n|r0brJYb^K)h=ual@C( z(#NJB6_b33K+(tAQQ>XG9%(3e>b1%UTuvpM&X?B|DAP5qfR3Rd79_an+uEcMgJ4!a`s{@pIkdZh-j4 z3%|meE=miY%__5|I7GIJL&m?BRdEIVneN(6Y`u$x{g5i*TUvf4H{`U3Dz%*pRgAKb z<_~tPU;N%u8B#!2vjVjIUyVsBQgF*wP%;?^J(~;*o43RE+3z(=xqJ-gqi-EfXmT3& z2h;)g#ml0065&+`RMc`J(%mO`Ey=enPuL2vTOkksN-6__AxUd0!s;4>&yoTIt;uN! zQ?~$i!*L>gvm%|V6(_~)&NHUR$2+6L%Enx;;XEtVpq2dNU-lYb75N6DsWsHSheGwZ znd$20mUPaSq6pvHVZKRrH%NIa6yI*YN?hIADzPw$0J#O?!F9vkAzT1=m7 zKopul$=`(_0Zjsc5C@?E4{0WVh2SHQUV#R@kCOlb6)9l6$N;7y4W=Rh-XusM1fo!2 zDQ}_Fv-YZEj0cB@LQ8WP!!6Y z0^olI8sHCo5aJZULW(%ayGp@(2nC!X04UO6O90q+k3e>86a<(M2?PL?3DyWBM(_s< zkzsNY6e#>*lr+EF2y%fJCV&7c52r}sF9A~t)CXGu0QHYkpox=202Kfmiw&!n1{*?= zpnw3o0Sm!40yNl?2!J9&95SqppgtfAXt6jH8knlEHiEU&z$^w{C^VQb1HwwcR$zm6 z_-#xH0Du+3j0tjq7ib)i08|yE!~`fnMt=zkKoN)oYm}hzR{$_U3CI9gBPaoUngHBM zlca&WV+XmwHe!Q}pfWH@1Z>bs5U>OR8*DzstS7 zO^f-9w9{OTLpsRvt=nnkV!icPCZByM2P?X)9xk5Ya*Z3@Y_E(hJXUs&p8aCIRi@V$ z#RA*exj=jKPK{j4r4g(Od`lPT@V0xWMhOARVBKKT$C0?{EQ(OXA-ml@!{722k!_3! zBT8Wc*R4K-aG3>*P)+3cZnezCznwJ-3F=_x(-{1e;)WTb)&@r6dGr`tEG#w8;05_H zhU#*Tw!NJfSyaeaul&r$jt!qLqwarX5+hYbA@tjpstAvqzlu}OpK`)UI@{9D!4kRzjeGqU% z#*3DIb!o!A5TDqa9-V!tT5oN~TD&Ms)!M6}q(RGFO=ePDFPr}D>hkRd%YrZtxi&pA!N+pd4 z>_(_^XfjL->*|m6tV8=>5F3a2n!@i+R?d9)ra#Kj=&Jv`-B2!x+8|nJ;t(a0IV7_MT&_ zb|MIn@yKQh%mHr}_`1U~)E|ux1oW-*RKBPT&F6X=+b(gfdZgF zBJj{H@aZPSjmUFwkJI$r=!s|wiD0{G$4j-gb9LSG6K-xW{rBN%dpia+h2-haQT3bS zE0tTo$K(r25Nj;)%ckY0+bb8!+~Y+jVtnEe2g4`t4jIGO%B+$XZh_LdOTWQ0`EvG;GSV%>GaCCJ16V9geWlS5r*fUkDu+s=72CHqp zZ$sdbUqkpqccq(F6-@u8>J0gAb!JB15=JOl(PCfc?ipDR$w7n&BH^6%BuZl0fPP77+@6bILTaci-0*#l~4I zh*YDgY#P%jXOT}eMuzPjXa+@C;17LS3~GLfv7lL>Qt=8*>AYq~rF+ecj?MaHRlfA9 zl1?xBL*)oWFvj6fnb9^NL24gQC?*T{($`*Ra=FY=#4hr0_8EZkWYz`hgL<^KOusmotre}K1D^uEkJ8}ver_wIj1r74u{55(H>yp=xRAOYmlnU z!Tr&E@~w5Ce}Dzs-l1xJw)Imt`= z<1TctPa0b@ZmNbothU6JUk^heGsa1Wpp zd(Z59tjCrU?H7sBmj&^zOARQcD#Sc%&BhkOSAb4i3Hz`(ya(>c0w`x0viMIVn%5Qi zD3TW8hknXrlyB>|zfeROHRKJ65NL2$SmI+X*@< zyb^O?HvVCQ^j6wYNB0?zFyqg?j9*1N&eWo14d+%2A^aA>FFa26_4~7&Uwq*xmwSlL zP8P7_QmH!Md0&#eu?e2)36W^+uQvJ|UoLxY;8`oTn$RGei{$lZU5%(_e}2(ipI9NS z&cMl;mXe{S#i7|z%sn2IiAx*!0L3*P&VHr?iZ?d*-_P{T1`;~ zlsA1i`5L+KDCz7#MY!;3?W=t3bMUNSXdmf>_rT_DMQN^(5(wp|7 zQfzxV6#ktq>sC|--&Heh*1OVH91Jm?!;nq=XPUW)U-!y-Wkzo)RhpQg>zjPeioJBS z#vJ-IS#Rwib!grxA#U~a!uw>afX_n%wKaR7a<7eFDC;ri+s&tx=xFeqxBw!fkMCil zNm5dnlA-!T!!(m90VDWBVRSeSCwYMtHXMbQJ&eT&Ms#b*{PotulgxWG^d?1~m z5zY}23yKDXEDfWX+Nu!88)qn7Fdo|C+mzsiIYqM_Zn5wA&MW)hvoNKz+X^{Yjr*WV zO6Z@#V>5?i_pEA`nZz1}sWmeqpFmy_bYa{}n46eB*`3H0^SwMK>1^P{(_mn#e`k8S zFzaZMn6e^Ib8klqsz4BRxOjao)bm zJx{hM18l6BUTf$+ae9@S_rU#ijf|DR$=$C301N|hAYz=?U;C_`J$NfBJagh%ORt5C znwQI*7o`}tidY=ff5}CP{4)=)yZ~+DRU+jt3*&-RsV5RrVzxRSk^#G2_;O4XO^7bZ zd_$|*I<^wltp}$+L1a|-%rT@c3^t^)5(hgmf;wFWMx(yC6ik_Z+PixQ-Th?)pF~&& z0w>JFXEa$JNsvDIlh=g-Xb`fE4)(as7;&1+`>%vea-Zhnzy68&j3ll;W_?6Ue#Cn> zvJ8P^6#y=-&aCs791>aIVbL)MD0B$BgER1>2Ku|pnN;KJ-q&$AKBu3fEYwD+Q0Qmm zYy@8kI>XUquwnbBO8ivKY}q`cftH+nDv?+=hm%Xwi2QzocZai%A1oAa2ad(jKqbPm z!fP_?=&dUtZ$lO?0&?JDP_{i_R}F!_ufJKrV`+ou!0qOpBWs}+vyq}dgM|`k zr~<09JAurQ@`9A4hAR8|RxDVtV#SLV4lq&>27mwofHnQJFxVz@7lV5i8Yv-qP++R8 zGP=R!Vg|^Pm5lB3v0}xG2C~r}ss>S42P@%V8$dgP0g5QcBAVp`P|{_eP)~YRf3O(F z0t98u;LsD0bAYjQR5Tv6IWH!n9M*vay{g1D7FC6Y2r$guDZkMe%2lotBV8wz7Wk;9 oGr)HDt|RCOg;D?zF^vkGGh(9Hs^o5Lx(?7V5daPV>-3NR*+AU2&;S4c diff --git a/document/mysql/admin-mysql.sql b/document/mysql/admin-mysql.sql index 7b56701..2743423 100644 --- a/document/mysql/admin-mysql.sql +++ b/document/mysql/admin-mysql.sql @@ -35,38 +35,52 @@ CREATE TABLE `sys_tasks` ( -- ---------------------------- -- Table structure for sys_tasks_log -- ---------------------------- -DROP TABLE IF EXISTS `sys_tasks_log`; -CREATE TABLE `sys_tasks_log` ( - `jobLogId` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '任务日志ID', - `jobId` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务id', - `jobName` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务名称', - `jobGroup` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务组名', - `jobMessage` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '日志信息', - `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '执行状态(0正常 1失败)', - `exception` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '异常信息', - `createTime` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `invokeTarget` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '调用目标', - `elapsed` double(10, 0) NULL DEFAULT NULL COMMENT '作业用时', - PRIMARY KEY (`jobLogId`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 198 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '定时任务调度日志表' ROW_FORMAT = Dynamic; - +DROP TABLE +IF + EXISTS `sys_tasks_log`; +CREATE TABLE `sys_tasks_log` ( + `jobLogId` BIGINT ( 20 ) NOT NULL AUTO_INCREMENT COMMENT '任务日志ID', + `jobId` VARCHAR ( 20 ) CHARACTER + SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务id', + `jobName` VARCHAR ( 64 ) CHARACTER + SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务名称', + `jobGroup` VARCHAR ( 64 ) CHARACTER + SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务组名', + `jobMessage` VARCHAR ( 500 ) CHARACTER + SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '日志信息', + `status` CHAR ( 1 ) CHARACTER + SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '执行状态(0正常 1失败)', + `exception` VARCHAR ( 2000 ) CHARACTER + SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '异常信息', + `createTime` DATETIME ( 0 ) NULL DEFAULT NULL COMMENT '创建时间', + `invokeTarget` VARCHAR ( 200 ) CHARACTER + SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '调用目标', + `elapsed` DOUBLE ( 10, 0 ) NULL DEFAULT NULL COMMENT '作业用时', + PRIMARY KEY ( `jobLogId` ) USING BTREE +) ENGINE = INNODB AUTO_INCREMENT = 198 CHARACTER +SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '定时任务调度日志表' ROW_FORMAT = Dynamic; -- ---------------------------- -- 通知公告表 -- ---------------------------- -drop table if exists sys_notice; -create table sys_notice ( - notice_id int(4) not null auto_increment comment '公告ID', - notice_title varchar(50) not null comment '公告标题', - notice_type char(1) not null comment '公告类型(1通知 2公告)', - notice_content varchar(500) default null comment '公告内容', - status char(1) default '0' comment '公告状态(0正常 1关闭)', - create_by varchar(64) default '' comment '创建者', - create_time datetime comment '创建时间', - update_by varchar(64) default '' comment '更新者', - update_time datetime comment '更新时间', - remark varchar(255) default null comment '备注', - primary key (notice_id) -) engine=innodb auto_increment=10 comment = '通知公告表'; +DROP TABLE +IF + EXISTS sys_notice; +CREATE TABLE sys_notice ( + notice_id INT ( 4 ) NOT NULL auto_increment COMMENT '公告ID', + notice_title VARCHAR ( 50 ) CHARACTER + SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '公告标题', + notice_type INT NOT NULL COMMENT '公告类型(1通知 2公告)', + notice_content TEXT CHARACTER + SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '公告内容', + `status` INT DEFAULT 0 COMMENT '公告状态(0正常 1关闭)', + create_by VARCHAR ( 64 ) DEFAULT '' COMMENT '创建者', + create_time DATETIME COMMENT '创建时间', + update_by VARCHAR ( 64 ) DEFAULT '' COMMENT '更新者', + update_time DATETIME COMMENT '更新时间', + remark VARCHAR ( 255 ) CHARACTER + SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', + PRIMARY KEY ( notice_id ) +) ENGINE = INNODB auto_increment = 1 COMMENT = '通知公告表'; -- ---------------------------- diff --git a/document/pgsql/admin-pg15.sql b/document/pgsql/admin-pg15.sql index d14fb75..31ad71b 100644 --- a/document/pgsql/admin-pg15.sql +++ b/document/pgsql/admin-pg15.sql @@ -683,9 +683,9 @@ DROP TABLE IF EXISTS "public"."sys_notice"; CREATE TABLE "public"."sys_notice" ( "notice_id" int4 NOT NULL DEFAULT nextval('sys_noticeid_seq'::regclass), "notice_title" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, - "notice_type" char(1) COLLATE "pg_catalog"."default" NOT NULL, + "notice_type" int4 NOT NULL, "notice_content" varchar(500) COLLATE "pg_catalog"."default", - "status" char(1) COLLATE "pg_catalog"."default", + "status" int4, "create_by" varchar(64) COLLATE "pg_catalog"."default", "create_time" timestamp(6), "update_by" varchar(64) COLLATE "pg_catalog"."default", diff --git a/document/sqlserver/admin-sqlserver.sql b/document/sqlserver/admin-sqlserver.sql index 3c72ac8..e49d7f6 100644 --- a/document/sqlserver/admin-sqlserver.sql +++ b/document/sqlserver/admin-sqlserver.sql @@ -31,7 +31,6 @@ CREATE TABLE sys_tasks requestMethod VARCHAR(10) --请求方法 ) GO -GO if OBJECT_ID(N'sys_tasks_log',N'U') is not NULL DROP TABLE sys_tasks_log GO /**定时任务调度日志表*/ @@ -55,9 +54,9 @@ GO CREATE TABLE [dbo].[sys_notice]( [notice_id] [int] NOT NULL PRIMARY KEY IDENTITY(1,1), [notice_title] [varchar](100) NULL, - [notice_type] [char](1) NULL, + [notice_type] int NULL, [notice_content] [text] NULL, - [status] [char](1) NULL, + [status] int NULL, [create_by] [varchar](64) NULL, [create_time] [datetime] NULL, [update_by] [varchar](64) NULL, From 65543e651cfe4b144038a466251335d92245d08a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com> Date: Thu, 1 Jun 2023 18:47:11 +0800 Subject: [PATCH 04/27] =?UTF-8?q?:zap:=20=E4=BC=98=E5=8C=96=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Infrastructure/AppSettings.cs | 26 ++++++++++++++++--- .../Extensions/AppServiceExtensions.cs | 9 +++++-- ZR.Admin.WebApi/Program.cs | 2 +- ZR.Admin.WebApi/appsettings.json | 3 ++- 4 files changed, 33 insertions(+), 7 deletions(-) diff --git a/Infrastructure/AppSettings.cs b/Infrastructure/AppSettings.cs index f2a6d2b..f93c764 100644 --- a/Infrastructure/AppSettings.cs +++ b/Infrastructure/AppSettings.cs @@ -45,17 +45,26 @@ namespace Infrastructure public static List App(params string[] sections) { List list = new(); - // 引用 Microsoft.Extensions.Configuration.Binder 包 - Configuration.Bind(string.Join(":", sections), list); + try + { + if (Configuration != null && sections.Any()) + { + Configuration.Bind(string.Join(":", sections), list); + } + } + catch + { + return list; + } return list; } public static T Bind(string key, T t) { Configuration.Bind(key, t); - return t; } + public static T GetAppConfig(string key, T defaultValue = default) { T setting = (T)Convert.ChangeType(Configuration[key], typeof(T)); @@ -74,5 +83,16 @@ namespace Infrastructure { return Configuration[key]; } + + /// + /// 获取配置节点并转换成指定类型 + /// + /// 节点类型 + /// 节点路径 + /// 节点类型实例 + public static T Get(string key) + { + return Configuration.GetSection(key).Get(); + } } } diff --git a/ZR.Admin.WebApi/Extensions/AppServiceExtensions.cs b/ZR.Admin.WebApi/Extensions/AppServiceExtensions.cs index f888f1f..03b9105 100644 --- a/ZR.Admin.WebApi/Extensions/AppServiceExtensions.cs +++ b/ZR.Admin.WebApi/Extensions/AppServiceExtensions.cs @@ -1,4 +1,5 @@ -using Infrastructure.Attribute; +using Infrastructure; +using Infrastructure.Attribute; using Microsoft.Extensions.DependencyInjection; using System.Linq; using System.Reflection; @@ -16,7 +17,11 @@ namespace ZR.Admin.WebApi.Extensions /// public static void AddAppService(this IServiceCollection services) { - string[] cls = new string[] { "ZR.Repository", "ZR.Service", "ZR.Tasks" }; + var cls = AppSettings.Get("InjectClass"); + if (cls == null || cls.Length <= 0) + { + throw new Exception("请更新appsettings类"); + } foreach (var item in cls) { Register(services, item); diff --git a/ZR.Admin.WebApi/Program.cs b/ZR.Admin.WebApi/Program.cs index d217236..e984fb4 100644 --- a/ZR.Admin.WebApi/Program.cs +++ b/ZR.Admin.WebApi/Program.cs @@ -61,8 +61,8 @@ builder.Services.AddAuthentication(options => }); //InternalApp.InternalServices = builder.Services; -builder.Services.AddAppService(); builder.Services.AddSingleton(new AppSettings(builder.Configuration)); +builder.Services.AddAppService(); //开启计划任务 builder.Services.AddTaskSchedulers(); //初始化db diff --git a/ZR.Admin.WebApi/appsettings.json b/ZR.Admin.WebApi/appsettings.json index 223bdf8..ee9155d 100644 --- a/ZR.Admin.WebApi/appsettings.json +++ b/ZR.Admin.WebApi/appsettings.json @@ -18,7 +18,8 @@ "SecretKey": "SecretKey-ZRADMIN.NET-20210101", "Expire": 1440 //jwt登录过期时间(分) }, - "InitDb": false,//是否初始化db + "InjectClass": [ "ZR.Repository", "ZR.Service", "ZR.Tasks" ],//自动注入类 + "InitDb": false, //是否初始化db "DemoMode": false, //是否演示模式 "Upload": { "uploadUrl": "http://localhost:8888", //本地存储资源访问路径 From c9d18f12cf7e0cacc9675dfea61bace3a8fef2d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com> Date: Fri, 2 Jun 2023 18:33:07 +0800 Subject: [PATCH 05/27] =?UTF-8?q?:zap:=20=E4=BC=98=E5=8C=96=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E8=BF=94=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Infrastructure/CustomException/ResultCode.cs | 2 +- Infrastructure/Extensions/Extension.Enum.cs | 4 -- Infrastructure/Model/ApiResult.cs | 13 ++--- ZR.Admin.WebApi/Controllers/BaseController.cs | 55 +++++++++++-------- .../Controllers/System/SysDeptController.cs | 19 ++++--- .../Controllers/System/SysLoginController.cs | 6 +- .../Controllers/System/SysPostController.cs | 4 +- .../Controllers/System/SysRoleController.cs | 6 +- .../Controllers/System/SysUserController.cs | 8 +-- .../Controllers/System/TasksLogController.cs | 2 +- .../System/monitor/MonitorController.cs | 4 +- .../System/monitor/SysOperlogController.cs | 6 +- 12 files changed, 66 insertions(+), 63 deletions(-) diff --git a/Infrastructure/CustomException/ResultCode.cs b/Infrastructure/CustomException/ResultCode.cs index b8296e7..58739e4 100644 --- a/Infrastructure/CustomException/ResultCode.cs +++ b/Infrastructure/CustomException/ResultCode.cs @@ -7,7 +7,7 @@ namespace Infrastructure [Description("success")] SUCCESS = 200, - [Description("no data")] + [Description("没有更多数据")] NO_DATA = 210, [Description("参数错误")] diff --git a/Infrastructure/Extensions/Extension.Enum.cs b/Infrastructure/Extensions/Extension.Enum.cs index 72710ff..ea8f6af 100644 --- a/Infrastructure/Extensions/Extension.Enum.cs +++ b/Infrastructure/Extensions/Extension.Enum.cs @@ -1,11 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel; -using System.Linq; using System.Reflection; -using System.Text; -using System.Threading.Tasks; -//using Newtonsoft.Json; namespace Infrastructure.Extensions { diff --git a/Infrastructure/Model/ApiResult.cs b/Infrastructure/Model/ApiResult.cs index d322029..cc72c73 100644 --- a/Infrastructure/Model/ApiResult.cs +++ b/Infrastructure/Model/ApiResult.cs @@ -57,12 +57,12 @@ namespace Infrastructure.Model return this; } - /// - /// 返回成功消息 - /// - /// 数据对象 - /// 成功消息 - public static ApiResult Success(object data) { return new ApiResult(HttpStatus.SUCCESS, "success", data); } + ///// + ///// 返回成功消息 + ///// + ///// 数据对象 + ///// < returns > 成功消息 + //public static ApiResult Success(object data) { return new ApiResult(HttpStatus.SUCCESS, "success", data); } /// /// 返回成功消息 @@ -82,7 +82,6 @@ namespace Infrastructure.Model /// /// 访问被拒 /// - /// /// public ApiResult On401() { diff --git a/ZR.Admin.WebApi/Controllers/BaseController.cs b/ZR.Admin.WebApi/Controllers/BaseController.cs index 54652d8..5311026 100644 --- a/ZR.Admin.WebApi/Controllers/BaseController.cs +++ b/ZR.Admin.WebApi/Controllers/BaseController.cs @@ -1,4 +1,5 @@ using Infrastructure; +using Infrastructure.Extensions; using Infrastructure.Model; using Microsoft.AspNetCore.Mvc; using MiniExcelLibs; @@ -12,7 +13,7 @@ namespace ZR.Admin.WebApi.Controllers public class BaseController : ControllerBase { public static string TIME_FORMAT_FULL = "yyyy-MM-dd HH:mm:ss"; - + /// /// 返回成功封装 /// @@ -29,11 +30,10 @@ namespace ZR.Admin.WebApi.Controllers /// json输出带时间格式的 /// /// - /// /// - protected IActionResult ToResponse(ApiResult apiResult, string timeFormatStr = "yyyy-MM-dd HH:mm:ss") + protected IActionResult ToResponse(ApiResult apiResult) { - string jsonStr = GetJsonStr(apiResult, timeFormatStr); + string jsonStr = GetJsonStr(apiResult, TIME_FORMAT_FULL); return Content(jsonStr, "application/json"); } @@ -47,7 +47,7 @@ namespace ZR.Admin.WebApi.Controllers protected IActionResult ToResponse(ResultCode resultCode, string msg = "") { - return ToResponse(GetApiResult(resultCode, msg)); + return ToResponse(new ApiResult((int)resultCode, msg)); } /// @@ -61,26 +61,25 @@ namespace ZR.Admin.WebApi.Controllers //IWebHostEnvironment webHostEnvironment = (IWebHostEnvironment)App.ServiceProvider.GetService(typeof(IWebHostEnvironment)); //string fileDir = Path.Combine(webHostEnvironment.WebRootPath, path, fileName); - Response.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition"); var stream = Io.File.OpenRead(path); //创建文件流 + + Response.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition"); return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", HttpUtility.UrlEncode(fileName)); } - + #region 方法 /// /// 响应返回结果 /// /// 受影响行数 + /// /// - protected ApiResult ToJson(long rows) + protected ApiResult ToJson(long rows, object? data = null) { - return rows > 0 ? GetApiResult(ResultCode.SUCCESS) : GetApiResult(ResultCode.FAIL); - } - protected ApiResult ToJson(long rows, object data) - { - return rows > 0 ? GetApiResult(ResultCode.SUCCESS, data) : GetApiResult(ResultCode.FAIL); + return rows > 0 ? ApiResult.Success("success", data) : GetApiResult(ResultCode.FAIL); } + /// /// 全局Code使用 /// @@ -89,17 +88,17 @@ namespace ZR.Admin.WebApi.Controllers /// protected ApiResult GetApiResult(ResultCode resultCode, object? data = null) { - var apiResult = new ApiResult((int)resultCode, resultCode.ToString()) - { - Data = data - }; + var msg = resultCode.GetDescription(); - return apiResult; - } - protected ApiResult GetApiResult(ResultCode resultCode, string msg) - { - return new ApiResult((int)resultCode, msg); + return new ApiResult((int)resultCode, msg, data); } + + /// + /// + /// + /// + /// + /// private static string GetJsonStr(ApiResult apiResult, string timeFormatStr) { if (string.IsNullOrEmpty(timeFormatStr)) @@ -129,12 +128,20 @@ namespace ZR.Admin.WebApi.Controllers return ExportExcelMini(list, sheetName, fileName).Item1; } + /// + /// + /// + /// + /// + /// + /// + /// protected (string, string) ExportExcelMini(List list, string sheetName, string fileName) { IWebHostEnvironment webHostEnvironment = (IWebHostEnvironment)App.ServiceProvider.GetService(typeof(IWebHostEnvironment)); string sFileName = $"{fileName}{DateTime.Now:MM-dd-HHmmss}.xlsx"; string fullPath = Path.Combine(webHostEnvironment.WebRootPath, "export", sFileName); - + Directory.CreateDirectory(Path.GetDirectoryName(fullPath)); MiniExcel.SaveAs(fullPath, list, sheetName: sheetName); @@ -172,7 +179,7 @@ namespace ZR.Admin.WebApi.Controllers IWebHostEnvironment webHostEnvironment = (IWebHostEnvironment)App.ServiceProvider.GetService(typeof(IWebHostEnvironment)); string sFileName = $"{fileName}模板.xlsx"; string newFileName = Path.Combine(webHostEnvironment.WebRootPath, "ImportTemplate", sFileName); - + if (!Directory.Exists(newFileName)) { Directory.CreateDirectory(Path.GetDirectoryName(newFileName)); diff --git a/ZR.Admin.WebApi/Controllers/System/SysDeptController.cs b/ZR.Admin.WebApi/Controllers/System/SysDeptController.cs index 61ea218..e762c8b 100644 --- a/ZR.Admin.WebApi/Controllers/System/SysDeptController.cs +++ b/ZR.Admin.WebApi/Controllers/System/SysDeptController.cs @@ -3,6 +3,7 @@ using Infrastructure.Attribute; using Infrastructure.Enums; using Microsoft.AspNetCore.Mvc; using System.Collections; +using ZR.Admin.WebApi.Extensions; using ZR.Admin.WebApi.Filters; using ZR.Common; using ZR.Model.System; @@ -114,10 +115,10 @@ namespace ZR.Admin.WebApi.Controllers.System { if (UserConstants.NOT_UNIQUE.Equals(DeptService.CheckDeptNameUnique(dept))) { - return ToResponse(GetApiResult(ResultCode.CUSTOM_ERROR, $"新增部门{dept.DeptName}失败,部门名称已存在")); + return ToResponse(ResultCode.CUSTOM_ERROR, $"新增部门{dept.DeptName}失败,部门名称已存在"); } - dept.Create_by = User.Identity.Name; - return ToResponse(ToJson(DeptService.InsertDept(dept))); + dept.Create_by = HttpContext.GetName(); + return ToResponse(DeptService.InsertDept(dept)); } /// @@ -132,14 +133,14 @@ namespace ZR.Admin.WebApi.Controllers.System { if (UserConstants.NOT_UNIQUE.Equals(DeptService.CheckDeptNameUnique(dept))) { - return ToResponse(GetApiResult(ResultCode.CUSTOM_ERROR, $"修改部门{dept.DeptName}失败,部门名称已存在")); + return ToResponse(ResultCode.CUSTOM_ERROR, $"修改部门{dept.DeptName}失败,部门名称已存在"); } else if (dept.ParentId.Equals(dept.DeptId)) { - return ToResponse(GetApiResult(ResultCode.CUSTOM_ERROR, $"修改部门{dept.DeptName}失败,上级部门不能是自己")); + return ToResponse(ResultCode.CUSTOM_ERROR, $"修改部门{dept.DeptName}失败,上级部门不能是自己"); } - dept.Update_by = User.Identity.Name; - return ToResponse(ToJson(DeptService.UpdateDept(dept))); + dept.Update_by = HttpContext.GetName(); + return ToResponse(DeptService.UpdateDept(dept)); } /// @@ -153,11 +154,11 @@ namespace ZR.Admin.WebApi.Controllers.System { if (DeptService.Queryable().Count(it => it.ParentId == deptId && it.DelFlag == "0") > 0) { - return ToResponse(GetApiResult(ResultCode.CUSTOM_ERROR, $"存在下级部门,不允许删除")); + return ToResponse(ResultCode.CUSTOM_ERROR, $"存在下级部门,不允许删除"); } if (UserService.Queryable().Count(it => it.DeptId == deptId && it.DelFlag == 0) > 0) { - return ToResponse(GetApiResult(ResultCode.CUSTOM_ERROR, $"部门存在用户,不允许删除")); + return ToResponse(ResultCode.CUSTOM_ERROR, $"部门存在用户,不允许删除"); } return SUCCESS(DeptService.Delete(deptId)); diff --git a/ZR.Admin.WebApi/Controllers/System/SysLoginController.cs b/ZR.Admin.WebApi/Controllers/System/SysLoginController.cs index bb8c8d4..7fb5dc8 100644 --- a/ZR.Admin.WebApi/Controllers/System/SysLoginController.cs +++ b/ZR.Admin.WebApi/Controllers/System/SysLoginController.cs @@ -140,7 +140,7 @@ namespace ZR.Admin.WebApi.Controllers.System long uid = HttpContext.GetUId(); var menus = sysMenuService.SelectMenuTreeByUserId(uid); - return ToResponse(ToJson(1, sysMenuService.BuildMenus(menus))); + return SUCCESS(sysMenuService.BuildMenus(menus)); } /// @@ -148,7 +148,7 @@ namespace ZR.Admin.WebApi.Controllers.System /// /// [HttpGet("captchaImage")] - public ApiResult CaptchaImage() + public IActionResult CaptchaImage() { string uuid = Guid.NewGuid().ToString().Replace("-", ""); @@ -157,7 +157,7 @@ namespace ZR.Admin.WebApi.Controllers.System var info = SecurityCodeHelper.Generate(uuid, 60); var obj = new { captchaOff, uuid, img = info.Base64 };// File(stream, "image/png") - return ToJson(1, obj); + return SUCCESS(obj); } /// diff --git a/ZR.Admin.WebApi/Controllers/System/SysPostController.cs b/ZR.Admin.WebApi/Controllers/System/SysPostController.cs index 49f1b1a..f9820fd 100644 --- a/ZR.Admin.WebApi/Controllers/System/SysPostController.cs +++ b/ZR.Admin.WebApi/Controllers/System/SysPostController.cs @@ -73,7 +73,7 @@ namespace ZR.Admin.WebApi.Controllers.System } post.Create_by = HttpContext.GetName(); - return ToResponse(ToJson(PostService.Add(post))); + return ToResponse(PostService.Add(post)); } /// @@ -109,7 +109,7 @@ namespace ZR.Admin.WebApi.Controllers.System public IActionResult Delete(string id) { int[] ids = Tools.SpitIntArrary(id); - return ToResponse(ToJson(PostService.Delete(ids))); + return ToResponse(PostService.Delete(ids)); } /// diff --git a/ZR.Admin.WebApi/Controllers/System/SysRoleController.cs b/ZR.Admin.WebApi/Controllers/System/SysRoleController.cs index 7e3f7b8..40b1ab1 100644 --- a/ZR.Admin.WebApi/Controllers/System/SysRoleController.cs +++ b/ZR.Admin.WebApi/Controllers/System/SysRoleController.cs @@ -76,7 +76,7 @@ namespace ZR.Admin.WebApi.Controllers.System sysRoleDto.Create_by = HttpContext.GetName(); long roleId = sysRoleService.InsertRole(sysRoleDto); - return ToResponse(ToJson(roleId)); + return ToResponse(roleId); } /// @@ -145,7 +145,7 @@ namespace ZR.Admin.WebApi.Controllers.System long[] roleIds = Tools.SpitLongArrary(roleId); int result = sysRoleService.DeleteRoleByRoleId(roleIds); - return ToResponse(ToJson(result)); + return ToResponse(result); } /// @@ -161,7 +161,7 @@ namespace ZR.Admin.WebApi.Controllers.System sysRoleService.CheckRoleAllowed(roleDto); int result = sysRoleService.UpdateRoleStatus(roleDto); - return ToResponse(ToJson(result)); + return ToResponse(result); } /// diff --git a/ZR.Admin.WebApi/Controllers/System/SysUserController.cs b/ZR.Admin.WebApi/Controllers/System/SysUserController.cs index 7e3d0f7..dc64553 100644 --- a/ZR.Admin.WebApi/Controllers/System/SysUserController.cs +++ b/ZR.Admin.WebApi/Controllers/System/SysUserController.cs @@ -76,7 +76,7 @@ namespace ZR.Admin.WebApi.Controllers.System dic.Add("roleIds", sysUser.RoleIds); } - return ToResponse(ApiResult.Success(dic)); + return SUCCESS(dic); } /// @@ -132,7 +132,7 @@ namespace ZR.Admin.WebApi.Controllers.System if (user == null) { return ToResponse(ApiResult.Error(101, "请求参数错误")); } int result = UserService.ChangeUserStatus(user); - return ToResponse(ToJson(result)); + return ToResponse(result); } /// @@ -149,7 +149,7 @@ namespace ZR.Admin.WebApi.Controllers.System if (userid == 1) return ToResponse(Infrastructure.ResultCode.FAIL, "不能删除管理员账号"); int result = UserService.DeleteUser(userid); - return ToResponse(ToJson(result)); + return ToResponse(result); } /// @@ -165,7 +165,7 @@ namespace ZR.Admin.WebApi.Controllers.System sysUser.Password = NETCore.Encrypt.EncryptProvider.Md5(sysUser.Password); int result = UserService.ResetPwd(sysUser.UserId, sysUser.Password); - return ToResponse(ToJson(result)); + return ToResponse(result); } /// diff --git a/ZR.Admin.WebApi/Controllers/System/TasksLogController.cs b/ZR.Admin.WebApi/Controllers/System/TasksLogController.cs index aff3178..115db6b 100644 --- a/ZR.Admin.WebApi/Controllers/System/TasksLogController.cs +++ b/ZR.Admin.WebApi/Controllers/System/TasksLogController.cs @@ -64,7 +64,7 @@ namespace ZR.Admin.WebApi.Controllers.System int result = tasksLogService.Delete(jobIdArr); - return ToResponse(ToJson(result, result)); + return ToResponse(result); } /// diff --git a/ZR.Admin.WebApi/Controllers/System/monitor/MonitorController.cs b/ZR.Admin.WebApi/Controllers/System/monitor/MonitorController.cs index 5e82e09..4dc5009 100644 --- a/ZR.Admin.WebApi/Controllers/System/monitor/MonitorController.cs +++ b/ZR.Admin.WebApi/Controllers/System/monitor/MonitorController.cs @@ -30,9 +30,9 @@ namespace ZR.Admin.WebApi.Controllers.monitor /// /// [HttpGet("monitor/cache")] - public ApiResult GetCache() + public IActionResult GetCache() { - return ToJson(1); + return SUCCESS(1); } /// diff --git a/ZR.Admin.WebApi/Controllers/System/monitor/SysOperlogController.cs b/ZR.Admin.WebApi/Controllers/System/monitor/SysOperlogController.cs index 867d32b..a374833 100644 --- a/ZR.Admin.WebApi/Controllers/System/monitor/SysOperlogController.cs +++ b/ZR.Admin.WebApi/Controllers/System/monitor/SysOperlogController.cs @@ -65,15 +65,15 @@ namespace ZR.Admin.WebApi.Controllers.monitor [Log(Title = "清空操作日志", BusinessType = BusinessType.CLEAN)] [ActionPermissionFilter(Permission = "monitor:operlog:delete")] [HttpDelete("clean")] - public ApiResult ClearOperLog() + public IActionResult ClearOperLog() { if (!HttpContextExtension.IsAdmin(HttpContext)) { - return ApiResult.Error("操作失败"); + return ToResponse(Infrastructure.ResultCode.CUSTOM_ERROR,"操作失败"); } sysOperLogService.CleanOperLog(); - return ToJson(1); + return SUCCESS(1); } /// From e3517ec21c9e255ddd36b43da6abc414f9c023aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com> Date: Fri, 2 Jun 2023 20:08:47 +0800 Subject: [PATCH 06/27] =?UTF-8?q?:zap:=20=E4=BC=98=E5=8C=96=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=AE=A1=E7=90=86=E6=A0=B9=E6=8D=AE=E9=83=A8=E9=97=A8?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ZR.Service/System/SysUserService.cs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/ZR.Service/System/SysUserService.cs b/ZR.Service/System/SysUserService.cs index 959bfbe..c8d8175 100644 --- a/ZR.Service/System/SysUserService.cs +++ b/ZR.Service/System/SysUserService.cs @@ -51,15 +51,9 @@ namespace ZR.Service if (user.DeptId != 0) { - List depts = Context.Queryable().ToList(); + var allChildDepts = Context.Queryable().ToChildList(it => it.ParentId, user.DeptId); - var newDepts = depts.FindAll(delegate (SysDept dept) - { - string[] parentDeptId = dept.Ancestors.Split(",", StringSplitOptions.RemoveEmptyEntries); - return parentDeptId.Contains(user.DeptId.ToString()); - }); - string[] deptArr = newDepts.Select(x => x.DeptId.ToString()).ToArray(); - exp.AndIF(user.DeptId != 0, u => u.DeptId == user.DeptId || deptArr.Contains(u.DeptId.ToString())); + exp.And(u => allChildDepts.Select(f => f.DeptId).ToList().Contains(u.DeptId)); } var query = Queryable() .LeftJoin((u, dept) => u.DeptId == dept.DeptId) From 2e39825b5c745697c192b67acc9e2caaac6b4709 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com> Date: Fri, 2 Jun 2023 20:09:20 +0800 Subject: [PATCH 07/27] =?UTF-8?q?:zap:=20=E7=A7=BB=E9=99=A4=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E4=BB=93=E5=BA=93=E4=B8=8D=E5=B8=B8=E7=94=A8=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ZR.Repository/BaseRepository.cs | 61 +++++++++++--------------------- ZR.Repository/IBaseRepository.cs | 6 ---- 2 files changed, 20 insertions(+), 47 deletions(-) diff --git a/ZR.Repository/BaseRepository.cs b/ZR.Repository/BaseRepository.cs index 36a8559..bba484f 100644 --- a/ZR.Repository/BaseRepository.cs +++ b/ZR.Repository/BaseRepository.cs @@ -12,7 +12,7 @@ using ZR.Model; namespace ZR.Repository { /// - /// + /// 数据仓库类 /// /// public class BaseRepository : SimpleClient where T : class, new() @@ -79,7 +79,7 @@ namespace ZR.Repository /// /// 实体根据主键更新指定字段 - /// return Update(user, t => new { t.NickName, }, true); + /// return Update(new SysUser(){ Status = 1 }, t => new { t.NickName, }, true); /// /// /// @@ -91,12 +91,12 @@ namespace ZR.Repository } /// - /// 根据指定条件更新指定列 eg:Update(new SysUser(){ }, it => new { it.Status }, f => f.Userid == 1)); + /// 根据指定条件更新指定列 eg:Update(new SysUser(){ Status = 1 }, it => new { it.Status }, f => f.Userid == 1)); /// 只更新Status列,条件是包含 /// - /// - /// - /// + /// 实体类 + /// 要更新列的表达式 + /// where表达式 /// public int Update(T entity, Expression> expression, Expression> where) { @@ -117,14 +117,11 @@ namespace ZR.Repository /// public int Update(T entity, List list = null, bool isNull = true) { - if (list == null) - { - list = new List() + list ??= new List() { "Create_By", "Create_time" }; - } return Context.Updateable(entity).IgnoreColumns(isNull).IgnoreColumns(list.ToArray()).ExecuteCommand(); } @@ -239,36 +236,6 @@ namespace ZR.Repository return Context.Queryable(); } - public (List, int) QueryableToPage(Expression> expression, int pageIndex = 0, int pageSize = 10) - { - int totalNumber = 0; - var list = Context.Queryable().Where(expression).ToPageList(pageIndex, pageSize, ref totalNumber); - return (list, totalNumber); - } - - public (List, int) QueryableToPage(Expression> expression, string order, int pageIndex = 0, int pageSize = 10) - { - int totalNumber = 0; - var list = Context.Queryable().Where(expression).OrderBy(order).ToPageList(pageIndex, pageSize, ref totalNumber); - return (list, totalNumber); - } - - public (List, int) QueryableToPage(Expression> expression, Expression> orderFiled, string orderBy, int pageIndex = 0, int pageSize = 10) - { - int totalNumber = 0; - - if (orderBy.Equals("DESC", StringComparison.OrdinalIgnoreCase)) - { - var list = Context.Queryable().Where(expression).OrderBy(orderFiled, OrderByType.Desc).ToPageList(pageIndex, pageSize, ref totalNumber); - return (list, totalNumber); - } - else - { - var list = Context.Queryable().Where(expression).OrderBy(orderFiled, OrderByType.Asc).ToPageList(pageIndex, pageSize, ref totalNumber); - return (list, totalNumber); - } - } - public List SqlQueryToList(string sql, object obj = null) { return Context.Ado.SqlQuery(sql, obj); @@ -296,9 +263,21 @@ namespace ZR.Repository return source.ToPage(parm); } + /// + /// 分页获取数据 + /// + /// 条件表达式 + /// + /// + /// + /// public PagedInfo GetPages(Expression> where, PagerInfo parm, Expression> order, OrderByType orderEnum = OrderByType.Asc) { - var source = Context.Queryable().Where(where).OrderByIF(orderEnum == OrderByType.Asc, order, OrderByType.Asc).OrderByIF(orderEnum == OrderByType.Desc, order, OrderByType.Desc); + var source = Context + .Queryable() + .Where(where) + .OrderByIF(orderEnum == OrderByType.Asc, order, OrderByType.Asc) + .OrderByIF(orderEnum == OrderByType.Desc, order, OrderByType.Desc); return source.ToPage(parm); } diff --git a/ZR.Repository/IBaseRepository.cs b/ZR.Repository/IBaseRepository.cs index 640612f..a1b4f66 100644 --- a/ZR.Repository/IBaseRepository.cs +++ b/ZR.Repository/IBaseRepository.cs @@ -71,12 +71,6 @@ namespace ZR.Repository ISugarQueryable Queryable(); List GetAll(bool useCache = false, int cacheSecond = 3600); - (List, int) QueryableToPage(Expression> expression, int pageIndex = 0, int pageSize = 10); - - (List, int) QueryableToPage(Expression> expression, string order, int pageIndex = 0, int pageSize = 10); - - (List, int) QueryableToPage(Expression> expression, Expression> orderFiled, string orderBy, int pageIndex = 0, int pageSize = 10); - List SqlQueryToList(string sql, object obj = null); T GetId(object pkValue); From cdd4b42f0a08e63e94250ec06a6aa9672a82efa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com> Date: Sun, 4 Jun 2023 16:43:35 +0800 Subject: [PATCH 08/27] =?UTF-8?q?:zap:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E3=80=81=E6=95=B0=E6=8D=AE=E5=BA=93=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E4=B8=B2=E8=BF=9E=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Infrastructure/OptionsSetting.cs | 10 +++ .../System/SysProfileController.cs | 5 -- ZR.Admin.WebApi/Extensions/DbExtension.cs | 83 ++++++++++++++----- ZR.Admin.WebApi/Extensions/TasksExtension.cs | 11 +-- ZR.Admin.WebApi/appsettings.json | 16 ++-- ZR.Repository/BaseRepository.cs | 6 ++ ZR.Service/System/SysUserService.cs | 4 + 7 files changed, 98 insertions(+), 37 deletions(-) diff --git a/Infrastructure/OptionsSetting.cs b/Infrastructure/OptionsSetting.cs index 1698580..4f7a9dc 100644 --- a/Infrastructure/OptionsSetting.cs +++ b/Infrastructure/OptionsSetting.cs @@ -1,4 +1,6 @@  +using System.Collections.Generic; + namespace Infrastructure { /// @@ -15,6 +17,7 @@ namespace Infrastructure public ALIYUN_OSS ALIYUN_OSS { get; set; } public JwtSettings JwtSettings { get; set; } public Gen Gen { get; set; } + public List DbConfigs { get; set; } } /// /// 发送邮件数据配置 @@ -81,4 +84,11 @@ namespace Infrastructure } + public class DbConfigs + { + public string Conn { get; set; } + public int DbType { get; set; } + public string ConfigId { get; set; } + public bool IsAutoCloseConnection { get; set; } + } } diff --git a/ZR.Admin.WebApi/Controllers/System/SysProfileController.cs b/ZR.Admin.WebApi/Controllers/System/SysProfileController.cs index c68be2d..875538b 100644 --- a/ZR.Admin.WebApi/Controllers/System/SysProfileController.cs +++ b/ZR.Admin.WebApi/Controllers/System/SysProfileController.cs @@ -3,12 +3,7 @@ using Infrastructure.Attribute; using Infrastructure.Enums; using Infrastructure.Model; using Mapster; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Options; -using System; -using System.Threading.Tasks; using ZR.Admin.WebApi.Extensions; using ZR.Admin.WebApi.Filters; using ZR.Model.System; diff --git a/ZR.Admin.WebApi/Extensions/DbExtension.cs b/ZR.Admin.WebApi/Extensions/DbExtension.cs index 1e2d7d6..006375f 100644 --- a/ZR.Admin.WebApi/Extensions/DbExtension.cs +++ b/ZR.Admin.WebApi/Extensions/DbExtension.cs @@ -22,31 +22,36 @@ namespace ZR.Admin.WebApi.Extensions //仅本人数据权限 public static long DATA_SCOPE_SELF = 5; + /// + /// 初始化db + /// + /// public static void AddDb(IConfiguration Configuration) { - string connStr = Configuration.GetConnectionString("conn_db"); - int dbType = Convert.ToInt32(Configuration.GetConnectionString("conn_db_type")); + List dbConfigs = Configuration.GetSection("DbConfigs").Get>(); - var iocList = new List() { - new IocConfig() { - ConfigId = "0",//默认db - ConnectionString = connStr, - DbType = (IocDbType)dbType, - IsAutoCloseConnection = true - }, - new IocConfig() { - ConfigId = "1", - ConnectionString = connStr, - DbType = (IocDbType)dbType, - IsAutoCloseConnection = true - } - }; + var iocList = new List(); + foreach (var item in dbConfigs) + { + iocList.Add(new IocConfig() + { + ConfigId = item.ConfigId, + ConnectionString = item.Conn, + DbType = (IocDbType)item.DbType, + IsAutoCloseConnection = item.IsAutoCloseConnection + }); + } SugarIocServices.AddSqlSugar(iocList); ICacheService cache = new SqlSugarCache(); SugarIocServices.ConfigurationSugar(db => { - //db0数据过滤 - FilterData(0); + var u = App.User; + if (u != null) + { + FilterData(0); + //ConfigId = 1的数据权限过滤 + //FilterData1(1); + } iocList.ForEach(iocConfig => { @@ -55,6 +60,12 @@ namespace ZR.Admin.WebApi.Extensions }); } + /// + /// 数据库Aop设置 + /// + /// + /// + /// private static void SetSugarAop(SqlSugarClient db, IocConfig iocConfig, ICacheService cache) { var config = db.GetConnection(iocConfig.ConfigId).CurrentConnectionConfig; @@ -108,7 +119,7 @@ namespace ZR.Admin.WebApi.Extensions } /// - /// 初始化db + /// 创建db、表 /// /// public static void InitDb(this IServiceProvider service) @@ -137,8 +148,6 @@ namespace ZR.Admin.WebApi.Extensions /// 多库id private static void FilterData(int configId) { - var u = App.User; - if (u == null) return; //获取当前用户的信息 var user = JwtUtil.GetLoginUser(App.HttpContext); if (user == null) return; @@ -159,7 +168,7 @@ namespace ZR.Admin.WebApi.Extensions else if (DATA_SCOPE_CUSTOM.Equals(dataScope))//自定数据权限 { //" OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias, role.getRoleId())); - + expUser.Or(it => SqlFunc.Subqueryable().Where(f => f.DeptId == it.DeptId && f.RoleId == role.RoleId).Any()); } else if (DATA_SCOPE_DEPT.Equals(dataScope))//本部门数据 @@ -184,5 +193,35 @@ namespace ZR.Admin.WebApi.Extensions db.QueryFilter.AddTableFilter(expLoginlog.ToExpression()); } } + + private static void FilterData1(int configId) + { + //获取当前用户的信息 + var user = JwtUtil.GetLoginUser(App.HttpContext); + if (user == null) return; + var db = DbScoped.SugarScope.GetConnectionScope(configId); + + foreach (var role in user.Roles.OrderBy(f => f.DataScope)) + { + long dataScope = role.DataScope; + if (DATA_SCOPE_ALL.Equals(dataScope))//所有权限 + { + break; + } + else if (DATA_SCOPE_CUSTOM.Equals(dataScope))//自定数据权限 + { + } + else if (DATA_SCOPE_DEPT.Equals(dataScope))//本部门数据 + { + } + else if (DATA_SCOPE_DEPT_AND_CHILD.Equals(dataScope))//本部门及以下数据 + { + + } + else if (DATA_SCOPE_SELF.Equals(dataScope))//仅本人数据 + { + } + } + } } } diff --git a/ZR.Admin.WebApi/Extensions/TasksExtension.cs b/ZR.Admin.WebApi/Extensions/TasksExtension.cs index e39c620..8f890cc 100644 --- a/ZR.Admin.WebApi/Extensions/TasksExtension.cs +++ b/ZR.Admin.WebApi/Extensions/TasksExtension.cs @@ -1,8 +1,4 @@ -using Infrastructure; -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; -using Quartz.Spi; -using System; +using Quartz.Spi; using ZR.Tasks; namespace ZR.Admin.WebApi.Extensions @@ -12,6 +8,11 @@ namespace ZR.Admin.WebApi.Extensions /// public static class TasksExtension { + /// + /// 注册任务 + /// + /// + /// public static void AddTaskSchedulers(this IServiceCollection services) { if (services == null) throw new ArgumentNullException(nameof(services)); diff --git a/ZR.Admin.WebApi/appsettings.json b/ZR.Admin.WebApi/appsettings.json index ee9155d..5fbd07b 100644 --- a/ZR.Admin.WebApi/appsettings.json +++ b/ZR.Admin.WebApi/appsettings.json @@ -6,10 +6,15 @@ "Microsoft.Hosting.Lifetime": "Information" } }, - "ConnectionStrings": { - "conn_db": "Data Source=LAPTOP-STKF2M8H\\SQLEXPRESS;User ID=admin;Password=admin123;Initial Catalog=ZrAdmin;", //其他连接字符串请看官方文档 - "conn_db_type": "1" //数据库类型 MySql = 0, SqlServer = 1, Oracle = 3,PgSql = 4 - }, + "dbConfigs": [ + { + "Conn": "Data Source=LAPTOP-STKF2M8H\\SQLEXPRESS;User ID=admin;Password=admin123;Initial Catalog=ZrAdmin;", + "DbType": 1, //数据库类型 MySql = 0, SqlServer = 1, Oracle = 3,PgSql = 4 + "ConfigId": "0", //多租户唯一标识 + "IsAutoCloseConnection": true + } + //...下面添加更多的数据库源 + ], "urls": "http://localhost:8888", //项目启动url,如果改动端口前端对应devServer也需要进行修改 "corsUrls": "http://localhost:8887", //跨域地址(前端启动项目,前后端分离单独部署需要设置),多个用","隔开 "JwtSettings": { @@ -18,7 +23,7 @@ "SecretKey": "SecretKey-ZRADMIN.NET-20210101", "Expire": 1440 //jwt登录过期时间(分) }, - "InjectClass": [ "ZR.Repository", "ZR.Service", "ZR.Tasks" ],//自动注入类 + "InjectClass": [ "ZR.Repository", "ZR.Service", "ZR.Tasks" ], //自动注入类 "InitDb": false, //是否初始化db "DemoMode": false, //是否演示模式 "Upload": { @@ -43,6 +48,7 @@ "CorpSecret": "", "SendUser": "@all" }, + //代码生成配置 "gen": { "conn": "Data Source=LAPTOP-STKF2M8H\\SQLEXPRESS;User ID=admin;Password=admin123;Initial Catalog=ZrAdmin;", "dbType": 1, //MySql = 0, SqlServer = 1 diff --git a/ZR.Repository/BaseRepository.cs b/ZR.Repository/BaseRepository.cs index bba484f..30a4a4b 100644 --- a/ZR.Repository/BaseRepository.cs +++ b/ZR.Repository/BaseRepository.cs @@ -168,6 +168,7 @@ namespace ZR.Repository { return Context.Storageable(t); } + /// /// /// @@ -189,6 +190,11 @@ namespace ZR.Repository } } + /// + /// 使用事务 + /// + /// + /// public bool UseTran2(Action action) { var result = Context.Ado.UseTran(() => action()); diff --git a/ZR.Service/System/SysUserService.cs b/ZR.Service/System/SysUserService.cs index c8d8175..47b900a 100644 --- a/ZR.Service/System/SysUserService.cs +++ b/ZR.Service/System/SysUserService.cs @@ -217,6 +217,10 @@ namespace ZR.Service { throw new CustomException("密码强度不符合要求"); } + if (!Tools.CheckUserName(dto.Username)) + { + throw new CustomException("用户名不符合要求"); + } //密码md5 string password = NETCore.Encrypt.EncryptProvider.Md5(dto.Password); From ac38886f603425704fccdc2d11f1a961e749952f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com> Date: Sun, 4 Jun 2023 20:38:47 +0800 Subject: [PATCH 09/27] =?UTF-8?q?:sparkles:=20=E4=BB=A3=E7=A0=81=E7=94=9F?= =?UTF-8?q?=E6=88=90=E8=87=AA=E5=8A=A8=E6=B7=BB=E5=8A=A0=E8=8F=9C=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../System/CodeGeneratorController.cs | 14 ++- ZR.CodeGenerator/CodeGeneratorTool.cs | 2 +- ZR.CodeGenerator/Model/GenerateDto.cs | 1 + ZR.Model/System/Generate/GenTable.cs | 4 + ZR.Service/System/IService/ISysMenuService.cs | 3 + ZR.Service/System/SysMenuService.cs | 111 ++++++++++++++++++ 6 files changed, 130 insertions(+), 5 deletions(-) diff --git a/ZR.Admin.WebApi/Controllers/System/CodeGeneratorController.cs b/ZR.Admin.WebApi/Controllers/System/CodeGeneratorController.cs index ec6384c..0c65c48 100644 --- a/ZR.Admin.WebApi/Controllers/System/CodeGeneratorController.cs +++ b/ZR.Admin.WebApi/Controllers/System/CodeGeneratorController.cs @@ -12,6 +12,7 @@ using ZR.CodeGenerator.Model; using ZR.CodeGenerator.Service; using ZR.Common; using ZR.Model; +using ZR.Model.System; using ZR.Model.System.Dto; using ZR.Model.System.Generate; using ZR.Service.System.IService; @@ -28,16 +29,18 @@ namespace ZR.Admin.WebApi.Controllers private readonly CodeGeneraterService _CodeGeneraterService = new CodeGeneraterService(); private readonly IGenTableService GenTableService; private readonly IGenTableColumnService GenTableColumnService; - + private readonly ISysMenuService SysMenuService; private readonly IWebHostEnvironment WebHostEnvironment; public CodeGeneratorController( IGenTableService genTableService, IGenTableColumnService genTableColumnService, - IWebHostEnvironment webHostEnvironment) + IWebHostEnvironment webHostEnvironment, + ISysMenuService sysMenuService) { GenTableService = genTableService; GenTableColumnService = genTableColumnService; WebHostEnvironment = webHostEnvironment; + SysMenuService = sysMenuService; } /// @@ -257,7 +260,7 @@ namespace ZR.Admin.WebApi.Controllers dto.GenTable = genTableInfo; //自定义路径 if (genTableInfo.GenType == "1") - { + { string tempPath = WebHostEnvironment.ContentRootPath; var parentPath = tempPath[..tempPath.LastIndexOf(@"\")]; //代码生成文件夹路径 @@ -275,7 +278,10 @@ namespace ZR.Admin.WebApi.Controllers CodeGeneratorTool.Generate(dto); //下载文件 FileUtil.ZipGenCode(dto.ZipPath, dto.GenCodePath, zipReturnFileName); - + if (genTableInfo.Options.GenerateMenu) + { + SysMenuService.AddSysMenu(genTableInfo, dto.ReplaceDto.PermissionPrefix, dto.ReplaceDto.ShowBtnEdit, dto.ReplaceDto.ShowBtnExport); + } return SUCCESS(new { path = "/Generatecode/" + zipReturnFileName, fileName = dto.ZipFileName }); } diff --git a/ZR.CodeGenerator/CodeGeneratorTool.cs b/ZR.CodeGenerator/CodeGeneratorTool.cs index cf74cb4..091c937 100644 --- a/ZR.CodeGenerator/CodeGeneratorTool.cs +++ b/ZR.CodeGenerator/CodeGeneratorTool.cs @@ -79,7 +79,7 @@ namespace ZR.CodeGenerator } GenerateVueJs(dto); GenerateSql(dto); - + dto.ReplaceDto = replaceDto; if (dto.IsPreview) return; foreach (var item in dto.GenCodes) diff --git a/ZR.CodeGenerator/Model/GenerateDto.cs b/ZR.CodeGenerator/Model/GenerateDto.cs index 47fb4ba..ab35089 100644 --- a/ZR.CodeGenerator/Model/GenerateDto.cs +++ b/ZR.CodeGenerator/Model/GenerateDto.cs @@ -58,6 +58,7 @@ namespace ZR.CodeGenerator.Model /// public string VueParentPath { get; set; } #endregion + public ReplaceDto ReplaceDto { get; set; } } public class GenCode diff --git a/ZR.Model/System/Generate/GenTable.cs b/ZR.Model/System/Generate/GenTable.cs index cde1f43..d62734a 100644 --- a/ZR.Model/System/Generate/GenTable.cs +++ b/ZR.Model/System/Generate/GenTable.cs @@ -107,5 +107,9 @@ namespace ZR.Model.System.Generate /// 是否生成仓储层 /// public int GenerateRepo { get; set; } + /// + /// 自动生成菜单 + /// + public bool GenerateMenu { get; set; } } } diff --git a/ZR.Service/System/IService/ISysMenuService.cs b/ZR.Service/System/IService/ISysMenuService.cs index 2eb3abc..367d646 100644 --- a/ZR.Service/System/IService/ISysMenuService.cs +++ b/ZR.Service/System/IService/ISysMenuService.cs @@ -2,6 +2,7 @@ using ZR.Model.System.Dto; using ZR.Model.System; using ZR.Model.System.Vo; +using ZR.Model.System.Generate; namespace ZR.Service.System.IService { @@ -37,6 +38,8 @@ namespace ZR.Service.System.IService List BuildMenus(List menus); List BuildMenuTreeSelect(List menus); + + void AddSysMenu(GenTable genTableInfo, string permPrefix, bool showEdit, bool showExport); } /// diff --git a/ZR.Service/System/SysMenuService.cs b/ZR.Service/System/SysMenuService.cs index 54b963b..62aecb3 100644 --- a/ZR.Service/System/SysMenuService.cs +++ b/ZR.Service/System/SysMenuService.cs @@ -7,8 +7,10 @@ using System.Linq; using ZR.Common; using ZR.Model.System; using ZR.Model.System.Dto; +using ZR.Model.System.Generate; using ZR.Model.System.Vo; using ZR.Service.System.IService; +using static System.Runtime.InteropServices.JavaScript.JSType; namespace ZR.Service { @@ -561,5 +563,114 @@ namespace ZR.Service } #endregion + + public void AddSysMenu(GenTable genTableInfo, string permPrefix, bool showEdit, bool showExport) + { + var menu = GetFirst(f => f.MenuName == genTableInfo.FunctionName); + if (menu is null) + { + menu = new() + { + MenuName = genTableInfo.FunctionName, + ParentId = genTableInfo.Options.ParentMenuId, + OrderNum = 0, + Path = genTableInfo.BusinessName, + Component = $"{genTableInfo.ModuleName.FirstLowerCase()}/{genTableInfo.BusinessName}", + Perms = $"{permPrefix}:list", + IsFrame = "0", + IsCache = "1", + MenuType = "C", + Visible = "0", + Status = "0", + Icon = "icon1", + Create_by = "system", + }; + menu.MenuId = AddMenu(menu); + } + + List menuList = new(); + + SysMenu menuQuery = new() + { + MenuName = "查询", + ParentId = menu.MenuId, + OrderNum = 1, + Perms = $"{permPrefix}:query", + IsFrame = "0", + MenuType = "F", + Visible = "0", + Status = "0", + Icon = "", + }; + SysMenu menuAdd = new() + { + MenuName = "新增", + ParentId = menu.MenuId, + OrderNum = 2, + Perms = $"{permPrefix}:add", + IsFrame = "0", + MenuType = "F", + Visible = "0", + Status = "0", + Icon = "", + }; + SysMenu menuDel = new() + { + MenuName = "删除", + ParentId = menu.MenuId, + OrderNum = 3, + Perms = $"{permPrefix}:delete", + IsFrame = "0", + MenuType = "F", + Visible = "0", + Status = "0", + Icon = "", + }; + + SysMenu menuEdit = new() + { + MenuName = "修改", + ParentId = menu.MenuId, + OrderNum = 4, + Perms = $"{permPrefix}:edit", + IsFrame = "0", + MenuType = "F", + Visible = "0", + Status = "0", + Icon = "", + }; + + SysMenu menuExport = new() + { + MenuName = "导出", + ParentId = menu.MenuId, + OrderNum = 5, + Perms = $"{permPrefix}:export", + IsFrame = "0", + MenuType = "F", + Visible = "0", + Status = "0", + Icon = "", + }; + + menuList.Add(menuQuery); + menuList.Add(menuAdd); + menuList.Add(menuDel); + if (showEdit) + { + menuList.Add(menuEdit); + } + if (showExport) + { + menuList.Add(menuExport); + } + //Insert(menuList); + + var x = Storageable(menuList) + .WhereColumns(it => new { it.MenuName, it.ParentId }) + .ToStorage(); + x.AsInsertable.ExecuteCommand();//插入可插入部分; + x.AsUpdateable.ExecuteCommand(); + } } } From 88109db5a8d131b94b86fd36f3b686166c177c75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com> Date: Mon, 5 Jun 2023 20:44:53 +0800 Subject: [PATCH 10/27] =?UTF-8?q?:sparkles:=20=E5=BC=82=E5=B8=B8=E4=BC=81?= =?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E9=80=9A=E7=9F=A5=E6=96=B0=E5=A2=9E?= =?UTF-8?q?IP=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ZR.Admin.WebApi/Middleware/GlobalExceptionMiddleware.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ZR.Admin.WebApi/Middleware/GlobalExceptionMiddleware.cs b/ZR.Admin.WebApi/Middleware/GlobalExceptionMiddleware.cs index cc97354..3ee7baa 100644 --- a/ZR.Admin.WebApi/Middleware/GlobalExceptionMiddleware.cs +++ b/ZR.Admin.WebApi/Middleware/GlobalExceptionMiddleware.cs @@ -119,7 +119,8 @@ namespace ZR.Admin.WebApi.Middleware context.Response.ContentType = "text/json;charset=utf-8"; await context.Response.WriteAsync(responseResult, System.Text.Encoding.UTF8); - string errorMsg = $"> 操作人:{sysOperLog.OperName} {sysOperLog.OperLocation}" + + string errorMsg = $"> 操作人:{sysOperLog.OperName}" + + $"\n> 操作地区:{sysOperLog.OperIp}({sysOperLog.OperLocation})" + $"\n> 操作模块:{sysOperLog.Title}" + $"\n> 操作地址:{sysOperLog.OperUrl}" + $"\n> 错误信息:{msg}\n\n> {error}"; From 8f2cc923d9fa930e8bbe56127ca7932e32898d71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com> Date: Wed, 7 Jun 2023 13:41:42 +0800 Subject: [PATCH 11/27] =?UTF-8?q?:zap:=20=E9=82=AE=E4=BB=B6=E5=8F=91?= =?UTF-8?q?=E9=80=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Infrastructure/OptionsSetting.cs | 4 +- .../Controllers/CommonController.cs | 12 ++-- ZR.Admin.WebApi/Extensions/DbExtension.cs | 2 +- ZR.Admin.WebApi/appsettings.json | 8 ++- ZR.Common/MailHelper.cs | 66 +++++-------------- 5 files changed, 32 insertions(+), 60 deletions(-) diff --git a/Infrastructure/OptionsSetting.cs b/Infrastructure/OptionsSetting.cs index 4f7a9dc..5654154 100644 --- a/Infrastructure/OptionsSetting.cs +++ b/Infrastructure/OptionsSetting.cs @@ -24,10 +24,12 @@ namespace Infrastructure /// public class MailOptions { - public string From { get; set; } + public string FromName { get; set; } + public string FromEmail { get; set; } public string Password { get; set; } public string Smtp { get; set; } public int Port { get; set; } + public bool UseSsl { get; set; } public string Signature { get; set; } } /// diff --git a/ZR.Admin.WebApi/Controllers/CommonController.cs b/ZR.Admin.WebApi/Controllers/CommonController.cs index e2a5b67..253de7e 100644 --- a/ZR.Admin.WebApi/Controllers/CommonController.cs +++ b/ZR.Admin.WebApi/Controllers/CommonController.cs @@ -70,15 +70,15 @@ namespace ZR.Admin.WebApi.Controllers /// 请求参数接收实体 /// [ActionPermissionFilter(Permission = "tool:email:send")] - [Log(Title = "发送邮件", IsSaveRequestData = false)] + [Log(Title = "发送邮件")] [HttpPost] public IActionResult SendEmail([FromBody] SendEmailDto sendEmailVo) { - if (sendEmailVo == null || string.IsNullOrEmpty(sendEmailVo.Subject) || string.IsNullOrEmpty(sendEmailVo.ToUser)) + if (sendEmailVo == null) { return ToResponse(ApiResult.Error($"请求参数不完整")); } - if (string.IsNullOrEmpty(OptionsSetting.MailOptions.From) || string.IsNullOrEmpty(OptionsSetting.MailOptions.Password)) + if (string.IsNullOrEmpty(OptionsSetting.MailOptions.FromEmail) || string.IsNullOrEmpty(OptionsSetting.MailOptions.Password)) { return ToResponse(ApiResult.Error($"请配置邮箱信息")); } @@ -90,11 +90,11 @@ namespace ZR.Admin.WebApi.Controllers { toUsers.Append(mailHelper.FromEmail); } - mailHelper.SendMail(toUsers, sendEmailVo.Subject, sendEmailVo.Content, sendEmailVo.FileUrl, sendEmailVo.HtmlContent); + string result = mailHelper.SendMail(toUsers, sendEmailVo.Subject, sendEmailVo.Content, sendEmailVo.FileUrl, sendEmailVo.HtmlContent); - logger.Info($"发送邮件{JsonConvert.SerializeObject(sendEmailVo)}"); + logger.Info($"发送邮件{JsonConvert.SerializeObject(sendEmailVo)}, 结果{result}"); - return SUCCESS(true); + return SUCCESS(result); } #region 上传 diff --git a/ZR.Admin.WebApi/Extensions/DbExtension.cs b/ZR.Admin.WebApi/Extensions/DbExtension.cs index 006375f..ed3fb44 100644 --- a/ZR.Admin.WebApi/Extensions/DbExtension.cs +++ b/ZR.Admin.WebApi/Extensions/DbExtension.cs @@ -26,7 +26,7 @@ namespace ZR.Admin.WebApi.Extensions /// 初始化db /// /// - public static void AddDb(IConfiguration Configuration) + public static void AddDb(this IServiceCollection services, IConfiguration Configuration) { List dbConfigs = Configuration.GetSection("DbConfigs").Get>(); diff --git a/ZR.Admin.WebApi/appsettings.json b/ZR.Admin.WebApi/appsettings.json index 5fbd07b..c9aa223 100644 --- a/ZR.Admin.WebApi/appsettings.json +++ b/ZR.Admin.WebApi/appsettings.json @@ -18,8 +18,8 @@ "urls": "http://localhost:8888", //项目启动url,如果改动端口前端对应devServer也需要进行修改 "corsUrls": "http://localhost:8887", //跨域地址(前端启动项目,前后端分离单独部署需要设置),多个用","隔开 "JwtSettings": { - "Issuer": "ZRAdmin.NET", - "Audience": "ZRAdmin.NET", + "Issuer": "ZRAdmin.NET", //即token的签发者。 + "Audience": "ZRAdmin.NET", //指该token是服务于哪个群体的(群体范围) "SecretKey": "SecretKey-ZRADMIN.NET-20210101", "Expire": 1440 //jwt登录过期时间(分) }, @@ -60,8 +60,10 @@ }, //邮箱配置信息 "MailOptions": { + //发件人名称 + "FromName": "system", //发送人邮箱 - "From": "", //eg:xxxx@qq.com + "FromEmail": "", //eg:xxxx@qq.com //发送人邮箱密码 "Password": "123456", //协议 diff --git a/ZR.Common/MailHelper.cs b/ZR.Common/MailHelper.cs index f3984be..79b8b3d 100644 --- a/ZR.Common/MailHelper.cs +++ b/ZR.Common/MailHelper.cs @@ -14,50 +14,18 @@ namespace ZR.Common /// 发送人邮箱 /// public string FromEmail { get; set; } = ""; - /// - /// 发送人密码 - /// - public string FromPwd { get; set; } = ""; - /// - /// 发送协议 - /// - public string Smtp { get; set; } = "smtp.qq.com"; - /// - /// 协议端口 - /// - public int Port { get; set; } = 587; - /// - /// 邮件签名 - /// - public string Signature { get; set; } - /// - /// 是否使用SSL协议 - /// - public bool UseSsl { get; set; } = false; private readonly MailOptions mailOptions = new(); public MailHelper() { AppSettings.Bind("MailOptions", mailOptions); - FromEmail = mailOptions.From; - Smtp = mailOptions.Smtp; - FromPwd = mailOptions.Password; - Port = mailOptions.Port; + FromEmail= mailOptions.FromEmail; } - public MailHelper(string fromEmail, string smtp, int port, string fromPwd) + public MailHelper(MailOptions _mailOptions) { - FromEmail = fromEmail; - Smtp = smtp; - FromPwd = fromPwd; - Port = port; + this.mailOptions = _mailOptions; + FromEmail = _mailOptions.FromEmail; } - - public MailHelper(string fromEmail, string fromPwd) - { - FromEmail = fromEmail; - FromPwd = fromPwd; - } - /// /// 发送一个 /// @@ -65,13 +33,13 @@ namespace ZR.Common /// /// /// - public void SendMail(string toAddress, string subject, string text, string path = "", string html = "") + public string SendMail(string toAddress, string subject, string text, string path = "", string html = "") { IEnumerable mailboxes = new List() { new MailboxAddress(toAddress, toAddress) }; - SendMail(mailboxes, subject, text, path, html); + return SendMail(mailboxes, subject, text, path, html); } /// @@ -81,7 +49,7 @@ namespace ZR.Common /// /// /// - public void SendMail(string[] toAddress, string subject, string text, string path = "", string html = "") + public string SendMail(string[] toAddress, string subject, string text, string path = "", string html = "") { IList mailboxes = new List() { }; foreach (var item in toAddress) @@ -89,7 +57,7 @@ namespace ZR.Common mailboxes.Add(new MailboxAddress(item, item)); } - SendMail(mailboxes, subject, text, path, html); + return SendMail(mailboxes, subject, text, path, html); } /// @@ -100,16 +68,16 @@ namespace ZR.Common /// /// 附件url地址 /// 网页HTML内容 - private void SendMail(IEnumerable toAddress, string subject, string text, string path = "", string html = "") + private string SendMail(IEnumerable toAddress, string subject, string text, string path = "", string html = "") { MimeMessage message = new MimeMessage(); //发件人 - message.From.Add(new MailboxAddress(FromEmail, FromEmail)); + message.From.Add(new MailboxAddress(mailOptions.FromName, mailOptions.FromEmail)); //收件人 message.To.AddRange(toAddress); message.Subject = subject; message.Date = DateTime.Now; - + //创建附件Multipart Multipart multipart = new Multipart("mixed"); var alternative = new MultipartAlternative(); @@ -157,18 +125,18 @@ namespace ZR.Common //开始发送 using var client = new SmtpClient(); client.ServerCertificateValidationCallback = (s, c, h, e) => true; + //client.CheckCertificateRevocation = false; + client.Connect(mailOptions.Smtp, mailOptions.Port, mailOptions.UseSsl); - //Smtp服务器 - //client.Connect("smtp.qq.com", 587, false); - client.Connect(Smtp, Port, true); //登录,发送 //特别说明,对于服务器端的中文相应,Exception中有编码问题,显示乱码了 - client.Authenticate(FromEmail, FromPwd); + client.Authenticate(System.Text.Encoding.UTF8, mailOptions.FromEmail, mailOptions.Password); - client.Send(message); + var result = client.Send(message); //断开 client.Disconnect(true); - Console.WriteLine($"发送邮件成功{DateTime.Now}"); + Console.WriteLine($"【{DateTime.Now}】发送邮件结果{result}"); + return result; } } } \ No newline at end of file From 904169b6d18b66b172da16b1cd97b88204f10806 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com> Date: Thu, 8 Jun 2023 11:48:04 +0800 Subject: [PATCH 12/27] update CacheService.cs --- ZR.Service/System/CacheService.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ZR.Service/System/CacheService.cs b/ZR.Service/System/CacheService.cs index a18a0bd..1b5a336 100644 --- a/ZR.Service/System/CacheService.cs +++ b/ZR.Service/System/CacheService.cs @@ -1,9 +1,7 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; using ZR.Common; +using ZR.Common.Cache; namespace ZR.Service.System { @@ -13,15 +11,18 @@ namespace ZR.Service.System public static List GetUserPerms(string key) { return (List)CacheHelper.GetCache(key); + //return RedisServer.Cache.Get>(key).ToList(); } public static void SetUserPerms(string key, object data) { CacheHelper.SetCache(key, data); + //RedisServer.Cache.Set(key, data); } public static void RemoveUserPerms(string key) { CacheHelper.Remove(key); + //RedisServer.Cache.Del(key); } #endregion } From 628df80df70824fdfdf5ef5c9008a244b9e434fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com> Date: Thu, 8 Jun 2023 11:58:09 +0800 Subject: [PATCH 13/27] =?UTF-8?q?:zap:=20=E4=BC=98=E5=8C=96program?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ZR.Admin.WebApi/Extensions/CorsExtension.cs | 27 ++++++++++++++++++ ZR.Admin.WebApi/Program.cs | 31 +++++++++++---------- 2 files changed, 44 insertions(+), 14 deletions(-) create mode 100644 ZR.Admin.WebApi/Extensions/CorsExtension.cs diff --git a/ZR.Admin.WebApi/Extensions/CorsExtension.cs b/ZR.Admin.WebApi/Extensions/CorsExtension.cs new file mode 100644 index 0000000..1240d80 --- /dev/null +++ b/ZR.Admin.WebApi/Extensions/CorsExtension.cs @@ -0,0 +1,27 @@ +namespace ZR.Admin.WebApi.Extensions +{ + public static class CorsExtension + { + /// + /// 跨域配置 + /// + /// + /// + public static void AddCors(this IServiceCollection services, IConfiguration configuration) + { + var corsUrls = configuration["corsUrls"]?.Split(',', StringSplitOptions.RemoveEmptyEntries); + + //配置跨域 + services.AddCors(c => + { + c.AddPolicy("Policy", policy => + { + policy.WithOrigins(corsUrls ?? Array.Empty()) + .AllowAnyHeader()//允许任意头 + .AllowCredentials()//允许cookie + .AllowAnyMethod();//允许任意方法 + }); + }); + } + } +} diff --git a/ZR.Admin.WebApi/Program.cs b/ZR.Admin.WebApi/Program.cs index e984fb4..f6a9cad 100644 --- a/ZR.Admin.WebApi/Program.cs +++ b/ZR.Admin.WebApi/Program.cs @@ -9,6 +9,7 @@ using ZR.Admin.WebApi.Middleware; using ZR.Admin.WebApi.Hubs; using ZR.Common.Cache; using AspNetCoreRateLimit; +using Microsoft.IdentityModel.Tokens; var builder = WebApplication.CreateBuilder(args); @@ -20,19 +21,8 @@ builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); //注入HttpContextAccessor builder.Services.AddSingleton(); -var corsUrls = builder.Configuration["corsUrls"]?.Split(',', StringSplitOptions.RemoveEmptyEntries); - -//配置跨域 -builder.Services.AddCors(c => -{ - c.AddPolicy("Policy", policy => - { - policy.WithOrigins(corsUrls ?? Array.Empty()) - .AllowAnyHeader()//允许任意头 - .AllowCredentials()//允许cookie - .AllowAnyMethod();//允许任意方法 - }); -}); +// 跨域配置 +builder.Services.AddCors(builder.Configuration); // 显示logo builder.Services.AddLogo(); //注入SignalR实时通讯,默认用json传输 @@ -58,6 +48,19 @@ builder.Services.AddAuthentication(options => .AddJwtBearer(o => { o.TokenValidationParameters = JwtUtil.ValidParameters(); + o.Events = new JwtBearerEvents + { + OnAuthenticationFailed = context => + { + // 如果过期,把过期信息添加到头部 + if (context.Exception.GetType() == typeof(SecurityTokenExpiredException)) + { + context.Response.Headers.Add("Token-Expired", "true"); + } + + return Task.CompletedTask; + } + }; }); //InternalApp.InternalServices = builder.Services; @@ -66,7 +69,7 @@ builder.Services.AddAppService(); //开启计划任务 builder.Services.AddTaskSchedulers(); //初始化db -DbExtension.AddDb(builder.Configuration); +builder.Services.AddDb(builder.Configuration); //注册REDIS 服务 var openRedis = builder.Configuration["RedisServer:open"]; From b96edfdac724052620e4e021909c1d47c92d48a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com> Date: Wed, 7 Jun 2023 22:28:06 +0800 Subject: [PATCH 14/27] =?UTF-8?q?:sparkles:=20codeFirst=E5=AE=9E=E4=BD=93?= =?UTF-8?q?=E5=BB=BA=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Infrastructure/Helper/XmlCommentHelper.cs | 375 ++++++++++++++++++ .../Controllers/System/SysRoleController.cs | 15 +- .../Controllers/System/SysUserController.cs | 5 +- ZR.Admin.WebApi/Extensions/DbExtension.cs | 46 ++- .../Extensions/SwaggerExtension.cs | 8 +- .../Filters/ActionPermissionFilter.cs | 2 +- ZR.Admin.WebApi/Filters/VerifyAttribute.cs | 2 +- ZR.Admin.WebApi/Framework/JwtUtil.cs | 2 +- ZR.CodeGenerator/ZR.CodeGenerator.csproj | 2 +- ZR.Model/ProteryConstant.cs | 9 + ZR.Model/System/Article.cs | 18 +- ZR.Model/System/ArticleCategory.cs | 10 +- ZR.Model/System/CommonLang.cs | 8 +- ZR.Model/System/{ => Dto}/LoginUser.cs | 2 +- ZR.Model/System/Dto/MenuDto.cs | 4 +- ZR.Model/System/Dto/SysRoleDto.cs | 7 +- ZR.Model/System/Dto/SysUserDto.cs | 22 +- ZR.Model/System/Generate/GenTable.cs | 35 +- ZR.Model/System/Generate/GenTableColumn.cs | 10 +- ZR.Model/System/SysBase.cs | 11 +- ZR.Model/System/SysConfig.cs | 6 +- ZR.Model/System/SysDept.cs | 13 +- ZR.Model/System/SysDictData.cs | 9 +- ZR.Model/System/SysDictType.cs | 7 +- ZR.Model/System/SysFile.cs | 2 +- ZR.Model/System/SysLogininfor.cs | 13 +- ZR.Model/System/SysMenu.cs | 18 +- ZR.Model/System/SysNotice.cs | 11 +- ZR.Model/System/SysOperLog.cs | 26 +- ZR.Model/System/SysPost.cs | 6 +- ZR.Model/System/SysRole.cs | 12 +- ZR.Model/System/SysRoleDept.cs | 11 +- ZR.Model/System/SysRoleMenu.cs | 10 +- ZR.Model/System/SysRolePost.cs | 15 - ZR.Model/System/SysTasks.cs | 46 +-- ZR.Model/System/SysTasksLog.cs | 12 +- ZR.Model/System/SysUser.cs | 8 +- ZR.Model/System/SysUserPost.cs | 4 +- ZR.Model/System/SysUserRole.cs | 2 +- ZR.Model/ZR.Model.csproj | 3 +- ZR.Repository/ZR.Repository.csproj | 2 +- ZR.Service/System/IService/ISysUserService.cs | 2 +- ZR.Service/System/SysMenuService.cs | 6 - ZR.Service/System/SysUserService.cs | 4 +- document/mysql/admin-mysql.sql | 14 +- document/pgsql/admin-pg15.sql | 4 +- document/sqlserver/admin-sqlserver.sql | 23 +- 47 files changed, 688 insertions(+), 194 deletions(-) create mode 100644 Infrastructure/Helper/XmlCommentHelper.cs create mode 100644 ZR.Model/ProteryConstant.cs rename ZR.Model/System/{ => Dto}/LoginUser.cs (97%) delete mode 100644 ZR.Model/System/SysRolePost.cs diff --git a/Infrastructure/Helper/XmlCommentHelper.cs b/Infrastructure/Helper/XmlCommentHelper.cs new file mode 100644 index 0000000..984b8ef --- /dev/null +++ b/Infrastructure/Helper/XmlCommentHelper.cs @@ -0,0 +1,375 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Xml.XPath; + +namespace Infrastructure.Helper +{ + public class XmlCommentHelper + { + private static Regex RefTagPattern = new Regex(@"<(see|paramref) (name|cref)=""([TPF]{1}:)?(?.+?)"" ?/>"); + private static Regex CodeTagPattern = new Regex(@"(?.+?)"); + private static Regex ParaTagPattern = new Regex(@"(?.+?)", RegexOptions.Singleline); + + List navigators = new List(); + + /// + /// 从当前dll文件中加载所有的xml文件 + /// + public void LoadAll() + { + var files = Directory.GetFiles(Directory.GetCurrentDirectory()); + foreach (var file in files) + { + if (string.Equals(Path.GetExtension(file), ".xml", StringComparison.OrdinalIgnoreCase)) + { + Load(file); + } + } + } + /// + /// 从xml中加载 + /// + /// + public void LoadXml(params string[] xmls) + { + foreach (var xml in xmls) + { + Load(new MemoryStream(Encoding.UTF8.GetBytes(xml))); + } + } + /// + /// 从文件中加载 + /// + /// + public void Load(params string[] xmlFiles) + { + foreach (var xmlFile in xmlFiles) + { + var doc = new XPathDocument(xmlFile); + navigators.Add(doc.CreateNavigator()); + + //Console.WriteLine("加载xml文件=" + xmlFile); + } + } + /// + /// 从流中加载 + /// + /// + public void Load(params Stream[] streams) + { + foreach (var stream in streams) + { + var doc = new XPathDocument(stream); + navigators.Add(doc.CreateNavigator()); + } + } + + /// + /// 读取类型中的注释 + /// + /// 类型 + /// 注释路径 + /// 可读性优化(比如:去掉xml标记) + /// + public string GetTypeComment(Type type, string xPath = "summary", bool humanize = true) + { + var typeMemberName = GetMemberNameForType(type); + return GetComment(typeMemberName, xPath, humanize); + } + /// + /// 读取字段或者属性的注释 + /// + /// 字段或者属性 + /// 注释路径 + /// 可读性优化(比如:去掉xml标记) + /// + public string GetFieldOrPropertyComment(MemberInfo fieldOrPropertyInfo, string xPath = "summary", bool humanize = true) + { + var fieldOrPropertyMemberName = GetMemberNameForFieldOrProperty(fieldOrPropertyInfo); + return GetComment(fieldOrPropertyMemberName, xPath, humanize); + } + /// + /// 读取方法中的注释 + /// + /// 方法 + /// 注释路径 + /// 可读性优化(比如:去掉xml标记) + /// + public string GetMethodComment(MethodInfo methodInfo, string xPath = "summary", bool humanize = true) + { + var methodMemberName = GetMemberNameForMethod(methodInfo); + return GetComment(methodMemberName, xPath, humanize); + } + /// + /// 读取方法中的返回值注释 + /// + /// 方法 + /// 可读性优化(比如:去掉xml标记) + /// + public string GetMethodReturnComment(MethodInfo methodInfo, bool humanize = true) + { + return GetMethodComment(methodInfo, "returns", humanize); + } + /// + /// 读取参数的注释 + /// + /// 参数 + /// 可读性优化(比如:去掉xml标记) + /// + public string GetParameterComment(ParameterInfo parameterInfo, bool humanize = true) + { + if (!(parameterInfo.Member is MethodInfo methodInfo)) return string.Empty; + + var methodMemberName = GetMemberNameForMethod(methodInfo); + return GetComment(methodMemberName, $"param[@name='{parameterInfo.Name}']", humanize); + } + /// + /// 读取方法的所有参数的注释 + /// + /// 方法 + /// 可读性优化(比如:去掉xml标记) + /// + public Dictionary GetParameterComments(MethodInfo methodInfo, bool humanize = true) + { + var parameterInfos = methodInfo.GetParameters(); + Dictionary dict = new Dictionary(); + foreach (var parameterInfo in parameterInfos) + { + dict[parameterInfo.Name] = GetParameterComment(parameterInfo, humanize); + } + return dict; + } + /// + /// 读取指定名称节点的注释 + /// + /// 节点名称 + /// 注释路径 + /// 可读性优化(比如:去掉xml标记) + /// + public string GetComment(string name, string xPath, bool humanize = true) + { + foreach (var _xmlNavigator in navigators) + { + var typeSummaryNode = _xmlNavigator.SelectSingleNode($"/doc/members/member[@name='{name}']/{xPath.Trim('/', '\\')}"); + + if (typeSummaryNode != null) + { + return humanize ? Humanize(typeSummaryNode.InnerXml) : typeSummaryNode.InnerXml; + } + } + + return string.Empty; + } + /// + /// 读取指定节点的summary注释 + /// + /// 节点名称 + /// 可读性优化(比如:去掉xml标记) + /// + public string GetSummary(string name, bool humanize = true) + { + return GetComment(name, "summary", humanize); + } + /// + /// 读取指定节点的example注释 + /// + /// 节点名称 + /// 可读性优化(比如:去掉xml标记) + /// + public string GetExample(string name, bool humanize = true) + { + return GetComment(name, "example", humanize); + } + /// + /// 获取方法的节点名称 + /// + /// + /// + public string GetMemberNameForMethod(MethodInfo method) + { + var builder = new StringBuilder("M:"); + + builder.Append(QualifiedNameFor(method.DeclaringType)); + builder.Append($".{method.Name}"); + + var parameters = method.GetParameters(); + if (parameters.Any()) + { + var parametersNames = parameters.Select(p => + { + return p.ParameterType.IsGenericParameter + ? $"`{p.ParameterType.GenericParameterPosition}" + : QualifiedNameFor(p.ParameterType, expandGenericArgs: true); + }); + builder.Append($"({string.Join(",", parametersNames)})"); + } + + return builder.ToString(); + } + /// + /// 获取类型的节点名称 + /// + /// + /// + public string GetMemberNameForType(Type type) + { + var builder = new StringBuilder("T:"); + builder.Append(QualifiedNameFor(type)); + + return builder.ToString(); + } + /// + /// 获取字段或者属性的节点名称 + /// + /// + /// + public string GetMemberNameForFieldOrProperty(MemberInfo fieldOrPropertyInfo) + { + var builder = new StringBuilder(((fieldOrPropertyInfo.MemberType & MemberTypes.Field) != 0) ? "F:" : "P:"); + builder.Append(QualifiedNameFor(fieldOrPropertyInfo.DeclaringType)); + builder.Append($".{fieldOrPropertyInfo.Name}"); + + return builder.ToString(); + } + + private string QualifiedNameFor(Type type, bool expandGenericArgs = false) + { + if (type.IsArray) + return $"{QualifiedNameFor(type.GetElementType(), expandGenericArgs)}[]"; + + var builder = new StringBuilder(); + + if (!string.IsNullOrEmpty(type.Namespace)) + builder.Append($"{type.Namespace}."); + + if (type.IsNested) + { + builder.Append($"{string.Join(".", GetNestedTypeNames(type))}."); + } + + if (type.IsConstructedGenericType && expandGenericArgs) + { + var nameSansGenericArgs = type.Name.Split('`').First(); + builder.Append(nameSansGenericArgs); + + var genericArgsNames = type.GetGenericArguments().Select(t => + { + return t.IsGenericParameter + ? $"`{t.GenericParameterPosition}" + : QualifiedNameFor(t, true); + }); + + builder.Append($"{{{string.Join(",", genericArgsNames)}}}"); + } + else + { + builder.Append(type.Name); + } + + return builder.ToString(); + } + private IEnumerable GetNestedTypeNames(Type type) + { + if (!type.IsNested || type.DeclaringType == null) yield break; + + foreach (var nestedTypeName in GetNestedTypeNames(type.DeclaringType)) + { + yield return nestedTypeName; + } + + yield return type.DeclaringType.Name; + } + private string Humanize(string text) + { + if (text == null) + throw new ArgumentNullException("text"); + + //Call DecodeXml at last to avoid entities like < and > to break valid xml + text = NormalizeIndentation(text); + text = HumanizeRefTags(text); + text = HumanizeCodeTags(text); + text = HumanizeParaTags(text); + text = DecodeXml(text); + return text; + } + private string NormalizeIndentation(string text) + { + string[] lines = text.Split('\n'); + string padding = GetCommonLeadingWhitespace(lines); + + int padLen = padding == null ? 0 : padding.Length; + + // remove leading padding from each line + for (int i = 0, l = lines.Length; i < l; ++i) + { + string line = lines[i].TrimEnd('\r'); // remove trailing '\r' + + if (padLen != 0 && line.Length >= padLen && line.Substring(0, padLen) == padding) + line = line.Substring(padLen); + + lines[i] = line; + } + + // remove leading empty lines, but not all leading padding + // remove all trailing whitespace, regardless + return string.Join("\r\n", lines.SkipWhile(x => string.IsNullOrWhiteSpace(x))).TrimEnd(); + } + private string GetCommonLeadingWhitespace(string[] lines) + { + if (null == lines) + throw new ArgumentException("lines"); + + if (lines.Length == 0) + return null; + + string[] nonEmptyLines = lines + .Where(x => !string.IsNullOrWhiteSpace(x)) + .ToArray(); + + if (nonEmptyLines.Length < 1) + return null; + + int padLen = 0; + + // use the first line as a seed, and see what is shared over all nonEmptyLines + string seed = nonEmptyLines[0]; + for (int i = 0, l = seed.Length; i < l; ++i) + { + if (!char.IsWhiteSpace(seed, i)) + break; + + if (nonEmptyLines.Any(line => line[i] != seed[i])) + break; + + ++padLen; + } + + if (padLen > 0) + return seed.Substring(0, padLen); + + return null; + } + private string HumanizeRefTags(string text) + { + return RefTagPattern.Replace(text, (match) => match.Groups["display"].Value); + } + private string HumanizeCodeTags(string text) + { + return CodeTagPattern.Replace(text, (match) => "{" + match.Groups["display"].Value + "}"); + } + private string HumanizeParaTags(string text) + { + return ParaTagPattern.Replace(text, (match) => "
" + match.Groups["display"].Value); + } + private string DecodeXml(string text) + { + return System.Net.WebUtility.HtmlDecode(text); + } + } +} diff --git a/ZR.Admin.WebApi/Controllers/System/SysRoleController.cs b/ZR.Admin.WebApi/Controllers/System/SysRoleController.cs index 40b1ab1..37b5276 100644 --- a/ZR.Admin.WebApi/Controllers/System/SysRoleController.cs +++ b/ZR.Admin.WebApi/Controllers/System/SysRoleController.cs @@ -58,16 +58,16 @@ namespace ZR.Admin.WebApi.Controllers.System /// /// 添加角色 /// - /// + /// /// [HttpPost] [ActionPermissionFilter(Permission = "system:role:add")] [Log(Title = "角色管理", BusinessType = BusinessType.INSERT)] [Route("edit")] - public IActionResult RoleAdd([FromBody] SysRole sysRoleDto) + public IActionResult RoleAdd([FromBody] SysRoleDto dto) { - if (sysRoleDto == null) return ToResponse(ApiResult.Error(101, "请求参数错误")); - + if (dto == null) return ToResponse(ApiResult.Error(101, "请求参数错误")); + SysRole sysRoleDto = dto.Adapt(); if (UserConstants.NOT_UNIQUE.Equals(sysRoleService.CheckRoleKeyUnique(sysRoleDto))) { return ToResponse(ApiResult.Error((int)ResultCode.CUSTOM_ERROR, $"新增角色'{sysRoleDto.RoleName}'失败,角色权限已存在")); @@ -82,18 +82,19 @@ namespace ZR.Admin.WebApi.Controllers.System /// /// 修改角色 /// - /// + /// /// [HttpPut] [ActionPermissionFilter(Permission = "system:role:edit")] [Log(Title = "角色管理", BusinessType = BusinessType.UPDATE)] [Route("edit")] - public IActionResult RoleEdit([FromBody] SysRole sysRoleDto) + public IActionResult RoleEdit([FromBody] SysRoleDto dto) { - if (sysRoleDto == null || sysRoleDto.RoleId <= 0 || string.IsNullOrEmpty(sysRoleDto.RoleKey)) + if (dto == null || dto.RoleId <= 0 || string.IsNullOrEmpty(dto.RoleKey)) { return ToResponse(ApiResult.Error(101, "请求参数错误")); } + SysRole sysRoleDto = dto.Adapt(); sysRoleService.CheckRoleAllowed(sysRoleDto); var info = sysRoleService.SelectRoleById(sysRoleDto.RoleId); if (info != null && info.RoleKey != sysRoleDto.RoleKey) diff --git a/ZR.Admin.WebApi/Controllers/System/SysUserController.cs b/ZR.Admin.WebApi/Controllers/System/SysUserController.cs index dc64553..bde841d 100644 --- a/ZR.Admin.WebApi/Controllers/System/SysUserController.cs +++ b/ZR.Admin.WebApi/Controllers/System/SysUserController.cs @@ -9,6 +9,7 @@ using ZR.Admin.WebApi.Extensions; using ZR.Admin.WebApi.Filters; using ZR.Model; using ZR.Model.System; +using ZR.Model.System.Dto; using ZR.Service.System.IService; namespace ZR.Admin.WebApi.Controllers.System @@ -44,7 +45,7 @@ namespace ZR.Admin.WebApi.Controllers.System /// [ActionPermissionFilter(Permission = "system:user:list")] [HttpGet("list")] - public IActionResult List([FromQuery] SysUser user, PagerInfo pager) + public IActionResult List([FromQuery] SysUserQueryDto user, PagerInfo pager) { var list = UserService.SelectUserList(user, pager); @@ -208,7 +209,7 @@ namespace ZR.Admin.WebApi.Controllers.System [HttpGet("export")] [Log(Title = "用户导出", BusinessType = BusinessType.EXPORT)] [ActionPermissionFilter(Permission = "system:user:export")] - public IActionResult UserExport([FromQuery] SysUser user) + public IActionResult UserExport([FromQuery] SysUserQueryDto user) { var list = UserService.SelectUserList(user, new PagerInfo(1, 10000)); diff --git a/ZR.Admin.WebApi/Extensions/DbExtension.cs b/ZR.Admin.WebApi/Extensions/DbExtension.cs index ed3fb44..eec1f86 100644 --- a/ZR.Admin.WebApi/Extensions/DbExtension.cs +++ b/ZR.Admin.WebApi/Extensions/DbExtension.cs @@ -1,9 +1,11 @@ using Infrastructure; +using Infrastructure.Extensions; using Infrastructure.Helper; using SqlSugar; using SqlSugar.IOC; using System.Reflection; using ZR.Admin.WebApi.Framework; +using ZR.Model; using ZR.Model.System; namespace ZR.Admin.WebApi.Extensions @@ -22,12 +24,16 @@ namespace ZR.Admin.WebApi.Extensions //仅本人数据权限 public static long DATA_SCOPE_SELF = 5; + private static XmlCommentHelper commentHelper = new XmlCommentHelper(); + /// /// 初始化db /// + /// /// public static void AddDb(this IServiceCollection services, IConfiguration Configuration) { + commentHelper.LoadAll(); List dbConfigs = Configuration.GetSection("DbConfigs").Get>(); var iocList = new List(); @@ -110,12 +116,44 @@ namespace ZR.Admin.WebApi.Extensions DataInfoCacheService = cache, EntityService = (c, p) => { - if (db.GetConnectionScope(configId).CurrentConnectionConfig.DbType == DbType.PostgreSQL && p.DataType != null && p.DataType.Contains("nvarchar")) + p.DbTableName = p.DbTableName.FirstLowerCase(); + p.DbColumnName = p.DbColumnName.FirstLowerCase(); + var des = commentHelper.GetFieldOrPropertyComment(c); + if (des.IsNotEmpty()) { - p.DataType = "text"; + p.ColumnDescription = des; + } + + if (db.GetConnectionScope(configId).CurrentConnectionConfig.DbType == DbType.PostgreSQL) + { + if (p.DataType != null && p.DataType.Contains("nvarchar")) + { + p.DataType = "text"; + } + if (c.Name == nameof(SysMenu.IsCache) || c.Name == nameof(SysMenu.IsFrame)) + { + p.DataType = "char(1)"; + } + } + if (p.IsPrimarykey == true)//主键不能为null + { + p.IsNullable = false; + } + else if (p.ExtendedAttribute?.ToString() == ProteryConstant.NOTNULL.ToString()) + { + p.IsNullable = false; + } + else//则否默认为null + { + p.IsNullable = true; } } }; + + db.GetConnectionScope(configId).Aop.DataExecuting = (oldValue, entiyInfo) => + { + + }; } /// @@ -130,7 +168,9 @@ namespace ZR.Admin.WebApi.Extensions var baseType = typeof(SysBase); var entityes = AssemblyUtils.GetAllTypes().Where(p => !p.IsAbstract && p != baseType && /*p.IsAssignableTo(baseType) && */p.GetCustomAttribute() != null).ToArray(); - db.CodeFirst.SetStringDefaultLength(200).InitTables(entityes); + + //23个表 + db.CodeFirst.InitTables(entityes); } private static object GetParsValue(SugarParameter x) diff --git a/ZR.Admin.WebApi/Extensions/SwaggerExtension.cs b/ZR.Admin.WebApi/Extensions/SwaggerExtension.cs index 2038144..8d73605 100644 --- a/ZR.Admin.WebApi/Extensions/SwaggerExtension.cs +++ b/ZR.Admin.WebApi/Extensions/SwaggerExtension.cs @@ -38,7 +38,7 @@ namespace ZR.Admin.WebApi.Extensions public static void AddSwaggerConfig(this IServiceCollection services) { if (services == null) throw new ArgumentNullException(nameof(services)); - //IWebHostEnvironment hostEnvironment = App.GetRequiredService(); + //IWebHostEnvironment hostEnvironment = services.BuildServiceProvider().GetRequiredService(); services.AddSwaggerGen(c => { @@ -50,10 +50,10 @@ namespace ZR.Admin.WebApi.Extensions }); try { - var tempPath = "";// hostEnvironment.ContentRootPath; + //var tempPath = hostEnvironment.ContentRootPath; //添加文档注释 - c.IncludeXmlComments(Path.Combine(tempPath, "ZRAdmin.xml"), true); - c.IncludeXmlComments(Path.Combine(tempPath, "ZRModel.xml"), true); + c.IncludeXmlComments(Path.Combine("ZRAdmin.xml"), true); + c.IncludeXmlComments(Path.Combine("ZRModel.xml"), true); //c.IncludeXmlComments(Path.Combine(Directory.GetParent(tempPath).FullName, "ZR.Model", "ZRModel.xml"), true); } catch (Exception ex) diff --git a/ZR.Admin.WebApi/Filters/ActionPermissionFilter.cs b/ZR.Admin.WebApi/Filters/ActionPermissionFilter.cs index 4d66ab2..09fe303 100644 --- a/ZR.Admin.WebApi/Filters/ActionPermissionFilter.cs +++ b/ZR.Admin.WebApi/Filters/ActionPermissionFilter.cs @@ -2,7 +2,7 @@ using Infrastructure.Model; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; -using ZR.Model.System; +using ZR.Model.System.Dto; namespace ZR.Admin.WebApi.Filters { diff --git a/ZR.Admin.WebApi/Filters/VerifyAttribute.cs b/ZR.Admin.WebApi/Filters/VerifyAttribute.cs index f0ec952..a925b3e 100644 --- a/ZR.Admin.WebApi/Filters/VerifyAttribute.cs +++ b/ZR.Admin.WebApi/Filters/VerifyAttribute.cs @@ -9,7 +9,7 @@ using System; using System.Linq; using ZR.Admin.WebApi.Extensions; using ZR.Admin.WebApi.Framework; -using ZR.Model.System; +using ZR.Model.System.Dto; namespace ZR.Admin.WebApi.Filters { diff --git a/ZR.Admin.WebApi/Framework/JwtUtil.cs b/ZR.Admin.WebApi/Framework/JwtUtil.cs index bb5b9f2..c6ef113 100644 --- a/ZR.Admin.WebApi/Framework/JwtUtil.cs +++ b/ZR.Admin.WebApi/Framework/JwtUtil.cs @@ -6,7 +6,7 @@ using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; using ZR.Admin.WebApi.Extensions; -using ZR.Model.System; +using ZR.Model.System.Dto; using ZR.Service.System; namespace ZR.Admin.WebApi.Framework diff --git a/ZR.CodeGenerator/ZR.CodeGenerator.csproj b/ZR.CodeGenerator/ZR.CodeGenerator.csproj index 31c8979..e697420 100644 --- a/ZR.CodeGenerator/ZR.CodeGenerator.csproj +++ b/ZR.CodeGenerator/ZR.CodeGenerator.csproj @@ -12,6 +12,6 @@ - + diff --git a/ZR.Model/ProteryConstant.cs b/ZR.Model/ProteryConstant.cs new file mode 100644 index 0000000..382c459 --- /dev/null +++ b/ZR.Model/ProteryConstant.cs @@ -0,0 +1,9 @@ +using System; + +namespace ZR.Model +{ + public enum ProteryConstant + { + NOTNULL = 0 + } +} diff --git a/ZR.Model/System/Article.cs b/ZR.Model/System/Article.cs index a5ecfb3..558deb0 100644 --- a/ZR.Model/System/Article.cs +++ b/ZR.Model/System/Article.cs @@ -6,7 +6,7 @@ namespace ZR.Model.System /// /// 文章表 /// - [SugarTable("article")] + [SugarTable("article", "文章管理")] [Tenant("0")] public class Article { @@ -18,54 +18,64 @@ namespace ZR.Model.System /// /// 文章标题 /// + [SugarColumn(ColumnDescription = "文章标题", Length = 254, ExtendedAttribute = ProteryConstant.NOTNULL)] public string Title { get; set; } /// /// 发布时间 /// + [SugarColumn(ColumnDescription = "发布时间")] public DateTime? CreateTime { get; set; } /// /// 更新时间 /// - [SugarColumn(IsOnlyIgnoreInsert = true)] + [SugarColumn(IsOnlyIgnoreInsert = true, ColumnDescription = "更新时间")] public DateTime? UpdateTime { get; set; } /// /// 文章内容 /// + [SugarColumn(ColumnDescription = "文章内容", ColumnDataType = "text")] public string Content { get; set; } /// /// 作者名 /// + [SugarColumn(ColumnDescription = "作者名", Length = 20, ExtendedAttribute = ProteryConstant.NOTNULL)] public string AuthorName { get; set; } /// /// 发布者用户id /// + [SugarColumn(ColumnDescription = "发布者用户id", ExtendedAttribute = ProteryConstant.NOTNULL)] public long UserId { get; set; } /// /// 文章状态 1、发布 2、草稿 /// + [SugarColumn(ColumnDescription = "文章状态 1、发布 2、草稿", Length = 20)] public string Status { get; set; } /// /// 编辑器类型 markdown,html /// - [SugarColumn(ColumnName = "fmt_type")] + [SugarColumn(ColumnDescription = "编辑器类型markdown,html", ColumnName = "fmt_type", Length = 20, IsNullable = true)] public string FmtType { get; set; } /// /// 文章标签eg:Net5,java /// + [SugarColumn(ColumnDescription = "文章标签", Length = 20)] public string Tags { get; set; } /// /// 点击量 /// + [SugarColumn(ColumnDescription = "点击量", DefaultValue = "0")] public int Hits { get; set; } - [SugarColumn(ColumnName = "category_Id")] + [SugarColumn(ColumnDescription = "目录id", ColumnName = "category_Id")] public int CategoryId { get; set; } /// /// 封面地址 /// + [SugarColumn(ColumnDescription = "封面地址", Length = 255)] public string CoverUrl { get; set; } /// /// 是否公开 1、公开 0、不公开 /// + [SugarColumn(ColumnDescription = "是否公开 1、公开 0、不公开", DefaultValue = "0")] public int IsPublic { get; set; } [Navigate(NavigateType.OneToOne, nameof(CategoryId), nameof(ArticleCategory.CategoryId))] //自定义关系映射 diff --git a/ZR.Model/System/ArticleCategory.cs b/ZR.Model/System/ArticleCategory.cs index d10569b..934b257 100644 --- a/ZR.Model/System/ArticleCategory.cs +++ b/ZR.Model/System/ArticleCategory.cs @@ -8,18 +8,20 @@ namespace ZR.Model.System /// /// 文章目录 /// - [SugarTable("articleCategory")] + [SugarTable("articleCategory", "文章目录")] [Tenant("0")] public class ArticleCategory { /// /// 目录id /// - [SugarColumn(IsPrimaryKey = true, ColumnName = "Category_id")] + [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnName = "category_id")] public int CategoryId { get; set; } + + [SugarColumn(ColumnDescription = "目录名", Length = 20, ExtendedAttribute = ProteryConstant.NOTNULL)] public string Name { get; set; } - public int ParentId { get; set; } - [SugarColumn(ColumnName = "create_time", IsNullable = true)] + public int? ParentId { get; set; } + [SugarColumn(ColumnDescription = "创建时间", ColumnName = "create_time")] public DateTime? CreateTime { get; set; } [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] diff --git a/ZR.Model/System/CommonLang.cs b/ZR.Model/System/CommonLang.cs index 8f27bb0..883e46e 100644 --- a/ZR.Model/System/CommonLang.cs +++ b/ZR.Model/System/CommonLang.cs @@ -9,7 +9,7 @@ namespace ZR.Model.Models /// 多语言配置,数据实体对象 /// [Tenant("0")] - [SugarTable("sys_common_lang")] + [SugarTable("sys_common_lang", "多语言配置表")] public class CommonLang { /// @@ -23,21 +23,21 @@ namespace ZR.Model.Models /// 语言code /// [DisplayName("语言code")] - [SugarColumn(ColumnName = "lang_code", IsNullable = false)] + [SugarColumn(ColumnName = "lang_code", Length = 10, ExtendedAttribute = ProteryConstant.NOTNULL)] public string LangCode { get; set; } /// /// 语言key /// [DisplayName("语言key")] - [SugarColumn(ColumnName = "lang_key")] + [SugarColumn(ColumnName = "lang_key", Length = 100, ExtendedAttribute = ProteryConstant.NOTNULL)] public string LangKey { get; set; } /// /// 名称 /// [DisplayName("名称")] - [SugarColumn(ColumnName = "lang_name", IsNullable = false)] + [SugarColumn(ColumnName = "lang_name", Length = 2000, ExtendedAttribute = ProteryConstant.NOTNULL)] public string LangName { get; set; } /// diff --git a/ZR.Model/System/LoginUser.cs b/ZR.Model/System/Dto/LoginUser.cs similarity index 97% rename from ZR.Model/System/LoginUser.cs rename to ZR.Model/System/Dto/LoginUser.cs index 4ded62a..8bf08d7 100644 --- a/ZR.Model/System/LoginUser.cs +++ b/ZR.Model/System/Dto/LoginUser.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Linq; -namespace ZR.Model.System +namespace ZR.Model.System.Dto { /// /// 登录用户信息存储 diff --git a/ZR.Model/System/Dto/MenuDto.cs b/ZR.Model/System/Dto/MenuDto.cs index b75a59e..5c21422 100644 --- a/ZR.Model/System/Dto/MenuDto.cs +++ b/ZR.Model/System/Dto/MenuDto.cs @@ -33,11 +33,11 @@ namespace ZR.Model.System.Dto /// 是否缓存(1缓存 0不缓存) /// [Required(ErrorMessage = "是否缓存不能为空")] - public string IsCache { get; set; } + public int IsCache { get; set; } /// /// 是否外链 1、是 0、否 /// - public string IsFrame { get; set; } + public int IsFrame { get; set; } /// /// 类型(M目录 C菜单 F按钮 L链接) diff --git a/ZR.Model/System/Dto/SysRoleDto.cs b/ZR.Model/System/Dto/SysRoleDto.cs index 1ff297f..8ad6866 100644 --- a/ZR.Model/System/Dto/SysRoleDto.cs +++ b/ZR.Model/System/Dto/SysRoleDto.cs @@ -12,10 +12,15 @@ namespace ZR.Model.System.Dto public string RoleName { get; set; } public string RoleKey { get; set; } public int RoleSort { get; set; } - public string Status { get; set; } + public int Status { get; set; } + public int DataScope { get; set; } + public int[] DeptIds { get; set; } /// /// 减少菜单集合 /// public List DelMenuIds { get; set; } = new List(); + public bool MenuCheckStrictly { get; set; } + public bool DeptCheckStrictly { get; set; } + } } diff --git a/ZR.Model/System/Dto/SysUserDto.cs b/ZR.Model/System/Dto/SysUserDto.cs index 771d501..d8ba37a 100644 --- a/ZR.Model/System/Dto/SysUserDto.cs +++ b/ZR.Model/System/Dto/SysUserDto.cs @@ -1,4 +1,6 @@ -namespace ZR.Model.System.Dto +using System; + +namespace ZR.Model.System.Dto { public class SysUserDto { @@ -13,4 +15,22 @@ /// public int Sex { get; set; } } + + public class SysUserQueryDto + { + public long UserId { get; set; } + public string UserName { get; set; } + public string NickName { get; set; } + public string Email { get; set; } + public string Remark { get; set; } + public string Phonenumber { get; set; } + /// + /// 用户性别(0男 1女 2未知) + /// + public int Sex { get; set; } + public DateTime? BeginTime { get; set; } + public DateTime? EndTime { get; set; } + public int Status { get; set; } + public long DeptId { get; set; } + } } diff --git a/ZR.Model/System/Generate/GenTable.cs b/ZR.Model/System/Generate/GenTable.cs index d62734a..ec49963 100644 --- a/ZR.Model/System/Generate/GenTable.cs +++ b/ZR.Model/System/Generate/GenTable.cs @@ -1,38 +1,44 @@ -using System.Collections.Generic; +using SqlSugar; +using System.Collections.Generic; namespace ZR.Model.System.Generate { /// /// 代码生成表 /// - [SqlSugar.SugarTable("gen_table")] - [SqlSugar.Tenant("0")] + [SugarTable("gen_table", "代码生成表")] + [Tenant("0")] public class GenTable : SysBase { /// /// 表id /// - [SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true)] - public int TableId { get; set; } + [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] + public long TableId { get; set; } /// /// 数据库名 /// + [SugarColumn(Length = 50)] public string DbName { get; set; } /// /// 表名 /// + [SugarColumn(Length = 150)] public string TableName { get; set; } /// /// 表描述 /// + [SugarColumn(Length = 150)] public string TableComment { get; set; } /// /// 关联父表的表名 /// + [SugarColumn(Length = 150)] public string SubTableName { get; set; } /// /// 本表关联父表的外键名 /// + [SugarColumn(Length = 150)] public string SubTableFkName { get; set; } /// /// csharp类名 @@ -41,18 +47,22 @@ namespace ZR.Model.System.Generate /// /// 使用的模板(crud单表操作 tree树表操作 sub主子表操作) /// + [SugarColumn(Length = 50, DefaultValue = "crud")] public string TplCategory { get; set; } /// /// 基本命名空间前缀 /// + [SugarColumn(Length = 100)] public string BaseNameSpace { get; set; } /// /// 生成模块名 /// + [SugarColumn(Length = 50)] public string ModuleName { get; set; } /// /// 生成业务名 /// + [SugarColumn(Length = 50)] public string BusinessName { get; set; } /// /// 生成功能名 @@ -65,23 +75,30 @@ namespace ZR.Model.System.Generate /// /// 生成代码方式(0zip压缩包 1自定义路径) /// + [SugarColumn(Length = 1, DefaultValue = "0")] public string GenType { get; set; } + /// + /// 代码生成保存路径 + /// + [SugarColumn(Length = 200, DefaultValue = "/")] public string GenPath { get; set; } /// /// 其他生成选项 /// - [SqlSugar.SugarColumn(IsJson = true, ColumnDataType = "nvarchar(4000)")] + [SugarColumn(IsJson = true)] public Options Options { get; set; } #region 表额外字段 - /** 表列信息 */ - [SqlSugar.SugarColumn(IsIgnore = true)] + /// + /// 表列信息 + /// + [SugarColumn(IsIgnore = true)] public List Columns { get; set; } /// /// 字表信息 /// - [SqlSugar.SugarColumn(IsIgnore = true)] + [SugarColumn(IsIgnore = true)] public GenTable SubTable { get; set; } #endregion } diff --git a/ZR.Model/System/Generate/GenTableColumn.cs b/ZR.Model/System/Generate/GenTableColumn.cs index 12f5ff6..917fc78 100644 --- a/ZR.Model/System/Generate/GenTableColumn.cs +++ b/ZR.Model/System/Generate/GenTableColumn.cs @@ -7,18 +7,21 @@ namespace ZR.Model.System.Generate /// /// 代码生成表字段 /// - [SugarTable("gen_table_column")] + [SugarTable("gen_table_column", "代码生成表字段")] [Tenant("0")] public class GenTableColumn : SysBase { + /// + /// 列id + /// [SugarColumn(IsIdentity = true, IsPrimaryKey = true)] - public int ColumnId { get; set; } + public long ColumnId { get; set; } /// /// 导入代码生成表列名 首字母转了小写 /// public string ColumnName { get; set; } [SugarColumn(IsOnlyIgnoreUpdate = true)] - public int TableId { get; set; } + public long TableId { get; set; } [SugarColumn(IsOnlyIgnoreUpdate = true)] public string TableName { get; set; } @@ -96,6 +99,7 @@ namespace ZR.Model.System.Generate /// /// 查询类型(等于、不等于、大于、小于、范围) /// + [SugarColumn(DefaultValue = "EQ")] public string QueryType { get; set; } = "EQ"; public int Sort { get; set; } /// diff --git a/ZR.Model/System/SysBase.cs b/ZR.Model/System/SysBase.cs index 5e1f58c..5618c83 100644 --- a/ZR.Model/System/SysBase.cs +++ b/ZR.Model/System/SysBase.cs @@ -8,6 +8,9 @@ namespace ZR.Model.System //[EpplusTable(PrintHeaders = true, AutofitColumns = true, AutoCalculate = true, ShowTotal = true)] public class SysBase { + /// + /// 创建人 + /// [SugarColumn(IsOnlyIgnoreUpdate = true, Length = 64, IsNullable = true)] [JsonProperty(propertyName: "CreateBy")] [ExcelIgnore] @@ -31,13 +34,5 @@ namespace ZR.Model.System public DateTime? Update_time { get; set; } [SugarColumn(Length = 500)] public string Remark { get; set; } - [SugarColumn(IsIgnore = true, IsNullable = true)] - [JsonIgnore] - [ExcelIgnore] - public DateTime? BeginTime { get; set; } - [SugarColumn(IsIgnore = true, IsNullable = true)] - [JsonIgnore] - [ExcelIgnore] - public DateTime? EndTime { get; set; } } } diff --git a/ZR.Model/System/SysConfig.cs b/ZR.Model/System/SysConfig.cs index c253b36..764cf52 100644 --- a/ZR.Model/System/SysConfig.cs +++ b/ZR.Model/System/SysConfig.cs @@ -8,7 +8,7 @@ namespace ZR.Model.System /// @author mr.zhao /// @date 2021-09-29 /// - [SugarTable("sys_config")] + [SugarTable("sys_config", "配置表")] [Tenant("0")] public class SysConfig : SysBase { @@ -20,18 +20,22 @@ namespace ZR.Model.System /// /// 参数名称 /// + [SugarColumn(Length = 100)] public string ConfigName { get; set; } /// /// 参数键名 /// + [SugarColumn(Length = 100)] public string ConfigKey { get; set; } /// /// 参数键值 /// + [SugarColumn(Length = 500)] public string ConfigValue { get; set; } /// /// 系统内置(Y是 N否) /// + [SugarColumn(Length = 1)] public string ConfigType { get; set; } } diff --git a/ZR.Model/System/SysDept.cs b/ZR.Model/System/SysDept.cs index b38e3af..4e37a0b 100644 --- a/ZR.Model/System/SysDept.cs +++ b/ZR.Model/System/SysDept.cs @@ -6,9 +6,9 @@ namespace ZR.Model.System /// /// 部门表 /// - [SugarTable("sys_dept")] + [SugarTable("sys_dept", "部门配置表")] [Tenant("0")] - public class SysDept: SysBase + public class SysDept : SysBase { /// /// 部门ID @@ -29,6 +29,7 @@ namespace ZR.Model.System /// /// 部门名称 /// + [SugarColumn(Length = 30, ExtendedAttribute = ProteryConstant.NOTNULL)] public string DeptName { get; set; } /// @@ -39,32 +40,36 @@ namespace ZR.Model.System /// /// 负责人 /// + [SugarColumn(Length = 30)] public string Leader { get; set; } /// /// 联系电话 /// + [SugarColumn(Length = 11)] public string Phone { get; set; } /// /// 邮箱 /// + [SugarColumn(Length = 50)] public string Email { get; set; } /// /// 部门状态:0正常,1停用 /// + [SugarColumn(Length = 1, DefaultValue = "0")] public string Status { get; set; } /// /// 删除标志(0代表存在 2代表删除) /// - [SugarColumn(IsOnlyIgnoreInsert = true)] + [SugarColumn(Length = 1, DefaultValue = "0")] public string DelFlag { get; set; } /// /// 子菜单 /// - public List children = new List(); + public List children = new(); } } diff --git a/ZR.Model/System/SysDictData.cs b/ZR.Model/System/SysDictData.cs index d11ad44..9dbccae 100644 --- a/ZR.Model/System/SysDictData.cs +++ b/ZR.Model/System/SysDictData.cs @@ -6,7 +6,7 @@ namespace ZR.Model.System /// 字典数据表 /// [Tenant("0")] - [SugarTable("sys_dict_data")] + [SugarTable("sys_dict_data", "字典数据表")] public class SysDictData : SysBase { /// @@ -21,30 +21,37 @@ namespace ZR.Model.System /// /// 字典标签 /// + [SugarColumn(Length = 100, ExtendedAttribute = ProteryConstant.NOTNULL)] public string DictLabel { get; set; } /// /// 字典键值 /// + [SugarColumn(Length = 100, ExtendedAttribute = ProteryConstant.NOTNULL)] public string DictValue { get; set; } /// /// 字典类型 /// + [SugarColumn(Length = 100, ExtendedAttribute = ProteryConstant.NOTNULL)] public string DictType { get; set; } /// /// 样式属性(其他样式扩展) /// + [SugarColumn(Length = 100)] public string CssClass { get; set; } = string.Empty; /// /// 表格回显样式 /// + [SugarColumn(Length = 100)] public string ListClass { get; set; } = string.Empty; /// /// 是否默认(Y是 N否) /// + [SugarColumn(Length = 1, DefaultValue = "N")] public string IsDefault { get; set; } /// /// 状态(0正常 1停用) /// + [SugarColumn(Length = 1)] public string Status { get; set; } } } diff --git a/ZR.Model/System/SysDictType.cs b/ZR.Model/System/SysDictType.cs index 17b07c1..c323a63 100644 --- a/ZR.Model/System/SysDictType.cs +++ b/ZR.Model/System/SysDictType.cs @@ -5,7 +5,8 @@ namespace ZR.Model.System /// /// 字典类型表 /// - [SugarTable("sys_dict_type")] + [SugarTable("sys_dict_type", "字典类型表")] + [SugarIndex("index_dict_type", nameof(DictType), OrderByType.Asc, true)] [Tenant("0")] public class SysDictType : SysBase { @@ -17,18 +18,22 @@ namespace ZR.Model.System /// /// 字典名称 /// + [SugarColumn(Length = 100, ExtendedAttribute = ProteryConstant.NOTNULL)] public string DictName { get; set; } /// /// 字典类型 /// + [SugarColumn(Length = 100, ExtendedAttribute = ProteryConstant.NOTNULL)] public string DictType { get; set; } /// /// 状态 0、正常 1、停用 /// + [SugarColumn(Length = 1, DefaultValue = "0")] public string Status { get; set; } /// /// 系统内置 Y是 N否 /// + [SugarColumn(Length = 1, DefaultValue = "N")] public string Type { get; set; } /// /// 自定义sql diff --git a/ZR.Model/System/SysFile.cs b/ZR.Model/System/SysFile.cs index 5c18651..cc8eb1d 100644 --- a/ZR.Model/System/SysFile.cs +++ b/ZR.Model/System/SysFile.cs @@ -5,7 +5,7 @@ using System; namespace ZR.Model.System { [Tenant("0")] - [SugarTable("sys_file")] + [SugarTable("sys_file", "文件存储表")] public class SysFile { /// diff --git a/ZR.Model/System/SysLogininfor.cs b/ZR.Model/System/SysLogininfor.cs index 4cdc074..79b979c 100644 --- a/ZR.Model/System/SysLogininfor.cs +++ b/ZR.Model/System/SysLogininfor.cs @@ -6,7 +6,7 @@ namespace ZR.Model.System /// /// sys_logininfor 表 /// - [SugarTable("sys_logininfor")] + [SugarTable("sys_logininfor", "登录日志表")] [Tenant("0")] public class SysLogininfor { @@ -21,32 +21,33 @@ namespace ZR.Model.System /// /// 登录状态 0成功 1失败 /// + [SugarColumn(Length = 1, DefaultValue = "0")] public string Status { get; set; } /// /// 登录IP地址 /// - public string Ipaddr { get; set; } + public string Ipaddr { get; set; } = string.Empty; /// /// 登录地点 /// - public string LoginLocation { get; set; } + public string LoginLocation { get; set; } = string.Empty; /// /// 浏览器类型 /// - public string Browser { get; set; } + public string Browser { get; set; } = string.Empty; /// /// 操作系统 /// - public string Os { get; set; } + public string Os { get; set; } = string.Empty; /// /// 提示消息 /// - public string Msg { get; set; } + public string Msg { get; set; } = string.Empty; /// /// 访问时间 diff --git a/ZR.Model/System/SysMenu.cs b/ZR.Model/System/SysMenu.cs index 8edfc50..028f11e 100644 --- a/ZR.Model/System/SysMenu.cs +++ b/ZR.Model/System/SysMenu.cs @@ -6,7 +6,7 @@ namespace ZR.Model.System /// /// Sys_menu表 /// - [SugarTable("sys_menu")] + [SugarTable("sys_menu", "系统菜单表")] [Tenant("0")] public class SysMenu : SysBase { @@ -18,22 +18,25 @@ namespace ZR.Model.System /// /// 菜单名称 /// + [SugarColumn(Length = 50, ExtendedAttribute = ProteryConstant.NOTNULL)] public string MenuName { get; set; } /// /// 父菜单ID /// + [SugarColumn(DefaultValue = "0")] public long ParentId { get; set; } /// /// 显示顺序 /// + [SugarColumn(DefaultValue = "0")] public int OrderNum { get; set; } /// /// 路由地址 /// - public string Path { get; set; } = "#"; + public string Path { get; set; } = ""; /// /// 组件路径 @@ -43,35 +46,42 @@ namespace ZR.Model.System /// /// 是否缓存(1缓存 0不缓存) /// + [SugarColumn(DefaultValue = "0", ColumnDataType = "int")] public string IsCache { get; set; } /// /// 是否外链 1、是 0、否 /// - public string IsFrame { get; set; } + [SugarColumn(DefaultValue = "0", ColumnDataType = "int")] + public string IsFrame { get; set; } = "0"; /// /// 类型(M目录 C菜单 F按钮 L链接) /// - public string MenuType { get; set; } + [SugarColumn(Length = 1)] + public string MenuType { get; set; } = string.Empty; /// /// 显示状态(0显示 1隐藏) /// + [SugarColumn(DefaultValue = "0", Length = 1)] public string Visible { get; set; } /// /// 菜单状态(0正常 1停用) /// + [SugarColumn(DefaultValue = "0", Length = 1)] public string Status { get; set; } /// /// 权限字符串 /// + [SugarColumn(Length = 100)] public string Perms { get; set; } /// /// 菜单图标 /// + [SugarColumn(DefaultValue = "#")] public string Icon { get; set; } = string.Empty; /// /// 菜单名key diff --git a/ZR.Model/System/SysNotice.cs b/ZR.Model/System/SysNotice.cs index 758fc03..de82a33 100644 --- a/ZR.Model/System/SysNotice.cs +++ b/ZR.Model/System/SysNotice.cs @@ -3,12 +3,12 @@ using SqlSugar; namespace ZR.Model.System { /// - /// 通知公告表,数据实体对象 + /// 通知公告表 /// /// @author zr /// @date 2021-12-15 /// - [SugarTable("sys_notice")] + [SugarTable("sys_notice", "通知公告表")] [Tenant(0)] public class SysNotice : SysBase { @@ -20,21 +20,22 @@ namespace ZR.Model.System /// /// 公告标题 /// - [SugarColumn(ColumnName = "notice_title")] + [SugarColumn(ColumnName = "notice_title", ExtendedAttribute = ProteryConstant.NOTNULL)] public string NoticeTitle { get; set; } /// /// 公告类型 (1通知 2公告) /// - [SugarColumn(ColumnName = "notice_type")] + [SugarColumn(ColumnName = "notice_type", ExtendedAttribute = ProteryConstant.NOTNULL)] public int NoticeType { get; set; } /// /// 公告内容 /// - [SugarColumn(ColumnName = "notice_content")] + [SugarColumn(ColumnName = "notice_content", ColumnDataType = "text")] public string NoticeContent { get; set; } /// /// 公告状态 (0正常 1关闭) /// + [SugarColumn(DefaultValue = "0", ExtendedAttribute = ProteryConstant.NOTNULL)] public int Status { get; set; } } } \ No newline at end of file diff --git a/ZR.Model/System/SysOperLog.cs b/ZR.Model/System/SysOperLog.cs index 9929ffb..3e33e21 100644 --- a/ZR.Model/System/SysOperLog.cs +++ b/ZR.Model/System/SysOperLog.cs @@ -5,22 +5,24 @@ using System.ComponentModel; namespace ZR.Model.System { - [SugarTable("sys_oper_log")] + [SugarTable("sys_oper_log", "操作日志表")] [Tenant("0")] public class SysOperLog { + /// + /// 操作id + /// [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] public long OperId { get; set; } /// /// 操作模块 /// - [DisplayName("操作模块")] public string Title { get; set; } /// /// 业务类型(0其它 1新增 2修改 3删除 4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据) /// - [DisplayName("业务类型")] + [SugarColumn(DefaultValue = "0")] public int BusinessType { get; set; } /// @@ -33,79 +35,71 @@ namespace ZR.Model.System /// /// 请求方法 /// - [DisplayName("请求方法")] public string Method { get; set; } /// /// 请求方式 /// - [DisplayName("请求方式")] public string RequestMethod { get; set; } /// /// 操作类别(0其它 1后台用户 2手机端用户) /// //@Excel(name = "操作类别", readConverterExp = "0=其它,1=后台用户,2=手机端用户") - [DisplayName("操作类别")] + [SugarColumn(DefaultValue = "0")] public int OperatorType { get; set; } /// /// 操作人员 /// - [DisplayName("操作人员")] public string OperName { get; set; } /// /// 请求url /// - [DisplayName("请求地址")] public string OperUrl { get; set; } /// /// 操作地址 /// - [DisplayName("操作地址")] public string OperIp { get; set; } /// /// 操作地点 /// - [DisplayName("操作地点")] public string OperLocation { get; set; } /// /// 请求参数 /// - [DisplayName("请求参数")] + [SugarColumn(Length = 2000)] public string OperParam { get; set; } /// /// 返回参数 /// - [DisplayName("返回结果")] + [SugarColumn(ColumnDataType = "text")] public string JsonResult { get; set; } /// /// 操作状态(0正常 1异常) /// - [DisplayName("状态")] + [SugarColumn(DefaultValue = "0")] public int Status { get; set; } /// /// 错误消息 /// - [DisplayName("错误消息")] public string ErrorMsg { get; set; } /// /// 操作时间 /// - [DisplayName("操作时间")] public DateTime? OperTime { get; set; } /// /// 操作用时 /// - [DisplayName("操作用时")] public long Elapsed { get; set; } + public string DeptName { get; set; } } } diff --git a/ZR.Model/System/SysPost.cs b/ZR.Model/System/SysPost.cs index 8441f26..26edfcf 100644 --- a/ZR.Model/System/SysPost.cs +++ b/ZR.Model/System/SysPost.cs @@ -2,7 +2,7 @@ namespace ZR.Model.System { - [SugarTable("sys_post")] + [SugarTable("sys_post", "岗位表")] [Tenant("0")] public class SysPost : SysBase { @@ -11,9 +11,13 @@ namespace ZR.Model.System /// [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] public long PostId { get; set; } + [SugarColumn(ExtendedAttribute = ProteryConstant.NOTNULL)] public string PostCode { get; set; } + [SugarColumn(ExtendedAttribute = ProteryConstant.NOTNULL)] public string PostName { get; set; } + [SugarColumn(ExtendedAttribute = ProteryConstant.NOTNULL)] public int PostSort { get; set; } + [SugarColumn(Length = 1)] public string Status { get; set; } } } diff --git a/ZR.Model/System/SysRole.cs b/ZR.Model/System/SysRole.cs index dea2527..3f48946 100644 --- a/ZR.Model/System/SysRole.cs +++ b/ZR.Model/System/SysRole.cs @@ -5,7 +5,7 @@ namespace ZR.Model.System /// /// 角色表 sys_role /// - [SugarTable("sys_role")] + [SugarTable("sys_role", "角色表")] [Tenant("0")] public class SysRole : SysBase { @@ -18,41 +18,47 @@ namespace ZR.Model.System /// /// 角色名称 /// + [SugarColumn(Length = 30, ExtendedAttribute = ProteryConstant.NOTNULL)] public string RoleName { get; set; } /// /// 角色权限 /// + [SugarColumn(Length = 100, ExtendedAttribute = ProteryConstant.NOTNULL)] public string RoleKey { get; set; } /// /// 角色排序 /// + [SugarColumn(ExtendedAttribute = ProteryConstant.NOTNULL)] public int RoleSort { get; set; } /// /// 帐号状态(0正常 1停用) /// + [SugarColumn(DefaultValue = "0")] public int Status { get; set; } /// /// 删除标志(0代表存在 2代表删除) /// + [SugarColumn(DefaultValue = "0")] public int DelFlag { get; set; } /// /// 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)) /// + [SugarColumn(DefaultValue = "1")] public int DataScope { get; set; } /// /// 菜单树选择项是否关联显示 /// [SugarColumn(ColumnName = "menu_check_strictly")] - public bool MenuCheckStrictly { get; set; } + public bool MenuCheckStrictly { get; set; } = true; /// /// 部门树选择项是否关联显示 /// [SugarColumn(ColumnName = "dept_check_strictly")] - public bool DeptCheckStrictly { get; set; } + public bool DeptCheckStrictly { get; set; } = true; /// /// 菜单组 /// diff --git a/ZR.Model/System/SysRoleDept.cs b/ZR.Model/System/SysRoleDept.cs index bbe4a96..168d048 100644 --- a/ZR.Model/System/SysRoleDept.cs +++ b/ZR.Model/System/SysRoleDept.cs @@ -1,10 +1,15 @@ -namespace ZR.Model.System +using SqlSugar; + +namespace ZR.Model.System { - [SqlSugar.SugarTable("sys_role_dept")] - [SqlSugar.Tenant(0)] + [SugarTable("sys_role_dept", "角色部门")] + [Tenant(0)] public class SysRoleDept { + [SugarColumn(ExtendedAttribute = ProteryConstant.NOTNULL, IsPrimaryKey = true)] public long RoleId { get; set; } + + [SugarColumn(ExtendedAttribute = ProteryConstant.NOTNULL, IsPrimaryKey = true)] public long DeptId { get; set; } } } diff --git a/ZR.Model/System/SysRoleMenu.cs b/ZR.Model/System/SysRoleMenu.cs index ba32d30..94a6fa6 100644 --- a/ZR.Model/System/SysRoleMenu.cs +++ b/ZR.Model/System/SysRoleMenu.cs @@ -7,17 +7,15 @@ namespace ZR.Model.System /// /// 角色菜单 /// - [SugarTable("sys_role_menu")] + [SugarTable("sys_role_menu", "角色菜单")] [Tenant("0")] - public class SysRoleMenu + public class SysRoleMenu : SysBase { [JsonProperty("roleId")] - [SugarColumn(IsPrimaryKey = true)] + [SugarColumn(IsPrimaryKey = true, ExtendedAttribute = ProteryConstant.NOTNULL)] public long Role_id { get; set; } [JsonProperty("menuId")] - [SugarColumn(IsPrimaryKey = true)] + [SugarColumn(IsPrimaryKey = true, ExtendedAttribute = ProteryConstant.NOTNULL)] public long Menu_id { get; set; } - public DateTime Create_time { get; set; } - public string Create_by { get; set; } } } diff --git a/ZR.Model/System/SysRolePost.cs b/ZR.Model/System/SysRolePost.cs deleted file mode 100644 index d0cee95..0000000 --- a/ZR.Model/System/SysRolePost.cs +++ /dev/null @@ -1,15 +0,0 @@ -using SqlSugar; - -namespace ZR.Model.System -{ - /// - /// 角色部门 - /// - [SugarTable("sys_role_post")] - [Tenant("0")] - public class SysRolePost - { - public long RoleId { get; set; } - public long DeptId { get; set; } - } -} diff --git a/ZR.Model/System/SysTasks.cs b/ZR.Model/System/SysTasks.cs index 56519f7..b1a413c 100644 --- a/ZR.Model/System/SysTasks.cs +++ b/ZR.Model/System/SysTasks.cs @@ -1,5 +1,4 @@ -using Newtonsoft.Json; -using SqlSugar; +using SqlSugar; using System; using System.ComponentModel.DataAnnotations; @@ -8,9 +7,9 @@ namespace ZR.Model.System /// ///计划任务 /// - [SugarTable("sys_tasks")] + [SugarTable("sys_tasks", "计划任务表")] [Tenant("0")] - public class SysTasks + public class SysTasks : SysBase { public SysTasks() { @@ -28,42 +27,42 @@ namespace ZR.Model.System /// 任务名称 /// [Display(Name = "任务名称")] + [SugarColumn(ExtendedAttribute = ProteryConstant.NOTNULL)] public string Name { get; set; } /// /// 任务分组 /// [Display(Name = "任务分组")] + [SugarColumn(ExtendedAttribute = ProteryConstant.NOTNULL)] public string JobGroup { get; set; } /// /// 运行时间表达式 /// [Display(Name = "运行时间表达式")] + [SugarColumn(ExtendedAttribute = ProteryConstant.NOTNULL)] public string Cron { get; set; } /// /// 程序集名称 /// [Display(Name = "程序集名称")] + [SugarColumn(ExtendedAttribute = ProteryConstant.NOTNULL)] public string AssemblyName { get; set; } /// /// 任务所在类 /// [Display(Name = "任务所在类")] + [SugarColumn(ExtendedAttribute = ProteryConstant.NOTNULL)] public string ClassName { get; set; } - /// - /// 任务描述 - /// - [Display(Name = "任务描述")] - public string Remark { get; set; } - /// /// 执行次数 /// [Display(Name = "执行次数")] + [SugarColumn(DefaultValue = "0", ExtendedAttribute = ProteryConstant.NOTNULL)] public int RunTimes { get; set; } /// @@ -83,6 +82,7 @@ namespace ZR.Model.System /// 默认 : 1 /// [Display(Name = "触发器类型(0、simple 1、cron)")] + [SugarColumn(ExtendedAttribute = ProteryConstant.NOTNULL)] public int TriggerType { get; set; } /// @@ -90,42 +90,22 @@ namespace ZR.Model.System /// 默认 : 0 /// [Display(Name = "执行间隔时间(单位:秒)")] + [SugarColumn(ExtendedAttribute = ProteryConstant.NOTNULL)] public int IntervalSecond { get; set; } /// /// 是否启动 - /// 默认 : 0 /// [Display(Name = "是否启动")] + [SugarColumn(DefaultValue = "0", ExtendedAttribute = ProteryConstant.NOTNULL)] public int IsStart { get; set; } /// /// 传入参数 - /// 默认 : /// [Display(Name = "传入参数")] public string JobParams { get; set; } - [SugarColumn(IsOnlyIgnoreUpdate = true)]//设置后修改不会有此字段 - [JsonProperty(propertyName: "CreateBy")] - public string Create_by { get; set; } - - /// - /// 创建时间 - /// - //[Display(Name = "创建时间")] - [SugarColumn(IsOnlyIgnoreUpdate = true)]//设置后修改不会有此字段 - [JsonProperty(propertyName: "CreateTime")] - public DateTime Create_time { get; set; } = DateTime.Now; - - [JsonIgnore] - [JsonProperty(propertyName: "UpdateBy")] - [SugarColumn(IsOnlyIgnoreInsert = true)] - public string Update_by { get; set; } - - [SugarColumn(IsOnlyIgnoreInsert = true)]//设置后插入数据不会有此字段 - [JsonProperty(propertyName: "UpdateTime")] - public DateTime Update_time { get; set; } = DateTime.Now; /// /// 最后运行时间 /// @@ -137,6 +117,7 @@ namespace ZR.Model.System /// /// 任务类型 1、程序集 2、网络请求 3、SQL语句 /// + [SugarColumn(DefaultValue = "1")] public int TaskType { get; set; } /// @@ -146,6 +127,7 @@ namespace ZR.Model.System /// /// 网络请求方式 /// + [SugarColumn(Length = 20)] public string RequestMethod { get; set; } } } diff --git a/ZR.Model/System/SysTasksLog.cs b/ZR.Model/System/SysTasksLog.cs index 666f1ea..88fbcfc 100644 --- a/ZR.Model/System/SysTasksLog.cs +++ b/ZR.Model/System/SysTasksLog.cs @@ -6,7 +6,7 @@ namespace ZR.Model.System /// /// 任务日志 /// - [SugarTable("sys_tasks_log")] + [SugarTable("sys_tasks_log", "任务日志表")] [Tenant("0")] public class SysTasksLog { @@ -18,12 +18,22 @@ namespace ZR.Model.System /// /// 任务Id /// + [SugarColumn(ExtendedAttribute = ProteryConstant.NOTNULL)] public string JobId { get; set; } + /// + /// 任务名 + /// + [SugarColumn(ExtendedAttribute = ProteryConstant.NOTNULL)] public string JobName { get; set; } + /// + /// 任务分组 + /// + [SugarColumn(ExtendedAttribute = ProteryConstant.NOTNULL)] public string JobGroup { get; set; } /// /// 执行状态(0正常 1失败) /// + [SugarColumn(DefaultValue = "0")] public string Status { get; set; } /// /// 异常 diff --git a/ZR.Model/System/SysUser.cs b/ZR.Model/System/SysUser.cs index e9d31ae..ff55b72 100644 --- a/ZR.Model/System/SysUser.cs +++ b/ZR.Model/System/SysUser.cs @@ -9,7 +9,7 @@ namespace ZR.Model.System /// /// 用户表 /// - [SugarTable("sys_user")] + [SugarTable("sys_user", "用户表")] [Tenant("0")] public class SysUser : SysBase { @@ -21,12 +21,12 @@ namespace ZR.Model.System /// /// 登录用户名 /// - [SugarColumn(Length = 30, ColumnDescription = "用户账号", IsNullable = false)] + [SugarColumn(Length = 30, ColumnDescription = "用户账号", ExtendedAttribute = ProteryConstant.NOTNULL)] public string UserName { get; set; } /// /// 用户昵称 /// - [SugarColumn(Length = 30, ColumnDescription = "用户昵称", IsNullable = false)] + [SugarColumn(Length = 30, ColumnDescription = "用户昵称", ExtendedAttribute = ProteryConstant.NOTNULL)] public string NickName { get; set; } /// /// 用户类型(00系统用户) @@ -40,7 +40,7 @@ namespace ZR.Model.System [JsonIgnore] [ExcelIgnore] - [SugarColumn(Length = 100, ColumnDescription = "密码", IsNullable = false)] + [SugarColumn(Length = 100, ColumnDescription = "密码", ExtendedAttribute = ProteryConstant.NOTNULL)] public string Password { get; set; } /// /// 手机号 diff --git a/ZR.Model/System/SysUserPost.cs b/ZR.Model/System/SysUserPost.cs index e58c2f1..7eadfd0 100644 --- a/ZR.Model/System/SysUserPost.cs +++ b/ZR.Model/System/SysUserPost.cs @@ -5,11 +5,13 @@ namespace ZR.Model.System /// /// 用户岗位 /// - [SugarTable("sys_user_post")] + [SugarTable("sys_user_post", "用户与岗位关联表")] [Tenant("0")] public class SysUserPost { + [SugarColumn(IsPrimaryKey = true, ExtendedAttribute = ProteryConstant.NOTNULL)] public long UserId { get; set; } + [SugarColumn(IsPrimaryKey = true, ExtendedAttribute = ProteryConstant.NOTNULL)] public long PostId { get; set; } } } diff --git a/ZR.Model/System/SysUserRole.cs b/ZR.Model/System/SysUserRole.cs index fab8cfd..c1570dc 100644 --- a/ZR.Model/System/SysUserRole.cs +++ b/ZR.Model/System/SysUserRole.cs @@ -5,7 +5,7 @@ namespace ZR.Model.System /// /// 用户角色关联表 用户N-1 角色 /// - [SugarTable("sys_user_role")] + [SugarTable("sys_user_role", "用户和角色关联表")] [Tenant("0")] public class SysUserRole { diff --git a/ZR.Model/ZR.Model.csproj b/ZR.Model/ZR.Model.csproj index 627c363..dde0b12 100644 --- a/ZR.Model/ZR.Model.csproj +++ b/ZR.Model/ZR.Model.csproj @@ -10,8 +10,7 @@ - + - diff --git a/ZR.Repository/ZR.Repository.csproj b/ZR.Repository/ZR.Repository.csproj index 7ff20e2..5ccc57d 100644 --- a/ZR.Repository/ZR.Repository.csproj +++ b/ZR.Repository/ZR.Repository.csproj @@ -15,6 +15,6 @@ - + diff --git a/ZR.Service/System/IService/ISysUserService.cs b/ZR.Service/System/IService/ISysUserService.cs index 493ac59..eb463fb 100644 --- a/ZR.Service/System/IService/ISysUserService.cs +++ b/ZR.Service/System/IService/ISysUserService.cs @@ -7,7 +7,7 @@ namespace ZR.Service.System.IService { public interface ISysUserService : IBaseService { - public PagedInfo SelectUserList(SysUser user, PagerInfo pager); + public PagedInfo SelectUserList(SysUserQueryDto user, PagerInfo pager); /// /// 通过用户ID查询用户 diff --git a/ZR.Service/System/SysMenuService.cs b/ZR.Service/System/SysMenuService.cs index 62aecb3..88e76f4 100644 --- a/ZR.Service/System/SysMenuService.cs +++ b/ZR.Service/System/SysMenuService.cs @@ -577,7 +577,6 @@ namespace ZR.Service Path = genTableInfo.BusinessName, Component = $"{genTableInfo.ModuleName.FirstLowerCase()}/{genTableInfo.BusinessName}", Perms = $"{permPrefix}:list", - IsFrame = "0", IsCache = "1", MenuType = "C", Visible = "0", @@ -596,7 +595,6 @@ namespace ZR.Service ParentId = menu.MenuId, OrderNum = 1, Perms = $"{permPrefix}:query", - IsFrame = "0", MenuType = "F", Visible = "0", Status = "0", @@ -608,7 +606,6 @@ namespace ZR.Service ParentId = menu.MenuId, OrderNum = 2, Perms = $"{permPrefix}:add", - IsFrame = "0", MenuType = "F", Visible = "0", Status = "0", @@ -620,7 +617,6 @@ namespace ZR.Service ParentId = menu.MenuId, OrderNum = 3, Perms = $"{permPrefix}:delete", - IsFrame = "0", MenuType = "F", Visible = "0", Status = "0", @@ -633,7 +629,6 @@ namespace ZR.Service ParentId = menu.MenuId, OrderNum = 4, Perms = $"{permPrefix}:edit", - IsFrame = "0", MenuType = "F", Visible = "0", Status = "0", @@ -646,7 +641,6 @@ namespace ZR.Service ParentId = menu.MenuId, OrderNum = 5, Perms = $"{permPrefix}:export", - IsFrame = "0", MenuType = "F", Visible = "0", Status = "0", diff --git a/ZR.Service/System/SysUserService.cs b/ZR.Service/System/SysUserService.cs index 47b900a..ee874d4 100644 --- a/ZR.Service/System/SysUserService.cs +++ b/ZR.Service/System/SysUserService.cs @@ -39,7 +39,7 @@ namespace ZR.Service /// 根据条件分页查询用户列表 /// /// - public PagedInfo SelectUserList(SysUser user, PagerInfo pager) + public PagedInfo SelectUserList(SysUserQueryDto user, PagerInfo pager) { var exp = Expressionable.Create(); exp.AndIF(!string.IsNullOrEmpty(user.UserName), u => u.UserName.Contains(user.UserName)); @@ -323,7 +323,7 @@ namespace ZR.Service /// public SysUser Login(LoginBodyDto user) { - return GetFirst(it => it.UserName == user.Username && it.Password == user.Password); + return GetFirst(it => it.UserName == user.Username && it.Password.ToLower() == user.Password.ToLower()); } /// diff --git a/document/mysql/admin-mysql.sql b/document/mysql/admin-mysql.sql index 2743423..e8b4d55 100644 --- a/document/mysql/admin-mysql.sql +++ b/document/mysql/admin-mysql.sql @@ -96,8 +96,8 @@ CREATE TABLE `sys_dept` ( `leader` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '负责人', `phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系电话', `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱', - `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '部门状态(0正常 1停用)', - `delFlag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '部门状态(0正常 1停用)', + `delFlag` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', @@ -181,9 +181,9 @@ CREATE TABLE `sys_menu` ( `component` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组件路径', `isFrame` int(1) NULL DEFAULT 0 COMMENT '是否外链(0 否 1 是)', `isCache` int(1) NULL DEFAULT 0 COMMENT '是否缓存(0缓存 1不缓存)', - `menuType` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '菜单类型(M目录 C菜单 F按钮 L链接)', - `visible` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '菜单状态(0显示 1隐藏)', - `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '菜单状态(0正常 1停用)', + `menuType` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '菜单类型(M目录 C菜单 F按钮 L链接)', + `visible` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '菜单状态(0显示 1隐藏)', + `status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '菜单状态(0正常 1停用)', `perms` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '权限标识', `icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '#' COMMENT '菜单图标', `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', @@ -229,7 +229,7 @@ CREATE TABLE `sys_post` ( `postCode` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '岗位编码', `postName` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '岗位名称', `postSort` int(4) NOT NULL COMMENT '显示顺序', - `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '状态(0正常 1停用)', + `status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '状态(0正常 1停用)', `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', @@ -374,7 +374,7 @@ create table sys_config ( configName varchar(100) default '' comment '参数名称', configKey varchar(100) default '' comment '参数键名', configValue varchar(500) default '' comment '参数键值', - configType char(1) default 'N' comment '系统内置(Y是 N否)', + configType varchar(1) default 'N' comment '系统内置(Y是 N否)', create_by varchar(64) default '' comment '创建者', create_time datetime comment '创建时间', update_by varchar(64) default '' comment '更新者', diff --git a/document/pgsql/admin-pg15.sql b/document/pgsql/admin-pg15.sql index 31ad71b..abb95cf 100644 --- a/document/pgsql/admin-pg15.sql +++ b/document/pgsql/admin-pg15.sql @@ -788,8 +788,8 @@ CREATE TABLE "public"."sys_role" ( "rolekey" varchar(100) COLLATE "pg_catalog"."default" NOT NULL, "rolesort" int4 NOT NULL, "datascope" int4 COLLATE "pg_catalog"."default", - "menu_check_strictly" int2, - "dept_check_strictly" int2 NOT NULL, + "menu_check_strictly" bool, + "dept_check_strictly" bool NOT NULL, "status" int4 COLLATE "pg_catalog"."default" NOT NULL, "delflag" int4 COLLATE "pg_catalog"."default" NOT NULL, "create_by" varchar(64) COLLATE "pg_catalog"."default", diff --git a/document/sqlserver/admin-sqlserver.sql b/document/sqlserver/admin-sqlserver.sql index e49d7f6..a2bd8e5 100644 --- a/document/sqlserver/admin-sqlserver.sql +++ b/document/sqlserver/admin-sqlserver.sql @@ -104,8 +104,8 @@ CREATE TABLE sys_dict_type ( customSql varchar(500) NULL DEFAULT NULL ,-- '自定义sql', ) GO -CREATE UNIQUE INDEX dictType ON dbo.sys_dict_type(dictType) -GO +--CREATE UNIQUE INDEX dictType ON dbo.sys_dict_type(dictType) +--GO if OBJECT_ID(N'sys_dict_data',N'U') is not NULL DROP TABLE sys_dict_data GO @@ -137,7 +137,7 @@ CREATE TABLE sys_logininfor ( loginLocation varchar(255) NULL DEFAULT '' ,-- '登录地点', browser varchar(50) NULL DEFAULT '' ,-- '浏览器类型', os varchar(50) NULL DEFAULT '' ,-- '操作系统', - status char(1) NULL DEFAULT '0' ,-- '登录状态(0成功 1失败)', + status varchar(1) NULL DEFAULT '0' ,-- '登录状态(0成功 1失败)', msg varchar(255) NULL DEFAULT '' ,-- '提示消息', loginTime DATETIME NULL DEFAULT NULL ,-- '访问时间', ) @@ -153,9 +153,9 @@ CREATE TABLE sys_menu ( component varchar(255) NULL DEFAULT NULL ,-- '组件路径', isFrame int NULL DEFAULT 0 ,-- '是否外链(0 否 1 是)', isCache int NULL DEFAULT 0 ,-- '是否缓存(0缓存 1不缓存)', - menuType char(1) NULL DEFAULT '' ,-- '菜单类型(M目录 C菜单 F按钮 L链接)', - visible char(1) NULL DEFAULT '0' ,-- '菜单状态(0显示 1隐藏)', - status char(1) NULL DEFAULT '0' ,-- '菜单状态(0正常 1停用)', + menuType varchar(1) NULL DEFAULT '' ,-- '菜单类型(M目录 C菜单 F按钮 L链接)', + visible varchar(1) NULL DEFAULT '0' ,-- '菜单状态(0显示 1隐藏)', + status varchar(1) NULL DEFAULT '0' ,-- '菜单状态(0正常 1停用)', perms varchar(100) NULL DEFAULT NULL ,-- '权限标识', icon varchar(100) NULL DEFAULT '#' ,-- '菜单图标', create_by varchar(64) NULL DEFAULT '' ,-- '创建者', @@ -186,7 +186,7 @@ CREATE TABLE sys_oper_log ( operIP varchar(50) DEFAULT '' , -- '主机地址', operLocation varchar(255) DEFAULT '' , -- '操作地点', operParam varchar(2000) DEFAULT '' , -- '请求参数', - jsonResult varchar(max) DEFAULT '' , -- '返回参数', + jsonResult TEXT DEFAULT '' , -- '返回参数', status int NULL DEFAULT 0 , -- '操作状态(0正常 1异常)', errorMsg varchar(2000) DEFAULT '' , -- '错误消息', operTime datetime NULL DEFAULT NULL , -- '操作时间', @@ -265,8 +265,8 @@ CREATE TABLE sys_role ( roleKey varchar(100) NOT NULL , -- '角色权限字符串', roleSort int NOT NULL , -- '显示顺序', dataScope int NULL DEFAULT 1 , -- '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 )', - menu_check_strictly int NULL DEFAULT 1 , -- '菜单树选择项是否关联显示', - dept_check_strictly int NOT NULL DEFAULT 1 , -- '部门树选择项是否关联显示', + menu_check_strictly BIT NOT NULL DEFAULT 1 , -- '菜单树选择项是否关联显示', + dept_check_strictly BIT NOT NULL DEFAULT 1 , -- '部门树选择项是否关联显示', status int NOT NULL , -- '角色状态(0正常 1停用)', delFlag int NOT NULL DEFAULT 0 , -- '删除标志(0代表存在 2代表删除)', create_by varchar(64) NULL DEFAULT '' , -- '创建者', @@ -310,7 +310,10 @@ CREATE TABLE sys_role_menu ( role_id bigint NOT NULL , -- '角色ID', menu_id bigint NOT NULL , -- '菜单ID', create_by varchar(20) DEFAULT NULL, - create_time datetime NULL DEFAULT NULL + create_time datetime NULL DEFAULT NULL, + update_by VARCHAR(20) DEFAULT NULL, + update_time DATETIME NULL , + remark VARCHAR(100) ) GO alter table sys_role_menu add primary key(menu_id,role_id) From 1af7e778af0c362858f27b6fba86805af888b79c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com> Date: Fri, 9 Jun 2023 18:10:38 +0800 Subject: [PATCH 15/27] =?UTF-8?q?:zap:=20codeFirst=E5=AE=9E=E4=BD=93?= =?UTF-8?q?=E5=BB=BA=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/AppServiceExtensions.cs | 2 -- ZR.Admin.WebApi/Extensions/DbExtension.cs | 35 ++++++++----------- .../Extensions/SwaggerExtension.cs | 10 ++++-- ZR.Admin.WebApi/Program.cs | 17 ++++----- ZR.Admin.WebApi/ZR.Admin.WebApi.csproj | 3 +- ZR.CodeGenerator/ZR.CodeGenerator.csproj | 2 +- ZR.Model/ZR.Model.csproj | 5 ++- ZR.Repository/ZR.Repository.csproj | 2 +- 8 files changed, 33 insertions(+), 43 deletions(-) diff --git a/ZR.Admin.WebApi/Extensions/AppServiceExtensions.cs b/ZR.Admin.WebApi/Extensions/AppServiceExtensions.cs index 03b9105..466f372 100644 --- a/ZR.Admin.WebApi/Extensions/AppServiceExtensions.cs +++ b/ZR.Admin.WebApi/Extensions/AppServiceExtensions.cs @@ -1,7 +1,5 @@ using Infrastructure; using Infrastructure.Attribute; -using Microsoft.Extensions.DependencyInjection; -using System.Linq; using System.Reflection; namespace ZR.Admin.WebApi.Extensions diff --git a/ZR.Admin.WebApi/Extensions/DbExtension.cs b/ZR.Admin.WebApi/Extensions/DbExtension.cs index eec1f86..455a650 100644 --- a/ZR.Admin.WebApi/Extensions/DbExtension.cs +++ b/ZR.Admin.WebApi/Extensions/DbExtension.cs @@ -24,16 +24,14 @@ namespace ZR.Admin.WebApi.Extensions //仅本人数据权限 public static long DATA_SCOPE_SELF = 5; - private static XmlCommentHelper commentHelper = new XmlCommentHelper(); - /// /// 初始化db /// /// /// - public static void AddDb(this IServiceCollection services, IConfiguration Configuration) + /// + public static void AddDb(this IServiceCollection services, IConfiguration Configuration, IWebHostEnvironment environment) { - commentHelper.LoadAll(); List dbConfigs = Configuration.GetSection("DbConfigs").Get>(); var iocList = new List(); @@ -64,6 +62,11 @@ namespace ZR.Admin.WebApi.Extensions SetSugarAop(db, iocConfig, cache); }); }); + + if(Configuration["InitDb"].ParseToBool() == true && environment.IsDevelopment()) + { + InitDb(); + } } /// @@ -74,8 +77,8 @@ namespace ZR.Admin.WebApi.Extensions /// private static void SetSugarAop(SqlSugarClient db, IocConfig iocConfig, ICacheService cache) { - var config = db.GetConnection(iocConfig.ConfigId).CurrentConnectionConfig; - + var config = db.GetConnectionScope(iocConfig.ConfigId).CurrentConnectionConfig; + string configId = config.ConfigId; db.GetConnectionScope(configId).Aop.OnLogExecuting = (sql, pars) => { @@ -107,6 +110,9 @@ namespace ZR.Admin.WebApi.Extensions logger.Error(ex, $"{sql}\r\n{ex.Message}\r\n{ex.StackTrace}"); }; + db.GetConnectionScope(configId).Aop.DataExecuting = (oldValue, entiyInfo) => + { + }; db.GetConnectionScope(configId).CurrentConnectionConfig.MoreSettings = new ConnMoreSettings() { IsAutoRemoveDataCache = true @@ -118,11 +124,6 @@ namespace ZR.Admin.WebApi.Extensions { p.DbTableName = p.DbTableName.FirstLowerCase(); p.DbColumnName = p.DbColumnName.FirstLowerCase(); - var des = commentHelper.GetFieldOrPropertyComment(c); - if (des.IsNotEmpty()) - { - p.ColumnDescription = des; - } if (db.GetConnectionScope(configId).CurrentConnectionConfig.DbType == DbType.PostgreSQL) { @@ -149,26 +150,20 @@ namespace ZR.Admin.WebApi.Extensions } } }; - - db.GetConnectionScope(configId).Aop.DataExecuting = (oldValue, entiyInfo) => - { - - }; } /// /// 创建db、表 /// - /// - public static void InitDb(this IServiceProvider service) + public static void InitDb() { var db = DbScoped.SugarScope; //建库:如果不存在创建数据库存在不会重复创建 db.DbMaintenance.CreateDatabase();// 注意 :Oracle和个别国产库需不支持该方法,需要手动建库 var baseType = typeof(SysBase); - var entityes = AssemblyUtils.GetAllTypes().Where(p => !p.IsAbstract && p != baseType && /*p.IsAssignableTo(baseType) && */p.GetCustomAttribute() != null).ToArray(); - + var entityes = AssemblyUtils.GetAllTypes().Where(p => !p.IsAbstract && p != baseType && p.GetCustomAttribute() != null).ToArray(); + //23个表 db.CodeFirst.InitTables(entityes); } diff --git a/ZR.Admin.WebApi/Extensions/SwaggerExtension.cs b/ZR.Admin.WebApi/Extensions/SwaggerExtension.cs index 8d73605..a4c12f9 100644 --- a/ZR.Admin.WebApi/Extensions/SwaggerExtension.cs +++ b/ZR.Admin.WebApi/Extensions/SwaggerExtension.cs @@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.Filters; +using System.Reflection; namespace ZR.Admin.WebApi.Extensions { @@ -52,9 +53,12 @@ namespace ZR.Admin.WebApi.Extensions { //var tempPath = hostEnvironment.ContentRootPath; //添加文档注释 - c.IncludeXmlComments(Path.Combine("ZRAdmin.xml"), true); - c.IncludeXmlComments(Path.Combine("ZRModel.xml"), true); - //c.IncludeXmlComments(Path.Combine(Directory.GetParent(tempPath).FullName, "ZR.Model", "ZRModel.xml"), true); + var baseDir = AppContext.BaseDirectory; + c.IncludeXmlComments(Path.Combine(baseDir, "ZR.Model.xml"), true); + + var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; + var xmlPath = Path.Combine(baseDir, xmlFile); + c.IncludeXmlComments(xmlPath); } catch (Exception ex) { diff --git a/ZR.Admin.WebApi/Program.cs b/ZR.Admin.WebApi/Program.cs index f6a9cad..781ac92 100644 --- a/ZR.Admin.WebApi/Program.cs +++ b/ZR.Admin.WebApi/Program.cs @@ -1,15 +1,14 @@ +using AspNetCoreRateLimit; using Infrastructure; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.DataProtection; -using ZR.Admin.WebApi.Framework; -using Infrastructure.Extensions; +using Microsoft.IdentityModel.Tokens; using ZR.Admin.WebApi.Extensions; using ZR.Admin.WebApi.Filters; -using ZR.Admin.WebApi.Middleware; +using ZR.Admin.WebApi.Framework; using ZR.Admin.WebApi.Hubs; +using ZR.Admin.WebApi.Middleware; using ZR.Common.Cache; -using AspNetCoreRateLimit; -using Microsoft.IdentityModel.Tokens; var builder = WebApplication.CreateBuilder(args); @@ -68,8 +67,6 @@ builder.Services.AddSingleton(new AppSettings(builder.Configuration)); builder.Services.AddAppService(); //开启计划任务 builder.Services.AddTaskSchedulers(); -//初始化db -builder.Services.AddDb(builder.Configuration); //注册REDIS 服务 var openRedis = builder.Configuration["RedisServer:open"]; @@ -92,10 +89,8 @@ builder.Services.AddSwaggerConfig(); var app = builder.Build(); InternalApp.ServiceProvider = app.Services; -if (builder.Configuration["InitDb"].ParseToBool() == true && app.Environment.IsDevelopment()) -{ - app.Services.InitDb(); -} +//初始化db +builder.Services.AddDb(builder.Configuration, app.Environment); app.UseSwagger(); diff --git a/ZR.Admin.WebApi/ZR.Admin.WebApi.csproj b/ZR.Admin.WebApi/ZR.Admin.WebApi.csproj index 18f8c35..927843a 100644 --- a/ZR.Admin.WebApi/ZR.Admin.WebApi.csproj +++ b/ZR.Admin.WebApi/ZR.Admin.WebApi.csproj @@ -3,10 +3,9 @@ net7.0 enable enable - True + true - ZRAdmin.xml 1701;1702;1591,8603,8602,8604,8600 diff --git a/ZR.CodeGenerator/ZR.CodeGenerator.csproj b/ZR.CodeGenerator/ZR.CodeGenerator.csproj index e697420..71788a3 100644 --- a/ZR.CodeGenerator/ZR.CodeGenerator.csproj +++ b/ZR.CodeGenerator/ZR.CodeGenerator.csproj @@ -12,6 +12,6 @@ - + diff --git a/ZR.Model/ZR.Model.csproj b/ZR.Model/ZR.Model.csproj index dde0b12..848f750 100644 --- a/ZR.Model/ZR.Model.csproj +++ b/ZR.Model/ZR.Model.csproj @@ -2,15 +2,14 @@ net7.0 - True - ../ZR.Admin.WebApi/ZRModel.xml + true 1701;1702;1591;1570 - + diff --git a/ZR.Repository/ZR.Repository.csproj b/ZR.Repository/ZR.Repository.csproj index 5ccc57d..b100ff4 100644 --- a/ZR.Repository/ZR.Repository.csproj +++ b/ZR.Repository/ZR.Repository.csproj @@ -15,6 +15,6 @@ - + From 5185a8c4d333509560c9fa417c847e6054851207 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com> Date: Fri, 9 Jun 2023 21:01:35 +0800 Subject: [PATCH 16/27] =?UTF-8?q?:pencil:=20=E5=A2=9E=E5=8A=A0=E6=BC=94?= =?UTF-8?q?=E7=A4=BA=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 20 +++++++++++++++++++- document/images/1.png | Bin 127407 -> 163407 bytes document/images/14.png | Bin 73675 -> 575583 bytes document/images/a1.png | Bin 0 -> 18072 bytes document/images/a2.png | Bin 0 -> 30618 bytes document/images/a4.png | Bin 0 -> 12482 bytes document/images/a5.png | Bin 0 -> 13653 bytes document/images/a6.png | Bin 0 -> 24993 bytes document/images/a8.png | Bin 0 -> 21173 bytes 9 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 document/images/a1.png create mode 100644 document/images/a2.png create mode 100644 document/images/a4.png create mode 100644 document/images/a5.png create mode 100644 document/images/a6.png create mode 100644 document/images/a8.png diff --git a/README.md b/README.md index 07ee1e5..b7afa87 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

ZR.Admin.NET后台管理系统

-

基于.NET5/.Net7 + vue2.x/vue3.x前后端分离的.net快速开发框架

+

基于.NET5/.Net7 + vue2.x/vue3.x/uniapp前后端分离的.net快速开发框架

@@ -146,6 +146,24 @@ Vue 版前端技术栈 :基于 vue2.x/vue3.x、vuex、vue-router 、vue-cli +## 移动端演示图 + + + + + + + + + + + + + + + +
+ ## 🎉 优势 1. 前台系统不用编写登录、授权、认证模块;只负责编写业务模块即可 diff --git a/document/images/1.png b/document/images/1.png index 7086dd7e825b7fae1ec2f292d12efd7aa38f0049..d146fc001b88ce94367abacd431435a4ceda7adc 100644 GIT binary patch literal 163407 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%0D^gy;=hCHIW@nKpOkcgOd_HxBC~1l_BE z4(S1#ZG5^`OIX(iCnux8rBKhHlyH2Tzadq{L2kKK;NgIF_w&qfQs8db&C!GSx=2>~ z>$~Tc1+AGEx5B&BTQ5C2qwl&Pqz268JhjsW%aNe$LU!nml;5@SRroW|YJ~(t%#;Rq zyaJ(W{C$a&)1bK~ZySZc;{a9FtXcAbG;ov>z46SozHs+V#)K7v8Xg`D4hp{ zDmF)h#Edj&j{O^AQ&h zc$iudt3_hfWn5F-(||X(*xEpulUMrom99J9JAT`q;!eCD9uBH7+lAHD(~BuCbIbZ| zVeWU-rPn!frmC?SMiaE=MbP1eTCfJ%P?vjK`YoWrDouAa?Z}TpT4IYcDJSatq$v>Q zr~PVaBCPfdG0o)ecnnpjui57DwxRpQiTXY2@lVmzhgev2f-mJ|-`J9f@C6zl&qhNS zE@$Pc{MFEHg*`o!oNJ)nsmhqb#4PyefiVSl6F&XsQ z^~Ti5a=X}5jde0um6W7SK$-v6vfjx-Vbx||G4Ek*T%1dCQMbCp8PS%qM(jHor;Cs( zxrNIH=fe^`UH2vD*s-;u?zm>4b1cQDGc@x#wYu4sE%?9QneG(nnvvq?a|*Cgi^-9c zILj7uny^$`V5##x$5x}lbaV=MH*Gaq$NAw3(*dCJbF=(NW@diI%%=*bnCYMy*u4G zhc~(kv9fljd((S7>9xM)#d^b^vf){<0D9H6)7LlWg z=yy~|*d_F?Y9g%|!v||vKQ6QNH|Hk8jIsS)2RXSVOIEKcR4ZN@|9GG!QJWXzlNbI` z1X<|oQnS@sXjnc6SAO`|Y0>3TIvz9Qa&fqptXd0bNyu*Uib*WqBzcdJs>n@H3NrSH z#jsC>I>_@eZ)2Srm9Z!zc9B_@^_ARux9QYN)%zMzZW7^9&+kLKiO)_OJEkO6UFd>R zqiC|lwzP;day(iKMmA(1#BLIiC(iL7>Ka2s%}I8LFY(#o{J8{$@8-MVEd+(zKZg$P z7AIundN>-bwd9~{T^qsgI1CJW2Lk5!I5*|IscX#CaA6y)T&5OD_zwG2{9V4Ea}9q* zHVVQxA3~!|bxrPTsLB%0$noncobrvv742U#Gzc4f-xRLWF8d|vv6-g?VorXmrB6I# z6F&lah=d4(MmqTnX1TKCl^{hLgDawf8ivv{dt;i2NXg|9Khf`=6?{IBN&X_CcVAhg zbo5HYSN8}WG_Cln50rQLQ12tDWX2)la7ux}Z#+Busk>L4fro*-QVK6#tfGw6=TN&tzl@CMOdvd{CQNUJ?XBL{%B@B-L$NXAX#`)tP~EA)M|lEC06;g5M|@ zUF+h|Rn+@6u$`Td`S!T0t;+<+?|sFO;lz!(w{rS(tSp0HMM6(XxS?+yEiJMAT3?`SvkXQiT-)uDW!>y~^?#RE*fA)#3&3m=zL%%hl^N7-F$Iq*s2vLE0< zp0{b{#9dWqdxk`PI$maDe@2S57v&{;4^0ZV9g$7WH;uYH1=bLSNhZzjq}IdPqPgsC zYO_$KInT7fBAP?a?^`Q=anMj|Kf5EB8n9H4H}|C%^xM_UvA^W?wUMyZZtgx?@=Gz2N0A!- zvbEgPKUzXgvd~TEyZ90}OL`p6S8@0fG%rFl1~uBGtlb^JPvltTmXPz@JvFN_O7|n- z0~S?6a5uH#l_{LfAPBfla0cInzIpmqhGbrtB&GcTqVeP9g^Wv<@vre%2iC^rfEVfx zU%jEiUuJRAau0J=2U_vxl+k}GpUf_hBkDxs@_Igs3CG|G9pfTxex@jqQj*H&N)xd37m^%Z6~^F7v3NRMQv6VEtQ`87~XejMb*M#-&f0 zP^)(Z>*Ib>&n|s_N%7$04+ZY8wV6uC+AU+=UVu3{N%<`<@LAwI8Qtc*3)S=52YP;O5q9Mt<+x%` z%12`F7xE4xjw|d)tq4j>eI{e%NbNWWm$!wFv6AMV#_62Br$nD;_ENn|DQbVyg2K-;Nsj0TG;Bav z&gwqGeu1*#DGWVt*ae}D7x}m|a%^ND7u71Gqv=37I`Ev;x4DznqT!gMyONUxm-No+ zJIUN;Rl&*1WFKdl90W zL>Uhy6j=Ru4!^Mo#zvYb{V*m+$Zq!g<}th-OC>Wg6PkG>%e|GEyZiN_hG^)wu=Nd> z-o~Tibgl@A*_;^T(k{1|+T=)}&{LD}0bePT1u(y1)l5MmbZzszCpjHut|lzU!@k-m z-=xTIRY?vo^P|;| zt*8uw%6_l+30mzZJ-)@x(VU7HL@7P&tS{kr^=3goI$3?l@;Q6|*q8i)Wv4AnP{2d1 z=SnCt?BS~KmiAQpxK<+j2#M^b$}7^lV-7fDYdk6URDZQwY%*`Zc-=|uf0u;Egj8rL zROb=y55dENFknkhnHOiW@9ob1_-IZ<#tn2me7K8_bh}7i6_@_SP*_K+Me2QVrM7*# z_+xj_29K0WFt#uBz(UtIOplPgEk(hs_9$EITJ7dFZRl=?k}4v?xNNj2Rdbl&#Ses^^ukT3{#zEm|=?N!aRqthu%fF9C#rI6PMutRBaYG z7zil?!P9pG$#k8UbwAY0^pGAVc|EZeNNK0jk2^1rS$TVwk9ddoA%}Jo#2C1tM!+mh z{QSq{^S6@4iL~FY2BaDgmtJo>UoP3&ehqV`|D1#?yHr}RKkmP8?}nG0A3(|eY+V;t z@LL;dN%3g^<)f;XWH}vtqcEW1ziqyutX8i?Z?6sYXk>p)v@)W1*KIOq4X-qb;3b(| zZiCjr;y>6t8uNbPPmY|0eMdJDB|uAk$F0mpqt#uDm^K@(B)Vkp3)cT4iCyak-}+3_ zD@n=0b|NFQx^?kTUkxofzgZit@jn_KXl-I*DbdHjYeJvzrrysW5zuc=#8F3+5978A zF@D+9UAmo4?Qe|UFfu!Nkfg;v>X7oVvM5>efIPK zy**@negRF27?Gn?dHQ`mgv|&~;+s4%wQe3mS{HJxVjM~Sz@8yN;??Sg*#l`xvt)9~ zwfr1M#ldl$X|H~pEY35!&4HTMB*tHwmS>7JGq@6OMJ1OZvcFf5Gx2WLu3xJkZz{jd zy2mJ}k_39&tyBCb{E;eQ2G;mvqRw$MFO!eLC*@=g+c*ylXb!kf!A+y0qJQor;IA)3 zLJ(5>#Zo2IlQaR^WtYpcEAJU@7ru$6in<56*N6APR_y5XSPDXI1fK6Rwb|C&pSt(0 z$oz&iR;=D~$G&;((re~p%~POzz23Up56~{xzzb|*+%uGGs)mPF?wh?TPR5^}LQhE_+S7 zM#R!gr@=lV%X|NVr}CQWP>j9wckkC%j5K0k+;v&^Y7IHM(y;lLxl;$e&|(R2HU?3g zjAD?m`>Qe=3?6nTEMgw@eDYlwe~bNjg9iWbld=`Liu)!{LyG721eb2jxBJFcIg;anSJDBt6cY*+gOPd!EhXl^S#tnh1ov->?`0PL>+C>&G4U@+@wC z_*g9J;F_KQiTBkCc$;!MR_q8CN@;AqYDaq8jUwGR-i#0pcI`Z%nC_t1QX^!eZ_Ji^ zIMu45$2Ymtt|M9#jQTn)a`@gbb&g-(rq>|^QCv3ds&ejkC3QQY9%d4xWpfM7wnLn3 zsJcE=*M$nv77sE#|AX7=Lo~pfH>RgB%%6aEd$`6|{bB!;+54N`Pc8KR^P-o$BVzW` zTK4*TZ}GdaJSY`_lxZj%0LF6w^LfvO2n90Hp!p&ybP zKEaCp3C`zGRu8XoegplY3nZdWSARtmL@RXVDU#DQ0MA${g?!j$#jI)uR-COdjS4g? zJ}Xgf0#g&ti9d1cF$>-fS*eWyeimoG{Vh1-o3=}5x~Y!?Tu%wLJ_jtXM9dd{RV+33 zP)RbGtN8Pi|L{9*<8mzbKqIKipqkyUZyT`}|NesO?()w(l0kR6(zjc*YhLm%SI6F9 z#jfJi^{)nKY3u0?zQ6r;$GO7nbi|PqA>Cy~QI&uv%JUTRCPecARa)NX3=_8`MpCk< zVsMvmXfmV46h11;xAud%(=&ItN=W#a$F^8&0toq1#Pr!#ze$R#9Z%*fN?jL?MyT*FGh@h|2OiK*=`2=VKLcG`E^u5Ont9} zF@p)A?VW^lyl5E*o;QTTT7u2=)pos(|nO*j} zYtTSCoiKt?dV8?k?$&~@?uY(C^HL7jK2||gW`e%HX?5 z<@?bq^PdPqdZasL&XgT^I)sdNdC2euiprGyF={m3bN3F+5+gFWWXw z^)=Ra02MM4P`HNgb6m(nLKQ0aSGM6kG1J)xL{ z<1dGw@B60lau{Ea1il!2j6<(1)iHRew66YS_Ii!yY9#fMHB#S51LxY506 z@AlsE-`N$ir}}9NDD(7eg!V7yly>>NPiBR;9#XGHf#=v5KQ_)$me7dDTs~Q5D4|4h z+05AUFGL66O-m`A|5_82%ez~1&aQ*c_c7}6;BtvsbM)l6pg#>__WFo;|LpB27UEAI zndAd_QesJH89tjn*XD6eB)~KUIr{-IX&`6R1Y1DU2hbH{Ih*LSBh_*a>vS= zpz4cIo^!x+k09D>3_lQ6m#z)b!^xo8byS4q3QB?8H(1W%@YlN}CEYV4G+uY6rSEg> zcy+UM8>237?O#YQM9gaN@k_Wg2h6^uc(PyR#(h>*e?P$W`ba<7ku}b8Rxr5FqU}CW zyXwK~D2^GJ=I z{IYsYiARX5!gn)vLa-Mwl#H^4dKu`g!xqjF157S$<_aY)R5bfC1SwUEt{A$0Ix&tlT5`gAh^Ww3%>@BpOpGix*y9PBGuxyRfXXTIkx9E#Hy#N zWy$uxY2#!ZqedW-I8=M-E`EQGsyJeBbwFEAGOzDBK-wgOvF|*Ip z2Rbc`%zswwZg(pWrT^0{A7^zOm0AvVcWSm)XNTWf>v}%qaLbr1(LzTO^6BR^Vnmnh z2Q*hehNPdQ3jqgWg3pml~tdihs8c@!o_yj!PJU#r$F0_mPYnl~> zH(j}qF6V)Ftes}F8_Y+|G{M< zwnO)z*c0mk%c;BXEUk)5-v&={=Et|+d4&BjMa6a82Y;Y_?6m3p`p%}wAPbq+ikQ%@ zm}SmISFLbF&+wh=e50SVRN>FM3`GOdRa2uI;w+c$K7KmaT%xJOO6>9|p1Oy_*jedV z?KJ16(}89P()B{c|Jqx8CZPPj!Yf7zidqBt4n$`wc?ngeuu_hD_geF%Q0Fs-DxgOswhn|E$(5GsydUQjO#`ln>lurAQN?AY|tE#Hq2G%?&Dg zJRPq`eLNr~U8*!c!xOfOi_SJD?6JCFpYHqAN^#^x=R&&*1Zsap2-#ZE%kUK~!teh( zS*273p=N^kzbMO3ZUkK|1hpzRHK;;Fn=fkAp`g9>m}A=5Jv%C=&qA|bJ^=&RmPEo$ zq=*ykL;>)K>qJBjmvQz9P62M-5o z8g`hS^HUd;-klYUvJqYNcQP^;ysFKHRr$_-BsXb4S{wLGrGwviRlUTf{Ltm!3uy5l zevI6ru4jFSxgPV6>ei3th2+C!!ev5tJ5+J1z^&Sj)B@#^{^gPJ&hhzn#?7AsnkV3N z(b4kaOKpQ<#KcQnj^a4wDN4J)S(a1Z#-MjUQw@EIN^O10o)FmeIRm)q$StLgu7}J8 z^i2yfd8M_=V7T}Q3vjW5HleBFyd@`)36|98BaO-g|H!;A(I=~d{>>5`TOR3vp3xJ1 z&yF?fjd*PO8P?zDv7-jPlHS=P&6`o9R09s{DzGNL5U0aVv%=hd0YlGh+a*GVl9QGB z&r#bAI;dH>=>sGy*Tf(8`IAddaR&}|cS78*yOFvG`x z%gNgJoGeU5_r@lFa5+UIZs;Gce0)j$-w$AZ2qKJC#714+CdIiG64C!A6IxtHn;ciWPw}xFmxA zUJ+Il(*!{Z6CTx-Xy zrIw7$|8WYS*E*|db?<)g_Tin zP;O(&`2XlMK;O8KNUA;D?RxNT?8PNga;!jNWwmAX>gHZY_%DOZ*(Gm`N#&)2x_rfp H_aFZkN=Lqa literal 127407 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

#Lc+fM;Y?d| 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 TOuT*`00000NkvXXu0mjf@lVq9 diff --git a/document/images/14.png b/document/images/14.png index 5af9de6cbe160c4ea80ce82536e45a0b3e2ab5f1..62f05967a0b2255be3f5f39289597d5e4f33e996 100644 GIT binary patch literal 575583 zcmZ6ycR1Vq7d~zio2Xf{2vwz3Vuq@kt!TB?QZYJFwFwQ0JzAqiYlqUNgQ7KS#NM0Q zBlapXq!NO!=lA`6uj_d}=g)WY9@q6c;yD zQZ|;;D-GwrU!|jyqBAqPdIz5Ur+)gYe_y4$V?ji__2D>gRJu?`C2)DXLnbpeZOyP z^(->JWZyLl^V_;O5f&UkLnC)jcJz<-tPlGl*KIzB4 zZv*zKSRYQ#4^XKOAzG`yxs82aQ07}eiin8uu9PQDQ_2LzbyKhR%fMa|&e|N-ih1ql z@;68k?d*F@;q=l-#=K-MR1>Ar0rFd*F1<(lwp{BR7A>;4CYH57 zwg}-TT7SqRf7~a$0>Pa^I+|t4`-5VY{0JGb+lbo$-cFuuFh4p9IW($6VG=?O(XB_R zm*X|pqCq0KShH~qXLkKBS*WRf+B85&z}f8~l6TWuQ#3!??h{u1=kYiHzX?7qf=eUw z)LJAKIfEb!oF2>+lIU<8u#G)IBj+nxF5>h#o#$Q&T0y_ii3LHi{bc@8=|2YL;VSp# zn(bMVcQ&L8N`86sYSIUf4b2uWrOg6N_99G$ilVScvcrM(_WsH0$=ZYG9!u8!p%X{5 zh~$^mP6&2JJYh)pf#yniRP4p*NB9kOvROvSd5GPKHC2H3=P{BW{X!>;j7-0Z=)Qri zKiDEFemMz(T$Kp+f&g^p{_Y$7`!LM9ctC4`Wj=C|B`QUJbUj6t(_2#ZprFcOa}y?c zRe?ck!b@1*BlgE?U=EU)XX`IHFY~|#Pe%HN=B>YDQ~`+{E=W#D2}yAyGk{&-0L z_}PbWVRR9lJrj3B7DZO1{Fl0mZdyd^*&cWaQSpigaA@`}I#qYp=DoAHH=?^`k4Vyh zT=iM4>mw>=ID86u3+<0*eR+fgp>3tGUu*A&zw9864>RC8#~6K8qx>zh z%f6YlEBd)x21cali?eUe!1VjNRPk6e0%O z8uM6ML(GhUWV2EKP2>oLDFLjQ-Z6Y4GEtQ{kcgN;5gd-HPDUQJAnY~VxdJzR2P;R$ zCUc(}Pfu0LGE6s2{TwKAsb83PlEgbq7@`w*#LLgMv*0zR3{k-KW*u+8#VlpEfXJH% zdyzgX)82`1y*Rm!ima|mraNrLe56Zk8jc*o?^tkoOSOQK=6zlqH|f*D|9TvWo!mb3 zIR1&OKO*S=9q7v+AbkPox^jTl8(&;P@S|~Olakq;79U=a*e1rxwfYX=8GT1vhh6v4b$uzeBz+&-Bi+r(6}&W^r+#}f{>@5Tdsns7is+RA&P8BaPs zcItBN`~WERn)JhN`uitOBF70`5~jJYMG79izjr494@k`G#mM6oZ=I~5tP#muz-6XJ z#g&@Ef7@~`U$x+HVnF4L6-%i7>8XE3~)ls2EuTwey}ogC6e=dWEO%U_!Dz9R1-H%eOxl6G0IxpGo)_& z8pdyU>=L6vDY?_kt32mTD1060G2S5f^4;;Eu%1kBiRrN|k)TiPAzjedz z{a~h{XP?`8263x~H1llybfsHPx#XZ|>2>oVN&^{ruTcGD>CKh_wyI{gt4fabxxVL6 zr5^Ixh}iT8r*9;i-l|l$r1?pW2)Vue)=pB(h3wZqs>vt$NZqwRUaR|3H8F#gTz?97 zN$(wKLy||gP6IR%JAS;Ne;iIye>ebHk4jAJZwEG9^O)hhJU!A(+ZnzBFZ#@b1|0ip)Qj~$oyH9bYG+Qr0Bkj`-qc!;wG!V3wpz2JDL+FbZo z#U*Xqj~C4lhTAxgRA`EP$s&-@@yRR+%D6wVO^97D`DH|D<%s#SdlBM7K9Pr%9gL2P zr~i14kRcB)0gF#q-`Gf9)`EF!viC3Wj3Hk`5p)B69ynmHMx3{LECM?_*n~=al8pKyQ8kv$b>hB^`zGV=+#ec;{ZV9vr@3^FI(Th>1*=`BG-X*= z@^;A7)LH{!5f>Py=YtSc-2?TApks)?c0yZP%F0wjE89U9l0+BB`xe9#rG+ym&6710gq3r8Y8IBhT;^$P7WBPt=Jtod>*Ug$)~|7~81;2f7aBdd_`-l5uhTe1_=9@9zob`6ii3&hh8 z=<5VRNxv>mydx&(a>D0cEA1WsE56e9i|!^Y@Venhi+2ujKY6knRd6*7jEBsC>)@aH zh?Z0Ly^OeWqcn6rP|7&schkf$6yFDLl)hyqXqvrrX=MuH3^632#+X+f`~ zBniwU%%|xyJ%m)K^nx_srqSn7?gh2}N&9yxOGUWkd#LAa0W4O}u>NR3jdQJQi#%j) zdu4!i5qshXHW|PG>s|xs(p}C%-22Q z1r0vZG-+_r?qY$^X=*DDtOZS3$KzvH-!EpPOb1laESz-`%S5wN=4!M$LFsF3XtqRn!$KrMy@4N%zx_BF3Sx-?lk2l)2M#~}Cxf#v4b<}MDt zjbO*R@?&)Up_W6MFB?-!^O^-3A^OU=AyG{q`u-Uc^2meMcdUawd^W9r*rLxsE&%&K zHUmhr)Huu8H#RG)WFx)d*Aev99-?6>$_!a_#*mg-J)c=a*{(&eBIS}mbF7| z^l=)J0Ifh0p(mwB#aL3JUXUWfo59i-E`pW~zgHz6zxJBCd@zun$V_2}JP7n&+rkhP zc}98$rZ<6C_KhL+br2D-#Kf_FD74pORg?FhA5xrl#K{{^{x_wZ_s$)UnsY>*@#5KP z)yo?gZFH&n{>&t%_FDK9aN=IIr+8z41!Ih^^o6XuGCrj3ISs(L`x z5;c9G+h_p@GhLy72W9mA)b9hMF)xo|DBr$&UB0#^(gIiQ&$mTY5vyab95&AAcKwA z176sgVa`sj?%Nw2Ij*3X6neH*a3T8b$h;EuF-2TF+gAZ#+NnfI^>#o^EvD$Jet@)m zo0@EmW$6zDMqy6UC<5IhJk6LG2lt1&U!jE;uTx}el_39(8QP$X{gAl($T$!8l-E=W z*hHtd-nV`=W+R%@m{t`D)EjCDd=&N03Uma4RoaPOn#&>Qdf`C1Ba1WAyh|y`DwFw> z`IP15@k^2u(o05E4a(ySO?v*Z2wQV`wDw`TnP;^P>o0#r!t){(&{;M@YrDzHNL~1c zQ#8}2GBd0mokcc7SAoYspoc!kc}R&^#MVOR6B0Ls`4?23!jhJVYMAW+bvalQ#k4#p zbXx1@nIJWE^fn1tn$1bj$;$4rRymq}s?LkfE}7FUYa<734_0a~*s;QgHiM`>PCwXP z1D-8(5Fgu(if;(9hr>Tc$T8IAK>N=?b+FRRjG>`W?W7QGG!0RsY46jI@MElGHMm&H zj=ue408=#z(zw~cfR>@izWx;+Kr*|_O8PsC2yzMLk2=}HEBc(J^lt)}t#=G;ZvWee zUy_kaZKE&NIkhNkmqHls!<)q}T`odd*=xJxsc8@%N`;EmxE-`ZL62FCWZ`Cm%rZ$3Q&Dp z(SJX9Q`oXY(2!AENIXZo^8o$X!OK4VCR;H5-9d}r80&NDPBA$>WS3WS=Uu#_ zm0Lj06U!<7x`E>84}v?Z*5R{yVHx?M5K;6o(Sdq&yqhehx=7?~J$_pI{n^7yUgcEq z<}D>II#QN_7XO$ZHi5pe=*^)Tb`%}QvsJ@)zIK-O)xViZb?N9VWP|iq1JZ|YP(>Ft z`Za6T>c>Jcki`^cYsNj|fk1Z2`5PgjRBH-T^fyW&W6+b}+ec5El^`qJB@h0`FA=+! zORnHa%b$uI@-*_Ks3SVKIZu1)9w_)6gq=hL4sLMxa$ACfxnb(K`?)ouh-O_TtIBn} z84nuAHL`LOkxWEnKwnNIwDqoXK_+!xkXg|oL~7y1t{m_URfykkPp29JXj~0ZAG>O+ zF|%fEvshCGi8L~c=)lZ9f;%*0ILKYKP9`>~OS8k{0oX#w6XLWgI>Cb6=|VJ@wk=iuSm0=77xyv& zsL~4r6j?)>bYBY@5DeBnp>bbJTn|XCILHUT58~jha})?Z1N63 zo^|gYr-wYu0J-CPqPKp;{w3U339J+b{fJ=AYvS-h1e?n;^o-nv+@dT}7L9rdXV8re zS@mFzF-az&itjYvx2+QvP|O)&w@fssQ>E5qQ{$dVenhYP&6$)s_^yh}>wp<`zu9nfC%R3{}%^s7O zf6$tG$w>{-9P$Jr&0&~ZG73rseKqMjz4a+sR~l00%USQ?Z10T7^wN4rk2v^C*$v$1 za~)t%Q;|p?=QTzjQ;xoPS7Q1S=S?{Ja$x=X-u-_^O_XWUhwol8D&y%91L=-$42}48 zT}#m{4|bkcv#qUU0*%;~tuEGz}d^+*?EF>V}B;ye2-`QUf1j-4aqM{N;V@b_!HOD5SJO&7waM^&ktiyy@K0*1|fw0^r0OT z1|$Mj4rj@+t;W>l>O?%?sN9$sd=6cxyR;*ZZnzVi87GUi+UG)S21xAQzq+t<4≪ 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

!Nj$ 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
public class GenConstants { - public static string Gen_conn = "gen:conn"; public static string Gen_conn_dbType = "gen:dbType"; public static string Gen_author = "gen:author"; public static string Gen_autoPre = "gen:autoPre"; public static string Gen_tablePrefix = "gen:tablePrefix"; - public static string Gen_oracle_db = "gen:oracle_db"; /// /// InputDto输入实体是不包含字段 diff --git a/ZR.CodeGenerator/Service/CodeGeneraterService.cs b/ZR.CodeGenerator/Service/CodeGeneraterService.cs index fd82340..95f44c6 100644 --- a/ZR.CodeGenerator/Service/CodeGeneraterService.cs +++ b/ZR.CodeGenerator/Service/CodeGeneraterService.cs @@ -16,15 +16,15 @@ namespace ZR.CodeGenerator.Service { var db = GetSugarDbContext(); //Oracle库特殊处理 - var dbType = AppSettings.GetAppConfig(GenConstants.Gen_conn_dbType, 0); - if (dbType == 3) + List dbConfigs = AppSettings.Get>("dbConfigs"); + DbConfigs configs = dbConfigs.Find(f => f.IsGenerateDb == true); + if (configs.DbType == 3) { - var defaultDb = AppSettings.GetAppConfig(GenConstants.Gen_oracle_db, string.Empty); - return new List() { defaultDb }; + return new List() { configs?.DbName }; } var templist = db.DbMaintenance.GetDataBaseList(db); - return templist; + return templist.FindAll(f => !f.Contains("schema")); } /// From e2ac799bf2c22c1275ab841011593d7547783f88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com> Date: Tue, 13 Jun 2023 11:59:58 +0800 Subject: [PATCH 18/27] =?UTF-8?q?:zap:=20=E8=8F=9C=E5=8D=95id=E6=94=B9?= =?UTF-8?q?=E4=B8=BAlong=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ZR.Admin.WebApi/Controllers/System/SysMenuController.cs | 4 ++-- ZR.Service/System/IService/ISysMenuService.cs | 4 ++-- ZR.Service/System/SysMenuService.cs | 7 +++---- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/ZR.Admin.WebApi/Controllers/System/SysMenuController.cs b/ZR.Admin.WebApi/Controllers/System/SysMenuController.cs index 48f8063..ebfe538 100644 --- a/ZR.Admin.WebApi/Controllers/System/SysMenuController.cs +++ b/ZR.Admin.WebApi/Controllers/System/SysMenuController.cs @@ -119,7 +119,7 @@ namespace ZR.Admin.WebApi.Controllers.System return ToResponse(ApiResult.Error($"修改菜单'{modal.MenuName}'失败,上级菜单不能选择自己")); } modal.Update_by = HttpContext.GetName(); - int result = sysMenuService.EditMenu(modal); + long result = sysMenuService.EditMenu(modal); return ToResponse(result); } @@ -151,7 +151,7 @@ namespace ZR.Admin.WebApi.Controllers.System } menu.Create_by = HttpContext.GetName(); - int result = sysMenuService.AddMenu(menu); + long result = sysMenuService.AddMenu(menu); return ToResponse(result); } diff --git a/ZR.Service/System/IService/ISysMenuService.cs b/ZR.Service/System/IService/ISysMenuService.cs index 367d646..78f8a36 100644 --- a/ZR.Service/System/IService/ISysMenuService.cs +++ b/ZR.Service/System/IService/ISysMenuService.cs @@ -15,9 +15,9 @@ namespace ZR.Service.System.IService SysMenu GetMenuByMenuId(int menuId); List GetMenusByMenuId(int menuId, long userId); - int AddMenu(SysMenu menu); + long AddMenu(SysMenu menu); - int EditMenu(SysMenu menu); + long EditMenu(SysMenu menu); int DeleteMenuById(int menuId); diff --git a/ZR.Service/System/SysMenuService.cs b/ZR.Service/System/SysMenuService.cs index 88e76f4..1a267d5 100644 --- a/ZR.Service/System/SysMenuService.cs +++ b/ZR.Service/System/SysMenuService.cs @@ -10,7 +10,6 @@ using ZR.Model.System.Dto; using ZR.Model.System.Generate; using ZR.Model.System.Vo; using ZR.Service.System.IService; -using static System.Runtime.InteropServices.JavaScript.JSType; namespace ZR.Service { @@ -108,10 +107,10 @@ namespace ZR.Service /// /// /// - public int AddMenu(SysMenu menu) + public long AddMenu(SysMenu menu) { menu.Create_time = DateTime.Now; - return InsertReturnIdentity(menu); + return InsertReturnBigIdentity(menu); } /// @@ -119,7 +118,7 @@ namespace ZR.Service /// /// /// - public int EditMenu(SysMenu menu) + public long EditMenu(SysMenu menu) { menu.Icon = string.IsNullOrEmpty(menu.Icon) ? "" : menu.Icon; return Update(menu, false); From 9170b3e99949e95331bd857c74cbe9c9c501ff30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com> Date: Tue, 13 Jun 2023 12:00:40 +0800 Subject: [PATCH 19/27] =?UTF-8?q?:zap:=20=E7=94=A8=E6=88=B7=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/System/SysUserController.cs | 2 +- .../wwwroot/ImportTemplate/user.xlsx | Bin 13375 -> 14140 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/ZR.Admin.WebApi/Controllers/System/SysUserController.cs b/ZR.Admin.WebApi/Controllers/System/SysUserController.cs index bde841d..0f2e2e3 100644 --- a/ZR.Admin.WebApi/Controllers/System/SysUserController.cs +++ b/ZR.Admin.WebApi/Controllers/System/SysUserController.cs @@ -182,7 +182,7 @@ namespace ZR.Admin.WebApi.Controllers.System List users = new(); using (var stream = formFile.OpenReadStream()) { - users = stream.Query().ToList(); + users = stream.Query(startCell: "A2").ToList(); } return SUCCESS(UserService.ImportUsers(users)); diff --git a/ZR.Admin.WebApi/wwwroot/ImportTemplate/user.xlsx b/ZR.Admin.WebApi/wwwroot/ImportTemplate/user.xlsx index a8a2b77f8efa2d778abfe437fc1a3746052acf71..74e4f1d68cbc1f0400661c0696a8cb12f1104502 100644 GIT binary patch delta 8441 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%0A>R( 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 Date: Tue, 13 Jun 2023 12:09:32 +0800 Subject: [PATCH 20/27] =?UTF-8?q?:zap:=20=E4=BB=BB=E5=8A=A1=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E6=81=A2=E5=A4=8D=E6=94=B9=E4=B8=BA=E5=BC=82=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ZR.Admin.WebApi/Extensions/TasksExtension.cs | 8 +++++--- ZR.Admin.WebApi/Program.cs | 7 ++++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/ZR.Admin.WebApi/Extensions/TasksExtension.cs b/ZR.Admin.WebApi/Extensions/TasksExtension.cs index 8f890cc..3464bc7 100644 --- a/ZR.Admin.WebApi/Extensions/TasksExtension.cs +++ b/ZR.Admin.WebApi/Extensions/TasksExtension.cs @@ -1,4 +1,6 @@ using Quartz.Spi; +using SqlSugar.IOC; +using ZR.Model.System; using ZR.Tasks; namespace ZR.Admin.WebApi.Extensions @@ -31,11 +33,11 @@ namespace ZR.Admin.WebApi.Extensions { ITaskSchedulerServer _schedulerServer = app.ApplicationServices.GetRequiredService(); - var tasks = SqlSugar.IOC.DbScoped.SugarScope.Queryable() - .Where(m => m.IsStart == 1).ToList(); + var tasks = DbScoped.SugarScope.Queryable() + .Where(m => m.IsStart == 1).ToListAsync(); //程序启动后注册所有定时任务 - foreach (var task in tasks) + foreach (var task in tasks.Result) { var result = _schedulerServer.AddTaskScheduleAsync(task); if (result.Result.Code == 200) diff --git a/ZR.Admin.WebApi/Program.cs b/ZR.Admin.WebApi/Program.cs index 781ac92..9684a36 100644 --- a/ZR.Admin.WebApi/Program.cs +++ b/ZR.Admin.WebApi/Program.cs @@ -92,7 +92,8 @@ InternalApp.ServiceProvider = app.Services; //初始化db builder.Services.AddDb(builder.Configuration, app.Environment); -app.UseSwagger(); +//使用全局异常中间件 +app.UseMiddleware(); //使可以多次多去body内容 app.Use((context, next) => @@ -118,8 +119,8 @@ app.UseAuthorization(); app.UseResponseCaching(); //恢复/启动任务 app.UseAddTaskSchedulers(); -//使用全局异常中间件 -app.UseMiddleware(); +//使用swagger +app.UseSwagger(); //启用客户端IP限制速率 app.UseIpRateLimiting(); app.UseRateLimiter(); From 9be0036b4e47ae374ca87b4ecf69eb3317602baa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com> Date: Sun, 11 Jun 2023 13:16:22 +0800 Subject: [PATCH 21/27] =?UTF-8?q?:zap:=20=E4=BC=98=E5=8C=96=E7=A7=8D?= =?UTF-8?q?=E5=AD=90=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/CommonController.cs | 76 +++---------------- ZR.Service/System/SeedDataService.cs | 74 ++++++++++++++++++ 2 files changed, 84 insertions(+), 66 deletions(-) diff --git a/ZR.Admin.WebApi/Controllers/CommonController.cs b/ZR.Admin.WebApi/Controllers/CommonController.cs index 253de7e..47db2f7 100644 --- a/ZR.Admin.WebApi/Controllers/CommonController.cs +++ b/ZR.Admin.WebApi/Controllers/CommonController.cs @@ -5,7 +5,6 @@ using Infrastructure.Extensions; using Infrastructure.Model; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; -using MiniExcelLibs; using Newtonsoft.Json; using ZR.Admin.WebApi.Extensions; using ZR.Admin.WebApi.Filters; @@ -179,85 +178,30 @@ namespace ZR.Admin.WebApi.Controllers /// /// 初始化种子数据 /// + /// 是否清空数据 /// [HttpGet] - [ApiExplorerSettings(IgnoreApi = true)] [ActionPermissionFilter(Permission = "common")] [Log(BusinessType = BusinessType.INSERT, Title = "初始化数据")] - public IActionResult InitSeedData() + public IActionResult InitSeedData(bool clean = false) { if (!WebHostEnvironment.IsDevelopment()) { - return ToResponse(ResultCode.FAIL, "导入数据失败"); + return ToResponse(ResultCode.CUSTOM_ERROR, "导入数据失败"); } var path = Path.Combine(WebHostEnvironment.WebRootPath, "data.xlsx"); //var sheetNames = MiniExcel.GetSheetNames(path); SeedDataService seedDataService = new(); - - var sysUser = MiniExcel.Query(path, sheetName: "user").ToList(); - var result1 = seedDataService.InitUserData(sysUser); - - var sysPost = MiniExcel.Query(path, sheetName: "post").ToList(); - var result2 = seedDataService.InitPostData(sysPost); - - var sysRole = MiniExcel.Query(path, sheetName: "role").ToList(); - var result3 = seedDataService.InitRoleData(sysRole); - - var sysUserRole = MiniExcel.Query(path, sheetName: "user_role").ToList(); - var result4 = seedDataService.InitUserRoleData(sysUserRole); - - var sysMenu = MiniExcel.Query(path, sheetName: "menu").ToList(); - var result5 = seedDataService.InitMenuData(sysMenu); - - var sysConfig = MiniExcel.Query(path, sheetName: "config").ToList(); - var result6 = seedDataService.InitConfigData(sysConfig); - - var sysRoleMenu = MiniExcel.Query(path, sheetName: "role_menu").ToList(); - var result7 = seedDataService.InitRoleMenuData(sysRoleMenu); - - var sysDict = MiniExcel.Query(path, sheetName: "dict_type").ToList(); - var result8 = seedDataService.InitDictType(sysDict); - - var sysDictData = MiniExcel.Query(path, sheetName: "dict_data").ToList(); - var result9 = seedDataService.InitDictData(sysDictData); - - var sysDept = MiniExcel.Query(path, sheetName: "dept").ToList(); - var result10 = seedDataService.InitDeptData(sysDept); - - var sysArticleCategory = MiniExcel.Query(path, sheetName: "article_category").ToList(); - var result11 = seedDataService.InitArticleCategoryData(sysArticleCategory); - - var sysTask = MiniExcel.Query(path, sheetName: "task").ToList(); - var result12 = seedDataService.InitTaskData(sysTask); - + var result = seedDataService.InitSeedData(path, clean); Console.ForegroundColor = ConsoleColor.Red; - Console.WriteLine(result1.Item1); - Console.WriteLine(result2.Item1); - Console.WriteLine(result3.Item1); - Console.WriteLine(result4.Item1); - Console.WriteLine(result5.Item1); - Console.WriteLine(result6.Item1); - Console.WriteLine(result7.Item1); - Console.WriteLine(result8.Item1); - Console.WriteLine(result9.Item1); - Console.WriteLine(result10.Item1); - Console.WriteLine(result11.Item1); - Console.WriteLine(result12.Item1); - + foreach (var item in result) + { + Console.WriteLine(item); + } + Console.ForegroundColor = ConsoleColor.White; return SUCCESS(new { - result1 = result1.Item1, - result2 = result2.Item1, - result3 = result3.Item1, - result4 = result4.Item1, - result5 = result5.Item1, - result6 = result6.Item1, - result7 = result7.Item1, - result8 = result8.Item1, - result9 = result9.Item1, - result10 = result10.Item1, - result11 = result11.Item1, - result12 = result12.Item1 + result }); } } diff --git a/ZR.Service/System/SeedDataService.cs b/ZR.Service/System/SeedDataService.cs index 4cffdc4..ddb858a 100644 --- a/ZR.Service/System/SeedDataService.cs +++ b/ZR.Service/System/SeedDataService.cs @@ -1,11 +1,16 @@ using Infrastructure.Extensions; +using MiniExcelLibs; using SqlSugar.IOC; using System.Collections.Generic; +using System.Linq; using ZR.Common; using ZR.Model.System; namespace ZR.Service.System { + /// + /// 种子数据处理 + /// public class SeedDataService { /// @@ -218,5 +223,74 @@ namespace ZR.Service.System string msg = $"[任务数据] 插入{x.InsertList.Count} 错误数据{x.ErrorList.Count} 总共{x.TotalList.Count}"; return (msg, x.ErrorList, x.IgnoreList); } + + /// + /// 初始化种子数据 + /// + /// + /// + /// + public List InitSeedData(string path, bool clean) + { + List result = new(); + + var db = DbScoped.SugarScope; + if (clean) + { + db.DbMaintenance.TruncateTable(); + db.DbMaintenance.TruncateTable(); + db.DbMaintenance.TruncateTable(); + db.DbMaintenance.TruncateTable(); + db.DbMaintenance.TruncateTable(); + db.DbMaintenance.TruncateTable(); + db.DbMaintenance.TruncateTable(); + } + + var sysUser = MiniExcel.Query(path, sheetName: "user").ToList(); + var result1 = InitUserData(sysUser); + result.Add(result1.Item1); + + var sysPost = MiniExcel.Query(path, sheetName: "post").ToList(); + var result2 = InitPostData(sysPost); + result.Add(result2.Item1); + + var sysRole = MiniExcel.Query(path, sheetName: "role").ToList(); + var result3 = InitRoleData(sysRole); + result.Add(result3.Item1); + + var sysUserRole = MiniExcel.Query(path, sheetName: "user_role").ToList(); + var result4 = InitUserRoleData(sysUserRole); + result.Add(result4.Item1); + + var sysMenu = MiniExcel.Query(path, sheetName: "menu").ToList(); + var result5 = InitMenuData(sysMenu); + result.Add(result5.Item1); + + var sysConfig = MiniExcel.Query(path, sheetName: "config").ToList(); + var result6 = InitConfigData(sysConfig); + result.Add(result6.Item1); + + var sysRoleMenu = MiniExcel.Query(path, sheetName: "role_menu").ToList(); + var result7 = InitRoleMenuData(sysRoleMenu); + result.Add(result7.Item1); + + var sysDict = MiniExcel.Query(path, sheetName: "dict_type").ToList(); + var result8 = InitDictType(sysDict); + result.Add(result8.Item1); + + var sysDictData = MiniExcel.Query(path, sheetName: "dict_data").ToList(); + var result9 = InitDictData(sysDictData); + result.Add(result9.Item1); + + var sysDept = MiniExcel.Query(path, sheetName: "dept").ToList(); + var result10 = InitDeptData(sysDept); + result.Add(result10.Item1); + + var sysArticleCategory = MiniExcel.Query(path, sheetName: "article_category").ToList(); + var result11 = InitArticleCategoryData(sysArticleCategory); + result.Add(result11.Item1); + + return result; + } } } From 9f587711f09682b0dc148439c0b6a5e19aa1a782 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com> Date: Sat, 10 Jun 2023 18:26:18 +0800 Subject: [PATCH 22/27] =?UTF-8?q?:sparkles:=20=E6=94=AF=E6=8C=81Oracle?= =?UTF-8?q?=E5=BA=93=E3=80=81Oracle=E5=BA=93=E4=BB=A3=E7=A0=81=E7=94=9F?= =?UTF-8?q?=E6=88=90=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/CommonController.cs | 1 - .../System/CodeGeneratorController.cs | 13 ++- ZR.Admin.WebApi/Extensions/DbExtension.cs | 80 ++++++++++-------- ZR.Admin.WebApi/Extensions/InitTable.cs | 53 ++++++++++++ ZR.Admin.WebApi/appsettings.json | 2 +- .../wwwroot/CodeGenTemplate/sql/Other.txt | 1 + ZR.Admin.WebApi/wwwroot/data.xlsx | Bin 36529 -> 36212 bytes ZR.CodeGenerator/CodeGeneratorTool.cs | 73 ++++++++-------- ZR.CodeGenerator/GenConstants.cs | 4 +- ZR.CodeGenerator/Model/OracleSeq.cs | 11 +++ ZR.CodeGenerator/Model/ReplaceDto.cs | 4 + .../Service/CodeGeneraterService.cs | 14 +++ ZR.CodeGenerator/ZR.CodeGenerator.csproj | 2 +- ZR.Model/System/Article.cs | 2 +- ZR.Model/System/SysBase.cs | 9 ++ ZR.Model/System/SysNotice.cs | 2 +- ZR.Model/System/SysOperLog.cs | 4 +- ZR.Model/System/SysRoleMenu.cs | 1 - ZR.Model/ZR.Model.csproj | 2 +- ZR.Repository/ZR.Repository.csproj | 2 +- ZR.Service/System/SeedDataService.cs | 6 +- ZR.Service/System/SysMenuService.cs | 6 +- document/oracle/seq.txt | 46 ++++++++++ 23 files changed, 239 insertions(+), 99 deletions(-) create mode 100644 ZR.Admin.WebApi/Extensions/InitTable.cs create mode 100644 ZR.Admin.WebApi/wwwroot/CodeGenTemplate/sql/Other.txt create mode 100644 ZR.CodeGenerator/Model/OracleSeq.cs create mode 100644 document/oracle/seq.txt diff --git a/ZR.Admin.WebApi/Controllers/CommonController.cs b/ZR.Admin.WebApi/Controllers/CommonController.cs index 47db2f7..20590bc 100644 --- a/ZR.Admin.WebApi/Controllers/CommonController.cs +++ b/ZR.Admin.WebApi/Controllers/CommonController.cs @@ -190,7 +190,6 @@ namespace ZR.Admin.WebApi.Controllers return ToResponse(ResultCode.CUSTOM_ERROR, "导入数据失败"); } var path = Path.Combine(WebHostEnvironment.WebRootPath, "data.xlsx"); - //var sheetNames = MiniExcel.GetSheetNames(path); SeedDataService seedDataService = new(); var result = seedDataService.InitSeedData(path, clean); Console.ForegroundColor = ConsoleColor.Red; diff --git a/ZR.Admin.WebApi/Controllers/System/CodeGeneratorController.cs b/ZR.Admin.WebApi/Controllers/System/CodeGeneratorController.cs index 5aabe55..8941c6a 100644 --- a/ZR.Admin.WebApi/Controllers/System/CodeGeneratorController.cs +++ b/ZR.Admin.WebApi/Controllers/System/CodeGeneratorController.cs @@ -153,6 +153,7 @@ namespace ZR.Admin.WebApi.Controllers { throw new CustomException("表不能为空"); } + var dbType = AppSettings.GetAppConfig(GenConstants.Gen_conn_dbType, 0); string[] tableNames = tables.Split(',', StringSplitOptions.RemoveEmptyEntries); int result = 0; foreach (var tableName in tableNames) @@ -160,15 +161,18 @@ namespace ZR.Admin.WebApi.Controllers var tabInfo = _CodeGeneraterService.GetTableInfo(dbName, tableName); if (tabInfo != null) { + List seqs = new(); GenTable genTable = CodeGeneratorTool.InitTable(dbName, HttpContext.GetName(), tableName, tabInfo?.Description); genTable.TableId = GenTableService.ImportGenTable(genTable); - + if (dbType == 3) + { + seqs = _CodeGeneraterService.GetAllOracleSeqs(dbName); + } if (genTable.TableId > 0) { //保存列信息 List dbColumnInfos = _CodeGeneraterService.GetColumnInfo(dbName, tableName); - List genTableColumns = CodeGeneratorTool.InitGenTableColumn(genTable, dbColumnInfos); - + List genTableColumns = CodeGeneratorTool.InitGenTableColumn(genTable, dbColumnInfos, seqs); GenTableColumnService.DeleteGenTableColumnByTableName(tableName); GenTableColumnService.InsertGenTableColumn(genTableColumns); genTable.Columns = genTableColumns; @@ -264,10 +268,11 @@ namespace ZR.Admin.WebApi.Controllers //自定义路径 if (genTableInfo.GenType == "1") { + var genPath = genTableInfo.GenPath; string tempPath = WebHostEnvironment.ContentRootPath; var parentPath = tempPath[..tempPath.LastIndexOf(@"\")]; //代码生成文件夹路径 - dto.GenCodePath = genTableInfo.GenPath.IsEmpty() ? parentPath : genTableInfo.GenPath; + dto.GenCodePath = (genPath.IsEmpty() || genPath.Equals("/")) ? parentPath : genTableInfo.GenPath; } else { diff --git a/ZR.Admin.WebApi/Extensions/DbExtension.cs b/ZR.Admin.WebApi/Extensions/DbExtension.cs index e9d7641..5840448 100644 --- a/ZR.Admin.WebApi/Extensions/DbExtension.cs +++ b/ZR.Admin.WebApi/Extensions/DbExtension.cs @@ -1,15 +1,16 @@ using Infrastructure; using Infrastructure.Extensions; -using Infrastructure.Helper; using SqlSugar; using SqlSugar.IOC; -using System.Reflection; using ZR.Admin.WebApi.Framework; using ZR.Model; using ZR.Model.System; namespace ZR.Admin.WebApi.Extensions { + /// + /// sqlsugar 数据处理 + /// public static class DbExtension { private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); @@ -63,9 +64,9 @@ namespace ZR.Admin.WebApi.Extensions }); }); - if(Configuration["InitDb"].ParseToBool() == true && environment.IsDevelopment()) + if (Configuration["InitDb"].ParseToBool() == true && environment.IsDevelopment()) { - InitDb(); + InitTable.InitDb(); } } @@ -78,7 +79,7 @@ namespace ZR.Admin.WebApi.Extensions private static void SetSugarAop(SqlSugarClient db, IocConfig iocConfig, ICacheService cache) { var config = db.GetConnectionScope(iocConfig.ConfigId).CurrentConnectionConfig; - + string configId = config.ConfigId; db.GetConnectionScope(configId).Aop.OnLogExecuting = (sql, pars) => { @@ -101,7 +102,6 @@ namespace ZR.Admin.WebApi.Extensions logger.Info(log); } }; - db.GetConnectionScope(configId).Aop.OnError = (ex) => { var pars = db.Utilities.SerializeObject(((SugarParameter[])ex.Parametres).ToDictionary(it => it.ParameterName, it => it.Value)); @@ -109,10 +109,10 @@ namespace ZR.Admin.WebApi.Extensions string sql = "【错误SQL】" + UtilMethods.GetSqlString(config.DbType, ex.Sql, (SugarParameter[])ex.Parametres) + "\r\n"; logger.Error(ex, $"{sql}\r\n{ex.Message}\r\n{ex.StackTrace}"); }; - db.GetConnectionScope(configId).Aop.DataExecuting = (oldValue, entiyInfo) => { }; + db.GetConnectionScope(configId).CurrentConnectionConfig.MoreSettings = new ConnMoreSettings() { IsAutoRemoveDataCache = true @@ -122,20 +122,6 @@ namespace ZR.Admin.WebApi.Extensions DataInfoCacheService = cache, EntityService = (c, p) => { - p.DbTableName = p.DbTableName.FirstLowerCase(); - p.DbColumnName = p.DbColumnName.FirstLowerCase(); - - if (db.GetConnectionScope(configId).CurrentConnectionConfig.DbType == DbType.PostgreSQL) - { - if (p.DataType != null && p.DataType.Contains("nvarchar")) - { - p.DataType = "text"; - } - if (c.Name == nameof(SysMenu.IsCache) || c.Name == nameof(SysMenu.IsFrame)) - { - p.DataType = "char(1)"; - } - } if (p.IsPrimarykey == true)//主键不能为null { p.IsNullable = false; @@ -148,26 +134,46 @@ namespace ZR.Admin.WebApi.Extensions { p.IsNullable = true; } + + if (config.DbType == DbType.PostgreSQL) + { + if (c.Name == nameof(SysMenu.IsCache) || c.Name == nameof(SysMenu.IsFrame)) + { + p.DataType = "char(1)"; + } + } + #region 兼容Oracle + if (config.DbType == DbType.Oracle) + { + if (p.IsIdentity == true) + { + if (p.EntityName == nameof(SysUser)) + { + p.OracleSequenceName = "SEQ_SYS_USER_USERID"; + } + else if (p.EntityName == nameof(SysRole)) + { + p.OracleSequenceName = "SEQ_SYS_ROLE_ROLEID"; + } + else if (p.EntityName == nameof(SysDept)) + { + p.OracleSequenceName = "SEQ_SYS_DEPT_DEPTID"; + } + else if (p.EntityName == nameof(SysMenu)) + { + p.OracleSequenceName = "SEQ_SYS_MENU_MENUID"; + } + else + { + p.OracleSequenceName = "SEQ_ID"; + } + } + } + #endregion } }; } - /// - /// 创建db、表 - /// - public static void InitDb() - { - var db = DbScoped.SugarScope; - //建库:如果不存在创建数据库存在不会重复创建 - db.DbMaintenance.CreateDatabase();// 注意 :Oracle和个别国产库需不支持该方法,需要手动建库 - - var baseType = typeof(SysBase); - var entityes = AssemblyUtils.GetAllTypes().Where(p => !p.IsAbstract && p != baseType && p.GetCustomAttribute() != null).ToArray(); - - //23个表 - db.CodeFirst.InitTables(entityes); - } - private static object GetParsValue(SugarParameter x) { if (x.DbType == System.Data.DbType.String || x.DbType == System.Data.DbType.DateTime || x.DbType == System.Data.DbType.String) diff --git a/ZR.Admin.WebApi/Extensions/InitTable.cs b/ZR.Admin.WebApi/Extensions/InitTable.cs new file mode 100644 index 0000000..543f627 --- /dev/null +++ b/ZR.Admin.WebApi/Extensions/InitTable.cs @@ -0,0 +1,53 @@ +using SqlSugar.IOC; +using ZR.Model.Models; +using ZR.Model.System; +using ZR.Model.System.Generate; + +namespace ZR.Admin.WebApi.Extensions +{ + /// + /// 初始化表 + /// + public class InitTable + { + /// + /// 创建db、表 + /// + public static void InitDb() + { + var db = DbScoped.SugarScope; + //建库:如果不存在创建数据库存在不会重复创建 + db.DbMaintenance.CreateDatabase();// 注意 :Oracle和个别国产库需不支持该方法,需要手动建库 + + //var baseType = typeof(SysBase); + //var entityes = AssemblyUtils.GetAllTypes().Where(p => !p.IsAbstract && p != baseType && p.GetCustomAttribute() != null).ToArray(); + //db.CodeFirst.InitTables(entityes); + + //23个表,建议先使用下面方法初始化表,方便排查问题 + db.CodeFirst.InitTables(typeof(SysUser)); + db.CodeFirst.InitTables(typeof(SysRole)); + db.CodeFirst.InitTables(typeof(SysDept)); + db.CodeFirst.InitTables(typeof(SysPost)); + db.CodeFirst.InitTables(typeof(SysFile)); + db.CodeFirst.InitTables(typeof(SysConfig)); + db.CodeFirst.InitTables(typeof(SysNotice)); + db.CodeFirst.InitTables(typeof(SysLogininfor)); + db.CodeFirst.InitTables(typeof(SysOperLog)); + db.CodeFirst.InitTables(typeof(SysMenu)); + db.CodeFirst.InitTables(typeof(SysRoleMenu)); + db.CodeFirst.InitTables(typeof(SysRoleDept)); + db.CodeFirst.InitTables(typeof(SysUserRole)); + db.CodeFirst.InitTables(typeof(SysUserPost)); + db.CodeFirst.InitTables(typeof(SysTasks)); + db.CodeFirst.InitTables(typeof(SysTasksLog)); + db.CodeFirst.InitTables(typeof(CommonLang)); + db.CodeFirst.InitTables(typeof(GenTable)); + db.CodeFirst.InitTables(typeof(GenTableColumn)); + db.CodeFirst.InitTables(typeof(Article)); + db.CodeFirst.InitTables(typeof(ArticleCategory)); + db.CodeFirst.InitTables(typeof(SysDictData)); + db.CodeFirst.InitTables(typeof(SysDictType)); + } + + } +} diff --git a/ZR.Admin.WebApi/appsettings.json b/ZR.Admin.WebApi/appsettings.json index 3f35065..7c51eef 100644 --- a/ZR.Admin.WebApi/appsettings.json +++ b/ZR.Admin.WebApi/appsettings.json @@ -36,7 +36,7 @@ "DemoMode": false, //是否演示模式 "Upload": { "uploadUrl": "http://localhost:8888", //本地存储资源访问路径 - "localSavePath": "uploads", //本地上传默认文件存储目录 wwwroot/uploads + "localSavePath": "uploads", //本地上传默认文件存储目录 wwwroot/uploads, 如果saveType= 2 (请使用完整路径,比如 /home/resource) "maxSize": 15, //上传文件大小限制 15M "notAllowedExt": [ ".bat", ".exe", ".jar", ".js" ] }, diff --git a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/sql/Other.txt b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/sql/Other.txt new file mode 100644 index 0000000..c429c89 --- /dev/null +++ b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/sql/Other.txt @@ -0,0 +1 @@ +请勾选 添加菜单 ,将会自动导入菜单到数据库中 \ No newline at end of file diff --git a/ZR.Admin.WebApi/wwwroot/data.xlsx b/ZR.Admin.WebApi/wwwroot/data.xlsx index a5c36f11f29767c01bba31a8ed4660f5854b734e..5546be9ccb3d63b605c2f1ab6537651264823db5 100644 GIT binary patch delta 23805 zcmZs?RaBhK(l(5{y9Njv9D+k25Zqmc;O?#gZrp>rdxE>W1cDRXU4y&BKRnOg@3#;B zgJITUs=KSJu9B|muFizIN`tCGga@FXwS}~yAs~zqARy2oARyeWS={U#tqkq#teD+x ztP9kYq8E8Ee1wW$DK7Y_&@jjst;L4(v=2b#H#aTHL4lD*q4iOjwVAN0*PU)8TxE#f z^9`6h4gxPvqa)nV8mG5~2wACIUk6b(d;+0piiet)P4_!P#O(Z`jKW636oELC{Vo(w z;Q6GoG;>nHsxS)*B8KKmP`w&aa4=pORZ%59je$wNvlOH3H5W&sDHS)YQ3H+viI|io z7V{rWiW$3Z#dOpk))nSD>=x1FX^4h?9Ut6HKy`5)uoYAf#TA~aiMXH3n%8e8eDiV& z4vy97p8af|_an>{q4G%-4YDYQ>zh^{i(-r_r3M&wA?&k%2|VHYcG>{-6ky(WxCu zoQ(_YWNWP%tL}q~(ySfo(ur#XCMKAwXs(}lxLYN3cZ~0r@{<73JUkCIMpBS*Qn8Z5#5IDM@-`J zP23qPDBs9}2lKd7q9r~GgxTS-y`YWlQx%3!H@L_82aHW%T=-O9g&i&7k`!`|>sfe3 z=vHL4x&^x)w>r&pwzFg$kCd7(bIc1lrk0Y@*|Nj_Ks&}6piBWy(tb%~E%k&Uw&*>c z*!4HUvS!H-oQ=g@w;!4kLYd_0_j1Av)ytAcL5VN{rs&3~1Qi+1M{U0+2p{ibpP?$U zh{xtb-aQxL1`v;aijljY4z}38I}uGr+jr!1q1|6;wf#$MReV~y03 zx;F%5FI4cY$BY5ku?B9?YL2~)?*sz>8n58k%>7aeL9c6>3NApl3-h?>+Q2_I=090f zAJQCm-CmGyY2f|gYJ#3fmQvhk@GynSTiqAUx4+IQ_U9L#`n^|GHdTsqjcDDDY87tK zYJ=LtdbSfy5KX561GzLzQ2&9gJO^r6)pLOTGuY-{U!mh?pwVkXk$j;L5uRz=t-=3v zjK@T!0OX?6Suui76K{kxJFtndl>J52l_r0F`>CpCb9u z!It()NGM^EEo4y0#BQXARsg1tv9>v@ik6vZ7a-AS)Zs!t^g@}h)pMUfm`lWm;dqPC ztDYEF)o`Jog9zQ{hX;B62&#XP{&<0zfoThvQ(DMHgqBazfAyrJ7T;xQ?dPkWnZM=D zLXa9m)9|0W0~G;)#vt86S)&>OMJj6A=~8wzA@+rM%jqkHtbhSpR0)3^WGe4yPD7Nyg*U46ukKucOC6jC}$tdtwO}aGJm!GYK zm@$Kaa_oz}vdK^6G-JvvYA+Jn57Zay0i2azXiiM7Ltnvu^!49A3Gqs{0jwCJmHuA7 z{x*_JzpE4UClk6T82zU!Il?h5?8va`_0=n;U%CZN+p=^L9?h4==Ep1nm*+OIIn*si zNBnQDFBYTJ5gqQ9>DLEKbrlxlE5XzXaTYTuYqrk=9h*6L_#3K2{j)sAv4C@uw{#xeCN1M` ze7n!cbUR~NTlR9Bil{bFN;w7@C!eDDo&OA0rX==2P7#v&;hLwv{uAD-cVWoR38#*_ z9UE+Xp)nK6L?q2ezDZ;M8OH-ESUH-X#r`uynY)jXgMF9L0DOE0V;$O6s1D&40R#kG zHUtC#L_A~&Zu~d~BJdBy8Lmkg*WisL_u+!dN-ETKij_4!>GGROmg&pd>`j-PuCn$~`XHhwrD!VNV=F(lMzT09}E7o6xph<@%-S^h8 zsWV!Rd>bDSiEIDG-%U$u+;WO94U)3TDE108cD?dSeMyi@jiH@1dC@SqOVOGysq!;Z zy2N6XaZzJ>_wX8VBhs<#7SR>&-4y2}GYoBz4`%S* zIp_%E_kYXp^{?3d*z8jvOP`nkQ$0`Oed^ z-}%(ks)j0$3Z}R3rX6twqR+>JCWnW6NqNFJqf^B!e5F+=A+_^xvvihOnQnACRSNYC z?6C?huzm=nD!%7Ni+@}lzd9d~oZf$5P4?a+!DNf)8x2Oa4*89@ew=uGIs;X$Al9R> zBT4%`&?zTqOaK?4dtr?;t7{gwr9Tl~=`4xYsZ zt#vJyPk2fk5|y8tA5T1dK7=dp%y)^HeOKP6Cc@xwEeig))nO5{)QthMFQ%x1^$#tD zGjn9ea?2U0hJTU!?oF<8rc3*p6M1m9m>pJ4{^s}Ps=w%XUa?;{D`sg}q<@2EZM86P zCC~zV3MaEr4Goh#XH2g2O{vGq`*L60l6g+qua!1gYbW!Qi^qd5+N75Rhxg6x5gfl{%q0n>nl;!qkht!Pe4k_ z&WAhp7S?*KeYnp8WRc7X56l~6)EG_-pFC3^0--P`kRuZb4c2;2UIKJL=wonfwZkes z`#ncP)5H);#2tRI;r7YyV8$RnbBy^UGq=lnGvflcu>I2Gf_3%)!CW)0k_T5z*fS@K z%Zca`VX7xI`QKl5`UO6&Wao4@t+L(;pGj+3bUahjazyLyJ(y>9VEdapdkUPaEz93U)&1?q6Dh;?9mP z%>@{jQkwRLi+&2zG3b$HzBXL;!zz|S@m5dvnS)@>X~MM$>Gt!Jm}ODEdq~aP*gBQU zcx-)}VhDvgEKIQSb+F(7rMaRqe!CBbw*p-wmcEPUhUyE-M(i$C#D+=*+;uhjXOg*v z{gMe!5M}eqlf`osSV;_$ChH-8uSC|GvyEgpi#NthtOZ`^W;T-gyQy2xn+HP0>sz!= z@@9JdBrH}iZ{4DCK+?mep*Y&o3}&S7A!nn+N1dwWS+2^z7t^=^E8p4cw9j1^Q9ib| zvKB3W*Ord3?n5#{dLP7AsMeIsA6bmW(2&6BQdy0a#25L2&c$Y$zpPc!F-4kbfM{USO+d7AITwC z#(B$cUCh=!NK;T4a8o8SO0SU@*-zU7fd?0yuzC89lA}LvdQPxi-p7#CBOrKo5v^S6 z)Ghz)SbbW1+>~w}ji1A9%Ylssdlt322MzUo5NR6Ti|)w;PQ;`h|1}@4a51_;h`Kmm zASsciRjJg}!RNiSEQQ7~Q#yIvUQ70tKV9vn9PjX`XQPrQ0B#gq@$Z7vXNtMSc;kp~ z8p_tJs6vGHx9lxC5Xf<|Sv&XhB@FLJ=oJrtEzLhqg)j^LS&Ffxx?=Xa6eL0S#W;kyl>$f-4phdkPK2u^6W%gd{>CUF^?+I-m!Zvyj;sCnY> z^*puUU^NYEhZ*I^wK|Wo3Ecyc@tLdxye$dAB)uvFVfBP7;OgiNF*|?(MZMEE2&;N@kv| zODk0Tb-IOxeNJ3*3bJQW0g6xXGr;;~(4Bx{A-bvE^z$ks1c_cir$L0Cok4$TvzGJFO@d@|U&;4~}1oI}UyUB0OAQtxVm3Mk&T$xg3m!*O8#`b?Y zbCn!YNj=P%vl*8^0pvQ_OqwS(oiMZ48~#zT2xT>C)@kwxjJE?1?VxjmF<%vD7hQQ% ziOo?|7`I#FT{&7IIv(J%sNFL&1EZ|zVZg0T&eJ=-@>IjC&M?Wpkx2owmhzJ8{RR2$ zlOK0^E888-Sy519RP0ZhM5idZc+ZCA)wR1EqplCD0vA#PN59*?hkC*7-$UDhV2sXw zr+47av0=>=)P&6YM%BME`h*%ZXL1X=64)cHx?{8Pv)fU=&%OlQU%Iq+3VC3n+thR; zhPOpIH{##1YoIxCk#h?ba;_#^!gL@tq{ zoVj67QoBUuIY?l7J*beSSJdAkK0}UdPC>JOy3*Ch$;@Y1`qg{JVdGwA7@4dP56F1g}EbLFma^< zt#lDHDwu*?E}#S8LG>Eoa5EE_%*df(0h@XCp0>8#7s{40Ta(Nyk}26D1}%aM5*^ zgoQ>_C5S9qVBQxCY8tdmf`)Z!6XGFQwBn8S%P)G)PVS-0K_&)glBMceeBya&XK_Kh z^yPB&R_VW#2O6tPKUnNgTR8$Kbwl6UTldiGEE9v?crf{YJa844+2F}+)J!wNmOmw2 zu=B!!B>Jk14-Pp)Hc;{2m`E(_1|#gk$7YEtpRtkU+RK7>eMIJ&qD*Qbwvy@N`%0+? ztPv;pRdV-jxnVlgBrtLtah7N@jloEqm4cSTKP~Le=@kxQT z7(cYq*C2(UWvl0;g@DQfYiFP~80E*!6eys$E~kfJ0LC|-$lJD5qxc)-qz4@N?YvOA z*Kyi{Oep!`R_i9uKZ9+?nH9V+11Tw`lH9Ie5Kx&bHFQ*ypjDf|CeuyaiQ6F?1#tLQ zE_}XBr~PQhckkB?ZMRrDH;CBPkT_7&N>gmu+}?VgIOhA&t&vjiKsL&+0W%;m_SMnF^3VgY8f+$m69e9gmnm;G*bP@EgkN9Tp2{T(#uNwB%9>x4##R znmAI4R4#N)rTgsdHG4b;cT?Jd1h@6Jz#1 z747)K`ewu{$qiw|mR;sZ5C1V0`S zQ{a)nGyM;p7XFQ#W4B}UVNdW*kMGAyWLjPP8p_V>PE+W11+k`0l%p-X@2e{j7BhqB zFvxY5mAbUF5ZaggD`xfURV7F1)4@BgvsyMNJlKa;KI86#QL!$?T(%H%VzY%l?zeOT z9`7}cbs{iPfux^#iDG7JRN{<{Q$vPe{h9BG(ejIf3JIDaGji01BHW^}%wcnJEM`Dr z0n{btCUT417P!O5bv5dQ_DCQPxuK|7^PO|E1F#}-%gfE>q|LGu(UOm?lj3Hp@^&gy ze-3F#6qq)>ae_<%k6g!$OmRGOxE+Yg)Pl&YB`0Doqyto8u*(QD2+1}Z56o*zh`uZ$ zufvo-fPTHPQmIz==7iMh8jLv)3cQo}iD#w2mX9iv)b^>F@7=jQK*)pc4u1vcplY)(%TQ>03tPeI-m5e1?bmZn#d3(a|1ZtXm)X z{^qKzko6^NZvIxIlvhmNTQK`sRBzENm2+G>wi*3?%=Ci?>eR(PfnZLnsc2FCjo?U7 zu+RLizTfPQf_okC#-4iJ-A}BdoiFh|wacqITAipoPHsDP94sdU7B0};D-g``!zaHU z!0{4;(fa*=HpI?EmIjly;|kKs0lSBC0jAdc95tT}CuknwQatl_LEjks#X$9+r}V?< zK}uL5G=8Sdnd*4vZ?TL4(G6wISoh<5IVcE#)_ewPv>U2?7)tINICoVNW02mQpqh9? z1C$LI4JOnZQU2-@#voypAnM_b9;%$vv>a=lqwZY0eRZHkrl>X-OBu!P7NkKr=%gnP=4 zqDb#`NZB|Le^&E&n_KMZ8>s6hxxRTY@TSuf(+gH8WLlYI_-hmDg0&V%Da-Ty9{!@P z_Zj}M``zXaRsbZ}_n0e{t##snwJ!9<^PT;!6uH-wATQS1ob~!ITdnM7jTHCmXQBi-M%M=) zxi=w&$MA3+e0(zmL1M7cXi3UO$(9nk+rl;h^V@)`Rt%?SexZN?lZ_KqC~` zWDY-qZC7X3>^~CGs)@=OxBk(5cT4<#1AzaI@S1`K8>P43t`Zmv_~!qF0R|A`${mA} z9Kd{*a!m*%d2oRZti2t8BT7aydosKN|8KDB^#TDv%`Y8)xI-7myztpw z9Yy`@$uwL70P&lkKh#o?2RB32=ThP(78VB92rdqBaNZ>nSc3?47+o`ox zetA2@US>#~dFGK;Ek9Ur3R3599^S6Tz{;YV;+Bk?^5*$#whd_*X{0mU(qBHWI(S+V zxFY6sxkoh_0}?M?H)*J{hZm@+--1?4vROeVsfd5Hud&5RDIw=u2Bs)7IkB()zuhhroH^m+ZXS<@66OxL0Jk^I{WjMS9|!KozBmH9z-cn}I_CD}Zl z_fVC?3MBtzgtK*bDTKgclT=V<4HCeA=3S|Uq}$8gRco~F61cs^(uLh-Nw{kO9)NG~ z4{|L*ywF0NgRH~H4Da>s(0DGx-M7CV9}&2dQrtfwpTSguLOfEs4r|b+bl;9jQ;RJ# z1-Sf;e~b?p>)NBFmPtQC@Rd6dtA3UZcCZxk`1v1A4;b8u2{%#Cy{4 z$i_A+C(F}Rvz{^HJ`Mx(JwDGQ&Z~ZI#I+33l#i%an2EQ<2!yn0M*~;tlgB^C&QHrP zFIU2|pBL{n1%YrQAvZKNLA9cD+nEA{kRzkh9oz{XI63$A%z-0%o>^`?gkqlA7PgSh zgN(BtpXN<7l3|{HHr3`k7p}hpa(}C}P40gS<(iWO_@K1LEU4L+Rc>G?JCw0(I{y59 zexdgD*Emm-L!{Bqi{ctxP9<$&`3R`otSPn*-ClcLpWWD`ukdndXSHoQ&r?ys@TaxN>4T#lXf53#GP*sZ|w z(*q2a7u%n6S?gt}R2lV<2!^Y^pZ;_db1B6~9;s`gy}Ji_vN9cuBWVbdWXjf&2}^RK z)TNBLI{*ZX!-L`3oPLo;a*CTa;p1Hve0FgOEA&=FlvYFCbu2(r~osb47v9;&HDN_@)1 zOqorN28P*d|CO9WSmOtug%BRwxU`#mbq@kw} zYtL#=kw%0AJj~}@zbYXx2jmv3v`xOd89VTR>80Q30U`X|Efc>Kimk7?)bH_>MsYz@ z>YD@uCih$ns}IjNTV!jUuWde$_s55?kZ(;0L?6(sixs%RmJV*P5dk0Hy4xA?OO{)2 zeK!0X(!dkadmJ;P%>*uo`IDKNqYY5(Ky|3G2lb9(lJ{*?CJhseG~N6=t<6_c@dwUU zeoL_%{Y(xU;d~`Y#JV2UniZU@xpB3#AgnzPZ3hz&-99#tC->`vbRZPY|YA#i!Mht-7%mht<%h50k0 zp|C^rb*s4RiR{!SUdFC#>mihZb4X~t>ZA~=qIBJFGVbzfukxx>qXb9cD7Qi-G-gyviXHOh@PYrU} z8gu%ovDyS+k}4kWevZLdLxnhLj|)4+KH|UgyqzoCzhj&x{(9i0E+w$h0q#pM?|UZz zGIZ(VaIa5E_V#xD1&v#aDK?#Fp%x-kJc{I=Mi@~B=*WsCIVQnTFZ`?yp`TqTI!Ln* zO1rz(n6!&?cKLUJlwOUP^!_aysp|4oe2?oo7}|-L6n75Q50N5JK4D4j)%M(+LTKmY z3~M<&d7?)d+z;c!qI$z(zG7%lk!Hf|()k=Co9C@PgAo{8T0A}qzk{W-A>&6G2!LX_ zZPZqB$<1UUX+<}?dhzD?iw&}jDYPkmvA-&Fs1_eNq;Hbb=S~UDvO2iTY_ePh^j9+_ zPgJmzclDN^E&t&Y1HxkS@%l@P0AUw#&>`B+D~MsPtA!IE)P*9POJ28#NqTqcd!>oX#$T<}IRINTu_y%`_*TK7UCZ?Cl-CWst2RlH$In#2;le!%~Qis>8v<#>)wSO&=*-L5%DN=#?uMn znL3=7t!^U}n&&}_V{&S1?eKZV;zKkHU$gn z+jHYCPonS1nk<@X;OHIU6ta@Dg_xpdkGBlk4)d;zoY%PR2wiwn(5XH7I|!`K23xh~MY82|0JlzwlUE^oufM*S7K0 z$iOAKPn@1`j8ghN(@=7Gb(9^>jkh!*{-42(*o{=Z;mGk*dW#Pk*A1xH2?r*lx5xN( zIbW9x9$&}|mBmR(wyXT?RBx&Q>cXk?#CC&w`052zV!>pF+nVCvYXaGGTA6~sO1(P5 zwc4}##kw^|!aaIAa9w)lugJ8RiNg2=oN;;087`=qG!`-@b_`J_><}ehZAnl)mNi?6 zX>_aP{R81)4JF0<&K-R#b5zCtS_h}Td@SiDkn;Sv7G3$`IdX=M&pB}cv?EpC+>vfK zAm8<}9$ANqFJxGqL46D>q~*yAteLIFR_TXxpPJvP6b#<2=!m~KBUoGnAT zk+~8a;T8<~@YgcaP?VCZFn@S+X7!Jva5Lh;A(s1^5`W>tT7Q$%gJK(V+8QK)x(0uq-6iT~?6Z?{9F=M|hf6MYk9#S>wT5kP#r3gQZsIaRmBr(WxS?dXQ)$1kP$c+`9z2!nq7wJbPvq_Glrv-{J&f=2>xUz3V| zh#RxI8++&ejw|iLg~AnjJR4^Wnpo?=))?5J9FYI7N1e?E4=jZ*y#)wlZ}{AA+Je6Z z(|BYye>tB@FEq@B3q*-A4kspH7oM(G*A6llBvk2p7)QLO6CTVxo&N;Yz#A2wI1)WT zQcoc24BEy|ow5{i=lAigs@<eV|IGYecx`}n!=D6I5Hsp7&h!b0my$B5o2kEy9U0?XYk2K? zM}V&}Y4hr4&=W{FKfD34rub(-8i`gz{R%EZ2tlT@${;?U`2&!3Hi65gxaUl0x)WLR z%j;?!9TEP~RvwPOqJ9+(c|3*Yvwsj?pFT!>C1SUOw=Bgne}Apvzce|M8w$ znAh{Jlmd6!Yp%ua;S6@W$idwJ>&UuFTshGQhwbx8`V$-*LtSzxHe@;z}q1@ot@aiR{$a6J;i01<# z?3(J$cpnx+VB10EwoxK`TkGC9;npc0KiY+z+hy`q5xP!*yk1hJ0L>z}PArY`6ZGgz zCXJ!{+=#2WX#}~>A4&gY4cG$;CMk3aF;B_jGP9h;WZbI@QqM-8G1QrPN&mSiD!bT8 ztwx$6tqP8r!k~cg71mj9yya;$?)otrxgshUTOW}mptwPjv!1yCq-3Pc)B2~^SdVC8 zivQ{=PXbCD3+hu#o|ts)-mIvl8?qS}C}sZ}5~xPzrClRjEP~#SiejFtO(Et&P5i4TeIymk+>aB@f`XHn zi%PhCRMWPzGP3!4{;*f%N4S5$im-`h48AD`!3g_*VBO}#0AApS-3-YW1Tc)nxWrbp z)#}^%O%c?eavCm`XI@wR=%fn2<|S5DRo|Jyq2C`$F*ri(6>`GLiL+7b2bLEu;9c!S z)2FFyLUVI!%zhRgUq3j!xcu>CzB1Mb;g_TDCA@^u63NB_nplpuhKF+_I^;laa@OAE zhi`kQI~iW+00@|*$$ViE+0A0Jo|1&LVz?oaZ6Zg*K~L$lGuf+5!yC6xYhCGx2%I6s zA}%)OL8qez8J}t!k*?8|JtlxjX+t!^jl57l3IL%6h4!;cG?9v?$r)tBdR4Gnn>3$h zUvc7PQvw2x(9h%x$z(owG;1A@5(60Nt5q*f&DJcyq5q4Awuah0dqtixQDxqsmzwyc zJFdjJwbC!Wp}LI3+D_-xIV^>y%5WZYBoNJlrR)Mb*~4CPVE(I}{DUjl>mPEjvdKpJ z!^7s;q4b=)`f@8GQONeccBDZ6w%ug!9Iy1`F3+}du_VN5AVnW`YuXj96nvQmQlv(? zfDZJ*7;fTq^ywz$U`uJvoTXf)Xpjw+GSZk*HaE>B3V6|kLnq)JPxqfIiski5L=zel z^htRaxzZ#p9ql{OM53{3_faI{XTdHrz@fd+l|HFC`e}KQ(?OfT<4>5goF-18sME}P zR?NaTf+EJm7$-_s5LZWtrj`@>bE~w?%IB%gci>F6b_uR$pNU+(ME#{cz_38E^+|6jI|gxMQ?}&>zz?SB8)~-%xX=6z zPp!hD#u#1wew_vunrXIv^vEU=0RZ~5XX00)+-(T%7nWM&|{)E9(1dJwMEM=1ZljJM~-QE9uJ>uc7}q(LJDy} z#w~(_dZH{}41m4ti`EhN*`vX0`a#@qukBCgBm5QBA#BxCCd8)H=X_SVcsi5(bP=A) zOpHx(*`C0xK!$@S<@)xuKv{W=P-tVEsCSw;Qw>j0y#9tCkh^jq0TTigJj_{>l2X@q*w?@B*@BK}3;6wAyv{fVrI zo5QR`{TC^*q*@&Hd<~U;#xg>>zC^KDonN(N2A+QAFZQ((!y4-FYu`^dn%$%f2RhQc&E*cYm#sWK$Tt&09FMJoL4$#SV0p`%P0I!Au;jf%0c3yKFxkDV(67A3r%M0?t zA~`4=xq2;%O9Gn$5!w6H%x@iu*|ixC4%91uJCU)?MtXFk;O~N^1!t87T5ICCH6MiM zdvUpJlbPVOlCKmx#x%4t#{73$K(JbIRKhPQ;@!zSB^QiZMZOyeo)F$aAWL~p!2;Rr& zgq?07dw=4+OQ+`K@KStf<@JJXw)v!+jN;tb7h-wS7vIq5%%pnOt38dJuok zy+ay$&CPKWkL(nc^p-KQco+frXgBvdGCduy_YoJsa`5%Pr+qKUX^$Zq`;edx8GCc1 zvxLwFEqbk88&H%zDo?X>$BUveC8wh%*pZbyFp9lu@^o@S`RpRsHXI$=`toqTgkmJL z{39K|O-xtq=IHYeP_26=t&~E8xI+A^jSVN(V9A4X@HKgE zudoQ<4f8o+yXqawkRcC*1~-B?=V-2xRnd|d+xl-v&Gvw1f9?2feaIgWBQq$rPZQOg zQ`qbCkUX}V}8EscF zw0()60s7mBDppR7jbn~}Otgi~gkyVP7b3$#e_mM%4UaWAs+53lE3}Kpq^lX)zQT`! zCysHp<2@LU5EB!fKJn@0RiF;#OpMJk3ZA>uIV zu?hM4n0t-v-)OZ|-I1CMHnj|lf1(vz7!i;W|KE$v4`hsM-30#0IWaR0bjPbDYC>aC zY~4ux)2p)_U z%-GZUr9CwWm0i#qJseGj2XE9^5j#mq?p)FJ{nlGP6#M)1a!^q+>Bw}yC2+DaV;g!{ zzCA-X$rP3!iaDwlG7he{^s>5?2fo!?7Vbax4JCd1y~bJMhM$IayUx+Lq(g>~|Lt>` zTIrKTAUI0Bv>in59OC^IoFv5GH{S@~kZ0!Fx+SJ959A!17KCBv-Sg6Z$rwR=%f+AF z4E7^6n>BjjI`TGe3q^q`1_qxX>eIk#25U`ly+u`RUC2aPkWHONIB9|-MT`SkuzZq7 zayTTiI8`j zPlLSYj8`qZ_hhj@5;3U~GNSG8!AX^Y0z^f8tO= z(u!>lD}WND2YU?(XEAw^?_bAdJ?=*^Surn)xwPuzDxH339rl~_s&3%kn$}^eGh1Hc zThlw&(VZo~p1k4l#(i)9p$lkHDru@_JFqalUvlyitS znji8x$)#~i^m#o|9Hx~+Cs*9Ue&!8+=3rie_!IXh@h4MSd zgd9*u!*pZhg$bRI&QwI@$luv#>r;}Ukap`t6~#S7>GR}C(r1Yakl>i;&s5EYW|WAg zhyo!gwLESki}E>LB~d>@WJH%Eg`lbkOSqAL;nqybr_Su7Dv3O0 zpipuuB6T5ivtP~K6IQb#asS*O7P7-*>A4%r$ZPbSh;)}IC;;^ny4G0_1fd;D(iUSh z3O5D>%lBrob>N@)jAq=@>X8Y4iv-080YUh7RU8js{ZFa(e^Ojpt^pc4J2JP#- z63-^r5sZKCix+^aThP{V(g$L7SnH7AIsmxWtQAscIoG%Q;_?A(Z%-nSX3Cr%wjLch za{D~~;N)?kZeJlpt&XmBrXPP_X+rA4rs81!k$7vH7N5h*BRiCw5F~clcBW%i`R~slx47TTC<>z%j+#QH4vzfbWWFg;f(Vme$f0p z^iK$DRMMdTrI`C`$e3AB59vwEd%U5HRrrNHx?F3)L)0sk?$u{(Y`aAk#fNCcxs}a? zxUpOYBd(Q6Gu2%L7sY_1HW3&!eu5++G02uDx5@yA8x8=Wx^~jbHB6yocy&RK=|c|A z(jxHjQ6XnGali=2s58@`X7dh0K2Jr-hs0$@27Em{Ta-b-0g*_KI5HJg-cb^+G58ghvzYF_we)D{M?Cs?N@R9;A z&xad(a}u|A_K$lz19C6dztp19Ut4x}u7~wrzuPs=HIkj`k(CPl9hf?I@wrJCU`$GX zdfl3yojE_)a`y84zWS~mtsUC)6W}RvHM^hLb?CPLjBP}GmGx&S@77;;=qba~N}^ih zZ1%88;r;QCjt)`1PCA*P>mrw!zU)r1+WhA46u~~Zh=!I#dvTtJMPCZDMk6&cewC1! zD<+$>YAg+e{mtht51^9gm{*YtA^`2cut`IYxRaxbh$~-*vz6NB2&?1?*8=9BTXWv% zbUEjzmisZjSjuDMb3mL%aUu|EL4)VxHJ?Z_pI|1MussP#{1yS8Z+#WZ(4FP8Y|Xc1 zdAI(^E19p#m8&0i-8Dv14)9vBf?RXaRq)Z&C-r0c!bFytL{Ls~LY0sV#Q$dCpOp|H zZ8@MC^t*6>K|PkiS!4l_{wzP}?-0d-X;rU{LN|!~Q_>#B2|qfb7V7GJ`FB>15Ue1y z2oa7;LCxl1s`HWwKYqD4N`gWR_uH>u*3~$1`nQOBcugM^HS!c2=|rz5;2Gv(s8)aG zVt`+Gv7vg5r^H&(UH>IwA80k~mqi_=()10Q$-~6_0%%2AAt zQGuld9JJPszcN7N!3*~6Rtt%#bl$+66j8{H@2{3BFUr1^{ERx_ zT~zx3+3f07BBlBeo-2*G4C3fB6kKnJ7aAaB_+#JST%iiH#O%nqb+a;-2*aXYZ03~BR7*Hk#6xVL_=N8}1T#DG1MgYgV!H`P^D`}tF`R0SKr|(rdS)0FyaA8_xfUO56QVj#Byysu2%)8N^7uVldJG zdPG!LU&wU%>{e-89*`Mz-u)xv=vEa5$Zs+`xJQS;Fj2+pYV>^UHD^-awd9vuR6k5m zEPJ1Kd;TsxOmHy_6^^Zvb5cDL&2<_^DOeL?l+ zV3BF;^Qa_$33=~->$iSCUg2GbEs1I<->@N{8B9UkDfuOV0uQ3YllvcD)4}3(ybVlL z6Fn2u&HUIc!Jjw=kna}MkaS8eDPfBe8ronBh+9=#`~OJYmG6C<6ZiyP`trC1y!5n% zIktc(C)0Nq@kT+^jdI}#6KnzM(Kg~)F&GvF7St@n7h77o%=k*wtWF&QBb>FGF9~?a zE8(^FBjV530%g94@8W6hBG)i*Fuh3cG`#b$z>qQo3ad zEQX>hVQC5%?b^YO;nec=dPS7V^8o=qFLFmjx&3Rf^;cWzKQ%jCogyXB{Nan;EHe4(65iXXKX~4rmPAXnW7LmZf%7Tmf`PmA0C*iJ3 zZZwfoaT448f#CS8{x8>v8=CtklDB%PfC0E% zIv&`w(px1*39G7p#F1hj%%dov|Jsq5**Q_y1plLX>7+$cbA`f?DG}udq;weGui<{p zfjJ~^viL}3N9Vf&o__pPgJ*FmnT@hWIqw*|d*V)|!I zKxVKvF|nh&pDa+WqUy!1*^u@y?uArAuEOiR)oY&AEyF4=i?7ZQZ|%uir9 zBRIabeG4L3QqF_|;F9RNDv(YOBNhQmge$kV%Bg%1+07a1b`dIFdhVzot(bR77cvSR zQglDUGx!Die;-aJ{CTTci2*@Z(0IA98Y=0(4e!zXsU8c6r8S?wNto8Ma<^T{jhoPz z6~PjBJo=O^RlB%0z0&kbnb0E&9WzZ-Zs}4-kJPQ4Ka@RATsNKr1+HWu-lcZ3PgAv` zP|w+44cOD=$BI_;K!Y5~2g$PavR0`?sk+9X-_w;UnZk>q(~RmLMqfJv1q>1I1q9K? zo#Bm?)=Uhj3zA2PI;DsUMD!%~I~AN9?fGz32ug}NB05%ki>+tfi&!lKRQJ;nygwfH zUKgk230~_Q0RDns=DOYss7y=HUqv818_tG2>adA<|81QV@)i8QUxpE$O~l)h z(4dx_Xr-3~rG^yrmwW1sb-})WFE3=fce7Jqk&;Ca3HNv-z?*Z4=36?H=#F=P%Gs3M(cVoZW4ow0P`D+7eK)xBYu0)p=dL;n~*6+d8#a!AeBhF(vn6~pX zdz+`AI`BBz;|c6tV^}-N_41I~e$d;*u2+G)!tO*qpY8sEIBZ_kE4psHjT!|ILClTg z!*V5ra(QycwKa@och0$F%#El;TNn+}zM(56B$QhHj_4OBm?)APlhlSIt@ofPjm*SR zhyKj65;rj%y&r3O6g%r!ksg<{qJtOxl$oFJ6eXC++j2LSnc^vtg4`3Aq}QQ%@hKy6 zK80#332@?}I)X9~Ml8XcLsh|q6U1H8sCOd} zFzjyp@oV*kJsX%jK!IN04ir^cZ@Q04Hjhw9{jAOR!nE=2I?mmkK*n<3P2&&pqyxP9 zAHgyt9k%NNEd62jziMU<&)+`g&TiP-|MDqa#X3mw$ALt$yuw|WEUeKz;?!#oQYKw> z?#(dgF45!N7Qw7DPc{KXVgR>_jH9L;2G9`Hr6U<$iMM`O#~_#C^(0_K%k*luB$wG3 zQ}0E=PGv2WDaCx4dzUM<9}eS)#@X~Jn-6H;0$dl#;G1Zc)2_j zL-C}CpO11aLBn?!7sU|BY2ei^p4t7yw|cjO887pV96$IJGzS7s_tAGg zjvUN^JZue~P)prz#l52vZfF(}9$134(9?wV&iOSN$&cyVCadrMpLP?4tsz~6{Q##po+a~@{Qx!)XJ22RH?OJf+s74s7-v>{ zIM36?H({&j{d~n^3=ztQ?Hl--MBWQ&Zar5YI^|~hJ|Qwv^ns&Zv#m@p1!YKA6}|Ef zDtWiFLNEgSun2dSVMcG)FB*FjWwM+pTo1|T%P}nNjN*|Ww2iLy{Am*Q2EW<+5~EVA;!LPg z_0&`zMu$=^W{97&=yp27GX<9`A-hg0+V6*&6TMm0SdRTC-j}3@Bgc!_{aHn$wglh7zfnNOGyPT05(hoI-M%Ara|7$PQp`PYb7XQLat+KW%`#jN7m z14M#@1}lH*C}pW6)wz~+FNVPJQUoOU)vDeIznT~M-ccq}4Z3{*>(twEv8+Ok8xd>>{6@)@ z0gl57DW}5F69Td$MO)O$ygJ9%s`5oXtQ}-eCwZp(+VUgS_UFOH-W`JjcE$C^x+Y_@ z?~y+Hbr4kzF%GMMb?xY%KxUxjq)*%qn#WejX zH~lH~gVa1j1?O!{ZUCX6WVnbfMJ@j^=tE3v) zs?>q&T2)T|<^5(<6%31%y`9uCah=GbyF&N{`ubdKXt5CiQNb<;V?2<+j2hyE?Q742 z*Tc389g))_NwM^zQR*JB50=@z0ufcCQ)+C~q-u-lJ$c_b#XpoGUnZ-q+EC98yQ13d z*cA1%9?ZHy_rHs6;gp}r&DOCNI^L;rxK!D5w&D`bc`J!;&Vpl+d$>7rMtM~XI#l~2 z>+3a^8~E7KvDIb;e>p(h6@(>D>zJj6vc?VFrP;qLW&OI@S?QRwMr#ff_i=&<7i;dR z_htzws-G7M#XooG2DH-GlM_gKyQ&)AuWEk5ZA-2(ViD-|r!7G(l%;>GhjqkVkpeew zo&BzT+|xss-$Gf`e2LuBn;Ug_Y#LX+x;8jsl#WFYAW7@W;R0FoUEG0NH`+c@mt}ab z(MyYZ+9%7@FCETej)8pD(S5QM@)j%IF*^;LzfzpHndghN?D{H_Q#O>Z=FYz(0&P1s zDSfY?m=d2LNzZO7Pw9WUPHEuKczad651*?e)W_zVKmVVr56d z+gn~&Ytp&UAxMxDqg{|^!$9%=ov*WlN2cl9=K|<7mRa8_dFFcEzxx57l&WdVGukQ@ zKH+hiqiC+;XOwrK#yCdJ7IJ@LPI!fmmGFQOPIF_WCDKYr%=30kn6Didi#~yi>RrLK z_-ZTgjGmBY4d-*5F;@$~ zxBMiWs4d-;$4D}BpfIsWp%ql{$_e3x115m0(1(MsJO~p{*UtE(j9y6ar$I;Z-AJ|= z>?B;?g;xv&4b8vq_xrB6%qn$Wp=`FBlIzRp9rh@5zw9J#OHokU*|T;OXf{_BWi^7? z+m>gqGIT)3)OM>-A<;iIest2rkgc#%2C$5Y!eVM&vd5+>@apw21FU9_paz-1BT z&Bo~`*pre+f_--#ja$1DSxEK?yO5AJhOzYY5YbMI?0KO?b18HGs*hT6cVzjQ7%j`m=k zE6PBC(@w75>P)}9{FSig!>@Y|GEJV($S^#PE#M0|hSUuLY9La_Uy3o-82-LZe%xkR zR)Ks!Q}~!OCx_A$N0Ohuk4q`n5xhb=nQEW9ybD`h2D9ht+&O8uewp+^_dq}0U;+Nv zo1QsgBC(BYod_?+_R3J8Kyx+>nw_pyRK9QDlb{fD z4al;B+n~T(d$lsY)dbK?WknWW#kxf4<{jFyXVH?eTD?oUozYG9?1$r`t`+#M)RBit zHI6NZryA>tcYl@gz}U`3&`!}2%n{LY$OAJSO-i(nta)$GaD420n;tixk*KJLC1$#L z;ZmK)=d;TKkK>hW5SzgO9%H9b^xL(mG{{o>vcTo>8yucytI zmVnkbRmCJ*Q+;RBGR;bMQ>e;~hGEFi#4yyJtHpD^I?1XQ6&M;JO9Du@5)J_* z^|T9%8-UsO?jkL^47~9lT{jWgvL$*C`S zSBIYkXe0H{8VkNu#OB*9b7~XDrNqKoL=K|~-idfYIQVVg`p0LwqYeSITMpa^7mp?s z|6zI|M#v7&)zp@S0>lM()FefR;HNd69Su%>w-$5AxCsHE)ja~y^@UqFdP#8kOvbyN ze&R4=M-9&sEKZlRcpcuFrLY$-3px&M6Wc$Bhqv=}=$x(@7h64%!5*mzuuANM2jr#v zLN-0S{wAChB2JA7pwd}59&w?3!Tg?im~J7Ee;Gn1hb!&m`y}-Q7O6jy2c-;#EL=IgA;M9~%VXno&HPaun#-%2HD*6w^Hov5bEq!adf=(GrVT-@l1=7^$ut_B zgJ@_Wh-93R%KS zcyd$58!~Z5{%X>atH1;%weqh|6o6d%;XoT>9yI1UUnLiRpdS-hRZ+&gfIqqUn-V>T zSwUd~hP;S5i6v}HfNCnSm`N2_VGut}9tZ7parXnE2y`wugFw~!X*LVD&xs5N>>%sj z2xgT*EjNx$ZEnwL6*iV!lvtid>_`YuSLD|0Y5o~g(q*1J5fbxOsR^`5LW zRf$%VRVR&FnZt^#g)N}87Ju|tV1O9ZNeH-c-ujlKP<&*Smq~Wydg8Qgom)0OyBVdTD1-V$uQxbu(OUG*FC#! zjHkDhHzBV5Q3~hBR{AmFA}9U_t%Vx$nig)gN`zVIwIE{f=BWiKz48zv8H5oWO_78l zL!j36qE%T^14mQzfpD%-EnaiGcImEuZV;M76T*B*AV-~S6)7vNgUT8tJbf1x9^#=n z)%uM9!-33+J&y^M*x-S`EiVk)*nZ=(8zB<(3>nI!Txz>SK5XFqK62{3M@&THr=C7u z&MW7Y&#SvHBErPeUbr_vOCj25qG_z_tlnPjZB3dcRAH$+8)Rk6oZVmudSX+EFT=95 zy5z`*?!c-A#M}b^MY`j{r(r=Y1mEXxy2D`{n_w3UsC7GO5$o8ntn`#Rk zg(kUt8PKWT%c?fTjk(VVc@|htz^6IEi(AT17NMRQEz71h03!-_dI@2yL%XJO?uzo> zy9fliSI-Dq8kwr$iUw;seAOo)4`6R!Zi0p8Y47BlQVy(#>*C9&GkJGsun_gpi&%gq z6|*vrDWB(II#%!Gbz{Y95&&N3`IyBmt4L^Gw4kli0_IY_xZIeJ)yaeHTTrK#C(#&h z6TON+9!G6j(kI3eKOkM~Ky|%yDL3tY3Djx;uFnAx7vX(!1}}4Gz1)aZ^YK!Xz4~$& zkb-iy`D9Y8>A}GkI5;_;W#lY3S*debGz#qJ<+@Cd5Q>cvjHYYKQ;a^u0A;Rg8LkPz zWU`-6ERL|xu@a-6K2^x^*Bpp-&`?giYxAC*jbFAJqxKTng1pgE-dAx1Uu?h7_s?um zLDXw6X&jCsyb2N@CJ!_e8;h1JFHSoxp|FFdo3oSaj52wD@@z2xyas~}UIw(njGW?E zy(N5M6Rx>R){!&I=dj4H4>5~7K8*UJBrCoKMm|%f0cO_}eD{ZL zzeoiTdsowTAn&5>u0qT;!qQ@z@zNQ$6uY2DjXoEg=hKY>==Wm&tQ8&h*f?^)wElr? zDZ6N5Ag)_qZO_@=0L?jO_sdF`CLZ3RjG~y{OD`^S-;3*s`%yN?S=GZYi;bTu>B)@d zouLcmt;Z!XzSQ)nsgCGW4p~M`j>}zgru&LzU;W@Mkef^Q8e!!8M);7#AphH~bN{{S zeyZy^E&Vc@D^gisT+V-eD_N=F7?PQsrlxz`Ngq@_cs2;4!cE1mBM#4m7qB$JapbxEm?E z{pWTa#FwW@DFj1@(;V+6uIArx!vx$rW9dN$J=KMC~z5A;X!Nu1P?(AdrFo#kk#6hUC z(+WcrmnAO!FYuSUo`R2$zf|k>acscuScRMbrK-KFSWe)YUBeZW#~e^^;f#-m@x<(W zSMaf-2(R8ZfC&*o6ngUHLGCj+qv4H~Y(^k;y9yYH(w~w1f!>wi(tOSbBM)tWfis-iERn?&Nk{YV) zPWNy5LGg@<7}_nUM;2~Gn=~G|-YkiI49;&lcX&+h0AidF$zK2``5|okaO1NfXS~tX zmoJzLi0G$}z+wmm-IGD6PmwvJ2p@dty`J53kS6gJ>z?jSD;KxyzJ1=+KLthy@q3u) zxj|_ahRrsvwr57TK~>5h*$~6$G}YGw6~CvgmAirbE@!K&w`ns0S4}Q-cs*7xIEMt(D5}^jBiNtAB`$@V&-@C3E18^KTKgNR* z|18%ld!ak^OF?fCQ3gMDokC?od?1|Liuu8DUEN!&roqI1ESNB(ps!DY(b6y_#Ul%K z0ac&%0mBOTw;%AEbJG=#Sf0X&1jg+r_v8r2NPL>efRg3tII066;%Jwb`YHyVwr`B& zvCpn1PU1dx-CtkIIZd}4Q{V!_YP~s%>zjgLGs6RU$h7N3&Q_DMx7zI5-4KF}eGC`i z6r!heJG%MM0(9EaGhg;cis|7O4Qhejn?r#k6Z7GzD4f2V3XZa0+&-0O1d8uhY>nw- z_Bztpv^QC`H;c~O6tsdH{M2upyaZ=GRBS~bMmK|<@lLA@uPNGoHM}c+Rl8DxAW~`j zF%B%dqDkE&$h1JQtu&Ma$|k`YTX0^xL)tobN$gUxJ4F-eiKA}6#ez=0kH`3@J2ccT zR24B8+7ik^`A?(T$MDl*PtU(DWSqx*Emq2Zcl-Qn9-$Eb5%}Hv^9l4x1U}_I6}kUo zsq6V45Ee#E`A?xE?ti;8bh4`+FWs{?P^i8WTZG z`R_>f-_V-MA87Uw`gct5Z^&Ka4@413Oz|hG@_4{AMuULx^lt`%4hoE9qWJGap#LDX z(CA2-|KID@L;{e0nn8ymrIB!*pia(=P_8IeBz)&bNdb*e5le@f7V?|=Kg#G~aR2}S delta 24156 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 f == 5), ShowBtnTruncate = dto.GenTable.Options.CheckedBtn.Any(f => f == 6), ShowBtnMultiDel = dto.GenTable.Options.CheckedBtn.Any(f => f == 7), + ViewFileName = dto.GenTable.BusinessName.FirstUpperCase() }; var columns = dto.GenTable.Columns; @@ -67,7 +68,7 @@ namespace ZR.CodeGenerator GenerateControllers(replaceDto, dto); if (dto.VueVersion == 3) { - GenerateVue3Views(dto); + GenerateVue3Views(replaceDto, dto); } else { @@ -182,7 +183,7 @@ namespace ZR.CodeGenerator replaceDto.VueViewFormHtml = GenerateCurdForm(); var tpl = JnHelper.ReadTemplate(CodeTemplateDir, fileName); - var fullPath = Path.Combine(generateDto.VueParentPath, "src", "views", generateDto.GenTable.ModuleName.FirstLowerCase(), $"{generateDto.GenTable.BusinessName.FirstUpperCase()}.vue"); + var fullPath = Path.Combine(generateDto.VueParentPath, "src", "views", generateDto.GenTable.ModuleName.FirstLowerCase(), $"{replaceDto.ViewFileName}.vue"); generateDto.GenCodes.Add(new GenCode(6, "index.vue", fullPath, tpl.Render())); } @@ -191,7 +192,7 @@ namespace ZR.CodeGenerator /// vue3 /// /// - private static void GenerateVue3Views(GenerateDto generateDto) + private static void GenerateVue3Views(ReplaceDto replaceDto, GenerateDto generateDto) { string fileName = generateDto.GenTable.TplCategory switch { @@ -206,7 +207,7 @@ namespace ZR.CodeGenerator tpl.Set("options", generateDto.GenTable?.Options); var result = tpl.Render(); - var fullPath = Path.Combine(generateDto.VueParentPath, "src", "views", generateDto.GenTable.ModuleName.FirstLowerCase(), $"{generateDto.GenTable.BusinessName.FirstUpperCase()}.vue"); + var fullPath = Path.Combine(generateDto.VueParentPath, "src", "views", generateDto.GenTable.ModuleName.FirstLowerCase(), $"{replaceDto.ViewFileName}.vue"); generateDto.GenCodes.Add(new GenCode(16, "index.vue", fullPath, result)); } @@ -240,21 +241,13 @@ namespace ZR.CodeGenerator /// public static void GenerateSql(GenerateDto generateDto) { - var tempName = ""; - switch (generateDto.DbType) + string tempName = generateDto.DbType switch { - case 0: - tempName = "MySqlTemplate"; - break; - case 1: - tempName = "SqlTemplate"; - break; - case 4: - tempName = "PgSql"; - break; - default: - break; - } + 0 => "MySqlTemplate", + 1 => "SqlTemplate", + 4 => "PgSql", + _ => "Other", + }; var tpl = JnHelper.ReadTemplate(CodeTemplateDir, Path.Combine("sql", $"{tempName}.txt")); tpl.Set("parentId", generateDto.GenTable?.Options?.ParentMenuId ?? 0); var result = tpl.Render(); @@ -315,18 +308,8 @@ namespace ZR.CodeGenerator } } } - return tableName.UnderScoreToCamelCase(); - } - - /// - /// 获取前端标签名 - /// - /// - /// - /// - public static string GetLabelName(string columnDescription, string columnName) - { - return string.IsNullOrEmpty(columnDescription) ? columnName : columnDescription; + //return tableName.UnderScoreToCamelCase(); + return tableName.ConvertToPascal("_"); } /// @@ -343,7 +326,7 @@ namespace ZR.CodeGenerator catch (Exception ex) { Console.WriteLine(ex.Message); - return ""; + return str; } } @@ -357,8 +340,8 @@ namespace ZR.CodeGenerator sDatatype = sDatatype.ToLower(); string sTempDatatype = sDatatype switch { - "int" or "number" or "integer" or "smallint" or "int4" or "int8" or "int2" => "int", - "bigint" => "long", + "int" or "integer" or "smallint" or "int4" or "int8" or "int2" => "int", + "bigint" or "number" => "long", "tinyint" => "byte", "numeric" or "real" or "float" => "float", "decimal" or "numer(8,2)" or "numeric" => "decimal", @@ -389,8 +372,8 @@ namespace ZR.CodeGenerator DbName = dbName, BaseNameSpace = "ZR.",//导入默认命名空间前缀 ModuleName = "business",//导入默认模块名 - ClassName = GetClassName(tableName).FirstUpperCase(), - BusinessName = tableName.UnderScoreToCamelCase().FirstUpperCase(), + ClassName = GetClassName(tableName), + BusinessName = GetClassName(tableName), FunctionAuthor = AppSettings.GetConfig(GenConstants.Gen_author), TableName = tableName, TableComment = desc, @@ -412,12 +395,13 @@ namespace ZR.CodeGenerator /// /// /// - public static List InitGenTableColumn(GenTable genTable, List dbColumnInfos) + /// + public static List InitGenTableColumn(GenTable genTable, List dbColumnInfos, List seqs = null) { List genTableColumns = new(); foreach (var column in dbColumnInfos) { - genTableColumns.Add(InitColumnField(genTable, column)); + genTableColumns.Add(InitColumnField(genTable, column, seqs)); } return genTableColumns; } @@ -428,17 +412,26 @@ namespace ZR.CodeGenerator /// /// /// - private static GenTableColumn InitColumnField(GenTable genTable, DbColumnInfo column) + private static GenTableColumn InitColumnField(GenTable genTable, DbColumnInfo column, List seqs) { + var dbType = AppSettings.Get(GenConstants.Gen_conn_dbType); + var dataType = column.DataType; + if (dbType == 3) + { + dataType = column.OracleDataType; + var seqName = $"SEQ_{genTable.TableName}_{column.DbColumnName}"; + var isIdentity = seqs.Any(f => seqName.Equals(f.SEQUENCE_NAME, StringComparison.CurrentCultureIgnoreCase)); + column.IsIdentity = isIdentity; + } GenTableColumn genTableColumn = new() { ColumnName = column.DbColumnName.FirstLowerCase(), ColumnComment = column.ColumnDescription, IsPk = column.IsPrimarykey, - ColumnType = column.DataType, + ColumnType = dataType, TableId = genTable.TableId, TableName = genTable.TableName, - CsharpType = GetCSharpDatatype(column.DataType), + CsharpType = GetCSharpDatatype(dataType), CsharpField = column.DbColumnName.ConvertToPascal("_"), IsRequired = !column.IsNullable, IsIncrement = column.IsIdentity, diff --git a/ZR.CodeGenerator/GenConstants.cs b/ZR.CodeGenerator/GenConstants.cs index 057cc2f..c2563aa 100644 --- a/ZR.CodeGenerator/GenConstants.cs +++ b/ZR.CodeGenerator/GenConstants.cs @@ -15,7 +15,7 @@ namespace ZR.CodeGenerator /// /// InputDto输入实体是不包含字段 /// - public static readonly string[] inputDtoNoField = new string[] { "createTime", "updateTime", "addtime", "create_time", "update_time" }; + public static readonly string[] inputDtoNoField = new string[] { "createTime", "updateTime", "addtime", "create_time", "update_time", "create_by", "update_by" }; /// /// 图片字段 /// @@ -27,7 +27,7 @@ namespace ZR.CodeGenerator /// /// 单选按钮字段 /// - public static readonly string[] radioFiled = new string[] { "status", "state", "is"}; + public static readonly string[] radioFiled = new string[] { "status", "state", "is" }; /// diff --git a/ZR.CodeGenerator/Model/OracleSeq.cs b/ZR.CodeGenerator/Model/OracleSeq.cs new file mode 100644 index 0000000..6a56a30 --- /dev/null +++ b/ZR.CodeGenerator/Model/OracleSeq.cs @@ -0,0 +1,11 @@ +namespace ZR.CodeGenerator.Model +{ + /// + /// Oracle库序列 + /// + public class OracleSeq + { + public string SEQUENCE_NAME { get; set; } + public long LAST_NUMBER { get; set; } + } +} diff --git a/ZR.CodeGenerator/Model/ReplaceDto.cs b/ZR.CodeGenerator/Model/ReplaceDto.cs index 325fd48..6ea178f 100644 --- a/ZR.CodeGenerator/Model/ReplaceDto.cs +++ b/ZR.CodeGenerator/Model/ReplaceDto.cs @@ -65,5 +65,9 @@ namespace ZR.CodeGenerator.Model /// 是否有编辑器 /// public int ShowEditor { get; set; } + /// + /// vue页面文件名 + /// + public string ViewFileName { get; set; } } } diff --git a/ZR.CodeGenerator/Service/CodeGeneraterService.cs b/ZR.CodeGenerator/Service/CodeGeneraterService.cs index 95f44c6..bbe2557 100644 --- a/ZR.CodeGenerator/Service/CodeGeneraterService.cs +++ b/ZR.CodeGenerator/Service/CodeGeneraterService.cs @@ -2,6 +2,7 @@ using SqlSugar; using System.Collections.Generic; using System.Linq; +using ZR.CodeGenerator.Model; using ZR.Model; namespace ZR.CodeGenerator.Service @@ -72,5 +73,18 @@ namespace ZR.CodeGenerator.Service { return GetSugarDbContext(dbName).DbMaintenance.GetColumnInfosByTableName(tableName, true); } + + /// + /// 获取Oracle所有序列 + /// + /// + /// + public List GetAllOracleSeqs(string dbName) + { + string sql = "SELECT * FROM USER_SEQUENCES"; + var seqs = GetSugarDbContext(dbName).Ado.SqlQuery(sql); + + return seqs.ToList(); + } } } diff --git a/ZR.CodeGenerator/ZR.CodeGenerator.csproj b/ZR.CodeGenerator/ZR.CodeGenerator.csproj index 71788a3..a1a2040 100644 --- a/ZR.CodeGenerator/ZR.CodeGenerator.csproj +++ b/ZR.CodeGenerator/ZR.CodeGenerator.csproj @@ -12,6 +12,6 @@ - + diff --git a/ZR.Model/System/Article.cs b/ZR.Model/System/Article.cs index 558deb0..52854ae 100644 --- a/ZR.Model/System/Article.cs +++ b/ZR.Model/System/Article.cs @@ -33,7 +33,7 @@ namespace ZR.Model.System /// /// 文章内容 /// - [SugarColumn(ColumnDescription = "文章内容", ColumnDataType = "text")] + [SugarColumn(ColumnDescription = "文章内容", ColumnDataType = StaticConfig.CodeFirst_BigString)] public string Content { get; set; } /// /// 作者名 diff --git a/ZR.Model/System/SysBase.cs b/ZR.Model/System/SysBase.cs index 5618c83..b46ce8e 100644 --- a/ZR.Model/System/SysBase.cs +++ b/ZR.Model/System/SysBase.cs @@ -16,17 +16,26 @@ namespace ZR.Model.System [ExcelIgnore] public string Create_by { get; set; } + /// + /// 创建时间 + /// [SugarColumn(IsOnlyIgnoreUpdate = true, IsNullable = true)] [JsonProperty(propertyName: "CreateTime")] [ExcelColumn(Format = "yyyy-MM-dd HH:mm:ss")] public DateTime Create_time { get; set; } = DateTime.Now; + /// + /// 更新人 + /// [JsonIgnore] [JsonProperty(propertyName: "UpdateBy")] [SugarColumn(IsOnlyIgnoreInsert = true, Length = 64, IsNullable = true)] [ExcelIgnore] public string Update_by { get; set; } + /// + /// 更新时间 + /// //[JsonIgnore] [SugarColumn(IsOnlyIgnoreInsert = true, IsNullable = true)] [JsonProperty(propertyName: "UpdateTime")] diff --git a/ZR.Model/System/SysNotice.cs b/ZR.Model/System/SysNotice.cs index de82a33..ff00e34 100644 --- a/ZR.Model/System/SysNotice.cs +++ b/ZR.Model/System/SysNotice.cs @@ -30,7 +30,7 @@ namespace ZR.Model.System /// /// 公告内容 /// - [SugarColumn(ColumnName = "notice_content", ColumnDataType = "text")] + [SugarColumn(ColumnName = "notice_content", ColumnDataType = StaticConfig.CodeFirst_BigString)] public string NoticeContent { get; set; } /// /// 公告状态 (0正常 1关闭) diff --git a/ZR.Model/System/SysOperLog.cs b/ZR.Model/System/SysOperLog.cs index 3e33e21..3eed289 100644 --- a/ZR.Model/System/SysOperLog.cs +++ b/ZR.Model/System/SysOperLog.cs @@ -72,13 +72,13 @@ namespace ZR.Model.System /// /// 请求参数 /// - [SugarColumn(Length = 2000)] + [SugarColumn(Length = 4000)] public string OperParam { get; set; } /// /// 返回参数 /// - [SugarColumn(ColumnDataType = "text")] + [SugarColumn(ColumnDataType = StaticConfig.CodeFirst_BigString)] public string JsonResult { get; set; } /// diff --git a/ZR.Model/System/SysRoleMenu.cs b/ZR.Model/System/SysRoleMenu.cs index 94a6fa6..9a037a4 100644 --- a/ZR.Model/System/SysRoleMenu.cs +++ b/ZR.Model/System/SysRoleMenu.cs @@ -1,6 +1,5 @@ using Newtonsoft.Json; using SqlSugar; -using System; namespace ZR.Model.System { diff --git a/ZR.Model/ZR.Model.csproj b/ZR.Model/ZR.Model.csproj index 848f750..7efcd39 100644 --- a/ZR.Model/ZR.Model.csproj +++ b/ZR.Model/ZR.Model.csproj @@ -9,7 +9,7 @@ - + diff --git a/ZR.Repository/ZR.Repository.csproj b/ZR.Repository/ZR.Repository.csproj index b100ff4..22ea936 100644 --- a/ZR.Repository/ZR.Repository.csproj +++ b/ZR.Repository/ZR.Repository.csproj @@ -15,6 +15,6 @@ - + diff --git a/ZR.Service/System/SeedDataService.cs b/ZR.Service/System/SeedDataService.cs index ddb858a..62bd9a4 100644 --- a/ZR.Service/System/SeedDataService.cs +++ b/ZR.Service/System/SeedDataService.cs @@ -49,14 +49,12 @@ namespace ZR.Service.System public (string, object, object) InitMenuData(List data) { var db = DbScoped.SugarScope; - db.Ado.BeginTran(); var x = db.Storageable(data) .SplitInsert(it => it.NotAny()) .WhereColumns(it => it.MenuId)//如果不是主键可以这样实现(多字段it=>new{it.x1,it.x2}) .ToStorage(); var result = x.AsInsertable.OffIdentity().ExecuteCommand();//插入可插入部分; - db.Ado.CommitTran(); - + string msg = $"[菜单数据] 插入{x.InsertList.Count} 错误数据{x.ErrorList.Count} 总共{x.TotalList.Count}"; return (msg, x.ErrorList, x.IgnoreList); } @@ -89,7 +87,7 @@ namespace ZR.Service.System .SplitInsert(it => it.NotAny()) .WhereColumns(it => it.DeptId) .ToStorage(); - var result = x.AsInsertable.ExecuteCommand(); + var result = x.AsInsertable.OffIdentity().ExecuteCommand(); string msg = $"[部门数据] 插入{x.InsertList.Count} 错误数据{x.ErrorList.Count} 总共{x.TotalList.Count}"; return (msg, x.ErrorList, x.IgnoreList); diff --git a/ZR.Service/System/SysMenuService.cs b/ZR.Service/System/SysMenuService.cs index 1a267d5..cb989f6 100644 --- a/ZR.Service/System/SysMenuService.cs +++ b/ZR.Service/System/SysMenuService.cs @@ -660,8 +660,10 @@ namespace ZR.Service //Insert(menuList); var x = Storageable(menuList) - .WhereColumns(it => new { it.MenuName, it.ParentId }) - .ToStorage(); + .SplitInsert(it => !it.Any()) + .SplitUpdate(it => !it.Any()) + .WhereColumns(it => new { it.MenuName, it.ParentId }) + .ToStorage(); x.AsInsertable.ExecuteCommand();//插入可插入部分; x.AsUpdateable.ExecuteCommand(); } diff --git a/document/oracle/seq.txt b/document/oracle/seq.txt new file mode 100644 index 0000000..c8d5468 --- /dev/null +++ b/document/oracle/seq.txt @@ -0,0 +1,46 @@ + +--通用序列id +create sequence SEQ_ID +minvalue 1 +maxvalue 99999999 +start with 1 +increment by 1 +nocache +order; + +--角色表序列id +create sequence SEQ_SYS_ROLE_ROLEID +minvalue 10 +maxvalue 99999999 +start with 10 +increment by 1 +nocache +order; + +--菜单表序列id +create sequence SEQ_SYS_MENU_MENUID +minvalue 2000 +maxvalue 99999999 +start with 2000 +increment by 1 +nocache +order; + +--用户表序列id +create sequence SEQ_SYS_USER_USERID +minvalue 100 +maxvalue 99999999 +start with 1 +increment by 100 +nocache +order; + +--部门表序列id +create sequence SEQ_SYS_DEPT_DEPTID +minvalue 200 +maxvalue 99999999 +start with 200 +increment by 1 +nocache +order; + From 0e043c571651c7bedd8f413657903543274ba91a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com> Date: Fri, 16 Jun 2023 19:35:34 +0800 Subject: [PATCH 23/27] =?UTF-8?q?:bug:=20fix=E4=BB=A3=E7=A0=81=E7=94=9F?= =?UTF-8?q?=E6=88=90=E5=AF=BC=E5=85=A5=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ZR.Admin.WebApi/Controllers/System/CodeGeneratorController.cs | 4 ++-- ZR.Admin.WebApi/appsettings.json | 3 ++- ZR.CodeGenerator/CodeGeneratorTool.cs | 4 ++-- ZR.CodeGenerator/GenConstants.cs | 1 - 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ZR.Admin.WebApi/Controllers/System/CodeGeneratorController.cs b/ZR.Admin.WebApi/Controllers/System/CodeGeneratorController.cs index 8941c6a..dcfe5c7 100644 --- a/ZR.Admin.WebApi/Controllers/System/CodeGeneratorController.cs +++ b/ZR.Admin.WebApi/Controllers/System/CodeGeneratorController.cs @@ -153,7 +153,7 @@ namespace ZR.Admin.WebApi.Controllers { throw new CustomException("表不能为空"); } - var dbType = AppSettings.GetAppConfig(GenConstants.Gen_conn_dbType, 0); + var dbConfig = AppSettings.Get>("dbConfigs").FirstOrDefault(f => f.IsGenerateDb); string[] tableNames = tables.Split(',', StringSplitOptions.RemoveEmptyEntries); int result = 0; foreach (var tableName in tableNames) @@ -164,7 +164,7 @@ namespace ZR.Admin.WebApi.Controllers List seqs = new(); GenTable genTable = CodeGeneratorTool.InitTable(dbName, HttpContext.GetName(), tableName, tabInfo?.Description); genTable.TableId = GenTableService.ImportGenTable(genTable); - if (dbType == 3) + if (dbConfig.DbType == 3) { seqs = _CodeGeneraterService.GetAllOracleSeqs(dbName); } diff --git a/ZR.Admin.WebApi/appsettings.json b/ZR.Admin.WebApi/appsettings.json index 7c51eef..762a634 100644 --- a/ZR.Admin.WebApi/appsettings.json +++ b/ZR.Admin.WebApi/appsettings.json @@ -14,11 +14,12 @@ "IsAutoCloseConnection": true }, { + //代码生成连接字符串,注意{dbName}为固定格式,不要填写数据库名 "Conn": "Data Source=LAPTOP-STKF2M8H\\SQLEXPRESS;User ID=admin;Password=admin123;Initial Catalog={dbName};", "DbType": 1, "ConfigId": "0", "IsAutoCloseConnection": true, - "DbName": "ZrAdmin",//代码生成默认连接数据库 + "DbName": "ZrAdmin", //代码生成默认连接数据库 "IsGenerateDb": true //是否代码生成使用库,不要改动 } //...下面添加更多的数据库源 diff --git a/ZR.CodeGenerator/CodeGeneratorTool.cs b/ZR.CodeGenerator/CodeGeneratorTool.cs index d078fc6..26790b6 100644 --- a/ZR.CodeGenerator/CodeGeneratorTool.cs +++ b/ZR.CodeGenerator/CodeGeneratorTool.cs @@ -414,9 +414,9 @@ namespace ZR.CodeGenerator /// private static GenTableColumn InitColumnField(GenTable genTable, DbColumnInfo column, List seqs) { - var dbType = AppSettings.Get(GenConstants.Gen_conn_dbType); + var dbConfig = AppSettings.Get>("dbConfigs").FirstOrDefault(f => f.IsGenerateDb); var dataType = column.DataType; - if (dbType == 3) + if (dbConfig.DbType == 3) { dataType = column.OracleDataType; var seqName = $"SEQ_{genTable.TableName}_{column.DbColumnName}"; diff --git a/ZR.CodeGenerator/GenConstants.cs b/ZR.CodeGenerator/GenConstants.cs index c2563aa..fe5a8fc 100644 --- a/ZR.CodeGenerator/GenConstants.cs +++ b/ZR.CodeGenerator/GenConstants.cs @@ -7,7 +7,6 @@ namespace ZR.CodeGenerator /// public class GenConstants { - public static string Gen_conn_dbType = "gen:dbType"; public static string Gen_author = "gen:author"; public static string Gen_autoPre = "gen:autoPre"; public static string Gen_tablePrefix = "gen:tablePrefix"; From 9d87d75a092df7feda245e1f16ed43c4f09be88f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com> Date: Sat, 17 Jun 2023 09:45:45 +0800 Subject: [PATCH 24/27] =?UTF-8?q?:sparkles:=20=E8=A7=92=E8=89=B2=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=96=B0=E5=A2=9E=E5=AF=BC=E5=87=BA=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E8=8F=9C=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/System/SysRoleController.cs | 28 +++++++++++++++- ZR.Model/System/Dto/MenuDto.cs | 11 ++++++- ZR.Model/System/Dto/RoleMenuExportDto.cs | 30 +++++++++++++++++ ZR.Model/System/Enums/MenuStatus.cs | 15 +++++++++ ZR.Model/System/Enums/MenuType.cs | 19 +++++++++++ ZR.Service/System/IService/ISysMenuService.cs | 2 ++ ZR.Service/System/SysMenuService.cs | 33 ++++++++++++++++++- 7 files changed, 135 insertions(+), 3 deletions(-) create mode 100644 ZR.Model/System/Dto/RoleMenuExportDto.cs create mode 100644 ZR.Model/System/Enums/MenuStatus.cs create mode 100644 ZR.Model/System/Enums/MenuType.cs diff --git a/ZR.Admin.WebApi/Controllers/System/SysRoleController.cs b/ZR.Admin.WebApi/Controllers/System/SysRoleController.cs index 37b5276..10b89d9 100644 --- a/ZR.Admin.WebApi/Controllers/System/SysRoleController.cs +++ b/ZR.Admin.WebApi/Controllers/System/SysRoleController.cs @@ -11,6 +11,11 @@ using ZR.Service.System.IService; using ZR.Admin.WebApi.Extensions; using ZR.Model.System.Dto; using Mapster; +using ZR.Service; +using Microsoft.AspNetCore.Authorization; +using Aliyun.OSS; +using MiniExcelLibs.OpenXml; +using MiniExcelLibs; namespace ZR.Admin.WebApi.Controllers.System { @@ -22,11 +27,14 @@ namespace ZR.Admin.WebApi.Controllers.System public class SysRoleController : BaseController { private readonly ISysRoleService sysRoleService; + private readonly ISysMenuService sysMenuService; public SysRoleController( - ISysRoleService sysRoleService) + ISysRoleService sysRoleService, + ISysMenuService sysMenuService) { this.sysRoleService = sysRoleService; + this.sysMenuService = sysMenuService; } /// @@ -179,5 +187,23 @@ namespace ZR.Admin.WebApi.Controllers.System string sFileName = ExportExcel(list, "sysrole", "角色"); return SUCCESS(new { path = "/export/" + sFileName, fileName = sFileName }); } + + /// + /// 导出角色菜单 + /// + /// + /// + [Log(BusinessType = BusinessType.EXPORT, IsSaveResponseData = false, Title = "角色菜单导出")] + [HttpGet("exportRoleMenu")] + [AllowAnonymous] + public IActionResult ExportRoleMenu(int roleId) + { + MenuQueryDto dto = new() { Status = "0", MenuTypeIds = "M,C,F" }; + + var list = sysMenuService.SelectRoleMenuListByRole(dto, roleId); + + var result = ExportExcelMini(list, roleId.ToString(), "角色菜单"); + return ExportExcel(result.Item2, result.Item1); + } } } diff --git a/ZR.Model/System/Dto/MenuDto.cs b/ZR.Model/System/Dto/MenuDto.cs index 5c21422..32ffaed 100644 --- a/ZR.Model/System/Dto/MenuDto.cs +++ b/ZR.Model/System/Dto/MenuDto.cs @@ -1,4 +1,6 @@ -using System; +using MiniExcelLibs.Attributes; +using System; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; namespace ZR.Model.System.Dto @@ -7,7 +9,9 @@ namespace ZR.Model.System.Dto { //{"parentId":0,"menuName":"aaa","icon":"documentation","menuType":"M","orderNum":999,"visible":0,"status":0,"path":"aaa"} [Required(ErrorMessage = "菜单id不能为空")] + [ExcelColumn(Name = "菜单id")] public int MenuId { get; set; } + [ExcelColumn(Name = "菜单名")] public string MenuName { get; set; } /// /// 父菜单ID @@ -22,17 +26,20 @@ namespace ZR.Model.System.Dto /// /// 路由地址 /// + [ExcelColumn(Name = "路由地址")] public string Path { get; set; } = "#"; /// /// 组件路径 /// + [ExcelColumn(Name = "组件地址")] public string Component { get; set; } /// /// 是否缓存(1缓存 0不缓存) /// [Required(ErrorMessage = "是否缓存不能为空")] + [ExcelColumn(Name = "是否缓存")] public int IsCache { get; set; } /// /// 是否外链 1、是 0、否 @@ -60,6 +67,7 @@ namespace ZR.Model.System.Dto /// /// 权限字符串 /// + [ExcelColumn(Name = "权限字符串")] public string Perms { get; set; } /// @@ -70,6 +78,7 @@ namespace ZR.Model.System.Dto /// 翻译key /// public string MenuNameKey { get; set; } + public List Children { get; set; } = new List(); } public class MenuQueryDto diff --git a/ZR.Model/System/Dto/RoleMenuExportDto.cs b/ZR.Model/System/Dto/RoleMenuExportDto.cs new file mode 100644 index 0000000..9145137 --- /dev/null +++ b/ZR.Model/System/Dto/RoleMenuExportDto.cs @@ -0,0 +1,30 @@ +using MiniExcelLibs.Attributes; +using SqlSugar.DbConvert; +using ZR.Model.System.Enums; + +namespace ZR.Model.System.Dto +{ + public class RoleMenuExportDto + { + /// + /// 一级目录名 + /// + [ExcelColumn(Name = "菜单", Width = 50)] + public string MenuName { get; set; } + //[ExcelColumn(Name = "菜单名", Width = 20)] + //public string MenuName1 { get; set; } + //[ExcelColumn(Name = "权限按钮", Width = 20)] + //public string MenuName2 { get; set; } + [ExcelColumn(Name = "路径", Width = 20)] + public string Path { get; set; } + [ExcelColumn(Name = "组件名", Width = 20)] + public string Component { get; set; } + [ExcelColumn(Name = "权限字符", Width = 20)] + public string Perms { get; set; } + //[ExcelColumn(Name = "菜单类型")] + //[SqlSugar.SugarColumn(SqlParameterDbType = typeof(EnumToStringConvert))] + //public MenuType MenuType { get; set; } + //[ExcelColumn(Name = "菜单状态")] + //public MenuStatus Status { get; set; } + } +} diff --git a/ZR.Model/System/Enums/MenuStatus.cs b/ZR.Model/System/Enums/MenuStatus.cs new file mode 100644 index 0000000..b648ca1 --- /dev/null +++ b/ZR.Model/System/Enums/MenuStatus.cs @@ -0,0 +1,15 @@ +using System.ComponentModel; + +namespace ZR.Model.System.Enums +{ + /// + /// 菜单状态(0正常 1停用) + /// + public enum MenuStatus + { + [Description("正常")] + 正常 = 0, + [Description("停用")] + 停用 = 1, + } +} diff --git a/ZR.Model/System/Enums/MenuType.cs b/ZR.Model/System/Enums/MenuType.cs new file mode 100644 index 0000000..4325223 --- /dev/null +++ b/ZR.Model/System/Enums/MenuType.cs @@ -0,0 +1,19 @@ +using System.ComponentModel; + +namespace ZR.Model.System.Enums +{ + /// + /// M目录 C菜单 F按钮 L链接 + /// + public enum MenuType + { + [Description("目录")] + M, + [Description("菜单")] + C, + [Description("按钮")] + F, + [Description("链接")] + L + } +} diff --git a/ZR.Service/System/IService/ISysMenuService.cs b/ZR.Service/System/IService/ISysMenuService.cs index 78f8a36..29bd021 100644 --- a/ZR.Service/System/IService/ISysMenuService.cs +++ b/ZR.Service/System/IService/ISysMenuService.cs @@ -40,6 +40,8 @@ namespace ZR.Service.System.IService List BuildMenuTreeSelect(List menus); void AddSysMenu(GenTable genTableInfo, string permPrefix, bool showEdit, bool showExport); + List SelectTreeMenuListByRoles(MenuQueryDto menu, List roles); + List SelectRoleMenuListByRole(MenuQueryDto menu, int roleId); } /// diff --git a/ZR.Service/System/SysMenuService.cs b/ZR.Service/System/SysMenuService.cs index cb989f6..045046b 100644 --- a/ZR.Service/System/SysMenuService.cs +++ b/ZR.Service/System/SysMenuService.cs @@ -1,5 +1,6 @@ using Infrastructure.Attribute; using Infrastructure.Extensions; +using JinianNet.JNTemplate.Dynamic; using SqlSugar; using System; using System.Collections.Generic; @@ -7,6 +8,7 @@ using System.Linq; using ZR.Common; using ZR.Model.System; using ZR.Model.System.Dto; +using ZR.Model.System.Enums; using ZR.Model.System.Generate; using ZR.Model.System.Vo; using ZR.Service.System.IService; @@ -220,7 +222,7 @@ namespace ZR.Service /// /// 用户角色集合 /// - private List SelectTreeMenuListByRoles(MenuQueryDto menu, List roles) + public List SelectTreeMenuListByRoles(MenuQueryDto menu, List roles) { var roleMenus = Context.Queryable() .Where(r => roles.Contains(r.Role_id)) @@ -237,6 +239,35 @@ namespace ZR.Service .ToTree(it => it.Children, it => it.ParentId, 0); } + /// + /// 根据用户查询系统菜单列表 + /// + /// + /// 用户角色 + /// + public List SelectRoleMenuListByRole(MenuQueryDto menu, int roleId) + { + var menuIds = Context.Queryable() + .Where(r => r.Role_id == roleId) + .Select(f => f.Menu_id).Distinct().ToList(); + + return Context.Queryable() + .InnerJoin((t1, t2) => t1.MenuId == t2.ParentId) + .InnerJoin((t1, t2, t3) => t2.MenuId == t3.ParentId) + .Where((t1, t2, t3) => menuIds.Contains(t1.MenuId)) + .Select((t1, t2, t3) => new RoleMenuExportDto() + { + MenuName = $"{t1.MenuName}->{t2.MenuName}->{t3.MenuName}", + //MenuName1 = t2.MenuName, + //MenuName2 = t3.MenuName, + Path = t2.Path, + Component = t2.Component, + Perms = t3.Perms, + //MenuType = (MenuType)Enum.Parse(typeof(MenuType), t3.MenuType) //(MenuType)t3.MenuType, + //Status = t3.Status + }).ToList(); + } + /// /// 获取所有菜单 /// From f577f3b0d8709dd2f7364f78536a4f32bb6b8cde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com> Date: Sat, 17 Jun 2023 09:49:18 +0800 Subject: [PATCH 25/27] =?UTF-8?q?:zap:=20=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E5=AD=97=E5=85=B8=E7=B1=BB=E5=9E=8B=E5=8F=AF=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E5=B7=B2=E6=B7=BB=E5=8A=A0=E5=AD=97=E5=85=B8=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/System/SysDictDataController.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/ZR.Admin.WebApi/Controllers/System/SysDictDataController.cs b/ZR.Admin.WebApi/Controllers/System/SysDictDataController.cs index 2631348..a3cab52 100644 --- a/ZR.Admin.WebApi/Controllers/System/SysDictDataController.cs +++ b/ZR.Admin.WebApi/Controllers/System/SysDictDataController.cs @@ -38,6 +38,14 @@ namespace ZR.Admin.WebApi.Controllers.System public IActionResult List([FromQuery] SysDictData dictData, [FromQuery] PagerInfo pagerInfo) { var list = SysDictDataService.SelectDictDataList(dictData, pagerInfo); + + if (dictData.DictType.StartsWith("sql_")) + { + var result = SysDictService.SelectDictDataByCustomSql(dictData.DictType); + + list.Result.AddRange(result); + list.TotalNum += result.Count; + } return SUCCESS(list); } @@ -75,7 +83,7 @@ namespace ZR.Admin.WebApi.Controllers.System }; if (dic.DictType.StartsWith("cus_") || dic.DictType.StartsWith("sql_")) { - vo.List = SysDictService.SelectDictDataByCustomSql(dic.DictType); + vo.List.AddRange(SysDictService.SelectDictDataByCustomSql(dic.DictType)); } dataVos.Add(vo); } From 6f83db2952f1d32cb5b285b85121fa3dd648189e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com> Date: Sat, 17 Jun 2023 16:01:22 +0800 Subject: [PATCH 26/27] =?UTF-8?q?:zap:=20=E4=BC=98=E5=8C=96=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E6=90=9C=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ZR.Service/System/SysMenuService.cs | 34 +++++++++++++---------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/ZR.Service/System/SysMenuService.cs b/ZR.Service/System/SysMenuService.cs index 045046b..7db43f3 100644 --- a/ZR.Service/System/SysMenuService.cs +++ b/ZR.Service/System/SysMenuService.cs @@ -1,6 +1,5 @@ using Infrastructure.Attribute; using Infrastructure.Extensions; -using JinianNet.JNTemplate.Dynamic; using SqlSugar; using System; using System.Collections.Generic; @@ -34,17 +33,11 @@ namespace ZR.Service /// public List SelectTreeMenuList(MenuQueryDto menu, long userId) { - List menuList; - //if (SysRoleService.IsAdmin(userId)) - //{ - // menuList = SelectTreeMenuList(menu); - //} - //else - //{ - // var userRoles = SysRoleService.SelectUserRoles(userId); - // menuList = SelectTreeMenuListByRoles(menu, userRoles); - //} - menuList = BuildMenuTree(SelectMenuList(menu, userId)); + if (menu.ParentId != null) + { + return GetMenusByMenuId(menu.ParentId.ParseToInt(), userId); + } + List menuList = BuildMenuTree(SelectMenuList(menu, userId)); return menuList; } @@ -274,14 +267,17 @@ namespace ZR.Service /// private List SelectMenuList(MenuQueryDto menu) { + var menuExp = Expressionable.Create(); + menuExp.AndIF(!string.IsNullOrEmpty(menu.MenuName), it => it.MenuName.Contains(menu.MenuName)); + menuExp.AndIF(!string.IsNullOrEmpty(menu.Visible), it => it.Visible == menu.Visible); + menuExp.AndIF(!string.IsNullOrEmpty(menu.Status), it => it.Status == menu.Status); + menuExp.AndIF(!string.IsNullOrEmpty(menu.MenuTypeIds), it => menu.MenuTypeIdArr.Contains(it.MenuType)); + menuExp.AndIF(menu.ParentId != null, it => it.ParentId == menu.ParentId); + return Queryable() - .WhereIF(!string.IsNullOrEmpty(menu.MenuName), it => it.MenuName.Contains(menu.MenuName)) - .WhereIF(!string.IsNullOrEmpty(menu.Visible), it => it.Visible == menu.Visible) - .WhereIF(!string.IsNullOrEmpty(menu.Status), it => it.Status == menu.Status) - .WhereIF(!string.IsNullOrEmpty(menu.MenuTypeIds), it => menu.MenuTypeIdArr.Contains(it.MenuType)) - .WhereIF(menu.ParentId != null, it => it.ParentId == menu.ParentId) - .OrderBy(it => new { it.ParentId, it.OrderNum }) - .ToList(); + .Where(menuExp.ToExpression()) + .OrderBy(it => new { it.ParentId, it.OrderNum }) + .ToList(); } /// From 301d27e5ef83c173fcbcf0bec26fab5a92872ca0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=87=E6=B0=B8=E8=BE=BE?= Date: Sat, 17 Jun 2023 22:24:59 +0800 Subject: [PATCH 27/27] =?UTF-8?q?=E5=89=8D=E7=AB=AFVue2=E5=BC=95=E5=85=A5j?= =?UTF-8?q?srsasign=E8=BF=9B=E8=A1=8CRSA=E5=8A=A0=E5=AF=86=EF=BC=8C?= =?UTF-8?q?=E7=99=BB=E5=BD=95Action=E5=A2=9E=E5=8A=A0RSA=E5=AF=86=E7=A0=81?= =?UTF-8?q?=E5=8A=A0=E5=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ZR.Vue/package.json | 1 + ZR.Vue/src/api/system/login.js | 22 +++++-- ZR.Vue/src/store/modules/user.js | 108 +++++++++++++++++-------------- ZR.Vue/src/utils/jsencrypt.js | 6 +- 4 files changed, 80 insertions(+), 57 deletions(-) diff --git a/ZR.Vue/package.json b/ZR.Vue/package.json index 87c3a41..8c356a7 100644 --- a/ZR.Vue/package.json +++ b/ZR.Vue/package.json @@ -34,6 +34,7 @@ "js-beautify": "1.10.2", "js-cookie": "2.2.0", "jsencrypt": "3.0.0-rc.1", + "jsrsasign": "^10.8.6", "less-loader": "^6.0.0", "mavon-editor": "^2.9.1", "normalize.css": "7.0.0", diff --git a/ZR.Vue/src/api/system/login.js b/ZR.Vue/src/api/system/login.js index cd56aa7..91ea419 100644 --- a/ZR.Vue/src/api/system/login.js +++ b/ZR.Vue/src/api/system/login.js @@ -6,7 +6,7 @@ export function login(username, password, code, uuid) { username, password, code, - uuid + uuid, } return request({ url: '/login', @@ -19,7 +19,7 @@ export function login(username, password, code, uuid) { export function getInfo() { return request({ url: '/getInfo', - method: 'get' + method: 'get', }) } @@ -27,7 +27,7 @@ export function getInfo() { export function logout() { return request({ url: '/LogOut', - method: 'POST' + method: 'POST', }) } @@ -35,18 +35,26 @@ export function logout() { export function getCodeImg() { return request({ url: '/captchaImage', - method: 'get' + method: 'get', }) } /** * 注册 - * @returns + * @returns */ export function register(data) { return request({ url: '/register', method: 'post', - data: data + data: data, }) -} \ No newline at end of file +} + +// 获取RSA公钥 +export function getRsaKey() { + return request({ + url: '/getRsaKey', + method: 'get', + }) +} diff --git a/ZR.Vue/src/store/modules/user.js b/ZR.Vue/src/store/modules/user.js index 8923977..5830b5a 100644 --- a/ZR.Vue/src/store/modules/user.js +++ b/ZR.Vue/src/store/modules/user.js @@ -1,6 +1,6 @@ -import { login, logout, getInfo } from '@/api/system/login' +import { login, logout, getInfo, getRsaKey } from '@/api/system/login' import { getToken, setToken, removeToken } from '@/utils/auth' - +import { encryptByPublicKey } from '@/api/utils/jsencrypt' const user = { state: { userInfo: '', @@ -8,7 +8,7 @@ const user = { name: '', avatar: '', roles: [], - permissions: [] + permissions: [], }, mutations: { @@ -29,29 +29,34 @@ const user = { }, SET_USERINFO: (state, value) => { state.userInfo = value - } + }, }, actions: { // 登录 Login({ commit }, userInfo) { - const username = userInfo.username.trim() - const password = userInfo.password - const code = userInfo.code - const uuid = userInfo.uuid return new Promise((resolve, reject) => { - login(username, password, code, uuid).then(res => { - if (res.code == 200) { - setToken(res.data) - //提交上面的mutaions方法 - commit('SET_TOKEN', res.data) - resolve() //then处理 - } else { - console.log('login error ' + res); - reject(res) //catch处理 - } - }).catch(err => { - reject(err); + getRsaKey().then((response) => { + const publicKey = response.data.publicKey + const username = userInfo.username.trim() + const password = encryptByPublicKey(userInfo.password, publicKey) + const code = userInfo.code + const uuid = userInfo.uuid + login(username, password, code, uuid) + .then((res) => { + if (res.code == 200) { + setToken(res.data) + //提交上面的mutaions方法 + commit('SET_TOKEN', res.data) + resolve() //then处理 + } else { + console.log('login error ' + res) + reject(res) //catch处理 + } + }) + .catch((err) => { + reject(err) + }) }) }) }, @@ -59,24 +64,27 @@ const user = { // 获取用户信息 GetInfo({ commit, state }) { return new Promise((resolve, reject) => { - getInfo().then(res => { - const data = res.data - const avatar = data.user.avatar == "" ? require("@/assets/image/profile.jpg") : data.user.avatar; + getInfo() + .then((res) => { + const data = res.data + const avatar = data.user.avatar == '' ? require('@/assets/image/profile.jpg') : data.user.avatar - if (data.roles && data.roles.length > 0) { // 验证返回的roles是否是一个非空数组 - commit('SET_ROLES', data.roles) - commit('SET_PERMISSIONS', data.permissions) - } else { - commit('SET_ROLES', ['ROLE_DEFAULT']) - } + if (data.roles && data.roles.length > 0) { + // 验证返回的roles是否是一个非空数组 + commit('SET_ROLES', data.roles) + commit('SET_PERMISSIONS', data.permissions) + } else { + commit('SET_ROLES', ['ROLE_DEFAULT']) + } - commit('SET_NAME', data.user.nickName) - commit('SET_AVATAR', avatar) - commit('SET_USERINFO', data.user) //新加 - resolve(res) - }).catch(error => { - reject(error) - }) + commit('SET_NAME', data.user.nickName) + commit('SET_AVATAR', avatar) + commit('SET_USERINFO', data.user) //新加 + resolve(res) + }) + .catch((error) => { + reject(error) + }) }) }, @@ -84,27 +92,29 @@ const user = { LogOut({ commit, state }) { console.log('退出登录') return new Promise((resolve, reject) => { - logout().then((res) => { - removeToken() // 必须先移除token - commit('SET_TOKEN', '') - commit('SET_ROLES', []) - commit('SET_PERMISSIONS', []) - resolve(res) - }).catch(error => { - reject(error) - }) + logout() + .then((res) => { + removeToken() // 必须先移除token + commit('SET_TOKEN', '') + commit('SET_ROLES', []) + commit('SET_PERMISSIONS', []) + resolve(res) + }) + .catch((error) => { + reject(error) + }) }) }, // 前端 登出 FedLogOut({ commit }) { - return new Promise(resolve => { + return new Promise((resolve) => { commit('SET_TOKEN', '') removeToken() resolve() }) - } - } + }, + }, } -export default user \ No newline at end of file +export default user diff --git a/ZR.Vue/src/utils/jsencrypt.js b/ZR.Vue/src/utils/jsencrypt.js index d8ce5cd..0181419 100644 --- a/ZR.Vue/src/utils/jsencrypt.js +++ b/ZR.Vue/src/utils/jsencrypt.js @@ -1,5 +1,5 @@ import JSEncrypt from 'jsencrypt/bin/jsencrypt.min' - +import jsrsasign from 'jsrsasign' // 密钥对生成 http://web.chacuo.net/netrsakeypair const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALj0zjON+EVdBsnMcR4Uj+jOYgp5ZipftQZ1utW8KvVioz+RSaotF1JHt59q9SC/mZcWWpbpcEqQ3WyyyCC33msCAwEAAQ==' @@ -21,3 +21,7 @@ export function decrypt(txt) { return encryptor.decrypt(txt) // 对数据进行解密 } +export const encryptByPublicKey = (txt, publicKey) => { + const pubKey = jsrsasign.KEYUTIL.getKey(publicKey) + return jsrsasign.KJUR.crypto.Cipher.encrypt(txt, pubKey) +}