.NET Core实战项目之CMS 第十五章 各层联动工作实现增删改查业务

连着两天更新叙述性的文章大家可别以为我转行了!哈哈!今天就继续讲讲我们的.NET Core实战项目之CMS系统的教程吧!这个系列教程拖得太久了,所以今天我就以菜单部分的增删改查为例来讲述下我的项目分层之间的协同工作吧!如果你觉得文中有任何不妥的地方还请留言或者加入DotNetCore实战千人交流群637326624跟大伙进行交流讨论吧!

本文已收录至《.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划》

作者:依乐祝

原文地址:https://www.cnblogs.com/yilezhu/p/10263714.html

写在前面

前面的章节中我们基本的增删改查都有了,甚至后台模板我们也找到并集成到了我们的CMS系统中了!那么剩下的就是对功能的开发了。对于功能的开发部分,我不会全部都拿出来讲,只会以一个菜单的例子来进行讲解!话不多说,开是吧!

各层之间的协作

先来讲讲我的分层协作的设计思路。虽然借助了DDDLite的部分思想,但是又与其不通,因为小项目严格按照DDD的思想来进行开发完全是找虐。如果有需要我后期会对结构进行调整来向DDD层次迁移。先上一张图吧:

640?wx_fmt=png

这里所有的底层方法都是在Repository层进行的,加入仓储接口层的原因是为了解耦,一路跟着教程走来的朋友一定知道我目前我的仓储层是按照SQLServer数据库进行开发的,后期我会对MySQL,甚至PgSql的支持!这样的话对应用层丝毫不会有影响。

为什么这里用了应用层的服务?因为如果不实用应用层的话,设计到一些逻辑判断等等的话会把控制器搞的很庞大,代码量太多!为了使控制器简洁所以我加入了服务层的概念,这样服务层处理业务逻辑,把结果返回给控制器即可!当然如果涉及到多个事件的处理的话可能还需要借助MediatR来进行实现!什么你不知道MediatR是什么?那你可以看看我的这篇《ASP.NET Core中使用MediatR实现命令和中介者模式》文章的讲述。

实体层充当数据库实体映射以及DTO及ViewModel的角色!对于实体对象模型我更喜欢贫血模式的整洁干净的实体对象!不喜欢充斥各种代码的充血对象。所以里面都是POCO的简单生成。而ViewModel这个层可能我对这个层的概念设计有点模糊,所以DTO跟ViewModel的都混在一起了!这里你不用太过惊讶,因为你完全可以按照自己的理解来进行整理!自由发挥吧!

菜单的增删改查实现

这一节我们就开始写菜单的增删改查的代码实现吧!

菜单的列表页面功能实现

  1. 首选在我们的Czar.Cms.Admin 项目的Controllers控制器下建立MenuController控制器!如图所示:

    640?wx_fmt=png

    里面的代码如下:

640?wx_fmt=png

我们这里先列出首页(也就是列表页的代码)然后创建对应的Index.cshtml视图

  1. Index.cshtml视图的代码如下:

640?wx_fmt=png

可能对于大多数人来说看到这个视图很懵逼,怎么没有列表的信息啊,语法什么的也都看不懂啊?别急,这里用到的是Layui的一些语法!我们拆分下来看:

<form class="layui-form">这个部分就是搜索功能部分

<table id="menuList" lay-filter="menuList"></table>就是表格

<script type="text/html" id="IsDisplay">这个是layui模板部分

  1. wwwroot\js\menu\下面创建一个menuList.js的js文件,来对页面的列表进行下初始化。并对一些操作进行控制。由于代码太长,所以只粘贴加载表格的部分代码如下所示:

    640?wx_fmt=png

    对应的LoadData里面的代码如下:

    640?wx_fmt=png

    是不是很简洁,那是因为所有的业务代码都在服务层实现了,不信?我把代码粘贴出来给你看:

    640?wx_fmt=png

    这时候体会到服务层的好处了吧!

  2. 运行起来看下效果吧:

    640?wx_fmt=png

