Browse Source

feat:修复scribe无法点击分组的bug

Yin Bin 4 months ago
parent
commit
de58a6344a

+ 7 - 7
.vscode/extensions.json

@@ -7,9 +7,9 @@ use App\Services\Client\AccountService;
 use Illuminate\Http\Request;
 
 /**
- * @group 用户端-账户管理
+ * @group 账户管理
  *
- * 账户相关的API接口
+ * 包含登录、注册、账户管理等基础功能
  */
 class AccountController extends Controller
 {
@@ -21,7 +21,7 @@ class AccountController extends Controller
     }
 
     /**
-     * [账户管理] 发送验证码
+     * 发送验证码
      *
      * 向指定手机号发送验证码
      *
@@ -41,7 +41,7 @@ class AccountController extends Controller
     }
 
     /**
-     * [账户管理] 用户登录
+     * 用户登录
      *
      * 使用手机号和验证码登录账户
      *
@@ -70,7 +70,7 @@ class AccountController extends Controller
     }
 
     /**
-     * [账户管理] 微信登录
+     * 微信登录
      *
      * 使用微信openid登录账户
      *
@@ -97,7 +97,7 @@ class AccountController extends Controller
     }
 
     /**
-     * [账户管理] 用户退出
+     * 用户退出
      *
      * 退出当前账户登录状态
      *
@@ -115,7 +115,7 @@ class AccountController extends Controller
     }
 
     /**
-     * [账户管理] 用户注销
+     * 用户注销
      *
      * 永久注销当前账户
      *

+ 2 - 2
app/Http/Controllers/Client/CoachController.php

@@ -21,7 +21,7 @@ class CoachController extends Controller
     }
 
     /**
-     * [技师管理] 获取技师列表
+     * 获取技师列表
      *
      * 根据经纬度获取技师列表
      *
@@ -52,7 +52,7 @@ class CoachController extends Controller
     }
 
     /**
-     * [技师管理] 获取技师详情
+     * 获取技师详情
      *
      * 根据ID获取技师的详细信息
      *

+ 3 - 3
app/Http/Controllers/Client/CoachLocationController.php

@@ -24,7 +24,7 @@ class CoachLocationController extends Controller
     }
 
     /**
-     * [技师定位管理] 获取定位列表
+     * 获取定位列表
      *
      * @authenticated
      *
@@ -51,7 +51,7 @@ class CoachLocationController extends Controller
     }
 
     /**
-     * [技师定位管理] 创建定位
+     * 创建定位
      *
      * @authenticated
      *
@@ -84,7 +84,7 @@ class CoachLocationController extends Controller
     }
 
     /**
-     * [技师定位管理] 删除定位
+     * 删除定位
      *
      * @authenticated
      *

+ 2 - 2
app/Http/Controllers/Client/CommentController.php

@@ -21,7 +21,7 @@ class CommentController extends Controller
     }
 
     /**
-     * [评论管理] 发表评价
+     * 发表评价
      *
      * 发表评价
      *
@@ -53,7 +53,7 @@ class CommentController extends Controller
     }
 
     /**
-     * [评论管理] 评价列表
+     * 评价列表
      *
      * 获取评价列表
      *

+ 3 - 3
app/Http/Controllers/Client/CommonController.php

@@ -21,7 +21,7 @@ class CommonController extends Controller
     }
 
     /**
-     * [公共管理] 获取代理商配置
+     * 获取代理商配置
      *
      * 获取指定代理商的配置信息
      *
@@ -43,7 +43,7 @@ class CommonController extends Controller
     }
 
     /**
-     * [公共管理] 获取技师配置
+     * 获取技师配置
      *
      * 获取指定技师的配置信息
      *
@@ -64,7 +64,7 @@ class CommonController extends Controller
     }
 
     /**
-     * [公共管理] 计算路费金额
+     * 计算路费金额
      *
      * 根据距离和其他参数计算路费
      *

+ 14 - 14
app/Http/Controllers/Client/OrderController.php

@@ -22,7 +22,7 @@ class OrderController extends Controller
     }
 
     /**
-     * [订单管理] 订单初始化
+     * 订单初始化
      *
      * 初始化订单
      *
@@ -45,7 +45,7 @@ class OrderController extends Controller
     }
 
     /**
-     * [订单管理] 创建订单
+     * 创建订单
      *
      * 创建订单
      *
@@ -71,7 +71,7 @@ class OrderController extends Controller
     }
 
     /**
-     * [订单管理] 结束订单
+     * 结束订单
      *
      * 结束订单
      *
@@ -93,7 +93,7 @@ class OrderController extends Controller
     }
 
     /**
-     * [订单管理] 确认技师离开
+     * 确认技师离开
      *
      * 确认技师离开
      *
@@ -115,7 +115,7 @@ class OrderController extends Controller
     }
 
     /**
-     * [订单管理] 取消订单
+     * 取消订单
      *
      * 取消订单
      *
@@ -137,7 +137,7 @@ class OrderController extends Controller
     }
 
     /**
-     * [订单管理] 获取订单列表
+     * 获取订单列表
      *
      * 获取订单列表
      *
@@ -154,7 +154,7 @@ class OrderController extends Controller
     }
 
     /**
-     * [订单管理] 获取订单详情
+     * 获取订单详情
      *
      * 获取订单详情
      *
@@ -173,7 +173,7 @@ class OrderController extends Controller
     }
 
     /**
-     * [订单管理] 订单退款
+     * 订单退款
      *
      * 订单退款
      *
@@ -192,7 +192,7 @@ class OrderController extends Controller
     }
 
     /**
-     * [订单管理] 获取代理商配置
+     * 获取代理商配置
      *
      * 获取代理商配置
      *
@@ -214,7 +214,7 @@ class OrderController extends Controller
     }
 
     /**
-     * [订单管理] 获取技师配置
+     * 获取技师配置
      *
      * 获取技师配置
      *
@@ -235,7 +235,7 @@ class OrderController extends Controller
     }
 
     /**
-     * [订单管理] 计算路费金额
+     * 计算路费金额
      *
      * 计算路费金额
      *
@@ -267,7 +267,7 @@ class OrderController extends Controller
     }
 
     /**
-     * [订单管理] 计算订单金额
+     * 计算订单金额
      *
      * 计算订单金额
      *
@@ -302,7 +302,7 @@ class OrderController extends Controller
     }
 
     /**
-     * [订单管理] 加钟
+     * 加钟
      *
      * 加钟
      *
@@ -323,7 +323,7 @@ class OrderController extends Controller
     }
 
     /**
-     * [订单管理] 指定技师
+     * 指定技师
      *
      * 指定技师
      *

+ 3 - 3
app/Http/Controllers/Client/ProjectController.php

@@ -21,7 +21,7 @@ class ProjectController extends Controller
     }
 
     /**
-     * [项目管理] 获取项目列表
+     * 获取项目列表
      *
      * 根据区域代码获取项目列表
      *
@@ -62,7 +62,7 @@ class ProjectController extends Controller
     }
 
     /**
-     * [项目管理] 获取项目详情
+     * 获取项目详情
      *
      * 获取指定项目的详细信息
      *
@@ -110,7 +110,7 @@ class ProjectController extends Controller
     }
 
     /**
-     * [项目管理] 获取技师项目列表
+     * 获取技师项目列表
      *
      * 获取指定技师已开通的项目列表
      *

+ 5 - 5
app/Http/Controllers/Client/UserAddressController.php

@@ -22,7 +22,7 @@ class UserAddressController extends Controller
     }
 
     /**
-     * [用户地址] 获取默认地址
+     * 获取默认地址2
      *
      * @description 根据用户编号查询用户数据,用户状态为正常,查询用户地址列表,返回用户默认地址
      *
@@ -50,7 +50,7 @@ class UserAddressController extends Controller
     }
 
     /**
-     * [用户地址] 添加地址
+     * 添加地址
      *
      * @description 根据用户编号查询用户数据,用户状态为正常,保存用户地址,如果用户只有一个地址则设置为默认地址
      *
@@ -75,7 +75,7 @@ class UserAddressController extends Controller
     }
 
     /**
-     * [用户地址] 修改地址
+     * 修改地址
      *
      * @description 根据用户编号查询用户数据,用户状态为正常,根据地址编号查询地址数据,修改地址信息
      *
@@ -102,7 +102,7 @@ class UserAddressController extends Controller
     }
 
     /**
-     * [用户地址] 删除地址
+     * 删除地址
      *
      * @description 根据用户编号查询用户数据,用户状态为正常,根据地址编号查询地址数据,删除地址
      *
@@ -116,7 +116,7 @@ class UserAddressController extends Controller
     }
 
     /**
-     * [用户地址] 设置默认地址
+     * 设置默认地址
      *
      * @description 根据用户编号查询用户数据,用户状态为正常,根据地址编号查询地址数据,设置为默认地址
      *

+ 6 - 6
app/Http/Controllers/Client/UserController.php

@@ -21,7 +21,7 @@ class UserController extends Controller
     }
 
     /**
-     * [用户管理] 获取用户信息
+     * 获取用户信息
      *
      * 获取当前用户的信息
      *
@@ -43,7 +43,7 @@ class UserController extends Controller
     }
 
     /**
-     * [用户管理] 修改用户信息
+     * 修改用户信息
      *
      * 修改当前用户的信息
      *
@@ -66,7 +66,7 @@ class UserController extends Controller
     }
 
     /**
-     * [用户管理] 获取用户钱包
+     * 获取用户钱包
      *
      * 获取当前用户的钱包信息
      *
@@ -87,7 +87,7 @@ class UserController extends Controller
     }
 
     /**
-     * [用户管理] 用户提现
+     * 用户提现
      *
      * 提现用户的余额
      *
@@ -113,7 +113,7 @@ class UserController extends Controller
     }
 
     /**
-     * [用户管理] 用户反馈
+     * 用户反馈
      *
      * 提交用户的反馈信息
      *
@@ -135,7 +135,7 @@ class UserController extends Controller
     }
 
     /**
-     * [用户管理] 申请成为技师
+     * 申请成为技师
      *
      * 申请成为技师
      *

+ 1 - 1
app/Http/Controllers/Client/WalletController.php

@@ -20,7 +20,7 @@ class WalletController extends Controller
     }
 
     /**
-     * [钱包管理] 获取钱包明细
+     * 获取钱包明细
      *
      * 获取钱包明细
      *

+ 19 - 15
app/Logging/CustomizeFormatter.php

@@ -20,14 +20,12 @@ return [
             'exclude' => [],
         ],
     ],
-
-    'type' => 'static',
+    'type' => 'laravel',
     'theme' => 'default',
 
     'static' => [
         'output_path' => 'public/docs',
     ],
-
     'laravel' => [
         'add_routes' => true,
         'docs_url' => '/docs',
@@ -49,22 +47,21 @@ return [
         'enabled' => true,
         'default' => true,
         'in' => 'bearer',
-        'name' => 'Authorization',
-        'use_value' => 'Bearer {YOUR_AUTH_KEY}',
-        'placeholder' => env('YOUR_AUTH_KEY'),
-        'extra_info' => '通过登录接口获取 token,格式为 Bearer {token}',
+        'name' => 'token',
+        'use_value' => env('SCRIBE_AUTH_KEY'),
+        'placeholder' => '{YOUR_AUTH_KEY}',
+        'extra_info' => 'You can retrieve your token by visiting your dashboard and clicking <b>Generate API token</b>.',
     ],
 
     'intro_text' => <<<INTRO
-    欢迎使用 Owl Admin API 文档。
+欢迎使用 Owl Admin API 接口文档。
 
-    本文档提供了所有 API 接口的详细信息,包括请求参数、响应格式等
-    INTRO,
+该文档提供了所有可用的API接口信息
+INTRO,
 
     'example_languages' => [
-        'bash',
         'javascript',
-        'php'
+        'bash',
     ],
 
     'examples' => [
@@ -121,7 +118,9 @@ return [
     // For 'static' docs, the collection will be generated to public/docs/collection.json.
     // For 'laravel' docs, it will be generated to storage/app/scribe/collection.json.
     // Setting `laravel.add_routes` to true (above) will also add a route for the collection.
-    'postman' => ['enabled' => true, 'overrides' => []],
+    'postman' => ['enabled' => true, 'overrides' => [
+        'info.version' => '2.0.0',
+    ]],
     // Generate an OpenAPI spec (v3.0.1) in addition to docs webpage.
     // For 'static' docs, the collection will be generated to public/docs/openapi.yaml.
     // For 'laravel' docs, it will be generated to storage/app/scribe/openapi.yaml.
@@ -140,7 +139,7 @@ return [
     // Available tokens are `{date:<format>}` and `{git:<format>}`.
     // The format you pass to `date` will be passed to PHP's `date()` function.
     // The format you pass to `git` can be either "short" or "long".
-    'last_updated' => 'Last updated: {date:F j, Y}',
+    'last_updated' => '{date:F j Y}',
     'fractal' => [
         // If you are using a custom serializer with league/fractal, you can specify it here.
         'serializer' => null,
@@ -149,7 +148,12 @@ return [
     // 添加以下配置以确保目录树可以展开
     'groups' => [
         'enabled' => true,
-        'default_group' => 'Endpoints',
         'sort' => 'asc',
     ],
+
+    'external' => [
+        'html_attributes' => [
+            'dark-mode' => true,
+        ],
+    ],
 ];

+ 393 - 0
database/migrations/2024_11_20_100445_create_agent_project_cate_table.php

@@ -0,0 +1,393 @@
+/* Copied from https://github.com/slatedocs/slate/blob/c4b4c0b8f83e891ca9fab6bbe9a1a88d5fe41292/stylesheets/print.css and unminified */
+/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
+
+html {
+    font-family: sans-serif;
+    -ms-text-size-adjust: 100%;
+    -webkit-text-size-adjust: 100%
+}
+
+body {
+    margin: 0
+}
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+    display: block
+}
+
+audio,
+canvas,
+progress,
+video {
+    display: inline-block;
+    vertical-align: baseline
+}
+
+audio:not([controls]) {
+    display: none;
+    height: 0
+}
+
+[hidden],
+template {
+    display: none
+}
+
+a {
+    background-color: transparent
+}
+
+a:active,
+a:hover {
+    outline: 0
+}
+
+abbr[title] {
+    border-bottom: 1px dotted
+}
+
+b,
+strong {
+    font-weight: bold
+}
+
+dfn {
+    font-style: italic
+}
+
+h1 {
+    font-size: 2em;
+    margin: 0.67em 0
+}
+
+mark {
+    background: #ff0;
+    color: #000
+}
+
+small {
+    font-size: 80%
+}
+
+sub,
+sup {
+    font-size: 75%;
+    line-height: 0;
+    position: relative;
+    vertical-align: baseline
+}
+
+sup {
+    top: -0.5em
+}
+
+sub {
+    bottom: -0.25em
+}
+
+img {
+    border: 0
+}
+
+svg:not(:root) {
+    overflow: hidden
+}
+
+figure {
+    margin: 1em 40px
+}
+
+hr {
+    box-sizing: content-box;
+    height: 0
+}
+
+pre {
+    overflow: auto
+}
+
+code,
+kbd,
+pre,
+samp {
+    font-family: monospace, monospace;
+    font-size: 1em
+}
+
+button,
+input,
+optgroup,
+select,
+textarea {
+    color: inherit;
+    font: inherit;
+    margin: 0
+}
+
+button {
+    overflow: visible
+}
+
+button,
+select {
+    text-transform: none
+}
+
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+    -webkit-appearance: button;
+    cursor: pointer
+}
+
+button[disabled],
+html input[disabled] {
+    cursor: default
+}
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+    border: 0;
+    padding: 0
+}
+
+input {
+    line-height: normal
+}
+
+input[type="checkbox"],
+input[type="radio"] {
+    box-sizing: border-box;
+    padding: 0
+}
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+    height: auto
+}
+
+input[type="search"] {
+    -webkit-appearance: textfield;
+    box-sizing: content-box
+}
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+    -webkit-appearance: none
+}
+
+fieldset {
+    border: 1px solid #c0c0c0;
+    margin: 0 2px;
+    padding: 0.35em 0.625em 0.75em
+}
+
+legend {
+    border: 0;
+    padding: 0
+}
+
+textarea {
+    overflow: auto
+}
+
+optgroup {
+    font-weight: bold
+}
+
+table {
+    border-collapse: collapse;
+    border-spacing: 0
+}
+
+td,
+th {
+    padding: 0
+}
+
+.content h1,
+.content h2,
+.content h3,
+.content h4,
+body {
+    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+    font-size: 14px
+}
+
+.content h1,
+.content h2,
+.content h3,
+.content h4 {
+    font-weight: bold
+}
+
+.content pre,
+.content code {
+    font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, serif;
+    font-size: 12px;
+    line-height: 1.5
+}
+
+.content pre,
+.content code {
+    word-break: break-all;
+    -webkit-hyphens: auto;
+    -ms-hyphens: auto;
+    hyphens: auto
+}
+
+@font-face {
+    font-family: 'slate';
+    src: url(../fonts/slate.eot?-syv14m);
+    src: url(../fonts/slate.eot?#iefix-syv14m) format("embedded-opentype"), url(../fonts/slate.woff2?-syv14m) format("woff2"), url(../fonts/slate.woff?-syv14m) format("woff"), url(../fonts/slate.ttf?-syv14m) format("truetype"), url(../fonts/slate.svg?-syv14m#slate) format("svg");
+    font-weight: normal;
+    font-style: normal
+}
+
+.content aside.warning:before,
+.content aside.notice:before,
+.content aside.success:before {
+    font-family: 'slate';
+    speak: none;
+    font-style: normal;
+    font-weight: normal;
+    font-variant: normal;
+    text-transform: none;
+    line-height: 1
+}
+
+.content aside.warning:before {
+    content: "\e600"
+}
+
+.content aside.notice:before {
+    content: "\e602"
+}
+
+.content aside.success:before {
+    content: "\e606"
+}
+
+.tocify,
+.toc-footer,
+.lang-selector,
+.search,
+#nav-button {
+    display: none
+}
+
+.tocify-wrapper>img {
+    margin: 0 auto;
+    display: block
+}
+
+.content {
+    font-size: 12px
+}
+
+.content pre,
+.content code {
+    border: 1px solid #999;
+    border-radius: 5px;
+    font-size: 0.8em
+}
+
+.content pre code {
+    border: 0
+}
+
+.content pre {
+    padding: 1.3em
+}
+
+.content code {
+    padding: 0.2em
+}
+
+.content table {
+    border: 1px solid #999
+}
+
+.content table tr {
+    border-bottom: 1px solid #999
+}
+
+.content table td,
+.content table th {
+    padding: 0.7em
+}
+
+.content p {
+    line-height: 1.5
+}
+
+.content a {
+    text-decoration: none;
+    color: #000
+}
+
+.content h1 {
+    font-size: 2.5em;
+    padding-top: 0.5em;
+    padding-bottom: 0.5em;
+    margin-top: 1em;
+    margin-bottom: 21px;
+    border: 2px solid #ccc;
+    border-width: 2px 0;
+    text-align: center
+}
+
+.content h2 {
+    font-size: 1.8em;
+    margin-top: 2em;
+    border-top: 2px solid #ccc;
+    padding-top: 0.8em
+}
+
+.content h1+h2,
+.content h1+div+h2 {
+    border-top: none;
+    padding-top: 0;
+    margin-top: 0
+}
+
+.content h3,
+.content h4 {
+    font-size: 0.8em;
+    margin-top: 1.5em;
+    margin-bottom: 0.8em;
+    text-transform: uppercase
+}
+
+.content h5,
+.content h6 {
+    text-transform: uppercase
+}
+
+.content aside {
+    padding: 1em;
+    border: 1px solid #ccc;
+    border-radius: 5px;
+    margin-top: 1.5em;
+    margin-bottom: 1.5em;
+    line-height: 1.6
+}
+
+.content aside:before {
+    vertical-align: middle;
+    padding-right: 0.5em;
+    font-size: 14px
+}

