python项目搭建(上)

news2024/10/5 13:04:30

提示:惊觉相思不露,原来只因已入骨

文章目录

  • 前言
  • 软件的安装
  • HTTP协议
  • 1.安装Django
  • 启动Django
  • 路由子表
  • 定义数据库
  • 创建数据库表
  • 过滤条件
    • 生成HTML


前言

这里是用python搭建的一个**销售管理系统,用于记录个人遇到的一些错误


提示:以下是本篇文章正文内容,下面案例可供参考

软件的安装

这里我的电脑是windows10系统64位,之前我的电脑上面安装过python3.8,还有pycharm2021 ,之前写的时候记得这两个好像要对应 但是现在忘了是不是要求对应,这里希望大家先按照我的这个进行安装软件,软件安装可以选择再阅读 ,安装的话可以在公众号

请添加图片描述
然后我尽量详细的写出我的每一步,并在最后附上代码,希望对大家有所帮助,

HTTP协议

我们搭建一个web网站 其实就是一个前端与后端信息进行交互的过程 而前端与后端之间的交互是通过HTTP协议进行通信的,要学习后端的开发,了解部分的HTTP协议倒也是有很大的帮助(当然目前也可以不理会这些,但是后面是有助于理解的其中的操作的)
HTTP协议最大的特点就是通讯双方分为客户端和服务端(客户端先发送HTTP请求request给服务端 然后服务端发送http响应response给客户端) 目前HTTP是基于TCP协议,所以要进行通讯 客户端和服务端要创建TCP连结,在TCP协议中服务端是不能主动的发消息给客户端的我们随便打开一个网站 按F12进入开发者模式
请添加图片描述

请添加图片描述

点击两个红色的部分 就能看到响应 其中 我们就是通过这个请求的url 去获得相应的信息 通常返回的信息体的结构是Json格式的文本
请求方法:常见的请求方法有四种GET(从服务器获取信息)POST(添加信息到服务器中进行处理)PUT(要求服务器更新信息) DELETE(请求服务器删除信息)
状态码:他表示服务器对客户端请求的处理结果,状态码通常是3位数字来表示,通常有以下几种状态码
2XX :通常表示请求消息没有问题 并且服务器也正常处理了 就像这里的200
3XX:这个是重定向响应 常见的值是301,302 表示客户端的这个请求的url地址已经改变了 需要客户端重新发起一个请求到另外一个url
4XX:表示客户端的请求有错误 常见的值有:
400:Bad request表示客户端请求不符合接口要求 比如格式错误
401 Unauthorized 表示客户端需要先认证才能发送次请求
403 Forbidden 表示客户端没有权限要求服务器处理这样的请求, 比如普通用户请求删除别人账号等
404 Not Found 表示客户端请求的url 不存在
5XX:表示服务端在处理请求中,发生了未知的错误。通常是服务端的代码设计问题,或者是服务端子系统出了故障(比如数据库服务宕机了)

1.安装Django

Django是使用python语言编写的, 所以安装Django像安装其他的库一样 cmd之后
pip install django
也可以通过
python -m django --version
来查看是否安装成功
请添加图片描述
安装好之后,我们需要创建我们的项目目录,我们可以在E盘Projects文件夹下创建一个Dream的项目根目录 执行下面的命令就会创建项目目录
django-admin startproject Dream

请添加图片描述

打开pycharm文件中打开E盘projects文件下的Dream如下
请添加图片描述
此时就会得到一个这样的(若是没有找到 记得刷新呦)
请添加图片描述
最外层的Dream就是项目的根目录 所有的文件都放在里面
manage.py是一个工具脚本,用作项目管理,以后我们会使用它执行管理操作
里面的Dream是python的包,里面包含项目的重要配置文件,这个目录名字不能随意更改 因为manage.py要用它
settings.py是Django项目的配置文件,包含了非常重要的配置项,以后我们可能需要修改里面的配置
url.py 里面存放了一张表,声名了前端发送过来的各种http请求 分别由那些函数处理
wsgi.py: 提供给wsgi web server调用 的接口文件,里面的变量application对应对象实现了 wsgi入口,供wsgi web server调用(详情请看参考文档)

启动Django

