100-基于Python的智联招聘数据可视化分析推荐系统

发布于:2025-08-12 ⋅ 阅读:(17) ⋅ 点赞:(0)

智联招聘数据可视化分析与推荐系统 - 高质量项目分享

目录


项目概述

本项目是一个基于Python Flask + Vue.js的智联招聘数据可视化分析与推荐系统。系统通过爬虫采集智联招聘的职位数据,结合协同过滤推荐算法,为用户提供个性化的职位推荐服务,并通过丰富的可视化图表展示招聘市场的整体趋势和分布情况。

主要特性

  • 智能搜索:支持多条件筛选和关键词搜索
  • 数据可视化:丰富的图表展示招聘数据分布
  • 地图展示:交互式地图展示职位地理分布
  • 个性化推荐:基于协同过滤算法的智能推荐
  • 数据采集:自动化爬虫采集最新职位数据
  • 现代化UI:基于Vuetify的Material Design界面

技术架构

后端技术栈

  • Python 3.8
  • Flask 2.x
  • Flask-SQLAlchemy
  • Flask-CORS
  • Flask-Marshmallow
  • PyMySQL
  • Scrapy
  • jieba
  • lxml/cssselect

前端技术栈

  • Vue.js 2.x
  • Vuetify
  • ECharts
  • Vue-Router
  • Vuex
  • Axios
  • Vue-ECharts

数据库

  • MySQL

项目结构

python智联招聘数据分析系统/
├── algorithm/                 # 推荐算法模块
│   ├── __init__.py
│   ├── ItemCF.py             # 基于物品的协同过滤
│   └── UserCF.py             # 基于用户的协同过滤
├── api/                      # API接口模块
│   ├── __init__.py
│   ├── fileApi.py            # 文件上传下载API
│   ├── jobApi.py             # 职位相关API
│   └── userApi.py            # 用户相关API
├── base/                     # 基础工具模块
│   ├── __init__.py
│   ├── base.py               # 基础类
│   ├── code.py               # 状态码定义
│   ├── core.py               # 核心工具
│   ├── response.py           # 响应封装
│   └── uitl.py               # 工具函数
├── models/                   # 数据模型
│   ├── __init__.py
│   ├── job.py                # 职位模型
│   └── model.py              # 基础模型
├── spider/                   # 爬虫模块
│   ├── README.md             # 爬虫说明文档
│   ├── main.py               # 主爬虫脚本
│   ├── wash.py               # 数据清洗脚本
│   └── ZhiLian/              # Scrapy爬虫项目
├── job-vue/                  # 前端Vue项目
│   ├── src/
│   │   ├── api/              # API请求
│   │   ├── components/       # Vue组件
│   │   ├── views/            # 页面视图
│   │   ├── router/           # 路由配置
│   │   ├── store/            # Vuex状态管理
│   │   └── plugins/          # 插件配置
│   ├── package.json          # 前端依赖
│   └── vue.config.js         # Vue配置
├── static/                   # 静态资源
├── templates/                # 模板文件
├── upload/                   # 文件上传目录
├── utils/                    # 工具模块
├── app.py                    # Flask主应用
├── requirements.txt          # Python依赖
└── design_100_flask_job.sql # 数据库结构

项目展示

系统截图展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

演示视频展示

基于Python的智联招聘数据可视化分析推荐系统

源码获取

💭码界筑梦坊各平台同名,博客底部含联系卡片

核心功能实现

1. 数据采集与清洗

爬虫实现
  • 通过spider/main.py自动化采集智联招聘职位数据,支持多参数(城市、学历、经验等)灵活配置。
  • 数据采集后存入MySQL数据库的tb_job表。
数据清洗
  • 通过spider/wash.py对原始数据进行去重、标准化、福利字段补全等处理,清洗后数据存入tb_job2表。
  • 示例代码片段:
