Django + Celery 打造企业级大模型异步任务管理平台 —— 从需求到完整实践(含全模板源码)

如需完整工程文件(含所有模板),可回复获取详细模板代码。

面向人群:自动化测试工程师、企业中后台开发人员、希望提升效率的 AI 业务从业者
核心收获:掌握 Django 三表关系设计、Celery 异步任务实践、基础 Web 交互与前后端分离思路,源码可直接落地,方便二次扩展


一、系统功能全览

本系统以大模型自动化任务管理为核心,涵盖了三大业务场景:

1. 大模型任务管理

场景:测试工程师或业务人员通过 Web 页面向企业内已接入的大模型(如 GPT、阿里百川等)发起任务请求,系统后台异步执行任务并实时反馈进度与结果。
功能

任务列表:清晰展示任务名称、创建时间、发起人、提问内容、所用大模型、进度
任务详情:一键查看输入与大模型返回详情
一键新建任务:弹窗表单,选择发起人/模型、填写提示词,任务异步下发

2. 大模型管理

场景:平台支持多模型配置、维护,可随时增删编辑,灵活应对不同业务需求或供应商切换。
功能

大模型列表:展示所有已接入大模型的关键信息
新建/编辑/删除大模型:表单支持 API Key、Base URL、模型名、维护人,快速扩展和维护

3. 人员管理

场景:平台中的“发起人”、“维护人”都从人员表下拉选取,方便团队协作与权限追踪。
功能

列表、创建、编辑、删除人员,数据基础一目了然


二、系统架构与扩展性说明

异步任务:Celery+Redis 组合,任务下发即返回,处理高并发和长耗时 AI 推理毫无压力。
表单校验:所有关键字段必填,表单错误友好提示。
数据解耦:大模型、人员、任务三表设计,方便后续增加权限、标签等扩展字段。
易于二次开发

任务可轻松拓展为定时任务、批量任务、API 任务
大模型表可加“模型类型”、“状态”等新字段
Celery 任务内可真实调用大模型接口,支持异步回调、失败重试等企业级需求

权限与安全:可直接结合 Django 用户系统,扩展为企业级权限管理后台

环境准备

安装依赖

pip install django celery redis

确保本地 Redis 已启动(Windows 下可用)


项目结构

bigmodel_proj/
├── bigmodel_proj/
│   ├── __init__.py
│   ├── celery.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── app/
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── tasks.py
│   ├── views.py
│   ├── forms.py
│   ├── urls.py
│   └── templates/
│       └── app/
│           └── ...  # 所有前端模板
└── manage.py

四、核心代码实现

1. bigmodel_proj/settings.py(核心配置)

import os
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

SECRET_KEY = 'your-secret-key'
DEBUG = True
ALLOWED_HOSTS = []

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'bigmodel_proj.urls'

TEMPLATES = [
    {
            
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'app' / 'templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'bigmodel_proj.wsgi.application'

DATABASES = {
            
    'default': {
            
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = True

STATIC_URL = '/static/'

# Celery 配置
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

2. bigmodel_proj/celery.py(Celery 启动入口)

import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'bigmodel_proj.settings')
app = Celery('bigmodel_proj')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

bigmodel_proj/__init__.py

from .celery import app as celery_app
__all__ = ('celery_app',)

3. app/models.py(三大核心数据模型)

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=50, verbose_name="姓名")
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")

    def __str__(self):
        return self.name

class BigModel(models.Model):
    api_key = models.CharField(max_length=128, verbose_name="API Key")
    base_url = models.URLField(verbose_name="Base URL")
    model_name = models.CharField(max_length=100, verbose_name="模型名")
    maintainer = models.ForeignKey(Person, on_delete=models.SET_NULL, null=True, verbose_name="维护人")
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    updated_at = models.DateTimeField(auto_now=True, verbose_name="修改时间")

    def __str__(self):
        return self.model_name

class BigModelTask(models.Model):
    STATUS_CHOICES = (
        ('PENDING', '待处理'),
        ('RUNNING', '进行中'),
        ('SUCCESS', '成功'),
        ('FAILURE', '失败'),
    )

    name = models.CharField(max_length=100, verbose_name="任务名称")
    creator = models.ForeignKey(Person, on_delete=models.SET_NULL, null=True, verbose_name="发起人")
    prompt = models.TextField(verbose_name="用户提问信息")
    big_model = models.ForeignKey(BigModel, on_delete=models.SET_NULL, null=True, verbose_name="大模型")
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='PENDING', verbose_name="任务进度")
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    detail = models.TextField(blank=True, null=True, verbose_name="大模型请求详情")

    def __str__(self):
        return self.name

4. app/tasks.py(Celery 异步任务)

from celery import shared_task
import time
from .models import BigModelTask

@shared_task(bind=True)
def execute_bigmodel_task(self, task_id):
    try:
        task = BigModelTask.objects.get(id=task_id)
        task.status = 'RUNNING'
        task.save(update_fields=['status'])
        # 模拟大模型请求耗时
        time.sleep(5)
        # 假装请求大模型并返回结果
        result_detail = f"请求大模型[{
              task.big_model.model_name}]完成,提示词:{
              task.prompt}"
        task.status = 'SUCCESS'
        task.detail = result_detail
        task.save(update_fields=['status', 'detail'])
    except Exception as e:
        if task:
            task.status = 'FAILURE'
            task.detail = f"异常:{
              str(e)}"
            task.save(update_fields=['status', 'detail'])
        raise

