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

vue3+flask+sqlite前后端项目实战

基础环境安装

pycharm

下载地址:
https://www.jetbrains.com/zh-cn/pycharm/download/?section=windows

在这里插入图片描述

vscode

下载地址
https://code.visualstudio.com/docs/?dv=win64user

python

下载地址
https://www.python.org/downloads/windows/

在这里插入图片描述

Node.js(含npm)

下载地址
https://nodejs.org (推荐LTS版本)

在这里插入图片描述

后端项目

在这里插入图片描述

项目结构

api/
├── models/
│   ├── __init__.py
│   └── user_model.py
├── dao/
│   ├── __init__.py
│   └── user_dao.py
├── instance/
│   └── app.db
├── routes/
│   ├── __init__.py
│   └── user_route.py
├── utils/
│   ├── __init__.py
│   └── sqlite3_util.py
├── config.py
├── run.py
└── requirements.txt

在这里插入图片描述

requirements.txt

blinker1.8.2
click
8.1.8
colorama0.4.6
Flask
3.0.0
Flask-Cors5.0.0
Flask-SQLAlchemy
3.1.1
greenlet3.1.1
importlib_metadata
8.5.0
itsdangerous2.2.0
Jinja2
3.1.6
MarkupSafe2.1.5
SQLAlchemy
2.0.40
typing_extensions4.13.2
Werkzeug
3.0.1
zipp==3.20.2

①生成 requirements.txt
pip freeze > requirements.txt
②基于 requirements.txt 安装
pip install -r requirements.txt

daos/user_dao.py

import sqlite3
from werkzeug.security import generate_password_hashclass UserDAO:@staticmethoddef get_connection():return sqlite3.connect('instance/app.db')@staticmethoddef get_all_users():conn = UserDAO.get_connection()cursor = conn.cursor()cursor.execute("SELECT id, username FROM users")users = cursor.fetchall()conn.close()return [{'id': row[0], 'username': row[1]} for row in users]@staticmethoddef create_user(username, password):conn = UserDAO.get_connection()cursor = conn.cursor()cursor.execute("SELECT id FROM users WHERE username = ?", (username,))if cursor.fetchone():conn.close()return Nonepassword_hash = generate_password_hash(password)cursor.execute("INSERT INTO users (username, password_hash) VALUES (?, ?)", (username, password_hash))conn.commit()conn.close()return {'username': username}@staticmethoddef delete_user(user_id):conn = UserDAO.get_connection()cursor = conn.cursor()cursor.execute("DELETE FROM users WHERE id = ?", (user_id,))conn.commit()success = cursor.rowcount > 0conn.close()return success

models/user_model.py

import sqlite3def init_db():conn = sqlite3.connect('instance/app.db')cursor = conn.cursor()cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,username TEXT UNIQUE NOT NULL,password_hash TEXT NOT NULL)''')conn.commit()conn.close()

routes/user_route.py

from flask import Blueprint, request, jsonify
from api.daos.user_dao import UserDAObp = Blueprint('user', __name__)@bp.route('/users', methods=['GET'])
def get_users():users = UserDAO.get_all_users()return jsonify(users)@bp.route('/register', methods=['POST'])
def register():data = request.jsonusername = data.get('username')password = data.get('password')user = UserDAO.create_user(username, password)if user:return jsonify(user), 201else:return jsonify({'error': 'User already exists'}), 409@bp.route('/users/<int:user_id>', methods=['DELETE'])
def delete_user(user_id):success = UserDAO.delete_user(user_id)if success:return jsonify({'message': 'User deleted successfully'}), 200else:return jsonify({'error': 'User not found'}), 404

utils/sqlite3_util.py

import sqlite3def init_db():conn = sqlite3.connect('instance/app.db')cursor = conn.cursor()cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,username TEXT UNIQUE NOT NULL,password_hash TEXT NOT NULL)''')conn.commit()conn.close()

run.py

from flask import Flask
from flask_cors import CORS
from routes.user_route import bp as user_bp
from utils.sqlite3_util import init_dbapp = Flask(__name__)
CORS(app, resources={r"/*": {"origins": "*"}})app.config.from_object('config.Config')app.register_blueprint(user_bp, url_prefix='/api')if __name__ == '__main__':init_db()app.run(debug=True, host='0.0.0.0')

