初始化
This commit is contained in:
1
memory/.session-last
Normal file
1
memory/.session-last
Normal file
@@ -0,0 +1 @@
|
||||
{"projectPath": "E:\\AI\\claude\\new\\mokeeText", "endedAt": "2026-06-28T05:40:00+08:00", "sessionId": "session-20260628-4"}
|
||||
4
memory/MEMORY.md
Normal file
4
memory/MEMORY.md
Normal file
@@ -0,0 +1,4 @@
|
||||
- [2026-06-23 第1次会话](session-20260623-1.md) — MoKeeText 项目从零搭建到 Docker 部署
|
||||
- [2026-06-23 第2次会话](session-20260623-2.md) — 审查 Mokee Gateway 接入文档 + 编写完整接入方案
|
||||
- [2026-06-24 第3次会话](session-20260624-3.md) — 修复 UserChip Widget 集成问题,对齐 control-web 成功模式
|
||||
- [2026-06-28 第4次会话](session-20260628-4.md) — 添加「切换系统」按钮到顶栏,部署生产环境
|
||||
104
memory/session-20260623-1.md
Normal file
104
memory/session-20260623-1.md
Normal file
@@ -0,0 +1,104 @@
|
||||
---
|
||||
name: session-20260623-1
|
||||
description: 2026-06-23 第1次会话 — MoKeeText 项目从零搭建到 Docker 部署
|
||||
metadata:
|
||||
type: session
|
||||
date: 2026-06-23
|
||||
sessionNumber: 1
|
||||
startTime: 2026-06-23T14:00:00+08:00
|
||||
---
|
||||
|
||||
# 2026-06-23 第1次会话
|
||||
|
||||
## 会话摘要
|
||||
从零搭建 Web 记事本 MoKeeText,包含笔记编辑器(Tiptap 增强型)、网站账号密码管理、智能导入。技术栈:FastAPI + Vue 3 + Vite + MySQL。已部署到生产服务器 Docker。
|
||||
|
||||
## 关键决策
|
||||
|
||||
### 技术选型
|
||||
- **做了什么**: 选择 FastAPI + Vue3 + MySQL,放弃纯 Jinja2 模板方案
|
||||
- **原因**: Vue 组件化更适合复杂交互,FastAPI 轻量够用
|
||||
- **结果**: 前后端分离,前端 Vite 构建静态文件,后端纯 API
|
||||
|
||||
### 编辑器选型
|
||||
- **做了什么**: 使用 Tiptap 增强型编辑器
|
||||
- **原因**: 支持文字颜色、图片粘贴上传、表格、表情,飞书级别体验
|
||||
- **结果**: Tiptap 通过 esbuild 打包成本地文件(~460KB),无需 CDN
|
||||
|
||||
### 图片存储
|
||||
- **做了什么**: 图片存入 MySQL `uploads` 表的 LONGBLOB 字段,不存文件系统
|
||||
- **原因**: 部署简单,备份只要导出数据库
|
||||
- **结果**: 上传 API 返回 `/api/file/{id}`,支持 20MB 以内的图片
|
||||
|
||||
### 部署架构
|
||||
- **做了什么**: Docker Compose 部署,前端 Nginx :3006,后端 FastAPI :4006
|
||||
- **原因**: 生产环境标准化
|
||||
- **结果**: 前端不代理 API,Vue 直接跨域请求后端 `https://mokeetext.server.zgitm.com`
|
||||
|
||||
## 代码结构
|
||||
```
|
||||
mokeeText/
|
||||
├── app.py # FastAPI 入口 + CORS
|
||||
├── models.py # 6个模型:Folder/Note/Tag/Website/Account/Upload
|
||||
├── routes/
|
||||
│ ├── notes.py # 笔记 CRUD + 分享 + 移动
|
||||
│ ├── websites.py # 网站/账号/文件夹 CRUD + 排序
|
||||
│ ├── import_api.py # 智能导入解析
|
||||
│ ├── upload.py # 图片上传/读取(存DB)
|
||||
│ └── share.py # 分享公开查看页
|
||||
├── src/ # Vue 3 源码
|
||||
│ ├── App.vue # 左导航 + 顶栏 + 底栏
|
||||
│ ├── views/
|
||||
│ │ ├── NotesView.vue # 笔记文档列表 + 编辑器
|
||||
│ │ ├── WebsitesView.vue # 网站管理 + 弹窗
|
||||
│ │ └── SharesView.vue # 分享管理
|
||||
│ └── components/
|
||||
│ ├── NoteEditor.vue # Tiptap 编辑器(图片粘贴/拖拽/预览)
|
||||
│ ├── Modal.vue # 通用弹窗
|
||||
│ ├── ConfirmModal.vue # 确认弹窗
|
||||
│ └── PromptModal.vue # 输入弹窗
|
||||
├── static/dist/ # Vue 构建产物
|
||||
├── nginx.conf # 前端 Nginx 配置(纯静态,无代理)
|
||||
├── Dockerfile # 后端镜像
|
||||
├── Dockerfile.frontend # 前端镜像
|
||||
└── docker-compose.yml # 编排
|
||||
```
|
||||
|
||||
## 数据库(MySQL 10.20.1.122:3306/mokeetext)
|
||||
- 用户:mokeetext / mokee.
|
||||
- 所有表均有 `created_by` / `updated_by` 字段(默认 admin)
|
||||
- `notes.share_token` + `share_expires_at` 支持分享链接有效期
|
||||
- `accounts.sort_order` 支持账号排序
|
||||
|
||||
## 生产环境
|
||||
- 服务器:101.132.183.138 root/mokee2016.
|
||||
- 项目目录:/data/mokee/mokeetext
|
||||
- 前端:https://mokeetext.zgitm.com (:3006)
|
||||
- 后端:https://mokeetext.server.zgitm.com (:4006)
|
||||
- 日志:/data/mokee/mokeetext/logs(按天轮转,保留30天)
|
||||
- ICP备案:湘ICP备19021539号
|
||||
|
||||
## UI 特性
|
||||
- 左侧可收起导航(展开"mokee编辑器",收起"M")
|
||||
- 笔记页文件夹侧边栏可收起
|
||||
- 分享链接支持 7天/30天/1年/永久 四种有效期
|
||||
- 图片点击全屏预览(带关闭按钮)
|
||||
- Ctrl+S 保存,toast 提示
|
||||
- 弹窗全部 Vue 组件(非浏览器 alert/confirm)
|
||||
- 移动端响应式适配(768px 断点)
|
||||
|
||||
## 最新改动(UI 优化)
|
||||
- 文件夹用圆点替代 emoji,胶囊数量标签
|
||||
- 左侧导航选中项蓝色左边框指示器
|
||||
- "mokee编辑器"品牌名(收起显示 M)
|
||||
- 文件夹侧边栏可收起
|
||||
- 分享页卡片宽度 1100px,超宽滚动
|
||||
- 图片上传存 DB + 粘贴/拖拽自动上传 + 点击预览带关闭按钮
|
||||
- 前端不代理,直接跨域调后端
|
||||
- 后端 CORS 已开
|
||||
- 全站响应式(768px 断点)
|
||||
|
||||
## 待处理
|
||||
- [ ] favicon.ico 前端图标
|
||||
- [ ] mokeetext.server.zgitm.com 反向代理配置(运维处理)
|
||||
- [ ] 后续可加用户登录/权限系统
|
||||
89
memory/session-20260623-2.md
Normal file
89
memory/session-20260623-2.md
Normal file
@@ -0,0 +1,89 @@
|
||||
---
|
||||
name: session-20260623-2
|
||||
description: 2026-06-23~24 第2次会话 — 审查接入文档 + 编写方案 + 完成代码改造 + 部署到生产服务器
|
||||
metadata:
|
||||
type: session
|
||||
date: 2026-06-23
|
||||
sessionNumber: 2
|
||||
startTime: 2026-06-23T16:00:00+08:00
|
||||
---
|
||||
|
||||
# 2026-06-23 第2次会话
|
||||
|
||||
## 会话摘要
|
||||
审查 MoKeeText 接入 Mokee Gateway 统一登录网关的完整文档,发现 8 个问题(3 重大 + 5 中等),编写了完整的接入实施方案。
|
||||
|
||||
## 关键操作
|
||||
|
||||
### 接入文档审查
|
||||
- **做了什么**: 逐节审查网关接入文档,对比当前 MoKeeText 项目实际情况
|
||||
- **发现的问题**:
|
||||
1. 🔴 后端中间件:文档给的是 Flask,项目是 FastAPI
|
||||
2. 🔴 所有 API 缺少用户数据隔离(当前 created_by 硬编码 admin)
|
||||
3. 🔴 前端源码结构分析(Vue 3 + Vite + fetch,非 axios)
|
||||
4. 🟡 CORS `allow_origins=["*"]` 与 `allow_credentials=True` 冲突
|
||||
5. 🟡 图片存储是否迁移到文件服务(当前存 MySQL LONGBLOB)
|
||||
6. 🟡 本地开发无网关环境如何调试
|
||||
7. 🟡 现有 admin 数据迁移策略
|
||||
8. 🟡 前端 API 请求路径变化(直连后端 → 网关)
|
||||
- **结果**: 用户澄清了关键问题 — 前端源码在当前目录、不修改当前项目结构(作为基线)、现有数据归属 admin、网关有 admin 用户
|
||||
|
||||
### 接入方案编写
|
||||
- **做了什么**: 编写完整 12 个 Task 的接入实施方案,保存到 `docs/superpowers/plans/2026-06-23-mokeetext-gateway-integration.md`
|
||||
- **方案覆盖**:
|
||||
- Task 0: 网关数据库初始化(菜单/角色/管理员 SQL)
|
||||
- Task 1-2: 后端 FastAPI 中间件 + CORS 改造
|
||||
- Task 3: 5 个路由文件用户数据隔离改造
|
||||
- Task 4-9: 前端 env/axios/路由守卫/UserChip/v-permission
|
||||
- Task 10: 按钮权限控制
|
||||
- Task 11-12: 部署更新
|
||||
- **关键设计决策**:
|
||||
- 本地开发走 `localhost` 直连后端 + `X-Dev-Mock-User` 头模拟用户
|
||||
- 生产环境走网关,axios 拦截器自动携带 Token + X-System-Code
|
||||
- 图片读取 API 不鉴权(笔记中 img 标签无法带 Authorization)
|
||||
- 前端保留 fetch(dev 模式)+ axios(生产模式)双通道
|
||||
- **结果**: 方案已通过 writing-plans 自检(spec coverage ✓, placeholder scan ✓, type consistency ✓)
|
||||
|
||||
## 重要信息
|
||||
- 系统编码: `mokeetext-edit`
|
||||
- 网关地址: `gw.server.zgitm.com`
|
||||
- 登录地址: `login.user.zgitm.com`
|
||||
- UserChip CDN: `web.gw.zgitm.com/widgets/user-chip.css|js`
|
||||
- 文件服务: `file.wg.zgitm.com`(可选,当前项目不用)
|
||||
- 网关管理员账号: `admin_mokeetext-edit` / `admin123` BCrypt
|
||||
|
||||
## 已完成的代码改动
|
||||
|
||||
### 后端(Task 1-3)
|
||||
- ✅ `middleware/__init__.py` + `middleware/user_context.py` — UserContext 辅助类 + FastAPI 中间件
|
||||
- ✅ `app.py` — CORS 更新(3 个域名 + localhost) + 注册 UserContextMiddleware
|
||||
- ✅ `routes/notes.py` — 所有接口加 created_by 过滤 + request 参数
|
||||
- ✅ `routes/websites.py` — 同上(网站/账号/文件夹)
|
||||
- ✅ `routes/import_api.py` — 同上
|
||||
- ✅ `routes/upload.py` — 上传记录 created_by,读取保持公开
|
||||
- ✅ `routes/share.py` — 保持原样(公开访问不走网关)
|
||||
|
||||
### 前端(Task 4-6)
|
||||
- ✅ `.env` / `.env.production` — 环境变量
|
||||
- ✅ `src/utils/request.js` — Axios 实例 + 拦截器
|
||||
- ✅ `src/composables/useApi.js` — 双模式:dev (fetch+mock) / production (axios+gateway)
|
||||
- ✅ `src/router.js` — 路由守卫(无 Token → 登录页,localhost 豁免)
|
||||
- ✅ `src/directives/permission.js` — v-permission 指令
|
||||
- ✅ `src/main.js` — 注册 permission + 动态加载 UserChip Widget
|
||||
- ✅ `src/App.vue` — UserChip 占位 + 本地 mock 头像
|
||||
- ✅ `index.html` — UserChip CSS
|
||||
- ✅ `src/components/NoteEditor.vue` — 双地址:GW_BASE(上传)+ FILE_BASE(读取)
|
||||
- ✅ `package.json` — 添加 dev/build scripts,安装 axios
|
||||
- ✅ 构建成功:`static/dist/` 已生成
|
||||
|
||||
## 设计决策确认
|
||||
- X-User-Id = `"admin"` 格式 → 历史数据无需迁移
|
||||
- 分享页`/share/{token}`走后端直连(公开),`/api/file/{id}`也走后端直连(公开)
|
||||
- 图片上传走网关(鉴权),读取走后端直连(<img>标签 + 分享页兼容)
|
||||
- 网关 Authorization 头为空时从 Cookie 取 Token
|
||||
- 当前项目代码结构保持不变(不重构)
|
||||
|
||||
## 待处理
|
||||
- [ ] Task 0: 网关数据库初始化 SQL(需要网关 DB 访问权限)
|
||||
- [ ] Task 11-12: 生产环境部署(需要 SSH 到服务器)
|
||||
- [ ] 对接测试清单逐项验证
|
||||
46
memory/session-20260624-3.md
Normal file
46
memory/session-20260624-3.md
Normal file
@@ -0,0 +1,46 @@
|
||||
---
|
||||
name: session-20260624-3
|
||||
description: 2026-06-24 第3次会话 — 修复 UserChip Widget 集成问题,对齐 control-web 成功模式
|
||||
metadata:
|
||||
type: session
|
||||
date: 2026-06-24
|
||||
sessionNumber: 3
|
||||
startTime: 2026-06-24T03:35:00+08:00
|
||||
---
|
||||
|
||||
# 2026-06-24 第3次会话
|
||||
|
||||
## 会话摘要
|
||||
用户反馈登录后页面右上角 UserChip Widget 不显示。通过对比正常工作的 control-web 项目,发现 3 个差异,逐一修复后重新构建部署。
|
||||
|
||||
## 关键操作
|
||||
|
||||
### UserChip Widget 问题诊断
|
||||
- **做了什么**: 对比 `E:\AI\claude\new\deployServer\control-web`(正常)和当前 mokeeText(异常)的 Widget 接入代码
|
||||
- **发现的差异**:
|
||||
1. 🔴 `main.js` 中 `window.process = { env: {} }` 和 widget 加载被 `if (hostname !== 'localhost')` 包裹,control-web 是无条件执行
|
||||
2. 🔴 `App.vue` 中 `#mokee-user-chip` 使用自闭合 `<div ... />`,control-web 是正常闭合 `<div ...></div>`
|
||||
3. 🟡 `App.vue` 使用 `v-if/v-else` 条件渲染 widget 占位 div,control-web 始终渲染
|
||||
4. 🟡 `router.js` 登录重定向缺少 `redirect` 参数
|
||||
- **结果**: 全部对齐到 control-web 的成功模式
|
||||
|
||||
### 代码修改(3 个文件)
|
||||
- ✅ `src/main.js` — 移除条件判断,无条件执行 polyfill + widget 加载
|
||||
- ✅ `src/App.vue` — 正常闭合标签 + 始终渲染 widget 占位 + 移除 mock 头像
|
||||
- ✅ `src/router.js` — 添加 `WEBSITE_URL` + `redirect` 参数到登录跳转
|
||||
|
||||
### 构建部署
|
||||
- ✅ `npx vite build` — 构建成功,生成 `index-D7pnBl5K.js` + `index-CH4J61s9.css`
|
||||
- ✅ SFTP 上传到 101.132.183.138 `/data/mokee/mokeetext/static/dist/`
|
||||
- ✅ `docker compose up -d --build frontend` — 重建并重启前端容器
|
||||
- ✅ 验证:容器运行正常,nginx 返回新 index.html,JS 包含正确代码
|
||||
|
||||
## 重要信息
|
||||
- control-web 参考项目路径: `E:\AI\claude\new\deployServer\control-web`
|
||||
- control-web 使用 `createWebHashHistory`,mokeeText 使用 `createWebHistory`(保持不变)
|
||||
- 生产服务器: 101.132.183.138 root/mokee2016.
|
||||
- 生产地址: https://mokeetext.zgitm.com
|
||||
|
||||
## 待处理
|
||||
- [ ] 用户验证线上 Widget 是否正常显示
|
||||
- [ ] 如有问题查看浏览器控制台错误
|
||||
96
memory/session-20260628-4.md
Normal file
96
memory/session-20260628-4.md
Normal file
@@ -0,0 +1,96 @@
|
||||
---
|
||||
name: session-20260628-4
|
||||
description: 2026-06-28 第4次会话 — 切换系统按钮 + 目录整理 + 项目/部署文档 + 文件服务接入与回退
|
||||
metadata:
|
||||
type: session
|
||||
date: 2026-06-28
|
||||
sessionNumber: 4
|
||||
startTime: 2026-06-28T04:45:00+08:00
|
||||
---
|
||||
|
||||
# 2026-06-28 第4次会话
|
||||
|
||||
## 会话摘要
|
||||
1. 顶栏添加「切换系统」按钮 → `https://web.gw.zgitm.com/select`
|
||||
2. 项目目录彻底整理:backend/ frontend/ deploy/ 三目录分离
|
||||
3. 编写项目文档 `docs/README.md` 和部署文档 `docs/DEPLOY.md`
|
||||
4. 图片存储接入文件服务 → 部署排错 → 最终回退到 DB 存储,保留文件服务代码备用
|
||||
|
||||
## 代码改动
|
||||
|
||||
### 1. src/App.vue — 顶栏右侧加「切换系统」按钮
|
||||
- **位置**: 顶栏 [☰ MoKeeText] 右侧空白
|
||||
- **跳转**: `https://web.gw.zgitm.com/select`(外部链接,非 Vue 路由)
|
||||
- **样式**: ghost 风格 `.switch-system-btn`,hover 变蓝
|
||||
|
||||
### 2. 项目目录整理
|
||||
|
||||
**整理前** → 根目录混在一起(app.py / index.html / Dockerfile / routes / src / static 等全在一个目录)
|
||||
|
||||
**整理后**:
|
||||
```
|
||||
mokeeText/
|
||||
├── backend/ # FastAPI 后端
|
||||
│ ├── app.py, models.py, config.py, logger.py, init_db.py
|
||||
│ ├── file_service.py # 文件服务客户端(备用,当前未启用)
|
||||
│ ├── requirements.txt, Dockerfile, .dockerignore
|
||||
│ ├── routes/ # notes, websites, import_api, upload, share
|
||||
│ └── middleware/ # user_context
|
||||
├── frontend/ # Vue 3 前端
|
||||
│ ├── index.html, package.json, vite.config.js
|
||||
│ ├── Dockerfile.frontend, nginx.conf, .dockerignore
|
||||
│ ├── src/ # Vue 源码
|
||||
│ └── static/ # dist + js/vendor + css + uploads
|
||||
├── deploy/ # 部署
|
||||
│ ├── docker-compose.yml
|
||||
│ └── deploy.py # 日常部署(SSH 密钥认证)
|
||||
├── docs/
|
||||
│ ├── README.md # 项目文档
|
||||
│ └── DEPLOY.md # 部署文档
|
||||
├── memory/ # 会话记忆
|
||||
└── templates/ # 旧 Jinja2 模板(已废弃)
|
||||
```
|
||||
|
||||
### 3. 配置更新
|
||||
- **docker-compose.yml**: build context → `./backend` / `./frontend`
|
||||
- **Dockerfile**: 新增 COPY file_service.py
|
||||
- **deploy.py**: 路径更新 + 改用 SSH 密钥(无密码),运行: `python deploy/deploy.py`
|
||||
- **.dockerignore**: 分别放在 backend/ 和 frontend/ 下
|
||||
|
||||
### 4. 图片存储 — 接入文件服务后又回退
|
||||
|
||||
**过程**:
|
||||
1. 新增 `backend/file_service.py` — 封装文件服务 API(系统码 `mokeetext-edit`,目录 `/mokeetext-images/`)
|
||||
2. 修改 models.py — Upload 表新增 `file_id` 字段,data 改为 nullable
|
||||
3. 修改 init_db.py — 新增 migrate() ALTER TABLE
|
||||
4. 改造 upload.py — 上传走文件服务,读取兼容 file_id + blob 双通道
|
||||
5. 添加 requests 依赖
|
||||
|
||||
**排错过程**:
|
||||
- 🔴 Dockerfile 遗漏了 COPY file_service.py → 容器内无此文件,上传走旧代码
|
||||
- 🔴 SCP 时把 routes/upload.py 传到 backend/ 根目录而非 backend/routes/ 子目录 → 容器用的是旧代码
|
||||
- ✅ `--no-cache` 强制重建 + 修正文件路径后成功接入,文件服务出现 2 张图片
|
||||
|
||||
**最终决定**: 用户要求恢复 DB 存储,保留文件服务代码
|
||||
- `upload.py` 改回 DB LONGBLOB 存储
|
||||
- 读取优先 blob,file_id 存在时走文件服务(兼容之前 2 张图)
|
||||
- `file_service.py` 保留不删,注释标注备用切换方式
|
||||
|
||||
## 当前状态
|
||||
- **图片存储**: MySQL LONGBLOB(主) + 文件服务兼容读取(备用)
|
||||
- **file_service.py**: 保留,如需切换取消注释即可
|
||||
|
||||
## 部署
|
||||
- ✅ 目录迁移(服务器同步整理)
|
||||
- ✅ Docker 重建(backend + frontend 均在运行)
|
||||
- ✅ 数据库迁移(file_id 列已添加)
|
||||
- ✅ deploy.py 改用 SSH 密钥认证
|
||||
- ✅ 服务器 SSH 密钥认证正常工作
|
||||
|
||||
## 重要资产
|
||||
- 文件服务 API 文档: `E:\AI\claude\new\fileServer\goFileService\docs\api.md`
|
||||
- 参考项目 control-web: `E:\AI\claude\new\deployServer\control-web`
|
||||
- 项目文档: `docs/README.md` + `docs/DEPLOY.md`
|
||||
|
||||
## 待处理
|
||||
- [ ] 旧 `templates/` 目录可删除(Jinja2 已废弃)
|
||||
Reference in New Issue
Block a user