当前位置: 首页 > news >正文

2025年,如何制作并部署一个完整的个人博客网站

欢迎访问我的个人博客网站:欢迎来到Turnin的个人博客

github开源地址:https://github.com/Re-restart/my_website


前言

2024年年初,从dji实习回来之后,我一直想着拓宽自己的知识边界。在那里我发现虽然大家不用java,但java的代码逻辑架构却非常的深入人心。这让我对java第一次有了想接触学习的想法,也想着什么时候自己能用java写个项目出来,比如说现在这个个人博客网站,前后端都自己写(当然也会参考开源项目和ai),不用wordpress搭建,自己部署并买个域名,做成真正的网站

其实原先的想法是做一个类似confluence的网站,现在这种,也算还行了哈哈哈

在我看来,java与python是有共通之处的,java中的继承其实就是python中的父子类,封装是python中的命名函数,多态是同一个函数名称可以调用不同的变量,生成不同的结果。这两种语言都是面向对象的语言。

由于2024年上半年做毕业设计,也在实习;2024下半年去读研,忙着上课提升数学能力,因此这个想法一直被搁置,直到现在。

java网站项目和stm32单片机项目的对比思考

用clion搭建stm32开发环境的时候:Linux系统下速通stm32的clion开发环境配置_linux clion stm32-CSDN博客

我发现了maven与cmake的相似之处,都是用来生成java/c的项目,cmake指挥gcc编译项目,maven指挥jar编译项目;并且我的单片机代码结构,和java项目的代码结构也有共通之处:如果用cubemx生成代码,你会发现它给你生成了core文件夹,core文件夹里有inc和src,还有startup,这些都是构造项目的主要函数。正如java网站项目中,src目录下也都是项目的主要执行文件。

但也有不同之处,比如如果想添加自己的函数文件,需要创建new文件夹,因为cubemx生成时会自动更新core文件夹和CMakeLists.txt。但是java项目就不需要,因为所有的配置文件需要自己来写,IDEA只是搭建了最初始的程序框架,也不会主动更新自己src文件夹。

就依赖库来说,STM32作为嵌入式底层系统开发工具,手动管理.h/.c头文件,并链接脚本。java则是自动构建依赖树,开发效率更高。

两个项目都有底层配置和中间件,单片机项目有driver驱动类文件和middlewares中间件,网站项目有底层的jvm,springboot和plugins插件,thymeleaf也是中间件,pox.xml是中间件配置文件。

单片机项目的外部库是arm-gcc配置文件,java项目的外部库是maven编译文件。到最后,单片机项目构建的是elf文件,再由此生成hex文件和bin文件,java构建的是jar文件,通过java运行。

我这个单片机使用的是rtos系统,完成一些多线程任务,与传统裸机项目的前后台循环任务有所不同。这个网站项目运行于jvm,通过线程池等机制完成异步任务,两者也有相似之处。细细想来,两者差距并不算大,rtos与jvm在一定程度上都起到了系统调度的作用

所以现在,是时候捋顺思路,写完这个个人博客网站了。

博客网站需求思路

一个博客网站需求如下:

1.发文章:因为是个人博客网站,只需要博主本人发文,所以可以把文章写成markdown格式,放在resources/markdown文件夹下读取,把markdown文本转换成html文本格式,并把具体内容用详情页展示出来。

因此需要文章列表页面前后端,文章详情页面前后端。

2.文章分类:文章太多,而且需要分类,所以需要文章分类页面前后端。

3.访客留言板:我简化了登陆功能和评论功能,这俩后期也比较难维护,取而代之使用访客留言板,在这个界面里会让访客填写他的昵称和想对我说的话,并在界面上展示。我会通过发文章的形式回复这些留言。需要注意的一点是,这里访客属于匿名发帖,即使一个人也可以起很多昵称。但是同时也会记录访客的留言时间,访问ip地址等内容,所以安全还算有保障。且每次我更新和重新部署网站后,访客留言板数据库都会被清空。

此功能简称为访客留言页面前后端。

4.主要展示页面:主页面包括个人简介和sidebar目录栏,还有中间的照片展示墙和精品文章展示栏。个人简介和sidebar目录栏在这里面是最全面的,之后复制到其他前端页面上。和其他页面不同的地方就是中间的这些内容。照片展示墙用于之后一些单片机/app开源项目/精品文章的宣传(当然也会为了赏心悦目放上像现在主页这样的风景照,都是我自己拿无人机拍的)。

