项目编号:BS-XX-058
一,项目简介
本项目基于SSM框架开发而成,主要实现旅游网站的信息化管理系统,系统分为前端网站和后台管理部分,前端用户注册登陆后可以在网站上浏览旅游景点,查看旅游酒店,在线预定酒店,查看旅游资讯,发表旅游攻略并参与讨论,全文检索功能等。后台管理用户登陆系统后可以实现相关模块的管理功能:主要包含用户管理,旅游景点管理,旅游资讯管理,旅游酒店管理,预定订单管理,旅游攻略管理等模块。
本项目基于协同过滤的aprio推荐算法来对旅游酒店信息进行相应的推荐操作,同时实现了旅游景点管理、酒店管理、旅游攻略管理、旅游资讯管理、在线收藏、点赞、评论、投诉建议,实现了在线下单进行旅游酒店的预定操作,并可以进行全文检索查询等,功能强大,内容丰富,页面简洁。
在本项目中使用协同过滤算法来对酒店信息进行相应的推荐,可以根据自己需要改成旅游推荐或商城推荐均可。算法的核心思路,获得当前所有注册的会员用户,以及所有用户对酒店浏览和互动的操作数据后,比对用户的相似性,生成相关的数据集,然后使用协同过滤核心算法将运算的结果得出后在前端展示。核心算法展示如下,以供大家参考使用 :
/** * * @param usersize 用户数量 * @param userdata 用户记录 * @param recommendUser 推荐的用户 * @return */ public static String xietongjob(int usersize,String[] userdata,String recommendUser){ /** * 输入用户-->物品条目 一个用户对应多个物品 * 用户ID 物品ID集合 * A a b d * B a c * C b e * D c d e */ int N = usersize;//用户数量 int[][] sparseMatrix = new int[N][N];//建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】 Map<String, Integer> userItemLength = new HashMap();//存储每一个用户对应的不同物品总数 eg: A 3 Map<String, Set<String>> itemUserCollection = new HashMap();//建立物品到用户的倒排表 eg: a A B Set<String> items = new HashSet();//辅助存储物品集合 Map<String, Integer> userID = new HashMap();//辅助存储每一个用户的用户ID映射 Map<Integer, String> idUser = new HashMap();//辅助存储每一个ID对应的用户映射 System.out.println("Input user--items maping infermation:<eg:A a b d>"); for(int i = 0; i < N ; i++){//依次处理N个用户 输入数据 以空格间隔 String[] user_item = userdata[i].split("@"); int length = user_item.length; userItemLength.put(user_item[0], length-1);//eg: A 3 userID.put(user_item[0], i);//用户ID与稀疏矩阵建立对应关系 idUser.put(i, user_item[0]); //建立物品--用户倒排表 for(int j = 1; j < length; j ++){ if(items.contains(user_item[j])){//如果已经包含对应的物品--用户映射,直接添加对应的用户 itemUserCollection.get(user_item[j]).add(user_item[0]); }else{//否则创建对应物品--用户集合映射 items.add(user_item[j]); itemUserCollection.put(user_item[j], new HashSet<String>());//创建物品--用户倒排关系 itemUserCollection.get(user_item[j]).add(user_item[0]); } } } System.out.println(itemUserCollection.toString()); //计算相似度矩阵【稀疏】 Set<Entry<String, Set<String>>> entrySet = itemUserCollection.entrySet(); Iterator<Entry<String, Set<String>>> iterator = entrySet.iterator(); while(iterator.hasNext()){ Set<String> commonUsers = iterator.next().getValue(); for (String user_u : commonUsers) { for (String user_v : commonUsers) { if(user_u.equals(user_v)){ continue; } sparseMatrix[userID.get(user_u)][userID.get(user_v)] += 1;//计算用户u与用户v都有正反馈的物品总数 } } } System.out.println(userItemLength.toString()); System.out.println("==============Input the user for recommendation:<eg:A>"); System.out.println("==userID=="+userID); System.out.println("========userID.get(recommendUser)=========="+userID.get(recommendUser)); System.out.println("items==================="+items); //计算用户之间的相似度【余弦相似性】 int recommendUserId = userID.get(recommendUser); for (int j = 0;j < sparseMatrix.length; j++) { if(j != recommendUserId){ System.out.println(idUser.get(recommendUserId)+"--"+idUser.get(j)+"相似度:"+sparseMatrix[recommendUserId][j]/Math.sqrt(userItemLength.get(idUser.get(recommendUserId))*userItemLength.get(idUser.get(j)))); } } String out=""; //计算指定用户recommendUser的物品推荐度 for(String item: items){//遍历每一件物品 Set<String> users = itemUserCollection.get(item);//得到购买当前物品的所有用户集合 if(users.contains(recommendUser)){//如果被推荐用户没有购买当前物品,则进行推荐度计算 double itemRecommendDegree = 0.0; for(String user: users){ itemRecommendDegree += sparseMatrix[userID.get(recommendUser)][userID.get(user)]/Math.sqrt(userItemLength.get(recommendUser)*userItemLength.get(user));//推荐度计算 } out+=","+item; System.out.println("The item "+item+" for "+recommendUser +"'s recommended degree:"+itemRecommendDegree); } } return out; }
同时对于未登陆用户,采用aprio算法进行相关性的推荐,以保证登陆用户和未登陆用户均可有相应的信息推荐,核心算法如下:
/** * 专门有个算法包 * 然后算法的逻辑也在这里, * 而且把算法之外额逻辑也加了 * 注!为了应对一开始人员访问数据量不够推荐算法使用的情况,就进行了数据补足,这个业务逻辑就非常完美了。 * * java推荐算法 * @param request */ public void tuijiansuanfa(HttpServletRequest request){ Itemset originalItem = new Itemset(); List<Map> lista = db.queryForList("select * from t_customer"); for (int i = 0; i < lista.size(); i++) { TreeSet<String> itemset = new TreeSet<String>(); List<Map> listb = db.queryForList("select * from t_productclick where customerId=?",new Object[]{lista.get(i).get("id")}); for (int j = 0; j < listb.size(); j++) { itemset.add(listb.get(j).get("productId")+""); } originalItem.itemset.add(itemset); } Aprioti.originalItem=originalItem; List<Long> outList = Aprioti.aprioriProcess(); String in =""; if(outList!=null&&outList.size()>0){ for (int i = 0; i < outList.size(); i++) { in+=","+outList.get(i); } } String sqlall="select a.* from t_product a where 1=1 "; String sql=sqlall; if(in!=null&&!"".equals(in)){ sql+=" and id in ("+in.substring(1,in.length())+")"; } sql+=" order by rand() limit 8 "; //以上推荐算法最总结果在根据随机安排推荐 //注!为了应对一开始人员访问数据量不够推荐算法使用的情况,就进行了数据补足,这个业务逻辑就非常完美了。 List tuijianList = db.queryForList(sql); int a = 8; int b = 0; if(tuijianList==null||tuijianList.size()<8){ if(tuijianList!=null){ b = 8-tuijianList.size(); } List list2 = db.queryForList(sqlall+" order by rand() limit "+b); tuijianList.addAll(list2); }else{ } request.setAttribute("tuijianList", tuijianList); }
二,环境介绍
语言环境:Java: jdk1.8
数据库:Mysql: mysql5.7
应用服务器:Tomcat: tomcat8.5.31
开发工具:IDEA或eclipse
后台开发技术:Spring+mybatis+springmvc
前台开发技术:jquery+ajax+easyui
核心算法:协同过滤算法 APRIO算法
apriori关联规则算法的原理设计较为简单,著名的“啤酒和尿布”说的就是Apriori算法,通俗来讲apriori旨在寻找频繁项集,以帮助商家将消费者有可能一起搭配购买的物品放置在同一个地方,提高消费者的购物效率和良好的购物体验感。Apriori还是十大数据挖掘算法之一,可见Apriori关联规则算法的重要性。
三,系统展示
下面展示一下本系统的部分功能:
前端页面展示
http://localhost:8080/front/index.html
旅游景点
旅游酒店
旅游资讯
旅游攻略
我的酒店预定
我的贴子
我的收藏
我的信息
投诉建议
后台用户登陆: http://localhost:8080/adminLogin/login.html
个人中心
轮播图管理
旅游资讯管理
用户管理
内容管理:包含酒店管理,景点管理,资读管理三大模块
旅游攻略管理
投诉建议管理
四,核心代码展示
package com.lvyou.controller.admin; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import com.lvyou.controller.MyController; @Controller("adminCustomerController") @RequestMapping(value = "/admin/customer") public class AdminCustomerController extends MyController { @RequestMapping(value = "/frame") public String frame(Model model, HttpServletRequest request)throws Exception { return "/admin/customer/frame"; } @RequestMapping(value = "/list") public String list(Model model, HttpServletRequest request,String username,String customerName)throws Exception { String sql="select a.* from t_customer a where 1=1"; if(username!=null&&!"".equals(username)){ sql+=" and username like '%"+username+"%'"; } if(customerName!=null&&!"".equals(customerName)){ sql+=" and customerName like '%"+customerName+"%'"; } sql+=" order by id desc"; List list = db.queryForList(sql); request.setAttribute("list", list); return "/admin/customer/list"; } @RequestMapping(value = "/editSave") public ResponseEntity<String> editSave(Model model,HttpServletRequest request,Long id ,String username,String password,String customerName,String sex,String address,String phone,Integer account,Integer jf,String status) throws Exception{ int result = 0; if(id!=null){ String sql="update t_customer set username=?,password=?,customerName=?,sex=?,address=?,phone=?,account=?,jf=?,status=? where id=?"; result = db.update(sql, new Object[]{username,password,customerName,sex,address,phone,account,jf,status,id}); }else{ String sql="insert into t_customer(username,password,customerName,sex,address,phone,account,jf,status) values(?,?,?,?,?,?,?,?,?)"; result = db.update(sql, new Object[]{username,password,customerName,sex,address,phone,account,jf,status}); } if(result==1){ return renderData(true,"操作成功",null); }else{ return renderData(false,"操作失败",null); } } @RequestMapping(value = "/editDelete") public ResponseEntity<String> editDelete(Model model,HttpServletRequest request,Long id) throws Exception { String sql="delete from t_customer where id=?"; int result = db.update(sql, new Object[]{id}); if(result==1){ return renderData(true,"操作成功",null); }else{ return renderData(false,"操作失败",null); } } @RequestMapping(value = "/updateColumnsex") public ResponseEntity<String> updateColumnsex(Model model,HttpServletRequest request,Long id,String sex) throws Exception { String sql="update t_customer set sex=? where id=?"; int result = db.update(sql, new Object[]{sex,id}); if(result==1){ return renderData(true,"操作成功",null); }else{ return renderData(false,"操作失败",null); } } @RequestMapping(value = "/edit") public String edit(Model model, HttpServletRequest request,Long id)throws Exception { if(id!=null){ //修改 String sql="select * from t_customer where id=?"; Map map = db.queryForMap(sql,new Object[]{id}); model.addAttribute("map", map); }String sql=""; return "/admin/customer/edit"; } }
package com.lvyou.controller.admin; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import com.lvyou.controller.MyController; @Controller("contactController") @RequestMapping(value = "/admin/contact") public class ContactController extends MyController { @RequestMapping(value = "/frame") public String frame(Model model, HttpServletRequest request,String flag)throws Exception { return "/admin/contact/frame"; } @RequestMapping(value = "/list") public String list(Model model, HttpServletRequest request,String flag,String phone)throws Exception { String aa = "select * from t_customer "; List<Map> list11 = db.queryForList(aa); System.out.println(list11); String sql="select a.phone, a.*,(select max(customerName) from t_customer b where a.customerId=b.id) customerName from t_contact a where 1=1"; if(1==2){sql+="and customerId="+getCustomer(request).get("id") +" ";} if(phone!=null&&!"".equals(phone)){ sql+=" and phone like '%"+phone+"%'"; } sql+=" order by id desc"; List list = db.queryForList(sql); System.out.println(sql); request.setAttribute("list", list); System.out.println(list); return "/admin/contact/list"; } @RequestMapping(value = "/editSave") public ResponseEntity<String> editSave(Model model,HttpServletRequest request,Long id,String flag ,Integer customerId,String phone,String content,String insertDate) throws Exception{ int result = 0; if(id!=null){ String sql="update t_contact set phone=?,content=? where id=?"; result = db.update(sql, new Object[]{phone,content,id}); }else{ String sql="insert into t_contact(customerId,phone,content,insertDate) values(?,?,?,now())"; result = db.update(sql, new Object[]{getCustomer(request).get("id"),phone,content}); } if(result==1){ return renderData(true,"操作成功",null); }else{ return renderData(false,"操作失败",null); } } @RequestMapping(value = "/editDelete") public ResponseEntity<String> editDelete(Model model,HttpServletRequest request,Long id,String flag) throws Exception { String sql="delete from t_contact where id=?"; int result = db.update(sql, new Object[]{id}); if(result==1){ return renderData(true,"操作成功",null); }else{ return renderData(false,"操作失败",null); } } @RequestMapping(value = "/edit") public String edit(Model model, HttpServletRequest request,Long id,String flag)throws Exception { if(id!=null){ //修改 String sql="select * from t_contact where id=?"; Map map = db.queryForMap(sql,new Object[]{id}); model.addAttribute("map", map); }String sql=""; return "/admin/contact/edit"; } }
五,项目总结
本项目基于协同过滤的aprio推荐算法来对旅游酒店信息进行相应的推荐操作,同时实现了旅游景点管理、酒店管理、旅游攻略管理、旅游资讯管理、在线收藏、点赞、评论、投诉建议,实现了在线下单进行旅游酒店的预定操作,并可以进行全文检索查询等,功能强大,内容丰富,页面简洁。