Beispiel #1
0
 def identify(request):
     """
     用户鉴权
     :return: json
     """
     auth_header = request.headers.get('Authorization')
     if auth_header:
         auth_token_arr = auth_header.split(" ")
         if not auth_token_arr or auth_token_arr[0] != 'JWT' or len(
                 auth_token_arr) != 2:
             result = public.fail_return('', '请传递正确的验证头信息')
         else:
             auth_token = auth_token_arr[1]
             payload = Auth.decode_auth_token(auth_token)
             if not isinstance(payload, str):
                 user = User.query.filter_by(
                     id=payload['data']['id']).first()
                 if user is None:
                     result = public.fail_return('', '找不到该用户信息')
                 else:
                     if user.login_time == payload['data']['login_time']:
                         result = public.success_return(user.id, '请求成功')
                     else:
                         result = public.fail_return('', 'Token已更改,请重新登录获取')
             else:
                 result = public.fail_return('', payload)
     else:
         result = public.fail_return('', '没有提供认证token')
     return result
Beispiel #2
0
def change_name():
    """
    修改用户名名字
    :return:
    """
    new_name = request.form.get('newName')
    if not new_name:
        return fail_return(msg="名字不能为空")
    user = User.query.filter_by(username=new_name).first()
    if user:
        return fail_return(msg="用户名已存在")
    g.current_user.username = new_name
    DatabaseOperation.update()
    return success_return(g.current_user.to_json(), "用户名修改成功")
Beispiel #3
0
def confirm(token):
    """
    确认邮件激活用户
    :param token: str
    :return: json
    """
    id = User.confirm(token)
    user = User.query.filter_by(id=id).first()
    if not user:
        return fail_return(msg='用户不存在')
    if user.confirmed:
        return fail_return(msg='用户已激活')
    user.confirmed = True
    DatabaseOperation.update()
    return success_return(data=user.to_json(), msg='激活成功')
Beispiel #4
0
def change_pwd():
    """
    修改密码(登录状态下)
    :return:
    """
    old_pwd = request.form.get('oldPwd')
    if not old_pwd:
        return fail_return(msg="密码不能为空")
    if g.current_user.verity_password(old_pwd):
        new_pwd = request.form.get('newPwd')
        if not new_pwd:
            return fail_return(msg="密码不能为空")
        g.current_user.password = new_pwd
        DatabaseOperation.update()
        return success_return(g.current_user.to_json(), "密码修改成功")
    else:
        return fail_return(msg='原密码错误')
Beispiel #5
0
def modify_data(id, putD):
    """
    修改题目的输入和输出数据
    """
    q = Question.get_question(id)
    if not q:
        return fail_return("题目不存在")
    d = Data2Test.query.filter_by(que_id=id, input_data=putD).first()
    if d:
        d.input_type = request.form.get('input_type')
        d.input_data = request.form.get('input_data')
        d.output_type = request.form.get('output_type')
        d.output_data = request.form.get('output_data')
        d.time_limit = request.form.get('time_limit')
        d.mem_limit = request.form.get('mem_limit')
        return success_return(d.to_json(), "修改成功")
    return fail_return(msg="修改失败")
Beispiel #6
0
def get_data(id):
    """获取对应的题目的数据案例"""
    q = Question.get_question(id)
    if not q:
        return fail_return(msg="该题不存在")
    ds = q.data.all()
    json_ds = [json_data.to_json() for json_data in ds]
    return success_return(json_ds, msg="获取成功")
Beispiel #7
0
def reconfirm():
    """
    重新发送邮件进行确认
    :return: json
    """
    username = request.form.get('username')
    password = request.form.get('password')
    user = User.query.filter_by(username=username).first()
    if user:
        if user.verity_password(password):
            token = user.generate_confirmation_token()
            send_token_email(user, "confirm", token)
            return success_return(user.to_json(), "邮件发送成功")
        else:
            return fail_return(msg="密码错误")
    else:
        return fail_return(msg="用户不存在")
Beispiel #8
0
def get_user(id):
    """
    获取用户的信息
    :return:json
    """
    user = User.query.filter_by(id=id).first()
    if not user:
        return fail_return({"id": id}, '用户不存在')
    return success_return(user.to_json(), "获取成功")
Beispiel #9
0
def delete_data(id, putD):
    """
    删除数据
    """
    q = Question.get_question(id)
    if not q:
        return fail_return("题目不存在")
    d = Data2Test.query.filter_by(que_id=id, input_data=putD).first()
    DatabaseOperation.delete(d)
    return success_return(msg="删除成功")