5. app/forms.py(前端表单)

from django import forms
from .models import BigModel, Person, BigModelTask

class PersonForm(forms.ModelForm):
    class Meta:
        model = Person
        fields = ['name']

class BigModelForm(forms.ModelForm):
    class Meta:
        model = BigModel
        fields = ['api_key', 'base_url', 'model_name', 'maintainer']

class BigModelTaskForm(forms.ModelForm):
    class Meta:
        model = BigModelTask
        fields = ['name', 'creator', 'prompt', 'big_model']
        widgets = {
            
            'prompt': forms.Textarea(attrs={
            'rows': 3}),
        }

6. app/views.py(三大模块视图)

from django.shortcuts import render, redirect, get_object_or_404
from django.urls import reverse
from django.contrib import messages

from .models import Person, BigModel, BigModelTask
from .forms import PersonForm, BigModelForm, BigModelTaskForm
from .tasks import execute_bigmodel_task

# 人员管理
def person_list(request):
    persons = Person.objects.all()
    return render(request, 'app/person_list.html', {
            'persons': persons})

def person_create(request):
    if request.method == 'POST':
        form = PersonForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('person_list')
    else:
        form = PersonForm()
    return render(request, 'app/person_form.html', {
            'form': form, 'title': '新建人员'})

def person_edit(request, pk):
    person = get_object_or_404(Person, pk=pk)
    if request.method == 'POST':
        form = PersonForm(request.POST, instance=person)
        if form.is_valid():
            form.save()
            return redirect('person_list')
    else:
        form = PersonForm(instance=person)
    return render(request, 'app/person_form.html', {
            'form': form, 'title': '编辑人员'})

def person_delete(request, pk):
    person = get_object_or_404(Person, pk=pk)
    if request.method == 'POST':
        person.delete()
        return redirect('person_list')
    return render(request, 'app/person_confirm_delete.html', {
            'object': person, 'title': '删除人员'})

# 大模型管理
def bigmodel_list(request):
    bigmodels = BigModel.objects.all()
    return render(request, 'app/bigmodel_list.html', {
            'bigmodels': bigmodels})

def bigmodel_create(request):
    if request.method == 'POST':
        form = BigModelForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('bigmodel_list')
    else:
        form = BigModelForm()
    return render(request, 'app/bigmodel_form.html', {
            'form': form, 'title': '新建大模型'})

def bigmodel_edit(request, pk):
    bigmodel = get_object_or_404(BigModel, pk=pk)
    if request.method == 'POST':
        form = BigModelForm(request.POST, instance=bigmodel)
        if form.is_valid():
            form.save()
            return redirect('bigmodel_list')
    else:
        form = BigModelForm(instance=bigmodel)
    return render(request, 'app/bigmodel_form.html', {
            'form': form, 'title': '编辑大模型'})

def bigmodel_delete(request, pk):
    bigmodel = get_object_or_404(BigModel, pk=pk)
    if request.method == 'POST':
        bigmodel.delete()
        return redirect('bigmodel_list')
    return render(request, 'app/bigmodel_confirm_delete.html', {
            'object': bigmodel, 'title': '删除大模型'})

# 大模型任务管理
def task_list(request):
    tasks = BigModelTask.objects.select_related('creator', 'big_model').order_by('-created_at')
    return render(request, 'app/task_list.html', {
            'tasks': tasks})

def task_detail(request, pk):
    task = get_object_or_404(BigModelTask, pk=pk)
    return render(request, 'app/task_detail.html', {
            'task': task})

