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

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&#xff1a;负责与 SQLite 数据库进行交互&#xff0c;包括创建表、插入、删除、更新和查询数据等操作。View&#xff1…...

WPF 设置宽度为 父容器 宽度的一半

方法1&#xff1a;使用 绑定和转换器 实现 创建类文件 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项目之在线心理评测与咨询管理系统(源码+文档)

项目简介 在线心理评测与咨询管理系统实现了以下功能&#xff1a; 在线心理评测与咨询管理系统的主要使用者分为&#xff1a; &#xff08;1&#xff09;在个人中心&#xff0c;管理员可以修改自己的用户名和登录密码。 &#xff08;2&#xff09;在系统前台可以查看首页&…...

【STM32系列】利用MATLAB配合ARM-DSP库设计FIR数字滤波器(保姆级教程)

ps.源码放在最后面 设计IIR数字滤波器可以看这里&#xff1a;利用MATLAB配合ARM-DSP库设计IIR数字滤波器&#xff08;保姆级教程&#xff09; 前言 本篇文章将介绍如何利用MATLAB与STM32的ARM-DSP库相结合&#xff0c;简明易懂地实现FIR低通滤波器的设计与应用。文章重点不在…...

Springboot框架扩展功能的使用

Spring Boot 提供了许多扩展点&#xff0c;允许开发者在应用程序的生命周期中插入自定义逻辑。这些扩展点可以帮助你更好地控制应用程序的行为&#xff0c;例如在启动时初始化数据、在关闭时释放资源、或者自定义配置加载逻辑。以下是 Spring Boot 中常见的扩展点&#xff1a; …...

yum报错 Could not resolve host: mirrorlist.centos.org

检查dns 使用ping www.baidu.com &#xff0c;如果ping不通&#xff0c;检查/etc/resolv.conf文件中是否有&#xff1a; nameserver 8.8.8.8 nameserver 8.8.4.4 替换yum源 1.备份原始的 YUM 源配置文件&#xff1a; sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.r…...

docker使用dockerfile打包镜像(docker如何打包)

文章目录 1. 编写 Dockerfile2. 构建 Docker 镜像3. 运行 Docker 容器4. 导出与导入镜像&#xff08;可选&#xff09; 1. 编写 Dockerfile Dockerfile 是一个文本文件&#xff0c;其中包含了一系列指令&#xff0c;这些指令定义了如何构建你的 Docker 镜像。下面以一个简单的…...

去中心化AGI网络架构:下一代人工智能的范式革命

文章目录 引言:当AGI遇到去中心化一、中心化AI架构的四大困境1.1 算力垄断与资源错配1.2 数据孤岛与隐私悖论1.3 模型暴政与单点故障1.4 创新抑制与价值捕获二、去中心化AGI网络的架构设计2.1 分层架构总览2.2 网络层:混合拓扑结构2.3 计算层:动态算力编排2.4 数据层:零知识…...

gitlab无法登录问题

在我第一次安装gitlab的时候发现登录页面是 正常的页面应该是 这种情况的主要原因是不是第一次登录&#xff0c;所以我们要找到原先的密码 解决方式&#xff1a; [rootgitlab ~]# vim /etc/gitlab/initial_root_password# WARNING: This value is valid only in the followin…...

单向链表在实际项目中的应用

前言 在实际项目中&#xff0c;单向链表经常被用来解决排队问题&#xff0c;因为链表允许动态地添加和移除元素&#xff0c;非常适合模拟队列&#xff08;FIFO&#xff0c;先进先出&#xff09;的行为。 这里的链表包含头节点&#xff0c;头结点的数据用来记录链表长度&#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&#xff0c;结果为Infinity取余数&#xff0c;如果除数为0&#xff0c;结果为NaN NAN:Not A Number2.复合赋值运算符 - * / %/ 除以0&#xff0c;结果为Infinity% 如果除数为0&#xff0c;结果为NaN NaN:No…...

借助 ListWise 提升推荐系统精排效能:技术、案例与优化策略

目录 一、引言二、ListWise 方法概述三、ListWise 用于精排的优势四、ListWise 样本具体的构建过程4.1 确定样本的上下文4.2 收集候选物品及相关特征4.3 确定物品的真实排序标签4.4 构建样本列表4.5 划分训练集、验证集和测试集 五、ListWise 方法案例分析六、ListWise 方法在精…...

C++中什么时候用. 什么时候用->

学了一年C今天出了一个大岔子&#xff0c;因为太久没有做链表类型题目了&#xff0c;并且STL用惯了今天遇到一题&#xff0c;写的时候发现完全不对劲&#xff0c;搞慌了&#xff0c;首先我们看题目 2. 两数相加 再看我第一次的解答&#xff0c;先不论结果对不对 错的行为有很多…...

从云原生到 AI 原生,谈谈我经历的网关发展历程和趋势

作者&#xff1a;谢吉宝&#xff08;唐三&#xff09; 编者按&#xff1a; 云原生 API 网关系列教程即将推出&#xff0c;欢迎文末查看教程内容。本文整理自阿里云智能集团资深技术专家&#xff0c;云原生产品线中间件负责人谢吉宝&#xff08;唐三&#xff09; 在云栖大会的精…...

【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 修饰符&#xff08;Flags&#xff09;的使用…...

Vue.js Vue CLI 安装与使用

Vue.js Vue CLI 安装与使用 今天我们来聊聊 Vue CLI 的安装与使用。对于开发 Vue 应用来说&#xff0c;Vue CLI 是一个非常强大的工具&#xff0c;它能帮助你快速创建项目脚手架、配置开发环境、自动化构建流程&#xff0c;从而大大提高开发效率。下面我就和大家一步一步地讲解…...

科技的尽头:在有限与永恒的夹缝中寻找文明的真谛

当人类用燧石点燃第一簇文明之火时&#xff0c;科技发展的齿轮便已开始转动。这个从原始工具到量子计算机的进化历程&#xff0c;既是人类突破生物局限的史诗&#xff0c;也是文明不断自我解构与重构的哲学叙事。站在人工智能与基因编辑并行的时代节点&#xff0c;"科技尽…...

【牛客】动态规划专题一:斐波那契数列

文章目录 DP1 斐波那契数列法1&#xff1a;递归法2&#xff1a;动态规划法3&#xff1a;优化空间复杂度 2.分割连接字符串3. 给定一个字符串s和一组单词dict&#xff0c;在s中添加空格将s变成一个句子 DP1 斐波那契数列 法1&#xff1a;递归 // 递归 #include <iostream>…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

JDK 17 序列化是怎么回事

如何序列化&#xff1f;其实很简单&#xff0c;就是根据每个类型&#xff0c;用工厂类调用。逐个完成。 没什么漂亮的代码&#xff0c;只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...

Vue 3 + WebSocket 实战:公司通知实时推送功能详解

&#x1f4e2; Vue 3 WebSocket 实战&#xff1a;公司通知实时推送功能详解 &#x1f4cc; 收藏 点赞 关注&#xff0c;项目中要用到推送功能时就不怕找不到了&#xff01; 实时通知是企业系统中常见的功能&#xff0c;比如&#xff1a;管理员发布通知后&#xff0c;所有用户…...

Java数组Arrays操作全攻略

Arrays类的概述 Java中的Arrays类位于java.util包中&#xff0c;提供了一系列静态方法用于操作数组&#xff08;如排序、搜索、填充、比较等&#xff09;。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序&#xff08;sort&#xff09; 对数组进行升序…...