当前位置: 首页 > news >正文

建设网站盈利分析珠海网站制作推广公司哪家好

建设网站盈利分析,珠海网站制作推广公司哪家好,做二维码电子档相册 找什么网站,营销管理培训课程培训班文章目录 路由文件分组查询数据库并返回jsonservice层controller路由运行效果 启动多个服务 在 上一篇文章《使用Go语言的gorm框架查询数据库并分页导出到Excel实例》 中主要给大家分享了较多数据的时候如何使用go分页导出多个Excel文件并合并的实现方案#xff0c;这一篇文章… 文章目录 路由文件分组查询数据库并返回jsonservice层controller路由运行效果 启动多个服务 在 上一篇文章《使用Go语言的gorm框架查询数据库并分页导出到Excel实例》 中主要给大家分享了较多数据的时候如何使用go分页导出多个Excel文件并合并的实现方案这一篇文章继续分享一下go语言的Gin框架的一些常规配置和业务中常用的查询数据库并返回json的实现方案。 Gin是一个golang的微框架基于 httprouter具有快速灵活容错率高高性能等特点。借助框架开发不仅可以省去很多常用的封装带来的时间也有助于团队的编码风格和形成规范。 Gin框架官网https://gin-gonic.com/zh-cn/新增一个Go文件引入 github.com/gin-gonic/gin 即可使用Gin框架。 路由文件分组 正常情况下Gin框架通过如下代码即可快速实现一个路由和方法 // router/router.go package routerfunc Router() *gin.Engine {r : gin.Default()r.GET(/json, func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{code: http.StatusOK,success: true,})}) }// main.go package mainimport (go-demo-2025/router ) func main() {r : router.Router()r.Run(:8080) // listen and serve on 0.0.0.0:8080 }但是随着项目接口的不断增多如果把所有的路由都写在一个文件里面的话不易维护。因此可以在项目一开始就对路由分成多个文件。实现如下 客户相关路由 router/customer.go package routerfunc CustomerRouter(e *gin.Engine) {customer : e.Group(/customer){customer.GET(/list, func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{code: http.StatusOK,success: 获取客户列表,})})customer.GET(/info, func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{code: http.StatusOK,success: 获取客户详情,})}) } }订单相关路由 router/order.go package router// Order 路由 func OrderRouter(e *gin.Engine) {order : e.Group(/order){order.GET(/list, func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{code: http.StatusOK,success: 获取订单列表,})})order.GET(/info, func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{code: http.StatusOK,success: 获取订单详情,})})}// 可以设定多层路由分组orders : e.Group(/orders){ordersTeacher : orders.Group(/ordersHistory){ordersTeacher.GET(/list, func(c *gin.Context) { //访问 http://127.0.0.1:8080/orders/ordersHistory/listc.JSON(http.StatusOK, gin.H{code: http.StatusOK,success: /orders/ordersHistory/list,})})}} }修改 main.go 文件 // main.go package mainimport (go-demo-2025/router ) func main() {r : router.Router()router.CustomerRouter(r)router.OrderRouter(r)r.Run(:8080) // listen and serve on 0.0.0.0:8080 }运行效果 查询数据库并返回json service层 在 上一篇文章 中我们已经通过 gorm_generate_db_struct.go 自动生成了数据表的结构体 type User struct {ID int64 gorm:column:id;type:int(11) unsigned;primaryKey;autoIncrement:true;comment:ID json:id // IDUserID int64 gorm:column:user_id;type:bigint(20) unsigned;not null;comment:用户编号 json:user_id // 用户编号Name string gorm:column:name;type:varchar(255);not null;comment:用户姓名 json:name // 用户姓名Age int64 gorm:column:age;type:tinyint(4) unsigned;not null;comment:用户年龄 json:age // 用户年龄Address string gorm:column:address;type:varchar(255);not null;comment:地址 json:address // 地址CreateTime time.Time gorm:column:create_time;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:添加时间 json:create_time // 添加时间UpdateTime time.Time gorm:column:update_time;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:更新时间 json:update_time // 更新时间 }那么在service层直接进行查询操作即可。gorm框架支持同时查询列表和总数这一点非常好。 参考文档 https://gorm.io/zh_CN/docs/query.html https://www.cnblogs.com/rainbow-tan/p/15822714.html 首先定义两个结构体分别用来处理 客户端请求的参数 和 服务端返回的结构 // 获取用户列表, 客户端的请求参数 type UserListRequest struct {Address string json:address binding:required //用户地址关键词,假设此处要求检索的时候必填Name string json:name //用户姓名common.CommonListRequest }// 获取用户列表, 服务端的响应结构体, 在原有的数据表结构的基础上进行扩展 type UserListResponse struct {model.UserNamePinyin string json:name_pinyin //姓名拼音AgeDesc string json:age_desc //年龄描述 }在 service/users/userService.go 中的查询逻辑代码如下 func (ctx *UserService) QueryUserList(params UserListRequest) ([]UserListResponse, int64) {//查询条件//fmt.Println(params)where : 11if params.Address ! {where and address like % params.Address %}if params.Name ! {where and name params.Name }//查询总数和列表var dataList []UserListResponsevar count int64page : params.Page //当前第几页pageSize : params.PageSize //每页查询多少条offset : (page - 1) * pageSize //偏移量err : ctx.GormDB.Model(model.User{}).Select(*).Where(where).Order(id desc).Limit(pageSize).Offset(offset).Scan(dataList).Limit(-1).Offset(-1).Count(count).Errorif err ! nil {fmt.Println(fmt.Sprintf(数据库查询错误:%s, err))return nil, 0}fmt.Println(fmt.Sprintf(总条数:%d, count))for k, v : range dataList { //这里简单示例 对查询的结果进行二次处理var ageDesc stringif v.Age 18 {ageDesc 成年} else {ageDesc 未成年}dataList[k].AgeDesc ageDescdataList[k].NamePinyin common.ConvertChineseToPinyin(v.Name)}return dataList, count }controller 接下来将service层查询到的结果返回给 controller进一步处理 //controllers/customerController/customer.gofunc GetCustomerList(c *gin.Context) {//入参校验var requestData users.UserListRequesterr : c.Bind(requestData) //执行绑定//fmt.Println(获取客户端请求的参数, requestData)if err ! nil {controllers.ReturnError(c, 1001, fmt.Sprintf(请求参数错误: %s, err))return}//调用service查询数据service : users.NewUserService()dataList, count : service.QueryUserList(requestData)//自定义要返回的字段showFields : []string{id, name, name_pinyin, age, age_desc, address}var resultList []map[string]anyfor _, item : range dataList {//fmt.Println(item)itemMap : funcUtils.ConvertToFlatMap(item, ) // 通过反射将嵌套结构体转换为一维 map//fmt.Println(itemMap)itemData : make(map[string]any)for _, field : range showFields {itemData[field] itemMap[field]}resultList append(resultList, itemData)}controllers.ReturnSuccess(c, 200, success, resultList, int(count)) } 通过 err : c.Bind(requestData) 将客户端传来的参数和结构体的字段进行绑定showFields 中自定义了需要返回给客户端的字段funcUtils.ConvertToFlatMap(item, ) 将数据表的结构体转换为 map为了方便和上面的 showFields 进行比对并且不需要再额外定义新的结构体了go里面动不动就要定义结构体确实挺烦人的干脆转为map处理通用业务逻辑方便省事。需要注意的是由于我们前面定义的服务端返回数据结构体采用了结构体嵌套的形式 type UserListResponse struct {model.UserNamePinyin string json:name_pinyin //姓名拼音AgeDesc string json:age_desc //年龄描述 }因此这里通过结构体转换map的时候需要使用反射和递归的思路去处理核心代码如下 // 通过反射将嵌套结构体转换为一维 map func ConvertToFlatMap(obj interface{}, prefix string) map[string]interface{} {val : reflect.ValueOf(obj)result : make(map[string]interface{})// 递归处理结构体flatten(val, prefix, result)return result }// 递归处理结构体 func flatten(val reflect.Value, prefix string, result *map[string]interface{}) {// 如果当前值是结构体类型if val.Kind() reflect.Struct {for i : 0; i val.NumField(); i {field : val.Type().Field(i)fieldValue : val.Field(i)// 检查字段是否导出if field.PkgPath {//newPrefix : field.NamenewPrefix : field.Tag.Get(json)// 递归处理子字段flatten(fieldValue, newPrefix, result)}}} else if val.Kind() reflect.Slice {// 如果当前值是切片类型for i : 0; i val.Len(); i {elem : val.Index(i)// 递归处理切片中的元素newPrefix : strconv.Itoa(i)flatten(elem, newPrefix, result)}} else {// 如果当前值不是结构体或切片类型(*result)[prefix] val.Interface()} }路由 在上面定义好的一个路由文件中添加相关路由入口 router/customer.go package routerfunc CustomerRouter(e *gin.Engine) {customer.POST(/list, customerController.GetCustomerList)} }运行效果 启动多个服务 示例代码如下 // run_multiple_server.go// 运行多个服务 package mainimport (fmtgithub.com/gin-gonic/gingolang.org/x/sync/errgroupnet/httptime )var g errgroup.Groupfunc main() {//服务器1http://127.0.0.1:8081/server01 : http.Server{Addr: :8081,Handler: router01(),ReadTimeout: 5 * time.Second, //读取超时时间WriteTimeout: 10 * time.Second, //写入超时时间}//服务器2http://127.0.0.1:8082/server02 : http.Server{Addr: :8082,Handler: router02(),ReadTimeout: 5 * time.Second,WriteTimeout: 10 * time.Second,}//开启服务g.Go(func() error { //开启服务器程序1return server01.ListenAndServe()})g.Go(func() error { //开启服务器程序2return server02.ListenAndServe()})//让监听程序一直处于等待状态if err : g.Wait(); err ! nil {fmt.Println(执行失败, err)} }func router01() http.Handler {r1 : gin.Default()r1.GET(/, func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{code: http.StatusOK,msg: 服务器01的响应,},)})return r1 }func router02() http.Handler {r1 : gin.Default()r1.GET(/, func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{code: http.StatusOK,msg: 服务器02的响应,},)})return r1 }//解决包golang.org/x/sync/errgroup 无法 go get的问题 // cd $GOPATH/src/golang.org/x // git clone https://github.com/golang/sync.git // git clone https://github.com/golang/crypto.git // git clone https://github.com/golang/sys.git 此时两个站点可以同时访问 完整源代码https://gitee.com/rxbook/go-demo-2025
http://www.w-s-a.com/news/756946/

