0 项目说明
基于SpringCloud的微服务人才招聘系统设计与实现
提示:适合用于课程设计或毕业设计,工作量达标,源码开放
1 项目结构
2 使用说明
使用时麻烦将Nacos,ZipKin,Sentinel等组件自行搭建使用,本人服务器性能较差
存储在Nacos中的配置文件在https://github.com/stalary/pf-config
需要自行启动两个本人开源的服务
- lightmq(使用lightmq.stalary.com会导致消息被我的服务消费)https://github.com/stalary/lightMQ
- usercenter(使用usercenter.stalary.com会导致用户数据存储到我的数据库,数据泄漏)
https://github.com/stalary/UserCenter
本地启动注意切换Nacos的Namespace,否则会出现本地服务与线上服务服务发现不通的情况,具体参照本人的一篇博客https://www.jianshu.com/p/5c84a1d3b2f9
3 部署方式
- docker部署:mvn docker:build & java -jar
- 物理机部署:mvn install & java -jar
4 技术栈
- Spring-Boot
- Spring-Cloud
- Spring-Cloud-Gateway
- Spring-Cloud-Sleuth(对业务侵入性较大,建议替换到 Skywalking )
- Sentinel
- Nacos
- Feign
- Docker
- Mysql
- Mongodb
- Redis
- LightMQ
- EasyDoc
- WebSocket
- Jpa
- UserCenter
- ElasticSearch
5 功能
- 上传简历||填写简历
- 投递简历
- 发布职位
- 简历打分(基于规则匹配打分)
- 消息推送
- 邮件提醒
- 推荐候选人
- 推荐职位
4 项目源码
/**
*
* Copyright 2018 Stalary.
*/
package com.stalary.pf.consumer.service;
import com.alibaba.fastjson.JSONObject;
import com.stalary.lightmqclient.MQListener;
import com.stalary.lightmqclient.MessageDto;
import com.stalary.lightmqclient.facade.MQConsumer;
import com.stalary.pf.consumer.client.*;
import com.stalary.pf.consumer.data.dto.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import static com.stalary.pf.consumer.data.constant.Constant.*;
/**
* Consumer
*
* @author lirongqian
*/
@Service
@Slf4j
public class Consumer implements MQConsumer {
private static ResumeClient resumeClient;
@Autowired
public void setResumeClient(ResumeClient resumeClient) {
Consumer.resumeClient = resumeClient;
}
private static PushClient pushClient;
@Autowired
public void setPushClient(PushClient pushClient) {
Consumer.pushClient = pushClient;
}
private static MessageClient messageClient;
@Autowired
public void setMessageClient(MessageClient messageClient) {
Consumer.messageClient = messageClient;
}
private static RecruitClient recruitClient;
@Autowired
private void setRecruitClient(RecruitClient recruitClient) {
Consumer.recruitClient = recruitClient;
}
private static UserClient userClient;
@Autowired
private void setUserClient(UserClient userClient) {
Consumer.userClient = userClient;
}
private static OutsideClient outsideClient;
@Autowired
private void setOutsideClient(OutsideClient outsideClient) {
Consumer.outsideClient = outsideClient;
}
@Override
@MQListener(topics = {SEND_RESUME, RECEIVE_RESUME, HANDLE_RESUME})
public void process(MessageDto messageDto) {
long startTime = System.currentTimeMillis();
String topic = messageDto.getTopic();
String key = "";
if (messageDto.getKey() != null) {
key = messageDto.getKey();
}
String message = messageDto.getValue();
Long offset = messageDto.getOffset();
log.info("receive message: topic: " + topic + " key: " + key + " message: " + message + " offset: " + offset);
if (HANDLE_RESUME.equals(topic)) {
SendResume resume = JSONObject.parseObject(message, SendResume.class);
// 处理投递简历
resumeClient.handleResume(resume);
} else if (SEND_RESUME.equals(topic)) {
SendResume resume = JSONObject.parseObject(message, SendResume.class);
// 存储投递的消息通知(系统发送)
Long userId = resume.getUserId();
Message m = new Message(0L, userId, "简历投递成功", resume.getTitle() + "简历投递成功", false);
messageClient.saveMessage(m);
// 统计通知未读的数量
int count = messageClient.getNotReadCount(userId).getData();
pushClient.sendMessage(userId, "" + count);
} else if (RECEIVE_RESUME.equals(topic)) {
SendResume resume = JSONObject.parseObject(message, SendResume.class);
// 存储收到简历的消息通知(系统发送)
Long recruitId = resume.getRecruitId();
Long userId = resume.getUserId();
Recruit recruit = recruitClient.getRecruit(recruitId).getData();
UserInfo userInfo = userClient.getUserInfo(userId).getData();
Long hrId = recruit.getHrId();
Message m = new Message(0L, hrId, resume.getTitle() + "收到简历", resume.getTitle() + "收到来自" + userInfo.getSchool() + "的" + userInfo.getNickname() + "的简历", false);
messageClient.saveMessage(m);
outsideClient.sendEmail(new Email(userClient.getEmail(hrId).getData(), "收到投递简历", resume.getTitle() + "收到来自" + userInfo.getSchool() + "的" + userInfo.getNickname() + "的简历"));
// 统计通知未读的数量
int count = messageClient.getNotReadCount(hrId).getData();
pushClient.sendMessage(hrId, "" + count);
}
long endTime = System.currentTimeMillis();
log.info("Consumer.time=" + (endTime - startTime));
}
}
5 最后
**项目分享: ** https://gitee.com/asoonis/htw