后端
技术选型¶
选择Django为后端框架
Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV(model–template–views) 的软件设计模式,即模型(Model),视图(View)和模板(Template)——Wikipedia
总体架构¶

├── Dockerfile
├── OleBackend
│ ├── __init__.py
│ ├── asgi.py
│ ├── settings.py
│ ├── tests.py
│ ├── urls.py
│ └── wsgi.py
├── README.md
├── advertise
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations
│ ├── models.py
│ ├── tests.py
│ ├── urls.py
│ └── views.py
├── config
│ └── config.py
├── coverage-reports
│ └── coverage.xml
├── data
│ ├── picbed
│ └── video
├── manage.py
├── picbed
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations
│ ├── models.py
│ ├── tests.py
│ ├── urls.py
│ └── views.py
├── pytest.ini
├── requirements.txt
├── review
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations
│ ├── models.py
│ ├── report_views.py
│ ├── tests.py
│ ├── urls.py
│ └── views.py
├── sonar-project.properties
├── start.sh
├── task
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── distribute_views.py
│ ├── migrations
│ ├── models.py
│ ├── question_views.py
│ ├── tag_views.py
│ ├── tests.py
│ ├── upload_data_views.py
│ ├── urls.py
│ └── views.py
├── test.sh
├── user
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── email_views.py
│ ├── face_views.py
│ ├── imgs
│ ├── migrations
│ ├── models.py
│ ├── test_faces.py
│ ├── tests.py
│ ├── urls.py
│ ├── views.py
│ └── vip_views.py
├── utils
│ ├── utils_check.py
│ ├── utils_request.py
│ ├── utils_require.py
│ └── utils_time.py
├── video
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations
│ ├── models.py
│ ├── tests.py
│ ├── urls.py
│ └── views.py
└── xunit-reports
└── xunit-result.xml
设计原则¶
- 前后端分离:后端:负责处理、存储数据;前端:负责显示数据

