写在前面-整体介绍
本次demo采用SSM整体架构,数据库使用的mysql,安全权限控制框架使用的是shiro(前后端),目标是电商的后管系统。包含,权限管理、用户管理、产品分类、商品管理、订单管理,五大模块。从今天开始开始复习本demo。从权限管理开始。
如何从servlet项目到SSM的整体思维转移
其实本质底层还是基于HTTP携带数据,进行相关的转发或者重定向,亦或是session或者cookie的处理。servlet本质是ssm的基础,代码更接近底层。
如何对应呢?
1.首先知道什么是SSM-Spring、SpringMVC、Mybaties三大框架。
2.Spring
在上一个servlet的版本中我们每层的实例化对象都是我们new出来的,所以耦合度很大。现在我们交给spring来管理。无论是bean、还是控制层、服务层、持久层我们都通过spring来获取(这里说下杨老师的指导,servlet和spring对于对象管理这块,比较像我们骑自行车和开汽车的区别:骑自行车的时候,其实还是我们在给自行车动力方向,我们实际上还是带着自行车在向前走,但是汽车就不一样,汽车属于带着我们向前走)当然还有一种常见的理解,菜篮子理论,以前你是主动去菜市场买菜,现在就把篮子放在门口,等着社区工作人员给你送上门来就行。暂时我理解的也没多少自己的独特点。spring就说到这,记住就是管理一切以前需要new的就行(其实不仅仅这些,暂时先说这些)。
3.SpringMVC
我们以前的控制层代码思路是通过获取httprequest中的url来分辨,数据流的方向。现在我们通过注解直接加到,可以实现对数据流的控制,包括ajax的相应、转发重定向。至于返回页面这块,我们以前的代码大多数多于两行,现在我们通过前端解析器的配合,使得转发或者更加简单。
4.Mybaties
以前的dao层我们是自己书写sql语句,不仅仅十分繁重的任务其实冗余也很大,并且没有基于实体类这种sql语句(当时基于业务逻辑,其实粒度很细,但是语句之间有很多可以抽离出来共性的东西。)这次采用mybaties是因为他是一个半自动化的dao层执行软件,半自动化意味着我们可以根据实际需求相应做一些语句的增加和改变。
正文
本身后管系统是基于用户、角色、权限这一模型而建立的。他们三者,存在从左到右的一对多或者多对多关系。具体实现的效果是,不同用户拥有不同角色、不同角色又拥有不同权限。我们这里说下权限,在本demo里面的定义。权限分为两种一种是菜单,一种是权限(操作)。实现效果如图所示。
左侧菜单栏代表上述所说菜单,不同的角色菜单不同,然后再细化,比如说权限管理下面的编辑删除这样的操作,不同的角色也都不一样,有些基础橘色压根就没有这两个按钮,当然有些角色左侧菜单栏有的也没有。
设计流程,自底向上
要实现上述的话首先最基本的三张表,用户表,角色表,权限表。另外我们在这个项目中并没有使用外键,所以我们还需要两张关联表。用户—角色表、角色权限表。
再说dao层,我们这里涉及到第一次使用mybaties,有一个词你要知道,逆向工程。*
何为逆向工程*–通过我们设计好的数据库,我们从反向生成三样东西。
bean实例化对象(你比如说上面的user role permission这三个实体类,当然还有对应的example对象,以后再说),dao层接口(像usermapper这样的接口),以及对应的各个类的xml文件(像usermapper.xml这样的xml文件)。在我们生成以后我们将bean对象、以及dao层接口都交给spring来管理。方便以后我们在control层以及service层的使用。@注解加上(具体细节,自行查阅官方文档)
到此,我们的MVC模式就差control层和service层了。
control层仍然负责接受前端的请求,调用service层相应函数,service层调用dao层。只是上文提起过在ssm里面做了代码简化。
大概看下代码。
控制层
@Controller
public class Logincontroller {
@Autowired
UserService service;
@Autowired
RoleService roleService;
@Autowired
permissionService permissionService;
@RequestMapping("/user/login")
@ResponseBody
public Msg login(User user) throws Exception{
service层
@Service
public class permissionService {
@Autowired
PermissionMapper permissionMapper;
@Autowired
RoleMapper roleMapper;
@Autowired
RpMapper rpMapper;
@Autowired
RpExample rpExample;
// fc1
// 登录以后页面菜单的渲染
public List<Permission> getPermissionsByUserId(Integer getuId) {
// 查出这个用户 什么角色 这个角色有什么菜单
List<Permission> menus=permissionMapper.getPermissionsByUserId(getuId);
return menus;
}
dao层
@Component
public interface AddressMapper {
int countByExample(AddressExample example);
int deleteByExample(