gorm+gin 教务管理系统

gorm+gin 教务管理系统

搭建环境

gin框架下载

go get -u github.com/gin-gonic/gin 下载gin框架

gorm框架下载

go get gorm.io/driver/mysql
go get gorm.io/gorm

数据库搭建

create database school_go default charset=utf8;

创建指定数据库用户

create user "123" identified by '123';
grant all privileges on school_go.* to '123'@'%';
flush privileges;

拆分业务

根目录下新建main.go函数 作为项目总入口

package main

import "main/router"

func main() {
   r := router.Router()
   _ = r.Run("0.0.0.0:8080")
}

在根路径下创建router目录

里面新建app.go文件

package router

import (
	"github.com/gin-gonic/gin"
	"main/service"
)

func Router() *gin.Engine {
	router := gin.Default()

	router.GET("/ping", service.Ping)

	return router
}

在根路径下创建service目录 业务逻辑就写在这里

package service

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

func Ping(c *gin.Context) {
   c.JSON(200, gin.H{
      "message": "pong",
   })

}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LKwe5n5y-1682330141324)(教务管理系统.assets/image-20230420174809720.png)]

设计数据库

连接数据库

在根目录下新建一个models目录

里面新建一个init.go文件 用来连接数据库

package models

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

var DB *gorm.DB

func init() {
   username := "123"     //账号
   password := "123"     //密码
   host := "127.0.0.1"   //数据库地址,可以是Ip或者域名
   port := 3306          //数据库端口
   Dbname := "school_go" //数据库名
   timeout := "10s"      //连接超时,10秒

   // username:password@tcp(127.0.0.1:3306)/gorm?
   dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&timeout=%s",
      username, password, host, port, Dbname, timeout)
   //连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。
   db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
   if err != nil {
      panic("连接数据库失败, error=" + err.Error())
   }
   // 连接成功
   DB = db
}

设计数据库表结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TNFjiLdx-1682330141325)(教务管理系统.assets/image-20230424170931797.png)]

在models中新建这样的文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DqEE2jjD-1682330141326)(教务管理系统.assets/image-20230421152349705.png)]

class.go
package models

import "gorm.io/gorm"

// 班级表
type Class struct {
	gorm.Model
	Name              string             `gorm:"type:VARCHAR(16);COMMENT:班级名称" json:"name" form:"name"`
	Students          []Student          `gorm:"foreignKey:class_id;references:id" `
	Course_selections []Course_selection `gorm:"foreignKey:class_id;references:id"`
}

course.go
package models

import "gorm.io/gorm"

// 课程表
type Course struct {
	gorm.Model
	Name              string             `gorm:"type:VARCHAR(16);COMMENT:课程名" json:"name" form:"name"`
	Hour              int                `gorm:"type:INT;COMMENT:学时" json:"hour"  form:"hour"`
	Credit            int                `gorm:"type:INT;COMMENT:学分" json:"credit"  form:"credit"`
	Course_selections []Course_selection `gorm:"foreignKey:course_id;references:id" json:"course_selections"`
}

course_selection.go
package models

import "gorm.io/gorm"

// 选课表
type Course_selection struct {
	gorm.Model
	Positon    string  `gorm:"type:VARCHAR(32);COMMENT:上课地点" json:"position" form:"position"`
	Time       string  `gorm:"type:VARCHAR(32);COMMENT:上课时间"  json:"time" form:"time"`
	Class_id   uint    `gorm:"tpye:BIGINT;COMMENT:外键关联班级表" json:"class_id" form:"class_id"`
	Course_id  uint    `gorm:"tpye:BIGINT;COMMENT:外键关联课程表" json:"course_id" form:"course_id"`
	Teacher_id uint    `gorm:"tpye:BIGINT;COMMENT:外键关联教师表" json:"teacher_id" form:"teacher_id"`
	Exam       Exam    `gorm:"foreignKey:course_selection_id;references:id" json:"exam"`
	Grades     []Grade `gorm:"foreignKey:course_id;references:id" json:"grades"`
}

department.go
package models

import "gorm.io/gorm"

// 部门表(系表)
type Department struct {
	gorm.Model
	Name          string         `gorm:"type:VARCHAR(16);COMMENT:二级学院名称" json:"name" form:"name" binding:"required"`
	Location      string         `gorm:"type:VARCHAR(32);COMMENT:地址" json:"location" form:"location"`
	Professionals []Professional `gorm:"foreignKey:Department_id;references:id" json:"professionals" `
	Teachers      []Teacher      `gorm:"foreignKey:Department_id;references:id" json:"teachers" `
}

exam.go
package models

import "gorm.io/gorm"

// 考试安排表
type Exam struct {
	gorm.Model
	Exam_data           string `gorm:"type:DATE;COMMENT:考试时间 格式:2023-03-24" json:"exam_data"  form:"exam_data"`
	Start_time          string `gorm:"type:TIME;COMMENT:开考时间 格式:2023-04-24 12:26:53" json:"start_time"  form:"start_time"`
	End_time            string `gorm:"type:TIME;COMMENT:结束时间 格式:2023-04-24 12:26:53" json:"end_time" form:"end_time"`
	Position            string `gorm:"type:VARCHAR(32);COMMENT:考点" json:"position" form:"position"`
	Course_selection_id uint   `gorm:"type:BIGINT;COMMENT:外键关联课程选择表"  form:"course_selection_id"`
}

grade.go
package models

import "gorm.io/gorm"

// 成绩表
type Grade struct {
	gorm.Model
	Score      int  `gorm:"type:INT;COMMENT:得分" json:"score" form:"score"`
	Student_id uint `gorm:"type:BIGINT;COMMENT:外键关联学生表" json:"student_id"  form:"student_id"`
	Course_id  uint `gorm:"type:BIGINT;COMMENT:外键关联选课表" json:"course_id"  form:"course_id"` //关联的是选课表
}