# spider/wash.py
import pymysql
import random
welfare_options = [ ... ]
# 连接数据库,遍历每条记录,随机分配福利
for record in records:
    selected_welfares = random.sample(welfare_options, 3)
    welfare_str = ', '.join(selected_welfares)
    cursor.execute(f"UPDATE tb_job2 SET welfare = '{welfare_str}' WHERE id = {record[0]}")

2. 推荐算法实现

  • algorithm/ItemCF.pyalgorithm/UserCF.py实现了基于物品和用户的协同过滤推荐算法。
  • 推荐逻辑通过用户收藏、浏览等行为数据,计算职位相似度或用户相似度,为用户推荐个性化职位。

3. 后端API设计

  • app.py为主入口,注册了用户、职位等蓝图。
  • api/jobApi.pyapi/userApi.py等文件实现了职位列表、详情、推荐、收藏、用户注册登录等接口。
  • 支持文件上传、下载、数据统计等功能。

4. 前端可视化

  • 前端采用Vue.js + Vuetify + ECharts,页面美观,交互友好。
  • 主要页面包括:职位搜索与展示、职位详情、收藏管理、数据可视化大屏、地图分布等。
  • 组件化开发,易于维护和扩展。
可视化展示预留

这里可以插入项目实际运行时的可视化大屏截图、ECharts图表、地图分布等效果图。


API接口设计

  • RESTful风格,接口清晰易用。
  • 主要接口:
    • /user/register 用户注册
    • /user/login 用户登录
    • /job/list 职位列表(支持分页、筛选、搜索)
    • /job/detail/<id> 职位详情
    • /job/recommend 个性化推荐
    • /job/statistics 数据统计
    • /file/upload 文件上传

部署与运行

后端

pip install -r requirements.txt
python app.py

前端

cd job-vue
npm install
npm run serve

数据库

  • 运行design_100_flask_job.sql初始化数据库结构。

项目特色

  • 全流程自动化:数据采集、清洗、入库、分析、推荐、可视化一体化
  • 算法驱动:协同过滤推荐,提升用户体验
  • 可视化丰富:多维度图表、地图、统计大屏
  • 代码结构清晰,易于二次开发

总结与展望

本项目实现了智联招聘数据的全流程分析与可视化推荐,适合数据分析、可视化、推荐系统等方向的学习和实践。后续可扩展更多数据源、优化推荐算法、完善用户体系和管理后台,实现更智能的人岗匹配和数据洞察。


如需源码、部署文档或可视化大屏演示,请联系作者或访问项目主页。

智联招聘数据可视化分析与推荐系统 —— 技术实践与架构详解(进阶版)

目录


一、项目背景与目标

随着互联网招聘平台的兴起,海量职位数据为求职者和企业提供了丰富的选择,但也带来了信息过载和匹配效率低下的问题。本项目以智联招聘为数据源,构建了一个集数据采集、清洗、分析、可视化与智能推荐于一体的系统,旨在:

  • 自动化采集并清洗招聘数据,提升数据质量
  • 多维度可视化分析招聘市场现状与趋势
  • 基于用户行为和职位特征,智能推荐岗位
  • 提供美观、交互友好的前端大屏,辅助决策

二、整体技术架构

本系统采用前后端分离架构,技术选型如下:

后端

  • Python 3.8:主开发语言
  • Flask:轻量级Web框架,负责API服务
  • Flask-SQLAlchemy:ORM,简化数据库操作
  • PyMySQL:MySQL数据库驱动
  • Scrapy:高效爬虫框架,负责数据采集
  • jieba:中文分词,辅助文本分析
  • Marshmallow:数据序列化与校验
  • lxml/cssselect:HTML/XML解析

前端

  • Vue.js 2.x:渐进式前端框架
  • Vuetify:Material Design风格UI组件库
  • ECharts:强大的数据可视化图表库
  • Vuex:状态管理
  • Vue-Router:前端路由
  • Axios:HTTP请求库

数据库

  • MySQL:关系型数据库,存储结构化数据

三、项目目录结构详解

