跳至主要內容

YeeOnlineJudge 接口文档

游日山原创大约 40 分钟

认证接口

提示

在请求除 AllowAny 和 IsAuthenticatedOrReadOnly 这两种权限的接口可以在 Header 部分不携带 Bearer Token,请求其余权限的接口请在 Header 中携带 Bearer Token。

{
    ...
    Authorization: Bearer <access_token>,
    ...
}

否则会出现 403 Forbidden ,Token 中含有当前用户的信息,用于鉴权。

JWT-Token 获取 - AllowAny

/api/login/ POST

接口使用

发送带有 usernamepassword 的信息来获取 Access Token 用于验证和 Refresh Token 用于获取新 Token。

{
    "username": "10010110",
    "password": "admin"
}

成功返回 200 OK

{
    "refresh": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImV4cCI6MTY3OTQxMDY3NCwiaWF0IjoxNjc5MzI0Mjc0LCJqdGkiOiJiMzNiNDIyYjM2Njg0YmUyODc4ZGM2OWMxNWQ3MmI5ZiIsInVzZXJfaWQiOiIxMDAxMDExMCJ9.jY65pN2ER1e8PcKhxRqTX6FRFC6I_Kr7vvJ0l4wNU20",
    "access": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNjc5NDEwNjc0LCJpYXQiOjE2NzkzMjQyNzQsImp0aSI6IjRiNDU4YmQ1MTA0ODQ2NjBhYzE4NWIyMzQ1ZDVhNjNiIiwidXNlcl9pZCI6IjEwMDEwMTEwIn0.Mg1kSMS-4bs_SVKi--LMXoK3iexcZIbiyFAQ1lC5o6M"
}

JWT-Token 刷新 - AllowAny

/api/login/refresh/ POST

接口使用

发送带有 Refresh Token 的信息来获取新的 Access Token 用于验证和 Refresh Token 用于获取新 Token。

{
    "refresh": "<refresh_token>"
}

成功返回 200 OK

{
    "access": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNjc5NDkwMTI1LCJpYXQiOjE2Nzk0MDM3MTcsImp0aSI6ImEwYTU1NjFjN2VhZjQxOWQ5NjhiNDQ3ZDMxMGQ5NzVlIiwidXNlcl9pZCI6IjEwMDEwMTEwIn0.nO_LWhNlmVDAlOqJr0TnorDrTw69d9f9PpftU4S7KTk",
    "refresh": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImV4cCI6MTY3OTQ5MDEyNSwiaWF0IjoxNjc5NDAzNzI1LCJqdGkiOiJmMGEyNTE1ZWRjNjE0YWMwODg4YWFhYmQ4MjA3OTk2NyIsInVzZXJfaWQiOiIxMDAxMDExMCJ9.cwUa060qLQrHrzYTJzaqIEu1pvIBUhk4nrWemGAIWMk"
}

JWT-Token 验证 - AllowAny

/api/login/verify/ POST

接口使用

发送带有 Access Token 的信息来验证 Token 是否有效。

{
    "token": "<access_token>"
}

成功返回 200 OK

{}

JWT-Token 销毁 - AllowAny

/api/login/blacklist/ POST

接口使用

发送带有 Refresh Token 的信息来销毁 Token。

{
    "refresh": "<refresh_token>"
}

成功返回 200 OK

{}

Query Parameter 和 Filter Parameter 的使用

提示

用户排名为例:

在排名中查询 username10010110 的用户。

GET http://127.0.0.1:8000/api/org/rank?search=10010110

在排名中查询属于 Group.name 中含有 te 的用户。

GET http://127.0.0.1:8000/api/org/rank?search=te

在排名中查询属于 Group.name 中含有 teusername1234567890000 的用户。

GET http://127.0.0.1:8000/api/org/rank?search=te,1234567890000

排名根据 UserProfile.statistics.Accepted 升序排序。

GET http://127.0.0.1:8000/api/org/rank?ordering=profile__statistics__Accepted

排名根据 UserProfile.statistics.Accepted 倒序排序。

GET http://127.0.0.1:8000/api/org/rank?ordering=-profile__statistics__Accepted

排名根据 UserProfile.statistics.Accepted 升序排序再按 UserProfile.statistics.Commit 倒序排序。

GET http://127.0.0.1:8000/api/org/rank?ordering=profile__statistics__Accepted,-profile__statistics__Commit

在排名中查询属于 Group.name 中含有 teusername1234567890000 的用户,根据 UserProfile.statistics.Accepted 升序排序再按 UserProfile.statistics.Commit 倒序排序。

GET http://127.0.0.1:8000/api/org/rank?search=te,1234567890000&ordering=profile__statistics__Accepted,-profile__statistics__Commit

前台接口

Organization

用户

用户注册 - AllowAny

/api/org/register/ POST

接口使用

使用 form-data 按以下字段来创建用户。

字段名样例参数必填说明
username1234567890000工号/学号
nickname先辈昵称
passwordtest密码
real_name田所浩二真名
emailexample@qq.com电子邮件
grouptest所在组(班级)
avatarFILE头像文件
bioWRRYYYYYYYYYYYYYY!格言

成功返回 201 Created

{
    "username": "1234567890000",
    "nickname": "先辈",
    "real_name": "田所浩二",
    "email": "example@qq.com",
    "date_joined": "2023-03-21T21:49:01.970028",
    "profile": {
        "group": {
            "id": 2,
            "name": "test"
        },
        "statistics": {
            "Commit": 0,
            "Accepted": 0,
            "In Queue": 0,
            "Processing": 0,
            "Wrong Answer": 0,
            "Runtime Error": 0,
            "Internal Error": 0,
            "Compilation Error": 0,
            "Exec Format Error": 0,
            "Time Limit Exceeded": 0
        },
        "avatar": "/media/avatar/default.jpg",
        "bio": null
    }
}

警告

  1. username 必须为 8-13 位数字。
  2. group 的组必须存在。

查看用户 - IsAuthenticatedOrReadOnly

/api/org/user/{username}/ GET

接口使用

使用 username 来查看用户信息。

GET http://127.0.0.1:8000/api/org/user/1234567890000/

成功返回 200 OK

{
    "username": "1234567890000",
    "nickname": "先辈",
    "real_name": "田所浩二",
    "email": "example@qq.com",
    "date_joined": "2023-03-21T22:15:28.482492",
    "profile": {
        "group": {
            "id": 2,
            "name": "test"
        },
        "statistics": {
            "Commit": 0,
            "Accepted": 0,
            "In Queue": 0,
            "Processing": 0,
            "Wrong Answer": 0,
            "Runtime Error": 0,
            "Internal Error": 0,
            "Compilation Error": 0,
            "Exec Format Error": 0,
            "Time Limit Exceeded": 0
        },
        "avatar": "http://127.0.0.1:8000/media/avatar/default.jpg",
        "bio": null
    }
}

修改当前用户 - IsAuthenticatedOrReadOnly

/api/org/user/{username}/ PUT

接口使用

使用 username 来修改当前用户信息。

PUT http://127.0.0.1:8000/api/org/user/1234567890000/
{
    "nickname": "型最精彩",
    "real_name": "赵七",
    "email": "example@example.com",
    "profile": {
        "bio": "小子张o",
        "group": "test"
    }
}

成功返回 200 OK

{
    "username": "1234567890000",
    "nickname": "型最精彩",
    "real_name": "赵七",
    "email": "example@example.com",
    "date_joined": "2023-03-21T22:49:26.753120",
    "profile": {
        "group": {
            "id": 2,
            "name": "test"
        },
        "statistics": {
            "Commit": 0,
            "Accepted": 0,
            "In Queue": 0,
            "Processing": 0,
            "Wrong Answer": 0,
            "Runtime Error": 0,
            "Internal Error": 0,
            "Compilation Error": 0,
            "Exec Format Error": 0,
            "Time Limit Exceeded": 0
        },
        "avatar": "http://127.0.0.1:8000/media/avatar/default.jpg",
        "bio": "小子张o"
    }
}

注意

  1. 只能对当前用户修改
  2. 修改密码和头像使用下方 PATCH 方式修改

修改当前用户 - IsAuthenticatedOrReadOnly

/api/org/user/{username}/ PATCH

接口使用

使用 form-data 按以下字段来修改密码和头像。

字段名样例参数必填说明
profile.avatarFILE头像
passwordtest新密码
old_pwdtest123如填写 password 则必填,否则非必填旧密码
PATCH http://127.0.0.1:8000/api/org/user/1234567890000/

成功返回 200 OK

{
    "username": "1234567890000",
    "nickname": "型最精彩",
    "real_name": "赵七",
    "email": "example@example.com",
    "date_joined": "2023-03-21T22:49:26.753120",
    "profile": {
        "group": {
            "id": 2,
            "name": "test"
        },
        "statistics": {
            "Commit": 0,
            "Accepted": 0,
            "In Queue": 0,
            "Processing": 0,
            "Wrong Answer": 0,
            "Runtime Error": 0,
            "Internal Error": 0,
            "Compilation Error": 0,
            "Exec Format Error": 0,
            "Time Limit Exceeded": 0
        },
        "avatar": "http://127.0.0.1:8000/media/avatar/default.jpg",
        "bio": "小子张o"
    }
}

用户排名 - IsAuthenticatedOrReadOnly

/api/org/rank/ GET

接口使用

通过请求来获取用户排名。

GET http://127.0.0.1:8000/api/org/rank/

Query Parameter 支持参数

参数查询方式对应实体字段
用户名精确查询User.username
组名模糊查询Group.nameopen in new window

Filter Parameter 支持参数

参数对应实体字段排序字段
正确量UserProfile.statistics.Acceptedprofile__statistics__Accepted
提交量UserProfile.statistics.Commitprofile__statistics__Commit

成功返回 200 OK

{
    "count": 3,  // 数据条目数量。
    "next": null, // 下一页链接。
    "previous": null,  // 上一页链接。
    "results": [  // 结果集。
        {
            "username": "10010110",
            "nickname": "",
            "profile": {
                "group": {
                    "id": 1,
                    "name": "管理组"
                },
                "avatar": "http://127.0.0.1:8000/media/avatar/default.jpg",
                "statistics": {
                    "Commit": 0,
                    "Accepted": 0,
                    "In Queue": 0,
                    "Processing": 0,
                    "Wrong Answer": 0,
                    "Runtime Error": 0,
                    "Internal Error": 0,
                    "Compilation Error": 0,
                    "Exec Format Error": 0,
                    "Time Limit Exceeded": 0
                }
            }
        },
        ...
    ]
}

组(班级)

查看组(班级)详情 - AllowAny

/api/org/group/{id}/ GET

接口使用

使用 Group 的 id 来获取组(班级)详情。

GET http://127.0.0.1:8000/api/org/group/2/

成功返回 200 OK

{
    "id": 2,
    "users": [
        {
            "user": "1234567890000",
            "avatar": "http://127.0.0.1:8000/media/avatar/default.jpg"
        },
        ...
    ],
    "name": "test"
}

Problem

题目

题目列表 - AllowAny

/api/prm/problem/ GET

接口使用

通过请求来获取题目列表。

Query Parameter 支持参数

