375772291fc6d4560c3a19be51f62d09ddbcc64a
ChatOA — 基于 IM 的 OA 客户端工具
通过即时通讯的方式实现对话、文件互传、表单签批等,面向办公室人员,整体结构参考微信电脑端(三列布局)。
功能规划
| 模块 | 优先级 | 状态 |
|---|---|---|
| 1. 即时通讯(单聊 + 文字/图片消息) | P0 | 第一阶段完成 |
| 2. 联系人 | P0 | 第一阶段完成 |
| 3. 日程 | P0 | 第一阶段完成 |
| 4. 表单(自定义表单,Json 存储) | P1 | Demo 版 |
| 5. 笔记 | P1 | Demo 版 |
| 6. 应用 | P2 | 扩展,导航占位 |
| 7. 网盘 | P2 | 扩展,导航占位 |
技术栈
- 客户端:Electron + React + TypeScript + Ant Design 5 + Zustand + Socket.IO Client
- 服务端:Node.js + NestJS + TypeScript + Socket.IO
- 数据库(规划):MongoDB + Redis
- 当前存储:开发期使用「内存 + JSON 文件持久化」模拟存储,业务层通过统一的存储抽象接口访问,后续无缝切换到 MongoDB / Redis
目录结构
ChatOA/
├── server/ # NestJS 服务端(端口 3000)
│ ├── data/ # JSON 持久化文件(自动生成)
│ ├── uploads/ # 图片上传目录(自动生成)
│ └── src/
│ ├── common/storage/ # 存储抽象层(内存 + JSON 持久化)
│ ├── auth/ # JWT 认证
│ ├── users/ # 用户
│ ├── contacts/ # 联系人
│ ├── chat/ # IM(REST + Socket.IO 网关)
│ ├── presence/ # 在线状态(模拟 Redis)
│ ├── schedule/ # 日程
│ ├── forms/ # 表单 Demo
│ ├── knowledge/ # 笔记 Demo
│ └── seed/ # 演示数据初始化
└── client/ # Electron + React 客户端
├── electron/ # 主进程 / preload
└── src/
├── layout/ # 三列布局
├── pages/ # 登录 / 聊天 / 联系人 / 日程 / 表单 / 笔记
├── api/ # HTTP 客户端
├── socket/ # Socket.IO 客户端
└── store/ # Zustand 状态
快速开始
1. 启动服务端
cd server
npm install
npm run start:dev # http://localhost:3000
2. 启动客户端(浏览器调试模式)
cd client
npm install
npm run dev:web # http://localhost:5173
3. 启动客户端(Electron 桌面模式)
cd client
npm run dev # 同时启动 Vite + Electron
4. 打包 Windows 桌面客户端
cd client
npm run build # 仅前端构建(dist/)
npm run build:win # 构建并打包,产物在 client/release/
打包产物(需服务端在 3000 端口运行):
| 文件 | 说明 |
|---|---|
ChatOA-Setup-<version>-x64.exe |
NSIS 安装版,可自定义安装目录、生成桌面快捷方式 |
ChatOA-Portable-<version>-x64.exe |
免安装版,双击即用 |
打包后的客户端以
file://加载页面,会自动直连http://localhost:3000的 API 与 Socket;也可用VITE_API_BASE/VITE_SOCKET_URL环境变量覆盖服务端地址。 Windows 打包若遇win-unpacked.tmp重命名被占用(Defender 实时扫描),已在构建配置中通过electronDist复用本地 Electron 绕过。
演示账号
服务端启动时会自动初始化以下账号(密码均为 123456):
| 用户名 | 昵称 |
|---|---|
| demo | 演示用户 |
| alice | 小艾 |
| bob | 小波 |
| carol | 小卡 |
登录后可在联系人页找到其他用户发起单聊、发送文字/图片消息;日程、表单、笔记均为可用 Demo。
当前已知限制(开发期)
- 存储为 JSON 文件,重启服务数据保留;未接 MongoDB / Redis
- 图片消息通过 base64 / 上传接口传输,未做压缩与断点续传
- 支持单聊,群聊、已读回执细粒度、消息撤回等留待后续版本
Languages
TypeScript
99.4%
JavaScript
0.4%
CSS
0.1%