Browse Source

chore: ignore public/docs directory

Yin Bin 4 months ago
parent
commit
679fc2bfaa

+ 2 - 1
.gitignore

@@ -20,7 +20,8 @@ yarn-error.log
 /.idea
 /.vscode
 /.zed
-.scribe/
+/.scribe
+/public/docs
 .user.ini
 public/admin-assets
 /doc

+ 0 - 329
public/docs/collection.json

@@ -1,329 +0,0 @@
-{
-    "variable": [
-        {
-            "id": "baseUrl",
-            "key": "baseUrl",
-            "type": "string",
-            "name": "string",
-            "value": "http:\/\/192.168.110.10"
-        }
-    ],
-    "info": {
-        "name": "Owl Admin API Documentation",
-        "_postman_id": "9d182033-bb87-44ee-b7db-f485e8888d1f",
-        "description": "Owl Admin API \u63a5\u53e3\u6587\u6863",
-        "schema": "https:\/\/schema.getpostman.com\/json\/collection\/v2.1.0\/collection.json"
-    },
-    "item": [
-        {
-            "name": "Endpoints",
-            "description": "",
-            "item": [
-                {
-                    "name": "\u66f4\u65b0API\u6587\u6863\u7684\u8ba4\u8bc1Token",
-                    "request": {
-                        "url": {
-                            "host": "{{baseUrl}}",
-                            "path": "api\/scribe\/update-token\/:mobile",
-                            "query": [],
-                            "raw": "{{baseUrl}}\/api\/scribe\/update-token\/:mobile",
-                            "variable": [
-                                {
-                                    "id": "mobile",
-                                    "key": "mobile",
-                                    "value": "13800138000",
-                                    "description": "\u624b\u673a\u53f7\u7801."
-                                }
-                            ]
-                        },
-                        "method": "GET",
-                        "header": [
-                            {
-                                "key": "Accept",
-                                "value": "application\/json"
-                            }
-                        ],
-                        "body": null,
-                        "description": "\u901a\u8fc7\u624b\u673a\u53f7\u83b7\u53d6\u9a8c\u8bc1\u7801\u5e76\u767b\u5f55\uff0c\u7136\u540e\u66f4\u65b0API\u6587\u6863\u7684\u8ba4\u8bc1Token"
-                    },
-                    "response": [
-                        {
-                            "header": [],
-                            "code": 200,
-                            "body": "{\n  \"code\": 200,\n  \"message\": \"Token\u66f4\u65b0\u6210\u529f\",\n  \"data\": {\n    \"token\": \"your_new_token_here\"\n  }\n}",
-                            "name": ""
-                        }
-                    ]
-                },
-                {
-                    "name": "[\u8d26\u6237\u7ba1\u7406] \u53d1\u9001\u9a8c\u8bc1\u7801",
-                    "request": {
-                        "url": {
-                            "host": "{{baseUrl}}",
-                            "path": "api\/account\/send-code",
-                            "query": [],
-                            "raw": "{{baseUrl}}\/api\/account\/send-code"
-                        },
-                        "method": "POST",
-                        "header": [
-                            {
-                                "key": "Content-Type",
-                                "value": "application\/json"
-                            },
-                            {
-                                "key": "Accept",
-                                "value": "application\/json"
-                            }
-                        ],
-                        "body": {
-                            "mode": "raw",
-                            "raw": "{\"mobile\":\"13800138000\"}"
-                        },
-                        "description": "\u5411\u6307\u5b9a\u624b\u673a\u53f7\u53d1\u9001\u9a8c\u8bc1\u7801"
-                    },
-                    "response": [
-                        {
-                            "header": [],
-                            "code": 200,
-                            "body": "{\n  \"code\": 200,\n  \"message\": \"\u9a8c\u8bc1\u7801\u53d1\u9001\u6210\u529f\",\n  \"data\": null\n}",
-                            "name": ""
-                        }
-                    ]
-                },
-                {
-                    "name": "[\u8d26\u6237\u7ba1\u7406] \u7528\u6237\u767b\u5f55",
-                    "request": {
-                        "url": {
-                            "host": "{{baseUrl}}",
-                            "path": "api\/account\/login",
-                            "query": [],
-                            "raw": "{{baseUrl}}\/api\/account\/login"
-                        },
-                        "method": "POST",
-                        "header": [
-                            {
-                                "key": "Content-Type",
-                                "value": "application\/json"
-                            },
-                            {
-                                "key": "Accept",
-                                "value": "application\/json"
-                            }
-                        ],
-                        "body": {
-                            "mode": "raw",
-                            "raw": "{\"mobile\":\"13800138000\",\"code\":\"123456\"}"
-                        },
-                        "description": "\u4f7f\u7528\u624b\u673a\u53f7\u548c\u9a8c\u8bc1\u7801\u767b\u5f55\u8d26\u6237"
-                    },
-                    "response": [
-                        {
-                            "header": [],
-                            "code": 200,
-                            "body": "{\n  \"code\": 200,\n  \"message\": \"\u767b\u5f55\u6210\u529f\",\n  \"data\": {\n    \"token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...\",\n    \"user\": {\n      \"id\": 1,\n      \"mobile\": \"13800138000\",\n      \"nickname\": \"\u7528\u6237\u6635\u79f0\"\n    }\n  }\n}",
-                            "name": ""
-                        }
-                    ]
-                },
-                {
-                    "name": "[\u8d26\u6237\u7ba1\u7406] \u5fae\u4fe1\u767b\u5f55",
-                    "request": {
-                        "url": {
-                            "host": "{{baseUrl}}",
-                            "path": "api\/account\/wx-login",
-                            "query": [],
-                            "raw": "{{baseUrl}}\/api\/account\/wx-login"
-                        },
-                        "method": "POST",
-                        "header": [
-                            {
-                                "key": "Content-Type",
-                                "value": "application\/json"
-                            },
-                            {
-                                "key": "Accept",
-                                "value": "application\/json"
-                            }
-                        ],
-                        "body": {
-                            "mode": "raw",
-                            "raw": "{\"openid\":\"wx_123456789\"}"
-                        },
-                        "description": "\u4f7f\u7528\u5fae\u4fe1openid\u767b\u5f55\u8d26\u6237"
-                    },
-                    "response": [
-                        {
-                            "header": [],
-                            "code": 200,
-                            "body": "{\n  \"code\": 200,\n  \"message\": \"\u767b\u5f55\u6210\u529f\",\n  \"data\": {\n    \"token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...\",\n    \"user\": {\n      \"id\": 1,\n      \"openid\": \"wx_123456789\",\n      \"nickname\": \"\u5fae\u4fe1\u6635\u79f0\"\n    }\n  }\n}",
-                            "name": ""
-                        }
-                    ]
-                },
-                {
-                    "name": "[\u8d26\u6237\u7ba1\u7406] \u7528\u6237\u9000\u51fa",
-                    "request": {
-                        "url": {
-                            "host": "{{baseUrl}}",
-                            "path": "api\/account\/logout",
-                            "query": [],
-                            "raw": "{{baseUrl}}\/api\/account\/logout"
-                        },
-                        "method": "POST",
-                        "header": [
-                            {
-                                "key": "Accept",
-                                "value": "application\/json"
-                            }
-                        ],
-                        "body": null,
-                        "description": "\u9000\u51fa\u5f53\u524d\u8d26\u6237\u767b\u5f55\u72b6\u6001"
-                    },
-                    "response": [
-                        {
-                            "header": [],
-                            "code": 200,
-                            "body": "{\n  \"code\": 200,\n  \"message\": \"\u9000\u51fa\u6210\u529f\",\n  \"data\": null\n}",
-                            "name": ""
-                        }
-                    ]
-                },
-                {
-                    "name": "[\u8d26\u6237\u7ba1\u7406] \u7528\u6237\u6ce8\u9500",
-                    "request": {
-                        "url": {
-                            "host": "{{baseUrl}}",
-                            "path": "api\/account",
-                            "query": [],
-                            "raw": "{{baseUrl}}\/api\/account"
-                        },
-                        "method": "DELETE",
-                        "header": [
-                            {
-                                "key": "Accept",
-                                "value": "application\/json"
-                            }
-                        ],
-                        "body": null,
-                        "description": "\u6c38\u4e45\u6ce8\u9500\u5f53\u524d\u8d26\u6237"
-                    },
-                    "response": [
-                        {
-                            "header": [],
-                            "code": 200,
-                            "body": "{\n  \"code\": 200,\n  \"message\": \"\u6ce8\u9500\u6210\u529f\",\n  \"data\": null\n}",
-                            "name": ""
-                        }
-                    ]
-                },
-                {
-                    "name": "[\u7528\u6237\u7ba1\u7406] \u7528\u6237\u63d0\u73b0",
-                    "request": {
-                        "url": {
-                            "host": "{{baseUrl}}",
-                            "path": "api\/user\/withdraw",
-                            "query": [],
-                            "raw": "{{baseUrl}}\/api\/user\/withdraw"
-                        },
-                        "method": "POST",
-                        "header": [
-                            {
-                                "key": "Content-Type",
-                                "value": "application\/json"
-                            },
-                            {
-                                "key": "Accept",
-                                "value": "application\/json"
-                            }
-                        ],
-                        "body": {
-                            "mode": "raw",
-                            "raw": "{\"amount\":\"100.00\"}"
-                        },
-                        "description": "\u63d0\u73b0\u7528\u6237\u7684\u4f59\u989d"
-                    },
-                    "response": [
-                        {
-                            "header": [],
-                            "code": 200,
-                            "body": "{\n  \"code\": 200,\n  \"message\": \"\u63d0\u73b0\u6210\u529f\",\n  \"data\": null\n}",
-                            "name": ""
-                        }
-                    ]
-                },
-                {
-                    "name": "[\u7528\u6237\u7ba1\u7406] \u7528\u6237\u53cd\u9988",
-                    "request": {
-                        "url": {
-                            "host": "{{baseUrl}}",
-                            "path": "api\/user\/feedback",
-                            "query": [],
-                            "raw": "{{baseUrl}}\/api\/user\/feedback"
-                        },
-                        "method": "POST",
-                        "header": [
-                            {
-                                "key": "Content-Type",
-                                "value": "application\/json"
-                            },
-                            {
-                                "key": "Accept",
-                                "value": "application\/json"
-                            }
-                        ],
-                        "body": {
-                            "mode": "raw",
-                            "raw": "{\"content\":\"\u8fd9\u662f\u4e00\u4e2a\u53cd\u9988\u4fe1\u606f\"}"
-                        },
-                        "description": "\u63d0\u4ea4\u7528\u6237\u7684\u53cd\u9988\u4fe1\u606f"
-                    },
-                    "response": [
-                        {
-                            "header": [],
-                            "code": 200,
-                            "body": "{\n  \"code\": 200,\n  \"message\": \"\u63d0\u4ea4\u6210\u529f\",\n  \"data\": null\n}",
-                            "name": ""
-                        }
-                    ]
-                },
-                {
-                    "name": "[\u7528\u6237\u7ba1\u7406] \u7533\u8bf7\u6210\u4e3a\u6280\u5e08",
-                    "request": {
-                        "url": {
-                            "host": "{{baseUrl}}",
-                            "path": "api\/user\/apply-coach",
-                            "query": [],
-                            "raw": "{{baseUrl}}\/api\/user\/apply-coach"
-                        },
-                        "method": "POST",
-                        "header": [
-                            {
-                                "key": "Accept",
-                                "value": "application\/json"
-                            }
-                        ],
-                        "body": null,
-                        "description": "\u7533\u8bf7\u6210\u4e3a\u6280\u5e08"
-                    },
-                    "response": [
-                        {
-                            "header": [],
-                            "code": 200,
-                            "body": "{\n  \"code\": 200,\n  \"message\": \"\u7533\u8bf7\u6210\u529f\",\n  \"data\": null\n}",
-                            "name": ""
-                        }
-                    ]
-                }
-            ]
-        }
-    ],
-    "auth": {
-        "type": "bearer",
-        "bearer": [
-            {
-                "key": "Authorization",
-                "type": "string"
-            }
-        ]
-    }
-}