python智联招聘数据分析系统/
├── algorithm/                 # 推荐算法模块
│   ├── ItemCF.py             # 基于物品的协同过滤
│   └── UserCF.py             # 基于用户的协同过滤
├── api/                      # API接口
│   ├── fileApi.py            # 文件上传下载
│   ├── jobApi.py             # 职位相关API
│   └── userApi.py            # 用户相关API
├── base/                     # 基础工具与响应封装
├── models/                   # ORM数据模型
├── spider/                   # 爬虫与数据清洗
│   ├── main.py               # 主爬虫脚本
│   ├── wash.py               # 数据清洗脚本
│   └── ZhiLian/              # Scrapy项目
├── job-vue/                  # 前端Vue项目
│   ├── src/
│   │   ├── api/              # 前端API请求
│   │   ├── components/       # 组件
│   │   ├── views/            # 页面视图
│   │   ├── plugins/          # 插件
│   │   └── store/            # 状态管理
├── app.py                    # Flask主入口
├── requirements.txt          # Python依赖
└── design_100_flask_job.sql  # 数据库结构

四、核心功能模块

1. 数据采集与清洗

1.1 爬虫采集
  • 使用spider/main.py和Scrapy框架,自动化采集智联招聘职位数据。
  • 支持参数化采集(城市、学历、经验、职位类型等),可灵活扩展。
  • 数据采集后存入MySQL的tb_job表。

示例代码片段:

# spider/main.py
import requests, pymysql
# ...省略参数设置...
for page in range(1, 101):
    params = {...}
    response = requests.get(base_url, params=params)
    for job in response.json()['data']['results']:
        # 数据入库
        cursor.execute("INSERT INTO tb_job ...", ...)
1.2 数据清洗
  • 通过spider/wash.py对原始数据去重、标准化、补全福利字段。
  • 清洗后数据存入tb_job2表,便于后续分析与展示。

示例代码片段:

# spider/wash.py
import pymysql, random
welfare_options = [...]
for record in records:
    selected = random.sample(welfare_options, 3)
    cursor.execute(f"UPDATE tb_job2 SET welfare = '{','.join(selected)}' WHERE id = {record[0]}")

2. 数据存储与建模

  • 数据库结构见design_100_flask_job.sql,主要表包括:
    • tb_job:原始职位数据
    • tb_job2:清洗后职位数据
    • 用户、收藏等表
  • ORM模型定义在models/目录,便于与Flask-SQLAlchemy集成。

3. 后端API设计与实现

  • app.py为主入口,注册了用户、职位等蓝图。
  • api/jobApi.pyapi/userApi.py等文件实现了职位列表、详情、推荐、收藏、用户注册登录等接口。
  • 支持文件上传、下载、数据统计等功能。

API示例:

  • /user/register 用户注册
  • /user/login 用户登录
  • /job/list 职位列表(分页、筛选、搜索)
  • /job/detail/<id> 职位详情
  • /job/recommend 个性化推荐
  • /job/statistics 数据统计
  • /file/upload 文件上传

4. 推荐算法实现

  • algorithm/ItemCF.pyalgorithm/UserCF.py实现了基于物品和用户的协同过滤推荐算法。
  • 推荐逻辑通过用户收藏、浏览等行为数据,计算职位相似度或用户相似度,为用户推荐个性化职位。

算法核心思路:

  • ItemCF:找出与用户已收藏职位相似的其他职位,按相似度推荐
  • UserCF:找出与当前用户兴趣相似的其他用户,推荐他们喜欢的职位

5. 前端可视化与交互

  • 前端采用Vue.js + Vuetify + ECharts,页面美观,交互友好。
  • 主要页面包括:职位搜索与展示、职位详情、收藏管理、数据可视化大屏、地图分布等。
  • 组件化开发,易于维护和扩展。

可视化展示建议:

  • 城市分布地图(ECharts中国地图)
  • 行业分布饼图/柱状图
  • 薪资区间分布折线图
  • 学历要求统计条形图
  • 用户收藏与推荐结果可视化

五、可视化大屏与数据洞察

