276 lines
6.0 KiB
Go
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("再见!")
|
|
}
|