Commit f81ca489 authored by 黄奎's avatar 黄奎

页面修改

parent d8fd8db0
...@@ -20,5 +20,10 @@ namespace Edu.Common ...@@ -20,5 +20,10 @@ namespace Edu.Common
/// 当前请求的post参数 /// 当前请求的post参数
/// </summary> /// </summary>
public const string UserPostInfo = "UserPostInfo"; public const string UserPostInfo = "UserPostInfo";
/// <summary>
/// 用户验证信息
/// </summary>
public const string JWT_User_Key = "edu_userInfo";
} }
} }
...@@ -43,5 +43,10 @@ namespace Edu.Model.CacheModel ...@@ -43,5 +43,10 @@ namespace Edu.Model.CacheModel
/// Token验证 /// Token验证
/// </summary> /// </summary>
public string Token { get; set; } 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"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework> <TargetFramework>netcoreapp3.0</TargetFramework>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
using Edu.Repository.System; using Edu.Repository.System;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Text; using System.Text;
using VT.FW.DB; using VT.FW.DB;
...@@ -96,5 +97,70 @@ namespace Edu.Module.System ...@@ -96,5 +97,70 @@ namespace Edu.Module.System
bool flag = menuRepository.Update(fileds, new WhereHelper(nameof(RB_Menu_ViewModel.MenuId), MenuId)); bool flag = menuRepository.Update(fileds, new WhereHelper(nameof(RB_Menu_ViewModel.MenuId), MenuId));
return flag; 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; ...@@ -8,8 +8,10 @@ using Edu.Common.API;
using Edu.Common.Plugin; using Edu.Common.Plugin;
using Edu.Model.CacheModel; using Edu.Model.CacheModel;
using Edu.Model.ViewModel.User; using Edu.Model.ViewModel.User;
using Edu.Module.System;
using Edu.Module.User; using Edu.Module.User;
using Edu.WebApi.Filter; using Edu.WebApi.Filter;
using Edu.WebApi.Helper;
using JWT; using JWT;
using JWT.Algorithms; using JWT.Algorithms;
using JWT.Serializers; using JWT.Serializers;
...@@ -19,6 +21,7 @@ using Microsoft.AspNetCore.Http; ...@@ -19,6 +21,7 @@ using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
namespace Edu.WebApi.Controllers.User namespace Edu.WebApi.Controllers.User
{ {
[Route("api/[controller]/[action]")] [Route("api/[controller]/[action]")]
...@@ -32,6 +35,11 @@ namespace Edu.WebApi.Controllers.User ...@@ -32,6 +35,11 @@ namespace Edu.WebApi.Controllers.User
/// </summary> /// </summary>
private readonly AccountModule accountModule = new AccountModule(); private readonly AccountModule accountModule = new AccountModule();
/// <summary>
/// 菜单处理类对象
/// </summary>
private readonly MenuModule menuModule = new MenuModule();
/// <summary> /// <summary>
/// 用户登录 /// 用户登录
/// </summary> /// </summary>
...@@ -42,7 +50,6 @@ namespace Edu.WebApi.Controllers.User ...@@ -42,7 +50,6 @@ namespace Edu.WebApi.Controllers.User
public ApiResult Login() public ApiResult Login()
{ {
JObject jobj = JObject.Parse(RequestParm.Msg.ToString()); JObject jobj = JObject.Parse(RequestParm.Msg.ToString());
string account = jobj.GetStringValue("Account"); string account = jobj.GetStringValue("Account");
string password = jobj.GetStringValue("Password"); string password = jobj.GetStringValue("Password");
int accountType = jobj.GetInt("AccountType", 1); int accountType = jobj.GetInt("AccountType", 1);
...@@ -69,25 +76,12 @@ namespace Edu.WebApi.Controllers.User ...@@ -69,25 +76,12 @@ namespace Edu.WebApi.Controllers.User
{ {
return ApiResult.Failed(message: $"此账号【{ account }】已删除!"); return ApiResult.Failed(message: $"此账号【{ account }】已删除!");
} }
//生成token
TokenUserInfo userInfo = new TokenUserInfo { Uid = model.Id.ToString(), RequestFrom = Common.Enum.ApiRequestFromEnum.WebAdmin }; string token = WebApiTokenHelper.CreateToken(model.Id.ToString(), Common.Enum.ApiRequestFromEnum.WebAdmin);
var treeList = menuModule.GetTreeMenuModule(new Model.ViewModel.System.RB_Menu_ViewModel()
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 }, MenuType = accountType
{"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);
UserInfo obj = new UserInfo UserInfo obj = new UserInfo
{ {
Id = model.Id, Id = model.Id,
...@@ -97,6 +91,7 @@ namespace Edu.WebApi.Controllers.User ...@@ -97,6 +91,7 @@ namespace Edu.WebApi.Controllers.User
GroupName = model.GroupName, GroupName = model.GroupName,
SchoolName = model.SchoolName, SchoolName = model.SchoolName,
Token = token, Token = token,
MenuList= treeList
}; };
UserReidsCache.UserInfoSet(Cache.CacheKey.User_Login_Key + model.Id, obj, Common.Config.JwtExpirTime); UserReidsCache.UserInfoSet(Cache.CacheKey.User_Login_Key + model.Id, obj, Common.Config.JwtExpirTime);
return ApiResult.Success(data: obj); return ApiResult.Success(data: obj);
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
<ProjectReference Include="..\Edu.Cache\Edu.Cache.csproj" /> <ProjectReference Include="..\Edu.Cache\Edu.Cache.csproj" />
<ProjectReference Include="..\Edu.Common\Edu.Common.csproj" /> <ProjectReference Include="..\Edu.Common\Edu.Common.csproj" />
<ProjectReference Include="..\Edu.Model\Edu.Model.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.Module.User\Edu.Module.User.csproj" />
<ProjectReference Include="..\Edu.Repository\Edu.Repository.csproj" /> <ProjectReference Include="..\Edu.Repository\Edu.Repository.csproj" />
</ItemGroup> </ItemGroup>
......
using JWT; using JWT;
using JWT.Serializers;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using System; using System;
using System.IO; using System.IO;
...@@ -12,6 +11,7 @@ using Microsoft.AspNetCore.Http.Features; ...@@ -12,6 +11,7 @@ using Microsoft.AspNetCore.Http.Features;
using Edu.Common.Plugin; using Edu.Common.Plugin;
using Edu.Common.API; using Edu.Common.API;
using Edu.Cache.User; using Edu.Cache.User;
using Edu.WebApi.Helper;
namespace Edu.WebApi.Filter namespace Edu.WebApi.Filter
{ {
...@@ -36,17 +36,13 @@ namespace Edu.WebApi.Filter ...@@ -36,17 +36,13 @@ namespace Edu.WebApi.Filter
isCheckToken = false; isCheckToken = false;
} }
#region Token校验 //Token校验
if (isCheckToken) if (isCheckToken)
{ {
JWTValidat(actionContext, token); JWTValidat(actionContext, token);
} }
#endregion
#region 验证表单重复提交 #region 验证表单重复提交
string controllerName = actionContext.ActionDescriptor.RouteValues["controller"].ToString().ToLower(); string controllerName = actionContext.ActionDescriptor.RouteValues["controller"].ToString().ToLower();
string actionName = actionContext.ActionDescriptor.RouteValues["action"].ToString().ToLower(); string actionName = actionContext.ActionDescriptor.RouteValues["action"].ToString().ToLower();
if (!actionName.ToLower().Contains("get")) if (!actionName.ToLower().Contains("get"))
...@@ -125,15 +121,8 @@ namespace Edu.WebApi.Filter ...@@ -125,15 +121,8 @@ namespace Edu.WebApi.Filter
//解析token,校验是否失效 //解析token,校验是否失效
try try
{ {
IJsonSerializer serializer = new JsonNetSerializer(); JObject jwtJson = WebApiTokenHelper.AnalysisToken(token);
IDateTimeProvider provider = new UtcDateTimeProvider(); actionContext.HttpContext.Items[Common.GlobalKey.TokenUserInfo] = jwtJson[Common.GlobalKey.JWT_User_Key];
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"];
} }
catch (SignatureVerificationException sve) 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