如何在Golang中开发基础的日程管理应用

来源:编程学习作者:梦乃头衔:网络博主
导读:本期聚焦于小伙伴创作的《如何在Golang中开发基础的日程管理应用》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何在Golang中开发基础的日程管理应用》有用,将其分享出去将是对创作者最好的鼓励。

在Golang中开发基础的日程管理应用,核心是实现日程的增删改查功能,同时保证应用的稳定性和易用性。整个开发过程可以分为需求梳理、环境准备、核心功能实现、接口开发几个部分,下面逐步展开说明。

如何在Golang中开发基础的日程管理应用

需求与功能规划

基础的日程管理应用需要支持以下核心功能:

  • 新增日程,包含日程标题、内容、开始时间、结束时间、提醒状态等字段
  • 查询所有日程,支持按时间范围筛选
  • 修改已有日程的信息
  • 删除不需要的日程
  • 标记日程的完成状态

环境准备与依赖安装

首先需要安装Golang环境,建议使用1.19及以上版本。然后初始化项目并安装必要的依赖:

# 初始化项目
go mod init schedule_app
# 安装MySQL驱动和Web框架依赖
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
go get -u github.com/gin-gonic/gin

数据结构与数据库设计

首先定义日程的数据结构,使用Golang的结构体对应数据库表字段:

package model

import (
    "time"
    "gorm.io/gorm"
)

// Schedule 日程结构体
type Schedule struct {
    gorm.Model
    Title       string    `json:"title" gorm:"type:varchar(100);not null"` // 日程标题
    Content     string    `json:"content" gorm:"type:text"`                // 日程内容
    StartTime   time.Time `json:"start_time"`                              // 开始时间
    EndTime     time.Time `json:"end_time"`                                // 结束时间
    IsRemind    bool      `json:"is_remind" gorm:"default:false"`          // 是否提醒
    IsFinished  bool      `json:"is_finished" gorm:"default:false"`        // 是否完成
}

对应的MySQL表结构可以通过GORM自动迁移生成,也可以手动创建,核心字段如下:

字段名类型说明
idint主键,自增
titlevarchar(100)日程标题
contenttext日程内容
start_timedatetime开始时间
end_timedatetime结束时间
is_remindtinyint(1)是否提醒,0否1是
is_finishedtinyint(1)是否完成,0否1是
created_atdatetime创建时间
updated_atdatetime更新时间
deleted_atdatetime删除时间,用于软删除

数据库连接初始化

创建数据库连接工具函数,初始化GORM的MySQL连接:

package config

import (
    "fmt"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

var DB *gorm.DB

// InitDB 初始化数据库连接
func InitDB() error {
    dsn := "root:password@tcp(127.0.0.1:3306)/schedule_db?charset=utf8mb4&parseTime=True&loc=Local"
    var err error
    DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        return fmt.Errorf("数据库连接失败: %v", err)
    }
    // 自动迁移表结构
    err = DB.AutoMigrate(&model.Schedule{})
    if err != nil {
        return fmt.Errorf("表迁移失败: %v", err)
    }
    return nil
}

核心业务逻辑实现

新增日程

实现新增日程的业务逻辑,处理参数校验和数据库写入:

package service

import (
    "errors"
    "schedule_app/config"
    "schedule_app/model"
    "time"
)

// CreateSchedule 新增日程
func CreateSchedule(title, content string, startTime, endTime time.Time, isRemind bool) (*model.Schedule, error) {
    if title == "" {
        return nil, errors.New("日程标题不能为空")
    }
    if startTime.After(endTime) {
        return nil, errors.New("开始时间不能晚于结束时间")
    }
    schedule := model.Schedule{
        Title:     title,
        Content:   content,
        StartTime: startTime,
        EndTime:   endTime,
        IsRemind:  isRemind,
    }
    result := config.DB.Create(&schedule)
    if result.Error != nil {
        return nil, result.Error
    }
    return &schedule, nil
}

查询日程

实现查询日程的功能,支持按时间范围筛选:

// GetSchedules 查询日程列表,支持按开始时间范围筛选
func GetSchedules(start, end *time.Time) ([]model.Schedule, error) {
    var schedules []model.Schedule
    query := config.DB
    if start != nil {
        query = query.Where("start_time >= ?", *start)
    }
    if end != nil {
        query = query.Where("end_time <= ?", *end)
    }
    result := query.Find(&schedules)
    if result.Error != nil {
        return nil, result.Error
    }
    return schedules, nil
}

