API 接口文档

短链接平台开放 RESTful API 文档,所有接口返回统一 JSON 格式。

Base URL: http://localhost:3050

鉴权方式

所有 API 请求必须在请求头中携带 X-API-Key,值为有效的 API 密钥。

非法密钥或无密钥请求返回 401 状态码。

# 请求头示例
X-API-Key: sk_your_api_key_here

API 密钥可在 管理后台 - API 密钥 页面创建和管理。

标准错误码

所有 API 返回统一 JSON 格式:

{
  "code": 0,
  "message": "success",
  "data": {}
}

标准错误码说明:

0请求成功 401未授权 — API 密钥无效或缺失 403禁止访问 — 链接被禁用或触发风控 404资源不存在 429请求过于频繁,被限流 500服务器内部错误 1001参数校验失败 1002资源已存在(如短码冲突)

限流说明

系统对 API 接口实施两级限流:

超出限制返回 HTTP 429,响应体:

{
  "code": 429,
  "message": "请求过于频繁,请稍后再试",
  "data": null
}

SDK Demo

以下提供 Node.js、Python、Java、PHP、Go 五种语言的 SDK 调用示例,可直接复制使用。

NODE Node.js 使用 axios / fetch
/**
 * Node.js SDK 示例 — 使用原生 fetch(Node.js 18+)
 */
const API_BASE = 'http://localhost:3050';
const API_KEY = 'sk_your_api_key_here';

async function createShortLink(url, options = {}) {
  const res = await fetch(`${API_BASE}/api/link/create`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': API_KEY,
    },
    body: JSON.stringify({
      url,
      short_code: options.shortCode,
      title: options.title,
      expire_days: options.expireDays,
    }),
  });
  return res.json();
}

async function listLinks(params = {}) {
  const query = new URLSearchParams(params).toString();
  const res = await fetch(`${API_BASE}/api/link/list?${query}`, {
    headers: { 'X-API-Key': API_KEY },
  });
  return res.json();
}

async function getLinkInfo(id) {
  const res = await fetch(`${API_BASE}/api/link/info?id=${id}`, {
    headers: { 'X-API-Key': API_KEY },
  });
  return res.json();
}

async function updateLink(id, fields) {
  const res = await fetch(`${API_BASE}/api/link/update`, {
    method: 'PUT',
    headers: { 'Content-Type': 'application/json', 'X-API-Key': API_KEY },
    body: JSON.stringify({ id, ...fields }),
  });
  return res.json();
}

async function deleteLink(id) {
  const res = await fetch(`${API_BASE}/api/link/delete`, {
    method: 'DELETE',
    headers: { 'Content-Type': 'application/json', 'X-API-Key': API_KEY },
    body: JSON.stringify({ id }),
  });
  return res.json();
}

// ===== 使用示例 =====
async function main() {
  // 1. 创建短链接
  const created = await createShortLink('https://example.com/very/long/url', {
    title: 'SDK 测试',
    expireDays: 30,
  });
  console.log('创建成功:', created.data.short_url);

  // 2. 查询列表
  const list = await listLinks({ page: 1, page_size: 10 });
  console.log('总数:', list.data.total);

  // 3. 查询详情
  const info = await getLinkInfo(created.data.id);
  console.log('链接标题:', info.data.title);

  // 4. 更新链接
  await updateLink(created.data.id, { title: '新标题', status: 1 });

  // 5. 删除链接
  await deleteLink(created.data.id);
  console.log('删除完成');
}

main().catch(console.error);
PY Python 使用 requests
"""
Python SDK 示例 — 使用 requests
安装: pip install requests
"""
import requests

API_BASE = "http://localhost:3050"
API_KEY = "sk_your_api_key_here"

HEADERS = {"X-API-Key": API_KEY}


def create_short_link(url, short_code=None, title=None, expire_days=None):
    """创建短链接"""
    body = {"url": url}
    if short_code:
        body["short_code"] = short_code
    if title:
        body["title"] = title
    if expire_days:
        body["expire_days"] = expire_days
    res = requests.post(f"{API_BASE}/api/link/create",
                        json=body, headers=HEADERS)
    return res.json()