+ 1090 - 0
public/vendor/scribe/css/theme-default.style.css

@@ -0,0 +1,1090 @@
+/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
+
+html {
+    font-family: 'Open Sans', sans-serif;
+    font-size: 1.2em;
+    -ms-text-size-adjust: 100%;
+    -webkit-text-size-adjust: 100%
+}
+
+body {
+    margin: 0
+}
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section {
+    display: block
+}
+
+summary {
+    cursor: pointer;
+}
+
+audio,
+canvas,
+progress,
+video {
+    display: inline-block;
+    vertical-align: baseline
+}
+
+audio:not([controls]) {
+    display: none;
+    height: 0
+}
+
+[hidden],
+template {
+    display: none
+}
+
+a {
+    background-color: transparent
+}
+
+a:active,
+a:hover {
+    outline: 0
+}
+
+abbr[title] {
+    border-bottom: 1px dotted
+}
+
+b,
+strong {
+    font-weight: 700
+}
+
+dfn {
+    font-style: italic
+}
+
+h1 {
+    font-size: 2em;
+    margin: .67em 0
+}
+
+mark {
+    background: #ff0;
+    color: #000
+}
+
+small {
+    font-size: 80%
+}
+
+sub,
+sup {
+    font-size: 75%;
+    line-height: 0;
+    position: relative;
+    vertical-align: baseline
+}
+
+sup {
+    top: -.5em
+}
+
+sub {
+    bottom: -.25em
+}
+
+img {
+    border: 0
+}
+
+svg:not(:root) {
+    overflow: hidden
+}
+
+figure {
+    margin: 1em 40px
+}
+
+hr {
+    box-sizing: content-box;
+    height: 0
+}
+
+pre {
+    overflow: auto
+}
+
+code,
+kbd,
+pre,
+samp {
+    font-family: monospace, monospace;
+    font-size: 1em
+}
+
+button,
+input,
+optgroup,
+select,
+textarea {
+    color: inherit;
+    font: inherit;
+    margin: 0
+}
+
+button {
+    overflow: visible
+}
+
+button,
+select {
+    text-transform: none
+}
+
+button,
+html input[type=button],
+input[type=reset],
+input[type=submit] {
+    -webkit-appearance: button;
+    cursor: pointer
+}
+
+button[disabled],
+html input[disabled] {
+    cursor: default
+}
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+    border: 0;
+    padding: 0
+}
+
+input {
+    line-height: normal
+}
+
+input[type=checkbox],
+input[type=radio] {
+    box-sizing: border-box;
+    padding: 0
+}
+
+input[type=number]::-webkit-inner-spin-button,
+input[type=number]::-webkit-outer-spin-button {
+    height: auto
+}
+
+input[type=search] {
+    -webkit-appearance: textfield;
+    box-sizing: content-box
+}
+
+input[type=search]::-webkit-search-cancel-button,
+input[type=search]::-webkit-search-decoration {
+    -webkit-appearance: none
+}
+
+fieldset {
+    border: 1px solid silver;
+    margin: 0 2px;
+    padding: .35em .625em .75em
+}
+
+legend {
+    border: 0;
+    padding: 0
+}
+
+textarea {
+    overflow: auto
+}
+
+optgroup {
+    font-weight: 700
+}
+
+table {
+    border-collapse: collapse;
+    border-spacing: 0
+}
+
+td,
+th {
+    padding: 0
+}
+
+body,
+html {
+    font-family: 'Open Sans', Helvetica Neue, Helvetica, Arial, Microsoft Yahei, 微软雅黑, STXihei, 华文细黑, sans-serif;
+    font-size: 16px;
+}
+
+.content h1,
+.content h2,
+.content h3,
+.content h4,
+.content h5,
+.content h6 {
+    font-family: 'Open Sans', Helvetica Neue, Helvetica, Arial, Microsoft Yahei, 微软雅黑, STXihei, 华文细黑, sans-serif;
+}
+
+.content h1,
+.content h2,
+.content h3,
+.content h4,
+.content h5,
+.content h6 {
+    font-weight: 700
+}
+
+.content code,
+.content pre {
+    font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;
+    font-size: 14px;
+    line-height: 1.5
+}
+
+.content code {
+    word-break: break-all;
+    word-break: break-word;
+    -webkit-hyphens: auto;
+    -ms-hyphens: auto;
+    hyphens: auto
+}
+
+.content aside.notice:before,
+.content aside.success:before,
+.content aside.warning:before,
+.tocify-wrapper>.search:before {
+    font-family: 'Open Sans', sans-serif;
+    speak: none;
+    font-style: normal;
+    font-variant: normal;
+    text-transform: none;
+    line-height: 1
+}
+
+.content aside.warning:before {
+    content: "✋"
+}
+
+.content aside.notice:before {
+    content: "ℹ"
+}
+
+.content aside.success:before {
+    content: "✅"
+}
+
+.tocify-wrapper>.search:before {
+    content: "🔎"
+}
+
+.highlight .c,
+.highlight .c1,
+.highlight .cm,
+.highlight .cs {
+    color: #909090
+}
+
+.highlight,
+.highlight .w {
+    background-color: #292929
+}
+
+.hljs {
+    display: block;
+    overflow-x: auto;
+    padding: .5em;
+    background: #23241f
+}
+
+.hljs,
+.hljs-subst,
+.hljs-tag {
+    color: #f8f8f2
+}
+
+.hljs-emphasis,
+.hljs-strong {
+    color: #a8a8a2
+}
+
+.hljs-bullet,
+.hljs-link,
+.hljs-literal,
+.hljs-number,
+.hljs-quote,
+.hljs-regexp {
+    color: #ae81ff
+}
+
+.hljs-code,
+.hljs-section,
+.hljs-selector-class,
+.hljs-title {
+    color: #a6e22e
+}
+
+.hljs-strong {
+    font-weight: 700
+}
+
+.hljs-emphasis {
+    font-style: italic
+}
+
+.hljs-attr,
+.hljs-keyword,
+.hljs-name,
+.hljs-selector-tag {
+    color: #f92672
+}
+
+.hljs-attribute,
+.hljs-symbol {
+    color: #66d9ef
+}
+
+.hljs-class .hljs-title,
+.hljs-params {
+    color: #f8f8f2
+}
+
+.hljs-addition,
+.hljs-built_in,
+.hljs-builtin-name,
+.hljs-selector-attr,
+.hljs-selector-id,
+.hljs-selector-pseudo,
+.hljs-string,
+.hljs-template-variable,
+.hljs-type,
+.hljs-variable {
+    color: #e6db74
+}
+
+.hljs-comment,
+.hljs-deletion,
+.hljs-meta {
+    color: #75715e
+}
+
+body,
+html {
+    color: #333;
+    padding: 0;
+    margin: 0;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+    background-color: whitesmoke;
+    height: 100%;
+    -webkit-text-size-adjust: none
+}
+
+#toc>ul>li>a>span {
+    float: right;
+    background-color: #2484ff;
+    border-radius: 40px;
+    width: 20px
+}
+
+.tocify-wrapper {
+    transition: left .3s ease-in-out;
+    overflow-y: auto;
+    overflow-x: hidden;
+    position: fixed;
+    z-index: 30;
+    top: 0;
+    left: 0;
+    bottom: 0;
+    width: 230px;
+    background-color: #393939;
+    font-size: 13px;
+    font-weight: 700
+}
+
+.tocify-wrapper .lang-selector {
+    display: none
+}
+
+.tocify-wrapper .lang-selector a {
+    padding-top: .5em;
+    padding-bottom: .5em
+}
+
+.tocify-wrapper>img {
+    display: block
+}
+
+.tocify-wrapper>.search {
+    position: relative
+}
+
+.tocify-wrapper>.search input {
+    background: #393939;
+    border-width: 0 0 1px;
+    border-color: #666;
+    padding: 6px 0 6px 20px;
+    box-sizing: border-box;
+    margin: 10px 15px;
+    width: 200px;
+    outline: none;
+    color: #fff;
+    border-radius: 0
+}
+
+.tocify-wrapper>.search:before {
+    position: absolute;
+    top: 17px;
+    left: 15px;
+    color: #fff
+}
+
+.tocify-wrapper img+.tocify {
+    margin-top: 20px
+}
+
+.tocify-wrapper .search-results {
+    margin-top: 0;
+    box-sizing: border-box;
+    height: 0;
+    overflow-y: auto;
+    overflow-x: hidden;
+    transition-property: height, margin;
+    transition-duration: .18s;
+    transition-timing-function: ease-in-out;
+    background: linear-gradient(180deg, rgba(0, 0, 0, .2), transparent 8px), linear-gradient(0deg, rgba(0, 0, 0, .2), transparent 8px), linear-gradient(180deg, #000, transparent 1.5px), linear-gradient(0deg, #939393, hsla(0, 0%, 58%, 0) 1.5px), #262626
+}
+
+.tocify-wrapper .search-results.visible {
+    height: 30%;
+    margin-bottom: 1em
+}
+
+.tocify-wrapper .search-results li {
+    margin: 1em 15px;
+    line-height: 1
+}
+
+.tocify-wrapper a {
+    color: #fff;
+    text-decoration: none
+}
+
+.tocify-wrapper .search-results a:hover {
+    text-decoration: underline
+}
+
+.tocify-wrapper .toc-footer li,
+.tocify-wrapper .tocify-item>a {
+    padding: 0 15px;
+    display: block;
+    overflow-x: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis
+}
+.tocify-wrapper .tocify-item.level-3>a {
+    padding: 0 25px;
+}
+
+.tocify-wrapper li,
+.tocify-wrapper ul {
+    list-style: none;
+    margin: 0;
+    padding: 0;
+    line-height: 28px
+}
+
+.tocify-wrapper li {
+    color: #fff;
+    transition-property: background;
+    transition-timing-function: linear;
+    transition-duration: .23s
+}
+
+.tocify-wrapper .tocify-focus {
+    box-shadow: 0 1px 0 #000;
+    background-color: #2467af;
+    color: #fff;
+    font-weight: bold;
+}
+
+.tocify-wrapper .tocify-subheader {
+    display: none;
+    background-color: #262626;
+    font-weight: 500;
+    background: linear-gradient(180deg, rgba(0, 0, 0, .2), transparent 8px), linear-gradient(0deg, rgba(0, 0, 0, .2), transparent 8px), linear-gradient(180deg, #000, transparent 1.5px), linear-gradient(0deg, #939393, hsla(0, 0%, 58%, 0) 1.5px), #262626
+}
+
+.tocify-wrapper .jets-searching .tocify-subheader,
+.tocify-wrapper .tocify-subheader.visible {
+    display: block;
+}
+
+.tocify-wrapper .tocify-subheader .tocify-item>a {
+    padding-left: 25px;
+    font-size: 12px
+}
+
+.tocify-wrapper .tocify-subheader .tocify-item.level-3>a {
+    padding-left: 35px;
+}
+
+.tocify-wrapper .tocify-subheader>li:last-child {
+    box-shadow: none
+}
+
+.tocify-wrapper .toc-footer {
+    padding: 1em 0;
+    margin-top: 1em;
+    border-top: 1px dashed #666
+}
+
+.tocify-wrapper .toc-footer a,
+.tocify-wrapper .toc-footer li {
+    color: #fff;
+    text-decoration: none
+}
+
+.tocify-wrapper .toc-footer a:hover {
+    text-decoration: underline
+}
+
+.tocify-wrapper .toc-footer li {
+    font-size: .8em;
+    line-height: 1.7;
+    text-decoration: none
+}
+
+#nav-button {
+    padding: 0 1.5em 5em 0;
+    display: none;
+    position: fixed;
+    top: 0;
+    left: 0;
+    z-index: 100;
+    color: #000;
+    text-decoration: none;
+    font-weight: 700;
+    opacity: .7;
+    line-height: 16px;
+    transition: left .3s ease-in-out
+}
+
+#nav-button span {
+    display: block;
+    padding: 6px;
+    background-color: rgba(234, 242, 246, .7);
+    -webkit-transform-origin: 0 0;
+    transform-origin: 0 0;
+    -webkit-transform: rotate(-90deg) translate(-100%);
+    transform: rotate(-90deg) translate(-100%);
+    border-radius: 0 0 0 5px
+}
+
+#nav-button img {
+    height: 16px;
+    vertical-align: bottom
+}
+
+#nav-button:hover {
+    opacity: 1
+}
+
+#nav-button.open {
+    left: 230px
+}
+
+.page-wrapper {
+    margin-left: 230px;
+    position: relative;
+    z-index: 10;
+    background-color: #eaf2f6;
+    min-height: 100%;
+    padding-bottom: 1px
+}
+
+.page-wrapper .dark-box {
+    width: 50%;
+    background-color: #393939;
+    position: absolute;
+    right: 0;
+    top: 0;
+    bottom: 0
+}
+
+.page-wrapper .lang-selector {
+    position: fixed;
+    z-index: 50;
+    border-bottom: 5px solid #393939
+}
+
+.lang-selector {
+    background-color: #222;
+    width: 100%;
+    font-weight: 700
+}
+
+.lang-selector button {
+    display: block;
+    float: left;
+    color: #fff;
+    text-decoration: none;
+    padding: 0 10px;
+    line-height: 30px;
+    outline: 0;
+    background: transparent;
+    border: none;
+}
+
+.lang-selector button:active,
+.lang-selector button:hover,
+.lang-selector button:focus {
+    background-color: #111;
+    color: #fff
+}
+
+.lang-selector button.active {
+    background-color: #393939;
+    color: #fff
+}
+
+.lang-selector:after {
+    content: '';
+    clear: both;
+    display: block
+}
+
+.content {
+    position: relative;
+    z-index: 30
+}
+
+.content:after {
+    content: '';
+    display: block;
+    clear: both
+}
+
+.content>aside,
+.content>details,
+.content>dl,
+.content>h1,
+.content>h2,
+.content>h3,
+.content>h4,
+.content>h5,
+.content>h6,
+.content>ol,
+.content>p,
+.content>table,
+.content>ul,
+.content>div,
+.content>form>aside,
+.content>form>details,
+.content>form>h1,
+.content>form>h2,
+.content>form>h3,
+.content>form>h4,
+.content>form>h5,
+.content>form>h6,
+.content>form>p,
+.content>form>table,
+.content>form>ul,
+.content>form>div {
+    margin-right: 50%;
+    padding: 0 28px;
+    box-sizing: border-box;
+    display: block;
+    text-shadow: 0 1px 0 #fff
+}
+
+.content>ol,
+.content>ul {
+    padding-left: 43px
+}
+
+.content>div,
+.content>h1,
+.content>h2 {
+    clear: both
+}
+
+.content h1 {
+    font-size: 30px;
+    padding-top: .5em;
+    padding-bottom: .5em;
+    border-bottom: 1px solid #ccc;
+    margin-bottom: 21px;
+    margin-top: 2em;
+    border-top: 1px solid #ddd;
+    background-image: linear-gradient(180deg, #fff, #f9f9f9)
+}
+
+.content div:first-child+h1,
+.content h1:first-child {
+    border-top-width: 0;
+    margin-top: 0
+}
+
+.content h2 {
+    font-size: 20px;
+    margin-top: 4em;
+    margin-bottom: 0;
+    border-top: 1px solid #ccc;
+    padding-top: 1.2em;
+    padding-bottom: 1.2em;
+    background-image: linear-gradient(180deg, hsla(0, 0%, 100%, .4), hsla(0, 0%, 100%, 0))
+}
+
+.content h1+div+h2,
+.content h1+h2 {
+    margin-top: -21px;
+    border-top: none
+}
+
+.content h3,
+.content h4,
+.content h5,
+.content h6 {
+    font-size: 15px;
+    margin-top: 2.5em;
+    margin-bottom: .8em
+}
+
+.content h4,
+.content h5,
+.content h6 {
+    font-size: 10px
+}
+
+.content hr {
+    margin: 2em 0;
+    border-top: 2px solid #393939;
+    border-bottom: 2px solid #eaf2f6
+}
+
+.content table {
+    margin-bottom: 1em;
+    overflow: auto
+}
+
+.content table td,
+.content table th {
+    text-align: left;
+    vertical-align: top;
+    line-height: 1.6
+}
+
+.content table th {
+    padding: 5px 10px;
+    border-bottom: 1px solid #ccc;
+    vertical-align: bottom
+}
+
+.content table td {
+    padding: 10px
+}
+
+.content table tr:last-child {
+    border-bottom: 1px solid #ccc
+}
+
+.content table tr:nth-child(odd)>td {
+    background-color: #ebf3f6
+}
+
+.content table tr:nth-child(even)>td {
+    background-color: #ebf2f6
+}
+
+.content dt {
+    font-weight: 700
+}
+
+.content dd {
+    margin-left: 15px
+}
+
+.content dd,
+.content dt,
+.content li,
+.content p {
+    line-height: 1.6;
+    margin-top: 0
+}
+
+.content img {
+    max-width: 100%
+}
+
+.content code {
+    padding: 3px;
+    border-radius: 3px
+}
+
+.content pre>code {
+    background-color: transparent;
+    padding: 0
+}
+
+.content aside {
+    padding-top: 1em;
+    padding-bottom: 1em;
+    margin-top: 1.5em;
+    margin-bottom: 1.5em;
+    background: #292929;
+    line-height: 1.6;
+    color: #c8c8c8;
+    text-shadow: none;
+}
+
+.content aside.info {
+    background: #8fbcd4;
+    text-shadow: 0 1px 0 #a0c6da;
+    color: initial;
+}
+
+.content aside.warning {
+    background-color: #c97a7e;
+    text-shadow: 0 1px 0 #d18e91;
+    color: initial;
+}
+
+.content aside.success {
+    background-color: #6ac174;
+    text-shadow: 0 1px 0 #80ca89;
+    color: initial;
+}
+
+.content aside:before {
+    vertical-align: middle;
+    padding-right: .5em;
+    font-size: 14px
+}
+
+.content .search-highlight {
+    padding: 2px;
+    margin: -2px;
+    border-radius: 4px;
+    border: 1px solid #f7e633;
+    text-shadow: 1px 1px 0 #666;
+    background: linear-gradient(to top left, #f7e633, #f1d32f)
+}
+
+.content blockquote,
+.content pre {
+    background-color: #292929;
+    color: #fff;
+    padding: 1.5em 28px;
+    margin: 0;
+    width: 50%;
+    float: right;
+    clear: right;
+    box-sizing: border-box;
+    text-shadow: 0 1px 2px rgba(0, 0, 0, .4)
+}
+
+.content blockquote pre.sf-dump,
+.content pre pre.sf-dump {
+    width: 100%;
+}
+
+.content .annotation {
+    background-color: #292929;
+    color: #fff;
+    padding: 0 28px;
+    margin: 0;
+    width: 50%;
+    float: right;
+    clear: right;
+    box-sizing: border-box;
+    text-shadow: 0 1px 2px rgba(0, 0, 0, .4)
+}
+
+.content .annotation pre {
+    padding: 0 0;
+    width: 100%;
+    float: none;
+}
+
+.content blockquote>p,
+.content pre>p {
+    margin: 0
+}
+
+.content blockquote a,
+.content pre a {
+    color: #fff;
+    text-decoration: none;
+    border-bottom: 1px dashed #ccc
+}
+
+.content blockquote>p {
+    background-color: #1c1c1c;
+    border-radius: 5px;
+    padding: 13px;
+    color: #ccc;
+    border-top: 1px solid #000;
+    border-bottom: 1px solid #404040
+}
+
+@media (max-width:930px) {
+    .tocify-wrapper {
+        left: -230px
+    }
+    .tocify-wrapper.open {
+        left: 0
+    }
+    .page-wrapper {
+        margin-left: 0
+    }
+    #nav-button {
+        display: block
+    }
+    .tocify-wrapper .tocify-item>a {
+        padding-top: .3em;
+        padding-bottom: .3em
+    }
+}
+
+@media (max-width:700px) {
+    .dark-box {
+        display: none
+    }
+    .tocify-wrapper .lang-selector {
+        display: block
+    }
+    .page-wrapper .lang-selector {
+        display: none
+    }
+    .content>aside,
+    .content>details,
+    .content>dl,
+    .content>h1,
+    .content>h2,
+    .content>h3,
+    .content>h4,
+    .content>h5,
+    .content>h6,
+    .content>ol,
+    .content>p,
+    .content>table,
+    .content>ul,
+    .content>div,
+    .content>form>aside,
+    .content>form>details,
+    .content>form>h1,
+    .content>form>h2,
+    .content>form>h3,
+    .content>form>h4,
+    .content>form>h5,
+    .content>form>h6,
+    .content>form>p,
+    .content>form>table,
+    .content>form>ul,
+    .content>form>div {
+        margin-right: 0;
+    }
+    .content blockquote,
+    .content pre {
+        float: none;
+        width: auto
+    }
+    .content .annotation {
+        float: none;
+        width: auto
+    }
+}
+
+.badge {
+    padding: 1px 9px 2px;
+    white-space: nowrap;
+    -webkit-border-radius: 9px;
+    -moz-border-radius: 9px;
+    border-radius: 9px;
+    color: #ffffff;
+    text-shadow: none !important;
+    font-weight: bold;
+}
+
+.badge.badge-darkred {
+    background-color: darkred;
+}
+
+.badge.badge-red {
+    background-color: red;
+}
+
+.badge.badge-blue {
+    background-color: blue;
+}
+
+.badge.badge-darkblue {
+    background-color: darkblue;
+}
+
+.badge.badge-green {
+    background-color: green;
+}
+
+.badge.badge-darkgreen {
+    background-color: darkgreen;
+}
+
+.badge.badge-purple {
+    background-color: purple;
+}
+
+.badge.badge-black {
+    background-color: black;
+}
+
+.badge.badge-grey {
+    background-color: grey;
+}
+
+.fancy-heading-panel {
+    background-color: lightgrey;
+    border-radius: 5px;
+    padding-left: 5px !important;
+    padding-top: 5px !important;
+    padding-bottom: 5px !important;
+    margin-left: 25px;
+    margin-right: 10px;
+    width: 47%;
+}
+
+@media screen and (max-width: 700px) {
+    .fancy-heading-panel {
+        width: 95%;
+    }
+
+}
+
+button {
+    border: none;
+}
+
+* {
+    /* Foreground, Background */
+    scrollbar-color: #3c4c67 transparent;
+}
+*::-webkit-scrollbar { /* Background */
+    width: 10px;
+    height: 10px;
+    background: transparent;
+}
+
+*::-webkit-scrollbar-thumb { /* Foreground */
+    background: #626161;
+}

BIN
public/vendor/scribe/images/navbar.png


+ 11 - 0
public/vendor/scribe/js/custom.js

@@ -0,0 +1,11 @@
+        document.querySelectorAll('.tocify-header .level-1 a').forEach(link => {
+            link.addEventListener('click', function(e) {
+                e.preventDefault();
+                const parentLi = this.closest('li');
+                const nextUl = parentLi.nextElementSibling;
+                if (nextUl && nextUl.tagName === 'UL') {
+                    nextUl.classList.contains('visible') ? nextUl.classList.remove('visible') : nextUl
+                        .classList.add('visible');
+                }
+            });
+        });

+ 149 - 0
public/vendor/scribe/js/theme-default-4.38.0.js

@@ -0,0 +1,149 @@
+document.addEventListener('DOMContentLoaded', function() {
+    const updateHash = function (id) {
+        window.location.hash = `#${id}`;
+    };
+
+    const navButton = document.getElementById('nav-button');
+    const menuWrapper = document.querySelector('.tocify-wrapper');
+    function toggleSidebar(event) {
+        event.preventDefault();
+        if (menuWrapper) {
+            menuWrapper.classList.toggle('open');
+            navButton.classList.toggle('open');
+        }
+    }
+    function closeSidebar() {
+        if (menuWrapper) {
+            menuWrapper.classList.remove('open');
+            navButton.classList.remove('open');
+        }
+    }
+    navButton.addEventListener('click', toggleSidebar);
+
+    window.hljs.highlightAll();
+
+    const wrapper = document.getElementById('toc');
+    // https://jets.js.org/
+    window.jets = new window.Jets({
+        // *OR - Selects elements whose values contains at least one part of search substring
+        searchSelector: '*OR',
+        searchTag: '#input-search',
+        contentTag: '#toc li',
+        didSearch: function(term) {
+            wrapper.classList.toggle('jets-searching', String(term).length > 0)
+        },
+        // map these accent keys to plain values
+        diacriticsMap: {
+            a: 'ÀÁÂÃÄÅàáâãäåĀāąĄ',
+            c: 'ÇçćĆčČ',
+            d: 'đĐďĎ',
+            e: 'ÈÉÊËèéêëěĚĒēęĘ',
+            i: 'ÌÍÎÏìíîïĪī',
+            l: 'łŁ',
+            n: 'ÑñňŇńŃ',
+            o: 'ÒÓÔÕÕÖØòóôõöøŌō',
+            r: 'řŘ',
+            s: 'ŠšśŚ',
+            t: 'ťŤ',
+            u: 'ÙÚÛÜùúûüůŮŪū',
+            y: 'ŸÿýÝ',
+            z: 'ŽžżŻźŹ'
+        }
+    });
+
+    function hashChange() {
+        const currentItems = document.querySelectorAll('.tocify-subheader.visible, .tocify-item.tocify-focus');
+        Array.from(currentItems).forEach((elem) => {
+            elem.classList.remove('visible', 'tocify-focus');
+        });
+
+        const currentTag = document.querySelector(`a[href="${window.location.hash}"]`);
+        if (currentTag) {
+            const parent = currentTag.closest('.tocify-subheader');
+            if (parent) {
+                parent.classList.add('visible');
+            }
+
+            const siblings = currentTag.closest('.tocify-header');
+            if (siblings) {
+                Array.from(siblings.querySelectorAll('.tocify-subheader')).forEach((elem) => {
+                    elem.classList.add('visible');
+                });
+            }
+
+            currentTag.parentElement.classList.add('tocify-focus');
+
+            // wait for dom changes to be done
+            setTimeout(() => {
+                currentTag.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' });
+                // only close the sidebar on level-2 events
+                if (currentTag.parentElement.classList.contains('level-2')) {
+                    closeSidebar();
+                }
+            }, 1500);
+        }
+    }
+
+    let languages = JSON.parse(document.body.getAttribute('data-languages'));
+    // Support a key => value object where the key is the name, or an array of strings where the value is the name
+    if (!Array.isArray(languages)) {
+        languages = Object.values(languages);
+    }
+    // if there is no language use the first one
+    const currentLanguage = window.localStorage.getItem('language') || languages[0];
+    const languageStyle = document.getElementById('language-style');
+    const langSelector = document.querySelectorAll('.lang-selector button.lang-button');
+
+    function setActiveLanguage(newLanguage) {
+        window.localStorage.setItem('language', newLanguage);
+        if (!languageStyle) {
+            return;
+        }
+
+        const newStyle = languages.map((language) => {
+            return language === newLanguage
+                // the current one should be visible
+                ? `body .content .${language}-example pre { display: block; }`
+                // the inactive one should be hidden
+                : `body .content .${language}-example pre { display: none; }`;
+        }).join(`\n`);
+
+        Array.from(langSelector).forEach((elem) => {
+            elem.classList.toggle('active', elem.getAttribute('data-language-name') === newLanguage);
+        });
+
+        const activeHash = window.location.hash.slice(1);
+
+        languageStyle.innerHTML = newStyle;
+
+        setTimeout(() => {
+            updateHash(activeHash);
+        }, 200);
+    }
+
+    setActiveLanguage(currentLanguage);
+
+    Array.from(langSelector).forEach((elem) => {
+        elem.addEventListener('click', () => {
+            const newLanguage = elem.getAttribute('data-language-name');
+            setActiveLanguage(newLanguage);
+        });
+    });
+
+    window.addEventListener('hashchange', hashChange, false);
+
+    const divs = document.querySelectorAll('.content h1[id], .content h2[id]');
+
+    document.addEventListener('scroll', () => {
+        divs.forEach(item => {
+            const rect = item.getBoundingClientRect();
+            if (rect.top > 0 && rect.top < 150) {
+                const location = window.location.toString().split('#')[0];
+                history.replaceState(null, null, location + '#' + item.id);
+                hashChange();
+            }
+        });
+    });
+
+    hashChange();
+});

+ 289 - 0
public/vendor/scribe/js/tryitout-4.38.0.js

@@ -0,0 +1,289 @@
+window.abortControllers = {};
+
+function cacheAuthValue() {
+    // Whenever the auth header is set for one endpoint, cache it for the others
+    window.lastAuthValue = '';
+    let authInputs = document.querySelectorAll(`.auth-value`)
+    authInputs.forEach(el => {
+        el.addEventListener('input', (event) => {
+            window.lastAuthValue = event.target.value;
+            authInputs.forEach(otherInput => {
+                if (otherInput === el) return;
+                // Don't block the main thread
+                setTimeout(() => {
+                    otherInput.value = window.lastAuthValue;
+                }, 0);
+            });
+        });
+    });
+}
+
+window.addEventListener('DOMContentLoaded', cacheAuthValue);
+
+function getCookie(name) {
+    if (!document.cookie) {
+        return null;
+    }
+
+    const cookies = document.cookie.split(';')
+        .map(c => c.trim())
+        .filter(c => c.startsWith(name + '='));
+
+    if (cookies.length === 0) {
+        return null;
+    }
+
+    return decodeURIComponent(cookies[0].split('=')[1]);
+}
+
+function tryItOut(endpointId) {
+    document.querySelector(`#btn-tryout-${endpointId}`).hidden = true;
+    document.querySelector(`#btn-canceltryout-${endpointId}`).hidden = false;
+    const executeBtn = document.querySelector(`#btn-executetryout-${endpointId}`).hidden = false;
+    executeBtn.disabled = false;
+
+    // Show all input fields
+    document.querySelectorAll(`input[data-endpoint=${endpointId}],label[data-endpoint=${endpointId}]`)
+        .forEach(el => el.style.display = 'block');
+
+    if (document.querySelector(`#form-${endpointId}`).dataset.authed === "1") {
+        const authElement = document.querySelector(`#auth-${endpointId}`);
+        authElement && (authElement.hidden = false);
+    }
+    // Expand all nested fields
+    document.querySelectorAll(`#form-${endpointId} details`)
+        .forEach(el => el.open = true);
+}
+
+function cancelTryOut(endpointId) {
+    if (window.abortControllers[endpointId]) {
+        window.abortControllers[endpointId].abort();
+        delete window.abortControllers[endpointId];
+    }
+
+    document.querySelector(`#btn-tryout-${endpointId}`).hidden = false;
+    const executeBtn = document.querySelector(`#btn-executetryout-${endpointId}`);
+    executeBtn.hidden = true;
+    executeBtn.textContent = executeBtn.dataset.initialText;
+    document.querySelector(`#btn-canceltryout-${endpointId}`).hidden = true;
+    // Hide inputs
+    document.querySelectorAll(`input[data-endpoint=${endpointId}],label[data-endpoint=${endpointId}]`)
+        .forEach(el => el.style.display = 'none');
+    document.querySelectorAll(`#form-${endpointId} details`)
+        .forEach(el => el.open = false);
+    const authElement = document.querySelector(`#auth-${endpointId}`);
+    authElement && (authElement.hidden = true);
+
+    document.querySelector('#execution-results-' + endpointId).hidden = true;
+    document.querySelector('#execution-error-' + endpointId).hidden = true;
+
+    // Revert to sample code blocks
+    document.querySelector('#example-requests-' + endpointId).hidden = false;
+    document.querySelector('#example-responses-' + endpointId).hidden = false;
+}
+
+function makeAPICall(method, path, body = {}, query = {}, headers = {}, endpointId = null) {
+    console.log({endpointId, path, body, query, headers});
+
+    if (!(body instanceof FormData) && typeof body !== "string") {
+        body = JSON.stringify(body)
+    }
+
+    const url = new URL(window.tryItOutBaseUrl + '/' + path.replace(/^\//, ''));
+
+    // We need this function because if you try to set an array or object directly to a URLSearchParams object,
+    // you'll get [object Object] or the array.toString()
+    function addItemToSearchParamsObject(key, value, searchParams) {
+            if (Array.isArray(value)) {
+                value.forEach((v, i) => {
+                    // Append {filters: [first, second]} as filters[0]=first&filters[1]second
+                    addItemToSearchParamsObject(key + '[' + i + ']', v, searchParams);
+                })
+            } else if (typeof value === 'object' && value !== null) {
+                Object.keys(value).forEach((i) => {
+                    // Append {filters: {name: first}} as filters[name]=first
+                    addItemToSearchParamsObject(key + '[' + i + ']', value[i], searchParams);
+                });
+            } else {
+                searchParams.append(key, value);
+            }
+    }
+
+    Object.keys(query)
+        .forEach(key => addItemToSearchParamsObject(key, query[key], url.searchParams));
+
+    window.abortControllers[endpointId] = new AbortController();
+
+    return fetch(url, {
+        method,
+        headers,
+        body: method === 'GET' ? undefined : body,
+        signal: window.abortControllers[endpointId].signal,
+        referrer: window.tryItOutBaseUrl,
+        mode: 'cors',
+        credentials: 'same-origin',
+    })
+        .then(response => Promise.all([response.status, response.statusText, response.text(), response.headers]));
+}
+
+function hideCodeSamples(endpointId) {
+    document.querySelector('#example-requests-' + endpointId).hidden = true;
+    document.querySelector('#example-responses-' + endpointId).hidden = true;
+}
+
+function handleResponse(endpointId, response, status, headers) {
+    hideCodeSamples(endpointId);
+
+    // Hide error views
+    document.querySelector('#execution-error-' + endpointId).hidden = true;
+
+    const responseContentEl = document.querySelector('#execution-response-content-' + endpointId);
+
+    // Check if the response contains Laravel's  dd() default dump output
+    const isLaravelDump = response.includes('Sfdump');
+
+    // If it's a Laravel dd() dump, use innerHTML to render it safely
+    if (isLaravelDump) {
+        responseContentEl.innerHTML = response === '' ? responseContentEl.dataset.emptyResponseText : response;
+    } else {
+        // Otherwise, stick to textContent for regular responses
+        responseContentEl.textContent = response === '' ? responseContentEl.dataset.emptyResponseText : response;
+    }
+
+    // Prettify it if it's JSON
+    let isJson = false;
+    try {
+        const jsonParsed = JSON.parse(response);
+        if (jsonParsed !== null) {
+            isJson = true;
+            response = JSON.stringify(jsonParsed, null, 4);
+            responseContentEl.textContent = response;
+        }
+    } catch (e) {
+
+    }
+
+    isJson && window.hljs.highlightElement(responseContentEl);
+    const statusEl = document.querySelector('#execution-response-status-' + endpointId);
+    statusEl.textContent = ` (${status})`;
+    document.querySelector('#execution-results-' + endpointId).hidden = false;
+    statusEl.scrollIntoView({behavior: "smooth", block: "center"});
+}
+
+function handleError(endpointId, err) {
+    hideCodeSamples(endpointId);
+    // Hide response views
+    document.querySelector('#execution-results-' + endpointId).hidden = true;
+
+    // Show error views
+    let errorMessage = err.message || err;
+    const $errorMessageEl = document.querySelector('#execution-error-message-' + endpointId);
+    $errorMessageEl.textContent = errorMessage + $errorMessageEl.textContent;
+    const errorEl = document.querySelector('#execution-error-' + endpointId);
+    errorEl.hidden = false;
+    errorEl.scrollIntoView({behavior: "smooth", block: "center"});
+
+}
+
+async function executeTryOut(endpointId, form) {
+    const executeBtn = document.querySelector(`#btn-executetryout-${endpointId}`);
+    executeBtn.textContent = executeBtn.dataset.loadingText;
+    executeBtn.disabled = true;
+    executeBtn.scrollIntoView({behavior: "smooth", block: "center"});
+
+    let body;
+    let setter;
+    if (form.dataset.hasfiles === "1") {
+        body = new FormData();
+        setter = (name, value) => body.append(name, value);
+    } else if (form.dataset.isarraybody === "1") {
+        body = [];
+        setter = (name, value) => _.set(body, name, value);
+    } else {
+        body = {};
+        setter = (name, value) => _.set(body, name, value);
+    }
+    const bodyParameters = form.querySelectorAll('input[data-component=body]');
+    bodyParameters.forEach(el => {
+        let value = el.value;
+
+        if (el.type === 'number' && typeof value === 'string') {
+            value = parseFloat(value);
+        }
+
+        if (el.type === 'file' && el.files[0]) {
+            setter(el.name, el.files[0]);
+            return;
+        }
+
+        if (el.type !== 'radio') {
+            if (value === "" && el.required === false) {
+                // Don't include empty optional values in the request
+                return;
+            }
+            setter(el.name, value);
+            return;
+        }
+
+        if (el.checked) {
+            value = (value === 'false') ? false : true;
+            setter(el.name, value);
+        }
+    });
+
+    const query = {};
+    const queryParameters = form.querySelectorAll('input[data-component=query]');
+    queryParameters.forEach(el => {
+        if (el.type !== 'radio' || (el.type === 'radio' && el.checked)) {
+            if (el.value === '') {
+                // Don't include empty values in the request
+                return;
+            }
+
+            _.set(query, el.name, el.value);
+        }
+    });
+
+    let path = form.dataset.path;
+    const urlParameters = form.querySelectorAll('input[data-component=url]');
+    urlParameters.forEach(el => (path = path.replace(new RegExp(`\\{${el.name}\\??}`), el.value)));
+
+    const headers = Object.fromEntries(Array.from(form.querySelectorAll('input[data-component=header]'))
+        .map(el => [el.name, el.value]));
+
+    // When using FormData, the browser sets the correct content-type + boundary
+    let method = form.dataset.method;
+    if (body instanceof FormData) {
+        delete headers['Content-Type'];
+
+        // When using FormData with PUT or PATCH, use method spoofing so PHP can access the post body
+        if (['PUT', 'PATCH'].includes(form.dataset.method)) {
+            method = 'POST';
+            setter('_method', form.dataset.method);
+        }
+    }
+
+    let preflightPromise = Promise.resolve();
+    if (window.useCsrf && window.csrfUrl) {
+        preflightPromise = makeAPICall('GET', window.csrfUrl).then(() => {
+            headers['X-XSRF-TOKEN'] = getCookie('XSRF-TOKEN');
+        });
+    }
+
+    return preflightPromise.then(() => makeAPICall(method, path, body, query, headers, endpointId))
+        .then(([responseStatus, statusText, responseContent, responseHeaders]) => {
+            handleResponse(endpointId, responseContent, responseStatus, responseHeaders)
+        })
+        .catch(err => {
+            if (err.name === "AbortError") {
+                console.log("Request cancelled");
+                return;
+            }
+            console.log("Error while making request: ", err);
+            handleError(endpointId, err);
+        })
+        .finally(() => {
+            executeBtn.disabled = false;
+            executeBtn.textContent = executeBtn.dataset.initialText;
+        });
+}

+ 5077 - 0
resources/views/scribe/index.blade.php

@@ -0,0 +1,5077 @@
+<!doctype html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <title>Owl Admin API Documentation</title>
+
+    <link href="https://fonts.googleapis.com/css?family=Open+Sans&display=swap" rel="stylesheet">
+
+    <link rel="stylesheet" href="{{ asset("/vendor/scribe/css/theme-default.style.css") }}" media="screen">
+    <link rel="stylesheet" href="{{ asset("/vendor/scribe/css/theme-default.print.css") }}" media="print">
+
+    <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.10/lodash.min.js"></script>
+
+    <link rel="stylesheet"
+          href="https://unpkg.com/@highlightjs/cdn-assets@11.6.0/styles/obsidian.min.css">
+    <script src="https://unpkg.com/@highlightjs/cdn-assets@11.6.0/highlight.min.js"></script>
+
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/jets/0.14.1/jets.min.js"></script>
+
+    <style id="language-style">
+        /* starts out as display none and is replaced with js later  */
+                    body .content .javascript-example code { display: none; }
+                    body .content .bash-example code { display: none; }
+            </style>
+
+    <script>
+        var tryItOutBaseUrl = "http://127.0.0.1";
+        var useCsrf = Boolean();
+        var csrfUrl = "/sanctum/csrf-cookie";
+    </script>
+    <script src="{{ asset("/vendor/scribe/js/tryitout-4.38.0.js") }}"></script>
+
+    <script src="{{ asset("/vendor/scribe/js/theme-default-4.38.0.js") }}"></script>
+
+</head>
+
+<body data-languages="[&quot;javascript&quot;,&quot;bash&quot;]">
+
+<a href="#" id="nav-button">
+    <span>
+        MENU
+        <img src="{{ asset("/vendor/scribe/images/navbar.png") }}" alt="navbar-image"/>
+    </span>
+</a>
+<div class="tocify-wrapper">
+    
+            <div class="lang-selector">
+                                            <button type="button" class="lang-button" data-language-name="javascript">javascript</button>
+                                            <button type="button" class="lang-button" data-language-name="bash">bash</button>
+                    </div>
+    
+    <div class="search">
+        <input type="text" class="search" id="input-search" placeholder="Search">
+    </div>
+
+    <div id="toc">
+                    <ul id="tocify-header-introduction" class="tocify-header">
+                <li class="tocify-item level-1" data-unique="introduction">
+                    <a href="#introduction">Introduction</a>
+                </li>
+                            </ul>
+                    <ul id="tocify-header-authenticating-requests" class="tocify-header">
+                <li class="tocify-item level-1" data-unique="authenticating-requests">
+                    <a href="#authenticating-requests">Authenticating requests</a>
+                </li>
+                            </ul>
+                    <ul id="tocify-header-" class="tocify-header">
+                <li class="tocify-item level-1" data-unique="">
+                    <a href="#"></a>
+                </li>
+                                    <ul id="tocify-subheader-" class="tocify-subheader">
+                                                    <li class="tocify-item level-2" data-unique="-GETapi-scribe-update-token--mobile-">
+                                <a href="#-GETapi-scribe-update-token--mobile-">更新API文档的认证Token</a>
+                            </li>
+                                                                        </ul>
+                            </ul>
+                    <ul id="tocify-header-" class="tocify-header">
+                <li class="tocify-item level-1" data-unique="">
+                    <a href="#">用户端-地址管理</a>
+                </li>
+                                    <ul id="tocify-subheader-" class="tocify-subheader">
+                                                    <li class="tocify-item level-2" data-unique="-GETapi-address-default">
+                                <a href="#-GETapi-address-default">获取默认地址2</a>
+                            </li>
+                                                                                <li class="tocify-item level-2" data-unique="-POSTapi-address">
+                                <a href="#-POSTapi-address">添加地址</a>
+                            </li>
+                                                                                <li class="tocify-item level-2" data-unique="-PUTapi-address--id-">
+                                <a href="#-PUTapi-address--id-">修改地址</a>
+                            </li>
+                                                                                <li class="tocify-item level-2" data-unique="-DELETEapi-address--id-">
+                                <a href="#-DELETEapi-address--id-">删除地址</a>
+                            </li>
+                                                                                <li class="tocify-item level-2" data-unique="-PUTapi-address--id--default">
+                                <a href="#-PUTapi-address--id--default">设置默认地址</a>
+                            </li>
+                                                                        </ul>
+                            </ul>
+                    <ul id="tocify-header-" class="tocify-header">
+                <li class="tocify-item level-1" data-unique="">
+                    <a href="#">用户端-技师定位管理</a>
+                </li>
+                                    <ul id="tocify-subheader-" class="tocify-subheader">
+                                                    <li class="tocify-item level-2" data-unique="-GETapi-coach-location">
+                                <a href="#-GETapi-coach-location">获取定位列表</a>
+                            </li>
+                                                                                <li class="tocify-item level-2" data-unique="-POSTapi-coach-location">
+                                <a href="#-POSTapi-coach-location">创建定位</a>
+                            </li>
+                                                                                <li class="tocify-item level-2" data-unique="-DELETEapi-coach-location--id-">
+                                <a href="#-DELETEapi-coach-location--id-">删除定位</a>
+                            </li>
+                                                                        </ul>
+                            </ul>
+                    <ul id="tocify-header-" class="tocify-header">
+                <li class="tocify-item level-1" data-unique="">
+                    <a href="#">用户端-技师管理</a>
+                </li>
+                                    <ul id="tocify-subheader-" class="tocify-subheader">
+                                                    <li class="tocify-item level-2" data-unique="-GETapi-coach">
+                                <a href="#-GETapi-coach">获取技师列表</a>
+                            </li>
+                                                                                <li class="tocify-item level-2" data-unique="-GETapi-coach--id-">
+                                <a href="#-GETapi-coach--id-">获取技师详情</a>
+                            </li>
+                                                                        </ul>
+                            </ul>
+                    <ul id="tocify-header-" class="tocify-header">
+                <li class="tocify-item level-1" data-unique="">
+                    <a href="#">用户端-用户管理</a>
+                </li>
+                                    <ul id="tocify-subheader-" class="tocify-subheader">
+                                                    <li class="tocify-item level-2" data-unique="-GETapi-user">
+                                <a href="#-GETapi-user">获取用户信息</a>
+                            </li>
+                                                                                <li class="tocify-item level-2" data-unique="-PUTapi-user">
+                                <a href="#-PUTapi-user">修改用户信息</a>
+                            </li>
+                                                                                <li class="tocify-item level-2" data-unique="-GETapi-user-wallet">
+                                <a href="#-GETapi-user-wallet">获取用户钱包</a>
+                            </li>
+                                                                                <li class="tocify-item level-2" data-unique="-POSTapi-user-withdraw">
+                                <a href="#-POSTapi-user-withdraw">用户提现</a>
+                            </li>
+                                                                                <li class="tocify-item level-2" data-unique="-POSTapi-user-apply-coach">
+                                <a href="#-POSTapi-user-apply-coach">申请成为技师</a>
+                            </li>
+                                                                        </ul>
+                            </ul>
+                    <ul id="tocify-header-" class="tocify-header">
+                <li class="tocify-item level-1" data-unique="">
+                    <a href="#">用户端-订单管理</a>
+                </li>
+                                    <ul id="tocify-subheader-" class="tocify-subheader">
+                                                    <li class="tocify-item level-2" data-unique="-POSTapi-orders-initialize">
+                                <a href="#-POSTapi-orders-initialize">订单初始化</a>
+                            </li>
+                                                                                <li class="tocify-item level-2" data-unique="-POSTapi-orders-create">
+                                <a href="#-POSTapi-orders-create">创建订单</a>
+                            </li>
+                                                                                <li class="tocify-item level-2" data-unique="-POSTapi-orders-cancel">
+                                <a href="#-POSTapi-orders-cancel">取消订单</a>
+                            </li>
+                                                                                <li class="tocify-item level-2" data-unique="-POSTapi-orders-finish">
+                                <a href="#-POSTapi-orders-finish">结束订单</a>
+                            </li>
+                                                                                <li class="tocify-item level-2" data-unique="-POSTapi-orders-confirm-leave">
+                                <a href="#-POSTapi-orders-confirm-leave">确认技师离开</a>
+                            </li>
+                                                                                <li class="tocify-item level-2" data-unique="-GETapi-orders-list">
+                                <a href="#-GETapi-orders-list">获取订单列表</a>
+                            </li>
+                                                                                <li class="tocify-item level-2" data-unique="-GETapi-orders-detail--id-">
+                                <a href="#-GETapi-orders-detail--id-">获取订单详情</a>
+                            </li>
+                                                                        </ul>
+                            </ul>
+                    <ul id="tocify-header-" class="tocify-header">
+                <li class="tocify-item level-1" data-unique="">
+                    <a href="#">用户端-项目管理</a>
+                </li>
+                                    <ul id="tocify-subheader-" class="tocify-subheader">
+                                                    <li class="tocify-item level-2" data-unique="-GETapi-project">
+                                <a href="#-GETapi-project">获取项目列表</a>
+                            </li>
+                                                                                <li class="tocify-item level-2" data-unique="-GETapi-project--id--detail">
+                                <a href="#-GETapi-project--id--detail">获取项目详情</a>
+                            </li>
+                                                                                <li class="tocify-item level-2" data-unique="-GETapi-project-coach-list">
+                                <a href="#-GETapi-project-coach-list">获取技师项目列表</a>
+                            </li>
+                                                                        </ul>
+                            </ul>
+                    <ul id="tocify-header-" class="tocify-header">
+                <li class="tocify-item level-1" data-unique="">
+                    <a href="#">账户管理</a>
+                </li>
+                                    <ul id="tocify-subheader-" class="tocify-subheader">
+                                                    <li class="tocify-item level-2" data-unique="-POSTapi-account-send-code">
+                                <a href="#-POSTapi-account-send-code">发送验证码</a>
+                            </li>
+                                                                                <li class="tocify-item level-2" data-unique="-POSTapi-account-login">
+                                <a href="#-POSTapi-account-login">用户登录</a>
+                            </li>
+                                                                                <li class="tocify-item level-2" data-unique="-POSTapi-account-wx-login">
+                                <a href="#-POSTapi-account-wx-login">微信登录</a>
+                            </li>
+                                                                                <li class="tocify-item level-2" data-unique="-POSTapi-account-logout">
+                                <a href="#-POSTapi-account-logout">用户退出</a>
+                            </li>
+                                                                                <li class="tocify-item level-2" data-unique="-DELETEapi-account">
+                                <a href="#-DELETEapi-account">用户注销</a>
+                            </li>
+                                                                        </ul>
+                            </ul>
+            </div>
+
+    <ul class="toc-footer" id="toc-footer">
+                    <li style="padding-bottom: 5px;"><a href="{{ route("scribe.postman") }}">View Postman collection</a></li>
+                            <li style="padding-bottom: 5px;"><a href="{{ route("scribe.openapi") }}">View OpenAPI spec</a></li>
+                <li><a href="http://github.com/knuckleswtf/scribe">Documentation powered by Scribe ✍</a></li>
+    </ul>
+
+    <ul class="toc-footer" id="last-updated">
+        <li>November 22 2024</li>
+    </ul>
+</div>
+
+<div class="page-wrapper">
+    <div class="dark-box"></div>
+    <div class="content">
+        <h1 id="introduction">Introduction</h1>
+<p>Owl Admin API 接口文档</p>
+<aside>
+    <strong>Base URL</strong>: <code>http://127.0.0.1</code>
+</aside>
+<p>欢迎使用 Owl Admin API 接口文档。</p>
+<p>该文档提供了所有可用的API接口信息。</p>
+
+        <h1 id="authenticating-requests">Authenticating requests</h1>
+<p>To authenticate requests, include an <strong><code>Authorization</code></strong> header with the value <strong><code>"Bearer 171|4wDLRqkRn3A5mQm3b5l9gelKO8BijUZKZrgVugt544296a98"</code></strong>.</p>
+<p>All authenticated endpoints are marked with a <code>requires authentication</code> badge in the documentation below.</p>
+<p>通过登录接口获取 token,格式为 Bearer {token}</p>
+
+        <h1 id=""></h1>
+
+    
+
+                                <h2 id="-GETapi-scribe-update-token--mobile-">更新API文档的认证Token</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+<p>通过手机号获取验证码并登录,然后更新API文档的认证Token</p>
+
+<span id="example-requests-GETapi-scribe-update-token--mobile-">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/scribe/update-token/13800138000"
+);
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Accept": "application/json",
+};
+
+fetch(url, {
+    method: "GET",
+    headers,
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request GET \
+    --get "http://127.0.0.1/api/scribe/update-token/13800138000" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}"</code></pre></div>
+
+</span>
+
+<span id="example-responses-GETapi-scribe-update-token--mobile-">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 200,
+    &quot;message&quot;: &quot;Token更新成功&quot;,
+    &quot;data&quot;: {
+        &quot;token&quot;: &quot;your_new_token_here&quot;
+    }
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-GETapi-scribe-update-token--mobile-" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-GETapi-scribe-update-token--mobile-"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-GETapi-scribe-update-token--mobile-"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-GETapi-scribe-update-token--mobile-" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-GETapi-scribe-update-token--mobile-">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-GETapi-scribe-update-token--mobile-" data-method="GET"
+      data-path="api/scribe/update-token/{mobile}"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('GETapi-scribe-update-token--mobile-', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-GETapi-scribe-update-token--mobile-"
+                    onclick="tryItOut('GETapi-scribe-update-token--mobile-');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-GETapi-scribe-update-token--mobile-"
+                    onclick="cancelTryOut('GETapi-scribe-update-token--mobile-');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-GETapi-scribe-update-token--mobile-"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-green">GET</small>
+            <b><code>api/scribe/update-token/{mobile}</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="GETapi-scribe-update-token--mobile-"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                        <h4 class="fancy-heading-panel"><b>URL Parameters</b></h4>
+                    <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>mobile</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="mobile"                data-endpoint="GETapi-scribe-update-token--mobile-"
+               value="13800138000"
+               data-component="url">
+    <br>
+<p>手机号码. Example: <code>13800138000</code></p>
+            </div>
+                    </form>
+
+                <h1 id="">用户端-地址管理</h1>
+
+    <p>用户地址相关的API接口</p>
+
+                                <h2 id="-GETapi-address-default">获取默认地址2</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+
+
+<span id="example-requests-GETapi-address-default">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/address/default"
+);
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Accept": "application/json",
+};
+
+fetch(url, {
+    method: "GET",
+    headers,
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request GET \
+    --get "http://127.0.0.1/api/address/default" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}"</code></pre></div>
+
+</span>
+
+<span id="example-responses-GETapi-address-default">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 200,
+    &quot;message&quot;: &quot;success&quot;,
+    &quot;data&quot;: {
+        &quot;id&quot;: 1,
+        &quot;user_id&quot;: 1,
+        &quot;name&quot;: &quot;张三&quot;,
+        &quot;phone&quot;: &quot;13800138000&quot;,
+        &quot;province&quot;: &quot;广东省&quot;,
+        &quot;city&quot;: &quot;深圳市&quot;,
+        &quot;district&quot;: &quot;南山区&quot;,
+        &quot;address&quot;: &quot;科技园&quot;,
+        &quot;is_default&quot;: 1,
+        &quot;created_at&quot;: &quot;2024-01-01 00:00:00&quot;,
+        &quot;updated_at&quot;: &quot;2024-01-01 00:00:00&quot;
+    }
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-GETapi-address-default" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-GETapi-address-default"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-GETapi-address-default"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-GETapi-address-default" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-GETapi-address-default">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-GETapi-address-default" data-method="GET"
+      data-path="api/address/default"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('GETapi-address-default', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-GETapi-address-default"
+                    onclick="tryItOut('GETapi-address-default');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-GETapi-address-default"
+                    onclick="cancelTryOut('GETapi-address-default');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-GETapi-address-default"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-green">GET</small>
+            <b><code>api/address/default</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="GETapi-address-default"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                        </form>
+
+                    <h2 id="-POSTapi-address">添加地址</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+
+
+<span id="example-requests-POSTapi-address">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/address"
+);
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Content-Type": "application/json",
+    "Accept": "application/json",
+};
+
+let body = {
+    "phone": "13800138000",
+    "province": "广东省",
+    "city": "深圳市",
+    "district": "南山区",
+    "longitude": "113.93041",
+    "latitude": "22.53332",
+    "area_code": "440305",
+    "is_default": true,
+    "location": "科技园",
+    "detail": "科技园南区"
+};
+
+fetch(url, {
+    method: "POST",
+    headers,
+    body: JSON.stringify(body),
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request POST \
+    "http://127.0.0.1/api/address" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
+    --header "Content-Type: application/json" \
+    --data "{
+    \"phone\": \"13800138000\",
+    \"province\": \"广东省\",
+    \"city\": \"深圳市\",
+    \"district\": \"南山区\",
+    \"longitude\": \"113.93041\",
+    \"latitude\": \"22.53332\",
+    \"area_code\": \"440305\",
+    \"is_default\": true,
+    \"location\": \"科技园\",
+    \"detail\": \"科技园南区\"
+}"
+</code></pre></div>
+
+</span>
+
+<span id="example-responses-POSTapi-address">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 200,
+    &quot;message&quot;: &quot;添加成功&quot;
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-POSTapi-address" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-POSTapi-address"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-POSTapi-address"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-POSTapi-address" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-POSTapi-address">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-POSTapi-address" data-method="POST"
+      data-path="api/address"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('POSTapi-address', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-POSTapi-address"
+                    onclick="tryItOut('POSTapi-address');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-POSTapi-address"
+                    onclick="cancelTryOut('POSTapi-address');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-POSTapi-address"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-black">POST</small>
+            <b><code>api/address</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="POSTapi-address"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Content-Type</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Content-Type"                data-endpoint="POSTapi-address"
+               value="application/json"
+               data-component="header">
+    <br>
+<p>Example: <code>application/json</code></p>
+            </div>
+                                <h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
+        <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>phone</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="phone"                data-endpoint="POSTapi-address"
+               value="13800138000"
+               data-component="body">
+    <br>
+<p>手机号 Example: <code>13800138000</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>province</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="province"                data-endpoint="POSTapi-address"
+               value="广东省"
+               data-component="body">
+    <br>
+<p>省份 Example: <code>广东省</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>city</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="city"                data-endpoint="POSTapi-address"
+               value="深圳市"
+               data-component="body">
+    <br>
+<p>城市 Example: <code>深圳市</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>district</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="district"                data-endpoint="POSTapi-address"
+               value="南山区"
+               data-component="body">
+    <br>
+<p>区县 Example: <code>南山区</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>longitude</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="longitude"                data-endpoint="POSTapi-address"
+               value="113.93041"
+               data-component="body">
+    <br>
+<p>经度 Example: <code>113.93041</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>latitude</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="latitude"                data-endpoint="POSTapi-address"
+               value="22.53332"
+               data-component="body">
+    <br>
+<p>纬度 Example: <code>22.53332</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>area_code</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="area_code"                data-endpoint="POSTapi-address"
+               value="440305"
+               data-component="body">
+    <br>
+<p>区划代码 Example: <code>440305</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>is_default</code></b>&nbsp;&nbsp;
+<small>boolean</small>&nbsp;
+ &nbsp;
+                <label data-endpoint="POSTapi-address" style="display: none">
+            <input type="radio" name="is_default"
+                   value="true"
+                   data-endpoint="POSTapi-address"
+                   data-component="body"             >
+            <code>true</code>
+        </label>
+        <label data-endpoint="POSTapi-address" style="display: none">
+            <input type="radio" name="is_default"
+                   value="false"
+                   data-endpoint="POSTapi-address"
+                   data-component="body"             >
+            <code>false</code>
+        </label>
+    <br>
+<p>是否默认地址 Example: <code>true</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>location</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="location"                data-endpoint="POSTapi-address"
+               value="科技园"
+               data-component="body">
+    <br>
+<p>定位地址 Example: <code>科技园</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>detail</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="detail"                data-endpoint="POSTapi-address"
+               value="科技园南区"
+               data-component="body">
+    <br>
+<p>详细地址 Example: <code>科技园南区</code></p>
+        </div>
+        </form>
+
+                    <h2 id="-PUTapi-address--id-">修改地址</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+
+
+<span id="example-requests-PUTapi-address--id-">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/address/1"
+);
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Content-Type": "application/json",
+    "Accept": "application/json",
+};
+
+let body = {
+    "phone": "13800138000",
+    "province": "广东省",
+    "city": "深圳市",
+    "district": "南山区",
+    "longitude": "113.93041",
+    "latitude": "22.53332",
+    "area_code": "440305",
+    "is_default": true,
+    "location": "科技园",
+    "detail": "科技园南区"
+};
+
+fetch(url, {
+    method: "PUT",
+    headers,
+    body: JSON.stringify(body),
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request PUT \
+    "http://127.0.0.1/api/address/1" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
+    --header "Content-Type: application/json" \
+    --data "{
+    \"phone\": \"13800138000\",
+    \"province\": \"广东省\",
+    \"city\": \"深圳市\",
+    \"district\": \"南山区\",
+    \"longitude\": \"113.93041\",
+    \"latitude\": \"22.53332\",
+    \"area_code\": \"440305\",
+    \"is_default\": true,
+    \"location\": \"科技园\",
+    \"detail\": \"科技园南区\"
+}"
+</code></pre></div>
+
+</span>
+
+<span id="example-responses-PUTapi-address--id-">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 200,
+    &quot;message&quot;: &quot;修改成功&quot;
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-PUTapi-address--id-" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-PUTapi-address--id-"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-PUTapi-address--id-"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-PUTapi-address--id-" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-PUTapi-address--id-">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-PUTapi-address--id-" data-method="PUT"
+      data-path="api/address/{id}"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('PUTapi-address--id-', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-PUTapi-address--id-"
+                    onclick="tryItOut('PUTapi-address--id-');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-PUTapi-address--id-"
+                    onclick="cancelTryOut('PUTapi-address--id-');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-PUTapi-address--id-"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-darkblue">PUT</small>
+            <b><code>api/address/{id}</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="PUTapi-address--id-"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Content-Type</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Content-Type"                data-endpoint="PUTapi-address--id-"
+               value="application/json"
+               data-component="header">
+    <br>
+<p>Example: <code>application/json</code></p>
+            </div>
+                        <h4 class="fancy-heading-panel"><b>URL Parameters</b></h4>
+                    <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>id</code></b>&nbsp;&nbsp;
+<small>integer</small>&nbsp;
+ &nbsp;
+                <input type="number" style="display: none"
+               step="any"               name="id"                data-endpoint="PUTapi-address--id-"
+               value="1"
+               data-component="url">
+    <br>
+<p>地址ID Example: <code>1</code></p>
+            </div>
+                            <h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
+        <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>phone</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="phone"                data-endpoint="PUTapi-address--id-"
+               value="13800138000"
+               data-component="body">
+    <br>
+<p>手机号 Example: <code>13800138000</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>province</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="province"                data-endpoint="PUTapi-address--id-"
+               value="广东省"
+               data-component="body">
+    <br>
+<p>省份 Example: <code>广东省</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>city</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="city"                data-endpoint="PUTapi-address--id-"
+               value="深圳市"
+               data-component="body">
+    <br>
+<p>城市 Example: <code>深圳市</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>district</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="district"                data-endpoint="PUTapi-address--id-"
+               value="南山区"
+               data-component="body">
+    <br>
+<p>区县 Example: <code>南山区</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>longitude</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="longitude"                data-endpoint="PUTapi-address--id-"
+               value="113.93041"
+               data-component="body">
+    <br>
+<p>经度 Example: <code>113.93041</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>latitude</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="latitude"                data-endpoint="PUTapi-address--id-"
+               value="22.53332"
+               data-component="body">
+    <br>
+<p>纬度 Example: <code>22.53332</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>area_code</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="area_code"                data-endpoint="PUTapi-address--id-"
+               value="440305"
+               data-component="body">
+    <br>
+<p>区划代码 Example: <code>440305</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>is_default</code></b>&nbsp;&nbsp;
+<small>boolean</small>&nbsp;
+ &nbsp;
+                <label data-endpoint="PUTapi-address--id-" style="display: none">
+            <input type="radio" name="is_default"
+                   value="true"
+                   data-endpoint="PUTapi-address--id-"
+                   data-component="body"             >
+            <code>true</code>
+        </label>
+        <label data-endpoint="PUTapi-address--id-" style="display: none">
+            <input type="radio" name="is_default"
+                   value="false"
+                   data-endpoint="PUTapi-address--id-"
+                   data-component="body"             >
+            <code>false</code>
+        </label>
+    <br>
+<p>是否默认地址 Example: <code>true</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>location</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="location"                data-endpoint="PUTapi-address--id-"
+               value="科技园"
+               data-component="body">
+    <br>
+<p>定位地址 Example: <code>科技园</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>detail</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="detail"                data-endpoint="PUTapi-address--id-"
+               value="科技园南区"
+               data-component="body">
+    <br>
+<p>详细地址 Example: <code>科技园南区</code></p>
+        </div>
+        </form>
+
+                    <h2 id="-DELETEapi-address--id-">删除地址</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+
+
+<span id="example-requests-DELETEapi-address--id-">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/address/1"
+);
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Accept": "application/json",
+};
+
+fetch(url, {
+    method: "DELETE",
+    headers,
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request DELETE \
+    "http://127.0.0.1/api/address/1" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}"</code></pre></div>
+
+</span>
+
+<span id="example-responses-DELETEapi-address--id-">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 200,
+    &quot;message&quot;: &quot;删除成功&quot;
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-DELETEapi-address--id-" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-DELETEapi-address--id-"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-DELETEapi-address--id-"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-DELETEapi-address--id-" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-DELETEapi-address--id-">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-DELETEapi-address--id-" data-method="DELETE"
+      data-path="api/address/{id}"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('DELETEapi-address--id-', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-DELETEapi-address--id-"
+                    onclick="tryItOut('DELETEapi-address--id-');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-DELETEapi-address--id-"
+                    onclick="cancelTryOut('DELETEapi-address--id-');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-DELETEapi-address--id-"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-red">DELETE</small>
+            <b><code>api/address/{id}</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="DELETEapi-address--id-"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                        <h4 class="fancy-heading-panel"><b>URL Parameters</b></h4>
+                    <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>id</code></b>&nbsp;&nbsp;
+<small>integer</small>&nbsp;
+ &nbsp;
+                <input type="number" style="display: none"
+               step="any"               name="id"                data-endpoint="DELETEapi-address--id-"
+               value="1"
+               data-component="url">
+    <br>
+<p>地址ID Example: <code>1</code></p>
+            </div>
+                    </form>
+
+                    <h2 id="-PUTapi-address--id--default">设置默认地址</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+
+
+<span id="example-requests-PUTapi-address--id--default">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/address/1/default"
+);
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Accept": "application/json",
+};
+
+fetch(url, {
+    method: "PUT",
+    headers,
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request PUT \
+    "http://127.0.0.1/api/address/1/default" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}"</code></pre></div>
+
+</span>
+
+<span id="example-responses-PUTapi-address--id--default">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 200,
+    &quot;message&quot;: &quot;设置成功&quot;
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-PUTapi-address--id--default" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-PUTapi-address--id--default"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-PUTapi-address--id--default"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-PUTapi-address--id--default" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-PUTapi-address--id--default">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-PUTapi-address--id--default" data-method="PUT"
+      data-path="api/address/{id}/default"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('PUTapi-address--id--default', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-PUTapi-address--id--default"
+                    onclick="tryItOut('PUTapi-address--id--default');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-PUTapi-address--id--default"
+                    onclick="cancelTryOut('PUTapi-address--id--default');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-PUTapi-address--id--default"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-darkblue">PUT</small>
+            <b><code>api/address/{id}/default</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="PUTapi-address--id--default"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                        <h4 class="fancy-heading-panel"><b>URL Parameters</b></h4>
+                    <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>id</code></b>&nbsp;&nbsp;
+<small>integer</small>&nbsp;
+ &nbsp;
+                <input type="number" style="display: none"
+               step="any"               name="id"                data-endpoint="PUTapi-address--id--default"
+               value="1"
+               data-component="url">
+    <br>
+<p>地址ID Example: <code>1</code></p>
+            </div>
+                    </form>
+
+                <h1 id="">用户端-技师定位管理</h1>
+
+    <p>技师定位相关的API接口</p>
+
+                                <h2 id="-GETapi-coach-location">获取定位列表</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+
+
+<span id="example-requests-GETapi-coach-location">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/coach/location"
+);
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Accept": "application/json",
+};
+
+fetch(url, {
+    method: "GET",
+    headers,
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request GET \
+    --get "http://127.0.0.1/api/coach/location" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}"</code></pre></div>
+
+</span>
+
+<span id="example-responses-GETapi-coach-location">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 200,
+    &quot;message&quot;: &quot;获取成功&quot;,
+    &quot;data&quot;: [
+        {
+            &quot;id&quot;: 1,
+            &quot;type&quot;: &quot;home&quot;,
+            &quot;latitude&quot;: 34.0522,
+            &quot;longitude&quot;: -118.2437,
+            &quot;city&quot;: &quot;Los Angeles&quot;,
+            &quot;district&quot;: &quot;Downtown&quot;,
+            &quot;location&quot;: &quot;123 Main St&quot;,
+            &quot;area_code&quot;: &quot;90001&quot;
+        }
+    ]
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-GETapi-coach-location" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-GETapi-coach-location"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-GETapi-coach-location"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-GETapi-coach-location" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-GETapi-coach-location">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-GETapi-coach-location" data-method="GET"
+      data-path="api/coach/location"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('GETapi-coach-location', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-GETapi-coach-location"
+                    onclick="tryItOut('GETapi-coach-location');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-GETapi-coach-location"
+                    onclick="cancelTryOut('GETapi-coach-location');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-GETapi-coach-location"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-green">GET</small>
+            <b><code>api/coach/location</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="GETapi-coach-location"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                        </form>
+
+                    <h2 id="-POSTapi-coach-location">创建定位</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+
+
+<span id="example-requests-POSTapi-coach-location">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/coach/location"
+);
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Content-Type": "application/json",
+    "Accept": "application/json",
+};
+
+let body = {
+    "type": "home",
+    "latitude": 34.0522,
+    "longitude": -118.2437,
+    "city": "Los Angeles",
+    "district": "Downtown",
+    "location": "123 Main St",
+    "area_code": "90001"
+};
+
+fetch(url, {
+    method: "POST",
+    headers,
+    body: JSON.stringify(body),
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request POST \
+    "http://127.0.0.1/api/coach/location" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
+    --header "Content-Type: application/json" \
+    --data "{
+    \"type\": \"home\",
+    \"latitude\": 34.0522,
+    \"longitude\": -118.2437,
+    \"city\": \"Los Angeles\",
+    \"district\": \"Downtown\",
+    \"location\": \"123 Main St\",
+    \"area_code\": \"90001\"
+}"
+</code></pre></div>
+
+</span>
+
+<span id="example-responses-POSTapi-coach-location">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 200,
+    &quot;message&quot;: &quot;创建成功&quot;,
+    &quot;data&quot;: {
+        &quot;id&quot;: 1,
+        &quot;type&quot;: &quot;home&quot;,
+        &quot;latitude&quot;: 34.0522,
+        &quot;longitude&quot;: -118.2437,
+        &quot;city&quot;: &quot;Los Angeles&quot;,
+        &quot;district&quot;: &quot;Downtown&quot;,
+        &quot;location&quot;: &quot;123 Main St&quot;,
+        &quot;area_code&quot;: &quot;90001&quot;
+    }
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-POSTapi-coach-location" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-POSTapi-coach-location"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-POSTapi-coach-location"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-POSTapi-coach-location" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-POSTapi-coach-location">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-POSTapi-coach-location" data-method="POST"
+      data-path="api/coach/location"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('POSTapi-coach-location', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-POSTapi-coach-location"
+                    onclick="tryItOut('POSTapi-coach-location');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-POSTapi-coach-location"
+                    onclick="cancelTryOut('POSTapi-coach-location');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-POSTapi-coach-location"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-black">POST</small>
+            <b><code>api/coach/location</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="POSTapi-coach-location"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Content-Type</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Content-Type"                data-endpoint="POSTapi-coach-location"
+               value="application/json"
+               data-component="header">
+    <br>
+<p>Example: <code>application/json</code></p>
+            </div>
+                                <h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
+        <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>type</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="type"                data-endpoint="POSTapi-coach-location"
+               value="home"
+               data-component="body">
+    <br>
+<p>类型. Example: <code>home</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>latitude</code></b>&nbsp;&nbsp;
+<small>number</small>&nbsp;
+ &nbsp;
+                <input type="number" style="display: none"
+               step="any"               name="latitude"                data-endpoint="POSTapi-coach-location"
+               value="34.0522"
+               data-component="body">
+    <br>
+<p>纬度. Example: <code>34.0522</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>longitude</code></b>&nbsp;&nbsp;
+<small>number</small>&nbsp;
+ &nbsp;
+                <input type="number" style="display: none"
+               step="any"               name="longitude"                data-endpoint="POSTapi-coach-location"
+               value="-118.2437"
+               data-component="body">
+    <br>
+<p>经度. Example: <code>-118.2437</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>city</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="city"                data-endpoint="POSTapi-coach-location"
+               value="Los Angeles"
+               data-component="body">
+    <br>
+<p>市. Example: <code>Los Angeles</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>district</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="district"                data-endpoint="POSTapi-coach-location"
+               value="Downtown"
+               data-component="body">
+    <br>
+<p>区. Example: <code>Downtown</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>location</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="location"                data-endpoint="POSTapi-coach-location"
+               value="123 Main St"
+               data-component="body">
+    <br>
+<p>详细地址. Example: <code>123 Main St</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>area_code</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="area_code"                data-endpoint="POSTapi-coach-location"
+               value="90001"
+               data-component="body">
+    <br>
+<p>区域编码. Example: <code>90001</code></p>
+        </div>
+        </form>
+
+                    <h2 id="-DELETEapi-coach-location--id-">删除定位</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+
+
+<span id="example-requests-DELETEapi-coach-location--id-">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/coach/location/quis"
+);
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Content-Type": "application/json",
+    "Accept": "application/json",
+};
+
+let body = {
+    "coach_id": 1,
+    "type": "home"
+};
+
+fetch(url, {
+    method: "DELETE",
+    headers,
+    body: JSON.stringify(body),
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request DELETE \
+    "http://127.0.0.1/api/coach/location/quis" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
+    --header "Content-Type: application/json" \
+    --data "{
+    \"coach_id\": 1,
+    \"type\": \"home\"
+}"
+</code></pre></div>
+
+</span>
+
+<span id="example-responses-DELETEapi-coach-location--id-">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 200,
+    &quot;message&quot;: &quot;删除成功&quot;,
+    &quot;data&quot;: null
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-DELETEapi-coach-location--id-" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-DELETEapi-coach-location--id-"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-DELETEapi-coach-location--id-"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-DELETEapi-coach-location--id-" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-DELETEapi-coach-location--id-">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-DELETEapi-coach-location--id-" data-method="DELETE"
+      data-path="api/coach/location/{id}"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('DELETEapi-coach-location--id-', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-DELETEapi-coach-location--id-"
+                    onclick="tryItOut('DELETEapi-coach-location--id-');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-DELETEapi-coach-location--id-"
+                    onclick="cancelTryOut('DELETEapi-coach-location--id-');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-DELETEapi-coach-location--id-"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-red">DELETE</small>
+            <b><code>api/coach/location/{id}</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="DELETEapi-coach-location--id-"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Content-Type</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Content-Type"                data-endpoint="DELETEapi-coach-location--id-"
+               value="application/json"
+               data-component="header">
+    <br>
+<p>Example: <code>application/json</code></p>
+            </div>
+                        <h4 class="fancy-heading-panel"><b>URL Parameters</b></h4>
+                    <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>id</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="id"                data-endpoint="DELETEapi-coach-location--id-"
+               value="quis"
+               data-component="url">
+    <br>
+<p>The ID of the location. Example: <code>quis</code></p>
+            </div>
+                            <h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
+        <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>coach_id</code></b>&nbsp;&nbsp;
+<small>integer</small>&nbsp;
+ &nbsp;
+                <input type="number" style="display: none"
+               step="any"               name="coach_id"                data-endpoint="DELETEapi-coach-location--id-"
+               value="1"
+               data-component="body">
+    <br>
+<p>技师ID. Example: <code>1</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>type</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="type"                data-endpoint="DELETEapi-coach-location--id-"
+               value="home"
+               data-component="body">
+    <br>
+<p>类型. Example: <code>home</code></p>
+        </div>
+        </form>
+
+                <h1 id="">用户端-技师管理</h1>
+
+    <p>技师相关的API接口</p>
+
+                                <h2 id="-GETapi-coach">获取技师列表</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+<p>根据经纬度获取技师列表</p>
+
+<span id="example-requests-GETapi-coach">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/coach"
+);
+
+const params = {
+    "latitude": "34.0522",
+    "longitude": "-118.2437",
+};
+Object.keys(params)
+    .forEach(key =&gt; url.searchParams.append(key, params[key]));
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Accept": "application/json",
+};
+
+fetch(url, {
+    method: "GET",
+    headers,
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request GET \
+    --get "http://127.0.0.1/api/coach?latitude=34.0522&amp;longitude=-118.2437" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}"</code></pre></div>
+
+</span>
+
+<span id="example-responses-GETapi-coach">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 200,
+    &quot;message&quot;: &quot;获取成功&quot;,
+    &quot;data&quot;: [
+        {
+            &quot;id&quot;: 1,
+            &quot;name&quot;: &quot;技师A&quot;,
+            &quot;latitude&quot;: 34.0522,
+            &quot;longitude&quot;: -118.2437
+        }
+    ]
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-GETapi-coach" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-GETapi-coach"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-GETapi-coach"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-GETapi-coach" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-GETapi-coach">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-GETapi-coach" data-method="GET"
+      data-path="api/coach"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('GETapi-coach', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-GETapi-coach"
+                    onclick="tryItOut('GETapi-coach');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-GETapi-coach"
+                    onclick="cancelTryOut('GETapi-coach');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-GETapi-coach"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-green">GET</small>
+            <b><code>api/coach</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="GETapi-coach"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                            <h4 class="fancy-heading-panel"><b>Query Parameters</b></h4>
+                                    <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>latitude</code></b>&nbsp;&nbsp;
+<small>number</small>&nbsp;
+ &nbsp;
+                <input type="number" style="display: none"
+               step="any"               name="latitude"                data-endpoint="GETapi-coach"
+               value="34.0522"
+               data-component="query">
+    <br>
+<p>纬度. Example: <code>34.0522</code></p>
+            </div>
+                                    <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>longitude</code></b>&nbsp;&nbsp;
+<small>number</small>&nbsp;
+ &nbsp;
+                <input type="number" style="display: none"
+               step="any"               name="longitude"                data-endpoint="GETapi-coach"
+               value="-118.2437"
+               data-component="query">
+    <br>
+<p>经度. Example: <code>-118.2437</code></p>
+            </div>
+                </form>
+
+                    <h2 id="-GETapi-coach--id-">获取技师详情</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+<p>根据ID获取技师的详细信息</p>
+
+<span id="example-requests-GETapi-coach--id-">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/coach/1"
+);
+
+const params = {
+    "latitude": "34.0522",
+    "longitude": "-118.2437",
+};
+Object.keys(params)
+    .forEach(key =&gt; url.searchParams.append(key, params[key]));
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Accept": "application/json",
+};
+
+fetch(url, {
+    method: "GET",
+    headers,
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request GET \
+    --get "http://127.0.0.1/api/coach/1?latitude=34.0522&amp;longitude=-118.2437" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}"</code></pre></div>
+
+</span>
+
+<span id="example-responses-GETapi-coach--id-">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 200,
+    &quot;message&quot;: &quot;获取成功&quot;,
+    &quot;data&quot;: {
+        &quot;id&quot;: 1,
+        &quot;name&quot;: &quot;技师A&quot;,
+        &quot;latitude&quot;: 34.0522,
+        &quot;longitude&quot;: -118.2437,
+        &quot;details&quot;: &quot;详细信息&quot;
+    }
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-GETapi-coach--id-" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-GETapi-coach--id-"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-GETapi-coach--id-"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-GETapi-coach--id-" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-GETapi-coach--id-">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-GETapi-coach--id-" data-method="GET"
+      data-path="api/coach/{id}"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('GETapi-coach--id-', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-GETapi-coach--id-"
+                    onclick="tryItOut('GETapi-coach--id-');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-GETapi-coach--id-"
+                    onclick="cancelTryOut('GETapi-coach--id-');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-GETapi-coach--id-"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-green">GET</small>
+            <b><code>api/coach/{id}</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="GETapi-coach--id-"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                        <h4 class="fancy-heading-panel"><b>URL Parameters</b></h4>
+                    <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>id</code></b>&nbsp;&nbsp;
+<small>integer</small>&nbsp;
+ &nbsp;
+                <input type="number" style="display: none"
+               step="any"               name="id"                data-endpoint="GETapi-coach--id-"
+               value="1"
+               data-component="url">
+    <br>
+<p>技师ID. Example: <code>1</code></p>
+            </div>
+                        <h4 class="fancy-heading-panel"><b>Query Parameters</b></h4>
+                                    <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>latitude</code></b>&nbsp;&nbsp;
+<small>number</small>&nbsp;
+<i>optional</i> &nbsp;
+                <input type="number" style="display: none"
+               step="any"               name="latitude"                data-endpoint="GETapi-coach--id-"
+               value="34.0522"
+               data-component="query">
+    <br>
+<p>纬度. Example: <code>34.0522</code></p>
+            </div>
+                                    <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>longitude</code></b>&nbsp;&nbsp;
+<small>number</small>&nbsp;
+<i>optional</i> &nbsp;
+                <input type="number" style="display: none"
+               step="any"               name="longitude"                data-endpoint="GETapi-coach--id-"
+               value="-118.2437"
+               data-component="query">
+    <br>
+<p>经度. Example: <code>-118.2437</code></p>
+            </div>
+                </form>
+
+                <h1 id="">用户端-用户管理</h1>
+
+    <p>用户相关的API接口</p>
+
+                                <h2 id="-GETapi-user">获取用户信息</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+<p>获取当前用户的信息</p>
+
+<span id="example-requests-GETapi-user">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/user"
+);
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Accept": "application/json",
+};
+
+fetch(url, {
+    method: "GET",
+    headers,
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request GET \
+    --get "http://127.0.0.1/api/user" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}"</code></pre></div>
+
+</span>
+
+<span id="example-responses-GETapi-user">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 200,
+    &quot;message&quot;: &quot;获取成功&quot;,
+    &quot;data&quot;: {
+        &quot;id&quot;: 1,
+        &quot;mobile&quot;: &quot;13800138000&quot;,
+        &quot;nickname&quot;: &quot;用户昵称&quot;
+    }
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-GETapi-user" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-GETapi-user"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-GETapi-user"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-GETapi-user" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-GETapi-user">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-GETapi-user" data-method="GET"
+      data-path="api/user"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('GETapi-user', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-GETapi-user"
+                    onclick="tryItOut('GETapi-user');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-GETapi-user"
+                    onclick="cancelTryOut('GETapi-user');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-GETapi-user"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-green">GET</small>
+            <b><code>api/user</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="GETapi-user"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                        </form>
+
+                    <h2 id="-PUTapi-user">修改用户信息</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+<p>修改当前用户的信息</p>
+
+<span id="example-requests-PUTapi-user">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/user"
+);
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Content-Type": "application/json",
+    "Accept": "application/json",
+};
+
+let body = {
+    "nickname": "用户昵称",
+    "avatar": "https:\/\/example.com\/avatar.jpg"
+};
+
+fetch(url, {
+    method: "PUT",
+    headers,
+    body: JSON.stringify(body),
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request PUT \
+    "http://127.0.0.1/api/user" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
+    --header "Content-Type: application/json" \
+    --data "{
+    \"nickname\": \"用户昵称\",
+    \"avatar\": \"https:\\/\\/example.com\\/avatar.jpg\"
+}"
+</code></pre></div>
+
+</span>
+
+<span id="example-responses-PUTapi-user">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 200,
+    &quot;message&quot;: &quot;修改成功&quot;,
+    &quot;data&quot;: null
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-PUTapi-user" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-PUTapi-user"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-PUTapi-user"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-PUTapi-user" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-PUTapi-user">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-PUTapi-user" data-method="PUT"
+      data-path="api/user"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('PUTapi-user', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-PUTapi-user"
+                    onclick="tryItOut('PUTapi-user');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-PUTapi-user"
+                    onclick="cancelTryOut('PUTapi-user');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-PUTapi-user"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-darkblue">PUT</small>
+            <b><code>api/user</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="PUTapi-user"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Content-Type</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Content-Type"                data-endpoint="PUTapi-user"
+               value="application/json"
+               data-component="header">
+    <br>
+<p>Example: <code>application/json</code></p>
+            </div>
+                                <h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
+        <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>nickname</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+<i>optional</i> &nbsp;
+                <input type="text" style="display: none"
+                              name="nickname"                data-endpoint="PUTapi-user"
+               value="用户昵称"
+               data-component="body">
+    <br>
+<p>用户昵称. Example: <code>用户昵称</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>avatar</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+<i>optional</i> &nbsp;
+                <input type="text" style="display: none"
+                              name="avatar"                data-endpoint="PUTapi-user"
+               value="https://example.com/avatar.jpg"
+               data-component="body">
+    <br>
+<p>用户头像. Example: <code>https://example.com/avatar.jpg</code></p>
+        </div>
+        </form>
+
+                    <h2 id="-GETapi-user-wallet">获取用户钱包</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+<p>获取当前用户的钱包信息</p>
+
+<span id="example-requests-GETapi-user-wallet">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/user/wallet"
+);
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Accept": "application/json",
+};
+
+fetch(url, {
+    method: "GET",
+    headers,
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request GET \
+    --get "http://127.0.0.1/api/user/wallet" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}"</code></pre></div>
+
+</span>
+
+<span id="example-responses-GETapi-user-wallet">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 200,
+    &quot;message&quot;: &quot;获取成功&quot;,
+    &quot;data&quot;: {
+        &quot;balance&quot;: 100,
+        &quot;freeze&quot;: 0
+    }
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-GETapi-user-wallet" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-GETapi-user-wallet"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-GETapi-user-wallet"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-GETapi-user-wallet" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-GETapi-user-wallet">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-GETapi-user-wallet" data-method="GET"
+      data-path="api/user/wallet"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('GETapi-user-wallet', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-GETapi-user-wallet"
+                    onclick="tryItOut('GETapi-user-wallet');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-GETapi-user-wallet"
+                    onclick="cancelTryOut('GETapi-user-wallet');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-GETapi-user-wallet"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-green">GET</small>
+            <b><code>api/user/wallet</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="GETapi-user-wallet"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                        </form>
+
+                    <h2 id="-POSTapi-user-withdraw">用户提现</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+<p>提现用户的余额</p>
+
+<span id="example-requests-POSTapi-user-withdraw">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/user/withdraw"
+);
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Content-Type": "application/json",
+    "Accept": "application/json",
+};
+
+let body = {
+    "amount": "100.00",
+    "type": "wechat",
+    "area_code": "330100"
+};
+
+fetch(url, {
+    method: "POST",
+    headers,
+    body: JSON.stringify(body),
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request POST \
+    "http://127.0.0.1/api/user/withdraw" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
+    --header "Content-Type: application/json" \
+    --data "{
+    \"amount\": \"100.00\",
+    \"type\": \"wechat\",
+    \"area_code\": \"330100\"
+}"
+</code></pre></div>
+
+</span>
+
+<span id="example-responses-POSTapi-user-withdraw">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 200,
+    &quot;message&quot;: &quot;提现成功&quot;,
+    &quot;data&quot;: null
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-POSTapi-user-withdraw" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-POSTapi-user-withdraw"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-POSTapi-user-withdraw"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-POSTapi-user-withdraw" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-POSTapi-user-withdraw">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-POSTapi-user-withdraw" data-method="POST"
+      data-path="api/user/withdraw"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('POSTapi-user-withdraw', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-POSTapi-user-withdraw"
+                    onclick="tryItOut('POSTapi-user-withdraw');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-POSTapi-user-withdraw"
+                    onclick="cancelTryOut('POSTapi-user-withdraw');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-POSTapi-user-withdraw"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-black">POST</small>
+            <b><code>api/user/withdraw</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="POSTapi-user-withdraw"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Content-Type</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Content-Type"                data-endpoint="POSTapi-user-withdraw"
+               value="application/json"
+               data-component="header">
+    <br>
+<p>Example: <code>application/json</code></p>
+            </div>
+                                <h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
+        <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>amount</code></b>&nbsp;&nbsp;
+<small>decimal</small>&nbsp;
+<i>optional</i> &nbsp;
+                <input type="text" style="display: none"
+                              name="amount"                data-endpoint="POSTapi-user-withdraw"
+               value="100.00"
+               data-component="body">
+    <br>
+<p>提现金额. Example: <code>100.00</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>type</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+<i>optional</i> &nbsp;
+                <input type="text" style="display: none"
+                              name="type"                data-endpoint="POSTapi-user-withdraw"
+               value="wechat"
+               data-component="body">
+    <br>
+<p>提现方式. Example: <code>wechat</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>area_code</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+<i>optional</i> &nbsp;
+                <input type="text" style="display: none"
+                              name="area_code"                data-endpoint="POSTapi-user-withdraw"
+               value="330100"
+               data-component="body">
+    <br>
+<p>行政区划代码. Example: <code>330100</code></p>
+        </div>
+        </form>
+
+                    <h2 id="-POSTapi-user-apply-coach">申请成为技师</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+<p>申请成为技师</p>
+
+<span id="example-requests-POSTapi-user-apply-coach">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/user/apply-coach"
+);
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Content-Type": "application/json",
+    "Accept": "application/json",
+};
+
+let body = {
+    "mobile": "13800138000",
+    "gender": "male",
+    "work_years": "5",
+    "intention_city": "杭州"
+};
+
+fetch(url, {
+    method: "POST",
+    headers,
+    body: JSON.stringify(body),
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request POST \
+    "http://127.0.0.1/api/user/apply-coach" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
+    --header "Content-Type: application/json" \
+    --data "{
+    \"mobile\": \"13800138000\",
+    \"gender\": \"male\",
+    \"work_years\": \"5\",
+    \"intention_city\": \"杭州\"
+}"
+</code></pre></div>
+
+</span>
+
+<span id="example-responses-POSTapi-user-apply-coach">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 200,
+    &quot;message&quot;: &quot;申请成功&quot;,
+    &quot;data&quot;: null
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-POSTapi-user-apply-coach" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-POSTapi-user-apply-coach"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-POSTapi-user-apply-coach"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-POSTapi-user-apply-coach" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-POSTapi-user-apply-coach">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-POSTapi-user-apply-coach" data-method="POST"
+      data-path="api/user/apply-coach"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('POSTapi-user-apply-coach', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-POSTapi-user-apply-coach"
+                    onclick="tryItOut('POSTapi-user-apply-coach');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-POSTapi-user-apply-coach"
+                    onclick="cancelTryOut('POSTapi-user-apply-coach');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-POSTapi-user-apply-coach"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-black">POST</small>
+            <b><code>api/user/apply-coach</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="POSTapi-user-apply-coach"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Content-Type</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Content-Type"                data-endpoint="POSTapi-user-apply-coach"
+               value="application/json"
+               data-component="header">
+    <br>
+<p>Example: <code>application/json</code></p>
+            </div>
+                                <h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
+        <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>mobile</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+<i>optional</i> &nbsp;
+                <input type="text" style="display: none"
+                              name="mobile"                data-endpoint="POSTapi-user-apply-coach"
+               value="13800138000"
+               data-component="body">
+    <br>
+<p>手机号. Example: <code>13800138000</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>gender</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+<i>optional</i> &nbsp;
+                <input type="text" style="display: none"
+                              name="gender"                data-endpoint="POSTapi-user-apply-coach"
+               value="male"
+               data-component="body">
+    <br>
+<p>性别. Example: <code>male</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>work_years</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+<i>optional</i> &nbsp;
+                <input type="text" style="display: none"
+                              name="work_years"                data-endpoint="POSTapi-user-apply-coach"
+               value="5"
+               data-component="body">
+    <br>
+<p>工作年限. Example: <code>5</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>intention_city</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+<i>optional</i> &nbsp;
+                <input type="text" style="display: none"
+                              name="intention_city"                data-endpoint="POSTapi-user-apply-coach"
+               value="杭州"
+               data-component="body">
+    <br>
+<p>意向城市. Example: <code>杭州</code></p>
+        </div>
+        </form>
+
+                <h1 id="">用户端-订单管理</h1>
+
+    <p>订单相关的API接口</p>
+
+                                <h2 id="-POSTapi-orders-initialize">订单初始化</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+<p>初始化订单</p>
+
+<span id="example-requests-POSTapi-orders-initialize">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/orders/initialize"
+);
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Content-Type": "application/json",
+    "Accept": "application/json",
+};
+
+let body = {
+    "coach_id": 1,
+    "area_code": "370602",
+    "project_id": 1
+};
+
+fetch(url, {
+    method: "POST",
+    headers,
+    body: JSON.stringify(body),
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request POST \
+    "http://127.0.0.1/api/orders/initialize" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
+    --header "Content-Type: application/json" \
+    --data "{
+    \"coach_id\": 1,
+    \"area_code\": \"370602\",
+    \"project_id\": 1
+}"
+</code></pre></div>
+
+</span>
+
+<span id="example-responses-POSTapi-orders-initialize">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;status&quot;: &quot;success&quot;,
+    &quot;data&quot;: {}
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-POSTapi-orders-initialize" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-POSTapi-orders-initialize"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-POSTapi-orders-initialize"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-POSTapi-orders-initialize" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-POSTapi-orders-initialize">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-POSTapi-orders-initialize" data-method="POST"
+      data-path="api/orders/initialize"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('POSTapi-orders-initialize', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-POSTapi-orders-initialize"
+                    onclick="tryItOut('POSTapi-orders-initialize');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-POSTapi-orders-initialize"
+                    onclick="cancelTryOut('POSTapi-orders-initialize');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-POSTapi-orders-initialize"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-black">POST</small>
+            <b><code>api/orders/initialize</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="POSTapi-orders-initialize"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Content-Type</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Content-Type"                data-endpoint="POSTapi-orders-initialize"
+               value="application/json"
+               data-component="header">
+    <br>
+<p>Example: <code>application/json</code></p>
+            </div>
+                                <h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
+        <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>coach_id</code></b>&nbsp;&nbsp;
+<small>integer</small>&nbsp;
+ &nbsp;
+                <input type="number" style="display: none"
+               step="any"               name="coach_id"                data-endpoint="POSTapi-orders-initialize"
+               value="1"
+               data-component="body">
+    <br>
+<p>技师ID. Example: <code>1</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>area_code</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="area_code"                data-endpoint="POSTapi-orders-initialize"
+               value="370602"
+               data-component="body">
+    <br>
+<p>区划代码. Example: <code>370602</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>project_id</code></b>&nbsp;&nbsp;
+<small>integer</small>&nbsp;
+ &nbsp;
+                <input type="number" style="display: none"
+               step="any"               name="project_id"                data-endpoint="POSTapi-orders-initialize"
+               value="1"
+               data-component="body">
+    <br>
+<p>项目ID. Example: <code>1</code></p>
+        </div>
+        </form>
+
+                    <h2 id="-POSTapi-orders-create">创建订单</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+<p>创建订单</p>
+
+<span id="example-requests-POSTapi-orders-create">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/orders/create"
+);
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Content-Type": "application/json",
+    "Accept": "application/json",
+};
+
+let body = {
+    "project_id": 1,
+    "address_id": 1,
+    "coach_id": 6,
+    "use_balance": false,
+    "service_time": "2024-01-01 10:00:00",
+    "order_id": null
+};
+
+fetch(url, {
+    method: "POST",
+    headers,
+    body: JSON.stringify(body),
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request POST \
+    "http://127.0.0.1/api/orders/create" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
+    --header "Content-Type: application/json" \
+    --data "{
+    \"project_id\": 1,
+    \"address_id\": 1,
+    \"coach_id\": 6,
+    \"use_balance\": false,
+    \"service_time\": \"2024-01-01 10:00:00\",
+    \"order_id\": null
+}"
+</code></pre></div>
+
+</span>
+
+<span id="example-responses-POSTapi-orders-create">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;status&quot;: &quot;success&quot;,
+    &quot;data&quot;: {}
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-POSTapi-orders-create" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-POSTapi-orders-create"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-POSTapi-orders-create"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-POSTapi-orders-create" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-POSTapi-orders-create">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-POSTapi-orders-create" data-method="POST"
+      data-path="api/orders/create"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('POSTapi-orders-create', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-POSTapi-orders-create"
+                    onclick="tryItOut('POSTapi-orders-create');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-POSTapi-orders-create"
+                    onclick="cancelTryOut('POSTapi-orders-create');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-POSTapi-orders-create"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-black">POST</small>
+            <b><code>api/orders/create</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="POSTapi-orders-create"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Content-Type</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Content-Type"                data-endpoint="POSTapi-orders-create"
+               value="application/json"
+               data-component="header">
+    <br>
+<p>Example: <code>application/json</code></p>
+            </div>
+                                <h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
+        <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>project_id</code></b>&nbsp;&nbsp;
+<small>integer</small>&nbsp;
+ &nbsp;
+                <input type="number" style="display: none"
+               step="any"               name="project_id"                data-endpoint="POSTapi-orders-create"
+               value="1"
+               data-component="body">
+    <br>
+<p>项目ID. Example: <code>1</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>address_id</code></b>&nbsp;&nbsp;
+<small>integer</small>&nbsp;
+ &nbsp;
+                <input type="number" style="display: none"
+               step="any"               name="address_id"                data-endpoint="POSTapi-orders-create"
+               value="1"
+               data-component="body">
+    <br>
+<p>地址ID. Example: <code>1</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>coach_id</code></b>&nbsp;&nbsp;
+<small>integer</small>&nbsp;
+ &nbsp;
+                <input type="number" style="display: none"
+               step="any"               name="coach_id"                data-endpoint="POSTapi-orders-create"
+               value="6"
+               data-component="body">
+    <br>
+<p>技师ID. Example: <code>6</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>use_balance</code></b>&nbsp;&nbsp;
+<small>boolean</small>&nbsp;
+<i>optional</i> &nbsp;
+                <label data-endpoint="POSTapi-orders-create" style="display: none">
+            <input type="radio" name="use_balance"
+                   value="true"
+                   data-endpoint="POSTapi-orders-create"
+                   data-component="body"             >
+            <code>true</code>
+        </label>
+        <label data-endpoint="POSTapi-orders-create" style="display: none">
+            <input type="radio" name="use_balance"
+                   value="false"
+                   data-endpoint="POSTapi-orders-create"
+                   data-component="body"             >
+            <code>false</code>
+        </label>
+    <br>
+<p>使用余额. Example: <code>false</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>service_time</code></b>&nbsp;&nbsp;
+<small>datetime</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="service_time"                data-endpoint="POSTapi-orders-create"
+               value="2024-01-01 10:00:00"
+               data-component="body">
+    <br>
+<p>服务时间. Example: <code>2024-01-01 10:00:00</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>order_id</code></b>&nbsp;&nbsp;
+<small>integer</small>&nbsp;
+<i>optional</i> &nbsp;
+                <input type="number" style="display: none"
+               step="any"               name="order_id"                data-endpoint="POSTapi-orders-create"
+               value=""
+               data-component="body">
+    <br>
+<p>订单ID.</p>
+        </div>
+        </form>
+
+                    <h2 id="-POSTapi-orders-cancel">取消订单</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+<p>取消订单</p>
+
+<span id="example-requests-POSTapi-orders-cancel">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/orders/cancel"
+);
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Content-Type": "application/json",
+    "Accept": "application/json",
+};
+
+let body = {
+    "order_id": 123
+};
+
+fetch(url, {
+    method: "POST",
+    headers,
+    body: JSON.stringify(body),
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request POST \
+    "http://127.0.0.1/api/orders/cancel" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
+    --header "Content-Type: application/json" \
+    --data "{
+    \"order_id\": 123
+}"
+</code></pre></div>
+
+</span>
+
+<span id="example-responses-POSTapi-orders-cancel">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;status&quot;: &quot;success&quot;,
+    &quot;data&quot;: {}
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-POSTapi-orders-cancel" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-POSTapi-orders-cancel"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-POSTapi-orders-cancel"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-POSTapi-orders-cancel" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-POSTapi-orders-cancel">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-POSTapi-orders-cancel" data-method="POST"
+      data-path="api/orders/cancel"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('POSTapi-orders-cancel', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-POSTapi-orders-cancel"
+                    onclick="tryItOut('POSTapi-orders-cancel');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-POSTapi-orders-cancel"
+                    onclick="cancelTryOut('POSTapi-orders-cancel');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-POSTapi-orders-cancel"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-black">POST</small>
+            <b><code>api/orders/cancel</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="POSTapi-orders-cancel"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Content-Type</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Content-Type"                data-endpoint="POSTapi-orders-cancel"
+               value="application/json"
+               data-component="header">
+    <br>
+<p>Example: <code>application/json</code></p>
+            </div>
+                                <h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
+        <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>order_id</code></b>&nbsp;&nbsp;
+<small>integer</small>&nbsp;
+ &nbsp;
+                <input type="number" style="display: none"
+               step="any"               name="order_id"                data-endpoint="POSTapi-orders-cancel"
+               value="123"
+               data-component="body">
+    <br>
+<p>订单ID. Example: <code>123</code></p>
+        </div>
+        </form>
+
+                    <h2 id="-POSTapi-orders-finish">结束订单</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+<p>结束订单</p>
+
+<span id="example-requests-POSTapi-orders-finish">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/orders/finish"
+);
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Content-Type": "application/json",
+    "Accept": "application/json",
+};
+
+let body = {
+    "order_id": 1
+};
+
+fetch(url, {
+    method: "POST",
+    headers,
+    body: JSON.stringify(body),
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request POST \
+    "http://127.0.0.1/api/orders/finish" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
+    --header "Content-Type: application/json" \
+    --data "{
+    \"order_id\": 1
+}"
+</code></pre></div>
+
+</span>
+
+<span id="example-responses-POSTapi-orders-finish">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;status&quot;: &quot;success&quot;,
+    &quot;data&quot;: {}
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-POSTapi-orders-finish" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-POSTapi-orders-finish"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-POSTapi-orders-finish"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-POSTapi-orders-finish" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-POSTapi-orders-finish">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-POSTapi-orders-finish" data-method="POST"
+      data-path="api/orders/finish"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('POSTapi-orders-finish', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-POSTapi-orders-finish"
+                    onclick="tryItOut('POSTapi-orders-finish');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-POSTapi-orders-finish"
+                    onclick="cancelTryOut('POSTapi-orders-finish');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-POSTapi-orders-finish"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-black">POST</small>
+            <b><code>api/orders/finish</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="POSTapi-orders-finish"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Content-Type</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Content-Type"                data-endpoint="POSTapi-orders-finish"
+               value="application/json"
+               data-component="header">
+    <br>
+<p>Example: <code>application/json</code></p>
+            </div>
+                                <h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
+        <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>order_id</code></b>&nbsp;&nbsp;
+<small>integer</small>&nbsp;
+ &nbsp;
+                <input type="number" style="display: none"
+               step="any"               name="order_id"                data-endpoint="POSTapi-orders-finish"
+               value="1"
+               data-component="body">
+    <br>
+<p>订单ID. Example: <code>1</code></p>
+        </div>
+        </form>
+
+                    <h2 id="-POSTapi-orders-confirm-leave">确认技师离开</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+<p>确认技师离开</p>
+
+<span id="example-requests-POSTapi-orders-confirm-leave">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/orders/confirm-leave"
+);
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Content-Type": "application/json",
+    "Accept": "application/json",
+};
+
+let body = {
+    "order_id": 123
+};
+
+fetch(url, {
+    method: "POST",
+    headers,
+    body: JSON.stringify(body),
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request POST \
+    "http://127.0.0.1/api/orders/confirm-leave" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
+    --header "Content-Type: application/json" \
+    --data "{
+    \"order_id\": 123
+}"
+</code></pre></div>
+
+</span>
+
+<span id="example-responses-POSTapi-orders-confirm-leave">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;status&quot;: &quot;success&quot;,
+    &quot;data&quot;: {}
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-POSTapi-orders-confirm-leave" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-POSTapi-orders-confirm-leave"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-POSTapi-orders-confirm-leave"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-POSTapi-orders-confirm-leave" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-POSTapi-orders-confirm-leave">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-POSTapi-orders-confirm-leave" data-method="POST"
+      data-path="api/orders/confirm-leave"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('POSTapi-orders-confirm-leave', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-POSTapi-orders-confirm-leave"
+                    onclick="tryItOut('POSTapi-orders-confirm-leave');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-POSTapi-orders-confirm-leave"
+                    onclick="cancelTryOut('POSTapi-orders-confirm-leave');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-POSTapi-orders-confirm-leave"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-black">POST</small>
+            <b><code>api/orders/confirm-leave</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="POSTapi-orders-confirm-leave"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Content-Type</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Content-Type"                data-endpoint="POSTapi-orders-confirm-leave"
+               value="application/json"
+               data-component="header">
+    <br>
+<p>Example: <code>application/json</code></p>
+            </div>
+                                <h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
+        <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>order_id</code></b>&nbsp;&nbsp;
+<small>integer</small>&nbsp;
+ &nbsp;
+                <input type="number" style="display: none"
+               step="any"               name="order_id"                data-endpoint="POSTapi-orders-confirm-leave"
+               value="123"
+               data-component="body">
+    <br>
+<p>订单ID. Example: <code>123</code></p>
+        </div>
+        </form>
+
+                    <h2 id="-GETapi-orders-list">获取订单列表</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+<p>获取订单列表</p>
+
+<span id="example-requests-GETapi-orders-list">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/orders/list"
+);
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Accept": "application/json",
+};
+
+fetch(url, {
+    method: "GET",
+    headers,
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request GET \
+    --get "http://127.0.0.1/api/orders/list" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}"</code></pre></div>
+
+</span>
+
+<span id="example-responses-GETapi-orders-list">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;status&quot;: &quot;success&quot;,
+    &quot;data&quot;: []
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-GETapi-orders-list" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-GETapi-orders-list"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-GETapi-orders-list"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-GETapi-orders-list" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-GETapi-orders-list">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-GETapi-orders-list" data-method="GET"
+      data-path="api/orders/list"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('GETapi-orders-list', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-GETapi-orders-list"
+                    onclick="tryItOut('GETapi-orders-list');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-GETapi-orders-list"
+                    onclick="cancelTryOut('GETapi-orders-list');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-GETapi-orders-list"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-green">GET</small>
+            <b><code>api/orders/list</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="GETapi-orders-list"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                        </form>
+
+                    <h2 id="-GETapi-orders-detail--id-">获取订单详情</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+<p>获取订单详情</p>
+
+<span id="example-requests-GETapi-orders-detail--id-">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/orders/detail/1"
+);
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Accept": "application/json",
+};
+
+fetch(url, {
+    method: "GET",
+    headers,
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request GET \
+    --get "http://127.0.0.1/api/orders/detail/1" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}"</code></pre></div>
+
+</span>
+
+<span id="example-responses-GETapi-orders-detail--id-">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;status&quot;: &quot;success&quot;,
+    &quot;data&quot;: {}
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-GETapi-orders-detail--id-" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-GETapi-orders-detail--id-"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-GETapi-orders-detail--id-"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-GETapi-orders-detail--id-" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-GETapi-orders-detail--id-">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-GETapi-orders-detail--id-" data-method="GET"
+      data-path="api/orders/detail/{id}"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('GETapi-orders-detail--id-', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-GETapi-orders-detail--id-"
+                    onclick="tryItOut('GETapi-orders-detail--id-');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-GETapi-orders-detail--id-"
+                    onclick="cancelTryOut('GETapi-orders-detail--id-');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-GETapi-orders-detail--id-"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-green">GET</small>
+            <b><code>api/orders/detail/{id}</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="GETapi-orders-detail--id-"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                        <h4 class="fancy-heading-panel"><b>URL Parameters</b></h4>
+                    <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>id</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="id"                data-endpoint="GETapi-orders-detail--id-"
+               value="1"
+               data-component="url">
+    <br>
+<p>订单ID. Example: <code>1</code></p>
+            </div>
+                    </form>
+
+                <h1 id="">用户端-项目管理</h1>
+
+    <p>项目相关的API接口</p>
+
+                                <h2 id="-GETapi-project">获取项目列表</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+<p>根据区域代码获取项目列表</p>
+
+<span id="example-requests-GETapi-project">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/project"
+);
+
+const params = {
+    "area_code": "330100",
+    "project_cate_id": "1",
+};
+Object.keys(params)
+    .forEach(key =&gt; url.searchParams.append(key, params[key]));
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Accept": "application/json",
+};
+
+fetch(url, {
+    method: "GET",
+    headers,
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request GET \
+    --get "http://127.0.0.1/api/project?area_code=330100&amp;project_cate_id=1" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}"</code></pre></div>
+
+</span>
+
+<span id="example-responses-GETapi-project">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 200,
+    &quot;message&quot;: &quot;获取成功&quot;,
+    &quot;data&quot;: {
+        &quot;current_page&quot;: 1,
+        &quot;data&quot;: [
+            {
+                &quot;id&quot;: 1,
+                &quot;name&quot;: &quot;项目名称&quot;,
+                &quot;description&quot;: &quot;项目描述&quot;,
+                &quot;price&quot;: &quot;100.00&quot;,
+                &quot;duration&quot;: 60,
+                &quot;category&quot;: {
+                    &quot;id&quot;: 1,
+                    &quot;name&quot;: &quot;分类名称&quot;
+                }
+            }
+        ],
+        &quot;total&quot;: 10,
+        &quot;per_page&quot;: 10
+    }
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-GETapi-project" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-GETapi-project"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-GETapi-project"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-GETapi-project" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-GETapi-project">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-GETapi-project" data-method="GET"
+      data-path="api/project"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('GETapi-project', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-GETapi-project"
+                    onclick="tryItOut('GETapi-project');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-GETapi-project"
+                    onclick="cancelTryOut('GETapi-project');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-GETapi-project"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-green">GET</small>
+            <b><code>api/project</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="GETapi-project"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                            <h4 class="fancy-heading-panel"><b>Query Parameters</b></h4>
+                                    <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>area_code</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+<i>optional</i> &nbsp;
+                <input type="text" style="display: none"
+                              name="area_code"                data-endpoint="GETapi-project"
+               value="330100"
+               data-component="query">
+    <br>
+<p>区域代码. Example: <code>330100</code></p>
+            </div>
+                                    <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>project_cate_id</code></b>&nbsp;&nbsp;
+<small>integer</small>&nbsp;
+<i>optional</i> &nbsp;
+                <input type="number" style="display: none"
+               step="any"               name="project_cate_id"                data-endpoint="GETapi-project"
+               value="1"
+               data-component="query">
+    <br>
+<p>项目分类ID. Example: <code>1</code></p>
+            </div>
+                </form>
+
+                    <h2 id="-GETapi-project--id--detail">获取项目详情</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+<p>获取指定项目的详细信息</p>
+
+<span id="example-requests-GETapi-project--id--detail">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/project/1/detail"
+);
+
+const params = {
+    "area_code": "330100",
+};
+Object.keys(params)
+    .forEach(key =&gt; url.searchParams.append(key, params[key]));
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Accept": "application/json",
+};
+
+fetch(url, {
+    method: "GET",
+    headers,
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request GET \
+    --get "http://127.0.0.1/api/project/1/detail?area_code=330100" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}"</code></pre></div>
+
+</span>
+
+<span id="example-responses-GETapi-project--id--detail">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 200,
+    &quot;message&quot;: &quot;获取成功&quot;,
+    &quot;data&quot;: {
+        &quot;id&quot;: 1,
+        &quot;name&quot;: &quot;项目名称&quot;,
+        &quot;description&quot;: &quot;项目描述&quot;,
+        &quot;price&quot;: &quot;100.00&quot;,
+        &quot;duration&quot;: 60,
+        &quot;category&quot;: {
+            &quot;id&quot;: 1,
+            &quot;name&quot;: &quot;分类名称&quot;
+        },
+        &quot;agent&quot;: {
+            &quot;id&quot;: 1,
+            &quot;name&quot;: &quot;代理商名称&quot;,
+            &quot;contact&quot;: &quot;联系人&quot;,
+            &quot;mobile&quot;: &quot;13800138000&quot;
+        }
+    }
+}</code>
+ </pre>
+            <blockquote>
+            <p>Example response (400):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 400,
+    &quot;message&quot;: &quot;该区域暂无代理商&quot;
+}</code>
+ </pre>
+            <blockquote>
+            <p>Example response (404):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 404,
+    &quot;message&quot;: &quot;项目不存在&quot;
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-GETapi-project--id--detail" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-GETapi-project--id--detail"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-GETapi-project--id--detail"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-GETapi-project--id--detail" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-GETapi-project--id--detail">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-GETapi-project--id--detail" data-method="GET"
+      data-path="api/project/{id}/detail"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('GETapi-project--id--detail', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-GETapi-project--id--detail"
+                    onclick="tryItOut('GETapi-project--id--detail');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-GETapi-project--id--detail"
+                    onclick="cancelTryOut('GETapi-project--id--detail');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-GETapi-project--id--detail"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-green">GET</small>
+            <b><code>api/project/{id}/detail</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="GETapi-project--id--detail"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                        <h4 class="fancy-heading-panel"><b>URL Parameters</b></h4>
+                    <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>id</code></b>&nbsp;&nbsp;
+<small>integer</small>&nbsp;
+ &nbsp;
+                <input type="number" style="display: none"
+               step="any"               name="id"                data-endpoint="GETapi-project--id--detail"
+               value="1"
+               data-component="url">
+    <br>
+<p>项目ID. Example: <code>1</code></p>
+            </div>
+                        <h4 class="fancy-heading-panel"><b>Query Parameters</b></h4>
+                                    <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>area_code</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="area_code"                data-endpoint="GETapi-project--id--detail"
+               value="330100"
+               data-component="query">
+    <br>
+<p>区域代码. Example: <code>330100</code></p>
+            </div>
+                </form>
+
+                    <h2 id="-GETapi-project-coach-list">获取技师项目列表</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+<p>获取指定技师已开通的项目列表</p>
+
+<span id="example-requests-GETapi-project-coach-list">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/project/coach-list"
+);
+
+const params = {
+    "coach_id": "1",
+    "area_code": "330100",
+    "project_cate_id": "1",
+};
+Object.keys(params)
+    .forEach(key =&gt; url.searchParams.append(key, params[key]));
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Accept": "application/json",
+};
+
+fetch(url, {
+    method: "GET",
+    headers,
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request GET \
+    --get "http://127.0.0.1/api/project/coach-list?coach_id=1&amp;area_code=330100&amp;project_cate_id=1" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}"</code></pre></div>
+
+</span>
+
+<span id="example-responses-GETapi-project-coach-list">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 200,
+    &quot;message&quot;: &quot;获取成功&quot;,
+    &quot;data&quot;: {
+        &quot;current_page&quot;: 1,
+        &quot;data&quot;: [
+            {
+                &quot;id&quot;: 1,
+                &quot;name&quot;: &quot;项目名称&quot;,
+                &quot;description&quot;: &quot;项目描述&quot;,
+                &quot;price&quot;: &quot;100.00&quot;,
+                &quot;duration&quot;: 60,
+                &quot;category&quot;: {
+                    &quot;id&quot;: 1,
+                    &quot;name&quot;: &quot;分类名称&quot;
+                }
+            }
+        ],
+        &quot;total&quot;: 10,
+        &quot;per_page&quot;: 10
+    }
+}</code>
+ </pre>
+            <blockquote>
+            <p>Example response (404):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 404,
+    &quot;message&quot;: &quot;技师不存在或未通过认证&quot;
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-GETapi-project-coach-list" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-GETapi-project-coach-list"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-GETapi-project-coach-list"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-GETapi-project-coach-list" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-GETapi-project-coach-list">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-GETapi-project-coach-list" data-method="GET"
+      data-path="api/project/coach-list"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('GETapi-project-coach-list', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-GETapi-project-coach-list"
+                    onclick="tryItOut('GETapi-project-coach-list');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-GETapi-project-coach-list"
+                    onclick="cancelTryOut('GETapi-project-coach-list');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-GETapi-project-coach-list"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-green">GET</small>
+            <b><code>api/project/coach-list</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="GETapi-project-coach-list"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                            <h4 class="fancy-heading-panel"><b>Query Parameters</b></h4>
+                                    <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>coach_id</code></b>&nbsp;&nbsp;
+<small>integer</small>&nbsp;
+ &nbsp;
+                <input type="number" style="display: none"
+               step="any"               name="coach_id"                data-endpoint="GETapi-project-coach-list"
+               value="1"
+               data-component="query">
+    <br>
+<p>技师ID. Example: <code>1</code></p>
+            </div>
+                                    <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>area_code</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="area_code"                data-endpoint="GETapi-project-coach-list"
+               value="330100"
+               data-component="query">
+    <br>
+<p>区域代码. Example: <code>330100</code></p>
+            </div>
+                                    <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>project_cate_id</code></b>&nbsp;&nbsp;
+<small>integer</small>&nbsp;
+<i>optional</i> &nbsp;
+                <input type="number" style="display: none"
+               step="any"               name="project_cate_id"                data-endpoint="GETapi-project-coach-list"
+               value="1"
+               data-component="query">
+    <br>
+<p>项目分类ID. Example: <code>1</code></p>
+            </div>
+                </form>
+
+                <h1 id="">账户管理</h1>
+
+    <p>包含登录、注册、账户管理等基础功能</p>
+
+                                <h2 id="-POSTapi-account-send-code">发送验证码</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+<p>向指定手机号发送验证码</p>
+
+<span id="example-requests-POSTapi-account-send-code">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/account/send-code"
+);
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Content-Type": "application/json",
+    "Accept": "application/json",
+};
+
+let body = {
+    "mobile": "13800138000"
+};
+
+fetch(url, {
+    method: "POST",
+    headers,
+    body: JSON.stringify(body),
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request POST \
+    "http://127.0.0.1/api/account/send-code" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
+    --header "Content-Type: application/json" \
+    --data "{
+    \"mobile\": \"13800138000\"
+}"
+</code></pre></div>
+
+</span>
+
+<span id="example-responses-POSTapi-account-send-code">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 200,
+    &quot;message&quot;: &quot;验证码发送成功&quot;,
+    &quot;data&quot;: null
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-POSTapi-account-send-code" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-POSTapi-account-send-code"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-POSTapi-account-send-code"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-POSTapi-account-send-code" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-POSTapi-account-send-code">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-POSTapi-account-send-code" data-method="POST"
+      data-path="api/account/send-code"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('POSTapi-account-send-code', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-POSTapi-account-send-code"
+                    onclick="tryItOut('POSTapi-account-send-code');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-POSTapi-account-send-code"
+                    onclick="cancelTryOut('POSTapi-account-send-code');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-POSTapi-account-send-code"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-black">POST</small>
+            <b><code>api/account/send-code</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="POSTapi-account-send-code"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Content-Type</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Content-Type"                data-endpoint="POSTapi-account-send-code"
+               value="application/json"
+               data-component="header">
+    <br>
+<p>Example: <code>application/json</code></p>
+            </div>
+                                <h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
+        <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>mobile</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="mobile"                data-endpoint="POSTapi-account-send-code"
+               value="13800138000"
+               data-component="body">
+    <br>
+<p>手机号码. Example: <code>13800138000</code></p>
+        </div>
+        </form>
+
+                    <h2 id="-POSTapi-account-login">用户登录</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+<p>使用手机号和验证码登录账户</p>
+
+<span id="example-requests-POSTapi-account-login">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/account/login"
+);
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Content-Type": "application/json",
+    "Accept": "application/json",
+};
+
+let body = {
+    "mobile": "13800138000",
+    "code": "123456"
+};
+
+fetch(url, {
+    method: "POST",
+    headers,
+    body: JSON.stringify(body),
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request POST \
+    "http://127.0.0.1/api/account/login" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
+    --header "Content-Type: application/json" \
+    --data "{
+    \"mobile\": \"13800138000\",
+    \"code\": \"123456\"
+}"
+</code></pre></div>
+
+</span>
+
+<span id="example-responses-POSTapi-account-login">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 200,
+    &quot;message&quot;: &quot;登录成功&quot;,
+    &quot;data&quot;: {
+        &quot;token&quot;: &quot;eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...&quot;,
+        &quot;user&quot;: {
+            &quot;id&quot;: 1,
+            &quot;mobile&quot;: &quot;13800138000&quot;,
+            &quot;nickname&quot;: &quot;用户昵称&quot;
+        }
+    }
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-POSTapi-account-login" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-POSTapi-account-login"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-POSTapi-account-login"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-POSTapi-account-login" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-POSTapi-account-login">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-POSTapi-account-login" data-method="POST"
+      data-path="api/account/login"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('POSTapi-account-login', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-POSTapi-account-login"
+                    onclick="tryItOut('POSTapi-account-login');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-POSTapi-account-login"
+                    onclick="cancelTryOut('POSTapi-account-login');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-POSTapi-account-login"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-black">POST</small>
+            <b><code>api/account/login</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="POSTapi-account-login"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Content-Type</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Content-Type"                data-endpoint="POSTapi-account-login"
+               value="application/json"
+               data-component="header">
+    <br>
+<p>Example: <code>application/json</code></p>
+            </div>
+                                <h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
+        <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>mobile</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="mobile"                data-endpoint="POSTapi-account-login"
+               value="13800138000"
+               data-component="body">
+    <br>
+<p>手机号码. Example: <code>13800138000</code></p>
+        </div>
+                <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>code</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="code"                data-endpoint="POSTapi-account-login"
+               value="123456"
+               data-component="body">
+    <br>
+<p>验证码. Example: <code>123456</code></p>
+        </div>
+        </form>
+
+                    <h2 id="-POSTapi-account-wx-login">微信登录</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+<p>使用微信openid登录账户</p>
+
+<span id="example-requests-POSTapi-account-wx-login">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/account/wx-login"
+);
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Content-Type": "application/json",
+    "Accept": "application/json",
+};
+
+let body = {
+    "openid": "wx_123456789"
+};
+
+fetch(url, {
+    method: "POST",
+    headers,
+    body: JSON.stringify(body),
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request POST \
+    "http://127.0.0.1/api/account/wx-login" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
+    --header "Content-Type: application/json" \
+    --data "{
+    \"openid\": \"wx_123456789\"
+}"
+</code></pre></div>
+
+</span>
+
+<span id="example-responses-POSTapi-account-wx-login">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 200,
+    &quot;message&quot;: &quot;登录成功&quot;,
+    &quot;data&quot;: {
+        &quot;token&quot;: &quot;eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...&quot;,
+        &quot;user&quot;: {
+            &quot;id&quot;: 1,
+            &quot;openid&quot;: &quot;wx_123456789&quot;,
+            &quot;nickname&quot;: &quot;微信昵称&quot;
+        }
+    }
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-POSTapi-account-wx-login" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-POSTapi-account-wx-login"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-POSTapi-account-wx-login"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-POSTapi-account-wx-login" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-POSTapi-account-wx-login">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-POSTapi-account-wx-login" data-method="POST"
+      data-path="api/account/wx-login"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('POSTapi-account-wx-login', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-POSTapi-account-wx-login"
+                    onclick="tryItOut('POSTapi-account-wx-login');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-POSTapi-account-wx-login"
+                    onclick="cancelTryOut('POSTapi-account-wx-login');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-POSTapi-account-wx-login"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-black">POST</small>
+            <b><code>api/account/wx-login</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="POSTapi-account-wx-login"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Content-Type</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Content-Type"                data-endpoint="POSTapi-account-wx-login"
+               value="application/json"
+               data-component="header">
+    <br>
+<p>Example: <code>application/json</code></p>
+            </div>
+                                <h4 class="fancy-heading-panel"><b>Body Parameters</b></h4>
+        <div style=" padding-left: 28px;  clear: unset;">
+            <b style="line-height: 2;"><code>openid</code></b>&nbsp;&nbsp;
+<small>string</small>&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="openid"                data-endpoint="POSTapi-account-wx-login"
+               value="wx_123456789"
+               data-component="body">
+    <br>
+<p>微信openid. Example: <code>wx_123456789</code></p>
+        </div>
+        </form>
+
+                    <h2 id="-POSTapi-account-logout">用户退出</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+<p>退出当前账户登录状态</p>
+
+<span id="example-requests-POSTapi-account-logout">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/account/logout"
+);
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Accept": "application/json",
+};
+
+fetch(url, {
+    method: "POST",
+    headers,
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request POST \
+    "http://127.0.0.1/api/account/logout" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}"</code></pre></div>
+
+</span>
+
+<span id="example-responses-POSTapi-account-logout">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 200,
+    &quot;message&quot;: &quot;退出成功&quot;,
+    &quot;data&quot;: null
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-POSTapi-account-logout" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-POSTapi-account-logout"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-POSTapi-account-logout"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-POSTapi-account-logout" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-POSTapi-account-logout">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-POSTapi-account-logout" data-method="POST"
+      data-path="api/account/logout"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('POSTapi-account-logout', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-POSTapi-account-logout"
+                    onclick="tryItOut('POSTapi-account-logout');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-POSTapi-account-logout"
+                    onclick="cancelTryOut('POSTapi-account-logout');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-POSTapi-account-logout"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-black">POST</small>
+            <b><code>api/account/logout</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="POSTapi-account-logout"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                        </form>
+
+                    <h2 id="-DELETEapi-account">用户注销</h2>
+
+<p>
+<small class="badge badge-darkred">requires authentication</small>
+</p>
+
+<p>永久注销当前账户</p>
+
+<span id="example-requests-DELETEapi-account">
+<blockquote>Example request:</blockquote>
+
+
+<div class="javascript-example">
+    <pre><code class="language-javascript">const url = new URL(
+    "http://127.0.0.1/api/account"
+);
+
+const headers = {
+    "Authorization": "Bearer {YOUR_AUTH_KEY}",
+    "Accept": "application/json",
+};
+
+fetch(url, {
+    method: "DELETE",
+    headers,
+}).then(response =&gt; response.json());</code></pre></div>
+
+
+<div class="bash-example">
+    <pre><code class="language-bash">curl --request DELETE \
+    "http://127.0.0.1/api/account" \
+    --header "Authorization: Bearer {YOUR_AUTH_KEY}"</code></pre></div>
+
+</span>
+
+<span id="example-responses-DELETEapi-account">
+            <blockquote>
+            <p>Example response (200):</p>
+        </blockquote>
+                <pre>
+
+<code class="language-json" style="max-height: 300px;">{
+    &quot;code&quot;: 200,
+    &quot;message&quot;: &quot;注销成功&quot;,
+    &quot;data&quot;: null
+}</code>
+ </pre>
+    </span>
+<span id="execution-results-DELETEapi-account" hidden>
+    <blockquote>Received response<span
+                id="execution-response-status-DELETEapi-account"></span>:
+    </blockquote>
+    <pre class="json"><code id="execution-response-content-DELETEapi-account"
+      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
+</span>
+<span id="execution-error-DELETEapi-account" hidden>
+    <blockquote>Request failed with error:</blockquote>
+    <pre><code id="execution-error-message-DELETEapi-account">
+
+Tip: Check that you&#039;re properly connected to the network.
+If you&#039;re a maintainer of ths API, verify that your API is running and you&#039;ve enabled CORS.
+You can check the Dev Tools console for debugging information.</code></pre>
+</span>
+<form id="form-DELETEapi-account" data-method="DELETE"
+      data-path="api/account"
+      data-authed="1"
+      data-hasfiles="0"
+      data-isarraybody="0"
+      autocomplete="off"
+      onsubmit="event.preventDefault(); executeTryOut('DELETEapi-account', this);">
+    <h3>
+        Request&nbsp;&nbsp;&nbsp;
+                    <button type="button"
+                    style="background-color: #8fbcd4; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-tryout-DELETEapi-account"
+                    onclick="tryItOut('DELETEapi-account');">Try it out ⚡
+            </button>
+            <button type="button"
+                    style="background-color: #c97a7e; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-canceltryout-DELETEapi-account"
+                    onclick="cancelTryOut('DELETEapi-account');" hidden>Cancel 🛑
+            </button>&nbsp;&nbsp;
+            <button type="submit"
+                    style="background-color: #6ac174; padding: 5px 10px; border-radius: 5px; border-width: thin;"
+                    id="btn-executetryout-DELETEapi-account"
+                    data-initial-text="Send Request 💥"
+                    data-loading-text="⏱ Sending..."
+                    hidden>Send Request 💥
+            </button>
+            </h3>
+            <p>
+            <small class="badge badge-red">DELETE</small>
+            <b><code>api/account</code></b>
+        </p>
+                <h4 class="fancy-heading-panel"><b>Headers</b></h4>
+                                <div style="padding-left: 28px; clear: unset;">
+                <b style="line-height: 2;"><code>Authorization</code></b>&nbsp;&nbsp;
+&nbsp;
+ &nbsp;
+                <input type="text" style="display: none"
+                              name="Authorization" class="auth-value"               data-endpoint="DELETEapi-account"
+               value="Bearer {YOUR_AUTH_KEY}"
+               data-component="header">
+    <br>
+<p>Example: <code>Bearer {YOUR_AUTH_KEY}</code></p>
+            </div>
+                        </form>
+
+            
+
+        
+    </div>
+    <div class="dark-box">
+                    <div class="lang-selector">
+                                                        <button type="button" class="lang-button" data-language-name="javascript">javascript</button>
+                                                        <button type="button" class="lang-button" data-language-name="bash">bash</button>
+                            </div>
+            </div>
+</div>
+</body>
+
+<script src="http://127.0.0.1/vendor/scribe/js/tryitout-4.38.0.js"></script>
+<script src="http://127.0.0.1/vendor/scribe/js/theme-default-4.38.0.js"></script>
+
+
+<script src="http://127.0.0.1/vendor/scribe/js/my-custom.js"></script>
+<script src="http://127.0.0.1/vendor/scribe/js/custom.js"></script>
+
+</html>

+ 8 - 0
resources/views/vendor/scribe/themes/default/index.blade.php

@@ -71,4 +71,12 @@
     </div>
 </div>
 </body>
+
+<script src="{{ asset("vendor/scribe/js/tryitout-4.38.0.js") }}"></script>
+<script src="{{ asset("vendor/scribe/js/theme-default-4.38.0.js") }}"></script>
+
+{{-- 添加自定义脚本 --}}
+<script src="{{ asset("vendor/scribe/js/my-custom.js") }}"></script>
+<script src="{{ asset("vendor/scribe/js/custom.js") }}"></script>
+
 </html>

+ 2 - 0
routes/web.php

@@ -5,3 +5,5 @@ use Illuminate\Support\Facades\Route;
 Route::get('/', function () {
     return view('welcome');
 });
+
+// Scribe 会自动添加文档路由,不需要手动添加