首先进入项目 根目录 比如我们这里就是请添加图片描述
然后执行如下命令
python manage.py runserver 0.0.0.0:80请添加图片描述
这样就表示启动成功了 此时我们就可以在浏览器中访问web服务了
其中 0.0.0.0:80 是指定 web服务绑定的 IP 地址和端口。0.0.0.0 表示绑定本机所有的IP地址, 就是可以通过任何一个本机的IP (包括 环回地址 127.0.0.1 ) 都可以访问我们的服务。
80 表示是服务启动在80端口上。
请打开浏览器,地址栏输入 ‘127.0.0.1’ ,就可以看到如下的界面,表示Django服务搭建成功,启动成功。
请添加图片描述

Django中的一个app就是项目里的一个应用的意思 一个项目中包含多个app 一个app通常就是一个相对独立的模块 实现相对独立的功能 比如我们可以把这个系统中的管理员管理的功能放在一个名字叫做mgr的app 中 把销售人员的操作实现在另外一个名字叫做sales的app中 一个app 本质上就是一个Python包 里面包含了一些应用相关给代码文件 当然 一个项目分成多少个app都可以 但是分成一个个相对独立的模块 是方便处理的 Django中创建app可以通过执行命令 创建一个app目录 并在里面自动创建app常用的文件,比如这里我们需要一个app专门处理销售管理系统中的销售员的添加 修改,查询 删除请求 我们就可以进入根目录 执行下面的命令
python manage.py startapp sales
请添加图片描述
这样便会创建一个名为sales的app请添加图片描述
这里可以看到我们创建的sales应用里面有一个view.py文件 这个歌文件里面通常是写处理http请求的代码的
比如,我们 设计 凡是浏览器访问的http 请求的 url 地址 是 /sales/orders/ , 就由 views.py 里面的函数 listorders 来处理, 返回一段字符串给浏览器 请大家打开view.py 在其中加入如下内容

from django.http import HttpResponse
def listorders(request):
    return HttpResponse("我不是一个样品")

这个函数最后返回的结果是HttpRespoonse对象的参数字符串 listorders中的参数request是Django中的HttpRequest对象 包含了HTTP请求中的信息 后端程序处理请求 常常要根据请求中的数据进行相应的处理 比如添加一个用户,那么HTTP请求中就会携带要添加的信息(姓名 登录账号等) 我们写后端代码这些信息就在HttpRequest对象中获取 ,但是光定义这样一个函数是不够的 我们还需要告诉Django 当前端发送过来的HTTP 请求url地址是/sales/orders/ 就由views.py 里面的listorder来处理 这里就需要我们之前提到过的url路由设置
url.py 里面存放了一张表,声名了前端发送过来的各种http请求 分别由那些函数处理
打开该文件 在urlpatterns列表变量中添加一条路由信息

from sales.views import listorders
urlpatterns = [
    path('admin/', admin.site.urls),
    path('sales/orders/', listorders),
]

**path(‘sales/orders/’, listorders),**其中这句话就是当前端过来的请求url地址是/sales/orders/,就由view.py里面的函数listorders来处理 所以所谓的路由就是指:根据HTTP请求的url路径 设置由那个函数来处理这个请求 所谓路由就是指 根据HTTP请求的url路径 设置由那个函数来处理请求,我们这时,就可以登录浏览器输入网址 http://127.0.0.1/sales/orders/ (注意:最后的一个斜杠不能省略)请添加图片描述

路由子表