参数查询方式对应实体字段
难度精确查询Problem.difficulty
题目模糊查询Problem.title
标签名称模糊查询ProblemTag.tag_name

成功返回 200 OK

{
    "count": 7,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": 1,
            "title": "循环",
            "difficulty": "Hard",
            "tags": [
                {
                    "id": 2,
                    "tag_name": "Test"
                },
                {
                    "id": 1,
                    "tag_name": "入门"
                }
            ],
            "statistics": {
                "Commit": 0,
                "Accepted": 0,
                "In Queue": 0,
                "Processing": 0,
                "Wrong Answer": 0,
                "Runtime Error": 0,
                "Internal Error": 0,
                "Compilation Error": 0,
                "Exec Format Error": 0,
                "Time Limit Exceeded": 0
            },
            "done": -1 // 是否做过:1 做对;0 做错;-1 没做过。
        },
        ...
    ]
}

题目详情 - AllowAny

/api/prm/problem/{id}/ GET

接口使用

使用 Problem 的 id 来获取题目详情。

GET http://127.0.0.1:8000/api/prm/problem/1/

成功返回 200 OK

{
    "id": 1,
    "title": "循环",
    "desc": "乐乐是一个聪明而又勤奋好学的孩子。他总喜欢探求事物的规律。一天,他突然对数的正整数次幂产生了兴趣。\n\n\n众所周知,$2$ 的正整数次幂最后一位数总是不断的在重复 $2,4,8,6,2,4,8,6…$ 我们说 $2$ 的正整数次幂最后一位的循环长度是 $4$(实际上 $4$ 的倍数都可以说是循环长度,但我们只考虑最小的循环长度)。类似的,其余的数字的正整数次幂最后一位数也有类似的循环现象:\n\n$$\n\\def\\arraystretch{1.5}\n\\begin{array}{c|c|c}\\hline\n\\textbf{数字}& \\textbf{循环} & \\textbf{循环长度} \\cr\\hline\\hline\n2 & 2,4,8,6 & 4\\cr\\hline\n3 & 3,9,7,1 & 4\\cr\\hline\n4 & 4,6 & 2\\cr\\hline\n5 & 5 &  1\\cr\\hline\n6 & 6 & 1\\cr\\hline\n7 & 7,9,3,1 & 4\\cr\\hline\n8 & 8,4,2,6 & 4\\cr\\hline\n9 & 9,1 & 2\\cr\\hline\n\\end{array}\n$$\n\n这时乐乐的问题就出来了:是不是只有最后一位才有这样的循环呢?对于一个整数 $n$ 的正整数次幂来说,它的后k位是否会发生循环?如果循环的话,循环长度是多少呢?\n\n注意:\n\n1. 如果 $n$ 的某个正整数次幂的位数不足 $k$,那么不足的高位看做是 $0$。\n2. 如果循环长度是 $L$,那么说明对于任意的正整数 $a$,$n$ 的 $a$ 次幂和 $a+L$ 次幂的最后 $k$ 位都相同。\n",
    "input_desc": "共一行,包含 $2$ 个整数 $n$ 和 $k$。$n$ 和 $k$ 之间用一个空格隔开,表示要求 $n$ 的正整数次幂的最后 $k$ 位的循环长度。",
    "output_desc": "一个整数,表示循环长度。如果循环不存在,输出 $-1$。",
    "sample": [
        {
            "input": "32 2",
            "output": "4"
        }
    ],
    "template": {
        "50": "int add(int a, int b) {\n  // Please fill this blank\n  return ___________;\n}\n",
        "62": "class Solution {\n    public int add(int a, int b) {\n        return _________;\n    }\n}\n"
    },
    "hint": "**【数据范围】**\n\n对于 $30 \\%$ 的数据,满足 $k \\le 4$;  \n对于$100 \\%$ 的数据,满足 $1 \\le n < {10}^{100}$,$1 \\le k \\le 100$。\n\n**【题目来源】**\n\nNOIP 2005 普及组第四题",
    "languages": [
        50,
        54,
        60,
        62,
        71
    ],
    "time_limit": 4096,
    "point": [
        {
            "point": "100",
            "input_name": "1.in",
            "output_name": "1.out"
        },
        {
            "point": "100",
            "input_name": "2.in",
            "output_name": "2.out"
        }
    ],
    "memory_limit": 48,
    "difficulty": "Hard",
    "tags": [
        {
            "id": 2,
            "tag_name": "Test"
        },
        {
            "id": 1,
            "tag_name": "入门"
        }
    ],
    "source": "YeeOnlineJudge",
    "statistics": {
        "Commit": 0,
        "Accepted": 0,
        "In Queue": 0,
        "Processing": 0,
        "Wrong Answer": 0,
        "Runtime Error": 0,
        "Internal Error": 0,
        "Compilation Error": 0,
        "Exec Format Error": 0,
        "Time Limit Exceeded": 0
    }
}

题目标签

题目标签列表 - AllowAny

/api/prm/tag/ GET

接口使用

通过请求来获取题目标签列表。

成功返回 200 OK

[
    {
        "id": 2,
        "tag_name": "Test"
    },
    ...
]

题目标签详情 - AllowAny

/api/prm/tag/{id}/ GET

接口使用

使用 ProblemTag 的 id 来获取题目标签详情。

GET http://127.0.0.1:8000/api/prm/tag/1/

成功返回 200 OK

{
    "id": 1,
    "tag_name": "入门"
}

Training

比赛训练

比赛练习列表 - IsAuthenticatedOrReadOnly

/api/train/training/ GET

接口使用

通过请求来获取比赛练习列表。

Query Parameter 支持参数

参数查询方式对应实体字段
标题模糊查询Training.title

Filter Parameter 支持参数

参数对应实体字段排序字段
开始时间Training.start_timestart_time

成功返回 200 OK

{
    "count": 1,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": 1,
            "title": "比赛#1",
            "created_time": "2023-03-22T22:45:04.658970",
            "is_open": true,
            "start_time": "2023-03-02T12:00:00",
            "end_time": "2023-04-01T12:00:00",
            "mode": "OI",
            "created_by": "10010110",
            "problems": [
                25,
                26,
                27,
                28,
                29
            ],
            "group": [], // 可免验证参加的组(班级)。
            "user": [] // 可免验证参加的用户。
        },
        ...
    ]
}

比赛练习详情 - IsAuthenticatedOrReadOnly

/api/train/training/{id}/ GET

接口使用

使用 Training 的 id 来获取比赛练习详情。

GET http://127.0.0.1:8000/api/train/training/1/

成功返回 200 OK

{
    "id": 1,
    "group": [],
    "user": [],
    "title": "比赛#1",
    "description": "比赛#1比赛#1比赛#1",
    "created_time": "2023-03-22T22:45:04.658970",
    "is_open": true,
    "start_time": "2023-03-02T12:00:00",
    "end_time": "2023-04-01T12:00:00",
    "mode": "OI",
    "created_by": "10010110",
    "problems": [
        {
            "id": 25,
            "title": "靶形数独",
            "difficulty": "Hard",
            "tags": [
                {
                    "id": 2,
                    "tag_name": "Test"
                },
                {
                    "id": 1,
                    "tag_name": "入门"
                }
            ],
            "statistics": {
                "Commit": 0,
                "Accepted": 0,
                "In Queue": 0,
                "Processing": 0,
                "Wrong Answer": 0,
                "Runtime Error": 0,
                "Internal Error": 0,
                "Compilation Error": 0,
                "Exec Format Error": 0,
                "Time Limit Exceeded": 0
            },
            "done": -1
        },
        ...
    ],
    "announcement": []
}

参加比赛练习 - IsAuthenticated

/api/train/training/verify/ POST

接口使用

使用带有 Training ID 和密码的请求即 idpassword 来获取参赛权限。

{
    "id": 1,
    "password": "123456"
}

成功返回 200 OK

{
    "detail": "ok"
}

比赛排名 - IsAuthenticated

/api/train/rank/{training_id}/ GET

接口使用

获取该训练比赛的排名情况。

GET http://127.0.0.1:8000/api/train/rank/1/

Filter Parameter 支持参数

参数对应实体字段排序字段
statistics 字段中的 scoreTrainingRank.statisticsstatistics__score
statistics 字段中的 statistics 下 AcceptedTrainingRank.statisticsstatistics__statistics__Accepted
statistics 字段中的 statistics 下 CommitTrainingRank.statisticsstatistics__statistics__Commit

成功返回 200 OK

{
    "count": 1,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": 1,
            "user": "root admin",
            "statistics": {
                "25": {
                    "0": true,
                    "1": true
                },
                "score": 200,
                "statistics": {
                    "Commit": 1,
                    "Accepted": 1,
                    "In Queue": 0,
                    "Processing": 0,
                    "Wrong Answer": 0,
                    "Runtime Error": 0,
                    "Internal Error": 0,
                    "Compilation Error": 0,
                    "Exec Format Error": 0,
                    "Time Limit Exceeded": 0
                }
            },
            "training": 1
        },
        ...
    ]
}

比赛提交列表 - IsAuthenticated

/api/train/sub/{training_id}/ GET

接口使用

获取该训练比赛的提交情况。

GET http://127.0.0.1:8000/api/train/sub/1/

Query Parameter 支持参数

参数查询方式对应实体字段
创建者模糊查询Submission.created_by
问题题目模糊查询Problem.title

Filter Parameter 支持参数

参数对应实体字段排序字段
提交时间Submission.created_timecreated_time

成功返回 200 OK

{
    "count": 1,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": 1,
            "created_by": "root admin",
            "language_id": 71,
            "status": "Accepted",
            "created_time": "2023-03-24T22:06:42.013440",
            "problem": {
                "id": 25,
                "title": "靶形数独"
            },
            "training": 1
        },
        ...
    ]
}

学习计划

学习计划列表 - IsAuthenticatedOrReadOnly

/api/train/plan/ GET

接口使用

请求返回学习计划列表。

Query Parameter 支持参数

参数查询方式对应实体字段
学习计划标题模糊查询LearningPlan.title

Filter Parameter 支持参数

参数对应实体字段排序字段
创建时间LearningPlan.created_timecreated_time

成功返回 200 OK

{
    "count": 1,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": 1,
            "title": "C语言学习",
            "description": "C语言学习,好好学习",
            "created_time": "2023-03-26T20:13:16.650457",
            "is_open": true,
            "ordering": [
                2,
                1
            ],
            "created_by": null,
            "stage": [
                {
                    "id": 1,
                    "title": "C循环",
                    "problems": [
                        {
                            "id": 1,
                            "title": "循环",
                            "difficulty": "Hard",
                            "tags": [
                                {
                                    "id": 2,
                                    "tag_name": "Test"
                                },
                                {
                                    "id": 1,
                                    "tag_name": "入门"
                                }
                            ],
                            "statistics": {
                                "Commit": 0,
                                "Accepted": 0,
                                "In Queue": 0,
                                "Processing": 0,
                                "Wrong Answer": 0,
                                "Runtime Error": 0,
                                "Internal Error": 0,
                                "Compilation Error": 0,
                                "Exec Format Error": 0,
                                "Time Limit Exceeded": 0
                            },
                            "done": -1
                        },
                        ...
                    ]
                },
                ...
            ]
        }
    ]
}

