面试日记实操题

项目场景

离职找工作的第个星期第一天
题目:面试官让我设计一个权限表从前端到数据库设计到请求逻辑。


问题描述:

用shiro对菜单授权,菜单下面有子菜单,针对不同的用户做授权认证。


原因分析:

当时我没写出来,后来思考了一下,发现自己脱离文档或者以前的项目去自己写代码的能力比较薄弱,可能复制粘贴多了有关吧!


解决方案:

前端

针对这道题我一般都会想到前端展示会是什么样子的呢?因为以前有个的经验脑海中自然想到了EazyUI的菜单工具栏。

简单的写下前端代码如下:

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>Basic SideMenu - jQuery EasyUI Demo</title>
	<link rel="stylesheet" type="text/css" href="static/themes/default/easyui.css">
	<link rel="stylesheet" type="text/css" href="static/themes/icon.css">
	<script type="text/javascript" src="static/jquery.min.js"></script>
	<script type="text/javascript" src="static/jquery.easyui.min.js"></script>
</head>
<body>
	<h2>菜单授权模拟</h2>
	<p>这里是一个菜单</p>
	
	<div style="width:200px;height:auto;border:1px solid #ccc;">
		<ul id="tt" class="easyui-tree"></ul>
	</div>
	<script type="text/javascript">
		$(function (){
            $("#tt").tree({
                url:"static/tree.json",
            })
        });
	</script>
</body>
</html>

真正有用得是<p>标签下的9行代码,先加载着静态的数据先,有后台再动态从sql拉吧!

 

 现在看得出效果了。

menu表设计

接下来是数据库设计部分来了!因为题目给出的是菜单和权限,肯定要有两章表,先不管三七二十一,把这两张表搞出来再说。

 我先搞个懵逼的数据库,反正我当时很懵逼!

先把menu_tb(菜单表)设计出来

 注意把它的father_id和它自己的id搞个外键关联(别问为啥!就是经验)。

 

设计了menu表后,权限表没什么灵感。先别管插入几条数据,把数据展示到前端再说。

把Menu的数据展示到前端

如何把表数据展示到前端,使用ssm的三层设计模式很简单。数据库数据如下:

代码如下:

@Controller
public class MenuController {

    @Autowired
    MenuService menuService;

    /**获取树形菜单数据*/
    @RequestMapping("/getTreeData")
    @ResponseBody
    public List<Menu> getTreeData(){
        return menuService.getTreeData();
    }
}
public interface MenuService{
    List<Menu> getTreeData();
}
@Service
@Transactional
public class MenuServiceImp implements MenuService {

    @Autowired
    MenuMapper menuMapper;

    @Override
    public List<Menu> getTreeData() {
        return menuMapper.getTreeData();
    }
}
public interface MenuMapper {
    List<Menu> getTreeData();
}
@Setter
@Getter
@ToString
public class Menu {
    private Long id;
    private String name;
    /**用来存放自己的父菜单*/
    private Menu father;
    /**存放自己的子菜单*/
    private List<Menu> children;
}

 menuMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper  namespace="com.mycode.mapper.MenuMapper" >
    <resultMap id="BaseResultMap" type="com.mycode.domain.Menu">
        <id column="id" property="id" jdbcType="BIGINT" />
        <result column="menu_name" property="name" jdbcType="VARCHAR" />
        <association property="father" javaType="com.mycode.domain.Menu" columnPrefix="c_">
            <result property="id" column="id"/>
            <result property="name" column="menu_name"/>
        </association>
        <collection property="children" ofType="com.mycode.domain.Menu" select="listChildMenu" column="id"></collection>
    </resultMap>

    <!--获取树形菜单数据
   分步查询 先查根菜单
   根据根菜单的id 查询出子菜单
     -->
    <select id="getTreeData" resultMap="BaseResultMap">
        SELECT *
        FROM
        menu_tb
        WHERE father_id IS NULL;
    </select>
    <!--根据菜单的id,查询出子菜单-->
    <select id="listChildMenu" resultMap="BaseResultMap">
        SELECT *
        FROM
        menu_tb
        WHERE father_id = #{id}
    </select>
</mapper>

js处理后段返回json数据,使其字段符合EazyUI规则。

<script type="text/javascript">
		$(function (){
		    //递归遍历json数据,重新组合成标准树的数据格式
           function json(treeData,arrayTree){
                for(var i = 0;i<treeData.length;i ++){
                    var tree = {}; //对象表达式
                    tree.id = treeData[i].id;
                    tree.text = treeData[i].name;
                    if(treeData[i].children != null){ //判断该节点是否有子节点
                        var childrens = [];
                        tree.children = json(treeData[i].children,childrens);

                    }
                    arrayTree.push(tree);
                }
                return arrayTree;
           }
            var arrayTree = []
            $("#tt").tree({
                url:"/getTreeData",
               //对响应的数据进行过滤,返回标准树的数据格式
               loadFilter:function (data) {
                   return json(data,arrayTree)
               }
            })
        });
	</script>

把Menu展示到前端的难点主要在实体类Menu的设计,以及用js处理返回的json数据上

这样就可以展示了:

 接下来是shiro授权部分,有于脑容量不够,等我抽时间把shiro复习一下再接着完善。

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值