拓冰建站拓冰建站
首页 / 资讯中心 / 正文

基于微信小程序的城科毕业生就业系统设计与实现

摘要本文设计并实现了一个基于微信小程序的城科城市科技毕业生就业系统。系统旨在为毕业生、企业和学校三方搭建一个高效、便捷的就业服务平台。前端采用微信小程序原生框架后端使用 Spring Boot MyBatis-Plus 架构数据库选用 MySQL。系统核心功能包括毕业生简历投递与职位搜索、企业招聘信息发布与管理、学校就业数据统计与分析。本文将从技术栈选型、项目背景与意义、核心模块设计与实现代码等方面进行详细阐述。1. 项目背景与意义随着高校扩招和就业市场竞争加剧毕业生就业信息不对称、求职渠道分散、学校就业管理效率低下等问题日益凸显。传统的线下招聘会和校园就业网站在移动化、便捷性和实时性方面存在不足。微信小程序凭借其免安装、即用即走、用户基数庞大的特点成为构建轻量级就业服务平台的理想载体。本系统旨在整合学校、企业和毕业生资源实现以下目标对毕业生提供便捷的职位搜索、简历一键投递、面试通知接收等功能提升求职效率。对企业提供精准的毕业生人才库、高效的招聘信息发布与管理渠道降低招聘成本。对学校实现就业数据的实时统计、可视化分析为就业指导工作提供数据支持提升管理效能。本项目的实践对探索“互联网就业”新模式、推动智慧校园建设具有积极的现实意义。2. 技术栈选型2.1 前端技术栈开发框架微信小程序原生框架 (WXML, WXSS, JavaScript)UI 组件库Vant Weapp 或 ColorUI用于快速构建美观界面网络请求wx.request API数据缓存wx.setStorage/wx.getStorage API地图服务腾讯位置服务用于企业位置展示2.2 后端技术栈核心框架Spring Boot 2.xORM 框架MyBatis-Plus简化数据库操作数据库MySQL 8.0缓存Redis用于会话管理、热点数据缓存安全与认证Spring Security JWTJSON Web TokenAPI 文档Swagger2 / Knife4j项目构建Maven2.3 开发与部署版本控制Git后端部署Docker 云服务器如阿里云 ECS小程序发布微信公众平台3. 系统核心模块设计与实现3.1 数据库设计核心表结构以下为部分核心表的 SQL 建表语句-- 用户表毕业生/企业/管理员 CREATE TABLE sys_user ( id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键, username varchar(50) NOT NULL COMMENT 用户名, password varchar(255) NOT NULL COMMENT 密码, nick_name varchar(50) DEFAULT NULL COMMENT 昵称, user_type tinyint(1) NOT NULL COMMENT 用户类型1-毕业生2-企业3-管理员, avatar varchar(500) DEFAULT NULL COMMENT 头像, phone varchar(20) DEFAULT NULL COMMENT 手机号, status tinyint(1) DEFAULT 1 COMMENT 状态0-禁用1-正常, create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, PRIMARY KEY (id), UNIQUE KEY uk_username (username) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT用户表; -- 毕业生信息扩展表 CREATE TABLE graduate_info ( id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键, user_id bigint(20) NOT NULL COMMENT 关联用户ID, real_name varchar(50) DEFAULT NULL COMMENT 真实姓名, gender tinyint(1) DEFAULT NULL COMMENT 性别0-女1-男, major varchar(100) DEFAULT NULL COMMENT 专业, education varchar(20) DEFAULT NULL COMMENT 学历, graduation_year int(4) DEFAULT NULL COMMENT 毕业年份, resume_url varchar(500) DEFAULT NULL COMMENT 简历文件地址, expect_salary int(11) DEFAULT NULL COMMENT 期望薪资, expect_city varchar(100) DEFAULT NULL COMMENT 期望城市, PRIMARY KEY (id), KEY idx_user_id (user_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT毕业生信息表; -- 企业信息扩展表 CREATE TABLE company_info ( id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键, user_id bigint(20) NOT NULL COMMENT 关联用户ID, company_name varchar(200) NOT NULL COMMENT 企业名称, industry varchar(100) DEFAULT NULL COMMENT 所属行业, scale varchar(50) DEFAULT NULL COMMENT 企业规模, address varchar(500) DEFAULT NULL COMMENT 企业地址, introduction text COMMENT 企业简介, license_url varchar(500) DEFAULT NULL COMMENT 营业执照, PRIMARY KEY (id), KEY idx_user_id (user_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT企业信息表; -- 职位表 CREATE TABLE job_position ( id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键, company_id bigint(20) NOT NULL COMMENT 发布企业ID, title varchar(200) NOT NULL COMMENT 职位名称, description text COMMENT 职位描述, requirement text COMMENT 任职要求, salary_range varchar(100) DEFAULT NULL COMMENT 薪资范围, work_city varchar(100) DEFAULT NULL COMMENT 工作城市, category varchar(50) DEFAULT NULL COMMENT 职位类别, publish_status tinyint(1) DEFAULT 0 COMMENT 发布状态0-待审核1-已发布2-已下线, view_count int(11) DEFAULT 0 COMMENT 浏览量, create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, PRIMARY KEY (id), KEY idx_company_id (company_id), KEY idx_publish_status (publish_status) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT职位表; -- 简历投递记录表 CREATE TABLE delivery_record ( id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键, graduate_id bigint(20) NOT NULL COMMENT 毕业生ID, position_id bigint(20) NOT NULL COMMENT 职位ID, resume_url varchar(500) DEFAULT NULL COMMENT 投递的简历地址, status tinyint(1) DEFAULT 0 COMMENT 状态0-已投递1-已查看2-邀请面试3-不合适, delivery_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT 投递时间, feedback varchar(500) DEFAULT NULL COMMENT 企业反馈, PRIMARY KEY (id), KEY idx_graduate_id (graduate_id), KEY idx_position_id (position_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT简历投递记录表;3.2 后端核心代码示例3.2.1 Spring Boot 全局配置与 JWT 工具类// JwtUtil.java - JWT 工具类 import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.util.Date; Component public class JwtUtil { Value(${jwt.secret}) private String secret; Value(${jwt.expiration}) private Long expiration; public String generateToken(String username, Integer userType) { Date now new Date(); Date expiryDate new Date(now.getTime() expiration); return Jwts.builder() .setSubject(username) .claim(userType, userType) .setIssuedAt(now) .setExpiration(expiryDate) .signWith(SignatureAlgorithm.HS512, secret) .compact(); } public Claims getClaimsFromToken(String token) { return Jwts.parser() .setSigningKey(secret) .parseClaimsJws(token) .getBody(); } public boolean validateToken(String token) { try { Jwts.parser().setSigningKey(secret).parseClaimsJws(token); return true; } catch (Exception e) { return false; } } }3.2.2 职位搜索与分页接口 (Controller Service)// JobPositionController.java import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; RestController RequestMapping(/api/position) public class JobPositionController { Autowired private JobPositionService jobPositionService; GetMapping(/search) public ResultPageJobPositionVO searchPositions( RequestParam(required false) String keyword, RequestParam(required false) String city, RequestParam(required false) String category, RequestParam(defaultValue 1) Integer pageNum, RequestParam(defaultValue 10) Integer pageSize) { PageJobPositionVO page new Page(pageNum, pageSize); PageJobPositionVO result jobPositionService.searchPositions(page, keyword, city, category); return Result.success(result); } } // JobPositionServiceImpl.java import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import java.util.List; import java.util.stream.Collectors; Service public class JobPositionServiceImpl extends ServiceImplJobPositionMapper, JobPosition implements JobPositionService { Override public PageJobPositionVO searchPositions(PageJobPositionVO page, String keyword, String city, String category) { LambdaQueryWrapperJobPosition wrapper new LambdaQueryWrapper(); wrapper.eq(JobPosition::getPublishStatus, 1); // 只查询已发布的职位 if (keyword ! null !keyword.trim().isEmpty()) { wrapper.like(JobPosition::getTitle, keyword).or().like(JobPosition::getDescription, keyword); } if (city ! null !city.trim().isEmpty()) { wrapper.eq(JobPosition::getWorkCity, city); } if (category ! null !category.trim().isEmpty()) { wrapper.eq(JobPosition::getCategory, category); } wrapper.orderByDesc(JobPosition::getUpdateTime); PageJobPosition positionPage new Page(page.getCurrent(), page.getSize()); this.page(positionPage, wrapper); // 转换为 VO 并关联企业信息 ListJobPositionVO voList positionPage.getRecords().stream().map(position - { JobPositionVO vo new JobPositionVO(); BeanUtils.copyProperties(position, vo); CompanyInfo company companyService.getById(position.getCompanyId()); if (company ! null) { vo.setCompanyName(company.getCompanyName()); vo.setCompanyIndustry(company.getIndustry()); } return vo; }).collect(Collectors.toList()); page.setRecords(voList); page.setTotal(positionPage.getTotal()); return page; } }3.3 微信小程序核心代码示例3.3.1 首页职位列表展示 (index.js)// pages/index/index.js Page({ data: { positionList: [], // 职位列表 pageNum: 1, pageSize: 10, hasMore: true, isLoading: false, searchKeyword: , selectedCity: }, onLoad: function(options) { this.loadPositionList(); }, // 加载职位列表 loadPositionList: function(isLoadMore false) { if (this.data.isLoading || (!isLoadMore !this.data.hasMore)) return; this.setData({ isLoading: true }); const { pageNum, pageSize, searchKeyword, selectedCity } this.data; wx.request({ url: https://your-api-domain.com/api/position/search, method: GET, data: { keyword: searchKeyword, city: selectedCity, pageNum: pageNum, pageSize: pageSize }, header: { Authorization: wx.getStorageSync(token) // 从缓存获取token }, success: (res) { if (res.data.code 200) { const newList res.data.data.records; const total res.data.data.total; const currentList isLoadMore ? this.data.positionList.concat(newList) : newList; this.setData({ positionList: currentList, hasMore: currentList.length total, pageNum: isLoadMore ? this.data.pageNum 1 : 2 }); } else { wx.showToast({ title: res.data.msg || 加载失败, icon: none }); } }, fail: (err) { wx.showToast({ title: 网络请求失败, icon: none }); }, complete: () { this.setData({ isLoading: false }); } }); }, // 搜索职位 onSearch: function(e) { this.setData({ searchKeyword: e.detail.value, pageNum: 1, positionList: [], hasMore: true }); this.loadPositionList(); }, // 选择城市 onCityChange: function(e) { this.setData({ selectedCity: e.detail.value, pageNum: 1, positionList: [], hasMore: true }); this.loadPositionList(); }, // 上拉加载更多 onReachBottom: function() { if (this.data.hasMore) { this.loadPositionList(true); } }, // 跳转到职位详情 navigateToDetail: function(e) { const positionId e.currentTarget.dataset.id; wx.navigateTo({ url: /pages/position/detail?id${positionId} }); } });3.3.2 简历投递功能 (delivery.js)// pages/position/delivery.js Page({ data: { positionId: , positionTitle: , resumeList: [], // 用户上传的简历列表 selectedResumeId: }, onLoad: function(options) { this.setData({ positionId: options.id, positionTitle: options.title }); this.loadMyResumes(); }, // 加载我的简历列表 loadMyResumes: function() { wx.request({ url: https://your-api-domain.com/api/resume/my-list, method: GET, header: { Authorization: wx.getStorageSync(token) }, success: (res) { if (res.data.code 200) { this.setData({ resumeList: res.data.data }); if (res.data.data.length 0) { this.setData({ selectedResumeId: res.data.data[0].id }); } } } }); }, // 选择简历 onResumeSelect: function(e) { this.setData({ selectedResumeId: e.detail.value }); }, // 提交投递 submitDelivery: function() { if (!this.data.selectedResumeId) { wx.showToast({ title: 请选择一份简历, icon: none }); return; } wx.showLoading({ title: 投递中... }); wx.request({ url: https://your-api-domain.com/api/delivery/submit, method: POST, header: { Authorization: wx.getStorageSync(token), content-type: application/json }, data: { positionId: this.data.positionId, resumeId: this.data.selectedResumeId }, succes
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门