学习计划详情 - IsAuthenticatedOrReadOnly

/api/train/plan/{id}/ GET

接口使用

请求返回该学习计划详情。

GET http://127.0.0.1:8000/api/train/plan/1/

成功返回 200 OK

{
    "id": 1,
    "title": "C语言学习",
    "description": "C语言学习,好好学习",
    "created_time": "2023-03-26T20:13:16.650457",
    "is_open": true,
    "ordering": [
        2,
        1
    ],
    "created_by": null,
    "stage": [
        {
            "id": 1,
            "title": "C循环",
            "problems": [
                {
                    "id": 1,
                    "title": "循环",
                    "difficulty": "Hard",
                    "tags": [
                        {
                            "id": 2,
                            "tag_name": "Test"
                        },
                        {
                            "id": 1,
                            "tag_name": "入门"
                        }
                    ],
                    "statistics": {
                        "Commit": 0,
                        "Accepted": 0,
                        "In Queue": 0,
                        "Processing": 0,
                        "Wrong Answer": 0,
                        "Runtime Error": 0,
                        "Internal Error": 0,
                        "Compilation Error": 0,
                        "Exec Format Error": 0,
                        "Time Limit Exceeded": 0
                    },
                    "done": -1
                },
                ...
            ]
        },
        ...
    ]
}

Submission

支持语言列表 - AllowAny

/api/sub/language/ GET

接口使用

请求返回 OnlineJudge 所支持的提交语言。

成功返回 200 OK

{
    // "language_id": "language_name"
    "45": "Assembly (NASM 2.14.02)",
    "46": "Bash (5.0.0)",
    "47": "Basic (FBC 1.07.1)",
    "75": "C (Clang 7.0.1)",
    "76": "C++ (Clang 7.0.1)",
    "48": "C (GCC 7.4.0)",
    "52": "C++ (GCC 7.4.0)",
    "49": "C (GCC 8.3.0)",
    "53": "C++ (GCC 8.3.0)",
    "50": "C (GCC 9.2.0)",
    "54": "C++ (GCC 9.2.0)",
    "86": "Clojure (1.10.1)",
    "51": "C# (Mono 6.6.0.161)",
    "77": "COBOL (GnuCOBOL 2.2)",
    "55": "Common Lisp (SBCL 2.0.0)",
    "56": "D (DMD 2.089.1)",
    "57": "Elixir (1.9.4)",
    "58": "Erlang (OTP 22.2)",
    "44": "Executable",
    "87": "F# (.NET Core SDK 3.1.202)",
    "59": "Fortran (GFortran 9.2.0)",
    "60": "Go (1.13.5)",
    "88": "Groovy (3.0.3)",
    "61": "Haskell (GHC 8.8.1)",
    "62": "Java (OpenJDK 13.0.1)",
    "63": "JavaScript (Node.js 12.14.0)",
    "78": "Kotlin (1.3.70)",
    "64": "Lua (5.3.5)",
    "89": "Multi-file program",
    "79": "Objective-C (Clang 7.0.1)",
    "65": "OCaml (4.09.0)",
    "66": "Octave (5.1.0)",
    "67": "Pascal (FPC 3.0.4)",
    "85": "Perl (5.28.1)",
    "68": "PHP (7.4.1)",
    "43": "Plain Text",
    "69": "Prolog (GNU Prolog 1.4.5)",
    "70": "Python (2.7.17)",
    "71": "Python (3.8.1)",
    "80": "R (4.0.0)",
    "72": "Ruby (2.7.0)",
    "73": "Rust (1.40.0)",
    "81": "Scala (2.13.2)",
    "82": "SQL (SQLite 3.27.2)",
    "83": "Swift (5.2.3)",
    "74": "TypeScript (3.7.4)",
    "84": "Visual Basic.Net (vbnc 0.0.0.5943)"
}

创建提交 - IsAuthenticatedOrReadOnly

/api/sub/submission/ POST

接口使用

通过以下请求数据来创建提交。

{
    "problem": 25,
    "code": "while True:\n    try:\n        A = list(map(int, input().split(\" \")))\n        print(sum(A))\n    except:\n        break",
    "language_id": 71
    /*
    "stdin": "1 2",
    "expected_output": "3", // 此两项为测试提交,不计入提交列表,用于测试,都为非必填。
    "training": 1, // 如提交此字段,则为训练比赛提交,值为 Training 的 `id` ,非必填。
    */
}

成功返回 201 Created

{
    "id": 2,
    "created_by": "root admin",
    "token": [],
    "code": "while True:\n    try:\n        A = list(map(int, input().split(\" \")))\n        print(sum(A))\n    except:\n        break",
    "language_id": 71,
    "status": "In Queue",
    "created_time": "2023-03-27T22:06:21.736644",
    "submit_ip": "39.154.0.251",
    "problem": {
        "id": 25,
        "title": "靶形数独"
    },
    "training": null
}

提交列表 - IsAuthenticatedOrReadOnly

/api/sub/submission/ GET

接口使用

请求返回不属于任何训练比赛的提交列表。

Query Parameter 支持参数

参数查询方式对应实体字段
提交者的 username模糊查询User.username
题目标题模糊查询Problem.title

Filter Parameter 支持参数

参数对应实体字段排序字段
提交时间Submission.created_timecreated_time

成功返回 200 OK

{
    "count": 1,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": 2,
            "created_by": "root admin",
            "language_id": 71,
            "status": "Accepted",
            "created_time": "2023-03-27T22:06:21.736644",
            "problem": {
                "id": 25,
                "title": "靶形数独"
            },
            "training": null
        },
        ...
    ]
}

提交详情 - IsAuthenticatedOrReadOnly

/api/sub/submission/{sub_id}/ GET

接口使用

请求返回不属于任何训练比赛的提交详情。

GET http://127.0.0.1:8000/api/sub/submission/2/

成功返回 200 OK

{
    "id": 2,
    "created_by": "root admin",
    "token": [
        "940254f7-58e9-4ae3-8cda-ed13b3a14ea3",
        "10ed2967-bc99-462a-b44d-600c7a311965"
    ],// 测试样例提交到 Judger 的 Token
    "code": "while True:\n    try:\n        A = list(map(int, input().split(\" \")))\n        print(sum(A))\n    except:\n        break",
    "language_id": 71,
    "status": "Accepted",
    "created_time": "2023-03-27T22:06:21.736644",
    "submit_ip": "39.154.0.251",
    "problem": {
        "id": 25,
        "title": "靶形数独"
    },
    "training": null
}

Announcement

公告列表 - AllowAny

/api/ann/ GET

接口使用

请求返回不属于任何训练比赛的公告列表。

Query Parameter 支持参数

参数查询方式对应实体字段
公告标题模糊查询Announcement.title
公告内容模糊查询Announcement.content

Filter Parameter 支持参数

参数对应实体字段排序字段
公告创建时间Announcement.created_timecreated_time

成功返回 200 OK

{
    "count": 1,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": 2,
            "title": "比赛测试公告",
            "content": "比赛测试公告测试公告测试公告测试公告测试公告测试公告测试公告测试公告测试公告",
            "created_time": "2023-03-26T19:43:22.762877",
            "last_update_time": "2023-03-26T19:43:22.762891",
            "training": null,
            "created_by": "10010110"
        },
        ...
    ]
}

公告详情 - IsAuthenticated

/api/ann/{id}/ GET

接口使用

请求返回不属于任何训练比赛的公告详情。

GET http://127.0.0.1:8000/api/ann/2/

成功返回 200 OK

{
    "id": 2,
    "title": "比赛测试公告",
    "content": "比赛测试公告测试公告测试公告测试公告测试公告测试公告测试公告测试公告测试公告",
    "created_time": "2023-03-26T19:43:22.762877",
    "last_update_time": "2023-03-26T19:43:22.762891",
    "training": null,
    "created_by": "10010110"
}

后台接口

Organization

用户

添加用户 - IsSuperAdmin

/api/org/admin/user/ POST

接口使用

通过以下请求数据来添加用户。

{
    "username": "12345678",
    "password": "12345678",
    "nickname": "Pose站抽",
    "email": "example@example.cn",
    "user_role": "STU",
    "user_permission": "NONE",
    "is_staff": false,
    "is_active": true,
    "is_superuser": false,
    "first_name": "四",
    "last_name": "马",
    "real_name": "马四",
    "profile": {
        "group": "test",
        "bio": "在卡西餐"
    }
}

成功返回 201 Created

{
    "username": "12345678",
    "profile": {
        "group": {
            "id": 2,
            "name": "test"
        },
        "statistics": {
            "Commit": 0,
            "In Queue": 0,
            "Processing": 0,
            "Accepted": 0,
            "Wrong Answer": 0,
            "Time Limit Exceeded": 0,
            "Compilation Error": 0,
            "Runtime Error": 0,
            "Internal Error": 0,
            "Exec Format Error": 0
        },
        "avatar": "http://127.0.0.1:8000/media/avatar/default.jpg",
        "bio": "在卡西餐"
    },
    "last_login": null,
    "nickname": "Pose站抽",
    "is_staff": false,
    "is_active": true,
    "is_superuser": false,
    "real_name": "马四",
    "email": "example@example.cn",
    "user_role": "STU",
    "user_permission": "NONE",
    "date_joined": "2023-03-28T21:27:59.820464",
    "last_login_ip": null
}

用户列表 - IsSuperAdmin

/api/org/admin/user/ GET

接口使用

请求返回用户列表。

Query Parameter 支持参数

参数查询方式对应实体字段
用户名模糊查询User.username
昵称模糊查询User.nickname
电子邮件模糊查询User.email
用户角色模糊查询User.user_role
是否工作人员模糊查询User.is_staff
是否超管模糊查询User.is_superuser

Filter Parameter 支持参数

参数对应实体字段排序字段
用户名User.usernameusername
创建日期User.created_timedate_joined

成功返回 200 OK

{
    "count": 2,
    "next": null,
    "previous": null,
    "results": [
        {
            "username": "10010110",
            "nickname": "",
            "email": "admin@moorlands.cn",
            "user_role": "TEC",
            "is_staff": true,
            "is_superuser": true,
            "profile": {
                "group": {
                    "id": 1,
                    "name": "管理组"
                },
                "avatar": "http://127.0.0.1:8000/media/avatar/default.jpg"
            }
        },
        ...
    ]
}

用户详情 - IsSuperAdmin

/api/org/admin/user/{username}/ GET

接口使用

请求返回用户详情。

GET http://127.0.0.1:8000/api/org/admin/user/10010110/

成功返回 200 OK

{
    "username": "10010110",
    "profile": {
        "group": {
            "id": 1,
            "name": "管理组"
        },
        "statistics": {
            "Commit": 2,
            "Accepted": 1,
            "In Queue": 0,
            "Processing": 0,
            "Wrong Answer": 0,
            "Runtime Error": 0,
            "Internal Error": 0,
            "Compilation Error": 0,
            "Exec Format Error": 0,
            "Time Limit Exceeded": 0
        },
        "avatar": "http://127.0.0.1:8000/media/avatar/default.jpg",
        "bio": null
    },
    "last_login": "2023-03-27T22:06:19.280161",
    "nickname": "",
    "is_staff": true,
    "is_active": true,
    "is_superuser": true,
    "real_name": "root admin",
    "email": "admin@moorlands.cn",
    "user_role": "TEC",
    "user_permission": "ALL",
    "date_joined": "2023-03-05T16:49:23.074555",
    "last_login_ip": "39.154.0.251"
}

