Introduction

欢迎来到我的博客,本博客主要分享 WEB 开发的一些学习经历。以及我个人读书的思考和对生活的感悟。

  • 本博客也会涉及一些对于编程思想的介绍和开发工具的一些好用的插件及进阶用法。

  • 如果博客里的文章引发了你的思考,欢迎你与我交流。

Casbin 入门

Casbin 是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型。 通俗来讲就是一个权限管理的框架,把常见的权限管理集成在框架中,使用者只需要根据框架规范就可以很方便的实现相应的权限控制。 Casbin 支持的权限管理如下: ACL (Access Control List, 访问控制列表) 具有 超级用户 的 ACL 没有用户的 ACL: 对于没有身份验证或用户登录的系统尤其有用。 没有资源的 ACL: 某些场景可能只针对资源的类型, 而不是单个资源, 诸如 write-article , read-log 等权限。 它不控制对特定文章或日志的访问。 RBAC (基于角色的访问控制) 支持资源角色的RBAC: 用户和资源可以同时具有角色 (或组)。 支持域/租户的RBAC: 用户可以为不同的域/租户设置不同的角色集。 ABAC (基于属性的访问控制): 支持利用 resource.Owner 这种语法糖获取元素的属性。 RESTful: 支持路径, 如 /res/* , /res/: id 和 HTTP 方法, 如 GET , POST , PUT , DELETE 拒绝优先: 支持允许和拒绝授权, 拒绝优先于允许。 优先级: 策略规则按照先后次序确定优先级,类似于防火墙规则。 Model 概念 Model 相当于框架的配置文件,如我想在系统里有可能实现 是ALC 或者 RBAC ,应该如何告诉 Casbin 框架,我实现的是那种类型的权限控制呢?...

July 29, 2022 · 2 min · 云溪

后端如何学习前端开发  [draft]

在 web 开发领域,前后端分离越来越普遍,前后端之间的技术壁垒也随着提高。混合开发的年代,后端多多少少都要会写一些前端的代码,而现在后端已经越来越无法写前端的代码,如果后端想学习前端技术,该如何入手呢?接下来讲讲我的一些经验。 打破思想障碍 前端的发展十分迅速,且生态和标准十分割裂,这对专业的前端也是一个比较大的挑战,对于后端而言难度就更可想而知了。 幸运的是,我们如果只是想做前端入门并且能够开发一些普通的项目的为目标的话还是没有这么大的阻碍的。我们可以花费 20 % 的学习时间解决,80 % 的前端开发问题。剩下的 20% 开发问题,你可以有两个选择: 交给专业的前端去做 继续精进前端技术,自己解决 确定学习目标 学习前端主要有以下几个部分: CSS JS 框架 (VUE ,React, angular) CSS CSS 部分是前端很重要的一个部分,也是大多数后端都不是很擅长的部分,关于 CSS 部分,我们可以借助 UI 框架去解决问题,UI 框架会封装很多组件,我们只需要用相关组件进行布局即可。 CSS 布局就变得十分的重要了,好在现在前端有了 flex 布局,在兼容性和开发便利性上来说都对程序员十分友好,因此对于 flex 布局这部分应该要重点学习和掌握。 CSS 布局另一个比较重要的就是「定位」,因此「定位」这部分的知识也是需要重点掌握的。 掌握了 flex 和 「定位」两部分知识,基本上绝大多数的布局都没有什么问题了,配合上 UI 框架的加持基本上普通页面的开发就可以完成的七七八八了。 js 框架 一般想学习前端的朋友心中都会有自己想学习的框架了,这里建议挑选你周边前端在使用的一些框架,对于你后续的学习能有一些帮助。 学习方法 关于 CSS 的学习方法,主要是看文档和练习,把布局重点学习即可,下面介绍主要介绍一下 JS 框架的学习方法。 阅读文档 这部分可以根据自身掌握情况有选择的进行,如果你对所选 JS 框架,文档已经通读并且对文档结构有了一个掌握就可以跳过这部分。...

July 17, 2022 · 1 min · 云溪

golang 简洁架构介绍

在 go 开发中,首先遇到的一个问题,应该怎么设计开发架构。一个好的架构可以在后续的项目开发中能够更好的使用项目的推进,同时能够让团队的配合更加的顺利。 一个简洁的架构应该具有如下几个特点: 不依赖框架:好的架构应当是独立的,不依赖框架可扩展的 不依赖 UI:UI 应该很容易修改,而不需要改业务部分代码 独立于数据库:不绑定数据库,可以在不改动业务代码的情况下,更换其他数据库 可测试的: 能够比较方便测试用例的编写 下面目录结构引自 《go 整洁模板》 ├─cmd 应用入口 │ └─app ├─config ├─docs // 存放文档 ├─internal │ ├─app │ ├─controller // 控制器 │ │ ├─amqp_rpc │ │ └─http │ │ └─v1 │ ├─entity // 实体层 │ ├─middleware // 中间件 │ └─usecase │ ├─repo // 数据库操作 │ └─webapi // RESTful API ├─migrations ├─pkg //以被外部程序安全导入的包 │ ├─crypto │ ├─httpresponse │ ├─httpserver │ ├─logger │ ├─mysql │ ├─postgres │ ├─rabbitmq │ └─redis 分层介绍 层级调用是通过外层->内层,内层是不知道外层的存在的。在内层代码中,不应该引用外层声明的:变量、类、方法,结构体。...

June 29, 2022 · 1 min · 云溪

golang 接口(interface)最佳实践

接口定义 应该定义在接口所使用的包中,而非接口实现的包中。 以io包中的io.Reader/io.Wirter为例,接口定义在io包中,而他的实现bytes.Buffer、os.File等都是在不同包中。 接口实现应该返回具体类型 应该返回对应的结构体或指针,这样实现类如果扩展新的方法就可以直接添加,无需改动接口定义部分,更加灵活。 //为了方便演示,本实例代码未遵循「接口需要在使用包中声明」规范 package demo import "fmt" type Demo interface { show() error } type MyDemo struct { } //这里的返回值应该是 `MyDemo` 或 `*MyDemo` 而非 `Demo` func NewMyDemo() *MyDemo { return &MyDemo{} } func (md *MyDemo) show() error { fmt.Println("show") return nil } 接口应该什么时候定义 在当前模块有依赖外部服务的时候,这时候就会定义一个接口,来对外部的依赖资源进行抽象解耦,屏蔽接口的实现。相反,依赖的提供方在不知道使用方需求的时候,定义接口也就没什么意义。

June 11, 2022 · 1 min · 云溪

如何学习一门新编程语言  [draft]

概括了解  首先在学习一门新的编程语言之前,需要对语言进行一个整体的了解。该语言与其他编程语言相比有什么特别之处。 在了解语言的同时也是一个确立边界的过程,每个语言都有自身的优势与劣势。我们只有清楚的了解各个语言的特性,才可以在技术选型的过程中更有把握选择更为合适的语言推进项目的进行。 了解了语言边界之后,需要做的就是了解一下语言层面一些常见的问题。这样能够在开发前避免一些常见的坑,也能在一些问题出现后,能够更好的把握问题的出现原因。 通过上面方法,基本上就可以完成对一个新编程语言的了解,以及常见的一些开发问题,也可以在后续的选型和开发中做到了然于胸。 熟悉语法 语法学习有两种方式: 文档学习(信息获取快,一般适合经验比较丰富的老手) 视频学习(更为直观,更适合新手) 两种方式各有优劣,选择更适合自己的方式就好。语法学习的过程中最重要的就是去敲代码,仅仅看是不够的,动手去敲出学习的代码,是高效掌握语法的关键。 熟悉规范 学习规范 规范在编程开发中是十分重要的,在写代码之前一定要了解语言的开发规范。一个良好的编程规范,是优雅开发的开始,也是团队合作的基石。如果一个团队每个人都有自己的开发风格,可想而知后续的项目维护将会是怎样的噩梦。 规范学习不需要一开始就对规范有很深入的了解,只需要有一个大概的了解即可,后续如果在开发中遇到疑惑,可以再去查找相关规范。对规范的应用应该像查字典,你不需要会背诵,但是你要知道去查找。 最佳实践 我之所以比别人看得远一些,是因为我站在巨人的肩膀上 学习最佳实践。每个编程语言都会有一些最佳实践(best practices)。这些最佳实践(best practices)是行业开发人员在进行大量开发验证和思考后做出的总结。并且最佳实践(best practices)也是在迭代的,社区会在前人的最佳实践的基础上,加上自己的一些总结,因此最佳实践(best practices)一般质量都非常的高。 最佳实践(best practices)的学习中,需要不断的思考和辩证,要做到知其然知其所以然。只有这样你才能够在最佳实践(best practices)的基础上梳理出自己的最佳实践,更好的服务后续的项目开发。 最佳实践(best practices)可以让你快速的梳理出一套项目架构,也能让你快速的写出非常高质的代码。 总结 学会一门编程语言,不仅仅是会语法,会开发就可以了。还需要了解语法和最佳实践(best practices),只有这样才能开发出高质的代码,也能在开发的过程中减少一些问题的出现。 在生活中也经常能够遇到两种人: 一种是:我学习完基础的语法,能开发出来功能就可以了,不在乎架构的合理性和编程规范。 另一种则是:学习完基础语法,能开发的基础上,去了解规范,学习最佳实践,不断思考和验证的人。 其实两种思想恰好也是对应的「短期主义」与「长期主义」。短期看两种思想看不出差距,在长期看,两种思想的发展是天差地别的。

June 10, 2022 · 1 min · 云溪