启动

python app.py // 或者直接右键该文件运行

在这里插入图片描述

前端项目

新建vue项目

npm create vue@latest
uicd ui
npm installnpm install vue-router@4 axios element-plus @element-plus/icons-vue

在这里插入图片描述

pycharm打开效果

在这里插入图片描述

修改 src/assets/main.css

/* 导入基础样式文件 */
@import './base.css';/** 主应用容器样式* 作用:包裹整个Vue应用的根容器*/
#app {margin: 0 auto;                   /* 水平居中 */padding: 2rem;                    /* 内边距(会被下方规则覆盖) */font-weight: normal;              /* 继承基础样式字体粗细 */display: block !important;        /* 强制覆盖可能的grid布局,使用块级布局 */width: 100%;                      /* 撑满可用宽度 */grid-template-columns: 1fr 1fr;   /* 网格列定义(实际被block覆盖无效) */padding: 0 2rem;                  /* 重定义左右内边距(覆盖上方padding) */
}/** 链接及特殊文本样式* 作用:统一超链接和.green类元素的视觉效果*/
a,
.green {text-decoration: none;            /* 去除下划线 */color: hsla(160, 100%, 37%, 1);   /* Vue品牌绿色 (HSL格式) */transition: 0.4s;                 /* 颜色过渡动画时长 */padding: 3px;                     /* 内边距增强可点击区域 */
}/** 悬停效果媒体查询* 作用:只在支持hover的设备上应用悬停效果*/
@media (hover: hover) {a:hover {background-color: hsla(160, 100%, 37%, 0.2);  /* 半透明绿色背景 */}
}

修改 src/main.js

/** 样式资源导入* 作用:引入全局基础样式文件*/
import './assets/main.css';/** Vue核心依赖导入* 作用:引入Vue框架核心功能*/
import { createApp } from 'vue';      // 引入应用构造器/** 应用组件导入* 作用:引入根组件作为应用入口*/
import App from './App.vue';          // 主应用组件/** 路由配置导入* 作用:引入路由管理系统*/
import router from './router';        // 路由实例/** UI组件库导入* 作用:引入Element Plus及其样式*/
import ElementPlus from 'element-plus';         // UI库核心
import 'element-plus/dist/index.css';           // UI库样式/** 应用初始化* 作用:创建并配置Vue应用实例*/
const app = createApp(App);           // 创建应用实例/** 插件注册* 作用:集成路由功能*/
app.use(router);                      // 安装路由插件/** UI库注册* 作用:集成Element Plus组件库*/
app.use(ElementPlus);                 // 安装UI组件库/** 应用挂载* 作用:将应用渲染到DOM*/
app.mount('#app');                    // 挂载到DOM节点

修改 src/App.vue

清空默认内容,改为空白模板

<template><!--* 路由视图容器* 作用:渲染当前路由匹配的组件* 技术:Vue Router 核心组件--><router-view />
</template><script>
export default {/** 组件标识* 作用:用于开发者工具调试和递归组件引用* 命名规范:通常使用帕斯卡命名法(PascalCase)*/name: 'App'
};
</script><style>
/** 全局基础样式* 作用:影响整个应用的默认样式重置*//** 主体样式重置* 作用:清除浏览器默认样式,设置基准字体*/
body {margin: 0;                  /* 清除默认外边距 */font-family: Arial,         /* 首选字体 */sans-serif;               /* 通用字体族后备 */
}
</style>

src/views/Dashboard.vue