修改用户 - IsSuperAdmin

/api/org/admin/user/{username}/ PUT

接口使用

使用 username 来修改用户信息。

PUT http://127.0.0.1:8000/api/org/admin/user/12345678/
{
    "username": "12345678",
    "password": "123456789",
    "profile": {
        "group": "test",
        "bio": "指南资讯"
    },
    "nickname": "最新跟单",
    "is_staff": false,
    "is_active": true,
    "is_superuser": false,
    "first_name": "五",
    "last_name": "王",
    "real_name": "王五",
    "email": "examples@example.cn",
    "user_role": "STU",
    "user_permission": "NONE"
}

成功返回 200 OK

{
    "username": "12345678",
    "profile": {
        "group": {
            "id": 2,
            "name": "test"
        },
        "statistics": {
            "Commit": 0,
            "Accepted": 0,
            "In Queue": 0,
            "Processing": 0,
            "Wrong Answer": 0,
            "Runtime Error": 0,
            "Internal Error": 0,
            "Compilation Error": 0,
            "Exec Format Error": 0,
            "Time Limit Exceeded": 0
        },
        "avatar": "http://127.0.0.1:8000/media/avatar/default.jpg",
        "bio": "指南资讯"
    },
    "last_login": null,
    "nickname": "最新跟单",
    "is_staff": false,
    "is_active": true,
    "is_superuser": false,
    "real_name": "王五",
    "email": "examples@example.cn",
    "user_role": "STU",
    "user_permission": "NONE",
    "date_joined": "2023-03-28T21:27:59.820464",
    "last_login_ip": null
}

修改用户 - IsSuperAdmin

/api/org/admin/user/{username}/ PATCH

接口使用

使用 username 来部分修改用户信息。

PATCH http://127.0.0.1:8000/api/org/admin/user/12345678/
{
    "password": "test1234321"
}

成功返回 200 OK

{
    "username": "12345678",
    "profile": {
        "group": {
            "id": 2,
            "name": "test"
        },
        "statistics": {
            "Commit": 0,
            "Accepted": 0,
            "In Queue": 0,
            "Processing": 0,
            "Wrong Answer": 0,
            "Runtime Error": 0,
            "Internal Error": 0,
            "Compilation Error": 0,
            "Exec Format Error": 0,
            "Time Limit Exceeded": 0
        },
        "avatar": "http://127.0.0.1:8000/media/avatar/default.jpg",
        "bio": "指南资讯"
    },
    "last_login": "2023-03-28T21:47:06.693061",
    "nickname": "最新跟单",
    "is_staff": false,
    "is_active": true,
    "is_superuser": false,
    "real_name": "王五",
    "email": "examples@example.cn",
    "user_role": "STU",
    "user_permission": "NONE",
    "date_joined": "2023-03-28T21:27:59.820464",
    "last_login_ip": "220.195.74.195"
}

删除用户 - IsSuperAdmin

/api/org/admin/user/{username}/ DELETE

接口使用

请求来删除用户。

DELETE http://127.0.0.1:8000/api/org/admin/user/12345678/

成功返回 204 No Content

批量添加用户 - IsSuperAdmin

/api/org/admin/userbatch/ POST

接口使用

通过以下请求数据来批量添加用户。

{
    "prefix": "v12",
    "suffix": "q",
    "user_num": 10,
    "group": "BatchUser", // 不用提前创建该组(班级)
    "output_file": true // 为 true 则返回 CSV 文件,反之返回 json 数据
}

成功返回返回 CSV 文件或返回 json 数据。

{
    "detail": {
        "v12_PIq9AOt_q": "n6GU1dxJSLJ3WxMo",
        "v12_H3k7tMa_q": "RiwCurPsWJAEw1f8",
        "v12_mGWf9Fd_q": "PifZySateUJelUb9",
        "v12_75UnkUw_q": "tvTaQ0TeEcxIZvFh",
        "v12_lqem1BD_q": "YuaFTcvkBzmHBR78",
        "v12_KZaUhZq_q": "EOnaQtgWUkDROt7m",
        "v12_Jw2K3qq_q": "M4TCUgt89QZkYMHC",
        "v12_EOiOYSk_q": "HB8nkkwGmCLcOil3",
        "v12_AU7zqdu_q": "ZIKPK6v4IEI48p1p",
        "v12_Ir3Eq2R_q": "gW6Tc7McXVXHCRrN"
    }
}

组(班级)

创建组(班级) - IsSuperAdmin

/api/org/admin/group/ POST

接口使用

通过以下请求数据来创建组(班级)。

{
    "name": "test"
}

成功返回 201 Created

{
    "id": 2,
    "users": [],
    "name": "test"
}

组(班级)列表 - IsSuperAdmin

/api/org/admin/group/ GET

接口使用

请求返回组(班级)列表。

Query Parameter 支持参数

参数查询方式对应实体字段
组(班级)名称模糊查询Group.nameopen in new window
用户名模糊查询User.username

成功返回 200 OK

{
    "count": 3,
    "next": null,
    "previous": null,
    "results": [
        ...
        {
            "id": 3,
            "users": [
                {
                    "user": "v12_PIq9AOt_q",
                    "avatar": "http://127.0.0.1:8000/media/avatar/default.jpg"
                },
                ...
            ],
            "name": "BatchUser"
        },
        ...
    ]
}

组(班级)详情 - IsSuperAdmin

/api/org/admin/group/{id}/ GET

接口使用

请求返回组(班级)详情。

GET http://127.0.0.1:8000/api/org/admin/group/3/

成功返回 200 OK

{
    "id": 3,
    "users": [
        {
            "user": "v12_PIq9AOt_q",
            "avatar": "http://127.0.0.1:8000/media/avatar/default.jpg"
        },
        ...
    ],
    "name": "BatchUser"
}

修改组(班级) - IsSuperAdmin

/api/org/admin/group/{id}/ PUT

接口使用

使用 Group 的 id 来修改组(班级)信息。

PUT http://127.0.0.1:8000/api/org/admin/group/3/
{
    "name": "批量产生"
}

成功返回 200 OK

{
    "id": 3,
    "users": [
        {
            "user": "v12_PIq9AOt_q",
            "avatar": "http://127.0.0.1:8000/media/avatar/default.jpg"
        },
        ...
    ],
    "name": "批量产生"
}

删除组(班级) - IsSuperAdmin

/api/org/admin/group/{id}/ DELETE

接口使用

请求来删除组(班级)。

DELETE http://127.0.0.1:8000/api/org/admin/group/3/

成功返回 204 No Content

删除的组(班级)下存在用户则无法删除。

Problem

测试样例

上传测试样例 - IsStaff

/api/prm/admin/test_case/ POST

接口使用

使用 form-data 按以下字段来上传测试样例。

字段名样例参数必填说明
fileFILE测试样例文件

成功返回 201 Created

{
    "id": 2,
    "file": "http://127.0.0.1:8000/media/test_case/add-example1_aL2SWau.zip",
    "created_time": "2023-03-29T21:58:58.072573",
    "struct": [
        {
            "input_name": "1.in",
            "output_name": "1.out"
        },
        {
            "input_name": "2.in",
            "output_name": "2.out"
        }
    ]
}

注意

请按以下目录结构打包测试样例,否则会验证错误,一个 in 对应一个 out

add-example1
├── 1.in
├── 1.out
├── 2.in
└── 2.out

测试样例列表 - IsStaff

/api/prm/admin/test_case/ GET

接口使用

请求返回测试样例列表。

成功返回 200 OK

{
    "count": 2,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": 1,
            "file": "http://127.0.0.1:8000/media/test_case/add-example1.zip",
            "created_time": "2023-03-05T16:51:15.161915",
            "struct": [
                {
                    "input_name": "1.in",
                    "output_name": "1.out"
                },
                {
                    "input_name": "2.in",
                    "output_name": "2.out"
                }
            ]
        },
        ...
    ]
}

删除测试样例 - IsStaff

/api/prm/admin/test_case/{id}/ DELETE

接口使用

请求来删除测试样例。

DELETE http://127.0.0.1:8000/api/prm/admin/test_case/2/

成功返回 204 No Content

删除的测试样例有被题目所引用则无法删除。

题目标签

添加题目标签 - IsStaff

/api/prm/admin/tag/ POST

接口使用

通过以下请求数据来添加题目标签。

{
    "tag_name": "入门"
}

成功返回 201 Created

{
    "id": 1,
    "tag_name": "入门"
}

题目标签列表 - IsStaff

/api/prm/admin/tag/ GET

接口使用

请求返回题目标签列表。

成功返回 200 OK ,默认按照 tag_name 排序。

[
    {
        "id": 2,
        "tag_name": "Test"
    },
    {
        "id": 3,
        "tag_name": "Tt"
    },
    {
        "id": 1,
        "tag_name": "入门"
    }
]

题目标签详情 - IsStaff

/api/prm/admin/tag/{id}/ GET

接口使用

请求返回题目标签详情。

GET http://127.0.0.1:8000/api/prm/admin/tag/1/

成功返回 200 OK

{
    "id": 1,
    "tag_name": "入门"
}

修改题目标签 - IsStaff

/api/prm/admin/tag/{id}/ PUT

接口使用

使用 ProblemTag 的 id 来修改题目标签。

PUT http://127.0.0.1:8000/api/prm/admin/tag/3/
{
    "tag_name": "balabala"
}

成功返回 200 OK

{
    "id": 3,
    "tag_name": "balabala"
}

删除题目标签 - IsStaff

/api/prm/admin/tag/{id}/ DELETE

接口使用

请求来删除题目标签。

DELETE http://127.0.0.1:8000/api/prm/admin/tag/3/

成功返回 204 No Content

题目

添加题目 - IsStaff

/api/prm/admin/problem/ POST

接口使用

通过以下请求数据来添加题目。

{
    "title": "求A+B的和",
    "desc": "入门题目,给定a和b,求a+b的值",
    "input_desc": "a为整数,b为整数",
    "output_desc": "输出a+b的值",
    "sample": [
        {"input": "1 2\n3 4\n", "output": "3\n7\n"}, 
        {"input": "0 2\n-1 4\n", "output": "2\n3\n"}
    ],
    "hint": "……",
    "languages": [50, 54, 60, 62, 71],
    "template": {
        "62": "//PREPEND BEGIN\nimport java.util.Scanner;\n//PREPEND END\n\n//TEMPLATE BEGIN\nclass Solution {\n    public int add(int a, int b) {\n        return _________;\n    }\n}\n//TEMPLATE END\n\n//APPEND BEGIN\npublic class Main {\n    public static void main(String[] args) {\n        Scanner scanner = new Scanner(System.in);\n        Solution solution = new Solution();\n        while (scanner.hasNext()) {\n            System.out.println(solution.add(scanner.nextInt(), scanner.nextInt()));\n        }\n    }\n}\n//APPEND END"
    },
    "time_limit": 4096,
    "memory_limit": 48,
    "difficulty": "Easy",
    "mode": "OI",
    "is_public": true,
    "tags": [3, 2],
    "source": "YeeOnlineJudge",
    "visible": true,
    "test_case": 1,
    "point": [
        {
            "input_name": "1.in",
            "output_name": "1.out",
            "point": "100"
        },
        {
            "input_name": "2.in",
            "output_name": "2.out",
            "point": "100"
        }
    ]
}

