我的基于 JamStack 的新博客

news2024/11/17 10:50:22

概述

今天心血来潮,介绍一下我的新博客站点 —— https://EWhisper.cn。

我是做基础平台 PaaS 运维和架构的,挺喜欢把工作中学到的新知识写下来、记笔记,突然有一天就抱着「资源共享、天下为公」的理念,分享我的学习心得,也能让我的文章更规范刻度。

我是从 2019 年开始折腾博客的,然后在 2021 年对博客进行了一下全新的改版,在最新版的博客中,无论是使用还是部署,都采用采用了 JamStack 的技术架构和工具。目前来看效果也不错。

{% note light %} 🧠问题:

《「译文」目前大火的 Jamstack 到底是什么?》 {% endnote %}

我的第一代博客

第一代网站,目前还在这里留了个底 —— https://www.EWhisper.cn 由 Pelican 静态站点生成器,NGINX Web Server,Docker ,腾讯云 云主机提供支持。主题目前来自Smashing Magazine。

效果如下图所示:

my-pelican-blog-screenshot

{% note info %} 📚参考资料:

Pelican 是一个用 Python 编写的静态站点生成器。亮点包括:

  • 直接用 reStructuredText 或 Markdown 格式的编辑器编写内容
  • 包含一个简单的 CLI 工具来(重新)生成您的站点
  • 易于与分布式版本控制系统和 web hooks 对接
  • 完全静态的输出很容易托管在任何地方 {% endnote %}

第二代 - 基于 JamStack 的博客

第二代网站 —— https://EWhisper.cn 由 Hexo 静态站点生成器,七牛云-对象存储和CDN 提供图片存储和URL,腾讯云 CloudBase-静态网站托管 提供静态网站托管支持,valine 或 Twikoo 提供评论系统技术支持,博客访问量和评论信息存储在 LeanCloud 或 腾讯云 CloudBase-用户管理上,统计分析通过百度统计 和 LeanCloud 来实现,博客首页动态诗词展示由一言开发者中心接口提供。主题目前来自 hexo-theme-fluid。

效果如下图所示:

my-fluid-show

下面一一介绍。

JAM

什么是 JamStack?

{% note info %} 📚参考资料:

Jamstack 架构中的 JAM 是指客户端 JavaScript、可重用的后端 API,和用户界面的 Markup,比如 HTML 与 CSS。 Jamstack 的关键特征是前端 Web UI 与基于 API 的后端服务之间的清晰区分。与垂直集成的传统 Web 应用程序不同的是, Jamstack 应用程序是模块化和分散式的:UI 可以通过静态网页服务器、CDN、甚至基于区块链的存储进行分发;后端 API 服务可以部署在云上,也可以由边缘节点就近提供服务。 {% endnote %}

我们先说 JAM 架构

JAM - 我的博客技术架构

J - JavaScript

J 是指 客户端 JavaScript,那么我的博客中涉及到的 JavaScript 主要有以下:

  • JS 静态站点生成器框架:Hexo,我在自己电脑上用 Markdown 格式写文章,通过 hexo g 生成网站静态页面,并通过 hexo deploy 进行部署。

  • 部署托管:腾讯云 CloudBase,这里是使用了它的:

    • CloudBase CLI:用于和 hexo deploy 一起工作,将网站文件发布到腾讯云上(静态部分具体使用了:DNSPod、COS 和 CDN)
    • 除了 JavaScript 部分,还有涉及 API 的部分有(后面详细介绍):
      • 用户管理
      • 数据库
      • 云函数
  • 静态网站评论系统:Twikoo,这里使用了它的 JS 前端和基于腾讯云 CloudBase 的云函数后台。

  • 网页访问统计

    • 百度统计: 用来做站长网页访问统计和分析。
    • LeanCloud: 用于 PV UV 展示。这里主要用到了它的「数据存储」服务。

百度统计效果如下:

百度统计