def task_create(request):
    if request.method == 'POST':
        form = BigModelTaskForm(request.POST)
        if form.is_valid():
            task = form.save(commit=False)
            task.status = 'PENDING'
            task.save()
            execute_bigmodel_task.delay(task.id)
            messages.success(request, '任务已成功创建并异步下发!')
            return redirect('task_list')
    else:
        form = BigModelTaskForm()
    return render(request, 'app/task_form.html', {
            'form': form, 'title': '新建大模型请求任务'})

7. app/urls.py(子路由)

from django.urls import path
from . import views

urlpatterns = [
    # 人员管理
    path('persons/', views.person_list, name='person_list'),
    path('persons/create/', views.person_create, name='person_create'),
    path('persons/<int:pk>/edit/', views.person_edit, name='person_edit'),
    path('persons/<int:pk>/delete/', views.person_delete, name='person_delete'),

    # 大模型管理
    path('bigmodels/', views.bigmodel_list, name='bigmodel_list'),
    path('bigmodels/create/', views.bigmodel_create, name='bigmodel_create'),
    path('bigmodels/<int:pk>/edit/', views.bigmodel_edit, name='bigmodel_edit'),
    path('bigmodels/<int:pk>/delete/', views.bigmodel_delete, name='bigmodel_delete'),

    # 任务管理
    path('tasks/', views.task_list, name='task_list'),
    path('tasks/create/', views.task_create, name='task_create'),
    path('tasks/<int:pk>/', views.task_detail, name='task_detail'),
]

bigmodel_proj/urls.py(主路由):

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('app.urls')),
]


五、完整模板目录与源码

所有模板位于 app/templates/app/ 目录下。

base.html —— 全站父模板

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}大模型任务管理系统{% endblock %}</title>
    <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.6.2/css/bootstrap.min.css">
    <style>
        body {
               background: #f6f7fb; }
        .container {
               background: #fff; border-radius: 8px; box-shadow: 0 2px 8px #eee; padding: 32px 28px; margin-top: 30px; }
        nav a {
               margin-right: 15px; }
        .btn {
               min-width: 70px; }
        .table th, .table td {
               vertical-align: middle!important; }
    </style>
</head>
<body>
<div class="container">
    <nav class="mb-4">
        <a href="{% url 'task_list' %}">任务列表</a>
        <a href="{% url 'bigmodel_list' %}">大模型管理</a>
        <a href="{% url 'person_list' %}">人员管理</a>
    </nav>
    {% if messages %}
      {% for msg in messages %}
      <div class="alert alert-info">{
           { msg }}</div>
      {% endfor %}
    {% endif %}

    {% block content %}{% endblock %}
</div>
</body>
</html>

task_list.html —— 大模型任务列表页

{% extends "app/base.html" %}
{% block title %}大模型任务列表{% endblock %}
{% block content %}
<h3 class="mb-3">大模型请求任务列表</h3>
<a href="{% url 'task_create' %}" class="btn btn-primary mb-2">新建请求任务</a>
<table class="table table-bordered table-hover">
    <thead class="thead-light">
        <tr>
            <th>任务名称</th>
            <th>创建时间</th>
            <th>发起人</th>
            <th>用户提问</th>
            <th>大模型</th>
            <th>任务进度</th>
            <th>操作</th>
        </tr>
    </thead>
    <tbody>
        {% for t in tasks %}
        <tr>
            <td>{
           { t.name }}</td>
            <td>{
           { t.created_at|date:"Y-m-d H:i" }}</td>
            <td>{
           { t.creator }}</td>
            <td title="{
             { t.prompt }}">{
           { t.prompt|truncatechars:15 }}</td>
            <td>{
           { t.big_model.model_name }}</td>
            <td>
                {% if t.status == 'PENDING' %}<span class="badge badge-secondary">待处理</span>
                {% elif t.status == 'RUNNING' %}<span class="badge badge-info">进行中</span>
                {% elif t.status == 'SUCCESS' %}<span class="badge badge-success">成功</span>
                {% elif t.status == 'FAILURE' %}<span class="badge badge-danger">失败</span>
                {% endif %}
            </td>
            <td>
                <a href="{% url 'task_detail' t.id %}" class="btn btn-sm btn-outline-info">详情</a>
            </td>
        </tr>
        {% empty %}
        <tr><td colspan="7" class="text-center">暂无任务</td></tr>
        {% endfor %}
    </tbody>
</table>
{% endblock %}

task_form.html —— 新建/编辑大模型任务

{% extends "app/base.html" %}
{% block title %}{
           { title }}{% endblock %}
{% block content %}
<h3 class="mb-4">{
           { title }}</h3>
