前后端分离的多人协同在线表格台账系统,支持部门隔离、格子级编辑锁、JSON 文件存储(无需数据库)。
| 层级 | 技术 |
|---|---|
| 后端 | SpringBoot 2.7 + JWT + Jackson |
| 前端 | Vue 3 + Vite + Element Plus + Vue Router + Axios |
| 存储 | JSON 文件(backend/data/ 目录) |
- 账号注册:用户可自行注册账号,注册后默认无部门,需管理员分配
- 管理员账号:系统启动时自动创建默认管理员(admin / admin123)
- 部门管理:管理员可创建、编辑、删除部门
- 用户分配:管理员可为用户分配/变更所属部门
- 部门隔离:同一部门成员共享同一份在线表格,不同部门数据完全隔离
- 格子级编辑锁:同一时间一个格子只允许一个用户编辑,其他人点击时提示"正在被 XX 编辑"
- 锁自动续租:编辑中每 30 秒自动续租,防止超时释放
- 锁超时释放:5 分钟未操作自动释放锁,避免死锁
- 实时锁状态:前端每 5 秒轮询,被他人锁定的格子高亮显示并带锁图标
- 行列管理:支持新增/删除行、新增/删除/重命名列
doubao_demo/
├── backend/ # SpringBoot 后端
│ ├── src/main/java/com/ledger/
│ │ ├── LedgerApplication.java # 启动类
│ │ ├── config/ # 配置(CORS、拦截器、初始化)
│ │ ├── controller/ # 控制器(Auth/User/Department/Table)
│ │ ├── service/ # 业务逻辑(User/Department/Table/Lock)
│ │ ├── model/ # 数据模型
│ │ └── util/ # 工具类(JSON读写/JWT/ID生成)
│ ├── src/main/resources/
│ │ └── application.properties # 配置文件
│ ├── data/ # JSON 数据存储目录(运行时生成)
│ └── pom.xml
└── frontend/ # Vue 3 前端
├── src/
│ ├── views/ # 页面(Login/Register/Layout/Admin/Table)
│ ├── router/ # 路由配置
│ ├── api/ # API 接口封装
│ ├── utils/ # 工具(Axios 封装)
│ ├── App.vue
│ └── main.js
├── index.html
├── vite.config.js
└── package.json
cd backend
mvn spring-boot:run后端启动后访问:http://localhost:8080/api
cd frontend
npm install
npm run dev前端启动后访问:http://localhost:3000
| 角色 | 用户名 | 密码 |
|---|---|---|
| 管理员 | admin | admin123 |
- 使用管理员账号登录,进入「管理后台」
- 创建部门(如"技术部"、"市场部")
- 在用户管理中,为已注册的用户分配部门
- 普通用户登录后进入「在线台账」,即可看到本部门的共享表格
- 点击任意格子开始编辑:
- 如果格子空闲,获取编辑权后可输入内容,回车或失焦自动保存
- 如果格子正被他人编辑,会弹出提示"该格子正在被 XX 编辑"
- 被他人锁定的格子会高亮为橙色并显示锁图标
POST /api/auth/register- 用户注册POST /api/auth/login- 用户登录
GET /api/users- 获取所有用户(管理员)GET /api/users/me- 获取当前用户信息PUT /api/users/{userId}/department- 分配部门(管理员)GET /api/users/department/{departmentId}- 获取部门用户列表
GET /api/departments- 获取所有部门POST /api/departments- 创建部门(管理员)PUT /api/departments/{id}- 更新部门(管理员)DELETE /api/departments/{id}- 删除部门(管理员)
GET /api/table- 获取当前用户部门的表格GET /api/table/department/{departmentId}- 获取指定部门表格PUT /api/table/cell- 更新格子内容POST /api/table/row- 新增行DELETE /api/table/row/{rowId}- 删除行POST /api/table/column- 新增列DELETE /api/table/column/{colId}- 删除列PUT /api/table/column/{colId}- 重命名列
POST /api/table/cell/lock- 尝试获取编辑锁POST /api/table/cell/unlock- 释放编辑锁POST /api/table/cell/renew- 续租锁GET /api/table/locks- 获取当前部门所有锁状态
所有数据以 JSON 文件形式存储在 backend/data/ 目录下:
| 文件 | 内容 |
|---|---|
users.json |
用户列表(含密码,生产环境建议加密) |
departments.json |
部门列表 |
tables.json |
各部门的表格数据 |
locks.json |
当前活跃的格子锁 |
删除对应文件即可重置数据。
backend/src/main/resources/application.properties:
server.port=8080 # 后端端口
ledger.data.path=data # JSON 数据存储目录
jwt.secret=... # JWT 密钥(生产环境请修改)
jwt.expiration=86400000 # Token 有效期(毫秒),默认24小时
admin.username=admin # 默认管理员用户名
admin.password=admin123 # 默认管理员密码
lock.timeout=300000 # 格子锁超时时间(毫秒),默认5分钟- 本系统为演示/小型团队使用设计,JSON 文件存储不适合高并发大规模场景
- 密码明文存储,生产环境请改为 BCrypt 等加密方式
- JWT 密钥请在生产环境修改
- 格子锁采用轮询机制(前端每5秒查询),非实时推送;如需实时可升级为 WebSocket