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

全栈项目实战:Vue3+Node.js开发博客系统

全栈项目实战:Vue3+Node.js开发博客系统

一、项目架构设计

1. 技术栈选型

前端技术栈

  • Vue 3 + Composition API
  • TypeScript
  • Pinia状态管理
  • Vue Router 4
  • Element Plus UI组件库
  • Vite构建工具

后端技术栈

  • Node.js (Express/Koa)
  • MongoDB (Mongoose)
  • JWT认证
  • RESTful API设计
  • Swagger文档

2. 目录结构规划

blog-system/
├── client/                # 前端项目
│   ├── public/            # 静态资源
│   ├── src/
│   │   ├── api/           # API请求封装
│   │   ├── assets/        # 静态资源
│   │   ├── components/    # 公共组件
│   │   ├── composables/   # 自定义Hook
│   │   ├── router/        # 路由配置
│   │   ├── stores/        # Pinia状态
│   │   ├── styles/        # 全局样式
│   │   ├── utils/         # 工具函数
│   │   ├── views/         # 页面组件
│   │   ├── App.vue        # 根组件
│   │   └── main.ts        # 入口文件
│   ├── tsconfig.json      # TypeScript配置
│   └── vite.config.ts     # Vite配置
│
├── server/                # 后端项目
│   ├── config/            # 配置文件
│   ├── controllers/       # 控制器
│   ├── models/            # 数据模型
│   ├── middleware/        # 中间件
│   ├── routes/            # 路由定义
│   ├── utils/             # 工具函数
│   ├── app.js             # 应用入口
│   └── package.json
│
├── docs/                  # 项目文档
└── package.json           # 全局脚本

二、后端API开发

1. Express应用初始化

// server/app.js
const express = require('express')
const mongoose = require('mongoose')
const cors = require('cors')
const helmet = require('helmet')
const morgan = require('morgan')
const { errorHandler } = require('./middleware/error')const app = express()// 中间件
app.use(cors())
app.use(helmet())
app.use(morgan('dev'))
app.use(express.json())// 数据库连接
mongoose.connect(process.env.MONGODB_URI, {useNewUrlParser: true,useUnifiedTopology: true
})
.then(() => console.log('MongoDB connected'))
.catch(err => console.error(err))// 路由
app.use('/api/auth', require('./routes/auth'))
app.use('/api/users', require('./routes/users'))
app.use('/api/posts', require('./routes/posts'))
app.use('/api/comments', require('./routes/comments'))// 错误处理
app.use(errorHandler)const PORT = process.env.PORT || 5000
app.listen(PORT, () => console.log(`Server running on port ${PORT}`))

2. 数据模型设计

// server/models/Post.js
const mongoose = require('mongoose')
const slugify = require('slugify')const PostSchema = new mongoose.Schema({title: {type: String,required: [true, 'Please add a title'],trim: true,maxlength: [100, 'Title cannot be more than 100 characters']},slug: String,content: {type: String,required: [true, 'Please add content'],maxlength: [5000, 'Content cannot be more than 5000 characters']},excerpt: {type: String,maxlength: [300, 'Excerpt cannot be more than 300 characters']},coverImage: {type: String,default: 'no-photo.jpg'},tags: {type: [String],required: true,enum: ['technology','programming','design','business','lifestyle']},author: {type: mongoose.Schema.ObjectId,ref: 'User',required: true},status: {type: String,enum: ['draft', 'published'],default: 'draft'},createdAt: {type: Date,default: Date.now},updatedAt: Date
}, {toJSON: { virtuals: true },toObject: { virtuals: true }
})// 创建文章slug
PostSchema.pre('save', function(next) {this.slug = slugify(this.title, { lower: true })next()
})// 反向填充评论
PostSchema.virtual('comments', {ref: 'Comment',localField: '_id',foreignField: 'post',justOne: false
})module.exports = mongoose.model('Post', PostSchema)

3. RESTful API实现

