# FlynnPage
**Repository Path**: xiaofei90/flynn-page
## Basic Information
- **Project Name**: FlynnPage
- **Description**: 202408采用django设计个人主页,打算与van-blog并存
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-08-20
- **Last Updated**: 2026-10-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 飞云老师个人网站(mysite)
基于 Django 3.2 的个人网站系统,部署在群晖 NAS 的 Docker 容器中。
网站定位:用于交流 IT 技能与 AI 知识,并聚合个人开发的各类在线工具。
- 访问地址:
- 容器端口:宿主机 **8084** → 容器内 **8000**
- 技术栈:Python 3.11 + Django 3.2 + MongoDB(主库)+ SQLite(账号库 / 课堂库)+ 阿里云 OSS(图床)
---
## 一、系统功能总览
全站由 4 个 Django 应用组成:
| 应用 | 路径前缀 | 说明 |
| --- | --- | --- |
| myapp | `/` | 主站:首页、文章阅读、个人介绍、外链导航、在线实用工具 |
| photo | `/photo/` | 相册:照片浏览、标签筛选、上传,图片存阿里云 OSS |
| classroom | `/classroom/` | 课堂随机点名与积分排行榜(单页应用) |
| accounts | `/accounts/` | 全站账号体系:登录、改密、用户管理、登录态接口 |
另有 Django 自带后台:`/admin/`。
### 1. 主站 myapp
- **首页 `/`**:网站介绍 + 「个人开发在线实用工具」入口 + 「个人开发的网站与推荐工具」入口 + 常用网站链接 + NAS 入口。
- **文章阅读**:文章数据来自 MongoDB 的 `vanBlog` 库,正文为 Markdown,服务端渲染为 HTML,并自动生成章节目录(TOC),正文中的 Markdown 图片语法自动转换为 `
`。
- `/articles/`、`/post/`:全部文章
- `/reading/`:分类 reading(阅读类)
- `/teach/`:分类 teach(教学类)
- `/tech/`:分类 tech(技术类)
- 支持按文章数字 ID 打开详情,如 `/tech/12/`
- **个人介绍 `/me/`(别名 `/aboutme/`)**
- **数据可视化页 `/datav/`**
- **数字化人文页 `/dh/`**
- 页面适配手机端:目录可收起为小图标,侧边栏在正文中后置显示。
### 2. 个人开发在线实用工具(`/tools/`)
三个工具均为单页应用,挂在 myapp 下,复用全站账号体系。
#### 2.1 通用知识图谱生成器 `/tools/knowmap/`
- 粘贴任意学科的大纲即可生成**交互式知识网络图**,不限学科领域(适用于课程梳理、读书笔记、知识体系搭建等)。
- 大纲解析兼容多种写法:
- Markdown 标题层级:`#`、`##`、`###`…
- 数字章节:`1.`、`1)`、`一、`…
- 列表符号配合缩进:`-`、`*`、`+`,缩进越深层级越细。
- 布局方式:层级自上而下、层级从左到右、力导向自由网络。
- 交互:节点可拖拽、画布可缩放平移、悬停提示。
- 导出:一键导出当前图谱为 PNG 图片;可自定义根节点名称,内置「数据结构」示例。
- 版权声明:本工具为《交互式知识图谱可视化系统》,已获国家版权局**计算机软件著作权登记,登记号 2026SR0460334**;页面顶部版权条与首页卡片均有标注。
- 图谱库使用本地静态资源 `vis-network`(`static/lib/vis-network.min.js`),不依赖外部 CDN。
#### 2.2 二维码标签生成器 `/tools/label/`
- 离线可用的二维码标签制作工具:自定义文字与二维码内容、尺寸和排版。
- 一键「生成标签 PDF」,所有操作在浏览器本地完成,数据不上传。
- 页面内嵌 jsPDF、JSZip 等库,适合物料贴标、资产编号等场景。
#### 2.3 飞云轩提词器 `/tools/prompter/`
- 简洁的浏览器提词器:滚动速度与字号调节、全屏、镜像翻转、语速停顿标记。
- 支持开始/暂停/继续、重置、改稿,手机与电脑均可使用,适合短视频口播与课程录制。
> 三个在线工具统一采用「**未登录免费使用 5 次,登录后不限次**」策略,详见第二节第 4 小节。
### 3. 相册 photo(`/photo/`)
- 照片以**瀑布/分页列表**展示(每页 12 张),按上传时间倒序。
- 支持按**标签筛选**;详情页展示大图、标题与描述。
- **登录后可批量上传照片**(多文件选择)。
- 单张图片超过 3MB 时自动用 Pillow 压缩为 JPEG。
- 图片文件实际存储在**阿里云 OSS**,数据库只保存相对路径(`用户名/年份/文件名`)。
- 列表与详情通过 **OSS 签名 URL** 访问,有效期 1 小时;删除照片时同步删除 OSS 文件。
- 编辑权限:超级管理员、照片上传者,以及内置授权用户(fei、sisi、user1~3)可修改照片信息。
### 4. 课堂点名积分榜 classroom(`/classroom/`)
面向课堂教学的单页工具,核心功能:
- **多班级管理**:新建、重命名、删除、切换当前班级;班级与服务器当前选中状态会被记住。
- **随机滚动点名**:从当前班级名单中随机抽取学生。
- **积分系统**:对学生加分 / 减分,自动生成积分排行榜(状元、榜眼、探花等头衔)。
- **操作撤销**:积分操作带撤销栈,可一键撤销上一步。
- **名单导入**:上传 Excel(xlsx/xls)批量导入学生名单,可选择覆盖或追加,支持导入初始积分。
- **备份与恢复**:
- 单班导出 / 恢复 JSON 备份;
- 一次性导出 / 恢复全部班级;
- 导出积分排名为 Excel。
- **其他**:全屏展示、演示数据、清空名单、搜索等。
- 权限策略:查询(GET)公开,任何写操作(新建班级、改分、导入、恢复等)必须登录。
### 5. 账号体系 accounts(`/accounts/`)
详见下一节。
---
## 二、账号与登录
### 1. 登录入口
- 登录页:`/accounts/login/`
- 登出:`/accounts/logout/`(退出后回到首页)
- 修改密码:`/accounts/password/`
- 全站登录策略由 `accounts/middleware.py` 统一控制:
- **查询类请求(GET / HEAD / OPTIONS)公开可访问**;
- **所有写操作(POST / PUT / PATCH / DELETE)必须登录**;
- 普通页面未登录时跳转登录页(带 `next` 参数,登录后跳回原页面);
- AJAX / JSON 接口未登录时返回 HTTP 401 及 `{"login_required": true}`,前端据此跳转登录。
### 2. 默认管理员账号
容器启动时会自动执行 `python manage.py ensure_admin`:
- 用户名:**fei**
- 密码:**fei**
该命令仅在账号不存在时创建;若账号已存在(例如已改过密码),不会覆盖。
**首次登录后请尽快通过 `/accounts/password/` 修改默认密码。**
### 3. 账号能做什么
| 角色 | 权限 |
| --- | --- |
| 未登录访客 | 浏览首页、文章、相册、课堂名单与排行榜;三个在线工具各免费使用 5 次 |
| 已登录普通账号 | 修改自己的密码;上传照片;课堂点名的全部写操作;三个在线工具不限次使用 |
| 管理员(is_staff / 超级用户) | 以上全部,外加用户管理与 Django 后台 |
### 4. 在线工具的「5 次免费」门控
知识图谱、二维码标签、飞云轩提词器三个工具共用同一套前端门控机制:
- 每个工具的使用次数独立保存在浏览器 `localStorage`,键名分别为:
- `tool_usage_knowmap`
- `tool_usage_labelgen`
- `tool_usage_prompter`
- **未登录**:前 5 次操作正常放行并累计次数;第 6 次起弹出登录提示框,需登录后才能继续。
- **已登录**:不计数、不拦截,显示「已登录 · 使用不限次」。
- 计数的触发动作:
- 知识图谱:点击「生成图谱」;
- 标签生成器:点击「生成标签 PDF」;
- 提词器:仅在「开启新一轮」(按钮文本为「开始」)时计数,暂停 / 继续不计数。
- 登录态由页面启动时请求登录态接口获得(见下),门控脚本在 `document` 捕获阶段先于原业务逻辑拦截动作,放行时业务正常执行,拦截时 `stopPropagation + preventDefault`。
### 5. 登录态查询接口
- 地址:`/accounts/api/me/`(GET,免登录)
- 返回示例:
```json
{ "authenticated": false, "username": "", "is_staff": false }
```
- 已登录时 `authenticated` 为 `true`,并返回 `username` 与 `is_staff`。三个在线工具据此决定是否计数拦截。
### 6. 普通用户功能
- 修改自己的密码:`/accounts/password/`(修改成功后会话保持登录,不会被踢下线)。
### 7. 管理员功能(`/accounts/manage/`)
仅 staff / 超级用户可访问,已登录但非管理员访问返回 403:
- **用户列表**:查看全部账号
- **新建账号**:设置用户名与初始密码,可勾选“允许登录后台管理”(is_staff)
- **启用 / 停用账号**(不能停用自己)
- **重置账号密码**
- **删除账号**(不能删除超级管理员,也不能删除自己)
Django 自带后台 `/admin/` 同样使用该账号体系。
---
## 三、数据库架构(三库分离)
为规避 djongo 与 Django 认证表的兼容问题,系统采用三库分离设计:
| 数据库 | 类型 | 文件 / 地址 | 存放内容 |
| --- | --- | --- | --- |
| default | MongoDB | `mongodb://172.17.0.1:27017/vanBlog` | 主站文章等业务数据(`vanBlog` 库) |
| accounts | SQLite | `accounts.sqlite` | auth 用户、组、会话、后台及 accounts 应用全部表 |
| classroom | SQLite | `classroom.sqlite` | 班级(`classroom_room`)、当前班级(`classroom_current`) |
- 通过 `accounts/db_router.py`、`classroom/db_router.py` 两个路由把对应模型定向到各自数据库。
- 容器通过 `extra_hosts: host.docker.internal:host-gateway` 及 `172.17.0.1` 访问宿主机上的 MongoDB。
- 设置环境变量 `USE_MONGO=true` 时使用 MongoDB;未设置时默认库回退为本地 `db.sqlite3`(便于本地开发)。
- 在线工具的使用次数保存在用户浏览器 `localStorage`,不写入上述数据库。
---
## 四、部署与运行
### 使用 docker compose(当前方式)
```bash
cd /volume1/docker/mysite # NAS 上对应 \\FeiNas\docker\mysite
docker compose up -d --build
```
`docker-compose.yml` 启动命令会依次执行:
```bash
python manage.py migrate --database=accounts # 迁移账号库
python manage.py migrate classroom --database=classroom # 迁移课堂库
python manage.py ensure_admin # 确保管理员 fei 存在
python manage.py runserver 0.0.0.0:8000 # 启动服务
```
策略:`restart: always`,容器退出后自动重启。
> 提示:runserver 的自动重载依赖文件变更检测。通过 SMB 更新代码后若路由/视图未立即生效,可在容器内 `touch` 对应文件,或执行 `docker compose restart web`。
### 必需的环境变量(.env)
阿里云 OSS 配置通过项目根目录 `.env` 注入:
```env
OSS_ACCESS_KEY_ID=你的AccessKeyId
OSS_ACCESS_KEY_SECRET=你的AccessKeySecret
OSS_BUCKET_NAME=你的Bucket名称
OSS_ENDPOINT=OSS地域域名(如 oss-cn-guangzhou.aliyuncs.com)
```
compose 中已设置 `USE_MONGO=true`。
### 静态文件
- 源码静态目录:`static/`(含 `static/lib/vis-network.min.js`)
- 收集目录:`staticfiles/`(已挂载卷)
- 收集命令:`python manage.py collectstatic`
---
## 五、常用运维命令
```bash
# 查看容器日志
docker compose logs -f web
# 重启服务
docker compose restart web
# 重新执行数据库迁移
docker compose exec web python manage.py migrate --database=accounts
docker compose exec web python manage.py migrate classroom --database=classroom
# 手动确认 / 创建管理员(也可指定账号密码)
docker compose exec web python manage.py ensure_admin
docker compose exec web python manage.py ensure_admin --username fei --password 新密码
# 创建 Django 超级用户(进入 /admin 后台)
docker compose exec web python manage.py createsuperuser
# 备份 SQLite 库(在 NAS 上直接复制文件即可)
accounts.sqlite # 账号库
classroom.sqlite # 课堂点名库
```
> 注意:账号库与课堂库是独立 SQLite 文件,备份时两个文件都要复制;
> 文章数据在宿主机 MongoDB 的 `vanBlog` 库中,需通过 MongoDB 的备份机制处理。
---
## 六、目录结构
```
mysite/
├── manage.py
├── docker-compose.yml # 容器编排(8084→8000)
├── Dockerfile # Python 3.11-slim
├── requirements.txt
├── accounts.sqlite # 账号库(运行时生成)
├── classroom.sqlite # 课堂点名库(运行时生成)
├── mysite/ # 项目配置(settings/urls/wsgi)
├── myapp/ # 主站应用(含在线工具视图/路由)
│ └── templates/tools/ # knowmap.html / label_generator.html / prompter.html
├── photo/ # 相册应用(含 oss_utils.py)
├── classroom/ # 课堂点名积分应用
├── accounts/ # 账号应用(中间件/路由/管理命令,api_me 接口)
├── static/ # 静态资源源码(lib/vis-network.min.js)
├── staticfiles/ # collectstatic 输出
└── templates(各应用内) # 页面模板
```
在线工具相关路由(myapp/urls.py):
```
/tools/knowmap/ name='tool_knowmap'
/tools/label/ name='tool_label'
/tools/prompter/ name='tool_prompter'
```
---
## 七、在线工具 URL 一览
| 工具 | 地址 | 门控 |
| --- | --- | --- |
| 通用知识图谱生成器 | `/tools/knowmap/` | 未登录 5 次,登录无限;软著登记号 2026SR0460334 |
| 二维码标签生成器 | `/tools/label/` | 未登录 5 次,登录无限 |
| 飞云轩提词器 | `/tools/prompter/` | 未登录 5 次,登录无限 |
| 课堂点名积分榜 | `/classroom/` | 查看公开,写操作需登录 |
---
## 附:更新备忘
- 2026-10-07:新增「个人开发在线实用工具」区,接入通用知识图谱生成器、二维码标签生成器、飞云轩提词器三个单页工具;统一加入「未登录 5 次、登录后无限」门控;新增登录态接口 `/accounts/api/me/`。
- 知识图谱工具相关软件《交互式知识图谱可视化系统》获计算机软件著作权登记,登记号 2026SR0460334。
- 门控注入注意:二维码工具原始 jsPDF 代码内嵌有字符串形式的 `