岗位推荐
岗位推荐功能调用的代码client web项目cotroller层中 岗位推荐具体实现代码是在client项目的一个dao层中
修改前端代码
function confirm(){
var key=[];
$("#skill").each(function () {
//var tmp;
$(this).find('li').each(function() {
//tmp = $(this).text();
key.push($(this).text());
});
});
//遍历该数组可以获取所有值
var html="";
var s="";
var datas1=[];
var datas2=[];
if(key.size==0){
alert("请选择技能");
return false;
}
for (var i = 0 ; i < key.length; i++) {
var paramskill=key[i].split("-")[0];
var paramday=key[i].split("-")[1].substring(0,1);
datas2.push(paramday);
myrader=new rader(60,paramskill);
datas1.push(myrader);
html+=paramskill+",";
s+=paramday+","; //添加部分
}
if(html==null || html==""){
alert("请选择技能");
return false;
}
var chart = echarts.init(document.getElementById('main'));
option = {
tooltip: {},
legend: {
data: ['能力累计时间']
},
radar: {
// shape: 'circle',
name: {
textStyle: {
color: '#000',
}
},
indicator: datas1
},
series: [{
type: 'radar',
// areaStyle: {normal: {}},
data : [
{
value : datas2,
name : '能力累计时间'
}
]
}]
};
chart.setOption(option);
$.ajax({
url : "${request.contextPath}/learning/getjytj",
type : "post",
data : {
html : html,
s:s //添加部分
},
success : function(s) {
var job=s.msg.job;
if(job.length==0){
alert("暂无推荐岗位");
}else{
var str = "";
for(var i=0;i<job.length;i++){
var jobname = job[i].jobname;
var localtion = job[i].localtion;
var companyname = job[i].companyname;
var description = job[i].description;
str+="<div class=\"row\" style=\"border: 1px solid #DAD6D6; padding: 6px ;margin-top: 5px;margin-right: 0px;margin-left: 0px;\">";
str+="<div class=\"col-xs-4\" style=\"margin-top: 20px\">";
str+="<div class=\"col-xs-12 row\">";
str+="<a>" + jobname + "</a>";
str+="</div>";
str+="<div class=\"col-xs-12 row\">";
str+="<div class=\"company\" style=\"margin:10px 0\">";
str+="<span style=\"color: #333\">" + companyname + "</span>";
str+="</div>";
str+="</div>";
str+="<div class=\"col-xs-12 row\">";
str+="<div class=\"company\" style=\"margin:10px 0;\">" + localtion + "</div>";
str+="</div>";
str+="</div>";
str+="<div class=\"col-xs-4\">";
str+="<div class=\"echart\" id=\"echarts"+i+"\" name=\"echarts\" style=\"width: 100%;height: 200px;\"></div>";
str+="</div>";
str+="<div class=\"col-xs-4\" style=\"margin-top: 5%\">";
str+="<div class=\"col-xs-12 row\" style=\" float: left;margin-top: 6px\">";
str+="<div class=\"col-xs-3\"></div>";
str+="<div class=\"col-xs-1\"></div>";
str+="<a class=\"btn col-xs-4 btn-primary\" id=\"apply"+i+"\" style=\"text-align: center;\" onclick=\"apply('"+i+"')\">关注</a>";
str+="<div class=\"col-xs-1\"></div>";
str+="</div>";
str+="</div>";
str+="</div>";
}
$("#gw").html(str);
var rader=s.msg.rader;
var value=s.msg.values;
for(var i=0;i<rader.length;i++){
echartjob="echarts"+i;
myChartjob = echarts.init(document.getElementById(echartjob));
optionjob= {
tooltip: {},
radar: {
// shape: 'circle',
name: {
textStyle: {
color: '#000',
}
},
indicator: rader[i]
},
series: [{
type: 'radar',
// areaStyle: {normal: {}},
data : [
{
value : value[i],
name : '能力累计时间'
}
]
}]
};
myChartjob.setOption(optionjob);
}
}
}
});
}
这个是网页代码路径xueqing-client\WebRoot\WEB-INF\view\learning\jytj.html。修改jquery代码,在ajax中添加新参数返回controller层
修改controller代码
/**
* 就业推荐查询
*
* @return
*/
@RequestMapping("/getjytj")
@ResponseBody
public Object getJytj(HttpServletRequest request) {
String html = request.getParameter("html");
String[] skill = html.split(",");
//获取前台发送过来的数据,并转化成数组
String s = request.getParameter("s");
String[] weight = s.split(",");
//权重数据
Map<String, Object> msp = jobAnalysisReposity.getjytj(mongoClient, skill,weight, 3);
return new MessageBean(true, msp);
}
该方法是用来获取前台参数,并调用推荐功能代码
修改具体实现代码
public static Map<String, Object> getjytj(MongoClient mongoClient, String[] skills, String[] weights, int number) {
Map<String, Object> map = new HashMap<>();
ArrayList<String> totalSkills = new ArrayList<>();// 所有技能点
generateSkillIDs(totalSkills, skills);
MongoDatabase mongoDatabase = mongoClient.getDatabase("employ");
MongoCollection<Document> collection = mongoDatabase.getCollection("job");
FindIterable<Document> findIterable = null;
findIterable = collection.find();
MongoCursor<Document> mongoCursor = findIterable.iterator();
List<Map<String, Object>> maps = new ArrayList<>();// 存放所有的职位信息
while (mongoCursor.hasNext()) {
Document doc = mongoCursor.next();
List<Document> jobs = (List<Document>) doc.get("jobs");
for (Document s : jobs) {
Map<String, Object> jobmes = new HashMap<>();
String skill = s.getString("skills");
jobmes.put("id", s.getString("id"));
jobmes.put("provice", s.getString("provice"));
jobmes.put("city", s.getString("city"));
jobmes.put("job_name", s.getString("job_name"));
jobmes.put("skill", skill);
jobmes.put("weight", s.getString("weight"));
jobmes.put("company_name", s.getString("company_name"));
String[] jobskills = skill.split(",");
generateSkillIDs(totalSkills, jobskills);
maps.add(jobmes);
}
}
// 产生所有岗位的数据模型(多维的向量数组)
FastByIDMap<PreferenceArray> userData = new FastByIDMap<PreferenceArray>();
for (Map<String, Object> jobmes : maps) {
int id = Integer.parseInt((String) jobmes.get("id"));
String skill = (String) jobmes.get("skill");
String[] skills_ = skill.split(",");
// 技能转换成ID
int[] skillids = getSkillIDs(totalSkills, skills_);
// 技能对应得权重
double[] weightsparam = new double[skillids.length];
String weight_ = (String) jobmes.get("weight");
String[] weights_ = weight_.split(",");
// mongodb岗位库的一个岗位所有的技能
GenericPreference[] genericPreferences = new GenericPreference[skillids.length];
for (int i = 0; i < skillids.length; i++) {
// id 岗位ID skillids[i] 技能ID Float.parseFloat(weights_[i]) 权重
genericPreferences[i] = new GenericPreference(id, skillids[i], Float.parseFloat(weights_[i]));
}
userData.put(id, new GenericUserPreferenceArray(Arrays.asList(genericPreferences)));
}
// 输入的用户的技能 默认ID为0 库从1开始
GenericPreference[] userGenericPreferences = new GenericPreference[skills.length];
for (int i = 0; i < userGenericPreferences.length; i++) {
int[] userskillids = getSkillIDs(totalSkills, skills);
userGenericPreferences[i] = new GenericPreference(0, userskillids[i], Float.parseFloat(weights[i]) / 12);
}
userData.put(0, new GenericUserPreferenceArray(Arrays.asList(userGenericPreferences)));
// 偏好向量组生成数据模型
DataModel model = new GenericDataModel(userData);
try {
// 相识度算法
UserSimilarity userSimi = new EuclideanDistanceSimilarity(model);
// 近邻算法 number 推荐个数
NearestNUserNeighborhood neighbor = new NearestNUserNeighborhood(number, userSimi, model);
//
// 获得输入用户的相近岗位 0代表用户输入ID
long[] ids = neighbor.getUserNeighborhood(0);
List<List<RaderObj>> raderObjs = new ArrayList<>();
List<List<Double>> values = new ArrayList<>();
List<Map<String, Object>> job = new ArrayList<>();
//遍历3个推荐的岗位
for (long id : ids) {
//在岗位库 寻找这3个岗位
for (Map<String, Object> jobmes : maps) {
int jobId = Integer.parseInt((String) jobmes.get("id"));
if (id == jobId) {
List<RaderObj> raderObj = new ArrayList<>();//雷达图展示
Map<String, Object> jobMap = new HashMap<>();//岗位的名称 公司 地址
List<Double> jobWeights = new ArrayList<>();//技能点的权重
jobMap.put("localtion", jobmes.get("provice") + " " + jobmes.get("city"));
jobMap.put("jobname", jobmes.get("job_name"));
jobMap.put("companyname", jobmes.get("company_name"));
String skill = (String) jobmes.get("skill");
String weight= (String) jobmes.get("weight");
String[] jobSkills = skill.split(",");
String[] wes = weight.split(",");
//每个技能点生成一个雷达对象
for (String s : jobSkills) {
RaderObj obj = new RaderObj();
obj.setMax(1);
obj.setName(s);
raderObj.add(obj);
}
//每个雷达的技能权重
for (String w : wes) {
jobWeights.add(Double.parseDouble(w));
}
raderObjs.add(raderObj);
job.add(jobMap);
values.add(jobWeights);
}
}
}
map.put("job", job);//推荐的岗位信息
map.put("radar", raderObjs);//雷达技能图
map.put("values", values);//技能图对应得权重值
} catch (TasteException e) {
e.printStackTrace();
}
return map;
}
//该方法中需要调用另外两个方法,是原来的框架中所没有的,需要完全自己写出来,请注意。
/**
* 收集所有技能点。
*
* @param skillIdMaps
* @param skills
* @return
*/
private static ArrayList<String> generateSkillIDs(ArrayList<String> skillIdList, String[] skills) {
for (String skill : skills) {
String value=skill.trim().toLowerCase();
int index = skillIdList.indexOf(value);
if (index == -1) {
skillIdList.add(value);
}
}
return skillIdList;
}
/**
* 产生当前skill的IDs
*
* @param skillIdMaps
* @param skills
* @return
*/
private static int[] getSkillIDs(ArrayList<String> skillIdList, String[] skills) {
int[] ids = new int[skills.length];
for (int i = 0; i < ids.length; i++) {
String value=skills[i].trim().toLowerCase();
ids[i] = skillIdList.indexOf(value);
}
return ids;
}
里面该方法的签字不同,可以重载个新方法。还要添加两个方法一个用来获取数组里对应id一个用来获取全部的技能
Last updated
Was this helpful?