快递管理系统

张开发
2026/4/11 8:24:39 15 分钟阅读

分享文章

快递管理系统
快递管理系统欢迎使用Markdown编辑器快递管理系统 - Windows 服务器部署指南快速部署5分钟完成第一步复制项目第二步修改数据库配置如需连接外部MySQL第三步运行部署脚本服务管理命令访问地址关机自动重启说明常见问题目录结构主要模块源码欢迎使用Markdown编辑器快递管理系统 - Windows 服务器部署指南快速部署5分钟完成第一步复制项目将整个GE快递程序 v1文件夹复制到服务器例如C:\ExpressSystem第二步修改数据库配置如需连接外部MySQL编辑express_system\.env文件修改以下内容DB_NAME你的数据库名 DB_USER你的数据库用户名 DB_PASSWORD你的数据库密码 DB_HOST数据库IP地址第三步运行部署脚本方式一手动运行推荐首次双击运行 deploy.bat方式二安装为Windows服务关机自动重启右键 install_service.bat - 以管理员身份运行服务管理命令操作命令启动服务net start ExpressService停止服务net stop ExpressService重启服务net stop ExpressService然后net start ExpressService卸载服务双击运行uninstall_service.bat访问地址系统主页http://127.0.0.1:8000管理后台http://127.0.0.1:8000/admin/默认账号admin/admin123关机自动重启说明安装服务后服务会在✅ 服务器开机时自动启动✅ 系统崩溃后自动重启✅ 关机后再次开机自动运行查看服务状态WinR-services.msc- 找到快递管理系统常见问题1. 服务无法启动检查MySQL数据库是否正常运行检查.env文件中的数据库连接信息是否正确2. 端口被占用修改install_service.bat中的端口或修改runserver 8000为其他端口3. 需要修改管理员密码cdexpress_system python manage.py shell from django.contrib.auth.modelsimportUser uUser.objects.get(usernameadmin)u.set_password(新密码)u.save()目录结构快递程序 v1/ ├── deploy.bat # 手动运行脚本 ├── install_service.bat # 安装Windows服务管理员运行 ├── uninstall_service.bat # 卸载服务 ├── express_system/ │ ├── .env # 数据库配置 │ ├── manage.py │ ├── requirements.txt │ └── ...主要模块用户认证模块用户登录user_login用户退出user_logout快递信息管理模块列表显示express_list详情查看express_detail添加快递express_add编辑快递express_edit删除快递express_delete订单扫描与操作模块扫码页面scan_page自动扫码识别scan_auto出库扫码scan_outbound确认扫码操作scan_confirm权限控制通过login_required装饰器确保只有登录用户可以操作相关页面和接口其他功能使用分页Paginator管理快递列表通过表单如ExpressForm、ExpressSearchForm实现数据验证和筛选记录操作日志ExpressLog源码from django.shortcuts import render, redirect, get_object_or_404from django.contrib.auth import login, logoutfrom django.contrib.auth.decorators import login_requiredfrom django.contrib.auth.forms import AuthenticationFormfrom django.core.paginator import Paginatorfrom django.urls import reversefrom django.http import JsonResponsefrom django.utils import timezonefrom .models import Express, ExpressLogfrom .forms import ExpressForm, ExpressSearchForm, ScanFormdef user_login(request):if request.user.is_authenticated:return redirect(‘index’)if request.method ‘POST’:form AuthenticationForm(request, datarequest.POST)if form.is_valid():user form.get_user()login(request, user)return redirect(‘index’)else:form AuthenticationForm()return render(request, ‘express/login.html’, {‘form’: form})def user_logout(request):logout(request)return redirect(‘login’)login_requireddef index(request):return express_list(request)login_requireddef express_list(request):form ExpressSearchForm(request.GET)express_list Express.objects.all().order_by(‘-inbound_time’)if form.is_valid(): tn form.cleaned_data.get(tracking_number) if tn: express_list express_list.filter(tracking_number__icontainstn) recipient form.cleaned_data.get(recipient) if recipient: express_list express_list.filter(recipient__icontainsrecipient) status form.cleaned_data.get(status) if status: express_list express_list.filter(statusstatus) start_date form.cleaned_data.get(start_date) if start_date: express_list express_list.filter(inbound_time__gtestart_date) end_date form.cleaned_data.get(end_date) if end_date: express_list express_list.filter(inbound_time__lteend_date) paginator Paginator(express_list, 20) page_number request.GET.get(page) page_obj paginator.get_page(page_number) return render(request, express/list.html, { page_obj: page_obj, form: form, paginator: paginator, })login_requireddef express_detail(request, pk):express get_object_or_404(Express, pkpk)logs express.logs.all()return render(request, ‘express/detail.html’, {‘express’: express,‘logs’: logs,})login_requireddef express_add(request):if request.method ‘POST’:form ExpressForm(request.POST)if form.is_valid():express form.save(commitFalse)express.operator request.userexpress.status ‘inbound’express.save()ExpressLog.objects.create(expressexpress,action‘inbound’,operatorrequest.user,descriptionf入库: {express.tracking_number})return redirect(‘express_list’)else:# 允许通过GET参数预填充tracking_numberinitial_data {}tn request.GET.get(‘tracking_number’)if tn:initial_data[‘tracking_number’] tnform ExpressForm(initialinitial_data)return render(request, ‘express/form.html’, {‘form’: form, ‘action’: ‘添加’})login_requireddef express_edit(request, pk):express get_object_or_404(Express, pkpk)if request.method ‘POST’:form ExpressForm(request.POST, instanceexpress)if form.is_valid():form.save()ExpressLog.objects.create(expressexpress,action‘update’,operatorrequest.user,descriptionf修改信息)return redirect(‘express_detail’, pkexpress.pk)else:form ExpressForm(instanceexpress)return render(request, ‘express/form.html’, {‘form’: form, ‘express’: express, ‘action’: ‘编辑’})login_requireddef express_delete(request, pk):express get_object_or_404(Express, pkpk)express.delete()return redirect(‘express_list’)from django.views.decorators.csrf import csrf_exemptlogin_requireddef scan_page(request):return render(request, ‘express/scan.html’)csrf_exemptlogin_requireddef scan_auto(request):if request.method ‘POST’:tracking_number request.POST.get(‘tracking_number’, ‘’).strip()if not tracking_number:return JsonResponse({‘success’: False, ‘message’: ‘请输入快递单号’})express Express.objects.filter(tracking_numbertracking_number).first() if express: if express.status outbound: return JsonResponse({success: False, message: 该快递已出库}) return JsonResponse({ success: True, action: outbound, express_id: express.pk, message: 该快递已入库确认出库, express_info: { tracking_number: express.tracking_number, recipient: express.recipient, status: express.status } }) else: return JsonResponse({ success: True, action: inbound, message: 新快递准备入库, express_info: { tracking_number: tracking_number } }) return JsonResponse({success: False, message: 仅支持POST请求})csrf_exemptlogin_requireddef scan_outbound(request):if request.method ‘POST’:tracking_number request.POST.get(‘tracking_number’, ‘’).strip()if not tracking_number:return JsonResponse({‘success’: False, ‘message’: ‘请输入快递单号’})express Express.objects.filter(tracking_numbertracking_number).first() if not express: return JsonResponse({success: False, message: 未找到该快递}) if express.status outbound: return JsonResponse({success: False, message: 该快递已出库}) express.status outbound express.outbound_time timezone.now() express.save() ExpressLog.objects.create( expressexpress, actionoutbound, operatorrequest.user, descriptionf列表页出库 ) return JsonResponse({success: True, message: 出库成功}) return JsonResponse({success: False, message: 仅支持POST请求})csrf_exemptlogin_requireddef scan_confirm(request):if request.method ‘POST’:tracking_number request.POST.get(‘tracking_number’, ‘’).strip()recipient request.POST.get(‘recipient’, ‘’).strip()action request.POST.get(‘action’, ‘’).strip()if not tracking_number: return JsonResponse({success: False, message: 快递单号不能为空}) if action inbound: if not recipient: return JsonResponse({success: False, message: 收件人姓名不能为空}) quantity request.POST.get(remark, 1).strip() try: quantity max(1, int(quantity)) except (ValueError, TypeError): quantity 1 existing Express.objects.filter(tracking_numbertracking_number).first() if existing: if existing.status outbound: return JsonResponse({success: False, message: 该快递已出库无法重复入库}) return JsonResponse({success: False, message: 该单号已存在请勿重复入库}) express Express.objects.create( tracking_numbertracking_number, remarkstr(quantity), sender未知, recipientrecipient, recipient_phone未知, recipient_address未知, statusstored, operatorrequest.user ) ExpressLog.objects.create( expressexpress, actioninbound, operatorrequest.user, descriptionf扫码入库 ) return JsonResponse({success: True, message: 入库成功, action: inbound}) elif action outbound: express Express.objects.filter(tracking_numbertracking_number).first() if not express: return JsonResponse({success: False, message: 未找到该快递}) if express.status outbound: return JsonResponse({success: False, message: 该快递已出库}) express.status outbound express.outbound_time timezone.now() express.save() ExpressLog.objects.create( expressexpress, actionoutbound, operatorrequest.user, descriptionf扫码出库 ) return JsonResponse({success: True, message: 出库成功, action: outbound}) return JsonResponse({success: False, message: 无效的操作}) return JsonResponse({success: False, message: 仅支持POST请求})

更多文章