在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自动迁移生成,也可以手动创建,核心字段如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | int | 主键,自增 |
| title | varchar(100) | 日程标题 |
| content | text | 日程内容 |
| start_time | datetime | 开始时间 |
| end_time | datetime | 结束时间 |
| is_remind | tinyint(1) | 是否提醒,0否1是 |
| is_finished | tinyint(1) | 是否完成,0否1是 |
| created_at | datetime | 创建时间 |
| updated_at | datetime | 更新时间 |
| deleted_at | datetime | 删除时间,用于软删除 |
数据库连接初始化
创建数据库连接工具函数,初始化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