Пример #1
0
def user_auth(request):
    jwt_token = request.META.get('HTTP_AUTHORIZATION', None).encode('utf8')
    try:
        data = jwt.decode(jwt_token, 'secret', algorithm='HS256')
    except Exception as e:
        logger.error(e, jwt_token)
        return json_res(403, '认证失败')

    # if get token then user must exist
    try:
        user = User.objects.get(id=data['sub'])
    except Exception as e:
        logger.error(e)
        return json_res(403, '用户不存在')

    new_token = create_token(data['sub'])

    has_weixin = False
    if user.weixin:
        has_weixin = True

    return json_res(200, 'Confirmed', {
        'jwt_token': new_token,
        'has_weixin': has_weixin
    })
Пример #2
0
    def process_request(self, request):
        # check if url is in lists_need_to_auth
        url_path = request.path

        is_need_auth = 0
        for each in need_auth_path:
            if re.fullmatch(each, url_path):
                is_need_auth = 1
                break

        if not is_need_auth:
            # if already need auth, skip this check
            if request.method != 'GET':
                for each in post_need_auth_path:
                    if re.fullmatch(each, url_path):
                        is_need_auth = 1
                        break

        if is_need_auth:
            # if authenticated, add custom_user to request
            jwt_token = request.META.get('HTTP_AUTHORIZATION',
                                         None).encode('utf8')
            try:
                data = jwt.decode(jwt_token, 'secret', algorithm='HS256')
            except Exception as e:
                logger.error(e, jwt_token)
                return json_res(403, '认证失败')

            # if get token then user must exist
            try:
                user = User.objects.get(id=data['sub'])
            except Exception as e:
                logger.error(e)
                return json_res(404, '用户不存在')
            request.custom_user = user
Пример #3
0
def change_user_info(request):
    req_data = json.loads(request.body.decode('utf-8'))
    user = request.custom_user

    try:
        save_or_not(user, req_data, ['nickname', 'major', 'weixin', 'phone'])
    except Exception as e:
        logger.error(e)
        return json_res(400, '更新用户信息失败')

    return json_res(200, '更新用户信息成功')
Пример #4
0
def wx_login(request):
    """
    微信登录接口, 需要提供code, encryptedData, iv
    """
    req_data = json.loads(request.body.decode('utf-8'))
    code = req_data.get('code', None)
    encryptedData = req_data.get('encryptedData', None)
    iv = req_data.get('iv', None)

    if not code or not encryptedData or not iv:
        return json_res(400, '缺少必要参数')

    user_info = get_user_info(code, encryptedData, iv)

    openid = user_info.get('openId', 'None')
    if not openid:
        return json_res(400, '缺少参数')

    # 如果用户已绑定openid, 直接登录, 否则,自动创建新用户
    try:
        user = User.objects.get(openid=openid)
    except Exception as e:
        logger.error(e, 'Automatically create a new account.')
        user = None

    if not user:
        nickname = user_info.get('nickName', None)
        avatarUrl = user_info.get('avatarUrl', None)

        try:
            user = User.objects.create(nickname=nickname, openid=openid)

            fetch_avatar(avatarUrl, user)
            user.save()
        except Exception as e:
            logger.error(e)
            return json_res(400, '用户创建失败')

    jwt_token = create_token(user.id)
    data = {
        'jwt_token': jwt_token,
        'user_id': user.id,
        'detail_url': 'http://139.199.131.21/api/user/{}/'.format(user.id),
        'avatarUrl': 'http://139.199.131.21' + user.avatar.url,
        'nickname': user.nickname
    }

    return json_res(200, '登录成功', data)
Пример #5
0
    def post(self, request, pk):
        book = get_object_or_404(Book, pk=pk)

        if book.owner != request.custom_user:
            return json_res(403, "用户认证失败")

        req_data = request.POST

        image = request.FILES.get('img', None)
        if image:
            book.image = image

        try:
            save_or_not(book, req_data, ['name', 'price', 'original_price', 'category_id', 'description'])
        except Exception as e:
            logger.error(e)
            return json_res(400, '编辑书籍信息失败')
        return json_res(200, '编辑书籍信息成功', {'detail_url': 'http://139.199.131.21/api/book/{}'.format(book.id)})
