初步调通登录和首页的界面

pull/64/head
fengshuonan 2020-12-27 20:00:09 +08:00
parent b7f7a9c3e2
commit 31f9a6ef0f
12 changed files with 198 additions and 150 deletions

View File

@ -1,7 +1,9 @@
package cn.stylefeng.guns.core.beetl;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.stylefeng.roses.kernel.auth.api.LoginUserApi;
import cn.stylefeng.roses.kernel.system.expander.SystemConfigExpander;
import org.beetl.ext.spring.BeetlGroupUtilConfiguration;
/**
@ -20,8 +22,16 @@ public class CustomBeetlGroupUtilConfiguration extends BeetlGroupUtilConfigurati
@Override
public void initOther() {
// 获取当前用户的接口
groupTemplate.registerFunctionPackage("loginUserApi", loginUserApi);
groupTemplate.registerFunctionPackage("strUtil", StrUtil.class);
// 字符串处理工具类
groupTemplate.registerFunctionPackage("objectUtil", ObjectUtil.class);
// 获取基本信息的工具
groupTemplate.registerFunctionPackage("constants", SystemConfigExpander.class);
// todo 多语言
// groupTemplate.registerFunctionPackage("lang", new UserTranslationContext());
}

View File

@ -1,70 +0,0 @@
package cn.stylefeng.guns.modular.controller;
import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
import cn.stylefeng.roses.kernel.resource.api.annotation.ApiResource;
import cn.stylefeng.roses.kernel.resource.api.annotation.GetResource;
import cn.stylefeng.roses.kernel.rule.pojo.response.ResponseData;
import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
/**
*
*
* @author fengshuonan
* @date 2020/12/13 17:19
*/
@Controller
@Slf4j
@ApiResource(name = "首页接口")
public class IndexController {
/**
*
*
* @author fengshuonan
* @date 2020/12/13 17:19
*/
@ResponseBody
@GetResource(name = "首页接口", path = "/", requiredPermission = false, requiredLogin = false)
public ResponseData logoutPage() {
return new SuccessResponseData("欢迎使用Guns");
}
/**
*
*
* @author fengshuonan
* @date 2020/12/13 17:19
*/
@GetResource(name = "首页接口 view渲染", path = "/test")
public String test() {
return "/demos/test.html";
}
/**
*
*
* @return
* @author huangyao
* @date 2020/12/20 21:36
*/
@GetResource(name = "获取当前登录用户信息", path = "/getLoginUserDetail")
public ResponseData getLoginUserDetail() {
return new SuccessResponseData(LoginContext.me().getLoginUser());
}
/**
* todo
*
* @author fengshuonan
* @date 2020/12/24 22:23
*/
@GetResource(name = "获取用户左侧菜单", path = "/getLeftMenuTree")
public ResponseData getLeftMenuTree() {
return new SuccessResponseData();
}
}

View File

@ -0,0 +1,68 @@
package cn.stylefeng.guns.modular.controller;
import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
import cn.stylefeng.roses.kernel.auth.api.pojo.login.basic.SimpleUserInfo;
import cn.stylefeng.roses.kernel.file.FileOperatorApi;
import cn.stylefeng.roses.kernel.menu.modular.service.SysMenuService;
import cn.stylefeng.roses.kernel.resource.api.annotation.ApiResource;
import cn.stylefeng.roses.kernel.resource.api.annotation.GetResource;
import cn.stylefeng.roses.kernel.system.modular.user.service.SysUserService;
import cn.stylefeng.roses.kernel.system.pojo.menu.layui.LayuiAppIndexMenus;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import javax.annotation.Resource;
import java.util.List;
/**
*
*
* @author fengshuonan
* @date 2020/12/27 16:23
*/
@Controller
@Slf4j
@ApiResource(name = "首页相关的界面渲染")
public class IndexViewController {
@Resource
private SysMenuService sysMenuService;
@Resource
private SysUserService sysUserService;
/**
*
*
* @author fengshuonan
* @date 2020/12/13 17:19
*/
@GetResource(name = "首页界面", path = "/", requiredPermission = false, requiredLogin = false)
public String indexView(Model model) {
// 当前用户已经登录,跳转到首页
if (LoginContext.me().hasLogin()) {
LoginUser loginUser = LoginContext.me().getLoginUser();
SimpleUserInfo simpleUserInfo = loginUser.getSimpleUserInfo();
// 渲染首页的菜单
List<LayuiAppIndexMenus> layuiAppIndexMenus = sysMenuService.getLayuiIndexMenus();
model.addAttribute("layuiAppIndexMenus", layuiAppIndexMenus);
// 获取首页的头像
model.addAttribute("avatar", sysUserService.getUserAvatarUrl(simpleUserInfo.getAvatar()));
// 获取人员姓名
model.addAttribute("name", simpleUserInfo.getRealName());
return "/index.html";
}
// 当前用户没有登录,跳转到登录页面
return "/login.html";
}
}