def list_links(page=1, page_size=20, keyword=None, status=None):
    """查询链接列表"""
    params = {"page": page, "page_size": page_size}
    if keyword:
        params["keyword"] = keyword
    if status is not None:
        params["status"] = status
    res = requests.get(f"{API_BASE}/api/link/list",
                       params=params, headers=HEADERS)
    return res.json()


def get_link_info(id=None, short_code=None):
    """查询链接详情"""
    params = {}
    if id:
        params["id"] = id
    if short_code:
        params["short_code"] = short_code
    res = requests.get(f"{API_BASE}/api/link/info",
                       params=params, headers=HEADERS)
    return res.json()


def update_link(id, url=None, title=None, status=None, expire_days=None):
    """更新链接"""
    body = {"id": id}
    if url is not None:
        body["url"] = url
    if title is not None:
        body["title"] = title
    if status is not None:
        body["status"] = status
    if expire_days is not None:
        body["expire_days"] = expire_days
    res = requests.put(f"{API_BASE}/api/link/update",
                       json=body, headers=HEADERS)
    return res.json()


def delete_link(id):
    """删除链接"""
    res = requests.delete(f"{API_BASE}/api/link/delete",
                          json={"id": id}, headers=HEADERS)
    return res.json()


# ===== 使用示例 =====
if __name__ == "__main__":
    # 1. 创建
    result = create_short_link("https://example.com/long-url",
                               title="Python SDK 测试", expire_days=30)
    link_id = result["data"]["id"]
    print(f"创建成功: {result['data']['short_url']}")

    # 2. 查询列表
    links = list_links(page=1, page_size=10)
    print(f"总数: {links['data']['total']}")

    # 3. 查询详情
    info = get_link_info(id=link_id)
    print(f"标题: {info['data']['title']}")

    # 4. 更新
    update_link(link_id, title="新标题")

    # 5. 删除
    delete_link(link_id)
    print("删除完成")
JAVA Java 使用 OkHttp
// Java SDK 示例 — 使用 OkHttp + Jackson
// build.gradle 依赖:
//   implementation 'com.squareup.okhttp3:okhttp:4.12.0'
//   implementation 'com.fasterxml.jackson.core:jackson-databind:2.17.0'

import okhttp3.*;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class ShortLinkSDK {
    private static final String API_BASE = "http://localhost:3050";
    private static final String API_KEY = "sk_your_api_key_here";
    private final OkHttpClient client = new OkHttpClient();
    private final ObjectMapper mapper = new ObjectMapper();

    private JsonNode request(Request request) throws Exception {
        try (Response resp = client.newCall(request).execute()) {
            return mapper.readTree(resp.body().string());
        }
    }

    /** 创建短链接 */
    public JsonNode createLink(String url, String title, Integer expireDays) throws Exception {
        String json = mapper.writeValueAsString(
            java.util.Map.of("url", url, "title", title != null ? title : "",
                             "expire_days", expireDays != null ? expireDays : 0));
        RequestBody body = RequestBody.create(json, MediaType.get("application/json"));
        Request request = new Request.Builder()
            .url(API_BASE + "/api/link/create")
            .header("X-API-Key", API_KEY)
            .post(body).build();
        return request(request);
    }

    /** 查询链接列表 */
    public JsonNode listLinks(int page, int pageSize) throws Exception {
        HttpUrl url = HttpUrl.parse(API_BASE + "/api/link/list")
            .newBuilder().addQueryParameter("page", String.valueOf(page))
            .addQueryParameter("page_size", String.valueOf(pageSize)).build();
        Request request = new Request.Builder()
            .url(url).header("X-API-Key", API_KEY).get().build();
        return request(request);
    }

    /** 查询链接详情 */
    public JsonNode getLinkInfo(long id) throws Exception {
        HttpUrl url = HttpUrl.parse(API_BASE + "/api/link/info")
            .newBuilder().addQueryParameter("id", String.valueOf(id)).build();
        Request request = new Request.Builder()
            .url(url).header("X-API-Key", API_KEY).get().build();
        return request(request);
    }

    /** 更新链接 */
    public JsonNode updateLink(long id, String title, Integer status) throws Exception {
        var map = new java.util.HashMap<String, Object>();
        map.put("id", id);
        if (title != null) map.put("title", title);
        if (status != null) map.put("status", status);
        String json = mapper.writeValueAsString(map);
        RequestBody body = RequestBody.create(json, MediaType.get("application/json"));
        Request request = new Request.Builder()
            .url(API_BASE + "/api/link/update")
            .header("X-API-Key", API_KEY).put(body).build();
        return request(request);
    }

    /** 删除链接 */
    public JsonNode deleteLink(long id) throws Exception {
        String json = mapper.writeValueAsString(java.util.Map.of("id", id));
        RequestBody body = RequestBody.create(json, MediaType.get("application/json"));
        Request request = new Request.Builder()
            .url(API_BASE + "/api/link/delete")
            .header("X-API-Key", API_KEY).delete(body).build();
        return request(request);
    }

    // ===== 使用示例 =====
    public static void main(String[] args) throws Exception {
        ShortLinkSDK sdk = new ShortLinkSDK();

        // 1. 创建
        JsonNode created = sdk.createLink("https://example.com/long-url",
                                          "Java SDK 测试", 30);
        long id = created.get("data").get("id").asLong();
        System.out.println("创建成功: " + created.get("data").get("short_url").asText());

        // 2. 查询列表
        JsonNode list = sdk.listLinks(1, 10);
        System.out.println("总数: " + list.get("data").get("total").asInt());

        // 3. 查询详情
        JsonNode info = sdk.getLinkInfo(id);
        System.out.println("标题: " + info.get("data").get("title").asText());

        // 4. 更新
        sdk.updateLink(id, "新标题", 1);

        // 5. 删除
        sdk.deleteLink(id);
        System.out.println("删除完成");
    }
}
PHP PHP 使用 cURL
<?php
/**
 * PHP SDK 示例 — 使用 cURL
 */

