0%

🧩 用户与文档管理系统 API 路由设计(含管理员权限说明)

👤 用户管理模块

功能 URL 请求方法 说明
用户注册 /api/users/register POST 所有用户可操作
用户登录 /api/users/login POST 所有用户可操作
获取当前用户信息 /api/users/me GET 需要身份验证
获取所有用户 /api/users GET 仅限管理员
获取用户详情 /api/users/:userId GET 管理员或本人可访问
更新用户信息 /api/users/:userId PUT 管理员或本人可更新
删除用户 /api/users/:userId DELETE 仅限管理员
修改密码 /api/users/:userId/change-password PUT 用户本人修改密码

📁 文档管理模块

功能 URL 请求方法 权限说明
上传文档 /api/documents POST 所有已登录用户
获取文档列表 /api/documents GET 普通用户只能看到自己上传的文档;管理员可查看全部
获取文档详情 /api/documents/:documentId GET 用户只能查看自己上传的文档;管理员无限制
下载文档 /api/documents/:documentId/download GET 同上
更新文档信息 /api/documents/:documentId PUT 用户只能更新自己上传的文档;管理员可更新所有
删除文档 /api/documents/:documentId DELETE 用户只能删除自己上传的文档;管理员可删除所有
搜索文档 /api/documents/search GET 普通用户只能搜索自己的文档;管理员可全局搜索

🔐 权限控制建议

用户类型

  • 普通用户:只能操作自己创建的文档。
  • 管理员:可以查看、更新、删除所有文档,并管理用户账户。

实现方式

  • 在每个文档中记录 ownerId 字段(即上传者 ID);
  • 接口调用时根据当前用户 ID 和文档的 ownerId 进行比对;
  • 管理员跳过此检查,或通过角色字段判断是否为管理员;
  • 使用中间件统一处理权限校验。

✅ 示例字段结构(供参考)

用户表 (users)

1
2
3
4
5
6
7
{
"id": "string",
"username": "string",
"email": "string",
"password": "string",
"role": "user" or "admin"
}
      ### 文档表 (`documents`)
      
1
2
3
4
5
6
7
8
9
10
{
"id": "string",
"title": "string",
"description": "string",
"tags": ["tag1", "tag2"],
"filePath": "string",
"ownerId": "string (foreign key to users.id)",
"createdAt": "datetime",
"updatedAt": "datetime"
}
--- 如果你希望我生成对应数据库模型(如 MongoDB Schema / SQL 表结构)或者具体后端代码(Node.js / Python / Java 等),也可以告诉我,我可以继续为你扩展。需要吗?

🧱 前端开发文档:AI 论文编辑器


⚙️ 技术选型

  • 框架:Vue 3 + Vite
  • 组件库:推荐 Element Plus(功能丰富、适配 PC 编辑器)
  • 状态管理:Pinia(轻量、Vue 3 原生支持)
  • 路由:Vue Router
  • 富文本编辑器:推荐 TipTapEditor.js
    • 支持 Markdown 格式、嵌入图片、表格、标题
  • PDF预览pdfjs-dist + <iframe>vue-pdf-embed
  • Markdown解析markdown-it(将 AI 输出的 Markdown 渲染成 HTML)

📁 项目结构

1
2
3
4
5
6
7
8
9
10
11
12
13
frontend/
├── public/
├── src/
│ ├── assets/
│ ├── components/ # 通用组件(按钮、对话框等)
│ ├── views/ # 页面(编辑器页、登录页)
│ ├── editor/ # 富文本编辑器相关组件
│ ├── layout/ # 页面布局(侧边栏、顶部导航)
│ ├── router/
│ ├── store/
│ ├── utils/ # 工具函数(JWT解析、API封装)
│ └── App.vue
└── vite.config.ts

🧭 页面设计

