最近做了好几个网站,都迫切的需要评论功能,来提高大家的互动性,增强黏性。

我一直用的评论组件是Artalk,可以很方便的跟自己的网站结合,并且接入已有的账户体系!

第一步:安装

我推荐使用Docker安装,新建一个docker-compose.yml:

  1. version: '3.8'
  2. services:
  3. artalk:
  4. container_name: artalk
  5. image: artalk/artalk-go
  6. restart: unless-stopped
  7. ports:
  8. - 8080:23366
  9. volumes:
  10. - ./data:/data
  11. environment:
  12. - TZ=Asia/Shanghai
  13. - ATK_LOCALE=zh-CN
  14. - ATK_SITE_DEFAULT=Artalk 的博客
  15. - ATK_SITE_URL=https://your_domain

常用命令:

  1. docker-compose restart # 重启容器
  2. docker-compose stop # 暂停容器
  3. docker-compose down # 删除容器
  4. docker-compose pull # 更新镜像
  5. docker-compose exec artalk bash # 进入容器

启动之后,访问ip:8080即可,会看到如图所示的内容;

Artalk:简单三步给网站添加评论功能 - 图1

这个时候先在命令行运行命令,建立管理员账号:

  1. docker exec -it artalk artalk admin

而后按照提示输入即可:

Artalk:简单三步给网站添加评论功能 - 图2

打开浏览器: ip:8080,输入用户密码进行登陆。

Artalk:简单三步给网站添加评论功能 - 图3

第二步:新建网站

新建一个站点。

Artalk:简单三步给网站添加评论功能 - 图4

第三步:前端代码注入

命令安装:pnpm add artalk

可选

结合自身已有的账号体系进行数据赋值

  1. "use client";
  2. import { useEffect } from "react";
  3. import { type Session } from "next-auth";
  4. import Artalk from "artalk";
  5. import { myLog } from "@/lib/utils";
  6. type ModCommentProps = {
  7. session: Session | null;
  8. };
  9. export default function ModComment({ session }: ModCommentProps) {
  10. // const { data: session } = useSession();
  11. useEffect(() => {
  12. if (!session) return;
  13. // artalk.setDarkMode(theme === 'dark')
  14. Artalk.init({
  15. el: "#Comments",
  16. server: "***",
  17. site: "hsh",
  18. versionCheck: false,
  19. useBackendConf: true,
  20. darkMode: true,
  21. });
  22. }, [session]);
  23. useEffect(() => {
  24. // 创建观察器来监听DOM变化
  25. const observer = new MutationObserver((mutations, obs) => {
  26. const input = document.querySelector(".atk-name");
  27. if (input instanceof HTMLInputElement) {
  28. input.value = session?.user?.name ?? "";
  29. input.disabled = true;
  30. const event = new Event("input", { bubbles: true });
  31. input.dispatchEvent(event);
  32. obs.disconnect(); // 找到并修改后停止观察
  33. myLog("Input element modified");
  34. }
  35. const inputEmail = document.querySelector(".atk-email");
  36. if (inputEmail instanceof HTMLInputElement) {
  37. inputEmail.value = session?.user?.email ?? "";
  38. inputEmail.disabled = true;
  39. const event = new Event("input", { bubbles: true });
  40. inputEmail.dispatchEvent(event);
  41. obs.disconnect(); // 找到并修改后停止观察
  42. myLog("Input element modified");
  43. }
  44. });
  45. // 开始观察
  46. observer.observe(document.body, {
  47. childList: true,
  48. subtree: true,
  49. });
  50. // 清理函数
  51. return () => observer.disconnect();
  52. }, [session]);
  53. // 未登录进行提示
  54. return (
  55. <div className="mt-4 rounded-lg bg-gray-900 p-6">
  56. {/* // 评论施工中 */}
  57. {session ? (
  58. <div
  59. id="Comments"
  60. className="mt-4 rounded-lg border-2 p-2 text-center"
  61. >
  62. 评论区🚧中,敬请期待!
  63. </div>
  64. ) : (
  65. <>
  66. <div
  67. id="Comment"
  68. className="mt-4 h-20 rounded-lg border-2 p-2 text-center"
  69. >
  70. <h1 className="text-2xl font-bold">请先登录</h1>
  71. 评论区🚧中,敬请期待!
  72. </div>
  73. </>
  74. )}
  75. </div>
  76. );
  77. }