首页 > 其他分享 >个人博客留言板功能实现

个人博客留言板功能实现

时间:2023-06-10 12:11:42浏览次数:55  
标签:功能 return 留言 messages 博客 public Message 留言板

ZY知识库留言板功能实现

前言

因为这个博客是用的大佬的开源项目,我也是用自己的想法改了很多东西,虽然可能写的不是很好,但是我自己想要的效果实现了,开源项目不就是用来学习的嘛,所以不能一层不变,之前首页改版、评论功能我都没有写文章,这次抽空更新了留言板功能,来水一篇文章。

留言板地址:ZY知识库 · ZY - 留言板 (pljzy.top)

留言类和回复类

首先我创建了如下2个类,类型无非就是int、string、DateTime,这里就不做多的解释了

留言类

字段名 解释
Id 主键
Name 留言者昵称
Email 留言者邮箱
Message 留言内容
Created 留言时间

回复类

字段名 解释
Id 主键
MessageId 留言类外键
Name 回复者昵称
Email 回复者邮箱
Reply 回复内容
Created 留言时间

Service层实现

然后我创建了IMessagesService接口类,列举部分如下:

using msg = Personalblog.Model.Entitys.Messages;
public interface IMessagesService
{
    //新增留言
    Task<msg> SubmitMessageAsync(msg messages);
    //查询所有留言,分页列表
    IPagedList<msg> GetAll(QueryParameters param);
}

然后用MessagesService类实现这个接口类:

public class MessagesService:IMessagesService
{
    private readonly MyDbContext _myDbContext;

    public MessagesService(MyDbContext myDbContext)
    {
        _myDbContext = myDbContext;
    }
    public async Task<Messages> 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<Messages> 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<IMessagesService, MessagesService>();

Controller层实现

public class MsgBoardController : Controller
{
    private readonly IMessagesService _messagesService;

    public MsgBoardController(IMessagesService messagesService)
    {
        _messagesService = messagesService;
    }
    // GET
    public async Task<IActionResult> Index(int page = 1, int pageSize = 10)
    {
        MsgBoardList msgBoardList = new MsgBoardList()
        {
            PagedList = _messagesService.GetAll(new QueryParameters
            {
                Page = page,
                PageSize = pageSize
            }),
            ...
        };
        return View(msgBoardList);
    }

    /// <summary>
    /// 新增留言
    /// </summary>
    /// <param name="messages"></param>
    /// <returns></returns>
    [HttpPost]
    public async Task<ApiResponse> 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风格接口。

前端部分实现

 <div class="my-3" id = "CommentList">
            <div class="feedback_area_title">
                留言列表
            </div>
            @foreach (var m in Model.PagedList)
            {
                @await Html.PartialAsync("Widgets/MsgBoxList",m)
            }
</div>

分布视图MsgBoxList用于显示留言

分布视图MsgBoxReplyList用于显示该留言是否有人回复

MsgBoxList

@model Personalblog.Model.Entitys.Messages
<div class="feedbackItem">
    <div class="feedbackListSubtitle">
        <div class="feedbackManage">
            <span class="comment_actions">
                <a class="comment_actions_link" href="#reply" onclick="Reply(@Model.Id,'@Model.Name')" id="Reply">回复</a>
            </span>
        </div>
        <span class="comment_date">@Model.created_at</span>
        <span class="a_comment_author_5166961">@Model.Name</span>
    </div>
    <div class="feedbackCon">
        @Html.Raw(@Model.Message)
    </div>   
</div>
@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')
                }
            }
 })

留言板效果图

image

结尾

上述内容就是对留言板功能的大体实现,总的来说,这是一个留言板的简单实现。

标签:功能,return,留言,messages,博客,public,Message,留言板
From: https://www.cnblogs.com/ZYPLJ/p/17471043.html