功能简述¶
用户¶
- 注册、登录、修改用户信息
def register(req: HttpRequest)
注册用户,后端首先比对是否有重复的用户名,再验证用户名和密码的合法性。若均合法,则判断邀请码是否为空,若不为空则查询该邀请码,若存在则给邀请方奖励积分,否则返回错误响应;若邀请码为空则跳过这步;再检查邮箱验证码。最后将加密后的密码、用户名以及生成的不重复邀请码和不重复银行账户及邮箱等一起存储
def login(req: HttpRequest)
登录用户,比较用户名和密码是否正确。如果用户名和密码正确,则检查会员是否过期,并维护cookie
def modify_password(req: HttpRequest, user: User)
用户的信息可以通过这些函数进行修改
- 获取用户信息
def get_all_users(req: HttpRequest, user: User)
根据当前用户权限和请求,可以获取符合要求的所有用户的信息,方便前端使用
- 充值、提现
def recharge(req: HttpRequest, user: User)
def withdraw(req: HttpRequest, user: User)
从积分提现到银行账户中,完成众包平台积分和银行的关联
- 绑定、修改邮箱,获取验证码
def send_verify_code(req)
def change_email(req, user: User)
def verifycode_current_email(req, user: User)
def modifypassword_by_email(req, user: User)
def check_email(email, verifycode, check_exist: bool = False)
通过以上函数,完成了邮箱的全功能,包括生成,发送和验证。由此支持邮箱修改密码等功能
- 封禁与取消封禁用户
def ban_user(req: HttpRequest, user: User, user_id: int)
def unban_user(req, user: User, user_id)
实现了封禁和取消封禁用户的功能,是用户管理的重要部分
- 开通会员
def getvip(req: HttpRequest, user: User)
后端处理开通会员和续费的业务,会先判断当前用户是否已经是会员,若不是,则按月、季度、年的不同套餐分别开通会员,否则将会员续费,并扣除积分
- 审核用户
def check_user(req: HttpRequest, user: User, user_id: int)
对用户进行审核,只有通过审核的用户才具有正常功能
- 人脸识别绑定和登录
def face_reco(req, user: User)
def face_reco_login(req)
通过import face_recognition可以使用人脸识别进行登录,首先需要进行人脸信息与账户的绑定,登录时则要验证人脸是否注册
任务¶
- 创建、修改、删除任务
def create_task(req: HttpRequest, user: User)
def change_tasks(req: HttpRequest, task: Task)
def task_ops(req: HttpRequest, user: User, task_id: any)
根据请求创建任务,可以对任务进行修改,也可以删除或者获取任务信息,供前端使用
- 上传题目数据
def upload_data(req: HttpRequest, user: User)
使用import zipfile,上传一个压缩包,根目录下有 x.txt/x.jpg x为连续自然数字。支持多媒体格式,包括图片、视频、语音、文字等
- 上传标注结果与批量上传结果
def upload_res(req: HttpRequest, user: User, task_id: int, q_id: int)
提交标注的结果,后端会检查标注结果是否重复,若合法,则将其存储到响应的数据库里
- 获取任务、题目数据
def get_task_question(req: HttpRequest, user: User, task_id: int, q_id: int)
可以根据任务编号和题目编号获取题目的信息
- 分发任务、重新分发任务
def pre_distribute(task_id: int, user: User)
def distribute_task(req: HttpRequest, user: User, task_id: int)
def redistribute_task(req: HttpRequest, user: User, task_id: int)
def to_agent(req: HttpRequest, user: User, task_id: int)
def distribute_to_user(req: HttpRequest, user: User, task_id: int, user_id: int)
使用了多样的分发策略,适合不同的要求。顺序分发(根据标注方的信用分从高到低分发) 会首先检查设定的分发用户数是否比可分发的用户数多,以及分数是否足够,若满足条件则将任务分发给标志方待接取,此外还有中介分发、自由接取、智能分发等其他策略 如果分发遭拒,可以进行重新分发
- 拒绝、接受任务
def accept_task(req: HttpRequest, user: User, task_id: int)
def refuse_task(req: HttpRequest, user: User, task_id: int)
分发后,标注方可以选择接受或者拒绝任务
-
获取指定或全部任务状态
-
开始标注题目
中介¶
- 委托中介平台
def to_agent(req: HttpRequest, user: User, task_id: int)
def distribute_to_user(req: HttpRequest, user: User, task_id: int, user_id: int)
任务可以委托中介平台代为分发和审核,因此需要后端能够向指定用户分发任务
- 分发用户给指定用户
- 中介审核任务
图床¶
- 上传图片
def upload(req: HttpRequest, user: User):
图床能够存储图片,并提供高效的访问方式
- 获取图片
def get_img(req: HttpRequest, img_url)
- 删除图片
def delete_img(req, user: User, img_url):
视频¶
- 上传视频
def upload(req, user: User, img_url):
- 获取视频
def get_vid(req, user: User, img_url):
- 删除视频
def delete_vid(req, user: User, img_url):
审核¶
- 需求方人工审核
def manual_check(req: HttpRequest, user: User, task_id: int, user_id: int)
当选择人工审核时,会根据预设的策略随机抽取任务题数的十分之一或全部进行审核,将用户的标注结果从数据库中提取出来交付前端渲染
- 审核通过
def review_accept(req: HttpRequest, user: User, task_id: int, user_id: int)
审核通过后,标记相关的结果,并为标注方增加成长值
- 审核拒绝
def review_reject(req: HttpRequest, user: User, task_id: int, user_id: int)
- 导出指定、全部用户的结果
def download(req: HttpRequest, user: User, task_id: int, user_id: int = None):
可以下载结果,并使用csv格式记录
- 上传标准答案
def upload_stdans(req: HttpRequest, user: User)
自动审核需要标准答案,后端可以处理csv格式的答案文件,将其存储供自动审核使用
- 自动审核
- 举报用户
def report_user(req, user: User, task_id, user_id)
- 通过、拒绝举报用户
def accept_report(req, user: User, task_id, user_id)
def reject_report(req, user: User, task_id, user_id)
广告¶
- 发布广告
def publish(req, user: User)
根据权限,广告代理人可以发布广告,后端解析广告的时间、类型、链接,并判断是否符合发送条件
- 获取广告
def get_ad(req)
可以获取广告信息
- 获取我发布的广告
def get_my_ad(req, user: User)
可以获取自己发布的广告信息
- 给广告续费
def renew(req, user: User, ad_id)
根据权限,广告代理人可以给广告续费,后端判断是否符合发送条件,积分是否够用等,并更新广告