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

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;…...

.NET 8 + Angular WebSocket 高并发性能优化

.NET 8 Angular WebSocket 高并发性能优化。 .NET 8 WebSocket 高并发性能优化 WebSocket 是一种全双工通信协议&#xff0c;允许客户端和服务端之间保持持久连接。在高并发场景下&#xff0c;优化 WebSocket 的性能至关重要。以下是针对 .NET 8 中 WebSocket 高并发性能优化…...

腾讯云运营开发 golang一面

redis为什么单线程会快 每秒10w吞吐量 io多路复用 一个文件描述符整体拷贝&#xff1b;调用epoll_ctl 单个传递 内核遍历文件描述符判断是否有事件发送&#xff1b;回调函数列表维护 修改有事件发送的socket为可读或可写&#xff0c;返回整个文件描述符&#xff1b;返回链…...

一个简单的静态页面

这个页面采用了现代化的 UI 设计&#xff0c;包括卡片式布局、微交互动画、分层设计和响应式结构。页面结构清晰&#xff0c;包含导航栏、英雄区域、功能介绍、产品特性、用户评价和联系表单等完整组件&#xff0c;可作为企业官网或产品介绍页面的基础模板。 登录后复制 <!D…...

使用 163 邮箱实现 Spring Boot 邮箱验证码登录

使用 163 邮箱实现 Spring Boot 邮箱验证码登录 本文将详细介绍如何使用网易 163 邮箱作为 SMTP 邮件服务器&#xff0c;实现 Spring Boot 项目中的邮件验证码发送功能&#xff0c;并解决常见配置报错问题。 一、为什么需要邮箱授权码&#xff1f; 出于安全考虑&#xff0c;大…...

多模态大语言模型arxiv论文略读(六十八)

Image-of-Thought Prompting for Visual Reasoning Refinement in Multimodal Large Language Models ➡️ 论文标题&#xff1a;Image-of-Thought Prompting for Visual Reasoning Refinement in Multimodal Large Language Models ➡️ 论文作者&#xff1a;Qiji Zhou, Ruoc…...

APS「多目标平衡算法」如何破解效率与弹性的永恒博弈

APS&#xff08;高级计划与排程&#xff09;系统作为企业智能制造的核心引擎&#xff0c;通过整合需求预测、产能规划、生产调度、物料管理及数据分析等模块&#xff0c;构建了覆盖产品全生产流程的“感知-决策-执行-优化”闭环体系。 精准需求预测 APS系统通过构建需求特征数…...

网张实验操作-防火墙+NAT

实验目的 了解防火墙&#xff08;ENSP中的USG5500&#xff09;域间转发策略配置、NAT&#xff08;与路由器NAT配置命令不同&#xff09;配置。 网络拓扑 两个防火墙连接分别连接一个内网&#xff0c;中间通过路由器连接。配置NAT之后&#xff0c;内网PC可以ping公网&#xf…...

Spring 中常见的属性注入方式(XML配置文件)

