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

fastapi +angular​迷宫求解可跨域

说明:我计划使用fastapi +angular,实现​迷宫路径生成与求解

后端功能包括:
1.FastAPI搭建RESTful接口。写两个接口,
1.1生成迷宫,
1.2求解路径

前端功能包括
1.根据给定的长宽值,生成迷宫
2.点击按钮,刷新迷宫,生成新迷宫
3.点击按钮,可以给出正确的迷宫路径
4.增加开始按钮 和计时功能
5.鼠标拖拽绘制迷宫路径
6.绘制错误,弹窗提示失败,重新开始
7.拖拽绘制迷宫成功,弹窗提示成功,并给出分数

效果图:
在这里插入图片描述

step1:C:\Users\wangrusheng\PycharmProjects\FastAPIProject\main.py

from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from typing import List
import random
from collections import dequeapp = FastAPI()app.add_middleware(CORSMiddleware,allow_origins=["http://localhost:4200"],allow_credentials=True,allow_methods=["*"],allow_headers=["*"],
)class MazeRequest(BaseModel):width: intheight: intclass SolveRequest(BaseModel):maze: List[List[int]]start: List[int]end: List[int]def generate_maze_dfs(width: int, height: int) -> List[List[int]]:# 确保奇数列和行width = width // 2 * 2 + 1height = height // 2 * 2 + 1maze = [[1 for _ in range(width)] for _ in range(height)]stack = [(0, 0)]maze[0][0] = 0directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]while stack:current = stack[-1]neighbors = []for dx, dy in directions:nx = current[0] + dx * 2ny = current[1] + dy * 2if 0 <= nx < height and 0 <= ny < width and maze[nx][ny] == 1:neighbors.append((nx, ny))if neighbors:next_cell = random.choice(neighbors)mx = current[0] + (next_cell[0] - current[0]) // 2my = current[1] + (next_cell[1] - current[1]) // 2maze[mx][my] = 0maze[next_cell[0]][next_cell[1]] = 0stack.append(next_cell)else:stack.pop()return mazedef solve_bfs(maze: List[List[int]], start: tuple, end: tuple) -> List[List[int]]:rows = len(maze)cols = len(maze[0]) if rows > 0 else 0visited = [[False for _ in range(cols)] for _ in range(rows)]queue = deque([(start[0], start[1], [])])directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]while queue:x, y, path = queue.popleft()current_path = path + [[x, y]]if (x, y) == end:return current_pathfor dx, dy in directions:nx, ny = x + dx, y + dyif 0 <= nx < rows and 0 <= ny < cols:if maze[nx][ny] == 0 and not visited[nx][ny]:visited[nx][ny] = Truequeue.append((nx, ny, current_path))return []@app.post("/generate-maze/")
async def generate_maze(request: MazeRequest):try:maze = generate_maze_dfs(request.width, request.height)return {"maze": maze,"start": [0, 0],"end": [len(maze) - 1, len(maze[0]) - 1]}except Exception as e:raise HTTPException(status_code=500, detail=str(e))@app.post("/solve-maze/")
async def solve_maze(request: SolveRequest):try:path = solve_bfs(request.maze, tuple(request.start), tuple(request.end))return {"path": path}except Exception as e:raise HTTPException(status_code=500, detail=str(e))if __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8000)

step2:后端部分写完了,一定要记得去postman里面测试,确保后端接口正确,然后再写前端,
这种能正常请求返回json就表示接口没问题,避免500,404,或者其他error问题

post请求:http://127.0.0.1:8000/solve-maze/{"detail": [{"type": "missing","loc": ["body"],"msg": "Field required","input": null}]
}post请求:http://127.0.0.1:8000/generate-maze/{"detail": [{"type": "missing","loc": ["body"],"msg": "Field required","input": null}]
}

step3:后端部分写完了,postman测试完成,接下来写前端angular
C:\Users\wangrusheng\WebstormProjects\untitled4\src\app\maze\maze.service.ts