预留:可插入系统实际运行时的可视化大屏截图、ECharts图表、地图分布等效果图。

  • 城市分布地图:直观展示各城市职位数量热力分布
  • 行业分布饼图:分析热门行业与岗位需求
  • 薪资趋势折线图:洞察市场薪资变化
  • 学历要求条形图:了解企业对学历的偏好

六、系统部署与运行

后端

pip install -r requirements.txt
python app.py

前端

cd job-vue
npm install
npm run serve

数据库

  • 运行design_100_flask_job.sql初始化数据库结构。

七、项目亮点与技术总结

  • 全流程自动化:数据采集、清洗、入库、分析、推荐、可视化一体化
  • 算法驱动:协同过滤推荐,提升用户体验
  • 可视化丰富:多维度图表、地图、统计大屏
  • 代码结构清晰,易于二次开发和功能扩展
  • 前后端分离,接口规范,易于对接和维护

八、未来展望与优化方向

  • 支持更多招聘平台数据接入,实现多源数据融合
  • 优化推荐算法,引入深度学习/图神经网络等前沿方法
  • 完善用户体系与权限管理,支持企业端与求职端双视角
  • 增加管理后台,实现数据审核、日志监控、权限分配等功能
  • 丰富可视化大屏,支持自定义报表与导出

本文档为项目技术深度分享,欢迎交流与指正。如需源码、部署文档或可视化大屏演示,请联系作者或访问项目主页。


九、核心代码实现展示

1. 后端API接口实现

职位相关API(jobApi.py)
# api/jobApi.py - 职位搜索接口
@jobBp.route('/get', methods=["GET"])
def get():
    res = ResMsg()
    keyword = request.args.get('keyword')
    
    # 模糊搜索职位名称
    result = db.session.query(Job).filter(
        Job.position_name.like('%' + keyword + '%')
    ).order_by(Job.publish_time.desc()).limit(8).all()
    
    data = job_schema.dump(result)
    res.update(code=ResponseCode.SUCCESS, data=data)
    return res.data

# 收藏职位接口
@jobBp.route('/favorite', methods=["POST", "OPTIONS"])
def favorite_job():
    res = ResMsg()
    user_id = request.json.get('user_id')
    job_id = request.json.get('job_id')
    
    if not user_id or not job_id:
        res.update(code=ResponseCode.INVALID_PARAMETER, 
                  msg=ResponseMessage.INVALID_PARAMETER)
        return res.data
    
    user = User.query.get(user_id)
    job = Job.query.get(job_id)
    
    if not user or not job:
        res.update(code=ResponseCode.NO_RESOURCE_FOUND, 
                  msg=ResponseMessage.NO_RESOURCE_FOUND)
        return res.data
    
    # 创建收藏记录
    favorite = UserJobFavorite(user=user, job=job)
    db.session.add(favorite)
    db.session.commit()
    
    res.update(code=ResponseCode.SUCCESS, msg=ResponseMessage.SUCCESS)
    return res.data

# 数据统计接口
@jobBp.route('/getPanel', methods=["GET"])
def getPanel():
    res = ResMsg()
    
    # 统计总职位数
    total_jobs = db.session.query(func.count(Job.id)).scalar()
    
    # 统计总用户数
    total_users = db.session.query(func.count(User.id)).scalar()
    
    # 统计总收藏数
    total_favorites = db.session.query(func.count(UserJobFavorite.id)).scalar()
    
    data = {
        'total_jobs': total_jobs,
        'total_users': total_users,
        'total_favorites': total_favorites
    }
    
    res.update(code=ResponseCode.SUCCESS, data=data)
    return res.data
城市分布统计接口
# api/jobApi.py - 城市职位分布统计
@jobBp.route('/getCityJob', methods=["GET"])
def getCityJob():
    res = ResMsg()
    
    # 按城市分组统计职位数量
    city_stats = db.session.query(
        Job.city,
        func.count(Job.id).label('count')
    ).group_by(Job.city).order_by(
        func.count(Job.id).desc()
    ).limit(10).all()
    
    data = []
    for city, count in city_stats:
        data.append({
            'name': city,
            'value': count
        })
    
    res.update(code=ResponseCode.SUCCESS, data=data)
    return res.data