在 Spring 中,XML 配置属性注入。 以下是几种常见的属性注入方式及其对应的简单示例代码。 1. 构造器注入 构造器注入是指通过类的构造函数来设置依赖项。 示例类: public class MyService {private final MyRepository myRepository;public MyService(MyRepository myRe…...

让 - 艾里克・德布尔与斯普林格出版公司:科技变革下的出版业探索

在数字化浪潮席卷全球的当下&#xff0c;传统出版行业面临着前所未有的挑战与机遇。《对话 CTO&#xff0c;驾驭高科技浪潮》的第 10 章聚焦于让 - 艾里克・德布尔&#xff08;Jean - Eric Debeure&#xff09;及其所在的斯普林格出版公司&#xff08;Springer Publishing Comp…...

【技巧】离线安装docker镜像的方法

回到目录 【技巧】离线安装docker镜像的方法 0. 为什么需要离线安装&#xff1f; 第一、 由于docker hub被墙&#xff0c;所以 拉取镜像需要配置国内镜像源 第二、有一些特殊行业服务器无法接入互联网&#xff0c;需要手工安装镜像 1. 可以正常拉取镜像服务器操作 服务器…...

05 web 自动化之 selenium 下拉鼠标键盘文件上传

文章目录 一、下拉框操作二、键盘操作三、鼠标操作四、日期控件五、滚动条操作六、文件上传七、定位windows窗口及窗口的元素总结&#xff1a;页面及元素常用操作 一、下拉框操作 from selenium.webdriver.support.select import Select import time from selenium.webdriver.…...

《Python星球日记》 第73天:情感分析与主题建模

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、情感分析基础1. 情感分析的应用场景2. 基于规则的方法3. 基于深度学习的方法3.1 使用LSTM进行情感分析3.2 基于BERT的情感分析二、主题建模…...

数学复习笔记 10

前言 我觉得数学的高分乃至满分属于那些&#xff0c;聪明&#xff0c;坚韧&#xff0c;勇敢&#xff0c;细致的人。我非常惭愧自己不是这样的人&#xff0c;我在生活中发现了这样的同学&#xff0c;和他们交流的时候我常常感到汗流浃背&#xff0c;因为他们非常扎实的基础知识…...

07 web 自动化之 Unittest 应用:测试报告装饰器断言

文章目录 一、常见的第三方库结合 unittest 生产 html 格式测试报告1、HtmlTestRunner2、BeatifulReport 二、装饰器 unittest.skip 强制跳过&条件跳过三、unittest的常用断言方法 一、常见的第三方库结合 unittest 生产 html 格式测试报告 1、HtmlTestRunner 官网下载 …...

Spring Cloud探索之旅:从零搭建微服务雏形 (Eureka, LoadBalancer 与 OpenFeign实战)

引言 大家好&#xff01;近期&#xff0c;我踏上了一段深入学习Spring Cloud构建微服务应用的旅程。我从项目初始化开始&#xff0c;逐步搭建了一个具备服务注册与发现、客户端负载均衡以及声明式服务调用功能的基础微服务系统。本文旨在记录这一阶段的核心学习内容与实践成果…...

9.2.高并发系统

目录 一、高并发系统设计原则 核心设计哲学 • CAP权衡&#xff1a;一致性、可用性、分区容错性的场景化选择 • BASE理论&#xff1a;最终一致性与柔性事务的落地策略 性能与扩展性准则 • 水平扩展 vs 垂直扩展&#xff1a;无状态服务与有状态服务的扩展策略 • 异步化设计…...

Apollo学习——planning模块(3)之planning_base

planning_component、planning_base、on_lane_planning 和 navi_planning 的关系 1. 模块关系总览 继承层次 PlanningComponent&#xff1a;Cyber RT 框架中的 入口组件&#xff0c;负责调度规划模块的输入输出和管理生命周期。PlanningBase&#xff1a;规划算法的 抽象基类&…...

当 AI 邂逅丝路:揭秘「丝路智旅」,用 RAG 重塑中阿文化旅游体验

目录 系统命名:丝路智旅 (Silk Road Intelligent Travel)系统概述系统架构设计系统功能模块技术选型:为何是它们?系统优势与特点未来展望与扩展总结在数字浪潮席卷全球的今天,古老的丝绸之路正在以一种全新的方式焕发生机。当深厚的文化底蕴遇上尖端的人工智能技术,会碰撞…...

18.Excel数据透视表:第1部分创建数据透视表

一 什么是数据透视表 通过万花筒可以用不同的方式査看里面画面图像&#xff0c;在excel中可以将数据透视表看作是对准数据的万花筒&#xff0c;用不同角度去观察数据&#xff0c;也可以旋转数据&#xff0c;对数据进行重新排列&#xff0c;对大量的数据可以快速的汇总和建立交叉…...

CSS AI 通义灵码 VSCode插件安装与功能详解

简介 在前端开发领域&#xff0c;页面调试一直是个繁琐的过程&#xff0c;而传统开发中美工与前端的对接也常常出现问题。如今&#xff0c;阿里云技术团队推出的通义灵码智能编码助手&#xff0c;为前端开发者带来了新的解决方案&#xff0c;让开发者可以像指挥者一样&#xf…...

每日c/c++题 备战蓝桥杯(P1002 [NOIP 2002 普及组] 过河卒)

洛谷P1002 [NOIP 2002 普及组] 过河卒 题解 题目描述 过河卒是一道经典的动态规划题目。题目大意是&#xff1a;一个卒子从棋盘左上角(0,0)出发&#xff0c;要走到右下角(n,m)&#xff0c;棋盘上有一个马在(x,y)位置&#xff0c;卒子不能经过马所在位置及其周围8个位置。求卒…...

【Linux网络】TCP全连接队列

TCP 相关实验 理解 listen 的第二个参数 基于刚才封装的 TcpSocket 实现以下测试代码对于服务器, listen 的第二个参数设置为 1, 并且不调用 accept测试代码链接 test_server.cc #include "tcp_socket.hpp"int main(int argc, char* argv[]) {if (argc ! 3) {pri…...

HTML 颜色全解析:从命名规则到 RGBA/HSL 值,附透明度设置与场景应用指南

一、HTML 颜色系统详解 HTML 中的颜色可以通过多种方式定义&#xff0c;包括颜色名称、RGB 值、十六进制值、HSL 值等&#xff0c;同时支持透明度调整。以下是详细分类及应用场景&#xff1a; 1. 颜色名称&#xff08;预定义关键字&#xff09; HTML 预定义了 140 个标准颜色名…...

蓝桥杯12届国B 完全日期

题目描述。 如果一个日期中年月日的各位数字之和是完全平方数&#xff0c;则称为一个完全日期。 例如&#xff1a;2021 年 6 月 5 日的各位数字之和为 20216516&#xff0c;而 16 是一个完全平方数&#xff0c;它是 4 的平方。所以 2021 年 6 月 5 日是一个完全日期。 例如&…...

深度剖析多模态大模型中的视频编码器算法

写在前面 随着多模态大型语言模型(MLLM)的兴起,AI 理解世界的能力从静态的文本和图像,进一步拓展到了动态的、包含丰富时空信息的视频。视频作为一种承载了动作、交互、场景变化和声音(虽然本文主要聚焦视觉部分)的复杂数据形式,为 MLLM 提供了理解真实世界动态和因果关…...

游戏引擎学习第282天:Z轴移动与摄像机运动

运行游戏&#xff0c;展示目前进展 我们目前正在进行一个游戏开发项目。昨天&#xff0c;我们实现了基于房间的角色移动系统&#xff0c;并且加入了摄像机的跟随滚动功能。这是我们首次进入“游戏逻辑设计”阶段&#xff0c;也就是说&#xff0c;我们开始构建游戏本身的行为和…...

C++中的std::allocator

C中的std::allocator 文章目录 C中的std::allocator1.std::allocator1.1C中的placement new 和operator new1.2一个custom allocator的实现1.3使用std::allocator_traits实现allocator 1.std::allocator C中的std::allocator默默工作在CSTL中的所有容器的内存分配上&#xff0…...

Git/GitLab日常使用的命令指南来了!

在 GitLab 中拉取并合并代码的常见流程是通过 Git 命令来完成的。以下是一个标准的 Git 工作流&#xff0c;适用于从远程仓库&#xff08;如 GitLab&#xff09;拉取代码、切换分支、合并更新等操作。 &#x1f310; 一、基础命令&#xff1a;拉取最新代码 # 拉取远程仓库的所…...

aws 实践创建policy + Role

今天Cyber 通过image 来创建EC2 的时候,要添加policy, 虽然是administrator 的role, 参考Cyber 提供的link: Imageshttps://docs.cyberark.com/pam-self-hosted/14.2/en/content/pas%20cloud/images.htm#Bring 1 Step1:...