菜单增加修改功能实现

  1. 首先还是要写控制器方法来显示视图,代码如下:

    640?wx_fmt=png

  2. 由于修改编辑页面菜单有层级关系,所以我们需要加载顶层的菜单(画外音:只支持两级菜单)所以我们加载编辑页面的时候需要把顶层的菜单给加载出来,方法如下:

    640?wx_fmt=png

  3. 列表页弹出编辑或者新增的功能是在menu.js中实现的,代码如下:

    640?wx_fmt=png

  4. 新增或者编辑的时候需要判断菜单的别名是否重复,这里是通过layui的验证模块然后使用ajax实现的,视图代码如下:

    640?wx_fmt=png

    js代码如下:

    640?wx_fmt=png

    先判断是否符合规则,然后判断是否存在,这个需要对新增或者编辑分别进行处理!新增的时候需要判断是否存在即可,编辑的时候需要判断除自己外有没有重复的,代码如下:

    640?wx_fmt=png

    可能你更喜欢看服务层及仓储层的代码,当然我也会毫不吝啬的贴出来,只是可能会消耗你些许流量来查看图片。

    服务层:

    640?wx_fmt=png

    仓储层代码(由于本人比较懒,所以只实现同步方法,异步获取的方法后期再补上吧,相信参照其他的写法你有何能自行实现):

    640?wx_fmt=png

    这里需要注意,我在抽象接口里面都加了注释,所以实现里面就没加了,相信你也能看懂。换句话说,我懒~~~~

  5. 结果提交,这里需要注意只要涉及到结果提交的我都会用到ValidateAntiForgeryToken 还有就是我的结果提交全部是通过ajax进行的,并且把防伪Token放在Token里面的,代码如下:

    640?wx_fmt=png

    至于为什么这里的Headers设置为X-CSRF-TOKEN-yilezhu这个你可以看我的上一节课程《.NET Core实战项目之CMS 第十四章 开发篇-防止跨站请求伪造(XSRF/CSRF)攻击处理》

    里面有讲述,所以这里就不做过多的讲述了。我们直接上结果提交的代码吧。

    640?wx_fmt=png

    很简洁对不对?寥寥几行代码,可是实现真的这么简单吗?看看服务层你就知道了。

640?wx_fmt=png

640?wx_fmt=png

  1. 是不是业务还蛮复杂的,如果都放在控制器处理想想控制器是不是很恐怖,所以说引入服务层很有必要,把一些逻辑移到服务层让控制器只用来显示数据多好!

删除功能实现

你以为删除功能很简单吗?没错,是很简单,可是我们在设计数据库的时候加入了IsDeleted,看到这个相信你已经猜到了,我们所有的删除操作都是软删除哦!至于为什么这样做?原因就是不想删错了后悔!我只能说这么多了,只有经历惨痛的经历可能才会这样做!还有就是删除之前我会进行js的弹窗提醒,如下图所示,提醒您是否真的要删除!

640?wx_fmt=png

  1. 好了,按照惯例我们第一步是不是要上js的代码啊?那还等什么?立马奉上

    640?wx_fmt=png

  2. 注意这里删除的时候也是需要进行防伪验证的,防止别人进行接口恶意删除,下面看下控制器中的代码,哇真干净就一行代码啊,有木有!

    640?wx_fmt=png

  3. 其实我想说服务层的代码有超过二十行,不信?我截图给你看吧!好好数数,加上换行是不是有二十行。

    640?wx_fmt=png

总结

今天讲的内容比较简单就是我们这个CMS系统设计的各层之前如何联动工作来实现增删改查业务的,望对大家了解这个系统有所帮助!至于其他的业务功能大家都可以参照这个进行开发!比如角色管理,用户管理等等!下节我们就来实现用户登录模块的功能。

.NETCore实战项目之CMS第十四章开发篇-防止跨站请求伪造(XSRF/CSRF)攻击处理

.NET Core实战项目之CMS 第十三章 开发篇-在MVC项目结构介绍及应用第三方UI

.NET Core实战项目之CMS 第十二章 开发篇-Dapper封装GURD及仓储代码生成器实现

.NET Core实战项目之CMS 第十一章 开发篇-数据库生成及实体代码生成器开发

.NET Core实战项目之CMS 第十章 设计篇-系统开发框架设计

.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317808.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Early Orders