页面 说明
登录/注册页 用户认证,获取JWT
主编辑器页面 核心编辑器,包含目录树、编辑区、AI对话
模板选择页面 选择docx/pdf模板,预览样式
论文预览页面 LaTeX→PDF后的预览

🧩 功能组件(模块划分)

1. 📚 目录树组件(OutlineTree)

  • 作用:显示论文结构,支持增删改查、拖拽排序
  • 功能:
    • 添加/删除章节
    • 修改标题文本
    • 拖动排序
  • 技术建议:使用 element-plusel-tree + 拖拽插件(如 vuedraggable

2. ✍️ 富文本编辑器组件(RichEditor)

  • 每个目录节点对应一个编辑器实例(或者通过切换加载)
  • 支持:
    • Markdown / HTML 编辑
    • 图片上传
    • 表格插入
  • 推荐:Tiptap(可用 @tiptap/vue-3

3. 🤖 AI 对话组件(ChatPanel)

  • 支持上下文提示输入
  • 可预设 prompt 模板(“写摘要”、“润色该段”、“按学术格式重写”等)
  • 支持 Markdown 渲染 AI 回复,点击“应用”按钮插入到当前章节

4. 🧾 模板选择与导出组件(TemplateManager)

  • 显示所有可用模板(后端返回)
  • 可上传 zip 格式模板
  • 支持设置默认模板
  • 导出按钮发送 POST 请求生成 PDF(返回下载链接或预览)

5. 🖼 PDF 预览组件(PdfPreview)

  • 使用 pdfjs-distvue-pdf-embed
  • 将生成的 PDF 放入 <iframe> 或直接嵌入预览

6. 🧑 用户中心(UserPanel)

  • 用户信息展示
  • JWT 管理(登录时写入 LocalStorage)
  • 支持修改密码、退出登录

🔗 与后端接口对接

登录认证

  • 登录成功后保存 JWT 到本地
1
localStorage.setItem("token", res.data.access_token)
  • 所有请求需带上 Authorization: Bearer <token>

与后端交互接口示例

1
2
3
4
5
6
const api = axios.create({
baseURL: 'http://localhost:8000/api',
headers: {
'Authorization': `Bearer ${localStorage.getItem('token')}`
}
});

🛠 本地存储与状态管理

  • 使用 Pinia 管理全局状态(论文结构、当前编辑节点、AI上下文等)
  • 使用 localStorage 持久化当前论文内容(防止断网或退出丢失)

🧪 页面交互流程(简化)

1
2
3
4
5
6
7
8
9
用户登录

进入编辑页面(加载论文结构)

选择某一章节 → 加载富文本内容

可编辑 / AI生成 / 插入段落

点击导出 → 后端生成PDF → 前端预览/下载

🧩 推荐依赖清单(部分)

1
npm install vue-router pinia axios element-plus tiptap @tiptap/vue-3 markdown-it pdfjs-dist vue-pdf-embed vuedraggable

🚀 后续可拓展功能

  • 支持多人协作编辑(WebSocket)
  • 引用管理(文献库 + BibTeX 解析)
  • 编辑历史版本回退
  • AI 风格选择(科普、学术、简洁)

🧭 后端开发路线


✅ 阶段 1:基础搭建与身份认证模块

目标:建立项目结构、数据库、JWT认证机制

✅ 工作项:

  1. 项目结构搭建

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    backend/
    ├── main.py # FastAPI 启动入口
    ├── api/ # 路由模块
    │ ├── auth.py
    │ └── user.py
    ├── models/ # 数据模型
    │ └── user.py
    ├── db/ # 数据库操作
    │ ├── database.py
    │ └── crud_user.py
    ├── core/ # 核心配置
    │ ├── config.py
    │ └── security.py
    ├── schemas/ # Pydantic数据结构
    │ ├── user.py
    │ └── token.py
    └── utils/ # 实用函数
    └── encryption.py
  2. 数据库

    • 使用 SQLite + SQLAlchemy 创建 User
    • 密码使用 bcrypt 加密
  3. 认证模块

    • 注册 /auth/register
    • 登录 /auth/login,返回 JWT
    • 获取当前用户 /user/me
  4. 配置

    • 使用 .env 存储密钥和数据库路径
    • JWT 配置(SECRET_KEY, ALGORITHM, ACCESS_TOKEN_EXPIRE_MINUTES

✅ 阶段 2:论文结构与存储模块

目标:实现论文结构的保存与管理接口(包括章节、标题、内容)

✅ 工作项:

  1. 定义模型

    • Paper, Section, UserTemplate
    • 论文结构嵌套(标题+内容)
  2. 接口设计

    路由 方法 说明
    /paper/ GET 获取用户所有论文
    /paper/{id} GET 获取指定论文内容
    /paper/ POST 创建新论文
    /paper/{id} PUT 修改论文结构或内容
    /paper/{id} DELETE 删除论文
  3. 前端配合格式

    • 每篇论文包含章节(带排序字段)
    • 每个章节保存 Markdown 格式内容

✅ 阶段 3:AI内容生成模块

目标:接入 AI 接口,实现根据请求生成内容的能力

✅ 工作项:

  1. 定义接口
    • POST /ai/generate
    • 输入:prompt、当前章节上下文
    • 输出:Markdown文本
  2. AI 接入
    • 接 OpenAI GPT API 或本地模型接口
    • 可加入角色设定(如论文助手、润色专家)
  3. AI内容与结构整合
    • 支持 AI 输出自动添加为新章节或合并到当前章节

✅ 阶段 4:LaTeX 模板与 PDF 生成模块

目标:支持选择模板并生成 LaTeX + PDF

✅ 工作项:

  1. 模板文件结构

    1
    2
    3
    4
    5
    6
    templates/
    ├── default/
    │ ├── main.tex
    │ └── style.sty
    └── ieee/
    └── ...
  2. 模板管理接口

    路由 方法 说明
    /template/list GET 获取模板列表
    /template/upload POST 上传模板(zip)
    /template/set POST 设置论文模板
  3. LaTeX渲染与PDF生成

    • 使用 Jinja2 渲染 .tex 模板
    • 编译命令行调用 pdflatexxelatex
    • 输出 PDF 到 media/ 目录
    • 返回 Base64 或下载链接

✅ 阶段 5:安全通信与加密模块

目标:实现数据加密(选配)

✅ 工作项:

  1. JWT认证
    • 全部受保护接口使用 Depends(get_current_user)
  2. AES 数据加密(可选)
    • 使用 pycryptodome
    • 加密内容如论文正文(可选加密内容块)

✅ 阶段 6:接口联调与部署

目标:完成接口测试,准备上线部署

✅ 工作项:

  1. 接口调试(Postman)
    • 全流程测试论文编辑 → 生成PDF
  2. 启动脚本与跨域支持
    • CORS中间件配置
    • 加入 gunicorn, uvicorn, supervisor
  3. 部署建议
    • FastAPI + Uvicorn
    • SQLite可换为 PostgreSQL(如需扩展)
    • 前后端分离部署,Nginx 反向代理

🚀 附加建议

阶段 可选扩展功能
1 邮箱验证、找回密码
2 章节评论、版本管理
3 AI润色 / AI纠错功能
4 支持 BibTeX 引文 / 参考文献管理
6 Docker 容器化部署

ISBN
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
int main()
{
int sum = 0,i=0,n=1;
char s[14];
scanf("%13s", s);
while (i<11)
{
if (s[i] != '-')sum += (s[i] - 48)*(n++);
i++;
}
if (s[12] - 48 == sum % 11 || s[12] == 'X' && sum % 11 == 10)printf("Right");
else
{
if (sum % 11 != 10)s[12] = (sum % 11) + 48;
if (sum % 11 == 10)s[12] = 'X';
printf("%s", s);
}
return 0;
}