成功返回 201 Created

{
    "id": 50,
    "tags": [
        {
            "id": 2,
            "tag_name": "Test"
        },
        {
            "id": 3,
            "tag_name": "balabala"
        }
    ],
    "title": "求A+B的和",
    "desc": "入门题目,给定a和b,求a+b的值",
    "input_desc": "a为整数,b为整数",
    "output_desc": "输出a+b的值",
    "sample": [
        {
            "input": "1 2\n3 4\n",
            "output": "3\n7\n"
        },
        {
            "input": "0 2\n-1 4\n",
            "output": "2\n3\n"
        }
    ],
    "template": {
        "62": "//PREPEND BEGIN\nimport java.util.Scanner;\n//PREPEND END\n\n//TEMPLATE BEGIN\nclass Solution {\n    public int add(int a, int b) {\n        return _________;\n    }\n}\n//TEMPLATE END\n\n//APPEND BEGIN\npublic class Main {\n    public static void main(String[] args) {\n        Scanner scanner = new Scanner(System.in);\n        Solution solution = new Solution();\n        while (scanner.hasNext()) {\n            System.out.println(solution.add(scanner.nextInt(), scanner.nextInt()));\n        }\n    }\n}\n//APPEND END"
    },
    "hint": "……",
    "languages": [
        50,
        54,
        60,
        62,
        71
    ],
    "time_limit": 4096,
    "memory_limit": 48,
    "difficulty": "Easy",
    "mode": "ACM",
    "point": [
        {
            "input_name": "1.in",
            "output_name": "1.out",
            "point": "100"
        },
        {
            "input_name": "2.in",
            "output_name": "2.out",
            "point": "100"
        }
    ],
    "is_public": true,
    "source": "YeeOnlineJudge",
    "visible": true,
    "created_time": "2023-04-03T21:50:48.850798",
    "last_update_time": "2023-04-03T21:50:48.850813",
    "statistics": {
        "Commit": 0,
        "In Queue": 0,
        "Processing": 0,
        "Accepted": 0,
        "Wrong Answer": 0,
        "Time Limit Exceeded": 0,
        "Compilation Error": 0,
        "Runtime Error": 0,
        "Internal Error": 0,
        "Exec Format Error": 0
    },
    "test_case": 1,
    "created_by": "10010110"
}

题目列表 - IsStaff

/api/prm/admin/problem/ GET

接口使用

请求返回题目列表。

Query Parameter 支持参数

参数查询方式对应实体字段
难度精确查询Problem.difficulty
题目标题模糊查询Problem.title
题目标签模糊查询ProblemTag.tag_name

成功返回 200 OK

{
    "count": 50,
    "next": "http://127.0.0.1:8000/api/prm/admin/problem/?page=2",
    "previous": null,
    "results": [
        ...
        {
            "id": 2,
            "title": "谁拿了最多奖学金",
            "difficulty": "Easy",
            "tags": [
                {
                    "id": 2,
                    "tag_name": "Test"
                },
                {
                    "id": 1,
                    "tag_name": "入门"
                }
            ],
            "statistics": {
                "Commit": 0,
                "Accepted": 0,
                "In Queue": 0,
                "Processing": 0,
                "Wrong Answer": 0,
                "Runtime Error": 0,
                "Internal Error": 0,
                "Compilation Error": 0,
                "Exec Format Error": 0,
                "Time Limit Exceeded": 0
            },
            "done": -1
        },
        ...
    ]
}

题目列表(简洁) - IsStaff

/api/prm/admin/problem/all/ GET

接口使用

请求返回题目列表的简洁信息。

成功返回 200 OK

[
    ...
    {
        "id": 2,
        "title": "谁拿了最多奖学金"
    },
    ...
]

题目详情 - IsStaff

/api/prm/admin/problem/{id}/ GET

接口使用

请求返回题目详情。

GET http://127.0.0.1:8000/api/prm/admin/problem/1/

成功返回 200 OK

{
    "id": 1,
    "tags": [
        {
            "id": 2,
            "tag_name": "Test"
        },
        {
            "id": 1,
            "tag_name": "入门"
        }
    ],
    "title": "循环",
    "desc": "乐乐是一个聪明而又勤奋好学的孩子。他总喜欢探求事物的规律。一天,他突然对数的正整数次幂产生了兴趣。\n\n\n众所周知,$2$ 的正整数次幂最后一位数总是不断的在重复 $2,4,8,6,2,4,8,6…$ 我们说 $2$ 的正整数次幂最后一位的循环长度是 $4$(实际上 $4$ 的倍数都可以说是循环长度,但我们只考虑最小的循环长度)。类似的,其余的数字的正整数次幂最后一位数也有类似的循环现象:\n\n$$\n\\def\\arraystretch{1.5}\n\\begin{array}{c|c|c}\\hline\n\\textbf{数字}& \\textbf{循环} & \\textbf{循环长度} \\cr\\hline\\hline\n2 & 2,4,8,6 & 4\\cr\\hline\n3 & 3,9,7,1 & 4\\cr\\hline\n4 & 4,6 & 2\\cr\\hline\n5 & 5 &  1\\cr\\hline\n6 & 6 & 1\\cr\\hline\n7 & 7,9,3,1 & 4\\cr\\hline\n8 & 8,4,2,6 & 4\\cr\\hline\n9 & 9,1 & 2\\cr\\hline\n\\end{array}\n$$\n\n这时乐乐的问题就出来了:是不是只有最后一位才有这样的循环呢?对于一个整数 $n$ 的正整数次幂来说,它的后k位是否会发生循环?如果循环的话,循环长度是多少呢?\n\n注意:\n\n1. 如果 $n$ 的某个正整数次幂的位数不足 $k$,那么不足的高位看做是 $0$。\n2. 如果循环长度是 $L$,那么说明对于任意的正整数 $a$,$n$ 的 $a$ 次幂和 $a+L$ 次幂的最后 $k$ 位都相同。\n",
    "input_desc": "共一行,包含 $2$ 个整数 $n$ 和 $k$。$n$ 和 $k$ 之间用一个空格隔开,表示要求 $n$ 的正整数次幂的最后 $k$ 位的循环长度。",
    "output_desc": "一个整数,表示循环长度。如果循环不存在,输出 $-1$。",
    "sample": [
        {
            "input": "32 2",
            "output": "4"
        }
    ],
    "template": {
        "50": "//PREPEND BEGIN\n#include <stdio.h>\n//PREPEND END\n\n//TEMPLATE BEGIN\nint add(int a, int b) {\n  // Please fill this blank\n  return ___________;\n}\n//TEMPLATE END\n\n//APPEND BEGIN\nint main() {\n  printf(\"%d\", add(1, 2));\n  return 0;\n}\n//APPEND END",
        "62": "//PREPEND BEGIN\nimport java.util.Scanner;\n//PREPEND END\n\n//TEMPLATE BEGIN\nclass Solution {\n    public int add(int a, int b) {\n        return _________;\n    }\n}\n//TEMPLATE END\n\n//APPEND BEGIN\npublic class Main {\n    public static void main(String[] args) {\n        Scanner scanner = new Scanner(System.in);\n        Solution solution = new Solution();\n        while (scanner.hasNext()) {\n            System.out.println(solution.add(scanner.nextInt(), scanner.nextInt()));\n        }\n    }\n}\n//APPEND END"
    },
    "hint": "**【数据范围】**\n\n对于 $30 \\%$ 的数据,满足 $k \\le 4$;  \n对于$100 \\%$ 的数据,满足 $1 \\le n < {10}^{100}$,$1 \\le k \\le 100$。\n\n**【题目来源】**\n\nNOIP 2005 普及组第四题",
    "languages": [
        50,
        54,
        60,
        62,
        71
    ],
    "time_limit": 4096,
    "memory_limit": 48,
    "difficulty": "Hard",
    "mode": "ACM",
    "point": [
        {
            "point": "100",
            "input_name": "1.in",
            "output_name": "1.out"
        },
        {
            "point": "100",
            "input_name": "2.in",
            "output_name": "2.out"
        }
    ],
    "is_public": true,
    "source": "YeeOnlineJudge",
    "visible": true,
    "created_time": "2023-03-05T16:51:16.126009",
    "last_update_time": "2023-03-05T16:51:16.126024",
    "statistics": {
        "Commit": 0,
        "Accepted": 0,
        "In Queue": 0,
        "Processing": 0,
        "Wrong Answer": 0,
        "Runtime Error": 0,
        "Internal Error": 0,
        "Compilation Error": 0,
        "Exec Format Error": 0,
        "Time Limit Exceeded": 0
    },
    "test_case": 1,
    "created_by": "10010110"
}

修改题目 - IsStaff

/api/prm/admin/problem/{id}/ PUT

接口使用

使用 Problem 的 id 来修改题目。

PUT http://127.0.0.1:8000/api/prm/admin/problem/50/
{
    "id": "50",
    "tags": [1, 2],
    "title": "循环",
    "desc": "乐乐是一个聪明而又勤奋好学的孩子。他总喜欢探求事物的规律。一天,他突然对数的正整数次幂产生了兴趣。\n\n\n众所周知,$2$ 的正整数次幂最后一位数总是不断的在重复 $2,4,8,6,2,4,8,6…$ 我们说 $2$ 的正整数次幂最后一位的循环长度是 $4$(实际上 $4$ 的倍数都可以说是循环长度,但我们只考虑最小的循环长度)。类似的,其余的数字的正整数次幂最后一位数也有类似的循环现象:\n\n$$\n\\def\\arraystretch{1.5}\n\\begin{array}{c|c|c}\\hline\n\\textbf{数字}& \\textbf{循环} & \\textbf{循环长度} \\cr\\hline\\hline\n2 & 2,4,8,6 & 4\\cr\\hline\n3 & 3,9,7,1 & 4\\cr\\hline\n4 & 4,6 & 2\\cr\\hline\n5 & 5 &  1\\cr\\hline\n6 & 6 & 1\\cr\\hline\n7 & 7,9,3,1 & 4\\cr\\hline\n8 & 8,4,2,6 & 4\\cr\\hline\n9 & 9,1 & 2\\cr\\hline\n\\end{array}\n$$\n\n这时乐乐的问题就出来了:是不是只有最后一位才有这样的循环呢?对于一个整数 $n$ 的正整数次幂来说,它的后k位是否会发生循环?如果循环的话,循环长度是多少呢?\n\n注意:\n\n1. 如果 $n$ 的某个正整数次幂的位数不足 $k$,那么不足的高位看做是 $0$。\n2. 如果循环长度是 $L$,那么说明对于任意的正整数 $a$,$n$ 的 $a$ 次幂和 $a+L$ 次幂的最后 $k$ 位都相同。\n",
    "input_desc": "共一行,包含 $2$ 个整数 $n$ 和 $k$。$n$ 和 $k$ 之间用一个空格隔开,表示要求 $n$ 的正整数次幂的最后 $k$ 位的循环长度。",
    "output_desc": "一个整数,表示循环长度。如果循环不存在,输出 $-1$。",
    "sample": [
        {
            "input": "32 2",
            "output": "4"
        }
    ],
    "template": {
        "50": "……",
        "54": "……",
        "62": "……"
    },
    "hint": "**【数据范围】**\n\n对于 $30 \\%$ 的数据,满足 $k \\le 4$;  \n对于$100 \\%$ 的数据,满足 $1 \\le n < {10}^{100}$,$1 \\le k \\le 100$。\n\n**【题目来源】**\n\nNOIP 2005 普及组第四题",
    "languages": [
        50,
        54,
        60,
        62,
        71
    ],
    "time_limit": 4096,
    "memory_limit": 48,
    "difficulty": "Hard",
    "mode": "ACM",
    "point": [
        {
            "input_name": "1.in",
            "output_name": "1.out",
            "point": "100"
        },
        {
            "input_name": "2.in",
            "output_name": "2.out",
            "point": "100"
        }
    ],
    "is_public": true,
    "source": "YeeOnlineJudge",
    "visible": true,
    "test_case": 1
}

