# crew-todolist **Repository Path**: lainyu/crew-todolist ## Basic Information - **Project Name**: crew-todolist - **Description**: 专注于任务管理与协作的开源项目,提供高效、灵活的任务列表解决方案,支持跨平台使用,助力团队提升 productivity。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-05-30 - **Last Updated**: 2025-06-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # TODO List TODO-list是一个高度可自定义的对最近一两周时间的todo list定义和管理网页。 - 技术栈:该项目是一个nextjs为技术栈的项目,sqlite3作为数据库。 - 功能: - 用户需要进行简单注册,注册和登录数据连接到casdoor:http://192.168.41.62:8000/ - 可新建项目,并定义项目参与用户,项目对参与用户公开 - 每个项目可自定义todo-list背景颜色 - todo-list分为"待完成","进行中","待测试","已完成"四个模块,每个模块之间的内容可拖拽 - 每一条todo需要显示的信息:created_at, created_by, content, tags, assigned_to ## ✨ 项目特性 ### 🔐 用户认证与权限管理 - **统一认证**:集成Casdoor SSO单点登录系统 - **个性化配置**:每个用户拥有独特的个人颜色主题 - **权限控制**:基于项目成员的访问权限管理 ### 📊 仪表盘与项目概览 - **项目统计**:实时显示每个项目的任务完成情况 - **动态进度条**:可视化展示项目完成率 - **状态分布**:清晰显示待完成、进行中、待测试、已完成的任务数量 - **快速导航**:一键进入项目或管理项目 ### 🎯 项目管理 - **项目创建**:支持创建多个独立项目 - **成员管理**:邀请和管理项目团队成员 - **项目删除**:安全的项目删除确认机制 - **权限验证**:确保只有授权用户可以访问项目 ### 📋 任务管理 - **四阶段工作流**:待完成 → 进行中 → 待测试 → 已完成 - **拖拽操作**:直观的拖拽界面更新任务状态 - **任务创建**:快速创建和分配任务 - **任务编辑**:双击任务进行编辑修改 - **任务删除**:安全的任务删除确认 ### 🏷️ 标签与分类 - **多标签支持**:为任务添加多个分类标签 - **视觉区分**:标签使用不同颜色进行视觉区分 - **快速识别**:通过标签快速识别任务类型 ### 👥 协作功能 - **任务分配**:将任务分配给特定团队成员 - **创建者标识**:清晰显示任务创建者信息 - **成员颜色**:每个成员使用独特颜色进行身份标识 - **团队可见性**:项目内所有成员都可查看任务 ### 🎨 个性化体验 - **用户颜色主题**:所有按钮和界面元素使用用户个人颜色 - **一致性设计**:整个应用保持颜色主题的一致性 - **视觉反馈**:悬停和交互状态的动态颜色变化 ### 📱 响应式设计 - **多设备支持**:完美适配桌面、平板、手机等设备 - **侧边栏控制**:可折叠的侧边栏导航 - **自适应布局**:根据屏幕大小自动调整列数 ### 🔍 智能显示 - **内容截断**:长文本自动截断为32字符 - **智能提示**:鼠标悬停显示完整内容和创建时间 - **紧凑布局**:优化的卡片间距和内边距 - **清晰边框**:增强的状态栏边框视觉效果 ### 📈 数据统计 - **实时统计**:动态计算项目进度和任务分布 - **可视化图表**:进度条和百分比显示 - **状态分析**:各阶段任务数量统计 ### 🔄 实时同步 - **状态同步**:拖拽更新任务状态立即同步到数据库 - **多用户协作**:支持多用户同时操作同一项目 - **数据一致性**:确保所有用户看到最新的任务状态 ### 🛡️ 数据安全 - **审计日志**:记录所有重要操作的审计信息 - **权限验证**:API层面的严格权限控制 - **数据备份**:SQLite数据库文件便于备份和迁移 ## Docker Compose Standalone 部署 本项目支持使用 Docker Compose 进行独立部署,适合生产环境和局域网访问。 ### 部署步骤 1. **配置环境变量** 复制并编辑环境变量文件: ```bash cp docker/env.docker.example docker/env.docker ``` 编辑 `docker/env.docker` 文件,配置以下参数: 2. **启动服务** ```bash docker-compose -f docker/docker-compose.standalone.yml up -d ``` 3. **查看服务状态** ```bash docker-compose -f docker/docker-compose.standalone.yml ps docker-compose -f docker/docker-compose.standalone.yml logs -f ``` ### 环境变量配置说明 在 `docker/env.docker` 文件中需要配置以下参数: #### Casdoor 认证配置 ```bash CASDOOR_ENDPOINT=http://192.168.41.62:8000 # Casdoor 服务地址 CASDOOR_CLIENT_ID=your_client_id_here # Casdoor 应用客户端 ID CASDOOR_CLIENT_SECRET=your_client_secret_here # Casdoor 应用客户端密钥 CASDOOR_ORGANIZATION_NAME=Agi-Todo # Casdoor 组织名称 CASDOOR_APPLICATION_NAME=Agi-Todo # Casdoor 应用名称 ``` #### 应用访问配置 ```bash NEXTAUTH_URL=http://192.168.120.14:3011 # 应用访问地址(局域网IP) NEXTAUTH_SECRET=your_random_secret_key # NextAuth 密钥(随机字符串) SERVER_IP=192.168.41.62 # 服务器局域网IP地址 TODO_PORT=3000 # TODO 应用端口 ``` #### 数据库配置 ```bash DATABASE_PATH=/app/database/agi-todo.db # SQLite 数据库文件路径 DATABASE_URL=file:/app/database/agi-todo.db # Prisma 数据库连接URL ``` ### 重要配置说明 1. **局域网访问设置** - 将 `NEXTAUTH_URL` 中的IP地址替换为您服务器的实际局域网IP - 确保 `SERVER_IP` 配置正确,用于局域网设备访问 2. **Casdoor配置** - 在Casdoor中创建应用时,回调URL需设置为:`http://your_server_ip:3000/api/auth/callback` - 替换 `your_client_id_here` 和 `your_client_secret_here` 为实际值 3. **安全配置** - `NEXTAUTH_SECRET` 请生成一个安全的随机字符串 - 生产环境建议使用HTTPS并相应调整配置 ### 健康检查和调试 部署完成后,可以访问以下端点检查服务状态: - **健康检查**: `http://your_server_ip:3011/api/health` - **Cookie调试**: `http://your_server_ip:3011/api/debug/cookies` - **应用首页**: `http://your_server_ip:3011` ### 常用操作命令 ```bash # 停止服务 docker-compose -f docker/docker-compose.standalone.yml down # 重新构建镜像 docker-compose -f docker/docker-compose.standalone.yml build --no-cache # 查看日志 docker-compose -f docker/docker-compose.standalone.yml logs -f # 进入容器调试 docker exec -it todo-app-standalone /bin/bash ``` ## 项目结构 ``` todo-list/ ├── app/ # Next.js App Router目录 ├── components/ # React组件 ├── lib/ # 工具函数和配置 ├── types/ # TypeScript类型定义 ├── store/ # Zustand状态管理 ├── package.json # 项目依赖配置 ├── tsconfig.json # TypeScript配置 ├── tailwind.config.js # Tailwind CSS配置 ├── postcss.config.js # PostCSS配置 ├── next.config.js # Next.js配置 └── config.md # 环境变量配置说明 ``` # 数据库设计 数据库位于./database/agi-todo.db。应当包含的核心表有: - todolist - user - audits ``` model User { id Int @id @default(autoincrement()) name String @unique color String @default("#3B82F6") casdoorId String? @unique @map("casdoor_id") email String? avatar String? createdAt DateTime @default(now()) @map("created_at") audits Audit[] assignedTodos TodoList[] @relation("TodoAssignee") createdTodos TodoList[] @relation("TodoCreator") userProjectLinks UserProjectLink[] @@map("user") } model Project { id Int @id @default(autoincrement()) name String description String createdAt DateTime @default(now()) @map("created_at") audits Audit[] todoProjectLinks TodoProjectLink[] userProjectLinks UserProjectLink[] @@map("project") } model TodoList { id Int @id @default(autoincrement()) content String createdBy Int @map("created_by") tags String? status String @default("待完成") assignedTo Int? @map("assigned_to") archived Boolean @default(false) createdAt DateTime @default(now()) @map("created_at") audits Audit[] todoProjectLinks TodoProjectLink[] assignee User? @relation("TodoAssignee", fields: [assignedTo], references: [id]) creator User @relation("TodoCreator", fields: [createdBy], references: [id]) @@map("todolist") } model TodoProjectLink { id Int @id @default(autoincrement()) todolistId Int @map("todolist_id") projectId Int @map("project_id") project Project @relation(fields: [projectId], references: [id], onDelete: Cascade) todolist TodoList @relation(fields: [todolistId], references: [id], onDelete: Cascade) @@unique([todolistId, projectId]) @@map("todo_project_link") } model UserProjectLink { id Int @id @default(autoincrement()) userId Int @map("user_id") projectId Int @map("project_id") project Project @relation(fields: [projectId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([userId, projectId]) @@map("user_project_link") } model Audit { id Int @id @default(autoincrement()) projectId Int? @map("project_id") todolistId Int? @map("todolist_id") userId Int @map("user_id") action String createdAt DateTime @default(now()) @map("created_at") user User @relation(fields: [userId], references: [id]) todolist TodoList? @relation(fields: [todolistId], references: [id]) project Project? @relation(fields: [projectId], references: [id]) @@map("audits") } ``` ### 关于audits说明 audit主要用于记录user一些重要的操作,例如 project 生成,删除,修改, 对于todo task,需要记录user的操作,例如update, delete. 这些信息应该用json格式表达。 以下是一些例子: ```json { "type": "todo", "id": 5, "user": "xxx", "act": "update", "fieldsChanged": ["status"], "oldValue": { "status": "进行中" }, "newValue": { "status": "待测试" }, "time": "2025-05-28T09:04:17.952Z" } ``` # Web UI ## Dashboard ![](assets/dashboard.png) ## Todolist ![](assets/todolist.png)