协作过滤算法|电影推荐系统|基于用户偏好的电影推荐系统的设计与开发
最编程
2024-03-29 12:58:59
...
package com.sys.controller.admin;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;
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.sys.controller.MyController;
import com.sys.controller.suanfa.Aprioti;
import com.sys.controller.suanfa.Itemset;
import com.sys.controller.xietong.XietongUtil;
import com.sxl.util.RandomValidateCode;
import com.sxl.util.StringHelper;
@Controller("frontController")
@RequestMapping(value = "/front")
public class FrontController extends MyController {
/**
* 使用协同过滤算法进行相关推荐
* @param model
* @param request
* @return
* @throws Exception
*/
@RequestMapping(value = "/index")
public String frame(Model model, HttpServletRequest request)
throws Exception {
String sql = "";
sql = "select * from t_lbt";
List list3 = db.queryForList(sql);
request.setAttribute("list3", list3);
sql = "select a.* from t_product a where typesId=1 order by id desc limit 3";
List listb = db.queryForList(sql);
request.setAttribute("listb", listb);
//查询电影类型
sql = "select * from t_types";
model.addAttribute("typesList", db.queryForList(sql));
//协同过滤推荐算法
if(getCustomer(request)!=null){
//如果该用户登录了,身份确定了, 则可以用协同过滤推荐
List<Map> customerList = db.queryForList("select * from t_customer");
List<Map> dataList = db.queryForList("select distinct productId, customerId from t_productclick where productId is not null and customerId is not null ");
int usersize = customerList.size();
String customerId = getCustomer(request).get("id").toString();
/**
* 输入用户-->物品条目 一个用户对应多个物品
* 用户ID 物品ID集合
* A a b d
* B a c
* C b e
* D c d e
*/
String[] userdata = new String[customerList.size()];
for (int i = 0; i < customerList.size(); i++) {
String customerid = customerList.get(i).get("id").toString();
String aa="A"+customerid+"";
for (int j = 0; j < dataList.size(); j++) {
if(customerid.equals(dataList.get(j).get("customerId").toString())){
aa+="@"+dataList.get(j).get("productId").toString();
}
}
userdata[i]= aa+="@0";
System.out.println("******"+aa);
}
String out = XietongUtil.xietongjob(usersize, userdata, "A"+customerId);
String sqlall="select a.* from t_product a where typesId=1 ";
sql=sqlall;
if(out!=null&&!"".equals(out)){
sql+=" and id in ("+out.substring(1,out.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);
}else{
//也就是说,如果网站用户未登录,则不能身份确认,所以用aprio算法
//aprio推荐算法
tuijiansuanfa(request);
}
return "/front/index";
}
/**
* 专门有个算法包
* 然后算法的逻辑也在这里,
* 而且把算法之外额逻辑也加了
* 注!为了应对一开始人员访问数据量不够推荐算法使用的情况,就进行了数据补足,这个业务逻辑就非常完美了。
*
* 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);
}
@RequestMapping(value = "/baidu1")
public String baidu1(Model model, HttpServletRequest request)
throws Exception {
return "/front/baidu1";
}
@RequestMapping(value = "/baidu2")
public String baidu2(Model model, HttpServletRequest request)
throws Exception {
return "/front/baidu2";
}
@RequestMapping(value = "/daohang1")
public String daohang1(Model model, HttpServletRequest request,String id)
throws Exception {
Map map = db.queryForMap("select * from t_product where id="+id);
model.addAttribute("map", map);
return "/front/daohang1";
}
public String getjwd(HttpServletRequest request){
Object jwdd= request.getSession().getAttribute("yhjwd");
if(jwdd!=null){
return jwdd.toString();
}else{
return "116.438189,39.9125";
}
}
@RequestMapping(value = "/daohang2")
public String daohang2(Model model, HttpServletRequest request,String id)
throws Exception {
Map map = db.queryForMap("select *from t_zx where id="+id);
map = new HashMap();
map.put("jwd", "116.661256,39.975119");
model.addAttribute("map", map);
String jwd = getjwd(request);
System.out.println(jwd);
System.out.println(map.get("jwd"));
model.addAttribute("jwd", jwd);
return "/front/daohang2";
}
@RequestMapping(value = "/login")
public String login(Model model, HttpServletRequest request)
throws Exception {
return "/front/login";
}
public void saveClick(HttpServletRequest request,Long id){
String sql="insert into t_productclick(productId,customerId,insertDate) values(?,?,now())";
Map customer = getCustomer(request);
if(customer!=null&&customer.size()>0){
db.update(sql, new Object[]{id,getCustomer(request).get("id")});
}
}
/**
* 查询信息
* @param model
* @param request
* @param typesId
* @param productName
* @param px
* @return
* @throws Exception
*/
@RequestMapping(value = "/all")
public String all(Model model, HttpServletRequest request,Long typesId,String productName,String px,Integer bqid)
throws Exception {
String sql="select a.* from t_types a where 1=1";
sql+=" order by id desc";
List typesList = db.queryForList(sql);
request.setAttribute("typesList", typesList);
sql="select a.*,(select typesName from t_types b where a.typesId=b.id) typesName from t_product a where 1=1";
if(typesId!=null&&!"".equals(typesId)){
sql+=" and a.typesId="+typesId;
}
if(productName!=null&&!"".equals(productName)){
sql+=" and a.productName like '%"+productName+"%' ";
}
if(bqid!=null){
sql+=" and bqid="+bqid;
}
if("1".equals(px)){
sql+=" order by id desc";
}else if("2".equals(px)){
sql+=" order by price asc";
}else if("3".equals(px)){
sql+=" order by price desc";
}else if("4".equals(px)){
sql+=" order by djl desc";
}
List list = db.queryForList(sql);
request.setAttribute("list", list);
return "/front/all";
}
@RequestMapping(value = "/jfdh")
public String jfdh(Model model, HttpServletRequest request)
throws Exception {
String sql="select a.* from t_jfdh a where 1=1";
sql+=" order by id desc";
List list = db.queryForList(sql);
request.setAttribute("list", list);
return "/front/jfdh";
}
@RequestMapping(value = "/dhjfSave")
public ResponseEntity<String> dhjfSave(Model model,
HttpServletRequest request,Long id) throws Exception {
Map map = db.queryForMap("select * from t_jfdh where id="+id);
String jf = map.get("jfCost").toString();
String jfName = map.get("jfName").toString();
//订单
String sql = "insert into t_order(orderNum,customerId,productDetail,allPrice,status,insertDate) values(?,?,?,?,?,now())";
int result = db.update(sql, new Object[] { System.currentTimeMillis()+"",
getCustomer(request).get("id").toString(), jfName+"积分兑换["+jf+"]", 0+"", "兑换完成" });
sql="update t_customer set jf = jf-"+jf+" where id="+getCustomer(request).get("id");
db.update(sql);
//积分减少
return renderData(true, "操作成功", null);
}
@RequestMapping(value = "/register")
public String register(Model model, HttpServletRequest request)
throws Exception {
System.out.println("112312312");
return "/front/register";
}
@RequestMapping(value = "/detail")
public String detail(Model model, HttpServletRequest request, Long id)
throws Exception {
//保存点击
saveClick(request, id);
String sql = "select a.*,(select typesName from t_types b where a.typesId=b.id) typesName " +
" from t_product a where id=" + id;
Map map = db.queryForMap(sql);
request.setAttribute("map", map);
String sql2="select a.*,(select max(customerName) from t_customer b where a.customerId=b.id) customerName from t_pinglun_product a where productId=? order by id desc";
List<Map> list = db.queryForList(sql2,new Object[]{id});
model.addAttribute("list", list);
db.update("update t_product set djl=djl+1 where id="+id);
int scNum = db.queryForInt("select count(1) from t_sc where productId="+id);
model.addAttribute("scNum", scNum);
return "/front/detail";
}
@RequestMapping(value = "/myOrder")
public String myOrder(Model model, HttpServletRequest request)
throws Exception {
String sql = "select a.*,(select max(customerName) from t_customer b where a.customerId=b.id) customerName from t_order a where 1=1 ";
if (1 == 1) {
sql += "and customerId=" + getCustomer(request).get("id") + " ";
}
sql += " order by id desc";
List list = db.queryForList(sql);
request.setAttribute("orderList", list);
return "/front/myOrder";
}
@RequestMapping(value = "/deleteOneOrder")
public ResponseEntity<String> deleteOneOrder(Model model,
HttpServletRequest request,Long id) throws Exception {
String sql="delete from t_order where id="+id;
db.update(sql);
return renderData(true, "操作成功", null);
}
@RequestMapping(value = "/pjSave")
public ResponseEntity<String> pjSave(Model model,
HttpServletRequest request,Long id,String pj) throws Exception {
String sql="update t_order set pj='"+pj+"' where id="+id;
db.update(sql);
return renderData(true, "操作成功", null);
}
@RequestMapping(value = "/deletesc")
public ResponseEntity<String> deletesc(Model model,
HttpServletRequest request,Long id) throws Exception {
String sql="delete from t_sc where id="+id;
db.update(sql);
return renderData(true, "操作成功", null);
}
@RequestMapping(value = "/deletexiaoxi")
public ResponseEntity<String> deletexiaoxi(Model model,
HttpServletRequest request,Long id) throws Exception {
String sql="delete from t_xiaoxi where id="+id;
db.update(sql);
return renderData(true, "操作成功", null);
}
@RequestMapping(value = "/addShopcar")
public ResponseEntity<String> addShopcar(Model model,
HttpServletRequest request, Long id, Integer num) throws Exception {
int result = 0;
db.update("delete from t_shopcar where customerId="+getCustomer(request).get("id"));
String sql = "insert into t_shopcar(productId,num,customerId) values(?,?,?)";
result = db.update(sql, new Object[] { id, 1,
getCustomer(request).get("id").toString() });
return renderData(true, "操作成功", null);
}
@RequestMapping(value = "/pay3")
上一篇: HTML5 + WebGL,无需插件即可创建纯网络 3D 机房(第三季度新增资产容量管理、动态环路监控等功能)