class ShortLinkSDK {
    private string $apiBase = 'http://localhost:3050';
    private string $apiKey;

    public function __construct(string $apiKey) {
        $this->apiKey = $apiKey;
    }

    private function request(string $method, string $path, array $data = []): array {
        $url = $this->apiBase . $path;
        $ch = curl_init();

        if ($method === 'GET' && !empty($data)) {
            $url .= '?' . http_build_query($data);
        }

        curl_setopt_array($ch, [
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HTTPHEADER => [
                'Content-Type: application/json',
                'X-API-Key: ' . $this->apiKey,
            ],
        ]);

        if ($method === 'POST') {
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
        } elseif (in_array($method, ['PUT', 'DELETE'])) {
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
        }

        $result = curl_exec($ch);
        curl_close($ch);
        return json_decode($result, true) ?? [];
    }

    /** 创建短链接 */
    public function createLink(string $url, ?string $title = null,
                               ?int $expireDays = null): array {
        return $this->request('POST', '/api/link/create', array_filter([
            'url' => $url,
            'title' => $title,
            'expire_days' => $expireDays,
        ], fn($v) => $v !== null));
    }

    /** 查询链接列表 */
    public function listLinks(int $page = 1, int $pageSize = 20,
                              ?string $keyword = null): array {
        return $this->request('GET', '/api/link/list', array_filter([
            'page' => $page, 'page_size' => $pageSize,
            'keyword' => $keyword,
        ], fn($v) => $v !== null));
    }

    /** 查询链接详情 */
    public function getLinkInfo(?int $id = null, ?string $shortCode = null): array {
        return $this->request('GET', '/api/link/info', array_filter([
            'id' => $id, 'short_code' => $shortCode,
        ], fn($v) => $v !== null));
    }

    /** 更新链接 */
    public function updateLink(int $id, ?string $title = null,
                               ?int $status = null): array {
        return $this->request('PUT', '/api/link/update', array_filter([
            'id' => $id, 'title' => $title, 'status' => $status,
        ], fn($v) => $v !== null));
    }

    /** 删除链接 */
    public function deleteLink(int $id): array {
        return $this->request('DELETE', '/api/link/delete', ['id' => $id]);
    }
}

