feat: 初始化工程

This commit is contained in:
2026-09-09 18:42:37 +08:00
commit 31af6e07e2
29 changed files with 1208 additions and 0 deletions

41
models/base.py Normal file
View File

@@ -0,0 +1,41 @@
from sqlalchemy import Column, BigInteger, DateTime, event
from sqlalchemy.ext.declarative import declared_attr
from config.database import Base
from datetime import datetime
from utils.common import camel_to_snake
from id_generator import options, generator
# https://github.com/yitter/IdGenerator/tree/master/Python
options = options.IdGeneratorOptions(worker_id=23)
idgen = generator.DefaultIdGenerator()
idgen.set_id_generator(options)
# 第二层基类包含ID
class IdBase(Base):
__abstract__ = True
id = Column(BigInteger, primary_key=True, index=True)
@declared_attr
def __tablename__(cls):
# 自动把数据库实体类名驼峰转为数据库表名下划线
return camel_to_snake(cls.__name__)
# 自动填充id
@event.listens_for(IdBase, 'before_insert', propagate=True)
def before_insert_listener(mapper, connection, target):
if target.id is None:
target.id = idgen.next_id()
# 第二层基类包含ID和审计字段
class AuditBase(IdBase):
__abstract__ = True
create_time = Column(DateTime, nullable=True, default=datetime.now)
update_time = Column(DateTime, nullable=True, default=datetime.now, onupdate=datetime.now)

26
models/patch.py Normal file
View File

@@ -0,0 +1,26 @@
from sqlalchemy import Column, JSON, String, Text, BigInteger, Date
from models.base import AuditBase
class Patches(AuditBase):
name = Column(String(100), nullable=False)
location = Column(String(200))
status = Column(String(50))
class Crops(AuditBase):
patch_id = Column(BigInteger, nullable=False)
name = Column(String(100), nullable=False)
variety = Column(String(100))
date = Column(Date)
class Records(AuditBase):
crop_id = Column(BigInteger, nullable=False)
type = Column(String(50))
date = Column(Date)
content = Column(Text)
images = Column(JSON)
videos = Column(JSON)
stage = Column(String(50))