// server/controllers/posts.js
const Post = require('../models/Post')
const ErrorResponse = require('../utils/errorResponse')
const asyncHandler = require('../middleware/async')// @desc    获取所有文章
// @route   GET /api/posts
// @access  Public
exports.getPosts = asyncHandler(async (req, res, next) => {res.status(200).json(res.advancedResults)
})// @desc    获取单篇文章
// @route   GET /api/posts/:id
// @access  Public
exports.getPost = asyncHandler(async (req, res, next) => {const post = await Post.findById(req.params.id).populate({path: 'author',select: 'name avatar'}).populate('comments')if (!post) {return next(new ErrorResponse(`Resource not found with id of ${req.params.id}`, 404))}res.status(200).json({ success: true, data: post })
})// @desc    创建文章
// @route   POST /api/posts
// @access  Private
exports.createPost = asyncHandler(async (req, res, next) => {// 添加作者req.body.author = req.user.idconst post = await Post.create(req.body)res.status(201).json({ success: true, data: post })
})// @desc    更新文章
// @route   PUT /api/posts/:id
// @access  Private
exports.updatePost = asyncHandler(async (req, res, next) => {let post = await Post.findById(req.params.id)if (!post) {return next(new ErrorResponse(`Resource not found with id of ${req.params.id}`, 404))}// 验证文章所有者或管理员if (post.author.toString() !== req.user.id && req.user.role !== 'admin') {return next(new ErrorResponse(`User ${req.user.id} is not authorized to update this post`, 401))}post = await Post.findByIdAndUpdate(req.params.id, req.body, {new: true,runValidators: true})res.status(200).json({ success: true, data: post })
})// @desc    删除文章
// @route   DELETE /api/posts/:id
// @access  Private
exports.deletePost = asyncHandler(async (req, res, next) => {const post = await Post.findById(req.params.id)if (!post) {return next(new ErrorResponse(`Resource not found with id of ${req.params.id}`, 404))}// 验证文章所有者或管理员if (post.author.toString() !== req.user.id && req.user.role !== 'admin') {return next(new ErrorResponse(`User ${req.user.id} is not authorized to delete this post`, 401))}await post.remove()res.status(200).json({ success: true, data: {} })
})

三、前端Vue3实现

1. 前端工程初始化

npm init vite@latest client --template vue-ts
cd client
npm install pinia vue-router axios element-plus @element-plus/icons-vue

2. 状态管理设计

// client/src/stores/auth.ts
import { defineStore } from 'pinia'
import { ref } from 'vue'
import { login, logout, getMe } from '@/api/auth'
import type { User } from '@/types'export const useAuthStore = defineStore('auth', () => {const user = ref<User | null>(null)const token = ref(localStorage.getItem('token') || '')const isAuthenticated = ref(false)async function loginUser(credentials: { email: string; password: string }) {const response = await login(credentials)token.value = response.tokenlocalStorage.setItem('token', token.value)await fetchUser()}async function fetchUser() {try {user.value = await getMe()isAuthenticated.value = true} catch (error) {logoutUser()}}function logoutUser() {logout()user.value = nulltoken.value = ''isAuthenticated.value = falselocalStorage.removeItem('token')}return { user, token, isAuthenticated, loginUser, logoutUser, fetchUser }
})

3. 博客首页实现

<!-- client/src/views/HomeView.vue -->
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { usePostStore } from '@/stores/post'
import PostList from '@/components/PostList.vue'
import PostFilter from '@/components/PostFilter.vue'const postStore = usePostStore()
const isLoading = ref(false)
const error = ref<string | null>(null)const fetchPosts = async () => {try {isLoading.value = trueerror.value = nullawait postStore.fetchPosts()} catch (err) {error.value = err.message || 'Failed to fetch posts'} finally {isLoading.value = false}
}onMounted(() => {if (postStore.posts.length === 0) {fetchPosts()}
})
</script><template><div class="home"><el-container><el-main><el-row :gutter="20"><el-col :md="16" :sm="24"><post-filter @filter-change="fetchPosts" /><div v-if="isLoading" class="loading-spinner"><el-skeleton :rows="5" animated /></div><template v-else><post-list v-if="postStore.posts.length > 0":posts="postStore.posts"/><el-empty v-else description="No posts found" /></template></el-col><el-col :md="8" :sm="24"><div class="sidebar"><el-card><template #header><h3>Popular Tags</h3></template><el-tag v-for="tag in postStore.tags" :key="tag" size="large"@click="postStore.setCurrentTag(tag)">{{ tag }}</el-tag></el-card></div></el-col></el-row></el-main></el-container></div>
</template><style scoped>
.home {max-width: 1200px;margin: 0 auto;padding: 20px;
}.sidebar {position: sticky;top: 20px;
}.el-tag {margin: 5px;cursor: pointer;
}.loading-spinner {padding: 20px;
}
</style>

