前言:
项目前端和sql都是网上公开找到的。后端是自己一点点搭建起来的。
如果你是小白:
这是小编自己在写整个过程中的记录,几乎每行代码都写了注释。希望帮到有需要的人。
如果你是大佬:
小编在写的过程中,最后确实遇到了问题。奈何才疏学浅解决不了,我已将遇到的问题记录在案,放在文章最后。还希望有缘人不吝赐教。在此谢过了。
另附源码,sql文件。方便大家学习:
仓库地址:
gitee个人仓库地址
百度网盘:
源码下载地址点击这里.
提取码: 6grx
项目登录账户:
登录账户:admin
密码: admin
学习建议:
我还是建议大家下载我的源码,但不建议直接用。
因为里面有很多注释,方便大家阅读学习理解,可以删掉或者注释掉自己学习的部分自己写一遍
。同时前端,工具类大家可以直接拿去另起项目用。另外不懂得,还有小编写的不好的,都要留言
给我呀。
因为篇幅过长,我分两份博客来写。后半部分:https://blog.youkuaiyun.com/qq_44850489/article/details/109516960
效果图:
伴我汽车
- 前言:
- 产品概述:
- 一,创建项目
- 二,引入前端页面
- 三,在dto层(用于前端后端数据传递的封装对象)
- 四,打开数据库
- 五,开发service层
- 六,controller层
- 七,删除操作实现
- 八,添加功能
- 九。修改功能
- 十,到这里,菜单管理页面已经完成了
- 十一,创建user中的 用户管理报表功能,引用了POI插件
- 十二,创建user中的 授权
- 十三,自定义用户Realm开发,十二都再为此做准备
- 十四,整合shiro
- 十五,验证码开发
- 十六,shiro登录开发
- 十七,shiro权限开发
- 十八,登出开发,
- 十九,动态菜单模块中获取用户信息接口
- 二十,动态菜单持久层开发
- 二十一,统一异常开发。
- 二十二,sql监控开发
- 二十三,AOP开发
- 二十四,标签管理 服务层
- 二十五,标签管理 表现层开发。
- 二十六,在下一篇
产品概述:
进入系统正常查看。
开发接口注意:-
页面不需要开发并填充数据
修改了脚本等页面的内容,下次测试时清空页面缓存记录。
先测试接口是否正常响应,再联合页面测试
一,创建项目
创建时引入tymeleaf mabitis, mysql。引入到.pxm文件 .properties文件,代码自动生成.xml文件。修改配置文件,解决版本不兼容等问题,运行所给的sql文件完成数据库的创建,代码自动生成后,调用查看全部数据,测试是否可以正常使用。同时搭建数据库。
二,引入前端页面
创建 在login登录页面提交后请求的Controller,返回ok。(就是先让它直接登录进去,我们先开发里面的东西)到index中。查看其中代码,将index.js中的目录替换为静态目录。测试是否可以正常显示。
三,在dto层(用于前端后端数据传递的封装对象)
创建UserDTO,封装login登录时提交的几个数据,命名要相同。
1,进入首页显示出目录后,
点击菜单管理,f12 报错信息显示传递了三个数据(从报错地址上,找到它向后端传递的字段名,然后根据字段名。我们创建相应的实体类),在页面上有搜索框,菜单id栏有排序的标识。因此在dto中创建QueryDTO,包含这五个字段。 其中排序字段命名为sort ,搜索命名为 search。排序命名为order。分页查询起始位置offset,每次查询多少条数据limit
四,打开数据库
找到sys_menu这个表,创建查询语句。成功查询之后。(这里就是手撕sql语句,看看可以查询成功不,可以了把语句放到mapper中用,不想写可以直接从我的mapper中拿)
2,在SysMenuMapper中添加查询语句。
另外封装对象就以刚刚建立的QueryDTO来封装。另外在查询语句中添加了别名 parentName,(前端是这样写的,这里我们和前端一样,就可以直接查询),所以要在此.xml最上面添加此属性<result column="parentName" property="parentName" />。还需要在包含<result>标签的<resultMap>的type对应模板中添加 此属性,get set方法可加可不加。
3,再到mapper中
SysMenuMapper里面创建对应的接口。返回类型是List<SysMenu> (SysMenu已经给好了) 参数是 QueryDTO 就是前端要传递过来的数据,dao层就写好了。
五,开发service层
创建接口MenuService。 方法 findMenu,返回值是DataGridResult类型。
2,实现接口,实现方法,
添加@Service注解,注入mapper @Autowired,在方法内用PageHelper.offsetPage(queryDTO.getOffset(),queryDTO.getLimit()); 使分页工具类拿到分页数据。
3,然后判断getSort是否为空
sort就是我们前面查看页面向后端传递的参数名。是排序的意思。不为空将 sort设置为 menu_id 因为前端传递过来的是menuid和数据库不匹配(menu_id 是用这个字段来进行排序)。
4,将mapper传回的数据封装到DataGridResult中
先使用list接收调用mapper层返回的数据 命名为menuBypage,然后封装数据PageInfo<SysMenu> info = new PageInfo<SysMenu>(menuByPage);
然后 long total = info.getTotal(); 拿到总数
将总数,和拿到的数据返回
DataGridResult result = new DataGridResult(total,info.getList());
然后返回数据
return result;
六,controller层
创建controller层,添加@Controller注解, 注入注解@Autowired 注入service
添加@RequestMapping(“路径”) (这里的路径就是菜单页面的js访问的路径)
@ResponseBody
调用service层的方法。 直接返回数据
七,删除操作实现
可以通过生成的代码实现单个的删除,
这里我们利用动态sql批量删除。先书写好这个动态sql,参数是list集合,然后在mapper层书写相关接口。
1.到service层书写接口,
返回类型为R,Imp写接口的实现,
这里要防止接口的系统栏被删除,所以这里限制id<50 就返回 系统菜单,不允许删除。
删除操作 我们就添加事务注解 @Transactional(propagation = Propagation.REQUIRED) ,
然后调用mapper层方法,就是刚刚在mapper写的接口,返回参数int,如果大于零,就返回成功,不大于零就返回删除失败。
2.书写controller层,
先找到页面删除时请求的接口。然后写到@RequestMapping("") 写js中删除时访问的接口
在写@ResponseBody
参数里用@RequestBody来接收。