professional.go
package models

import "gorm.io/gorm"

// 专业表
type Professional struct {
	gorm.Model
	Name          string    `gorm:"type:VARCHAR(16);COMMENT:专业名;" json:"name" form:"name"`
	Department_id uint      `gorm:"type:BIGINT;COMMENT:外键关联部门表" json:"department_id" form:"department_id"`
	Students      []Student `gorm:"foreignKey:professional_id;references:id" json:"students"`
}

student.go
package models

import "gorm.io/gorm"

// 学生表
type Student struct {
	gorm.Model
	Name            string  `gorm:"type:VARCHAR(16);COMMENT:姓名;" json:"name" form:"name"`
	Age             int     `gorm:"type:TINYINT(3);COMMENT:分类id;" json:"age" form:"age" `
	Gender          int     `gorm:"type:TINYINT(1);COMMENT:性别 0-女 1-男 " json:"gender"  form:"gender"`
	Class_id        uint    `gorm:"type:BIGINT;COMMENT:外键关联课程表" json:"class_id"  form:"class_id"`
	Professional_id uint    `gorm:"type:BIGINT;COMMENT:外键关联专业表" json:"professional_id"  form:"professional_id"`
	Grades          []Grade `gorm:"foreignKey:Student_id;references:ID" `
}

teacher.go
package models

import "gorm.io/gorm"

// 教师表
type Teacher struct {
	gorm.Model
	Name              string             `gorm:"type:VARCHAR(16);COMMENT:教师名" json:"name" form:"name"`
	Age               int                `gorm:"type:TINYINT(3);COMMENT:年龄" json:"age" form:"age"`
	Education         string             `gorm:"VARCHAR(32);COMMENT:学历" json:"education" form:"education"`
	Title             string             `gorm:"VARCHAR(16);COMMENT:职称"  json:"title" form:"title"`
	Gender            int                `gorm:"TINYINT(1);COMMENT:性别 0-女 1-男" json:"gender" form:"gender"`
	Department_id     uint               `gorm:"type:BIGINT;COMMENT:外键关联部门表" json:"department_id" form:"department_id"`
	Course_selections []Course_selection `gorm:"foreignKey:teacher_id;references:id" json:"course_selections"`
}

迁移数据库表结构

修改models/init.go文件

package models

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

var DB = Init()

func migrate(db *gorm.DB) {
	err := db.AutoMigrate(&Department{}, &Professional{}, &Teacher{})
	err = db.AutoMigrate(&Professional{}, &Class{}, &Student{})
	err = db.AutoMigrate(&Teacher{}, &Class{}, &Course{}, &Course_selection{})
	err = db.AutoMigrate(&Course_selection{}, &Exam{})
	err = db.AutoMigrate(&Course_selection{}, &Student{}, &Grade{})

	if err != nil {
		fmt.Println(err)
		return
	}
}
func Init() *gorm.DB {
	username := "123"     //账号
	password := "123"     //密码
	host := "127.0.0.1"   //数据库地址,可以是Ip或者域名
	port := 3306          //数据库端口
	Dbname := "school_go" //数据库名
	timeout := "10s"      //连接超时,10秒

	// username:password@tcp(127.0.0.1:3306)/gorm?
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&timeout=%s",
		username, password, host, port, Dbname, timeout)
	//连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic("连接数据库失败, error=" + err.Error())
	}
	// 连接成功
	//数据迁移 生成数据库
	migrate(db)
	return db
}

使用swag

下载gin-swagger

go install github.com/swaggo/swag/cmd/swag@latest 
swag init
go get -u github.com/swaggo/gin-swagger
go get -u github.com/swaggo/files

修改主函数main.go

package main

import (
   swaggerfiles "github.com/swaggo/files"
   ginSwagger "github.com/swaggo/gin-swagger"
   "main/docs"
   "main/router"
)

func main() {
   r := router.Router()
// 将SwaggerInfo的BasePath设置为空字符串
docs.SwaggerInfo.BasePath = ""
// 将GET请求与Swagger UI的处理程序进行包装
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerfiles.Handler))
   _ = r.Run("0.0.0.0:8080")
}

设计业务

新建一个define路径下的define.go

存放默认值

package define

const (
   DefaultPage = "1"
   DefaultSize = "20"
)

service路径下每个模块创建一个go文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DipcAJl8-1682330141326)(教务管理系统.assets/image-20230424171122179.png)]

班级

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AKrRcdFD-1682330141327)(教务管理系统.assets/image-20230424164857963.png)]

package service

import (
   "fmt"
   "github.com/gin-gonic/gin"
   "log"
   "main/define"
   "main/models"
   "net/http"
   "strconv"
)

// ClassDetail
// @Tags 班级
// @Summary 班级详细
// @Param int query int true "id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /class/detail [get]
func ClassDetail(c *gin.Context) {
   ID := c.Query("id")
   data := new(models.Class)
   err := models.DB.First(data, ID).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("ID not found:" + err.Error()),
      })
      return
   }
   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "data": data,
   })
}

// ClassCreate
// @Tags 班级
// @Summary 班级创建
// @Param name formData string true "name"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /class/create [post]
func ClassCreate(c *gin.Context) {
   var classdata models.Class
   err := c.ShouldBind(&classdata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("binding failed:" + err.Error()),
      })
      return
   }
   err = models.DB.Create(&classdata).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("class create error:" + err.Error()),
      })
      return
   }
   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "data": "班级创建成功",
   })
}

