ZY知识库留言板功能实现
前言
因为这个博客是用的大佬的开源项目,我也是用自己的想法改了很多东西,虽然可能写的不是很好,但是我自己想要的效果实现了,开源项目不就是用来学习的嘛,所以不能一层不变,之前首页改版、评论功能我都没有写文章,这次抽空更新了留言板功能,来水一篇文章。
留言板地址:ZY知识库 · ZY - 留言板 (pljzy.top)
(资料图片)
留言类和回复类
首先我创建了如下2个类,类型无非就是int、string、DateTime,这里就不做多的解释了
留言类
字段名 | 解释 |
---|---|
Id | 主键 |
Name | 留言者昵称 |
留言者邮箱 | |
Message | 留言内容 |
Created | 留言时间 |
回复类
字段名 | 解释 |
---|---|
Id | 主键 |
MessageId | 留言类外键 |
Name | 回复者昵称 |
回复者邮箱 | |
Reply | 回复内容 |
Created | 留言时间 |
Service层实现
然后我创建了IMessagesService接口类,列举部分如下:
using msg = Personalblog.Model.Entitys.Messages;public interface IMessagesService{ //新增留言 Task SubmitMessageAsync(msg messages); //查询所有留言,分页列表 IPagedList GetAll(QueryParameters param);}
然后用MessagesService
类实现这个接口类:
public class MessagesService:IMessagesService{ private readonly MyDbContext _myDbContext; public MessagesService(MyDbContext myDbContext) { _myDbContext = myDbContext; } public async Task SubmitMessageAsync(Messages messages) { StringBuilder sb = CommentSJson.CommentsJson(messages.Message); messages.Message = sb.ToString(); messages.created_at = DateTime.Now; await _myDbContext.Messages.AddAsync(messages); await _myDbContext.SaveChangesAsync(); return messages; } public IPagedList GetAll(QueryParameters param) { return _myDbContext.Messages.Include(m => m.Replies).ToList().ToPagedList(param.Page, param.PageSize); }}
IPagedList
是一个分页插件,用NuGet下载X.PagedList/8.4.3
包CommentsJson
方法是用来处理quill
富文本编辑器传过来的内容,这里就不做解释了。
配置文件依赖注入
builder.Services.AddTransient
Controller层实现
public class MsgBoardController : Controller{ private readonly IMessagesService _messagesService; public MsgBoardController(IMessagesService messagesService) { _messagesService = messagesService; } // GET public async Task Index(int page = 1, int pageSize = 10) { MsgBoardList msgBoardList = new MsgBoardList() { PagedList = _messagesService.GetAll(new QueryParameters { Page = page, PageSize = pageSize }), ... }; return View(msgBoardList); } /// /// 新增留言 /// /// /// [HttpPost] public async Task SubMessage([FromBody]Messages messages) { if(messages.Message == null || messages.Message == "") return new ApiResponse(){Data = "请输入留言内容",Message = "请输入留言内容",StatusCode = 422}; if(messages.Name == null || messages.Name == "") return new ApiResponse(){Message = "请输入昵称~",StatusCode = 422}; if (messages.Email == null || messages.Email == "") return new ApiResponse(){Message = "请输入邮箱~",StatusCode = 422}; bool isValid = CheckEmail.CheckEmailFormat(messages.Email); if (!isValid) { return new ApiResponse(){Message = "邮箱格式错误~",StatusCode = 422}; } try { return new ApiResponse(){Data = GetHtml(await _messagesService.SubmitMessageAsync(messages)),Message = "留言成功",StatusCode = 200}; } catch (Exception e) { return new ApiResponse() { Data = "服务器异常!", Message = "服务器异常!", StatusCode = 500 }; } }}
因为是MVC项目所以控制器继承Controller
类,然后后台管理的接口则是继承ControllerBase
用于实现Restful
风格接口。
前端部分实现
留言列表 @foreach (var m in Model.PagedList) { @await Html.PartialAsync("Widgets/MsgBoxList",m) }
分布视图MsgBoxList
用于显示留言
分布视图MsgBoxReplyList
用于显示该留言是否有人回复
MsgBoxList
:
@model Personalblog.Model.Entitys.Messages @Model.created_at @Html.Raw(@Model.Message) @if (Model.Replies.Any()){ @await Html.PartialAsync("Widgets/MsgBoxReplyList",Model.Replies)}
利用ajax请求发送留言
部分代码
$.ajax({ url:"/MsgBoard/SubMessage/", type:"post", data:JSON.stringify({ "Name":""+Name+"", "Email":""+Email+"", "Message":""+Content+"" }), contentType: "application/json", success:function (data){ if (data.statusCode === 200){ alert(data.message, "success") const CommentList = document.getElementById("CommentList") const html = data.data CommentList.insertAdjacentHTML("beforeend", html); clearInput() }else{ alert(data.data, "danger") } $("#btnComent").prop("disabled", false); }, error:function(xhr,status,error){ $("#btnComent").prop("disabled", false); if (xhr.status === 429){ alert("请求过于频繁,请稍后再试。","warning") }else if (xhr.status === 422){ alert(xhr.responseJSON.message,"warning") } else{ alert("服务器异常,请稍后再试!!!","danger") } } })
留言板效果图
结尾
上述内容就是对留言板功能的大体实现,总的来说,这是一个留言板的简单实现。
标签:
-
当前简讯:个人博客留言板功能实现
ZY知识库留言板功能实现 前言因为这个博客是用的大佬的开源项目,我也
-
日本羽田机场两架飞机疑似发生碰撞-焦点
据日本广播协会(NHK)10日报道,日本国土交通省当天发布消息称,当地
-
驯狼小说完整版_驯狼为妃
1、狼的习性是群居,单独训养也不可能达到好的效果,而且从狼的体形和
-
马桶盖换不了怎么办(换马桶盖手伸不进去怎么处理) 视点
相信大家对马桶盖换不了怎么办,换马桶盖手伸不进去怎么处理的问题都很
-
当前速看:安徽省考试招生院官网
各个省市区、各个批次的录取通知书的发放时间不一样,从本月15日前后到
-
“北京印象”掇拾 天天头条
北京是历史文化名城。很多人都对北京的景点如数家珍,可是要想真正读懂
-
运费险需要买吗_运费险是什么意思是不是不用掏运费
1、先要自己垫付退货运费。2、交易结束后3天内理赔款项直接支付到买家
-
炒股杂谈之2023年6月10日周总结_当前看点
星期六天气多云28度(一)投资。本周收益3 9万或1 7%,2023年盈利37 3
-
蓉火传递启动|“中国民航英雄机组”成员毕楠:当上火炬手,是荣誉也是责任
现场,“中国民航英雄机组”成员、获全国五一劳动奖章(集体)的梁鹏、
-
哈弗二代大狗与CR-V强势PK,这些选手不一般! 世界即时
最近几年,自主品牌造车技术水平的进步有目共睹,从“追赶差距”到“赶超
-
全球热推荐:陕西西安推动“十里沣河”文旅深度融合古老沣河涌动新活力
沣河景色。位于“十里沣河”文旅带的昆明池七夕公园。 以上图片均为
-
每日动态!盗贼之海火之心五本日记位置在哪 盗贼之海第一章攻略五本日记
盗贼之海火之心是一个比较耗时间的任务,在这个任务中玩家将会需要收集
-
韩国:2025年起将AI引入小中高课程 到2028年实现全面覆盖|焦点速递
韩国《亚洲日报》10日消息,韩国教育部表示,为满足对多样化学习内容日
-
再塑生命的人ppt七彩课堂_再塑生命的人ppt 天天热讯
1、《再塑生命的人》的写作背景:选自《假如给我三天光明》,作者海伦
-
学期总结怎么写_学期总结 世界关注
与其说是总结,不如说是自省。高考过后就忙着填志愿了,不知道是命运安
-
高爆率传奇刀刀切割版手游大全 高爆率传奇刀刀切割版推荐 世界快资讯
,传奇手游哪个好玩?目前有哪些传奇手游值得玩?传奇手游要选择什么版本
-
美利达公路自行车推荐_美利达公路自行车官网_世界消息
1、美利达山地车价格表美利达山地车做工优秀,配置精良,不光在国内拥
-
5月国内挖掘机销量降46%,出口增速重回两位数|基建晴雨表
界面新闻记者|马悦然今年以来,国内挖掘机销量持续同比下滑。6月7日晚
-
丢失sldinnerdispatchproxyu.dll的修复方法 资讯推荐
sldinnerdispatchproxyu dll文件是一个非常重要的电脑系统dll文件,如
-
别无他求的意思_别无它求
1、意思是:用于形容这个东西十分最珍贵,如果你拥有了这个东西,就不
-
关于铁路计次票、定期票 如何购买使用 环球热头条
为进一步方便城市间人员乘车往来交流,满足广大旅客差异化出行需求,国
-
从来不敢仔细看你完整版(从来不敢仔细看你)_环球新资讯
来为大家解答以上的问题。从来不敢仔细看你完整版,从来不敢仔细看你这
-
焦点热文:取四朵用石蕊溶液染成紫色的纸花(取四朵用石蕊溶液)
来为大家解答以上的问题。取四朵用石蕊溶液染成紫色的纸花,取四朵用石
-
安逸四川日历海报丨在广元利州月坝村:踏湖望星空 快资讯
今天安逸四川日历海报带大家走进广元市利州区月坝村,踏湖望星空。
-
电脑很卡反应很慢该如何处理(安卓手机开启USB调试连接电脑没反应)
1、手机开启USB调试,连接电脑没反应,按如下方式解决:换一个数据线或
-
天天速读:宣传单尺寸大小_宣传单尺寸多大合适
1、一般尺寸是210*285 也就是差不多A4那么大,当然,你也可以做成半个A
-
当前简讯:七八分熟的羊肉不宜吃的原因是?
七八分熟的涮羊肉不宜吃的原因是易感染上旋毛虫病在寒冷季节,家入团聚
-
苏宁易购南区启动618省钱风暴 助推释放年中消费潜力
消费复苏大潮迎来线下实体消费回归,今年618也成为消费复苏背景下第一
-
喝红酒配什么小吃合适?-世界热闻
用红酒吃什么:淡红葡萄酒适合食用清淡的海鲜,鱼子酱,清淡的奶酪,沙
-
《有利的诈欺》绿叶抢眼,尹博再次伙拍金东旭斗戏
《有利的诈欺》上周顺利起航,讲述天才少女李露云(千玗嬉饰)被诬蔑杀