-
2017-01-18 21:23:57
有什么事,尽管在下面评论。
更多相关内容 -
jQuery仿QQ空间说说发表评论留言代码
2017-07-28 16:31:26jQuery仿QQ空间说说发表评论留言代码 -
利用“多说”制作留言板、评论系统
2020-12-18 18:57:493、进入后台管理界面,点击工具->获取代码->通用代码,将这段代码复制到你留言板或者是评论区的地方,代码中需要你填写的信息在“文章”中设置 4、文章设置->添加文章,注意如果你要添加留言框那就把留言当做一篇... -
vue+springboot _实现评论留言功能
2022-04-08 00:55:33第一种:多级评论(递归);需要注意组件传值问题 利用Vue+ElementUi实现评论功能-仿掘金_zLanaDelRey的博客-CSDN博客_vue实现评论功能 第二种:两级评论,注意组件传值问题 VUE+Java实现评论回复功能_harveyST... -
简单留言簿源码 1.0
2021-03-25 16:23:32特色: 1、界面采用欧试风格,设计唯美. 2、可调用留言,能做为评论...bookname-------显示在评论页面的标题:必须加双引号,如:'留言区' 有任何问题可以加我QQ给我留言.我的QQ是;43288833有什么改进我会直接放到官网上 -
02 Hexo博客Butterfly主题配置博客评论邮件提醒
2020-07-10 12:16:22个人博客搭建成功后已经上线运行了好久,但是一直没有时间配置评论区的邮件提醒功能,所以今晚有时间就抽空配置了,然后将操作过程做一下记录。 前提条件 一个已经上线运行的Hexo博客(至于用什么主题都是没有强制...概述
个人博客搭建成功后已经上线运行了好久,但是一直没有时间配置评论区的邮件提醒功能,所以今晚有时间就抽空配置了,然后将操作过程做一下记录。
前提条件
- 一个已经上线运行的Hexo博客(至于用什么主题都是没有强制要求的)
操作步骤
1、为博客配置Valine评论系统
Hexo博客支持的评论系统其实有很多,像之前使用过的来比力啥的,但是目前好多博客都配置了Valine,所以我博客也选择了这一款评论系统,原因无他:轻量级、访问速度快、配置过程简单,以上三个原因足够我使用它了。
Valine评论系统的配置其实很简单,大家直接看它的官网文档还是随便百度一下配置过程,都有大量的资料。在这里就简单介绍一下。
1.1、首先要去LeanCloud官网(https://www.leancloud.cn/)注册一个帐号,账号注册成功后,我们在控制台创建一个应用,如下:
1.2、应用创建完成后,点击应用小卡片右上角的设置按钮进入到应用设置面板,在此面板下的【设置 | 应用Keys】菜单下,获取应用的AppID和AppKey,如下图:
1.3、然后将AppID和AppKey这两个属性值复制粘贴到Butterfly主题的配置文件中,其他主题也类似,粘贴到主题的配置文件中即可,如下:
1.4、此时,我们的博客页面已经出现了评论面板了,如下所示:
1.5、最后,我们在leancloud中的应用设置界面中,通过【设置 | 安全中心】菜单,将我们博客的域名添加到安全中心,如下:
1.6、如果配置完之后没有出现评论面板,那你可要认真看看对应的主题应该怎么配置Valine评论系统了,比如博主使用最新版的Butterfly主题后,配置了Valine但是没有出现评论面板,经过大佬的指导才发现是漏写了一处配置,如下:
加上以上语句就可以正常显示评论面板了,我们也可以正常留言评论。
2、为Valine评论系统增加邮件提醒功能
为博客配置了评论系统后,如果你不是一个追求完美的小伙伴的话,其实博客已经优化的差不多了,但是博主还希望它可以做到如果有小伙伴在博客上留言了的话,可以直接邮件提醒博主,所以接下来就介绍下为Valine评论系统增加邮件提醒功能的配置过程。
首先要注意的是,目前LeanCloud中的面板已经改版了,所以网上很多关于配置邮件提醒的博客文档里的图片已经不太适用,有些按钮、面板我们在新的界面中找不到,所以我才将配置过程记录下来。
2.1、打开LeanCloud的控制台,然后进入应用的设置界面,然后通过【云引擎 | 设置】菜单,进入到云引擎的相关配置面板,然后在"自定义环境变量"处新建以下变量名和值:
以上图片中关于"SMTP_PASS"的值获取方式如下:
首先打开QQ邮箱界面,然后依次点击【设置 | 账户】菜单,如下:
然后点击下方,开启IMAP/SMTP服务,如下:
开启后会得到一串字符串,将那一串字符串复制粘贴到云引擎面板中的"SMTP_PASS"属性后面作为它的值。
2.2、接下来部署生产环境。依次点击【云引擎 | 部署】菜单,打开部署界面,然后通过如下所示部署Valine-Admin,如下:
以上的GitHub地址如下"https://github.com/DesertsP/Valine-Admin.git",必须配置这个地址,不然我们点击部署按钮后,它在部署过程中会报错。
2.3、部署成功后,我们设置定时任务,因为免费的LeanCloud会有自动休眠模式,所以要设置定时任务然它自动重启,操作过程如下:
按上图所示,创建两个定时任务:
1.自动唤醒
Cron表达式为0 0/30 7-23 * * ?
表示每天早7点到晚23点每隔30分钟访问云引擎
2.每天定时检查24小时内漏发的邮件通知
Cron表达式为0 0 8 * * ?
定时检查24小时内漏发的邮件通知2.4、定时任务设置完成后,我们为云引擎绑定一个域名,为了保证后续邮件提醒功能正常。但是在此处要求是一个备案的域名,所以博主就绑定了两个,一个备案的域名绑定成功了,一个没备案的域名绑定失败了,但是好像都最终对邮件提醒没影像,所以猜测应该不需要绑定域名,这就看大家了,喜欢绑定的话就像下图这样绑定即可:
2.5、到此为止,我们的邮件提醒已经可以正常工作了,我们在博客中评论一下来进行测试,如下:
2.5、今天的介绍就到这里,至于邮件提醒的模板那些属于美化的东西了,大家直接百度就可以查得到,差别并不是很大的。
-
android 评论页面listview实现
2015-07-17 17:30:39app中恰巧遇见,android 留言评论页面 listview实现,搞个demo,请多指教 -
JavaWeb+MySQL实现简易留言板(详细的很~)
2021-08-15 11:27:55JavaWeb实现简易留言板JavaWeb+MySQL实现简易留言板
Hello,各位小伙伴们你们好,我是Bug终结者~,不知不觉,已经放假2周了,一晃来到了一周一更,今天我决定更新文章,今天为大家带来我学习过程中的一些经验,为小伙伴们避坑,下面为大家带来今日分享
留言板需求
上图显示的是评论页面的样式
评论页面主要分为三部分: 登录状态区、 评论区(评论和回复操作的区域)、评论列表区(显示所有的评论、回复,以及翻页控件)
-
登录状态区:
1.1 用户不登录也可以看到该列表,但必须登录才可以发表评论和回复。
1.2 用户不登录也可以看到评论区
1.3 用户不登录也可以看到回复按钮
1.4 用户未登录状态,在评论区上方显示: 注册 和 登录 超级链接,点击分别可以进入注册和登录页面。
1.5 登录状态,在评论区上方显示: 欢迎 XXXX ,注销 。
1.6 注销是超级链接,点击注销进入未登录状态。
-
评论区:
2.1 默认显示为发表评论状态。
2.2 发表评论状态下,只显示 textarea控件 和 发表评论按钮。
点击某条评论的回复按钮,状态切换为针对该条评论的回复状态。
2.3 回复状态下,在评论区 textarea 上方将显示:
我要回复 XXX 在 2021-08-09 19:23 的评论: 听的又1232.4 回复状态下,发表评论按钮,变成 发表回复
2.5 回复状态下,发表评论按钮右侧显示一个按钮“返回评论状态” ,点击将进入评论状态。
即评论区有两个状态: 评论状态和 回复状态
2.6 评论状态,发表的是 评论,回复状态是对某条评论回复评论。
2.7 回复状态是针对某条评论的。
-
评论列表:
显示所有评论的列表。
显示评论人、评论时间、评论内容。
每条评论的右侧,有回复按钮,点击回复将进入针对该条评论的 回复状态。
登录状态下自己发表的评论,右侧有删除按钮
其他人发表的评论,右侧看不到删除按钮。
如果评论有回复,则在评论下显示回复列表。
每条回复显示 回复人、回复时间、回复内容。
在登录状态下,当前登录人可以看到自己回复记录的右侧有删除按钮。
评论要实现分页,不需要查询。
看下效果:
数据表
用户表
CREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `account` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL, `password` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `realname` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
评论表
CREATE TABLE `t_comment` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL COMMENT '评论人id,对应用户表的id', `pl_content` varchar(500) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '评论的内容', `pl_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=55 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
回复表
CREATE TABLE `t_revert` ( `id` int(11) NOT NULL AUTO_INCREMENT, `pl_id` int(11) NOT NULL COMMENT '评论人id,对应t_comment.id', `user_id` int(11) DEFAULT NULL COMMENT '回复人id,对应当前登录的账号.id', `hf_content` varchar(500) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '回复的内容', `hf_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '回复的时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
项目结构
部分代码
IndexServlet
@WebServlet("/index") public class IndexServlet extends HttpServlet{ public static final Integer pageSize = 5; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取当前页数 String strPageNumb = req.getParameter("pageNumb"); Integer pageNumb = 1; if (!StringUtils.isEmpty(strPageNumb)) { pageNumb = Integer.valueOf(strPageNumb); } CommentService commentService = new CommentServiceImpl(); try { PageInfo pager = commentService.page(pageNumb, pageSize); req.setAttribute("pager", pager); req.getRequestDispatcher("/WEB-INF/comment.jsp") .forward(req, resp); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
CommentServlet
@WebServlet("/comment") public class CommentServlet extends HttpServlet{ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取数据,当前评论人的id,评论的内容 String content = req.getParameter("content"); User user = (User)req.getSession().getAttribute("user"); Integer userId = user.getId(); CommentService commentService = new CommentServiceImpl(); try { if (commentService.saveComment(userId, content)) { resp.sendRedirect(req.getContextPath()+"/index"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
RevertServlet
@WebServlet("/revert") public class RevertServlet extends HttpServlet{ RevertService RevertService = new RevertServiceImpl(); CommentService CommentService = new CommentServiceImpl(); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取回复的记录id String pl_id = req.getParameter("pl_id"); try { Comment comment = CommentService.queryById(Integer.valueOf(pl_id)); System.out.println("123"); req.setAttribute("comment", comment); req.getRequestDispatcher("/WEB-INF/revert.jsp") .forward(req, resp); } catch (NumberFormatException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取回复的具体信息 String plId = req.getParameter("pl_id"); String liuYan = req.getParameter("liuYan"); System.out.println(plId); User user = (User) req.getSession().getAttribute("user"); Integer userId = user.getId(); try { if (RevertService.saveRevert(plId, liuYan, userId)) { resp.sendRedirect(req.getContextPath()+"/index"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
**Dao层核心代码 **
连接数据库基类
BaseDao
public class BaseDao { private static DataSource ds = null; public QueryRunner initQueryRunner() throws Exception { String dbFile = this.getClass().getClassLoader().getResource("/").getFile(); dbFile = dbFile.substring(1) + "db.properties"; FileReader fr = new FileReader(dbFile); Properties pro = new Properties(); pro.load(fr); // DataSource ds = DruidDataSourceFactory.createDataSource(pro); if (ds == null) { ds = DruidDataSourceFactory.createDataSource(pro); } QueryRunner qur = new QueryRunner(ds); System.out.println(ds); return qur; } }
CommentDaoImpl
public class CommentDaoImpl extends BaseDao implements CommentDao{ @Override public List<Comment> page(Integer pageNumb, Integer pageSize) throws Exception { // TODO Auto-generated method stub QueryRunner qur = initQueryRunner(); String sql = "select * from t_comment order by pl_time desc limit ?, ? "; return qur.query(sql, new BeanListHandler<Comment>(Comment.class), (pageNumb - 1) * pageSize, pageSize); } @Override public Comment queryById(Integer id) throws Exception { // TODO Auto-generated method stub QueryRunner qur = initQueryRunner(); String sql = "select * from t_comment where id = ?"; return qur.query(sql, new BeanHandler<Comment>(Comment.class), id); } @Override public Integer delete(String pl_id) throws Exception { // TODO Auto-generated method stub QueryRunner qur = initQueryRunner(); String sql = "delete from t_comment where id = ?"; return qur.update(sql, pl_id); } @Override public Integer saveComment(Integer userId, String content) throws Exception { // TODO Auto-generated method stub QueryRunner qur = initQueryRunner(); String sql = "insert into t_comment (user_id, pl_content) values(?, ?)"; //如果update方法返回的大于0,代表增加成功,返回的小于0代表失败 return qur.update(sql, userId, content); } @Override public Integer getCount() throws Exception { // TODO Auto-generated method stub QueryRunner qur = initQueryRunner(); String sql = "select count(1) from t_comment"; Long rowCount = qur.query(sql, new ScalarHandler<Long>()); return rowCount.intValue(); } }
RevertDaoImpl
public class RevertDaoImpl extends BaseDao implements RevertDao{ @Override public Integer saveRevert(String plId, String liuYan, Integer userId) throws Exception { // TODO Auto-generated method stub QueryRunner qur = initQueryRunner(); String sql = "insert into t_revert (pl_id, user_id, hf_content) values(?, ?, ?)"; System.out.println(plId); return qur.update(sql, plId, userId, liuYan); } @Override public List<Revert> getListByCommentId(Integer pl_id) throws Exception { // TODO Auto-generated method stub QueryRunner qur = initQueryRunner(); String sql = "select * from t_revert where pl_id = ?"; return qur.query(sql, new BeanListHandler<Revert>(Revert.class), pl_id); } @Override public Integer delete(String hfId) throws Exception { // TODO Auto-generated method stub QueryRunner qur = initQueryRunner(); String sql = "delete from t_revert where id = ?"; return qur.update(sql, hfId); } }
絮语
今日经验分享到此就要结束了,代码路漫漫,有人与你共赴前行,遇到困难去解决,最后都会化为你宝贵的经验,每周一更,回忆一周内值得写的项目,把代码共享,分享自己做练习的一些思路,好了,本周分享该案例,我们下周见!
都看到这了,点个赞支持一下博主吧~
-
-
获取WordPress访客评论/留言的真实IP地址
2018-12-19 14:45:00https://www.jianshu.com/p/f53313c8a16d 第一、脚本功能 if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $list = explode(',',$_SERVER['...这个时候我们再去测试可以从评论处看到是真实IP地址 -
个人网站留言页面(前端jQuery编写、后台php读写MySQL)
2020-11-25 12:30:04全部评论(包括文章评论回复,留言板)都写在同一张表中,不同的评论区用字段belong区分 同一个评论区里,parent为0表示为评论,parent为某值时表示为哪个评论的回复,思路不复杂。 注意,这里并不讲CSS,大家根据... -
微信小程序 评论留言功能实现 仿知乎
2018-08-30 17:26:44最近沉迷学习无法自拔,太久没有码字,码一个小程序留言功能实现。先上一波最后效果图: ...comment:存储留言评论信息,表结构如下: 表中,必须的字段:id,user_id,reply_comment_id,comme... -
Hexo使用Gitalk设置评论区
2020-02-03 20:01:53Hexo 有很多留言板的第三方插件(多说、disqus、Gitment、Gitalk 等等),但是这里主要讲解怎么使用 Gitalk, 因为它比较好看。 我一篇衔接用Hexo搭建个人博客网站,主要解决遗留的问题,因为哪一篇太长了,放在... -
在Web系统中实现评论功能
2019-09-11 16:03:45有一天,新Leader对我说:小伙子, 你来做一下这个备注(用户评论)模块吧。我一听,这不是在为难我胖虎吗,之前从来没做过啊。 但是转念一想,终于可以做点新东西了,心里还是有些小开心得。OK,在开始之前先先... -
Python 网络爬虫实战:手把手教你爬取微博评论区数据
2022-01-05 21:17:29前几天群里有个粉丝问我,怎么爬取新浪微博的评论,他希望爬取人民日报的微博评论区数据,然后做一些相关的数据分析。 本篇博客,我会手把手教你们如何爬取新浪微博的评论区数据。 1. 思路分析 本节中,我会详细... -
Javascript简易留言板实现
2020-12-14 16:30:30思路:想到留言板就想到了 标签,这个标签定义多行的文本输入控件,然后在评论框旁边设置button按钮,点击进行留言。留言的内容是一条一条的,首选列表,创建隐形的ul,在鼠标点击的时候再创建li,将显示有留言内容... -
js+css+html制作简易留言板
2021-11-21 15:56:26利用JavaScript、css以及html制作简易留言板,也可以看作是简易评论区。 要求在页面文本框中输入一些文字之后,点击“发布”按钮,就可以让输入的文字显示在下面,重新输入一些文字,再点击发布,就可以让新发布的... -
用Javascript实现留言板案例(附带删除留言)
2021-02-01 22:23:22在一些网站的讨论品论区,我们通常可以看见会有留言板这个功能,然后当用户评论时,空评论不能评论,发布的评论将会最新显示,把旧的评论抵下去,然后博主可以对评论进行删除 代码如下: <!DOCTYPE html> <... -
评论功能的简单实现
2021-02-28 16:43:48最近在写一个问答功能,类似于评论,几番找资料才有点感觉(主要是太菜了),为了加深印象就单独抽出来记下笔记,然后这篇写完就开始SpringBoot的复习了1. 说明网上看到有三种类型的评论,按照笔者的理解记下了过程... -
通过JS编写简单的评论专区模块
2018-01-16 09:22:07其功能实现:发表弹出框,添加录入内容,显示评论留言版<!-- 作者:向超 时间:2018-01-16 描述:主要通过JS创建标签并添加样式, 创建一个简单的评论专区模块。。。。待后续更新功能 --> 发布微博 ... -
Vue含表情评论回复组件
2019-09-25 16:44:34一、评论回复组件效果 使用vue开发一款精美实用的评论回复组件,并包含emoji表情包,整体效果如下 文本框获取焦点时弹出Emoji表情按钮、发送和取消按钮,...2、下载完成之后在项目中引入 import comment fr... -
asp留言板系统
2013-06-18 11:34:09特色: 1、界面采用欧试风格,设计唯美. 2、可调用留言,能做为评论模块用于其他系统的开发. 3、代码简洁,功能实用.... 使用说明: ...bookname ------- 显示在评论页面的标题:必须加双引号,如:"留言区 -
JS实现简易留言板功能
2021-12-26 07:49:27JS实现简易留言板功能 -
【JavaWeb】网络留言板 可登录、注册、留言、修改留言、删除留言 附源码
2021-11-16 22:30:54留言板 前言 本程序使用java在jsp文件中实现留言功能,...本程序如有漏洞欢迎各位在评论区指正,源码已上传至gitee,链接在文末,有错误会及时改正。如需要使用servlet实现功能,欢迎评论区催更。 程序思路 ... -
前端小白:怎么为你的网页增加评论功能?(一)
2021-04-19 22:15:11当时小编想到何不在我的周刊里设立一个评论区功能呢?虽然此时我的小破站只是一个还在岸边停靠,没有驶向过海洋的小船(翻译成人话就是没上过服务器,只是一个本地网站),但是小编我着实兴奋了一会。 理论存在,... -
点击评论区让键盘弹起uni-app
2020-08-14 09:48:17正常来说点击uniapp的input框时默认会弹起键盘。具体input设置属性可以看官方文档:... 问题:像微信pyq点击评论区或回复评论键盘跟着弹起 ... 代码实现: ...评论区</view> -
微信小程序实现留言功能
2021-04-23 21:50:51一、保存留言 前端: //videoInfo.wxml leaveComment数据绑定,欲实现的方法为点击 评论按钮,对输入留言的文本框进行聚焦 <!-- 评论按钮 --> <cover-image class="size-me" src='../resource/images/... -
视频号6种技巧主动引导用户评论
2020-11-10 14:41:41如果评论区运营的很好,很多用户看到很多评论会好奇去看,这样就增加了停留在你视频这里的时长。可能看评论看很久,记使他不评论,完播率也会提升。 做内容就是抢占用户时间和注意力。 ③,提高用户粘 -
VuePress开启评论、VuePress评论功能。
2020-11-07 15:21:10VuePress开启评论、VuePress评论功能。 -
「评论」功能设计总结
2021-06-12 12:20:28下面正文开始~排序要设计评论区,首先我们需要解决的问题就是排序,这么多条评论信息,到底谁在前面谁在后面?从用户的角度来说,他们希望可以更快速便捷的看到自己想看的评论。那么问题来了,用户到底想看到什么样... -
五一数学建模A题疫苗产生问题详解【附联系方式】
2021-05-02 20:07:23A题目前已做出,现在在完善论文,现在讲解题思路分享给大家,拿奖不是问题。 面包多作品 附联系方式,不懂可问。 原题目如下: A题 疫苗生产问题 新冠肺炎肆虐全球,给世界带来了深重的灾难。各国为控制疫情纷纷研发...