<form method="post" novalidate>
    {% csrf_token %}
    {
           { form.non_field_errors }}
    <div class="form-group">
        {
           { form.name.label_tag }}{
           { form.name }}
        {
           { form.name.errors }}
    </div>
    <div class="form-group">
        {
           { form.creator.label_tag }}{
           { form.creator }}
        {
           { form.creator.errors }}
    </div>
    <div class="form-group">
        {
           { form.big_model.label_tag }}{
           { form.big_model }}
        {
           { form.big_model.errors }}
    </div>
    <div class="form-group">
        {
           { form.prompt.label_tag }}{
           { form.prompt }}
        {
           { form.prompt.errors }}
    </div>
    <a href="{% url 'task_list' %}" class="btn btn-secondary">取消</a>
    <button type="submit" class="btn btn-success">确定</button>
</form>
{% endblock %}

task_detail.html —— 任务详情页

{% extends "app/base.html" %}
{% block title %}大模型请求详情{% endblock %}
{% block content %}
<h3 class="mb-4">任务详情</h3>
<ul class="list-group mb-3">
    <li class="list-group-item"><b>名称</b>:{
           { task.name }}</li>
    <li class="list-group-item"><b>发起人</b>:{
           { task.creator }}</li>
    <li class="list-group-item"><b>大模型</b>:{
           { task.big_model }}</li>
    <li class="list-group-item"><b>提问内容</b>:{
           { task.prompt }}</li>
    <li class="list-group-item"><b>任务进度</b>:
        {% if task.status == 'PENDING' %}<span class="badge badge-secondary">待处理</span>
        {% elif task.status == 'RUNNING' %}<span class="badge badge-info">进行中</span>
        {% elif task.status == 'SUCCESS' %}<span class="badge badge-success">成功</span>
        {% elif task.status == 'FAILURE' %}<span class="badge badge-danger">失败</span>
        {% endif %}
    </li>
    <li class="list-group-item"><b>请求详情</b>:<pre>{
           { task.detail }}</pre></li>
    <li class="list-group-item"><b>创建时间</b>:{
           { task.created_at|date:"Y-m-d H:i" }}</li>
</ul>
<a href="{% url 'task_list' %}" class="btn btn-secondary">返回列表</a>
{% endblock %}

bigmodel_list.html —— 大模型管理列表

{% extends "app/base.html" %}
{% block title %}大模型管理{% endblock %}
{% block content %}
<h3 class="mb-4">大模型管理</h3>
<a href="{% url 'bigmodel_create' %}" class="btn btn-primary mb-2">新建大模型</a>
<table class="table table-bordered table-hover">
    <thead class="thead-light">
        <tr>
            <th>API Key</th>
            <th>Base URL</th>
            <th>模型名</th>
            <th>维护人</th>
            <th>创建时间</th>
            <th>修改时间</th>
            <th>操作</th>
        </tr>
    </thead>
    <tbody>
        {% for m in bigmodels %}
        <tr>
            <td>{
           { m.api_key|slice:":8" }}******</td>
            <td>{
           { m.base_url }}</td>
            <td>{
           { m.model_name }}</td>
            <td>{
           { m.maintainer }}</td>
            <td>{
           { m.created_at|date:"Y-m-d H:i" }}</td>
            <td>{
           { m.updated_at|date:"Y-m-d H:i" }}</td>
            <td>
                <a href="{% url 'bigmodel_edit' m.id %}" class="btn btn-sm btn-outline-primary">编辑</a>
                <a href="{% url 'bigmodel_delete' m.id %}" class="btn btn-sm btn-outline-danger">删除</a>
            </td>
        </tr>
        {% empty %}
        <tr><td colspan="7" class="text-center">暂无大模型</td></tr>
        {% endfor %}
    </tbody>
</table>
{% endblock %}

bigmodel_form.html —— 新建/编辑大模型

{% extends "app/base.html" %}
{% block title %}{
           { title }}{% endblock %}
{% block content %}
<h3 class="mb-4">{
           { title }}</h3>
<form method="post" novalidate>
    {% csrf_token %}
    {
           { form.non_field_errors }}
    <div class="form-group">
        {
           { form.api_key.label_tag }}{
           { form.api_key }}
        {
           { form.api_key.errors }}
    </div>
    <div class="form-group">
        {
           { form.base_url.label_tag }}{
           { form.base_url }}
        {
           { form.base_url.errors }}
    </div>
    <div class="form-group">
        {
           { form.model_name.label_tag }}{
           { form.model_name }}
        {
           { form.model_name.errors }}
    </div>
    <div class="form-group">
        {
           { form.maintainer.label_tag }}{
           { form.maintainer }}
        {
           { form.maintainer.errors }}
    </div>
    <a href="{% url 'bigmodel_list' %}" class="btn btn-secondary">取消</a>
    <button type="submit" class="btn btn-success">确定</button>