// ClassModify
// @Tags 班级
// @Summary 班级修改
// @Param id query int true "id"
// @Param name formData string false "name"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /class/update [put]
func ClassModify(c *gin.Context) {
   var classdata models.Class
   ID := c.Query("id")
   err := c.ShouldBind(&classdata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("binding failed:" + err.Error()),
      })
      return
   }

   beforedata := new(models.Class)
   err = models.DB.First(beforedata, ID).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("ID not found:" + err.Error()),
      })
      return
   }

   models.DB.Model(beforedata).Updates(&classdata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("class update error:" + err.Error()),
      })
      return
   }

   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "msg":  "修改成功",
   })
}

// ClassDelete
// @Tags 班级
// @Summary 班级删除
// @Param id query int true "id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /class/delete [delete]
func ClassDelete(c *gin.Context) {
   ID := c.Query("id")
   data := new(models.Class)
   err := models.DB.First(data, ID).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("ID not found:" + err.Error()),
      })
      return
   }

   err = models.DB.Delete(data).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("class delete error:" + err.Error()),
      })
      return
   }

   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "msg":  "删除成功",
   })
}

// GetClassList
// @Tags 班级
// @Summary 班级列表
// @Param page query int false "page"
// @Param size query int false "size"
// @Param keyword query string false "keyword"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /class/list [get]
func GetClassList(c *gin.Context) {
   size, _ := strconv.Atoi(c.DefaultQuery("size", define.DefaultSize))
   page, err := strconv.Atoi(c.DefaultQuery("page", define.DefaultPage))

   if err != nil {
      log.Println("GetClassList Page strconv Error:", err)
      return
   }
   page = (page - 1) * size
   keyword := c.Query("keyword")
   var count int64
   var list = make([]models.Class, 0)

   err = models.DB.Model(new(models.Class)).Preload("Students").Preload("Course_selections").
      Count(&count).Offset(page).Limit(size).
      Where("name like ?", "%"+keyword+"%").Find(&list).Error

   if err != nil {
      log.Println("Get Class List Error", err)
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  "Get Class List Error" + err.Error(),
      })
      return
   }

   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "data": map[string]interface{}{
         "list":  list,
         "count": count,
      },
   })
}

课程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u3bMm4C8-1682330141327)(教务管理系统.assets/image-20230424165903313.png)]

package service

import (
   "fmt"
   "github.com/gin-gonic/gin"
   "log"
   "main/define"
   "main/models"
   "net/http"
   "strconv"
)

// CourseDetail
// @Tags 课程
// @Summary 课程详细
// @Param int query int true "id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /course/detail [get]
func CourseDetail(c *gin.Context) {
   ID := c.Query("id")
   data := new(models.Course)
   err := models.DB.First(data, ID).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("ID not found:" + err.Error()),
      })
      return
   }
   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "data": data,
   })
}

// CourseCreate
// @Tags 课程
// @Summary 课程创建
// @Param name formData string true "name"
// @Param hour formData int true "hour"
// @Param credit formData int true "credit"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /course/create [post]
func CourseCreate(c *gin.Context) {
   var Coursedata models.Course
   err := c.ShouldBind(&Coursedata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("binding failed:" + err.Error()),
      })
      return
   }
   err = models.DB.Create(&Coursedata).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("Course create error:" + err.Error()),
      })
      return
   }
   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "data": "课程创建成功",
   })
}

// CourseModify
// @Tags 课程
// @Summary 课程修改
// @Param id query int true "id"
// @Param name formData string true "name"
// @Param hour formData int true "hour"
// @Param credit formData int true "credit"
// @Param prerequisite_id formData string false "prerequisite_id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /course/update [put]
func CourseModify(c *gin.Context) {
   var Coursedata models.Course
   ID := c.Query("id")
   err := c.ShouldBind(&Coursedata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("binding failed:" + err.Error()),
      })
      return
   }

   beforedata := new(models.Course)
   err = models.DB.First(beforedata, ID).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("ID not found:" + err.Error()),
      })
      return
   }

   models.DB.Model(beforedata).Updates(&Coursedata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("Course update error:" + err.Error()),
      })
      return
   }

   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "msg":  "修改成功",
   })
}

// CourseDelete
// @Tags 课程
// @Summary 课程删除
// @Param id query int true "id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /course/delete [delete]
func CourseDelete(c *gin.Context) {
   ID := c.Query("id")
   data := new(models.Course)
   err := models.DB.First(data, ID).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("ID not found:" + err.Error()),
      })
      return
   }

   err = models.DB.Delete(data).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("Course delete error:" + err.Error()),
      })
      return
   }

   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "msg":  "删除成功",
   })
}

// GetCourseList
// @Tags 课程
// @Summary 课程列表
// @Param page query int false "page"
// @Param size query int false "size"
// @Param keyword query string false "keyword"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /course/list [get]
func GetCourseList(c *gin.Context) {

   size, _ := strconv.Atoi(c.DefaultQuery("size", define.DefaultSize))
   page, err := strconv.Atoi(c.DefaultQuery("page", define.DefaultPage))

   if err != nil {
      log.Println("GetCourseList Page strconv Error:", err)
      return
   }
   page = (page - 1) * size
   keyword := c.Query("keyword")
   var count int64
   var list = make([]models.Course, 0)

   err = models.DB.Model(new(models.Course)).Preload("Course_selections").Count(&count).Offset(page).Limit(size).
      Where("name like ? ", "%"+keyword+"%").
      Find(&list).Error

   if err != nil {
      log.Println("Get Course List Error", err)
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  "Get Course List Error" + err.Error(),
      })
      return
   }

   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "data": map[string]interface{}{
         "list":  list,
         "count": count,
      },
   })
}

