功能特性: - 前端文章展示 (Markdown渲染、代码高亮) - 后台管理系统 (文章、分类、标签、作者管理) - 图片上传 (点击、拖拽、粘贴) - 网站设置 (Logo、底部宣传图片上传) - 访问统计 (IP记录、趋势图表) - 参考来源、附件支持 - 单端口部署 (16012) 技术栈: - Flask 3.0 + SQLAlchemy - SQLite数据库 - marked.js + highlight.js (Markdown渲染) - Chart.js (统计图表)
89 lines
3.0 KiB
Python
89 lines
3.0 KiB
Python
"""文章扩展模型"""
|
|
from datetime import datetime
|
|
from app import db
|
|
|
|
|
|
class ArticleAuthor(db.Model):
|
|
"""文章作者表"""
|
|
__tablename__ = 'article_authors'
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
name = db.Column(db.String(100), nullable=False)
|
|
avatar = db.Column(db.String(500)) # 作者头像URL
|
|
bio = db.Column(db.String(200)) # 作者简介
|
|
website = db.Column(db.String(500)) # 作者网站/主页
|
|
|
|
created_at = db.Column(db.DateTime, default=datetime.utcnow)
|
|
|
|
def __repr__(self):
|
|
return f'<ArticleAuthor {self.name}>'
|
|
|
|
|
|
class Reference(db.Model):
|
|
"""参考来源表"""
|
|
__tablename__ = 'references'
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
article_id = db.Column(db.Integer, db.ForeignKey('articles.id'), nullable=False)
|
|
title = db.Column(db.String(200), nullable=False) # 来源标题
|
|
url = db.Column(db.String(500)) # 来源链接
|
|
description = db.Column(db.String(300)) # 来源描述
|
|
|
|
article = db.relationship('Article', backref=db.backref('references', lazy='dynamic'))
|
|
|
|
created_at = db.Column(db.DateTime, default=datetime.utcnow)
|
|
|
|
def __repr__(self):
|
|
return f'<Reference {self.title}>'
|
|
|
|
|
|
class Attachment(db.Model):
|
|
"""附件表"""
|
|
__tablename__ = 'attachments'
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
article_id = db.Column(db.Integer, db.ForeignKey('articles.id'), nullable=False)
|
|
filename = db.Column(db.String(200), nullable=False) # 文件名
|
|
filepath = db.Column(db.String(500), nullable=False) # 文件路径
|
|
filesize = db.Column(db.Integer) # 文件大小(字节)
|
|
filetype = db.Column(db.String(50)) # 文件类型
|
|
description = db.Column(db.String(200)) # 文件描述
|
|
|
|
article = db.relationship('Article', backref=db.backref('attachments', lazy='dynamic'))
|
|
|
|
upload_time = db.Column(db.DateTime, default=datetime.utcnow)
|
|
|
|
def __repr__(self):
|
|
return f'<Attachment {self.filename}>'
|
|
|
|
def get_filesize_display(self):
|
|
"""显示友好的文件大小"""
|
|
size = self.filesize or 0
|
|
if size < 1024:
|
|
return f'{size} B'
|
|
elif size < 1024 * 1024:
|
|
return f'{size / 1024:.1f} KB'
|
|
else:
|
|
return f'{size / 1024 / 1024:.1f} MB'
|
|
|
|
|
|
class UploadedImage(db.Model):
|
|
"""上传图片表"""
|
|
__tablename__ = 'uploaded_images'
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
filename = db.Column(db.String(200), nullable=False)
|
|
filepath = db.Column(db.String(500), nullable=False)
|
|
article_id = db.Column(db.Integer, db.ForeignKey('articles.id')) # 关联文章(可选)
|
|
uploader = db.Column(db.String(50)) # 上传者
|
|
|
|
upload_time = db.Column(db.DateTime, default=datetime.utcnow)
|
|
|
|
article = db.relationship('Article', backref=db.backref('uploaded_images', lazy='dynamic'))
|
|
|
|
def __repr__(self):
|
|
return f'<UploadedImage {self.filename}>'
|
|
|
|
def get_url(self):
|
|
"""获取图片访问URL"""
|
|
return f'/uploads/{self.filename}' |