Wujies 无界平台
平台功能(自研)

用户待办

用户待办是工作台「待办事项」卡片的数据来源,表为 sys_user_todo。它刻意做得比常规 CRUD 更窄:只服务当前登录用户自己的几条记录,没有管理端列表,也没有权限标识。

为什么没有权限标识

待办是「我自己的数据」。如果给它挂上 system:todo:list 之类的权限,普通用户会被挡在自己的待办之外;而如果要给每个用户单独授权,又不现实。

因此接口的边界不靠权限,而靠服务端过滤:

  • 查询固定拼接 user_id = 当前登录用户;
  • 新增时 user_id 由服务端写入,忽略前端传值;
  • 修改、删除前先 requireOwn(todoId),不是自己的记录直接拒绝;
  • 登录态由全局 Sa-Token 拦截器保证,未登录请求返回 401。

字段

字段说明
todo_id主键
user_id所属用户,服务端写入
tenant_id租户编号,随 TenantEntity 自动隔离
content待办内容,新增必填,最多 200 字
done_flag0 未完成 / 1 已完成
done_time完成时间,勾选完成时写入,取消完成时清空
sort_num显示顺序,默认 0
del_flag逻辑删除

表结构脚本在 script/sql/update/sys_user_todo.sql,使用 CREATE TABLE IF NOT EXISTS,可重复执行。

接口

方法路径说明
GET/system/todo/list?doneFlag=我的待办,doneFlag 可选
POST/system/todo新增
PUT/system/todo修改内容、勾选完成、调整排序
DELETE/system/todo/{todoId}删除

列表排序

固定按以下顺序返回,不提供自定义排序参数:

  1. done_flag 升序——未完成在前,已完成沉底;
  2. sort_num 升序;
  3. create_time 降序——同序号时新加的在前。

新增

只要求 content 非空(AddGroup)。服务端会强制:

  • todoId = null,避免前端指定主键;
  • userId = LoginHelper.getUserId();
  • doneFlag = 0、doneTime = null;
  • sortNum 为空时填 0。

修改

todoId 必填(EditGroup),content 可选——勾选完成时前端不需要把内容一起回传。

  • 传了 content 才更新内容;
  • doneFlag 只接受 0 / 1,其他值抛「不支持的完成状态」;
  • 置为 1 时写入 doneTime,置回 0 时清空;
  • 传了 sortNum 才更新排序。

删除

逻辑删除,同样先校验归属。删除后不会再出现在列表中,数据仍保留在表里。

前端用法

// 工作台初始化:拿全部待办
const todos = await get('/system/todo/list');

// 只看未完成
const open = await get('/system/todo/list', { doneFlag: '0' });

// 新增
await post('/system/todo', { content: '处理本周工单' });

// 勾选完成(不需要回传 content)
await put('/system/todo', { todoId: todo.todoId, doneFlag: '1' });

使用边界

  • 这是个人工具,不适合拿来做任务分派、审批流或团队协作;需要这些能力时请使用工作流或业务模块。
  • 每个用户只能看到自己的数据,管理员也不能通过这组接口查看他人待办。
  • 数据按租户隔离,切换租户后看到的是另一套待办。
  • 没有批量接口,也不建议一次维护成百上千条——它是工作台卡片,不是任务管理系统。

目录