Пример #6
0
def book_advice(request):

    # 基于用户发布的书籍量和时间对书籍进行推荐, 发布书越多的用户,会取其最新发布的一本书作为推荐
    try:
        user_ranking = redis_service.zrange('user_ranking', 0, -1, desc=True)[:5]
    except Exception as e:
        logger.error(e)
        return json_res(400, '无人传书', {'books': None})

    user_ranking_ids = [int(id) for id in user_ranking]
    most_offer = list(User.objects.filter(id__in=user_ranking_ids))

    most_offer.sort(key=lambda x: user_ranking_ids.index(x.id))

    books = [user.sell_books.order_by('-created')[0] for user in most_offer]

    res_dict = book_serializer(books)
    return json_res(200, '获取推荐图书成功', res_dict)
Пример #7
0
    def delete(self, request, pk):
        book = get_object_or_404(Book, pk=pk)

        if book.owner != request.custom_user:
            return json_res(403, "用户认证失败")

        try:
            # 删除或减少redis中推荐排行的键值
            num = int(redis_service.zscore('user_ranking', book.owner.id))
            if num == 1:
                redis_service.zrem('user_ranking', book.owner.id)
            else:
                redis_service.zincrby('user_ranking', book.owner.id, -1)

            book.delete()
        except Exception as e:
            logger.error(e)
            return json_res(400, '删除书籍失败')
        return json_res(200, '删除书籍成功')
Пример #8
0
def get_all_categories(request):
    categories = Category.objects.all()

    counter = categories.count()
    res_list = []
    for c in categories:
        res_list.append({"image_url": 'http://139.199.131.21' + c.image.url, "name": c.name,
                         "detail_url": "http://139.199.131.21/api/book/category/{}/".format(c.id), "id": c.id})
    res_dict = {'sum': counter, 'categories': res_list}
    return json_res(200, '获取所有分类成功', res_dict)
Пример #9
0
def user_info(request, user_id):

    user = get_object_or_404(User, id=user_id)
    res_dict = {
        'id': user.id,
        'nickname': user.nickname,
        'major': user.major,
        'avatarUrl': 'http://139.199.131.21' + user.avatar.url
    }

    return json_res(200, '获取用户信息成功', res_dict)
Пример #10
0
def create_book_info(request):
    req_data = request.POST
    image = request.FILES.get('img', None)
    category_id = req_data.get('category_id', None)

    if not image:
        return json_res(400, '缺少图片')
    try:
        new_book = Book.objects.create(name=req_data['name'], price=req_data['price'],
                                       original_price=req_data['original_price'], owner=request.custom_user,
                                       category_id=category_id, description=req_data['description'])
        new_book.image = image
        new_book.save()
    except Exception as e:
        logger.error(e)
        return json_res(400, '创建书籍信息失败')

    # 保存所有用户发布的书籍数用来进行推荐
    redis_service.zincrby('user_ranking', request.custom_user.id, 1)

    return json_res(200, '创建书籍信息成功', {'detail_url': 'http://139.199.131.21/api/book/{}'.format(new_book.id)})
Пример #11
0
def book_search(request):

    # 基于关键字和类别进行查询
    category_id = request.GET.get('category_id', None)
    query = request.GET.get('query')

    books = Book.objects.all().order_by('-created')
    for c in query:
        books = [book for book in books if c in book.name]
    # books = Book.objects.filter(name__icontains=query).order_by('-created')

    if category_id:
        books = [book for book in books if book.category_id == int(category_id)]

    res_dict = book_serializer(books)
    return json_res(200, '搜索成功', res_dict)
Пример #12
0
    def get(self, request, pk):
        category = get_object_or_404(Category, pk=pk)
        books = category.books.all()

        res_dict = book_serializer(books)
        return json_res(200, '获取书籍列表成功', res_dict)
Пример #13
0
 def get(self, request, pk):
     book = get_object_or_404(Book, pk=pk)
     books = BookSerializer(book).data
     return json_res(200, '获取书籍详情成功', books)
Пример #14
0
    def get(self, request):
        books = Book.objects.all()

        res_dict = book_serializer(books)
        return json_res(200, '获取书籍列表成功', res_dict)
Пример #15
0
def get_user_books(request):

    books = Book.objects.filter(owner=request.custom_user)

    res_dict = book_serializer(books)
    return json_res(200, '获取用户书架成功', res_dict)