博主介绍:✌全网粉丝50W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战8年之久,选择我们就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅点击查看作者主页,了解更多项目!
🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅
1、毕业设计:2026年计算机专业毕业设计选题汇总(建议收藏)✅
2、大数据毕业设计:2026年选题大全 深度学习 python语言 JAVA语言 hadoop和spark(建议收藏)✅
1、项目介绍
技术栈:
Python语言、Django框架、MySQL数据库、scrapy爬虫、django-simpleui 后台ui框架、vue前端框架、HTML
2、项目界面
(1)全国工作地区分析
(2)工作经验分析
(3)薪资水平分析
(4)学历水平分析
(5)招聘数据
(6)薪资预测
(7)注册登录界面
(8)后台数据管理
3、项目说明
后端技术栈(python):
- django
- django-simpleui 后台ui框架
- mysql 数据库
- sqlite3 数据库
数据爬虫(python):
- scrapy 爬虫框架
- requests 轻量爬虫工具
- xpath 页面数据抽取
前端技术栈(nodejs+vue3):
- vue3
- element-plus vue3组件库
- element-plus-admin 页面框架
我们正在寻找一名熟悉以下技术栈的开发人员,来构建一个数据采集分析可视化系统。
技术栈包括Python语言、Django框架、MySQL数据库、scrapy爬虫、django-simpleui后台ui框架、vue前端框架以及HTML。
该系统旨在帮助用户采集各种数据并进行分析和可视化展示。用户可以使用系统中的爬虫模块来采集数据,并将数据存储到MySQL数据库中。同时,用户还可以使用系统中提供的分析工具来对数据进行处理和分析,以便得出有用的结论。
为了方便用户使用,我们将使用django-simpleui作为后台ui框架来构建一个简洁而直观的用户界面。用户可以通过该界面来管理数据采集任务、查看已采集的数据以及进行数据分析和可视化操作。
此外,我们将使用vue前端框架来构建系统的前端界面,以提供更加流畅和响应式的用户体验。前端界面将使用HTML进行布局和渲染。
如果你熟悉上述技术栈,并对数据采集、分析和可视化有一定的了解,那么我们非常欢迎你加入我们的团队,一起构建这个功能强大的数据采集分析可视化系统。
4、核心代码
# 薪资范围查询条件salary_q={'面议':Q(providesalary_max=0)&Q(providesalary_min=0),'3K以下':Q(providesalary_max__lte=3)&Q(providesalary_max__gt=0),'3-5K':Q(providesalary_max__lte=5)&Q(providesalary_max__gt=3),'5-10K':Q(providesalary_max__lte=10)&Q(providesalary_max__gt=5),'10-15K':Q(providesalary_max__lte=15)&Q(providesalary_max__gt=10),'15-20K':Q(providesalary_max__lte=20)&Q(providesalary_max__gt=15),'20-30K':Q(providesalary_max__lte=30)&Q(providesalary_max__gt=20),'30-50K':Q(providesalary_max__lte=50)&Q(providesalary_max__gt=30),'50K以上':Q(providesalary_max__gt=50)}# 工具函数defto_dict(l):def_todict(obj):j={k:vfork,vinobj.__dict__.items()ifnotk.startswith('_')}returnjreturn[_todict(i)foriinl]# 推荐职位视图defrecommand(request):# 需要登陆才能访问ifnotrequest.user.is_authenticated:returnerror('...')try:data=simplejson.loads(request.body)except:data={}params={}pagesize=data.get('pagesize',12)page=data.get('page',1)# 找到用户信息profile=Profile.objects.filter(userid=request.user.id)# 如果存在用户信息,就将用户填写的个人资料作为查询条件,用以筛选职位信息ifprofile:profile=profile[0]ifprofile.workarea:# 如果用户信息填写了工作地区,将它加入职位筛选条件params['workarea_text__icontains']=profile.workareaifprofile.workyear:# 如果用户信息填写了工作年限,将它加入职位筛选条件params['workyear_text']=profile.workyearifprofile.job_name:# 如果用户信息填写了职位名,将它加入职位筛选条件params['job_name__icontains']=profile.job_nameifprofile.degree:# 如果用户信息填写了学历,将它加入职位筛选条件params['degreefrom_text']=profile.degree params_q=Q(**params)# 筛选职位,并按照职位id倒排objs=Job.objects.filter(params_q).order_by('-jobid').all()pg=Paginator(objs,pagesize)# 分页page=pg.page(page)# 返回数据returnJsonResponse({'code':200,'content':{'total':pg.count,'results':to_dict(page.object_list)}})# 薪资水平预测视图defpredict_salary(request):try:data=simplejson.loads(request.body)except:data={}not_q=('total','page','pagesize','providesalary')params={k:vfork,vindata.items()ifknotinnot_qandv}params_q=Q(**params)&Q(providesalary_max__gt=0)# 按所给条件查询职位信息,并聚合,算出最低薪资、最高薪资、平均薪资data=Job.objects.filter(params_q).aggregate(min=Min('providesalary_min'),max=Max('providesalary_min'),avg=Avg('providesalary_min'))# 返回数据returnJsonResponse(data)# 职位信息分页查询defget_jobs(request):try:data=simplejson.loads(request.body)except:data={}not_q=('total','page','pagesize','providesalary')pagesize=data.get('pagesize',12)page=data.get('page',1)# 加入筛选条件params={k:vfork,vindata.items()ifknotinnot_qandv}# 薪资范围筛选条件做特别处理if'providesalary'indataanddata['providesalary']:q=salary_q[data['providesalary']]params_q=Q(**params)&q# 其余筛选条件直接加入else:params_q=Q(**params)# 筛选职位,并按照职位id倒排objs=Job.objects.filter(params_q).order_by('-jobid').all()pg=Paginator(objs,pagesize)# 分页page=pg.page(page)# 返回数据returnJsonResponse({'code':200,'content':{'total':pg.count,'results':to_dict(page.object_list)}})# 获取单个职位详细信息defget_job(request,jobid):# 按所给职位id,查出职位信息并返回obj=get_object_or_404(Job,jobid=jobid)returnJsonResponse(to_dict([obj])[0])# 工作年限分析图defworkyear_chart(request):try:data=simplejson.loads(request.body)except:data={}not_q=('total','page','pagesize','providesalary')# 加入筛选条件params={k:vfork,vindata.items()ifknotinnot_qandv}# 薪资范围筛选条件做特别处理if'providesalary'indataanddata['providesalary']:q=salary_q[data['providesalary']]params_q=Q(**params)&q# 其余筛选条件直接加入else:params_q=Q(**params)# 按所给条件查询职位信息,并按id聚合,统计出所有职位信息的工作年限data={i['workyear_text']:i['count']foriinJob.objects.filter(params_q).values('workyear_text').annotate(count=Count('id'))}# 用饼图展示统计数据c=(Pie().add("",list(data.items()),label_opts=opts.LabelOpts(is_show=False)).set_global_opts(title_opts=opts.TitleOpts(title="工作经验分析",pos_left="40%"),legend_opts=opts.LegendOpts(type_="scroll",pos_right="80%",orient="vertical")))# 返回数据returnHttpResponse(c.dump_options(),content_type="application/json")# 工作地区分析图defworkarea_chart(request):try:data=simplejson.loads(request.body)except:data={}not_q=('total','page','pagesize','providesalary')# 加入筛选条件params={k:vfork,vindata.items()ifknotinnot_qandv}# 薪资范围筛选条件做特别处理if'providesalary'indataanddata['providesalary']:q=salary_q[data['providesalary']]params_q=Q(**params)&q# 其余筛选条件直接加入else:params_q=Q(**params)# 按所给条件查询职位信息,并按id聚合,统计出所有职位信息的工作地区data=[(i['workarea_text'],i['count'])foriinJob.objects.filter(params_q).values('workarea_text').annotate(count=Count('id'))]total=[]# 数据预处理foriindata:city=i[0].split('-')[0]total.extend([city]*i[1])# 真正统计出每个地区有多少职位counter=list(Counter(total).items())# 用地图展示统计数据m=(Map().add("城市",counter,"china-cities",is_roam=False,is_map_symbol_show=False,label_opts=opts.LabelOpts(is_show=False),).set_global_opts(title_opts=opts.TitleOpts(title="工作地区分析"),visualmap_opts=opts.VisualMapOpts(),legend_opts=opts.LegendOpts(is_show=False),))# m.render("map_china_cities.html")# 返回数据returnHttpResponse(m.dump_options(),content_type="aplication/text")# 薪资水平分析图defsalary_chart(request):try:data=simplejson.loads(request.body)except:data={}not_q=('total','page','pagesize','providesalary')# 加入筛选条件params={k:vfork,vindata.items()ifknotinnot_qandv}# 薪资范围筛选条件做特别处理if'providesalary'indataanddata['providesalary']:q=salary_q[data['providesalary']]params_q=Q(**params)&q# 其余筛选条件直接加入else:params_q=Q(**params)# 拿到所有职位数据的最低薪资与最高薪资data=list(Job.objects.filter(params_q).values('providesalary_min','providesalary_max'))# 进行薪资范围分组salary_groups={'面议':lambdai,a:i==0anda==0,'3K以下':lambdai,a:0<a<=3,'3-5K':lambdai,a:3<a<=5,'5-10K':lambdai,a:5<a<=10,'10-15K':lambdai,a:10<a<=15,'15-20K':lambdai,a:15<a<=20,'20-30K':lambdai,a:20<a<=30,'30-50K':lambdai,a:30<a<=50,'50K以上':lambdai,a:a>50}# 统计并将数据进行分组counter=defaultdict(int)foriindata:providesalary_min,providesalary_max=i['providesalary_min'],i['providesalary_max']fork,vinsalary_groups.items():ifv(providesalary_min,providesalary_max):counter[k]+=1break# 用柱状图展示统计数据c=(Bar().add_xaxis([i[0]foriincounter.items()]).add_yaxis("",[i[1]foriincounter.items()],label_opts=opts.LabelOpts(is_show=False)).reversal_axis().set_global_opts(title_opts=opts.TitleOpts(title="薪资水平分析"),# datazoom_opts=opts.DataZoomOpts(orient="vertical"),yaxis_opts=opts.AxisOpts(type_="category",axispointer_opts=opts.AxisPointerOpts(is_show=True,type_="shadow"),)))# 返回数据returnHttpResponse(c.dump_options(),content_type="application/json")# 学历分析图defdegree_chart(request):try:data=simplejson.loads(request.body)except:data={}not_q=('total','page','pagesize','providesalary')# 加入筛选条件params={k:vfork,vindata.items()ifknotinnot_qandv}# 薪资范围筛选条件做特别处理if'providesalary'indataanddata['providesalary']:q=salary_q[data['providesalary']]params_q=Q(**params)&q# 其余筛选条件直接加入else:params_q=Q(**params)# 按所给条件查询职位信息,并按id聚合,统计出不同的学历有多少职位data={i['degreefrom_text']:i['count']foriinJob.objects.filter(params_q).values('degreefrom_text').annotate(count=Count('id'))}# 用饼图展示数据c=(Pie().add("",list(data.items()),label_opts=opts.LabelOpts(is_show=False)).set_global_opts(title_opts=opts.TitleOpts(title="学历水平分析",pos_left="40%"),legend_opts=opts.LegendOpts(type_="scroll",pos_right="80%",orient="vertical")))# 返回数据returnHttpResponse(c.dump_options(),content_type="application/json")5、源码获取方式
biyesheji0005 或 biyesheji0001 (绿色聊天软件)🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看我的【用户名】、【专栏名称】、【顶部选题链接】就可以找到我啦🍅
感兴趣的可以先收藏起来,点赞、关注不迷路,下方查看👇🏻获取联系方式👇🏻