+ 0 - 393
public/docs/css/theme-default.print.css

@@ -1,393 +0,0 @@
-/* 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
-}

+ 0 - 1090
public/docs/css/theme-default.style.css

@@ -1,1090 +0,0 @@
-/*! 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/docs/images/navbar.png


+ 0 - 1490
public/docs/index.html

@@ -1,1490 +0,0 @@
-<!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="../docs/css/theme-default.style.css" media="screen">
-    <link rel="stylesheet" href="../docs/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 .bash-example code { display: none; }
-                    body .content .javascript-example code { display: none; }
-                    body .content .php-example code { display: none; }
-            </style>
-
-    <script>
-        var tryItOutBaseUrl = "http://192.168.110.10";
-        var useCsrf = Boolean();
-        var csrfUrl = "/sanctum/csrf-cookie";
-    </script>
-    <script src="../docs/js/tryitout-4.38.0.js"></script>
-
-    <script src="../docs/js/theme-default-4.38.0.js"></script>
-
-</head>
-
-<body data-languages="[&quot;bash&quot;,&quot;javascript&quot;,&quot;php&quot;]">
-
-<a href="#" id="nav-button">
-    <span>
-        MENU
-        <img src="../docs/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="bash">bash</button>
-                                            <button type="button" class="lang-button" data-language-name="javascript">javascript</button>
-                                            <button type="button" class="lang-button" data-language-name="php">php</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-endpoints" class="tocify-header">
-                <li class="tocify-item level-1" data-unique="endpoints">
-                    <a href="#endpoints">Endpoints</a>
-                </li>
-                                    <ul id="tocify-subheader-endpoints" class="tocify-subheader">
-                                                    <li class="tocify-item level-2" data-unique="endpoints-GETapi-scribe-update-token--mobile-">
-                                <a href="#endpoints-GETapi-scribe-update-token--mobile-">更新API文档的认证Token</a>
-                            </li>
-                                                                                <li class="tocify-item level-2" data-unique="endpoints-POSTapi-account-send-code">
-                                <a href="#endpoints-POSTapi-account-send-code">[账户管理] 发送验证码</a>
-                            </li>
-                                                                                <li class="tocify-item level-2" data-unique="endpoints-POSTapi-account-login">
-                                <a href="#endpoints-POSTapi-account-login">[账户管理] 用户登录</a>
-                            </li>
-                                                                                <li class="tocify-item level-2" data-unique="endpoints-POSTapi-account-wx-login">
-                                <a href="#endpoints-POSTapi-account-wx-login">[账户管理] 微信登录</a>
-                            </li>
-                                                                                <li class="tocify-item level-2" data-unique="endpoints-POSTapi-account-logout">
-                                <a href="#endpoints-POSTapi-account-logout">[账户管理] 用户退出</a>
-                            </li>
-                                                                                <li class="tocify-item level-2" data-unique="endpoints-DELETEapi-account">
-                                <a href="#endpoints-DELETEapi-account">[账户管理] 用户注销</a>
-                            </li>
-                                                                                <li class="tocify-item level-2" data-unique="endpoints-POSTapi-user-withdraw">
-                                <a href="#endpoints-POSTapi-user-withdraw">[用户管理] 用户提现</a>
-                            </li>
-                                                                                <li class="tocify-item level-2" data-unique="endpoints-POSTapi-user-feedback">
-                                <a href="#endpoints-POSTapi-user-feedback">[用户管理] 用户反馈</a>
-                            </li>
-                                                                                <li class="tocify-item level-2" data-unique="endpoints-POSTapi-user-apply-coach">
-                                <a href="#endpoints-POSTapi-user-apply-coach">[用户管理] 申请成为技师</a>
-                            </li>
-                                                                        </ul>
-                            </ul>
-            </div>
-
-    <ul class="toc-footer" id="toc-footer">
-                    <li style="padding-bottom: 5px;"><a href="../docs/collection.json">View Postman collection</a></li>
-                            <li style="padding-bottom: 5px;"><a href="../docs/openapi.yaml">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>Last updated: November 18, 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://192.168.110.10</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 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429"</code></strong>.</p>
-<p>All authenticated endpoints are marked with a <code>requires authentication</code> badge in the documentation below.</p>
-<p>通过登录接口获取 token,格式为 Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429{token}</p>
-
-        <h1 id="endpoints">Endpoints</h1>
-
-    
-
-                                <h2 id="endpoints-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="bash-example">
-    <pre><code class="language-bash">curl --request GET \
-    --get "http://192.168.110.10/api/scribe/update-token/13800138000" \
-    --header "Authorization: Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429"</code></pre></div>
-
-
-<div class="javascript-example">
-    <pre><code class="language-javascript">const url = new URL(
-    "http://192.168.110.10/api/scribe/update-token/13800138000"
-);
-
-const headers = {
-    "Authorization": "Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429",
-    "Accept": "application/json",
-};
-
-fetch(url, {
-    method: "GET",
-    headers,
-}).then(response =&gt; response.json());</code></pre></div>
-
-
-<div class="php-example">
-    <pre><code class="language-php">$client = new \GuzzleHttp\Client();
-$url = 'http://192.168.110.10/api/scribe/update-token/13800138000';
-$response = $client-&gt;get(
-    $url,
-    [
-        'headers' =&gt; [
-            'Authorization' =&gt; 'Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429',
-        ],
-    ]
-);
-$body = $response-&gt;getBody();
-print_r(json_decode((string) $body));</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 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429"
-               data-component="header">
-    <br>
-<p>Example: <code>Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429</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>
-
-                    <h2 id="endpoints-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="bash-example">
-    <pre><code class="language-bash">curl --request POST \
-    "http://192.168.110.10/api/account/send-code" \
-    --header "Authorization: Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429" \
-    --header "Content-Type: application/json" \
-    --data "{
-    \"mobile\": \"13800138000\"
-}"
-</code></pre></div>
-
-
-<div class="javascript-example">
-    <pre><code class="language-javascript">const url = new URL(
-    "http://192.168.110.10/api/account/send-code"
-);
-
-const headers = {
-    "Authorization": "Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429",
-    "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="php-example">
-    <pre><code class="language-php">$client = new \GuzzleHttp\Client();
-$url = 'http://192.168.110.10/api/account/send-code';
-$response = $client-&gt;post(
-    $url,
-    [
-        'headers' =&gt; [
-            'Authorization' =&gt; 'Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429',
-            'Content-Type' =&gt; 'application/json',
-        ],
-        'json' =&gt; [
-            'mobile' =&gt; '13800138000',
-        ],
-    ]
-);
-$body = $response-&gt;getBody();
-print_r(json_decode((string) $body));</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 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429"
-               data-component="header">
-    <br>
-<p>Example: <code>Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429</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="endpoints-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="bash-example">
-    <pre><code class="language-bash">curl --request POST \
-    "http://192.168.110.10/api/account/login" \
-    --header "Authorization: Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429" \
-    --header "Content-Type: application/json" \
-    --data "{
-    \"mobile\": \"13800138000\",
-    \"code\": \"123456\"
-}"
-</code></pre></div>
-
-
-<div class="javascript-example">
-    <pre><code class="language-javascript">const url = new URL(
-    "http://192.168.110.10/api/account/login"
-);
-
-const headers = {
-    "Authorization": "Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429",
-    "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="php-example">
-    <pre><code class="language-php">$client = new \GuzzleHttp\Client();
-$url = 'http://192.168.110.10/api/account/login';
-$response = $client-&gt;post(
-    $url,
-    [
-        'headers' =&gt; [
-            'Authorization' =&gt; 'Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429',
-            'Content-Type' =&gt; 'application/json',
-        ],
-        'json' =&gt; [
-            'mobile' =&gt; '13800138000',
-            'code' =&gt; '123456',
-        ],
-    ]
-);
-$body = $response-&gt;getBody();
-print_r(json_decode((string) $body));</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 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429"
-               data-component="header">
-    <br>
-<p>Example: <code>Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429</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="endpoints-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="bash-example">
-    <pre><code class="language-bash">curl --request POST \
-    "http://192.168.110.10/api/account/wx-login" \
-    --header "Authorization: Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429" \
-    --header "Content-Type: application/json" \
-    --data "{
-    \"openid\": \"wx_123456789\"
-}"
-</code></pre></div>
-
-
-<div class="javascript-example">
-    <pre><code class="language-javascript">const url = new URL(
-    "http://192.168.110.10/api/account/wx-login"
-);
-
-const headers = {
-    "Authorization": "Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429",
-    "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="php-example">
-    <pre><code class="language-php">$client = new \GuzzleHttp\Client();
-$url = 'http://192.168.110.10/api/account/wx-login';
-$response = $client-&gt;post(
-    $url,
-    [
-        'headers' =&gt; [
-            'Authorization' =&gt; 'Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429',
-            'Content-Type' =&gt; 'application/json',
-        ],
-        'json' =&gt; [
-            'openid' =&gt; 'wx_123456789',
-        ],
-    ]
-);
-$body = $response-&gt;getBody();
-print_r(json_decode((string) $body));</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 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429"
-               data-component="header">
-    <br>
-<p>Example: <code>Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429</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="endpoints-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="bash-example">
-    <pre><code class="language-bash">curl --request POST \
-    "http://192.168.110.10/api/account/logout" \
-    --header "Authorization: Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429"</code></pre></div>
-
-
-<div class="javascript-example">
-    <pre><code class="language-javascript">const url = new URL(
-    "http://192.168.110.10/api/account/logout"
-);
-
-const headers = {
-    "Authorization": "Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429",
-    "Accept": "application/json",
-};
-
-fetch(url, {
-    method: "POST",
-    headers,
-}).then(response =&gt; response.json());</code></pre></div>
-
-
-<div class="php-example">
-    <pre><code class="language-php">$client = new \GuzzleHttp\Client();
-$url = 'http://192.168.110.10/api/account/logout';
-$response = $client-&gt;post(
-    $url,
-    [
-        'headers' =&gt; [
-            'Authorization' =&gt; 'Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429',
-        ],
-    ]
-);
-$body = $response-&gt;getBody();
-print_r(json_decode((string) $body));</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 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429"
-               data-component="header">
-    <br>
-<p>Example: <code>Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429</code></p>
-            </div>
-                        </form>
-
-                    <h2 id="endpoints-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="bash-example">
-    <pre><code class="language-bash">curl --request DELETE \
-    "http://192.168.110.10/api/account" \
-    --header "Authorization: Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429"</code></pre></div>
-
-
-<div class="javascript-example">
-    <pre><code class="language-javascript">const url = new URL(
-    "http://192.168.110.10/api/account"
-);
-
-const headers = {
-    "Authorization": "Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429",
-    "Accept": "application/json",
-};
-
-fetch(url, {
-    method: "DELETE",
-    headers,
-}).then(response =&gt; response.json());</code></pre></div>
-
-
-<div class="php-example">
-    <pre><code class="language-php">$client = new \GuzzleHttp\Client();
-$url = 'http://192.168.110.10/api/account';
-$response = $client-&gt;delete(
-    $url,
-    [
-        'headers' =&gt; [
-            'Authorization' =&gt; 'Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429',
-        ],
-    ]
-);
-$body = $response-&gt;getBody();
-print_r(json_decode((string) $body));</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 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429"
-               data-component="header">
-    <br>
-<p>Example: <code>Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429</code></p>
-            </div>
-                        </form>
-
-                    <h2 id="endpoints-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="bash-example">
-    <pre><code class="language-bash">curl --request POST \
-    "http://192.168.110.10/api/user/withdraw" \
-    --header "Authorization: Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429" \
-    --header "Content-Type: application/json" \
-    --data "{
-    \"amount\": \"100.00\"
-}"
-</code></pre></div>
-
-
-<div class="javascript-example">
-    <pre><code class="language-javascript">const url = new URL(
-    "http://192.168.110.10/api/user/withdraw"
-);
-
-const headers = {
-    "Authorization": "Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429",
-    "Content-Type": "application/json",
-    "Accept": "application/json",
-};
-
-let body = {
-    "amount": "100.00"
-};
-
-fetch(url, {
-    method: "POST",
-    headers,
-    body: JSON.stringify(body),
-}).then(response =&gt; response.json());</code></pre></div>
-
-
-<div class="php-example">
-    <pre><code class="language-php">$client = new \GuzzleHttp\Client();
-$url = 'http://192.168.110.10/api/user/withdraw';
-$response = $client-&gt;post(
-    $url,
-    [
-        'headers' =&gt; [
-            'Authorization' =&gt; 'Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429',
-            'Content-Type' =&gt; 'application/json',
-        ],
-        'json' =&gt; [
-            'amount' =&gt; '100.00',
-        ],
-    ]
-);
-$body = $response-&gt;getBody();
-print_r(json_decode((string) $body));</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 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429"
-               data-component="header">
-    <br>
-<p>Example: <code>Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429</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>
-        </form>
-
-                    <h2 id="endpoints-POSTapi-user-feedback">[用户管理] 用户反馈</h2>
-
-<p>
-<small class="badge badge-darkred">requires authentication</small>
-</p>
-
-<p>提交用户的反馈信息</p>
-
-<span id="example-requests-POSTapi-user-feedback">
-<blockquote>Example request:</blockquote>
-
-
-<div class="bash-example">
-    <pre><code class="language-bash">curl --request POST \
-    "http://192.168.110.10/api/user/feedback" \
-    --header "Authorization: Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429" \
-    --header "Content-Type: application/json" \
-    --data "{
-    \"content\": \"这是一个反馈信息\"
-}"
-</code></pre></div>
-
-
-<div class="javascript-example">
-    <pre><code class="language-javascript">const url = new URL(
-    "http://192.168.110.10/api/user/feedback"
-);
-
-const headers = {
-    "Authorization": "Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429",
-    "Content-Type": "application/json",
-    "Accept": "application/json",
-};
-
-let body = {
-    "content": "这是一个反馈信息"
-};
-
-fetch(url, {
-    method: "POST",
-    headers,
-    body: JSON.stringify(body),
-}).then(response =&gt; response.json());</code></pre></div>
-
-
-<div class="php-example">
-    <pre><code class="language-php">$client = new \GuzzleHttp\Client();
-$url = 'http://192.168.110.10/api/user/feedback';
-$response = $client-&gt;post(
-    $url,
-    [
-        'headers' =&gt; [
-            'Authorization' =&gt; 'Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429',
-            'Content-Type' =&gt; 'application/json',
-        ],
-        'json' =&gt; [
-            'content' =&gt; '这是一个反馈信息',
-        ],
-    ]
-);
-$body = $response-&gt;getBody();
-print_r(json_decode((string) $body));</code></pre></div>
-
-</span>
-
-<span id="example-responses-POSTapi-user-feedback">
-            <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-feedback" hidden>
-    <blockquote>Received response<span
-                id="execution-response-status-POSTapi-user-feedback"></span>:
-    </blockquote>
-    <pre class="json"><code id="execution-response-content-POSTapi-user-feedback"
-      data-empty-response-text="<Empty response>" style="max-height: 400px;"></code></pre>
-</span>
-<span id="execution-error-POSTapi-user-feedback" hidden>
-    <blockquote>Request failed with error:</blockquote>
-    <pre><code id="execution-error-message-POSTapi-user-feedback">
-
-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-feedback" data-method="POST"
-      data-path="api/user/feedback"
-      data-authed="1"
-      data-hasfiles="0"
-      data-isarraybody="0"
-      autocomplete="off"
-      onsubmit="event.preventDefault(); executeTryOut('POSTapi-user-feedback', 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-feedback"
-                    onclick="tryItOut('POSTapi-user-feedback');">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-feedback"
-                    onclick="cancelTryOut('POSTapi-user-feedback');" 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-feedback"
-                    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/feedback</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-feedback"
-               value="Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429"
-               data-component="header">
-    <br>
-<p>Example: <code>Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429</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-feedback"
-               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>content</code></b>&nbsp;&nbsp;
-<small>string</small>&nbsp;
-<i>optional</i> &nbsp;
-                <input type="text" style="display: none"
-                              name="content"                data-endpoint="POSTapi-user-feedback"
-               value="这是一个反馈信息"
-               data-component="body">
-    <br>
-<p>反馈内容. Example: <code>这是一个反馈信息</code></p>
-        </div>
-        </form>
-
-                    <h2 id="endpoints-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="bash-example">
-    <pre><code class="language-bash">curl --request POST \
-    "http://192.168.110.10/api/user/apply-coach" \
-    --header "Authorization: Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429"</code></pre></div>
-
-
-<div class="javascript-example">
-    <pre><code class="language-javascript">const url = new URL(
-    "http://192.168.110.10/api/user/apply-coach"
-);
-
-const headers = {
-    "Authorization": "Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429",
-    "Accept": "application/json",
-};
-
-fetch(url, {
-    method: "POST",
-    headers,
-}).then(response =&gt; response.json());</code></pre></div>
-
-
-<div class="php-example">
-    <pre><code class="language-php">$client = new \GuzzleHttp\Client();
-$url = 'http://192.168.110.10/api/user/apply-coach';
-$response = $client-&gt;post(
-    $url,
-    [
-        'headers' =&gt; [
-            'Authorization' =&gt; 'Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429',
-        ],
-    ]
-);
-$body = $response-&gt;getBody();
-print_r(json_decode((string) $body));</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 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429"
-               data-component="header">
-    <br>
-<p>Example: <code>Bearer 75|tq88hRcRSJ8qGyktGyCq3OugOjV4lPZjmfZtzCku99737429</code></p>
-            </div>
-                        </form>
-
-            
-
-        
-    </div>
-    <div class="dark-box">
-                    <div class="lang-selector">
-                                                        <button type="button" class="lang-button" data-language-name="bash">bash</button>
-                                                        <button type="button" class="lang-button" data-language-name="javascript">javascript</button>
-                                                        <button type="button" class="lang-button" data-language-name="php">php</button>
-                            </div>
-            </div>
-</div>
-</body>
-</html>

+ 0 - 149
public/docs/js/theme-default-4.38.0.js

@@ -1,149 +0,0 @@
-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();
-});

+ 0 - 289
public/docs/js/tryitout-4.38.0.js

@@ -1,289 +0,0 @@
-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;
-        });
-}

+ 0 - 408
public/docs/openapi.yaml

@@ -1,408 +0,0 @@
-openapi: 3.0.3
-info:
-  title: 'Owl Admin API Documentation'
-  description: 'Owl Admin API 接口文档'
-  version: 1.0.0
-servers:
-  -
-    url: 'http://192.168.110.10'
-paths:
-  '/api/scribe/update-token/{mobile}':
-    get:
-      summary: 更新API文档的认证Token
-      operationId: APIToken
-      description: 通过手机号获取验证码并登录,然后更新API文档的认证Token
-      parameters: []
-      responses:
-        200:
-          description: ''
-          content:
-            application/json:
-              schema:
-                type: object
-                example:
-                  code: 200
-                  message: Token更新成功
-                  data:
-                    token: your_new_token_here
-                properties:
-                  code:
-                    type: integer
-                    example: 200
-                  message:
-                    type: string
-                    example: Token更新成功
-                  data:
-                    type: object
-                    properties:
-                      token:
-                        type: string
-                        example: your_new_token_here
-      tags:
-        - Endpoints
-    parameters:
-      -
-        in: path
-        name: mobile
-        description: 手机号码.
-        example: '13800138000'
-        required: true
-        schema:
-          type: string
-  /api/account/send-code:
-    post:
-      summary: '[账户管理] 发送验证码'
-      operationId: ''
-      description: 向指定手机号发送验证码
-      parameters: []
-      responses:
-        200:
-          description: ''
-          content:
-            application/json:
-              schema:
-                type: object
-                example:
-                  code: 200
-                  message: 验证码发送成功
-                  data: null
-                properties:
-                  code:
-                    type: integer
-                    example: 200
-                  message:
-                    type: string
-                    example: 验证码发送成功
-                  data:
-                    type: string
-                    example: null
-      tags:
-        - Endpoints
-      requestBody:
-        required: true
-        content:
-          application/json:
-            schema:
-              type: object
-              properties:
-                mobile:
-                  type: string
-                  description: 手机号码.
-                  example: '13800138000'
-                  nullable: false
-              required:
-                - mobile
-  /api/account/login:
-    post:
-      summary: '[账户管理] 用户登录'
-      operationId: ''
-      description: 使用手机号和验证码登录账户
-      parameters: []
-      responses:
-        200:
-          description: ''
-          content:
-            application/json:
-              schema:
-                type: object
-                example:
-                  code: 200
-                  message: 登录成功
-                  data:
-                    token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...
-                    user:
-                      id: 1
-                      mobile: '13800138000'
-                      nickname: 用户昵称
-                properties:
-                  code:
-                    type: integer
-                    example: 200
-                  message:
-                    type: string
-                    example: 登录成功
-                  data:
-                    type: object
-                    properties:
-                      token:
-                        type: string
-                        example: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...
-                      user:
-                        type: object
-                        properties:
-                          id:
-                            type: integer
-                            example: 1
-                          mobile:
-                            type: string
-                            example: '13800138000'
-                          nickname:
-                            type: string
-                            example: 用户昵称
-      tags:
-        - Endpoints
-      requestBody:
-        required: true
-        content:
-          application/json:
-            schema:
-              type: object
-              properties:
-                mobile:
-                  type: string
-                  description: 手机号码.
-                  example: '13800138000'
-                  nullable: false
-                code:
-                  type: string
-                  description: 验证码.
-                  example: '123456'
-                  nullable: false
-              required:
-                - mobile
-                - code
-  /api/account/wx-login:
-    post:
-      summary: '[账户管理] 微信登录'
-      operationId: ''
-      description: 使用微信openid登录账户
-      parameters: []
-      responses:
-        200:
-          description: ''
-          content:
-            application/json:
-              schema:
-                type: object
-                example:
-                  code: 200
-                  message: 登录成功
-                  data:
-                    token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...
-                    user:
-                      id: 1
-                      openid: wx_123456789
-                      nickname: 微信昵称
-                properties:
-                  code:
-                    type: integer
-                    example: 200
-                  message:
-                    type: string
-                    example: 登录成功
-                  data:
-                    type: object
-                    properties:
-                      token:
-                        type: string
-                        example: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...
-                      user:
-                        type: object
-                        properties:
-                          id:
-                            type: integer
-                            example: 1
-                          openid:
-                            type: string
-                            example: wx_123456789
-                          nickname:
-                            type: string
-                            example: 微信昵称
-      tags:
-        - Endpoints
-      requestBody:
-        required: true
-        content:
-          application/json:
-            schema:
-              type: object
-              properties:
-                openid:
-                  type: string
-                  description: 微信openid.
-                  example: wx_123456789
-                  nullable: false
-              required:
-                - openid
-  /api/account/logout:
-    post:
-      summary: '[账户管理] 用户退出'
-      operationId: ''
-      description: 退出当前账户登录状态
-      parameters: []
-      responses:
-        200:
-          description: ''
-          content:
-            application/json:
-              schema:
-                type: object
-                example:
-                  code: 200
-                  message: 退出成功
-                  data: null
-                properties:
-                  code:
-                    type: integer
-                    example: 200
-                  message:
-                    type: string
-                    example: 退出成功
-                  data:
-                    type: string
-                    example: null
-      tags:
-        - Endpoints
-  /api/account:
-    delete:
-      summary: '[账户管理] 用户注销'
-      operationId: ''
-      description: 永久注销当前账户
-      parameters: []
-      responses:
-        200:
-          description: ''
-          content:
-            application/json:
-              schema:
-                type: object
-                example:
-                  code: 200
-                  message: 注销成功
-                  data: null
-                properties:
-                  code:
-                    type: integer
-                    example: 200
-                  message:
-                    type: string
-                    example: 注销成功
-                  data:
-                    type: string
-                    example: null
-      tags:
-        - Endpoints
-  /api/user/withdraw:
-    post:
-      summary: '[用户管理] 用户提现'
-      operationId: ''
-      description: 提现用户的余额
-      parameters: []
-      responses:
-        200:
-          description: ''
-          content:
-            application/json:
-              schema:
-                type: object
-                example:
-                  code: 200
-                  message: 提现成功
-                  data: null
-                properties:
-                  code:
-                    type: integer
-                    example: 200
-                  message:
-                    type: string
-                    example: 提现成功
-                  data:
-                    type: string
-                    example: null
-      tags:
-        - Endpoints
-      requestBody:
-        required: false
-        content:
-          application/json:
-            schema:
-              type: object
-              properties:
-                amount:
-                  type: decimal
-                  description: 提现金额.
-                  example: '100.00'
-                  nullable: false
-  /api/user/feedback:
-    post:
-      summary: '[用户管理] 用户反馈'
-      operationId: ''
-      description: 提交用户的反馈信息
-      parameters: []
-      responses:
-        200:
-          description: ''
-          content:
-            application/json:
-              schema:
-                type: object
-                example:
-                  code: 200
-                  message: 提交成功
-                  data: null
-                properties:
-                  code:
-                    type: integer
-                    example: 200
-                  message:
-                    type: string
-                    example: 提交成功
-                  data:
-                    type: string
-                    example: null
-      tags:
-        - Endpoints
-      requestBody:
-        required: false
-        content:
-          application/json:
-            schema:
-              type: object
-              properties:
-                content:
-                  type: string
-                  description: 反馈内容.
-                  example: 这是一个反馈信息
-                  nullable: false
-  /api/user/apply-coach:
-    post:
-      summary: '[用户管理] 申请成为技师'
-      operationId: ''
-      description: 申请成为技师
-      parameters: []
-      responses:
-        200:
-          description: ''
-          content:
-            application/json:
-              schema:
-                type: object
-                example:
-                  code: 200
-                  message: 申请成功
-                  data: null
-                properties:
-                  code:
-                    type: integer
-                    example: 200
-                  message:
-                    type: string
-                    example: 申请成功
-                  data:
-                    type: string
-                    example: null
-      tags:
-        - Endpoints
-tags:
-  -
-    name: Endpoints
-    description: ''
-components:
-  securitySchemes:
-    default:
-      type: http
-      scheme: bearer
-      description: '通过登录接口获取 token,格式为 Bearer {token}'
-security:
-  -
-    default: []