<template><div class="dashboard-container"><!-- 顶部导航菜单 --><el-menumode="horizontal":default-active="activeMenu":collapse="isCollapsed"class="el-menu-horizontal-demo"@select="handleMenuSelect"background-color="#ffffff"text-color="#606266"active-text-color="#409EFF"><!-- 1. 三维数据平台 --><el-sub-menu index="1"><template #title><i class="el-icon-location"></i><span v-show="!isCollapsed">三维数据平台</span></template><el-menu-item index="1-1" @click="goToModelRelease"><i class="el-icon-monitor"></i><span>模型发布对比</span></el-menu-item><el-menu-item index="1-2" @click="goToParseInfo"><i class="el-icon-connection"></i><span>获取解析异常信息</span></el-menu-item></el-sub-menu><!-- 2. 测试管理 --><el-sub-menu index="2"><template #title><i class="el-icon-cpu"></i><span v-show="!isCollapsed">测试管理</span></template><el-menu-item index="2-1" @click="goToTestFlow"><i class="el-icon-guide"></i><span>测试流程</span></el-menu-item><el-menu-item index="2-2" @click="goToTaskReminder"><i class="el-icon-guide"></i><span>任务提醒</span></el-menu-item></el-sub-menu><!-- 3. 工具集 --><el-sub-menu index="3"><template #title><i class="el-icon-s-tools"></i><span v-show="!isCollapsed">实用工具</span></template><el-menu-item index="3-1" @click="goToJsonFormat"><i class="el-icon-document"></i><span>JSON格式化</span></el-menu-item><el-menu-item index="3-2" @click="goToKafkaManager"><i class="el-icon-document"></i><span>Kafka连接测试</span></el-menu-item></el-sub-menu><!-- 4. 学生管理 --><el-sub-menu index="4"><template #title><i class="el-icon-user"></i><span v-show="!isCollapsed">学生管理</span></template><el-menu-item index="4-1" @click="goToStudentList"><i class="el-icon-user-solid"></i><span>学生列表</span></el-menu-item><el-menu-item index="4-2" @click="goToStudentStats"><i class="el-icon-data-analysis"></i><span>学生统计</span></el-menu-item></el-sub-menu><!-- 5. 新增的系统管理菜单 --><el-sub-menu index="5"><template #title><i class="el-icon-setting"></i><span v-show="!isCollapsed">系统管理</span></template><el-menu-item index="5-1" @click="goToUserManage"><i class="el-icon-user"></i><span>用户管理</span></el-menu-item><el-menu-item index="5-2" @click="goToRoleManage"><i class="el-icon-s-custom"></i><span>角色管理</span></el-menu-item><el-menu-item index="5-3" @click="goToSystemLog"><i class="el-icon-document"></i><span>系统日志</span></el-menu-item><el-menu-item index="5-4" @click="goToSystemConfig"><i class="el-icon-operation"></i><span>系统配置</span></el-menu-item></el-sub-menu></el-menu><!-- 主内容区域 --><div class="content"><el-card class="welcome-card"><h1>{{ welcomeTitle }}</h1><p>{{ welcomeMessage }}</p><!-- 快捷访问区域 --><div v-if="showQuickAccess" class="quick-access"><h3>常用功能</h3><el-space wrap><el-tagv-for="(action, index) in quickActions":key="index"type="info"effect="plain"class="quick-tag"@click="action.handler"><i :class="action.icon"></i>{{ action.label }}</el-tag></el-space></div></el-card></div></div>
</template><script>
import { ref, onMounted, onUnmounted, computed } from 'vue'
import { useRouter } from 'vue-router'export default {setup() {const router = useRouter()// 响应式状态const activeMenu = ref('1-1')const isCollapsed = ref(false)const showQuickAccess = ref(true)const welcomeTitle = ref('欢迎使用管理系统')const welcomeMessage = ref('请从上方菜单选择您需要的功能')// 路由跳转方法const goToModelRelease = () => router.push('/model_release')const goToParseInfo = () => router.push('/parse_info')const goToTestFlow = () => router.push('/TestFlow')const goToTaskReminder = () => router.push('/task_reminder')const goToStudentList = () => router.push('/StudentList')const goToStudentStats = () => router.push('/StudentStats')const goToDbCompare = () => router.push('/dbcompare')const goToJsonFormat = () => router.push('/json_format')const goToKafkaManager = () => router.push('/kafka_manager')// 新增的系统管理路由方法const goToUserManage = () => router.push('/user-manage')const goToRoleManage = () => router.push('/role-manage')const goToSystemLog = () => router.push('/system-log')const goToSystemConfig = () => router.push('/system-config')// 快捷操作列表(包含新增的系统管理快捷方式)const quickActions = computed(() => [{ icon: 'el-icon-monitor', label: '模型发布数据对比', handler: goToModelRelease },{ icon: 'el-icon-user-solid', label: '测试流程', handler: goToTestFlow },{ icon: 'el-icon-document', label: '待办任务', handler: goToTaskReminder },{ icon: 'el-icon-setting', label: 'Json格式化', handler: goToJsonFormat }])// 响应式处理屏幕尺寸变化const checkScreen = () => {isCollapsed.value = window.innerWidth < 768showQuickAccess.value = window.innerWidth > 576}// 菜单选择处理const handleMenuSelect = (index) => {activeMenu.value = index}// 生命周期钩子onMounted(() => {window.addEventListener('resize', checkScreen)checkScreen() // 初始化检查})onUnmounted(() => {window.removeEventListener('resize', checkScreen)})return {activeMenu,isCollapsed,showQuickAccess,welcomeTitle,welcomeMessage,quickActions,handleMenuSelect,// 三维数据平台goToModelRelease,goToParseInfo,// 测试管理goToTestFlow,goToTaskReminder,// 实用工具goToJsonFormat,goToKafkaManager,// 学生管理goToStudentList,goToStudentStats,goToDbCompare,// 系统管理goToUserManage,goToRoleManage,goToSystemLog,goToSystemConfig}}
}
</script><style scoped>
/* 主容器样式 */
.dashboard-container {padding: 10px;
}/* 导航菜单样式 */
.el-menu-horizontal-demo {height: 36px;line-height: 36px;border-bottom: 1px solid #e6e6e6;margin-bottom: 20px;
}.el-menu-item.is-active {background-color: var(--el-color-primary-light-9) !important;border-bottom: 2px solid var(--el-color-primary) !important;
}/* 内容区域布局 */
.content {padding: 20px;display: flex;justify-content: center;min-height: calc(100vh - 160px);
}/* 欢迎卡片样式 */
.welcome-card {width: 100%;max-width: 800px;text-align: center;padding: 40px;border-radius: 8px;
}/* 快捷访问区域 */
.quick-access {margin-top: 30px;padding-top: 20px;border-top: 1px dashed #eee;
}.quick-tag {cursor: pointer;padding: 0 15px;height: 32px;line-height: 32px;transition: all 0.3s;
}.quick-tag:hover {color: #409EFF;border-color: #409EFF;transform: translateY(-2px);
}/* 响应式设计 */
@media (max-width: 768px) {.el-menu-item,.el-submenu__title {padding: 0 12px !important;}.welcome-card {padding: 20px;}
}@media (max-width: 576px) {.dashboard-container {padding: 10px;}.content {min-height: calc(100vh - 120px);}
}
</style>

src/views/User.vue

<template><div><h1>用户注册</h1><el-form @submit.prevent="handleSubmit" inline><el-form-item><el-input v-model="username" placeholder="用户名"></el-input></el-form-item><el-form-item><el-input v-model="password" type="password" placeholder="密码"></el-input></el-form-item><el-form-item><el-button type="primary" @click="handleSubmit">注册</el-button></el-form-item></el-form><h2>已注册用户</h2><el-table :data="users" style="width: 100%"><el-table-column prop="id" label="ID" width="50"></el-table-column><el-table-column prop="username" label="用户名" width="180"></el-table-column><el-table-column label="操作" width="120"><template #default="scope"><el-button type="text" @click="handleDelete(scope.row.id)">删除</el-button></template></el-table-column></el-table></div>
</template><script setup>
import { ref, onMounted } from 'vue'
import axios from 'axios'
import 'element-plus/dist/index.css'const username = ref('')
const password = ref('')
const users = ref([])const fetchUsers = async () => {const response = await axios.get('http://192.168.1.138:5000/api/users')users.value = response.data
}const handleSubmit = async () => {await axios.post('http://192.168.1.138:5000/api/register', {username: username.value,password: password.value})username.value = ''password.value = ''await fetchUsers()
}const handleDelete = async (id) => {await axios.delete(`http://192.168.1.138:5000/api/users/${id}`)await fetchUsers()
}onMounted(() => {fetchUsers()
})
</script>

src/router/index.js

import { createRouter, createWebHistory } from 'vue-router'
import Dashboard from '../views/Dashboard.vue'
import User from '../views/User.vue'const routes = [{ path: '/', redirect: '/Dashboard' }, // 默认重定向{ path: '/dashboard', component: Dashboard },{ path: '/user', component: User },// 其他路由...
];const router = createRouter({history: createWebHistory(),routes,
});export default router;

前端运行测试

npm run dev

在这里插入图片描述

前端启动后默认跳转的效果

在这里插入图片描述

用户注册

在这里插入图片描述
在这里插入图片描述

使用navicat连接查看数据库

在这里插入图片描述

相关文章:

vue3+flask+sqlite前后端项目实战

基础环境安装 pycharm 下载地址&#xff1a; https://www.jetbrains.com/zh-cn/pycharm/download/?sectionwindows vscode 下载地址 https://code.visualstudio.com/docs/?dvwin64user python 下载地址 https://www.python.org/downloads/windows/ Node.js&#xff08;含npm…...

Java 线程的堆栈跟踪信息

Java 线程的堆栈跟踪信息&#xff0c;展示了线程的当前状态和执行位置。以下是详细解释&#xff1a; 线程基本信息 "Thread-0" #16 prio5 os_prio0 cpu0.00ms elapsed16.29s tid0x00000243105a4130 nid0x5384 waiting on condition [0x0000007687ffe000]线程名称…...

【计算机视觉】OpenCV实战项目:Long-Exposure:基于深度学习的长时间曝光合成技术

Long-Exposure&#xff1a;基于深度学习的长时间曝光合成技术 项目概述与技术背景项目核心功能技术原理 环境配置与安装硬件要求建议详细安装步骤可选组件安装 实战应用指南1. 基础使用&#xff1a;视频转长曝光2. 高级模式&#xff1a;自定义光轨合成3. 批量处理模式 技术实现…...

传输层协议UDP和TCP

传输层协议UDP和TCP 1、UDP2、TCP2.1、TCP协议段格式2.2、确认应答(ACK)机制2.3、超时重传机制2.4、连接管理机制2.5、理解CLOSE_WAIT状态2.6、理解TIME_WAIT状态2.7、流量控制2.8、滑动窗口2.9、拥塞控制2.10、延迟应答2.11、捎带应答2.12、面向字节流2.13、粘包问题2.14、TCP…...

浅谈大语言模型原理

1.反向传播算法 背景 反向传播算法是当前深度学习的核心技术。 神经网络 x是输入&#xff0c;o是输出&#xff0c;w是需要训练的参数&#xff08;w有初始值&#xff09;三层全连接的神经网络&#xff1a;输入层、隐藏层、输出层 激活函数 f ( x ) 1 1 x − 1 f(x)\frac…...

Clickhouse 迁移到 Doris 的最佳实践

一、引言 在将数据从 Clickhouse 迁移到 Apache Doris / SelectDB Cloud 的过程中&#xff0c;涉及表结构迁移、查询语句迁移以及数据迁移等多个关键环节。每个环节都有其复杂性和需要注意的细节&#xff0c;本文将详细介绍这些内容及对应的最佳实践方法。 二、表结构迁移 &…...

WebSocket的原理及QT示例

一.WebSocket 介绍 1.概述 WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议&#xff0c;它在 2011 年被 IETF 定为标准 RFC 6455&#xff0c;并由 RFC7936 补充规范。与传统的 HTTP 协议不同&#xff0c;WebSocket 允许服务器和客户端之间进行实时、双向的数据传输&a…...

数据库故障排查指南以及各类常用数据库基础用法

数据库故障排查指南大纲 数据库故障排查的基本概念 数据库故障的定义与分类常见数据库故障的表现形式故障排查的重要性与目标 数据库故障通常指数据库系统在运行过程中出现的异常情况&#xff0c;导致数据无法正常访问或操作。故障可以分为硬件故障、软件故障、网络故障、配…...

Spring Boot动态配置修改全攻略

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 无需重启应用&#xff0c;实时更新配置的终极指南 在微服务架构中&#xff0c;动态配置管理是提高系统灵活性的关键技术。本文将通过4种主流方案&#xff0c…...

vue3:十二、图形看板- echart图表-柱状图、饼图

一、效果 如图展示增加了饼图和柱状图,并且优化了浏览器窗口大小更改,图表随着改变 二、 饼图 1、新建组件文件 新增组件EchartsExaminePie.vue,用于存储审核饼图的图表 2、写入组件信息 (1)视图层 写入一个div,写入变量chart和图表宽高 <template><div ref…...

2025年best好用的3dsmax插件和脚本

copitor 可以从一个3dsmax场景里将物体直接复制到另一个场景中 Move to surface 这个插件可以将一些物体放到一个平面上 instancer 实体器&#xff0c;举例&#xff1a;场景中有若干独立的光源&#xff0c;不是实体对象&#xff0c;我们可以使用instancer将他变成实体。 paste …...

趣谈Ai各种模型算法及应用

机器学习与深度学习模型选型终极指南&#xff1a;告别选择困难症&#xff01; 大家好&#xff01;今天&#xff0c;我们来聊一个让很多初学者甚至有经验的开发者都头疼的问题&#xff1a;面对琳琅满目的机器学习和深度学习模型&#xff0c;到底该如何选择&#xff1f;就像走进…...

HAProxy + Keepalived + Nginx 高可用负载均衡系统

1. 项目背景 在现代Web应用中&#xff0c;高可用性和负载均衡是两个至关重要的需求。本项目旨在通过HAProxy实现流量分发&#xff0c;通过Keepalived实现高可用性&#xff0c;通过Nginx提供后端服务。该架构能够确保在单点故障的情况下&#xff0c;系统仍然能够正常运行&#…...

vue2升级vue3

vue2升级vue3 父子自定义事件插槽差异 父子自定义事件 父组件的传给子组件的自定义事件以短横形式命名&#xff0c;例如&#xff1a;my-click 子组件声明该自定义事件时为 myClick 事件可以正常触发 插槽差异 vue2&#xff1a; <el-table-column:label"$t(hcp_devrs…...

5.12 note

Leetcode 图 邻接矩阵的dfs遍历 class Solution { private: vector<vector<int>> paths; vector<int> path; void dfs(vector<vector<int>>& graph, int node) { // 到n - 1结点了保存 if (node graph.size() - 1)…...

跨时钟域(CDC,clock domain crossing)信号处理

参考视频&#xff1a; 数字IC&#xff0c;FPGA秋招【单bit信号的CDC跨时钟域处理手撕代码合集】_哔哩哔哩_bilibili 一、亚稳态 原因是&#xff1a;建立时间和保持时间没有保持住。然后在下图的红框里面&#xff0c;产生亚稳态。因为电路反馈机制&#xff0c;最后大概率会恢复…...

鸿蒙HarmonyOS list优化一: list 结合 lazyforeach用法

list列表是开发中不可获取的&#xff0c;非常常用的组件&#xff0c;使用过程中会需要不断的优化&#xff0c;接下来我会用几篇文章进行list在纯原生的纯血鸿蒙的不断优化。我想进大厂&#xff0c;希望某位大厂的看到后能给次机会。 首先了解一下lazyforeach&#xff1a; Laz…...

OBS studio 减少音频中的杂音(噪音)

1. 在混音器中关闭除 麦克风 之外的所有的音频输入设备 2.在滤镜中增加“噪声抑制”和“噪声门限”...

基于神经网络的 YOLOv8、MobileNet、HigherHRNet 姿态检测比较研究

摘要 随着人工智能技术的飞速发展&#xff0c;基于神经网络的姿态检测技术在计算机视觉领域取得了显著进展。本文旨在深入比较分析当前主流的姿态检测模型&#xff0c;即 YOLOv8、MobileNet 和 HigherHRNet&#xff0c;从模型架构、性能表现、应用场景等多维度展开研究。通过详…...

智能手表 MCU 任务调度图

智能手表 MCU 任务调度图 处理器平台&#xff1a;ARM Cortex-M33 系统架构&#xff1a;事件驱动 多任务 RTOS RTOS&#xff1a;FreeRTOS&#xff08;或同类实时内核&#xff09; 一、任务调度概览 任务名称优先级周期性功能描述App_MainTask中否主循环调度器&#xff0c;系统…...

青少年编程与数学 02-019 Rust 编程基础 03课题、变量与可变性

青少年编程与数学 02-019 Rust 编程基础 03课题、变量与可变性 一、使用多个文件&#xff08;模块&#xff09;1. 创建包结构2. 在 main.rs 中引入模块示例&#xff1a;main.rs 3. 定义模块文件示例&#xff1a;module1.rs示例&#xff1a;module2.rs 4. 定义子模块示例&#x…...

S7-1500——零基础入门2、PLC的硬件架构

PLC的硬件架构 一,西门子PLC概述二,CPU介绍三,数字量模块介绍四,模拟量模块介绍五,其他模块介绍一,西门子PLC概述 本节主要内容 西门子PLC硬件架构,主要内容包括PLC概述、组成、功能及S7-1500 demo的组成与安装演示。 介绍了PLC的定义、功能、应用场合,以及与继电器控…...

前端面试宝典---webpack面试题

webpack 的 tree shaking 的原理 Webpack 的 Tree Shaking 过程主要包含以下步骤&#xff1a; 模块依赖分析&#xff1a;Webpack 首先构建一个完整的模块依赖图&#xff0c;确定每个模块之间的依赖关系。导出值分析&#xff1a;通过分析模块之间的 import 和 export&#xff…...

【PmHub后端篇】Skywalking:性能监控与分布式追踪的利器

在微服务架构日益普及的当下&#xff0c;对系统的性能监控和分布式追踪显得尤为重要。本文将详细介绍在 PmHub 项目中&#xff0c;如何使用 Skywalking 实现对系统的性能监控和分布式追踪&#xff0c;以及在这过程中的一些关键技术点和实践经验。 1 分布式链路追踪概述 在微服…...

Grafana v12.0 引入了多项新功能和改进

Grafana v12.0 引入了多项新功能和改进&#xff0c;旨在提升可观测性、仪表板管理和用户体验。以下是主要更新内容的总结&#xff1a; &#x1f680; 主要新功能与改进 1. Git 同步仪表板&#xff08;Git Sync&#xff09; Grafana v12.0 支持将仪表板直接同步到 GitHub 仓库…...

利用“Flower”实现联邦机器学习的实战指南

一个很尴尬的现状就是我们用于训练 AI 模型的数据快要用完了。所以我们在大量的使用合成数据&#xff01; 据估计&#xff0c;目前公开可用的高质量训练标记大约有 40 万亿到 90 万亿个&#xff0c;其中流行的 FineWeb 数据集包含 15 万亿个标记&#xff0c;仅限于英语。 作为…...

MongoDB使用x.509证书认证

文章目录 自定义证书生成CA证书生成服务器之间的证书生成集群证书生成用户证书 MongoDB配置java使用x.509证书连接MongoDBMongoShell使用证书连接 8.0版本的mongodb开启复制集&#xff0c;配置证书认证 自定义证书 生成CA证书 生成ca私钥&#xff1a; openssl genrsa -out ca…...

创始人 IP 的破局之道:从技术突围到生态重构的时代启示|创客匠人评述

在 2025 年的商业版图上&#xff0c;创始人 IP 正以前所未有的深度介入产业变革。当奥雅股份联合创始人李方悦在 “中国上市公司品牌价值榜” 发布会上&#xff0c;将 IP 赋能与城市更新大模型结合时&#xff0c;当马斯克在特斯拉财报电话会议上宣称 “未来属于自动驾驶和人形机…...

Gin 框架入门

Gin 框架入门 一、响应数据 JSON 响应 在 Web 开发中&#xff0c;JSON 是一种常用的数据交换格式。Gin 提供了简便的方法来响应 JSON 数据。 package mainimport ("github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/json", func(c *…...

【RabbitMQ】应用问题、仲裁队列(Raft算法)和HAProxy负载均衡

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【中间件】企业级中间件剖析 一、幂等性保障 什么是幂等性&#xff1f; 幂等性是指对一个系统进行重复调用&#xff08;相同参数&#xff09;&#xff0c;无论同一操作执行多少次&#xff0c;这些请求…...