Commit f81ca489 authored by 黄奎's avatar 黄奎

页面修改

parent d8fd8db0
......@@ -20,5 +20,10 @@ namespace Edu.Common
/// 当前请求的post参数
/// </summary>
public const string UserPostInfo = "UserPostInfo";
/// <summary>
/// 用户验证信息
/// </summary>
public const string JWT_User_Key = "edu_userInfo";
}
}
......@@ -43,5 +43,10 @@ namespace Edu.Model.CacheModel
/// Token验证
/// </summary>
public string Token { get; set; }
/// <summary>
/// 菜单列表
/// </summary>
public object MenuList { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Model.ViewModel.System
{
/// <summary>
/// 菜单树形结构实体
/// </summary>
public class MenuTree_ViewModel
{
/// <summary>
/// 主键(菜单编号)
/// </summary>
public int MenuId { get; set; }
/// <summary>
/// 菜单名称
/// </summary>
public string MenuName { get; set; }
/// <summary>
/// 菜单链接地址
/// </summary>
public string MenuUrl { get; set; }
/// <summary>
/// 菜单图标
/// </summary>
public string MenuIcon { get; set; }
/// <summary>
/// 子菜单列表
/// </summary>
public List<MenuTree_ViewModel> SubList { get; set; }
}
}
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<TargetFramework>netcoreapp3.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
......
......@@ -2,6 +2,7 @@
using Edu.Repository.System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using VT.FW.DB;
......@@ -96,5 +97,70 @@ namespace Edu.Module.System
bool flag = menuRepository.Update(fileds, new WhereHelper(nameof(RB_Menu_ViewModel.MenuId), MenuId));
return flag;
}
/// <summary>
/// 获取树形菜单
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public List<MenuTree_ViewModel> GetTreeMenuModule(RB_Menu_ViewModel query)
{
List<MenuTree_ViewModel> treeList = new List<MenuTree_ViewModel>();
var list= GetMenuListModule(query);
if (list != null && list.Count > 0)
{
//一级菜单
var firstLevelList = list.Where(qitem => qitem.MenuLevel == 1).ToList();
if (firstLevelList != null && firstLevelList.Count > 0)
{
foreach (var fItem in firstLevelList)
{
MenuTree_ViewModel fModel = new MenuTree_ViewModel()
{
MenuId = fItem.MenuId,
MenuName = fItem.MenuName,
MenuUrl = fItem.MenuUrl,
MenuIcon=fItem.MenuIcon,
SubList = new List<MenuTree_ViewModel>()
};
//二级菜单
var secondLevelList= list.Where(qitem => qitem.MenuLevel == 2&&qitem.ParentId==fItem.MenuId).ToList();
if (secondLevelList != null && secondLevelList.Count > 0)
{
foreach (var sItem in secondLevelList)
{
MenuTree_ViewModel sModel = new MenuTree_ViewModel()
{
MenuId = sItem.MenuId,
MenuName = sItem.MenuName,
MenuUrl = sItem.MenuUrl,
MenuIcon = sItem.MenuIcon,
SubList = new List<MenuTree_ViewModel>()
};
//三级菜单
var thirdLevelList= list.Where(qitem => qitem.MenuLevel == 3 && qitem.ParentId == sItem.MenuId).ToList();
if (thirdLevelList != null && thirdLevelList.Count > 0)
{
foreach (var tItem in thirdLevelList)
{
sModel.SubList.Add(new MenuTree_ViewModel()
{
MenuId = tItem.MenuId,
MenuName = tItem.MenuName,
MenuUrl = tItem.MenuUrl,
MenuIcon = tItem.MenuIcon,
SubList = new List<MenuTree_ViewModel>()
});
}
}
fModel.SubList.Add(sModel);
}
}
treeList.Add(fModel);
}
}
}
return treeList;
}
}
}
}
\ No newline at end of file
......@@ -8,8 +8,10 @@ using Edu.Common.API;
using Edu.Common.Plugin;
using Edu.Model.CacheModel;
using Edu.Model.ViewModel.User;
using Edu.Module.System;
using Edu.Module.User;
using Edu.WebApi.Filter;
using Edu.WebApi.Helper;
using JWT;
using JWT.Algorithms;
using JWT.Serializers;
......@@ -19,6 +21,7 @@ using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;
namespace Edu.WebApi.Controllers.User
{
[Route("api/[controller]/[action]")]
......@@ -32,6 +35,11 @@ namespace Edu.WebApi.Controllers.User
/// </summary>
private readonly AccountModule accountModule = new AccountModule();
/// <summary>
/// 菜单处理类对象
/// </summary>
private readonly MenuModule menuModule = new MenuModule();
/// <summary>
/// 用户登录
/// </summary>
......@@ -42,7 +50,6 @@ namespace Edu.WebApi.Controllers.User
public ApiResult Login()
{
JObject jobj = JObject.Parse(RequestParm.Msg.ToString());
string account = jobj.GetStringValue("Account");
string password = jobj.GetStringValue("Password");
int accountType = jobj.GetInt("AccountType", 1);
......@@ -69,25 +76,12 @@ namespace Edu.WebApi.Controllers.User
{
return ApiResult.Failed(message: $"此账号【{ account }】已删除!");
}
TokenUserInfo userInfo = new TokenUserInfo { Uid = model.Id.ToString(), RequestFrom = Common.Enum.ApiRequestFromEnum.WebAdmin };
IDateTimeProvider provider = new UtcDateTimeProvider();
var now = provider.GetNow().AddMinutes(-1);
var unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
var secondsSinceEpoch = Math.Round((now - unixEpoch).TotalSeconds);
var payload = new Dictionary<string, object>
{
{"iat",secondsSinceEpoch },
{"exp",secondsSinceEpoch+Common.Config.JwtExpirTime},
{"edu_userInfo",userInfo }
};
IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
IJsonSerializer serializer = new JsonNetSerializer();
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);
string secret = Common.Config.JwtSecretKey;
string token = encoder.Encode(payload, secret);
//生成token
string token = WebApiTokenHelper.CreateToken(model.Id.ToString(), Common.Enum.ApiRequestFromEnum.WebAdmin);
var treeList = menuModule.GetTreeMenuModule(new Model.ViewModel.System.RB_Menu_ViewModel()
{
MenuType = accountType
});
UserInfo obj = new UserInfo
{
Id = model.Id,
......@@ -97,6 +91,7 @@ namespace Edu.WebApi.Controllers.User
GroupName = model.GroupName,
SchoolName = model.SchoolName,
Token = token,
MenuList= treeList
};
UserReidsCache.UserInfoSet(Cache.CacheKey.User_Login_Key + model.Id, obj, Common.Config.JwtExpirTime);
return ApiResult.Success(data: obj);
......
......@@ -22,6 +22,7 @@
<ProjectReference Include="..\Edu.Cache\Edu.Cache.csproj" />
<ProjectReference Include="..\Edu.Common\Edu.Common.csproj" />
<ProjectReference Include="..\Edu.Model\Edu.Model.csproj" />
<ProjectReference Include="..\Edu.Module.System\Edu.Module.System.csproj" />
<ProjectReference Include="..\Edu.Module.User\Edu.Module.User.csproj" />
<ProjectReference Include="..\Edu.Repository\Edu.Repository.csproj" />
</ItemGroup>
......
using JWT;
using JWT.Serializers;
using Newtonsoft.Json.Linq;
using System;
using System.IO;
......@@ -12,6 +11,7 @@ using Microsoft.AspNetCore.Http.Features;
using Edu.Common.Plugin;
using Edu.Common.API;
using Edu.Cache.User;
using Edu.WebApi.Helper;
namespace Edu.WebApi.Filter
{
......@@ -36,17 +36,13 @@ namespace Edu.WebApi.Filter
isCheckToken = false;
}
#region Token校验
//Token校验
if (isCheckToken)
{
JWTValidat(actionContext, token);
}
#endregion
#region 验证表单重复提交
string controllerName = actionContext.ActionDescriptor.RouteValues["controller"].ToString().ToLower();
string actionName = actionContext.ActionDescriptor.RouteValues["action"].ToString().ToLower();
if (!actionName.ToLower().Contains("get"))
......@@ -125,15 +121,8 @@ namespace Edu.WebApi.Filter
//解析token,校验是否失效
try
{
IJsonSerializer serializer = new JsonNetSerializer();
IDateTimeProvider provider = new UtcDateTimeProvider();
IJwtValidator validator = new JwtValidator(serializer, provider);
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder);
string secret =Common.Config.JwtSecretKey;
var json = decoder.Decode(token, secret, verify: true);//token为之前生成的字符串
JObject jwtJson = JObject.Parse(json);
actionContext.HttpContext.Items[Common.GlobalKey.TokenUserInfo] = jwtJson["edu_userInfo"];
JObject jwtJson = WebApiTokenHelper.AnalysisToken(token);
actionContext.HttpContext.Items[Common.GlobalKey.TokenUserInfo] = jwtJson[Common.GlobalKey.JWT_User_Key];
}
catch (SignatureVerificationException sve)
{
......
using Edu.Common.API;
using JWT;
using JWT.Algorithms;
using JWT.Serializers;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Edu.WebApi.Helper
{
/// <summary>
/// Token帮助类
/// </summary>
public class WebApiTokenHelper
{
/// <summary>
/// 生成Token
/// </summary>
/// <param name="uid"></param>
/// <param name="requestFromEnum"></param>
/// <returns></returns>
public static string CreateToken(string uid, Common.Enum.ApiRequestFromEnum requestFromEnum)
{
TokenUserInfo userInfo = new TokenUserInfo { Uid = uid, RequestFrom = requestFromEnum };
IDateTimeProvider provider = new UtcDateTimeProvider();
var now = provider.GetNow().AddMinutes(-1);
var unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
var secondsSinceEpoch = Math.Round((now - unixEpoch).TotalSeconds);
var payload = new Dictionary<string, object>
{
{"iat",secondsSinceEpoch },
{"exp",secondsSinceEpoch+Common.Config.JwtExpirTime},
{Common.GlobalKey.JWT_User_Key,userInfo }
};
IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
IJsonSerializer serializer = new JsonNetSerializer();
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);
string secret = Common.Config.JwtSecretKey;
string token = encoder.Encode(payload, secret);
return token;
}
/// <summary>
/// 解析Token
/// </summary>
/// <param name="token"></param>
/// <returns></returns>
public static JObject AnalysisToken(string token)
{
IJsonSerializer serializer = new JsonNetSerializer();
IDateTimeProvider provider = new UtcDateTimeProvider();
IJwtValidator validator = new JwtValidator(serializer, provider);
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder);
string secret = Common.Config.JwtSecretKey;
var json = decoder.Decode(token, secret, verify: true);//token为之前生成的字符串
JObject jwtJson = JObject.Parse(json);
return jwtJson;
}
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment