f103148ebf
基于 Flask + MySQL + Bootstrap 5 的全栈个人资料库管理系统。 主要功能: - 管理员/普通用户双角色权限体系,全站登录保护 - 资源管理:文本、图片、音频、视频四类资源 - 三种添加方式:本地上传(拖拽)、URL 后台下载、磁力下载(aria2c) - 在线预览:文本、图片、HTML5 音视频播放器 - 安全:bcrypt 加盐密码哈希、CSRF 防护、SQLAlchemy ORM 防注入 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
33 lines
900 B
Python
33 lines
900 B
Python
from datetime import datetime
|
|
|
|
|
|
def register_filters(app):
|
|
|
|
@app.template_filter('datetime_fmt')
|
|
def datetime_fmt(value, fmt='%Y-%m-%d %H:%M'):
|
|
if not value:
|
|
return '—'
|
|
if isinstance(value, str):
|
|
try:
|
|
value = datetime.fromisoformat(value)
|
|
except ValueError:
|
|
return value
|
|
return value.strftime(fmt)
|
|
|
|
@app.template_filter('filesize')
|
|
def filesize_filter(size):
|
|
if not size:
|
|
return '—'
|
|
for unit in ['B', 'KB', 'MB', 'GB']:
|
|
if size < 1024:
|
|
return f'{size:.1f} {unit}'
|
|
size /= 1024
|
|
return f'{size:.1f} TB'
|
|
|
|
@app.template_filter('truncate_mid')
|
|
def truncate_mid(s, max_len=40):
|
|
if not s or len(s) <= max_len:
|
|
return s
|
|
half = max_len // 2
|
|
return s[:half] + '…' + s[-half:]
|