vitepress里使用gitalk(图文教程)

vitepress里使用gitalk

Gitalk 是一个基于 GitHub Issue 和 Preact 开发的评论插件

生成client配置

创建OAuth application

填写完毕,点击 Register application 即可

image-20240311093820670

生成client secrets

一开始没有自动生成 Client secrets,需要手动生成,点击 Generate a new client secret,输入密码即可生成

image-20240311093958965

粘贴配置

Client IDClient secret 配置进行粘贴即可

image-20240311094343117

创建评论仓库

点击 New repository

image-20240311094512571

创建评论仓库,填写完毕点击 Create repository

image-20240311094648308

使用gitalk

安装gitalk

在根目录(有 package.json 的目录里)执行如下命令

npm i gitalk blueimp-md5
npm i @types/blueimp-md5 -D

image-20240311091454442

创建评论组件

.vitepress\theme 目录下创建 components 文件夹,之后创建 Comment.vue 文件

image-20240311091853868

编辑 Comment.vue 文件,粘贴如下代码:

<template><div v-if="showFlag" id="comment-container"></div>
</template><script lang="ts" setup>
import { onMounted, watch, ref, nextTick } from 'vue'
import 'gitalk/dist/gitalk.css'
import Gitalk from 'gitalk'
import { useData, useRouter } from 'vitepress'
import md5 from 'blueimp-md5'const { page } = useData()
const { route } = useRouter()// 配置(需要自己修改)
const gitDefault = {clientID: 'a26e73e5006159d3a513', // !需要改成自己的clientIDclientSecret: 'b42283a5c15549274fdb4b3f1243d09004804988', // !需要改成自己的clientSecretrepo: 'gitalk-vitepress', // !需要改成自己创建的评论仓库owner: 'llwodexue', // !需要改成自己的用户名admin: ['llwodexue'], // !需要改成自己的用户名id: md5(page.value.relativePath),language: 'zh-CN',distractionFreeMode: false,// 默认: https://cors-anywhere.azm.workers.dev/https://github.com/login/oauth/access_tokenproxy: 'https://vercel.charles7c.top/github_access_token'
}const showFlag = ref(true)
// 渲染评论组件
onMounted(() => {watch(() => route.path,() => {showFlag.value = falsenextTick(() => {showFlag.value = truesetTimeout(() => {// 初始化评论组件配置const gitalk = new Gitalk({ ...gitDefault, id: md5(page.value.relativePath) })gitalk.render('comment-container')// 点赞前检查登录状态const commentContainer: HTMLElement | null =document.getElementById('comment-container')commentContainer?.addEventListener('click', (event: Event) => {if (!window.localStorage.getItem('GT_ACCESS_TOKEN')) {alert('点赞前,请先登录')event.preventDefault()}})// 提交评论后重置输入框高度commentContainer?.addEventListener('click', (event: Event) => {const gtTextarea: HTMLElement | null =document.querySelector('.gt-header-textarea')if (gtTextarea) {;(gtTextarea as HTMLInputElement).style.height = '72px'}})// 点击预览时切换评论按钮可见性commentContainer?.addEventListener('click', (event: Event) => {const commentButton: HTMLElement | null = document.querySelector('.gt-header-controls .gt-btn-public')if (commentButton) {commentButton.classList.toggle('hide')}})}, 0)})},{ immediate: true })
})
</script>

创建Layout组件

.vitepress\theme 目录下创建 Layout.vue 文件

image-20240311092451257

编辑 Layout.vue 文件,粘贴如下代码:

<template><Layout :class="layoutClass"><template #doc-after><Comment /></template></Layout>
</template><script lang="ts" setup>
import DefaultTheme from 'vitepress/theme'
import Comment from './components/Comment.vue'
import { useData } from 'vitepress'
import { ref } from 'vue'const { Layout } = DefaultTheme
const { frontmatter } = useData()const layoutClass = ref('')
if (frontmatter.value?.layoutClass) {layoutClass.value = frontmatter.value.layoutClass
}
</script>

引入Layout组件

编辑 .vitepress\theme\index.ts 文件

image-20240311092857786

在里面引入 Layout.vue 文件

import Layout from './Layout.vue'export default {...DefaultTheme,Layout: Layout,
}

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

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

相关文章

关于nginx做正向代理的那些事

声明&#xff1a;该文章只是用于技术探索的实践与讨论&#xff0c;没有其他用途。 准备&#xff1a; 一台能访问外网的服务器&#xff1b;一个域名&#xff0c;映射到上面的服务器&#xff1b;https的证书及密钥&#xff1b;nginx安装包&#xff1b; 协议使用&#xff1a; 开…

CircuitBreaker熔断器

CircuitBreaker熔断器 1、Hystrix目前也进入维护模式 ​ Hystrix是一个用于处理分布式系统的延迟和容错的开源库&#xff0c;在分布式系统里&#xff0c;许多依赖不可避免的会调用失败&#xff0c;比如超时、异常等&#xff0c;Hystrix能够保证在一个依赖出问题的情况下&…

C 练习实例77-指向指针的指针-二维数组

关于数组的一些操作 #include<stdio.h> #include<stdio.h> void fun(int b[],int length) {for(int i0;i<length;i){printf("%d ",b[i]);}printf("\n");for(int i0;i<length;i){ //数组作为形参传递&#xff0c;传递的是指针&#xff0…

C#使用MiniExcel读取excel表格文件

使用MiniExcel读取excel表格文件 MiniExecl提供了几种读取方法。 准备测试数据 测试类&#xff1a; public class Person{public int Id { get; set; }public string Name { get; set; }public string Description { get; set; }public double Value { get; set; }}测试数据…

QT信号与槽实现方式

1、第一种实现方式 在QT开发工具UI界面先拖入按钮&#xff0c;然后鼠标右键拖入按钮&#xff0c;点击选中槽&#xff0c;在页面选着需要的信号&#xff0c;然后OK&#xff0c;随即将会跳转到类的.cpp文件&#xff0c;&#xff08;这种UI代码结合的方式&#xff0c;会自动去绑定…

什么是分段锁?

1、典型回答 分段锁是一种将锁细化到每个段(Segment) 级别的锁设计。在 ConcurrentHashMap 中&#xff0c;它将整个数据结构分成多个段&#xff0c;每个段只锁定自己的一部分数据。每个段可以看作是一个独立的分组&#xff0c;只锁定该段(Segment)内部的数据操作&#xff0c;不…

springboot271制造装备物联及生产管理ERP系统

制造装备物联及生产管理ERP系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装制造装备物联及…

Mysql 无法启动,mysql-bin.日志丢失删除处理

在linux操作系统中&#xff0c;当mysql无法启动时候&#xff0c;先看日志 2024-03-15T05:20:16.352075Z 0 [Warning] [MY-000081] [Server] option max_allowed_packet: unsigned value 107374182400 adjusted to 1073741824. 2024-03-15T05:20:16.352156Z 0 [Warning] [MY-010…

【数据结构和算法初阶(C语言)】栈的概念和实现(后进先出---后来者居上的神奇线性结构带来的惊喜体验)

目录 1.栈 1.1栈的概念及结构 2.栈的实现 3.栈结构对数据的处理方式 3.1对栈进行初始化 3.2 从栈顶添加元素 3.3 打印栈元素 3.4移除栈顶元素 3.5获取栈顶元素 3.6获取栈中的有效个数 3.7 判断链表是否为空 3.9 销毁栈空间 4.结语及整个源码 1.栈 1.1栈的概念及结构 栈&am…

手撸dynamic源码详细讲解

本文源码解析基于3.3.1版本。只截了重点代码&#xff0c;如果需要看完整代码&#xff0c;可以去github拉取。 1 自动配置的实现 一般情况下&#xff0c;一个starter的最好入手点就是自动配置类&#xff0c;在 META-INF/spring.factories文件中指定自动配置类入口 org.spring…

QTextToSpeech的使用——Qt

前言 之前随便看了几眼QTextToSpeech的帮助就封装使用了&#xff0c;达到了效果就没再管了&#xff0c;最近需要在上面加功能&#xff08;变换语速&#xff09;&#xff0c;就写了个小Demo后&#xff0c;发现不对劲了。 出现的问题 场景 写了个队列添加到语音播放子线程中&a…

Jenkins cron定时构建触发器

from&#xff1a; https://www.jenkins.io/doc/book/pipeline/syntax/#cron-syntax 以下内容为根据Jenkins官方文档cron表达式部分翻译过来&#xff0c;使用机翻加个人理解补充内容&#xff0c;包括举例。 目录 介绍举例&#xff1a;设置方法方法一&#xff1a;方法二&#xf…