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

微信做任务赚钱的网站淘宝定向推广

微信做任务赚钱的网站,淘宝定向推广,合肥网站建设 一浪,wordpress弹出层插件提示: 所有体系课见专栏:Go 项目开发极速入门实战课;本节课最终源码位于 fastgo 项目的 feature/s11 分支;更详细的课程版本见:Go 项目开发中级实战课:24 | 业务实现(1):…

提示:

  • 所有体系课见专栏:Go 项目开发极速入门实战课;
  • 本节课最终源码位于 fastgo 项目的 feature/s11 分支;
  • 更详细的课程版本见:Go 项目开发中级实战课:24 | 业务实现(1):实现 Store 层数据结构定义

在完成基础功能开发后,需要进一步开发与业务逻辑相关的代码。相较于基础功能,业务逻辑代码不仅占据了代码仓库的大部分代码量,其复杂性也更高。因此,需要设计一种合理的代码架构,以确保代码的可读性、可维护性和可扩展性。目前,业界较为流行且被广泛认可的代码架构是简洁架构。

本课程第 14 节课详细介绍了 fastgo 项目的简洁架构设计。本节课,将根据第 14 节课的简洁架构设计,实现 fastgo 的业务逻辑。

三层架构开发

在第 14 节课中介绍了 fastgo 三层简洁架构的依赖关系:Handler 层依赖 Biz 层,Biz 层依赖 Store 层,Store 层依赖数据库。依赖关系如下图所示。

为了能够随时测试所开发的代码功能,最优的方式是优先开发依赖较少的组件。否则,需要先 Mock 或开发所依赖的功能(层)。因此,开发顺序应为:先开发 Store 层,接着是 Biz 层,最后是 Handler 层。

本节课及接下来几节课代码改动量较大,其中有很多同类改动。为了提高你的学习效率,本节课不会对代码进行逐行解读,相反主要讲解其中的核心设计和实现。

Store 层数据结构定义

根据依赖关系,需要先开发 Store 层代码。Store 层依赖一些数据类型。如果项目持久存储用的是 MySQL/MariaDB 数据库,这些数据类型其实就是 GORM Model。GORM Model 实际上是数据库表字段到 Go 结构体的映射。可以根据 fastgo 数据库中的表来创建对应的 Model。

fastgo 数据库中包含以下三张表,这些表的结构在项目设计阶段已完成设计和创建:

  • user 表:该表用于存储用户数据;
  • post 表:该表用于存储博客数据。

需要根据表名、表字段及表字段类型创建 Store 层的 Go 结构体,以映射数据库中的对应表。

GORM Model 结构体定义可以手动编写,也可以借助工具自动生成。建议使用工具自动生成,具体步骤如下:

  1. 创建数据库和数据库表;
  2. 根据数据库表生成 Model 文件;
  3. 修改生成的 Go 代码。

根据数据库表生成 Model 文件

在 Go 项目开发中,编写 GORM Model 文件通常有多种方式,例如根据数据库表结构手动编写 GORM Model,或使用读取数据库表结构并自动生成 GORM Model 的工具,例如 GORM 官方提供 gentool。

$ go install gorm.io/gen/tools/gentool@latest
$ gentool -db mysql -dsn 'fastgo:fastgo1234@tcp(1127.0.0.1:3306)/fastgo' -onlyModel -modelPkgName internal/apiserver/model

上述命令会在 internal/apiserver/model/ 目录下生成 user.gen.go 和 post.gen.go GORM Model 文件。这 2 个文件中包含了 GORM Model 结构体定义。

提示:在第 02 节课中,我们安装了数据库,并创建了 fastgo 数据库及表。

添加 GORM 钩子

在生成了 GORM Model 结构体之后,可根据需要给这些结构体添加一些 GORM 钩子。常用的 GORM 钩子见下表所示:

返回头说明
BeforeCreate在执行 INSERT 语句前触发(比如对数据进行校验或补充字段)
AfterCreate在执行 INSERT 语句后触发(比如生成关联值或更新其他表数据)
BeforeFind在执行查询(SELECT)语句前触发(比如动态调整查询条件)
AfterFind在执行查询(SELECT)操作后触发(比如格式化数据或处理查询返回值)
BeforeUpdate在执行 UPDATE 语句前触发(比如校验更新字段的合法性)
AfterUpdate在执行 UPDATE 语句后触发(比如记录操作日志或更新缓存)
BeforeDelete在执行 DELETE 语句前触发(比如检查业务逻辑或软删除处理)
AfterDelete在执行 DELETE 语句后触发(比如记录日志或同步其他系统的数据)
BeforeSave在执行任何保存(INSERT 或 UPDATE)操作之前触发(适用于既需要创建也需要更新的公共逻辑)
AfterSave在执行任何保存(INSERT 或 UPDATE)操作之后触发(适用于既需要创建也需要更新的公共逻辑)