课程选择

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SDTaxBwI-1682330141328)(教务管理系统.assets/image-20230424165922429.png)]

package service

import (
   "fmt"
   "github.com/gin-gonic/gin"
   "log"
   "main/define"
   "main/models"
   "net/http"
   "strconv"
)

// Course_selectionDetail
// @Tags 课程选择
// @Summary 课程选择详细
// @Param int query int true "id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /course_selection/detail [get]
func Course_selectionDetail(c *gin.Context) {
   ID := c.Query("id")
   data := new(models.Course_selection)
   err := models.DB.First(data, ID).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("ID not found:" + err.Error()),
      })
      return
   }
   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "data": data,
   })
}

// Course_selectionCreate
// @Tags 课程选择
// @Summary 课程选择创建
// @Param position formData string true "position"
// @Param time formData string true "time"
// @Param class_id formData int true "class_id"
// @Param course_id formData int true "course_id"
// @Param teacher_id formData int true "teacher_id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /course_selection/create [post]
func Course_selectionCreate(c *gin.Context) {
   var Course_selectiondata models.Course_selection
   err := c.ShouldBind(&Course_selectiondata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("binding failed:" + err.Error()),
      })
      return
   }
   err = models.DB.Create(&Course_selectiondata).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("Course_selection create error:" + err.Error()),
      })
      return
   }
   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "data": "课程选择创建成功",
   })
}

// Course_selectionModify
// @Tags 课程选择
// @Summary 课程选择修改
// @Param id query int true "id"
// @Param position formData string false "position"
// @Param time formData string false "time"
// @Param class_id formData int false "class_id"
// @Param course_id formData int false "course_id"
// @Param teacher_id formData int false "teacher_id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /course_selection/update [put]
func Course_selectionModify(c *gin.Context) {
   var Course_selectiondata models.Course_selection
   ID := c.Query("id")
   err := c.ShouldBind(&Course_selectiondata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("binding failed:" + err.Error()),
      })
      return
   }

   beforedata := new(models.Course_selection)
   err = models.DB.First(beforedata, ID).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("ID not found:" + err.Error()),
      })
      return
   }

   models.DB.Model(beforedata).Updates(&Course_selectiondata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("Course_selection update error:" + err.Error()),
      })
      return
   }

   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "msg":  "修改成功",
   })
}

// Course_selectionDelete
// @Tags 课程选择
// @Summary 课程选择删除
// @Param id query int true "id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /course_selection/delete [delete]
func Course_selectionDelete(c *gin.Context) {
   ID := c.Query("id")
   data := new(models.Course_selection)
   err := models.DB.First(data, ID).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("ID not found:" + err.Error()),
      })
      return
   }

   err = models.DB.Delete(data).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("Course_selection delete error:" + err.Error()),
      })
      return
   }

   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "msg":  "删除成功",
   })
}

// GetCourse_selectionList
// @Tags 课程选择
// @Summary 课程选择列表
// @Param page query int false "page"
// @Param size query int false "size"
// @Param keyword query string false "keyword"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /course_selection/list [get]
func GetCourse_selectionList(c *gin.Context) {

   size, _ := strconv.Atoi(c.DefaultQuery("size", define.DefaultSize))
   page, err := strconv.Atoi(c.DefaultQuery("page", define.DefaultPage))

   if err != nil {
      log.Println("GetCourse_selectionList Page strconv Error:", err)
      return
   }
   page = (page - 1) * size
   keyword := c.Query("keyword")
   var count int64
   var list = make([]models.Course_selection, 0)

   err = models.DB.Model(new(models.Course_selection)).Preload("Exam").Preload("Grades").Count(&count).Offset(page).Limit(size).
      Where("Time like ? OR Positon like ?", "%"+keyword+"%", "%"+keyword+"%").
      Find(&list).Error

   if err != nil {
      log.Println("Get Course_selection List Error", err)
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  "Get Course_selection List Error" + err.Error(),
      })
      return
   }

   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "data": map[string]interface{}{
         "list":  list,
         "count": count,
      },
   })
}

部门

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0oyC4iUu-1682330141328)(教务管理系统.assets/image-20230424165945578.png)]

package service

import (
   "fmt"
   "github.com/gin-gonic/gin"
   "log"
   "main/define"
   "main/models"
   "net/http"
   "strconv"
)

// DepartmentCreate
// @Tags 部门
// @Summary 部门创建
// @Param name formData string true "name"
// @Param location formData string true "location"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /department/create [post]
func DepartmentCreate(c *gin.Context) {
   var departmentdata models.Department
   err := c.ShouldBind(&departmentdata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("binding failed:" + err.Error()),
      })
      return
   }
   err = models.DB.Create(&departmentdata).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("department create error:" + err.Error()),
      })
      return
   }
   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "data": "部门创建成功",
   })
}

// DepartmentModify
// @Tags 部门
// @Summary 部门修改
// @Param id query int true "id"
// @Param name formData string false "name"
// @Param location formData string false "location"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /department/update [put]
func DepartmentModify(c *gin.Context) {
   var departmentdata models.Department
   ID := c.Query("id")
   err := c.ShouldBind(&departmentdata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("binding failed:" + err.Error()),
      })
      return
   }

   beforedata := new(models.Department)
   err = models.DB.First(beforedata, ID).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("ID not found:" + err.Error()),
      })
      return
   }

   models.DB.Model(beforedata).Updates(&departmentdata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("department update error:" + err.Error()),
      })
      return
   }

   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "msg":  "修改成功",
   })
}

