github.com/aacfactory/fns@v1.2.86-0.20240310083819-80d667fc0a17/docs/usage_zh.md (about)

     1  # 使用
     2  
     3  ---
     4  
     5  ## 创建访问
     6  1. 在`modules`下创建服务包
     7  2. 在服务包下创建 `doc.go`
     8  
     9  举例:
    10  ```go
    11  // Package users
    12  // @service users
    13  // @title Users
    14  // @description User service
    15  // @internal false
    16  package users
    17  ```
    18  
    19  ## 创建服务组件(如果需要的话)
    20  
    21  在服务包下创建 `{component name}` 包。
    22  然后在`component`包下创建实现了 `service.Component`的组件,
    23  最后创建 `components.go` 并打上 `@component`来把它注册到服务中。
    24  组件在大多数情况下是不需要的,除非服务中集成了第三方服务。
    25  
    26  
    27  组件解构:
    28  
    29  ```text
    30  |-- {service dir}
    31      |-- {component name}
    32          |-- component.go
    33      |-- components.go
    34  ```
    35  
    36  component.go
    37  
    38  ```go
    39  type Foo struct {
    40  }
    41  
    42  func (c *Foo) Name() (name string) {
    43      name = "component_name"
    44      return
    45  }
    46  
    47  func (c *Foo) Build(options service.ComponentOptions) (err error) {
    48      // build with config
    49      return
    50  }
    51  
    52  func (c *Foo) Close() {
    53      return
    54  }
    55  ```
    56  
    57  components.go, value of `@component` is keypair, key is component_name, value is component position.
    58  
    59  ```go
    60  // fooLoader
    61  // @component {component_name}:{package}.Foo
    62  func fooLoader() service.Component {
    63  return &foo.Foo{}
    64  }
    65  ```
    66  
    67  ## 创建函数
    68  
    69  在服务包下创建一个私有函数。
    70  
    71  阅读 [definition](https://github.com/aacfactory/fns/blob/main/docs/definition_zh.md) 获取更多信息。
    72  
    73  举例:
    74  
    75  ```go
    76  // GetArgument
    77  // @title Get user argument
    78  // @description Get user argument
    79  type GetArgument struct {
    80      // Id
    81      // @title User Id
    82      // @description User Id
    83      Id int64 `json:"id" validate:"required" message:"id is invalid"`
    84  }
    85  
    86  // User
    87  // @title User
    88  // @description User
    89  type User struct {
    90      // Id
    91      // @title User Id
    92      // @description User Id
    93      Id string `json:"id"`
    94      // Mobile
    95      // @title Mobile
    96      // @description Mobile
    97      Mobile string `json:"mobile"`
    98      // Name
    99      // @title Name
   100      // @description Name
   101      Name string `json:"name"`
   102      // Gender
   103      // @title Gender 
   104      // @enum F,M,N
   105      // @description Gender
   106      Gender string `json:"gender"`
   107      // Age
   108      // @title Age
   109      // @description Age
   110      Age int `json:"age"`
   111      // Avatar
   112      // @title Avatar
   113      // @description Avatar address
   114      Avatar string `json:"avatar"`
   115      // Active
   116      // @title Active
   117      // @description Active
   118      Active bool `json:"active"`
   119  }
   120  
   121  
   122  // get
   123  // @fn get
   124  // @validate true
   125  // @authorization true
   126  // @permission foo,bar
   127  // @internal false
   128  // @title Get user profile
   129  // @description >>>
   130  // Get user profile
   131  // ----------
   132  // errors:
   133  // | Name                     | Code    | Description                   |
   134  // |--------------------------|---------|-------------------------------|
   135  // | users_get_failed         | 500     | get user failed               |
   136  // <<<
   137  func get(ctx context.Context, argument GetArgument) (v *User, err errors.CodeError) {
   138      v = &User{
   139          Id:     fmt.Sprintf("%v", argument.Id),
   140          Mobile: "000",
   141          Name:   "foo",
   142          Gender: "F",
   143          Age:    10,
   144          Avatar: "https://foo.com/u/1/default.jpg",
   145          Active: true,
   146      }
   147      return
   148  }
   149  
   150  ```
   151  
   152  ## 注册函数和创建函数代理
   153  直接访问函数是不建议的,那会失去很多特性,所以请使用函数代理的访问访问。
   154  
   155  ```shell
   156  cd {project path}
   157  fnc codes .
   158  ```
   159  Or
   160  ```shell
   161  cd {project path}
   162  go generate
   163  ```
   164  
   165  在上述例子中, `users.Get` 函数代理会被生成。
   166  
   167  ## 从上下文中获取 WEBSOCKET ENDPOINT
   168  ```go
   169  socket, has := wss.GetWebsocketEndpoint(ctx)
   170  ```