// maze.service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';@Injectable({providedIn: 'root'
})
export class MazeService {private apiUrl = 'http://localhost:8000';constructor(private http: HttpClient) { }generateMaze(width: number, height: number): Observable<any> {return this.http.post(`${this.apiUrl}/generate-maze/`, { width, height });}solveMaze(maze: number[][], start: number[], end: number[]): Observable<any> {return this.http.post(`${this.apiUrl}/solve-maze/`, { maze, start, end });}
}

step4: C:\Users\wangrusheng\WebstormProjects\untitled4\src\app\maze\maze.component.ts

// maze.component.ts
import { Component, OnInit } from '@angular/core';
import { MazeService } from './maze.service';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';@Component({selector: 'app-maze',standalone: true,imports: [CommonModule, FormsModule],templateUrl: './maze.component.html',styleUrls: ['./maze.component.css']
})
export class MazeComponent implements OnInit {maze: number[][] = [];path: number[][] = [];width = 15;height = 15;start: number[] = [0, 0];end: number[] = [0, 0];isDrawing = false;currentPath: number[][] = [];gameStarted = false;startTime = 0;elapsedTime = 0;score = 0;showSuccess = false;showError = false;errorMessage = '';private timerInterval: any;constructor(private mazeService: MazeService) {}ngOnInit() {this.generateNewMaze();}startGame() {this.gameStarted = true;this.startTime = Date.now();this.timerInterval = setInterval(() => {this.elapsedTime = Math.floor((Date.now() - this.startTime) / 1000);}, 1000);}restartGame() {clearInterval(this.timerInterval);this.gameStarted = false;this.elapsedTime = 0;this.showSuccess = false;this.showError = false;this.generateNewMaze();}generateNewMaze() {this.mazeService.generateMaze(this.width, this.height).subscribe({next: (res) => {this.maze = res.maze;this.start = res.start;this.end = res.end;this.path = [];this.currentPath = [];},error: (err) => console.error(err)});}solveMaze() {this.mazeService.solveMaze(this.maze, this.start, this.end).subscribe({next: (res) => {this.path = res.path;},error: (err) => console.error(err)});}startDrawing(event: MouseEvent) {if (!this.gameStarted) return;const cell = this.getCellFromEvent(event);if (cell && this.isValidStart(cell)) {this.isDrawing = true;this.currentPath = [cell];}}draw(event: MouseEvent) {if (!this.isDrawing) return;const cell = this.getCellFromEvent(event);if (cell && this.isValidMove(cell)) {this.currentPath = [...this.currentPath, cell];}}stopDrawing() {if (!this.isDrawing) return;this.isDrawing = false;this.verifyPath();}private verifyPath() {const isValid = this.checkPathValidity();if (isValid) {this.score = Math.round((this.width * this.height * 100) / this.elapsedTime);this.showSuccess = true;clearInterval(this.timerInterval);} else {this.errorMessage = 'Invalid path or not reaching the end';this.showError = true;}}private checkPathValidity(): boolean {// Check if path starts at start pointif (!this.arePointsEqual(this.currentPath[0], this.start)) return false;// Check if path ends at end pointif (!this.arePointsEqual(this.currentPath[this.currentPath.length - 1], this.end)) return false;// Check path continuity and validityfor (let i = 1; i < this.currentPath.length; i++) {const prev = this.currentPath[i - 1];const curr = this.currentPath[i];// Check if adjacent cellsif (Math.abs(prev[0] - curr[0]) + Math.abs(prev[1] - curr[1]) !== 1) return false;// Check if path is on valid cellsif (this.maze[curr[0]][curr[1]] === 1) return false;}return true;}private getCellFromEvent(event: MouseEvent): number[] | null {const target = event.target as HTMLElement;const row = target.parentElement?.parentElement?.children;const cell = target.parentElement?.children;if (!row || !cell) return null;const i = Array.from(row).indexOf(target.parentElement!);const j = Array.from(cell).indexOf(target);return i >= 0 && j >= 0 ? [i, j] : null;}private isValidStart(cell: number[]): boolean {return this.arePointsEqual(cell, this.start);}private isValidMove(cell: number[]): boolean {const lastCell = this.currentPath[this.currentPath.length - 1];return this.maze[cell[0]][cell[1]] === 0 &&!this.currentPath.some(p => this.arePointsEqual(p, cell)) &&Math.abs(lastCell[0] - cell[0]) + Math.abs(lastCell[1] - cell[1]) === 1;}private arePointsEqual(a: number[], b: number[]): boolean {return a[0] === b[0] && a[1] === b[1];}isPath(i: number, j: number): boolean {return this.path.some(p => p[0] === i && p[1] === j);}isDrawingPath(i: number, j: number): boolean {return this.currentPath.some(p => p[0] === i && p[1] === j);}
}

step5:
C:\Users\wangrusheng\WebstormProjects\untitled4\src\app\maze\maze.component.html

<div class="controls"><input type="number" [(ngModel)]="width" placeholder="Width" [disabled]="gameStarted"><input type="number" [(ngModel)]="height" placeholder="Height" [disabled]="gameStarted"><button (click)="generateNewMaze()" [disabled]="gameStarted">Generate Maze</button><button (click)="solveMaze()" [disabled]="!maze.length">Solve Maze</button><button (click)="startGame()" [disabled]="!maze.length || gameStarted">Start Game</button><div class="timer">Time: {{ elapsedTime }}s</div>
</div><div class="maze-container"(mousedown)="startDrawing($event)"(mousemove)="draw($event)"(mouseup)="stopDrawing()"(mouseleave)="stopDrawing()"><div *ngFor="let row of maze; let i = index" class="row"><div*ngFor="let cell of row; let j = index"class="cell"[class.wall]="cell === 1"[class.path]="isPath(i, j)"[class.start]="i === start[0] && j === start[1]"[class.end]="i === end[0] && j === end[1]"[class.drawing]="isDrawingPath(i, j)"></div></div>
</div><div class="overlay" *ngIf="showSuccess || showError"><div class="dialog"><div *ngIf="showSuccess"><h3>Success!</h3><p>Time: {{ elapsedTime }}s</p><p>Score: {{ score }}</p><button (click)="restartGame()">Play Again</button></div><div *ngIf="showError"><h3>Wrong Path!</h3><p>{{ errorMessage }}</p><button (click)="restartGame()">Try Again</button></div></div>
</div>

step6: C:\Users\wangrusheng\WebstormProjects\untitled4\src\app\maze\maze.component.css

/* 控件区域 */
.controls {margin-bottom: 20px;display: flex;gap: 10px;align-items: center;
}/* 迷宫容器 */
.maze-container {border: 1px solid #ccc;user-select: none;
}/* 行布局 */
.row {display: flex;
}/* 单元格样式 */
.cell {width: 20px;height: 20px;border: 1px solid #eee;position: relative;cursor: crosshair;
}/* 墙壁样式 */
.wall {background-color: #333;cursor: not-allowed;
}/* 路径样式 */
.path {background-color: #ffd700;
}/* 起点样式 */
.start {background-color: #00ff00;
}/* 终点样式 */
.end {background-color: #ff0000;
}/* 绘制中的路径 */
.drawing {background-color: #4a90e2 !important;
}/* 计时器 */
.timer {font-weight: bold;color: #2c3e50;
}/* 遮罩层 */
.overlay {position: fixed;top: 0;left: 0;width: 100%;height: 100%;background: rgba(0,0,0,0.5);display: flex;justify-content: center;align-items: center;
}/* 对话框 */
.dialog {background: white;padding: 20px;border-radius: 8px;text-align: center;
}

end

相关文章:

fastapi +angular​迷宫求解可跨域

说明&#xff1a;我计划使用fastapi angular&#xff0c;实现​迷宫路径生成与求解 后端功能包括&#xff1a; 1.FastAPI搭建RESTful接口。写两个接口&#xff0c; 1.1生成迷宫&#xff0c; 1.2求解路径 前端功能包括 1.根据给定的长宽值&#xff0c;生成迷宫 2.点击按钮&…...

CobaltStrike详细使用及Linux上线

1、工具准备 cs工具 将teamserver.zip放进服务端给必要文件增加可执行文件( 执行时会有提示 )服务端启动服务监听 sudo ./teamserver <IP地址> <密码> [c2配置文件]客户端直接连接即可端口默认&#xff1a;50050主机&#xff1a;服务端ip地址2、基础配置 启动监听…...

WSL2 Ubuntu安装GCC不同版本

WSL2 Ubuntu安装GCC不同版本 介绍安装gcc 7.1方法 1&#xff1a;通过源码编译安装 GCC 7.1步骤 1&#xff1a;安装编译依赖步骤 2&#xff1a;下载 GCC 7.1 源码步骤 3&#xff1a;配置和编译步骤 4&#xff1a;配置环境变量步骤 5&#xff1a;验证安装 方法 2&#xff1a;通过…...

WPF CommunityToolkit.MVVM库的简单使用

CommunityToolkit.MVVM 是 .NET 社区工具包中的一部分&#xff0c;它为实现 MVVM&#xff08;Model-View-ViewModel&#xff09;模式提供了一系列实用的特性和工具&#xff0c;能帮助开发者更高效地构建 WPF、UWP、MAUI 等应用程序。以下是关于它的详细使用介绍&#xff1a; 1…...

4个 Vue 路由实现的过程

大家好&#xff0c;我是大澈&#xff01;一个喜欢结交朋友、喜欢编程技术和科技前沿的老程序员&#x1f468;&#x1f3fb;‍&#x1f4bb;&#xff0c;关注我&#xff0c;科技未来或许我能帮到你&#xff01; Vue 路由相信朋友们用的都很熟了&#xff0c;但是你知道 Vue 路由…...

Compose 实践与探索十 —— 其他预先处理的 Modifier

1、PointerInputModifier PointerInputModifier 用于定制触摸&#xff08;包括手指、鼠标、悬浮&#xff09;反馈算法&#xff0c;实现手势识别。 1.1 基本用法 最简单的使用方式就是通过 Modifier.clickable() 响应点击事件&#xff1a; Box(Modifier.size(40.dp).backgro…...

基于Python的天气预报数据可视化分析系统-Flask+html

开发语言&#xff1a;Python框架&#xff1a;flaskPython版本&#xff1a;python3.8数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统登录 可视化界面 天气地图 天气分析 历史天气 用户管理 摘要 本文介绍了基于大数据…...

“消失的中断“

“消失的中断” 1. 前言 在嵌入式开发过程中&#xff0c;中断必不可少。道友们想必也经常因为中断问题头疼不已&#xff0c;今天来说说一个很常见的问题&#xff0c;“消失的中断”。最近项目在使用第三方MCAL的时候&#xff0c;就遇到了I2C中断丢失的问题&#xff0c;排查起…...

对C++面向对象的理解

C的面向对象编程&#xff08;OOP&#xff09;是其核心特性之一&#xff0c;通过类&#xff08;Class&#xff09;和对象&#xff08;Object&#xff09;实现数据和行为的封装&#xff0c;支持继承、多态和抽象等核心概念。以下是关键点解析&#xff1a; 1. 类&#xff08;Class…...

代码随想录-训练营-day52

97. 小明逛公园 (kamacoder.com) #include<iostream> #include<vector> using namespace std; int main(){int n,m,u,v,w;cin>>n>>m;vector<vector<vector<int>>> grid(n1,vector<vector<int>>(n1,vector<int>(n1…...

Java File 类详解

1. 概述 File 类是 Java 提供的用于文件和目录路径名的抽象表示。它能够用于创建、删除、查询文件和目录的信息&#xff0c;但不用于读写文件内容。如果需要对文件进行读写&#xff0c;可以结合 FileReader、FileWriter、BufferedReader 等类来完成。 2. File 类的构造方法 …...

JS实现省份地级市的选择

JS实现省份地级市的选择 效果展示&#xff1a; 代码实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><ti…...

【鸿蒙开发】Hi3861学习笔记-Visual Studio Code安装(New)

00. 目录 文章目录 00. 目录01. Visual Studio Code概述02. Visual Studio Code下载03. Visual Studio Code安装04. Visual Studio Code插件05. 附录 01. Visual Studio Code概述 vscode是一种简化且高效的代码编辑器&#xff0c;同时支持诸如调试&#xff0c;任务执行和版本管…...

记录致远OA服务器硬盘升级过程

前言 日常使用中OA系统突然卡死&#xff0c;刷新访问进不去系统&#xff0c;ping服务器地址正常&#xff0c;立马登录服务器检查&#xff0c;一看磁盘爆了。 我大脑直接萎缩了&#xff0c;谁家OA系统配400G的空间啊&#xff0c;过我手的服务器没有50也是30台&#xff0c;还是…...

计算机网络-网络规划与设计

基本流程 需求分析—》通信规范分析—》逻辑网络设计—》物理网络设计—》实施阶段 需求分析&#xff1a; 确定需求&#xff0c;包括&#xff1a;业务需求、用户需求、应用需求、计算机平台需求、网络通信需求等。 产物&#xff1a;需求规范 通信规范分析&#xff1a; 现有…...

C#opencv 遍历图像中所有点 不在圆范围内的点变为黑色,在圆范围内的保持原色

C#opencv 遍历图像中所有点 不在圆范围内的点变为黑色,在圆范围内的保持原色 安装 Install-Package OpenCvSharp4 Install-Package OpenCvSharp4.Windows 普通实现 using System; using System.Collections.Generic; using System.Linq; using OpenCvSharp; // 添加OpenCV引用…...

精通游戏测试笔记(持续更新)

第一章、游戏测试的两条规则 不要恐慌 不要将这次发布当作最后一次发布 不要相信任何人 把每次发布当作最后一次发布 第二章&#xff1a;成为一名游戏测试工程师...

Linux内核,mmap_pgoff在mmap.c的实现

1. mmap_pgoff的系统调用实现如下 SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len,unsigned long, prot, unsigned long, flags,unsigned long, fd, unsigned long, pgoff) {return ksys_mmap_pgoff(addr, len, prot, flags, fd, pgoff); }2. ksys_mma…...