成功返回 200 OK

{
    "id": 50,
    "tags": [
        {
            "id": 2,
            "tag_name": "Test"
        },
        {
            "id": 1,
            "tag_name": "入门"
        }
    ],
    "title": "循环",
    "desc": "乐乐是一个聪明而又勤奋好学的孩子。他总喜欢探求事物的规律。一天,他突然对数的正整数次幂产生了兴趣。\n\n\n众所周知,$2$ 的正整数次幂最后一位数总是不断的在重复 $2,4,8,6,2,4,8,6…$ 我们说 $2$ 的正整数次幂最后一位的循环长度是 $4$(实际上 $4$ 的倍数都可以说是循环长度,但我们只考虑最小的循环长度)。类似的,其余的数字的正整数次幂最后一位数也有类似的循环现象:\n\n$$\n\\def\\arraystretch{1.5}\n\\begin{array}{c|c|c}\\hline\n\\textbf{数字}& \\textbf{循环} & \\textbf{循环长度} \\cr\\hline\\hline\n2 & 2,4,8,6 & 4\\cr\\hline\n3 & 3,9,7,1 & 4\\cr\\hline\n4 & 4,6 & 2\\cr\\hline\n5 & 5 &  1\\cr\\hline\n6 & 6 & 1\\cr\\hline\n7 & 7,9,3,1 & 4\\cr\\hline\n8 & 8,4,2,6 & 4\\cr\\hline\n9 & 9,1 & 2\\cr\\hline\n\\end{array}\n$$\n\n这时乐乐的问题就出来了:是不是只有最后一位才有这样的循环呢?对于一个整数 $n$ 的正整数次幂来说,它的后k位是否会发生循环?如果循环的话,循环长度是多少呢?\n\n注意:\n\n1. 如果 $n$ 的某个正整数次幂的位数不足 $k$,那么不足的高位看做是 $0$。\n2. 如果循环长度是 $L$,那么说明对于任意的正整数 $a$,$n$ 的 $a$ 次幂和 $a+L$ 次幂的最后 $k$ 位都相同。\n",
    "input_desc": "共一行,包含 $2$ 个整数 $n$ 和 $k$。$n$ 和 $k$ 之间用一个空格隔开,表示要求 $n$ 的正整数次幂的最后 $k$ 位的循环长度。",
    "output_desc": "一个整数,表示循环长度。如果循环不存在,输出 $-1$。",
    "sample": [
        {
            "input": "32 2",
            "output": "4"
        }
    ],
    "template": {
        "50": "……",
        "54": "……",
        "62": "……"
    },
    "hint": "**【数据范围】**\n\n对于 $30 \\%$ 的数据,满足 $k \\le 4$;  \n对于$100 \\%$ 的数据,满足 $1 \\le n < {10}^{100}$,$1 \\le k \\le 100$。\n\n**【题目来源】**\n\nNOIP 2005 普及组第四题",
    "languages": [
        50,
        54,
        60,
        62,
        71
    ],
    "time_limit": 4096,
    "memory_limit": 48,
    "difficulty": "Hard",
    "mode": "ACM",
    "point": [
        {
            "input_name": "1.in",
            "output_name": "1.out",
            "point": "100"
        },
        {
            "input_name": "2.in",
            "output_name": "2.out",
            "point": "100"
        }
    ],
    "is_public": true,
    "source": "YeeOnlineJudge",
    "visible": true,
    "created_time": "2023-04-03T21:50:48.850798",
    "last_update_time": "2023-04-03T22:20:57.642325",
    "statistics": {
        "Commit": 0,
        "Accepted": 0,
        "In Queue": 0,
        "Processing": 0,
        "Wrong Answer": 0,
        "Runtime Error": 0,
        "Internal Error": 0,
        "Compilation Error": 0,
        "Exec Format Error": 0,
        "Time Limit Exceeded": 0
    },
    "test_case": 1,
    "created_by": "10010110"
}

修改题目 - IsStaff

/api/prm/admin/problem/{id}/ PATCH

接口使用

使用 Problem 的 id 来部分修改题目。

PATCH http://127.0.0.1:8000/api/prm/admin/problem/50/
{
    "mode": "OI",
    "point": [
        {
            "input_name": "1.in",
            "output_name": "1.out",
            "point": "50"
        },
        {
            "input_name": "2.in",
            "output_name": "2.out",
            "point": "50"
        }
    ]
}

成功返回 200 OK

{
    "id": 50,
    "tags": [
        {
            "id": 2,
            "tag_name": "Test"
        },
        {
            "id": 1,
            "tag_name": "入门"
        }
    ],
    "title": "循环",
    "desc": "乐乐是一个聪明而又勤奋好学的孩子。他总喜欢探求事物的规律。一天,他突然对数的正整数次幂产生了兴趣。\n\n\n众所周知,$2$ 的正整数次幂最后一位数总是不断的在重复 $2,4,8,6,2,4,8,6…$ 我们说 $2$ 的正整数次幂最后一位的循环长度是 $4$(实际上 $4$ 的倍数都可以说是循环长度,但我们只考虑最小的循环长度)。类似的,其余的数字的正整数次幂最后一位数也有类似的循环现象:\n\n$$\n\\def\\arraystretch{1.5}\n\\begin{array}{c|c|c}\\hline\n\\textbf{数字}& \\textbf{循环} & \\textbf{循环长度} \\cr\\hline\\hline\n2 & 2,4,8,6 & 4\\cr\\hline\n3 & 3,9,7,1 & 4\\cr\\hline\n4 & 4,6 & 2\\cr\\hline\n5 & 5 &  1\\cr\\hline\n6 & 6 & 1\\cr\\hline\n7 & 7,9,3,1 & 4\\cr\\hline\n8 & 8,4,2,6 & 4\\cr\\hline\n9 & 9,1 & 2\\cr\\hline\n\\end{array}\n$$\n\n这时乐乐的问题就出来了:是不是只有最后一位才有这样的循环呢?对于一个整数 $n$ 的正整数次幂来说,它的后k位是否会发生循环?如果循环的话,循环长度是多少呢?\n\n注意:\n\n1. 如果 $n$ 的某个正整数次幂的位数不足 $k$,那么不足的高位看做是 $0$。\n2. 如果循环长度是 $L$,那么说明对于任意的正整数 $a$,$n$ 的 $a$ 次幂和 $a+L$ 次幂的最后 $k$ 位都相同。\n",
    "input_desc": "共一行,包含 $2$ 个整数 $n$ 和 $k$。$n$ 和 $k$ 之间用一个空格隔开,表示要求 $n$ 的正整数次幂的最后 $k$ 位的循环长度。",
    "output_desc": "一个整数,表示循环长度。如果循环不存在,输出 $-1$。",
    "sample": [
        {
            "input": "32 2",
            "output": "4"
        }
    ],
    "template": {
        "50": "……",
        "54": "……",
        "62": "……"
    },
    "hint": "**【数据范围】**\n\n对于 $30 \\%$ 的数据,满足 $k \\le 4$;  \n对于$100 \\%$ 的数据,满足 $1 \\le n < {10}^{100}$,$1 \\le k \\le 100$。\n\n**【题目来源】**\n\nNOIP 2005 普及组第四题",
    "languages": [
        50,
        54,
        60,
        62,
        71
    ],
    "time_limit": 4096,
    "memory_limit": 48,
    "difficulty": "Hard",
    "mode": "OI",
    "point": [
        {
            "input_name": "1.in",
            "output_name": "1.out",
            "point": "50"
        },
        {
            "input_name": "2.in",
            "output_name": "2.out",
            "point": "50"
        }
    ],
    "is_public": true,
    "source": "YeeOnlineJudge",
    "visible": true,
    "created_time": "2023-04-03T21:50:48.850798",
    "last_update_time": "2023-04-03T22:38:59.827720",
    "statistics": {
        "Commit": 0,
        "Accepted": 0,
        "In Queue": 0,
        "Processing": 0,
        "Wrong Answer": 0,
        "Runtime Error": 0,
        "Internal Error": 0,
        "Compilation Error": 0,
        "Exec Format Error": 0,
        "Time Limit Exceeded": 0
    },
    "test_case": 1,
    "created_by": "10010110"
}

删除题目 - IsStaff

/api/prm/admin/problem/{id}/ DELETE

接口使用

请求来删除题目。

DELETE http://127.0.0.1:8000/api/prm/admin/problem/50/

成功返回 204 No Content

Training

题集

创建题集 - IsStaff

/api/train/admin/problem_set/ POST

接口使用

通过以下请求数据来创建题集。

{
    "title": "C循环",
    "problems": [1, 2, 3] // 题目 ID,需要为空时使用 [] 代替
}

成功返回 201 Created

{
    "id": 1,
    "title": "C循环",
    "problems": [
        {
            "id": 1,
            "title": "循环",
            "difficulty": "Hard",
            "tags": [
                {
                    "id": 2,
                    "tag_name": "Test"
                },
                {
                    "id": 1,
                    "tag_name": "入门"
                }
            ],
            "statistics": {
                "Commit": 0,
                "Accepted": 0,
                "In Queue": 0,
                "Processing": 0,
                "Wrong Answer": 0,
                "Runtime Error": 0,
                "Internal Error": 0,
                "Compilation Error": 0,
                "Exec Format Error": 0,
                "Time Limit Exceeded": 0
            },
            "done": -1
        },
        ...
    ]
}

题集列表 - IsStaff

/api/train/admin/problem_set/ GET

接口使用

请求返回题集列表。

Query Parameter 支持参数

参数查询方式对应实体字段
标题模糊查询ProblemSet.title

成功返回 200 OK