LeanCloud 展示效果如下:

首页 PV UV 展示

文章浏览量展示

后端存储数据如下所示:

LeanCloud 后台数据存储

{% note info %} 📚参考资料:

  • Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。Hexo 基于 JavaScript 和 Node.js。

  • 腾讯云 CloudBase:云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为开发者提供高可用、自动弹性扩缩的后端云服务,包含计算、存储、托管等 serverless 化能力,可用于云端一体化开发多种端应用(小程序,公众号,Web 应用,Flutter 客户端等),帮助开发者统一构建和管理后端服务和云资源,避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。

    • CloudBase CLI 是云开发(Tencent CloudBase,TCB)开源的命令行界面交互工具,基于 JavaScript 和 Node.js,用于帮助用户快速、方便的部署项目,管理云开发资源。
  • Twikoo:一个简洁、安全、免费的静态网站评论系统,基于腾讯云开发。部分特色如下:

    • 支持回复、点赞
    • 无需额外适配,支持搭配浅色主题与深色主题使用
    • 支持 API 调用,批量获取文章评论数、最新评论
    • 访客在昵称栏输入 QQ 号,会自动补全 QQ 昵称和 QQ 邮箱
    • 访客填写数字 QQ 邮箱,会使用 QQ 头像作为评论头像
    • 支持评论框粘贴图片(可禁用)
    • 支持插入图片(可禁用)
    • 支持插入表情(可禁用)
    • 支持 Ctrl + Enter 快捷回复
    • 评论框内容实时保存草稿,刷新不会丢失
    • 支持按语言的代码高亮
    • 隐私信息安全(通过云函数控制敏感字段(邮箱、IP、环境配置等)不会泄露)
    • 支持人工审核模式
    • 防 XSS 注入
    • 支持限制每个 IP 每 10 分钟最多发表多少条评论
    • 支持自定义表情列表
    • 内嵌式管理面板,通过密码登录,可方便地查看评论、隐藏评论、删除评论、修改配置
    • 支持从 Valine、Artalk、Disqus 导入评论

    效果如下:

    Twikoo 夜间模式

  • LeanCloud:LeanCloud 本质上提供的服务和腾讯云的 CloudBase 是一致的。LeanCloud 领先的 Serverless 云服务,为产品开发提供强有力的后端支持。提供一站式后端服务,如数据存储、云引擎、即时通讯等。

{% endnote %}

A - API

A 指可重用的后端 API。其实 J 和 A 是紧密配合的,我们在上一段也能看到很多 JavaScript 最终都是调用 API 来对数据进行增删改查。我的博客中涉及到的 API 主要有:

静态网站评论 API

如果大家访问我的网站——容器化应用系统上生产的最佳实践 - 东风微鸣技术博客 (ewhisper.cn),看评论,打开浏览器的 F12,就可以看到实际 Twikoo POST 的 API 是:

