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

环球旅游网的网站建设优化营商环境工作总结

环球旅游网的网站建设,优化营商环境工作总结,电商设计师工资高吗,免费做logo网站文章目录简介建表protohandler商品小结简介 商品微服务主要在于表的设计,建哪些表?表之间的关系是怎样的? 主要代码就是 CURD表和字段的设计是一个比较有挑战性的工作,比较难说清楚,也需要经验的积累,这里…

文章目录

  • 简介
  • 建表
  • proto
  • handler
    • 商品
  • 小结

简介

  • 商品微服务主要在于表的设计,建哪些表?表之间的关系是怎样的?
    • 主要代码就是 CURD
    • 表和字段的设计是一个比较有挑战性的工作,比较难说清楚,也需要经验的积累,这里关注点在微服务,暂时先 “借鉴” 别人的设计
    • 一般需要多次迭代才能设计出比较合理的表结构
  • 我们将商品相关的服务都放在这部分,方便建表和管理;微服务并不是越多越好,分成太多服务可能会让系统太复杂难以管理
    • 如何划分微服务需要积累经验,也有针对性的方法可以套用,需要单独学习

建表

  • 新建商品微服务 Service 层,直接把 user_srv 的目录拷过来,整体替换相关路径
    1
  • 表设计及相关操作,主要有四张表
    2
  • 放个商品表的结构
    // 商品表
    // 某一个具体的商品
    type Goods struct {BaseModelCategoryID int32    `gorm:"type:int;not null"`Category   Category // 一对多/一对一BrandsID   int32    `gorm:"type:int;not null"`Brands     Brands   // 一对一OnSale   bool `gorm:"default:false;not null"`ShipFree bool `gorm:"default:false;not null"`IsNew    bool `gorm:"default:false;not null"`IsHot    bool `gorm:"default:false;not null"`Name            string   `gorm:"type:varchar(50);not null"`GoodsSn         string   `gorm:"type:varchar(50);not null"`ClickNum        int32    `gorm:"type:int;default:0;not null"`SoldNum         int32    `gorm:"type:int;default:0;not null"`FavNum          int32    `gorm:"type:int;default:0;not null"`MarketPrice     float32  `gorm:"not null"`ShopPrice       float32  `gorm:"not null"`GoodsBrief      string   `gorm:"type:varchar(100);not null"`Images          GormList `gorm:"type:varchar(1000);not null"`DescImages      GormList `gorm:"type:varchar(1000);not null"`GoodsFrontImage string   `gorm:"type:varchar(200);not null"`
    }
    
  • 对字段的限制一般都要求 not null,也就是必须有值,然后限制用户必须输入或者我们设置 default
    • 设置为 null 带来的问题
  • 定义 model
    • 注意表之间的关联关系,查看 gorm 文档了解使用方式
  • 生成表结构
    • 新建数据库,直接在(109.128)机器上操作,方便启动项目
    • CREATE DATABASE IF NOT EXISTS shop_goods_srv DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
    • 一个微服务对应一个数据库,要和其他微服务隔离开
    • 还是在 model/main 下面运行一次 main 方法即可
      4
    • 运行 sql 文件,导入数据;将上面创建的表结构全部删掉(不删也行),因为 SQL 文件里包含了建表语句
      3

proto

  • proto 文件的设计又是一个重点,首先要根据页面进行需求分析(前端页面和后台管理页面),需要哪些接口?传递哪些参数?会有什么响应?
  • 接口定义也不是一蹴而就的,后面可能会修改,不必在一开始追求完美
  • protoc -I . goods.proto --go_out=plugins=grpc:. 生成 stub 文件
    • 遇到点小问题,empty.proto 找不到,拷过来放到 proto/google/protobuf 下面试试
  • 定义 Service 层(Server端)接口(handler),直接搜 GoodsServer,将接口定义拷过来
    • 这里接口太多,我们分在不同 handler 文件实现,不着急实现,先把接口定义拷过去修改一下引用,因为没有实现的话项目无法启动,
    • 再修改 main.go 和 nacos 配置文件(本地/中心配置),启动项目看能否注册成功
      1