深度揭秘:蓝耘 Maas 平台如何重塑深度学习格局

目录 前言 深度学习&#xff1a;技术基石与发展脉络 蓝耘 Maas 平台&#xff1a;深度学习的强大助推器 1. 高性能算力支撑 2. 丰富的模型支持 3. 便捷的开发体验 4. 完善的安全保障 代码示例&#xff1a;蓝耘 Maas 平台上的深度学习实践 1. 注册与登录 2. 代码实现 …...

深入解析操作系统进程控制:从地址空间到实战应用

引言 想象这样一个场景&#xff1a; 你的游戏本同时运行着《赛博朋克2077》、Chrome浏览器和Discord语音 突然游戏崩溃&#xff0c;但其他应用依然正常运行 此时你打开任务管理器&#xff0c;发现游戏进程已经消失&#xff0c;但内存占用却未完全释放 这背后涉及的关键机制…...

网络空间安全(33)MSF漏洞利用

前言 Metasploit Framework&#xff08;简称MSF&#xff09;是一款功能强大的开源安全漏洞利用和测试工具&#xff0c;广泛应用于渗透测试中。MSF提供了丰富的漏洞利用模块&#xff0c;允许安全研究人员和渗透测试人员利用目标系统中的已知漏洞进行攻击。 一、漏洞利用模块&…...