// ===== 使用示例 =====
$sdk = new ShortLinkSDK('sk_your_api_key_here');

// 1. 创建短链接
$result = $sdk->createLink('https://example.com/long-url',
                           'PHP SDK 测试', 30);
$linkId = $result['data']['id'] ?? null;
echo '创建成功: ' . ($result['data']['short_url'] ?? '') . PHP_EOL;

// 2. 查询列表
$list = $sdk->listLinks(1, 10);
echo '总数: ' . ($list['data']['total'] ?? 0) . PHP_EOL;

// 3. 查询详情
$info = $sdk->getLinkInfo(id: $linkId);
echo '标题: ' . ($info['data']['title'] ?? '') . PHP_EOL;

// 4. 更新
$sdk->updateLink($linkId, title: '新标题', status: 1);

// 5. 删除
$sdk->deleteLink($linkId);
echo '删除完成' . PHP_EOL;
GO Go 使用 net/http
// Go SDK 示例 — 使用 net/http
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"strconv"
)

const (
	apiBase = "http://localhost:3050"
	apiKey  = "sk_your_api_key_here"
)

type Response struct {
	Code    int              `json:"code"`
	Message string           `json:"message"`
	Data    *json.RawMessage `json:"data"`
}

type LinkData struct {
	ID          int    `json:"id"`
	ShortCode   string `json:"short_code"`
	ShortURL    string `json:"short_url"`
	OriginalURL string `json:"original_url"`
	Title       string `json:"title"`
	VisitCount  int    `json:"visit_count"`
	Status      int    `json:"status"`
}

type ListData struct {
	List     []LinkData `json:"list"`
	Total    int        `json:"total"`
	Page     int        `json:"page"`
	PageSize int        `json:"pageSize"`
}

// SDK 客户端
type ShortLinkClient struct {
	baseURL string
	apiKey  string
	client  *http.Client
}

func NewClient(baseURL, apiKey string) *ShortLinkClient {
	return &ShortLinkClient{
		baseURL: baseURL,
		apiKey:  apiKey,
		client:  &http.Client{},
	}
}

func (c *ShortLinkClient) do(method, path string, body interface{}) (*Response, error) {
	var buf bytes.Buffer
	if body != nil {
		json.NewEncoder(&buf).Encode(body)
	}
	req, err := http.NewRequest(method, c.baseURL+path, &buf)
	if err != nil {
		return nil, err
	}
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("X-API-Key", c.apiKey)

	resp, err := c.client.Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()

	var result Response
	data, _ := io.ReadAll(resp.Body)
	json.Unmarshal(data, &result)
	return &result, nil
}

func (c *ShortLinkClient) CreateLink(url, title string, expireDays int) (*Response, error) {
	return c.do("POST", "/api/link/create", map[string]interface{}{
		"url": url, "title": title, "expire_days": expireDays,
	})
}

func (c *ShortLinkClient) ListLinks(page, pageSize int) (*Response, error) {
	return c.do("GET",
		fmt.Sprintf("/api/link/list?page=%d&page_size=%d", page, pageSize),
		nil)
}

func (c *ShortLinkClient) GetLinkInfo(id int) (*Response, error) {
	return c.do("GET",
		fmt.Sprintf("/api/link/info?id=%d", id), nil)
}

func (c *ShortLinkClient) UpdateLink(id, status int, title string) (*Response, error) {
	return c.do("PUT", "/api/link/update", map[string]interface{}{
		"id": id, "title": title, "status": status,
	})
}

func (c *ShortLinkClient) DeleteLink(id int) (*Response, error) {
	return c.do("DELETE", "/api/link/delete",
		map[string]interface{}{"id": id})
}

// ===== 使用示例 =====
func main() {
	client := NewClient(apiBase, apiKey)

	// 1. 创建短链接
	resp, _ := client.CreateLink("https://example.com/long-url",
		"Go SDK 测试", 30)
	fmt.Printf("创建成功: %+v\n", resp)

	// 2. 查询列表
	list, _ := client.ListLinks(1, 10)
	fmt.Printf("列表: %+v\n", list)

	// 3. 删除
	client.DeleteLink(1)
	fmt.Println("删除完成")
}

链接 API