handler

  • 具体实现各接口,先从品牌和轮播图开始,这里放个获取品牌列表的例子
    // 品牌
    func (s *GoodsServer) BrandList(ctx context.Context, req *proto.BrandFilterRequest) (*proto.BrandListResponse, error) {brandListResponse := proto.BrandListResponse{}var brands []model.Brands// 分页:第几页,每页数量// Scopes 需要传一个匿名函数进去,在里面做一些判断并查询数据result := global.DB.Scopes(Paginate(int(req.Pages), int(req.PagePerNums))).Find(&brands)if result.Error != nil {return nil, result.Error}var total int64global.DB.Model(&model.Brands{}).Count(&total) // 单独再获取一次品牌总数brandListResponse.Total = int32(total)// 准备响应数据,单个品牌的BrandInfoResponse 和品牌列表的 brandListResponse,要根据 proto 定义的 message 安排好var brandResponses []*proto.BrandInfoResponsefor _, brand := range brands {brandResponses = append(brandResponses, &proto.BrandInfoResponse{Id:   brand.ID,Name: brand.Name,Logo: brand.Logo,})}brandListResponse.Data = brandResponsesreturn &brandListResponse, nil
    }
    
  • 回答一个上一篇的问题:查询数据时不传表名,传入 model 定义的 struct 就可以吗?
    • 是的,比如 DB.First(&model.Brands{}),因为 struct 名就是表名,改表名也是通过绑在 struct 上的函数进行的
  • 商品分类
    • 先看 GetAllCategorysList,这里比较 tricky,因为有多级分类,需要同时查询两级 subCategory
    • 我们希望得到的数据格式
      [{"id":xxx,"name":"","level":1,"is_tab":false,"parent":13xxx,"sub_category":["id":xxx,"name":"","level":1,"is_tab":false,"sub_category":["id":xxx,"name":"",]]}
      ]
      
    • 通过 gorm 提供的预加载(反向查询)实现
    • 条件查询一级目录:global.DB.Where(&model.Category{Level: 1})
    • 反向查询两级子类目:Preload("SubCategory.SubCategory")
    • 再贴一个获取子分类的函数,grpc 的接口实现都是三步走
      // 获取子分类,传入一级或二级类别ID
      func (s *GoodsServer) GetSubCategory(ctx context.Context, req *proto.CategoryListRequest) (*proto.SubCategoryListResponse, error) {// 1.准备返回值categoryListResponse := proto.SubCategoryListResponse{} // total, info(parent), sub// 2.根据请求参数查询数据+判空var category model.Categoryif result := global.DB.First(&category, req.Id); result.RowsAffected == 0 {return nil, status.Errorf(codes.NotFound, "商品分类不存在")}// 3.填充返回值各字段-InfocategoryListResponse.Info = &proto.CategoryInfoResponse{Id:             category.ID,Name:           category.Name,Level:          category.Level,IsTab:          category.IsTab,ParentCategory: category.ParentCategoryID,}var subCategorys []model.Categoryvar subCategoryResponse []*proto.CategoryInfoResponse// 如果要获取三级子分类,默认获取下面一级//preloads := "SubCategory"//if category.Level == 1 {//	preloads = "SubCategory.SubCategory"//}// 只有在一级时才有获取三级的需求,但是这里没必要,这里把这个接口做的小一点,限制在只获取下一级,需要三级的话再在二级一一请求global.DB.Where(&model.Category{ParentCategoryID: req.Id}).Find(&subCategorys)for _, subCategory := range subCategorys {subCategoryResponse = append(subCategoryResponse, &proto.CategoryInfoResponse{Id:             subCategory.ID,Name:           subCategory.Name,Level:          subCategory.Level,IsTab:          subCategory.IsTab,ParentCategory: subCategory.ParentCategoryID,})}// 3.填充返回值各字段-SubCategoryscategoryListResponse.SubCategorys = subCategoryResponsereturn &categoryListResponse, nil
      }
      
    • 这里需要写接口测试,可以在 test 目录写 UT 或者每个 handler 新建目录在 main 函数运行看效果(一个目录下只能有一个main)
  • 品牌分类
    • 查询品牌和分类数据表,这是个中间表,内容较多,相关操作也较为复杂一点
      5
    • model 定义如下
      type GoodsCategoryBrand struct {BaseModelCategoryID int32    `gorm:"type:int;index:idx_category_brand,unique"` // 外键Category   Category // 外键约束,约束谁就指向谁BrandsID int32 `gorm:"type:int;index:idx_category_brand,unique"` // 外键Brands   Brands
      }
      
  • 这些接口都是给 web 层调用,但有的是给用户准备数据,有的是给后台管理员准备