《Electron 学习之旅:从入门到实践》

前言 Electron 简介 Electron 是由 GitHub 开发的一个开源框架&#xff0c;基于 Chromium 和 Node.js。 它允许开发者使用 Web 技术&#xff08;HTML、CSS、JavaScript&#xff09;构建跨平台的桌面应用程序。 Electron 的优势 跨平台&#xff1a;支持 Windows、macOS 和 Linux…...

通达信软件+条件选股+code

在通达信软件中,你的选股公式需要放在 "公式管理器" 的 "条件选股公式" 分类中。以下是详细操作步骤: 一、打开公式管理器 打开通达信软件,按快捷键 Ctrl + F (或点击顶部菜单栏:"公式" → "公式管理器") 二、创建新公式 选择分…...

【2025】基于springboot+vue的汽车销售试驾平台(源码、万字文档、图文修改、调试答疑)

基于 Spring Boot Vue 的汽车销售试驾平台通过整合前后端技术&#xff0c;实现了汽车销售和试驾预约的信息化和智能化。系统为管理员和用户提供了丰富的功能&#xff0c;提升了客户体验和销售效率&#xff0c;增强了数据分析能力&#xff0c;为汽车销售行业的发展提供了新的途…...

Spring Web MVC入门

一、什么是SpringMVC 首先&#xff0c;MVC是一种架构设计模式&#xff0c;也是一种思想&#xff0c;而SpringMVC是对MVC思想的具体实现&#xff0c;除此之外&#xff0c;SpringMVC还是一个Web框架。 总的来说&#xff0c;SpringMVC就是一个实现MVC模式的Web框架。 而MVC可以…...

