14.门户导航菜单功能实现
1.首先我们对需求进行分析。我们是需要在portal中显示数据,但是portal是通过调用item项目来获取到数据的,又item来调用dubbo。
这就涉及到了跨域请求。这里就需要引入新技术Jsonp了,Jsonp的原理是,一个项目可以访问另一个项目的JS文件,那么我们就把我们的数据伪装成JS文件,就实现了跨域请求。
2.我们现在来搭建ego-portal和ego-item项目,这里的步骤与搭建ego-manage相同,我们只需要改一下dubbo里面的扫描文件和配置里面的端口号就可以了。
3.我们首先在ego-portal里面来编写一个控制器。用来显示页面。
@Controller
public class PageController {
@RequestMapping("/")
public String welcome() {
return "index";
}
}
4.之后它的关于导航栏是通过调用ego-item来实现了。我们先完成item里面的代码。我们先完成pojo类,通过分析数据,我们知道应该建立如下的两个pojo。
public class PortalMenu {
private List<Object> data;
public List<Object> getData() {
return data;
}
public void setData(List<Object> data) {
this.data = data;
}
}
public class PortalMenuNode {
private String u;
private String n;
private List<Object> i;
public String getU() {
return u;
}
public void setU(String u) {
this.u = u;
}
public String getN() {
return n;
}
public void setN(String n) {
this.n = n;
}
public List<Object> getI() {
return i;
}
public void setI(List<Object> i) {
this.i = i;
}
}
5.然后我们写出service代码,我们首先可以查出所有的父菜单,然后通过父菜单递归的去查询每个子菜单,直到查询完毕。我们给出实现类的代码。
@Service
public class TbItemCatServiceImpl implements TbItemCatService {
@Reference
private TbItemCatDubboService tbItemCatDubboServiceImpl;
@Override
public PortalMenu showCatMenu() {
// TODO Auto-generated method stub
//查询出所有的一级菜单
List<TbItemCat> list=tbItemCatDubboServiceImpl.show(0);
PortalMenu pm=new PortalMenu();
pm.setData(selAllMenu(list));
return pm;
}
/**
* 返回所有菜单
*/
public List<Object> selAllMenu(List<TbItemCat> list){
List<Object> listNode=new ArrayList<>();
for (TbItemCat tbItemCat : list) {
if(tbItemCat.getIsParent()) {
PortalMenuNode pNode=new PortalMenuNode();
pNode.setU("/products/"+tbItemCat.getId()+".html");
pNode.setN("<ahref='/products/"+tbItemCat.getId()+".html'>"+tbItemCat.getName()+"</a>");
pNode.setI(selAllMenu(tbItemCatDubboServiceImpl.show(tbItemCat.getId())));
listNode.add(pNode);
}else {
listNode.add("/products/"+tbItemCat.getId()+".html|"+tbItemCat.getName());
}
}
return listNode;
}
6.之后我们需要完成控制器的代码,这里运用的就是前面说的Jspon技术,Java中对其进行了封装,方便了我们的使用:
@Controller
public class TbItemCatController {
@Resource
private TbItemCatService tbItemCatServiceImpl;
@RequestMapping("rest/itemcat/all")
@ResponseBody
public MappingJacksonValue showMenu(String callback) {
MappingJacksonValue mjv=new MappingJacksonValue(tbItemCatServiceImpl.showCatMenu());
mjv.setJsonpFunction(callback);
return mjv;
}
}