// DepartmentDelete
// @Tags 部门
// @Summary 部门删除
// @Param id query int true "id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /department/delete [delete]
func DepartmentDelete(c *gin.Context) {
   ID := c.Query("id")
   data := new(models.Department)
   err := models.DB.First(data, ID).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("ID not found:" + err.Error()),
      })
      return
   }

   err = models.DB.Delete(data).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("department delete error:" + err.Error()),
      })
      return
   }

   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "msg":  "删除成功",
   })
}

// GetDepartmentList
// @Tags 部门
// @Summary 部门列表
// @Param page query int false "page"
// @Param size query int false "size"
// @Param keyword query string false "keyword"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /department/list [get]
func GetDepartmentList(c *gin.Context) {

   size, _ := strconv.Atoi(c.DefaultQuery("size", define.DefaultSize))
   page, err := strconv.Atoi(c.DefaultQuery("page", define.DefaultPage))

   if err != nil {
      log.Println("GetDepartmentList Page strconv Error:", err)
      return
   }
   page = (page - 1) * size
   keyword := c.Query("keyword")
   var count int64
   var list = make([]models.Department, 0)

   err = models.DB.Model(new(models.Department)).Preload("Professionals").Preload("Teachers").Count(&count).Offset(page).Limit(size).
      Where("name like ? OR location like ?", "%"+keyword+"%", "%"+keyword+"%").
      Find(&list).Error

   if err != nil {
      log.Println("Get Department List Error", err)
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  "Get Department List Error" + err.Error(),
      })
      return
   }

   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "data": map[string]interface{}{
         "list":  list,
         "count": count,
      },
   })
}

考试安排

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x96PCFiY-1682330141328)(教务管理系统.assets/image-20230424170007930.png)]

package service

import (
   "fmt"
   "github.com/gin-gonic/gin"
   "main/models"
   "net/http"
)

// ExamDetail
// @Tags 考试安排
// @Summary 考试安排详细
// @Param int query int true "id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /exam/detail [get]
func ExamDetail(c *gin.Context) {
   ID := c.Query("id")
   data := new(models.Exam)
   err := models.DB.First(data, ID).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("ID not found:" + err.Error()),
      })
      return
   }
   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "data": data,
   })
}

// ExamCreate
// @Tags 考试安排
// @Summary 考试安排创建
// @Param exam_data formData string true "exam_data"
// @Param start_time formData string true "start_time"
// @Param end_time formData string true "end_time"
// @Param position formData string true "position"
// @Param course_selection_id formData string true "course_selection_id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /exam/create [post]
func ExamCreate(c *gin.Context) {
   var Examdata models.Exam
   err := c.ShouldBind(&Examdata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("binding failed:" + err.Error()),
      })
      return
   }
   err = models.DB.Create(&Examdata).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("Exam create error:" + err.Error()),
      })
      return
   }
   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "data": "考试安排创建成功",
   })
}

// ExamModify
// @Tags 考试安排
// @Summary 考试安排修改
// @Param id query int true "id"
// @Param exam_data formData string false "exam_data"
// @Param start_time formData string false "start_time"
// @Param end_time formData string false "end_time"
// @Param position formData string false "position"
// @Param course_selection_id formData string false "course_selection_id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /exam/update [put]
func ExamModify(c *gin.Context) {
   var Examdata models.Exam
   ID := c.Query("id")
   err := c.ShouldBind(&Examdata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("binding failed:" + err.Error()),
      })
      return
   }

   beforedata := new(models.Exam)
   err = models.DB.First(beforedata, ID).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("ID not found:" + err.Error()),
      })
      return
   }

   models.DB.Model(beforedata).Updates(&Examdata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("Exam update error:" + err.Error()),
      })
      return
   }

   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "msg":  "修改成功",
   })
}

// ExamDelete
// @Tags 考试安排
// @Summary 考试安排删除
// @Param id query int true "id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /exam/delete [delete]
func ExamDelete(c *gin.Context) {
   ID := c.Query("id")
   data := new(models.Exam)
   err := models.DB.First(data, ID).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("ID not found:" + err.Error()),
      })
      return
   }

   err = models.DB.Delete(data).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("Exam delete error:" + err.Error()),
      })
      return
   }

   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "msg":  "删除成功",
   })
}

成绩

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-550tlg5N-1682330141329)(教务管理系统.assets/image-20230424170019103.png)]

package service

import (
   "fmt"
   "github.com/gin-gonic/gin"
   "main/models"
   "net/http"
)

// GradeDetail
// @Tags 成绩
// @Summary 成绩详细
// @Param int query int true "id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /grade/detail [get]
func GradeDetail(c *gin.Context) {
   ID := c.Query("id")
   data := new(models.Grade)
   err := models.DB.First(data, ID).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("ID not found:" + err.Error()),
      })
      return
   }
   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "data": data,
   })
}

// GradeCreate
// @Tags 成绩
// @Summary 成绩创建
// @Param score formData string true "score"
// @Param student_id formData string true "student_id"
// @Param course_id formData string true "course_id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /grade/create [post]
func GradeCreate(c *gin.Context) {
   var Gradedata models.Grade
   err := c.ShouldBind(&Gradedata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("binding failed:" + err.Error()),
      })
      return
   }
   err = models.DB.Create(&Gradedata).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("Grade create error:" + err.Error()),
      })
      return
   }
   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "data": "成绩创建成功",
   })
}

// GradeModify
// @Tags 成绩
// @Summary 成绩修改
// @Param id query int true "id"
// @Param score formData string false "score"
// @Param student_id formData string false "student_id"
// @Param course_id formData string false "course_id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /grade/update [put]
func GradeModify(c *gin.Context) {
   var Gradedata models.Grade
   ID := c.Query("id")
   err := c.ShouldBind(&Gradedata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("binding failed:" + err.Error()),
      })
      return
   }

   beforedata := new(models.Grade)
   err = models.DB.First(beforedata, ID).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("ID not found:" + err.Error()),
      })
      return
   }

   models.DB.Model(beforedata).Updates(&Gradedata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("Grade update error:" + err.Error()),
      })
      return
   }

   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "msg":  "修改成功",
   })
}

