若依不分离首页模块保姆级源码解析
接着上文来在上文中login.js验证成功后跳转到 location.href = ctx + ‘index’;
那我们就去index瞅一瞅
function login() {
$.modal.loading($("#btnSubmit").data("loading"));
//获取账号密码 消除空格
var username = $.common.trim($("input[name='username']").val());
var password = $.common.trim($("input[name='password']").val());
//获取验证码的值
var validateCode = $("input[name='validateCode']").val();
var rememberMe = $("input[name='rememberme']").is(':checked');
$.ajax({
type: "post",
//var ctx = [[@{/}]]; 在index.html中有定义的
url: ctx + "login",
//把这四个传到 控制层的login页面 扣出数据封装成对象给后端
data: {
"username": username,
"password": password,
"validateCode": validateCode,
"rememberMe": rememberMe
},
success: function(r) {
//判断状态码是否等于0
if (r.code == web_status.SUCCESS) {
//跳到/index页面
location.href = ctx + 'index';
} else {
//如果失败了就 关闭转圈圈
$.modal.closeLoading();
//触发更新验证码
$('.imgcode').click();
//验证码内容清空
$(".code").val("");
//弹窗登录失败
$.modal.msg(r.msg);
}
}
});
}
复制 index 去idea搜索
点进GetMapping 直接食用即可
// 系统首页
@GetMapping("/index")
public String index(ModelMap mmap)
{
// 取身份信息 拿到登录用户 这个是若依在里边封装后的方法
SysUser user = getSysUser();
// 根据用户id取出菜单
// 使用menuService进行具体的业务处理,跳转到service层
// 返回一个List对象,其类型是SysMenu
// SysMenu是一个菜单的权限表对象,其设置了菜单名、类型、父菜单、子菜单等等一系列属性
List<SysMenu> menus = menuService.selectMenusByUser(user);
//将相关的信息放入视图map中,类型为String-Object
mmap.put("menus", menus);
mmap.put("user", user);
//侧边栏主题
mmap.put("sideTheme", configService.selectConfigByKey("sys.index.sideTheme"));
//皮肤名称
mmap.put("skinName", configService.selectConfigByKey("sys.index.skinName"));
Boolean footer = Convert.toBool(configService.selectConfigByKey("sys.index.footer"), true);
Boolean tagsView = Convert.toBool(configService.selectConfigByKey("sys.index.tagsView"), true);
mmap.put("footer", footer);
mmap.put("tagsView", tagsView);
mmap.put("mainClass", contentMainClass(footer, tagsView));
//版权年份
mmap.put("copyrightYear", RuoYiConfig.getCopyrightYear());
mmap.put("demoEnabled", RuoYiConfig.isDemoEnabled());
mmap.put("isDefaultModifyPwd", initPasswordIsModify(user.getPwdUpdateDate()));
mmap.put("isPasswordExpired", passwordIsExpiration(user.getPwdUpdateDate()));
mmap.put("isMobile", ServletUtils.checkAgentIsMobile(ServletUtils.getRequest().getHeader("User-Agent")));
// 菜单导航显示风格
String menuStyle = configService.selectConfigByKey("sys.index.menuStyle");
// 移动端,默认使左侧导航菜单,否则取默认配置
String indexStyle = ServletUtils.checkAgentIsMobile(ServletUtils.getRequest().getHeader("User-Agent")) ? "index" : menuStyle;
// 优先Cookie配置导航菜单
Cookie[] cookies = ServletUtils.getRequest().getCookies();
for (Cookie cookie : cookies)
{
if (StringUtils.isNotEmpty(cookie.getName()) && "nav-style".equalsIgnoreCase(cookie.getName()))
{
indexStyle = cookie.getValue();
break;
}
}
//判断是移动端还是pc端,跳转的页面不同
String webIndex = "topnav".equalsIgnoreCase(indexStyle) ? "index-topnav" : "index";
//将视图解析器返回到页面
return webIndex;
}
我们发现这句代码很厉害哦,点进去看看
SysUser user = getSysUser();
经典BastController
/**
* 获取用户缓存信息
*/
public SysUser getSysUser()
{
return ShiroUtils.getSysUser();
}
再点击 ShiroUtils 点进去
没错了就是这个没有参数的方法
public static SysUser getSysUser()
{
SysUser user = null;
//获取身份信息 认证凭证 可以是字符串也可以是个对象
//通过调试我们发现obj就是一个SysUser对象
Object obj = getSubject().getPrincipal();
if (StringUtils.isNotNull(obj))
{
user = new SysUser();
//把属性复制到新new的 user对象
BeanUtils.copyBeanProp(user, obj);
}
return user;
}
OK 回到上边的代码继续往下看
我们假设用的是pc端 我们去 index 看一看到底做了什么
//判断是移动端还是pc端,跳转的页面不同
String webIndex = "topnav".equalsIgnoreCase(indexStyle) ? "index-topnav" : "index";
//将视图解析器返回到页面
return webIndex;
这里写了菜单的遍历这部分是和用户相关的 不同用户看到的不一样
<li th:each="menu : ${menus}">
<a th:class="@{${!#strings.isEmpty(menu.url) && menu.url != '#'} ? ${menu.target}}" th:href="@{${#strings.isEmpty(menu.url)} ? |#| : ${menu.url}}" th:data-refresh="${menu.isRefresh ==