python: SQLAlchemy (ORM) Simple example using SQLite

  • 领域层(Domain Laye):定义了 School 实体类和 SchoolRepository 抽象基类,明确了业务实体和数据访问的契约。
  • 基础设施层(Infrastructure Laye):通过 SQLAlchemy 实现了 SchoolRepository 类,负责与 SQLite 数据库进行交互,包括增删改查操作。
  • 应用层(Application Laye):SchoolService 类封装了业务逻辑,调用 SchoolRepository 接口的方法完成具体的业务操作。
  • 表现层(Presentation Laye):
    • SchoolView 类负责创建和管理用户界面,包括搜索框、ttk.Treeview 表格、操作按钮和分页按钮。
    • SchoolController 类处理用户的操作请求,调用 SchoolService 完成相应的业务逻辑,并更新视图。

项目结构:

领域层(Domain Laye):

# 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
# Datetime  : 2025/2/19 20:39
# User      : geovindu
# Product   : PyCharm
# Project   : pySQLiteDDDOrmDemo
# File      : domain/entities/school.py
# explain   : 学习

class School:
    """
    领域层(Domain)
    """
    def __init__(self, school_id, school_name, school_tel_no):
        """

        :param school_id:
        :param school_name:
        :param school_tel_no:
        """
        self.school_id = school_id
        self.school_name = school_name
        self.school_tel_no = school_tel_no



# 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
# Datetime  : 2025/2/19 20:40
# User      : geovindu
# Product   : PyCharm
# Project   : pySQLiteDDDOrmDemo
# File      : domain/repositories/schoolRepositories.py
# explain   : 学习
from abc import ABC, abstractmethod
from typing import List
from ..entities.school import School


class SchoolRepository(ABC):
    """
     领域层(Domain) 接口
    """
    @abstractmethod
    def add(self, school: School):
        """

        :param school:
        :return:
        """
        pass

    @abstractmethod
    def update(self, school: School):
        """

        :param school:
        :return:
        """
        pass

    @abstractmethod
    def delete(self, school_id: str):
        """

        :param school_id:
        :return:
        """
        pass

    @abstractmethod
    def get_all(self, page: int, page_size: int, search_query: str = "") -> List[School]:
        """

        :param page:
        :param page_size:
        :param search_query:
        :return:
        """
        pass

    @abstractmethod
    def get_total_count(self, search_query: str = "") -> int:
        """

        :param search_query:
        :return:
        """
        pass


基础设施层(Infrastructure Laye):

# 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
# Datetime  : 2025/2/19 21:30
# User      : geovindu
# Product   : PyCharm
# Project   : pySQLiteDDDOrmDemo
# File      : school.py
# explain   : 学习

from sqlalchemy import create_engine, Column, String
from sqlalchemy.orm import sessionmaker, declarative_base
from domain.entities.school import School
from ..database.sqlitehelper import SqliteHelper

Base = declarative_base()


class SchoolModel(Base):
    """
    基础设施层(Infrastructure)
    """
    __tablename__ = 'School'
    SchoolId = Column(String, primary_key=True)
    SchoolName = Column(String, nullable=False)
    SchoolTelNo = Column(String, nullable=False)


# 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
# Datetime  : 2025/2/19 21:41
# User      : geovindu
# Product   : PyCharm
# Project   : pySQLiteDDDOrmDemo
# File      : school.py
# explain   : 学习

from sqlalchemy import create_engine, Column, String
from sqlalchemy.orm import sessionmaker, declarative_base
from domain.entities.school import School
from ..database.sqlitehelper import SqliteHelper
from ..model.school import SchoolModel