{
    "count": 2,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": 1,
            "title": "C循环",
            "problems": [
                ...
                {
                    "id": 2,
                    "title": "谁拿了最多奖学金",
                    "difficulty": "Easy",
                    "tags": [
                        {
                            "id": 2,
                            "tag_name": "Test"
                        },
                        {
                            "id": 1,
                            "tag_name": "入门"
                        }
                    ],
                    "statistics": {
                        "Commit": 0,
                        "Accepted": 0,
                        "In Queue": 0,
                        "Processing": 0,
                        "Wrong Answer": 0,
                        "Runtime Error": 0,
                        "Internal Error": 0,
                        "Compilation Error": 0,
                        "Exec Format Error": 0,
                        "Time Limit Exceeded": 0
                    },
                    "done": -1
                },
                ...
            ]
        },
        ...
    ]
}

题集详情 - IsStaff

/api/train/admin/problem_set/{id}/ GET

接口使用

请求返回题集详情。

GET http://127.0.0.1:8000/api/train/admin/problem_set/1/

成功返回 200 OK

{
    "id": 1,
    "title": "C循环",
    "problems": [
        ...
        {
            "id": 2,
            "title": "谁拿了最多奖学金",
            "difficulty": "Easy",
            "tags": [
                {
                    "id": 2,
                    "tag_name": "Test"
                },
                {
                    "id": 1,
                    "tag_name": "入门"
                }
            ],
            "statistics": {
                "Commit": 0,
                "Accepted": 0,
                "In Queue": 0,
                "Processing": 0,
                "Wrong Answer": 0,
                "Runtime Error": 0,
                "Internal Error": 0,
                "Compilation Error": 0,
                "Exec Format Error": 0,
                "Time Limit Exceeded": 0
            },
            "done": -1
        },
        ...
    ]
}

修改题集 - IsStaff

/api/train/admin/problem_set/{id}/ PUT

接口使用

使用 ProblemSet 的 id 来修改题集。

PUT http://127.0.0.1:8000/api/train/admin/problem_set/2/
{
    "title": "修改后",
    "problems": [1]
}

成功返回 200 OK

{
    "id": 2,
    "title": "修改后",
    "problems": [
        {
            "id": 1,
            "title": "循环",
            "difficulty": "Hard",
            "tags": [
                {
                    "id": 2,
                    "tag_name": "Test"
                },
                {
                    "id": 1,
                    "tag_name": "入门"
                }
            ],
            "statistics": {
                "Commit": 0,
                "Accepted": 0,
                "In Queue": 0,
                "Processing": 0,
                "Wrong Answer": 0,
                "Runtime Error": 0,
                "Internal Error": 0,
                "Compilation Error": 0,
                "Exec Format Error": 0,
                "Time Limit Exceeded": 0
            },
            "done": -1
        }
    ]
}

修改题集 - IsStaff

/api/train/admin/problem_set/{id}/ PATCH

接口使用

使用 ProblemSet 的 id 来部分修改题集。

PATCH http://127.0.0.1:8000/api/train/admin/problem_set/2/
{
    "title": "再修改"
}

成功返回 200 OK

{
    "id": 2,
    "title": "再修改",
    "problems": [
        {
            "id": 1,
            "title": "循环",
            "difficulty": "Hard",
            "tags": [
                {
                    "id": 2,
                    "tag_name": "Test"
                },
                {
                    "id": 1,
                    "tag_name": "入门"
                }
            ],
            "statistics": {
                "Commit": 0,
                "Accepted": 0,
                "In Queue": 0,
                "Processing": 0,
                "Wrong Answer": 0,
                "Runtime Error": 0,
                "Internal Error": 0,
                "Compilation Error": 0,
                "Exec Format Error": 0,
                "Time Limit Exceeded": 0
            },
            "done": -1
        }
    ]
}

删除题集 - IsStaff

/api/train/admin/problem_set/{id}/ DELETE

接口使用

请求来删除题集。

DELETE http://127.0.0.1:8000/api/train/admin/problem_set/2/

成功返回 204 No Content

比赛训练

创建比赛训练 - IsStaff

/api/train/admin/training/ POST

接口使用

通过以下请求数据来创建比赛训练。

{
    "title": "比赛#1",
    "description": "比赛#1比赛#1比赛#1",
    "is_open": true,
    "start_time": "2023-3-2T12:00:00", 
    "end_time": "2023-4-1T12:00:00",
    "problems": [25, 26, 27, 28, 29],
    "mode": "OI",
    "password": "123456"
    /*

    "group": [1, 2],
    "user": ["10010", "10086"]
    
    非必填,两参数分别为可免密参加比赛的组(班级)或用户,值分别为组(班级)id 和 username

    */
}

成功返回 201 Created

{
    "id": 2,
    "group": [],
    "user": [],
    "title": "比赛#1",
    "description": "比赛#1比赛#1比赛#1",
    "created_time": "2023-04-05T12:44:17.927687",
    "is_open": true,
    "start_time": "2023-3-2T12:00:00",
    "end_time": "2023-4-1T12:00:00",
    "mode": "OI",
    "created_by": "10010110",
    "problems": [
        ...
        {
            "id": 26,
            "title": "质因数分解",
            "difficulty": "Easy",
            "tags": [
                {
                    "id": 2,
                    "tag_name": "Test"
                },
                {
                    "id": 1,
                    "tag_name": "入门"
                }
            ],
            "statistics": {
                "Commit": 0,
                "Accepted": 0,
                "In Queue": 0,
                "Processing": 0,
                "Wrong Answer": 0,
                "Runtime Error": 0,
                "Internal Error": 0,
                "Compilation Error": 0,
                "Exec Format Error": 0,
                "Time Limit Exceeded": 0
            },
            "done": -1
        },
        ...
    ],
    "announcement": []
}

比赛训练列表 - IsStaff

/api/train/admin/training/ GET

接口使用

请求返回比赛训练列表。

Query Parameter 支持参数

参数查询方式对应实体字段
标题模糊查询Training.title

Filter Parameter 支持参数

参数对应实体字段排序字段
创建日期Training.created_timecreated_time
比赛训练开始时间Training.start_timestart_time

成功返回 200 OK

{
    "count": 2,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": 2,
            "title": "比赛#1",
            "created_time": "2023-04-05T12:44:17.927687",
            "is_open": true,
            "start_time": "2023-03-02T12:00:00",
            "end_time": "2023-04-01T12:00:00",
            "mode": "OI",
            "created_by": "10010110",
            "problems": [
                25,
                26,
                27,
                28,
                29
            ],
            "group": [],
            "user": []
        },
        ...
    ]
}

比赛训练详情 - IsStaff

/api/train/admin/training/{id}/ GET

接口使用

请求返回比赛训练详情。

GET http://127.0.0.1:8000/api/train/admin/training/1/

成功返回 200 OK

{
    "id": 1,
    "group": [],
    "user": [],
    "title": "比赛#1",
    "description": "比赛#1比赛#1比赛#1",
    "created_time": "2023-03-22T22:45:04.658970",
    "is_open": true,
    "start_time": "2023-03-02T12:00:00",
    "end_time": "2023-04-01T12:00:00",
    "mode": "OI",
    "created_by": "10010110",
    "problems": [
        ...
        {
            "id": 26,
            "title": "质因数分解",
            "difficulty": "Easy",
            "tags": [
                {
                    "id": 2,
                    "tag_name": "Test"
                },
                {
                    "id": 1,
                    "tag_name": "入门"
                }
            ],
            "statistics": {
                "Commit": 0,
                "Accepted": 0,
                "In Queue": 0,
                "Processing": 0,
                "Wrong Answer": 0,
                "Runtime Error": 0,
                "Internal Error": 0,
                "Compilation Error": 0,
                "Exec Format Error": 0,
                "Time Limit Exceeded": 0
            },
            "done": -1
        },
        ...
    ],
    "announcement": [
        ...
        {
            "id": 1,
            "title": "比赛测试公告",
            "content": "比赛测试公告测试公告测试公告测试公告测试公告测试公告测试公告测试公告测试公告",
            "created_time": "2023-03-26T19:43:11.910721",
            "last_update_time": "2023-03-26T19:43:11.910732",
            "training": 1,
            "created_by": "10010110"
        },
        ...
    ]
}

修改比赛练习 - IsStaff

/api/train/admin/training/{id}/ PUT

接口使用

使用 Training 的 id 来修改比赛练习。

PUT http://127.0.0.1:8000/api/train/admin/training/2/
{
    "title": "比赛#1",
    "description": "比赛#1比赛#1比赛#1",
    "is_open": true,
    "start_time": "2023-3-2T12:00:00", 
    "end_time": "2023-4-1T12:00:00",
    "problems": [25, 26, 28, 29],
    "mode": "ACM",
    "password": "125634"
}

成功返回 200 OK

{
    "id": 2,
    "group": [],
    "user": [],
    "title": "比赛#1",
    "description": "比赛#1比赛#1比赛#1",
    "created_time": "2023-04-05T12:44:17.927687",
    "is_open": true,
    "start_time": "2023-3-2T12:00:00",
    "end_time": "2023-4-1T12:00:00",
    "mode": "ACM",
    "created_by": "10010110",
    "problems": [
        ...
        {
            "id": 26,
            "title": "质因数分解",
            "difficulty": "Easy",
            "tags": [
                {
                    "id": 2,
                    "tag_name": "Test"
                },
                {
                    "id": 1,
                    "tag_name": "入门"
                }
            ],
            "statistics": {
                "Commit": 0,
                "Accepted": 0,
                "In Queue": 0,
                "Processing": 0,
                "Wrong Answer": 0,
                "Runtime Error": 0,
                "Internal Error": 0,
                "Compilation Error": 0,
                "Exec Format Error": 0,
                "Time Limit Exceeded": 0
            },
            "done": -1
        },
        ...
    ],
    "announcement": []
}

修改比赛练习 - IsStaff

/api/train/admin/training/{id}/ PATCH

接口使用

使用 Training 的 id 来部分修改比赛练习。

PATCH http://127.0.0.1:8000/api/train/admin/training/2/
{
    "title": "练习Test#1"
}

成功返回 200 OK

{
    "id": 2,
    "group": [],
    "user": [],
    "title": "练习Test#1",
    "description": "比赛#1比赛#1比赛#1",
    "created_time": "2023-04-05T12:44:17.927687",
    "is_open": true,
    "start_time": "2023-3-2T12:00:00",
    "end_time": "2023-4-1T12:00:00",
    "mode": "ACM",
    "created_by": "10010110",
    "problems": [
        ...
        {
            "id": 26,
            "title": "质因数分解",
            "difficulty": "Easy",
            "tags": [
                {
                    "id": 2,
                    "tag_name": "Test"
                },
                {
                    "id": 1,
                    "tag_name": "入门"
                }
            ],
            "statistics": {
                "Commit": 0,
                "Accepted": 0,
                "In Queue": 0,
                "Processing": 0,
                "Wrong Answer": 0,
                "Runtime Error": 0,
                "Internal Error": 0,
                "Compilation Error": 0,
                "Exec Format Error": 0,
                "Time Limit Exceeded": 0
            },
            "done": -1
        },
        ...
    ],
    "announcement": []
}

删除比赛训练 - IsStaff

/api/train/admin/training/{id}/ DELETE

接口使用

请求来删除比赛训练。

DELETE http://127.0.0.1:8000/api/train/admin/training/2/

成功返回 204 No Content

学习计划