路由子表就似乎将不同的路由记录按照功能分拆到不同的url路由子表文件中,比如这里我们就访问 的 url 凡是 以 sales 开头的全部都 由 sales app目录下面的 子路由文件 urls.py 处理。首先我们需要在 sales 目录下面创建一个新的文件 sales\urls.py(在sales下点击右键 创建的一个python file文件
在这个sales.py文件中输入如下内容

from django.urls import path
from . import views
urlpatterns = [
    path('orders/', views.listorders),
    path('customers/', views.listcustomers),
]

然后我们再修改主路由文件Dream/urls.py

from django.contrib import admin

# 导入一个include函数
from django.urls import path, include

from sales.views import listorders
urlpatterns = [
    path('admin/', admin.site.urls),

    # 凡是 url 以 sales/  开头的,
    # 都根据 sales.urls 里面的 子路由表进行路由
    path('sales/', include('sales.urls')),

]

当一个http请求过来时, Django检查 url,比如这里是 sales/orders/,
先到主url路由文件 bysms/urls.py中查看 是否有匹配的路由项。
如果有匹配 ( 这里匹配了 sales/ ), 并且匹配的对象 不是 函数, 而是 一个子路由设置 , 比如这里是 include(‘sales.urls’)
就会去子路由文件中查看, 这里就是 sales.urls 对应的文件 sales\urls.py
注意这时,会从请求url中去掉 前面主路由文件 已经匹配上的部分(这里是 sales/ ), 将剩余的部分 (这里是 orders/ )去子路由文件中查看是否有匹配的路由项。
这里就匹配了 orders/ ,匹配的对象,这里是 views.listorders ,它是一个处理函数,就调用该函数处理 这个http请求, 将该函数的返回对象 构建 HTTP响应消息,返回给客户端

创建数据库 执行如下命令

python manage.py migrate

此时在项目的根目录下就会出现数据库文件 并且其中自动存在一个表 (此时也有小伙伴没有使用上述的语句同样也出现了这个文件 但是此时应该是0kb的 只有执行上述命令之后就不是0)
请添加图片描述
然后我们下载sqlite的数据库工具sqlitestudio 然后
点击左上角数据库 选择添加数据库便可
请添加图片描述
(打开应该是10个表 这里因为我写到后面了 后面会多创建一个表,这其中有两个后面也会用到 一个用户表auth_user 登录会话表django_session等) 若是之前我们学过有关数据库的知识 数据库表定义和表记录之间的关系 就像类和实例之间的 关系 Django 就让开发者通过类和实例的操作来对应数据库表和记录的操作 ,Django 里面, 数据库表的操作,包括 表的定义、表中数据的增删改查,都可以通过 Model 类型的对象进行的
通常,在Django中定义一张数据库的表 就是定义一个继承自 django.db.models.Model 的类
定义该表中的字段(列), 就是定义该类里面的一些属性,类的方法就是对该表中数据的处理方法,包括 数据的增删改查,这样,开发者对数据库的访问,从原来的使用底层的 sql 语句,变成 面向对象的开发,通过一系列对象的类定义 和方法调用就可以 操作数据库。首先 极大的简化了我们应用中的数据库开发,因为无需使用sql语句操作数据库了, 提高了开发的效率;其次 屏蔽了 不同的数据库访问的底层细节,基本做到了 开发好代码后,如果要换数据库,几乎不需要改代码, 修改几个配置项就可以了。这种 通过 对象 操作数据库 的方法 被称之为 ORM (object relational mapping),下面我们就来看怎样使用。

定义数据库

首先我们再创建一个名为common的表 里面存放项目需要的一些公共的表的定义,进入项目根目录 执行下面命令,也会自动生成一些文件

python manage.py startapp common

我们打开其中的models.py此时里面是空的 此时我们在里面定义一些特定的类 数据库表的定义一般放在app目录中的models.py里面

from django.db import models
class Customer(models.Model):
    # 客户名称
    name = models.CharField(max_length=200)
    # 联系电话
    phonenumber = models.CharField(max_length=200)
    # 地址
    address = models.CharField(max_length=200)

这个 Customer 类继承自 django.db.models.Model, 就是用来定义数据库表的。
里面的 name、phonenumber、address 是该表的3个字段。
定义表中的字段 就是定义一些静态属性,这些属性是 django.db.models 里面的各种 Field 对象,对应不同类型的字段。
比如这里的3个字段 都是 CharField 对象,对应 varchar类型的数据库字段。
后面的参数 max_length 指明了该 varchar字段的 最大长度。
Djanog 有很多字段对象类型, 对应不同的类型的数据库字段

创建数据库表

首先我们需要让Django知道我们已经定义了数据库 在项目的配置文件(srttings.py)中找到INSTALLED_APPS 修改其中的内容如下

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 加入下面这行
    'common.apps.CommonConfig',
]

现在我们可以在项目根目录下执行如下命令,

python manage.py makemigrations common

请添加图片描述