class SchoolRepository:
    """
    基础设施层(Infrastructure)
    """

    def __init__(self):
        """

        """
        self._session = SqliteHelper()  # Session()


    def add(self, school: School):
        """

        :param school:
        :return:
        """
        session = self._session.getSession()    #  Session()  #
        school_model = SchoolModel(SchoolId=school.school_id, SchoolName=school.school_name,
                                   SchoolTelNo=school.school_tel_no)
        session.add(school_model)
        session.commit()
        session.close()

    def update(self, school: School):
        """

        :param school:
        :return:
        """

        session =  self._session.getSession()    # Session() #
        school_model = session.query(SchoolModel).filter_by(SchoolId=school.school_id).first()
        if school_model:
            school_model.SchoolName = school.school_name
            school_model.SchoolTelNo = school.school_tel_no
            session.commit()
        session.close()

    def delete(self, school_id: str):
        """

        :param school_id:
        :return:
        """
        session =  self._session.getSession()    # Session()  #
        school_model = session.query(SchoolModel).filter_by(SchoolId=school_id).first()
        if school_model:
            session.delete(school_model)
            session.commit()
        session.close()

    def get_all(self, page: int, page_size: int, search_query: str = ""):
        """

        :param page:
        :param page_size:
        :param search_query:
        :return:
        """
        session = self._session.getSession()  #  Session()  #
        query = session.query(SchoolModel)
        if search_query:
            query = query.filter(
                (SchoolModel.SchoolId.contains(search_query)) |
                (SchoolModel.SchoolName.contains(search_query)) |
                (SchoolModel.SchoolTelNo.contains(search_query))
            )
        offset = (page - 1) * page_size
        school_models = query.offset(offset).limit(page_size).all()
        session.close()
        return [School(school.SchoolId, school.SchoolName, school.SchoolTelNo) for school in school_models]

    def get_total_count(self, search_query: str = ""):
        """

        :param search_query:
        :return:
        """
        session = self._session.getSession()    # Session()  #
        query = session.query(SchoolModel)
        if search_query:
            query = query.filter(
                (SchoolModel.SchoolId.contains(search_query)) |
                (SchoolModel.SchoolName.contains(search_query)) |
                (SchoolModel.SchoolTelNo.contains(search_query))
            )
        count = query.count()
        session.close()
        return count


应用层(Application Laye):

# 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
# Datetime  : 2025/2/19 21:10
# User      : geovindu
# Product   : PyCharm
# Project   : pySQLiteDDDOrmDemo
# File      : application/services/schoolServices.py
# explain   : 学习

from typing import List
from domain.entities.school import School
from domain.repositories.schoolRepositories import SchoolRepository


class SchoolService:
    """
    应用层(Application)
    """
    def __init__(self, repository: SchoolRepository):
        """

        :param repository:
        """
        self.repository = repository

    def add_school(self, school: School):
        """

        :param school:
        :return:
        """
        self.repository.add(school)

    def update_school(self, school: School):
        """

        :param school:
        :return:
        """
        self.repository.update(school)

    def delete_school(self, school_id: str):
        """

        :param school_id:
        :return:
        """
        self.repository.delete(school_id)

    def get_schools(self, page: int, page_size: int, search_query: str = "") -> List[School]:
        """

        :param page:
        :param page_size:
        :param search_query:
        :return:
        """
        return self.repository.get_all(page, page_size, search_query)

    def get_total_count(self, search_query: str = "") -> int:
        """

        :param search_query:
        :return:
        """
        return self.repository.get_total_count(search_query)


表现层(Presentation Laye):

# 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
# Datetime  : 2025/2/19 18:46
# User      : geovindu
# Product   : PyCharm
# Project   : pySQLiteDDDOrmDemo
# File      : presentation/views/schoolViews.py
# explain   : 学习

import tkinter as tk
from tkinter import ttk