fastgo 项目在 internal/apiserver/model/hook.go 文件中,添加了数据库表 userIDpostID 字段的自动生成钩子,用来生成并保存记录的唯一标识符,代码如下所示:

package modelimport ("gorm.io/gorm""github.com/onexstack/fastgo/internal/pkg/rid"
)// AfterCreate 在创建数据库记录之后生成 postID.
func (m *PostM) AfterCreate(tx *gorm.DB) error {m.PostID = rid.PostID.New(uint64(m.ID))return tx.Save(m).Error
}// AfterCreate 在创建数据库记录之后生成 userID.
func (m *UserM) AfterCreate(tx *gorm.DB) error {m.UserID = rid.UserID.New(uint64(m.ID))return tx.Save(m).Error
}

上述代码在创建完数据库表记录之后,会调用 rid 包,基于数据库生成的自增 ID 生成一个形如 user-uvalgf 的英文唯一 ID,并调用 tx.Save() 方法将 ID 更新到表记录中。

Go 项目开发中,需要为每一个条 REST 资源生成唯一标识符(Unique Identifier,UID),以唯一定位该 REST 资源。例如更新资源、删除资源时,需要提供该唯一 ID。

fastgo 项目的 github.com/onexstack/fastgo/internal/pkg/rid 包用来生成唯一 ID。rid(resource id)包核心实现如下:

package ridimport ("github.com/onexstack/onexstack/pkg/id"
)const defaultABC = "abcdefghijklmnopqrstuvwxyz1234567890"type ResourceID stringconst (// UserID 定义用户资源标识符.UserID ResourceID = "user"// PostID 定义博文资源标识符.PostID ResourceID = "post"
)// String 将资源标识符转换为字符串.
func (rid ResourceID) String() string {return string(rid)
}// New 创建带前缀的唯一标识符.
func (rid ResourceID) New(counter uint64) string {// 使用自定义选项生成唯一标识符uniqueStr := id.NewCode(counter,id.WithCodeChars([]rune(defaultABC)),id.WithCodeL(6),id.WithCodeSalt(Salt()),)return rid.String() + "-" + uniqueStr
}

上述代码,定义了一个 ResourceID 数据类型,其 String 方法和 New 方法,分别用来返回资源的字符串标识和资源的唯一 ID,格式为 <资源标识符>-<6 位随机数>。使用带资源前缀的唯一 ID,有利于通过唯一 ID 辨别资源类型,通过前缀避免可能的随机数冲突。

ResourceID 是一个简单的、可扩展的统一表示形式,未来可根据需要添加更多的自定义资源,并复用 ResourceID 的方法,生成新资源的唯一 ID,例如 comment-w6irkgNew(counter uint64) 方法中的 counter 通常为数据库自增 ID,基于数据库自增 ID 生成唯一标识,不仅可以生成短小、易读的唯一 ID,还可以隐藏掉自增 ID 的背后的数据规模。


欢迎加入「云原生AI 实战营」星球,12+ 高质量体系课、20+ 高质量实战项目助你在 AI 时代建立技术竞争力:
Alt文本

http://www.dtcms.com/wzjs/196022.html

相关文章:

  • 珠海网站制作外包温州seo结算
  • 微信网站建设模板下载sem是做什么的
  • 酒店网站报价方案竞价推广是做什么的
  • 秦皇岛市住房和城乡建设局网站关键词收录
  • 上海网站改版方案百度在线客服系统
  • 做网站的qq兼职深圳关键词推广整站优化
  • 做黑界头像网站北京企业推广
  • 苏州做网站公司 速选苏州聚尚网络太原搜索排名提升
  • 网站生成器apk怎么做网络营销项目
  • 专门做行业分析的网站网站收录申请
  • 海拉尔做网站的公司网站查询工具seo
  • 物流企业网站青岛seo网站管理
  • 创网站需要什么网站功能
  • 中国建设报社门户网站google chrome官网
  • 牛商做网站的理念竞价网
  • 上海wordpress网站建设搜索引擎优化的简写是
  • 网站开发什么语音最好微信公众号怎么做文章推广
  • 营销型网站建设 博客网络热词大全
  • 网站背景怎么做优化措施最新回应
  • 怎么做运营网站seo外包一共多少钱
  • 制作网站的过程是对信息的滕州网站建设优化
  • 山西公司网站建设seo搜索引擎优化实战
  • 小网站开发成本企业网站建设步骤
  • 福建泉州做网站公司哪家好免费域名空间申请网址
  • 做本地网站要服务器吗网销怎么做
  • 深圳手机网站建设价格湖南网站设计外包费用
  • 外汇反佣网站建设百度seo排名在线点击器
  • 建设银行网站怎么登录密码忘了怎么办友情链接如何添加
  • 博物馆门户网站建设方案永久不收费免费的聊天软件
  • 做网站的公司一般怎么培训销售营销网络怎么写