# CyyNote CyyNote 是一个前后端分离的在线笔记系统,后端基于 Solon + Wood + SQLite 提供鉴权、笔记树、笔记编辑、回收站和浏览历史接口;前端基于 React + Vite + Semi UI + Lexical 提供笔记管理与富文本编辑体验。 ## 技术栈 ### 前端 - React 18 - TypeScript 5.8 - Vite 6 - React Router 7 - Zustand 5:客户端状态管理 - Axios:统一 HTTP 客户端与鉴权拦截器 - Semi UI 2.96:页面组件库 - Lexical 0.44:富文本编辑器 - Yjs + y-websocket:协作编辑基础能力 - pnpm 9:包管理器 - ESLint 9 Flat Config ### 后端 - JDK 17 - Solon 3.0.5 - Wood ORM / wood-solon-plugin - SQLite JDBC 3.46 - HikariCP - solon-sessionstate-jwt:JWT Session - Fastjson2 - Hutool - Maven ## 目录结构 ```text CyyNote/ ├── cyynote-backend/ # Solon 后端工程 │ ├── pom.xml │ └── src/main/ │ ├── java/com/cyynote/ │ │ ├── controller/ # Auth / Note / Test 控制器 │ │ ├── dso/ # DB 初始化、Wood Mapper │ │ ├── model/ # 数据模型 │ │ ├── payload/ # 请求/响应 DTO │ │ └── util/ # 笔记树构建工具 │ └── resources/ │ ├── app.yml # 通用配置 │ ├── app-dev.yml # 开发环境配置 │ ├── app-pro.yml # 生产环境配置 │ └── db/schema.sql # SQLite 初始化脚本 └── cyynote-frontend/ # React 前端工程 ├── package.json ├── vite.config.ts └── src/ ├── components/ # 页面组件、Lexical 编辑器、弹窗、侧栏 ├── pages/ # 路由页面 ├── services/ # API Service ├── stores/ # Zustand Store ├── lib/axios.ts # Axios 实例与拦截器 └── types/ # 前端类型定义 ``` ## 环境要求 | 项目 | 要求 | | --- | --- | | JDK | 17+ | | Maven | 3.8+ | | Node.js | 20+ | | pnpm | 9+ | 后端 Maven 编译目标已设置为 Java 17;前端 `package.json` 中声明了 Node 20 与 pnpm 9。 ## 后端配置与运行 ### 数据库配置 开发环境默认使用当前运行目录下的 SQLite 文件: ```yaml test.db1: jdbcUrl: "jdbc:sqlite:./cyynote.db" driverClassName: "org.sqlite.JDBC" ``` 首次启动时,如果数据库中不存在 `appx` 表,后端会执行 `src/main/resources/db/schema.sql` 初始化基础表结构和示例数据。 默认账号: | 用户名 | 密码 | 角色 | | --- | --- | --- | | admin | cyy123 | ROLE_ADMIN | | test | test | ROLE_USER | ### 启动后端 ```bash cd cyynote-backend mvn clean package mvn clean package -DskipTests mvn solon:run java -jar demo.jar java -jar target/cyynote.jar ``` 默认服务端口:`8080`。 ### 后端关键接口 接口统一以 `/api` 为前缀。 #### 鉴权接口 | 方法 | 路径 | 说明 | | --- | --- | --- | | POST | `/api/auth/signin` | 登录,返回 `accessToken`、`tokenType` 和 `user` | | GET | `/api/auth/logout` | 清理服务端 Session | | POST | `/api/auth/signup` | 注册普通用户 | | POST | `/api/auth/updatePassword` | 修改密码 | 登录成功响应中的 `data` 结构: ```json { "accessToken": "...", "tokenType": "Bearer", "user": { "id": 1, "username": "admin", "email": "aaaaaaaaa", "roles": ["ROLE_ADMIN"] } } ``` #### 笔记接口 | 方法 | 路径 | 说明 | | --- | --- | --- | | GET | `/api/note/all` | 获取笔记树 | | GET | `/api/note/home?type=1&search=0` | 首页列表、搜索、回收站列表 | | GET | `/api/note/get?id=1` | 获取笔记详情,同时更新浏览时间 | | GET | `/api/note/add?pid=0` | 新增笔记 | | POST | `/api/note/update` | 更新笔记标题和内容 | | POST | `/api/note/delete` | 软删除笔记 | | GET | `/api/note/deleteBack?id=1` | 从回收站恢复笔记 | | GET | `/api/note/historyQueryOrDelete?flag=0` | 查询或清理历史记录 | `/api/note/home` 的 `type` 参数含义: | type | 说明 | | --- | --- | | 0 | 搜索 | | 1 | 最近更新 | | 2 | 最新添加 | | 3 | 最近浏览 | | 4 | 回收站 | ## 前端配置与运行 ### 环境变量 复制示例配置: ```bash cd cyynote-frontend cp .env.example .env ``` 常用配置: ```env VITE_API_BASE_URL=/api VITE_WS_URL=ws://localhost:1234 ``` 开发模式下,Vite 已配置 `/api` 代理到 `http://localhost:8080`。 ### 安装与启动 ```bash cd cyynote-frontend 若网络不好 pnpm config set registry https://registry.npmmirror.com/ pnpm install pnpm dev ``` ### 构建与检查 ```bash pnpm typecheck pnpm lint pnpm build ``` ## 前端架构说明 ### 路由 前端入口使用 `BrowserRouter`。主要路由: | 路径 | 页面 | 说明 | | --- | --- | --- | | `/login` | SignIn | 登录页 | | `/register` | Register | 注册页 | | `/home` | NotePage | 笔记主界面 | | `/profile` | Profile | 用户信息 | | `/user` | BoardUser | 用户权限测试页 | | `/mod` | BoardModerator | Moderator 权限测试页 | | `/admin` | BoardAdmin | Admin 权限测试页 | 除登录和注册外,其他路由由 `ProtectedRoute` 保护;未登录用户会跳转到 `/login`。 ### 状态管理 Zustand Store 分为三类: - `useAuthStore`:用户信息、JWT Token、登录状态持久化到 `sessionStorage` - `useNoteStore`:当前笔记、笔记树、首页列表、最近浏览列表 - `useUIStore`:当前视图、侧栏状态、搜索条件、弹窗显隐状态 ### HTTP 客户端 `src/lib/axios.ts` 创建统一 Axios 实例: - `baseURL` 读取 `VITE_API_BASE_URL`,默认 `/api` - 请求拦截器自动添加 `Authorization: Bearer ` - 响应拦截器在 HTTP 401 时自动登出并跳转登录页 ### 编辑器 笔记编辑器基于 Lexical。`NoteEditor` 负责标题输入与编辑器挂载,`LexicalApp` 负责富文本编辑能力。协作相关配置位于 `components/lexical/collaboration.ts`,WebSocket 地址由 `VITE_WS_URL` 控制。 ## 本次升级与修复说明 本次修复覆盖前端、后端和 JDK 17 运行兼容性: - 后端 Maven 编译目标升级为 Java 17 - 修复后端登录返回结构,使其与前端 `IAuthResponse` 匹配 - 修复登录失败时空指针问题,并返回 HTTP 401 - 修复注册接口只返回空对象的问题,改为实际创建普通用户 - 修复修改密码接口用户不存在时空指针问题 - 修复 JWT 拦截器在 401 后仍继续执行 Controller 的问题 - 修复软删除接口把标题更新成 `null` 的问题 - 修复历史表缺失 `flag` 字段的问题 - 修复开发环境 SQLite 路径在 Linux 下不可用的问题 - 修复前端 Profile 页面访问不存在 `accessToken` 字段导致崩溃的问题 - 修复首页点击“查看”后未切换到笔记视图的问题 - 修复 Board 页面仍使用旧 service 返回结构的问题 - 修复回收站和密码弹窗状态字段 `Model` / `Modal` 拼写不一致问题 - 修复前端笔记树 `key` 类型与后端返回值不一致的问题 - 清理未使用的 `@tanstack/react-query` 依赖声明 ## 验证建议 网络正常后建议执行: ```bash cd cyynote-backend mvn clean package cd ../cyynote-frontend pnpm install pnpm typecheck pnpm lint pnpm build ``` 如果 CI 使用 `pnpm install --frozen-lockfile`,需要提交 `pnpm-lock.yaml`。 ## 注意事项 - 当前密码仍为明文存储,生产环境应改为 BCrypt/Argon2 等不可逆哈希。 - Lexical 从旧版本升级到 0.44 跨度较大,建议重点回归测试自定义 Node、Plugin、序列化/反序列化和保存逻辑。 - y-websocket 3.x 与旧版存在差异,协作编辑功能需要单独联调。 - SQLite 适合单机和轻量部署;多人协作、高并发或云部署建议迁移到 MySQL/PostgreSQL。