【Python】校园二手物品交易系统 Django+vue框架 计算机毕业设计项目 Pycharm+Anaconda部署 附源码+文档+讲解

101 阅读5分钟

前言

💖💖作者:计算机程序员小杨 💙💙个人简介:我是一名计算机相关专业的从业者,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。热爱技术,喜欢钻研新工具和框架,也乐于通过代码解决实际问题,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💕💕文末获取源码联系 计算机程序员小杨 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学习实战项目 计算机毕业设计选题 💜💜

一.开发工具简介

开发语言:Java+Python(两个版本都支持) 后端框架:Spring Boot(Spring+SpringMVC+Mybatis)+Django(两个版本都支持) 前端:Vue+ElementUI+HTML 数据库:MySQL 系统架构:B/S 开发工具:IDEA(Java的)或者PyCharm(Python的)

二.系统内容简介

本校园二手物品交易系统是一个基于B/S架构的综合性平台,采用Python语言开发,后端使用Django框架构建RESTful API接口,前端采用Vue框架实现响应式用户界面,数据库选用MySQL进行数据持久化存储。系统面向校园师生群体,提供二手商品发布与交易、订单全流程管理、用户交互论坛、校园资讯浏览等核心功能模块。通过轮播图管理模块可动态展示热门商品和活动信息,系统公告管理保障重要信息的及时传达,用户管理模块实现身份认证与权限控制。整个系统采用前后端分离的设计思想,利用Django ORM进行数据库操作,Vue组件化开发提升前端交互体验,在PyCharm集成开发环境中完成编码、调试与部署工作,为校园用户提供便捷、安全、高效的二手物品交易解决方案。

三.系统功能演示

校园二手物品交易系统

四.系统界面展示

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

五.系统源码展示


# 核心功能1: 二手商品发布与管理
def create_second_hand_goods(request):
    """处理二手商品发布的核心业务逻辑"""
    goods_name = request.POST.get('goods_name')
    original_price = float(request.POST.get('original_price'))
    selling_price = float(request.POST.get('selling_price'))
    category_id = request.POST.get('category_id')
    description = request.POST.get('description')
    images = request.FILES.getlist('images')
    user_id = request.session.get('user_id')
    
    if selling_price > original_price:
        return JsonResponse({'code': 400, 'msg': '售价不能高于原价'})
    
    if selling_price < 0 or original_price < 0:
        return JsonResponse({'code': 400, 'msg': '价格不能为负数'})
    
    with transaction.atomic():
        goods = SecondHandGoods.objects.create(
            goods_name=goods_name,
            original_price=original_price,
            selling_price=selling_price,
            category_id=category_id,
            description=description,
            seller_id=user_id,
            status=1,
            view_count=0,
            collect_count=0,
            create_time=timezone.now()
        )
        
        for index, image in enumerate(images):
            if image.size > 5 * 1024 * 1024:
                transaction.set_rollback(True)
                return JsonResponse({'code': 400, 'msg': '图片大小不能超过5MB'})
            
            allowed_formats = ['jpg', 'jpeg', 'png', 'gif']
            file_ext = image.name.split('.')[-1].lower()
            if file_ext not in allowed_formats:
                transaction.set_rollback(True)
                return JsonResponse({'code': 400, 'msg': '仅支持jpg、png、gif格式图片'})
            
            file_name = f'goods_{goods.id}_{index}_{timezone.now().timestamp()}.{file_ext}'
            file_path = os.path.join('media/goods', file_name)
            
            with open(file_path, 'wb+') as destination:
                for chunk in image.chunks():
                    destination.write(chunk)
            
            GoodsImage.objects.create(
                goods_id=goods.id,
                image_url=file_path,
                is_cover=1 if index == 0 else 0,
                sort_order=index
            )
        
        user = User.objects.get(id=user_id)
        user.goods_count = user.goods_count + 1
        user.save()
        
        cache.delete(f'goods_list_category_{category_id}')
        cache.delete('goods_list_latest')
        
    return JsonResponse({'code': 200, 'msg': '商品发布成功', 'goods_id': goods.id})