POST /api/link/create 创建短链接

创建一条新的短链接,支持普通 URL 和微信小程序链接。

请求参数 (JSON Body)

参数类型必填说明
urlstring目标链接,普通链接以 http://https:// 开头,微信小程序链接以 # 开头
short_codestring自定义短码(字母数字组合,最长 16 位),留空自动生成
titlestring链接标题/备注
expire_daysnumber有效期天数(0 或省略表示永不过期)

响应示例

{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1,
    "short_code": "abc123",
    "short_url": "http://localhost:3050/abc123",
    "original_url": "https://example.com/long-url",
    "title": "示例链接",
    "expire_at": null,
    "status": 1,
    "qrcode_url": "http://localhost:3050/api/link/qrcode/abc123",
    "created_at": "2026-06-11 12:00:00"
  }
}

cURL 示例

curl -X POST http://localhost:3050/api/link/create \
  -H "Content-Type: application/json" \
  -H "X-API-Key: sk_your_api_key_here" \
  -d '{
    "url": "https://example.com/very/long/url",
    "title": "我的链接",
    "expire_days": 30
  }'

微信小程序链接示例

curl -X POST http://localhost:3050/api/link/create \
  -H "Content-Type: application/json" \
  -H "X-API-Key: sk_your_api_key_here" \
  -d '{
    "url": "#小程序://myapp/page?id=123",
    "title": "小程序链接"
  }'
POST /api/link/batch-create 批量创建短链接

一次性批量创建最多 1000 条短链接。支持普通 URL 和微信小程序链接。

请求参数 (JSON Body)

参数类型必填说明
urlsarrayURL 数组,每项为字符串或 {url, title} 对象,最多 1000 条
expire_daysnumber有效期天数(0 或省略表示永不过期)

响应示例

{
  "code": 0,
  "message": "success",
  "data": {
    "total": 3,
    "success_count": 2,
    "fail_count": 1,
    "results": [
      { "index": 0, "id": 1, "short_code": "abc123", "short_url": "http://localhost:3050/abc123", "original_url": "https://example.com/page1", "title": "" }
    ],
    "errors": [
      { "index": 1, "url": "", "message": "URL 不能为空" }
    ]
  }
}

cURL 示例

curl -X POST http://localhost:3050/api/link/batch-create \
  -H "Content-Type: application/json" \
  -H "X-API-Key: sk_your_api_key_here" \
  -d '{
    "urls": [
      "https://example.com/page1",
      "https://example.com/page2"
    ],
    "expire_days": 30
  }'
GET /api/link/list 批量查询链接列表

分页查询短链接列表,支持关键词搜索和状态筛选。

请求参数 (Query)

参数类型必填说明
pagenumber页码,默认 1
page_sizenumber每页条数,默认 20,最大 100
keywordstring搜索关键词(匹配 URL / 短码 / 标题)
link_typestring筛选链接类型:url(普通链接)、weapp(小程序链接),不传则全部
statusnumber筛选状态:1=启用,0=禁用
start_datestring开始日期,格式 YYYY-MM-DD
end_datestring结束日期,格式 YYYY-MM-DD

响应示例

{
  "code": 0,
  "message": "success",
  "data": {
    "list": [
      {
        "id": 1,
        "short_code": "abc123",
        "short_url": "http://localhost:3050/abc123",
        "original_url": "https://example.com/page",
        "title": "示例",
        "visit_count": 42,
        "expire_at": null,
        "status": 1,
        "qrcode_url": "http://localhost:3050/api/link/qrcode/abc123",
        "created_at": "2026-06-11 12:00:00",
        "updated_at": "2026-06-11 12:00:00"
      }
    ],
    "total": 1,
    "page": 1,
    "pageSize": 20
  }
}

cURL 示例

curl -s "http://localhost:3050/api/link/list?page=1&page_size=10&keyword=example" \
  -H "X-API-Key: sk_your_api_key_here"
GET /api/link/info 查询单条链接详情

通过 idshort_code 查询单条链接的详细信息。

请求参数 (Query)

参数类型必填说明
idnumber二选一链接 ID
short_codestring二选一短码

cURL 示例

