Django校园二手交易平台实战:MySQL部署与Admin定制
简介这是一套基于PythonDjangoMySQL开发的校园二手交易市场完整项目源码与配套文档专为计算机、通信、人工智能、自动化等专业学生设计适用于课程设计、大作业及毕业设计等实践场景尤其适合Python Web开发初学者入门与进阶者二次开发。资源包含198个文件涵盖37个核心Python后端逻辑文件、21个HTML前端页面、13个CSS样式文件如login.css、user_center.css、release_goods.css等、7个JS交互脚本及28个PNG/51个JPG图片资源整体压缩包仅5.08MB轻量易部署。目前已有95人学习下载项目经答辩评审获98分高分所有代码均通过本地调试与功能测试附带清晰文档说明可直接运行结构遵循Django标准MVT模式模块划分明确含用户中心、商品发布、详情浏览、搜索筛选等典型电商功能是理解Web全栈开发流程与校园场景落地实践的优质参考范例。1. 为什么一个“校园二手交易市场”要用 Django 而不是 Flask 或纯 Python Web Server你刚接手一个课程设计或毕业设计任务实现一个能跑在校园局域网里的二手书、旧电脑、自行车流转平台。不是演示 Demo而是要交源代码、能部署、有登录、能上传图片、支持搜索、管理员能审核——最后还得答辩时现场操作不崩。这时候选技术栈就不是“哪个框架语法顺”而是“哪个能让我在两周内把数据库建好、用户注册流程走通、后台管理页面点开就用、导出数据不丢字段”。Django 正是为此类中等复杂度、强业务逻辑、需快速交付的 Web 应用而生它自带用户认证系统django.contrib.auth内置 Admin 后台改个admin.py就能管所有模型ORM 层屏蔽 MySQL 底层 SQL 差异迁移命令python manage.py makemigrations一敲表结构变更自动同步。相比 Flask你不用从零配蓝图、写登录态中间件、手撸分页逻辑相比纯 Python HTTP Server你不必自己解析 POST 表单、处理文件上传边界、防范 SQL 注入。本项目标题里明确标注“高分项目”正因为它踩中了教学场景的三个硬需求可验证的完整业务流发布→浏览→下单→审核、可展示的后台管理界面Admin、可复现的本地部署路径PythonDjangoMySQL 三件套。适合大三下到大四上、已学过数据库原理与 Web 基础、但没做过全栈项目的同学——它不考验算法深度而检验工程落地能力。2. 用 Django 在本地跑通校园二手交易市场的最小命令集2.1 初始化项目结构从django-admin startproject到startapp goods创建项目前先确认 Python 环境推荐 Python 3.9–3.11。Django 官方要求mysqlclient作为 MySQL 驱动它依赖系统级 C 编译工具和 MySQL 开发头文件。Linux/macOS 用户需先安装# Ubuntu/Debian sudo apt-get install python3-dev default-libmysqlclient-dev build-essential # macOS (Homebrew) brew install mysql-client pip3 install mysqlclientWindows 用户建议使用conda避免编译问题conda install mysql-python # 或使用预编译 wheelpip install --only-binaryall mysqlclient安装 Django 并初始化项目pip install django4.2.7 # 选 LTS 版本兼容性更稳 django-admin startproject campus_market . python manage.py startapp goods python manage.py startapp users提示campus_market是项目根目录名goods存放商品模型书籍、数码、生活用品users重载 Django 默认 User 模型以扩展学生证号、院系、年级字段。不要把所有模型塞进models.py按业务域拆分更易维护。2.2 定义核心模型商品、用户、订单的三张 MySQL 表如何映射为 Django Modelgoods/models.py中定义商品主模型关键字段必须包含owner外键关联users.CustomUser非auth.User因需存储学号status用CharField(choices...)控制状态流转on_sale,sold,removedimages用ImageField配合Pillow处理缩略图后续部署需配置MEDIA_ROOTprice用DecimalField(max_digits8, decimal_places2)避免浮点精度误差。# goods/models.py from django.db import models from users.models import CustomUser class Goods(models.Model): STATUS_CHOICES [ (on_sale, 在售), (sold, 已售), (removed, 已下架), ] owner models.ForeignKey(CustomUser, on_deletemodels.CASCADE, related_namegoods_list) title models.CharField(max_length100, verbose_name标题) description models.TextField(verbose_name描述) price models.DecimalField(max_digits8, decimal_places2, verbose_name价格) status models.CharField(max_length20, choicesSTATUS_CHOICES, defaulton_sale) created_at models.DateTimeField(auto_now_addTrue) updated_at models.DateTimeField(auto_nowTrue) class Meta: verbose_name 商品 verbose_name_plural 商品列表 ordering [-created_at]users/models.py扩展用户模型继承AbstractUser并添加校园属性# users/models.py from django.contrib.auth.models import AbstractUser from django.db import models class CustomUser(AbstractUser): student_id models.CharField(max_length12, uniqueTrue, blankTrue, nullTrue, verbose_name学号) department models.CharField(max_length50, blankTrue, verbose_name院系) grade models.CharField(max_length10, blankTrue, verbose_name年级) avatar models.ImageField(upload_toavatars/, blankTrue, nullTrue, verbose_name头像) class Meta: verbose_name 用户 verbose_name_plural 用户管理2.3 配置 MySQL 数据库连接settings.py中的 5 个必调参数Django 默认使用 SQLite切换 MySQL 需修改campus_market/settings.py的DATABASES配置。以下参数必须显式设置缺一不可参数值示例说明ENGINEdjango.db.backends.mysql强制指定 MySQL 后端不能省略NAMEcampus_market_db数据库名需提前在 MySQL 中CREATE DATABASE campus_market_db CHARACTER SET utf8mb4;USERcampus_userMySQL 用户名不要用 root应新建专用账号并授权GRANT ALL PRIVILEGES ON campus_market_db.* TO campus_userlocalhost IDENTIFIED BY StrongPass123!;PASSWORDStrongPass123!密码需与上一步创建用户时一致OPTIONS{init_command: SET sql_modeSTRICT_TRANS_TABLES}关键禁用 MySQL 宽松模式防止插入空字符串导致NOT NULL字段报错完整配置段落# campus_market/settings.py DATABASES { default: { ENGINE: django.db.backends.mysql, NAME: campus_market_db, USER: campus_user, PASSWORD: StrongPass123!, HOST: 127.0.0.1, PORT: 3306, OPTIONS: { init_command: SET sql_modeSTRICT_TRANS_TABLES, charset: utf8mb4, }, TEST: { CHARSET: utf8mb4, COLLATION: utf8mb4_unicode_ci, } } }注意charset和TEST.COLLATION必须设为utf8mb4否则中文标题、描述会乱码或截断。执行python manage.py migrate前务必确认 MySQL 服务已启动且账号权限正确。3. 让 Admin 后台真正可用3 个定制化动作与 2 个必装插件3.1 在admin.py中注册模型并启用搜索、过滤、批量操作Django Admin 默认只显示模型名对“校园二手市场”这类运营型系统必须让管理员能快速筛选未审核商品、按院系查用户、批量下架违规物品。goods/admin.py示例# goods/admin.py from django.contrib import admin from .models import Goods admin.register(Goods) class GoodsAdmin(admin.ModelAdmin): list_display [title, owner, price, status, created_at] # 列表页显示字段 list_filter [status, created_at, owner__department] # 右侧过滤栏跨表用双下划线 search_fields [title, description, owner__username, owner__student_id] # 顶部搜索框 list_editable [status] # 列表页直接编辑状态 date_hierarchy created_at # 按时间导航 actions [make_sold, make_removed] def make_sold(self, request, queryset): queryset.update(statussold) make_sold.short_description 标记为已售 def make_removed(self, request, queryset): queryset.update(statusremoved) make_removed.short_description 批量下架users/admin.py需重载 UserAdmin 以显示扩展字段# users/admin.py from django.contrib import admin from django.contrib.auth.admin import UserAdmin from .models import CustomUser admin.register(CustomUser) class CustomUserAdmin(UserAdmin): list_display [username, student_id, department, grade, is_staff] fieldsets UserAdmin.fieldsets ( (校园信息, {fields: (student_id, department, grade, avatar)}), ) add_fieldsets UserAdmin.add_fieldsets ( (校园信息, {fields: (student_id, department, grade, avatar)}), )3.2 安装django-jazzmin实现 Admin 界面美化与响应式布局默认 Admin 界面灰暗、不支持深色模式、移动端体验差。django-jazzmin是当前最主流的免费美化方案支持主题切换、菜单折叠、图标自定义且完全兼容 Django 4.x。安装与配置pip install django-jazzmin在settings.py的INSTALLED_APPS顶部插入INSTALLED_APPS [ jazzmin, # 必须放在第一位 django.contrib.admin, # ... 其他 app ]添加 Jazzmin 专属配置支持中文、深色模式、自定义菜单# settings.py JAZZMIN_SETTINGS { site_title: 校园二手市场后台, site_header: Campus Market, site_brand: 校园二手市场, welcome_sign: 欢迎登录管理后台, copyright: Copyright © 2024 校园二手市场团队, show_sidebar: True, navigation_expanded: True, order_with_respect_to: [auth, goods, users], icons: { auth: fas fa-users-cog, auth.user: fas fa-user, auth.group: fas fa-users, goods.goods: fas fa-shopping-cart, users.customuser: fas fa-user-graduate, }, theme: darkly, # 可选litera, minty, lumen, darkly dark_mode_theme: darkly, }提示order_with_respect_to控制左侧菜单排序icons为每个模型指定 Font Awesome 图标大幅提升可识别性。执行python manage.py collectstatic后重启服务即可生效。3.3 集成django-import-export实现 Excel 数据导入导出教师常需导出当月交易数据做分析或批量导入初始商品如图书馆淘汰书目。django-import-export支持 CSV/Excel 格式且与 Admin 深度集成。安装与配置pip install django-import-export在goods/admin.py中启用# goods/admin.py from import_export import resources from import_export.admin import ImportExportModelAdmin class GoodsResource(resources.ModelResource): class Meta: model Goods fields (id, title, description, price, status, owner__username, owner__student_id) export_order fields admin.register(Goods) class GoodsAdmin(ImportExportModelAdmin): # 继承 ImportExportModelAdmin resource_class GoodsResource # ... 其余配置保持不变此时 Admin 商品列表页将出现 “Import” 和 “Export” 按钮点击即可下载模板 Excel 或上传数据批量创建商品。4. 部署前必做的 4 项 MySQL 优化与安全加固4.1 为高频查询字段创建复合索引解决商品列表加载慢问题校园二手市场首页需按statuscreated_at排序展示最新在售商品。若仅对created_at单独建索引MySQL 仍需全表扫描过滤statuson_sale。应建立复合索引-- 登录 MySQL 执行 USE campus_market_db; CREATE INDEX idx_goods_status_created ON goods_goods (status, created_at DESC);验证索引是否生效EXPLAIN SELECT * FROM goods_goods WHERE status on_sale ORDER BY created_at DESC LIMIT 20;输出中key列应显示idx_goods_status_createdrows值远小于总记录数表明索引命中。注意Django 迁移不管理索引需手动执行 SQL 或使用RunSQL迁移。生产环境务必在低峰期操作。4.2 配置 MySQL 连接池与超时参数避免并发访问时连接耗尽Django 默认每次请求新建 MySQL 连接高并发时易触发Too many connections错误。在settings.py的DATABASES中加入连接池参数DATABASES { default: { # ... 原有配置 CONN_MAX_AGE: 60, # 连接复用 60 秒 OPTIONS: { init_command: SET sql_modeSTRICT_TRANS_TABLES, charset: utf8mb4, read_timeout: 10, write_timeout: 10, connect_timeout: 10, } } }同时在 MySQL 配置文件my.cnf或my.ini中调高最大连接数[mysqld] max_connections 200 wait_timeout 60 interactive_timeout 60重启 MySQL 服务后生效。4.3 清理敏感调试信息关闭DEBUGTrue并配置ALLOWED_HOSTS开发时DEBUGTrue会暴露完整错误堆栈含路径、环境变量上线前必须关闭# settings.py DEBUG False ALLOWED_HOSTS [campus-market.example.edu, 192.168.1.100, localhost] # 严格限定域名/IP若使用 Nginx 反向代理还需添加SECURE_PROXY_SSL_HEADER (HTTP_X_FORWARDED_PROTO, https)4.4 设置静态资源与媒体文件路径避免图片上传后 404Django 开发模式下用runserver可自动服务静态文件但生产环境必须由 Nginx/Apache 托管。settings.py中明确路径import os from pathlib import Path BASE_DIR Path(__file__).resolve().parent.parent.parent STATIC_URL /static/ STATIC_ROOT os.path.join(BASE_DIR, staticfiles) # collectstatic 输出目录 MEDIA_URL /media/ MEDIA_ROOT os.path.join(BASE_DIR, media) # 用户上传文件存放目录执行python manage.py collectstatic收集所有静态文件CSS/JS/图标到staticfiles目录Nginx 配置需指向该路径。5. 本地验证与答辩演示的 3 个关键检查点5.1 用python manage.py check --deploy执行生产环境合规性扫描Django 内置部署检查工具能发现DEBUGTrue、SECRET_KEY硬编码、密码校验器缺失等高危问题python manage.py check --deploy典型输出及修复?: (security.W004) You have not set a value for the SECURE_HSTS_SECONDS setting.→ 添加SECURE_HSTS_SECONDS 31536000仅 HTTPS 环境启用?: (security.W008) Your SECURE_SSL_REDIRECT setting is not set to True.→ 若使用 HTTPS设SECURE_SSL_REDIRECT True?: (security.W019) You have django.middleware.csrf.CsrfViewMiddleware in your MIDDLEWARE, but you have not set CSRF_COOKIE_SECURE to True.→ 设CSRF_COOKIE_SECURE True提示答辩前务必运行此命令它是评委快速判断项目是否达到生产就绪标准的第一关。5.2 模拟真实用户流从注册、发布、搜索到管理员审核的端到端测试不要只测单个接口要走通闭环。准备 3 个测试账号学生账号 A注册 → 发布 2 本教材 → 上传封面图 → 设置价格 15.00 元学生账号 B搜索“高等数学” → 点击商品 → 查看详情页含卖家院系、学号管理员账号登录 Admin → 在Goods列表页勾选 A 发布的商品 → 点击 “标记为已售”。验证点商品详情页 URL 是否为/goods/1/Django 通用 DetailView搜索结果是否按标题模糊匹配__icontainsAdmin 操作后商品状态是否实时更新且updated_at时间戳变化。5.3 检查源代码包结构确保评审老师解压即运行高分项目源码包不是.py文件堆砌而是符合 Django 项目规范的可执行结构。解压后应有campus_market/ ├── manage.py ├── campus_market/ # 项目配置目录 │ ├── __init__.py │ ├── settings.py # 已配置 MySQLDEBUGFalse │ ├── urls.py │ └── wsgi.py ├── goods/ # App 目录 │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── models.py │ └── ... ├── users/ │ ├── __init__.py │ ├── admin.py │ ├── models.py │ └── ... ├── requirements.txt # 明确列出 django4.2.7, mysqlclient2.2.4 ├── README.md # 包含环境要求、安装步骤、数据库初始化 SQL、管理员账号 └── db.sqlite3 # 删除必须用 MySQL此处仅作占位提示requirements.txt必须锁定版本Django4.2.7 mysqlclient2.2.4 Pillow10.0.1 django-jazzmin2.6.0 django-import-export3.4.0最后一句答辩时打开终端cd 进项目根目录输入python manage.py runserver 0.0.0.0:8000然后用手机浏览器访问http://你的IP:8000/admin—— 如果 Admin 页面正常加载、能登录、能查看商品列表这个项目就已具备高分基础。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联
返回资讯列表 →