新能源汽车可视化大屏系统毕业设计
以下是一个基于Python和Flask框架的新能源汽车可视化大屏系统后台代码示例。这个系统提供API接口用于前端大屏展示新能源汽车相关数据。
- 主应用文件 (app.py)
python
from flask import Flask, jsonify, request
from flask_cors import CORS
import random
from datetime import datetime, timedelta
import time
import threading
import sqlite3
from collections import defaultdict
app = Flask(name)
CORS(app) # 允许跨域请求
模拟数据库
DATABASE = ‘new_energy_vehicles.db’
def init_db():
conn = sqlite3.connect(DATABASE)
c = conn.cursor()
# 创建车辆信息表
c.execute('''CREATE TABLE IF NOT EXISTS vehicles(id INTEGER PRIMARY KEY AUTOINCREMENT,vin TEXT UNIQUE,brand TEXT,model TEXT,battery_capacity REAL,range INTEGER,production_date TEXT,status TEXT)''')# 创建充电记录表
c.execute('''CREATE TABLE IF NOT EXISTS charging_records(id INTEGER PRIMARY KEY AUTOINCREMENT,vin TEXT,station_id TEXT,start_time TEXT,end_time TEXT,energy_consumed REAL,cost REAL)''')# 创建行驶记录表
c.execute('''CREATE TABLE IF NOT EXISTS driving_records(id INTEGER PRIMARY KEY AUTOINCREMENT,vin TEXT,start_time TEXT,end_time TEXT,distance REAL,energy_consumed REAL,avg_speed REAL)''')# 创建充电站表
c.execute('''CREATE TABLE IF NOT EXISTS charging_stations(id INTEGER PRIMARY KEY AUTOINCREMENT,station_id TEXT UNIQUE,name TEXT,location TEXT,total_ports INTEGER,available_ports INTEGER,status TEXT)''')conn.commit()
conn.close()
初始化数据库
init_db()
模拟数据生成器
class DataGenerator:
@staticmethod
def generate_vehicle_data():
brands = [‘特斯拉’, ‘比亚迪’, ‘蔚来’, ‘小鹏’, ‘理想’, ‘广汽埃安’, ‘极氪’, ‘哪吒’]
models = {
‘特斯拉’: [‘Model 3’, ‘Model Y’, ‘Model S’, ‘Model X’],
‘比亚迪’: [‘汉EV’, ‘唐EV’, ‘秦PLUS EV’, ‘海豚’],
‘蔚来’: [‘ES6’, ‘ES8’, ‘ET7’, ‘ET5’],
‘小鹏’: [‘P7’, ‘G3’, ‘P5’, ‘G9’],
‘理想’: [‘L9’, ‘L8’, ‘L7’, ‘ONE’],
‘广汽埃安’: [‘LX’, ‘V’, ‘Y’, ‘S’],
‘极氪’: [‘001’, ‘009’],
‘哪吒’: [‘U’, ‘V’, ‘S’]
}
brand = random.choice(brands)model = random.choice(models[brand])battery_capacity = round(random.uniform(30, 100), 1)vehicle_range = int(battery_capacity * random.uniform(5, 7))return {'vin': f'LV{random.randint(1000000000000000, 9999999999999999)}','brand': brand,'model': model,'battery_capacity': battery_capacity,'range': vehicle_range,'production_date': f'{random.randint(2018, 2023)}-{random.randint(1, 12):02d}-{random.randint(1, 28):02d}','status': random.choice(['行驶中', '充电中', '空闲', '维修中'])}@staticmethod
def generate_charging_station_data():locations = ['北京', '上海', '广州', '深圳', '杭州', '成都', '重庆', '武汉']prefixes = ['国家电网', '特来电', '星星充电', '南方电网', '特斯拉超充']return {'station_id': f'CS{random.randint(100000, 999999)}','name': f'{random.choice(prefixes)}{random.choice(["中心站", "快充站", "超级充电站"])}','location': f'{random.choice(locations)}{random.choice(["市", ""])}{random.choice(["朝阳区", "浦东新区", "天河区", "南山区", "余杭区", "高新区"])}','total_ports': random.randint(4, 20),'available_ports': random.randint(0, 4),'status': random.choice(['运营中', '建设中', '维护中'])}
初始化一些模拟数据
def init_sample_data():
conn = sqlite3.connect(DATABASE)
c = conn.cursor()
# 检查是否有数据,没有则插入
c.execute("SELECT COUNT(*) FROM vehicles")
if c.fetchone()[0] == 0:for _ in range(100):vehicle = DataGenerator.generate_vehicle_data()c.execute("INSERT INTO vehicles (vin, brand, model, battery_capacity, range, production_date, status) VALUES (?, ?, ?, ?, ?, ?, ?)",(vehicle['vin'], vehicle['brand'], vehicle['model'], vehicle['battery_capacity'], vehicle['range'], vehicle['production_date'], vehicle['status']))c.execute("SELECT COUNT(*) FROM charging_stations")
if c.fetchone()[0] == 0:for _ in range(20):station = DataGenerator.generate_charging_station_data()c.execute("INSERT INTO charging_stations (station_id, name, location, total_ports, available_ports, status) VALUES (?, ?, ?, ?, ?, ?)",(station['station_id'], station['name'], station['location'], station['total_ports'], station['available_ports'], station['status']))conn.commit()
conn.close()
init_sample_data()
实时数据更新线程
class RealTimeDataUpdater(threading.Thread):
def init(self):
super().init()
self.daemon = True
self.running = True
def run(self):while self.running:try:conn = sqlite3.connect(DATABASE)c = conn.cursor()# 更新车辆状态c.execute("SELECT vin FROM vehicles")vins = [row[0] for row in c.fetchall()]for vin in vins:new_status = random.choice(['行驶中', '充电中', '空闲', '维修中'])c.execute("UPDATE vehicles SET status=? WHERE vin=?", (new_status, vin))# 随机生成行驶或充电记录if new_status == '行驶中':start_time = datetime.now() - timedelta(minutes=random.randint(1, 120))end_time = start_time + timedelta(minutes=random.randint(10, 180))distance = round(random.uniform(5, 200), 1)energy_consumed = round(distance * random.uniform(0.12, 0.18), 1)avg_speed = random.randint(30, 90)c.execute("INSERT INTO driving_records (vin, start_time, end_time, distance, energy_consumed, avg_speed) VALUES (?, ?, ?, ?, ?, ?)",(vin, start_time.isoformat(), end_time.isoformat(), distance, energy_consumed, avg_speed))elif new_status == '充电中':c.execute("SELECT station_id FROM charging_stations WHERE status='运营中' AND available_ports>0 ORDER BY RANDOM() LIMIT 1")station = c.fetchone()if station:station_id = station[0]start_time = datetime.now() - timedelta(minutes=random.randint(1, 60))end_time = start_time + timedelta(minutes=random.randint(30, 180))energy_consumed = round(random.uniform(10, 60), 1)cost = round(energy_consumed * random.uniform(1.2, 2.5), 2)c.execute("INSERT INTO charging_records (vin, station_id, start_time, end_time, energy_consumed, cost) VALUES (?, ?, ?, ?, ?, ?)",(vin, station_id, start_time.isoformat(), end_time.isoformat(), energy_consumed, cost))# 减少可用充电端口c.execute("UPDATE charging_stations SET available_ports=available_ports-1 WHERE station_id=?", (station_id,))# 更新充电站可用端口c.execute("SELECT station_id FROM charging_stations WHERE status='运营中'")stations = [row[0] for row in c.fetchall()]for station_id in stations:c.execute("SELECT available_ports, total_ports FROM charging_stations WHERE station_id=?", (station_id,))available, total = c.fetchone()# 随机增加或减少可用端口change = random.randint(-2, 2)new_available = max(0, min(total, available + change))if new_available != available:c.execute("UPDATE charging_stations SET available_ports=? WHERE station_id=?", (new_available, station_id))conn.commit()conn.close()# 每分钟更新一次time.sleep(60)except Exception as e:print(f"Error in real-time data updater: {e}")time.sleep(10)def stop(self):self.running = False
启动实时数据更新线程
data_updater = RealTimeDataUpdater()
data_updater.start()
API路由
@app.route(‘/api/dashboard/summary’, methods=[‘GET’])
def get_dashboard_summary():
conn = sqlite3.connect(DATABASE)
c = conn.cursor()
# 车辆总数
c.execute("SELECT COUNT(*) FROM vehicles")
total_vehicles = c.fetchone()[0]# 按品牌统计
c.execute("SELECT brand, COUNT(*) FROM vehicles GROUP BY brand")
brands = {row[0]: row[1] for row in c.fetchall()}# 按状态统计
c.execute("SELECT status, COUNT(*) FROM vehicles GROUP BY status")
statuses = {row[0]: row[1] for row in c.fetchall()}# 充电站统计
c.execute("SELECT COUNT(*) FROM charging_stations WHERE status='运营中'")
operating_stations = c.fetchone()[0]c.execute("SELECT SUM(total_ports) FROM charging_stations WHERE status='运营中'")
total_ports = c.fetchone()[0] or 0c.execute("SELECT SUM(available_ports) FROM charging_stations WHERE status='运营中'")
available_ports = c.fetchone()[0] or 0# 今日充电量
today = datetime.now().date().isoformat()
c.execute("SELECT SUM(energy_consumed) FROM charging_records WHERE date(start_time)=?", (today,))
today_charging = c.fetchone()[0] or 0# 今日行驶里程
c.execute("SELECT SUM(distance) FROM driving_records WHERE date(start_time)=?", (today,))
today_distance = c.fetchone()[0] or 0conn.close()return jsonify({'total_vehicles': total_vehicles,'brand_distribution': brands,'status_distribution': statuses,'charging_stations': {'total': operating_stations,'ports': {'total': total_ports,'available': available_ports,'utilization': round((total_ports - available_ports) / total_ports * 100, 1) if total_ports > 0 else 0}},'today_stats': {'charging_energy': round(today_charging, 1),'distance': round(today_distance, 1)},'timestamp': datetime.now().isoformat()
})
@app.route(‘/api/vehicles/list’, methods=[‘GET’])
def get_vehicle_list():
page = int(request.args.get(‘page’, 1))
page_size = int(request.args.get(‘page_size’, 10))
offset = (page - 1) * page_size
conn = sqlite3.connect(DATABASE)
c = conn.cursor()c.execute("SELECT * FROM vehicles LIMIT ? OFFSET ?", (page_size, offset))
vehicles = []
for row in c.fetchall():vehicles.append({'id': row[0],'vin': row[1],'brand': row[2],'model': row[3],'battery_capacity': row[4],'range': row[5],'production_date': row[6],'status': row[7]})c.execute("SELECT COUNT(*) FROM vehicles")
total = c.fetchone()[0]conn.close()return jsonify({'data': vehicles,'pagination': {'page': page,'page_size': page_size,'total': total,'total_pages': (total + page_size - 1) // page_size}
})
@app.route(‘/api/charging/stations’, methods=[‘GET’])
def get_charging_stations():
conn = sqlite3.connect(DATABASE)
c = conn.cursor()
c.execute("SELECT * FROM charging_stations")
stations = []
for row in c.fetchall():stations.append({'id': row[0],'station_id': row[1],'name': row[2],'location': row[3],'total_ports': row[4],'available_ports': row[5],'status': row[6]})conn.close()return jsonify(stations)
@app.route(‘/api/charging/records’, methods=[‘GET’])
def get_charging_records():
days = int(request.args.get(‘days’, 7))
start_date = (datetime.now() - timedelta(days=days)).date().isoformat()
conn = sqlite3.connect(DATABASE)
c = conn.cursor()# 按天统计充电量
c.execute('''SELECT date(start_time) as day, SUM(energy_consumed), COUNT(*)FROM charging_records WHERE date(start_time) >= ?GROUP BY dayORDER BY day''', (start_date,))daily_stats = []
for row in c.fetchall():daily_stats.append({'date': row[0],'energy': round(row[1], 1),'sessions': row[2]})# 按充电站统计
c.execute('''SELECT s.name, COUNT(*) as sessions, SUM(c.energy_consumed) as energyFROM charging_records cJOIN charging_stations s ON c.station_id = s.station_idWHERE date(c.start_time) >= ?GROUP BY s.nameORDER BY energy DESCLIMIT 10''', (start_date,))station_stats = []
for row in c.fetchall():station_stats.append({'station': row[0],'sessions': row[1],'energy': round(row[2], 1)})conn.close()return jsonify({'daily_stats': daily_stats,'station_stats': station_stats
})
@app.route(‘/api/driving/records’, methods=[‘GET’])
def get_driving_records():
days = int(request.args.get(‘days’, 7))
start_date = (datetime.now() - timedelta(days=days)).date().isoformat()
conn = sqlite3.connect(DATABASE)
c = conn.cursor()# 按天统计行驶里程
c.execute('''SELECT date(start_time) as day, SUM(distance), SUM(energy_consumed), COUNT(*)FROM driving_records WHERE date(start_time) >= ?GROUP BY dayORDER BY day''', (start_date,))daily_stats = []
for row in c.fetchall():daily_stats.append({'date': row[0],'distance': round(row[1], 1),'energy': round(row[2], 1),'trips': row[3],'efficiency': round(row[1] / row[2], 1) if row[2] > 0 else 0})# 按品牌统计平均效率
c.execute('''SELECT v.brand, AVG(d.distance/d.energy_consumed) as avg_efficiencyFROM driving_records dJOIN vehicles v ON d.vin = v.vinWHERE date(d.start_time) >= ?GROUP BY v.brandORDER BY avg_efficiency DESC''', (start_date,))brand_efficiency = []
for row in c.fetchall():brand_efficiency.append({'brand': row[0],'efficiency': round(row[1], 1)})conn.close()return jsonify({'daily_stats': daily_stats,'brand_efficiency': brand_efficiency
})
@app.route(‘/api/map/vehicles’, methods=[‘GET’])
def get_map_vehicles():
# 模拟车辆位置数据
vehicles = []
conn = sqlite3.connect(DATABASE)
c = conn.cursor()
c.execute("SELECT vin, brand, model, status FROM vehicles WHERE status IN ('行驶中', '充电中') LIMIT 50")
for row in c.fetchall():# 生成随机位置(中国范围内)lat = round(random.uniform(21.0, 42.0), 6)lng = round(random.uniform(98.0, 122.0), 6)vehicles.append({'vin': row[0],'brand': row[1],'model': row[2],'status': row[3],'location': [lat, lng],'battery': random.randint(10, 90)})conn.close()return jsonify(vehicles)
@app.route(‘/api/map/stations’, methods=[‘GET’])
def get_map_stations():
# 获取充电站位置数据
stations = []
conn = sqlite3.connect(DATABASE)
c = conn.cursor()
c.execute("SELECT station_id, name, location, available_ports, total_ports FROM charging_stations WHERE status='运营中'")
for row in c.fetchall():# 从位置信息中提取坐标(模拟)# 实际应用中应该存储真实的经纬度lat = round(random.uniform(21.0, 42.0), 6)lng = round(random.uniform(98.0, 122.0), 6)stations.append({'id': row[0],'name': row[1],'location': row[2],'coordinates': [lat, lng],'available_ports': row[3],'total_ports': row[4],'utilization': round((row[4] - row[3]) / row[4] * 100, 1) if row[4] > 0 else 0})conn.close()return jsonify(stations)
if name == ‘main’:
app.run(host=‘0.0.0.0’, port=5000, debug=True)
2. 数据库初始化脚本 (init_db.py)
python
import sqlite3
from app import DATABASE, DataGenerator
def init_database():
conn = sqlite3.connect(DATABASE)
c = conn.cursor()
# 删除现有表
c.execute("DROP TABLE IF EXISTS vehicles")
c.execute("DROP TABLE IF EXISTS charging_records")
c.execute("DROP TABLE IF EXISTS driving_records")
c.execute("DROP TABLE IF EXISTS charging_stations")# 重新创建表
c.execute('''CREATE TABLE vehicles(id INTEGER PRIMARY KEY AUTOINCREMENT,vin TEXT UNIQUE,brand TEXT,model TEXT,battery_capacity REAL,range INTEGER,production_date TEXT,status TEXT)''')c.execute('''CREATE TABLE charging_records(id INTEGER PRIMARY KEY AUTOINCREMENT,vin TEXT,station_id TEXT,start_time TEXT,end_time TEXT,energy_consumed REAL,cost REAL)''')c.execute('''CREATE TABLE driving_records(id INTEGER PRIMARY KEY AUTOINCREMENT,vin TEXT,start_time TEXT,end_time TEXT,distance REAL,energy_consumed REAL,avg_speed REAL)''')c.execute('''CREATE TABLE charging_stations(id INTEGER PRIMARY KEY AUTOINCREMENT,station_id TEXT UNIQUE,name TEXT,location TEXT,total_ports INTEGER,available_ports INTEGER,status TEXT)''')# 插入模拟数据
for _ in range(100):vehicle = DataGenerator.generate_vehicle_data()c.execute("INSERT INTO vehicles (vin, brand, model, battery_capacity, range, production_date, status) VALUES (?, ?, ?, ?, ?, ?, ?)",(vehicle['vin'], vehicle['brand'], vehicle['model'], vehicle['battery_capacity'], vehicle['range'], vehicle['production_date'], vehicle['status']))for _ in range(20):station = DataGenerator.generate_charging_station_data()c.execute("INSERT INTO charging_stations (station_id, name, location, total_ports, available_ports, status) VALUES (?, ?, ?, ?, ?, ?)",(station['station_id'], station['name'], station['location'], station['total_ports'], station['available_ports'], station['status']))conn.commit()
conn.close()
print("数据库初始化完成!")
if name == ‘main’:
init_database()
3. 配置文件 (config.py)
python
import osbasedir = os.path.abspath(os.path.dirname(__file__))class Config:# 基础配置SECRET_KEY = os.environ.get('SECRET_KEY') or 'dev-key-123'DATABASE = os.path.join(basedir, 'new_energy_vehicles.db')# API配置API_PREFIX = '/api'API_VERSION = 'v1'# 数据更新间隔(秒)DATA_UPDATE_INTERVAL = 60# 日志配置LOG_FILE = 'nevs.log'LOG_LEVEL = 'INFO'@staticmethoddef init_app(app):passclass DevelopmentConfig(Config):DEBUG = TrueLOG_LEVEL = 'DEBUG'class ProductionConfig(Config):DEBUG = Falseconfig = {'development': DevelopmentConfig,'production': ProductionConfig,'default': DevelopmentConfig
}
- 前端API调用示例
javascript
// 使用axios调用API示例// 1. 获取仪表板摘要数据
axios.get('/api/dashboard/summary').then(response => {console.log('仪表板数据:', response.data);// 处理数据...}).catch(error => {console.error('获取仪表板数据失败:', error);});
// 2. 获取车辆列表
axios.get(‘/api/vehicles/list’, {
params: {
page: 1,
page_size: 10
}
})
.then(response => {
console.log(‘车辆列表:’, response.data);
// 处理数据…
});
// 3. 获取充电记录统计
axios.get(‘/api/charging/records’, {
params: {
days: 30
}
})
.then(response => {
console.log(‘充电记录:’, response.data);
// 处理数据…
});
// 4. 获取地图数据
Promise.all([
axios.get(‘/api/map/vehicles’),
axios.get(‘/api/map/stations’)
])
.then(([vehiclesRes, stationsRes]) => {
console.log(‘地图车辆数据:’, vehiclesRes.data);
console.log(‘地图充电站数据:’, stationsRes.data);
// 处理数据…
});
系统功能说明
数据概览仪表板:
显示车辆总数、品牌分布、状态分布
充电站统计信息
今日充电量和行驶里程
车辆管理:
车辆列表分页查询
车辆状态实时更新
充电管理:
充电站信息查询
充电记录统计
充电站利用率分析
行驶数据分析:
行驶里程统计
能耗效率分析
品牌能耗对比
地图可视化:
车辆实时位置显示
充电站位置及状态显示
部署说明
安装依赖:
pip install flask flask-cors sqlite3
初始化数据库:
python init_db.py
启动服务:
python app.py
访问API:
仪表板数据: http://localhost:5000/api/dashboard/summary
车辆列表: http://localhost:5000/api/vehicles/list
充电站地图数据: http://localhost:5000/api/map/stations
这个系统提供了新能源汽车监控和分析所需的基本API接口,前端可以通过这些接口获取数据并实现可视化大屏展示。
相关文章:
新能源汽车可视化大屏系统毕业设计
以下是一个基于Python和Flask框架的新能源汽车可视化大屏系统后台代码示例。这个系统提供API接口用于前端大屏展示新能源汽车相关数据。 主应用文件 (app.py) python from flask import Flask, jsonify, request from flask_cors import CORS import random from datetime imp…...
02-keil5的配置和使用
一、创建工程 1、在菜单栏”Project”,在弹出的下拉菜单,选择“New uVision Project”。 2、在弹出的对话框,填写工程的名字,例如工程名字为project。 3、为保存的工程,选择对应的芯片。 4、为当前工程,添…...
电脑硬盘丢失怎么找回?解决硬盘数据恢复的2种方法
无论是个人用户还是企业用户来讲,存储在磁盘中的文档、图片、视频、音频等数据都具有相当的价值。但在日常使用过程中,误删操作、病毒攻击、硬件故障等情况都可能造成电脑硬盘突然消失不见数据丢失。面对电脑硬盘丢失这类问题时,采取正确的应…...
【Spring】依赖注入的方式:构造方法、setter注入、字段注入
在Spring框架中,除了构造器注入(Constructor Injection)和Setter注入(Setter Injection),还有一种依赖注入方式:字段注入(Field Injection)。字段注入通过在Bean的字段上…...
涨薪技术|0到1学会性能测试第22课-关联函数web_reg_save_param_ex
前面的推文我们掌握了性能测试脚本开发3种常见的关联技术,今天开始给大家分享关联函数web_reg_save_param_ex,后续文章都会系统分享干货! LoadRunner最新版本中,使用的关联函数为web_reg_save_param_ex,以前的版本使用的关联函数为web_reg_save_param,但这两个函数实质差…...
Vue 的数据代理机制
2025/4/22 向 一、什么是数据代理机制 通过访问代理对象的属性,来间接访问目标对象的属性,数据代理机制的实现需要依赖Object.defineProperty()方法。 如下所示: <!DOCTYPE html> <html lang"en"> <head><…...
Android-KeyStore安全的存储系统
在 Android 中,AndroidKeyStore 是一个安全的存储系统,用于存储加密密钥。它提供了一种安全的方式来生成、存储和管理密钥,而无需将密钥暴露给应用程序本身。以下是如何使用 AndroidKeyStore 的基本步骤和示例代码。 检查 AndroidKeyStor…...
部署私有gitlab网站
以下是建立私有 GitLab 代码版本维护平台的完整步骤,涵盖环境准备、安装配置、初始化及日常管理,适用于企业/团队内部代码托管: 一、环境准备 1. 服务器要求(最低配置) 用途CPU内存存储系统要求小型团队(…...
(区间 dp)洛谷 P6879 JOI2020 Collecting Stamps 3 题解
题意 给定一个周长为 L L L 的圆,从一个点出发,有 N N N 个黑白熊雕像,编号为 1 1 1 到 N N N,第 i i i 个雕像在顺时针 X i X_i Xi 米处,如果你没有在 T i T_i Ti 秒内收集到这个黑白熊雕像,那…...
AtCoder 第402场初级竞赛 A~E题解
A CBC 【题目链接】 原题链接:A - CBC 【考点】 枚举 【题目大意】 找出所有的大写字母 【解析】 遍历字符串,判断是否为大写字母,如果是则输出。 【难度】 GESP二级 【代码参考】 #include <bits/stdc++.h> using namespace std;int main() {string s;ci…...
驱动开发硬核特训 · Day 17:深入掌握中断机制与驱动开发中的应用实战
🎥 视频教程请关注 B 站:“嵌入式 Jerry” 一、前言 在嵌入式驱动开发中,“中断”几乎无处不在。无论是 GPIO 按键、串口通信、网络设备,还是 SoC 上的各种控制器,中断都扮演着核心触发机制的角色。对中断机制掌握程度…...
深入理解依赖、Jar 包与 War 包:Java 开发基石探秘
一、引言 在 Java 开发的广袤天地里,依赖管理如同建筑的基石,默默支撑着项目的稳定构建与运行。而 Jar 包和 War 包,作为 Java 应用的常见打包形式,各自承载着不同的使命。本文将深入探讨依赖的重要性,并清晰解说 Jar…...
01.Python代码Pandas是什么?pandas的简介
01.Python代码Pandas是什么?pandas的简介 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是pandas的使用语法。前后每一小节的内容是存在的有:学习and理解的关联性,希望对您有用~ pyth…...
国产紫光同创FPGA实现SDI视频编解码+图像缩放,基于HSSTHP高速接口,提供2套工程源码和技术支持
目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目本博已有的 SDI 编解码方案本方案在Xilinx--Artix7系列FPGA上的应用本方案在Xilinx--Kintex系列FPGA上的应用本方案在Xilinx--Zynq系列FPGA上的应用本方案在Xilinx--U…...
25.4.22学习总结
如何通过好友列表对聊天框的切换 首先,我们知道,你的好友列表是用ListView组件实现的,那么,接下来,我们将开始讲解如何实现切换。 一、改造数据结构 如果你是跟着我的上一篇文章做的话,应该需要修改一些的…...
Agent智能体ReAct机制深度解读:推理与行动的完美闭环
一、从Chain-of-Thought到ReAct的范式演进 1.1 传统决策机制的局限 #mermaid-svg-Jf3ygvgHcGciJvX8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Jf3ygvgHcGciJvX8 .error-icon{fill:#552222;}#mermaid-svg-Jf3y…...
UnityDots学习(四)
官方案例HelloCube和Tank学习研究: HelloCube: 通用部分: 使用Authoring根据Inspector的勾选添加为Entity添加不同Component。然后每个System会根据实体添加的Component运行不同的System逻辑。 1. MainThread 简单构造System 先看System接口定义&am…...
Debian 12.10 root 登录失败,两步解决!
大家好,这里是 DBA学习之路,专注于提升数据库运维效率。 前言 今天看到 debian 正式发布 12.10,安装完成后发现无法登录 root 用户: 这里我一开始怀疑是 root 密码错了,所以改了一下 root 密码,忘记 root …...
AI大模型:(二)2.3 预训练自己的模型
目录 1.预训练原理 2.预训练范式 1.未标注数据 2.标注数据 3.有正确答案、也有错误答案 3.手撕transform模型 3.1.transform模型代码 3.2.训练数据集 3.3.预训练 3.4.推理 4.如何选择模型 5.如何确定模型需要哪种训练 大模型预训练(Large-scale Pre-training…...
【C语言】初阶算法相关习题(一)
个人主页 文章目录 ⭐一、数字在升序数组中出现的次数🏠二、整数转换🚀三、至少是其他数字两倍的最大数🏝️四、字符个数的统计🎄五、自除数🎡六、除自身以外数组的乘积🎉七、两个数组的交集 ⭐一、数字在…...
WITH 临时表 SQL优化
在 SQL 优化中, 临时表(CTE,Common Table Expression,公共表表达式) 是一种强大的工具,它通过定义一个临时的结果集(可以理解为 “虚拟表”),让复杂查询更易读、更高效&a…...
Go语言中 defer 使用场景及深度注意事项指南
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
第33周JavaSpringCloud微服务 面试题
一、项目面试 面试中介绍项目的方法 在面试过程中,若被问及相关项目,为提升通过几率,应着重介绍项目的功能点和架构升级内容。确保将项目的亮点讲透讲精彩,这对获取 offer 至关重要。 1. 项目架构 项目整体架构概述 项目整体…...
鸿蒙开发:Swiper轮播图
鸿蒙Swiper组件详解 一、Swiper组件概述 Swiper是鸿蒙(HarmonyOS)系统中提供的一个滑动容器组件,它允许用户通过手指滑动来切换子组件(通常是页面或图片),实现轮播图、引导页、图片浏览器等常见UI效果。 说明 该组件从API versi…...
Go语言之sync包 WaitGroup的使用和底层实现
在 Go 语言里,sync 包中的 WaitGroup 是一个实用工具,用于等待一组 goroutine 完成任务。其核心原理是通过内部维护一个计数器,该计数器初始值为 0,每启动一个新的 goroutine 就将计数器加 1,每个 goroutine 完成任务后…...
7N60-ASEMI无人机专用功率器件7N60
编辑:LL 7N60-ASEMI无人机专用功率器件7N60 型号:7N60 品牌:ASEMI 封装:TO-220F 最大漏源电流:7A 漏源击穿电压:600V 批号:最新 RDS(ON)Max:1.20Ω …...
SystemV-消息队列与责任链模式
一、SystemV 消息队列 1. 消息队列API Ftok 函数定义: key_t ftok(const char *pathname, int proj_id);函数作用: 获取唯一的key值标识符,用于标识系统V消息队列。参数解释: pathname:有效的文件路径(需…...
Ubuntu与Linux的关系
Linux 是一个 操作系统内核。它是一个类 Unix 系统,免费、开源,许多不同的操作系统(叫“发行版”)都是基于 Linux 内核构建的。 Ubuntu 是一个 基于 Linux 内核的操作系统发行版。它是目前最流行、最易用的 Linux 发行版之一&…...
同时支持windows和Linux的NFC读写器web插件
一个网站集成了NFC读写器的功能,如何才能跨系统运行呢,既要在windows系统下正常运行,也需要在银河麒麟,统信UOS等信创系统下运行。 友我科技NFC读写器web插件很好的解决了这个问题,在客户端不仅支持windows系统&#x…...
突破AI检测边界:对抗技术与学术伦理的终极博弈
随着GPT-4、Claude等大模型的文本生成能力突破人类写作水平,AI检测工具与对抗技术的博弈已进入白热化阶段。本文深入解析基于对抗训练的文本风格混淆网络如何突破GPTZero最新防御体系,探讨OpenAI多模态内容溯源系统引发的技术升级,并针对学术…...
pg数据库删除自建表空间
1. tbs_sjzx已经创建(略) pg数据库删除自己创建表空间;--查看表空间相关表 SELECT * FROM pg_tablespace; SELECT relname FROM pg_class WHERE reltablespace (SELECT oid FROM pg_tablespace WHERE spcname tbs_sjzx); SELECT * FROM pg_tables WHE…...
C++ 学习指南
new 关键字 #include <iostream> using namespace std;int* func() {// 在堆区创建int* p new int(10); return p; }void test01(void) {int *p func();cout << *p << endl;cout << *p << endl;cout << *p << endl;delete p;// 这…...
Scribe: 一个非常方便的操作文档编写工具
在日常生活中,当我们需要指导别人使用一个软件/web应用时,我们常常需要按流程对工具进行操作,走一遍主要功能,然后针对每一步进行截图,并附上操作说明。往往这样一套流程走下来,就会花费很长的时间。那么有…...
数据结构与算法-顺序表应用
一.通讯录的创建 首先我们要理解的是通讯录本身就是以顺序表为底层的 只不过顺序表中的数组,这里我们是用结构体来替代,用来存储用户的信息 由于是通讯录的本质就是顺序表,所以顺序表的任何方法它都能套用 Contact.h: #pragma once #def…...
DeepSeek系列(5):助力数据分析
数据解读与可视化建议 在数据驱动的商业环境中,有效解读数据并将其转化为直观可视化结果至关重要。DeepSeek作为强大的AI助手,可以帮助您从海量数据中提取洞见并提供专业的可视化建议。 DeepSeek在数据解读中的优势 DeepSeek可以通过以下方式帮助您更高效地解读数据: 上下…...
虚幻基础:动画k帧
文章目录 动画k帧:调整骨骼的变换达到自己想要的效果步骤打开动画原始文件选中骨骼调整到目标变换添加关键帧时间:自动添加到停留的那一帧数值:自动填写为调整后的数值 注释数值与骨骼细节面板上的数值并不对应,但是同样的效果为什…...
使用 LlamaIndex Workflows 与 Elasticsearch
作者:来自 Elastic Jeffrey Rengifo 在本文中,你将学习如何利用 LlamaIndex Workflows 与 Elasticsearch 快速构建一个使用 LLM 的自过滤搜索应用程序。 LlamaIndex Workflows 提出了一种不同的方式来处理将任务拆分给不同 agent 的问题,它引…...
相对论大师-记录型正负性质BFS/图论-链表/数据结构
看到这一题我的第一个思路就是双向bfs 起点是a,终点还是a,但是flag是相反的(“越”的方向) tip1.可以用字典vis来存储flag 刚开始初始化时vissta,visend一个对应0、1 要求两个队列相…...
代理设计模式:从底层原理到源代码的详细解释
代理设计模式(Proxy Pattern)是一种结构型设计模式,它通过创建一个代理对象来控制对目标对象的访问。代理对象充当客户端和目标对象之间的中介,允许在不修改目标对象的情况下添加额外的功能(如权限控制、日志记录、延迟…...
EasyRTC音视频实时通话:打造高清低延迟的远程会议新生态
一、项目背景 随着数字化办公的普及,远程会议成为企业、教育机构、政府部门等组织跨地域协作沟通的重要方式。传统远程会议系统在音视频质量、低延迟传输、多平台兼容性等方面存在不足,难以满足用户对高清、流畅、稳定会议体验的需求。EasyRTC作为一款…...
零基础上手Python数据分析 (21):图表选择困难症?常用可视化类型详解与应用场景指南
写在前面 —— 告别盲目绘图,理解图表语言,为你的数据找到最佳“代言人” 在前面几篇博客中,我们已经学习了使用 Matplotlib 和 Seaborn 这两大 Python 可视化利器来绘制各种图表。我们掌握了创建折线图、柱状图、散点图、箱线图等常用图表的技术。然而,仅仅知道 如何 绘…...
HarmonyOS Next 编译之如何使用多目标产物不同包名应用
引言 在日常的开发中涉及到多签名和多产物构建输出时手动切换签名文件和包名在开发中是容易出错且费时的一个操作,鸿蒙提供了自定义hvigor插件和多目标产物构建,那我们可以通过hvigor插件来动态修改不同项目配置所需要的代码,保证一套代码在…...
Oracle Database Resident Connection Pooling (DRCP) 白皮书阅读笔记
本文为“Extreme Oracle Database Connection Scalability with Database Resident Connection Pooling (DRCP)”的中文翻译加阅读笔记。觉得是重点的就用粗体表示了。 白皮书版本为March 2025, Version 3.3,副标题为:Optimizing Oracle Database resou…...
Sharding-JDBC 系列专题 - 第七篇:Spring Boot 集成与 Sharding-Proxy 简介
Sharding-JDBC 系列专题 - 第七篇:Spring Boot 集成与 Sharding-Proxy 简介 本系列专题旨在帮助开发者全面掌握 Sharding-JDBC,一个轻量级的分布式数据库中间件。本篇作为系列的第七篇文章,将重点探讨 Sharding-JDBC 与 Spring Boot 的集成,以及 Sharding-Proxy 的基本概念…...
day30 学习笔记
文章目录 前言一、凸包特征检测1.穷举法2.QuickHull法 二、图像轮廓特征查找1.外接矩形2.最小外接矩形3.最小外接圆 前言 通过今天的学习,我掌握了OpenCV中有关凸包特征检测,图像轮廓特征查找的相关原理和操作 一、凸包特征检测 通俗的讲,凸…...
变更管理 Change Management
以下是关于项目管理中 变更管理 的深度解析,结合高项(如软考高级信息系统项目管理师)教材内容,系统阐述变更管理的理论框架、流程方法及实战应用: 一、变更管理的基本概念 1. 定义 变更管理是对项目范围、进度、成本、质量等基准的修改进行系统性控制的过程,旨在确保变…...
PaddlePaddle线性回归详解:从模型定义到加载,掌握深度学习基础
目录 前言一、paddlepaddle框架的线性回归1.1 paddlepaddle模型的定义方式1.1.1 使用序列的方式 nn.Sequential 组网1.1.2 使用类的方式 class nn.Layer组网1.2 数据加载 1.3 paddlepaddle模型的保存1.3.1 基础API保存1.3.2 高级API模型的保存1.3.2.1 训练fit进行保存1.3.2.2 …...
几种Word转换PDF的常用方法
使用 Word 内置功能 步骤:打开需要转换的 Word 文档,点击左上角的 “文件” 菜单,选择 “另存为”,选择保存位置,在 “保存类型” 下拉菜单中选择 “PDF”,点击 “保存” 按钮即可。适用场景:适…...
【美化vim】
美化vim 涉及文件一个例子 涉及文件 ~/.vimrc修改这个文件即可 一个例子 let mapleader ,set number " 显示行号"set relativenumber " 显示相对行号set incsearch " 实时开启搜索高亮set hlsearch " 搜索结果高亮set autoinden…...
【git】subtree拆分大的git库到多个独立git库
【git】subtree拆分大的git库到多个独立git库 一、拆分一个子目录为独立仓库 # 这就是那个大仓库 big-project git clone gitgithub.com:tom/big-project.git cd big-project# 把所有 eiyo 目录下的相关提交整理为一个新的分支 eiyo_code git subtree split -P eiyo -b eiyo_…...