class SchoolView:
    """
    表现层(Presentation) UI
    """
    def __init__(self, root):
        self.root = root
        self.root.title("School Management")

        # 搜索框
        self.search_frame = ttk.Frame(root)
        self.search_frame.pack(pady=10)
        self.search_entry = ttk.Entry(self.search_frame)
        self.search_entry.pack(side=tk.LEFT, padx=5)
        self.search_button = ttk.Button(self.search_frame, text="Search")
        self.search_button.pack(side=tk.LEFT)

        # Treeview
        self.tree = ttk.Treeview(root, columns=('SchoolId', 'SchoolName', 'SchoolTelNo'), show='headings')
        self.tree.heading('SchoolId', text='School ID')
        self.tree.heading('SchoolName', text='School Name')
        self.tree.heading('SchoolTelNo', text='School Tel No')
        self.tree.pack(pady=10)

        # 操作按钮
        self.button_frame = ttk.Frame(root)
        self.button_frame.pack(pady=10)
        self.add_button = ttk.Button(self.button_frame, text="Add")
        self.add_button.pack(side=tk.LEFT, padx=5)
        self.edit_button = ttk.Button(self.button_frame, text="Edit")
        self.edit_button.pack(side=tk.LEFT, padx=5)
        self.delete_button = ttk.Button(self.button_frame, text="Delete")
        self.delete_button.pack(side=tk.LEFT, padx=5)

        # 分页按钮
        self.pagination_frame = ttk.Frame(root)
        self.pagination_frame.pack(pady=10)
        self.prev_button = ttk.Button(self.pagination_frame, text="Previous")
        self.prev_button.pack(side=tk.LEFT, padx=5)
        self.page_label = ttk.Label(self.pagination_frame, text="Page 1 of 1")
        self.page_label.pack(side=tk.LEFT, padx=5)
        self.next_button = ttk.Button(self.pagination_frame, text="Next")
        self.next_button.pack(side=tk.LEFT, padx=5)

    def clear_tree(self):
        for item in self.tree.get_children():
            self.tree.delete(item)

    def populate_tree(self, schools):
        for school in schools:
            self.tree.insert('', 'end', values=(school.school_id, school.school_name, school.school_tel_no))

    def update_page_label(self, current_page, total_pages):
        self.page_label.config(text=f"Page {current_page} of {total_pages}")

    def open_add_window(self, save_callback):
        top = tk.Toplevel(self.root)
        top.title("Add School")

        ttk.Label(top, text="School ID:").grid(row=0, column=0, padx=5, pady=5)
        id_entry = ttk.Entry(top)
        id_entry.grid(row=0, column=1, padx=5, pady=5)

        ttk.Label(top, text="School Name:").grid(row=1, column=0, padx=5, pady=5)
        name_entry = ttk.Entry(top)
        name_entry.grid(row=1, column=1, padx=5, pady=5)

        ttk.Label(top, text="School Tel No:").grid(row=2, column=0, padx=5, pady=5)
        tel_entry = ttk.Entry(top)
        tel_entry.grid(row=2, column=1, padx=5, pady=5)

        def save_school():
            school_id = id_entry.get()
            school_name = name_entry.get()
            school_tel_no = tel_entry.get()
            if school_id and school_name and school_tel_no:
                save_callback(school_id, school_name, school_tel_no)
                top.destroy()

        ttk.Button(top, text="Save", command=save_school).grid(row=3, column=0, columnspan=2, pady=10)

    def open_edit_window(self, school_id, school_name, school_tel_no, update_callback):
        top = tk.Toplevel(self.root)
        top.title("Edit School")

        ttk.Label(top, text="School ID:").grid(row=0, column=0, padx=5, pady=5)
        id_entry = ttk.Entry(top)
        id_entry.insert(0, school_id)
        id_entry.config(state='readonly')
        id_entry.grid(row=0, column=1, padx=5, pady=5)

        ttk.Label(top, text="School Name:").grid(row=1, column=0, padx=5, pady=5)
        name_entry = ttk.Entry(top)
        name_entry.insert(0, school_name)
        name_entry.grid(row=1, column=1, padx=5, pady=5)

        ttk.Label(top, text="School Tel No:").grid(row=2, column=0, padx=5, pady=5)
        tel_entry = ttk.Entry(top)
        tel_entry.insert(0, school_tel_no)
        tel_entry.grid(row=2, column=1, padx=5, pady=5)

        def update_school():
            new_school_name = name_entry.get()
            new_school_tel_no = tel_entry.get()
            if new_school_name and new_school_tel_no:
                update_callback(school_id, new_school_name, new_school_tel_no)
                top.destroy()

        ttk.Button(top, text="Update", command=update_school).grid(row=3, column=0, columnspan=2, pady=10)