题意&#xff1a; 给你一个整数列表 x1&#xff0c;x2&#xff0c;&#xff0c;… &#xff0c;xn 和一个数字 k&#xff0c;它保证从1到 k 的每个 i 至少出现在列表中一次。 现在求一个字典序最小的子序列&#xff0c;子序列有1到k组成 题解&#xff1a; 单调栈求解 我们先…

NOIP2020洛谷P7115:移球游戏(分治)

解析 先考虑n2的情况 可以利用一个空队在不超过5m的操作次数下把两个满队还原 如何推广&#xff1f; 考虑分治 把[l,mid]的球看成同色&#xff0c;[mid1,r]的球看成同色 在左右两两匹配柱子进行n2的还原操作 最后在递归处理 操作次数&#xff1a;5mnlogn 代码 #include<b…

[2020-11-23 contest]图(dfs剪枝),劫富济贫(字典树),小A的树(树形DP),游戏(贪心/斜率优化)

文章目录T1&#xff1a;图solutioncodeT2&#xff1a;劫富济贫solutioncodeT3&#xff1a;小A的树solutioncodeT4&#xff1a;游戏solutioncodeT1&#xff1a;图 【问题描述】 给你一个n个点&#xff0c;m条边的无向图&#xff0c;每个点有一个非负的权值ci&#xff0c;现在你…

P7519-[省选联考 2021 A/B 卷]滚榜【状压dp】

正题 题目链接:https://www.luogu.com.cn/problem/P7519 题目大意 nnn个队伍&#xff0c;队伍之间按照得分从小到大排名&#xff0c;得分相同的按照编号从小到大排。开始时每个队伍有个初始得分aia_iai​&#xff0c;和一个额外分bib_ibi​&#xff0c;主持人会按照bib_ibi​不…

4383 [八省联考 2018] 林克卡特树(WQS 二分+DP)

P4383 [八省联考 2018] 林克卡特树 给定一颗 \(n\) 个点的树&#xff0c;每条边有边权 \(v(|v|\le 10^6)\)&#xff0c;要求删去其中任意 \(k\) 条边&#xff0c;使得剩余联通块的直径之和最大。求出这个最大值。 \(0\le k<n\le 3\times 10^5,10s,1GB\)。 问题是怎么求直径&…

P1742 最小圆覆盖

P1742 最小圆覆盖 题意&#xff1a; 给出N个点&#xff0c;让你画一个最小的包含所有点的圆。 题解&#xff1a; 先说结论&#xff1a; 最优解的圆一定是在以某两个点连线为直径的圆 或者 某三个点组成的三角形的外接圆 初始化将某个圆心定为第一个点&#xff0c;R0 枚举第…

Java实现非对称加密【详解】

Java实现非对称加密 1. 简介2. 非对称加密算法--DH&#xff08;密钥交换&#xff09;3. 非对称加密算法--RSA非对称加密算法--EIGamal5. 总结6 案例6.1 案例16.2 案例26.3 案例3 1. 简介 公开密钥密码学&#xff08;英语&#xff1a;Public-key cryptography&#xff09;也称非…

轻量级.Net Core服务注册工具CodeDi发布啦

为什么做这么一个工具因为我们的系统往往时面向接口编程的,所以在开发Asp .net core项目的时候,一定会有大量大接口及其对应的实现要在ConfigureService注册到ServiceCollection中,传统的做法是加了一个服务,我们就要注册一次(service.AddService()),又比如,当一个接口有多个实…

2020 CSP-S 游记

迟到的游记总述T1&#xff1a;儒略日T2&#xff1a;动物园T3&#xff1a;函数调用T4&#xff1a;贪吃蛇总结总述 可能是有了去年第一次的狂炸经历&#xff0c;很明显的就是在考试策略上的提升 头不铁了&#xff0c;手不残了&#xff0c;心态稳了&#xff0c;分也多了 T1&…

NOIP2018洛谷P5021:修建赛道

没有证明的贪心就是乱搞 解析 把标签写在题面上的一道题… 显然要二分答案然后看能不能分出来m个 关键策略是每个结点内部尽可能的多匹配的前提下&#xff0c;给父亲传一个最大的 这不纪念品分组&#xff1f; 然后我就无脑的敲了个双指针的贪心上去 然后就WA掉了qwq &#xf…