curl 'https://ewhisper-5g565139594f9b52.ap-shanghai.tcb-api.tencentcloudapi.com/web?env=ewhisper-5g565139594f9b52' \
  -H 'authority: ewhisper-5g565139594f9b52.ap-shanghai.tcb-api.tencentcloudapi.com' \
  -H 'sec-ch-ua: "Microsoft Edge";v="95", "Chromium";v="95", ";Not A Brand";v="99"' \
  -H 'x-tcb-region: ap-shanghai' \
  -H 'x-sdk-version: @cloudbase/js-sdk/1.7.0' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.38' \
  -H 'content-type: application/json;charset=UTF-8' \
  -H 'x-seqid: 04c3430d22965' \
  -H 'x-tcb-trace: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1dWlkIjoiZWQ1OWE2MmFiYmIyNDZkY2JiNTRiODVjMzU5MGMxNTEiLCJsYXN0UmVwb3J0VGltZSI6MTYzNTY0NzI4MTI2OSwiaWF0IjoxNjM1NjQ3MjgxfQ.GiVnirzhrEf7AnNxV_QejyH9Tk7shmmVG6Xh5yiUPn0' \
  -H 'sec-ch-ua-platform: "Windows"' \
  -H 'accept: */*' \
  -H 'origin: https://ewhisper.cn' \
  -H 'sec-fetch-site: cross-site' \
  -H 'sec-fetch-mode: cors' \
  -H 'sec-fetch-dest: empty' \
  -H 'referer: https://ewhisper.cn/' \
  -H 'accept-language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7' \
  --data-raw '{"action":"functions.invokeFunction","dataVersion":"2020-01-10","env":"ewhisper-5g565139594f9b52","function_name":"twikoo","request_data":"{\"event\":\"COMMENT_GET\",\"url\":\"/posts/14417/\"}","access_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjoie1wibG9naW5UeXBlXCI6XCJBTk9OWU1PVVNcIixcImVudk5hbWVcIjpcImV3aGlzcGVyLTVnNTY1MTM5NTk0ZjliNTJcIixcInV1aWRcIjpcImVkNTlhNjJhYmJiMjQ2ZGNiYjU0Yjg1YzM1OTBjMTUxXCJ9IiwiaWF0IjoxNjM1NjUwOTU4LCJleHAiOjE2MzU2NTQ1NTh9.8hDap2wwrTII2Ine8F9jjDzCGUKW_e80pb4KvpGM64U;1635566422","seqId":"04c3430d22965"}' \
  --compressed

API 返回的响应是:

{
    "requestId": "91765a8a-39fc-11ec-9ab1-b2a89f885dbc",
    "data": {
        "response_data": "{\"data\":[{\"id\":\"cd045e75610b657002fe22fb26922cc4\",\"nick\":\"凯西Casey\",\"avatar\":\"https://thirdqq.qlogo.cn/g?b=sdk&k=JtvoGTkW8mBlnXNSFnxcxg&s=140&t=1557419902\",\"mailMd5\":\"097b6659c25b25c1ad2d792c6d5a953e\",\"link\":\"\",\"comment\":\"<p>自动关联qq头像<img alt=\\\":bilibiliHotKey-20:\\\" src=\\\"https://twikoo-magic.oss-cn-hangzhou.aliyuncs.com/bilibiliHotKey/20.jpg\\\" class=\\\"tk-owo-emotion\\\"> </p>\\n\",\"os\":\"Android 11\",\"browser\":\"Miui 15.1.12\",\"master\":false,\"like\":0,\"liked\":false,\"replies\":[],\"ruser\":null,\"isSpam\":false,\"created\":1628136816139,\"updated\":1628136816139},{\"id\":\"cd045e75610b634002fc99751dbc207c\",\"nick\":\"小囧\",\"mailMd5\":\"27add2425f31777763528269b4060ec1\",\"link\":\"\",\"comment\":\"<p><img alt=\\\":bilibiliHotKey-24:\\\" src=\\\"https://twikoo-magic.oss-cn-hangzhou.aliyuncs.com/bilibiliHotKey/24.jpg\\\" class=\\\"tk-owo-emotion\\\"> </p>\\n\",\"os\":\"Android 11\",\"browser\":\"Miui 15.1.12\",\"master\":false,\"like\":1,\"liked\":false,\"replies\":[],\"ruser\":null,\"isSpam\":false,\"created\":1628136256345,\"updated\":1628136256345},{\"id\":\"610b366fcb9d18021c807485\",\"nick\":\"东风微鸣\",\"mailMd5\":\"7c743bc6ac83171e35a5aa8bd66cc1ea\",\"link\":\"https://EWhisper.cn\",\"comment\":\"<p>&lt;img class=&quot;vemoji&quot; src=&quot;https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/alus/alus_blush.png&quot; alt=&quot;alus_blush&quot;&gt;&lt;img class=&quot;vemoji&quot; src=&quot;https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/bilibili/bb_sunglasses.png&quot; alt=&quot;bb_sunglasses&quot;&gt;&lt;img class=&quot;vemoji&quot; src=&quot;https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/qq/qq_confounded.gif&quot; alt=&quot;qq_confounded&quot;&gt;&lt;img class=&quot;vemoji&quot; src=&quot;https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/tieba/tieba_antic.png&quot; alt=&quot;tieba_antic&quot;&gt;&lt;img class=&quot;vemoji&quot; src=&quot;https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/tw-emoji/1f47d.png&quot; alt=&quot;1f47d&quot;&gt;&lt;img class=&quot;vemoji&quot; src=&quot;https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/weibo/weibo_cat_cry.png&quot; alt=&quot;weibo_cat_cry&quot;&gt;</p>\\n\",\"os\":\"Windows 10\",\"browser\":\"Microsoft Edge 92.0.902.62\",\"master\":false,\"like\":0,\"liked\":false,\"replies\":[],\"ruser\":null,\"created\":1628124783184,\"updated\":1628124783184}],\"more\":false,\"count\":3}"
    }
}

实际内容就是:

comment

网页访问统计 API

百度统计太复杂,我也不太懂,URL 是:https://hm.baidu.com/hm.js 读者可以自行查看。

LeanCloud 统计 PV、UV 和具体文章阅读量的 API 分别为:

PV:

https://lrbbjugq.lc-cn-e1-shared.com/1.1/classes/Counter?where=%7B%22target%22%3A%22site-pv%22%7D

响应内容为:

{
    "results": [
        {
            "target": "site-pv",
            "time": 1395,
            "createdAt": "2021-07-10T07:40:59.569Z",
            "updatedAt": "2021-10-31T03:30:15.933Z",
            "objectId": "60e94f0b55ba67136bafb203"
        }
    ]
}

UV:

https://lrbbjugq.lc-cn-e1-shared.com/1.1/classes/Counter?where=%7B%22target%22%3A%22site-uv%22%7D

响应内容为:

{
    "results": [
        {
            "target": "site-uv",
            "time": 397,
            "createdAt": "2021-07-10T07:40:54.146Z",
            "updatedAt": "2021-10-31T02:15:31.349Z",
            "objectId": "60e94f06d3c62b4544b9ff5d"
        }
    ]
}

具体文章阅读数:以容器化应用系统上生产的最佳实践 - 东风微鸣技术博客 (ewhisper.cn)为例

https://lrbbjugq.lc-cn-e1-shared.com/1.1/classes/Counter?where=%7B%22target%22%3A%22%2Fposts%2F14417%2F%22%7D

响应内容为:

{
    "results": [
        {
            "target": "/posts/14417/",
            "time": 28,
            "createdAt": "2021-07-31T08:39:50.194Z",
            "updatedAt": "2021-10-31T03:30:15.926Z",
            "objectId": "61050c5697a09641df17407d"
        }
    ]
}
首页 Slogan

大家如果进入我的首页,多刷新几次,会发现首页的 Slogan 会出现不同的古诗句。如下:

博客首页古诗句 Slogan

这个其实也是调用的 API,博客首页动态诗词展示由一言开发者中心接口提供。

{% note info %} 📚参考资料:

一言是创建于 2016 年的项目,起初是用于个人目的。目前已经转为公益项目,由萌创团队运营,为大家提供服务。 所谓一言(ヒトコト),即一句话。这句话可以是传达了感动,可以是博人一笑,可以是发人深思。总之,一言,代表着言语的触动,灵魂的交流。 {% endnote %}

具体的调用 URL 为:https://v1.hitokoto.cn/?c=i。c=i 表示句子类型(c)为诗词(i)。

返回的响应为:

{
    "id": 5545,
    "uuid": "5d9def79-c283-4c4c-a9cb-f44ac8da26da",
    "hitokoto": "采得百花成蜜后,为谁辛苦为谁甜。",
    "type": "i",
    "from": "蜂",
    "from_who": "罗隐",
    "creator": "a632079",
    "creator_uid": 1044,
    "reviewer": 1044,
    "commit_from": "api",
    "created_at": "1586266392",
    "length": 16
}

M - Markup

M 指的是用户界面的 Markup,比如 HTML 与 CSS。

我的博客对比了多个 Hexo 受欢迎的主题,最终选择了 fluid 。以下是我使用过的主题和我的简单评价。

  • NexT: 用的人最多,更新频繁,中文,无中文文档
  • icarus:主题对我口味,更新频繁,无中文文档
  • matery: 花哨,中文全支持
  • fluid: 简洁,全中文
  • butterfly: 繁体中文

{% note info %} 📚参考资料:

Fluid 是基于 Hexo 的一款 Material Design 风格的主题,以简约的设计帮助你专注于写作,由 Fluid-dev负责开发与维护。 主题 GitHub: https://github.com/fluid-dev/hexo-theme-fluid 预览网站:Fluid's blog,zkqiang's blog 大家可以浏览 Hello Fluid - Hexo Theme Fluid (fluid-dev.com) 来体验该主题的风格 {% endnote %}

JAM - 我的博客写作发布流程

首先,文章全部托管在 Git 上。在我的电脑上安装好相关依赖:Git、Node.js 、 VSCode(用作 Markdown 格式文章写作、终端 Terminal 和 Git 版本管理)、hexo-cli(Hexo 的命令行)、hexo-theme-fluid(fluid 主题)和 @cloudbase/cli(腾讯云 CloudBase CLI)。

其次,在终端执行 hexo new "新文章" 创建新的 markdown 文件,并用 VSCode 对其进行写作和编辑。

文章完成后,通过终端执行 hexo s 生成新的文章网页,并本地预览。

最后,通过 cloudbase framework deploy ... 发布到腾讯云上。

这里也详细说一下 cloudbase framework deploy ... 都做了些什么,具体如下:

CloudBase CLI 1.9.2
CloudBase Framework 1.8.16
   ______ __                   __ ____                             
  / ____// /____   __  __ ____/ // __ ) ____ _ _____ ___           
 / /    / // __ \ / / / // __  // __  |/ __ `// ___// _ \          
/ /___ / // /_/ // /_/ // /_/ // /_/ // /_/ /(__  )/  __/          
\____//_/_\____/ \__,_/ \__,_//_____/ \__,_//____/ \___/       __  
   / ____/_____ ____ _ ____ ___   ___  _      __ ____   _____ / /__
  / /_   / ___// __ `// __ `__ \ / _ \| | /| / // __ \ / ___// //_/
 / __/  / /   / /_/ // / / / / //  __/| |/ |/ // /_/ // /   / ,<   
/_/    /_/    \__,_//_/ /_/ /_/ \___/ |__/|__/ \____//_/   /_/|_|  

 CloudBase Framework  info     EnvId ewhisper-xxxxx    # 作者备注:CloudBase 的环境 ID
 CloudBase Framework  info     Region ap-shanghai    # 作者备注:腾讯云区域
 CloudBase Framework  info     Validate config file success.
 CloudBase Framework  info     AppName ewhisper
 CloudBase Framework  info     📦 install plugins
 CloudBase Framework  info     callHooks 'preDeploy'     # 作者备注:部署前操作
 CloudBase Framework  info     🔧 init: hexo...        # 作者备注:init
 CloudBase Framework  info     Website 插件会自动开启静态网页托管能力,需要当前环境为 [按量计费] 模式    # 作者备注:环境是按量计费的。
 CloudBase Framework  info     Website 插件会部署应用资源到当前静态托管的 / 目录下
 CloudBase Framework  info     🔨 build: hexo...    # 作者备注:build,就是调用 `npx hexo generate`
 CloudBase Framework  info     running 'npm install --prefer-offline --no-audit --progress=false' 
...
 CloudBase Framework  info     running 'npx hexo generate' 
# 作者备注:以下是 Hexo Generate 日志
INFO  Validating config
INFO  Start processing
INFO  [Fluid] 读取 _config.yml 中 theme_config 配置项覆盖配置
INFO  Generate link [41870] for post [source/_posts/我的基于JamStack的新博客.md][ 我的基于JamStack的新博客 ]
INFO  Generated: categories [[ '云计算' ]] for post [source/_posts/我的基于JamStack的新博客.md][ 我的基于JamStack的新博客 ]
...
INFO  292 files generated in 1.8 s
# 作者备注:以上是 Hexo Generate 日志
 CloudBase Framework  info     🧬 compile: hexo...        # 作者备注:静态网站没有编译过程
 CloudBase Framework  info     callHooks 'postCompile'     
正在部署[░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░] 100% 40.0 s
正在部署[░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░] 100% 45.1 s
 CloudBase Framework  info     🚀 deploy: hexo...        # 作者备注:部署到腾讯云,其实调用的就是腾讯云 COS 的上传 API
 CloudBase Framework  info     🚀 网站部署成功
 CloudBase Framework  info     callHooks 'postDeploy'      # 作者备注:部署后展示应用信息
 CloudBase Framework  info     🌐 应用入口信息:
🔗 网站入口: https://ewhisper-xxx.tcloudbaseapp.com/
 CloudBase Framework  info     ✨ done

其间,也会通过 Git 进行文章的版本管理和同步。

JAM - 我的博客的部署架构

JAM 通用的用户访问路线如下所示:

JAM

静态站点部分

Hexo 生产的站点,是完全的静态站点,全部都是静态文件,包括:HTML、CSS、JavaScript 和图片。这些静态文件,通过 cloudbase framework deploy ... 后,发布到腾讯云 CloudBase-静态网站托管。这里其实将静态文件发布到了 2 个腾讯云的产品中:

  1. 腾讯云对象存储 COS:静态文件是以对象的形式存放在 COS 中。
  2. 腾讯云 CDN:同时 COS 中的静态文件,会缓存到腾讯云的 CDN 中。

用户浏览网站时,过程如下:

  1. 访问:https://EWhisper.cn;
  2. <EWhisper.cn> 域名在 DNS 中解析为 CName:<ewhisper.cn.cdn.dnsv1.com>;转到腾讯云 CDN
  3. 如果 CDN 命中,直接返回;如果 CDN 没有命中,会回源到 腾讯云 COS 的地址去访问源文件。

API 部分

对于 API 部分,需要开通、安装部署的主要有以下组件:

  • 静态网站评论系统:Twikoo,部署方式见 Twikoo 快速上手
  • 网页访问统计 API:LeanCloud。LeanCloud 只要申请个账号,获得对应的域名、AKSK 即可。

总结

以上就是我的基于 JamStack 的博客 —— https://EWhisper.cn。主要是基于:Hexo、Fluid 主题、Twikoo 评论系统、LeanCloud 和 腾讯云 CloudBase 来实现的。

从我的角度来看,JamStack 相比传统 LNMP 开发,一些主要的区别包括:

  • Jamstack 不需要安装或管理操作系统 (如 Linux)
  • Jamstack 不需要管理安全策略 (服务器防火墙)
  • Jamstack 不需要安装或管理应用程序数据库 (如 MySQL)
  • Jamstack 可以在不使用 HTTP (Web) 服务器 (如 Apache) 的情况下部署 Web 站点或 Web 应用

总体而言,选择使用 Jamstack 创建网站有 4 个主要好处: 成本效益、性能改进、更好的安全性和更好的用户 / 开发者体验

欢迎体验!✨✨✨

三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

KDevelop详细Debug教程

KDevelop官方连接&#xff1a;https://www.kdevelop.org/ 感觉网上对KDevelop的使用介绍比较少&#xff0c;也没有一个完整的Debug教程&#xff0c;这里记录一下我的踩坑过程。当然首先你需要有一个Ubuntu系统&#xff0c;然后需要apt-get安装一下KDevelop。 首先CMakeLists.t…

基于springboot+mybatis+mysql+html实现宠物医院管理系统2(包含实训报告)

基于springbootmybatismysqlhtml实现宠物医院管理系统2&#xff08;包含实训报告&#xff09;一、需求背景二、系统简介二、系统主要功能界面1、用户登陆2、系统主页3、医生信息4、客户信息5、宠物信息6、浏览管理7、诊断管理8、医生管理9、用户管理三、其它系统四、获取源码一…

Dubbo相关概念

分布式系统中的相关概念 dubbo 概述 dubbo快速入门 dubbo的高级特性 2-相关概念 2.1-互联网项目架构-特点 互联网项目架构-特点 用户多 流量大&#xff0c;并发高 海量数据 易受攻击 功能繁琐 变更快 传统项目和互联网项目的不同 用户体验&#xff1a; 美观、功能…

【 Vue3 + Vite + setup语法糖 + Pinia + VueRouter + Element Plus 第四篇】(持续更新中)

在第三篇中&#xff0c;我们主要学习了组件的封装与使用以及 组件间传值和 Element Plus 表格、表单的用法 本期需要掌握的知识如下: mixin 公共方法封装和使用项目中导入 VueRouter使用 VueRouter 完成 路由跳转、获取路由信息VueRouter 模块化、路由拦截器权限路由配置 下期…

https 加密原理握手过程详解

HTTPS握手过程 HTTPS的握手过程比较繁琐&#xff0c;我们来回顾下。 先是建立TCP连接&#xff0c;毕竟HTTP是基于TCP的应用层协议。 在TCP成功建立完协议后&#xff0c;就可以开始进入HTTPS阶段。 HTTPS可以用TLS或者SSL啥的进行加密&#xff0c;下面我们以TLS1.2为例。 总…

自定义antd或element table 列设置组件(拖拽排序及控制是否展示)

需求 展示出所有的字段显示当前展示的是哪些字段可以全选、取消全选可以拖拽排序&#xff0c;更改字段的展示顺序&#xff0c;在前面还是在后面可以保存配置&#xff0c;刷新不失效 难点 如何进行拖拽排序&#xff0c;自己手写一个吗&#xff1f;如何得到拖拽后的顺序&#…

verilog学习笔记- 8)状态机

目录 概念&#xff1a; 状态机的模型&#xff1a; 状态机的设计&#xff1a; 根据状态机的实际写法&#xff0c;状态机可以分为一段式、二段式和三段式状态机。 三段式状态机的基本格式&#xff1a; 概念&#xff1a; 状态机&#xff0c;全称是有限状态机&#xff08;Fin…

再学C语言29:函数——概述

C的设计原则是把函数作为程序的构成模块 函数&#xff08;function&#xff09;&#xff1a;用于完成特定任务的程序代码的自包含单元 使用函数的好处&#xff1a; 1&#xff09;函数的使用可以省去重复代码的编写&#xff0c;尤其是程序中需要多次使用某种特定的功能时&…

unity日记4(鼠标键盘交互、实例)

目录 鼠标事件 鼠标点击、抬起、长按事件 键盘事件 键盘点击、抬起、长按事件 键盘键位替换 实例&#xff1a;鼠标-音乐播放/暂停 实例&#xff1a;调用其他对象的组件&#xff08;双方法&#xff09; 实例&#xff1a;调整其他对象的公有参数 鼠标事件 鼠标点击、抬起、长…

实体关系抽取

关系抽取分为pipeline型和联合&#xff08;Joint&#xff09;抽取。 pipeline形式&#xff1a; 指把关系抽取&#xff0c;拆分成多个任务&#xff0c;如【先抽Subject&#xff0c;再一起抽Predict和Object】&#xff08;CasRel&#xff09;、【先判断Predict&#xff0c;再一…

『博客专家』- 你申请了吗?

目录为什么要申请专家博客&#xff1f;个人申请专家博客的流程&#xff1f;个人申请经历7月20日7月20日7月22日7月27日8月2日8月7日8月9日9月26日10月23日10月28日【补】12月5日【补】12月23日总结提一盏读书灯,去翻山越岭; 为什么要申请专家博客&#xff1f; 每次看到厉害的博…

Java中ArrayList如何删除指定位置的元素

目标&#xff1a;list中有0到39共40个元素&#xff0c;删除其中索引是10、20、30的元素 方案一&#xff1a;使用普通for循环从前往后遍历再删除 初始化List列表 List<String> list new ArrayList<>(); for (int i 0; i < 40; i) {list.add("element&qu…

Leetcode 剑指 Offer II 009. 乘积小于 K 的子数组

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个正整数数组 nums 和整数 k &#xff0c;请找出该数组内乘…

处方眼镜镜片在线定制类跨境电商独立站怎么做?

对于处方眼镜镜片&#xff0c;有很多的参数&#xff0c;对于在线类跨境电商商城&#xff0c;需要用户一步一步的提交很多的眼镜参数&#xff0c;下面是fecify眼镜镜片参数的定制过程, fecify的眼镜定制插件提供强有力的支持&#xff0c;下面是处方眼镜镜片在线定制类跨境电商独…

为什么Windows错误报告叫作Dr. Watson?

应该有一部分人可能会知道&#xff0c;Windows 错误报告有一个昵称&#xff0c;叫做”Dr. Watson”(华生医生)&#xff0c;没事&#xff0c;你不知道&#xff0c;也没关系。 今天的文章主要是讲讲&#xff0c;这个”Dr. Watson”名称的来历。 和你所猜想的一样&#xff0c;Dr.…

Java高手速成 | Java集合类泛类型

Java高手是这样炼成的。 01、Java集合类包括哪些&#xff1f; 作为学习集合类泛类型的预备知识&#xff0c;图1列出了Java集合类继承图。要学会集合类泛类型&#xff0c;除了懂得集合类外&#xff0c;大家也需 要了解继承的工作原理。图中虚线表示Collection是一个接口。 02…

Java-性能分析监控工具

Java监控和管理 Java监控和管理API Java Standard Edition&#xff08;Java SE&#xff09;平台提供的监控和管理技术 - JMX&#xff08;Java Management Extensions&#xff09; 技术。 Java SE 中包含了用于监控和管理的&#xff08;java.lang.management&#xff09;API&…

RabbitMQ 总结一(简介、安装、Demo)

目录 什么是MQ RabbitMQ和netty是什么关系 作用 流量削峰 应用解耦 异步处理 MQ的构成 生产者 交换机 队列 消费者 下载安装 案例Demo producer 第一步&#xff0c; 定义好连接的信息并且拿到连接&#xff0c;一般一个consumer/ producer 和broker只会建立一条连…

mysql之日志

前言 一条数据在更新过程当中&#xff0c;如果中途 mysql crash 了&#xff0c;mysql 是如何保证数据的一致性和持久性的&#xff1f;在这个过程中 mysql 的日志系统起到了至关重要的作用。本文将会介绍 mysql 中的 undo log、redo log 和 bin log 在这其中的作用。 buffer p…

230109-MacOS解决brew安装慢的问题

MacOS解决brew安装慢的问题 原文请移步参考&#xff1a; https://www.zhihu.com/question/46963138 cd "$(brew --repo)" git remote set-url origin https://mirrors.ustc.edu.cn/brew.gitecho export HOMEBREW_BOTTLE_DOMAINhttps://mirrors.ustc.edu.cn/homebrew…