# encoding: utf-8
# 版权所有 2025 ©涂聚文有限公司 ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述: controllers  views 可以分开
# 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
# Datetime  : 2025/2/19 21:48
# User      : geovindu
# Product   : PyCharm
# Project   : pySQLiteDDDOrmDemo
# File      : presentation/controllers/schoolControllers.py
# explain   : 学习

import tkinter as tk
from application.services.schoolServices import SchoolService
from domain.entities.school import School


class SchoolController:
    """
    表现层(Presentation)
    """
    def __init__(self, service: SchoolService, view):
        """

        :param service:
        :param view:
        """
        self.service = service
        self.view = view
        self.current_page = 1
        self.page_size = 10
        self.search_query = ""
        self.total_pages = 1

        self.view.search_button.config(command=self.search)
        self.view.add_button.config(command=self.add)
        self.view.edit_button.config(command=self.edit)
        self.view.delete_button.config(command=self.delete)
        self.view.prev_button.config(command=self.prev_page)
        self.view.next_button.config(command=self.next_page)

        self.load_data()

    def load_data(self):
        """

        :return:
        """
        schools = self.service.get_schools(self.current_page, self.page_size, self.search_query)
        total_count = self.service.get_total_count(self.search_query)
        self.total_pages = (total_count + self.page_size - 1) // self.page_size

        self.view.clear_tree()
        self.view.populate_tree(schools)
        self.view.update_page_label(self.current_page, self.total_pages)

        self.view.prev_button.config(state=tk.NORMAL if self.current_page > 1 else tk.DISABLED)
        self.view.next_button.config(state=tk.NORMAL if self.current_page < self.total_pages else tk.DISABLED)

    def search(self):
        """

        :return:
        """
        self.search_query = self.view.search_entry.get()
        self.current_page = 1
        self.load_data()

    def add(self):
        """

        :return:
        """
        def save_callback(school_id, school_name, school_tel_no):
            new_school = School(school_id, school_name, school_tel_no)
            self.service.add_school(new_school)
            self.load_data()

        self.view.open_add_window(save_callback)

    def edit(self):
        """

        :return:
        """
        selected_item = self.view.tree.selection()
        if selected_item:
            values = self.view.tree.item(selected_item, 'values')
            school_id, school_name, school_tel_no = values

            def update_callback(school_id, new_school_name, new_school_tel_no):
                updated_school = School(school_id, new_school_name, new_school_tel_no)
                self.service.update_school(updated_school)
                self.load_data()

            self.view.open_edit_window(school_id, school_name, school_tel_no, update_callback)

    def delete(self):
        """

        :return:
        """
        selected_item = self.view.tree.selection()
        if selected_item:
            school_id = self.view.tree.item(selected_item, 'values')[0]
            self.service.delete_school(school_id)
            self.load_data()

    def prev_page(self):
        """
        下一页
        :return:
        """
        if self.current_page > 1:
            self.current_page -= 1
            self.load_data()

    def next_page(self):
        """
        上一页
        :return:
        """
        if self.current_page < self.total_pages:
            self.current_page += 1
            self.load_data()

调用:

# encoding: utf-8
# 版权所有 2025 涂聚文有限公司
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:  Object-Relational Mapping (ORM)
# 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
# Datetime  : 2025/2/19 21:02
# User      : geovindu
# Product   : PyCharm
# Project   : pySQLiteDDDOrmDemo
# File      : main.py
# explain   : 学习
import tkinter as tk

from Infrastructure.repository.school import SchoolRepository
from application.services.schoolServices import SchoolService
from presentation.views.schoolViews import SchoolView
from presentation.controllers.schoolControllers import SchoolController

