Files
Ubuntu 32b43f85bd a
2026-07-03 16:58:28 +08:00

112 lines
4.4 KiB
Python

"""
数据库模型
"""
from sqlalchemy import Column, Integer, String, Text, DateTime, Boolean, ForeignKey
from sqlalchemy.orm import relationship
from datetime import datetime
from database import Base
class Admin(Base):
"""管理员账号"""
__tablename__ = "admins"
id = Column(Integer, primary_key=True, index=True)
username = Column(String, unique=True, index=True, default="admin")
password_hash = Column(String)
created_at = Column(DateTime, default=datetime.utcnow)
class Post(Base):
"""文章"""
__tablename__ = "posts"
id = Column(Integer, primary_key=True, index=True)
title = Column(String(200), nullable=False)
slug = Column(String(200), unique=True, index=True) # URL友好的标识
content = Column(Text, nullable=False)
content_type = Column(String(20), default="markdown") # markdown 或 html
summary = Column(String(500))
cover_image = Column(String(500)) # 封面图路径
is_published = Column(Boolean, default=True)
is_draft = Column(Boolean, default=False)
view_count = Column(Integer, default=0)
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
# 关联
category_id = Column(Integer, ForeignKey("categories.id"))
category = relationship("Category", back_populates="posts")
tags = relationship("Tag", secondary="post_tags", back_populates="posts")
class Category(Base):
"""栏目/分类"""
__tablename__ = "categories"
id = Column(Integer, primary_key=True, index=True)
name = Column(String(50), unique=True, nullable=False)
description = Column(String(200))
created_at = Column(DateTime, default=datetime.utcnow)
posts = relationship("Post", back_populates="category")
class Tag(Base):
"""标签"""
__tablename__ = "tags"
id = Column(Integer, primary_key=True, index=True)
name = Column(String(30), unique=True, nullable=False)
created_at = Column(DateTime, default=datetime.utcnow)
posts = relationship("Post", secondary="post_tags", back_populates="tags")
# 文章-标签关联表
class PostTag(Base):
__tablename__ = "post_tags"
post_id = Column(Integer, ForeignKey("posts.id"), primary_key=True)
tag_id = Column(Integer, ForeignKey("tags.id"), primary_key=True)
class Image(Base):
"""上传的图片"""
__tablename__ = "images"
id = Column(Integer, primary_key=True, index=True)
filename = Column(String(255), nullable=False)
original_name = Column(String(255))
file_path = Column(String(500), nullable=False) # 原图路径 /uploads/xxx.jpg
thumb_path = Column(String(500)) # 缩略图路径 /uploads/thumbnails/xxx.jpg
description = Column(String(500))
file_size = Column(Integer) # 字节
width = Column(Integer) # 图片宽度
height = Column(Integer) # 图片高度
created_at = Column(DateTime, default=datetime.utcnow)
class Setting(Base):
"""博客设置"""
__tablename__ = "settings"
id = Column(Integer, primary_key=True, index=True)
blog_name = Column(String(20), default="我的博客")
blog_description = Column(String(200), default="")
welcome_message = Column(String(300), default="欢迎来到我的博客 👋 分享技术、生活与思考")
blog_logo = Column(String(500))
banner_image = Column(String(500))
banner_type = Column(String(20), default="text") # text或carousel
banner_images = Column(String(1000), default="[]") # JSON数组存储轮播图
theme = Column(String(20), default="neobrutalism") # 默认新粗野主义
layout = Column(String(20), default="card") # card或list
theme_colors = Column(Text, default='{"primary":"#7c3aed","secondary":"#06b6d4","bg":"#ffffff","text":"#1f2937","sidebar":"#1e293b"}')
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
class Page(Base):
"""自定义页面"""
__tablename__ = "pages"
id = Column(Integer, primary_key=True, index=True)
title = Column(String(50), nullable=False)
slug = Column(String(50), unique=True, nullable=False) # URL标识
content = Column(Text, nullable=False)
is_nav = Column(Boolean, default=True) # 是否在导航显示
nav_order = Column(Integer, default=0) # 导航排序
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)