Weird Flecks, But OK

Weird Flecks, But OK 题意&#xff1a; 给出三维坐标中的 n 个点&#xff0c;求一个圆柱的最小直径&#xff0c;该圆柱垂直于坐标平面且能覆盖住所有点 题解&#xff1a; 本人最不擅长计算几何&#xff0c;比赛时没做出来。。。 其实就是将n个点投影到三个坐标平面&#x…

P7516-[省选联考2021A/B卷]图函数【bfs】

正题 题目链接:https://www.luogu.com.cn/problem/P7516 题目大意 懒了&#xff0c;直接抄题意了 对于一张 nnn 个点 mmm 条边的有向图 GGG&#xff08;顶点从 1∼n1 \sim n1∼n 编号&#xff09;&#xff0c;定义函数 f(u,G)f(u, G)f(u,G)&#xff1a; 初始化返回值 cnt0cn…

NOIP2022 游记

开个坑&#xff0c;希望能填上

【.NET Core项目实战-统一认证平台】第十三章 授权篇-如何强制有效令牌过期

上一篇我介绍了JWT的生成验证及流程内容&#xff0c;相信大家也对JWT非常熟悉了&#xff0c;今天将从一个小众的需求出发&#xff0c;介绍如何强制令牌过期的思路和实现过程。.netcore项目实战交流群&#xff08;637326624&#xff09;&#xff0c;有兴趣的朋友可以在群里交流讨…

[2020-11-24 contest]糖果机器(二维偏序),手套(状压dp),甲虫(区间dp),选举(线段树 最大子段和)

文章目录T1&#xff1a;糖果机器solutioncodeT2&#xff1a;手套solutioncodeT3&#xff1a;甲虫solutioncodeT4&#xff1a;选举solutioncodeT1&#xff1a;糖果机器 solution 考虑从第iii个糖果出发能到达第jjj个&#xff0c;则有Tj−Ti≥∣Sj−Si∣T_j-T_i≥|S_j-S_i|Tj​…

模板:树上启发式合并(dsu on tree)

文章目录解析step1&#xff1a;树剖step2&#xff1a;求出轻儿子的答案&#xff08;不继承&#xff09;step3&#xff1a;求出重儿子的答案&#xff08;继承&#xff09;step4&#xff1a;加入自己的答案、合并轻儿子的答案并记录答案step5&#xff1a;清空复杂度分析代码所谓树…

New Maths

New Maths 题意&#xff1a; 定义一个不进位的乘法运算 ⊗&#xff0c;先给出一个n&#xff0c;判断是否存在a&#xff0c;满足a ⊗ a n n的长度最多是25 题解&#xff1a; 17 * 17正常等于289 17 ⊗ 17 149 如果a的长度为x&#xff0c;那么最后得到的n的长度len是2x-1 倒…

CF827F-Dirty Arkady‘s Kitchen【堆】

正题 题目链接:https://www.luogu.com.cn/problem/CF827F 题目大意 给出nnn个点mmm条边的一张无向图&#xff0c;每条边只有在时刻[li,ri)[l_i,r_i)[li​,ri​)时候才能通过&#xff0c;且通过时间为111&#xff0c;你不能在一个点处停留&#xff0c;求111走到nnn的最短时间。…

linux一些好用的命令和快捷键

以后知道了再加吧 ctrl-alt-T&#xff1a;yjx之殇 快捷键 ctrl-x h&#xff1a;全选 ctrl-x 3&#xff1a;左右分栏 ctrl-x 1&#xff1a;还原1栏 ctrl-s&#xff1a;查找 alt-%&#xff1a;替换 配置 ctrl-xctrl-f :~/.emacs: (global-set-key (kbd “C-a”) mark-whole-buffe…

ASP.NET Core 数据加解密的一些坑

点击蓝字关注我ASP.NET Core 给我们提供了自带的Data Protection机制&#xff0c;用于敏感数据加解密&#xff0c;带来方便的同时也有一些限制可能引发问题&#xff0c;这几天我就被狠狠爆了一把我的场景我的博客系统有个发送邮件通知的功能&#xff0c;因此需要配置一个邮箱账…