MVC(Model-View-Controller)framework using Python ,Tkinter and SQLite
1.项目结构

sql:
CREATE TABLE IF NOT EXISTS School (SchoolId TEXT not null, SchoolName TEXT NOT NULL,SchoolTelNo TEXT NOT NULL)
整体思路
- Model:负责与 SQLite 数据库进行交互,包括创建表、插入、删除、更新和查询数据等操作。
- View:使用 Tkinter 和
ttk.Treeview创建用户界面,包含输入框、按钮和分页控件,用于显示数据并处理用户的交互。 - Controller:处理用户界面的事件,调用 Model 中的方法进行数据操作,并更新 View 中的显示。
代码实现:
Model 部分
# encoding: utf-8
# 版权所有 2024 ©涂聚文有限公司
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author : geovindu,Geovin Du 涂聚文.
# IDE : PyCharm 2023.1 python 3.11
# OS : windows 10
# database : mysql 9.0 sql server 2019, poostgreSQL 17.0 oracle 11g sqlite
# Datetime : 2024-11-20 22:35:21
# database :sql server 2019
# User : geovindu
# Product : PyCharm
# Project : pySQLiteMvcDemo
# File : bll/School.py
# explain : 学习
from __future__ import annotations
from abc import ABC, abstractmethod
import os
import sys
from Model.school import SchoolInfo
from Factory.AbstractFactory import AbstractFactoryclass SchoolBll(object):"""学校表 """ dal = AbstractFactory.createSchool"""类属性 接口DAL"""def __init__(self):""""""self.__name = "SchoolBll"self.createtable() # 如果不存在,初始化表def __del__(self):""":return:"""print(f"{self.__name} ERASE MEMORY")def Close(cls):"""关闭:return:"""cls.dal().Close()def createtable(self):"""建表"""self.dal().createtable()def selectData(self) -> list:""":return:"""data = self.dal().selectSql()return datadef select(self) -> list[SchoolInfo]:""":return:"""schools = []data = self.dal().selectSql()if len(data) > 0:for SchoolId,SchoolName,SchoolTelNo in data[0]:info = SchoolInfo()info.SchoolId = SchoolIdinfo.SchoolName = SchoolNameinfo.SchoolTelNo = SchoolTelNoschools.append(info)return schoolsdef selectSql(cls) -> list[SchoolInfo]:"""元组数据:return: list 列表"""schools = []data = cls.dal().selectSql()if len(data) > 0:for SchoolId,SchoolName,SchoolTelNo in data[0]:info=SchoolInfo()info.SchoolId = SchoolIdinfo.SchoolName = SchoolNameinfo.SchoolTelNo = SchoolTelNoschools.append(info)return schoolsdef selectSqlCount(cls) -> int:"""查询数据 总数:return:"""#print(cls.dal().selectSqlCount()[0][0])total = cls.dal().selectSqlCount()[0][0]return totaldef Count(self) -> int:"""查询数据 总数:return:"""total = self.dal().selectSqlCount()[0][0]return totaldef getcount(cls, search_query=""):"""计算:param search_query::return:"""return cls.dal().getcount(search_query)def getschools(cls, page, limit, search_query=""):"""查询:param page::param limit::param search_query::return:"""data=cls.dal().getschools(page, limit, search_query)print("data:",data)return datadef selectSqlOrder(cls, order: str) -> list[SchoolInfo]:"""元组数据:param order: SchoolName desc/asc:return:"""schools = []data = cls.dal().selectSqlOrder(order)if len(data) > 0:for SchoolId,SchoolName,SchoolTelNo in data[0]:info=SchoolInfo()info.SchoolId = SchoolIdinfo.SchoolName = SchoolNameinfo.SchoolTelNo = SchoolTelNoschools.append(info)return schoolsdef selectSort(cls,field:str,isOrder:bool)->list[SchoolInfo]:""":param field SchoolId:param order: desc/asc:return:"""schools = []data = cls.dal().selectSort(field,isOrder)if len(data) > 0:for SchoolId,SchoolName,SchoolTelNo in data[0]:info = SchoolInfo()info.SchoolId = SchoolIdinfo.SchoolName = SchoolNameinfo.SchoolTelNo = SchoolTelNoschools.append(info)return schoolsdef selectIdSql(cls,SchoolId:str) -> list[SchoolInfo]:""":param SchoolId:ID:return:"""schools = []data = cls.dal().selectIdSql(SchoolId)#print(data)if len(data)>0:for SchoolId,SchoolName,SchoolTelNo in data[0]:info = SchoolInfo()info.SchoolId = SchoolIdinfo.SchoolName = SchoolNameinfo.SchoolTelNo = SchoolTelNoschools.append(info)return schoolsdef addSql(cls,info:SchoolInfo) -> int:""":param info:实体类:return:"""return cls.dal().addSql(info)def add(self,info:SchoolInfo) -> int:""":param info:实体类:return:"""return self.dal().addSql(info)def editSql(cls,info:SchoolInfo) -> int:""":param info:实体类:return:"""#print(info)return cls.dal().editSql(info)def edit(self,info:SchoolInfo) -> int:""":param info:实体类:return:"""#print(info)return self.dal().editSql(info)def delSql(cls, SchoolId: str) -> int:""":param SchoolId::return:"""return cls.dal().delSql(SchoolId)def delinfo(self, SchoolId: str) -> int:""":param SchoolId::return:"""return self.dal().delSql(SchoolId)
View 部分
# encoding: utf-8
# 版权所有 2025 ©涂聚文有限公司
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author : geovindu,Geovin Du 涂聚文.
# IDE : PyCharm 2023.1 python 3.11
# OS : windows 10
# database : mysql 9.0 sql server 2019, poostgreSQL 17.0 oracle 21c Neo4j sqlite
# Datetime : 2025/2/11 20:37
# User : geovindu
# Product : PyCharm
# Project : pySQLiteMvcDemo
# File : ViewUI/SchoolView.py
# explain : 学习import tkinter as tk
from tkinter import ttk, messagebox
import sqlite3
from Model.school import SchoolInfoclass SchoolView(tk.Frame):"""View 类:负责创建和管理用户界面"""def __init__(self, master=None):""":param master:"""super().__init__(master)self.master = masterself.pack()self.create_widgets()def create_widgets(self):""":return:"""self.search_frame = tk.Frame(self)self.search_frame.pack(pady=10)# 搜索输入框self.search_label = tk.Label(self.search_frame, text="搜索:")#self.search_label.pack()self.search_label.grid(row=0, column=0)self.search_entry = tk.Entry(self.search_frame)#self.search_entry.pack()self.search_entry.grid(row=0, column=1)# 搜索按钮self.search_button = tk.Button(self.search_frame, text="搜索")#self.search_button.pack()self.search_button.grid(row=0, column=2)self.tree_frame = tk.Frame(self)self.tree_frame.pack(pady=10)# Treeview 控件self.tree = ttk.Treeview(self.tree_frame, columns=('ID', '校名', '电话'), show='headings')self.tree.heading('ID', text='ID')self.tree.heading('校名', text='校名')self.tree.heading('电话', text='电话')self.tree.pack()# Pagination Frameself.pagination_frame = tk.Frame(self)self.pagination_frame.pack(pady=10)# 分页控件self.prev_button = tk.Button(self.pagination_frame, text="上一页")self.prev_button.pack(side=tk.LEFT)self.page_label = tk.Label(self.pagination_frame, text="第 1 页")self.page_label.pack(side=tk.LEFT)self.pagetotal_label = tk.Label(self.pagination_frame, text="/共 1 条")self.pagetotal_label.pack(side=tk.LEFT)self.next_button = tk.Button(self.pagination_frame, text="下一页")self.next_button.pack(side=tk.LEFT)# Add/Update/Delete Frameself.action_frame = tk.Frame(self)self.action_frame.pack(pady=10)self.id_label = tk.Label(self.action_frame, text="編號:")#self.id_label.pack()self.id_label.grid(row=0, column=0)self.id_entry = tk.Entry(self.action_frame)self.id_entry.grid(row=0, column=1)# 校名输入框self.name_label = tk.Label(self.action_frame, text="校名:")self.name_label.grid(row=1, column=0)self.name_entry = tk.Entry(self.action_frame)self.name_entry.grid(row=1, column=1)# 电话输入框self.phone_label = tk.Label(self.action_frame, text="电话:")self.phone_label.grid(row=2, column=0)self.phone_entry = tk.Entry(self.action_frame)self.phone_entry.grid(row=2, column=1)# 添加按钮self.add_button = tk.Button(self.action_frame, text="添加")self.add_button.grid(row=3, column=0)# 修改按钮self.update_button = tk.Button(self.action_frame, text="修改")self.update_button.grid(row=3, column=1)# 删除按钮self.delete_button = tk.Button(self.action_frame, text="删除")self.delete_button.grid(row=3, column=2)def clear_entries(self):""":return:"""self.id_entry.delete(0, tk.END)self.name_entry.delete(0, tk.END)self.phone_entry.delete(0, tk.END)self.search_entry.delete(0, tk.END)def populate_treeview(self, contacts):""":param contacts::return:"""for i in self.tree.get_children():self.tree.delete(i)for contact in contacts:self.tree.insert('', 'end', values=contact)def update_page_label(self, page, total_pages):""":param page::param total_pages::return:"""self.page_label.config(text=f"第 {page} 页/共 {total_pages} 页")def update_page_total(self,tatal):""":param tatal::return:"""self.pagetotal_label.config(text=f"共{tatal} 条")class AddSchoolWindow(tk.Toplevel):"""弹出窗口 - 添加学校"""def __init__(self, master, controller):""":param master::param controller:"""super().__init__(master)self.controller = controllerself.title("添加学校")self.create_widgets()def create_widgets(self):""":return:"""self.action_frame = tk.Frame(self)self.action_frame.pack(pady=10)# 学校 ID 输入框self.id_label = tk.Label(self.action_frame, text="学校 ID:")self.id_label.grid(row=0, column=0)self.id_entry = tk.Entry(self.action_frame)self.id_entry.grid(row=0, column=1)# 学校名称输入框self.name_label = tk.Label(self.action_frame, text="学校名称:")self.name_label.grid(row=1, column=0)self.name_entry = tk.Entry(self.action_frame)self.name_entry.grid(row=1, column=1)# 学校电话输入框self.tel_label = tk.Label(self.action_frame, text="学校电话:")self.tel_label.grid(row=2, column=0)self.tel_entry = tk.Entry(self.action_frame)self.tel_entry.grid(row=2, column=1)# 保存按钮self.save_button = tk.Button(self.action_frame, text="保存", command=self.save_school)self.save_button.grid(row=3, column=0)def save_school(self):""":return:"""school_id = self.id_entry.get()school_name = self.name_entry.get()school_tel = self.tel_entry.get()info = SchoolInfo()info.SchoolId = school_idinfo.SchoolName = school_nameinfo.SchoolTelNo = school_telif school_id and school_name and school_tel:self.controller.add_school(info)self.destroy()else:messagebox.showerror("错误", "所有字段均为必填项")class EditSchoolWindow(tk.Toplevel):"""弹出窗口 - 修改学校"""def __init__(self, master, controller, school_id, school_name, school_tel):""":param master::param controller::param school_id::param school_name::param school_tel:"""super().__init__(master)self.controller = controllerself.school_id = school_idself.title("修改学校")self.create_widgets(school_name, school_tel)def create_widgets(self, school_name, school_tel):""":param school_name::param school_tel::return:"""self.action_frame = tk.Frame(self)self.action_frame.pack(pady=10)# 学校 ID 标签(不可编辑)self.id_label = tk.Label(self.action_frame, text="学校 ID:")self.id_label.grid(row=0, column=0)self.id_entry = tk.Entry(self.action_frame)self.id_entry.insert(0, self.school_id)self.id_entry.config(state='readonly')self.id_entry.grid(row=0, column=1)# 学校名称输入框self.name_label = tk.Label(self.action_frame, text="学校名称:")self.name_label.grid(row=1, column=0)self.name_entry = tk.Entry(self.action_frame)self.name_entry.insert(0, school_name)self.name_entry.grid(row=1, column=1)# 学校电话输入框self.tel_label = tk.Label(self.action_frame, text="学校电话:")self.tel_label.grid(row=2, column=0)self.tel_entry = tk.Entry(self.action_frame)self.tel_entry.insert(0, school_tel)self.tel_entry.grid(row=2, column=1)# 保存按钮self.save_button = tk.Button(self.action_frame, text="保存", command=self.save_school)self.save_button.grid(row=3, column=0)def save_school(self):""":return:"""school_name = self.name_entry.get()school_tel = self.tel_entry.get()if school_name and school_tel:print("edit",self.school_id)info=SchoolInfo()info.SchoolId=self.school_idinfo.SchoolName=school_nameinfo.SchoolTelNo=school_tel#self.controller.update_school(self.school_id, school_name, school_tel)self.controller.update_school(info)self.destroy()else:messagebox.showerror("错误", "所有字段均为必填项")
Controller 部分
# encoding: utf-8
# 版权所有 2025 ©涂聚文有限公司
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author : geovindu,Geovin Du 涂聚文.
# IDE : PyCharm 2023.1 python 3.11
# OS : windows 10
# database : mysql 9.0 sql server 2019, poostgreSQL 17.0 oracle 21c Neo4j sqlite
# Datetime : 2025/2/11 20:36
# User : geovindu
# Product : PyCharm
# Project : Controller/pySQLiteMvcDemo
# File : SchoolController.py
# explain : 学习
import tkinter as tk
from tkinter import ttk, messagebox
import sqlite3
from Model.school import SchoolInfo
from BLLModel.school import SchoolBll
from ViewUI.SchoolView import AddSchoolWindow
from ViewUI.SchoolView import EditSchoolWindowclass SchoolController(object):"""Controller 类:负责处理用户输入和更新模型和视图"""def __init__(self, model, view):""":param model::param view:"""self.model = SchoolInfo()self.view = viewself.current_page = 1self.limit = 10self.search_query = ""# 绑定按钮点击事件到相应的处理方法self.view.add_button.config(command=self.addschools)#self.view.add_button.config(command=self.open_add_window)self.view.update_button.config(command=self.updateschools)self.view.delete_button.config(command=self.deleteschools)self.view.search_button.config(command=self.searchschools)self.view.prev_button.config(command=self.prev_page)self.view.next_button.config(command=self.next_page)self.view.tree.bind("<Double-1>", self.open_edit_window)self.showschools()self.bll = SchoolBll()def open_add_window(self):""":return:"""AddSchoolWindow(self.view.master, self)def open_edit_window(self, event):""":param event::return:"""selected_item = self.view.tree.selection()if selected_item:values = self.view.tree.item(selected_item)['values']school_id = values[0]school_name = values[1]school_tel = values[2]EditSchoolWindow(self.view.master, self, school_id, school_name, school_tel)def add_school(self, info:SchoolInfo):""":param info::return:"""self.bll.addSql(info)self.show_schools()def delete_school(self):""":return:"""selected_item = self.view.tree.selection()if selected_item:school_id = self.view.tree.item(selected_item)['values'][0]self.bll.delSql(school_id)self.show_schools()else:messagebox.showerror("错误", "请选择要删除的学校")def update_school(self, info):""":param info::return:"""self.bll.editSql(info)self.show_schools()def search_schools(self):""":return:"""self.search_query = self.view.search_entry.get()self.current_page = 1self.show_schools()def show_schools(self):""":return:"""total_count = self.bll.getcount(self.search_query)[0][0]print(total_count)if total_count >= 1:total_pages = (total_count + self.limit - 1) // self.limitcontacts = self.bll.getschools(self.current_page, self.limit, self.search_query)self.view.populate_treeview(contacts)self.view.update_page_label(self.current_page, total_pages)self.view.update_page_total(total_count)def addschools(self):""":return:"""id = self.view.id_entry.get()name = self.view.name_entry.get()phone = self.view.phone_entry.get()self.model.SchoolId=idself.model.SchoolName=nameself.model.SchoolTelNo=phone;if name and phone:self.bll.add(self.model)self.view.clear_entries()self.showschools()else:messagebox.showerror("错误", "校名和电话不能为空")def deleteschools(self):""":return:"""selected_item = self.view.tree.selection()if selected_item:id = str(self.view.tree.item(selected_item)['values'][0])print("id",id)self.bll.delSql(id)self.showschools()else:messagebox.showerror("错误", "请选择要删除的学校")def updateschools(self, event):""":return:"""selected_item = self.view.tree.selection()if selected_item:id = str(self.view.tree.item(selected_item)['values'][0])#values = self.view.tree.item(selected_item)['values']name = self.view.name_entry.get()phone = self.view.phone_entry.get()self.model.SchoolId = idself.model.SchoolName = nameself.model.SchoolTelNo = phoneif name and phone:self.bll.editSql(self.model)self.view.clear_entries()self.showschools()else:messagebox.showerror("错误", "校名和电话不能为空")else:messagebox.showerror("错误", "请选择要修改的学校")def searchschools(self):""":return:"""self.search_query = self.view.search_entry.get()self.current_page = 1self.showschools()def prev_page(self):""":return:"""if self.current_page > 1:self.current_page -= 1self.showschools()def next_page(self):""":return:"""total_count = self.bll.getcount(self.search_query)[0][0]total_pages = (total_count + self.limit - 1) // self.limitif self.current_page < total_pages:self.current_page += 1self.showschools()def showschools(self):""":return:"""bll=SchoolBll()total_count = bll.getcount(self.search_query)[0][0]print(total_count)if total_count >= 1:total_pages = (total_count + self.limit - 1) // self.limitcontacts = bll.getschools(self.current_page, self.limit, self.search_query)self.view.populate_treeview(contacts)self.view.update_page_label(self.current_page, total_pages)self.view.update_page_total(total_count)
调用:
# encoding: utf-8
# 版权所有 2025 ©涂聚文有限公司
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author : geovindu,Geovin Du 涂聚文.塗聚文
# IDE : PyCharm Community Edition 2024.3 python 3.11
# OS : windows 10
# database : mysql 9.0 sql server 2019, postgreSQL 17.0 oracle 11g oracle 20c Neo4j sqlite
# Datetime : 2025/2/11 20:11
# User : geovindu
# Product : PyCharm
# Project : pySQLiteMVCDemo
# File : main.py
# explain : 学习import tkinter as tk
from tkinter import ttk, messagebox
from BLLModel.school import SchoolBll
from ViewUI.SchoolView import SchoolView
from Controller.SchoolController import SchoolControllerif __name__ == '__main__':""""""root = tk.Tk()bllmodel = SchoolBll()view = SchoolView(master=root)controller = SchoolController(bllmodel, view)root.title("School Management")root.iconbitmap('favicon.ico')root.mainloop()
输出:

