使用React和Material-UI构建TODO应用的前端UI
使用React和Material-UI构建TODO应用的前端UI
- 引言
- 环境准备
- 代码解析
- 1. 导入必要的模块
- 2. 创建React组件
- 3. 定义函数
- 3.1 获取TODO列表
- 3.2 创建TODO项
- 3.3 更新TODO项
- 3.4 删除TODO项
- 3.5 处理编辑点击事件
- 3.6 关闭编辑对话框
- 3.7 保存编辑内容
- 4. 使用Effect钩子
- 5. 渲染组件
- 功能实现
- 优化建议
- 总结
引言
在现代Web开发中,TODO列表应用是一个经典的示例,用于展示如何使用前端技术构建一个简单的任务管理工具。本文将详细介绍如何使用React框架和Material-UI库来构建一个TODO列表应用,并解释代码的各个部分,帮助读者理解其工作原理。
后端API请参考,使用Express.js和SQLite3构建简单TODO应用的后端API
环境准备
在开始之前,请确保你已经安装了以下工具和库:
- Node.js:确保你已经安装了Node.js,可以从Node.js官网下载并安装。
- npm:Node.js的包管理工具,随Node.js一起安装。
- React:一个用于构建用户界面的JavaScript库,可以通过npm安装。
- Material-UI:一个基于Material Design的React组件库,同样可以通过npm安装。
- axios:一个基于Promise的HTTP客户端,用于处理API请求。
安装所需的依赖:
npm install react @mui/material @emotion/react @emotion/styled axios
代码解析
让我们逐步分析代码,理解每个部分的功能。
1. 导入必要的模块
import { useState, useEffect } from 'react';
import axios from 'axios';
import {TextField,Button,Checkbox,List,ListItem,ListItemText,IconButton,Dialog,DialogTitle,DialogContent,DialogActions,FormControlLabel
} from '@mui/material';
import { Delete, Edit } from '@mui/icons-material';
import { Todo } from '../types/todo';
- React:导入
useState
和useEffect
钩子,用于状态管理和副作用处理。 - axios:用于发送HTTP请求。
- Material-UI:导入各种组件,如文本框、按钮、列表、对话框等。
- Icons:导入删除和编辑图标。
- Todo类型:定义TODO项的类型,确保数据的类型安全。
2. 创建React组件
export default function TodoList() {const [todos, setTodos] = useState<Todo[]>([]);const [searchTerm, setSearchTerm] = useState('');const [newTodo, setNewTodo] = useState({ title: '', description: '' });const [editingTodo, setEditingTodo] = useState<Todo | null>(null);const [editForm, setEditForm] = useState({ title: '', description: '', completed: false });
- todos:存储TODO列表的状态。
- searchTerm:存储搜索词的状态。
- newTodo:存储新TODO项的状态。
- editingTodo:存储正在编辑的TODO项的状态。
- editForm:存储编辑表单的状态。
3. 定义函数
3.1 获取TODO列表
const fetchTodos = async () => {try {const response = await axios.get(`http://localhost:3002/api/todos?q=${searchTerm}`);setTodos(response.data);} catch (error) {console.error('Error fetching todos:', error);}
};
- 功能:从后端获取TODO列表,支持搜索功能。
- 实现:使用
axios.get
发送GET请求,根据searchTerm
进行模糊搜索。
3.2 创建TODO项
const createTodo = async () => {if (!newTodo.title.trim()) return;try {await axios.post('http://localhost:3002/api/todos', newTodo);setNewTodo({ title: '', description: '' });fetchTodos();} catch (error) {console.error('Error creating todo:', error);}
};
- 功能:创建一个新的TODO项。
- 实现:检查标题是否为空,使用
axios.post
发送POST请求,创建成功后清空表单并刷新列表。
3.3 更新TODO项
const updateTodo = async (todo: Todo, isToggleComplete = false) => {try {const updatedTodo = isToggleComplete? { ...todo, completed: !todo.completed }: { ...todo, title: editForm.title, description: editForm.description, completed: editForm.completed };await axios.put(`http://localhost:3002/api/todos/${todo.id}`, updatedTodo);setEditingTodo(null);fetchTodos();} catch (error) {console.error('Error updating todo:', error);}
};
- 功能:更新TODO项,支持标记完成和编辑内容。
- 实现:根据
isToggleComplete
决定是更新完成状态还是编辑内容,使用axios.put
发送PUT请求。
3.4 删除TODO项
const deleteTodo = async (id: number) => {try {await axios.delete(`http://localhost:3002/api/todos/${id}`);fetchTodos();} catch (error) {console.error('Error deleting todo:', error);}
};
- 功能:删除指定的TODO项。
- 实现:使用
axios.delete
发送DELETE请求,删除成功后刷新列表。
3.5 处理编辑点击事件
const handleEditClick = (todo: Todo) => {setEditingTodo(todo);setEditForm({title: todo.title,description: todo.description || '',completed: todo.completed});
};
- 功能:打开编辑对话框,填充TODO项的详细信息。
- 实现:设置
editingTodo
和editForm
状态,显示编辑表单。
3.6 关闭编辑对话框
const handleClose = () => {setEditingTodo(null);setEditForm({ title: '', description: '', completed: false });
};
- 功能:关闭编辑对话框,重置表单。
- 实现:清除
editingTodo
和editForm
状态。
3.7 保存编辑内容
const handleSave = () => {if (editingTodo && editForm.title.trim()) {updateTodo(editingTodo);}
};
- 功能:保存编辑的内容。
- 实现:检查标题是否为空,调用
updateTodo
更新TODO项。
4. 使用Effect钩子
useEffect(() => {const debounceSearch = setTimeout(() => {fetchTodos();}, 300);return () => clearTimeout(debounceSearch);
}, [searchTerm]);
- 功能:实现搜索的防抖动效果,防止频繁请求。
- 实现:使用
setTimeout
延迟300毫秒后执行fetchTodos
,并在组件销毁时清除定时器。
5. 渲染组件
return (<div style={{ maxWidth: 600, margin: '0 auto', padding: '20px' }}><TextFieldfullWidthlabel="Search Todos"variant="outlined"value={searchTerm}onChange={(e) => setSearchTerm(e.target.value)}margin="normal"/><List>{todos.map((todo) => (<ListItemkey={todo.id}secondaryAction={(<><IconButton onClick={() => handleEditClick(todo)}><Edit /></IconButton><IconButton onClick={() => deleteTodo(todo.id)}><Delete /></IconButton></>)}style={{display: todo.completed ? 'none' : 'flex',opacity: todo.completed ? 0.7 : 1}}><Checkboxchecked={Boolean(todo.completed)}onChange={() => updateTodo(todo, true)}/><ListItemTextprimary={todo.title}secondary={todo.description}style={{textDecoration: todo.completed ? 'line-through' : 'none',}}/></ListItem>))}</List><div style={{ display: 'flex', gap: 10, marginBottom: 20 }}><TextFieldfullWidthlabel="New Todo Title"value={newTodo.title}onChange={(e) => setNewTodo({ ...newTodo, title: e.target.value })}/><TextFieldfullWidthlabel="Description"value={newTodo.description}onChange={(e) => setNewTodo({ ...newTodo, description: e.target.value })}/><Buttonvariant="contained"color="primary"onClick={createTodo}>Add</Button></div><Dialog open={Boolean(editingTodo)} onClose={handleClose}><DialogTitle>Edit Todo</DialogTitle><DialogContent><TextFieldautoFocusmargin="dense"label="Title"fullWidthvalue={editForm.title}onChange={(e) => setEditForm({ ...editForm, title: e.target.value })}/><TextFieldmargin="dense"label="Description"fullWidthmultilinerows={3}value={editForm.description}onChange={(e) => setEditForm({ ...editForm, description: e.target.value })}/><FormControlLabelcontrol={(<Checkboxchecked={editForm.completed}onChange={(e) => setEditForm({ ...editForm, completed: e.target.checked })}/>)}label="Completed"/></DialogContent><DialogActions><Button onClick={handleClose} color="primary">Cancel</Button><ButtononClick={handleSave}color="primary"disabled={!editForm.title.trim()}>Save</Button></DialogActions></Dialog></div>
);
- 搜索框:允许用户输入搜索词,实时搜索TODO列表。
- TODO列表:显示所有TODO项,每个项包含标题、描述、编辑和删除按钮,以及完成状态Checkbox。
- 添加TODO表单:允许用户输入新TODO的标题和描述,点击“Add”按钮创建。
- 编辑对话框:当用户点击编辑按钮时,显示编辑表单,允许修改TODO的标题、描述和完成状态。
功能实现
- 添加TODO项:用户输入标题和描述后,点击“Add”按钮,发送POST请求到后端,创建新的TODO项。
- 编辑TODO项:用户点击编辑按钮,打开编辑对话框,修改TODO项的详细信息后,点击“Save”按钮,发送PUT请求到后端,更新TODO项。
- 删除TODO项:用户点击删除按钮,发送DELETE请求到后端,删除指定的TODO项。
- 搜索TODO项:用户输入搜索词,组件会自动搜索标题或描述中包含该词的TODO项,支持防抖动功能,减少请求次数。
- 标记完成:用户点击Checkbox,TODO项会被标记为完成,样式会变为灰色并添加删除线。
优化建议
尽管这段代码已经可以正常工作,但为了提升应用的性能和用户体验,可以考虑以下优化:
- 添加加载状态:在数据加载过程中,显示加载动画,提升用户体验。
- 添加错误提示:在请求失败时,显示错误提示信息,帮助用户了解问题所在。
- 添加成功提示:在创建、更新或删除TODO项成功后,显示成功提示信息。
- 优化样式:根据Material Design规范,优化组件的样式和布局,提升视觉效果。
- 添加响应式设计:确保应用在不同设备上都能良好显示,提升应用的适应性。
- 添加数据验证:在前端和后端都添加数据验证,确保输入的数据合法有效。
总结
通过本文,我们详细解析了一个使用React和Material-UI构建的TODO列表应用。从状态管理、HTTP请求到组件渲染,每个部分都进行了详细的解释。希望这篇文章能够帮助读者理解如何使用这些技术构建一个简单的TODO应用,并为进一步的学习和开发打下基础。
相关文章:
使用React和Material-UI构建TODO应用的前端UI
使用React和Material-UI构建TODO应用的前端UI 引言环境准备代码解析1. 导入必要的模块2. 创建React组件3. 定义函数3.1 获取TODO列表3.2 创建TODO项3.3 更新TODO项3.4 删除TODO项3.5 处理编辑点击事件3.6 关闭编辑对话框3.7 保存编辑内容 4. 使用Effect钩子5. 渲染组件 功能实现…...
开屏广告-跳过神器
给大家介绍一款超实用的软件——SKIP,它堪称李跳跳的最佳平替!这款软件已经在Github开源免费,完全无需担心内置源问题,也无需导入任何规则。安装完成后,即可直接使用,非常便捷! 首次打开软件时…...
bat脚本实现自动化漏洞挖掘
bat脚本 BAT脚本是一种批处理文件,可以在Windows操作系统中自动执行一系列命令。它们可以简化许多日常任务,如文件操作、系统配置等。 bat脚本执行命令 echo off#下面写要执行的命令 httpx 自动存活探测 echo off httpx.exe -l url.txt -o 0.txt nuc…...
如何运行Composer安装PHP包 安装JWT库
1. 使用Composer Composer是PHP的依赖管理工具,它允许你轻松地安装和管理PHP包。对于JWT,你可以使用firebase/php-jwt这个库,这是由Firebase提供的官方库。 安装Composer(如果你还没有安装的话): 访问Co…...
(回溯递归dfs 电话号码的字母组合 remake)leetcode 17
只找边界条件和非边界条件,剩下的交给数学归纳法就行,考虑子问题的重复性 [class Solution {vector<string>str { "","","abc","def","ghi","jkl","mno","pqrs"…...
it基础使用--5---git远程仓库
文章目录 it基础使用--5---git远程仓库1. 按顺序看2. 什么是远程仓库3. Gitee操作3.1 新建远程仓库3.2 远程操作基础命令3.3 查看当前所有远程地址别名 git remote -v3.4 创建远程仓库别名 git remote add 别名 远程地址3.4 推送本地分支到远程仓库 git push 别名 分支3.5 拉取…...
Git 的起源与发展
序章:版本控制的前世今生 在软件开发的漫长旅程中,版本控制犹如一位忠诚的伙伴,始终陪伴着开发者们。它的存在,解决了软件开发过程中代码管理的诸多难题,让团队协作更加高效,代码的演进更加有序。 简单来…...
c++提取矩形区域图像的梯度并拟合直线
c提取旋转矩形区域的边缘最强梯度点,并拟合直线 #include <opencv2/opencv.hpp> #include <iostream> #include <vector>using namespace cv; using namespace std;int main() {// 加载图像Mat img imread("image.jpg", IMREAD_GRAYS…...
【PyQt】超级超级笨的pyqt计算器案例
计算器 1.QT Designer设计外观 1.pushButton2.textEdit3.groupBox4.布局设计 2.加载ui文件 导入模块: sys:用于处理命令行参数。 QApplication:PyQt5 应用程序类。 QWidget:窗口基类。 uic:用于加载 .ui 文件。…...
每日一题——小根堆实现堆排序算法
小根堆实现堆排序算法 堆排序的基本思想堆排序的步骤 实现步骤1. 构建小根堆2. 删除最小元素并调整堆 C语言实现输出示例代码解释1. percolateDown 函数2. buildMinHeap 函数3. heapSort 函数4. printArray函数 排序过程详解步骤1:构建小根堆步骤2:删除堆…...
k8s集群
文章目录 项目描述项目环境系统与软件版本概览项目步骤 环境准备IP地址规划关闭selinux和firewall配置静态ip地址修改主机名添加hosts解析 项目步骤一、使用kubeadm安装k8s单master的集群环境(1个master2个node节点)1、互相之间建立免密通道2.关闭交换分…...
数据分析系列--[11] RapidMiner,K-Means聚类分析(含数据集)
一、数据集 二、导入数据 三、K-Means聚类 数据说明:提供一组数据,含体重、胆固醇、性别。 分析目标:找到这组数据中需要治疗的群体供后续使用。 一、数据集 点击下载数据集 二、导入数据 三、K-Means聚类 Ending, congratulations, youre done....
技术架构师成长路线(2025版)
目录 通用知识 计算机原理(1 - 2 个月) 数据结构(2 - 3 个月) 网络编程(1 - 2 个月) 软件工程(1 个月) 基础知识 Java 编程语言基础(2 - 3 个月) JVM&…...
NetLify账号无法登录解决办法
本文收录在【建站】专栏内,专栏目录:【建站】专栏目录 用github账号登录时,说校验失败 Authentication Error Authenticating failed due to the following error: Your account requires additional verification. Please check your email…...
linux本地部署deepseek-R1模型
国产开源大模型追平甚至超越了CloseAI的o1模型,大国崛起时刻!!! DeepSeek R1 本地部署指南 在人工智能技术飞速发展的今天,本地部署AI模型成为越来越多开发者和企业关注的焦点。本文将详细介绍如何在本地部署DeepS…...
集合通讯概览
集合通信概览 (1)通信的算法 是根据通讯的链路组成的 (2)因为通信链路 跟硬件强相关,所以每个CCL的库都不一样 芯片与芯片、不同U之间是怎么通信的 多卡训练:多维并行(xxx并行在上一期已经讲述…...
如何解决云台重力补偿?
如何解决云台重力补偿? 最近在调试步兵云台的时候,由于枪管、图传、摄像头等重力的原因,pitch轴的参数尤其难以调整,又不想抬升和降低使用两套不同的参数,所以使用了重力补偿,效果也是比较理想的,于是整理为一篇文章记录一下 一、问题根源:枪管重力在“搞事情” 想象…...
【LeetCode 刷题】回溯算法(4)-排列问题
此博客为《代码随想录》二叉树章节的学习笔记,主要内容为回溯算法排列问题相关的题目解析。 文章目录 46.全排列47.全排列 II 46.全排列 题目链接 class Solution:def permute(self, nums: List[int]) -> List[List[int]]:res, path [], []used [0] * len(n…...
FPGA|IP核PLL调用测试:建立工程
闲来无事,测试下FPGA的IP核调用 一、生成工程 1、打开软件新建工程 2、命名为PLL_test 3、选择芯片型号 4、生成工程如图...
数据的表示和运算
一-定点数的表示 1-定点数和浮点数 定点数:小数点的位置固定(常规计数) 浮点数:小数点的位置不固定(科学计数法) 2-定点数的表示 ①无符号数 整个机器字长的全部二进制位均为数值位,没有符号…...
文字显示省略号
多行文本溢出显示省略号...
22.Word:小张-经费联审核结算单❗【16】
目录 NO1.2 NO3.4 NO5.6.7 NO8邮件合并 MS搜狗输入法 NO1.2 用ms打开文件,而不是wps❗不然后面都没分布局→页面设置→页面大小→页面方向→上下左右:页边距→页码范围:多页:拼页光标处于→布局→分隔符:分节符…...
鲸鱼算法 matlab pso
算法原理 鲸鱼优化算法的核心思想是通过模拟座头鲸的捕食过程来进行搜索和优化。座头鲸在捕猎时会围绕猎物游动并产生气泡网,迫使猎物聚集。这一行为被用来设计搜索策略,使算法能够有效地找到全局最优解。 算法步骤 初始化:随机生成一…...
c++之模板进阶
在前面的文章中,我们已经简单的了解了模板的使用,在这篇文章中,我们将继续深入探讨模板 1.模板的特化 1.1 概念 通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果&a…...
C语言中的信号量
信号是操作系统中用来传递特定消息的机制。操作系统可以使用这种方式将程序运行过程中发生的各类特殊情况发送给程序,并按照其指定的逻辑进行处理。信号名称都以 “SIG” 作为前缀,如程序访问非法内存时,会产生名为 SIGSEGV 的信号。 程序需…...
AI主流大模型介绍和API价格比较
主流的大模型系列 ###1. OpenAI: GPT-4,GPT-4 Turbo, GPT-4o OpenAI 的介绍: 全称:Open Artificial Intelligence,简称OpenAI。性质:起初为非营利性组织,后转变为由营利性公司OpenAI LP及非营…...
自主Shell命令行解释器
什么是命令行 我们一直使用的"ls","cd","pwd","mkdir"等命令,都是在命令行上输入的,我们之前对于命令行的理解: 命令行是干啥的?是为我们做命令行解释的。 命令行这个东西实际上是我们…...
git笔记-简单入门
git笔记 git是一个分布式版本控制系统,它的优点有哪些呢?分为以下几个部分 与集中式的版本控制系统比起来,不用担心单点故障问题,只需要互相同步一下进度即可。支持离线编辑,每一个人都有一个完整的版本库。跨平台支持…...
重新刷题求职2-DAY1
DAY1 1.704. 二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 最普通的二分查找,查用的习惯左闭右…...
浅析DDOS攻击及防御策略
DDoS(分布式拒绝服务)攻击是一种通过大量计算机或网络僵尸主机对目标服务器发起大量无效或高流量请求,耗尽其资源,从而导致服务中断的网络攻击方式。这种攻击方式利用了分布式系统的特性,使攻击规模更大、影响范围更广…...
路径规划之启发式算法之二十九:鸽群算法(Pigeon-inspired Optimization, PIO)
鸽群算法(Pigeon-inspired Optimization, PIO)是一种基于自然界中鸽子群体行为的智能优化算法,由Duan等人于2014年提出。该算法模拟了鸽子在飞行过程中利用地标、太阳和磁场等导航机制的行为,具有简单、高效和易于实现的特点,适用于解决连续优化问题。 更多的仿生群体算法…...
SwiftUI 在 Xcode 预览修改视图 FetchedResults 对象的属性时为什么会崩溃?
概览 从 SwiftUI 诞生那天起,让秃头码农们又爱又恨的 Xcode 预览就在界面调试中扮演了及其重要的角色。不过,就是这位撸码中的绝对主角却尝尝在关键时刻“掉链子”。 比如当修改 SwiftUI 视图中 FetchedResults 对象的属性时,Xcode 预览可能…...
pytorch实现基于Word2Vec的词嵌入
PyTorch 实现 Word2Vec(Skip-gram 模型) 的完整代码,使用 中文语料 进行训练,包括数据预处理、模型定义、训练和测试。 1. 主要特点 支持中文数据,基于 jieba 进行分词 使用 Skip-gram 进行训练,适用于小数…...
MVC 文件夹:架构之美与实际应用
MVC 文件夹:架构之美与实际应用 引言 MVC(Model-View-Controller)是一种设计模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种架构模式不仅提高了代码的可维护性和可扩展性,而且使得开发流程更加清晰。本文将深入探讨MVC文…...
Python在线编辑器
from flask import Flask, render_template, request, jsonify import sys from io import StringIO import contextlib import subprocess import importlib import threading import time import ast import reapp Flask(__name__)RESTRICTED_PACKAGES {tkinter: 抱歉&…...
The Simulation技术浅析(四):随机数生成
随机数生成技术 是 The Simulation 中的核心组成部分,广泛应用于蒙特卡洛模拟、密码学、统计建模等领域。随机数生成技术主要分为 伪随机数生成器(PRNG,Pseudo-Random Number Generator) 和 真随机数生成器(TRNG,True Random Number Generator)。 1. 伪随机数生成器(PR…...
centos stream 9 安装 libstdc++-static静态库
yum仓库中相应的镜像源没有打开,libstdc-static在CRB这个仓库下,但是查看/etc/yum.repos.d/centos.repo,发现CRB镜像没有开启。 解决办法 如下图开启CRB镜像, 然后执行 yum makecache yum install glibc-static libstdc-static…...
Java自定义IO密集型和CPU密集型线程池
文章目录 前言线程池各类场景描述常见场景案例设计思路公共类自定义工厂类-MyThreadFactory自定义拒绝策略-RejectedExecutionHandlerFactory自定义阻塞队列-TaskQueue(实现 核心线程->最大线程数->队列) 场景1:CPU密集型场景思路&…...
Shell $0
个人博客地址:Shell $0 | 一张假钞的真实世界 我们已经知道在Shell中$0表示Shell脚本的文件名,但在有脚本调用的情形中,子脚本中的$0会是什么值呢?我们通过下面的实例来看。 已测试系统列表: Mac OS X EI Capitan 1…...
C++ Primer 标准库类型string
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
51c嵌入式~电路~合集25
我自己的原文哦~ https://blog.51cto.com/whaosoft/13241709 一、“开关电源”和“普通电源”的区别 什么叫开关电源 随着电力电子技术的发展和创新,使得开关电源技术也在不断地创新。目前,开关电源以小型、轻量和高效率的特点被广泛应用几乎所有的电…...
Vue3学习笔记-Vue开发前准备-1
一、安装15.0或更高版本的Node.js node -v npm -v 二、创建Vue项目 npm init vuelatest 三、Vue项目结构 node_modules: Vue项目运行的依赖文件public:资源文件夹package.json:信息描述文件...
架构技能(四):需求分析
需求分析,即分析需求,分析软件用户需要解决的问题。 需求分析的下一环节是软件的整体架构设计,需求是输入,架构是输出,需求决定了架构。 决定架构的是软件的所有需求吗?肯定不是,真正决定架构…...
51单片机 05 矩阵键盘
嘻嘻,LCD在RC板子上可以勉强装上,会有一点歪。 一、矩阵键盘 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式;采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态。…...
服务SDK三方新版中央仓库和私服发布详解
预备信息Github仓库发布Gradle版本匹配Gradle项目构建全局变量定义Gradle项目Nexus仓库配置与发布过程Gradle项目发布至Sonatype中央仓库配置过程总结当我们在实现一个项目技术总结、工具类封装或SDK封装,通常是为了方便开发者使用特定服务或平台而提供的一组工具和API。您可能…...
jmeter响应数据编码设置
jmeter响应数据编码设置 如果查看结果树的响应数据存在中文乱码,可以尝试以下方法: 1、找到jmeter的bin目录下的 jmeter.properties 文件,修改如下配置: 去掉sampleresult.default.encodingUTF-8前面的#号 2、保存文件后&#x…...
FPGA学习篇——开篇之作
今天正式开始学FPGA啦,接下来将会编写FPGA学习篇来记录自己学习FPGA 的过程! 今天是大年初六,简单学一下FPGA的相关概念叭叭叭! 一:数字系统设计流程 一个数字系统的设计分为前端设计和后端设计。在我看来࿰…...
Leetcode:680
1,题目 2,思路 首先就是判断它不发生改变会不会是回文如果不是回文,那么俩个指针从前往后与从后往前做对比如果俩字符不同,那就俩种选择,一种是保留前面的字符去掉后面字符,另一种是其反然后俩种选择只要满…...
Python教学:文档处理及箱线图等
代码1: import os import pandas as pd import numpy as py import os.path from os import listdir import openpyxl from openpyxl import Workbook import re import matplotlib.pyplot as plt # 导入matplotlib的绘图模块,用于可视化 cwdos.getcwd…...
SQLGlot:用SQLGlot解析SQL
几十年来,结构化查询语言(SQL)一直是与数据库交互的实际语言。在一段时间内,不同的数据库在支持通用SQL语法的同时演变出了不同的SQL风格,也就是方言。这可能是SQL被广泛采用和流行的原因之一。 SQL解析是解构SQL查询…...