基于依赖关系的智能任务调度系统,自动将子任务拓扑排序并分配到可用时间槽中,支持周/月视图可视化。
- 任务与子任务管理 — 创建包含子任务的任务,设置优先级与预计时长,支持嵌套展开查看
- 依赖关系管理 — 子任务级前置依赖,自动循环检测,完成状态级联传播
- 时间块管理 — 定义周期性(每周)或一次性可用时间段,重叠自动校验
- 自动调度引擎 — Kahn 拓扑排序 + 优先级排序 + 贪心槽位分配,子任务可跨时段拆分
- 智能重新调度 — 提前完成时自动前移依赖子任务,时间块变更时保留已完成任务
- 周视图日历 — 深色 7 天网格,90px 时间轴(00:00–23:30),30 分钟增量,当天高亮 + 实时时间线
- 月视图日历 — 任务计数徽章(≤99 / 99+),优先级排序标题,点击日期查看详情
- 认证与安全 — JWT(HttpOnly Cookie, ≤15min)+ 刷新令牌(≤7d,单次轮换),数据隔离
| 层级 | 技术 |
|---|---|
| 后端 | Java 17, Spring Boot 3.2, Spring Security, MyBatis-Plus 3.5.5 |
| 数据库 | MySQL 8.0+ |
| 认证 | JWT (jjwt 0.12.3, HS256), BCrypt (wf ≥ 10) |
| 前端 | Vue 3 (Composition API), Vite 5, Vue Router 4 |
| 状态管理 | Pinia |
| HTTP 客户端 | Axios (withCredentials) |
| 日期处理 | date-fns 3 |
SmartTask/
├── server/ # Spring Boot 后端
│ ├── src/main/java/com/smarttask/
│ │ ├── controller/ # REST 控制器
│ │ ├── service/ # 业务逻辑层
│ │ ├── mapper/ # MyBatis-Plus 数据访问
│ │ ├── entity/ # 数据库实体
│ │ ├── dto/ # 请求/响应 DTO
│ │ ├── scheduler/ # 调度引擎(拓扑排序 + 贪心分配)
│ │ ├── security/ # JWT 过滤器、令牌提供者
│ │ ├── exception/ # 全局异常处理器
│ │ └── config/ # Spring 配置
│ ├── src/main/resources/
│ │ └── application.yml # 应用配置
│ └── pom.xml
├── client/ # Vue 3 前端
│ ├── src/
│ │ ├── views/ # 页面视图
│ │ │ ├── WeekView.vue # 周视图日历
│ │ │ ├── MonthView.vue # 月视图日历
│ │ │ ├── TasksView.vue # 任务管理
│ │ │ ├── TimeBlocksView.vue # 时间块管理
│ │ │ ├── DashboardView.vue # 仪表盘
│ │ │ ├── LoginView.vue # 登录
│ │ │ └── RegisterView.vue # 注册
│ │ ├── components/ # 可复用组件
│ │ │ ├── NotificationToast.vue
│ │ │ └── DependencyDialog.vue
│ │ ├── stores/ # Pinia 状态管理
│ │ ├── services/api.js # Axios 实例与拦截器
│ │ ├── router/index.js # 路由配置
│ │ └── styles/tokens.css # 设计令牌
│ ├── package.json
│ └── vite.config.js
└── smart_task.sql # 数据库建表脚本
- JDK 17+
- Maven 3.8+
- Node.js 18+
- MySQL 8.0+
mysql -u root -p < smart_task.sqlcd server
mvn spring-boot:run服务启动在 http://localhost:8080
cd client
npm install
npm run dev前端启动在 http://localhost:5173,自动代理 API 请求到后端。
数据库连接等配置在 server/src/main/resources/application.yml:
spring:
datasource:
url: jdbc:mysql://localhost:3306/smarttask
username: root
password: root
jwt:
secret: <your-256-bit-secret>
access-token-validity: 900000 # 15 分钟
refresh-token-validity: 604800000 # 7 天| 方法 | 端点 | 说明 |
|---|---|---|
| POST | /api/auth/register |
注册(设置 HttpOnly Cookie) |
| POST | /api/auth/login |
登录 |
| POST | /api/auth/refresh |
轮换令牌 |
| POST | /api/auth/logout |
登出 |
| GET | /api/auth/me |
当前用户 |
| POST | /api/tasks |
创建任务(含子任务与依赖) |
| GET | /api/tasks |
任务列表 |
| GET | /api/tasks/{id} |
任务详情 |
| PUT | /api/tasks/{id} |
更新任务 |
| DELETE | /api/tasks/{id} |
删除任务 |
| POST | /api/tasks/{tid}/subtasks/{sid}/complete |
标记子任务完成 |
| POST | /api/tasks/{tid}/subtasks/{sid}/incomplete |
撤销子任务 |
| POST | /api/tasks/subtasks/{sid}/dependencies/{prereqId} |
添加依赖 |
| DELETE | /api/tasks/subtasks/{sid}/dependencies/{prereqId} |
移除依赖 |
| POST | /api/timeblocks/recurring |
创建周期性时间块 |
| POST | /api/timeblocks/onetime |
创建一次性时间块 |
| GET | /api/timeblocks |
时间块列表 |
| GET | /api/timeblocks/weekly |
每周概览 |
| PUT | /api/timeblocks/{id} |
更新时间块 |
| DELETE | /api/timeblocks/{id} |
删除时间块 |
| POST | /api/schedule/generate |
生成调度 |
| GET | /api/schedule |
查询调度范围 |
| GET | /api/schedule/unschedulable |
不可调度子任务 |
- 构建依赖图 — 以子任务为节点,构建邻接表
- Kahn 拓扑排序 — 生成线性执行顺序
- 优先级排序 — 就绪队列按优先级 ASC + ID 排序
- 时间块展开 — 将周期性/一次性时间块展开为连续时间段(默认 84 天窗口)
- 贪心分配 — 按时间顺序遍历槽位,分配首个适配的子任务
- 拆分支持 — 超长子任务可拆分到多个不连续槽位,周视图标注 "(1/3)" 等
- 不可调度报告 — 无法安排的子任务名称随结果返回
- 主色调:
#cc785c(珊瑚) - 背景:
#faf9f5(奶油色) - 深色表面:
#181715(深海军蓝) - 圆角: 6px / 8px / 12px / 16px / 9999px
- 间距基座: 4px(xxs: 4, xs: 8, sm: 12, md: 16, lg: 24, xl: 32, xxl: 48)
- 字体: Copernicus(展示)+ StyreneB(正文)+ JetBrains Mono(代码)