5G核心网实训室搭建方案:轻量化部署与虚拟化实践

5G核心网实训室 随着5G技术的广泛应用&#xff0c;行业对于5G核心网人才的需求日益增长。高校、科研机构和企业纷纷建立5G实训室&#xff0c;以促进人才培养、技术创新和行业应用研究。IPLOOK凭借其在5G核心网领域的深厚积累&#xff0c;提供了一套高效、灵活的5G实训室搭建方…...

IMX6ULL学习整理篇——Linux驱动开发的基础2 老框架的一次实战:LED驱动

IMX6ULL学习整理篇——Linux驱动开发的基础2 老框架的一次实战&#xff1a;LED驱动 ​ 在上一篇博客中&#xff0c;我们实现了从0开始搭建的字符设备驱动框架&#xff0c;但是这个框架还是空中楼阁&#xff0c;没有应用&#xff0c;很难说明我们框架的正确性。这里&#xff0c…...

网络空间安全(32)Kali MSF基本介绍

前言 Metasploit Framework&#xff08;简称MSF&#xff09;是一款功能强大的开源安全漏洞检测工具&#xff0c;被广泛应用于渗透测试中。它内置了数千个已知的软件漏洞&#xff0c;并持续更新以应对新兴的安全威胁。MSF不仅限于漏洞利用&#xff0c;还包括信息收集、漏洞探测和…...