if __name__ == '__main__':
    """
    """
    root = tk.Tk()
    repository = SchoolRepository()
    service = SchoolService(repository)
    view = SchoolView(root)
    controller = SchoolController(service, view)
    root.iconbitmap("favicon.ico")
    root.mainloop()
    print('PyCharm,geovindu,Geovin Du,塗聚文,涂聚文')


输出:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/975243.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯定时器实现led闪烁

step1.配置定时器&#xff0c;TIM1时高级定时&#xff0c;TIM2是通用定时器&#xff0c;用TIM2就行&#xff0c;用内部时钟源&#xff0c;记住相关公式&#xff0c;定时器中断配置时要使能&#xff0c;且生成代码后也要在mian中写使能函数 step2.写代码 配置生成代码后多出的…

【深度学习】Pytorch的深入理解和研究

一、Pytorch核心理解 PyTorch 是一个灵活且强大的深度学习框架&#xff0c;广泛应用于研究和工业领域。要深入理解和研究 PyTorch&#xff0c;需要从其核心概念、底层机制以及高级功能入手。以下是对 PyTorch 的深入理解与研究的详细说明。 1. 概念 动态计算图&#xff08;D…

HAProxy介绍与编译安装

目录 1、HAProxy介绍 2、HAProxy编译安装 Centos 基础环境 Ubuntu 基础环境 编译安装HAProxy 验证HAProxy版本 HAProxy启动脚本 配置文件 启动haproxy 验证haproxy状态 查看haproxy的状态页面 1、HAProxy介绍 HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年…

动静态链接与加载

目录 静态链接 ELF加载与进程地址空间&#xff08;静态链接&#xff09; 动态链接与动态库加载 GOT表 静态链接 对于多个.o文件在没有链接之前互相是不知到对方存在的&#xff0c;也就是说这个.o文件中调用函数的的跳转地址都会被设定为0&#xff08;当然这个函数是在其他.…

无人机遥控器接口作用详解!

USB接口&#xff1a; 功能&#xff1a;USB接口是一种通用串行总线接口&#xff0c;用于连接外部设备&#xff0c;如手机、平板、电脑或充电设备。在无人机遥控器上&#xff0c;USB接口通常用于数据传输和充电。 应用&#xff1a;用户可以通过USB接口将遥控器与电脑连接&#…

A100、H100、H800、H20等多种显卡配置对比

显卡对比 型号A10080GB SXMA10080GB PCIeH10080GB SXMH10080GB PCIeH20H80080GB SXMH80080GB PCIe数据来源链接链接链接链接链接链接链接GPU架构AmpereAmpereHopperHopperHopperHopperHopper显存容量80GB HBM2e80GB HBM2e80GB94GB96GB80GB80GB显存带宽1,935 GB/s2,039 GB/s3.3…

简讯:Rust 2024 edition and v1.85.0 已发布

详见 https://blog.rust-lang.org/2025/02/20/Rust-1.85.0.html 升级方法&#xff1a;rustup update stable

学工管理系统用户手册

学工管理系统是一种基于现代化信息技术的软件系统&#xff0c;旨在帮助学校、学院及教育机构全面管理学生的学习生活和个人发展。 1.系统简介 学工管理系统是一个综合性的学校管理平台&#xff0c;集成多个模块&#xff0c;包括学生信息管理、学生考勤管理、学生成绩管理、学生…

提效10倍:基于Paimon+Dolphin湖仓一体新架构在阿里妈妈品牌业务探索实践

1. 业务背景 阿里妈妈品牌广告数据包括投放引擎、下发、曝光、点击等日志&#xff0c;面向运筹调控、算法特征、分析报表、诊断监控等应用场景&#xff0c;进行了品牌数仓能力建设。随着业务发展&#xff0c;基于Lambda架构的数仓开发模式&#xff0c;缺陷日益突出&#xff1a;…

tauri2实现监听记住窗口大小变化,重启回复之前的窗口大小