Beispiel #10
0
def get_question(id=None):
    """
    获取id所对应的题目信息
    :param id: int
    :return: json
    """
    question = Question.get_question(id)
    if question:
        return success_return(question.to_json(), "获取成功")
    return fail_return(msg="所查id对应的题目不存在")
Beispiel #11
0
 def decorated_function(*args, **kwargs):
     result = eval(Auth.identify(request).get_data().decode("utf-8"))
     if result['status'] and result['data']:
         user = User.get(result['data'])
         if not user.confirmed:
             return fail_return(msg='账号未激活')
         g.current_user = user
         return f(*args, **kwargs)
     else:
         return jsonify(result)
Beispiel #12
0
def delete_user(id):
    """
    删除用户
    :param id:
    :return:
    """
    user = User.get(id)
    if not user:
        return fail_return(msg='用户不存在')
    DatabaseOperation.delete(user, id)
    return success_return(g.current_user.to_json(), msg='用户已删除')
Beispiel #13
0
def login():
    """
    用户登录
    :return:json
    """
    username = request.form.get('username')
    password = request.form.get('password')
    if not username or not password:
        return fail_return(msg="用户名和密码不能为空")
    else:
        return Auth.authenticate(username=username, password=password)
Beispiel #14
0
def find_pwd(token):
    """
    点击邮件链接 找回密码
    :param token: str
    :return:
    """
    id = User.confirm(token)
    email = request.form.get('email')
    user = User.query.filter_by(id=id).first()
    user1 = User.query.filter_by(email=email).first()
    if user and user1 and user is user1:
        if user.find_pwd_token != token:
            return fail_return(msg="链接失效")
        new_password = request.form.get('newPwd')
        if not new_password:
            return fail_return(msg="密码不能为空")
        user.password = new_password
        user.find_pwd_token = None
        DatabaseOperation.update()
        return success_return(user.to_json(), "密码修改成功")
    return fail_return("用户不存在")
Beispiel #15
0
def submit(id):
    """提交代码"""
    language = request.form.get('language')
    content = request.form.get('content')
    sub = Submit(language=language,
                 content=content,
                 user=g.current_user,
                 question=Question.get_question(id))
    if sub:
        DatabaseOperation.add(sub)
        return success_return(sub.to_json(), "提交成功")
    return fail_return(msg="提交失败")
Beispiel #16
0
def modify_question(id):
    """
    修改题目信息
    :param id:
    :return:
    """
    que = Question.query.filter_by(id=id).first()
    if not que:
        return fail_return(msg='所对应题目不存在')
    topic = request.form.get('topic')
    content = request.form.get('content')
    notes = request.form.get('notes')
    example = request.form.get('example')
    if topic and content:
        que.topic = topic
        que.content = content
        que.notes = notes
        que.example = example
        DatabaseOperation.update()
        return success_return(que.to_json(), '修改成功')
    return fail_return('题目和内容不能为空')
Beispiel #17
0
 def authenticate(username, password):
     """
     用户登录,登录成功返回token,写将登录时间写入数据库;登录失败返回失败原因
     :param password:
     :return: json
     """
     user = User.query.filter_by(username=username).first()
     if user is None:
         return public.fail_return(data='', msg='找不到用户')
     else:
         if user.verity_password(password=password):
             if user.confirmed:
                 login_time = int(time.time())
                 user.login_time = login_time
                 DatabaseOperation.update()
                 token = Auth.encode_auth_token(user.id, login_time)
                 return public.success_return({"token": token.decode()},
                                              '登录成功')
             else:
                 return public.fail_return(msg='账号未激活')
         else:
             return public.fail_return('', '密码不正确')
Beispiel #18
0
def add_question():
    """
    添加题目
    :return: json
    """
    topic = request.form.get('topic')
    content = request.form.get('content')
    notes = request.form.get('notes')
    example = request.form.get('example')
    maker = g.current_user

    input_type = request.form.get('input_type')
    input_data = request.form.get('input_data')
    output_type = request.form.get('output_type')
    output_data = request.form.get('output_data')

    if topic and content:
        que = Question(topic=topic,
                       content=content,
                       notes=notes,
                       example=example,
                       maker=maker)
        DatabaseOperation.add(que)
        if que:
            if input_data and input_type and output_data and output_type:
                data = Data2Test(input_data=input_data,
                                 input_type=input_type,
                                 output_data=output_data,
                                 output_type=output_type,
                                 question=que)
                if data:
                    DatabaseOperation.add(data)
                    return success_return(que.to_json(), '添加成功')
                return fail_return(msg="题目添加成功,数据添加出错")
            return success_return(que.to_json(), '添加成功')
        return fail_return(msg='添加失败')
    return fail_return('题目和内容不能为空')