// GradeDelete
// @Tags 成绩
// @Summary 成绩删除
// @Param id query int true "id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /grade/delete [delete]
func GradeDelete(c *gin.Context) {
   ID := c.Query("id")
   data := new(models.Grade)
   err := models.DB.First(data, ID).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("ID not found:" + err.Error()),
      })
      return
   }

   err = models.DB.Delete(data).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("Grade delete error:" + err.Error()),
      })
      return
   }

   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "msg":  "删除成功",
   })
}

专业

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GqbGeaTB-1682330141329)(教务管理系统.assets/image-20230424170058687.png)]

package service

import (
   "fmt"
   "github.com/gin-gonic/gin"
   "log"
   "main/define"
   "main/models"
   "net/http"
   "strconv"
)

// ProfessionalDetail
// @Tags 专业
// @Summary 专业详细
// @Param int query int true "id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /professional/detail [get]
func ProfessionalDetail(c *gin.Context) {
   ID := c.Query("id")
   data := new(models.Professional)
   err := models.DB.First(data, ID).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("ID not found:" + err.Error()),
      })
      return
   }
   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "data": data,
   })
}

// ProfessionalCreate
// @Tags 专业
// @Summary 专业创建
// @Param name formData string true "name"
// @Param department_id formData int false "department_id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /professional/create [post]
func ProfessionalCreate(c *gin.Context) {
   var professionaldata models.Professional
   err := c.ShouldBind(&professionaldata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("binding failed:" + err.Error()),
      })
      return
   }
   err = models.DB.Create(&professionaldata).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("professional create error:" + err.Error()),
      })
      return
   }
   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "data": "专业创建成功",
   })
}

// ProfessionalModify
// @Tags 专业
// @Summary 专业修改
// @Param id query int true "id"
// @Param name formData string false "name"
// @Param department_id formData int false "department_id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /professional/update [put]
func ProfessionalModify(c *gin.Context) {
   var professionaldata models.Professional
   ID := c.Query("id")
   err := c.ShouldBind(&professionaldata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("binding failed:" + err.Error()),
      })
      return
   }

   beforedata := new(models.Professional)
   err = models.DB.First(beforedata, ID).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("ID not found:" + err.Error()),
      })
      return
   }

   models.DB.Model(beforedata).Updates(&professionaldata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("professional update error:" + err.Error()),
      })
      return
   }

   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "msg":  "修改成功",
   })
}

// ProfessionalDelete
// @Tags 专业
// @Summary 专业删除
// @Param id query int true "id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /professional/delete [delete]
func ProfessionalDelete(c *gin.Context) {
   ID := c.Query("id")
   data := new(models.Professional)
   err := models.DB.First(data, ID).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("ID not found:" + err.Error()),
      })
      return
   }

   err = models.DB.Delete(data).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("Professional delete error:" + err.Error()),
      })
      return
   }

   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "msg":  "删除成功",
   })
}

// GetProfessionalList
// @Tags 专业
// @Summary 专业列表
// @Param page query int false "page"
// @Param size query int false "size"
// @Param keyword query string false "keyword"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /professional/list [get]
func GetProfessionalList(c *gin.Context) {
   size, _ := strconv.Atoi(c.DefaultQuery("size", define.DefaultSize))
   page, err := strconv.Atoi(c.DefaultQuery("page", define.DefaultPage))

   if err != nil {
      log.Println("GetProfessionalList Page strconv Error:", err)
      return
   }
   page = (page - 1) * size
   keyword := c.Query("keyword")
   var count int64
   var list = make([]models.Professional, 0)

   err = models.DB.Model(new(models.Professional)).Preload("Students").
      Count(&count).Offset(page).Limit(size).
      Where("name like ?", "%"+keyword+"%").Find(&list).Error

   if err != nil {
      log.Println("Get Professional List Error", err)
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  "Get Professional List Error" + err.Error(),
      })
      return
   }

   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "data": map[string]interface{}{
         "list":  list,
         "count": count,
      },
   })
}

学生

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JGGu8N3N-1682330141329)(教务管理系统.assets/image-20230424170134698.png)]

package service

import (
   "fmt"
   "github.com/gin-gonic/gin"
   "log"
   "main/define"
   "main/models"
   "net/http"
   "strconv"
)

// StudentDetail
// @Tags 学生
// @Summary 学生详细
// @Param int query int true "id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /student/detail [get]
func StudentDetail(c *gin.Context) {
   ID := c.Query("id")
   data := new(models.Student)
   err := models.DB.First(data, ID).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("ID not found:" + err.Error()),
      })
      return
   }
   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "data": data,
   })
}

// StudentCreate
// @Tags 学生
// @Summary 学生创建
// @Param name formData string true "name"
// @Param age formData int true "age"
// @Param gender formData int true "gender"
// @Param class_id formData int true "class_id"
// @Param professional_id formData int true "professional_id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /student/create [post]
func StudentCreate(c *gin.Context) {
   var Studentdata models.Student
   err := c.ShouldBind(&Studentdata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("binding failed:" + err.Error()),
      })
      return
   }
   err = models.DB.Create(&Studentdata).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("Student create error:" + err.Error()),
      })
      return
   }
   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "data": "学生创建成功",
   })
}

