main.go
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"log"
"os"
"reflect"
"strconv"
"time"
)
/*
go在调用gorm将结构体对象转换成mysql对应的数据进行插入的时候,里面的动作实际是一下几点:
1. gorm插件调用create(&t)函数 从go的结构体变量t里面获取到对应的内存的值,并将t结构体指针对应的值进行转换成mysql的insert语句将结构体对象的值插入到mysql数据库对应的t结构体名字一致的表名里面;
2. mysql 根基gorm插件转换之后的sql语句对表进行数据插入操作;
3. gorm插件将mysql生成的字段值返回值结构体变量t指针对应的内存地址的值;
4. 此刻就能保证结构体t指针指向的内存地址的值与mysql对应生成的字段的值保持一致,且一一映射;
*/
/*Gorm框架在执行插入操作以后,会将数据库返回的生成值(如自增主键)更新到传入结构体的相应字段中。这个过程发生在应用层,而非数据库层,确保了go程序中的对象状态与数据库的一致性。
例如,如果你有一个结构体定义如下:
go
type User struct {
ID uint `gorm:"primary_key"`
Name string
}
然后你创建一个新的User:
user := User{Name: "John"}
db.Create(&user)
在执行 db.Create(&user) 后,假设数据库生成的新纪录id为5,则Gorm会更新 user.ID 的值为5。这样,你就可以从你的Go程序中的 user 对象直接获取新插入记录的ID。
注意这个操作是【Gorm框架提供的功能】,它在【插入完成后】,【再次查询了数据库中的新纪录】,然后【把新纪录的值指定回 user 对象】。这样你可以确保 user 对象中的值与数据库中的记录是同步的。*/
type BaseModel struct {
Id int `gorm:"paimarykey"`
CreateTime *time.Time `gorm:"autoCreateTime"`
UpdateTime *time.Time `gorm:"autoCreateTime"`
Name string `gorm:"type:varchar(30);unique;not null"`
}
type Teachers struct {
BaseModel
Ton int
Pwd string `gorm:"type:varchar(100);not null"`
Tel string `gorm:"type:char(11);"`
Birth *time.Time
Remark string `gorm:"type:varchar(255);"`
}
type Students struct {
BaseModel
Sno int
Pwd string `gorm:"type:varchar(100);not null"`
Tel string `gorm:"type:char(11);"`
Gender byte `gorm:"default:1;"`
Brith *time.Time
Remark string `gorm:"type:varchar(255);"`
//多对一
ClassID int
Class Class `gorm:"foreigkey:ClassID"`
//多对多
Course []Course `gorm:"many2many:student2course;constraint:OnDelete:CASCADE;"`
}
type Course struct {
BaseModel
Credit int
Period int
TeacherID int
Teacher Teachers `gorm:"foreigkey:TeacherID"`
}
type Class struct {
BaseModel
Num int
TutorID int
Tutor Teachers `gorm:"foreigkey:TutorID"`
}
//构建函数体
// 数据库初始化
func DbInit() *gorm.DB {
newLogger := logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
logger.Config{
//SlowThreshold: time.Second, // 慢 SQL 阈值
LogLevel: logger.Info, // Log level
},
)
fmt.Println(reflect.TypeOf(newLogger))
dsn := "root:1xxxx@tcp(xxx.xx.xx.xxx:3306)/coursess?charset=utf8mb4&parseTime=True&loc=Local"
db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: newLogger,
})
//调用gorm根据go语言的结构体去创建mysql一一对应的表
//db.AutoMigrate(&Teachers{})
//db.AutoMigrate(&Class{})
//db.AutoMigrate(&Course{})
//db.AutoMigrate(&Students{})
db.Migrator().DropTable(&Teachers{}, &Class{}, &Course{}, &Students{})
db.AutoMigrate(&Teachers{}, &Class{}, &Course{}, &Students{})
return db
}
// 全局变量
var db *gorm.DB
func Stu(ctx *gin.Context) {
//插入数据
var Students []Teachers
for i := 1; i <= 100; i++ {
Student := Teachers{BaseModel: BaseModel{Name: "yuan" + strconv.Itoa(i)}, Ton: 1001 + i, Pwd: "123", Tel: "110" + strconv.Itoa(i)}
Students = append(Students, Student)
}
//Teacher1 := Teachers{BaseModel: BaseModel{Name: "yuan"}, Ton: 1001, Pwd: "123", Tel: "110"}
//Teacher2 := Teachers{BaseModel: BaseModel{Name: "elxa"}, Ton: 1002, Pwd: "234", Tel: "111"}
//db.Create(&Student)
db.Create(&Students)
ctx.HTML(200, "student.html", gin.H{
"name": Students,
})
fmt.Println(Students)
}
func main() {
//数据库初始化
db = DbInit()
//构gin引擎
r := gin.Default()
//加载静态文件
r.LoadHTMLGlob("template/*")
//构建动态路由
r.GET("/student", Stu)
//运行go引擎
r.Run(":8888")
}
publi.html
<!doctype html>
<html lang="zh-CN">
<head>
<!-- <meta charset="utf-8">-->
<!-- <meta http-equiv="X-UA-Compatible" content="IE=edge">-->
<!-- <meta name="viewport" content="width=device-width, initial-scale=1">-->
<!-- <!– The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags –>-->
<!-- <meta name="description" content="">-->
<!-- <meta name="author" content="">-->
<!-- <link rel="icon" href="../../favicon.ico">-->
<!-- <link rel="canonical" href="https://getbootstrap.com/docs/3.4/examples/theme/">-->
{{block "title" .}}
<title>学生管理系统 </title>
{{end}}
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
<!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
<link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap-theme.min.css" integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous">
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.js"></script>
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
</head>
<body>
<nav class="navbar navbar-inverse">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">学生管理系统</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">学生选课系统</a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="active"><a href="/student">学生管理</a></li>
<li><a href="/course">课程管理</a></li>
<li><a href="/class">班级管理</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">Action</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Something else here</a></li>
<li role="separator" class="divider"></li>
<li class="dropdown-header">Nav header</li>
<li><a href="#">Separated link</a></li>
<li><a href="#">One more separated link</a></li>
</ul>
</li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
<div class="container-fluid theme-showcase" role="main">
<div class="row">
<div class="col-md-2">
<div >
<div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="headingOne">
<h4 class="panel-title">
<a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
学生管理
</a>
</h4>
</div>
<div id="collapseOne" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="headingOne">
<div class="panel-body">
<a href="/student">学生管理</a>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="headingTwo">
<h4 class="panel-title">
<a class="collapsed" role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
课程管理
</a>
</h4>
</div>
<div id="collapseTwo" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingTwo">
<div class="panel-body">
<a href="/course">课程管理</a>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="headingThree">
<h4 class="panel-title">
<a class="collapsed" role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseThree" aria-expanded="false" aria-controls="collapseThree">
班级管理
</a>
</h4>
</div>
<div id="collapseThree" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingThree">
<div class="panel-body">
<a href="/class">班级管理</a>
</div>
</div>
</div>
</div>
</div>
<!-- Fixed navbar -->
</div>
<div class="col-md-10">
<!-- Main jumbotron for a primary marketing message or call to action -->
{{block "content" .}}
{{end}}
</div>
</div>
</div> <!-- /container -->
</body>
</html>
student.html
{{template "publi.html" .}}
{{define "content" }}
<h2>学生管理</h2>
<table class="table table-bordered text-center">
<thead>
<tr>
<td>序号</td>
<td>姓名</td>
<td>ID</td>
<td>电话号码</td>
</tr>
</thead>
<tbody>
{{ range $student:=.name}}
<tr>
<td>{{$student.Id}}</td>
<td>{{$student.Name}}</td>
<td>{{$student.Ton}}</td>
<td>{{$student.Tel}}</td>
</tr>
{{end}}
</tbody>
</table>
{{end}}
{{define "title" }}
<title>学生管理系统</title>
{{end}}
运行结果: