岗位推荐

岗位推荐功能调用的代码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?