// StudentModify
// @Tags 学生
// @Summary 学生修改
// @Param id query int true "id"
// @Param name formData string false "name"
// @Param age formData int false "age"
// @Param gender formData int false "gender"
// @Param class_id formData int false "class_id"
// @Param professional_id formData int false "professional_id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /student/update [put]
func StudentModify(c *gin.Context) {
   var Studentdata models.Student
   ID := c.Query("id")
   err := c.ShouldBind(&Studentdata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("binding failed:" + err.Error()),
      })
      return
   }

   beforedata := new(models.Student)
   err = models.DB.First(beforedata, ID).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("ID not found:" + err.Error()),
      })
      return
   }

   models.DB.Model(beforedata).Updates(&Studentdata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("Student update error:" + err.Error()),
      })
      return
   }

   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "msg":  "修改成功",
   })
}

// StudentDelete
// @Tags 学生
// @Summary 学生删除
// @Param id query int true "id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /student/delete [delete]
func StudentDelete(c *gin.Context) {
   ID := c.Query("id")
   data := new(models.Student)
   err := models.DB.First(data, ID).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("ID not found:" + err.Error()),
      })
      return
   }

   err = models.DB.Delete(data).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("Student delete error:" + err.Error()),
      })
      return
   }

   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "msg":  "删除成功",
   })
}

// GetStudentList
// @Tags 学生
// @Summary 学生列表
// @Param page query int false "page"
// @Param size query int false "size"
// @Param keyword query string false "keyword"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /student/list [get]
func GetStudentList(c *gin.Context) {
   size, _ := strconv.Atoi(c.DefaultQuery("size", define.DefaultSize))
   page, err := strconv.Atoi(c.DefaultQuery("page", define.DefaultPage))
   if err != nil {
      log.Println("GetStudentList Page strconv Error:", err)
      return
   }
   page = (page - 1) * size
   keyword := c.Query("keyword")
   var count int64
   var list = make([]models.Student, 0)

   err = models.DB.Model(new(models.Student)).Preload("Grades").Count(&count).Offset(page).Limit(size).
      Where("name like ?", "%"+keyword+"%").Find(&list).Error

   if err != nil {
      log.Println("Get Student List Error", err)
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  "Get Student List Error" + err.Error(),
      })
      return
   }

   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "data": map[string]interface{}{
         "list":  list,
         "count": count,
      },
   })
}

教师

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xn7vGyk9-1682330141330)(教务管理系统.assets/image-20230424170154975.png)]

package service

import (
   "fmt"
   "github.com/gin-gonic/gin"
   "log"
   "main/define"
   "main/models"
   "net/http"
   "strconv"
)

// TeacherDetail
// @Tags 教师
// @Summary 教师详细
// @Param int query int true "id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /teacher/detail [get]
func TeacherDetail(c *gin.Context) {
   ID := c.Query("id")
   data := new(models.Teacher)
   err := models.DB.First(data, ID).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("ID not found:" + err.Error()),
      })
      return
   }
   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "data": data,
   })
}

// TeacherCreate
// @Tags 教师
// @Summary 教师创建
// @Param name formData string true "name"
// @Param age formData int true "age"
// @Param education formData string true "education"
// @Param title formData string true "title"
// @Param gender formData int true "gender"
// @Param department_id formData int false "department_id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /teacher/create [post]
func TeacherCreate(c *gin.Context) {
   var teacherdata models.Teacher
   err := c.ShouldBind(&teacherdata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("binding failed:" + err.Error()),
      })
      return
   }
   err = models.DB.Create(&teacherdata).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("teacher create error:" + err.Error()),
      })
      return
   }
   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "data": "教师创建成功",
   })
}

// TeacherModify
// @Tags 教师
// @Summary 教师修改
// @Param id query int true "id"
// @Param name formData string false "name"
// @Param age formData int false "age"
// @Param education formData string false "education"
// @Param title formData string false "title"
// @Param gender formData int false "gender"
// @Param department_id formData int false "department_id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /teacher/update [put]
func TeacherModify(c *gin.Context) {
   var teacherdata models.Teacher
   ID := c.Query("id")
   err := c.ShouldBind(&teacherdata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("binding failed:" + err.Error()),
      })
      return
   }

   beforedata := new(models.Teacher)
   err = models.DB.First(beforedata, ID).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("ID not found:" + err.Error()),
      })
      return
   }

   models.DB.Model(beforedata).Updates(&teacherdata)
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("teacher update error:" + err.Error()),
      })
      return
   }

   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "msg":  "修改成功",
   })
}

// TeacherDelete
// @Tags 教师
// @Summary 教师删除
// @Param id query int true "id"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /teacher/delete [delete]
func TeacherDelete(c *gin.Context) {
   ID := c.Query("id")
   data := new(models.Teacher)
   err := models.DB.First(data, ID).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("ID not found:" + err.Error()),
      })
      return
   }

   err = models.DB.Delete(data).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  fmt.Sprintf("teacher delete error:" + err.Error()),
      })
      return
   }

   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "msg":  "删除成功",
   })
}

// GetTeacherList
// @Tags 教师
// @Summary 教师列表
// @Param page query int false "page"
// @Param size query int false "size"
// @Param keyword query string false "keyword"
// @Success 200 {string} json "{"code":"200","data":""}"
// @Router /teacher/list [get]
func GetTeacherList(c *gin.Context) {
   size, _ := strconv.Atoi(c.DefaultQuery("size", define.DefaultSize))
   page, err := strconv.Atoi(c.DefaultQuery("page", define.DefaultPage))

   if err != nil {
      log.Println("GetTeacherList Page strconv Error:", err)
      return
   }
   page = (page - 1) * size
   keyword := c.Query("keyword")
   var count int64
   var list = make([]models.Teacher, 0)

   err = models.DB.Model(new(models.Teacher)).Preload("Course_selections").Count(&count).Offset(page).Limit(size).
      Where("name like ? ", "%"+keyword+"%").
      Find(&list).Error

   if err != nil {
      log.Println("Get Teacher List Error", err)
      c.JSON(http.StatusOK, gin.H{
         "code": -1,
         "msg":  "Get Teacher List Error" + err.Error(),
      })
      return
   }

   c.JSON(http.StatusOK, gin.H{
      "code": 200,
      "data": map[string]interface{}{
         "list":  list,
         "count": count,
      },
   })
}