这个的作用是真正去数据库中创建一个表,此时查看数据库 就会发现一个新的表 common_customer的表 多出来的id是Django 自动帮我们添加的 是该表的主键(不知道主键什么意思的请看数据库相关知识)
请添加图片描述
如果以后我们修改了Models.py 里面的库表的定义,都需要再次运行 python manage.py makemigrations common 和 python manage.py migrate 命令,使数据库同步该修改结果

请添加图片描述

首先我们需要先创建一个超级管理员账号 Django提供了一个管理员操作界面方便添加 修改 删除你定义的model表数据 进入根目录 执行如下命令 依次输入你要创建的管理员的登录名 Email 密码等请添加图片描述
现在访问http://127.0.0.1/admin/ 输入刚才注册的用户密码登录 登录后可以看到如下请添加图片描述

我们添加一个客户(customers)信息 点击save按钮 完成上述操作后 我们查看数据库是否有刚才添加的数据信息(别忘了刷新 ,为什么我是三个一样的 就是因为我忘了刷新)
请添加图片描述
首先我们先来实现一个函数 来处理浏览器发出的URL为sales/customers/ 我们的服务端就返回系统中的所有的客户记录给浏览器 之前我们就提到过对数据库的操作 应该是通过Model对象实现数据的读写 ,比如这里我们要获取customer表所有记录 该表是我们前面定义的Customer类管理的 之前我们写功能函数是在sales/view.py 这里前面的是一样的所有也会到sales中的子路由中寻找 此时我们在sales中添加如下

urlpatterns = [
    path('orders/', views.listorders),
    path('customers/', views.listcustomers),

]

此时我们再到sales中写相关的函数