2. 推荐算法核心实现

基于物品的协同过滤(ItemCF.py)
# algorithm/ItemCF.py - 协同过滤推荐算法
class ItemBasedCF():
    def __init__(self):
        # 找到相似的8个职位,为目标用户推荐4个
        self.n_sim_movie = 8
        self.n_rec_movie = 4
        self.trainSet = {}
        self.movie_sim_matrix = {}
        self.movie_popular = {}
        self.movie_count = 0

    # 从数据库获取用户-职位数据
    def get_dataset(self, pivot=0.75):
        cursor = cnn.cursor()
        sql = 'select * from tb_rate'
        cursor.execute(sql)
        
        for item in cursor.fetchall():
            user, movie, rating = item[1:]
            self.trainSet.setdefault(user, {})
            self.trainSet[user][movie] = rating
        
        cursor.close()
        print('Split trainingSet and testSet success!')

    # 计算职位之间的相似度
    def calc_movie_sim(self):
        # 统计每个职位被收藏的次数
        for user, movies in self.trainSet.items():
            for movie in movies:
                if movie not in self.movie_popular:
                    self.movie_popular[movie] = 0
                self.movie_popular[movie] += 1

        # 构建职位相似度矩阵
        for user, movies in self.trainSet.items():
            for m1 in movies:
                for m2 in movies:
                    if m1 == m2:
                        continue
                    self.movie_sim_matrix.setdefault(m1, {})
                    self.movie_sim_matrix[m1].setdefault(m2, 0)
                    self.movie_sim_matrix[m1][m2] += 1

        # 计算余弦相似度
        for m1, related_movies in self.movie_sim_matrix.items():
            for m2, count in related_movies.items():
                if self.movie_popular[m1] == 0 or self.movie_popular[m2] == 0:
                    self.movie_sim_matrix[m1][m2] = 0
                else:
                    self.movie_sim_matrix[m1][m2] = count / math.sqrt(
                        self.movie_popular[m1] * self.movie_popular[m2]
                    )

    # 为用户推荐职位
    def recommend(self, user):
        K = self.n_sim_movie
        N = self.n_rec_movie
        rank = {}
        
        watched_movies = self.trainSet[user]
        
        for movie, rating in watched_movies.items():
            for related_movie, w in sorted(
                self.movie_sim_matrix[movie].items(),
                key=itemgetter(1), reverse=True
            )[:K]:
                if related_movie in watched_movies:
                    continue
                rank.setdefault(related_movie, 0)
                rank[related_movie] += w * rating
        
        return sorted(rank.items(), key=itemgetter(1), reverse=True)[:N]

3. 前端组件实现

