WEB开发: 全栈工程师起步 - Python Flask +SQLite的管理系统实现
一、前言
罗马不是一天建成的。
每个全栈工程师都是从HELLO WORLD 起步的。
之前我们分别用NODE.JS 、ASP.NET Core 这两个框架实现过基于WebServer的全栈工程师入门教程。
今天我们用更简单的来实现: Python。
我们将用Python来实现一个学生管理应用,它包括Web服务器+管理前端+后端Api+数据库,并满足一个管理应用所具有的基本的增删查功能。由此来熟悉Phthon的webServer (Flask )应用。
二、流程和技术栈
先来看下我们设想的应用流程
然后根据这个来设定一下我们的技术栈:
-
前端:HTML + JS + CSS
前端开发利用HTML来构建网页的骨架和内容结构,CSS用于定义网页的样式和布局,如字体、颜色、空间等,确保网页在不同设备上的视觉效果一致。JavaScript则负责网页的动态交互功能,如响应用户输入、动画效果和与服务器的通信,使得网页变得互动性强,提升用户体验。 -
服务器:Python Flask
Flask是一个轻量级的Python Web框架,适合构建小型到中型的Web应用。它简洁、易于上手,并且高度可扩展。Flask允许开发者定义路由、处理HTTP请求、与数据库交互,并能够快速搭建RESTful API服务,广泛用于开发Web服务和微服务。Flask的灵活性使得开发者可以根据需求选择需要的功能和扩展。 -
数据库:SQLite
SQLite是一种轻量级的嵌入式关系型数据库管理系统,适用于桌面和移动设备应用。它将数据存储在一个单一的文件中,不需要独立的数据库服务器,安装和配置非常简单。SQLite支持SQL标准,可以高效地存储、查询、更新数据,适合用在低并发、数据量较小的项目中,常用于原型开发、小型应用和嵌入式系统。
三、文件结构
所以 首先你需要在自己的电脑上安装PYTHON。默认都有了。
然后需要 pip install sqlite3。 安装这个数据库引擎。
一切齐全,准备动手,动手前先确定一下这个项目的目录文件结构:
目录结构
/student-grade-management├── app.py # Flask应用的主程序├── students.db # SQLite数据库文件├── /templates # 存放HTML模板文件的文件夹| └── index.html # 主页面的HTML文件├── /static # 存放静态资源(如CSS, JS, 图片等)的文件夹├── style.css # 样式文件(CSS)└── script.js # 前端脚本(JavaScript)
这个目录结构是一个典型的 Flask 项目的结构,适用于一个简单的学生成绩管理系统。下面我将逐一解释每个文件和文件夹的作用:
详细解释
1. app.py
- 作用:这是你的 Flask Web 应用的主程序。Flask 是一个轻量级的 Python Web 框架,用于快速开发 Web 应用。
- 功能:在这个文件中,我们会定义所有的路由(URLs)、视图函数(处理请求的函数)和一些与数据库交互的代码。
- 例如:
/
路由显示学生成绩列表。/add
路由处理添加学生成绩。/delete/<id>
路由处理删除学生成绩。/search
路由处理按姓名查询学生成绩。
- 该文件还负责启动 Flask Web 服务器(通常使用
app.run()
)。
- 例如:
2. students.db
- 作用:这是 SQLite 数据库文件,存储系统中的所有数据。
- 功能:SQLite 是一个轻量级的数据库,它会将数据保存在本地文件中。这个数据库文件包含一个表(比如
students
),存储学生的姓名和成绩。- 该数据库可以使用 Python 的
sqlite3
库进行操作。 - 例如,系统会在此数据库中进行以下操作:
- 插入新学生成绩。
- 查询学生成绩。
- 删除学生成绩。
请注意这个db文件最开始需要用脚本生成,脚本中设定了各个字段、表名,见后i面的文件介绍。
- 该数据库可以使用 Python 的
3. /templates
-
作用:这个文件夹存放 Flask 应用的 HTML 模板文件,Flask 会使用 Jinja2 模板引擎来渲染这些 HTML 文件。
-
功能:
- Flask 会使用模板文件来动态生成页面内容。
- 在我们的项目中,
index.html
作为主页面模板,显示学生成绩列表,并提供添加、删除和查询功能。 - Jinja2 语法使得我们可以在 HTML 中插入 Python 变量、执行条件语句、循环等操作。
- 例如,学生的姓名和成绩列表会从数据库中获取,Flask 会将这些数据传递到模板中,然后通过模板渲染显示在页面上。
例如:
<table><thead><tr><th>姓名</th><th>成绩</th></tr></thead><tbody>{% for student in students %}<tr><td>{{ student.name }}</td><td>{{ student.grade }}</td></tr>{% endfor %}</tbody> </table>
4. /static
-
作用:
static
文件夹用来存放 Web 应用中不会变化的静态资源文件,如 CSS、JavaScript、图片等。 -
功能:这些静态文件是客户端直接访问的文件,不需要通过 Flask 后端处理。Flask 会自动处理
static
文件夹中的文件并提供服务。style.css
:存放样式表文件(CSS),用于控制页面的外观和布局。你可以在index.html
中引用它,定义页面的字体、颜色、布局等样式。script.js
:存放 JavaScript 文件,用于处理客户端的交互逻辑。例如,处理添加、删除、查询学生成绩的事件,或者发送 AJAX 请求来与 Flask 后端进行交互。
例如:
<link rel="stylesheet" href="/static/style.css"> <script src="/static/script.js"></script>
典型流程
- 用户在浏览器中访问 Flask 应用时,Flask 会根据请求路由选择适当的视图函数。
- 视图函数可以与数据库交互,获取或修改数据。
- 数据传递到模板中,模板使用 Jinja2 引擎动态生成 HTML 页面并返回给浏览器。
- 浏览器根据返回的 HTML 内容渲染页面,并加载
static
文件夹中的 CSS 和 JavaScript 资源。
四、源码
以下是各个部分的源码:
dbMake.py (这个是一个脚本,用来生成数据库,运行这个脚本可以在根目录下生成一个数据库文件 students.db)
import sqlite3# 连接数据库(如果数据库文件不存在,会自动创建)
conn = sqlite3.connect('students.db')# 创建一个cursor对象
cursor = conn.cursor()# 创建学生成绩表
cursor.execute('''
CREATE TABLE IF NOT EXISTS students (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,grade INTEGER NOT NULL
)
''')# 提交并关闭
conn.commit()
conn.close()
app.py
from flask import Flask, render_template, request, jsonify
import sqlite3app = Flask(__name__)# 获取数据库连接
def get_db_connection():conn = sqlite3.connect('students.db')conn.row_factory = sqlite3.Row # 返回字典类型的行return conn# 首页,显示学生成绩列表
@app.route('/')
def index():conn = get_db_connection()students = conn.execute('SELECT * FROM students').fetchall()conn.close()return render_template('index.html', students=students)# 添加学生成绩
@app.route('/add', methods=['POST'])
def add_student():name = request.form['name']grade = request.form['grade']conn = get_db_connection()conn.execute('INSERT INTO students (name, grade) VALUES (?, ?)', (name, grade))conn.commit()conn.close()return jsonify({"status": "success"})# 查询学生成绩
@app.route('/search', methods=['GET'])
def search_student():name = request.args.get('name', '')conn = get_db_connection()students = conn.execute('SELECT * FROM students WHERE name LIKE ?', ('%' + name + '%',)).fetchall()conn.close()return render_template('index.html', students=students)# 删除学生成绩
@app.route('/delete/<int:id>', methods=['GET'])
def delete_student(id):conn = get_db_connection()conn.execute('DELETE FROM students WHERE id = ?', (id,))conn.commit()conn.close()return jsonify({"status": "success"})if __name__ == '__main__':app.run(debug=True)
script.js
document.getElementById('add-student-form').addEventListener('submit', function (event) {event.preventDefault();const name = document.getElementById('name').value;const grade = document.getElementById('grade').value;fetch('/add', {method: 'POST',body: new URLSearchParams({'name': name,'grade': grade})}).then(response => response.json()).then(data => {if (data.status === 'success') {alert('学生成绩已添加!');window.location.reload(); // 刷新页面}});
});// 删除学生成绩
function deleteStudent(id) {if (confirm('确定要删除这个成绩吗?')) {fetch(`/delete/${id}`).then(response => response.json()).then(data => {if (data.status === 'success') {alert('学生成绩已删除!');window.location.reload(); // 刷新页面}});}
}// 查询学生成绩
document.getElementById('search-form').addEventListener('submit', function (event) {event.preventDefault();const name = document.getElementById('search-name').value;fetch(`/search?name=${name}`).then(response => response.text()).then(data => {document.body.innerHTML = data; // 更新页面内容});
});
style.css
body {font-family: Arial, sans-serif;margin: 20px;background-color: #f9f9f9;
}h1 {text-align: center;
}table {width: 50%;margin: 0 auto;border-collapse: collapse;
}th, td {padding: 10px;text-align: center;
}form {margin-top: 20px;text-align: center;
}input, button {padding: 10px;margin: 5px;
}
index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>学生成绩管理系统</title><link rel="stylesheet" href="/static/style.css">
</head>
<body><h1>学生成绩管理系统</h1><h2>查询学生成绩</h2><form id="search-form"><label for="search-name">姓名: </label><br><input type="text" id="search-name" name="name"><br><br><button type="submit">查询</button></form><h2>学生成绩列表</h2><table border="1"><thead><tr><th>姓名</th><th>成绩</th><th>操作</th></tr></thead><tbody id="students-list">{% for student in students %}<tr><td>{{ student.name }}</td><td>{{ student.grade }}</td><td><button onclick="deleteStudent({{ student.id }})">删除</button></td></tr>{% endfor %}</tbody></table><h2>添加学生成绩</h2><form id="add-student-form"><label for="name">姓名: </label><br><input type="text" id="name" name="name"><br><br><label for="grade">成绩: </label><br><input type="number" id="grade" name="grade"><br><br><button type="submit">添加</button></form><script src="/static/script.js"></script>
</body>
</html>
准备完毕,命令行切入根目录,执行 python app.py 启动应用
显示 服务器启动了 端口是5000 使用 http://127.0.0.1:5000 可以访问这个应用:
万丈高楼平地起,这个还有一些bug,可以自己修复。祝你好运!
相关文章:
WEB开发: 全栈工程师起步 - Python Flask +SQLite的管理系统实现
一、前言 罗马不是一天建成的。 每个全栈工程师都是从HELLO WORLD 起步的。 之前我们分别用NODE.JS 、ASP.NET Core 这两个框架实现过基于WebServer的全栈工程师入门教程。 今天我们用更简单的来实现: Python。 我们将用Python来实现一个学生管理应用࿰…...
将 Matplotlib 图形转换为 PIL 图像并返回
将 Matplotlib 图形转换为 PIL 图像并返回 前言完整代码Matplotlib 中 fig 和 ax 的关系示例: 问题分析常见错误及解决方案总结 前言 Matplotlib 是 Python 里最流行的图表展示库,PIL (Python Imaging Library)则是一个强大的图像处理库。在开发过程中&…...
F5中获取客户端ip地址(client ip)
当F5设备对其原始设置上的所有IP地址使用NAT时,连接到poo成员(nodes、backend servers)的出站连接将是NAT IP地址。 pool 成员(nodes、backend servers)将无法看到真实的客户端 ip地址,因为看到的是F5上的…...
点焊机器人维修-ABB-KUKA-FANUC-YASKAWA
在正式启用点焊机器人之前,一项至关重要的预备步骤便是进行焊枪的全面设置操作。以FANUC机器人为例,其焊枪的设置流程涵盖了多个关键环节,如焊枪运动方向的精确规划、焊枪规格的选择以及零点标定的细致执行等。这些设置均须严格依据实际所采用…...
springboot448教学辅助系统(论文+源码)_kaic
摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱,出错率高,信息安全性差&#x…...
网络地址转换(NAT)和端口映射
1. 网络地址转换(NAT) 1.1 NAT的应用场景 (1)应用场景:允许将私有IP地址映射到公网地址,以减缓IP地址空间的消耗 ①需要连接Internet,但主机没有公网IP地址 ②更换了一个新的ISP,需要重新组织网络时&…...
iClent3D for Cesium 实现无人机巡检飞行效果
作者:gaogy 1、背景 随着地理信息技术的发展,三维地球技术逐渐成为了许多领域中的核心工具,尤其是在城市规划、环境监测、航空航天以及军事领域。三维地图和场景的应用正在帮助人们更加直观地理解空间数据,提供更高效的决策支持。…...
低比特语言模型 是一种利用较少比特数进行语言建模的技术
Vanilla LLM: 基础的全精度语言模型,通常在较高比特数下运作 Vanilla LLM,或称为“基础的全精度语言模型”,是指使用标准的浮点数(通常是16位或32位)进行训练和推理的语言模型。这些模型依赖于经典的神经网络结构&…...
ES6中的map和set
Set ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。 Set本身是一个构造函数,用来生成 Set 数据结构。 以下代码 const s new Set();[2, 3, 5, 4, 5, 2, 2].forEach(x > s.add(x));for (let i of s…...
【WRF安装】WRF编译错误总结1:HDF5库包安装
目录 1 HDF5库包安装有误:HDF5 not set in environment. Will configure WRF for use without.HDF5的重新编译 错误原因1:提示 overflow 错误1. 检查系统是否缺少依赖库或工具2. 检查和更新编译器版本3. 检查 ./configure 报错信息4. 检查系统环境变量5.…...
MyBatis常见面试题总结
#{} 和 ${} 的区别是什么? 注:这道题是面试官面试我同事的。 答: ${}是 Properties 文件中的变量占位符,它可以用于标签属性值和 sql 内部,属于原样文本替换,可以替换任意内容,比如${driver}…...
Qt生成随机数的方法
后台接口要求传个流水单号,流水号的格式是:“设备序列号”“设备MAC地址”“20位的随机数”。 具体的是: “设备序列号”:就是烧录工具写入设备的序列编号,这就不多说了,读出来就行; “设备MAC地…...
深入探索Vue.js中的v-if指令:条件渲染的高级技巧
深入探索Vue.js中的v-if指令:条件渲染的高级技巧 引言 在现代Web开发中,根据条件动态地渲染或移除DOM元素是一个常见的需求。Vue.js提供了一种简洁而强大的方法来实现这一目标,即通过v-if指令来根据表达式的值来控制元素的渲染。本文将详细…...
【记录50】uniapp安装uview插件,样式引入失败分析及解决
SassError: Undefined variable: "$u-border-color". 表示样式变量$u-border-color没定义,实际是定义的 首先确保安装了scss/sass 其次,根目录下 app.vue中是否全局引入 <style lang"scss">import /uni_modules/uview-ui/in…...
NTLMv2 离线爆破
攻击者(kali):192.168.72.162 受害者(administrator):192.168.72.163 因为 NTLM 身份验证是通过计算正确的挑战值得出的,所以如果我们能获取域用户的 NTLM 认证某一服务的 Net-NTLM v2 Hash …...
LabVIEW实现RFID通信
目录 1、RFID通信原理 2、硬件环境部署 3、程序架构 4、前面板设计 5、程序框图设计 6、测试验证 本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合实际案例,展示如何利用LabVIEW和常用模块实现物联网系…...
【Three.js基础学习】31.Lights Shading
前言 关于灯光如何在着色器中应用! 下面将创建三个灯光 分别是点光源,环境光,方向光通过这几种光应用着色器显示对应阴影 学习灯光阴影,着色器的使用 添加三盏灯 点光,方向光,环境光 创建一个环境光 在现…...
Oracle Database 21c Express Edition数据库 和 Sqlplus客户端安装配置
目录 一. 前置条件二. Win10安装配置Oracle数据库2.1 数据库获取2.2 数据库安装2.3 数据库配置确认2.4 数据库访问 三. Win10配置Oracle数据库可对外访问3.1 打开文件和打印机共享3.2 开放1521端口 四. 端口与地址确认4.1 查看监听器的状态4.2 Win10查看1521端口是否被监听4.3 …...
IDEA搭建springboot demo
如下所示创建SpringBootTest18项目,我选的maven,创建完成项目后,maven会自动下载一些依赖库到maven的repository目录中。 创建的项目结构如下图所示 接下来在项目中加入Framework支持,右击项目,弹出的菜单如下图所示&a…...
SQLite Update 语句
SQLite Update 语句 SQLite 的 UPDATE 语句用于更新数据库表中的现有记录。使用 UPDATE 语句,您可以修改一个或多个列的值。本教程将详细介绍如何使用 SQLite UPDATE 语句,包括语法、示例以及一些最佳实践。 语法 SQLite UPDATE 语句的基本语法如下&a…...
node.js的简单示例
Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,用于方便地构建快速、可扩展的网络应用。下面是一个简单的Node.js示例,它创建了一个简单的HTTP服务器,当访问服务器时,它会响应“Hello World” // 引入Node.js的HTTP模块…...
fpga系列 HDL:Quartus II 时序约束 静态时序分析 (STA) test.out.sdc的文件结构
test.out.sdc的文件结构 ## Generated SDC file "test.out.sdc"## Copyright (C) 1991-2013 Altera Corporation ## Your use of Altera Corporations design tools, logic functions ## and other software and tools, and its AMPP partner logic ## functions,…...
Restaurants WebAPI(一)—— clean architecture
文章目录 项目地址一、Restaurants.Domain 核心业务层1.1 Entities实体层1.2 Repositories 数据操作EF的接口二、Restaurants.Infrastructure 基础设施层2.1 Persistence 数据EF CORE配置2.2 Repositories 数据查询实现2.3 Extensions 服务注册三、Restaurants.Application用例…...
A Unified Framework for STAR-RIS Coefficients Optimization
文章目录 AbstractB. A Penalty-based Reformulation of (1) III. OPTIMIZING AUXILIARY VARIABLES φ \boldsymbol φ φ IN P1IV. A CASE STUDY OF P2 ON DOWNLINK STAR-RIS ASSISTED TRANSMISSION SYSTEMA. 优化 x , ρ , w , λ t x, \rho, \mathbf{w}, \lambda^t x,ρ,w…...
rebase ‘A‘ onto ‘master‘ 和 merge ‘master‘ into ‘A‘有什么区别
在Git版本控制系统中,rebase 和 merge 是两种不同的操作,用于合并分支。rebase A onto master 和 merge master into A 虽然最终目的都是将两个分支的更改合并在一起,但它们在处理方式和结果上有所不同。 rebase ‘A’ onto ‘master’ 含义…...
谷歌发布最新视频生成模型 Veo 2:视频生成AI新王牌
谷歌 在当今数字化快速发展的时代,人工智能视频生成技术正不断突破创新。就在12月17日,谷歌推出了一个新的视频模型 Veo 2 。 Veo 2 Veo 2 Veo 2 可以创建各种主题和风格的高质量视频。在谷歌官方由人工评估员判断中,Veo 2 与领先模型相比取得…...
2025erp系统开源免费进销存系统搭建教程/功能介绍/上线即可运营软件平台源码
系统介绍 基于ThinkPHP与LayUI构建的全方位进销存解决方案 本系统集成了采购、销售、零售、多仓库管理、财务管理等核心功能模块,旨在为企业提供一站式进销存管理体验。借助详尽的报表分析和灵活的设置选项,企业可实现精细化管理,提升运营效…...
基于Docker的Minio分布式集群实践
目录 1. 说明 2. 配置表 3. 步骤 3.1 放行服务端口 3.2 docker-compose 编排 4. 入口反向代理与负载均衡配置 4.1 api入口 4.2 管理入口 5. 用例 6. 参考 1. 说明 以多节点的Docker容器方式实现minio存储集群,并配以nginx反向代理及负载均衡作为访问入口。…...
解决node.js的req.body为空的问题
从昨晚一直在试,明明之前用的封装的axios发送请求给其他的后端(springboot)是可以的,但昨天用了新项目的后端(node.js)就不行。 之前用了代理,所以浏览器发送的post请求不会被拦截,…...
数据结构期末算法复习:树、查找、排序
一、树 1.二叉链-定义 typedef struct BiTNode{ ElemType data;//数据域 struct BiTNode *lchild ,*rchild;//左、右孩子指针 }BiTNode , *BiTree ;2.查找值为x的结点 BTNode FindNode(BTNode b,ElemType x) { BTNode *p;if (bNULL) return NULL;else if (…...
复习打卡Linux篇
目录 1. Linux常用操作命令 2. vim编辑器 3. 用户权限 4. Linux系统信息查看 1. Linux常用操作命令 基础操作: 命令说明history查看历史执行命令ls查看指定目录下内容ls -a查看所有文件 包括隐藏文件ls -l ll查看文件详细信息,包括权限类型时间大小…...
OpenAI API深度解析:参数、Token、计费与多种调用方式
随着人工智能技术的飞速发展,OpenAI API已成为许多开发者和企业的得力助手。本文将深入探讨OpenAI API的参数、Token、计费方式,以及如何通过Rest API(以Postman为例)、Java API调用、工具调用等方式实现与OpenAI的交互࿰…...
Centos7 部署ZLMediakit
1、拉取代码 #国内用户推荐从同步镜像网站gitee下载 git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit #千万不要忘记执行这句命令 git submodule update --init 2、安装编译器 sudo yum -y install gcc 3、安装cmake sudo yum -y install cmake 4…...
python:用 sklearn.metrics 评价 K-Means 聚类模型
sklearn 的 metrics 模块提供的聚类模型评价指标如下: ARI 评价法(兰德系数): adjusted_rand_score AMI 评价法(相互信息): adjusted_mutual_info_score V-measure 评分 : completeness_score FMI 评价法 : fowlkes_m…...
谁说C比C++快?
看到这个问题,我我得说:这事儿没有那么简单。 1. 先把最大的误区打破 "C永远比C快" —— 某位1990年代的程序员 这种说法就像"自行车永远比汽车省油"一样荒谬。我们来看个例子: // C风格 char* str (char*)malloc(100…...
算法刷题Day23:BM60 括号生成
题目链接 描述:给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合。 例如,给出n3,解集为: “((()))”, “(()())”, “(())()”, “()()()”, “()(())” 思路: 回溯左子树不断添加‘&#…...
基于Redis实现令牌桶算法
基于Redis实现令牌桶算法 令牌桶算法算法流程图优点缺点 实现其它限流算法 令牌桶算法 令牌桶是一种用于分组交换和电信网络的算法。它可用于检查数据包形式的数据传输是否符合定义的带宽和突发性限制(流量不均匀或变化的衡量标准)。它还可以用作调度算…...
XXE练习
pikachu-XXE靶场 1.POC:攻击测试 <?xml version"1.0"?> <!DOCTYPE foo [ <!ENTITY xxe "a">]> <foo>&xxe;</foo> 2.EXP:查看文件 <?xml version"1.0"?> <!DOCTYPE foo [ <!ENTITY xxe SY…...
Mac上使用ln指令创建软链接、硬链接
在Mac、Linux和Unix系统中,软连接(Symbolic Link)和硬连接(Hard Link)是两种不同的文件链接方式。它们的主要区别如下: 区别: 硬连接: 不能跨文件系统。不能链接目录(为…...
单元测试-Unittest框架实践
文章目录 1.Unittest简介1.1 自动化测试用例编写步骤1.2 相关概念1.3 用例编写规则1.4 断言方法 2.示例2.1 业务代码2.2 编写测试用例2.3 生成报告2.3.1 方法12.3.2 方法2 1.Unittest简介 Unittest是Python自带的单元测试框架,适用于:单元测试、Web自动…...
JAVA没有搞头了吗?
前言 今年的Java程序员群体似乎承受着前所未有的焦虑。投递简历无人问津,难得的面试机会也难以把握,即便成功入职,也往往难以长久。于是,不少程序员感叹:互联网的寒冬似乎又一次卷土重来,环境如此恶劣&…...
ECharts 饼图:数据可视化的重要工具
ECharts 饼图:数据可视化的重要工具 引言 在数据分析和可视化的领域,ECharts 是一个广受欢迎的开源库。它由百度团队开发,用于在网页中创建交互式图表。ECharts 提供了多种图表类型,包括柱状图、折线图、散点图等,而饼图则是其中最常用的一种。本文将深入探讨 ECharts 饼…...
arcGIS使用笔记(无人机tif合并、导出、去除黑边、重采样)
无人机航拍建图之后,通过大疆智图软件可以对所飞行的区域的进行拼图,但是如果需要对拼好的图再次合并,则需要利用到arcGIS软件。下面介绍arcGIS软件在这个过程中常用的操作。 1.导入tif文件并显示的方法:点击“”图标进行导入操作…...
0 前言
ArCS作为一个基于Rust的CAD(计算机辅助设计)开源系统,尽管已经有四年未更新,但其设计理念和技术实现仍然具有很高的学习和参考价值。以下是对ArCS项目的进一步分析和解读: 一、项目亮点与技术优势 高效与安全的Rust语…...
ubuntu server 安装
1 获取ubuntu https://ubuntu.com/download/server 2 安装ubuntu 详细教程查看视频: ubunut server 安装_哔哩哔哩_bilibili...
linux 添加默认网关
在linux 可以使用 route 命令添加默认网关,假设添加的默认网关是192.168.159.2 添加方式如下: route add default gw 192.168.159.2 以上命令只需要把add 改成 del ,就能删除刚才添加的路由 route del default gw 192.168.159.2 #该命…...
一个开源的自托管虚拟浏览器项目,支持在安全、私密的环境中使用浏览器
大家好,今天给大家分享一个开源的自托管虚拟浏览器项目Neko,旨在利用 WebRTC 技术在 Docker 容器中运行虚拟浏览器,为用户提供安全、私密且多功能的浏览体验。 项目介绍 Neko利用 WebRTC 技术在 Docker 容器中运行虚拟浏览器,提供…...
Qt之修改窗口标题、图标以及自定义标题栏(九)
Qt开发 系列文章 - titles-icons-titlebars(九) 目录 前言 一、修改标题 二、添加图标 三、更换标题栏 1.效果演示 2.创建标题栏类 3.定义相关函数 4.使用标题栏类 总结 前言 在我们利用Qt设计软件时,经常需要修改窗口标题、更改软…...
can总线相关概念---frame-signal-message
1、frame 帧是数据链路层的传输单元。它将上层传入的数据添加一个头部和尾部,组成了帧。它的起始点和目的点都是数据链路层。 2、signal 3、message-报文 我们将位于应用层的信息分组称为报文。报文是网络中交换与传输的数据单元,也是网络传输的单元。…...