• 介绍

Budruby on railsBudBud
  • 安装

curl -sf https://raw.githubusercontent.com/livebud/bud/main/install.sh | shbud -h
  • 创建web app

bud create hellocd hellolsgo.mod  node_modules/  package-lock.json  package.json

不像其他全栈框架,bud生成的初始代码非常少,再添加依赖之后,bud才会生成所有的代码。

bud run
bud run| Listening on http://0.0.0.0:3000
  • 目录结构

Bud提供了一个标准目录结构:

$YOUR_APP├─ bud├─ controller├─ internal├─ public└─ view
  • bud/ 这个目录是创建的时候自动生成的,包含框架生成的代码,偶尔会需要从这个目录导入packages,但大部分时候都可以忽略它,建议不要放在版本控制器里

  • controller/ 控制器目录用来获取http请求,并响应返回

  • view/ 视图目录用来存放视图文件

  • public/ public目录用来存放静态资源

  • internal/ 这个目录不会被Bud框架引用,建议放这个应用特定的packages

  • 控制器和路由

Bud的路由不同于传统的go框架,它遵循一套约定:每个控制器对应一组标准路由,也可以自定义Action,Action和路由一一对应,下面看例子:

bud new controller post

这个命令会生成

controller/post/controller.go 

可以选择实现任意方法,如果要新增一个自定义路由,则需要新增一个方法:​​​​​​​

func (c *Controller) About(ctx context.Context) (string, error) {    return "hello", nil}
/about
  • 请求和响应

解析请求框架会自动完成,可以在action参数里接收,也可以使用单独的结构体接收,例如:​​​​​​​​​​​​​​

func (c *Controller) About(ctx context.Context, name string) (string, error) {    return fmt.Sprintf("hello %s", name), nil}
type Input struct {    Name string}
func (c *Controller) About(ctx context.Context, in *Input) (string, error) {    return fmt.Sprintf("hello %s", in.Name), nil}

一个控制器如果没有对应的视图,总是返回json,例如:​​​​​​​

func (c *Controller) Create() (id int, email string) {  return 10, "alice@livebud.com"}
type Output struct {  ID int  Email string}
func (c *Controller) Create() Output {  return Output{    ID: 10,     Email: "alice@livebud.com",  }}

上述这两种形式都将返回:​​​​​​​

{  "id": 10,  "email": "alice@livebud.com"}
  • 视图

视图用来展示HTML页面,bud默认使用svelte渲染视图,svelte是一个高性能前端js框架。​​​​​​​

$YOUR_APP└─ view   ├─ index.svelte     -> Root index page   ├─ posts   │  ├─ edit.svelte   -> Edit post page   │  ├─ index.svelte  -> Post index page   │  ├─ new.svelte    -> New post page   │  ├─ show.svelte   -> Show post page   │  └─ Post.svelte   -> Post component (not rendered)   └─ users      ├─ edit.svelte   -> Edit user page      ├─ index.svelte  -> User index page      └─ show.svelte   -> Show user page

控制器中返回的值,如果有对应视图文件,则值会被传递到视图中:

<script>
  export let users = [] //来自控制器
</script>

<h1>Users</h1>

<ul>
    {#each users as user}
    <li>{user.name} is {user.age} years old</li>
    {/each}
</ul>
  • 其他

Bud框架并没有自己的ORM,用户可自行选择orm框架,通过依赖注入在控制器中使用。另外,还有全栈框架包含的特性,如错误处理、插件系统、数据验证及安全、日志、队列与定时任务、文件与存储等都可以在官方文档上找到。

附文档链接:https://github.com/livebud/bud

END

想要了解Go更多内容,欢迎扫描下方👇 关注 公众号,回复关键词 [实战群]  ,就有机会进群和我们进行交流~