零基础上手Python数据分析 (3):Python核心语法快速入门 (下) - 程序流程控制、函数与模块

写在前面 还记得上周我们学习的 Python 基本数据类型、运算符和变量吗? 掌握了这些基础知识,我们已经能够进行一些简单的数据操作了。 但是,在实际的数据分析工作中,仅仅掌握基本语法是远远不够的。 我们需要让程序能够 根据条件做出判断,重复执行某些操作,组织和复用代…...

C++【类和对象】(超详细!!!)

C【类和对象】 1.运算符重载2.赋值运算符重载3.日期类的实现 1.运算符重载 (1).C规定类类型运算符使用时&#xff0c;必须转换成调用运算符重载。 (2).运算符重载是具有特殊名字的函数&#xff0c;名字等于operator加需要使用的运算符&#xff0c;具有返回类型和参数列表及函数…...

Windows-PyQt5安装+PyCharm配置QtDesigner + QtUIC

个人环境 Windows 11 pycharm 2024.2 Anaconda2024.6python 3.9 1)先使用pip命令在线安装 1)pip install PyQt5 2)pip install PyQt5-tools2)配置环境变量 1&#xff1a;安装成功后可以在python的安装目录Lib\site-packahes目录下看到安装包。比如我的路径是E:\anaconda3…...