相关文章

  • 微软对Beta频道进行功能更新,添加多种中文声音
         日前微软发布适用于Windows11的最新更新,为Beta频道的WindowsInsider项目成员提供了版本号为Build22631的KB5027305更新。并且微软还对Narrator功能进行了优化,使其在浏览网页、阅读ERP内容和撰写邮件等任务时,中文和西班牙语(西班牙和墨西哥)的发音更加自然流畅。......
  • 20230609 感谢博客园
    几年都没有登录了,在短视频、新媒体发达的现在,在少有人静心写博客的现在,博客园能坚持下来,没把我的博客弄丢,没迁移到这里那里,由衷地感谢!又一个曾经前沿配置的电脑硬盘告急,来搜自己曾经记下的换SSD攻略,恍惚一个时代又过去了。......
  • SAP S/4HANA入门篇(3)-嵌入式分析功能、数据模型、实施方法论
    本篇介绍S/4HANA产品中的嵌入式分析(EmbeddedAnalytics)功能和VDM(VirtualDataModel)数据模型,以及S/4HANA的实施方法论简述。嵌入式分析嵌入式分析是S/4HANA产品的一大亮点,相比于传统的通过ETL工具进行数据抽取然后分析的模式。嵌入式分析可以提供实时的分析结果并应用于业务流......
  • Python使用tkinter的Treeview组件实现表格功能
    fromtkinterimportTk,Scrollbar,Framefromtkinter.ttkimportTreeview#创建tkinter应用程序窗口root=Tk()#设置窗口大小和位置root.geometry('500x300+400+300')#不允许改变窗口大小root.resizable(False,False)#设置窗口标题root.title('通信录管理系统')#使......
  • 这款软件轻松实现在线Axure的原型功能
    原型设计是每个产品经理必备的基本技能。本文从即时设计原型设计的步骤开始,帮助您快速使用即时设计制作高还原度、丰富互动的产品原型。 利用即时设计进行原型设计的优势 快速启动原型设计工作 借助即时设计内置设计系统和社区资源,包括大量原型设计模板、自动布......
  • Python标准库zlib提供的数据压缩功能
    Python标准库zlib中提供的compress()和decompress()函数可以用于数据的压缩和解压缩,在压缩数据之前需要先想办法编码为字节串。>>>importzlib>>>x='Python程序设计系列图书,董付国编著,清华大学出版社'.encode()>>>len(x)72>>>y=zlib.compress(x)>>>len(y)#对于重......
  • Python 3.8实现支持断点续传的网络文件下载功能
    功能描述:下载URL指定的网络文件,支持断点续传。代码支持Python3.5/3.6/3.7/3.8以及更新的版本。所谓断点续传,是指因为各种原因下载过程被中断之后,再次下载时会继续之前的工作,避免重复下载浪费时间。参考代码:以spark官方下载地址为例,220M的文件。运行结果:......
  • ArcEngine|空间查询功能
    所有的代码已经传到了我的GitHub,需要的请自取,GitHub项目地址:https://github.com/weltme/T_ArcMap(1)界面设计(2)思路​ 就实现细节而言,实例通过ISpatialFilter接口来定义空间查询条件,其Geometry属性确定用来查询的空间几何体,SpatialRel属性定义查询所使用的所有空间关系,为esr......
  • 西门子PLC智能网关有什么功能?能采集哪些PLC?
    智能制造与自动化技术的发展带来了更高的生产效率、更低的生产成本和更智能的管理模式,为各行各业提供了科学实用的工业物联网方案。西门子PLC是一种应用广泛的可编程逻辑控制器,具有S7-200SMART、S7-300、S7-400、S7-1200、S7-150型号,适用于各种设备的自动化控制,如智能工厂、污水处......
  • Layui自带的导出功能在导出身份证时后3位为000
    在使用Layui自带的导出功能进行数据导出操作时,会发现身份证号码会出现000的情况。 最开始在网上找资料,有人说要下载Excel的插件包也有说要修改js文件。搞半天还是不行。其实一行代码就ok,废话不多说自己上代码:  只需要在获取数据时加上以下代码即可 {field:'identity'......