前言
💖💖作者:计算机程序员小杨 💙💙个人简介:我是一名计算机相关专业的从业者,擅长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})
六.系统文档展示
结束
💕💕文末获取源码联系 计算机程序员小杨