diff --git a/.superpowers/brainstorm/1236-1782196029/content/overall-layout.html b/.superpowers/brainstorm/1236-1782196029/content/overall-layout.html new file mode 100644 index 0000000..29f8766 --- /dev/null +++ b/.superpowers/brainstorm/1236-1782196029/content/overall-layout.html @@ -0,0 +1,134 @@ +
左侧双面板(笔记 + 网站管理) + 右侧内容区,类似飞书文档的简洁风格
+ +Markdown 原生有限,增强型编辑器才能满足图片/颜色/表情需求
+ +所见即所得,像飞书/Notion 一样。支持所有你想要的。
+ + +经典 Markdown 编辑器,简洁但功能受限。
+ + +| 功能 | +🌟 增强型 | +📝 纯 Markdown | +
|---|---|---|
| 文字颜色 / 背景色 | +✅ | +❌ | +
| 插入图片(上传/粘贴) | +✅ 直接粘贴/拖拽 | +⚠ 手动写URL | +
| 表情面板 | +✅ 选择器 | +⚠ 快捷键 | +
| 表格编辑 | +✅ 可视化 | +⚠ 手写语法 | +
| 代码高亮 | +✅ | +✅ | +
# 自动变标题),同时拥有完整的格式化工具栏。完全满足你"设置文字颜色、插入图片表情"的需求。
+顶部导航切换「笔记」/「网站管理」,各自有独立的侧边栏和内容区
+ + +左侧双面板切换(笔记 + 网站管理) + 右侧 Markdown 编辑/预览分屏
+ +网站列表 + 账号详情 + 智能导入,完整交互流程
+ + +网站按文件夹分组,导入支持自定义格式 + 选取文件夹
+ + +网址 + 空格 + 网站名暂无内容
', + css=CSS, + ) + return HTMLResponse(html) diff --git a/backend/routes/upload.py b/backend/routes/upload.py new file mode 100644 index 0000000..27389c9 --- /dev/null +++ b/backend/routes/upload.py @@ -0,0 +1,101 @@ +"""文件上传/读取 — 数据库存储(file_service.py 为可选备用方案,保留不删)""" +from fastapi import APIRouter, UploadFile, File, Depends, HTTPException, Request +from fastapi.responses import Response +from sqlalchemy.orm import Session +from logger import logger +from models import get_db, Upload +from middleware.user_context import UserContext +# 文件服务模块保留备用(不删除),如需切换取消下面注释即可 +# from file_service import upload_file, download_file, delete_file + +router = APIRouter(tags=["上传"]) + +ALLOWED = {"image/png", "image/jpeg", "image/gif", "image/webp", "image/svg+xml"} +MAX_SIZE = 20 * 1024 * 1024 # 20MB + + +@router.post("/api/upload/image") +async def upload_image(file: UploadFile = File(...), db: Session = Depends(get_db), request: Request = None): + """上传图片 — 存入数据库 LONGBLOB""" + user_id = UserContext.get_user_id(request) + try: + if file.content_type not in ALLOWED: + raise HTTPException(400, f"不支持的图片格式: {file.content_type}") + data = await file.read() + if len(data) > MAX_SIZE: + raise HTTPException(400, f"图片不能超过 20MB,当前 {len(data)} 字节") + + filename = file.filename or "img" + logger.info(f"上传图片: {filename}, {len(data)} bytes, {file.content_type}, user={user_id}") + + upload = Upload( + filename=filename, + content_type=file.content_type, + data=data, + size=len(data), + created_by=user_id, + ) + db.add(upload) + db.commit() + db.refresh(upload) + + logger.info(f"图片已存入 DB, id={upload.id}") + return {"url": f"/api/file/{upload.id}"} + + except HTTPException: + raise + except Exception as e: + logger.error(f"上传失败: {e}") + raise HTTPException(500, f"上传失败: {str(e)}") + + +@router.get("/api/file/{file_id}") +def get_file(file_id: int, db: Session = Depends(get_db)): + """读取图片 — 公开访问(不走网关,供编辑器选择左侧网站查看账号密码
+{{ message }}
+ + + + +暂无笔记
+| 标题 | +创建人 | +创建时间 | +修改时间 | +操作 | +
|---|---|---|---|---|
| {{ n.title || '无标题笔记' }} | +{{ n.created_by || 'admin' }} | +{{ fmtFull(n.created_at) }} | +{{ fmtFull(n.updated_at) }} | ++ |
选择有效期:
+暂无分享记录
+| 笔记标题 | +分享链接 | +有效期 | +创建人 | +更新时间 | +操作 | +
|---|---|---|---|---|---|
| {{ s.title || '无标题' }} | ++ {{ BASE + s.share_url }} + | +{{ s.share_expires_at }} | +{{ s.created_by }} | +{{ fmt(s.updated_at) }} | +
+
+
+
+
+ |
+
选择左侧网站查看账号密码
+暂无账号
+