相关文章:
MVC(Model-View-Controller)framework using Python ,Tkinter and SQLite
1.项目结构 sql: CREATE TABLE IF NOT EXISTS School (SchoolId TEXT not null, SchoolName TEXT NOT NULL,SchoolTelNo TEXT NOT NULL) 整体思路 Model:负责与 SQLite 数据库进行交互,包括创建表、插入、删除、更新和查询数据等操作。View࿱…...
WPF 设置宽度为 父容器 宽度的一半
方法1:使用 绑定和转换器 实现 创建类文件 HalfWidthConverter public class HalfWidthConverter : IValueConverter{public object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (value is double width){return width / 4…...
java项目之在线心理评测与咨询管理系统(源码+文档)
项目简介 在线心理评测与咨询管理系统实现了以下功能: 在线心理评测与咨询管理系统的主要使用者分为: (1)在个人中心,管理员可以修改自己的用户名和登录密码。 (2)在系统前台可以查看首页&…...
【STM32系列】利用MATLAB配合ARM-DSP库设计FIR数字滤波器(保姆级教程)
ps.源码放在最后面 设计IIR数字滤波器可以看这里:利用MATLAB配合ARM-DSP库设计IIR数字滤波器(保姆级教程) 前言 本篇文章将介绍如何利用MATLAB与STM32的ARM-DSP库相结合,简明易懂地实现FIR低通滤波器的设计与应用。文章重点不在…...
Springboot框架扩展功能的使用
Spring Boot 提供了许多扩展点,允许开发者在应用程序的生命周期中插入自定义逻辑。这些扩展点可以帮助你更好地控制应用程序的行为,例如在启动时初始化数据、在关闭时释放资源、或者自定义配置加载逻辑。以下是 Spring Boot 中常见的扩展点: …...
yum报错 Could not resolve host: mirrorlist.centos.org
检查dns 使用ping www.baidu.com ,如果ping不通,检查/etc/resolv.conf文件中是否有: nameserver 8.8.8.8 nameserver 8.8.4.4 替换yum源 1.备份原始的 YUM 源配置文件: sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.r…...
docker使用dockerfile打包镜像(docker如何打包)
文章目录 1. 编写 Dockerfile2. 构建 Docker 镜像3. 运行 Docker 容器4. 导出与导入镜像(可选) 1. 编写 Dockerfile Dockerfile 是一个文本文件,其中包含了一系列指令,这些指令定义了如何构建你的 Docker 镜像。下面以一个简单的…...
去中心化AGI网络架构:下一代人工智能的范式革命
文章目录 引言:当AGI遇到去中心化一、中心化AI架构的四大困境1.1 算力垄断与资源错配1.2 数据孤岛与隐私悖论1.3 模型暴政与单点故障1.4 创新抑制与价值捕获二、去中心化AGI网络的架构设计2.1 分层架构总览2.2 网络层:混合拓扑结构2.3 计算层:动态算力编排2.4 数据层:零知识…...
gitlab无法登录问题
在我第一次安装gitlab的时候发现登录页面是 正常的页面应该是 这种情况的主要原因是不是第一次登录,所以我们要找到原先的密码 解决方式: [rootgitlab ~]# vim /etc/gitlab/initial_root_password# WARNING: This value is valid only in the followin…...
单向链表在实际项目中的应用
前言 在实际项目中,单向链表经常被用来解决排队问题,因为链表允许动态地添加和移除元素,非常适合模拟队列(FIFO,先进先出)的行为。 这里的链表包含头节点,头结点的数据用来记录链表长度&#x…...
【系统架构设计师】操作系统 ③ ( 存储管理 | 页式存储弊端 - 段式存储引入 | 段式存储 | 段表 | 段表结构 | 逻辑地址 的 合法段地址判断 )
文章目录 一、页式存储弊端 - 段式存储引入1、页式存储弊端 - 内存碎片2、页式存储弊端 - 逻辑结构不匹配3、段式存储引入 二、段式存储 简介1、段式存储2、段表3、段表 结构4、段内地址 / 段内偏移5、段式存储 优缺点6、段式存储 与 页式存储 对比 三、逻辑地址 的 合法段地址…...
PDF另存为图片的一个方法
说明 有时需要把PDF的每一页另存为图片。用Devexpress可以很方便的完成这个功能。 窗体上放置一个PdfViewer。 然后循环每一页 for (int i 1; i < pdfViewer1.PageCount; i) 调用 chg_pdf_to_bmp函数获得图片并保存 chg_pdf_to_bmp中调用了PdfViewer的CreateBitmap函数…...
HTML之JavaScript运算符
HTML之JavaScript运算符 1.算术运算符 - * / %除以0,结果为Infinity取余数,如果除数为0,结果为NaN NAN:Not A Number2.复合赋值运算符 - * / %/ 除以0,结果为Infinity% 如果除数为0,结果为NaN NaN:No…...
借助 ListWise 提升推荐系统精排效能:技术、案例与优化策略
目录 一、引言二、ListWise 方法概述三、ListWise 用于精排的优势四、ListWise 样本具体的构建过程4.1 确定样本的上下文4.2 收集候选物品及相关特征4.3 确定物品的真实排序标签4.4 构建样本列表4.5 划分训练集、验证集和测试集 五、ListWise 方法案例分析六、ListWise 方法在精…...
C++中什么时候用. 什么时候用->
学了一年C今天出了一个大岔子,因为太久没有做链表类型题目了,并且STL用惯了今天遇到一题,写的时候发现完全不对劲,搞慌了,首先我们看题目 2. 两数相加 再看我第一次的解答,先不论结果对不对 错的行为有很多…...
从云原生到 AI 原生,谈谈我经历的网关发展历程和趋势
作者:谢吉宝(唐三) 编者按: 云原生 API 网关系列教程即将推出,欢迎文末查看教程内容。本文整理自阿里云智能集团资深技术专家,云原生产品线中间件负责人谢吉宝(唐三) 在云栖大会的精…...
【Python深入浅出】Python3正则表达式:开启高效字符串处理大门
目录 一、正则表达式基础入门1.1 什么是正则表达式1.2 正则表达式的语法规则1.3 特殊字符与转义 二、Python 中的 re 模块2.1 re 模块概述2.2 常用函数与方法2.2.1 re.match()2.2.2 re.search()2.2.3 re.findall()2.2.4 re.sub() 2.3 修饰符(Flags)的使用…...
Vue.js Vue CLI 安装与使用
Vue.js Vue CLI 安装与使用 今天我们来聊聊 Vue CLI 的安装与使用。对于开发 Vue 应用来说,Vue CLI 是一个非常强大的工具,它能帮助你快速创建项目脚手架、配置开发环境、自动化构建流程,从而大大提高开发效率。下面我就和大家一步一步地讲解…...
科技的尽头:在有限与永恒的夹缝中寻找文明的真谛
当人类用燧石点燃第一簇文明之火时,科技发展的齿轮便已开始转动。这个从原始工具到量子计算机的进化历程,既是人类突破生物局限的史诗,也是文明不断自我解构与重构的哲学叙事。站在人工智能与基因编辑并行的时代节点,"科技尽…...
【牛客】动态规划专题一:斐波那契数列
文章目录 DP1 斐波那契数列法1:递归法2:动态规划法3:优化空间复杂度 2.分割连接字符串3. 给定一个字符串s和一组单词dict,在s中添加空格将s变成一个句子 DP1 斐波那契数列 法1:递归 // 递归 #include <iostream>…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