# 核心功能2: 订单生成与状态管理
def create_order(request):
    """处理订单创建的核心业务逻辑"""
    goods_id = request.POST.get('goods_id')
    buyer_id = request.session.get('user_id')
    contact_name = request.POST.get('contact_name')
    contact_phone = request.POST.get('contact_phone')
    delivery_address = request.POST.get('delivery_address')
    delivery_method = request.POST.get('delivery_method')
    remark = request.POST.get('remark', '')
    
    phone_pattern = re.compile(r'^1[3-9]\d{9}$')
    if not phone_pattern.match(contact_phone):
        return JsonResponse({'code': 400, 'msg': '手机号格式不正确'})
    
    with transaction.atomic():
        goods = SecondHandGoods.objects.select_for_update().get(id=goods_id)
        
        if goods.status != 1:
            return JsonResponse({'code': 400, 'msg': '商品已下架或已售出'})
        
        if goods.seller_id == buyer_id:
            return JsonResponse({'code': 400, 'msg': '不能购买自己发布的商品'})
        
        buyer = User.objects.select_for_update().get(id=buyer_id)
        seller = User.objects.get(id=goods.seller_id)
        
        order_no = f'ORD{timezone.now().strftime("%Y%m%d%H%M%S")}{random.randint(1000, 9999)}'
        
        order = Order.objects.create(
            order_no=order_no,
            goods_id=goods_id,
            buyer_id=buyer_id,
            seller_id=goods.seller_id,
            goods_name=goods.goods_name,
            goods_price=goods.selling_price,
            contact_name=contact_name,
            contact_phone=contact_phone,
            delivery_address=delivery_address,
            delivery_method=delivery_method,
            remark=remark,
            order_status=1,
            create_time=timezone.now()
        )
        
        goods.status = 2
        goods.save()
        
        buyer.buy_count = buyer.buy_count + 1
        buyer.save()
        
        OrderLog.objects.create(
            order_id=order.id,
            operator_id=buyer_id,
            operator_type=1,
            action='创建订单',
            create_time=timezone.now()
        )
        
        Message.objects.create(
            receiver_id=seller.id,
            sender_id=buyer_id,
            msg_type=1,
            title='您有新的订单',
            content=f'用户{buyer.username}下单购买了您的商品《{goods.goods_name}》',
            is_read=0,
            create_time=timezone.now()
        )
        
    return JsonResponse({'code': 200, 'msg': '订单创建成功', 'order_no': order_no})


# 核心功能3: 论坛帖子发布与互动管理
def create_forum_post(request):
    """处理论坛帖子发布的核心业务逻辑"""
    title = request.POST.get('title')
    content = request.POST.get('content')
    post_type = int(request.POST.get('post_type'))
    tags = request.POST.get('tags', '')
    images = request.FILES.getlist('images')
    user_id = request.session.get('user_id')
    
    sensitive_words = ['违禁词1', '违禁词2', '广告', '欺诈']
    for word in sensitive_words:
        if word in title or word in content:
            return JsonResponse({'code': 400, 'msg': f'内容包含敏感词:{word}'})
    
    if len(title) < 5 or len(title) > 100:
        return JsonResponse({'code': 400, 'msg': '标题长度需在5-100字之间'})
    
    if len(content) < 10:
        return JsonResponse({'code': 400, 'msg': '内容不能少于10字'})
    
    with transaction.atomic():
        user = User.objects.select_for_update().get(id=user_id)
        
        today_post_count = ForumPost.objects.filter(
            author_id=user_id,
            create_time__date=timezone.now().date()
        ).count()
        
        if today_post_count >= 10:
            return JsonResponse({'code': 400, 'msg': '今日发帖已达上限'})
        
        post = ForumPost.objects.create(
            title=title,
            content=content,
            post_type=post_type,
            tags=tags,
            author_id=user_id,
            view_count=0,
            like_count=0,
            comment_count=0,
            is_top=0,
            is_essence=0,
            status=1,
            create_time=timezone.now()
        )
        
        for index, image in enumerate(images):
            if len(images) > 9:
                transaction.set_rollback(True)
                return JsonResponse({'code': 400, 'msg': '图片数量不能超过9张'})
            
            file_ext = image.name.split('.')[-1].lower()
            file_name = f'post_{post.id}_{index}_{int(time.time())}.{file_ext}'
            file_path = os.path.join('media/forum', file_name)
            
            with open(file_path, 'wb+') as destination:
                for chunk in image.chunks():
                    destination.write(chunk)
            
            PostImage.objects.create(
                post_id=post.id,
                image_url=file_path,
                sort_order=index
            )
        
        user.post_count = user.post_count + 1
        user.experience = user.experience + 5
        
        if user.experience >= 100 and user.level < 2:
            user.level = 2
        elif user.experience >= 500 and user.level < 3:
            user.level = 3
        
        user.save()
        
        if tags:
            tag_list = [tag.strip() for tag in tags.split(',') if tag.strip()]
            for tag_name in tag_list:
                tag, created = ForumTag.objects.get_or_create(tag_name=tag_name)
                tag.use_count = tag.use_count + 1
                tag.save()
                PostTagRelation.objects.create(post_id=post.id, tag_id=tag.id)
        
        cache.delete('forum_post_list_latest')
        cache.delete(f'forum_post_list_type_{post_type}')
        
    return JsonResponse({'code': 200, 'msg': '帖子发布成功', 'post_id': post.id})

六.系统文档展示

在这里插入图片描述

结束

💕💕文末获取源码联系 计算机程序员小杨