qq音乐 webpack 补环境

网址&#xff1a; aHR0cHM6Ly95LnFxLmNvbS9uL3J5cXEvcGxheWVy​ 1.接口分析 接口&#xff1a;cgi-bin/musics.fcg​ 参数&#xff1a;sign是加密的 2.代码分析 进入调用栈 先在send位置打上断点&#xff0c;页面刷新 往上一个栈找 ‍ 可以看到上面就有一个关键词sign​是从…...

【蓝桥杯】省赛:神奇闹钟

思路 python做这题很简单&#xff0c;灵活用datetime库即可 code import os import sys# 请在此输入您的代码 import datetimestart datetime.datetime(1970,1,1,0,0,0) for _ in range(int(input())):ls input().split()end datetime.datetime.strptime(ls[0]ls[1],&quo…...

计算机的结构形式

微机的机构形式 台式个人微机 最开始的微机&#xff08;计算机&#xff09;都是台式的&#xff0c;到目前为止仍是个人微机的主要形式。台式机按照电脑机箱的放置形式&#xff0c;分为卧式和立式两种。台式机需要放在桌面上或者留有专门放置机箱位置&#xff0c;他的主机、键…...

C语言【内存函数】详解

目录&#xff1a; 1. memcpy使用和模拟实现 2. memmove使用和模拟实现 3. memset函数的使用 4. memcmp函数的使用 以上函数均包含在一个头文件<string.h>里面 一、memcpy的使用和模拟实现。 memcpy函数介绍&#xff1a; 函数原型&#xff1a; void * memcpy ( void…...

软考网络安全专业

随着信息技术的迅猛发展&#xff0c;网络安全问题日益凸显&#xff0c;成为社会各界普遍关注的焦点。在这样的背景下&#xff0c;软考网络安全专业应运而生&#xff0c;为培养高素质的网络安全人才提供了有力支撑。本文将对软考网络安全专业进行深入剖析&#xff0c;探讨其在信…...

Altium Designer——CHIP类元器件PCB封装绘制

文章目录 PCB封装组成元素&#xff1a;焊盘的属性 SS34肖特基二极管SMA(DO-214AC)封装绘制资料&#xff1a;步骤&#xff1a;1.绘制焊盘&#xff1a;用到的快捷键&#xff1a;资料&#xff1a; 2.绘制丝印&#xff1a;用到的快捷键&#xff1a;资料&#xff1a; PCB封装组成元素…...

C++ unordered_map unordered_set 模拟实现

1. 关于unordered_map 和 unordered_set 区别于C的另外两个容器map和set&#xff0c;map和set的底层是红黑树&#xff1b;而unordered_map和unordered_set的底层是哈希 因为unordered_map和unordered_set的底层是哈希&#xff0c;因此他们存储的数据是没有顺序​​unordered​…...

Java使用自定义类加载器实现插件动态加载

虚拟机类加载子系统 Java虚拟机的⼀个重要子系统&#xff0c;主要负责将类的字节码加载到JVM内存的⽅法区&#xff0c;并将其转换为JVM内部的数据结构。 一个类从被加载到虚拟机开始&#xff0c;一直到卸载出内存为止&#xff0c;会经历七个阶段&#xff1a;加载&#xff0c;…...

【初级篇】如何使用DeepSeek和Dify构建高效的企业级智能客服系统

在当今数字化时代,企业面临着日益增长的客户服务需求。使用Dify创建智能客服不仅能够提升客户体验,还能显著提高企业的运营效率。关于DIfy的安装部署,大家可以参考之前的文章: 【入门级篇】Dify安装+DeepSeek模型配置保姆级教程_mindie dify deepseek-CSDN博客 AI智能客服…...