修改与删除日程

修改和删除日程的实现逻辑如下:

// UpdateSchedule 修改日程信息
func UpdateSchedule(id uint, title, content string, startTime, endTime time.Time, isRemind, isFinished bool) (*model.Schedule, error) {
    var schedule model.Schedule
    result := config.DB.First(&schedule, id)
    if result.Error != nil {
        return nil, errors.New("日程不存在")
    }
    if title != "" {
        schedule.Title = title
    }
    schedule.Content = content
    schedule.StartTime = startTime
    schedule.EndTime = endTime
    schedule.IsRemind = isRemind
    schedule.IsFinished = isFinished
    config.DB.Save(&schedule)
    return &schedule, nil
}

// DeleteSchedule 删除日程,使用软删除
func DeleteSchedule(id uint) error {
    result := config.DB.Delete(&model.Schedule{}, id)
    if result.Error != nil {
        return result.Error
    }
    if result.RowsAffected == 0 {
        return errors.New("日程不存在")
    }
    return nil
}

RESTful接口开发

使用Gin框架开发对外接口,将业务逻辑暴露为HTTP接口:

package main

import (
    "net/http"
    "schedule_app/config"
    "schedule_app/service"
    "time"

    "github.com/gin-gonic/gin"
)

func main() {
    // 初始化数据库
    err := config.InitDB()
    if err != nil {
        panic(err)
    }
    r := gin.Default()
    // 新增日程接口
    r.POST("/schedules", func(c *gin.Context) {
        var req struct {
            Title     string    `json:"title" binding:"required"`
            Content   string    `json:"content"`
            StartTime time.Time `json:"start_time" binding:"required"`
            EndTime   time.Time `json:"end_time" binding:"required"`
            IsRemind  bool      `json:"is_remind"`
        }
        if err := c.ShouldBindJSON(&req); err != nil {
            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            return
        }
        schedule, err := service.CreateSchedule(req.Title, req.Content, req.StartTime, req.EndTime, req.IsRemind)
        if err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
            return
        }
        c.JSON(http.StatusOK, schedule)
    })
    // 查询日程接口
    r.GET("/schedules", func(c *gin.Context) {
        startTimeStr := c.Query("start_time")
        endTimeStr := c.Query("end_time")
        var start, end *time.Time
        if startTimeStr != "" {
            t, _ := time.Parse("2006-01-02 15:04:05", startTimeStr)
            start = &t
        }
        if endTimeStr != "" {
            t, _ := time.Parse("2006-01-02 15:04:05", endTimeStr)
            end = &t
        }
        schedules, err := service.GetSchedules(start, end)
        if err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
            return
        }
        c.JSON(http.StatusOK, schedules)
    })
    // 修改日程接口
    r.PUT("/schedules/:id", func(c *gin.Context) {
        id := c.Param("id")
        var req struct {
            Title     string    `json:"title"`
            Content   string    `json:"content"`
            StartTime time.Time `json:"start_time"`
            EndTime   time.Time `json:"end_time"`
            IsRemind  bool      `json:"is_remind"`
            IsFinished bool     `json:"is_finished"`
        }
        if err := c.ShouldBindJSON(&req); err != nil {
            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            return
        }
        schedule, err := service.UpdateSchedule(id, req.Title, req.Content, req.StartTime, req.EndTime, req.IsRemind, req.IsFinished)
        if err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
            return
        }
        c.JSON(http.StatusOK, schedule)
    })
    // 删除日程接口
    r.DELETE("/schedules/:id", func(c *gin.Context) {
        id := c.Param("id")
        err := service.DeleteSchedule(id)
        if err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
            return
        }
        c.JSON(http.StatusOK, gin.H{"message": "删除成功"})
    })
    r.Run(":8080")
}

优化与扩展建议

基础功能实现后,还可以做以下优化:

  • 添加参数校验中间件,统一处理请求参数的合法性校验
  • 利用goroutine实现定时提醒功能,到日程开始时间时发送通知
  • 添加用户认证模块,支持多用户的日程管理
  • 增加日程分类功能,支持按分类筛选日程
  • 添加接口限流,避免接口被恶意调用

整个开发过程用到的都是Golang的基础特性,通过合理的模块拆分,可以让代码结构更清晰,也方便后续扩展功能。如果需要添加更复杂的业务逻辑,只需要在现有基础上新增对应的服务和接口即可。

Golang日程管理应用goroutineMySQLRESTful_API修改时间:2026-07-04 15:00:49

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。