注册路由

最后在router路径下的app.go中

package router

import (
   "github.com/gin-gonic/gin"
   "main/service"
)

func Router() *gin.Engine {
   router := gin.Default()

   department := router.Group("/department")
   {
      department.POST("/create", service.DepartmentCreate)
      department.PUT("/update", service.DepartmentModify)
      department.DELETE("/delete", service.DepartmentDelete)
      department.GET("/list", service.GetDepartmentList)
   }
   teacher := router.Group("/teacher")
   {
      teacher.GET("/detail", service.TeacherDetail)
      teacher.POST("/create", service.TeacherCreate)
      teacher.PUT("/update", service.TeacherModify)
      teacher.DELETE("/delete", service.TeacherDelete)
      teacher.GET("/list", service.GetTeacherList)
   }
   professional := router.Group("/professional")
   {
      professional.GET("/detail", service.ProfessionalDetail)
      professional.POST("/create", service.ProfessionalCreate)
      professional.PUT("/update", service.ProfessionalModify)
      professional.DELETE("/delete", service.ProfessionalDelete)
      professional.GET("/list", service.GetProfessionalList)
   }
   class := router.Group("/class")
   {
      class.GET("/detail", service.ClassDetail)
      class.POST("/create", service.ClassCreate)
      class.PUT("/update", service.ClassModify)
      class.DELETE("/delete", service.ClassDelete)
      class.GET("/list", service.GetClassList)
   }

   student := router.Group("/student")
   {
      student.GET("/detail", service.StudentDetail)
      student.POST("/create", service.StudentCreate)
      student.PUT("/update", service.StudentModify)
      student.DELETE("/delete", service.StudentDelete)
      student.GET("/list", service.GetStudentList)
   }

   course := router.Group("/course")
   {
      course.GET("/detail", service.CourseDetail)
      course.POST("/create", service.CourseCreate)
      course.PUT("/update", service.CourseModify)
      course.DELETE("/delete", service.CourseDelete)
      course.GET("/list", service.GetCourseList)
   }

   course_selection := router.Group("/course_selection")
   {
      course_selection.GET("/detail", service.Course_selectionDetail)
      course_selection.POST("/create", service.Course_selectionCreate)
      course_selection.PUT("/update", service.Course_selectionModify)
      course_selection.DELETE("/delete", service.Course_selectionDelete)
      course_selection.GET("/list", service.GetCourse_selectionList)
   }

   exam := router.Group("/exam")
   {
      exam.GET("/detail", service.ExamDetail)
      exam.POST("/create", service.ExamCreate)
      exam.PUT("/update", service.ExamModify)
      exam.DELETE("/delete", service.ExamDelete)
   }

   grade := router.Group("/grade")
   {
      grade.GET("/detail", service.GradeDetail)
      grade.POST("/create", service.GradeCreate)
      grade.PUT("/update", service.GradeModify)
      grade.DELETE("/delete", service.GradeDelete)
   }
   return router
}
  professional.GET("/detail", service.ProfessionalDetail)
      professional.POST("/create", service.ProfessionalCreate)
      professional.PUT("/update", service.ProfessionalModify)
      professional.DELETE("/delete", service.ProfessionalDelete)
      professional.GET("/list", service.GetProfessionalList)
   }
   class := router.Group("/class")
   {
      class.GET("/detail", service.ClassDetail)
      class.POST("/create", service.ClassCreate)
      class.PUT("/update", service.ClassModify)
      class.DELETE("/delete", service.ClassDelete)
      class.GET("/list", service.GetClassList)
   }

   student := router.Group("/student")
   {
      student.GET("/detail", service.StudentDetail)
      student.POST("/create", service.StudentCreate)
      student.PUT("/update", service.StudentModify)
      student.DELETE("/delete", service.StudentDelete)
      student.GET("/list", service.GetStudentList)
   }

   course := router.Group("/course")
   {
      course.GET("/detail", service.CourseDetail)
      course.POST("/create", service.CourseCreate)
      course.PUT("/update", service.CourseModify)
      course.DELETE("/delete", service.CourseDelete)
      course.GET("/list", service.GetCourseList)
   }

   course_selection := router.Group("/course_selection")
   {
      course_selection.GET("/detail", service.Course_selectionDetail)
      course_selection.POST("/create", service.Course_selectionCreate)
      course_selection.PUT("/update", service.Course_selectionModify)
      course_selection.DELETE("/delete", service.Course_selectionDelete)
      course_selection.GET("/list", service.GetCourse_selectionList)
   }

   exam := router.Group("/exam")
   {
      exam.GET("/detail", service.ExamDetail)
      exam.POST("/create", service.ExamCreate)
      exam.PUT("/update", service.ExamModify)
      exam.DELETE("/delete", service.ExamDelete)
   }

   grade := router.Group("/grade")
   {
      grade.GET("/detail", service.GradeDetail)
      grade.POST("/create", service.GradeCreate)
      grade.PUT("/update", service.GradeModify)
      grade.DELETE("/delete", service.GradeDelete)
   }
   return router
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值