Java开发之数据库应用:记一次医疗系统数据库迁移引发的异常:从MySQL到PostgreSQL的“dual“表陷阱与突围之路

记一次医疗系统数据库迁移引发的异常&#xff1a;从MySQL到PostgreSQL的"dual"表陷阱与突围之路 一、惊魂时刻&#xff1a;数据库切换引发的系统雪崩 某医疗影像系统在进行国产化改造过程中&#xff0c;将原MySQL数据库迁移至PostgreSQL。迁移完成后&#xff0c;系…...

Langchian构建代理

文章目录 概要ReAct 代理 ReAct 使用ReAct基本用法提示词模板内存使用迭代使用返回执行每一步情况限制输出行数设置运行超时时间 不使用代理下LLM如何结合工具案例案例2 概要 单靠语言模型无法采取行动 - 它们只输出文本。 LangChain 的一个重要用例是创建 代理。 代理是使用大…...

Vim软件使用技巧

目录 Demo Vim怎么看一个文件的行号&#xff0c;不用打开文件的前提下&#xff1f;进入文件后怎么跳转到某一行? 不打开文件查看行号&#xff08;查看文件的方法&#xff09; 方法1、使用命令行工具统计行数 方法2、通过vim的 - 参数查看文件信息 进入文件后跳转到指定行…...

SQL与NoSQL的区别

以下是SQL与NoSQL数据库的详细对比&#xff0c;涵盖核心特性、适用场景及技术选型建议&#xff1a; 一、核心区别对比 特性SQL&#xff08;关系型数据库&#xff09;NoSQL&#xff08;非关系型数据库&#xff09;数据模型基于表格&#xff0c;严格预定义模式&#xff08;Schem…...

1191:流感传染--BFS

这里写目录标题 题目 解析代码BFS代码 题目 解析 在同一天对一个病原体进行处理时&#xff0c;如果直接更改数组&#xff0c;将直接影响到后续的遍历 方法一&#xff1a;那么我们可以定义一个数组用来存储坐标&#xff1a;vectoir<pair<int,int>>&#xff0c;遍历…...

gfortran编译器调试功能选项

在使用 gfortran 编译器进行调试时&#xff0c;以下选项可以帮助你更好地定位和解决问题&#xff1a; 1. 生成调试信息 -g&#xff1a;生成调试信息&#xff0c;供调试器&#xff08;如 gdb&#xff09;使用。-ggdb&#xff1a;生成更详细的调试信息&#xff0c;优化 gdb 的使…...

小程序配置

注册小程序账号和安装开发工具 参考文档&#xff1a;注册小程序账号和安装开发工具https://blog.csdn.net/aystl_gss/article/details/127878658 HBuilder新建项目 填写项目名称&#xff0c;选择UNI-APP&#xff0c;修改路径&#xff0c;点击创建 manifest.json 配置 需要分别…...

【Linux】进程(1)进程概念和进程状态

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;Linux 目录 前言 一、什么是进程 二、task_struct的内容 三、Linux下进程基本操作 四、父进程和子进程 1. 用fork函数创建子进程 五、进程状态 1. 三种重…...

MySQL(事物下)

目录 一 多版本并发控制&#xff08; MVCC &#xff09;是一种用来解决 读-写冲突 的无锁并发控制 1. 前置知识 示例&#xff1a; 二 Read View 1. 当事物进行快照读(读历史数据)会MySQL会创建一个Read Vidw类对象&#xff0c;用来记录和当前一起并发的事物(活跃的事物)&a…...

Springboot+mybatis实现增删改查效果

我们前面实现了增加效果&#xff0c;现在来写一下修改~我们首先在controller里面写update 接着在service和mapper写方法 最后我们测试一下 没问题~需要注意的是mapper的sql别写错了&#xff01;...