# Database **Repository Path**: sutgit_admin/database ## Basic Information - **Project Name**: Database - **Description**: 数据库课设 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-06-15 - **Last Updated**: 2021-11-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #数据库课程设计报告 姓名:苏童 班级:软件193 学号:8019082316 #一.题目 学籍管理系统 #二.代码及版本管理地址 [gitee地址(点击跳转)](https://gitee.com/sutgit_admin/database.git "gitee地址(点击跳转)") ![图片](https://lexiangla.com/assets/7be081fcd6fc11eb96daee1c47ad7e25 "图片") #三.项目架构介绍 **项目使用技术:GO+Vue3.0+Postgresql** 开发工具:Vscode 后端语言:Golang 前端:Vue3.0 后端框架:Gin框架+Gorm 数据库:Postgresql #四.项目工具介绍 **Vue3.0** 此框架新的主要版本提供了更好的性能、更小的捆绑包体积、更好的 TypeScript 集成、用于处理大规模用例 的新 API,并为框架未来的长期迭代奠定了坚实的基础。 **Gin框架** Gin 是 Go语言写的一个 web 框架,它具有运行速度快,分组的路由器,良好的崩溃捕获和错误处理,非常好的支持中间件和 json。 **Postgresql数据库** PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统。 **Vscode** Visual Studio Code是Microsoft在2015年4月30日Build开发者大会上正式宣布一个运行于 Mac OS X、Windows和 Linux 之上的。它具有对JavaScript,TypeScript和Node.js的内置支持,并具有丰富的其他语言例如C++,C#,Java,Python,PHP,Go)和运行时(例如.NET和Unity)扩展的生态系统。 #五.数据库脚本及E-R图 ![图片](https://lexiangla.com/assets/936503bad6fd11eba64e5a69321fb496 "图片") **数据库脚本** 学生表 ```sql create table public.student( sno varchar(10) primary key, sname varchar(20), ssex varchar(10), sage int, sdept varchar(10), syear varchar(10), spolitics varchar(20), snation varchar(20), sarea varchar(20), srecords varchar(10), status varchar(20), sdegree int, is_del bool ) ``` 课程表 ```sql CREATE TABLE public."course" (cno varchar(10) primary key, cname varchar(20), is_del bool ); ``` 成绩表 ```sql CREATE TABLE public."sc" ( sno VARCHAR(10), cno VARCHAR(10), grade VARCHAR(10), is_del bool, PRIMARY KEY(Sno,Cno), FOREIGN KEY(sno)REFERENCES student(sno), FOREIGN KEY(cno)REFERENCES course(cno) ); ``` 触发器 ```sql CREATE OR REPLACE FUNCTION "public".del_course_func"() RETURNS"pg_catalog"."trigger"AS$BODY$ BEGIN IF NEW.is_del =TRUE THEN UPDATE cname SET is_del = TRUE where course.cno = New.cno; END IF; RETURN NEW; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100 CREATE TRIGGER "del_course"AFTER UPDATE OF "is_del" ON "public"."course" FOR EACH ROW EXECUTE PROCEDURE "public"."del_course_func"(); ``` #六.项目目录与板块说明 **前端文件目录** ![图片](https://lexiangla.com/assets/1be7c476d70211eb9fc6fe806712bf7a "图片") analyse.vue 渲染了分析成绩界面 grade.vue 渲染了成绩情况界面 home.vue 渲染了主页面 student.vue 渲染了学生情况界面 index.js 路由配置 **后端文件目录** ![图片](https://lexiangla.com/assets/c7c7b4aed70211eb9d7946f8a831f5ab "图片") **conf/app.ini** 文件数据与数据库中的用户名密码相匹配,存取相对应的端口号 **middleWare** 中间件文件,存放与前端交互时的头部函数 **pkg/setting.go** 文件为连接数据库的前置操作 **pkg/app** 文件中的reponse.go为传入的失败数据和成功数据的处理函数 **pkg/e** 文件中的code.go为与前端交互的时候从前端的res.code码的处理 **models** 定义了结构体模型,与数据库中的表对应 **connect ** 为后端连接pgsql数据库,以及三个go文件实现了对三个表的增删改查操作 **services** 将CRUDh函数进行封装 **controllers** 为三个表的CRUD的相关函数 **routers** 路由配置文件 #七.部分代码展示 1.初始化路由 ```go func sysNoCheckRoleRouter(r *gin.RouterGroup) { r = r.Group("/abc") studentsRouter(r) coursesRouter(r) scRouter(r) } func InitRouter() *gin.Engine { r := gin.New() r.Use(middleWare.Cors()) g := r.Group("") sysNoCheckRoleRouter(g) return r } ``` 2.学生表路由 ```go func studentsRouter(r *gin.RouterGroup) { r.GET("/students", controllers.Get_Students) r.POST("/students", controllers.Add_Students) r.POST("/students/put", controllers.Update_Students) r.POST("/students/delete", controllers.Del_Students) } ``` 3.controllers层通过分页来查询学生的功能函数 ```go func Get_Students(c *gin.Context) { page := -1 if arg := c.Query("page"); arg != "" { page = com.StrTo(arg).MustInt() } limit := -1 if arg := c.Query("limit"); arg != "" { limit = com.StrTo(arg).MustInt() } searchName := "" if arg := c.Query("searchName"); arg != "" { searchName = arg } supplierParam := map[string]interface{}{ "page": page, "limit": limit, "searchName": searchName, } err, info, total := services.GetAllStudents(supplierParam) if err != nil { app.Error(c, e.ERROR, err, err.Error()) return } app.OK(c, map[string]interface{}{"value": info, "total": total}, "查询成功") } ``` 4.controllers层增加,删除,修改学生信息功能函数 ```go func Add_Students(c *gin.Context) { var studentdata models.Student c.ShouldBind(&studentdata) err := services.AddStudents(studentdata) if err != nil { app.Error(c, e.ERROR, err, err.Error()) return } app.OK(c, map[string]interface{}{}, "添加成功") } func Update_Students(c *gin.Context) { var studentdata models.Student c.ShouldBind(&studentdata) err := services.UpdateStudents(studentdata) if err != nil { app.Error(c, e.ERROR, err, err.Error()) return } app.OK(c, map[string]interface{}{}, "更新成功") } func Del_Students(c *gin.Context) { var studentdata models.Student c.ShouldBind(&studentdata) err := services.DelStudents(studentdata.Sno) if err != nil { app.Error(c, e.ERROR, err, err.Error()) return } app.OK(c, map[string]interface{}{}, "删除成功") } ``` 5.后端对数据库增删改查的操作函数 ```go func AddStudents(students models.Student) error { err := db.Table("student").Select("sno", "sname", "ssex", "sage", "sdept", "syear", "snation", "sarea", "sdegree", "spolitics","srecords","status").Create(&students).Error return err } func DelStudents(id string) error { err := db.Table("student").Where("sno = ?", id).Delete(models.Student{}).Error return err } func UpdateStudents(students models.Student) error { err := db.Table("student").Where("sno = ?", students.Sno).Updates(&students).Error return err } func GetAllStudents(studentsParam map[string]interface{}) (error, []models.Student, int64) { var studentsData []models.Student page := studentsParam["page"].(int) pageSize := studentsParam["limit"].(int) searchName := studentsParam["searchName"].(string) var total int64 err := db.Table("student").Where("sname like ? ", "%"+searchName+"%").Order("sno ASC").Count(&total).Find(&studentsData).Offset((page - 1) * pageSize).Limit(pageSize).Error return err, studentsData, total } ``` #八.部分功能展示图 **登录页面** ![图片](https://lexiangla.com/assets/761e9618d70711eb9bf6f263a894e225 "图片") **显示后端数据库数据** ![图片](https://lexiangla.com/assets/8d5dbaa2d70711eba33cd66f292c5d26 "图片") **添加学生信息功能** ![图片](https://lexiangla.com/assets/bb883a24d70711eb98be467b3f7ac2ff "图片") 前端插入了数据 ![图片](https://lexiangla.com/assets/c2f4563ad70711eba8d63a5dcea95698 "图片") 在后端数据库查询到了新加的学生 ![图片](https://lexiangla.com/assets/da689790d70711eb8c10f2a0b01b4b21 "图片") **修改学生信息功能** ![图片](https://lexiangla.com/assets/05b9dd00d70811eb89dc365921330e94 "图片") ![图片](https://lexiangla.com/assets/118f13f2d70811eba1c7e265bedfd260 "图片") 数据库中专业数据已被从软件更改为计科 ![图片](https://lexiangla.com/assets/208481d0d70811ebbbc3c23aa48b8619 "图片") **删除学生信息功能** 删除8号学生的信息 ![图片](https://lexiangla.com/assets/56d52334d70811eb9dbf4631fd76d68a "图片") ![图片](https://lexiangla.com/assets/98a88f9ed70811eb9af9fe806712bf7a "图片") 后端数据库已经没有8号学生的全部信息 ![图片](https://lexiangla.com/assets/7dc97b48d70811eb995ece34ece8234d "图片") **统计分析功能** ![图片](https://lexiangla.com/assets/ca564e50d70811eb8b27d61d72257f1e "图片") #九.总结 这次课设可以说是收获颇丰,经历了一段跌宕起伏的心理历程,但是在老师的鼓励和同学们的帮助下,很开心最终完成了这次课设的题目。 在这次课设开始之前,我已经做好了面对技术栈困难的心理准备,因为在大一C语言课设中,王老师让我们提前学习了go语言和gitee的使用,所以有了一定的go语言的语法基础和gitee的使用来完成版本记录。但是对于王老师这次课设给出的前后端分离项目的技术栈,我从未接触过,在第一时间拿到题目的时候,我想选用springboot+vue+mysql来完成,但是在第一天的下午,王老师讲了go语言的前景以及其优势,我还是决定选择了难度更大一点的gin+pgsql+vue的技术栈。 在选择了这套技术栈后,我在开始的几天里,选择先学习html+css+js和vue的知识,打算先进行前端的开发,设计了前端的登录页面。在学习前端的同时,通过视频和gin,gorm的中文文档来学习后端的知识,一直在知识积累阶段,迟迟没有开始完成代码的编写,在吴文益同学的程序上传后,我也没有仔细研究,过了几天,我才发现自己的方向和路线不对,选择研究吴文益和示例项目的代码,寻到了搭积木的正确方式,在最近几天,终于找到了感觉,上手写代码容易了很多,项目进展的也很快,虽然会在前后端交互出现问题,但是在同学的帮助下,找到并解决了问题。 虽然技术栈的使用是陌生的,后端连接数据库,前后端交互,这些都是一个个卡住我的难题。但是一个个问题的迎刃而解,还要感谢老师的鼓励,及时为我们指明了方向,让我们找到了完成题目的方法。 如今我们正处于一个快速发展的时代,感谢王老师的良苦用心,通过这次课设的机会,让我们能够感受到前后端工程开发的实质,能让我们了解如今行业的趋势,并且学习和掌握一门技能,让我们在大学中真正能学到有用的知识和技能。