def listcustomers(request):
    # 返回一个 QuerySet 对象 ,包含所有的表记录
    qs = Customer.objects.values()

    # 检查url中是否有参数phonenumber
    ph =  request.GET.get('phonenumber',None)

    # 如果有,添加过滤条件
    if ph:
        qs = qs.filter(phonenumber=ph)

    # 定义返回字符串
    retStr = ''
    for customer in  qs:
        for name,value in customer.items():
            retStr += f'{name} : {value} | '
        # <br> 表示换行
        retStr += '<br>'

    return HttpResponse(

首先我们使用Customer.objects.values() 获取所有的表信息 然后再使用for循环遍历取出里面所有的元素 每一个元素对应一个表记录 而每一个表记录都死一个dict对象 此时浏览器中输入http://127.0.0.1/sales/customers/ 此时的结果就是请添加图片描述

过滤条件

有的时候我们需要根据过滤条件查询部分客户的信息 这里我们可以通过filter方法加入过滤条件 修改view中的代码 url在匹配到函数之后 调用函数时 会传入一个HttpRequest对象给参数变量request 该对象里面包含请求的数据信息 url中的参数信息可以通过GET属性获得 一个类似与dict的对象 比如我们这里要获得里面的参数phonenumber 参数 就可以像这样
ph = request.GET.get(‘phonenumber’,None)第二个参数传入 None 表示,如果没有 phonenumber 参数在 querystring中 ,就会返回 None。然后调用filter方法 就可以把查询条件加上去

def listcustomers(request):
    # 返回一个 QuerySet 对象 ,包含所有的表记录
    qs = Customer.objects.values()

    # 检查url中是否有参数phonenumber
    ph =  request.GET.get('phonenumber',None)

    # 如果有,添加过滤条件
    if ph:
        qs = qs.filter(phonenumber=ph)

    # 定义返回字符串
    retStr = ''
    for customer in  qs:
        for name,value in customer.items():
            retStr += f'{name} : {value} | '
        # <br> 表示换行
        retStr += '<br>'

    return HttpResponse(retStr)

访问的此网址http://127.0.0.1/sales/customers/?phonenumber=11111111111以及http://127.0.0.1/sales/customers/?phonenumber=11111111112 你会发现区别
请添加图片描述
请添加图片描述

生成HTML

HTML 本身也是字符串 既然它是字符串 我们可以使用Python直接构建HTML字符串内容
在其中加入如下

# 先定义好HTML模板
html_template ='''
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
table {
    border-collapse: collapse;
}
th, td {
    padding: 8px;
    text-align: left;
    border-bottom: 1px solid #ddd;
}
</style>
</head>
    <body>
        <table>
        <tr>
        <th>id</th>
        <th>姓名</th>
        <th>电话号码</th>
        <th>地址</th>
        </tr>

        {% for customer in customers %}
            <tr>

            {% for name, value in customer.items %}            
                <td>{{ value }}</td>            
            {% endfor %}
            
            </tr>
        {% endfor %}
                
        </table>
    </body>
</html>
'''

from django.template import engines
django_engine = engines['django']
template = django_engine.from_string(html_template)

def listcustomers(request):
    # 返回一个 QuerySet 对象 ,包含所有的表记录
    qs = Customer.objects.values()

    # 检查url中是否有参数phonenumber
    ph =  request.GET.get('phonenumber',None)

    # 如果有,添加过滤条件
    if ph:
        qs = qs.filter(phonenumber=ph)

    # 传入渲染模板需要的参数
    rendered = template.render({'customers':qs})

    return HttpResponse(rendered)

此时再来访问网址http://127.0.0.1/sales/customers/ 就会得到如下信息
请添加图片描述
但是这样就有一个问题就是后端程序员也需要知道前端的那些事情 这样势必不够完美 若是前后端能分开搞 然后这样 服务端就只负责提供数据, 界面的构成全部在前端(浏览器前端或者手机前端)进行,称之为前端渲染。这也就是所谓的接口
前面我们

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软测入门(七)python操作数据文件(Json、yaml、csv、excel、xml)

python操作文件 txt文件 read() : 读取所有readline() : 读取一行readlines() : 读取所有&#xff0c;且以行为单位&#xff0c;放入list列表中 file open(r"F:\abc.txt", "r", encoding"utf-8") # 以utf-8格式读取文件 # 读取所有 # print…

IM即时通讯开发之常用加解密算法与通讯安全讲解

平时开发工作中&#xff0c;我们会经常接触加密、解密的技术。尤其在今天移动互联网时代&#xff0c;越来越多的用户会将数据存储在云端&#xff0c;或使用在线的服务处理信息。这些数据有些涉及用户的隐私&#xff0c;有些涉及用户的财产&#xff0c;要是没有一套的方案来解决…

儿童写作业的台灯怎么选择?2023给孩子买台灯最新推荐一下

儿童年龄比较小&#xff0c;所以眼睛也比较脆弱&#xff0c;然而现在的社会普遍节奏较快&#xff0c;无论是上班族&#xff0c;还是大中小学生&#xff0c;压力都比较大&#xff0c;儿童经常晚上看书、写字学习&#xff0c;眼睛难免劳累&#xff0c;所以儿童台灯最重要的就是柔…

CDGA|给金融科技数据治理的四大建议,从根基上解决问题

随着我国金融科技行业的发展&#xff0c;当前的数据治理水平已无法满足金融反哺实体经济发展的效率需要。 目前主要存在数据基础设施不完善导致的治理根基薄弱核心问题&#xff0c;建议从以下四个方面进行完善数据基础设施&#xff0c;构筑金融科技数据治理体系。 加强顶层设计…

Springboot整合RabbitMQ并使用

1、Springboot整合RabbitMQ 1、引入场景启动器 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency>引入AMQP场景启动器之后&#xff0c;RabbitAutoConfiguratio…

变电站应用监控系统6大优势,你知道几个?

变电站是改变电压、控制和分配电能的场所&#xff0c;发展方向是自动化、数字化、网络化、智能化。 泛地缘科技针对电力行业用户的使用特点&#xff0c;利用电网现有的网络资源&#xff0c;推出集动力监控、环境监理、门禁系统、消防系统、视频监控于一身的物联网云盒监控系统。…

05-思维导图Xmind快速入门

文章目录5.1 认识思维导图5.2 Xmind的主要结构及主题元素5.2.1 Xmind的多种结构5.2.2 主题分类5.2.3 Xmind的主题元素章节总结5.1 认识思维导图 什么是思维导图&#xff1f; 思维导图是一种将思维进行可视化的实用工具。 具体实现方法是用一个关键词去引发相关想法&#xff0…

Hive实战 --- 电子商务消费行为分析

目录 数据结构 Customer表 Transaction表 Store表 Review表 上传数据 创建目录用于存放数据 把本地文件上传到HDFS上 创建外部表 创建数据库 创建表 数据清洗 对transaction_details中的重复数据生成新ID 过滤掉store_review中没有评分的数据 找出PII (personal …

位图/布隆过滤器/海量数据处理方式

位图 位图的概念 所谓位图&#xff0c;就是用每一位来存放某种状态&#xff0c;适用于海量数据&#xff0c;数据无重复的场景。通常是用来判断某个数据存不存在的。 直接来看问题&#xff1a; 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0…

Gradle+SpringBoot多模块开发

关于使用Gradle结合SpringBoot进行多模块开发。 本来是打算使用buildSrc之类的&#xff0c;但是感觉好像好麻烦&#xff0c;使用这种方法就可以实现&#xff0c;没必要采用其他的。 我不怎么会表述&#xff0c;可能写的跟粑粑一样&#xff0c;哈哈哈哈 这是我的项目地址。 存在…

Java速成篇-Day01笔记

提示&#xff1a;这里只记录我个人不熟悉的知识&#xff0c;并非所有内容 笔记目录课程&#xff1a;04-第一行代码① jshell② 对象.方法课程&#xff1a;05-第一份源码① Java开发程序的流程② 入口方法课程&#xff1a;06-常见问题-中文乱码① 乱码原因② 解决方法课程&#…

【基础算法】单链表的OJ练习(4) # 分割链表 # 回文链表 #

文章目录前言分割链表回文链表写在最后前言 本章的OJ练习相对前面的难度加大了&#xff0c;但是换汤不换药&#xff0c;还是围绕单链表的性质来出题的。我相信&#xff0c;能够过了前面的OJ练习&#xff0c;本章的OJ也是轻轻松松。 对于OJ练习(3)&#xff1a;-> 传送门 <…

华为OD机试题,用 Java 解【单词反转】问题

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…

在 Docker 安装 Oracle12

说明 单独在Linux上安装Oracle很繁琐&#xff0c;首先需要安装各种依赖&#xff0c;其次安装如果失败了&#xff0c;重新配置安装也挺麻烦&#xff0c;所以如果是开发或者测试的时候使用Docker来进行安装会非常的方便。 搜索了很多的oracle相关镜像&#xff0c;选择一个适合自…

【Linux】-- 基本指令

目录 用户管理 adduser passwd userdel pwd ls指令 -l -a -d -F -r -t -R -1 which alias ll ls -n cd cd - cd ~ touch -d stat mkdir -p rmdir rm -r -f man cp ​编辑 -r -f mv cat -n tac more less -N head tail | 管道 dat…

Cookies与Session

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

JavaScript基础六、函数

零、文章目录 文章地址 个人博客-CSDN地址&#xff1a;https://blog.csdn.net/liyou123456789个人博客-GiteePages&#xff1a;https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee&#xff1a;https://gitee.com/bluecusliyou/TechLearnGithub&#xff1a;https:…

Deploy Workshop|DIY部署环境,让OceanBase跑起来

2023 年 3 月 25 日&#xff0c;我们将在北京开启首次 OceanBase 开发者大会&#xff0c;与开发者共同探讨单机分布式、云原生、HTAP 等数据库前沿趋势&#xff0c;分享全新的产品 Roadmap&#xff0c;交流场景探索和最佳实践&#xff0c;此外&#xff0c;OceanBase 开源技术全…

Qt多线程文件查找器

⭐️我叫恒心&#xff0c;一名喜欢书写博客的研究生在读生。 原创不易~转载麻烦注明出处&#xff0c;并告知作者&#xff0c;谢谢&#xff01;&#xff01;&#xff01; 这是一篇近期会不断更新的博客欧~~~ 有什么问题的小伙伴 欢迎留言提问欧。 Qt多线程文件查找器 前言 最近…

JUC并发编程——wait-notify

目录一、wait / notify1.1 wait / notify 原理1.2 wait / notify API介绍二、wait VS sleep三、wait / notify —代码改进一、wait / notify 1.1 wait / notify 原理 ● Owner线程发现条件不满足&#xff0c;调用wait( )方法即可进入WaitSet变为 WAITING状态 ● BLOCKED 和 W…