创建学习计划 - IsStaff

/api/train/admin/plan/ POST

接口使用

通过以下请求数据来创建学习计划。

{
    "title": "C语言学习",
    "description": "C语言学习,好好学习",
    "is_open": true,
    "stage": [1, 2], // 题集 ID
    "ordering": [2, 1] // 题集顺序
}

成功返回 201 Created

{
    "id": 1,
    "title": "C语言学习",
    "description": "C语言学习,好好学习",
    "created_time": "2023-03-26T20:13:16.650457",
    "is_open": true,
    "ordering": [
        2,
        1
    ],
    "created_by": null,
    "stage": [
        {
            "id": 1,
            "title": "C循环",
            "problems": [
                {
                    "id": 1,
                    "title": "循环",
                    "difficulty": "Hard",
                    "tags": [
                        {
                            "id": 2,
                            "tag_name": "Test"
                        },
                        {
                            "id": 1,
                            "tag_name": "入门"
                        }
                    ],
                    "statistics": {
                        "Commit": 0,
                        "Accepted": 0,
                        "In Queue": 0,
                        "Processing": 0,
                        "Wrong Answer": 0,
                        "Runtime Error": 0,
                        "Internal Error": 0,
                        "Compilation Error": 0,
                        "Exec Format Error": 0,
                        "Time Limit Exceeded": 0
                    },
                    "done": -1
                },
                ...
            ]
        },
        ...
    ]
}

学习计划列表 - IsStaff

/api/train/admin/plan/ GET

接口使用

请求返回学习计划列表。

Query Parameter 支持参数

参数查询方式对应实体字段
标题模糊查询LearningPlan.title

Filter Parameter 支持参数

参数对应实体字段排序字段
创建日期LearningPlan.created_timecreated_time

成功返回 200 OK

{
    "count": 1,
    "next": null,
    "previous": null,
    "results": [
        ...
        {
            "id": 1,
            "title": "C语言学习",
            "description": "C语言学习,好好学习",
            "created_time": "2023-03-26T20:13:16.650457",
            "is_open": true,
            "ordering": [
                2,
                1
            ],
            "created_by": null,
            "stage": [
                ...
                {
                    "id": 1,
                    "title": "C循环",
                    "problems": [
                        ...
                        {
                            "id": 2,
                            "title": "谁拿了最多奖学金",
                            "difficulty": "Easy",
                            "tags": [
                                {
                                    "id": 2,
                                    "tag_name": "Test"
                                },
                                {
                                    "id": 1,
                                    "tag_name": "入门"
                                }
                            ],
                            "statistics": {
                                "Commit": 0,
                                "Accepted": 0,
                                "In Queue": 0,
                                "Processing": 0,
                                "Wrong Answer": 0,
                                "Runtime Error": 0,
                                "Internal Error": 0,
                                "Compilation Error": 0,
                                "Exec Format Error": 0,
                                "Time Limit Exceeded": 0
                            },
                            "done": -1
                        },
                        ...
                    ]
                },
                ...
            ]
        }
        ...
    ]
}

学习计划详情 - IsStaff

/api/train/admin/plan/ GET

接口使用

请求返回学习计划详情。

GET http://127.0.0.1:8000/api/train/admin/plan/1/

成功返回 200 OK

{
    "id": 1,
    "title": "C语言学习",
    "description": "C语言学习,好好学习",
    "created_time": "2023-03-26T20:13:16.650457",
    "is_open": true,
    "ordering": [
        2,
        1
    ],
    "created_by": null,
    "stage": [
        {
            "id": 1,
            "title": "C循环",
            "problems": [
                ...
                {
                    "id": 2,
                    "title": "谁拿了最多奖学金",
                    "difficulty": "Easy",
                    "tags": [
                        {
                            "id": 2,
                            "tag_name": "Test"
                        },
                        {
                            "id": 1,
                            "tag_name": "入门"
                        }
                    ],
                    "statistics": {
                        "Commit": 0,
                        "Accepted": 0,
                        "In Queue": 0,
                        "Processing": 0,
                        "Wrong Answer": 0,
                        "Runtime Error": 0,
                        "Internal Error": 0,
                        "Compilation Error": 0,
                        "Exec Format Error": 0,
                        "Time Limit Exceeded": 0
                    },
                    "done": -1
                },
                ...
            ]
        },
        ...
    ]
}

修改学习计划 - IsStaff

/api/train/admin/plan/{id}/ PUT

接口使用

使用 LearningPlan 的 id 来修改学习计划。

PUT http://127.0.0.1:8000/api/train/admin/plan/2/
{
    "title": "C语言学习",
    "description": "学习C语言",
    "is_open": true,
    "stage": [1, 2],
    "ordering": [1, 2]
}

成功返回 200 OK

{
    "id": 1,
    "title": "C语言学习",
    "description": "学习C语言",
    "created_time": "2023-03-26T20:13:16.650457",
    "is_open": true,
    "ordering": [
        1,
        2
    ],
    "created_by": null,
    "stage": [
        {
            "id": 1,
            "title": "C循环",
            "problems": [
                ...
                {
                    "id": 2,
                    "title": "谁拿了最多奖学金",
                    "difficulty": "Easy",
                    "tags": [
                        {
                            "id": 2,
                            "tag_name": "Test"
                        },
                        {
                            "id": 1,
                            "tag_name": "入门"
                        }
                    ],
                    "statistics": {
                        "Commit": 0,
                        "Accepted": 0,
                        "In Queue": 0,
                        "Processing": 0,
                        "Wrong Answer": 0,
                        "Runtime Error": 0,
                        "Internal Error": 0,
                        "Compilation Error": 0,
                        "Exec Format Error": 0,
                        "Time Limit Exceeded": 0
                    },
                    "done": -1
                },
                ...
            ]
        },
        ...
    ]
}

修改学习计划 - IsStaff

/api/train/admin/plan/{id}/ PATCH

接口使用

使用 LearningPlan 的 id 来部分修改学习计划。

PATCH http://127.0.0.1:8000/api/train/admin/plan/2/
{
    "title": "学习C语言"
}

成功返回 200 OK

{
    "id": 1,
    "title": "学习C语言",
    "description": "学习C语言",
    "created_time": "2023-03-26T20:13:16.650457",
    "is_open": true,
    "ordering": [
        1,
        2
    ],
    "created_by": null,
    "stage": [
        {
            "id": 1,
            "title": "C循环",
            "problems": [
                ...
                {
                    "id": 2,
                    "title": "谁拿了最多奖学金",
                    "difficulty": "Easy",
                    "tags": [
                        {
                            "id": 2,
                            "tag_name": "Test"
                        },
                        {
                            "id": 1,
                            "tag_name": "入门"
                        }
                    ],
                    "statistics": {
                        "Commit": 0,
                        "Accepted": 0,
                        "In Queue": 0,
                        "Processing": 0,
                        "Wrong Answer": 0,
                        "Runtime Error": 0,
                        "Internal Error": 0,
                        "Compilation Error": 0,
                        "Exec Format Error": 0,
                        "Time Limit Exceeded": 0
                    },
                    "done": -1
                },
                ...
            ]
        },
        ...
    ]
}

删除学习计划 - IsStaff

/api/train/admin/plan/{id}/ DELETE

接口使用

请求来删除学习计划。

DELETE http://127.0.0.1:8000/api/train/admin/plan/1/

成功返回 204 No Content

Announcement

创建公告 - IsStaff

/api/ann/admin/ POST

接口使用

通过以下请求数据来创建公告。

{
    "title": "比赛测试公告",
    "content": "比赛测试公告测试公告测试公告测试公告测试公告测试公告测试公告测试公告测试公告",
    "visible": true
    /*
    "training": 1 // 归属于某个训练比赛的公告,非必填
    */
    
}

成功返回 201 Created

{
    "id": 3,
    "title": "比赛测试公告",
    "content": "比赛测试公告测试公告测试公告测试公告测试公告测试公告测试公告测试公告测试公告",
    "created_time": "2023-03-26T19:53:58.807143",
    "last_update_time": "2023-03-26T19:53:58.807158",
    "visible": true,
    "training": 1,
    "created_by": "10010110"
}

公告列表 - IsStaff

/api/ann/admin/ GET

接口使用

请求返回公告列表。

Query Parameter 支持参数

参数查询方式对应实体字段
标题模糊查询Announcement.title
内容模糊查询Announcement.content

Filter Parameter 支持参数

参数对应实体字段排序字段
创建日期Announcement.created_timecreated_time

成功返回 200 OK

{
    "count": 3,
    "next": null,
    "previous": null,
    "results": [
        ...
        {
            "id": 2,
            "title": "比赛测试公告",
            "content": "比赛测试公告测试公告测试公告测试公告测试公告测试公告测试公告测试公告测试公告",
            "created_time": "2023-03-26T19:43:22.762877",
            "last_update_time": "2023-03-26T19:43:22.762891",
            "training": null,
            "created_by": "10010110"
        },
        ...
    ]
}

公告详情 - IsStaff

/api/ann/admin/{id}/ GET

接口使用

请求返回公告详情。

GET http://127.0.0.1:8000/api/ann/admin/1/

成功返回 200 OK

{
    "id": 1,
    "title": "比赛测试公告",
    "content": "比赛测试公告测试公告测试公告测试公告测试公告测试公告测试公告测试公告测试公告",
    "created_time": "2023-03-26T19:43:11.910721",
    "last_update_time": "2023-03-26T19:43:11.910732",
    "visible": true,
    "training": 1,
    "created_by": "10010110"
}

修改公告 - IsStaff

/api/ann/admin/{id}/ PUT

接口使用

使用 Announcement 的 id 来修改公告。

PUT http://127.0.0.1:8000/api/ann/admin/1/
{
    "title": "比赛测试公告",
    "content": "比赛测试公告测试公告测试公告测试公告测试公告测试公告测试公告测试公告测试公告修改",
    "visible": true,
    "training": null
}

成功返回 200 OK

{
    "id": 1,
    "title": "比赛测试公告",
    "content": "比赛测试公告测试公告测试公告测试公告测试公告测试公告测试公告测试公告测试公告修改",
    "created_time": "2023-03-26T19:43:11.910721",
    "last_update_time": "2023-04-05T15:36:44.119462",
    "visible": true,
    "training": null,
    "created_by": "10010110"
}

修改公告 - IsStaff

/api/ann/admin/{id}/ PATCH

接口使用

使用 Announcement 的 id 来修改公告。

PATCH http://127.0.0.1:8000/api/ann/admin/1/
{
    "content": "修改公告测试公告测试公告测试公告测试公告测试公告测试公告修改"
}

成功返回 200 OK

{
    "id": 1,
    "title": "比赛测试公告",
    "content": "修改公告测试公告测试公告测试公告测试公告测试公告测试公告修改",
    "created_time": "2023-03-26T19:43:11.910721",
    "last_update_time": "2023-04-05T15:37:46.312927",
    "visible": true,
    "training": null,
    "created_by": "10010110"
}

删除公告 - IsStaff

/api/ann/admin/{id}/ DELETE

接口使用

请求来删除公告。

DELETE http://127.0.0.1:8000/api/ann/admin/1/

成功返回 204 No Content