完成
This commit is contained in:
275
golang-learning/10-projects/02-todo-list/main.go
Normal file
275
golang-learning/10-projects/02-todo-list/main.go
Normal file
@@ -0,0 +1,275 @@
|
||||
/*
|
||||
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("再见!")
|
||||
}
|
Reference in New Issue
Block a user