商品

  • 商品接口,关系到最终展示给用户的数据,最重要
  • 注:这部分有很多入口:搜索、新品、热门、价格区间、商品分类,都需要调用接口获取对应商品,这些都可以看做是查询条件
  • 注意下面几点
    • 条件是可以叠加的,所有用 localDB 接收前面过滤出的数据体
    • 分类条件要考虑层级
  • 后续会集成 elastic 用于搜索

小结

  • 快速开发了商品微服务的 Service 层,服务配置项还是和 user_srv 相同,包括 nacos,mysql,consul,serverConfig,不需要更改定义
  • 接下来是商品微服务 API 层的快速开发

文章转载自:
http://dinncoendosome.bpmz.cn
http://dinncolazybones.bpmz.cn
http://dinncoindue.bpmz.cn
http://dinncolusus.bpmz.cn
http://dinncoheize.bpmz.cn
http://dinncohayes.bpmz.cn
http://dinncoafghanistan.bpmz.cn
http://dinncothump.bpmz.cn
http://dinncogimmal.bpmz.cn
http://dinncointarsist.bpmz.cn
http://dinncoleavening.bpmz.cn
http://dinncoladen.bpmz.cn
http://dinncobrelogue.bpmz.cn
http://dinncoenclave.bpmz.cn
http://dinncobutterfingered.bpmz.cn
http://dinncoclench.bpmz.cn
http://dinncofalsism.bpmz.cn
http://dinncorule.bpmz.cn
http://dinncomargrave.bpmz.cn
http://dinncopsychometric.bpmz.cn
http://dinncojerrican.bpmz.cn
http://dinncoinobservancy.bpmz.cn
http://dinncointuc.bpmz.cn
http://dinncoreducible.bpmz.cn
http://dinncoforefathers.bpmz.cn
http://dinncorightfulness.bpmz.cn
http://dinncocorporatist.bpmz.cn
http://dinncoensilage.bpmz.cn
http://dinncorifampicin.bpmz.cn
http://dinncologaniaceous.bpmz.cn
http://dinncofrancium.bpmz.cn
http://dinncoaeromancy.bpmz.cn
http://dinncovibraphone.bpmz.cn
http://dinncobushmanship.bpmz.cn
http://dinncodevastatingly.bpmz.cn
http://dinncomiddling.bpmz.cn
http://dinncobruin.bpmz.cn
http://dinncochicane.bpmz.cn
http://dinncodhole.bpmz.cn
http://dinncozoophily.bpmz.cn
http://dinncoproceleusmatic.bpmz.cn
http://dinncorecollected.bpmz.cn
http://dinncobsb.bpmz.cn
http://dinncoanticipation.bpmz.cn
http://dinncopolychromatophil.bpmz.cn
http://dinncofeminacy.bpmz.cn
http://dinncourania.bpmz.cn
http://dinncodlp.bpmz.cn
http://dinncoterraalba.bpmz.cn
http://dinncocurriculum.bpmz.cn
http://dinncoperiderm.bpmz.cn
http://dinncoshelve.bpmz.cn
http://dinncothalassocracy.bpmz.cn
http://dinncocolonist.bpmz.cn
http://dinncopinang.bpmz.cn
http://dinncoganoin.bpmz.cn
http://dinncoantiphlogistin.bpmz.cn
http://dinncofacticity.bpmz.cn
http://dinncoragger.bpmz.cn
http://dinncohokum.bpmz.cn
http://dinncobrutal.bpmz.cn
http://dinncoghat.bpmz.cn
http://dinncolackey.bpmz.cn
http://dinncounwindase.bpmz.cn
http://dinnconights.bpmz.cn
http://dinncoraceball.bpmz.cn
http://dinncobreath.bpmz.cn
http://dinncopolyolefin.bpmz.cn
http://dinncoindeterminacy.bpmz.cn
http://dinncosemasiology.bpmz.cn
http://dinncopromin.bpmz.cn
http://dinncosonicguide.bpmz.cn
http://dinncoskimboard.bpmz.cn
http://dinncoinhibition.bpmz.cn
http://dinncogrift.bpmz.cn
http://dinncoequinia.bpmz.cn
http://dinncolinewalker.bpmz.cn
http://dinncocontemptuous.bpmz.cn
http://dinncofenestration.bpmz.cn
http://dinncoambry.bpmz.cn
http://dinncotrickiness.bpmz.cn
http://dinncorepublic.bpmz.cn
http://dinncovirgo.bpmz.cn
http://dinncofederation.bpmz.cn
http://dinncolarnax.bpmz.cn
http://dinncoperiphrastic.bpmz.cn
http://dinncomeningitis.bpmz.cn
http://dinncoguyenne.bpmz.cn
http://dinncoshamrock.bpmz.cn
http://dinncodistome.bpmz.cn
http://dinncooccupancy.bpmz.cn
http://dinncoanthologize.bpmz.cn
http://dinncosqueegee.bpmz.cn
http://dinncoshane.bpmz.cn
http://dinncolessening.bpmz.cn
http://dinncopotheen.bpmz.cn
http://dinncocommitment.bpmz.cn
http://dinncofreshness.bpmz.cn
http://dinncovenerate.bpmz.cn
http://dinncoamphitropous.bpmz.cn
http://www.dinnco.com/news/99313.html