</form>
{% endblock %}

bigmodel_confirm_delete.html —— 删除大模型确认页

{% extends "app/base.html" %}
{% block title %}删除大模型{% endblock %}
{% block content %}
<h3 class="mb-4">确认删除大模型</h3>
<p>确定要删除 <b>{
           { object.model_name }}</b> 吗?</p>
<form method="post">{% csrf_token %}
    <a href="{% url 'bigmodel_list' %}" class="btn btn-secondary">取消</a>
    <button type="submit" class="btn btn-danger">确定删除</button>
</form>
{% endblock %}

person_list.html —— 人员管理列表

{% extends "app/base.html" %}
{% block title %}人员管理{% endblock %}
{% block content %}
<h3 class="mb-4">人员管理</h3>
<a href="{% url 'person_create' %}" class="btn btn-primary mb-2">新建人员</a>
<table class="table table-bordered table-hover">
    <thead class="thead-light">
        <tr>
            <th>姓名</th>
            <th>创建时间</th>
            <th>操作</th>
        </tr>
    </thead>
    <tbody>
        {% for p in persons %}
        <tr>
            <td>{
           { p.name }}</td>
            <td>{
           { p.created_at|date:"Y-m-d H:i" }}</td>
            <td>
                <a href="{% url 'person_edit' p.id %}" class="btn btn-sm btn-outline-primary">编辑</a>
                <a href="{% url 'person_delete' p.id %}" class="btn btn-sm btn-outline-danger">删除</a>
            </td>
        </tr>
        {% empty %}
        <tr><td colspan="3" class="text-center">暂无人员</td></tr>
        {% endfor %}
    </tbody>
</table>
{% endblock %}

person_form.html —— 新建/编辑人员

{% extends "app/base.html" %}
{% block title %}{
           { title }}{% endblock %}
{% block content %}
<h3 class="mb-4">{
           { title }}</h3>
<form method="post" novalidate>
    {% csrf_token %}
    {
           { form.non_field_errors }}
    <div class="form-group">
        {
           { form.name.label_tag }}{
           { form.name }}
        {
           { form.name.errors }}
    </div>
    <a href="{% url 'person_list' %}" class="btn btn-secondary">取消</a>
    <button type="submit" class="btn btn-success">确定</button>
</form>
{% endblock %}

person_confirm_delete.html —— 删除人员确认页

{% extends "app/base.html" %}
{% block title %}删除人员{% endblock %}
{% block content %}
<h3 class="mb-4">确认删除人员</h3>
<p>确定要删除 <b>{
           { object.name }}</b> 吗?</p>
<form method="post">{% csrf_token %}
    <a href="{% url 'person_list' %}" class="btn btn-secondary">取消</a>
    <button type="submit" class="btn btn-danger">确定删除</button>
</form>
{% endblock %}

六、测试工程师如何高效利用和扩展本系统?

自动化与回溯性:所有任务、模型、人员均有“创建/修改时间”,方便测试人员定位历史配置和责任归属。
异步任务高并发:Celery 支持高并发队列,适合大量大模型调用、批量回归、长耗时推理等测试场景。
多模型多人员灵活扩展:轻松新增模型、切换 API Key/URL,支持多人协作和权限细分。
表单约束和错误反馈:所有必填项均有校验,数据不易出错。
易二次开发

可加定时任务(Celery Beat)、接口调用日志、任务重试等
支持权限系统(Django 用户体系)、API 化、前端框架升级等
支持大模型调用真实 API(只需替换 Celery 任务中的伪代码)


七、系统部署与运行

迁移数据库

python manage.py makemigrations
python manage.py migrate

创建管理员用户(可选)

python manage.py createsuperuser

启动 Django 服务

python manage.py runserver

启动 Celery Worker

celery -A bigmodel_proj worker -l INFO eventlet

八、结语

本系统架构清晰、模块分明,是学习 Django 多表关系、Celery 异步任务、前后端基础交互的极佳范例。无论你是自动化测试工程师还是企业中后台开发者,都能据此快速搭建自己的大模型任务平台,并灵活扩展、集成各种业务模块。

如需进一步拓展 API、权限、日志等功能,只需在此基础上增量开发即可!

觉得有用,欢迎收藏、点赞、转发!有任何技术难题欢迎留言交流!

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容