奖学金系统v4-1
给老板打打小工…………
需求
批量导入项目学生污点
实现要求 :
- 可以通过excel导入学生的成绩
- 可以通过学生的Id
- 可以通过学年-学期-班级导入(未实现)
同时需要实现
- 导入成绩是批量导入的,且每批学生都要有个batch,可以直接删除某批学生
- 当学生的id重复时,需要提醒老师是合并还是连接污点
APIfox接口 /project/{id}/user/batch
form-data :
参数名 参数值 说明 file upload(excel) 上传excel文件 uploadType id/excel/class 分别对应三种上传形式 year – 学年 class – 班级 semester – 学期 coverType merge/cover 覆盖/添加 data [{“staff_id”:”55600”,”taints”:[“a”,”b”]},{“staff_id”:”300”,”taints”:[“a”,”b”]}] 学号+污点切片 Param:
id : ……………….(这里是项目id)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47//相应格式
{
"code": 0,
"message": "success",
"data": [
{
"ID": 63,
"CreatedAt": "2024-02-19T00:04:43.5914489+08:00",
"UpdatedAt": "2024-02-19T00:04:43.5914489+08:00",
"DeletedAt": null,
"ProjectId": "13",
"StaffId": "55600",
"Batch": "1708272283-860",
"Taints": [
{
"ID": 63,
"CreatedAt": "2024-02-19T00:04:43.5945104+08:00",
"UpdatedAt": "2024-02-19T00:04:43.5945104+08:00",
"DeletedAt": null,
"ProjectId": "13",
"StaffId": "55600",
"Name": "a,b"
}
]
},
{
"ID": 64,
"CreatedAt": "2024-02-19T00:04:43.6123751+08:00",
"UpdatedAt": "2024-02-19T00:04:43.6123751+08:00",
"DeletedAt": null,
"ProjectId": "13",
"StaffId": "300",
"Batch": "1708272283-215",
"Taints": [
{
"ID": 64,
"CreatedAt": "2024-02-19T00:04:43.615909+08:00",
"UpdatedAt": "2024-02-19T00:04:43.615909+08:00",
"DeletedAt": null,
"ProjectId": "13",
"StaffId": "300",
"Name": "a,b"
}
]
}
]
}- 其实应该做成一个学号下面全是污点的类型的,但是我不会。。。
批量删除项目学生污点
接口 /project/{id}/user/batch
Body/JSON :
1
2
3>{
"batch":"1708269266-923"
>}param: 与上面相同
1
2
3
4
5
6//响应格式
{
"code": 0,
"message": "success",
"data": "删除成功"
}
代码实现
路由
1 | // internal/app/project/router/project.go |
模型
1 | // internal/app/project/model/project.go |
- 这边有个uniqueIndex,非常恶心,这个表示索引唯一性,就是她这边ProjectId,StaffId是索引,因此两个索引都不能重复
- has many : 这里使用了has many的映射关系,官网查了好久反正都没什么用,ProjectUser是父表,ProjectUserTaint是子表,不能擅自修改子表的数据,因此不可能直接存入数据。具体用处就是一对多,具体操作就是你把ProjectUserTaint插到ProjectUser的Taints切片中,然后再把ProjectUser保存到数据库,ProjectUserTaint就会自动保存到数据库中,这就是外键引用
导入
1 | // internal/app/project/handler/project.go |
三种类型,三个判断
JSON输入
1 | // internal/app/project/dto/project.go |
这个就是dto包的作用,就是通过自定义结构体来吸收传入的JSON或者form-data数据,非常适用,重点
excel
1 | // internal/app/project/service/gw/service.go |
具体怎么操作就问GPT好了,很简单,就是第一行不录入(输入学号/污点),后面录入第一列和第二列,同时还可以获取每张表(sheet)遍历
id
1 | // internal/app/project/service/gw/service.go |
具体可以看一下两张表之间的关系操作
还可以看一下判断是否重复的逻辑操作
存储
1 | // internal/app/project/dao/project.go |
非常巧妙的使用了方法,多学习学习
删除
学会了上面的,下面的非常简单,可以略过
1 | // internal/app/project/handler/project.go |
结构
1 | internal/app/ |
这是具体一个包的结构
dao
数据库处理,数据的CRUD操作写这里
dto
JSON格式的结构体设定
handler
路由函数的设置地点
model
结构体模型,存入数据库的
router
路由
sevice
一些在路由函数到数据库之间的中间操作放这里,比如ParseExcel等
总结
- 学习了GORM一些复杂的关系,真的好难,要试过才知道,只看文档看不懂
- colipot和GPT的使用,而不是依赖和滥用
- 关键使用的debug–今天我终于学会debug了,每一步debug就像刮彩票,超级激动
- 这个东西从APIfox文档编写到功能的差不多实现,差不多花了一天时间–真的是整整一天的时间,昨天晚上学到四点钟,十一点钟爬起来吃了个饭学到现在,只能说老板牛逼
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Echin の 博客!