要想实现记住窗口大小的功能&#xff0c;整体逻辑就是要监听窗口大小变化&#xff0c;将窗口大小保存下来&#xff0c;重启之后&#xff0c;读取保存的大小&#xff0c;然后恢复。这里可以使用rust层实现&#xff0c;也可以在前端实现。我这里就纯rust层实现了。 监听窗口变化…

【好玩的工具和命令】 ASCII 艺术生成工具: figlet

figlet 是一款用于生成 ASCII 艺术文字的工具&#xff0c;支持多种字体样式。它能将输入的文本转换为由字符组成的大型字母图案&#xff0c;广泛应用于命令行环境下的标题展示或装饰。 核心功能 生成 ASCII 文字艺术&#xff1a;将普通文本转化为大号的、由字符构成的艺术字…

Golang 相关的github 开源项目

1. pan-light url: http://github.com/peterq/pan-lightstar: 12.1kfork: 2.5kwatch: 284 用Golang和Qt5编写的不限速版百度网盘。相比之前版本的百度网盘客户端&#xff0c;当前版本拥有更友好、便捷的图形界面&#xff0c;体量更轻&#xff0c;便于使用&#xff0c;只需下载…

[ComfyUI]Recraft贴图开源方案,实现服装印花自由

一、介绍 今天发现了一个简单又好用的插件&#xff0c;可以实现类似Recraft的贴图功能&#xff0c;这是一个作者开发的ComfyUI插件&#xff0c;叫做Comfyui-Transform 这个插件比我们简单的图像覆盖多了一些可控参数&#xff0c;形状、透明度、倾斜、拉升和混合模式等诸多可控…

C语言--正序、逆序输出为奇数的位。

题目&#xff1a; 采用正序和逆序分别输出为奇数的位。例如输入12345&#xff0c;正序输出135&#xff0c;逆序输出531 代码&#xff1a; #include <stdio.h>void printOddDigits(int num) {int res 0;int divider 10;while (num / divider > 10) {divider * 10;…

最新版IDEA下载安装教程

一、下载IDEA 点击前往官网下载 或者去网盘下载 点击前往百度网盘下载 点击前往夸克网盘下载 进去后点击IDEA 然后点击Download 选择自己电脑对应的系统 点击下载 等待下载即可 二、安装IDEA 下载好后双击应用程序 点击下一步 选择好安装目录后点击下一步 勾选这两项后点击…

Windows10系统本地部署Ollama_DeepSeek-R1实操手册

前言&#xff1a; 在当今人工智能飞速发展的时代&#xff0c;大语言模型的应用与探索不断拓展着科技边界。Ollama 作为一款开源且极具创新性的工具&#xff0c;为本地部署大语言模型开辟了便捷通道。它操作简便&#xff0c;极大降低了模型部署门槛&#xff0c;让开发者无需复杂…

netty基础知识梳理和总结

目录标题 由来netty整体结构核心功能可扩展的事件模型统一的通信 API零拷贝机制与字节缓冲区 传输服务协议支持 netty的IO模型netty核心组件ChannelEventLoop、EventLoopGroupChannelHandlerChannelPipelineBootstrapFuture netty的bytebufbytebuf的内部构造bytebuf的使用模式B…

Flutter_学习记录_各个屏幕的适配

用flutter的这个库&#xff0c;可以解决&#xff1a;https://pub.dev/packages/flutter_screenutil 使用方法&#xff1a; 在pubspec.yaml文件中&#xff0c;添加库&#xff0c;如下图&#xff1a; 在main.dart中导入头文件 import package:flutter_screenutil/flutter_scre…

关闭超时订单和七天自动确认收货+RabbitMQ规范

关闭超时订单 创建订单之后的一段时间内未完成支付而关闭订单的操作&#xff0c;该功能一般要求每笔订单的超时时间是一致的 TTL&#xff08;Time To Live&#xff09;存活时间&#xff0c;只能被设置为某个固定的值&#xff0c;不能更改&#xff0c;否则抛出异常 死信&#…

C/C++ | 每日一练 (2)

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 C/C | 每日一练 (2)题目参考答案封装继承多态虚函数底…