4. Markdown编辑器集成

<!-- client/src/components/Editor/MarkdownEditor.vue -->
<script setup lang="ts">
import { ref, watch, onMounted } from 'vue'
import VMdEditor from '@kangc/v-md-editor'
import '@kangc/v-md-editor/lib/style/base-editor.css'
import githubTheme from '@kangc/v-md-editor/lib/theme/github.js'
import '@kangc/v-md-editor/lib/theme/style/github.css'// 引入所有你需要的插件
import hljs from 'highlight.js'
import createEmojiPlugin from '@kangc/v-md-editor/lib/plugins/emoji/index'
import '@kangc/v-md-editor/lib/plugins/emoji/emoji.css'VMdEditor.use(githubTheme, {Hljs: hljs,
})
VMdEditor.use(createEmojiPlugin())const props = defineProps({modelValue: {type: String,default: ''}
})const emit = defineEmits(['update:modelValue'])const content = ref(props.modelValue)watch(() => props.modelValue, (newVal) => {if (newVal !== content.value) {content.value = newVal}
})watch(content, (newVal) => {emit('update:modelValue', newVal)
})
</script><template><v-md-editor v-model="content" :mode="'edit'"height="500px"left-toolbar="undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code emoji"/>
</template>

四、前后端交互

1. API请求封装

// client/src/api/http.ts
import axios, { type AxiosInstance, type AxiosRequestConfig } from 'axios'
import { useAuthStore } from '@/stores/auth'const apiClient: AxiosInstance = axios.create({baseURL: import.meta.env.VITE_API_BASE_URL,timeout: 10000,headers: {'Content-Type': 'application/json'}
})// 请求拦截器
apiClient.interceptors.request.use((config) => {const authStore = useAuthStore()if (authStore.token) {config.headers.Authorization = `Bearer ${authStore.token}`}return config
})// 响应拦截器
apiClient.interceptors.response.use((response) => response.data,(error) => {if (error.response?.status === 401) {const authStore = useAuthStore()authStore.logoutUser()window.location.href = '/login'}return Promise.reject(error.response?.data?.message || error.message || 'Unknown error')}
)export default apiClient

2. 文章API模块

// client/src/api/post.ts
import apiClient from './http'
import type { Post, PostListParams } from '@/types'export const fetchPosts = (params?: PostListParams) => {return apiClient.get<Post[]>('/api/posts', { params })
}export const getPost = (id: string) => {return apiClient.get<Post>(`/api/posts/${id}`)
}export const createPost = (data: FormData) => {return apiClient.post<Post>('/api/posts', data, {headers: {'Content-Type': 'multipart/form-data'}})
}export const updatePost = (id: string, data: FormData) => {return apiClient.put<Post>(`/api/posts/${id}`, data, {headers: {'Content-Type': 'multipart/form-data'}})
}export const deletePost = (id: string) => {return apiClient.delete(`/api/posts/${id}`)
}

五、项目部署方案

1. Docker容器化部署

前端Dockerfile:

# client/Dockerfile
FROM node:18-alpine as builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run buildFROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

后端Dockerfile:

# server/Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 5000
CMD ["node", "app.js"]

docker-compose.yml:

version: '3.8'services:client:build: ./clientports:- "80:80"depends_on:- serverrestart: unless-stoppedserver:build: ./serverports:- "5000:5000"environment:- MONGODB_URI=mongodb://mongo:27017/blogdepends_on:- mongorestart: unless-stoppedmongo:image: mongo:5.0volumes:- mongo-data:/data/dbports:- "27017:27017"restart: unless-stoppedvolumes:mongo-data:

2. Nginx配置