职位卡片组件(JobCard.vue)
<!-- job-vue/src/components/JobCard.vue -->
<template>
  <v-card :loading="loading" class="mx-auto my-12" max-width="374">
    <template #progress>
      <v-progress-linear color="light-green" height="10" indeterminate></v-progress-linear>
    </template>

    <v-img height="90" :src="doubanImg(item.company_logo)"></v-img>

    <v-card-title>{{ item.position_name }}</v-card-title>

    <v-card-text>
      <v-row align="center" class="mx-0">
        <div class="grey--text ms-4">
          企业: {{ item.company_name }} · {{ item.city }}
        </div>
        <div class="grey--text ms-4">
          薪酬: {{ item.salary0 }} - {{ item.salary1 }}元
        </div>
        <div class="grey--text ms-4">
          企业性质:{{ item.coattr }}·{{ item.nation }}
        </div>
        <div class="grey--text ms-4">
          学历要求:{{ item.degree }}
        </div>
        <div class="grey--text ms-4">
          公司规模:{{ item.cosize0 }} - {{ item.cosize1 }}
        </div>
      </v-row>

      <div>{{ item.intro }}</div>
    </v-card-text>

    <v-divider class="mx-4"></v-divider>

    <v-card-title>公司福利</v-card-title>

    <v-card-text>
      <v-chip-group v-model="selection" active-class="deep-purple accent-4 white--text" column>
        <template v-if="item.welfare">
          <v-chip v-for="(welfareItem, index) in item.welfare.split(',')" :key="index">
            {{ welfareItem }}
          </v-chip>
        </template>
        <template v-else>
          <v-chip>暂无数据</v-chip>
        </template>
      </v-chip-group>
    </v-card-text>

    <v-card-actions>
      <v-btn color="deep-purple lighten-2" text @click="reserve(item.company_url)">
        公司详情
      </v-btn>
      <v-btn color="deep-purple accent-2" text @click="reserve(item.url)">
        职位详情
      </v-btn>
      <!-- 仅非游客显示收藏按钮 -->
      <v-btn v-if="userId!== '-1'" 
              :class="{'favorite-button': true, 'favorite-button--active': isFavorite}"
              text @click="toggleFavorite">
        <v-icon>{{ isFavorite ? 'mdi-bookmark-check' : 'mdi-bookmark-outline' }}</v-icon>
        <span>{{ isFavorite ? '已收藏' : '收藏' }}</span>
      </v-btn>
    </v-card-actions>
  </v-card>
</template>

<script>
import { favoriteJob, unfavoriteJob, checkFavorite } from "../api/favorite";

export default {
  name: 'JobCard',
  props: {
    item: {
      type: Object,
      required: true
    },
    userId: {
      type: String,
      default: '-1'
    }
  },
  data() {
    return {
      loading: false,
      selection: 0,
      isFavorite: false
    }
  },
  methods: {
    async toggleFavorite() {
      if (this.userId === '-1') {
        this.$toast.error('请先登录');
        return;
      }
      
      try {
        if (this.isFavorite) {
          await unfavoriteJob(this.userId, this.item.id);
          this.isFavorite = false;
          this.$toast.success('取消收藏成功');
        } else {
          await favoriteJob(this.userId, this.item.id);
          this.isFavorite = true;
          this.$toast.success('收藏成功');
        }
      } catch (error) {
        this.$toast.error('操作失败');
      }
    },
    
    reserve(url) {
      window.open(url, '_blank');
    },
    
    doubanImg(img) {
      return img || 'https://via.placeholder.com/300x200?text=Company+Logo';
    }
  },
  
  async mounted() {
    if (this.userId !== '-1') {
      try {
        const result = await checkFavorite(this.userId, this.item.id);
        this.isFavorite = result.data;
      } catch (error) {
        console.error('检查收藏状态失败:', error);
      }
    }
  }
}
</script>

<style scoped>
.favorite-button {
  transition: all 0.3s ease;
}

.favorite-button--active {
  color: #ff4081 !important;
}

.favorite-button:hover {
  transform: scale(1.1);
}
</style>

4. 数据可视化组件

ECharts图表组件示例
<!-- job-vue/src/components/DataChart.vue -->
<template>
  <div class="chart-container">
    <div ref="chartRef" :style="{ height: height, width: width }"></div>
  </div>
</template>

<script>
import * as echarts from 'echarts'

export default {
  name: 'DataChart',
  props: {
    chartData: {
      type: Array,
      default: () => []
    },
    chartType: {
      type: String,
      default: 'bar'
    },
    height: {
      type: String,
      default: '400px'
    },
    width: {
      type: String,
      default: '100%'
    }
  },
  data() {
    return {
      chart: null
    }
  },
  mounted() {
    this.initChart()
  },
  methods: {
    initChart() {
      this.chart = echarts.init(this.$refs.chartRef)
      this.updateChart()
    },
    updateChart() {
      const option = {
        title: {
          text: this.getChartTitle(),
          left: 'center'
        },
        tooltip: {
          trigger: 'item'
        },
        series: [{
          type: this.chartType,
          data: this.chartData,
          radius: this.chartType === 'pie' ? '50%' : undefined
        }]
      }
      
      this.chart.setOption(option)
    },
    getChartTitle() {
      const titles = {
        'bar': '职位分布统计',
        'pie': '城市分布',
        'line': '趋势分析'
      }
      return titles[this.chartType] || '数据统计'
    }
  },
  watch: {
    chartData: {
      handler() {
        this.updateChart()
      },
      deep: true
    }
  },
  beforeDestroy() {
    if (this.chart) {
      this.chart.dispose()
    }
  }
}
</script>