此功能简称为主要展示页面前后端。

博客网站基础设置

这个jdk关乎调试过程中java版本的打包部署,最好选择一样的版本。(不过java的向后兼容特性貌似很强大)

另外需要

  • Springboot (Spring Web)

  • Thymeleaf(模板引擎)

  • Spring Data JPA(数据库)

  • H2 Database(嵌入式数据库)

由此便能得到基础的java网站代码架构了

博客网站后端

文章相关的后端

文章分类,文章列表和文章详情都可以放在ArticleController类里完成

    @GetMapping({"","/"})//文章列表页public String articles(Model model) {try {Resource[] resources = resourceResolver.getResources("classpath:markdown/*.md");List<Article> articles = new ArrayList<>();long idCounter = 1;for (Resource res : resources) {String filename = res.getFilename(); // xxx.mdString[] parts = null;if (filename != null) {parts = filename.split("_", 2);}String category = null;if (parts != null) {category = parts[0];}String title = null;if (parts != null) {title = parts[1].replace(".md", "");}Article article = new Article();article.setId(idCounter++); // 用假的 ID,实际可用 hash 或 UUIDarticle.setTitle(title);article.setCategory(category);article.setContent(""); // 不在列表中显示内容articles.add(article);}// 保存到数据库model.addAttribute("articles", articles);} catch (IOException e) {model.addAttribute("error", "加载文章列表失败");}return "articles";}// 文章详情页(新增@PathVariable)@GetMapping("/{category}/{title}")public String articleDetails(@PathVariable String category, @PathVariable String title, Model model) throws IOException {String fullFilename = category + "_" + title + ".md";Resource resource = resourceResolver.getResource("classpath:markdown/" + fullFilename);if (!resource.exists()) {throw new ResponseStatusException(HttpStatus.NOT_FOUND, "文章不存在");}String content = IOUtils.toString(resource.getInputStream(), StandardCharsets.UTF_8);HtmlRenderer renderer = HtmlRenderer.builder().build();String htmlContent = renderer.render(Parser.builder().build().parse(content));Article article = new Article();article.setTitle(title);article.setCategory(category);article.setContent(htmlContent);model.addAttribute("article", article);return "article-details"; // 文章详情模板}//文章分类页@GetMapping("/category/{category}")public String articlesByCategory(@PathVariable String category, Model model) {try {Resource[] resources = resourceResolver.getResources("classpath:markdown/*.md");List<Article> articles = new ArrayList<>();long idCounter = 1;for (Resource res : resources) {String filename = res.getFilename(); // 例如:随笔_生活记录.mdif (filename != null && filename.contains("_")) {String[] parts = filename.split("_", 2);String fileCategory = parts[0];String title = parts[1].replace(".md", "");// 只保留匹配当前分类的文章if (fileCategory.equalsIgnoreCase(category)) {Article article = new Article();article.setId(idCounter++);article.setTitle(title);article.setCategory(fileCategory);article.setContent(""); // 列表页不显示内容articles.add(article);}}}model.addAttribute("articles", articles);model.addAttribute("category", category);} catch (IOException e) {model.addAttribute("error", "加载文章分类失败");}return "category-articles"; // templates/category-articles.html}

因为有文章分类的需求在,每次都需要读取标题或者显示分类,所以这里居然没有用到articleRepo,多次使用了直接读取markdown里文件的形式。

另外需要建立Article类和ArticleReopsitory接口

@Entity
public class Article {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(length = 100)private String title;@Lob // 适合存储长文本@Column(columnDefinition = "TEXT")private String content;private String category;// 必须添加无参构造器public Article() {}// 需要添加setter方法public void setId(Long id) {this.id = id;}public void setTitle(String title) {this.title = title;}public void setContent(String content) {this.content = content;}public void setCategory(String category) { this.category = category; }public String getTitle() {return title;}public String getContent() {return content;}public String getCategory() { return category; }
}public interface ArticleRepository extends JpaRepository<Article, Long> {
}

访客留言后端