相关文章:

  • 福州网站seo推广优化微信商家小程序怎么弄
  • 免费网站推广工具在游戏网站做中介合法
  • 网站建设前的规划网站建设公司六安
  • 公司注册网站开发的行业表述南宁在百度上建网站
  • 创建企业网站国内网站用django做的
  • 云主机网站的空间在哪制作微网站的平台
  • 长沙做网站 青创互联wordpress4.4.1
  • 宜昌哪里有专业做网站的网站开发做什么的
  • 3小说网站开发东莞网站公司哪家好
  • 做网站安全联盟解ps网站设计概述
  • 聊城公司做网站wordpress连接域名
  • 宣传网站建设的意义台州行app官网下载
  • 温州 网站优化网站开发公司前置审批
  • 网站开发具体的工作内容网站下载app免费
  • seo网站建设时文章频率昆山网站建设ikelv
  • 中天建设中瑞物资网站优化建立生育支持政策体系
  • 网站页面的宽度大网站怎样选域名
  • icp网站备案流程wordpress post 405
  • 网站怎样上传到空间重庆有多少网站
  • 用模板建商城购物网站嘉定专业网站建设
  • 网站开发与应用 论文dede手机医院网站模板
  • 织梦 网站栏目管理 很慢自学网页设计难吗
  • 茶文化建设网站的意义平顶山网站建设服务公司
  • 建设网站详细流程南京宣传片制作公司
  • 合肥网站排名什么网站做电气自动化兼职
  • 如何用api做网站交通建设门户网站
  • 阳西住房和城乡规划建设局网站长沙网站seo技巧
  • 长沙知名网站推广手机画设计图软件
  • 顺德公司做网站自己有网站怎么优化
  • 南京网站开发南京乐识专业外贸流程知乎