5. 数据清洗脚本

福利数据补全(wash.py)
# spider/wash.py - 数据清洗与福利补全
import pymysql
import random

# 定义所有福利选项
welfare_options = [
    '五险一金', '绩效奖金', '全勤奖', '餐补', '定期体检', '免费班车', '寒暑假',
    '住房补贴', '年底双薪', '交通补助', '通讯补助', '14薪', '节日福利', '每年多次调薪',
    '补充商业保险', '带薪年假', '弹性工作制度', '员工旅游', '健身补贴', '培训机会',
    '股票期权', '子女教育补贴', '生日福利', '高温补贴', '低温补贴', '生育补贴',
    '病假福利', '婚假福利', '丧假福利', '陪产假福利', '加班补贴', '团建活动',
    '零食下午茶', '女性专属福利', '远程办公', '员工食堂', '宠物友好办公环境',
    '免息贷款', '内部推荐奖励', '年终分红', '技能提升奖励', '团队活动经费',
    '家属关怀福利', '免费职业规划咨询', '健身俱乐部会员', '节日礼品定制',
    '购房补贴', '购车补贴', '心理辅导服务', '员工折扣', '海外交流机会',
    '亲子活动', '免费洗衣服务', '办公环境升级福利', '紧急救助基金',
    '文化艺术活动补贴', '兴趣小组活动支持'
]

def update_welfare_data():
    """更新职位福利数据"""
    db = pymysql.connect(
        host='127.0.0.1',
        user='root',
        password='123456',
        port=3306,
        database='design_100_flask_job',
        charset='utf8'
    )
    
    try:
        cursor = db.cursor()
        
        # 查询所有职位记录
        select_sql = "SELECT id FROM tb_job2"
        cursor.execute(select_sql)
        records = cursor.fetchall()
        
        for record in records:
            record_id = record[0]
            # 随机选择3个福利
            selected_welfares = random.sample(welfare_options, 3)
            welfare_str = ', '.join(selected_welfares)
            
            # 更新福利字段
            update_sql = f"UPDATE tb_job2 SET welfare = '{welfare_str}' WHERE id = {record_id}"
            cursor.execute(update_sql)
        
        # 提交事务
        db.commit()
        print("福利数据更新成功")
        
    except pymysql.Error as e:
        db.rollback()
        print(f"更新失败:{e}")
    finally:
        cursor.close()
        db.close()

if __name__ == "__main__":
    update_welfare_data()

十、技术亮点总结

1. 架构设计亮点

  • 前后端分离:Vue.js + Flask,接口清晰,易于维护
  • 模块化设计:爬虫、算法、API、前端各模块独立,便于扩展
  • 数据驱动:从数据采集到可视化展示的完整链路

2. 算法实现亮点

  • 协同过滤推荐:基于用户行为的个性化推荐
  • 数据清洗:自动化处理,提升数据质量
  • 实时统计:动态计算各类数据指标

3. 前端交互亮点

  • 响应式设计:适配多种设备
  • 组件化开发:可复用组件,开发效率高
  • 用户体验:流畅的交互和美观的界面

4. 数据可视化亮点

  • 多维度展示:地图、图表、统计大屏
  • 交互性强:支持筛选、钻取、缩放等操作
  • 实时更新:数据变化时图表自动刷新

以上代码展示了项目的核心实现逻辑,体现了从数据采集、处理、算法、API到前端展示的完整技术栈。项目代码结构清晰,注释完善,适合学习和二次开发。


网站公告

今日签到

点亮在社区的每一天
去签到