对于这个功能,我建立了Observer类用于记录访客的nickname和message,同时记录此时的ip地址,发布评论的时间,评论数量等等信息,再通过前端显示已经记录的评论昵称和评论内容。

    @GetMapping("/guestbook")public String guestbook(Model model) {// 统计留言数量model.addAttribute("observerCount", observerRepo.count());model.addAttribute("messages", observerRepo.findAll());return "guestbook";}@PostMapping("/guestbook/add")public String submitMessage(@RequestParam String nickname,@RequestParam String message,HttpServletRequest request) {Observer observer = new Observer();observer.setObserveTime(LocalDateTime.now());observer.setNickname(nickname);observer.writeMessage(message); // 使用正确的setter方法observer.setIpAddress(request.getRemoteAddr()); // 添加IP记录observer.setMessage(true); // 设置留言标记observerRepo.save(observer);return "redirect:/guestbook";}

当然也需要建立相应的Observer类和ObserverRepository接口,具体可见我在github上开源的代码,网站效果的话可以点链接访问一下。

博客网站前端

这里我借鉴了一个github开源项目,并在他的基础上完成了一些改动:

https://github.com/ZengZhiK/AdminLTE-Blog

我删除了自己用不到的一些功能和相关的html页面,加入了照片墙,显示markdown转html后的文本,文章分类后显示目录等等,完成了自己代码前后端的适配。另外也按照自己的习惯改变了一下边栏页面,比较重要的代码如下:

照片墙功能

                <div id="simpleCarousel" class="carousel slide mb-3" data-ride="carousel"><div class="carousel-inner"><div class="carousel-item active"><img th:src="@{/img/wallpaper4.png}" class="d-block w-100" style="height: 550px; object-fit: cover;" alt="图片1"></div><div class="carousel-item"><img th:src="@{/img/wallpaper.jpg}" class="d-block w-100" style="height: 550px; object-fit: cover;" alt="图片2"></div><div class="carousel-item"><img th:src="@{/img/wallpaper7.png}" class="d-block w-100" style="height: 550px; object-fit: cover;" alt="图片3"></div></div><a class="carousel-control-prev" href="#simpleCarousel" role="button" data-slide="prev"><span class="carousel-control-prev-icon" aria-hidden="true"></span></a><a class="carousel-control-next" href="#simpleCarousel" role="button" data-slide="next"><span class="carousel-control-next-icon" aria-hidden="true"></span></a></div>

 显示文章详情

<div class="card-header"><h3 class="card-title">文章详情</h3></div><div class="card-body"><div class="markdown-body" th:utext="${article.content}"></div></div>

显示所有文章

<div class="card-header"><h3 class="card-title">所有文章</h3></div><div class="card-body"><div class="list-group"><a th:each="article : ${articles}"th:href="@{'/articles/' + ${article.category} + '/' + ${article.title}}"class="list-group-item list-group-item-action"><span th:text="${article.title}"></span></a></div><div th:if="${error}" class="alert alert-danger mt-3" th:text="${error}"></div></div>

显示分类后的文章

<div class="card"><div class="card-header"><h3 class="card-title">分类后的文章</h3></div><div class="card-body"><div class="list-group"><a th:each="article : ${articles}"th:href="@{'/articles/' + ${article.category} + '/' + ${article.title}}"class="list-group-item list-group-item-action"><span th:text="${article.title}"></span></a></div><div th:if="${error}" class="alert alert-danger mt-3" th:text="${error}"></div></div></div>

显示评论后的内容

<div class="direct-chat-messages"><div th:each="observer : ${messages}" class="direct-chat-msg"><div class="direct-chat-infos clearfix"><span class="direct-chat-name float-right" th:text="${observer.nickname}"></span><span class="direct-chat-timestamp float-right ml-2" th:text="${#temporals.format(observer.observeTime, 'yyyy-MM-dd HH:mm')}"></span></div><img class="direct-chat-img position-absolute broader" src="/upload/user.png" alt="头像"><div class="direct-chat-text float-right" th:text="${observer.message}"></div></div></div>

另外的一些配置

就是去配置pox.xml和application.properties,可以理解为pom.xml是中间件的配置文件,而application.properties是整个网站的配置文件,端口和数据库控制台都是在这里设置。

最终效果

网站的部署

在本地实验完,需要部署到服务器,外面才能访问的到。我这里使用了腾讯云的服务器,买个最便宜的就可以,系统我这里安装的是ubuntu 24.04。

有两种部署方式,第一种是docker容器化部署(这个容易遇到因为网络,无法拉取openjdk镜像的问题),第二种是直接部署。

docker容器化部署

在demo文件夹下新建一个dockerfile文件(试着用docker_compose.yml了,相比之下它更适合部署操作系统本身,网站这种dockerfile就很合适)

# 使用官方轻量 JDK 镜像
FROM openjdk:17-jdk-alpine# 创建工作目录
WORKDIR /app# 复制 jar 文件
COPY target/demo-0.0.1-SNAPSHOT.jar app.jar# 默认执行命令
ENTRYPOINT ["java", "-jar", "app.jar"]

在命令行内运行

./mvnw clean package  //构建jar包
//把demo文件夹用ftp方式传输到云服务器上,本机需要下载filezilla
//转到服务器平台上,在服务器平台安装docker后
sudo docker build -t my_website .   //对文件夹里的所有文件完成docker镜像构建,my_website是构建镜像的名字
docker run -d -p 8080:8080 --name java_web my_website
//这个项目springboot默认监听8080端口,docker容器名叫java_web

直接部署

这个非常简单:

./mvnw clean package
java -jar target/demo-0.0.1-SNAPSHOT.jar

输入域名/公网地址就可以访问网站

此时你会发现只能通过8080端口访问到网站,和大多数网站还不一样。为了能用默认的80端口访问到网站(也就是不输入端口号),需要改变application.properties或者配置nginx反向代理。

spring.application.name=demo
# ??H2???
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console# ??testdb??
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.jpa.hibernate.ddl-auto=update# Thymeleaf??
spring.thymeleaf.cache=false
spring.thymeleaf.prefix=classpath:/templates/# ????????
server.port=80
spring.jpa.properties.hibernate.retry_attempts=3
spring.jpa.properties.hibernate.retry_interval=1000//会提示权限不够,这个时候需要在demo命令行环境下
./mvnw clean package
java -jar target/demo-0.0.1-SNAPSHOT.jar

如果不想这么做,就要在服务器里安装nginx并修改配置文件

sudo apt update
sudo apt install nginx
sudo nano /etc/nginx/sites-available/default

找到这个配置并修改

server {listen 80;server_name yourdomain.com;location / {proxy_pass http://localhost:8080;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}location ~* \.(css|js|jpg|jpeg|png|gif|ico|woff|ttf|svg)$ {proxy_pass http://localhost:8080;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}

然后检查配置并重启nginx

sudo nginx -t     //检查配置是否有错
sudo systemctl restart nginx

现在就成功部署好网站了!

相关文章:

2025年,如何制作并部署一个完整的个人博客网站

欢迎访问我的个人博客网站&#xff1a;欢迎来到Turnin的个人博客 github开源地址&#xff1a;https://github.com/Re-restart/my_website 前言 2024年年初&#xff0c;从dji实习回来之后&#xff0c;我一直想着拓宽自己的知识边界。在那里我发现虽然大家不用java&#xff0c;…...

深度学习框架---TensorFlow概览

一、TensorFlow 概述 1. 发展历程 1.x 版本&#xff1a;基于静态图&#xff08;Graph&#xff09;和会话&#xff08;Session&#xff09;&#xff0c;需预先定义计算图&#xff0c;调试较复杂。2.x 版本&#xff1a;默认启用动态图&#xff08;Eager Execution&#xff09;&…...

鸿蒙OSUniApp制作自定义的下拉菜单组件(鸿蒙系统适配版)#三方框架 #Uniapp

UniApp制作自定义的下拉菜单组件&#xff08;鸿蒙系统适配版&#xff09; 前言 在移动应用开发中&#xff0c;下拉菜单是一个常见且实用的交互组件&#xff0c;它能在有限的屏幕空间内展示更多的选项。虽然各种UI框架都提供了下拉菜单组件&#xff0c;但在一些特定场景下&…...

扣子(Coze)案例:工作流生成小红书心理学卡片

大家好&#xff01;我是 Robin。专注于 AI 技术探索与实践&#xff0c;持续分享 Coze 智能体、Coze 模板&#xff0c;以及 Coze 工作流搭建案例。 工作流智能体作用&#xff1a; 输入需要生成小红书心理学知识卡片的数量&#xff0c;工作流自动批量生成图文。 首先演示一下生…...

深度理解用于多智能体强化学习的单调价值函数分解QMIX算法:基于python从零实现

引言&#xff1a;合作式多智能体强化学习与功劳分配 在合作式多智能体强化学习&#xff08;MARL&#xff09;中&#xff0c;多个智能体携手合作&#xff0c;共同达成一个目标&#xff0c;通常会收到一个团队共享的奖励。在这种场景下&#xff0c;一个关键的挑战就是功劳分配&a…...

C语言经典笔试题目分析(持续更新)

1. 描述下面代码中两个static 各自的含义 static void func (void) {static unsigned int i; }static void func(void) 中的 static 作用对象&#xff1a;函数 func。 含义&#xff1a; 限制函数的作用域&#xff08;链接属性&#xff09;&#xff0c;使其仅在当前源文件&…...

射击游戏demo11

完善地图&#xff0c;加载出装饰品&#xff0c;检测人员与地面的碰撞&#xff0c;检测子弹与岩壁的碰撞&#xff0c;检测手雷与地面的碰撞。 import pygame import sys import os import random import csv # 初始化Pygame pygame.init()# 屏幕宽度 SCREEN_WIDTH 1200 # 屏幕高…...

多智能体Multi-Agent应用实战与原理分析

一:Agent 与传统工具调用的对比 在当今的开发环境中,Agent 的出现极大地简化了工作流程。其底层主要基于提示词、模型和工具。用户只需向 Agent 输入需求,Agent 便会自动分析需求,并利用工具获取最终答案。而传统方式下,若没有 Agent,我们则需要手动编码来执行工具,还要…...

专项智能练习(定义判断)_DA_01

1. 单选题 热传导是介质内无宏观运动时的传热现象&#xff0c;其在固体、液体和气体中均可发生。但严格而言&#xff0c;只有在固体中才是纯粹的热传导&#xff0c;在流体&#xff08;泛指液体和气体&#xff09;中又是另外一种情况&#xff0c;流体即使处于静止状态&#xff0…...

关于NLP自然语言处理的简单总结

参考&#xff1a; 什么是自然语言处理&#xff1f;看这篇文章就够了&#xff01; - 知乎 (zhihu.com) 所谓自然语言理解&#xff0c;就是研究如何让机器能够理解我们人类的语言并给出一些回应。 自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff0…...

SLAM定位与地图构建

SLAM介绍 SLAM全称Simultaneous Localization And Mapping&#xff0c;中文名称同时定位与地图构建。旨在让移动设备在未知环境中同时完成以下两个任务&#xff08;定位需要地图&#xff0c;而建图又依赖定位信息&#xff0c;两者互为依赖&#xff09;&#xff1a; 定位&#…...

REST架构风格介绍

一.REST&#xff08;表述性状态转移&#xff09; 1.定义 REST&#xff08;Representational State Transfer&#xff09;是由 Roy Fielding 在 2000 年提出的一种软件架构风格&#xff0c;用于设计网络应用的通信模式。它基于 HTTP 协议&#xff0c;强调通过统一的接口&#…...

前端流行框架Vue3教程:16. 组件事件配合`v-model`使用

组件事件配合v-model使用 如果是用户输入&#xff0c;我们希望在获取数据的同时发送数据配合v-model 来使用&#xff0c;帮助理解组件间的通信和数据绑定。 &#x1f9e9; 第一步&#xff1a;创建子组件&#xff08;SearchComponent.vue&#xff09; 这个组件用于处理用户的搜…...

5月15日day26打卡

函数专题1 知识点回顾&#xff1a; 函数的定义变量作用域&#xff1a;局部变量和全局变量函数的参数类型&#xff1a;位置参数、默认参数、不定参数传递参数的手段&#xff1a;关键词参数传递参数的顺序&#xff1a;同时出现三种参数类型时 作业&#xff1a; 题目1&#xff1a;…...

Java中的深拷贝与浅拷贝

什么是拷贝 在Java中&#xff0c;拷贝是指创建一个对象的副本。拷贝主要分为两种类型&#xff1a;浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。理解这两种拷贝的区别对于编写正确的Java程序非常重要&#xff0c;特别是在处理对象引用时。 浅拷贝(Shallow Copy) 浅拷贝是指创建…...

springboot AOP中,通过解析SpEL 表达式动态获取参数值

切面注解 import com.bn.document.constants.FmDeptCatalogueConstants;import java.lang.annotation.*;Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface FmDeptCatalogueAopAnnotation {/*** 权限类型*/FmDeptCatalogueConstants value();/…...

【论信息系统项目的合同管理】

论信息系统项目的合同管理 论文要求写作要点正文前言一、合同的签订管理二、合同履行管理三、合同变更管理四、合同档案管理五、合同违约索赔管理结语 论文要求 项目合同管理通过对项目合同的全生命周期进行管理&#xff0c;来回避和减轻可识别的项目风险。 请以“论信息系统项…...

redis持久化方式

一、RDB redis database&#xff1a;快照&#xff0c;某一时刻将内存中的数据&#xff0c;写入磁盘中生成1个dump.rdb文件RDB的触发方式&#xff1a; 手动触发&#xff1a;save&#xff08;阻塞主进程&#xff0c;阻塞其它指令&#xff0c;保证数据一致性&#xff09;、bgsave…...

free void* 指令

https://stackoverflow.com/questions/2182103/is-it-ok-to-free-void free(ptr) 仅释放指针指向的内存&#xff0c;不会修改指针变量本身的值。调用后&#xff0c;ptr 仍然指向原来的地址&#xff08;称为 "悬空指针"&#xff09;&#xff0c;但该地址对应的内存已…...

ADS1220高精度ADC(TI)——应用 源码

文章目录 德州仪器ADS1220概述资料引脚&封装布线寄存器配置寄存器0&#xff08;00h&#xff09;配置寄存器1&#xff08;01h&#xff09;配置寄存器2&#xff08;02h&#xff09;配置寄存器3&#xff08;03h&#xff09; 连续转换流程驱动源码ads1220.cads1220.h 德州仪器A…...

mysql-Java手写分布式事物提交流程

准备 innodb存储引擎开启支持分布式事务 set global innodb_support_axon分布式的流程 详细流程&#xff1a; XA START ‘a’; 作用&#xff1a;开始一个新的XA事务&#xff0c;并分配一个唯一的事务ID ‘a’。 说明&#xff1a;在这个命令之后&#xff0c;所有后续的SQL操…...

红黑树:数据世界的平衡守护者

在 C 算法的神秘森林里&#xff0c;红黑树是一棵充满智慧的 “魔法树”。它既不像普通二叉搜索树那样容易失衡&#xff0c;也不像 AVL 树对平衡要求那么苛刻。作为 C 算法小白&#xff0c;今天就和大家一起深入探索红黑树的奥秘&#xff0c;看看它是如何成为数据世界的平衡守护…...

哈夫曼树完全解析:从原理到应用

目录 一、核心概念 二、构造全流程解析 三、编码生成机制 四、C语言实现关键代码 五、核心特性深度解读 六、现代应用场景 七、压缩实战演示 一、核心概念 哈夫曼树&#xff08;最优二叉树&#xff09;是带权路径长度&#xff08;WPL&#xff09;最短的树形结构&#x…...

如何在 Windows 命令提示符中创建多个文件夹和多个文件

如何在 Windows 命令提示符中创建多个文件夹和多个文件 虽然大多数用户习惯使用 Windows 图形界面来创建文件夹&#xff0c;但如果你需要一次性创建多个文件夹或文件&#xff0c;如同在类Unix系统中可以使用mkdir和touch命令一样&#xff0c;windows下也有创建目录和文件的对应…...

【Java】Spring的声明事务在多线程场景中失效问题。

大家都知道Spring的声明式事务在多线程当中会失效&#xff0c;来看一下如下案例。 按照如下方式&#xff0c;b()方法抛出异常,由于父子线程导致事务失效&#xff0c;a()会成功插入,但是b()不会。 因此成功插入一条数据&#xff0c;事务失效。 Component public class UserServ…...

多平台图标设计与管理的终极解决方案

IconWorkshop Pro 是一款由Axialis团队开发的专业图标设计与制作软件&#xff0c;专注于为设计师、开发者及企业用户提供高效且灵活的图标创作解决方案。该软件凭借其强大的功能与跨平台适配性&#xff0c;成为Windows、macOS、iOS、Android等多系统图标设计的首选工具之一。 …...

【搭建Node-RED + MQTT Broker实现AI大模型交互】

搭建Node-RED MQTT Broker实现AI大模型交互 搭建Node-RED MQTT Broker实现AI大模型交互一、系统架构二、环境准备与安装1. 安装Node.js2. 安装Mosquitto MQTT Broker3. 配置Mosquitto4. 安装Node-RED5. 配置Node-RED监听所有网络接口6. 启动Node-RED 三、Node-RED流程配置1. …...

小结: js 在浏览器执行原理

浏览器多进程与多线程 现代浏览器的标签环境隔离主要通过多进程架构和多线程机制实现&#xff0c;以确保安全、性能和稳定性。以下是浏览器实现标签环境隔离的多进程和多线程交互架构的详细解析&#xff1a; ------------------- ------------------- -----------…...

C++核心编程--2 引用

引用就是给变量起别名&#xff0c;操作引用就等于操作原始变量。 2.1 引用基本用法 int var 10; int & r_var var; 2.2 注意事项 声明时必须初始化不允许更改引用指向的原始变量 2.3 引用作为函数参数传递 简化指针修饰函数参数 2.4 引用作为函数返回值 不要返回…...

音频/AI/BLE/WIFI/玩具/商业等方向的论坛网站总结

我爱音频网 我爱音频网 - 我们只谈音频&#xff0c;丰富的TWS真无线蓝牙耳机拆解报告 (52audio.com) 中国人工智能学会 中国人工智能学会 (caai.cn) AIIA人工智能网 https://www.aiiaw.com/ 世界人工智能论坛 世界人工智能论坛 - (amtbbs.org) 36氪 36氪_让一部分人先…...

告别碎片化!MCP 带来 AI Agent 开发生态的革命性突破

引言&#xff1a; 在当今的智能客服系统开发中&#xff0c;开发者常常面临一个棘手的挑战&#xff1a;需要整合用户的 CRM 数据、知识库和实时聊天记录。然而&#xff0c;由于缺乏统一的标准&#xff0c;每个团队都不得不手动实现这些集成。这不仅延长了开发周期&#xff0c;还…...

centos7部署mysql5.7

1.下载mysql的官方yum源 wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm2.安装yum源 yum -y install mysql57-community-release-el7-11.noarch.rpm3.安装秘钥文件 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-20224.安装mysql5.7…...

linux dbus

Linux D-Bus(Desktop Bus)是一种进程间通信(IPC)机制,主要用于Linux桌面环境和系统服务之间的消息传递。它允许不同的应用程序或系统组件以高效、安全的方式相互通信,是现代Linux桌面(如GNOME、KDE)的核心基础设施之一。 1. D-Bus 的核心概念 消息总线(Message Bus):…...

计量——异方差的检验及其修正

目录 1.异方差的检验 1 BP检验 2white检验 2.异方差的修正 1.异方差的检验 1 BP检验 选择检验方法&#xff1a;BP BP检验的实际步骤&#xff08;非机器&#xff09;&#xff1a; 1.y对所有x进行回归&#xff0c;得到残差u。计算残差的平方u^2 2.u^2对所有x进行回归&#…...

操作系统学习笔记第3章 内存管理(灰灰题库)

1. 单选题 某页式存储管理系统中&#xff0c;主存为 128KB&#xff0c;分成 32 块&#xff0c;块号为 0、1、2、3、…、31。某作业有 5 块&#xff0c;其页号为 0、1、2、3、4&#xff0c;被分别装入主存的 3、8、4、6、9 块中。有一逻辑地址为 [3, 70]&#xff08;其中方括号中…...

vue3项目中使用CanvasEditor开箱即用(组件的形式,组件封装好了)

canvas-editor-vue 这是canvas-editor项目的vue版本,我封装成组建了,当然了这是个已经把canvas-editor封装好的的Vue项目 项目地址GitHub地址:GitHub - aini-aini/canvas-editor-vue: this is a project than can be used in vue project as Componentthis is a project than…...

人体肢体工作识别-一步几个脚印从头设计数字生命——仙盟创梦IDE

人体肢体识别是借助计算机视觉、传感器等技术&#xff0c;对人体各肢体的位置、动作、姿态等进行检测与分析的技术。其在医疗健康、智能交互、运动训练、安全监控等多个领域具有重要价值&#xff0c; 示例代码 import cv2 import mediapipe as mp import numpy as np import c…...

【重磅】配电网智能软开关和储能联合规划

目录 1 主要内容 目标函数 数据说明 节点系统图 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现《具有源荷不平衡特性的配电网智能软开关和储能联合规划》部分模型&#xff0c;未考虑聚类分析和分布鲁棒部分&#xff0c;就智能软开关和储能联合规划部分进行了…...

实验6 电子邮件

实验6 电子邮件 1、实验目的 理解电子邮件系统基本结构 理解客户端和服务器端&#xff0c;以及服务器之间的通信 分析理解SMTP&#xff0c;POP3协议 2、实验环境 硬件要求&#xff1a;阿里云云主机ECS 一台。 软件要求&#xff1a;Linux/ Windows 操作系统 3、实验内容…...

NHANES指标推荐:OBS

文章题目&#xff1a;Association between oxidative balance score and all-cause and cancer-specific mortality among cancer survivors DOI&#xff1a;10.3389/fimmu.2025.1541675 中文标题&#xff1a;癌症幸存者氧化平衡评分与全因死亡率和癌症特异性死亡率之间的关联 …...

python-修改图片背景色

在Python中&#xff0c;可以使用图像处理库&#xff08;如OpenCV或Pillow&#xff09;来修改图片的背景色。通常&#xff0c;修改背景色的流程包括以下步骤&#xff1a; 1、对图片进行分割&#xff0c;识别前景和背景。 2、对背景区域进行颜色替换。 下面是两种实现方法&#x…...

数据结构与算法--顺序表--单链表

一 顺序表 需要指向存储位置的基地址分配一段连续的内存用length记录实际的元素的个数&#xff0c;也即顺序表的长度&#xff0c;因为顺序表是允许删除和插入元素的不需要定义数组 1.1 普通结构体数组实现版本&#xff0c;实现白色的点以一定的步长移除画面&#xff0c;大量fo…...

MATLAB安装全攻略:常见问题与解决方案

MATLAB安装常见问题与解决方案 一、系统兼容性验证 安装前需确认操作系统满足MATLAB版本要求&#xff1a; Windows 10版本1903及以上&#xff08;64位&#xff09;macOS Monterey 12.6及以上Ubuntu 22.04 LTS及以上 验证命令示例&#xff1a; # Linux系统验证 lsb_release…...

constexpr 关键字的意义(入门)

author: hjjdebug date: 2025年 05月 15日 星期四 16:03:33 CST description: constexpr 关键字的意义(入门) constexpr 是c11 引入的一个关键字, 代表了一种属性. 文章目录 1. constexpr 修饰的变量, 在编译期间就可以得到其数值.2. constexpr 修饰的函数, 可以在编译期间被调…...

aptitude 深度教程:从基础到生产实践

目录 一、aptitude 基础:核心概念与环境准备 1.1 aptitude 是什么? 1.2 安装与环境配置 二、aptitude 核心操作:从命令行到交互式界面 2.1 命令行基础操作 2.2 交互式界面(TUI)入门 三、高级功能:依赖管理与版本控制 3.1 依赖冲突解决实战 3.2 版本锁定与降级 3…...

嵌入式开发学习日志(数据结构--双链表)Day21

一、双链表 1.定义 双向链表是在单链表的每个结点中&#xff0c;再设置一个指向其钱去节点的指针域。 2、声明文件 3、创建表头 4、头插 5、 遍历 6、尾插、 7、指定插 8、查找 9、修改 10.、删除 11、逆序 12、销毁链表 13、main.c 三、扩展&#xff1a;工程管理工具&#…...

抢购Python代码示例与技术解析

引言&#xff1a;抢购系统的技术挑战 在当今电子商务高度发达的时代&#xff0c;抢购活动已成为各大电商平台吸引用户的重要手段。然而&#xff0c;高并发、低延迟的抢购场景对系统设计提出了严峻挑战。本文将提供一个完整的Python抢购代码示例&#xff0c;并深入分析其技术实…...

undefined reference to CPUAllocatorSingleton::instance

它发生的原因是你声明了 CPUAllocatorSingleton 类中的 instance 变量&#xff0c;但没有提供它的定义。 这个错误是链接器无法找到 CPUAllocatorSingleton::instance 的定义。它发生的原因是你声明了 CPUAllocatorSingleton 类中的 instance 变量&#xff0c;但没有提供它的定…...

【c语言】动态内存分配

文章标题 一、为什么要进行动态内存管理二、malloc和free2.1. malloc2.2. free2.3. 举例 三、calloc和realloc3.1. calloc3.2. realloc 四、常见的动态内存错误4.1. 对NULL指针的解引用操作4.2. 对动态开辟空间的越界访问4.3. 对非动态开辟内存使用free释放4.4. 使用free释放⼀…...

深入理解JavaScript中的闭包:原理、应用与常见问题

引言 闭包(Closure)是JavaScript中一个既强大又容易让人困惑的概念。理解闭包对于成为一名优秀的JavaScript开发者至关重要。本文将深入探讨闭包的工作原理、实际应用场景以及常见问题&#xff0c;帮助你彻底掌握这一重要概念。 什么是闭包&#xff1f; 闭包是指那些能够访问…...