Files
golang/golang-learning/10-projects/02-todo-list/main.go
2025-08-24 13:01:09 +08:00

276 lines
6.0 KiB
Go

/*
main.go - 待办事项列表主程序
这是一个命令行待办事项管理程序,演示了 Go 语言的综合应用
*/
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"./todo"
"./ui"
)
func main() {
// 创建任务管理器
manager, err := todo.NewManager("data/todos.json")
if err != nil {
fmt.Printf("❌ 初始化失败: %v\n", err)
os.Exit(1)
}
// 加载现有数据
if err := manager.Load(); err != nil {
fmt.Printf("⚠️ 加载数据失败: %v\n", err)
}
// 创建命令行界面
cli := ui.NewCLI()
scanner := bufio.NewScanner(os.Stdin)
// 显示欢迎信息
cli.ShowWelcome()
// 主循环
for {
fmt.Print("> ")
// 读取用户输入
if !scanner.Scan() {
break
}
input := strings.TrimSpace(scanner.Text())
if input == "" {
continue
}
// 解析命令
parts := strings.Fields(input)
command := strings.ToLower(parts[0])
// 执行命令
switch command {
case "add":
handleAdd(manager, cli, parts[1:])
case "list", "ls":
handleList(manager, cli, parts[1:])
case "done", "complete":
handleDone(manager, cli, parts[1:])
case "delete", "del", "rm":
handleDelete(manager, cli, parts[1:])
case "edit", "update":
handleEdit(manager, cli, parts[1:])
case "search", "find":
handleSearch(manager, cli, parts[1:])
case "stats", "statistics":
handleStats(manager, cli)
case "help", "h":
cli.ShowHelp()
case "quit", "exit", "q":
handleQuit(manager, cli)
return
case "clear":
cli.Clear()
default:
cli.ShowError(fmt.Sprintf("未知命令: %s", command))
cli.ShowInfo("输入 'help' 查看可用命令")
}
}
// 检查扫描器错误
if err := scanner.Err(); err != nil {
fmt.Printf("❌ 读取输入时发生错误: %v\n", err)
}
}
// handleAdd 处理添加任务命令
func handleAdd(manager *todo.Manager, cli *ui.CLI, args []string) {
if len(args) == 0 {
cli.ShowError("请提供任务内容")
cli.ShowInfo("用法: add <任务内容>")
return
}
content := strings.Join(args, " ")
task, err := manager.AddTask(content)
if err != nil {
cli.ShowError(fmt.Sprintf("添加任务失败: %v", err))
return
}
cli.ShowSuccess(fmt.Sprintf("任务已添加: %s (ID: %d)", task.Content, task.ID))
// 保存数据
if err := manager.Save(); err != nil {
cli.ShowError(fmt.Sprintf("保存数据失败: %v", err))
}
}
// handleList 处理列出任务命令
func handleList(manager *todo.Manager, cli *ui.CLI, args []string) {
var filter string
if len(args) > 0 {
filter = strings.ToLower(args[0])
}
tasks := manager.GetTasks()
// 应用过滤器
var filteredTasks []todo.Task
switch filter {
case "done", "completed":
for _, task := range tasks {
if task.Completed {
filteredTasks = append(filteredTasks, task)
}
}
case "pending", "todo":
for _, task := range tasks {
if !task.Completed {
filteredTasks = append(filteredTasks, task)
}
}
default:
filteredTasks = tasks
}
if len(filteredTasks) == 0 {
if filter != "" {
cli.ShowInfo(fmt.Sprintf("没有找到 %s 状态的任务", filter))
} else {
cli.ShowInfo("暂无任务")
}
return
}
cli.ShowTaskList(filteredTasks)
}
// handleDone 处理完成任务命令
func handleDone(manager *todo.Manager, cli *ui.CLI, args []string) {
if len(args) == 0 {
cli.ShowError("请提供任务ID")
cli.ShowInfo("用法: done <任务ID>")
return
}
id, err := strconv.Atoi(args[0])
if err != nil {
cli.ShowError("无效的任务ID")
return
}
task, err := manager.CompleteTask(id)
if err != nil {
cli.ShowError(fmt.Sprintf("完成任务失败: %v", err))
return
}
cli.ShowSuccess(fmt.Sprintf("任务已完成: %s", task.Content))
// 保存数据
if err := manager.Save(); err != nil {
cli.ShowError(fmt.Sprintf("保存数据失败: %v", err))
}
}
// handleDelete 处理删除任务命令
func handleDelete(manager *todo.Manager, cli *ui.CLI, args []string) {
if len(args) == 0 {
cli.ShowError("请提供任务ID")
cli.ShowInfo("用法: delete <任务ID>")
return
}
id, err := strconv.Atoi(args[0])
if err != nil {
cli.ShowError("无效的任务ID")
return
}
task, err := manager.DeleteTask(id)
if err != nil {
cli.ShowError(fmt.Sprintf("删除任务失败: %v", err))
return
}
cli.ShowSuccess(fmt.Sprintf("任务已删除: %s", task.Content))
// 保存数据
if err := manager.Save(); err != nil {
cli.ShowError(fmt.Sprintf("保存数据失败: %v", err))
}
}
// handleEdit 处理编辑任务命令
func handleEdit(manager *todo.Manager, cli *ui.CLI, args []string) {
if len(args) < 2 {
cli.ShowError("请提供任务ID和新内容")
cli.ShowInfo("用法: edit <任务ID> <新内容>")
return
}
id, err := strconv.Atoi(args[0])
if err != nil {
cli.ShowError("无效的任务ID")
return
}
newContent := strings.Join(args[1:], " ")
task, err := manager.UpdateTask(id, newContent)
if err != nil {
cli.ShowError(fmt.Sprintf("编辑任务失败: %v", err))
return
}
cli.ShowSuccess(fmt.Sprintf("任务已更新: %s", task.Content))
// 保存数据
if err := manager.Save(); err != nil {
cli.ShowError(fmt.Sprintf("保存数据失败: %v", err))
}
}
// handleSearch 处理搜索任务命令
func handleSearch(manager *todo.Manager, cli *ui.CLI, args []string) {
if len(args) == 0 {
cli.ShowError("请提供搜索关键词")
cli.ShowInfo("用法: search <关键词>")
return
}
keyword := strings.Join(args, " ")
tasks := manager.SearchTasks(keyword)
if len(tasks) == 0 {
cli.ShowInfo(fmt.Sprintf("没有找到包含 '%s' 的任务", keyword))
return
}
cli.ShowInfo(fmt.Sprintf("搜索结果 (关键词: %s):", keyword))
cli.ShowTaskList(tasks)
}
// handleStats 处理统计信息命令
func handleStats(manager *todo.Manager, cli *ui.CLI) {
stats := manager.GetStatistics()
cli.ShowStatistics(stats)
}
// handleQuit 处理退出命令
func handleQuit(manager *todo.Manager, cli *ui.CLI) {
// 保存数据
if err := manager.Save(); err != nil {
cli.ShowError(fmt.Sprintf("保存数据失败: %v", err))
}
cli.ShowInfo("数据已保存")
cli.ShowSuccess("再见!")
}