在gva框架中如何用Golang写一个完整的接口(场所信息Excel表导出接口)
router–>api–>service(router–>controller–>logic–>dao)
1.router
先在router层里面注册路由,例如:
cdPlaceRoomRouter.POST("exportExcel", cdPlaceRoomApi.CdPlaceRoomExport)
//导出Excel表
2.api
然后在api层中,进行三个步骤。
1.做参数请求和参数校验(post请求需要入参)
2.业务逻辑处理
3.返回逻辑响应
例如:
func (a *CdPlaceRoomApi) CdPlaceRoomExport(c *gin.Context) {
var excelInfo cdReq.CdPlaceRoomExcelInfo
_ = c.ShouldBindJSON(&excelInfo) //参数绑定
filePath := global.GSD_CONFIG.Excel.Dir + excelInfo.FileName
curUser := utils.GetUser(c)
placeList, isAll := dataScope.GetPlaceDataScope(curUser)
if err := cdPlaceRoomService.CdPlaceRoomToExcel(excelInfo, filePath, placeList, isAll); err != nil { //业务逻辑处理
global.GSD_LOG.Error("导出场所信息excel失败", zap.Error(err), utils.GetRequestID(c))
response.FailWithMessage("导出场所信息excel失败", c) //返回响应
return
}
c.Writer.Header().Add("success", "true")
c.File(filePath)
}
3.service
在service层中存放业务逻辑的代码。(对数据库进行增删改查)
func (s CdPlaceRoomService) CdPlaceRoomToExcel(room ResCd.CdPlaceRoomExcelInfo, path string, place []string, all bool) (err error) {
excel := excelize.NewFile()
excel.SetSheetRow("Sheet1", "A1", &[]string{"场所编号","房间号", "隔离房间号", "隔离点楼号", "隔离点楼层号", "状态"})
var placeRooms []cdfield.CdPlaceRoom
db := global.GSD_DB.Table("cd_place_rooms")
if room.PlaceID!=""{
db = db.Where("csbh LIKE ?", room.PlaceID+"%")
}
if room.RoomNumber!= "" {
db = db.Where("fjh LIKE ?", room.RoomNumber+"%")
}
if room.GLRoomNumber != "" {
db = db.Where("gldfjh LIKE ?", room.GLRoomNumber+"%")
}
if room.BuildingNumber != "" {
db = db.Where("lh LIKE ?", room.BuildingNumber+"%")
}
if room.FloorNumber != "" {
db = db.Where("lch LIKE ?", room.FloorNumber+"%")
}
if room.State != "" {
db = db.Where("syzt LIKE ?", room.State+"%")
}
if !reflect.ValueOf(room.StartTime).IsNil() && !reflect.ValueOf(room.EndTime).IsNil() {
db = db.Where("update_at BETWEEN ? AND ?", room.StartTime, room.EndTime)
}
if room.Csmc != "" {
ids, _ := cdPlaceRoomService.GetCdPlaceRoomByCsmc(room.Csmc)
db = db.Where("csbh in (?)", ids)
}
if !all {
db = db.Where("csbh in (?)", place)
}
err = db.Find(&placeRooms).Error
if err != nil {
return
}
for i, cdPlaceRoom := range placeRooms {
axis := fmt.Sprintf("A%d", i+2)
excel.SetSheetRow("Sheet1", axis, &[]interface{}{
cdPlaceRoom.PlaceID,
cdPlaceRoom.RoomNumber,
cdPlaceRoom.GLRoomNumber,
cdPlaceRoom.BuildingNumber,
cdPlaceRoom.FloorNumber,
cdPlaceRoom.State,
})
}
mkdirErr := os.MkdirAll(global.GSD_CONFIG.Excel.Dir, os.ModePerm)
if mkdirErr != nil {
global.GSD_LOG.Error("function os.MkdirAll() Filed", zap.Any("err", mkdirErr.Error()))
return errors.New("function os.MkdirAll() Filed, err:" + mkdirErr.Error())
}
rows, err := excel.Rows("Sheet1")
fmt.Println(rows)
if err != nil {
return err
}
err = excel.SaveAs(path)
return err
}