Beispiel #19
0
def register():
    """
    用户注册
    :return:json
    """
    email = request.form.get('email')
    username = request.form.get('username')
    password = request.form.get("password")
    if not email or not username or not password:
        return fail_return("", "用户名、密码和邮件不能为空")
    if User.query.filter_by(email=email).first():
        return fail_return(msg="邮箱已被注册")
    if User.query.filter_by(username=username).first():
        return fail_return(msg="用户名已被注册")

    user = User(username=username, email=email, password=password)
    result = DatabaseOperation.add(user)
    if user.id:
        token = user.generate_confirmation_token()
        send_token_email(user, "confirm", token)
        return success_return(user.to_json(), "邮件发送成功")
    else:
        print(result)
        return fail_return(msg="用户注册失败")
Beispiel #20
0
def delete_question(id):
    """
    删除题目
    :param id:
    :return:
    """
    q = Question.get_question(id)
    if not q:
        return fail_return(msg='所对应题目不存在')
    # data = Data2Test.query.filter_by(que_id=id)
    # print(data.que_id)
    # if data:
    #     DatabaseOperation.delete(data)
    DatabaseOperation.delete(q, id)
    return success_return(msg='删除成功')
Beispiel #21
0
def get_complete_questions(id):
    """
    获得该用户完成的题目 分页后的资源
    """
    page = request.args.get('page')
    user = User.get(id)
    if not user:
        return fail_return(msg='用户不存在')
    sub = ComQue.query.filter_by(user_id=id).with_entities(
        ComQue.question_id, ComQue.timestamp).subquery()
    # print(sub)
    pagination = db.session.query(Question).join(sub, sub.c.question_id == Question.id)\
        .order_by(sub.c.timestamp.desc()).paginate(
        page=page, per_page=current_app.config['QUESTIONS_PER_PAGE'], error_out=False
    )
    return paging(pagination, page)
Beispiel #22
0
def get_complete_users(id):
    """
    获得完成该题目的用户 分页后的资源
    """
    page = request.args.get('page', 1, type=int)
    que = Question.get_question(id)
    if not que:
        return fail_return(msg='题目不存在')
    sub = ComQue.query.filter_by(question_id=id).with_entities(
        ComQue.user_id, ComQue.timestamp).subquery()
    # print(sub)
    pagination = db.session.query(User).join(
        sub,
        sub.c.user_id == User.id).order_by(sub.c.timestamp.desc()).paginate(
            page=page,
            per_page=current_app.config['QUESTIONS_PER_PAGE'],
            error_out=False)
    return paging(pagination, page)
Beispiel #23
0
def forget_pwd():
    """
    忘记密码发送邮件找回密码
    :return:
    """
    email = request.form.get('email')
    user = User.query.filter_by(email=email).first()
    token = user.generate_confirmation_token()

    if user:
        user.find_pwd_token = token
        DatabaseOperation.update()
        send_token_email(user, "changePwd", token)
        return success_return(data={
            'find_password_url':
            url_for('api.find_pwd', token=token, _external=True)
        },
                              msg='邮件已发送')
    return fail_return(msg="用户不存在")
Beispiel #24
0
def add_data(id):
    """添加数据"""
    q = Question.get_question(id)
    input_type = request.form.get('input_type')
    input_data = request.form.get('input_data')
    output_type = request.form.get('output_type')
    output_data = request.form.get('output_data')
    time_limit = request.form.get('time_limit')
    mem_limit = request.form.get('mem_limit')
    d = Data2Test(input_data=input_data,
                  input_type=input_type,
                  output_data=output_data,
                  output_type=output_type,
                  question=q,
                  time_limit=time_limit,
                  mem_limit=mem_limit)
    if d:
        DatabaseOperation.add(d)
        return success_return(d.to_json(), "添加成功")
    return fail_return(msg="添加失败")
Beispiel #25
0
 def decorated_function(*args, **kwargs):
     if not g.current_user.can(permission):
         return fail_return(msg='用户没有此权限')
     return f(*args, **kwargs)