# client/nginx.conf
server {listen 80;server_name localhost;location / {root /usr/share/nginx/html;index index.html;try_files $uri $uri/ /index.html;}location /api {proxy_pass http://server:5000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}

六、项目扩展方向

1. 性能优化建议

  • 实现前端缓存策略
  • 添加服务端渲染(SSR)支持
  • 使用CDN加速静态资源
  • 优化数据库查询索引

2. 功能扩展建议

  • 实现文章草稿自动保存
  • 添加文章系列功能
  • 集成第三方登录(OAuth)
  • 开发移动端应用
  • 实现全文搜索功能

3. 安全增强建议

  • 实现CSRF防护
  • 添加速率限制
  • 增强输入验证
  • 定期安全审计

通过本实战教程,您已经掌握了使用Vue3和Node.js开发全栈博客系统的完整流程。从项目架构设计到具体功能实现,再到最终部署上线,这套技术栈能够满足现代Web应用开发的各项需求。建议在此基础上继续探索更高级的功能和优化方案,打造更加完善的博客平台。

相关文章:

全栈项目实战:Vue3+Node.js开发博客系统

全栈项目实战&#xff1a;Vue3Node.js开发博客系统 一、项目架构设计 1. 技术栈选型 前端技术栈&#xff1a; Vue 3 Composition APITypeScriptPinia状态管理Vue Router 4Element Plus UI组件库Vite构建工具 后端技术栈&#xff1a; Node.js (Express/Koa)MongoDB (Mong…...

查看YOLO版本的三种方法

查看YOLO版本的三种方法&#xff1a; 一、通过命令行直接查询 使用Python交互式查询&#xff1a; from ultralytics import __version__ print(__version__) # 示例输出: 11.0.5二、检查PyTorch环境兼容性 import torch, ultralytics print(f"PyTorch: {torch.__versi…...

基于Docker的Bitwarden的私有本地部署

基于Docker的Bitwarden的私有本地部署 文章目录 基于Docker的Bitwarden的私有本地部署 本文首发地址 https://h89.cn/archives/355.html bitwarden 默认连接的是国外服务器 https://bitwarden.com/ &#xff0c;连接不是很稳定&#xff0c;也没有安全感&#xff0c;所以我选择了…...

点和体素哪个好

3D 深度学习中基于体素和基于点云的方法哪种更优&#xff1f;-腾讯云开发者社区-腾讯云 https://zhuanlan.zhihu.com/p/372497398 GitHub - open-mmlab/OpenPCDet: OpenPCDet Toolbox for LiDAR-based 3D Object Detection....

C++ STL编程 vector空间预留、vector高效删除、vector数据排序、vector代码练习

vector空间预留&#xff0c;作用是避免申请每次申请内存&#xff0c;提高运行效率。 对应的接口是 vector.reverse() vector的高效删除&#xff0c;对应的代码见下&#xff0c;一个时间复杂度是n&#xff0c;一个时间复杂度是1 #include<iostream> #include<vector…...

Android架构模式推荐及分析和MVC架构模式制作一个简单的底部tab切换

目录 主流架构模式对比 适用场景 MVP‌&#xff1a;团队协作开发,需要高可测试性的项目 MVC架构模式制作一个简单的底部tab切换 &#xff08;Model-View-Controller&#xff09;结构 代码 效果 主流架构模式对比 ‌对比维度‌‌MVC‌ ‌MVP‌ ‌MVVM‌ ‌MVI‌ ‌学习…...

【PVE】ProxmoxVE8虚拟机,存储管理(host磁盘扩容,qcow2/vmdk导入vm,vm磁盘导出与迁移等)

【PVE】ProxmoxVE8虚拟机&#xff0c;存储管理&#xff08;host磁盘扩容&#xff0c;qcow2/vmdk导入vm&#xff0c;vm磁盘导出与迁移等&#xff09; 文章目录 1、host 磁盘扩容2、qcow2/vmdk导入vm3、vm 磁盘导出与迁移 1、host 磁盘扩容 如何给host扩容磁盘&#xff0c;如增加…...

【JEECG 组件扩展】JSwitch开关组件扩展单个多选框样式

功能说明&#xff1a; 基于JeecgBoot开源框架&#xff0c;JSwitch开关组件扩展&#xff0c;支持单个多选样式。 效果展示&#xff1a; 使用示例&#xff1a; {field: JSwitch,component: JSwitch,label: JSwitch,},{field: JSwitchCheckBox,component: JSwitch,label: JSwitch…...

卷积神经网络-从零开始构建一个卷积神经网络

目录 一、什么是卷积神经网络CNN 1.1、核心概念 1.2、卷积层 二、什么是卷积计算 2.1、卷积计算的例子: 2.2、点积 2.3、卷积与点积的关系 2.4、Padding(填充) 2.4.1、Padding的主要作用 1、控制输出特征图尺寸 2、保留边缘信息 3. 支持深层网络训练 2.4.2、Str…...

Linux 常用命令集合

以下是一份 Linux 常用命令集合&#xff0c;涵盖文件操作、系统管理、网络管理、权限管理、进程管理等常见任务&#xff0c;并附上代码示例&#xff1a; 1. 文件与目录操作 命令作用示例ls列出目录内容ls -l&#xff08;详细列表&#xff09; ls -a&#xff08;显示隐藏文件&a…...

STM32f103 标准库 零基础学习之按键点灯(不涉及中断)

注意&#xff0c;此次代码不涉及中断&#xff0c;不涉及中断&#xff0c;不涉及中断 目录 1.初始化LED 2.初始化按键 3.粗略的延时函数 4.判断引脚电平 5.通过异或反转电平 开始 │ ├── 初始化LED&#xff08;GPIOA Pin1 推挽输出&#xff09; ├── 初始化按键&…...

【c++】【数据结构】二叉搜索树详解

目录 二叉搜索树的定义二叉搜索树的模拟实现查找函数循环版递归版 插入函数循环版递归版 删除函数循环版递归版 二叉搜索树的定义 二叉搜索树是一种特别的二叉树&#xff0c;是二叉树的搜索特化版。学过排序的都知道&#xff0c;在数组有序的情况下二分查找可以以极高的频率找…...

高精地图数据错误的侵权责任认定与应对之道

首席数据官高鹏律师团队 在自动驾驶与智慧交通快速发展的今天&#xff0c;高精地图作为核心基础设施&#xff0c;其数据准确性直接关系到公共安全。然而&#xff0c;技术并非完美&#xff0c;一旦因地图数据错误导致事故或损失&#xff0c;比如当自动驾驶汽车因高精地图数据错…...

Python训练营打卡——DAY22(2025.5.11)

复习日 学习参考如何使用kaggle平台&#xff0c;写下使用注意点&#xff0c;并对下述比赛提交代码 泰坦尼克号——来自灾难的机器学习 数据来源&#xff1a; kaggle泰坦里克号人员生还预测 挑战 泰坦尼克号沉没是历史上最臭名昭著的海难之一。 1912年4月15日&#xff0c;在被普…...

【计算机视觉】OpenCV实战项目 :Image_Cartooning_Web_App:基于深度学习的图像卡通化

Image_Cartooning_Web_App&#xff1a;基于深度学习的图像卡通化Web应用深度解析 1. 项目概述2. 技术原理与模型架构2.1 核心算法2.2 系统架构 3. 实战部署指南3.1 环境配置3.2 模型部署3.3 处理流程示例 4. 常见问题与解决方案4.1 模型加载失败4.2 显存溢出4.3 边缘伪影 5. 关…...

王道计算机网络知识点总结

计算机网络知识点总结 一、计算机网络体系结构 &#xff08;一&#xff09;计算机网络概述 计算机网络概念&#xff1a;互连的、自治的计算机系统的集合&#xff0c;目的是资源共享&#xff0c;组成包括多台自治计算机&#xff0c;规则是网络协议。 计算机网络的组成&#…...

Java学习笔记(对象)

一、对象本质 状态&#xff08;State&#xff09;&#xff1a;通过成员变量&#xff08;Field&#xff09;描述 行为&#xff08;Behavior&#xff09;&#xff1a;通过成员方法&#xff08;Method&#xff09;实现 class Person {String name;int age;void eat() {System.o…...

并发笔记-给数据上锁(二)

文章目录 核心挑战 (The CRUX)29.1 并发计数器 (Concurrent Counters)1. 简单非并发计数器 (Figure 29.1)2. 同步计数器&#xff08;单锁版本 - Coarse-Grained Lock, Figure 29.2&#xff09;3. 可伸缩计数&#xff1a;近似/懒惰计数器 (Approximate/Sloppy Counter, Figure 2…...

Three.js + React 实战系列 - 页脚区域 Footer 组件 ✨

对个人主页设计和实现感兴趣的朋友可以订阅我的专栏哦&#xff01;&#xff01;谢谢大家&#xff01;&#xff01;&#xff01; 为个人主页画上完美句号&#xff1a;设计一个美观实用的页脚组件 在完成 Hero、About、Projects、Contact 等模块后&#xff0c;我们为整个页面添上…...

基于Flask、Bootstrap及深度学习的水库智能监测分析平台

基于Flask、Bootstrap及深度学习的水库智能监测分析平台 项目介绍 本项目是基于Flask框架构建的水库智能监测分析平台&#xff0c;集水库数据管理、实时监测预警、可视化分析和智能预测功能于一体。 预测水位的预警级别&#xff1a;蓝色预警没有超过正常水位且接近正常水位1米…...

JavaSE核心知识点02面向对象编程02-08(异常处理)

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 JavaSE核心知识点02面向对象编程02-08&#…...

7系列 之 SelectIO 资源

背景 《ug471_7Series_SelectIO.pdf》介绍了Xilinx 7 系列 SelectIO 的输入/输出特性及逻辑资源的相关内容。 第 1 章《SelectIO Resources》介绍了输出驱动器和输入接收器的电气特性&#xff0c;并通过大量实例解析了各类标准接口的实现。 第 2 章《SelectIO Logic Resource…...

【目标检测系列】YOLOV1解读

目标检测系列文章 目录 目标检测系列文章&#x1f4c4; 论文标题&#x1f9e0; 论文逻辑梳理1. 引言部分梳理 (动机与思想) &#x1f4dd; 三句话总结&#x1f50d; 方法逻辑梳理&#x1f680; 关键创新点&#x1f517; 方法流程图关键疑问解答Q1: 关于 YOLOv1 中的 "conf…...

GIF图像技术介绍

以下是对GIF格式的详细介绍,涵盖其定义、发展历程、技术特性、应用场景及与其他格式的对比: 一、GIF的定义与起源 GIF(Graphics Interchange Format,图形交换格式)由美国CompuServe公司于1987年推出,旨在解决早期互联网带宽不足的问题。其开发者Steve Wilhite采用LZW无损…...

【TI MSPM0】CCS工程管理

一、关于WORKSPACE 1.导入工程路径 导入工程时&#xff0c;实际是将工程从原路径复制到了Workspace路径下&#xff08;默认是在C盘user路径下&#xff09; 2.工程保存备份 关于工程的保存&#xff0c;可以右击文件夹&#xff0c;点击Reveal打开文件夹 将对应的文件夹进行复…...

牛客周赛 Round 92-题解

牛客周赛 Round 92-题解 A-小红的签到题 code #include<iostream> #include<string> using namespace std; string s; int main() {int n;cin >> n;cout << "a_";for (int i 0; i < n - 2; i )cout << b;return 0; }B-小红的模…...

iVX 图形化编程平台:结合 AI 原生开发的革新与实践

一、技术架构&#xff1a;重构 AI 与编程的交互逻辑 1. 信息密度革命&#xff1a;从线性代码到图形化语义单元 传统文本编程存在显著的信息密度瓶颈。以 "按钮点击→条件判断→调用接口→弹窗反馈" 流程为例&#xff0c;Python 实现需定义函数、处理缩进并编写 30 …...

微服务架构中如何保证服务间通讯的安全

在微服务架构中,保证服务间通信的安全至关重要。服务间的通信通常是通过HTTP、gRPC、消息队列等方式实现的,而这些通信链路可能面临多种安全风险。为了应对这些风险,可以采取多种措施来保证通信安全。 常见的服务间通信风险 1.数据泄露:在服务间通信过程中,敏感数据可能会…...

长短期记忆网络(LSTM)深度解析:从理论到实践的全方位指南

一、LSTM基础理论:超越传统RNN的记忆架构 1.1 RNN的长期依赖问题 传统循环神经网络(RNN)在处理长序列时面临的根本挑战是梯度消失/爆炸问题。当序列长度超过10-20个时间步时,RNN难以学习到早期时间步的信息。数学上,这源于反向传播过程中梯度的链式法则: 复制 下载 ∂…...

FramePack AI图片生成视频 v1.1 整合包

今天&#xff0c;我兴奋地要为大家介绍一款革命性的AI工具——FramePack&#xff0c;这是一个让人眼前一亮的图生视频整合包。想象一下&#xff0c;在2025年5月11日的今天&#xff0c;哪怕你的电脑显存仅有6G&#xff0c;你也可以轻松创造艺术&#xff01; FramePack的神奇之处…...

在 C++中,指针数组与数组指针的区别

1. 指针数组:本质上是一个数组,数组中的每个元素都是一个指针。也就是说,这个数组存储的是多个指针变量,这些指针可以指向不同的对象(比如不同的变量、数组等) 。 2. 数组指针:本质上是一个指针,这个指针指向一个数组。即它指向的是数组的首地址,通过这个指针可以操作…...

Ubuntu 24服务器部署abp vnext应用程序的完整教程

一、服务器配置 1、安装Nginx 2、安装.NetCore SDK 或.NetCore 运行时 以上两步参考 《UbuntuNginxSupervisord部署.net core web应用程序_nginx部署netcore-CSDN博客》 二、abp vnext程序部署 1、程序发布 使用VS进行发布 2、程序上传 使用winSCP工具 3、openiddict…...

Ingrees 控制器与 Ingress 资源的区别

在 Kubernetes 中&#xff0c;单纯的 Ingress 资源定义文件&#xff08;YAML&#xff09;本身不会直接创建 Pod。Ingress 的作用是定义路由规则&#xff08;如将外部流量路由到集群内的服务&#xff09;&#xff0c;而实际处理流量的 Pod 是由 Ingress 控制器&#xff08;如 Ng…...

动态路由实现原理及前端控制与后端控制的核心差异

在 Web 开发领域&#xff0c;动态路由是构建灵活、高效应用的关键技术之一。它能够根据不同的条件和请求&#xff0c;动态地决定页面的跳转和数据的加载&#xff0c;极大提升用户体验。本文将深入剖析动态路由的实现原理&#xff0c;并详细探讨前端控制和后端控制两种模式的最大…...

stm32 WDG看门狗

目录 stm32 WDG看门狗一、WDG基础知识1&#xff09;WDG&#xff08;Watchdog&#xff09;看门狗简介 二、IWDG独立看门狗1&#xff09;IWDG键寄存器2&#xff09;IWDG超时时间 三、WWDG窗口看门狗1&#xff09;WWDG框图2&#xff09;WWDG工作特性3&#xff09;WWDG超时时间4&am…...

MySQL索引详解(下)(SQL性能分析,索引使用)

索引是MySQL性能优化的核心&#xff0c;但如何精准分析查询瓶颈、合理设计索引&#xff0c;是开发者必须掌握的技能。本文结合实战案例&#xff0c;系统讲解SQL性能分析工具链与索引使用技巧&#xff0c;帮助读者构建高性能数据库系统。 一、SQL性能分析&#xff1a;从宏观到微…...

添加文字标签

上节我们学会了如何在地图中标记位置,那么可不可以为地图添加文字注释呢?答案是肯定的,我们依旧以广州塔为例. //添加文字标签和广告牌var label viewer.entities.add({position: Cesium.Cartesian3.fromDegrees(113.3191,23.109,100),label:{text:"广州塔",font:&…...

数据并行基础概念知识

架构分为PS与ring-allreduce&#xff1b;方法主要是zero系列zeroDP123、ZeroR 、Zero-offerload、Zero-Infinite、Zero 相关博客介绍的很清楚&#xff0c;在这里总结一下 图解系列很通透&#xff0c;通俗易懂1 更详细的介绍后面几种方式&#xff0c;提供动图链接2 提供混合精度…...

Linux系列(3)----用户和用户组管理、系统管理

声明&#xff1a; 本文参考 ❤️肝下25万字的《决战Linux到精通》笔记&#xff0c;你的Linux水平将从入门到入魔❤️【建议收藏】_linux笔记 小小明-CSDN博客 不理解的命令需要自己操作一遍 方可理解 不知道怎么租用服务器并链接的看这个文章 如何租用服务器并通过ssh连接…...

【沉浸式求职学习day36】【初识Maven】

沉浸式求职学习 Maven1. Maven项目架构管理工具2.下载安装Maven3.利用Tomcat和Maven进入一个网站 Maven 为什么要学习这个技术&#xff1f; 在Java Web开发中&#xff0c;需要使用大量的jar包&#xff0c;我们手动去导入&#xff0c;这种操作很麻烦&#xff0c;PASS&#xff01…...

Nipype 简单使用教程

Nipype 简单使用教程 基础教程**一、Nipype 核心概念与工作流构建****1. 基本组件****2. 工作流构建步骤** **二、常用接口命令速查表****1. FSL 接口****2. FreeSurfer 接口****3. ANTS 接口****4. 数据处理接口** **三、高级特性与最佳实践****1. 条件执行&#xff08;基于输…...

DA14585墨水屏学习(2)

一、user_svc2_wr_ind_handler函数 void user_svc2_wr_ind_handler(ke_msg_id_t const msgid,struct custs1_val_write_ind const *param,ke_task_id_t const dest_id,ke_task_id_t const src_id) {// sprintf(buf2,"HEX %d :",param->length);arch_printf("…...

【LeetCode Hot100 | 每日刷题】排序数组

912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题&#xff0c;时间复杂度为 O(nlog(n))&#xff0c;并且空间复杂度尽可能小。 示例 1&…...

leetcode热题100——day26

21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 AC代码 # Definition for singly-linked list. # class ListNode(object): # def __init__(self, val0, nextNone): # self.val val # …...

Python httpx库终极指南

一、发展历程与技术定位 1.1 历史演进 起源&#xff1a;httpx 由 Encode 团队开发&#xff0c;于 2019 年首次发布&#xff0c;目标是提供一个现代化的 HTTP 客户端&#xff0c;支持同步和异步操作&#xff0c;并兼容 HTTP/1.1 和 HTTP/2。背景&#xff1a; requests 库虽然功…...

#Redis黑马点评#(五)Redisson详解

目录 一 基于Redis的分布式锁优化 二 Redisson 1 实现步骤 2 Redisson可重入锁机制 3 Redisson可重试机制 4 Redisson超时释放机制 5 RedissonMultiLock解决主从一致性 三 Redis优化秒杀 一 基于Redis的分布式锁优化 二 Redisson Redisson是一个在Redis的基础上实现的…...

redis存储结构

一、存储结构 存储转换&#xff1a; string int&#xff1a;字符串长度 ≤ 20 且能转成整数raw&#xff1a;字符串长度 > 44embstr&#xff1a;字符串长度 ≤ 44附加&#xff1a;CPU 缓存中基本单位为 cacheline 64 字节 list quicklist&#xff08;双向链表&#xff09;zi…...

wordpress自学笔记 第三节 独立站产品和类目的三种展示方式

wordpress自学笔记 摘自 超详细WordPress搭建独立站商城教程-第三节 独立站产品和类目的三种展示方式&#xff0c;2025 WordPress搭建独立站教程#WordPress建站教程https://www.bilibili.com/video/BV1rwcteuETZ?spm_id_from333.788.videopod.sections&vd_sourcea0af3b…...

Python 自动化脚本开发秘籍:从入门到实战进阶(6/10)

摘要&#xff1a;本文详细介绍了 Python 自动化脚本开发的全流程&#xff0c;从基础的环境搭建到复杂的实战场景应用&#xff0c;再到进阶的代码优化与性能提升。涵盖数据处理、文件操作、网络交互、Web 测试等核心内容&#xff0c;结合实战案例&#xff0c;助力读者从入门到进…...

封装和分用(网络原理)

UDP/TCP协议知识及相关机制 优质好文推荐&#x1f446;&#x1f446; 我们如果想要了解封装与分用&#xff0c;先需要了解TCP/IP五层协议~~ 该图的右边就是TCP/IP五层协议~~需要先理解一下各层是什么含义~ 应用层&#xff1a;直接为用户应用程序提供网络服务和通信协议。它定…...