View File

@ -1,6 +1,7 @@
package cn.stylefeng.guns.modular.controller;
import cn.stylefeng.roses.kernel.auth.api.AuthServiceApi;
import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
import cn.stylefeng.roses.kernel.auth.api.pojo.auth.LoginRequest;
import cn.stylefeng.roses.kernel.auth.api.pojo.auth.LoginResponse;
import cn.stylefeng.roses.kernel.resource.api.annotation.ApiResource;
@ -9,36 +10,52 @@ import cn.stylefeng.roses.kernel.resource.api.annotation.PostResource;
import cn.stylefeng.roses.kernel.rule.pojo.response.ResponseData;
import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
/**
*
*
*
* @author majianguo
* @date 2020/12/3 6:15
* @author fengshuonan
* @date 2020/12/27 16:23
*/
@RestController
@Controller
@Slf4j
@ApiResource(name = "登陆登出管理")
public class LoginController {
@ApiResource(name = "登录相关的接口")
public class LoginViewController {
@Resource
private AuthServiceApi authServiceApi;
/**
*
*
*
* @param loginRequest
* @return token
* @author majianguo
* @date 2020/12/4 9:05
* @author fengshuonan
* @date 2020/12/27 17:10
*/
@PostResource(name = "登陆", path = "/login", requiredLogin = false, requiredPermission = false)
public ResponseData doAuth(@RequestBody @Validated LoginRequest loginRequest) {
@GetResource(name = "登录界面", path = "/login", requiredPermission = false, requiredLogin = false)
public String login() {
if (LoginContext.me().hasLogin()) {
return "redirect:/";
} else {
return "/login.html";
}
}
/**
*
*
* @author fengshuonan
* @date 2020/12/27 17:10
*/
@PostResource(name = "登录接口", path = "/loginAction", requiredPermission = false, requiredLogin = false)
@ResponseBody
public ResponseData loginAction(@RequestBody @Validated LoginRequest loginRequest) {
LoginResponse loginResponse = authServiceApi.login(loginRequest);
return new SuccessResponseData(loginResponse.getToken());
}
@ -50,7 +67,8 @@ public class LoginController {
* @author majianguo
* @date 2020/12/4 9:05
*/
@GetResource(name = "登出", path = "/logout", requiredPermission = false)
@GetResource(name = "登出接口", path = "/logout", requiredPermission = false)
@ResponseBody
public ResponseData logoutPage() {
authServiceApi.logout();
return new SuccessResponseData();

View File

@ -0,0 +1,15 @@
package cn.stylefeng.guns.modular.service;
import org.springframework.stereotype.Service;
/**
*
*
* @author fengshuonan
* @date 2020/12/27 18:25
*/
@Service
public class IndexService {
}

View File

@ -0,0 +1,29 @@
{
"properties": [
{
"name": "scanner.open",
"type": "java.lang.String",
"description": "Description for scanner.open."
},
{
"name": "sys-log.type",
"type": "java.lang.String",
"description": "Description for sys-log.type."
},
{
"name": "sys-log.file-save-path",
"type": "java.lang.String",
"description": "Description for sys-log.file-save-path."
},
{
"name": "spring.datasource.max-active",
"type": "java.lang.String",
"description": "Description for spring.datasource.max-active."
},
{
"name": "spring.datasource.max-pool-prepared-statement-per-connection-size",
"type": "java.lang.String",
"description": "Description for spring.datasource.max-pool-prepared-statement-per-connection-size."
}
]
}

View File

@ -24,7 +24,8 @@ spring:
scanner:
open: true
sys-log:
type: db # db-数据库file-文件
# db-数据库file-文件
type: db
file-save-path: _sys_logs
mybatis-plus:
@ -39,10 +40,4 @@ mybatis-plus:
enable-sql-runner: true
db-config:
id-type: assign_id
table-underline: true
session:
expiredSeconds: 1800
log:
path: _app_logs
table-underline: true

View File

@ -5,6 +5,7 @@ layui.define(['jquery'], function (exports) {
this.url = url;
this.type = "post";
this.data = {};
this.contentType = "application/json";
this.dataType = "json";
this.async = false;
this.success = success;
@ -25,9 +26,10 @@ layui.define(['jquery'], function (exports) {
$.ajax({
type: me.type,
url: me.url,
contentType: me.contentType,
dataType: me.dataType,
async: me.async,
data: me.data,
data: JSON.stringify(me.data),
beforeSend: function (data) {
},

View File

@ -16,21 +16,21 @@
<div class="layui-layout layui-layout-admin">
<!-- 头部 -->
@include("/common/_header.html"){}
@include("/layout/_header.html"){}
<!-- 侧边栏 -->
@include("/common/_sidebar.html"){}
@include("/layout/_sidebar.html"){}
<!-- 主体部分 -->
@include("/common/_body.html"){}
@include("/layout/_body.html"){}
<!-- 底部 -->
@include("/common/_footer.html"){}
@include("/layout/_footer.html"){}
</div>
<!-- 加载动画移除位置在common.js中 -->
@include("/common/loading.html"){}
@include("/layout/loading.html"){}
@/* 加入contextPath属性和session超时的配置 */
<script type="text/javascript">

View File

@ -13,29 +13,16 @@
<a ew-event="refresh" title="刷新"><i class="layui-icon layui-icon-refresh-3"></i></a>
</li>
@var types = shiro.getUser().systemTypes;
@if(tool.isNotEmpty(types)){
@for(type in types) {
@if(typeLP.index == 1){
<li class="layui-nav-item layui-hide-xs layui-this" lay-unselect><a nav-bind="${type.code}">${type.name}</a></li>
@if(objectUtil.isNotEmpty(layuiAppIndexMenus)){
@for(item in layuiAppIndexMenus) {
@if(itemLP.index == 1){
<li class="layui-nav-item layui-hide-xs layui-this" lay-unselect><a nav-bind="${item.appCode}">${item.appCode}</a></li>
@}else{
<li class="layui-nav-item layui-hide-xs" lay-unselect><a nav-bind="${type.code}">${type.name}</a></li>
<li class="layui-nav-item layui-hide-xs" lay-unselect><a nav-bind="${item.appCode}">${item.appCode}</a></li>
@}
@}
@}
@if(constants.getDefaultAdvert()){
<li class="layui-nav-item" lay-unselect>
<a href="https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=p4kqz45e" target="_blank">阿里云5折优惠券点我领取</a>
</li>
<li class="layui-nav-item" lay-unselect>
<a style="color: #5FB878;" href="https://www.stylefeng.cn" target="_blank">Guns企业版加群找群主买优惠</a>
</li>
<li class="layui-nav-item" lay-unselect>
<a style="color: #fe7300;" href="https://gitee.com/stylefeng/guns" target="_blank">请star支持一下Guns</a>
</li>
@}
</ul>
<ul class="layui-nav layui-layout-right">
<li class="layui-nav-item layui-hide-xs" lay-unselect>
@ -47,20 +34,20 @@
<li class="layui-nav-item" lay-unselect>
<a>
<img src="${avatar!}" class="layui-nav-img">
<cite>${name!"用户"}</cite>
<cite>写死的用户</cite>
</a>
<dl class="layui-nav-child">
<dd lay-unselect>
<a ew-href="${ctxPath}/system/user_info">${lang.get("MENU_PERSONAL_INFO","个人中心")}</a>
<a ew-href="${ctxPath}/system/user_info">个人中心</a>
</dd>
<dd lay-unselect>
<a id="setPsw">${lang.get("MENU_CHANGE_PASSWORD","修改密码")}</a>
<a id="setPsw">修改密码</a>
</dd>
<hr>
<div id="languageDiv"></div>
<hr>
<dd lay-unselect>
<a id="btnLogout">${lang.get("MENU_LOGOUT","退出")}</a>
<a id="btnLogout">退出</a>
</dd>
</dl>
</li>

View File

@ -2,48 +2,48 @@
<div class="layui-side">
<div class="layui-side-scroll">
@for(item in menus){
<ul class="layui-nav layui-nav-tree arrow2" nav-id="${item.systemType}" lay-shrink="all" lay-filter="admin-side-nav" style="margin-top: 15px;">
@for(menu in item.menus) {
@if(tool.isEmpty(menu.children)){
@for(item in layuiAppIndexMenus){
<ul class="layui-nav layui-nav-tree arrow2" nav-id="${item.appCode}" lay-shrink="all" lay-filter="admin-side-nav" style="margin-top: 15px;">
@for(menu in item.layuiIndexMenuTreeNodes) {
@if(objectUtil.isEmpty(menu.children)){
<li class="layui-nav-item">
@if(itemLP.first && menuLP.first){
<a id="firstPageAction" lay-href="${menu.url}"><i class="layui-icon ${menu.icon}"></i>&emsp;<cite>${menu.name}</cite></a>
<a id="firstPageAction" lay-href="${menu.router}"><i class="layui-icon ${menu.icon}"></i>&emsp;<cite>${menu.menuName}</cite></a>
@}else{
<a lay-href="${menu.url}"><i class="layui-icon ${menu.icon}"></i>&emsp;<cite>${menu.name}</cite></a>
<a lay-href="${menu.router}"><i class="layui-icon ${menu.icon}"></i>&emsp;<cite>${menu.menuName}</cite></a>
@}
</li>
@}else{
<li class="layui-nav-item">
<a><i class="layui-icon ${menu.icon}"></i>&emsp;<cite>${menu.name}</cite></a>
<a><i class="layui-icon ${menu.icon}"></i>&emsp;<cite>${menu.menuName}</cite></a>
<dl class="layui-nav-child">
@for(subMenu in menu.children){
@if(tool.isEmpty(subMenu.children)){
@if(objectUtil.isEmpty(subMenu.children)){
@if(itemLP.first && menuLP.first && subMenuLP.first){
<dd><a id="firstPageAction" lay-href="${subMenu.url}">${subMenu.name}</a></dd>
<dd><a id="firstPageAction" lay-href="${subMenu.router}">${subMenu.menuName}</a></dd>
@}else{
<dd><a lay-href="${subMenu.url}">${subMenu.name}</a></dd>
<dd><a lay-href="${subMenu.router}">${subMenu.menuName}</a></dd>
@}
@}else{
<dd>
<a>${subMenu.name}</a>
<a>${subMenu.menuName}</a>
<dl class="layui-nav-child">
@for(subSubMenu in subMenu.children){
@if(tool.isEmpty(subSubMenu.children)){
@if(objectUtil.isEmpty(subSubMenu.children)){
@if(itemLP.first && menuLP.first && subMenuLP.first && subSubMenuLP.first){
<dd><a id="firstPageAction" lay-href="${subSubMenu.url}">${subSubMenu.name}</a></dd>
<dd><a id="firstPageAction" lay-href="${subSubMenu.router}">${subSubMenu.menuName}</a></dd>
@}else{
<dd><a lay-href="${subSubMenu.url}">${subSubMenu.name}</a></dd>
<dd><a lay-href="${subSubMenu.router}">${subSubMenu.menuName}</a></dd>
@}
@}else{
<dd>
<a>${subSubMenu.name}</a>
<a>${subSubMenu.menuName}</a>
<dl class="layui-nav-child">
@for(subSubSubMenu in subSubMenu.children){
@if(itemLP.first && menuLP.first && subMenuLP.first && subSubMenuLP.first && subSubSubMenuLP.first){
<dd><a id="firstPageAction" lay-href="${subSubSubMenu.url}">${subSubSubMenu.name}</a></dd>
<dd><a id="firstPageAction" lay-href="${subSubSubMenu.router}">${subSubSubMenu.menuName}</a></dd>
@}else{
<dd><a lay-href="${subSubSubMenu.url}">${subSubSubMenu.name}</a></dd>
<dd><a lay-href="${subSubSubMenu.router}">${subSubSubMenu.menuName}</a></dd>
@}
@}
</dl>

View File

@ -179,17 +179,13 @@
<i class="layui-icon layui-icon-password"></i>
<input class="layui-input" id="password" name="password" placeholder="请输入登录密码" value="111111" type="password" lay-verType="tips" lay-verify="required" required/>
</div>
@if(constants.getKaptchaOpen()){
@if(constants.getCaptchaOpen()){
<div class="layui-form-item layui-input-icon-group login-captcha-group">
<i class="layui-icon layui-icon-auz"></i>
<input class="layui-input" id="kaptcha" placeholder="请输入验证码" autocomplete="off" lay-verType="tips" lay-verify="required" required/>
<img class="login-captcha" src="${ctxPath}/kaptcha" alt=""/>
</div>
@}
<!-- <div class="layui-form-item">-->
<!-- <input type="checkbox" name="remember" title="记住密码" lay-skin="primary" checked>-->
<!-- <a href="javascript:;" class="layui-link pull-right">注册账号</a>-->
<!-- </div>-->
<div class="layui-form-item">
<button class="layui-btn layui-btn-fluid" id="submit">登录</button>
</div>
@ -215,13 +211,12 @@
<script type="text/javascript" src="${ctxPath}/assets/common/libs/layui/layui.js?v=${constants.getReleaseVersion()}"></script>
<script type="text/javascript" src="${ctxPath}/assets/common/js/common.js?v=${constants.getReleaseVersion()}"></script>
<script>
layui.use(['layer', 'form', 'index', 'ax', 'notice'], function () {
layui.use(['layer', 'form', 'index', 'ax'], function () {
var $ = layui.jquery;
var layer = layui.layer;
var form = layui.form;
var $ax = layui.ax;
var index = layui.index;
var notice = layui.notice;
$('.login-wrapper').removeClass('layui-hide');
@ -251,19 +246,19 @@
//登录操作
$('#submit').click(function () {
var ajax = new $ax(Feng.ctxPath + "/login", function (data) {
var ajax = new $ax(Feng.ctxPath + "/loginAction", function (data) {
Feng.success("登录成功!");
index.clearTabCache();
window.location.href = Feng.ctxPath + "/";
}, function (data) {
layer.msg("登录失败!" + data.responseJSON.message, {icon: 5, anim: 6});
});
ajax.set("username", $("#username").val());
ajax.set("account", $("#username").val());
ajax.set("password", $("#password").val());
@if(constants.getTenantOpen()){
ajax.set("tenantCode", $("#tenantCode").val());
@}
@if(constants.getKaptchaOpen()){
@if(constants.getCaptchaOpen()){
ajax.set("kaptcha", $("#kaptcha").val());
@}
ajax.start();
@ -272,6 +267,5 @@
});
</script>
</body>
</html>