# 按 ID 查询
curl -s "http://localhost:3050/api/link/info?id=1" \
  -H "X-API-Key: sk_your_api_key_here"

# 按短码查询
curl -s "http://localhost:3050/api/link/info?short_code=abc123" \
  -H "X-API-Key: sk_your_api_key_here"
PUT /api/link/update 修改链接信息

修改链接的目标地址、标题、状态或有效期。

请求参数 (JSON Body)

参数类型必填说明
idnumber链接 ID
urlstring新的目标地址
titlestring新的标题
statusnumber1=启用,0=禁用
expire_daysnumber有效期天数(0=永久)

cURL 示例

curl -X PUT http://localhost:3050/api/link/update \
  -H "Content-Type: application/json" \
  -H "X-API-Key: sk_your_api_key_here" \
  -d '{
    "id": 1,
    "title": "新标题",
    "status": 0
  }'
DELETE /api/link/delete 删除短链接

删除指定短链接及其关联的访问记录。支持 body 和 query 两种传参方式。

请求参数

参数类型必填说明
idnumber链接 ID(可放 body 或 query 中)

cURL 示例

# 通过 Body 传参
curl -X DELETE http://localhost:3050/api/link/delete \
  -H "Content-Type: application/json" \
  -H "X-API-Key: sk_your_api_key_here" \
  -d '{"id": 1}'

# 通过 Query 传参
curl -X DELETE "http://localhost:3050/api/link/delete?id=1" \
  -H "X-API-Key: sk_your_api_key_here"

扩展 API

GET /api/link/qrcode/:short_code 获取二维码图片

获取指定短链接的二维码图片(PNG 格式),可直接嵌入 <img> 标签或下载。

路径参数

参数说明
short_code短码

cURL 示例

# 保存为文件
curl -o qrcode.png "http://localhost:3050/api/link/qrcode/abc123" \
  -H "X-API-Key: sk_your_api_key_here"

# 或直接在浏览器中访问
# http://localhost:3050/api/link/qrcode/abc123
GET /api/link/stats/:id 获取访问统计

获取指定链接的访问统计数据,包括总访问次数、独立 IP 数、每日趋势。

路径参数

参数说明
id链接 ID

查询参数

参数类型说明
start_datestring开始日期 YYYY-MM-DD(可选)
end_datestring结束日期 YYYY-MM-DD(可选)

响应示例

{
  "code": 0,
  "message": "success",
  "data": {
    "total_visits": 100,
    "unique_ips": 42,
    "daily_stats": [
      { "date": "2026-06-05", "count": 15 },
      { "date": "2026-06-06", "count": 23 }
    ],
    "link": {
      "id": 1,
      "short_code": "abc123",
      "short_url": "http://localhost:3050/abc123",
      "original_url": "https://example.com/page",
      "visit_count": 100
    }
  }
}

cURL 示例

curl -s "http://localhost:3050/api/link/stats/1" \
  -H "X-API-Key: sk_your_api_key_here"

API 密钥管理

GET /api/keys 查询所有密钥

获取所有 API 密钥列表(含密钥值)。

curl -s "http://localhost:3050/api/keys" \
  -H "X-API-Key: sk_your_api_key_here"
POST /api/keys 创建新密钥

创建一个新的 API 密钥。

参数类型必填说明
namestring密钥名称
curl -X POST http://localhost:3050/api/keys \
  -H "Content-Type: application/json" \
  -H "X-API-Key: sk_your_api_key_here" \
  -d '{"name": "生产环境"}'
PUT /api/keys/:id 编辑密钥

修改密钥名称或状态。

参数类型必填说明
namestring新名称
statusnumber1=启用,0=禁用
curl -X PUT http://localhost:3050/api/keys/1 \
  -H "Content-Type: application/json" \
  -H "X-API-Key: sk_your_api_key_here" \
  -d '{"name": "新名称", "status": 1}'
DELETE /api/keys/:id 删除密钥

删除指定 API 密钥,关联调用将立即失效。

curl -X DELETE http://localhost:3050/api/keys/1 \
  -H "X-API-Key: sk_your_api_key_here"
短链接平台 · 返回首页 · 管理后台