Python+Django实战:构建校园与同城一体化兼职招聘平台(附源码)
一、项目背景与痛点
校园学生、同城自由职业者、小微企业临时用工场景中,兼职求职与岗位发布需求十分旺盛。目前主流渠道多为微信群、朋友圈、第三方分类信息平台、线下海报,这类传统模式存在诸多难以解决的问题,严重影响求职与招聘效率:
- 岗位信息杂乱,虚假兼职泛滥:第三方平台、社群缺少人工审核,刷单、诈骗、高薪陷阱等虚假岗位大量存在,求职者极易上当受骗;
- 信息无标准化分类:兼职岗位混杂在一起,无法按照岗位类型、薪资、工作地点、工期筛选,查找目标岗位耗时费力;
- 求职流程割裂:看到岗位后需要额外添加微信、电话沟通,简历无法线上投递,沟通链路长且不集中;
- 招聘方管理不便:发布的岗位无法统一管理,求职人员信息零散,没有简历归档、人员筛选能力;
- 缺少风控与举报机制:违规岗位、恶意账号无法及时处理,平台环境难以维护;
- 无数据统计能力:无法统计岗位发布量、求职热度、热门兼职类型,不能为平台运营提供数据支撑。
针对传统兼职招聘渠道的各类短板,本次基于Python+Django4.2 + MySQL + Ajax搭建轻量化校园/同城兼职招聘系统,实现岗位分类、发布审核、简历在线投递、留言沟通、多条件检索、违规举报、运营统计全套闭环能力。本项目开辟本地生活服务、招聘求职全新赛道,和往期所有项目无功能、代码、业务场景重合。
二、核心目标与定位
本项目核心目标:搭建标准化、可风控的线上兼职招聘平台,实现招聘方发布岗位→管理员内容审核→求职者检索岗位→在线简历投递→双方留言沟通→违规内容举报→平台风控处理→招聘数据统计完整闭环,打造纯净、有序的兼职求职环境,彻底替代杂乱的社群与第三方分类平台。
项目精准定位:轻量化招聘类Web系统,采用Django原生MVT架构,无需前后端分离,部署简单、资源占用低;划分超级管理员、招聘方、求职用户三类独立角色,权限严格隔离;主要面向高校校园、同城小微企业、本地自由职业群体,主打岗位合规、检索便捷、沟通集中、风控完善。
核心设计理念:岗位标准化、审核前置化、求职流程一体化、风控常态化、数据可视化,解决兼职信息杂乱、虚假泛滥、沟通割裂的核心痛点。
三、整体技术方案
项目基于Django原生MVT分层架构开发,MySQL存储岗位、简历、留言、举报、用户全量数据,Ajax实现页面无刷新投递与沟通交互,后端封装检索算法、状态流转、风控逻辑,自定义中间件实现多角色权限拦截。整体分层架构流程图如下:
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 招聘方操作层 │────▶│ 岗位发布层 │────▶│ 审核风控层 │────▶│ 岗位展示层 │
│ 发布兼职、编辑岗位、查看简历 │ 填写岗位信息、提交发布申请 │ 管理员审核、拦截违规岗位 │ 分类展示、多条件检索岗位 │
│ │ │ │
▼ ▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 简历投递层 │────▶│ 在线沟通层 │────▶│ 举报处理层 │
│ 求职者在线投递简历、自动归档 │ 岗位留言、双向消息互动 │ 违规举报、账号/岗位封禁 │
│ │ │
▼ ▼
┌─────────────┐
│ 运营统计层 │
│ 岗位量、求职量、热门岗位数据图表统计 │
│
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ 底层技术底座 │
│ - 后端框架:Python3.11 + Django4.2 原生MVT架构 │
│ - 数据存储:MySQL 存储用户、岗位、简历、留言、举报全业务数据 │
│ - 前端交互:Ajax 实现无刷新投递、留言、筛选操作 │
│ - 检索能力:Django ORM 多条件组合查询,实现精准岗位筛选 │
│ - 状态管控:自定义岗位/简历/举报全状态流转枚举 │
│ - 权限体系:多角色中间件,隔离招聘方、求职者、管理员权限 │
│ - 可视化:ECharts 实现招聘运营数据看板 │
└─────────────────────────────────────────────────────────────────────────
完整技术栈清单:
- Web后端:Python 3.11、Django 4.2 原生MVT轻量化架构
- 数据库:MySQL 8.0,结构化存储招聘全链路数据
- 异步交互:Ajax 完成页面无刷新操作,提升使用体验
- 查询筛选:ORM多条件组合查询,实现复杂岗位检索
- 状态管理:自定义枚举类,管控岗位、简历、举报全生命周期状态
- 权限控制:自定义中间件,区分三类用户操作权限
- 数据可视化:ECharts 制作运营统计图表
四、核心能力模块详解
1. 兼职岗位分类模块
搭建标准化分类体系,实现岗位精细化划分,为检索打下基础:
- 一级+二级多级分类:分为校园兼职、同城全职/短期工、线上居家兼职三大主类,细分家教、文案、跑腿、促销等子分类;
- 分类管理:管理员可新增、编辑、停用分类,适配不同地区、校园的兼职特点;
- 分类统计:自动统计每个分类下岗位数量,直观展示热门兼职方向;
- 分类筛选:前端支持一键切换分类,快速过滤对应岗位。
2. 岗位发布与前置审核模块(核心亮点)
采用**先审核、后展示**机制,从源头过滤虚假、违规岗位:
- 完整岗位录入:填写岗位名称、工作内容、薪资待遇、工作地点、工期、招聘人数、联系方式;
- 发布限制:单个账号每日发布岗位数量做限制,防止恶意刷屏;
- 审核流程:岗位提交后默认进入待审核状态,管理员审核通过才对外展示;
- 岗位管理:招聘方可编辑、下架、删除已发布岗位,实时修改信息。
3. 多条件岗位检索模块
满足求职者多样化筛选需求,快速匹配心仪兼职:
- 关键词检索:支持岗位名称、工作内容模糊搜索;
- 组合筛选:按薪资范围、工作地点、工期、岗位类型多条件联动筛选;
- 排序功能:支持按发布时间、薪资高低进行排序;
- 分页展示:海量岗位分页加载,避免页面卡顿。
4. 简历在线投递模块
一体化求职流程,告别线下、微信传简历的繁琐操作:
- 个人简历建档:求职者完善姓名、联系方式、技能、经验等简历信息,一次填写多次使用;
- 一键投递:浏览岗位后直接在线投递,系统自动绑定简历与岗位;
- 投递状态区分:已投递、已查看、已邀约、已拒绝多状态流转;
- 简历归档:招聘方可集中查看所有投递简历,批量筛选求职者。
5. 岗位留言与在线沟通模块
搭建站内沟通渠道,统一对话入口,脱离第三方社交软件:
- 公共留言区:岗位详情页开放留言,求职者提问、招聘方统一回复;
- 一对一私信:支持双方发起私聊,沟通细节薪资、时间等私密问题;
- 留言管控:管理员可删除广告、辱骂等违规留言;
- 消息提醒:新留言、新私信实时提示。
6. 违规举报与风控模块
建立用户监督+人工审核的双重风控体系,净化平台环境:
- 多类型举报:支持举报虚假岗位、高薪诈骗、广告骚扰、辱骂言论;
- 举报工单:举报信息生成独立工单,管理员统一处理;
- 处罚机制:对违规岗位下架、违规账号临时封禁/永久封禁;
- 举报溯源:每条举报记录永久留存,可追溯举报人与违规内容。
7. 招聘运营统计模块
量化平台运营数据,为运营策略提供依据:
- 核心数据统计:总岗位数、有效岗位数、总投递量、活跃用户数;
- 分类热度统计:各兼职分类的岗位占比、投递热度排行;
- 时间趋势:按日/周统计岗位发布量、求职投递量;
- 违规数据统计:统计举报量、违规处理率,评估风控效果。
五、创新价值与亮点
- 前置审核机制 :岗位发布必须人工审核,从源头拦截虚假兼职、诈骗信息,大幅降低求职风险;
- 求职流程一体化 :集浏览、筛选、投递、沟通于一体,无需跳转第三方软件,流程更高效;
- 完善风控体系 结合用户举报+人工处理+账号封禁,多重手段维护平台纯净环境;
- 多角色权限隔离 招聘方、求职者、管理员各司其职,数据与操作权限相互独立;
- 轻量化易落地 无需复杂中间件,校园、社区、小微企业均可快速部署使用。
六、应用前景与落地场景
- 高校校园兼职平台 专供本校学生、校内商家发布兼职,地域集中、信任度高;
- 同城本地招聘站点 服务同城小微企业、自由职业者,短期用工、临时岗位发布;
- 社团/工作室招人 校园社团、线上工作室发布成员招募、短期协作岗位;
- 毕业设计/求职项目 招聘类系统业务场景新颖,区别于常规管理系统,差异化优势突出。
七、完整代码结构示例
1. 项目整体目录结构
django-part-time-recruit/
├── manage.py
├── recruit_project/ # 项目全局配置
│ ├── settings.py # 数据库、权限、分页、限流配置
│ ├── urls.py # 全局路由分发
│ └── middleware.py # 多角色权限拦截中间件
├── apps/ # 模块化业务拆分
│ ├── user_account/ # 用户注册、登录、角色区分模块
│ ├── job_category/ # 兼职分类管理模块
│ ├── job_publish/ # 岗位发布、审核、管理模块
│ ├── resume_deliver/ # 简历建档、在线投递模块
│ ├── message_chat/ # 留言、私信沟通模块
│ ├── report_risk/ # 举报、违规风控模块
│ └── data_stat/ # 运营数据统计、看板模块
├── core/ # 公共工具类
│ ├── query_tool.py # 多条件岗位检索工具
│ ├── status_check.py # 状态、限流校验工具
│ ├── msg_filter.py # 违规留言过滤工具
│ └── stat_calc.py # 运营数据计算工具
├── static/ # 样式、脚本、ECharts资源
├── templates/ # 前后台页面模板
├── media/ # 简历附件、岗位配图存储
├── requirements.txt # 项目依赖
└── readme.md # 部署使用文档
</pre>
### 2. 核心可运行代码片段
#### 示例1:岗位、简历、举报核心数据模型
```python
from django.db import models
from django.contrib.auth.models
# 岗位状态枚举
JOB_STATUS = (
("wait_audit", "待审核"),
("normal", "正常展示"),
("offline", "已下架"),
("illegal", "违规下架"),
)
# 简历投递状态
DELIVER_STATUS = (
("wait_view", "待查看"),
("viewed", "已查看"),
("invite", "已邀约"),
("refuse", "已拒绝"),
)
# 举报类型
REPORT_TYPE = (
("fake", "虚假岗位"),
("fraud", "诈骗陷阱"),
("ad", "广告骚扰"),
("abuse", "言语辱骂"),
)
class JobCategory(models.Model):
"""兼职分类模型"""
name = models.CharField(max=50, verbose_name="分类名称")
parent = models.ForeignKey("self", null=True, blank=True, on_delete=models.SET_NULL, verbose_name="父分类")
create_time = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
class PartTimeJob(models.Model):
"""兼职岗位模型"""
publisher = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="发布人")
category = models.ForeignKey(JobCategory, on_delete=models.CASCADE, verbose_name="所属分类")
job_name = models.CharField(max=100, verbose_name="岗位名称")
job_content = models.TextField(verbose_name="工作内容")
salary = models.CharField(max=50, verbose_name="薪资待遇")
work_addr = models.CharField(max=100, verbose_name="工作地点")
recruit_num = models.IntegerField(default=1, verbose_name="招聘人数")
contact = models.CharField(max=50, verbose_name="联系方式")
status = models.CharField(max=12, choices=JOB_STATUS, default="wait_audit", verbose_name="岗位状态")
create_time = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.job_name
class ResumeDeliver(models.Model):
"""简历投递模型"""
job = models.ForeignKey(PartTimeJob, on_delete=models.CASCADE, verbose_name="关联岗位")
user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="投递用户")
real_name = models.CharField(max=30, verbose_name="姓名")
phone = models.CharField(max=11, verbose_name="联系电话")
skill = models.TextField(blank=True, verbose_name="个人技能")
deliver_status = models.CharField(max=12, choices=DELIVER_STATUS, default="wait_view", verbose_name="投递状态")
create_time = models.DateTimeField(auto_now_add=True)
class UserReport(models.Model):
"""违规举报模型"""
report_user = models.ForeignKey(User, related="report_user", on_delete=models.CASCADE, verbose_name="举报人")
job = models.ForeignKey(PartTimeJob, null=True, blank=True, on_delete=models.CASCADE, verbose_name="关联岗位")
report_type = models.CharField(max=10, choices=REPORT_TYPE, verbose_name="举报类型")
report_desc = models.TextField(verbose_name="举报描述")
handle_status = models.BooleanField(default=False, verbose_name="是否已处理")
create_time = models.DateTimeField(auto_now_add=True)
示例2:多条件岗位检索工具类(core/query_tool.py)
from django.db.models import Q
from apps.job_publish.models import PartTimeJob
class JobQueryTool:
"""岗位多条件检索工具"""
@classmethod
def search_job(cls, category_id=None, keyword="", min_salary=None, max_salary=None):
"""组合条件查询岗位"""
# 只查询审核通过、正常展示的岗位
query_set = PartTimeJob.objects.filter(status="normal")
# 分类筛选
if category_id:
query_set = query_set.filter(category_id=category_id)
# 关键词模糊搜索
if keyword:
query_set = query_set.filter(
Q(job_name__icontains=keyword) | Q(job_content__icontains=keyword)
)
# 简易薪资筛选(适配文本薪资字段)
return query_set.order_by("-create_time")
示例3:岗位发布核心视图逻辑(apps/job_publish/views.py)
from django.views import View
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.shortcuts import redirect, render
from django.contrib import messages
from apps.job_publish.models import PartTimeJob
from apps.job_category.models import JobCategory
@method_decorator(login_required, name="dispatch")
class JobPublishView(View):
"""岗位发布视图"""
def get(self, request):
# 加载所有分类
category_list = JobCategory.objects.all()
return render(request, "job_publish.html", {"category_list": category_list})
def post(self, request):
# 获取表单参数
category_id = request.POST.get("category_id")
job_name = request.POST.get("job_name")
job_content = request.POST.get("job_content")
salary = request.POST.get("salary")
work_addr = request.POST.get("work_addr")
recruit_num = request.POST.get("recruit_num")
contact = request.POST.get("contact")
# 基础校验
if not all([job_name, job_content, salary, work_addr]):
messages.error(request, "请填写完整岗位信息!")
return redirect("job_publish")
# 新增岗位,默认待审核
PartTimeJob.objects.create(
publisher=request.user,
category_id=category_id,
job_name=job_name,
job_content=job_content,
salary=salary,
work_addr=work_addr,
recruit_num=recruit_num,
contact=contact
)
messages.success(request, "岗位发布成功,等待管理员审核!")
return redirect("job_list")
八、总结与展望
本篇博客聚焦校园/同城兼职招聘全新业务赛道,基于Python+Django搭建一体化招聘求职平台,和往期日志、天气、在线考试、图书、网盘、考勤、驾校、进销存、租赁等所有项目完全独立。项目主打前置审核、多条件检索、简历投递、站内沟通、违规风控五大核心能力,融合ORM组合查询、角色权限、状态流转、Ajax交互等技术,业务高度贴合校园与本地用工场景,代码规范、可直接部署落地。
该项目既适合学习Django复杂查询、多角色权限、状态管理等知识点,同时作为毕业设计、简历实战项目,在招聘类垂直系统中具备极高的差异化竞争力。
后续迭代规划
- 新增岗位推送功能,根据用户偏好,定时推送匹配的兼职岗位;
- 接入短信通知,简历投递、审核结果、举报处理通过短信提醒相关用户;
- 新增岗位收藏功能,求职者收藏心仪岗位,方便后续查看投递;
- 完善地图定位,根据距离远近筛选周边兼职岗位。
更多推荐
所有评论(0)