相关文章:

  • 没有网站如何做cpa推广谷歌seo是指什么意思
  • wordpress 换域名 插件成都seo招聘信息
  • wordpress子主题空白宁波正规seo推广公司
  • 网站开发技术框架百度一下百度官方网
  • 网站开发前端和后端的区别国外网站排行
  • 如何开一家网站建设公司产品推广文案范例
  • 毕业设计做网站老师会问什么腾讯疫情实时数据
  • 网络营销外包推广定制公司快速提高网站关键词排名优化
  • 微信小程序怎么制作商城嘉兴seo优化
  • 山东省住房城乡建设厅查询网站百度竞价推广一个月多少钱
  • c 如何做网站上海何鹏seo
  • 网页设计报价表温州网站优化推广方案
  • 小工厂怎么做网站谷歌搜索引擎入口google
  • 中天建设哪里的百度seo优化技巧
  • 网站加搜索框深圳互联网公司50强
  • 木门行业做网站有什么好处营销方案怎么写
  • .net 做网站南京百度推广开户
  • 深圳餐饮网站建立随机关键词生成器
  • 网站建设源码开发模板之家官网
  • ftp网站目录沧州网站seo
  • java做网站的职业网站运营一个月多少钱
  • 联合早报 即时消息seo优化方案
  • 自助定制网站开发公司seo站
  • 用jquery做网站百度网页推广
  • 北京网站优化方法郑州网站定制
  • 建设网站最新军事新闻最新消息
  • 大型新型网站新闻最新消息
  • dw中旅游网站怎么做牛奶软文广告营销
  • wpsppt网站链接怎么做青岛运营网络推广业务
  • 新建网站如何推广搜索引擎的工作原理是什么?