This commit is contained in:
he
2026-09-19 15:00:19 +08:00
parent 8d4026bcfc
commit fb5a35b325
37 changed files with 25031 additions and 0 deletions
+5
View File
@@ -0,0 +1,5 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
+1
View File
@@ -0,0 +1 @@
Welcome
+19
View File
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="dataSourceStorageLocal" created-in="PY-253.30387.127">
<data-source name="@localhost" uuid="1e98505f-6f67-46d1-b5b0-72da8b1a8e3f">
<database-info product="MySQL" version="8.0.27" jdbc-version="4.2" driver-name="MySQL Connector/J" driver-version="mysql-connector-j-9.7.0 (Revision: 0aade1f13bcc98faf7dda5c02e782481eb291f62)" dbms="MYSQL" exact-version="8.0.27" exact-driver-version="9.7">
<extra-name-characters>$</extra-name-characters>
<identifier-quote-string>`</identifier-quote-string>
</database-info>
<case-sensitivity plain-identifiers="lower" quoted-identifiers="lower" />
<secret-storage>master_key</secret-storage>
<user-name>root</user-name>
<schema-mapping>
<introspection-scope>
<node kind="schema" negative="1" />
</introspection-scope>
</schema-mapping>
</data-source>
</component>
</project>
+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="@localhost" uuid="1e98505f-6f67-46d1-b5b0-72da8b1a8e3f">
<driver-ref>mysql.8</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>com.mysql.cj.jdbc.Driver</jdbc-driver>
<jdbc-url>jdbc:mysql://localhost:3306</jdbc-url>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</component>
</project>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,2 @@
#n:information_schema
!<md> [null, 0, null, null, -2147483648, -2147483648]
@@ -0,0 +1,2 @@
#n:mysql
!<md> [null, 0, null, null, -2147483648, -2147483648]
@@ -0,0 +1,2 @@
#n:performance_schema
!<md> [null, 0, null, null, -2147483648, -2147483648]
@@ -0,0 +1,2 @@
#n:sys
!<md> [null, 0, null, null, -2147483648, -2147483648]
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourcePerFileMappings">
<file url="file://$APPLICATION_CONFIG_DIR$/consoles/db/1e98505f-6f67-46d1-b5b0-72da8b1a8e3f/console.sql" value="1e98505f-6f67-46d1-b5b0-72da8b1a8e3f" />
</component>
</project>
@@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>
+7
View File
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Black">
<option name="sdkName" value="Python 3.13 (PyCharmMiscProject)" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="ai0824" project-jdk-type="Python SDK" />
</project>
+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/PyCharmMiscProject.iml" filepath="$PROJECT_DIR$/.idea/PyCharmMiscProject.iml" />
</modules>
</component>
</project>
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
@@ -0,0 +1,37 @@
'''
__all__ = [a,b,c]
决定对谁使用
__name__
异常处理的结构
异常处理的作用
私有属性
受保护的属性
类方法
静态方法
抽象类
抽象方法
魔法方法
闭包
装饰器
迭代器
生成器
日志
'''
+89
View File
@@ -0,0 +1,89 @@
# 使用orm结合fastapi接口对数据库的订单表进行增删改查
from sqlalchemy import *
from sqlalchemy.orm import declarative_base,sessionmaker
from datetime import datetime
from pydantic import BaseModel
from fastapi import FastAPI,Form
# ① 连接数据库,定义数据库表模型,以及数据库会话工具
db_url = "mysql+pymysql://root:123456@127.0.0.1:3306/ai0824?charset=utf8mb4"
engine = create_engine(db_url
,echo=True
,pool_size=50
)
Base = declarative_base()
class Order(Base): # python里的表名字
__tablename__ = 'order_info_detail' # 实际数据库的表名字
id = Column( Integer # 声明字段的数据类型
, primary_key=True # 声明是主键
, autoincrement=True # 声明是自增主键
, comment='订单编号,自增主键' # 注释
)
title = Column( String(50) # 对应数据库的varchar类型
,nullable=False # 不允许为null
)
userid = Column( Integer ) # 外键约束
create_date = Column(DATETIME
, default=datetime.now # 默认值是当前时间
)
update_date = Column(DATETIME
, default=datetime.now # 首次创建的时间跟更新时间一致
, onupdate=datetime.now
)
Order.__table__.create(engine, checkfirst=True)
session = sessionmaker(bind=engine
,autoflush=False
,autocommit=False
)
# ② 定义请求体模型,编写post接口对数据库的订单表插入数据
class Order1(BaseModel):
title:str
userid:int
app = FastAPI(title='订单增删改')
@app.post('/Orders')
def order1(o:Order1=Form()):
db = session()
d = o.model_dump()
o1 = Order(**d)
db.add(o1)
db.commit()
db.close()
return o1
# ③ 编写put接口对订单进行更新操作
@app.put('/Orders')
def order1(id:int,o:Order1=Form()):
db = session()
db.query(Order).filter(Order.id == id).update(o.model_dump(exclude_unset=True))
db.commit()
db.close()
return '查询订单'
# ④ 编写get接口对订单进行查询操作
@app.get('/Orders')
def order1(title:str|None=None,id:int|None=None):
db = session()
print(title,id)
r = db.query(Order).filter(or_(Order.title == title,Order.userid == id)).all()
db.close()
return [ {"order_id":i.id,'order_title':i.title,"user_id":i.userid,"create_date":i.create_date,"update_date":i.update_date} for i in r]
# ⑤ 编写delete接口对订单进行删除操作
@app.delete('/Orders')
def order1(title:str,id:int|None=None):
db = session()
db.query(Order).filter(or_(Order.title == title,Order.id == id)).delete()
db.commit()
db.close()
return '删除成功'
# ⑥ 总结下orm跟fastapi接口的结合使用步骤以及简单的语法结构框架
'''
连接数据库,创建模型基类,定义数据库表模型,以及数据库会话工具
'''
'''
# 思考下:
现在需要创建三个目录,api、model、schema
① api目录里编写一个文件order_api.py ,利用api路由分发,存放编写好的以上四个订单增删改查接口
② model目录里编写一个order_model.py ,存放的是订单表的表模型类
③ schema目录里编写一个 order_schema.py , 存放的是订单表的相关请求体、相应体模型
④ 在项目目录下创建一个 main.py文件,从main.py文件启动整个接口程序
尝试操作下!
'''
+4
View File
@@ -0,0 +1,4 @@
2026-09-10 22:49:57 - order_service - INFO - 业务信息:订单创建成功
2026-09-10 22:49:57 - order_service - WARNING - 警告信息:库存不足
2026-09-10 22:49:57 - order_service - ERROR - 错误信息:支付接口调用失败
2026-09-10 22:49:57 - order_service - CRITICAL - 严重错误:数据库连接断开
+104
View File
@@ -0,0 +1,104 @@
# 步骤 1:定义员工抽象类 Emp
# ①创建抽象类 Emp
# ②定义 get_info()抽象方法,规定后续继承该父类的子类都必须要实现get_info()方法
from abc import ABC,abstractmethod
class Emp(ABC):
@abstractmethod
def get_info(self):
pass
# 步骤 2:定义员工类 Employee,这个类继承 Emp 抽象类
# ①创建类 Employee
# ②添加类属性:company = "科技有限公司"(所有员工共享公司名)
# ③初始化方法 __init__ 定义实例属性:name(姓名)、id(工号)、salary(工资)
class Employee(Emp):
company = "科技有限公司"
def __init__(self,name,id,salary):
self.name = name
self.id = id
self.salary = salary
# 步骤 3:给Employee类添加基础方法,在 Employee 中实现三个方法:
# ① get_info():返回员工信息字符串(姓名、工号、公司、工资)
# ② calculate_bonus(绩效等级):该方法用来计算薪资
# 如果绩效输入的是A,返回薪资 salary + salary*0.3
# 如果绩效输入的是B,返回薪资 salary + salary*0.2
# 如果绩效输入的是C,返回薪资 salary + salary*0.1
# ③ fun_work(工作方式):通过实例去调用时,入参使用的工作方式,返回'xxx员工正在使用xxx的方式工作'
def get_info(self):
return self.name,self.id,self.company,self.salary
def calculate_bonus(self,x):
if x=='A':
return self.salary + self.salary*0.3
elif x=='B':
return self.salary + self.salary*0.2
elif x=='C':
return self.salary + self.salary*0.1
def fun_work(self,a):
return f'{self.name}员工正在使用{a}的方式工作'
# 步骤 4:创建子类 Programmer(程序员),继承 Employee
# ①继承 Employee
# ②继承初始化方法,新增子类的实例属性:program_language(编程语言,如 Python/Java)
# ③重写 get_info() 方法,查询所有属性的信息(多态:方法重写)
class Programmer(Employee):
def __init__(self,name,id,salary,python):
super().__init__(name,id,salary)
self.program_language=python
def get_info(self):
return self.name,self.id,self.company,self.salary,self.program_language
def calculate_bonus(self,x):
if x=='A':
return self.salary + self.salary*1.5
elif x=='B':
return self.salary + self.salary*1.49
elif x=='C':
return self.salary + self.salary*1.45
# 步骤 5:创建子类 Manager(经理),继承 Employee
# ①继承 Employee
# ②继承 Employee 初始化方法,新增实例属性:department(管理部门)
# ③重写 get_info() 方法,查询所有属性的信息
class Manager(Employee):
def __init__(self,name,id,salary,department):
super().__init__(name,id,salary)
self.department=department
def get_info(self):
return self.name,self.id,self.company,self.salary,self.department
def calculate_bonus(self,x):
if x=='A':
return self.salary + self.salary*0.2
elif x=='B':
return self.salary + self.salary*0.1
elif x=='C':
return self.salary
# 步骤 6:实现多态(重写奖金计算)
# ① Programmer 重写 calculate_bonus(绩效等级):
# 如果绩效输入的是A,返回薪资 salary + salary*1.5
# 如果绩效输入的是B,返回薪资 salary + salary*1.49
# 如果绩效输入的是C,返回薪资 salary + salary*1.45
# ② Manager 重写 calculate_bonus(绩效等级):
# 如果绩效输入的是A,返回薪资 salary + salary*0.2
# 如果绩效输入的是B,返回薪资 salary + salary*0.1
# 如果绩效输入的是C,返回薪资 salary
# (父类、子类同名方法不同实现 = 多态)
# ③ 通过一个统一的函数接口调用 get_info() 方法
# ④ 通过一个统一的函数接口调用 calculate_bonus(绩效等级) 方法
def get_info(i):
return i.get_info()
def calculate_bonus(j,x):
return j.calculate_bonus(x)
if __name__=='__main__':
e1=Employee('老1',1,12000)
p1=Programmer('老2',2,18000,'java')
m1=Manager('老3',3,20000,'项目部')
print(get_info(e1))
print(get_info(p1))
print(get_info(m1))
print(calculate_bonus(p1,'A'))
print(calculate_bonus(e1,'B'))
print(calculate_bonus(m1,'A'))
Binary file not shown.
+34
View File
@@ -0,0 +1,34 @@
'''
①模块里调用了logging日志模块,定义一个类Log
②Log类里定义了初始化方法__init__(),初始化方法需要入两个参数,一个是日志器的名字name,一个是日志等级level,实例属性self.logName用来接收实例化的日志器的名字,需要其他属性时自己定义即可
③定义logFile()方法,实例对象调用该方法时,需要入参文件名字fileName,调用该方法就启用日志器信息输出到指定的文件名里,日志的信息格式统一都是"年月日时分秒 - 日志器名字 - 日志等级 - 日志信息",输入的字符集编码写死成utf-8即可
④定义logConsol()方法,实例对象调用该方法时,调用该方法就启用日志器信息输出到控制台,日志的信息格式统一都是"年月日时分秒 - 日志器名字 - 日志等级 - 日志信息"
⑤最后定义一个message()方法,两个形参,一个形参接收日志级别,一个形参接收日志信息,实例调用该方法时,输出不同的日志级别信息
'''
import logging
class Log:
def __init__(self,name,level):
self.logger = logging.getLogger(name)
self.level = level.upper()
self.log_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s',datefmt='%Y-%m-%d %H:%M:%S')
def logFile(self,filename):
if self.logger.handlers:
self.logger.handlers.clear()
self.logger.setLevel(eval(f'logging.{self.level}'))
file_handler = logging.FileHandler(filename,mode='a',encoding='utf-8')
file_handler.setFormatter(self.log_formatter)
self.logger.addHandler(file_handler)
def logConsol(self):
if self.logger.handlers:
self.logger.handlers.clear()
self.logger.setLevel(eval(f'logging.{self.level}'))
consol_handler = logging.StreamHandler()
consol_handler.setFormatter(self.log_formatter)
self.logger.addHandler(consol_handler)
def message(self,lvmes,mes):
getattr(self.logger,lvmes.lower())(mes)
+27
View File
@@ -0,0 +1,27 @@
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
# 定义请求体模型
class UserRequest(BaseModel):
username:str
passwd:str
class UserResponse(BaseModel):
code:int = 200
detail:str = 'ok'
totals:int = 0
username:str
@app.post('/userinfo',response_model=UserResponse)
def adduser(u:UserRequest):
# return UserResponse(username=u.username)
return u # 等价于 return UserResponse(username=u.username)
'''
@app.post('/userinfo',response_model=UserResponse)
def adduser(u:list[UserRequest]):
user = [i.username for i in u]
return UserResponse(code = 405,totals=len(u),username=user)
# return u # 等价于 return UserResponse(username=u.username)
'''
+67
View File
@@ -0,0 +1,67 @@
from sqlalchemy import *
from sqlalchemy.orm import declarative_base,sessionmaker
from datetime import datetime
db_url = "mysql+pymysql://root:123456@127.0.0.1:3306/ai0824?charset=utf8mb4"
engine = create_engine(db_url # 连接地址
,pool_size=50 # 连接池,同时可以保持50个已经创建好的数据库连接,放在池子里缓存使用
,echo=True
)
Base = declarative_base()
class Order(Base): # python里的表名字
__tablename__ = 'order_info_detail' # 实际数据库的表名字
id = Column( Integer # 声明字段的数据类型
, primary_key=True # 声明是主键
, autoincrement=True # 声明是自增主键
, comment='订单编号,自增主键' # 注释
)
title = Column( String(50) # 对应数据库的varchar类型
,nullable=False # 不允许为null
)
acc = Column(Integer)
userid = Column( Integer,ForeignKey('user_info_detail.id'),nullable=False ) # 外键约束
create_date = Column(DATETIME
, default=datetime.now # 默认值是当前时间
)
update_date = Column(DATETIME
, default=datetime.now # 首次创建的时间跟更新时间一致
, onupdate=datetime.now
)
class User(Base): # python里的表名字
__tablename__ = 'user_info_detail' # 实际数据库的表名字
id = Column(Integer # 声明字段的数据类型
, primary_key=True # 声明是主键
, autoincrement=True # 声明是自增主键
, comment='用户编号,自增主键' # 注释
)
usernmae = Column(String(50) # 对应数据库的varchar类型
, nullable=False # 不允许为null
, comment='用户名'
)
create_date = Column(DATETIME
, default=datetime.now # 默认值是当前时间
)
update_date = Column(DATETIME
, default=datetime.now # 首次创建的时间跟更新时间一致
, onupdate=datetime.now
)
Base.metadata.create_all(engine)
# User.__table__.create(engine,checkfirst = True)
u1 = User(usernmae='清华')
session = sessionmaker(bind=engine
,autoflush=False
,autocommit=False
)
db = session()
db.add(u1)
db.commit()
db.close()
n = 4 # 页数
m = 2 # 每页数据量
r6 = db.query(User).offset((n-1)*m).limit(m).all()
for i in r6:
print('分页:', i.id, i.usernmae)
View File
+21
View File
@@ -0,0 +1,21 @@
from order_api import Order
from product_api import Product
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from midlleware import m1,m2
app = FastAPI()
app.include_router(Order)
app.include_router(Product)
app.add_middleware(
CORSMiddleware,
allow_origins=['*'],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
app.middleware('http')(m1)
app.middleware('https')(m2)
+17
View File
@@ -0,0 +1,17 @@
from fastapi import Response
from datetime import datetime
async def m1(req,next):
if req.client.host in ['192.168.5.14','192.168.5.17','127.0.0.1']:
return Response(content='gun')
r=await next(req)
return r
async def m2(req,next):
a=datetime.now()
r=await next(req)
b=datetime.now()
print(b-a)
return r
+9
View File
@@ -0,0 +1,9 @@
from fastapi import APIRouter
Order = APIRouter()
@Order.get("/dindan")
def dindan():
return "dindan"
@Order.post("/dindan")
def dindan():
return "dindan"
+9
View File
@@ -0,0 +1,9 @@
from fastapi import APIRouter
Product=APIRouter()
@Product.get("/shanping")
def shaning():
return {"message":"Hello World"}
@Product.post("/shaning")
def shaning():
return {"message":"Hello World"}
@@ -0,0 +1,14 @@
b = {1:'张三', 2:'老王', 3:'王五'}
def select(sid):
# 判断sid这个id是否是字典的键
if sid in b:
return b[sid] # 根据键取值
else:
return None
if __name__ == '__main__':
print(select(1))
print(select(2))
View File
+31
View File
@@ -0,0 +1,31 @@
from fastapi import APIRouter
ClassAPI = APIRouter(tags=['班级对象'])
# 【班级相关的】
'''面向的资源是班级对象'''
# 定义新增classinfo的接口
@ClassAPI.post('/classinfo')
def add_stu():
return '新增classinfo'
# 定义更新classinfo信息的接口
@ClassAPI.put('/classinfo')
def update_stu():
return '更新classinfo'
# 定义查询classinfo信息的接口
@ClassAPI.get('/classinfo')
def get_stu():
return '获取classinfo'
# 定义删除classinfo信息接口
@ClassAPI.delete('/classinfo')
def del_stu():
return '删除classinfo'